diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a247227c79d..19ed61b0519 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -372,7 +372,7 @@ jobs: - name: Lint boundaries run: pnpm nx run ghost-monorepo:lint:boundaries - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -438,7 +438,7 @@ jobs: name: admin-coverage path: apps/*/coverage/cobertura-coverage.xml - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -515,7 +515,7 @@ jobs: exit 1 fi - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -664,7 +664,7 @@ jobs: ghost/*/coverage-e2e/cobertura-coverage.xml ghost/*/coverage-integration/cobertura-coverage.xml - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -754,7 +754,7 @@ jobs: exit 1 fi - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -840,7 +840,7 @@ jobs: path: ${{ steps.app_name.outputs.root }}/playwright-report retention-days: 30 - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -902,7 +902,7 @@ jobs: run: | [ -f ~/.ghost/logs/*.log ] && cat ~/.ghost/logs/*.log - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -984,7 +984,7 @@ jobs: retention-days: 7 if-no-files-found: error - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -1067,7 +1067,7 @@ jobs: retention-days: 7 if-no-files-found: error - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} @@ -1673,7 +1673,7 @@ jobs: path: e2e/test-results retention-days: 7 - - uses: tryghost/actions/actions/slack-build@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/slack-build@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' with: status: ${{ job.status }} diff --git a/.github/workflows/label-actions.yml b/.github/workflows/label-actions.yml index 047644ecec7..f3ef90bd530 100644 --- a/.github/workflows/label-actions.yml +++ b/.github/workflows/label-actions.yml @@ -18,4 +18,4 @@ jobs: runs-on: ubuntu-slim if: github.repository_owner == 'TryGhost' steps: - - uses: tryghost/actions/actions/label-actions@3ab34d3d69687764be21eba3768f51f4ecc40ddd # main + - uses: tryghost/actions/actions/label-actions@eee499fcb6bc0efc75ba43f651282b95a96102b0 # main diff --git a/apps/admin-x-design-system/package.json b/apps/admin-x-design-system/package.json index 7c069b3ec33..924e8e65de8 100644 --- a/apps/admin-x-design-system/package.json +++ b/apps/admin-x-design-system/package.json @@ -64,8 +64,7 @@ "@radix-ui/react-tooltip": "catalog:", "@sentry/react": "catalog:", "@tryghost/shade": "workspace:*", - "clsx": "catalog:", - "react-hot-toast": "catalog:" + "clsx": "catalog:" }, "peerDependencies": { "react": "^18.2.0", diff --git a/apps/admin-x-design-system/src/assets/icons/aa.svg b/apps/admin-x-design-system/src/assets/icons/aa.svg deleted file mode 100644 index 3343b8c53b8..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/aa.svg +++ /dev/null @@ -1 +0,0 @@ -aaAa diff --git a/apps/admin-x-design-system/src/assets/icons/add.svg b/apps/admin-x-design-system/src/assets/icons/add.svg deleted file mode 100644 index 682a97bf431..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/add.svg +++ /dev/null @@ -1 +0,0 @@ -add \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/ai-tagging-spark.svg b/apps/admin-x-design-system/src/assets/icons/ai-tagging-spark.svg deleted file mode 100644 index e09d87e917b..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/ai-tagging-spark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/align-center.svg b/apps/admin-x-design-system/src/assets/icons/align-center.svg deleted file mode 100644 index 826386427fc..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/align-center.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/align-left.svg b/apps/admin-x-design-system/src/assets/icons/align-left.svg deleted file mode 100644 index f43373f3543..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/align-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/angle-brackets.svg b/apps/admin-x-design-system/src/assets/icons/angle-brackets.svg deleted file mode 100644 index 15455f43594..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/angle-brackets.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/ap-network.svg b/apps/admin-x-design-system/src/assets/icons/ap-network.svg deleted file mode 100644 index 388e9f5db4b..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/ap-network.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-bottom-left.svg b/apps/admin-x-design-system/src/assets/icons/arrow-bottom-left.svg deleted file mode 100644 index 45fa527cc8d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-bottom-left.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-corner-left \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-bottom-right.svg b/apps/admin-x-design-system/src/assets/icons/arrow-bottom-right.svg deleted file mode 100644 index 877672be023..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-bottom-right.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-corner-right \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-down.svg b/apps/admin-x-design-system/src/assets/icons/arrow-down.svg deleted file mode 100644 index a47372f9682..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-down.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-down \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-left.svg b/apps/admin-x-design-system/src/assets/icons/arrow-left.svg deleted file mode 100644 index 98cf6365a43..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-left.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-left \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-right.svg b/apps/admin-x-design-system/src/assets/icons/arrow-right.svg deleted file mode 100644 index bace6cf9964..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-right.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-right \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-top-left.svg b/apps/admin-x-design-system/src/assets/icons/arrow-top-left.svg deleted file mode 100644 index 6eb3752d7da..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-top-left.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-top-right.svg b/apps/admin-x-design-system/src/assets/icons/arrow-top-right.svg deleted file mode 100644 index 1f53b668aec..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-top-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/arrow-up.svg b/apps/admin-x-design-system/src/assets/icons/arrow-up.svg deleted file mode 100644 index ae0e23966d7..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/arrow-up.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-up \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/at-sign.svg b/apps/admin-x-design-system/src/assets/icons/at-sign.svg deleted file mode 100644 index 1b840d38fd5..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/at-sign.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/baseline-chart.svg b/apps/admin-x-design-system/src/assets/icons/baseline-chart.svg deleted file mode 100644 index d68f249b56f..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/baseline-chart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/bell.svg b/apps/admin-x-design-system/src/assets/icons/bell.svg deleted file mode 100644 index e9b771d42dc..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/bell.svg +++ /dev/null @@ -1 +0,0 @@ -Alarm Bell Streamline Icon: https://streamlinehq.comalarm-bell \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/bills.svg b/apps/admin-x-design-system/src/assets/icons/bills.svg deleted file mode 100644 index 3440d618c36..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/bills.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/block.svg b/apps/admin-x-design-system/src/assets/icons/block.svg deleted file mode 100644 index 89890da98a2..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/block.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/book-open.svg b/apps/admin-x-design-system/src/assets/icons/book-open.svg deleted file mode 100644 index 26148b367d3..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/book-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/brackets.svg b/apps/admin-x-design-system/src/assets/icons/brackets.svg deleted file mode 100644 index 15455f43594..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/brackets.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/card-list.svg b/apps/admin-x-design-system/src/assets/icons/card-list.svg deleted file mode 100644 index 39c5de18307..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/card-list.svg +++ /dev/null @@ -1 +0,0 @@ -Layout Agenda Streamline Icon: https://streamlinehq.comlayout-agenda \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/cardview.svg b/apps/admin-x-design-system/src/assets/icons/cardview.svg deleted file mode 100644 index 88d8b62e056..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/cardview.svg +++ /dev/null @@ -1 +0,0 @@ -layout-module-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/check-circle.svg b/apps/admin-x-design-system/src/assets/icons/check-circle.svg deleted file mode 100644 index 9965e6f68dd..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/check-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/check.svg b/apps/admin-x-design-system/src/assets/icons/check.svg deleted file mode 100644 index 21cf58c82a1..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/chevron-down.svg b/apps/admin-x-design-system/src/assets/icons/chevron-down.svg deleted file mode 100644 index 135969085a0..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/chevron-down.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-down-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/chevron-left.svg b/apps/admin-x-design-system/src/assets/icons/chevron-left.svg deleted file mode 100644 index 0690ab61366..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/chevron-left.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-left-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/chevron-right.svg b/apps/admin-x-design-system/src/assets/icons/chevron-right.svg deleted file mode 100644 index ee1de512e59..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/chevron-right.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-right-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/chevron-up.svg b/apps/admin-x-design-system/src/assets/icons/chevron-up.svg deleted file mode 100644 index 80a2b54f740..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/chevron-up.svg +++ /dev/null @@ -1 +0,0 @@ -arrow-up-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/circle.svg b/apps/admin-x-design-system/src/assets/icons/circle.svg deleted file mode 100644 index a02fd0c8e41..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/admin-x-design-system/src/assets/icons/close.svg b/apps/admin-x-design-system/src/assets/icons/close.svg deleted file mode 100644 index e49c5fb03db..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/close.svg +++ /dev/null @@ -1 +0,0 @@ -close \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/column-layout.svg b/apps/admin-x-design-system/src/assets/icons/column-layout.svg deleted file mode 100644 index f56aaa7590b..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/column-layout.svg +++ /dev/null @@ -1 +0,0 @@ -Layout Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/comment-fill.svg b/apps/admin-x-design-system/src/assets/icons/comment-fill.svg deleted file mode 100644 index b562e5dadfd..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/comment-fill.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/comment.svg b/apps/admin-x-design-system/src/assets/icons/comment.svg deleted file mode 100644 index 57cd4987d18..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/comment.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/crown.svg b/apps/admin-x-design-system/src/assets/icons/crown.svg deleted file mode 100644 index ebcc658eccb..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/crown.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/discount.svg b/apps/admin-x-design-system/src/assets/icons/discount.svg deleted file mode 100644 index 5d5ef793b09..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/discount.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/dotdotdot.svg b/apps/admin-x-design-system/src/assets/icons/dotdotdot.svg deleted file mode 100644 index 743cb1af5e4..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/dotdotdot.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/download.svg b/apps/admin-x-design-system/src/assets/icons/download.svg deleted file mode 100644 index d9753519323..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/duplicate.svg b/apps/admin-x-design-system/src/assets/icons/duplicate.svg deleted file mode 100644 index 4272289ca85..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/duplicate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/ellipsis.svg b/apps/admin-x-design-system/src/assets/icons/ellipsis.svg deleted file mode 100644 index bdb73aadc4f..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/ellipsis.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/email-check.svg b/apps/admin-x-design-system/src/assets/icons/email-check.svg deleted file mode 100644 index a85cff2e81a..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/email-check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/email.svg b/apps/admin-x-design-system/src/assets/icons/email.svg deleted file mode 100644 index 188a97ba7c4..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/email.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/emailfield.svg b/apps/admin-x-design-system/src/assets/icons/emailfield.svg deleted file mode 100644 index ba90c9046a8..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/emailfield.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/error-fill.svg b/apps/admin-x-design-system/src/assets/icons/error-fill.svg deleted file mode 100644 index dfa0fd2ea0c..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/error-fill.svg +++ /dev/null @@ -1 +0,0 @@ -Alert Triangle Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/export.svg b/apps/admin-x-design-system/src/assets/icons/export.svg deleted file mode 100644 index 12ef11c4850..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/export.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/finger-up.svg b/apps/admin-x-design-system/src/assets/icons/finger-up.svg deleted file mode 100644 index 778036291c3..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/finger-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/gift.svg b/apps/admin-x-design-system/src/assets/icons/gift.svg deleted file mode 100644 index a67988e2546..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/gift.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/globe-simple.svg b/apps/admin-x-design-system/src/assets/icons/globe-simple.svg deleted file mode 100644 index 37dc472b41c..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/globe-simple.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/hamburger.svg b/apps/admin-x-design-system/src/assets/icons/hamburger.svg deleted file mode 100644 index 39ad1359f32..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/hamburger.svg +++ /dev/null @@ -1 +0,0 @@ -navigation-menu \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/heart-fill.svg b/apps/admin-x-design-system/src/assets/icons/heart-fill.svg deleted file mode 100644 index 89de5d87f3b..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/heart-fill.svg +++ /dev/null @@ -1 +0,0 @@ -Hearts Card Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/heart.svg b/apps/admin-x-design-system/src/assets/icons/heart.svg deleted file mode 100644 index 8f2e19899bf..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/home.svg b/apps/admin-x-design-system/src/assets/icons/home.svg deleted file mode 100644 index 9f44dc3facb..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/home.svg +++ /dev/null @@ -1 +0,0 @@ -House Entrance Streamline Icon: https://streamlinehq.comhouse-entrance \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/hyperlink-circle.svg b/apps/admin-x-design-system/src/assets/icons/hyperlink-circle.svg deleted file mode 100644 index 86106cffb93..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/hyperlink-circle.svg +++ /dev/null @@ -1 +0,0 @@ -Hyperlink Circle Streamline Icon: https://streamlinehq.com diff --git a/apps/admin-x-design-system/src/assets/icons/import.svg b/apps/admin-x-design-system/src/assets/icons/import.svg deleted file mode 100644 index fb62e9fd764..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/import.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/info-fill.svg b/apps/admin-x-design-system/src/assets/icons/info-fill.svg deleted file mode 100644 index 9866e28014c..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/info-fill.svg +++ /dev/null @@ -1 +0,0 @@ -Information Circle Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/info.svg b/apps/admin-x-design-system/src/assets/icons/info.svg deleted file mode 100644 index 320f27f9394..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/info.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/integration.svg b/apps/admin-x-design-system/src/assets/icons/integration.svg deleted file mode 100644 index 9c8db2d4d88..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/integration.svg +++ /dev/null @@ -1 +0,0 @@ -integration \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/key.svg b/apps/admin-x-design-system/src/assets/icons/key.svg deleted file mode 100644 index f6bc294224f..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/key.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/labs-flask.svg b/apps/admin-x-design-system/src/assets/icons/labs-flask.svg deleted file mode 100644 index c2ed46b6dd5..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/labs-flask.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/language.svg b/apps/admin-x-design-system/src/assets/icons/language.svg deleted file mode 100644 index aafff55f38d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/language.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/laptop.svg b/apps/admin-x-design-system/src/assets/icons/laptop.svg deleted file mode 100644 index be93d4f9795..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/laptop.svg +++ /dev/null @@ -1 +0,0 @@ -Desktop \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/layer.svg b/apps/admin-x-design-system/src/assets/icons/layer.svg deleted file mode 100644 index 64f8f244c65..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/layer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/layout-2-col.svg b/apps/admin-x-design-system/src/assets/icons/layout-2-col.svg deleted file mode 100644 index 2f6cd45c2e1..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/layout-2-col.svg +++ /dev/null @@ -1 +0,0 @@ -Browser Page Layout Streamline Icon: https://streamlinehq.combrowser-page-layout \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/layout-headline.svg b/apps/admin-x-design-system/src/assets/icons/layout-headline.svg deleted file mode 100644 index 7a6cfeed7e6..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/layout-headline.svg +++ /dev/null @@ -1 +0,0 @@ -layout-headline \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/layout-module-1.svg b/apps/admin-x-design-system/src/assets/icons/layout-module-1.svg deleted file mode 100644 index 88d8b62e056..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/layout-module-1.svg +++ /dev/null @@ -1 +0,0 @@ -layout-module-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/like.svg b/apps/admin-x-design-system/src/assets/icons/like.svg deleted file mode 100644 index b9ebfeb0e62..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/like.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/line-dashed.svg b/apps/admin-x-design-system/src/assets/icons/line-dashed.svg deleted file mode 100644 index 44f2b774f21..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/line-dashed.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/line-dotted.svg b/apps/admin-x-design-system/src/assets/icons/line-dotted.svg deleted file mode 100644 index fa07cc540bd..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/line-dotted.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/line-solid.svg b/apps/admin-x-design-system/src/assets/icons/line-solid.svg deleted file mode 100644 index ef5d5c458d0..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/line-solid.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/link-broken.svg b/apps/admin-x-design-system/src/assets/icons/link-broken.svg deleted file mode 100644 index 1c71ac8bb05..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/link-broken.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/listview.svg b/apps/admin-x-design-system/src/assets/icons/listview.svg deleted file mode 100644 index 7a6cfeed7e6..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/listview.svg +++ /dev/null @@ -1 +0,0 @@ -layout-headline \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/lock-locked.svg b/apps/admin-x-design-system/src/assets/icons/lock-locked.svg deleted file mode 100644 index f47f37b3709..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/lock-locked.svg +++ /dev/null @@ -1 +0,0 @@ -lock-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/lock-unlocked.svg b/apps/admin-x-design-system/src/assets/icons/lock-unlocked.svg deleted file mode 100644 index 2a10992b474..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/lock-unlocked.svg +++ /dev/null @@ -1 +0,0 @@ -lock-unlock \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/long-text.svg b/apps/admin-x-design-system/src/assets/icons/long-text.svg deleted file mode 100644 index 242d4f0a0de..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/long-text.svg +++ /dev/null @@ -1 +0,0 @@ -long-text diff --git a/apps/admin-x-design-system/src/assets/icons/magnifying-glass.svg b/apps/admin-x-design-system/src/assets/icons/magnifying-glass.svg deleted file mode 100644 index 536707d0b9d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/magnifying-glass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/mail-block.svg b/apps/admin-x-design-system/src/assets/icons/mail-block.svg deleted file mode 100644 index b1933224012..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/mail-block.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/mailplus.svg b/apps/admin-x-design-system/src/assets/icons/mailplus.svg deleted file mode 100644 index 411a67fceda..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/mailplus.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/map-pin.svg b/apps/admin-x-design-system/src/assets/icons/map-pin.svg deleted file mode 100644 index f24994cf350..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/map-pin.svg +++ /dev/null @@ -1 +0,0 @@ -map-pin diff --git a/apps/admin-x-design-system/src/assets/icons/megaphone.svg b/apps/admin-x-design-system/src/assets/icons/megaphone.svg deleted file mode 100644 index 5d58b48ff31..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/megaphone.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/message-quote.svg b/apps/admin-x-design-system/src/assets/icons/message-quote.svg deleted file mode 100644 index ce0d9568f9d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/message-quote.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/mobile.svg b/apps/admin-x-design-system/src/assets/icons/mobile.svg deleted file mode 100644 index 4f191e42f38..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/mobile.svg +++ /dev/null @@ -1 +0,0 @@ -Mobile \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/modules-3.svg b/apps/admin-x-design-system/src/assets/icons/modules-3.svg deleted file mode 100644 index 1dae91e54aa..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/modules-3.svg +++ /dev/null @@ -1 +0,0 @@ -module-three \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/money-bags.svg b/apps/admin-x-design-system/src/assets/icons/money-bags.svg deleted file mode 100644 index 6a126bd0e3c..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/money-bags.svg +++ /dev/null @@ -1 +0,0 @@ -money-bags \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/navigation.svg b/apps/admin-x-design-system/src/assets/icons/navigation.svg deleted file mode 100644 index 257a7264cbe..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/navigation.svg +++ /dev/null @@ -1 +0,0 @@ -navigation-menu-4 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/palette.svg b/apps/admin-x-design-system/src/assets/icons/palette.svg deleted file mode 100644 index 4b5b7bc2856..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/palette.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/pen.svg b/apps/admin-x-design-system/src/assets/icons/pen.svg deleted file mode 100644 index ad68385a9cf..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/pen.svg +++ /dev/null @@ -1 +0,0 @@ -pencil \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/picture.svg b/apps/admin-x-design-system/src/assets/icons/picture.svg deleted file mode 100644 index 77845d324ea..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/picture.svg +++ /dev/null @@ -1 +0,0 @@ -picture-sun \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/piggybank.svg b/apps/admin-x-design-system/src/assets/icons/piggybank.svg deleted file mode 100644 index 0c22f4e1cbb..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/piggybank.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/play-fill.svg b/apps/admin-x-design-system/src/assets/icons/play-fill.svg deleted file mode 100644 index 228930ad019..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/play-fill.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/portal.svg b/apps/admin-x-design-system/src/assets/icons/portal.svg deleted file mode 100644 index 4638fb0ee85..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/portal.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/admin-x-design-system/src/assets/icons/question-circle.svg b/apps/admin-x-design-system/src/assets/icons/question-circle.svg deleted file mode 100644 index 046e507694f..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/question-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/quote.svg b/apps/admin-x-design-system/src/assets/icons/quote.svg deleted file mode 100644 index ac43810d30e..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/quote.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/recepients.svg b/apps/admin-x-design-system/src/assets/icons/recepients.svg deleted file mode 100644 index 75919b8af28..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/recepients.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/reload.svg b/apps/admin-x-design-system/src/assets/icons/reload.svg deleted file mode 100644 index 5afa3c7227f..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/reload.svg +++ /dev/null @@ -1 +0,0 @@ -Button Refresh Arrows Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/send.svg b/apps/admin-x-design-system/src/assets/icons/send.svg deleted file mode 100644 index 79e63994fe3..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/send.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/share.svg b/apps/admin-x-design-system/src/assets/icons/share.svg deleted file mode 100644 index 6feac81448c..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/share.svg +++ /dev/null @@ -1 +0,0 @@ -Share 1 Streamline Icon: https://streamlinehq.comshare-1 \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/single-user-block.svg b/apps/admin-x-design-system/src/assets/icons/single-user-block.svg deleted file mode 100644 index 218bac9236e..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/single-user-block.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/single-user-fill.svg b/apps/admin-x-design-system/src/assets/icons/single-user-fill.svg deleted file mode 100644 index f84961fa7d2..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/single-user-fill.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/sparkle.svg b/apps/admin-x-design-system/src/assets/icons/sparkle.svg deleted file mode 100644 index 458b8ec1864..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/sparkle.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/square.svg b/apps/admin-x-design-system/src/assets/icons/square.svg deleted file mode 100644 index f569b74031a..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/square.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/admin-x-design-system/src/assets/icons/squircle-fill.svg b/apps/admin-x-design-system/src/assets/icons/squircle-fill.svg deleted file mode 100644 index 5586636f3cd..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/squircle-fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/squircle.svg b/apps/admin-x-design-system/src/assets/icons/squircle.svg deleted file mode 100644 index a56958d145f..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/squircle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/stripe-verified.svg b/apps/admin-x-design-system/src/assets/icons/stripe-verified.svg deleted file mode 100644 index af8813d1d86..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/stripe-verified.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/admin-x-design-system/src/assets/icons/substract.svg b/apps/admin-x-design-system/src/assets/icons/substract.svg deleted file mode 100644 index 696f878ce69..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/substract.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/admin-x-design-system/src/assets/icons/success-fill.svg b/apps/admin-x-design-system/src/assets/icons/success-fill.svg deleted file mode 100644 index 9028cd1028b..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/success-fill.svg +++ /dev/null @@ -1 +0,0 @@ -Check Circle 1 Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/tags-block.svg b/apps/admin-x-design-system/src/assets/icons/tags-block.svg deleted file mode 100644 index febbc688e7d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/tags-block.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/tags-check.svg b/apps/admin-x-design-system/src/assets/icons/tags-check.svg deleted file mode 100644 index f82f8764682..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/tags-check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/text-bold.svg b/apps/admin-x-design-system/src/assets/icons/text-bold.svg deleted file mode 100644 index 3f1b03f6e16..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/text-bold.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/text-regular.svg b/apps/admin-x-design-system/src/assets/icons/text-regular.svg deleted file mode 100644 index 57efd12436b..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/text-regular.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/text-underline.svg b/apps/admin-x-design-system/src/assets/icons/text-underline.svg deleted file mode 100644 index e8fa37dbd12..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/text-underline.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/textfield.svg b/apps/admin-x-design-system/src/assets/icons/textfield.svg deleted file mode 100644 index 08f34068013..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/textfield.svg +++ /dev/null @@ -1 +0,0 @@ -type-cursor \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/thumbs-down.svg b/apps/admin-x-design-system/src/assets/icons/thumbs-down.svg deleted file mode 100644 index 20450e318ea..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/thumbs-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/thumbs-up.svg b/apps/admin-x-design-system/src/assets/icons/thumbs-up.svg deleted file mode 100644 index de4fdc04bef..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/thumbs-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/time-back.svg b/apps/admin-x-design-system/src/assets/icons/time-back.svg deleted file mode 100644 index d03a7bc033d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/time-back.svg +++ /dev/null @@ -1 +0,0 @@ -time-reverse \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/trash.svg b/apps/admin-x-design-system/src/assets/icons/trash.svg deleted file mode 100644 index 16de1465bbf..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/trash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/typography.svg b/apps/admin-x-design-system/src/assets/icons/typography.svg deleted file mode 100644 index 60d79492c60..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/typography.svg +++ /dev/null @@ -1 +0,0 @@ -Typography diff --git a/apps/admin-x-design-system/src/assets/icons/unsplash-logo.svg b/apps/admin-x-design-system/src/assets/icons/unsplash-logo.svg deleted file mode 100644 index 805b50f3e5d..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/unsplash-logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/upload.svg b/apps/admin-x-design-system/src/assets/icons/upload.svg deleted file mode 100644 index 31a3dd3ed08..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/upload.svg +++ /dev/null @@ -1 +0,0 @@ -upload-bottom \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/user-add.svg b/apps/admin-x-design-system/src/assets/icons/user-add.svg deleted file mode 100644 index b55adb4d150..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/user-add.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/user-fill.svg b/apps/admin-x-design-system/src/assets/icons/user-fill.svg deleted file mode 100644 index 7f9c2270b61..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/user-fill.svg +++ /dev/null @@ -1 +0,0 @@ -Single Neutral Actions Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/user-page.svg b/apps/admin-x-design-system/src/assets/icons/user-page.svg deleted file mode 100644 index bed33abd336..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/user-page.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/user-pen.svg b/apps/admin-x-design-system/src/assets/icons/user-pen.svg deleted file mode 100644 index afd7766f1b8..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/user-pen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/user.svg b/apps/admin-x-design-system/src/assets/icons/user.svg deleted file mode 100644 index e954801d946..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/user.svg +++ /dev/null @@ -1 +0,0 @@ -Single Neutral Streamline Icon: https://streamlinehq.comsingle-neutral \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/warning.svg b/apps/admin-x-design-system/src/assets/icons/warning.svg deleted file mode 100644 index d8092290f23..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/warning.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/world-clock.svg b/apps/admin-x-design-system/src/assets/icons/world-clock.svg deleted file mode 100644 index 5a5374e86ff..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/world-clock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/admin-x-design-system/src/assets/icons/zapier-logo.svg b/apps/admin-x-design-system/src/assets/icons/zapier-logo.svg deleted file mode 100644 index 8e2aa72f6ef..00000000000 --- a/apps/admin-x-design-system/src/assets/icons/zapier-logo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - zapier-logo - - diff --git a/apps/admin-x-design-system/src/global/button-group.stories.tsx b/apps/admin-x-design-system/src/global/button-group.stories.tsx deleted file mode 100644 index 1e65fd52463..00000000000 --- a/apps/admin-x-design-system/src/global/button-group.stories.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import type {Meta, StoryObj} from '@storybook/react-vite'; - -import ButtonGroup from './button-group'; -import {ButtonProps} from './button'; - -const ButtonGroupMeta = { - title: 'Global / Button Group', - component: ButtonGroup, - tags: ['autodocs'], - decorators: [(_story: () => React.ReactNode) => (
{_story()}
)] -} satisfies Meta; - -export default ButtonGroupMeta; - -type Story = StoryObj; - -const defaultButtons: ButtonProps[] = [ - { - label: 'Cancel', - key: 'cancel' - }, - { - label: 'Save', - key: 'save', - color: 'black' - } -]; - -export const Default: Story = { - args: { - buttons: defaultButtons, - link: false - } -}; - -export const Small: Story = { - args: { - buttons: defaultButtons, - link: false, - size: 'sm' - } -}; - -const linkButtons: ButtonProps[] = [ - { - label: 'Cancel', - key: 'cancel' - }, - { - label: 'Save', - key: 'save', - color: 'green' - } -]; - -export const LinkButtons: Story = { - args: { - buttons: linkButtons, - link: true - } -}; diff --git a/apps/admin-x-design-system/src/global/button-group.tsx b/apps/admin-x-design-system/src/global/button-group.tsx deleted file mode 100644 index f72e4b306f3..00000000000 --- a/apps/admin-x-design-system/src/global/button-group.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react'; -import Button, {ButtonSize} from './button'; -import Tooltip from './tooltip'; - -import {ButtonProps} from './button'; -import clsx from 'clsx'; - -export interface ButtonGroupButtonProps extends ButtonProps { - tooltip?: string | React.ReactNode; -} - -export interface ButtonGroupProps { - size?: ButtonSize; - buttons: Array; - link?: boolean; - linkWithPadding?: boolean; - clearBg?: boolean; - outlineOnMobile?: boolean; - className?: string; - activeKey?: string; -} - -const ButtonGroup: React.FC = ({size = 'md', buttons, link, linkWithPadding, clearBg = true, outlineOnMobile, className, activeKey}) => { - let groupColorClasses = clsx( - 'flex items-center justify-start rounded', - link ? 'gap-4' : 'gap-2', - !link && !clearBg && 'gap-0! rounded-lg bg-grey-100 dark:bg-grey-900', - className - ); - - if (link && !clearBg) { - groupColorClasses = clsx( - 'transition-all hover:bg-grey-200 dark:hover:bg-grey-900', - size === 'sm' ? 'h-7 px-3' : 'h-[34px] px-4', - outlineOnMobile && 'border border-grey-300 hover:border-transparent md:border-transparent', - groupColorClasses - ); - } - - return ( -
- {buttons.map(({key, ...props}, index) => { - const buttonKey = key ?? `button-${index}`; - const buttonProps = {...props}; - - if (!link && !clearBg) { - buttonProps.className = clsx(props.className, 'w-8 rounded-lg border px-0!'); - - if (buttonKey === activeKey) { - buttonProps.color = 'white'; - buttonProps.className = clsx(buttonProps.className, 'border-grey-300 shadow-xs dark:border-grey-800'); - } else { - buttonProps.className = clsx(buttonProps.className, 'border-transparent'); - } - } - - return ( - (props.tooltip ? - -
- ); -}; - -export default ButtonGroup; diff --git a/apps/admin-x-design-system/src/global/button.stories.tsx b/apps/admin-x-design-system/src/global/button.stories.tsx deleted file mode 100644 index 7ae9891e3e4..00000000000 --- a/apps/admin-x-design-system/src/global/button.stories.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import type {Meta, StoryObj} from '@storybook/react-vite'; - -import Button from './button'; - -const meta = { - title: 'Global / Button', - component: Button, - tags: ['autodocs'], - argTypes: { - color: { - control: 'select' - } - } -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - label: 'Button' - } -}; - -export const Small: Story = { - args: { - size: 'sm', - label: 'Button', - color: 'black' - } -}; - -export const Black: Story = { - args: { - label: 'Button', - color: 'black' - } -}; - -export const Grey: Story = { - args: { - label: 'Button', - color: 'grey' - } -}; - -export const Green: Story = { - args: { - label: 'Button', - color: 'green' - } -}; - -export const Red: Story = { - args: { - label: 'Button', - color: 'red' - } -}; - -export const LinkButton: Story = { - args: { - label: 'Button', - color: 'green', - link: true - } -}; - -export const Icon: Story = { - args: { - icon: 'ellipsis', - color: 'green', - iconColorClass: 'text-white' - } -}; - -export const IconSmall: Story = { - args: { - size: 'sm', - icon: 'ellipsis', - color: 'green', - iconColorClass: 'text-white' - } -}; - -export const Loading: Story = { - args: { - loading: true, - color: 'green', - label: 'Button' - } -}; diff --git a/apps/admin-x-design-system/src/global/button.tsx b/apps/admin-x-design-system/src/global/button.tsx deleted file mode 100644 index 89c329ce323..00000000000 --- a/apps/admin-x-design-system/src/global/button.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import Icon, {IconSize} from './icon'; -import React, {HTMLProps} from 'react'; -import clsx from 'clsx'; -import {LoadingIndicator, LoadingIndicatorColor, LoadingIndicatorSize} from './loading-indicator'; - -export type ButtonColor = 'clear' | 'light-grey' | 'grey' | 'black' | 'green' | 'red' | 'white' | 'outline'; -export type ButtonSize = 'sm' | 'md'; - -export interface ButtonProps extends Omit, 'label' | 'size' | 'children'> { - size?: ButtonSize; - label?: React.ReactNode; - hideLabel?: boolean; - icon?: string; - iconSize?: IconSize; - iconColorClass?: string; - key?: string; - color?: ButtonColor; - fullWidth?: boolean; - link?: boolean; - linkWithPadding?: boolean; - disabled?: boolean; - unstyled?: boolean; - className?: string; - tag?: string; - loading?: boolean; - loadingIndicatorSize?: LoadingIndicatorSize; - loadingIndicatorColor?: LoadingIndicatorColor; - outlineOnMobile?: boolean; - onClick?: (e?:React.MouseEvent) => void; - testId?: string; -} - -const Button: React.FC = React.forwardRef(({ - testId, - size = 'md', - label = '', - hideLabel = false, - icon = '', - iconSize, - iconColorClass, - color = 'clear', - fullWidth, - link, - linkWithPadding = false, - disabled, - unstyled = false, - className = '', - tag = 'button', - loading = false, - loadingIndicatorColor, - outlineOnMobile = false, - onClick, - ...props -}, ref) => { - if (!color) { - color = 'clear'; - } - - if (!unstyled) { - className = clsx( - 'text inline-flex items-center justify-center rounded-md whitespace-nowrap transition', - ((link && color !== 'clear' && color !== 'black') || (!link && color !== 'clear')) ? 'font-bold' : 'font-semibold', - !link ? `${size === 'sm' ? 'h-7' : 'h-[34px]'}` : '', - !link ? `${size === 'sm' || label && icon ? 'px-3' : 'px-4'}` : '', - (link && linkWithPadding) && '-m-1 p-1', - className - ); - - switch (color) { - case 'black': - className = clsx( - link ? 'text-black hover:text-grey-800 dark:text-white' : `bg-black text-white dark:bg-white dark:text-black ${!disabled && 'hover:bg-grey-900'}`, - className - ); - loadingIndicatorColor = 'light'; - iconColorClass = iconColorClass || 'text-white'; - break; - case 'light-grey': - className = clsx( - link ? 'text-grey-800 hover:text-green-400 dark:text-white' : `bg-grey-200 text-black dark:bg-grey-900 dark:text-white ${!disabled && 'hover:bg-grey-300! dark:hover:bg-grey-800!'}`, - className - ); - loadingIndicatorColor = 'dark'; - break; - case 'grey': - className = clsx( - link ? 'text-black hover:text-grey-800 dark:text-white' : `bg-grey-100 text-black dark:bg-grey-900 dark:text-white ${!disabled && 'hover:bg-grey-300! dark:hover:bg-grey-800!'}`, - className - ); - loadingIndicatorColor = 'dark'; - break; - case 'green': - className = clsx( - link ? ' text-green hover:text-green-400' : ` bg-green text-white ${!disabled && 'hover:bg-green-400'}`, - className - ); - loadingIndicatorColor = 'light'; - iconColorClass = iconColorClass || 'text-white'; - break; - case 'red': - className = clsx( - link ? 'text-red hover:text-red-400' : `bg-red text-white ${!disabled && 'hover:bg-red-400'}`, - className - ); - loadingIndicatorColor = 'light'; - iconColorClass = iconColorClass || 'text-white'; - break; - case 'white': - className = clsx( - link ? 'text-white hover:text-white dark:text-black dark:hover:text-grey-800' : `bg-white text-black dark:bg-black dark:text-white`, - className - ); - loadingIndicatorColor = 'dark'; - break; - case 'outline': - className = clsx( - link ? 'text-black hover:text-grey-800 dark:text-white' : `border border-grey-300 bg-transparent text-black dark:border-grey-800 dark:text-white ${!disabled && 'hover:border-black! dark:hover:border-white!'}`, - className - ); - loadingIndicatorColor = 'dark'; - break; - default: - className = clsx( - link ? ' text-black hover:text-grey-800 dark:text-white' : `text-grey-900 dark:text-white dark:hover:bg-grey-900 ${!disabled && 'hover:bg-grey-200 hover:text-black'}`, - (outlineOnMobile && !link) && 'border border-grey-300 hover:border-transparent md:border-transparent', - className - ); - loadingIndicatorColor = 'dark'; - break; - } - - className = clsx( - (fullWidth && !link) && ' w-full', - disabled ? 'opacity-40' : 'cursor-pointer', - className - ); - } - - const iconClasses = label && icon && !hideLabel ? 'mr-1.5' : ''; - - let labelClasses = ''; - labelClasses += (label && hideLabel) ? 'sr-only' : ''; - labelClasses += loading ? 'invisible' : ''; - - iconSize = iconSize || ((size === 'sm') || (label && icon) ? 'sm' : 'md'); - - const buttonChildren = <> - {icon && } - {label} - {loading &&
Loading...
} - ; - - const buttonElement = React.createElement(tag, {className: className, - 'data-testid': testId, - disabled: disabled, - type: 'button', - onClick: onClick, - ref: ref, - ...props}, buttonChildren); - - return buttonElement; -}); - -Button.displayName = 'Button'; - -export default Button; diff --git a/apps/admin-x-design-system/src/global/chrome/desktop-chrome-header.stories.tsx b/apps/admin-x-design-system/src/global/chrome/desktop-chrome-header.stories.tsx index c60cb2e8c5b..1e434a8ba72 100644 --- a/apps/admin-x-design-system/src/global/chrome/desktop-chrome-header.stories.tsx +++ b/apps/admin-x-design-system/src/global/chrome/desktop-chrome-header.stories.tsx @@ -1,7 +1,5 @@ import type {Meta, StoryObj} from '@storybook/react-vite'; -import Button from '../button'; -import ButtonGroup from '../button-group'; import DesktopChromeHeader from './desktop-chrome-header'; const meta = { @@ -43,13 +41,8 @@ export const WithTitle: Story = { export const CustomToolbar: Story = { args: { - toolbarLeft: ); }; diff --git a/apps/admin-x-design-system/src/global/layout/global-actions.tsx b/apps/admin-x-design-system/src/global/layout/global-actions.tsx index 32e03085cde..030345f2780 100644 --- a/apps/admin-x-design-system/src/global/layout/global-actions.tsx +++ b/apps/admin-x-design-system/src/global/layout/global-actions.tsx @@ -1,9 +1,10 @@ import React from 'react'; -import Button from '../button'; +import {Button} from '@tryghost/shade/components'; +import {LucideIcon} from '@tryghost/shade/utils'; const GlobalActions: React.FC = () => { return ( - ); }; diff --git a/apps/admin-x-design-system/src/global/layout/page.stories.tsx b/apps/admin-x-design-system/src/global/layout/page.stories.tsx index ca079c5aa86..a220f1c0207 100644 --- a/apps/admin-x-design-system/src/global/layout/page.stories.tsx +++ b/apps/admin-x-design-system/src/global/layout/page.stories.tsx @@ -4,8 +4,8 @@ import Page, {CustomGlobalAction} from './page'; import ViewContainer from './view-container'; import {exampleActions as exampleActionButtons} from './view-container.stories'; -import Button from '../button'; import {Text} from '@tryghost/shade/primitives'; +import {LucideIcon} from '@tryghost/shade/utils'; const meta = { title: 'Global / Layout / Page', @@ -23,7 +23,9 @@ const dummyContent =
Placeho const customGlobalActions: CustomGlobalAction[] = [ { - iconName: 'heart', + key: 'heart', + icon: , + ariaLabel: 'Favorite', onClick: () => { alert('Clicked on custom action'); } @@ -100,10 +102,7 @@ const exampleCardViewContent = ( New idea action slot} title='Ideas' type='page' > @@ -155,7 +154,7 @@ const mockPosts = () => { opened
-
); @@ -167,10 +166,7 @@ const examplePostsContent = ( New post action slot} title='Posts' type='page' > @@ -205,12 +201,7 @@ export const ExampleDetailScreen: Story = {
Colombus, OH
} - primaryAction={ - { - icon: 'ellipsis', - color: 'outline' - } - } + primaryAction={Member action slot} type='page' >
@@ -235,7 +226,7 @@ export const ExampleDetailScreen: Story = {
Member data -
Name @@ -293,7 +284,7 @@ export const ExampleDetailScreen: Story = {
Activity -
Logged in diff --git a/apps/admin-x-design-system/src/global/layout/page.tsx b/apps/admin-x-design-system/src/global/layout/page.tsx index 7fc62141d53..17bc4f7d601 100644 --- a/apps/admin-x-design-system/src/global/layout/page.tsx +++ b/apps/admin-x-design-system/src/global/layout/page.tsx @@ -2,11 +2,13 @@ import React from 'react'; import clsx from 'clsx'; import AppMenu from './app-menu'; import GlobalActions from './global-actions'; -import Button from '../button'; import PageHeader from './page-header'; +import {Button} from '@tryghost/shade/components'; export interface CustomGlobalAction { - iconName: string; + key: string; + icon: React.ReactNode; + ariaLabel: string; onClick?: () => void; } @@ -86,9 +88,9 @@ const Page: React.FC = ({ const globalActions = ( (customGlobalActions?.length || showGlobalActions) &&
- {(customGlobalActions?.map((action, idx) => { + {(customGlobalActions?.map((action) => { return ( - ); }))} {showGlobalActions && } diff --git a/apps/admin-x-design-system/src/global/layout/view-container.stories.tsx b/apps/admin-x-design-system/src/global/layout/view-container.stories.tsx index 9656301343b..d04a44091f4 100644 --- a/apps/admin-x-design-system/src/global/layout/view-container.stories.tsx +++ b/apps/admin-x-design-system/src/global/layout/view-container.stories.tsx @@ -1,8 +1,6 @@ import type {Meta, StoryObj} from '@storybook/react-vite'; import ViewContainer, {PrimaryActionProps} from './view-container'; -import Button from '../button'; -import ButtonGroup from '../button-group'; const meta = { title: 'Global / Layout / View Container', @@ -25,42 +23,13 @@ export default meta; type Story = StoryObj; export const exampleActions = [ -
{actions} - {primaryActionContents} + {primaryAction}
@@ -190,7 +176,7 @@ const ViewContainer: React.FC = ({ return (
- {(title || actions || headerContent || tabs) && toolbar} + {(title || actions || primaryAction || headerContent || tabs) && toolbar}
{mainContent}
diff --git a/apps/admin-x-design-system/src/global/modal/confirmation-modal.stories.tsx b/apps/admin-x-design-system/src/global/modal/confirmation-modal.stories.tsx index 4f40cfc220b..b4b53f93eba 100644 --- a/apps/admin-x-design-system/src/global/modal/confirmation-modal.stories.tsx +++ b/apps/admin-x-design-system/src/global/modal/confirmation-modal.stories.tsx @@ -2,14 +2,13 @@ import type {Meta, StoryContext, StoryObj} from '@storybook/react-vite'; import {ReactNode} from 'react'; import NiceModal from '@ebay/nice-modal-react'; -import Button from '../button'; import ConfirmationModal, {ConfirmationModalProps} from './confirmation-modal'; const ConfirmationModalContainer: React.FC = ({...props}) => { return ( - ); }; @@ -40,6 +39,6 @@ export const CustomButtons: Story = { title: 'You want to delete?', cancelLabel: 'Meh', okLabel: 'Alrite', - okColor: 'red' + okVariant: 'destructive' } }; diff --git a/apps/admin-x-design-system/src/global/modal/confirmation-modal.tsx b/apps/admin-x-design-system/src/global/modal/confirmation-modal.tsx index 24b2226f9eb..7ec2ba47737 100644 --- a/apps/admin-x-design-system/src/global/modal/confirmation-modal.tsx +++ b/apps/admin-x-design-system/src/global/modal/confirmation-modal.tsx @@ -1,7 +1,7 @@ import Modal from './modal'; import NiceModal, {useModal} from '@ebay/nice-modal-react'; import React, {useState} from 'react'; -import {ButtonColor} from '../button'; +import type {ButtonProps} from '@tryghost/shade/components'; export interface ConfirmationModalProps { title?: React.ReactNode; @@ -9,7 +9,7 @@ export interface ConfirmationModalProps { cancelLabel?: string; okLabel?: string; okRunningLabel?: string; - okColor?: ButtonColor; + okVariant?: ButtonProps['variant']; onCancel?: () => void; onOk?: (modal?: { remove: () => void; @@ -25,7 +25,7 @@ export const ConfirmationModalContent: React.FC = ({ cancelLabel = 'Cancel', okLabel = 'OK', okRunningLabel = '...', - okColor = 'black', + okVariant = 'default', onCancel, onOk, customFooter, @@ -41,8 +41,8 @@ export const ConfirmationModalContent: React.FC = ({ cancelLabel={cancelLabel} footer={customFooter} formSheet={formSheet} - okColor={okColor} okLabel={taskState === 'running' ? okRunningLabel : okLabel} + okVariant={okVariant} stickyFooter={stickyFooter} testId='confirmation-modal' title={title} diff --git a/apps/admin-x-design-system/src/global/modal/limit-modal.stories.tsx b/apps/admin-x-design-system/src/global/modal/limit-modal.stories.tsx index 969641906d8..8fcf9d493ef 100644 --- a/apps/admin-x-design-system/src/global/modal/limit-modal.stories.tsx +++ b/apps/admin-x-design-system/src/global/modal/limit-modal.stories.tsx @@ -2,14 +2,13 @@ import type {Meta, StoryContext, StoryObj} from '@storybook/react-vite'; import {ReactNode} from 'react'; import NiceModal from '@ebay/nice-modal-react'; -import Button from '../button'; import LimitModal, {LimitModalProps} from './limit-modal'; const LimitModalContainer: React.FC = ({...props}) => { return ( - ); }; diff --git a/apps/admin-x-design-system/src/global/modal/limit-modal.tsx b/apps/admin-x-design-system/src/global/modal/limit-modal.tsx index 3ac42fa0197..ef3085775d7 100644 --- a/apps/admin-x-design-system/src/global/modal/limit-modal.tsx +++ b/apps/admin-x-design-system/src/global/modal/limit-modal.tsx @@ -23,8 +23,8 @@ export const LimitModalContent: React.FC = ({ = ({children, ...props}) => { }); return (
-
); }; @@ -186,12 +185,7 @@ export const CompletePage: Story = { export const CustomButtons: Story = { args: { - leftButtonProps: { - label: 'Left button', - onClick: () => { - alert('Left button click'); - } - }, + leftButton: Left action slot, cancelLabel: 'Nope', okLabel: 'Yep', onOk: () => { diff --git a/apps/admin-x-design-system/src/global/modal/modal.tsx b/apps/admin-x-design-system/src/global/modal/modal.tsx index c0a87c4d6b6..16efe398707 100644 --- a/apps/admin-x-design-system/src/global/modal/modal.tsx +++ b/apps/admin-x-design-system/src/global/modal/modal.tsx @@ -1,12 +1,10 @@ import {useModal} from '@ebay/nice-modal-react'; import clsx from 'clsx'; import React, {useEffect, useState, forwardRef} from 'react'; -import Button, {ButtonColor, ButtonProps} from '../button'; -import ButtonGroup from '../button-group'; -import {StickyFooter} from '@tryghost/shade/components'; +import {Button, type ButtonProps, LoadingIndicator, StickyFooter} from '@tryghost/shade/components'; import {DirtyConfirmDialog, useDirtyConfirmation} from '@tryghost/shade/patterns'; -import {Text} from '@tryghost/shade/primitives'; -import {useGlobalDirtyState} from '@tryghost/shade/utils'; +import {Inline, Text} from '@tryghost/shade/primitives'; +import {LucideIcon, useGlobalDirtyState} from '@tryghost/shade/utils'; export type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'bleed'; @@ -23,10 +21,10 @@ export interface ModalProps { testId?: string; title?: React.ReactNode; okLabel?: string; - okColor?: ButtonColor; + okVariant?: ButtonProps['variant']; okLoading?: boolean; cancelLabel?: string; - leftButtonProps?: ButtonProps; + leftButton?: React.ReactNode; buttonsDisabled?: boolean; okDisabled?: boolean; footer?: boolean | React.ReactNode; @@ -64,12 +62,12 @@ const Modal = forwardRef(({ cancelLabel = 'Cancel', footer, header, - leftButtonProps, + leftButton, buttonsDisabled, okDisabled, padding = true, onOk, - okColor = 'black', + okVariant = 'default', onCancel, topRightContent, hideXOnMobile = false, @@ -161,8 +159,6 @@ const Modal = forwardRef(({ } }); - const buttons: ButtonProps[] = []; - let contentClasses; const removeModal = () => { @@ -172,34 +168,6 @@ const Modal = forwardRef(({ }); }; - if (!footer) { - if (cancelLabel) { - buttons.push({ - key: 'cancel-modal', - label: cancelLabel, - color: 'outline', - testId: 'cancel-modal', - onClick: (onCancel ? onCancel : () => { - removeModal(); - }), - disabled: buttonsDisabled - }); - } - - if (okLabel) { - buttons.push({ - key: 'ok-modal', - label: okLabel, - color: okColor, - className: 'min-w-[80px]', - testId: 'ok-modal', - onClick: onOk, - disabled: buttonsDisabled || okDisabled, - loading: okLoading - }); - } - } - let modalClasses = clsx( 'relative z-50 flex max-h-[100%] w-full flex-col justify-between overflow-x-hidden bg-white dark:bg-black', align === 'center' && 'mx-auto', @@ -413,11 +381,21 @@ const Modal = forwardRef(({ footerContent = (
- {leftButtonProps &&
-
- + {leftButton}
+ + {cancelLabel && ( + + )} + {okLabel && ( + + )} +
); } @@ -448,7 +426,9 @@ const Modal = forwardRef(({ (
{title && {title}}
-
) : diff --git a/apps/admin-x-design-system/src/global/modal/preview-modal.stories.tsx b/apps/admin-x-design-system/src/global/modal/preview-modal.stories.tsx index 5aabeb750ce..2680ea0a9db 100644 --- a/apps/admin-x-design-system/src/global/modal/preview-modal.stories.tsx +++ b/apps/admin-x-design-system/src/global/modal/preview-modal.stories.tsx @@ -2,15 +2,14 @@ import type {Meta, StoryContext, StoryObj} from '@storybook/react-vite'; import {ReactNode} from 'react'; import NiceModal from '@ebay/nice-modal-react'; -import Button from '../button'; import PreviewModal, {PreviewModalProps} from './preview-modal'; import {Text} from '@tryghost/shade/primitives'; const PreviewModalContainer: React.FC = ({...props}) => { return ( - ); }; @@ -64,7 +63,7 @@ export const CustomButtons: Story = { ...Default.args, cancelLabel: 'Meh', okLabel: 'Alrite', - okColor: 'green' + okVariant: 'default' } }; diff --git a/apps/admin-x-design-system/src/global/modal/preview-modal.tsx b/apps/admin-x-design-system/src/global/modal/preview-modal.tsx index 727adf3cd05..d48aa875a40 100644 --- a/apps/admin-x-design-system/src/global/modal/preview-modal.tsx +++ b/apps/admin-x-design-system/src/global/modal/preview-modal.tsx @@ -1,13 +1,11 @@ import NiceModal, {useModal} from '@ebay/nice-modal-react'; import clsx from 'clsx'; import React, {useEffect} from 'react'; -import {ButtonColor, ButtonProps} from '../button'; -import ButtonGroup from '../button-group'; -import Icon from '../icon'; import Modal, {ModalSize} from './modal'; +import {Button, type ButtonProps} from '@tryghost/shade/components'; import {DirtyConfirmDialog, useDirtyConfirmation} from '@tryghost/shade/patterns'; -import {Text, type TextElement, type TextLeading, type TextSize} from '@tryghost/shade/primitives'; -import {useGlobalDirtyState} from '@tryghost/shade/utils'; +import {Inline, Text, type TextElement, type TextLeading, type TextSize} from '@tryghost/shade/primitives'; +import {LucideIcon, useGlobalDirtyState} from '@tryghost/shade/utils'; type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; @@ -50,7 +48,7 @@ export interface PreviewModalProps { dirty?: boolean cancelLabel?: string; okLabel?: string; - okColor?: ButtonColor; + okVariant?: ButtonProps['variant']; buttonsDisabled?: boolean previewToolbar?: boolean; leftToolbar?: boolean; @@ -85,7 +83,7 @@ export const PreviewModalContent: React.FC = ({ dirty = false, cancelLabel = 'Cancel', okLabel = 'OK', - okColor = 'black', + okVariant = 'default', previewToolbar = true, leftToolbar = true, rightToolbar = true, @@ -158,7 +156,7 @@ export const PreviewModalContent: React.FC = ({ if (siteLink) { viewSiteButton = ( ); } @@ -181,29 +179,12 @@ export const PreviewModalContent: React.FC = ({ ); } - const buttons: ButtonProps[] = []; - - if (!sidebarButtons) { - buttons.push({ - key: 'cancel-modal', - label: cancelLabel, - onClick: (onCancel ? onCancel : () => { - confirm(dirty, () => { - modal.remove(); - afterClose?.(); - }); - }), - disabled: buttonsDisabled + const handleCancel = onCancel || (() => { + confirm(dirty, () => { + modal.remove(); + afterClose?.(); }); - - buttons.push({ - key: 'ok-modal', - label: okLabel, - color: okColor, - onClick: onOk, - disabled: buttonsDisabled - }); - } + }); return ( = ({ > {title} - {sidebarButtons ? sidebarButtons : } + {sidebarButtons || ( + + + + + )}
)}
diff --git a/apps/admin-x-design-system/src/global/toast.stories.tsx b/apps/admin-x-design-system/src/global/toast.stories.tsx deleted file mode 100644 index 89a04d7c860..00000000000 --- a/apps/admin-x-design-system/src/global/toast.stories.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import type {Meta, StoryObj} from '@storybook/react-vite'; -import {ReactNode} from 'react'; - -import Button from './button'; -import {ShowToastProps, showToast} from './toast'; - -/** - * This component uses `react-hot-toast` which requires the `` component to be included in the app. - * The design system already does this so you don't have to — just call `showToast()` in any event and it'll work. - */ -const ToastContainer: React.FC = ({...props}) => { - return ( - <> - -
- ); -}; - -export default Toast; - -export const showToast = ({ - title, - message, - type = 'neutral', - icon = '', - options = { - position: 'bottom-left', - duration: 5000 - } -}: ShowToastProps): void => { - if (!options.position) { - options.position = 'bottom-left'; - } - - if (type === 'pageError') { - type = 'error'; - options.position = 'top-center'; - options.duration = Infinity; - } - - toast.custom(t => ( - -
- {title && {title}} - {message && -
{message}
- } -
-
- ), - { - ...options - } - ); -}; - -export const dismissAllToasts = (): void => { - toast.dismiss(); -}; diff --git a/apps/admin-x-design-system/src/global/tooltip.stories.tsx b/apps/admin-x-design-system/src/global/tooltip.stories.tsx index 0feffd0bde8..536ad5f338a 100644 --- a/apps/admin-x-design-system/src/global/tooltip.stories.tsx +++ b/apps/admin-x-design-system/src/global/tooltip.stories.tsx @@ -1,6 +1,5 @@ import type {Meta, StoryObj} from '@storybook/react-vite'; -import Button from './button'; import Tooltip from './tooltip'; const meta = { @@ -20,14 +19,14 @@ type Story = StoryObj; export const Default: Story = { args: { content: 'Hello tooltip', - children: } }; export const MediumSize: Story = { args: { content: 'Hello tooltip', - children: , size: 'md' } }; @@ -35,7 +34,7 @@ export const MediumSize: Story = { export const Left: Story = { args: { content: 'Hello tooltip on the left', - children: , origin: 'start' } }; @@ -43,7 +42,7 @@ export const Left: Story = { export const Center: Story = { args: { content: 'Hello center tooltip', - children: , origin: 'center' } }; @@ -51,7 +50,7 @@ export const Center: Story = { export const Right: Story = { args: { content: 'Hello right tooltip', - children: , origin: 'end' } }; @@ -59,7 +58,7 @@ export const Right: Story = { export const Long: Story = { args: { content: `You're the best evil son an evil dad could ever ask for.`, - children: , size: 'md', origin: 'start' } diff --git a/apps/admin-x-design-system/src/index.ts b/apps/admin-x-design-system/src/index.ts index 84b10522f2d..04e39bc2e42 100644 --- a/apps/admin-x-design-system/src/index.ts +++ b/apps/admin-x-design-system/src/index.ts @@ -28,20 +28,12 @@ export type {PreviewModalProps} from './global/modal/preview-modal'; export {default as Banner} from './global/banner'; export type {BannerProps} from './global/banner'; -export {default as Button} from './global/button'; -export type {ButtonColor, ButtonProps} from './global/button'; -export {default as ButtonGroup} from './global/button-group'; -export type {ButtonGroupProps} from './global/button-group'; export {default as ErrorBoundary} from './global/error-boundary'; export type {ErrorBoundaryProps} from './global/error-boundary'; -export {default as Icon} from './global/icon'; -export type {IconProps} from './global/icon'; export {LoadingIndicator} from './global/loading-indicator'; export type {LoadingIndicatorProps} from './global/loading-indicator'; export {default as Separator} from './global/separator'; export type {SeparatorProps} from './global/separator'; -export {default as Toast, dismissAllToasts, showToast} from './global/toast'; -export type {ToastProps} from './global/toast'; export {default as Tooltip} from './global/tooltip'; export type {TooltipProps} from './global/tooltip'; export {default as PageHeader} from './global/layout/page-header'; diff --git a/apps/admin-x-design-system/src/providers/design-system-provider.tsx b/apps/admin-x-design-system/src/providers/design-system-provider.tsx index cfd8bc38c8d..7ca3284e736 100644 --- a/apps/admin-x-design-system/src/providers/design-system-provider.tsx +++ b/apps/admin-x-design-system/src/providers/design-system-provider.tsx @@ -1,7 +1,6 @@ // FocusContext.tsx import NiceModal from '@ebay/nice-modal-react'; import React, {createContext, useContext} from 'react'; -import {Toaster} from 'react-hot-toast'; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type FetchKoenigLexical = () => Promise; @@ -27,7 +26,6 @@ interface DesignSystemProviderProps { const DesignSystemProvider: React.FC = ({fetchKoenigLexical, darkMode, children}) => { return ( - {children} diff --git a/apps/admin-x-design-system/src/settings/setting-group-header.stories.tsx b/apps/admin-x-design-system/src/settings/setting-group-header.stories.tsx index f7f91fe541e..38beadb2850 100644 --- a/apps/admin-x-design-system/src/settings/setting-group-header.stories.tsx +++ b/apps/admin-x-design-system/src/settings/setting-group-header.stories.tsx @@ -1,6 +1,5 @@ import type {Meta, StoryObj} from '@storybook/react-vite'; -import ButtonGroup from '../global/button-group'; import SettingGroupHeader from './setting-group-header'; import {Text} from '@tryghost/shade/primitives'; @@ -17,10 +16,7 @@ export const Default: Story = { args: { title: 'Section group title', description: 'Section group description', - children: + children: Edit action slot } }; @@ -28,15 +24,7 @@ export const Editing: Story = { args: { title: 'Section group title', description: 'Section group description', - children: + children: Cancel and save action slots } }; @@ -49,10 +37,7 @@ export const CustomHeader: Story = { Cristofer Vaccaro — Owner cristofer@example.com
- + Invite users action slot } }; diff --git a/apps/admin-x-design-system/src/settings/setting-group-header.tsx b/apps/admin-x-design-system/src/settings/setting-group-header.tsx index 67c9df56ce3..27938d65e63 100644 --- a/apps/admin-x-design-system/src/settings/setting-group-header.tsx +++ b/apps/admin-x-design-system/src/settings/setting-group-header.tsx @@ -17,7 +17,7 @@ const SettingGroupHeader: React.FC = ({title, descripti {description &&

{description}

}
} -
+
{children}
diff --git a/apps/admin-x-design-system/src/settings/setting-group.stories.tsx b/apps/admin-x-design-system/src/settings/setting-group.stories.tsx index 5de25744567..dfc731464f6 100644 --- a/apps/admin-x-design-system/src/settings/setting-group.stories.tsx +++ b/apps/admin-x-design-system/src/settings/setting-group.stories.tsx @@ -4,7 +4,6 @@ import type {Meta, StoryObj} from '@storybook/react-vite'; import * as SettingGroupContentStories from './setting-group-content.stories'; import * as SettingGroupHeaderStories from './setting-group-header.stories'; -import ButtonGroup from '../global/button-group'; import SettingGroup from './setting-group'; import SettingGroupContent from './setting-group-content'; import SettingGroupHeader from './setting-group-header'; @@ -24,7 +23,7 @@ const meta = { export default meta; type Story = StoryObj; -const customButtons = ; +const customButtons = Custom action slot; const customHeader = ; const singleColContent = ; const twoColView = ; diff --git a/apps/admin-x-design-system/src/settings/setting-group.tsx b/apps/admin-x-design-system/src/settings/setting-group.tsx index f5b780d4757..c67382704db 100644 --- a/apps/admin-x-design-system/src/settings/setting-group.tsx +++ b/apps/admin-x-design-system/src/settings/setting-group.tsx @@ -1,8 +1,8 @@ import clsx from 'clsx'; import React, {forwardRef, useEffect} from 'react'; -import {ButtonProps} from '../global/button'; -import ButtonGroup from '../global/button-group'; import SettingGroupHeader from './setting-group-header'; +import {Button} from '@tryghost/shade/components'; +import {Inline} from '@tryghost/shade/primitives'; export interface SettingGroupProps { navid?:string; @@ -78,57 +78,20 @@ const SettingGroup = forwardRef(function Sett styles += ' border-grey-200 dark:border-grey-900 dark:hover:border-grey-800'; - // The links visible before editing - const viewButtons: ButtonProps[] = []; - - if (!hideEditButton) { - let label = 'Edit'; - if (saveState === 'saved') { - label = 'Saved'; - } - viewButtons.push( - { - label, - key: 'edit', - color: 'clear', - onClick: handleEdit - } - ); - } else if (saveState === 'saved') { - viewButtons.push( - { - label: 'Saved', - key: 'edit', - color: 'green', - onClick: handleEdit - } - ); - } - - // The buttons that show when you are editing - const editButtons: ButtonProps[] = [ - { - label: 'Cancel', - key: 'cancel', - onClick: handleCancel - } - ]; - - if (saveState === 'unsaved' || alwaysShowSaveButton) { - let label = 'Save'; - if (saveState === 'saving') { - label = 'Saving...'; - } - editButtons.push( - { - label: label, - key: 'save', - color: saveState === 'unsaved' ? 'green' : 'light-grey', - disabled: saveState !== 'unsaved', - onClick: handleSave - } - ); - } + const buttons = isEditing ? ( + + + {(saveState === 'unsaved' || alwaysShowSaveButton) && ( + + )} + + ) : (!hideEditButton || saveState === 'saved') ? ( + + ) : null; useEffect(() => { const handleCMDS = (e: KeyboardEvent) => { @@ -161,7 +124,7 @@ const SettingGroup = forwardRef(function Sett {customHeader ? customHeader : {customButtons ? customButtons : - (onEditingChange && ) + (onEditingChange && buttons) } } @@ -175,7 +138,7 @@ const SettingGroup = forwardRef(function Sett {customHeader ? customHeader : {customButtons ? customButtons : - (onEditingChange && ) + (onEditingChange && buttons) } } diff --git a/apps/admin-x-design-system/src/settings/setting-nav-item.tsx b/apps/admin-x-design-system/src/settings/setting-nav-item.tsx index 6ebb210a58f..52c3dc23b17 100644 --- a/apps/admin-x-design-system/src/settings/setting-nav-item.tsx +++ b/apps/admin-x-design-system/src/settings/setting-nav-item.tsx @@ -1,11 +1,10 @@ import clsx from 'clsx'; import React, {forwardRef} from 'react'; -import Icon from '../global/icon'; export interface SettingNavItemProps extends Omit, 'ref' | 'title' | 'onClick'> { title: React.ReactNode; navid?: string; - icon?: string; + icon?: React.ReactNode; isCurrent?: boolean; isVisible?: boolean; onClick?: (e: React.MouseEvent) => void; @@ -21,14 +20,14 @@ const SettingNavItem = forwardRef(function S ...props }, ref) { const classNames = clsx( - 'mt-px flex h-[32px] w-100 cursor-pointer items-center rounded-md px-3 py-2 text-left font-medium transition-all hover:bg-grey-200 focus:bg-grey-100 dark:text-grey-600 dark:hover:bg-grey-950 dark:focus:bg-grey-900', + 'mt-px flex h-[32px] w-100 cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-left text-control font-medium transition-all hover:bg-grey-200 focus:bg-grey-100 dark:text-grey-600 dark:hover:bg-grey-950 dark:focus:bg-grey-900 [&>svg]:size-4 [&>svg]:shrink-0', isCurrent ? 'bg-grey-200 text-black dark:bg-grey-950 dark:text-white' : 'text-grey-800', !isVisible && 'hidden' ); return (
  • - {icon && } + {icon} {title}
  • ); diff --git a/apps/admin-x-framework/package.json b/apps/admin-x-framework/package.json index 36a1db16b27..232dfeff738 100644 --- a/apps/admin-x-framework/package.json +++ b/apps/admin-x-framework/package.json @@ -114,8 +114,8 @@ "bson-objectid": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "react-hot-toast": "catalog:", - "react-router": "catalog:" + "react-router": "catalog:", + "sonner": "catalog:" }, "peerDependencies": { "react": "^18.2.0", diff --git a/apps/admin-x-framework/src/api/member-custom-fields.ts b/apps/admin-x-framework/src/api/member-custom-fields.ts index b905c635912..2743fbd8e02 100644 --- a/apps/admin-x-framework/src/api/member-custom-fields.ts +++ b/apps/admin-x-framework/src/api/member-custom-fields.ts @@ -33,10 +33,6 @@ export type MemberCustomField = { export type MemberCustomFieldUserType = { id: FieldType; label: string; - // Icon name, resolved by the rendering app's icon set (today that's the - // admin-x-design-system set in Settings — the only surface showing type - // icons). A name rather than a component keeps this catalog render-free. - icon: string; // Which control collects/edits a value of this type input: 'text' | 'textarea' | 'address'; }; @@ -45,9 +41,9 @@ export type MemberCustomFieldUserType = { // Record annotation keeps this exhaustive: adding a field type // upstream fails to compile here until it has a presentation. const fieldTypePresentation: Record> = { - short_text: {label: 'Short text', icon: 'aa', input: 'text'}, - long_text: {label: 'Long text', icon: 'long-text', input: 'textarea'}, - address: {label: 'Address', icon: 'map-pin', input: 'address'} + short_text: {label: 'Short text', input: 'text'}, + long_text: {label: 'Long text', input: 'textarea'}, + address: {label: 'Address', input: 'address'} }; // The catalog in the shared catalog's declared order, so every admin surface diff --git a/apps/admin-x-framework/src/hooks/use-form.ts b/apps/admin-x-framework/src/hooks/use-form.ts index 76a9d002ee6..c5e3ce88eda 100644 --- a/apps/admin-x-framework/src/hooks/use-form.ts +++ b/apps/admin-x-framework/src/hooks/use-form.ts @@ -1,8 +1,7 @@ import {useCallback, useEffect, useState} from 'react'; +import type {ButtonProps} from '@tryghost/shade/components'; -// Structurally matches admin-x-design-system's ButtonColor so okProps.color stays -// assignable to its Button color prop. -export type ButtonColor = 'clear' | 'light-grey' | 'grey' | 'black' | 'green' | 'red' | 'white' | 'outline'; +export type ButtonVariant = NonNullable; export type Dirtyable = Data & { dirty?: boolean; @@ -14,7 +13,7 @@ export type ErrorMessages = Record export interface OkProps { disabled: boolean; - color: ButtonColor; + variant: ButtonVariant; label?: string; } @@ -126,11 +125,11 @@ const useForm = ({initialState, savingDelay, savedDelay = 2000, onSave, o setSaveState('unsaved'); }, []); - let okColor: ButtonColor = 'black'; + let okVariant: ButtonVariant = 'default'; if (saveState === 'saved') { - okColor = 'green'; + okVariant = 'default'; } else if (saveState === 'error') { - okColor = 'red'; + okVariant = 'destructive'; } let okLabel = ''; @@ -144,7 +143,7 @@ const useForm = ({initialState, savingDelay, savedDelay = 2000, onSave, o const okProps: OkProps = { disabled: saveState === 'saving', - color: okColor, + variant: okVariant, label: okLabel || undefined }; diff --git a/apps/admin-x-framework/src/hooks/use-handle-error.ts b/apps/admin-x-framework/src/hooks/use-handle-error.ts index 96dff7428e8..1ac8b55314d 100644 --- a/apps/admin-x-framework/src/hooks/use-handle-error.ts +++ b/apps/admin-x-framework/src/hooks/use-handle-error.ts @@ -1,16 +1,12 @@ import * as Sentry from '@sentry/react'; import {useCallback} from 'react'; -import toast from 'react-hot-toast'; +import {toast} from 'sonner'; import {useFramework} from '../providers/framework-provider'; import {APIError, SessionExpiredError, getErrorMessage} from '../utils/errors'; -import {showToast} from '../utils/toast'; function showErrorToast(message: React.ReactNode) { - toast.remove(); - showToast({ - message, - type: 'error' - }); + toast.dismiss(); + toast.error(message); } /** @@ -49,12 +45,12 @@ const useHandleError = () => { if (error instanceof APIError && error.response?.status === 418) { // We use this status in tests to indicate the API request was not mocked - // don't show a toast because it may block clicking things in the test, - // but still clear lingering toasts that would block clicks the same way - toast.remove(); + // but still clear lingering toasts that would block clicks the same way. + toast.dismiss(); } else if (error instanceof SessionExpiredError) { // Session-expiry 401s trigger a redirect to signin in the fetch // layer - a toast would only flash while the page unloads - toast.remove(); + toast.dismiss(); } else if (error instanceof APIError) { showErrorToast(getErrorMessage(error, error.message)); } else { diff --git a/apps/admin-x-framework/src/utils/toast.tsx b/apps/admin-x-framework/src/utils/toast.tsx deleted file mode 100644 index 5f960a6f7b0..00000000000 --- a/apps/admin-x-framework/src/utils/toast.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; -import toast from 'react-hot-toast'; - -// Markup, classes and icons are copied from admin-x-design-system's Toast so error -// toasts render identically inside its react-hot-toast . -const ErrorIcon: React.FC<{className?: string}> = ({className}) => ( - - - -); - -const CloseIcon: React.FC<{className?: string}> = ({className}) => ( - - - - -); - -export interface ShowToastProps { - message: React.ReactNode; - type: 'error'; -} - -export const showToast = ({message, type}: ShowToastProps): void => { - toast.custom(t => ( -
    -
    -
    - -
    -
    -
    {message}
    -
    -
    - -
    - ), {position: 'bottom-left', duration: 5000}); -}; diff --git a/apps/admin-x-framework/test/unit/api/labels.test.tsx b/apps/admin-x-framework/test/unit/api/labels.test.tsx index ac61f2baf39..690e33a7a4f 100644 --- a/apps/admin-x-framework/test/unit/api/labels.test.tsx +++ b/apps/admin-x-framework/test/unit/api/labels.test.tsx @@ -5,15 +5,10 @@ import {renderHookWithProviders} from '../../../src/test/test-utils'; import {useCreateLabel, useEditLabel, useFindLabelByName} from '../../../src/api/labels'; import {withMockFetch} from '../../utils/mock-fetch'; -const {mockShowToast, mockSonnerError} = vi.hoisted(() => ({ - mockShowToast: vi.fn(), +const {mockSonnerError} = vi.hoisted(() => ({ mockSonnerError: vi.fn() })); -vi.mock('../../../src/utils/toast', () => ({ - showToast: mockShowToast -})); - vi.mock('sonner', () => ({ toast: { error: mockSonnerError, @@ -63,7 +58,6 @@ describe('labels api', () => { await expect(result.current.mutateAsync({name: 'Existing label'})).rejects.toBeInstanceOf(ValidationError); }); - expect(mockShowToast).not.toHaveBeenCalled(); expect(mockSonnerError).not.toHaveBeenCalled(); }); }); @@ -130,7 +124,6 @@ describe('labels api', () => { await expect(result.current.mutateAsync({id: 'label-1', name: 'Existing label'})).rejects.toBeInstanceOf(ValidationError); }); - expect(mockShowToast).not.toHaveBeenCalled(); expect(mockSonnerError).not.toHaveBeenCalled(); }); }); diff --git a/apps/admin-x-framework/test/unit/hooks/use-form.test.ts b/apps/admin-x-framework/test/unit/hooks/use-form.test.ts index 3391693d283..b8284c9d792 100644 --- a/apps/admin-x-framework/test/unit/hooks/use-form.test.ts +++ b/apps/admin-x-framework/test/unit/hooks/use-form.test.ts @@ -427,7 +427,7 @@ describe('useForm', () => { expect(result.current!.okProps).toEqual({ disabled: false, - color: 'black', + variant: 'default', label: undefined }); }); @@ -455,7 +455,7 @@ describe('useForm', () => { // Check that we're in saving state expect(result.current!.okProps).toEqual({ disabled: true, - color: 'black', + variant: 'default', label: 'Saving...' }); }); @@ -475,7 +475,7 @@ describe('useForm', () => { expect(result.current!.okProps).toEqual({ disabled: false, - color: 'green', + variant: 'default', label: 'Saved' }); }); @@ -498,7 +498,7 @@ describe('useForm', () => { expect(result.current!.okProps).toEqual({ disabled: false, - color: 'red', + variant: 'destructive', label: 'Retry' }); }); diff --git a/apps/admin-x-framework/test/unit/hooks/use-handle-error.test.tsx b/apps/admin-x-framework/test/unit/hooks/use-handle-error.test.tsx index 452f87f625c..5c58e5a38dc 100644 --- a/apps/admin-x-framework/test/unit/hooks/use-handle-error.test.tsx +++ b/apps/admin-x-framework/test/unit/hooks/use-handle-error.test.tsx @@ -14,22 +14,20 @@ vi.mock('@sentry/react', () => ({ ErrorBoundary: ({children}: {children: any}) => children })); -vi.mock('../../../src/utils/toast', () => ({ - showToast: vi.fn() +const {mockToastDismiss, mockToastError} = vi.hoisted(() => ({ + mockToastDismiss: vi.fn(), + mockToastError: vi.fn() })); -vi.mock('react-hot-toast', () => ({ - default: { - remove: vi.fn() +vi.mock('sonner', () => ({ + toast: { + dismiss: mockToastDismiss, + error: mockToastError } })); -const mockShowToast = vi.fn(); -const mockToastRemove = vi.fn(); - import * as Sentry from '@sentry/react'; -import toast from 'react-hot-toast'; -import {showToast} from '../../../src/utils/toast'; +import {toast} from 'sonner'; const createWrapper = (sentryDSN?: string): React.FC<{children: ReactNode}> => { const TestWrapper: React.FC<{children: ReactNode}> = ({children}) => ( @@ -68,9 +66,6 @@ describe('useHandleError', () => { callback(scope); }); - (showToast as any).mockImplementation(mockShowToast); - (toast.remove as any).mockImplementation(mockToastRemove); - // Reset console.error mock vi.spyOn(console, 'error').mockImplementation(() => {}); }); @@ -151,7 +146,7 @@ describe('useHandleError', () => { result.current(error); - expect(toast.remove).toHaveBeenCalled(); + expect(toast.dismiss).toHaveBeenCalled(); }); it('does not show toast when withToast is false', () => { @@ -161,7 +156,7 @@ describe('useHandleError', () => { result.current(error, {withToast: false}); - expect(showToast).not.toHaveBeenCalled(); + expect(toast.error).not.toHaveBeenCalled(); }); it('does not show toast for 418 status (test indicator)', () => { @@ -173,7 +168,7 @@ describe('useHandleError', () => { result.current(error); - expect(showToast).not.toHaveBeenCalled(); + expect(toast.error).not.toHaveBeenCalled(); }); it('still clears lingering toasts for 418 status', () => { @@ -185,9 +180,7 @@ describe('useHandleError', () => { result.current(error); - // A stale toast can cover UI and block clicks in tests, so the - // unmocked-request path must clear toasts even without showing one - expect(toast.remove).toHaveBeenCalled(); + expect(toast.dismiss).toHaveBeenCalled(); }); it('does not send session expiry errors to Sentry', () => { @@ -213,8 +206,8 @@ describe('useHandleError', () => { // The fetch layer redirects to signin on session expiry, so the // error handler must not flash a toast over the unloading page - expect(showToast).not.toHaveBeenCalled(); - expect(toast.remove).toHaveBeenCalled(); + expect(toast.error).not.toHaveBeenCalled(); + expect(toast.dismiss).toHaveBeenCalled(); }); it('shows toast for unauthorized errors that do not trigger a redirect', () => { @@ -226,10 +219,7 @@ describe('useHandleError', () => { result.current(error); - expect(showToast).toHaveBeenCalledWith({ - message: 'You are not authorised to make this request.', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('You are not authorised to make this request.'); }); it('shows validation error message from context', () => { @@ -255,10 +245,7 @@ describe('useHandleError', () => { result.current(error); - expect(showToast).toHaveBeenCalledWith({ - message: 'This field must be filled out', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('This field must be filled out'); }); it('shows validation error message when no context available', () => { @@ -284,10 +271,7 @@ describe('useHandleError', () => { result.current(error); - expect(showToast).toHaveBeenCalledWith({ - message: 'Field is required', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('Field is required'); }); it('shows API error message', () => { @@ -298,10 +282,7 @@ describe('useHandleError', () => { result.current(error); - expect(showToast).toHaveBeenCalledWith({ - message: 'API Error occurred', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('API Error occurred'); }); it('shows generic error message for unknown errors', () => { @@ -312,10 +293,7 @@ describe('useHandleError', () => { result.current(error); - expect(showToast).toHaveBeenCalledWith({ - message: 'Something went wrong, please try again.', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('Something went wrong, please try again.'); }); it('handles string errors', () => { @@ -325,10 +303,7 @@ describe('useHandleError', () => { result.current('String error'); expect(console.error).toHaveBeenCalledWith('String error'); // eslint-disable-line no-console - expect(showToast).toHaveBeenCalledWith({ - message: 'Something went wrong, please try again.', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('Something went wrong, please try again.'); }); it('handles null/undefined errors', () => { @@ -338,9 +313,6 @@ describe('useHandleError', () => { result.current(null); expect(console.error).toHaveBeenCalledWith(null); // eslint-disable-line no-console - expect(showToast).toHaveBeenCalledWith({ - message: 'Something went wrong, please try again.', - type: 'error' - }); + expect(toast.error).toHaveBeenCalledWith('Something went wrong, please try again.'); }); }); diff --git a/apps/admin-x-settings/package.json b/apps/admin-x-settings/package.json index 6fa5671d6af..829bacd0e22 100644 --- a/apps/admin-x-settings/package.json +++ b/apps/admin-x-settings/package.json @@ -47,7 +47,6 @@ "lucide-react": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "react-hot-toast": "catalog:", "semver": "catalog:", "sonner": "catalog:", "validator": "catalog:" diff --git a/apps/admin-x-design-system/src/assets/icons/beehiiv.svg b/apps/admin-x-settings/src/assets/images/brand-icons/beehiiv.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/beehiiv.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/beehiiv.svg diff --git a/apps/admin-x-design-system/src/assets/icons/facebook.svg b/apps/admin-x-settings/src/assets/images/brand-icons/facebook.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/facebook.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/facebook.svg diff --git a/apps/admin-x-design-system/src/assets/icons/firstpromoter.svg b/apps/admin-x-settings/src/assets/images/brand-icons/firstpromoter.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/firstpromoter.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/firstpromoter.svg diff --git a/apps/admin-x-design-system/src/assets/icons/linkedin.svg b/apps/admin-x-settings/src/assets/images/brand-icons/linkedin.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/linkedin.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/linkedin.svg diff --git a/apps/admin-x-design-system/src/assets/icons/mailchimp.svg b/apps/admin-x-settings/src/assets/images/brand-icons/mailchimp.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/mailchimp.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/mailchimp.svg diff --git a/apps/admin-x-design-system/src/assets/icons/medium.svg b/apps/admin-x-settings/src/assets/images/brand-icons/medium.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/medium.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/medium.svg diff --git a/apps/admin-x-design-system/src/assets/icons/pintura.svg b/apps/admin-x-settings/src/assets/images/brand-icons/pintura.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/pintura.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/pintura.svg diff --git a/apps/admin-x-design-system/src/assets/icons/portal-icon-1.svg b/apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-1.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/portal-icon-1.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-1.svg diff --git a/apps/admin-x-design-system/src/assets/icons/portal-icon-2.svg b/apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-2.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/portal-icon-2.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-2.svg diff --git a/apps/admin-x-design-system/src/assets/icons/portal-icon-3.svg b/apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-3.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/portal-icon-3.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-3.svg diff --git a/apps/admin-x-design-system/src/assets/icons/portal-icon-4.svg b/apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-4.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/portal-icon-4.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-4.svg diff --git a/apps/admin-x-design-system/src/assets/icons/portal-icon-5.svg b/apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-5.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/portal-icon-5.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/portal-icon-5.svg diff --git a/apps/admin-x-design-system/src/assets/icons/slack.svg b/apps/admin-x-settings/src/assets/images/brand-icons/slack.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/slack.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/slack.svg diff --git a/apps/admin-x-design-system/src/assets/icons/squarespace.svg b/apps/admin-x-settings/src/assets/images/brand-icons/squarespace.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/squarespace.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/squarespace.svg diff --git a/apps/admin-x-design-system/src/assets/icons/substack.svg b/apps/admin-x-settings/src/assets/images/brand-icons/substack.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/substack.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/substack.svg diff --git a/apps/admin-x-design-system/src/assets/icons/transistor.svg b/apps/admin-x-settings/src/assets/images/brand-icons/transistor.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/transistor.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/transistor.svg diff --git a/apps/admin-x-design-system/src/assets/icons/twitter-x.svg b/apps/admin-x-settings/src/assets/images/brand-icons/twitter-x.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/twitter-x.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/twitter-x.svg diff --git a/apps/admin-x-design-system/src/assets/icons/unsplash.svg b/apps/admin-x-settings/src/assets/images/brand-icons/unsplash.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/unsplash.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/unsplash.svg diff --git a/apps/admin-x-design-system/src/assets/icons/wordpress.svg b/apps/admin-x-settings/src/assets/images/brand-icons/wordpress.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/wordpress.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/wordpress.svg diff --git a/apps/admin-x-design-system/src/assets/icons/zapier.svg b/apps/admin-x-settings/src/assets/images/brand-icons/zapier.svg similarity index 100% rename from apps/admin-x-design-system/src/assets/icons/zapier.svg rename to apps/admin-x-settings/src/assets/images/brand-icons/zapier.svg diff --git a/apps/admin-x-settings/src/components/exit-settings-button.tsx b/apps/admin-x-settings/src/components/exit-settings-button.tsx index ad64ce7e563..5c3ac148455 100644 --- a/apps/admin-x-settings/src/components/exit-settings-button.tsx +++ b/apps/admin-x-settings/src/components/exit-settings-button.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import {Button} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; import {DirtyConfirmDialog, useDirtyConfirmation} from '@tryghost/shade/patterns'; -import {useGlobalDirtyState} from '@tryghost/shade/utils'; +import {LucideIcon, useGlobalDirtyState} from '@tryghost/shade/utils'; const ExitSettingsButton: React.FC = () => { const {isDirty} = useGlobalDirtyState(); @@ -13,7 +13,9 @@ const ExitSettingsButton: React.FC = () => { return ( <> - ); diff --git a/apps/admin-x-settings/src/components/icons/brand-icon.tsx b/apps/admin-x-settings/src/components/icons/brand-icon.tsx new file mode 100644 index 00000000000..631a80ae541 --- /dev/null +++ b/apps/admin-x-settings/src/components/icons/brand-icon.tsx @@ -0,0 +1,79 @@ +import Beehiiv from '../../assets/images/brand-icons/beehiiv.svg'; +import Facebook from '../../assets/images/brand-icons/facebook.svg'; +import FirstPromoter from '../../assets/images/brand-icons/firstpromoter.svg'; +import Linkedin from '../../assets/images/brand-icons/linkedin.svg'; +import Mailchimp from '../../assets/images/brand-icons/mailchimp.svg'; +import Medium from '../../assets/images/brand-icons/medium.svg'; +import Pintura from '../../assets/images/brand-icons/pintura.svg'; +import PortalIcon1 from '../../assets/images/brand-icons/portal-icon-1.svg'; +import PortalIcon2 from '../../assets/images/brand-icons/portal-icon-2.svg'; +import PortalIcon3 from '../../assets/images/brand-icons/portal-icon-3.svg'; +import PortalIcon4 from '../../assets/images/brand-icons/portal-icon-4.svg'; +import PortalIcon5 from '../../assets/images/brand-icons/portal-icon-5.svg'; +import React from 'react'; +import Slack from '../../assets/images/brand-icons/slack.svg'; +import Squarespace from '../../assets/images/brand-icons/squarespace.svg'; +import Substack from '../../assets/images/brand-icons/substack.svg'; +import Transistor from '../../assets/images/brand-icons/transistor.svg'; +import TwitterX from '../../assets/images/brand-icons/twitter-x.svg'; +import Unsplash from '../../assets/images/brand-icons/unsplash.svg'; +import Wordpress from '../../assets/images/brand-icons/wordpress.svg'; +import Zapier from '../../assets/images/brand-icons/zapier.svg'; +import clsx from 'clsx'; + +const icons = { + beehiiv: {src: Beehiiv}, + facebook: {src: Facebook, monochrome: true}, + firstpromoter: {src: FirstPromoter}, + linkedin: {src: Linkedin, monochrome: true}, + mailchimp: {src: Mailchimp}, + medium: {src: Medium}, + pintura: {src: Pintura}, + 'portal-icon-1': {src: PortalIcon1, monochrome: true}, + 'portal-icon-2': {src: PortalIcon2, monochrome: true}, + 'portal-icon-3': {src: PortalIcon3, monochrome: true}, + 'portal-icon-4': {src: PortalIcon4, monochrome: true}, + 'portal-icon-5': {src: PortalIcon5, monochrome: true}, + slack: {src: Slack}, + squarespace: {src: Squarespace}, + substack: {src: Substack}, + transistor: {src: Transistor, monochrome: true}, + 'twitter-x': {src: TwitterX, monochrome: true}, + unsplash: {src: Unsplash, monochrome: true}, + wordpress: {src: Wordpress}, + zapier: {src: Zapier} +} as const; + +export type BrandIconName = keyof typeof icons; + +export interface BrandIconProps { + className?: string; + name: BrandIconName; + size?: number; + style?: React.CSSProperties; +} + +const BrandIcon: React.FC = ({name, size, className, style}) => { + const icon = icons[name]; + const sizeStyle = size ? {width: size, height: size, ...style} : style; + + if ('monochrome' in icon) { + const mask = `url("${icon.src}") center / contain no-repeat`; + + return ( +
    : diff --git a/apps/admin-x-settings/src/components/settings/growth/explore/testimonials-modal.tsx b/apps/admin-x-settings/src/components/settings/growth/explore/testimonials-modal.tsx index 2f2ed9a56aa..9e319fc3b82 100644 --- a/apps/admin-x-settings/src/components/settings/growth/explore/testimonials-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/explore/testimonials-modal.tsx @@ -4,8 +4,10 @@ import JoelWarner from '../../../../assets/images/joel-warner.png'; import NiceModal, {useModal} from '@ebay/nice-modal-react'; import React from 'react'; import {Avatar, Field, FieldError, FieldLabel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea} from '@tryghost/shade/components'; -import {Button, Form, Modal, showToast} from '@tryghost/admin-x-design-system'; +import {Button, LoadingIndicator} from '@tryghost/shade/components'; +import {Form, Modal} from '@tryghost/admin-x-design-system'; import {getSettingValues} from '@tryghost/admin-x-framework/api/settings'; +import {toast} from 'sonner'; import {useForm, useHandleError} from '@tryghost/admin-x-framework/hooks'; import {useGlobalData} from '../../../providers/global-data-provider'; import {useRouting} from '@tryghost/admin-x-framework/routing'; @@ -62,10 +64,7 @@ const TestimonialsModal = NiceModal.create(() => { throw new Error('Something went wrong, please try again later.'); } - showToast({ - message: 'Thank you for your testimonial!', - type: 'success' - }); + toast.success('Thank you for your testimonial!'); updateRoute('explore'); modal.remove(); @@ -221,14 +220,15 @@ const TestimonialsModal = NiceModal.create(() => { diff --git a/apps/admin-x-settings/src/components/settings/growth/network.tsx b/apps/admin-x-settings/src/components/settings/growth/network.tsx index 3441ee8eaf2..7c17a9c0711 100644 --- a/apps/admin-x-settings/src/components/settings/growth/network.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/network.tsx @@ -2,8 +2,9 @@ import React from 'react'; import SettingImg from '../../../assets/images/network.png'; import TopLevelGroup from '../../top-level-group'; import validator from 'validator'; -import {Icon, SettingGroupContent} from '@tryghost/admin-x-design-system'; +import {LucideIcon} from '@tryghost/shade/utils'; import {type Setting, getSettingValues, useEditSettings} from '@tryghost/admin-x-framework/api/settings'; +import {SettingGroupContent} from '@tryghost/admin-x-design-system'; import {Switch} from '@tryghost/shade/components'; import {getGhostPaths} from '@tryghost/admin-x-framework/helpers'; import {useGlobalData} from '../../providers/global-data-provider'; @@ -79,7 +80,7 @@ const Network: React.FC<{ keywords: string[] }> = ({keywords}) => { value: isDisabled &&
    - +
    {isDisabledByPrivateMode ? <>Network is automatically disabled while your site is in updateRoute('members')}>private mode diff --git a/apps/admin-x-settings/src/components/settings/growth/offers.tsx b/apps/admin-x-settings/src/components/settings/growth/offers.tsx index 3dee9ab6c02..4792489d2bb 100644 --- a/apps/admin-x-settings/src/components/settings/growth/offers.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/offers.tsx @@ -1,6 +1,6 @@ import React from 'react'; import TopLevelGroup from '../../top-level-group'; -import {Button} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; import {checkStripeEnabled} from '@tryghost/admin-x-framework/api/settings'; import {getPaidActiveTiers, useBrowseTiers} from '@tryghost/admin-x-framework/api/tiers'; import {useBrowseOffers} from '@tryghost/admin-x-framework/api/offers'; @@ -29,7 +29,7 @@ const Offers: React.FC<{ keywords: string[] }> = ({keywords}) => { return ( } + customButtons={} description={<>Create discounts & coupons to boost new subscriptions and retain existing members.{' '}Learn more} keywords={keywords} navid='offers' @@ -40,7 +40,7 @@ const Offers: React.FC<{ keywords: string[] }> = ({keywords}) => { (
    You must have an active tier to create an offer. {` `} -
    ) : '' } diff --git a/apps/admin-x-settings/src/components/settings/growth/offers/add-offer-modal.tsx b/apps/admin-x-settings/src/components/settings/growth/offers/add-offer-modal.tsx index f9c99cf20e5..734dc9693bf 100644 --- a/apps/admin-x-settings/src/components/settings/growth/offers/add-offer-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/offers/add-offer-modal.tsx @@ -1,15 +1,14 @@ import PortalFrame from '../../membership/portal/portal-frame'; -import toast from 'react-hot-toast'; -import {Button} from '@tryghost/admin-x-design-system'; +import {Button, Field, FieldContent, FieldDescription, FieldError, FieldLabel, InputGroup, InputGroupAddon, InputGroupInput, RadioGroup, RadioGroupItem, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea} from '@tryghost/shade/components'; import {type ErrorMessages, useForm} from '@tryghost/admin-x-framework/hooks'; -import {Field, FieldContent, FieldDescription, FieldError, FieldLabel, InputGroup, InputGroupAddon, InputGroupInput, RadioGroup, RadioGroupItem, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea} from '@tryghost/shade/components'; -import {Form, PreviewModalContent, TextField, showToast} from '@tryghost/admin-x-design-system'; +import {Form, PreviewModalContent, TextField} from '@tryghost/admin-x-design-system'; import {JSONError} from '@tryghost/admin-x-framework/errors'; import {formatNumber} from '@tryghost/shade/utils'; import {getHomepageUrl} from '@tryghost/admin-x-framework/api/site'; import {getOfferPortalPreviewUrl, type offerPortalPreviewUrlTypes} from '../../../../utils/get-offers-portal-preview-url'; import {getPaidActiveTiers, useBrowseTiers} from '@tryghost/admin-x-framework/api/tiers'; import {getTiersCadences} from '../../../../utils/get-tiers-cadences'; +import {toast} from 'sonner'; import {useAddOffer} from '@tryghost/admin-x-framework/api/offers'; import {useBrowseOffers} from '@tryghost/admin-x-framework/api/offers'; import {useEffect, useMemo, useState} from 'react'; @@ -307,7 +306,7 @@ const Sidebar: React.FC = ({tierOptions,
    {homepageUrl}{overrides.code.value}
    : null)} + hint={errors.code || (overrides.code.value !== '' ?
    {homepageUrl}{overrides.code.value}
    : null)} placeholder='black-friday' title='Offer code' value={overrides.code.value} @@ -671,8 +670,8 @@ const AddOfferModal = () => { cancelLabel='Cancel' dirty={saveState === 'unsaved'} height='full' - okColor={okProps.color} okLabel='Publish' + okVariant={okProps.variant} preview={iframe} previewToolbar={false} sidebar={sidebar} @@ -685,12 +684,8 @@ const AddOfferModal = () => { validate(); const isErrorsEmpty = Object.values(errors).every(error => !error); if (!isErrorsEmpty) { - toast.remove(); - showToast({ - title: 'Can\'t save offer', - type: 'info', - message: 'Make sure you filled all required fields' - }); + toast.dismiss(); + toast.info('Can\'t save offer', {description: 'Make sure you filled all required fields'}); return; } @@ -705,13 +700,9 @@ const AddOfferModal = () => { message = e.data.errors[0].context || e.data.errors[0].message; } - toast.remove(); + toast.dismiss(); if (message) { - showToast({ - title: 'Can\'t save offer', - type: 'error', - message: message || 'Please try again later' - }); + toast.error('Can\'t save offer', {description: message || 'Please try again later'}); } } }} diff --git a/apps/admin-x-settings/src/components/settings/growth/offers/edit-offer-modal.tsx b/apps/admin-x-settings/src/components/settings/growth/offers/edit-offer-modal.tsx index ad748b48b4f..91d0b3fe89f 100644 --- a/apps/admin-x-settings/src/components/settings/growth/offers/edit-offer-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/offers/edit-offer-modal.tsx @@ -1,16 +1,16 @@ import NiceModal from '@ebay/nice-modal-react'; import PortalFrame from '../../membership/portal/portal-frame'; import SettingsBreadcrumbs from '../../settings-breadcrumbs'; -import toast from 'react-hot-toast'; -import {Button, ConfirmationModal, Form, PreviewModalContent, TextField, showToast} from '@tryghost/admin-x-design-system'; +import {Button, Field, FieldLabel, Textarea} from '@tryghost/shade/components'; +import {ConfirmationModal, Form, PreviewModalContent, TextField} from '@tryghost/admin-x-design-system'; import {type ErrorMessages, useForm, useHandleError} from '@tryghost/admin-x-framework/hooks'; -import {Field, FieldLabel, Textarea} from '@tryghost/shade/components'; import {JSONError} from '@tryghost/admin-x-framework/errors'; import {type Offer, useBrowseOffersById, useEditOffer} from '@tryghost/admin-x-framework/api/offers'; import {createOfferRedemptionFilterUrl} from './offer-helpers'; import {formatNumber} from '@tryghost/shade/utils'; import {getHomepageUrl} from '@tryghost/admin-x-framework/api/site'; import {getOfferPortalPreviewUrl, type offerPortalPreviewUrlTypes} from '../../../../utils/get-offers-portal-preview-url'; +import {toast} from 'sonner'; import {useEffect, useState} from 'react'; import {useGlobalData} from '../../../providers/global-data-provider'; import {useRouting} from '@tryghost/admin-x-framework/routing'; @@ -63,15 +63,12 @@ const Sidebar: React.FC<{

    All members that previously redeemed {offer?.name} will remain unchanged.

    , okLabel: 'Archive', - okColor: 'red', + okVariant: 'destructive', onOk: async (modal) => { try { await editOffer({...offer, status: 'archived'}); modal?.remove(); - showToast({ - type: 'success', - title: 'Offer archived' - }); + toast.success('Offer archived'); updateRoute('offers/edit'); } catch (e) { handleError(e); @@ -89,10 +86,7 @@ const Sidebar: React.FC<{ try { await editOffer({...offer, status: 'active'}); modal?.remove(); - showToast({ - type: 'success', - title: 'Offer reactivated' - }); + toast.success('Offer reactivated'); updateRoute('offers/edit'); } catch (e) { handleError(e); @@ -150,7 +144,7 @@ const Sidebar: React.FC<{ error={Boolean(errors.code)} hint={errors.code || (offer?.code !== '' ? {homepageUrl}{offer?.code} : null)} placeholder='black-friday' - rightPlaceholder={offer?.code !== '' ? : null} title='Offer code' value={offer?.code ?? ''} onChange={e => updateOffer({code: e.target.value})} @@ -173,7 +167,7 @@ const Sidebar: React.FC<{
    - {offer?.status === 'active' ? : }
    ); @@ -269,8 +263,8 @@ const EditOfferModal: React.FC<{id: string}> = ({id}) => { cancelLabel='Cancel' dirty={saveState === 'unsaved'} height='full' - okColor={okProps.color} okLabel={okProps.label || 'Save'} + okVariant={okProps.variant} preview={iframe} previewToolbarBreadcrumbs={ = ({id}) => { message = e.data.errors[0].context || e.data.errors[0].message; } - toast.remove(); + toast.dismiss(); if (message) { - showToast({ - title: 'Can\'t save offer', - type: 'error', - message: 'Please try again later' - }); + toast.error('Can\'t save offer', {description: 'Please try again later'}); } } }} /> : null; diff --git a/apps/admin-x-settings/src/components/settings/growth/offers/edit-retention-offer-modal.tsx b/apps/admin-x-settings/src/components/settings/growth/offers/edit-retention-offer-modal.tsx index d612739d5d8..4cda9c15f62 100644 --- a/apps/admin-x-settings/src/components/settings/growth/offers/edit-retention-offer-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/offers/edit-retention-offer-modal.tsx @@ -1,15 +1,15 @@ import PortalFrame from '../../membership/portal/portal-frame'; import SettingsBreadcrumbs from '../../settings-breadcrumbs'; -import toast from 'react-hot-toast'; import {type ErrorMessages, useForm} from '@tryghost/admin-x-framework/hooks'; import {Field, FieldContent, FieldDescription, FieldLabel, RadioGroup, RadioGroupItem, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch, Textarea} from '@tryghost/shade/components'; -import {Form, PreviewModalContent, TextField, showToast} from '@tryghost/admin-x-design-system'; +import {Form, PreviewModalContent, TextField} from '@tryghost/admin-x-design-system'; import {JSONError} from '@tryghost/admin-x-framework/errors'; import {type Offer, useAddOffer, useBrowseOffers, useEditOffer, useInvalidateOffers} from '@tryghost/admin-x-framework/api/offers'; import {createOfferRedemptionsFilterUrl, formatOfferTimestamp, generateRetentionOfferName} from './offer-helpers'; import {formatNumber} from '@tryghost/shade/utils'; import {getOfferPortalPreviewUrl, type offerPortalPreviewUrlTypes} from '../../../../utils/get-offers-portal-preview-url'; import {getPaidActiveTiers, useBrowseTiers} from '@tryghost/admin-x-framework/api/tiers'; +import {toast} from 'sonner'; import {useEffect, useMemo, useState} from 'react'; import {useGlobalData} from '../../../providers/global-data-provider'; import {useRouting} from '@tryghost/admin-x-framework/routing'; @@ -431,12 +431,8 @@ const EditRetentionOfferModal: React.FC<{id: string}> = ({id}) => { message = error.data.errors[0].context || error.data.errors[0].message || message; } - toast.remove(); - showToast({ - title: 'Failed to save offer', - type: 'error', - message - }); + toast.dismiss(); + toast.error('Failed to save offer', {description: message}); }; const {formState, setFormState, updateForm, handleSave, saveState, okProps, errors, clearError} = useForm({ @@ -659,8 +655,8 @@ const EditRetentionOfferModal: React.FC<{id: string}> = ({id}) => { cancelLabel='Cancel' dirty={saveState === 'unsaved'} height='full' - okColor={okProps.color} okLabel={okProps.label || 'Save'} + okVariant={okProps.variant} preview={preview} previewToolbarBreadcrumbs={ = ({id}) => { discount = offer?.amount + '% discount'; break; case 'fixed': - discount = numberWithCommas(currencyToDecimal(offer?.amount)) + ' ' + offer?.currency + ' discount'; + discount = formatNumber(currencyToDecimal(offer?.amount), {maximumFractionDigits: 2}) + ' ' + offer?.currency + ' discount'; break; case 'trial': discount = offer?.amount + ' days free trial'; @@ -89,19 +90,19 @@ const OfferSuccess: React.FC<{id: string}> = ({id}) => { label='Offers' onBack={() => updateRoute('offers/edit')} /> - +

    Your new offer is live!

    You can share the link anywhere. In your newsletter, social media, a podcast, or in-person. It all just works.

    -
    OR
    - + +
    diff --git a/apps/admin-x-settings/src/components/settings/growth/offers/offers-index.tsx b/apps/admin-x-settings/src/components/settings/growth/offers/offers-index.tsx index 2563e9af7f8..58e2813ab79 100644 --- a/apps/admin-x-settings/src/components/settings/growth/offers/offers-index.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/offers/offers-index.tsx @@ -1,7 +1,4 @@ -import {Badge, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from '@tryghost/shade/components'; -import {Button, type ButtonProps, showToast} from '@tryghost/admin-x-design-system'; -import {ButtonGroup} from '@tryghost/admin-x-design-system'; -import {Icon} from '@tryghost/admin-x-design-system'; +import {Badge, Button, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from '@tryghost/shade/components'; import {Inline, Stack} from '@tryghost/shade/primitives'; import {LucideIcon, formatNumber} from '@tryghost/shade/utils'; import {Modal} from '@tryghost/admin-x-design-system'; @@ -10,6 +7,7 @@ import {type RetentionOffer, getRetentionOffers} from './offers-retention'; import {type Tier, getPaidActiveTiers, useBrowseTiers} from '@tryghost/admin-x-framework/api/tiers'; import {createOfferRedemptionFilterUrl, createOfferRedemptionsFilterUrl} from './offer-helpers'; import {currencyToDecimal, getSymbol} from '../../../../utils/currency'; +import {toast} from 'sonner'; import {useModal} from '@ebay/nice-modal-react'; import {useOffersShowArchived, useSortingState} from '../../../providers/settings-app-provider'; import {useRouting} from '@tryghost/admin-x-framework/routing'; @@ -75,7 +73,9 @@ const OffersFilterMenu: React.FC<{ return ( - Sort by @@ -85,7 +85,7 @@ const OffersFilterMenu: React.FC<{ Redemptions - + {sortDirection === 'asc' ? : } {sortDirection === 'asc' ? 'Ascending' : 'Descending'} @@ -327,32 +327,24 @@ export const OffersIndexModal: React.FC = () => { return offer.status === 'archived' || offerTier?.active === false; }; - const buttons: ButtonProps[] = [ - { - key: 'cancel-modal', - label: 'Close', - onClick: () => { + const actions = ( + + + + + ); const listLayoutOutput =
    @@ -431,7 +423,7 @@ export const OffersIndexModal: React.FC = () => { size='lg' testId='offers-modal' title='Offers' - topRightContent={} + topRightContent={actions} width={1140} > diff --git a/apps/admin-x-settings/src/components/settings/growth/recommendations.tsx b/apps/admin-x-settings/src/components/settings/growth/recommendations.tsx index 3ebf2e95788..226325b7007 100644 --- a/apps/admin-x-settings/src/components/settings/growth/recommendations.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/recommendations.tsx @@ -3,7 +3,7 @@ import React, {useState} from 'react'; import RecommendationList from './recommendations/recommendation-list'; import TopLevelGroup from '../../top-level-group'; import useSettingGroup from '../../../hooks/use-setting-group'; -import {Button} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; import {Tabs, TabsContent, TabsList, TabsTrigger, TabsTriggerCount} from '@tryghost/shade/components'; import {formatNumber} from '@tryghost/shade/utils'; import {keepPreviousData} from '@tanstack/react-query'; @@ -101,9 +101,9 @@ const Recommendations: React.FC<{ keywords: string[] }> = ({keywords}) => { }; const buttons = ( - ); return ( @@ -119,9 +119,9 @@ const Recommendations: React.FC<{ keywords: string[] }> = ({keywords}) => { onSave={handleSave} >
    -
    diff --git a/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal-confirm.tsx b/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal-confirm.tsx index 48e7e8fe0c9..ae76b536c08 100644 --- a/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal-confirm.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal-confirm.tsx @@ -3,8 +3,11 @@ import NiceModal, {useModal} from '@ebay/nice-modal-react'; import React from 'react'; import RecommendationDescriptionForm, {validateDescriptionForm} from './recommendation-description-form'; import trackEvent from '../../../../utils/analytics'; +import {Button} from '@tryghost/shade/components'; import {type EditOrAddRecommendation, useAddRecommendation} from '@tryghost/admin-x-framework/api/recommendations'; -import {Modal, dismissAllToasts, showToast} from '@tryghost/admin-x-design-system'; +import {LucideIcon} from '@tryghost/shade/utils'; +import {Modal} from '@tryghost/admin-x-design-system'; +import {toast} from 'sonner'; import {useForm, useHandleError} from '@tryghost/admin-x-framework/hooks'; import {useRouting} from '@tryghost/admin-x-framework/routing'; @@ -26,10 +29,7 @@ const AddRecommendationModalConfirm: React.FC = ({r onSave: async (state) => { await addRecommendation(state); modal.remove(); - showToast({ - title: 'Recommendation added', - type: 'success' - }); + toast.success('Recommendation added'); trackEvent('Recommendation Added', { oneClickSubscribe: state.one_click_subscribe }); @@ -51,13 +51,8 @@ const AddRecommendationModalConfirm: React.FC = ({r okLabel = 'Added'; } - const leftButtonProps = { - label: 'Back', - icon: 'arrow-left', - iconColorClass: 'text-black dark:text-white', - link: true, - size: 'sm' as const, - onClick: () => { + const leftButton = ( + + ); return { @@ -84,10 +82,10 @@ const AddRecommendationModalConfirm: React.FC = ({r backDropClick={false} cancelLabel={'Cancel'} dirty={true} - leftButtonProps={leftButtonProps} - okColor='black' + leftButton={leftButton} okLabel={okLabel} okLoading={loadingState} + okVariant='default' size='sm' testId='add-recommendation-modal' title={'Add recommendation'} @@ -106,14 +104,11 @@ const AddRecommendationModalConfirm: React.FC = ({r return; } - dismissAllToasts(); + toast.dismiss(); try { await handleSave({force: true}); } catch { - showToast({ - type: 'error', - title: 'Something went wrong when adding this recommendation, please try again.' - }); + toast.error('Something went wrong when adding this recommendation, please try again.'); } }} > diff --git a/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal.tsx b/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal.tsx index 315ad5f0818..8d32417d44f 100644 --- a/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/recommendations/add-recommendation-modal.tsx @@ -4,10 +4,11 @@ import React, {useEffect, useState} from 'react'; import {AlreadyExistsError} from '@tryghost/admin-x-framework/errors'; import {type EditOrAddRecommendation, useCheckRecommendation} from '@tryghost/admin-x-framework/api/recommendations'; import {type ErrorMessages, useForm} from '@tryghost/admin-x-framework/hooks'; -import {Form, Modal, TextField, dismissAllToasts, showToast} from '@tryghost/admin-x-design-system'; +import {Form, Modal, TextField} from '@tryghost/admin-x-design-system'; import {LoadingIndicator} from '@tryghost/shade/components'; import {type RoutingModalProps, useRouting} from '@tryghost/admin-x-framework/routing'; import {formatUrl} from '../../../../utils/format-url'; +import {toast} from 'sonner'; interface AddRecommendationModalProps { recommendation?: EditOrAddRecommendation, @@ -124,17 +125,14 @@ const AddRecommendationModal: React.FC { + const leftButton = ( + + ); return { @@ -73,23 +68,19 @@ const EditRecommendationModal: React.FC { - dismissAllToasts(); + toast.dismiss(); try { await handleSave({force: true}); } catch { - showToast({ - title: 'Something went wrong', - type: 'error', - message: 'Please try again later.' - }); + toast.error('Something went wrong', {description: 'Please try again later.'}); } }} > diff --git a/apps/admin-x-settings/src/components/settings/growth/recommendations/incoming-recommendation-list.tsx b/apps/admin-x-settings/src/components/settings/growth/recommendations/incoming-recommendation-list.tsx index 85a86a56630..a623322a185 100644 --- a/apps/admin-x-settings/src/components/settings/growth/recommendations/incoming-recommendation-list.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/recommendations/incoming-recommendation-list.tsx @@ -1,7 +1,7 @@ import React, {useMemo} from 'react'; import RecommendationIcon from './recommendation-icon'; import {ActionList, ActionListItem, ActionListItemActions, ActionListItemContent, LoadingIndicator, NoValueLabel} from '@tryghost/shade/components'; -import {Button} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; import {type IncomingRecommendation} from '@tryghost/admin-x-framework/api/recommendations'; import {Inline} from '@tryghost/shade/primitives'; import {type ReferrerHistoryItem} from '@tryghost/admin-x-framework/api/referrers'; @@ -79,8 +79,7 @@ const IncomingRecommendationItem: React.FC<{incomingRecommendation: IncomingReco {!incomingRecommendation.recommending_back && (
    -
    )} @@ -98,7 +97,7 @@ const IncomingRecommendationList: React.FC = ({ {incomingRecommendations.map(rec => )} - {showMore?.hasMore &&
    } + {showMore?.hasMore &&
    } ; } else { return diff --git a/apps/admin-x-settings/src/components/settings/growth/recommendations/recommendation-list.tsx b/apps/admin-x-settings/src/components/settings/growth/recommendations/recommendation-list.tsx index bb8a51f5b47..33505efd021 100644 --- a/apps/admin-x-settings/src/components/settings/growth/recommendations/recommendation-list.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/recommendations/recommendation-list.tsx @@ -3,11 +3,10 @@ import NiceModal from '@ebay/nice-modal-react'; import React, {useState} from 'react'; import RecommendationIcon from './recommendation-icon'; import useSettingGroup from '../../../../hooks/use-setting-group'; -import {ActionList, ActionListItem, ActionListItemContent, LoadingIndicator, NoValueLabel, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from '@tryghost/shade/components'; -import {Button} from '@tryghost/admin-x-design-system'; +import {ActionList, ActionListItem, ActionListItemContent, Button, LoadingIndicator, NoValueLabel, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from '@tryghost/shade/components'; import {Inline} from '@tryghost/shade/primitives'; +import {LucideIcon, formatNumber} from '@tryghost/shade/utils'; import {type Recommendation} from '@tryghost/admin-x-framework/api/recommendations'; -import {formatNumber} from '@tryghost/shade/utils'; import {useRouting} from '@tryghost/admin-x-framework/routing'; interface RecommendationListProps { @@ -95,22 +94,20 @@ const RecommendationList: React.FC = ({recommendations, {recommendations.map(recommendation => )}
    - {showMore?.hasMore && } + {showMore?.hasMore && }
    Shared with new members after signup, or anytime using this link {copied ? 'Copied' : 'Copy link'} @@ -120,9 +117,9 @@ const RecommendationList: React.FC = ({recommendations, ; } else { return - + }}>Add first recommendation Need inspiration? Explore thousands of sites ; } diff --git a/apps/admin-x-settings/src/components/settings/membership/access.tsx b/apps/admin-x-settings/src/components/settings/membership/access.tsx index 3b5c933f19c..418eab743f4 100644 --- a/apps/admin-x-settings/src/components/settings/membership/access.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/access.tsx @@ -3,8 +3,9 @@ import TopLevelGroup from '../../top-level-group'; import useSettingGroup from '../../../hooks/use-setting-group'; import {Banner, Combobox, ComboboxContent, ComboboxTrigger, ComboboxValue, Field, FieldDescription, FieldError, FieldLabel, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, MultiSelectCombobox, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Separator, Button as ShadeButton} from '@tryghost/shade/components'; import {RefreshCw} from 'lucide-react'; -import {SettingGroupContent, showToast} from '@tryghost/admin-x-design-system'; +import {SettingGroupContent} from '@tryghost/admin-x-design-system'; import {getSettingValues, isSettingReadOnly, useRegenerateAccessCode} from '@tryghost/admin-x-framework/api/settings'; +import {toast} from 'sonner'; import {useBrowseTiers} from '@tryghost/admin-x-framework/api/tiers'; import {useGlobalData} from '../../providers/global-data-provider'; import {useLimiter} from '../../../hooks/use-limiter'; @@ -167,10 +168,7 @@ const Access: React.FC<{ keywords: string[] }> = ({keywords}) => { clearError('password'); } } catch { - showToast({ - type: 'error', - title: 'Could not regenerate access code' - }); + toast.error('Could not regenerate access code'); } finally { setIsRegenerating(false); } diff --git a/apps/admin-x-settings/src/components/settings/membership/custom-fields.tsx b/apps/admin-x-settings/src/components/settings/membership/custom-fields.tsx index ac24306d08d..a370a59206a 100644 --- a/apps/admin-x-settings/src/components/settings/membership/custom-fields.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/custom-fields.tsx @@ -1,10 +1,10 @@ +import CustomFieldIcon from './custom-fields/custom-field-icon'; import CustomFieldModal from './custom-fields/custom-field-modal'; import NiceModal from '@ebay/nice-modal-react'; import React, {useEffect, useRef, useState} from 'react'; import TopLevelGroup from '../../top-level-group'; import useFeatureFlag from '../../../hooks/use-feature-flag'; -import {ActionList, ActionListItem, ActionListItemActions, ActionListItemContent, NoValueLabel, NoValueLabelIcon, Tabs, TabsContent, TabsList, TabsTrigger} from '@tryghost/shade/components'; -import {Button, Icon} from '@tryghost/admin-x-design-system'; +import {ActionList, ActionListItem, ActionListItemActions, ActionListItemContent, Button, NoValueLabel, NoValueLabelIcon, Tabs, TabsContent, TabsList, TabsTrigger} from '@tryghost/shade/components'; import {TextCursorInput} from 'lucide-react'; import {useBrowseMemberCustomFieldsIncludingArchived, userTypeForField} from '@tryghost/admin-x-framework/api/member-custom-fields'; import {withErrorBoundary} from '../../error-boundary'; @@ -47,7 +47,7 @@ const FieldList: React.FC<{ - ); @@ -112,7 +112,7 @@ const CustomFields: React.FC<{keywords: string[]}> = ({keywords}) => { return ( openModal()} />} + customButtons={} description='Create and manage custom fields to store extra information about your members' keywords={keywords} navid='custom-fields' diff --git a/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-icon.tsx b/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-icon.tsx new file mode 100644 index 00000000000..e07aa00e768 --- /dev/null +++ b/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-icon.tsx @@ -0,0 +1,15 @@ +import {LucideIcon} from '@tryghost/shade/utils'; +import type {MemberCustomField} from '@tryghost/admin-x-framework/api/member-custom-fields'; + +const icons: Record = { + short_text: LucideIcon.Type, + long_text: LucideIcon.AlignLeft, + address: LucideIcon.MapPin +}; + +const CustomFieldIcon: React.FC<{type: MemberCustomField['type']; className?: string}> = ({type, className}) => { + const Icon = icons[type] || LucideIcon.Type; + return ; +}; + +export default CustomFieldIcon; diff --git a/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-modal.tsx b/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-modal.tsx index 08249941548..170bae9d193 100644 --- a/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/custom-fields/custom-field-modal.tsx @@ -1,9 +1,12 @@ +import CustomFieldIcon from './custom-field-icon'; import NiceModal, {useModal} from '@ebay/nice-modal-react'; import React from 'react'; -import {Button, ConfirmationModal, Form, Icon, Modal, TextField, showToast} from '@tryghost/admin-x-design-system'; -import {DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Field, FieldDescription, FieldLabel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@tryghost/shade/components'; +import {Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Field, FieldDescription, FieldLabel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@tryghost/shade/components'; +import {ConfirmationModal, Form, Modal, TextField} from '@tryghost/admin-x-design-system'; +import {LucideIcon} from '@tryghost/shade/utils'; import {ValidationError, getErrorMessage} from '@tryghost/admin-x-framework/errors'; import {memberCustomFieldUserTypes, useCreateMemberCustomField, useDeleteMemberCustomField, useEditMemberCustomField, userTypeForField} from '@tryghost/admin-x-framework/api/member-custom-fields'; +import {toast} from 'sonner'; import {useForm, useHandleError} from '@tryghost/admin-x-framework/hooks'; import type {MemberCustomField} from '@tryghost/admin-x-framework/api/member-custom-fields'; @@ -14,7 +17,7 @@ const userTypeById = (id: string) => memberCustomFieldUserTypes.find(userType => // Fixed-width so option labels align in a column regardless of icon shape. const TypeTile: React.FC<{userTypeId: string}> = ({userTypeId}) => ( - + ); @@ -78,12 +81,8 @@ const CustomFieldModal = NiceModal.create<{field?: MemberCustomField}>(({field}) // The modal's third action mirrors the field's state: an active field can // be archived, an archived one reactivated. Both confirm first (the // newsletters pattern) — they change what every collection surface shows. - const archiveButtonProps = { - label: 'Archive', - link: true, - color: 'red' as const, - size: 'sm' as const, - onClick: () => { + const archiveButton = ( + + ); - const reactivateButtonProps = { - label: 'Reactivate', - link: true, - color: 'green' as const, - size: 'sm' as const, - onClick: () => { + const reactivateButton = ( + + ); - let leftButtonProps; + let leftButton; if (isEdit) { - leftButtonProps = isArchived ? reactivateButtonProps : archiveButtonProps; + leftButton = isArchived ? reactivateButton : archiveButton; } // Permanent deletion hides behind the header menu — one deliberate click @@ -153,14 +148,14 @@ const CustomFieldModal = NiceModal.create<{field?: MemberCustomField}>(({field}) title: 'Delete custom field', prompt: <>{field!.name} and every value collected from your members will be permanently deleted from the database. This can’t be undone., okLabel: 'Delete', - okColor: 'red', + okVariant: 'destructive', onOk: async (deleteModal) => { try { await deleteField(field!.key); deleteModal?.remove(); - showToast({type: 'success', title: 'Custom field deleted'}); + toast.success('Custom field deleted'); } catch (e) { - showToast({type: 'error', title: 'Failed to delete the custom field'}); + toast.error('Failed to delete the custom field'); handleError(e, {withToast: false}); } } @@ -170,11 +165,13 @@ const CustomFieldModal = NiceModal.create<{field?: MemberCustomField}>(({field}) const archivedFieldMenu = ( - - + Delete custom field @@ -185,9 +182,9 @@ const CustomFieldModal = NiceModal.create<{field?: MemberCustomField}>(({field}) - + {icon} {title} @@ -68,9 +71,7 @@ const EmailPreviewRow: React.FC<{ onCheckedChange={onToggle} /> )} - +
    @@ -110,7 +111,7 @@ const MemberEmailsTable: React.FC<{ automatedEmail={freeEmailForDisplay} emailType='free' enabled={freeWelcomeEmailEnabled} - icon='user-add' + icon={} isBusy={isBusy} isInitialLoading={isLoading} title='Free members welcome email' @@ -122,7 +123,7 @@ const MemberEmailsTable: React.FC<{ automatedEmail={paidEmailForDisplay} emailType='paid' enabled={paidWelcomeEmailEnabled} - icon='bills' + icon={} isBusy={isBusy} isInitialLoading={isLoading} title='Paid members welcome email' @@ -236,13 +237,13 @@ const MemberEmails: React.FC<{ keywords: string[] }> = ({keywords}) => { try { if (!existing) { await createAutomatedEmail(emailType, 'active'); - showToast({type: 'success', title: `${label} welcome email enabled`}); + toast.success(`${label} welcome email enabled`); } else if (existing.status === 'active') { await editAutomatedEmail({...existing, status: 'inactive'}); - showToast({type: 'success', title: `${label} welcome email disabled`}); + toast.success(`${label} welcome email disabled`); } else { await editAutomatedEmail({...existing, status: 'active'}); - showToast({type: 'success', title: `${label} welcome email enabled`}); + toast.success(`${label} welcome email enabled`); } } catch (e) { handleError(e); @@ -281,11 +282,13 @@ const MemberEmails: React.FC<{ keywords: string[] }> = ({keywords}) => { customButtons={( )} description="Create and manage automated emails for your members" keywords={keywords} diff --git a/apps/admin-x-settings/src/components/settings/membership/member-emails/test-email-dropdown.tsx b/apps/admin-x-settings/src/components/settings/membership/member-emails/test-email-dropdown.tsx index 636ae8bd760..21ec1d419b9 100644 --- a/apps/admin-x-settings/src/components/settings/membership/member-emails/test-email-dropdown.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/member-emails/test-email-dropdown.tsx @@ -1,7 +1,8 @@ import validator from 'validator'; -import {Button, TextField} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; import {FieldError, PopoverContent} from '@tryghost/shade/components'; import {JSONError} from '@tryghost/admin-x-framework/errors'; +import {TextField} from '@tryghost/admin-x-design-system'; import {useCurrentUser} from '@tryghost/admin-x-framework/api/current-user'; import {useEffect, useRef, useState} from 'react'; import {useSendTestWelcomeEmail} from '@tryghost/admin-x-framework/api/automated-emails'; @@ -97,11 +98,12 @@ const TestEmailDropdown: React.FC = ({
    {testEmailError && {testEmailError}} ); diff --git a/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-customize-modal.tsx b/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-customize-modal.tsx index 0600e8eb61a..5c0a434f374 100644 --- a/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-customize-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-customize-modal.tsx @@ -517,7 +517,7 @@ const WelcomeEmailCustomizeModal = NiceModal.create(() => { const fetchErrorMessage = 'Unable to load email design settings. Please try again.'; const modalOkProps = hasSaveError ? { ...okProps, - color: 'red' as const, + variant: 'destructive' as const, label: 'Retry' } : okProps; diff --git a/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx b/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx index 228c07011b9..b7577be9e76 100644 --- a/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx @@ -6,7 +6,7 @@ import MemberEmailEditor from './member-email-editor'; import WelcomeEmailPreviewFrame from './welcome-email-preview-frame'; import {DirtyConfirmDialog, useDirtyConfirmation} from '@tryghost/shade/patterns'; import {FieldError} from '@tryghost/shade/components'; -import {Button as LegacyButton, Modal, TextField} from '@tryghost/admin-x-design-system'; +import {Modal, TextField} from '@tryghost/admin-x-design-system'; import {getSettingValues} from '@tryghost/admin-x-framework/api/settings'; import {getWelcomeEmailValidationErrors} from './welcome-email-validation'; import {useBrowseAutomatedEmails, useEditAutomatedEmail, usePreviewWelcomeEmail} from '@tryghost/admin-x-framework/api/automated-emails'; @@ -20,7 +20,7 @@ import TestEmailDropdown from './test-email-dropdown'; import type {AutomatedEmail} from '@tryghost/admin-x-framework/api/automated-emails'; import {Button, Popover, PopoverTrigger, Tabs, TabsList, TabsTrigger} from '@tryghost/shade/components'; -import {cn} from '@tryghost/shade/utils'; +import {LucideIcon, cn} from '@tryghost/shade/utils'; interface EmailPreviewModalContentProps { title: string; @@ -234,9 +234,10 @@ const WelcomeEmailModal = NiceModal.create(({emailType = className='dark:bg-[#151719]' headerActions={ <> - + {showTestDropdown && ( diff --git a/apps/admin-x-settings/src/components/settings/membership/portal.tsx b/apps/admin-x-settings/src/components/settings/membership/portal.tsx index bbf4594473c..940a08ed98a 100644 --- a/apps/admin-x-settings/src/components/settings/membership/portal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/portal.tsx @@ -2,7 +2,7 @@ import FakeLogo from '../../../assets/images/portal-splash-default-logo.png'; import React from 'react'; import TopLevelGroup from '../../top-level-group'; import UserAddIcon from '../../../assets/images/portal-splash-user-add.png'; -import {Button} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; import {getSettingValues} from '@tryghost/admin-x-framework/api/settings'; import {useGlobalData} from '../../providers/global-data-provider'; import {useRouting} from '@tryghost/admin-x-framework/routing'; @@ -37,7 +37,7 @@ const Portal: React.FC<{ keywords: string[] }> = ({keywords}) => { return ( } + customButtons={} description="Customize members modal signup flow" keywords={keywords} navid='portal' diff --git a/apps/admin-x-settings/src/components/settings/membership/portal/look-and-feel.tsx b/apps/admin-x-settings/src/components/settings/membership/portal/look-and-feel.tsx index e18368b318b..63ff2333376 100644 --- a/apps/admin-x-settings/src/components/settings/membership/portal/look-and-feel.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/portal/look-and-feel.tsx @@ -1,7 +1,8 @@ +import BrandIcon, {type BrandIconName} from '../../../icons/brand-icon'; import React, {useState} from 'react'; import {APIError} from '@tryghost/admin-x-framework/errors'; import {Button, Field, FieldLabel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch, ToggleGroup, ToggleGroupItem} from '@tryghost/shade/components'; -import {Form, Icon, TextField} from '@tryghost/admin-x-design-system'; +import {Form, TextField} from '@tryghost/admin-x-design-system'; import {ImageUpload, ImageUploadAction, ImageUploadActions, ImageUploadDropzone, ImageUploadImage, ImageUploadPreview} from '@tryghost/shade/patterns'; import {Inline, Text} from '@tryghost/shade/primitives'; import {type Setting, type SettingValue, getSettingValues} from '@tryghost/admin-x-framework/api/settings'; @@ -9,7 +10,7 @@ import {Trash2, Upload} from 'lucide-react'; import {getImageUrl, useUploadImage} from '@tryghost/admin-x-framework/api/images'; import {useHandleError} from '@tryghost/admin-x-framework/hooks'; -const defaultButtonIcons = [ +const defaultButtonIcons: Array<{icon: BrandIconName; label: string; value: string}> = [ { icon: 'portal-icon-1', label: 'Portal icon 1', @@ -108,7 +109,7 @@ const LookAndFeel: React.FC<{ > {defaultButtonIcons.map(iconConfig => ( - + ))} diff --git a/apps/admin-x-settings/src/components/settings/membership/portal/portal-links.tsx b/apps/admin-x-settings/src/components/settings/membership/portal/portal-links.tsx index 24c4a5ef434..646146c8531 100644 --- a/apps/admin-x-settings/src/components/settings/membership/portal/portal-links.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/portal/portal-links.tsx @@ -1,6 +1,7 @@ import React, {useEffect, useId, useState} from 'react'; import {ActionList, ActionListItem, ActionListItemActions, ActionListItemContent, Field, FieldLabel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@tryghost/shade/components'; -import {Button, ModalPage, TextField} from '@tryghost/admin-x-design-system'; +import {Button} from '@tryghost/shade/components'; +import {ModalPage, TextField} from '@tryghost/admin-x-design-system'; import {getHomepageUrl} from '@tryghost/admin-x-framework/api/site'; import {getPaidActiveTiers, useBrowseTiers} from '@tryghost/admin-x-framework/api/tiers'; import {getSettingValues} from '@tryghost/admin-x-framework/api/settings'; @@ -20,14 +21,18 @@ const PortalLink: React.FC = ({name, value}) => { - ); }; @@ -66,7 +71,7 @@ const PortalLinks: React.FC = () => {

    Generic

    -
    diff --git a/apps/admin-x-settings/src/components/settings/membership/portal/portal-modal.tsx b/apps/admin-x-settings/src/components/settings/membership/portal/portal-modal.tsx index e61ca1b1342..d79cb46c3d5 100644 --- a/apps/admin-x-settings/src/components/settings/membership/portal/portal-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/portal/portal-modal.tsx @@ -231,8 +231,8 @@ const PortalModal: React.FC = () => { buttonsDisabled={okProps.disabled} cancelLabel='Close' dirty={saveState === 'unsaved'} - okColor={okProps.color} okLabel={okProps.label || 'Save'} + okVariant={okProps.variant} preview={preview} previewBgColor={selectedPreviewTab === 'links' ? 'white' : 'greygradient'} previewToolbarTabs={previewTabs} diff --git a/apps/admin-x-settings/src/components/settings/membership/stripe/stripe-connect-modal.tsx b/apps/admin-x-settings/src/components/settings/membership/stripe/stripe-connect-modal.tsx index bd8ae6c840a..2cf7e44dd02 100644 --- a/apps/admin-x-settings/src/components/settings/membership/stripe/stripe-connect-modal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/stripe/stripe-connect-modal.tsx @@ -7,14 +7,15 @@ import StripeButton from '../../../stripe-button'; import StripeLogo from '../../../../assets/images/stripe-emblem.svg'; import StripeVerifiedBadge from '../../../../assets/images/stripe-verified.svg'; import useSettingGroup from '../../../../hooks/use-setting-group'; -import {Button, ConfirmationModal, Form, LimitModal, Modal, TextField, showToast} from '@tryghost/admin-x-design-system'; -import {Field, FieldError, FieldLabel, Switch, Textarea} from '@tryghost/shade/components'; +import {Button, Field, FieldError, FieldLabel, Switch, Textarea} from '@tryghost/shade/components'; +import {ConfirmationModal, Form, LimitModal, Modal, TextField} from '@tryghost/admin-x-design-system'; import {HostLimitError, useLimiter} from '../../../../hooks/use-limiter'; import {JSONError} from '@tryghost/admin-x-framework/errors'; +import {LucideIcon} from '@tryghost/shade/utils'; import {Text} from '@tryghost/shade/primitives'; import {checkStripeEnabled, getSettingValue, getSettingValues, useDeleteStripeSettings, useEditSettings} from '@tryghost/admin-x-framework/api/settings'; import {getGhostPaths} from '@tryghost/admin-x-framework/helpers'; -import {toast} from 'react-hot-toast'; +import {toast} from 'sonner'; import {useBrowseMembers} from '@tryghost/admin-x-framework/api/members'; import {useBrowseTiers, useEditTier} from '@tryghost/admin-x-framework/api/tiers'; import {useGlobalData} from '../../../providers/global-data-provider'; @@ -135,14 +136,14 @@ const Connect: React.FC = () => {
    Click on the “Connect with Stripe” button to generate a secure key that connects your Ghost site with Stripe.
    - + Step 2 — Paste secure key Secure key