From 239c82203d4712f40f054ce15293373be189a2fa Mon Sep 17 00:00:00 2001 From: Konstantin Komelin Date: Mon, 27 Jan 2025 12:31:52 +0100 Subject: [PATCH] Counter template (#155) - Added a new Counter template which consists of frontend-counter-react and backend-counter packages. - Reworked template initialization commands. - Probably performed some refactoring which I don't remember about ;) - Updated docs. --- README.md | 17 +- package.json | 5 +- packages/backend-counter/.gitignore | 4 + packages/backend-counter/.prettierignore | 3 + packages/backend-counter/README.md | 3 + .../backend-counter/move/counter/Move.toml | 37 + .../move/counter/sources/counter.move | 69 ++ .../move/counter/tests/counter_tests.move | 41 + packages/backend-counter/package.json | 50 + .../scripts/copy-package-id.js | 117 +++ packages/frontend-counter-react/.env | 2 + packages/frontend-counter-react/.eslintrc.cjs | 19 + .../.firebaserc | 0 packages/frontend-counter-react/.gitignore | 30 + .../.prettierignore | 0 .../frontend-counter-react/.prettierrc.mjs | 13 + packages/frontend-counter-react/README.md | 3 + .../firebase.json | 0 packages/frontend-counter-react/index.html | 22 + packages/frontend-counter-react/package.json | 56 ++ .../frontend-counter-react/postcss.config.mjs | 6 + .../public/android-chrome-192x192.png | Bin .../public/android-chrome-512x512.png | Bin .../public/apple-touch-icon.png | Bin .../public/browserconfig.xml | 0 .../public/favicon-16x16.png | Bin .../public/favicon-32x32.png | Bin .../public/favicon.ico | Bin .../public/mstile-144x144.png | Bin .../public/mstile-150x150.png | Bin .../public/mstile-310x150.png | Bin .../public/mstile-310x310.png | Bin .../public/mstile-70x70.png | Bin .../public/robots.txt | 0 .../public/safari-pinned-tab.svg | 0 .../public/webmanifest.json | 0 .../scripts/walrus-site-deploy.cjs | 0 .../src}/assets/logo.svg | 0 .../src/components/App.tsx | 43 + .../src/components/CustomConnectButton.tsx | 18 + .../src/components/Loading.tsx | 13 + .../src/components/NetworkSupportChecker.tsx | 35 + .../src/components/Notification.tsx | 44 + .../src/components/ThemeSwitcher.tsx | 35 + .../src}/components/layout/Body.tsx | 0 .../src/components/layout/Extra.tsx | 18 + .../src/components/layout/Footer.tsx | 75 ++ .../src/components/layout/Header.tsx | 35 + .../src/components/layout/Layout.tsx | 20 + .../frontend-counter-react/src/config/main.ts | 1 + .../src/config/network.ts | 24 + .../src}/config/themes.ts | 0 .../src/dapp/components/CounterForm.tsx | 144 +++ .../src/dapp/components/CreateCounterForm.tsx | 70 ++ .../src/dapp/config/network.ts | 1 + .../src/dapp/helpers/transactions.ts | 40 + .../src/dapp/hooks/useCounter.tsx | 18 + .../src/dapp/pages/CounterPage.tsx | 24 + .../src/dapp/pages/IndexPage.tsx | 17 + .../src/dapp/types/ICounter.ts | 4 + .../src/helpers/misc.ts | 10 + .../src/helpers/network.ts | 136 +++ .../src/helpers/notification.tsx | 81 ++ .../src/helpers/theme.ts | 26 + .../src/hooks/useNetworkConfig.tsx | 50 + packages/frontend-counter-react/src/main.tsx | 4 + .../src}/providers/ThemeProvider.tsx | 0 .../src}/styles/index.css | 0 .../src}/types/ENetwork.ts | 0 .../src}/types/ENetworksWithFaucet.ts | 0 .../src}/types/TTheme.ts | 0 .../frontend-counter-react/src/vite-env.d.ts | 10 + .../tailwind.config.mjs | 34 + packages/frontend-counter-react/tsconfig.json | 30 + .../frontend-counter-react/tsconfig.node.json | 11 + .../frontend-counter-react/vite.config.ts | 17 + .../walrus-sites.yaml | 0 .../.env | 0 packages/frontend-greeting-next/.firebaserc | 5 + .../.gitignore | 0 .../frontend-greeting-next/.prettierignore | 3 + .../.prettierrc.mjs | 0 .../README.md | 0 .../eslint.config.mjs | 0 packages/frontend-greeting-next/firebase.json | 22 + .../next-env.d.ts | 0 .../next.config.ts | 0 .../package.json | 2 +- .../postcss.config.mjs | 0 .../public/android-chrome-192x192.png | Bin 0 -> 6394 bytes .../public/android-chrome-512x512.png | Bin 0 -> 17460 bytes .../public/apple-touch-icon.png | Bin 0 -> 3040 bytes .../public/browserconfig.xml | 9 + .../public/emoji/1.svg | 0 .../public/emoji/10.svg | 0 .../public/emoji/11.svg | 0 .../public/emoji/12.svg | 0 .../public/emoji/13.svg | 0 .../public/emoji/14.svg | 0 .../public/emoji/15.svg | 0 .../public/emoji/16.svg | 0 .../public/emoji/17.svg | 0 .../public/emoji/18.svg | 0 .../public/emoji/19.svg | 0 .../public/emoji/2.svg | 0 .../public/emoji/20.svg | 0 .../public/emoji/21.svg | 0 .../public/emoji/22.svg | 0 .../public/emoji/23.svg | 0 .../public/emoji/24.svg | 0 .../public/emoji/25.svg | 0 .../public/emoji/26.svg | 0 .../public/emoji/27.svg | 0 .../public/emoji/28.svg | 0 .../public/emoji/29.svg | 0 .../public/emoji/3.svg | 0 .../public/emoji/30.svg | 0 .../public/emoji/31.svg | 0 .../public/emoji/32.svg | 0 .../public/emoji/33.svg | 0 .../public/emoji/34.svg | 0 .../public/emoji/35.svg | 0 .../public/emoji/36.svg | 0 .../public/emoji/37.svg | 0 .../public/emoji/38.svg | 0 .../public/emoji/39.svg | 0 .../public/emoji/4.svg | 0 .../public/emoji/40.svg | 0 .../public/emoji/41.svg | 0 .../public/emoji/42.svg | 0 .../public/emoji/43.svg | 0 .../public/emoji/44.svg | 0 .../public/emoji/45.svg | 0 .../public/emoji/46.svg | 0 .../public/emoji/47.svg | 0 .../public/emoji/48.svg | 0 .../public/emoji/49.svg | 0 .../public/emoji/5.svg | 0 .../public/emoji/50.svg | 0 .../public/emoji/51.svg | 0 .../public/emoji/52.svg | 0 .../public/emoji/53.svg | 0 .../public/emoji/54.svg | 0 .../public/emoji/55.svg | 0 .../public/emoji/56.svg | 0 .../public/emoji/57.svg | 0 .../public/emoji/58.svg | 0 .../public/emoji/59.svg | 0 .../public/emoji/6.svg | 0 .../public/emoji/60.svg | 0 .../public/emoji/61.svg | 0 .../public/emoji/62.svg | 0 .../public/emoji/63.svg | 0 .../public/emoji/64.svg | 0 .../public/emoji/7.svg | 0 .../public/emoji/8.svg | 0 .../public/emoji/9.svg | 0 .../public/favicon-16x16.png | Bin 0 -> 877 bytes .../public/favicon-32x32.png | Bin 0 -> 1300 bytes .../frontend-greeting-next/public/favicon.ico | Bin 0 -> 15086 bytes .../public/mstile-144x144.png | Bin 0 -> 3187 bytes .../public/mstile-150x150.png | Bin 0 -> 3049 bytes .../public/mstile-310x150.png | Bin 0 -> 3207 bytes .../public/mstile-310x310.png | Bin 0 -> 10241 bytes .../public/mstile-70x70.png | Bin 0 -> 2467 bytes .../frontend-greeting-next/public/robots.txt | 1 + .../public/safari-pinned-tab.svg | 48 + .../public/webmanifest.json | 21 + .../scripts/walrus-site-deploy.cjs | 141 +++ .../src/app/assets/logo.svg | 1 + .../components/AnimatedBackground/index.css | 0 .../components/AnimatedBackground/index.tsx | 0 .../app/components/CustomConnectButton.tsx | 0 .../src/app/components/Emoji.tsx | 0 .../src/app/components/GreetingForm.tsx | 0 .../src/app/components/Loading.tsx | 0 .../app/components/NetworkSupportChecker.tsx | 0 .../src/app/components/Notification.tsx | 0 .../src/app/components/ThemeSwitcher.tsx | 0 .../src/app/components/layout/Body.tsx | 6 + .../src/app/components/layout/Extra.tsx | 0 .../src/app/components/layout/Footer.tsx | 2 +- .../src/app/components/layout/Header.tsx | 0 .../src/app/config/main.ts | 0 .../src/app/config/networks.ts | 0 .../src/app/config/themes.ts | 120 +++ .../src/app/helpers/greeting/misc.ts | 0 .../src/app/helpers/greeting/transactions.ts | 0 .../src/app/helpers/misc.ts | 0 .../src/app/helpers/networks.ts | 0 .../src/app/helpers/notification.tsx | 0 .../src/app/helpers/theme.ts | 0 .../src/app/hooks/useNetworkConfig.tsx | 0 .../src/app/hooks/useOwnGreeting.tsx | 0 .../src/app/layout.tsx | 0 .../src/app/page.tsx | 0 .../src/app/providers/ClientProviders.tsx | 0 .../src/app/providers/ThemeProvider.tsx | 12 + .../src/app/styles/index.css | 42 + .../src/app/types/ENetwork.ts | 6 + .../src/app/types/ENetworksWithFaucet.ts | 1 + .../src/app/types/IGreeting.ts | 0 .../src/app/types/TTheme.ts | 1 + .../tailwind.config.ts | 0 .../tsconfig.json | 0 .../frontend-greeting-next/walrus-sites.yaml | 9 + pnpm-lock.yaml | 901 +++++++++++++++++- 207 files changed, 2902 insertions(+), 36 deletions(-) create mode 100644 packages/backend-counter/.gitignore create mode 100644 packages/backend-counter/.prettierignore create mode 100644 packages/backend-counter/README.md create mode 100644 packages/backend-counter/move/counter/Move.toml create mode 100644 packages/backend-counter/move/counter/sources/counter.move create mode 100644 packages/backend-counter/move/counter/tests/counter_tests.move create mode 100644 packages/backend-counter/package.json create mode 100755 packages/backend-counter/scripts/copy-package-id.js create mode 100644 packages/frontend-counter-react/.env create mode 100644 packages/frontend-counter-react/.eslintrc.cjs rename packages/{frontend-next => frontend-counter-react}/.firebaserc (100%) create mode 100644 packages/frontend-counter-react/.gitignore rename packages/{frontend-next => frontend-counter-react}/.prettierignore (100%) create mode 100644 packages/frontend-counter-react/.prettierrc.mjs create mode 100644 packages/frontend-counter-react/README.md rename packages/{frontend-next => frontend-counter-react}/firebase.json (100%) create mode 100644 packages/frontend-counter-react/index.html create mode 100644 packages/frontend-counter-react/package.json create mode 100644 packages/frontend-counter-react/postcss.config.mjs rename packages/{frontend-next => frontend-counter-react}/public/android-chrome-192x192.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/android-chrome-512x512.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/apple-touch-icon.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/browserconfig.xml (100%) rename packages/{frontend-next => frontend-counter-react}/public/favicon-16x16.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/favicon-32x32.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/favicon.ico (100%) rename packages/{frontend-next => frontend-counter-react}/public/mstile-144x144.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/mstile-150x150.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/mstile-310x150.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/mstile-310x310.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/mstile-70x70.png (100%) rename packages/{frontend-next => frontend-counter-react}/public/robots.txt (100%) rename packages/{frontend-next => frontend-counter-react}/public/safari-pinned-tab.svg (100%) rename packages/{frontend-next => frontend-counter-react}/public/webmanifest.json (100%) rename packages/{frontend-next => frontend-counter-react}/scripts/walrus-site-deploy.cjs (100%) rename packages/{frontend-next/src/app => frontend-counter-react/src}/assets/logo.svg (100%) create mode 100644 packages/frontend-counter-react/src/components/App.tsx create mode 100644 packages/frontend-counter-react/src/components/CustomConnectButton.tsx create mode 100644 packages/frontend-counter-react/src/components/Loading.tsx create mode 100644 packages/frontend-counter-react/src/components/NetworkSupportChecker.tsx create mode 100644 packages/frontend-counter-react/src/components/Notification.tsx create mode 100644 packages/frontend-counter-react/src/components/ThemeSwitcher.tsx rename packages/{frontend-next/src/app => frontend-counter-react/src}/components/layout/Body.tsx (100%) create mode 100644 packages/frontend-counter-react/src/components/layout/Extra.tsx create mode 100644 packages/frontend-counter-react/src/components/layout/Footer.tsx create mode 100644 packages/frontend-counter-react/src/components/layout/Header.tsx create mode 100644 packages/frontend-counter-react/src/components/layout/Layout.tsx create mode 100644 packages/frontend-counter-react/src/config/main.ts create mode 100644 packages/frontend-counter-react/src/config/network.ts rename packages/{frontend-next/src/app => frontend-counter-react/src}/config/themes.ts (100%) create mode 100644 packages/frontend-counter-react/src/dapp/components/CounterForm.tsx create mode 100644 packages/frontend-counter-react/src/dapp/components/CreateCounterForm.tsx create mode 100644 packages/frontend-counter-react/src/dapp/config/network.ts create mode 100644 packages/frontend-counter-react/src/dapp/helpers/transactions.ts create mode 100644 packages/frontend-counter-react/src/dapp/hooks/useCounter.tsx create mode 100644 packages/frontend-counter-react/src/dapp/pages/CounterPage.tsx create mode 100644 packages/frontend-counter-react/src/dapp/pages/IndexPage.tsx create mode 100644 packages/frontend-counter-react/src/dapp/types/ICounter.ts create mode 100644 packages/frontend-counter-react/src/helpers/misc.ts create mode 100644 packages/frontend-counter-react/src/helpers/network.ts create mode 100644 packages/frontend-counter-react/src/helpers/notification.tsx create mode 100644 packages/frontend-counter-react/src/helpers/theme.ts create mode 100644 packages/frontend-counter-react/src/hooks/useNetworkConfig.tsx create mode 100644 packages/frontend-counter-react/src/main.tsx rename packages/{frontend-next/src/app => frontend-counter-react/src}/providers/ThemeProvider.tsx (100%) rename packages/{frontend-next/src/app => frontend-counter-react/src}/styles/index.css (100%) rename packages/{frontend-next/src/app => frontend-counter-react/src}/types/ENetwork.ts (100%) rename packages/{frontend-next/src/app => frontend-counter-react/src}/types/ENetworksWithFaucet.ts (100%) rename packages/{frontend-next/src/app => frontend-counter-react/src}/types/TTheme.ts (100%) create mode 100644 packages/frontend-counter-react/src/vite-env.d.ts create mode 100644 packages/frontend-counter-react/tailwind.config.mjs create mode 100644 packages/frontend-counter-react/tsconfig.json create mode 100644 packages/frontend-counter-react/tsconfig.node.json create mode 100644 packages/frontend-counter-react/vite.config.ts rename packages/{frontend-next => frontend-counter-react}/walrus-sites.yaml (100%) rename packages/{frontend-next => frontend-greeting-next}/.env (100%) create mode 100644 packages/frontend-greeting-next/.firebaserc rename packages/{frontend-next => frontend-greeting-next}/.gitignore (100%) create mode 100644 packages/frontend-greeting-next/.prettierignore rename packages/{frontend-next => frontend-greeting-next}/.prettierrc.mjs (100%) rename packages/{frontend-next => frontend-greeting-next}/README.md (100%) rename packages/{frontend-next => frontend-greeting-next}/eslint.config.mjs (100%) create mode 100644 packages/frontend-greeting-next/firebase.json rename packages/{frontend-next => frontend-greeting-next}/next-env.d.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/next.config.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/package.json (98%) rename packages/{frontend-next => frontend-greeting-next}/postcss.config.mjs (100%) create mode 100644 packages/frontend-greeting-next/public/android-chrome-192x192.png create mode 100644 packages/frontend-greeting-next/public/android-chrome-512x512.png create mode 100644 packages/frontend-greeting-next/public/apple-touch-icon.png create mode 100644 packages/frontend-greeting-next/public/browserconfig.xml rename packages/{frontend-next => frontend-greeting-next}/public/emoji/1.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/10.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/11.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/12.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/13.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/14.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/15.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/16.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/17.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/18.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/19.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/2.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/20.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/21.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/22.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/23.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/24.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/25.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/26.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/27.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/28.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/29.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/3.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/30.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/31.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/32.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/33.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/34.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/35.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/36.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/37.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/38.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/39.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/4.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/40.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/41.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/42.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/43.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/44.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/45.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/46.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/47.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/48.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/49.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/5.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/50.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/51.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/52.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/53.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/54.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/55.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/56.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/57.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/58.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/59.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/6.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/60.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/61.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/62.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/63.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/64.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/7.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/8.svg (100%) rename packages/{frontend-next => frontend-greeting-next}/public/emoji/9.svg (100%) create mode 100644 packages/frontend-greeting-next/public/favicon-16x16.png create mode 100644 packages/frontend-greeting-next/public/favicon-32x32.png create mode 100644 packages/frontend-greeting-next/public/favicon.ico create mode 100644 packages/frontend-greeting-next/public/mstile-144x144.png create mode 100644 packages/frontend-greeting-next/public/mstile-150x150.png create mode 100644 packages/frontend-greeting-next/public/mstile-310x150.png create mode 100644 packages/frontend-greeting-next/public/mstile-310x310.png create mode 100644 packages/frontend-greeting-next/public/mstile-70x70.png create mode 100644 packages/frontend-greeting-next/public/robots.txt create mode 100644 packages/frontend-greeting-next/public/safari-pinned-tab.svg create mode 100644 packages/frontend-greeting-next/public/webmanifest.json create mode 100755 packages/frontend-greeting-next/scripts/walrus-site-deploy.cjs create mode 100644 packages/frontend-greeting-next/src/app/assets/logo.svg rename packages/{frontend-next => frontend-greeting-next}/src/app/components/AnimatedBackground/index.css (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/AnimatedBackground/index.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/CustomConnectButton.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/Emoji.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/GreetingForm.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/Loading.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/NetworkSupportChecker.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/Notification.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/ThemeSwitcher.tsx (100%) create mode 100644 packages/frontend-greeting-next/src/app/components/layout/Body.tsx rename packages/{frontend-next => frontend-greeting-next}/src/app/components/layout/Extra.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/layout/Footer.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/components/layout/Header.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/config/main.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/config/networks.ts (100%) create mode 100644 packages/frontend-greeting-next/src/app/config/themes.ts rename packages/{frontend-next => frontend-greeting-next}/src/app/helpers/greeting/misc.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/helpers/greeting/transactions.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/helpers/misc.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/helpers/networks.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/helpers/notification.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/helpers/theme.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/hooks/useNetworkConfig.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/hooks/useOwnGreeting.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/layout.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/page.tsx (100%) rename packages/{frontend-next => frontend-greeting-next}/src/app/providers/ClientProviders.tsx (100%) create mode 100644 packages/frontend-greeting-next/src/app/providers/ThemeProvider.tsx create mode 100644 packages/frontend-greeting-next/src/app/styles/index.css create mode 100644 packages/frontend-greeting-next/src/app/types/ENetwork.ts create mode 100644 packages/frontend-greeting-next/src/app/types/ENetworksWithFaucet.ts rename packages/{frontend-next => frontend-greeting-next}/src/app/types/IGreeting.ts (100%) create mode 100644 packages/frontend-greeting-next/src/app/types/TTheme.ts rename packages/{frontend-next => frontend-greeting-next}/tailwind.config.ts (100%) rename packages/{frontend-next => frontend-greeting-next}/tsconfig.json (100%) create mode 100644 packages/frontend-greeting-next/walrus-sites.yaml diff --git a/README.md b/README.md index 9d7c837..1562732 100644 --- a/README.md +++ b/README.md @@ -42,18 +42,13 @@ Before you begin, install the following: 2. Clone the resulting repo locally. -3. Choose a frontend framework: +3. Choose a template by running the corresponding init command: -For **React**: -```bash -pnpm frontend:init:react -``` - -For **Next.js**: - -```bash -pnpm frontend:init:nextjs -``` +| Template | Init command | Description | +| --- | --- | --- | +| Greeting (React) | `pnpm init:template:greeting-react` | A **default template** with a Move contract which utilizes Sui Object Display (NFT) and native Sui Randomness. Frontend is built with React, SWC, Vite, Tailwind. | +| Greeting (Next.js) | `pnpm init:template:greeting-next` | The Move part is the same as in Greetings (React), but the frontend is built with Next.js. | +| Counter (React) | `pnpm init:template:counter-react` | A lightweight template with a simple Move counter contract and a React frontend. | ### Option 2. Use CLI diff --git a/package.json b/package.json index 9d5389c..ab67a5f 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,9 @@ "lint": "pnpm frontend:lint", "format": "pnpm frontend:format", - "frontend:init:react": "rm -rf ./packages/frontend-next", - "frontend:init:nextjs": "rm -rf ./packages/frontend && mv -f ./packages/frontend-next ./packages/frontend", + "init:template:greeting-react": "rm -rf ./packages/backend-counter && rm -rf ./packages/frontend-greeting-next && rm -rf ./packages/frontend-counter-react", + "init:template:greeting-next": "rm -rf ./packages/backend-counter && rm -rf ./packages/frontend && rm -rf ./packages/frontend-counter-react && mv -f ./packages/frontend-greeting-next ./packages/frontend", + "init:template:counter-react": "rm -rf ./packages/backend && rm -rf ./packages/frontend && rm -rf ./packages/frontend-greeting-next && mv -f ./packages/frontend-counter-react ./packages/frontend && mv -f ./packages/backend-counter ./packages/backend", "frontend:dev": "pnpm --filter frontend dev", "frontend:build": "pnpm --filter frontend build", diff --git a/packages/backend-counter/.gitignore b/packages/backend-counter/.gitignore new file mode 100644 index 0000000..104213d --- /dev/null +++ b/packages/backend-counter/.gitignore @@ -0,0 +1,4 @@ +build +Move.lock +Suibase.toml +node_modules diff --git a/packages/backend-counter/.prettierignore b/packages/backend-counter/.prettierignore new file mode 100644 index 0000000..6c165a5 --- /dev/null +++ b/packages/backend-counter/.prettierignore @@ -0,0 +1,3 @@ +node_modules +scripts +build diff --git a/packages/backend-counter/README.md b/packages/backend-counter/README.md new file mode 100644 index 0000000..d1b6219 --- /dev/null +++ b/packages/backend-counter/README.md @@ -0,0 +1,3 @@ +# Sui dApp Starter: Backend + +Please find the root project [README](../../README.md). diff --git a/packages/backend-counter/move/counter/Move.toml b/packages/backend-counter/move/counter/Move.toml new file mode 100644 index 0000000..b69ffb7 --- /dev/null +++ b/packages/backend-counter/move/counter/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "counter" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/devnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "counter" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +counter = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/packages/backend-counter/move/counter/sources/counter.move b/packages/backend-counter/move/counter/sources/counter.move new file mode 100644 index 0000000..45e9a02 --- /dev/null +++ b/packages/backend-counter/move/counter/sources/counter.move @@ -0,0 +1,69 @@ +// Copyright (c) Konstantin Komelin and other contributors +// SPDX-License-Identifier: MIT + +/// Module: counter +module counter::counter; + +// === Imports === + +// === Constants === + +// === Errors === + +// === Structs === + +public struct Counter has key { + id: UID, + owner: address, + value: u64, +} + +// === Events === + +// === Initializer === + +/// Create and share a Counter object. +public fun create(ctx: &mut TxContext) { + // Create the Counter object. + let counter = new(ctx); + + // Share the Counter object with everyone. + transfer::share_object(counter); +} + +// === Public-Mutative Functions === + +public fun increment(counter: &mut Counter) { + counter.value = counter.value + 1; +} + +public fun decrement(counter: &mut Counter) { + counter.value = counter.value - 1; +} + +// === Public-View Functions === + +/// Returns current value for the counter. +public fun value(g: &Counter): u64 { + g.value +} + +// === Private Functions === + +/// Create a new Counter object. +fun new(ctx: &mut TxContext): Counter { + Counter { + id: object::new(ctx), + owner: ctx.sender(), + value: 0, + } +} + +// === Test Functions === + +#[test_only] +/// Create a new Counter for tests. +public fun new_for_testing(ctx: &mut TxContext): Counter { + let counter = new(ctx); + counter +} diff --git a/packages/backend-counter/move/counter/tests/counter_tests.move b/packages/backend-counter/move/counter/tests/counter_tests.move new file mode 100644 index 0000000..caddfb9 --- /dev/null +++ b/packages/backend-counter/move/counter/tests/counter_tests.move @@ -0,0 +1,41 @@ +// Copyright (c) Konstantin Komelin and other contributors +// SPDX-License-Identifier: MIT + +#[test_only] +module counter::counter_tests; + +use counter::counter; +use sui::test_scenario as ts; +use sui::test_utils; + +#[test] +/// Tests increment and decrement of the counter. +fun test_counter() { + let user1 = @0x1; + let user2 = @0x2; + + let mut ts = ts::begin(user1); + + let mut c = counter::new_for_testing(ts.ctx()); + + assert!(counter::value(&c) == 0, 0); + + ts.next_tx(user1); + counter::increment(&mut c); + assert!(counter::value(&c) == 1, 1); + + ts.next_tx(user2); + counter::increment(&mut c); + assert!(counter::value(&c) == 2, 2); + + ts.next_tx(user1); + counter::decrement(&mut c); + assert!(counter::value(&c) == 1, 3); + + ts.next_tx(user2); + counter::decrement(&mut c); + assert!(counter::value(&c) == 0, 4); + + test_utils::destroy(c); + ts.end(); +} diff --git a/packages/backend-counter/package.json b/packages/backend-counter/package.json new file mode 100644 index 0000000..179a10b --- /dev/null +++ b/packages/backend-counter/package.json @@ -0,0 +1,50 @@ +{ + "name": "backend-counter", + "private": true, + "version": "0.0.0", + "scripts": { + "build": "lsui move build -d -p ./move/counter", + "test": "lsui move test -d -p ./move/counter", + "copy-package-id": "node ./scripts/copy-package-id", + "localnet:start": "localnet start", + "localnet:stop": "localnet stop", + "localnet:status": "localnet status", + "localnet:faucet": "localnet faucet", + "localnet:regen": "localnet regen", + "localnet:update": "localnet update", + "localnet:address": "lsui client active-address", + "localnet:deploy": "localnet publish --path ${PWD}/move/counter && pnpm copy-package-id -n localnet", + "localnet:deploy:no-dependency-check": "localnet publish --path ${PWD}/move/counter --skip-dependency-verification && pnpm copy-package-id -n localnet", + "localnet:explorer:start": "sui-explorer-local start", + "localnet:explorer:stop": "sui-explorer-local stop", + "localnet:explorer:restart": "sui-explorer-local restart", + "devnet:start": "devnet start", + "devnet:stop": "devnet stop", + "devnet:status": "devnet status", + "devnet:update": "devnet update", + "devnet:links": "devnet links", + "devnet:address": "dsui client active-address", + "devnet:deploy": "devnet publish --path ${PWD}/move/counter && pnpm copy-package-id -n devnet", + "devnet:deploy:no-dependency-check": "devnet publish --path ${PWD}/move/counter --skip-dependency-verification && pnpm copy-package-id -n devnet", + "testnet:start": "testnet start", + "testnet:stop": "testnet stop", + "testnet:status": "testnet status", + "testnet:update": "testnet update", + "testnet:links": "testnet links", + "testnet:address": "tsui client active-address", + "testnet:deploy": "testnet publish --path ${PWD}/move/counter && pnpm copy-package-id -n testnet", + "testnet:deploy:no-dependency-check": "testnet publish --path ${PWD}/move/counter --skip-dependency-verification && pnpm copy-package-id -n testnet", + "mainnet:start": "mainnet start", + "mainnet:stop": "mainnet stop", + "mainnet:status": "mainnet status", + "mainnet:update": "mainnet update", + "mainnet:links": "mainnet links", + "mainnet:address": "msui client active-address", + "mainnet:deploy": "mainnet publish --path ${PWD}/move/counter && pnpm copy-package-id -n mainnet", + "mainnet:deploy:no-dependency-check": "mainnet publish --path ${PWD}/move/counter --skip-dependency-verification && pnpm copy-package-id -n mainnet" + }, + "devDependencies": { + "env-file-rw": "^1.0.0", + "sui-explorer-local": "^2.4.0" + } +} diff --git a/packages/backend-counter/scripts/copy-package-id.js b/packages/backend-counter/scripts/copy-package-id.js new file mode 100755 index 0000000..bea733e --- /dev/null +++ b/packages/backend-counter/scripts/copy-package-id.js @@ -0,0 +1,117 @@ +#!/usr/bin/env node + +/** + * The script copies the deployed package ID from the corresponding Suibase network file to .env.local of the frontend package, + * which is then read by the app. + * + * The default network is localnet. To change it, pass "-n [NETWORK_TYPE]" through console. + */ + +const { promises } = require("node:fs"); +const { homedir } = require("node:os"); +const path = require("node:path"); +const EnvFileWriter = require("env-file-rw").default; + +const DEPLOYED_MODULE_NAME = "counter"; + +const main = async () => { + const network = getNetworkFromArgs(); + + // Read package ID from Suibase packageId file. + const packageId = await readPackageId(network); + + // Create .env.local file if it doesn't exist. + const targetFile = targetFilePath(); + await createFileIfNecessary(targetFile); + + // Check whether the frontend is Next.js-powered to decide what environment variable name format to use. + const isNextJs = await isNextJsProject(); + + // Add Move package ID to .env.local or update it if it already exists. + await setEnvVar( + targetFile, + `${isNextJs ? "NEXT_PUBLIC" : "VITE"}_${network.toUpperCase()}_CONTRACT_PACKAGE_ID`, + packageId + ); +}; + +const sourceFilePath = (network, deployedModuleName) => { + return path.join( + homedir(), + `/suibase/workdirs/${network}/published-data/${deployedModuleName}/most-recent/package-id.json` + ); +}; + +const targetFilePath = () => { + return path.join(process.cwd(), "../frontend/.env.local"); +}; + +const getNetworkFromArgs = () => { + const arg = process.argv.slice(2); + + switch (arg[0]) { + case "-n": + return arg[1]; + + default: + return "localnet"; + } +}; + +/** + * Read package ID from SuiBase packageId file. + * + * @param {string} network + * @returns + */ +const readPackageId = async (network) => { + const sourceFile = sourceFilePath(network, DEPLOYED_MODULE_NAME); + const data = await promises.readFile(sourceFile, "utf8"); + return JSON.parse(data)[0]; +}; + +/** + * Create a file if it doesn't exist. + * + * @param {string} filePath + * @returns + */ +const createFileIfNecessary = async (filePath) => { + try { + await promises.writeFile(filePath, "", { flag: "wx" }); + } catch {} +}; + +/** + * Set the environment variable in the .env.local file. + * + * @param {string} envFilePath + * @param {string} name + * @param {string} value + * @returns + */ +const setEnvVar = async (envFilePath, name, value) => { + const envFileWriter = new EnvFileWriter(envFilePath, false); + await envFileWriter.parse(); + envFileWriter.set(name, value); + await envFileWriter.save(); +}; + +/** + * Check if next.config.ts exists in the frontend package. + * + * @returns {boolean} + */ +const isNextJsProject = async () => { + try { + await promises.stat(path.join(process.cwd(), "../frontend/next.config.ts")); + return true; + } catch { + return false; + } +}; + +// Main entry point. +main().catch((e) => { + console.error(e); +}); diff --git a/packages/frontend-counter-react/.env b/packages/frontend-counter-react/.env new file mode 100644 index 0000000..5e0ea92 --- /dev/null +++ b/packages/frontend-counter-react/.env @@ -0,0 +1,2 @@ +VITE_APP_NAME="Sui dApp Starter" +VITE_APP_DESCRIPTION="Full-Stack Sui Starter on Steroids" diff --git a/packages/frontend-counter-react/.eslintrc.cjs b/packages/frontend-counter-react/.eslintrc.cjs new file mode 100644 index 0000000..7c71cbd --- /dev/null +++ b/packages/frontend-counter-react/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + 'prettier', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/packages/frontend-next/.firebaserc b/packages/frontend-counter-react/.firebaserc similarity index 100% rename from packages/frontend-next/.firebaserc rename to packages/frontend-counter-react/.firebaserc diff --git a/packages/frontend-counter-react/.gitignore b/packages/frontend-counter-react/.gitignore new file mode 100644 index 0000000..ba96747 --- /dev/null +++ b/packages/frontend-counter-react/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Firebase +.firebase/* + +# Arweave +arweave-keyfile* diff --git a/packages/frontend-next/.prettierignore b/packages/frontend-counter-react/.prettierignore similarity index 100% rename from packages/frontend-next/.prettierignore rename to packages/frontend-counter-react/.prettierignore diff --git a/packages/frontend-counter-react/.prettierrc.mjs b/packages/frontend-counter-react/.prettierrc.mjs new file mode 100644 index 0000000..118257c --- /dev/null +++ b/packages/frontend-counter-react/.prettierrc.mjs @@ -0,0 +1,13 @@ +/** @type {import("prettier").Config} */ +const config = { + trailingComma: 'es5', + tabWidth: 2, + useTabs: false, + semi: false, + singleQuote: true, + tailwindConfig: './tailwind.config.mjs', + plugins: ['prettier-plugin-tailwindcss'], + tailwindFunctions: ['clsx', 'c', 'cn'], +} + +export default config; diff --git a/packages/frontend-counter-react/README.md b/packages/frontend-counter-react/README.md new file mode 100644 index 0000000..18deb2f --- /dev/null +++ b/packages/frontend-counter-react/README.md @@ -0,0 +1,3 @@ +# Sui dApp Starter: Frontend + +Please find the root project [README](../../README.md). diff --git a/packages/frontend-next/firebase.json b/packages/frontend-counter-react/firebase.json similarity index 100% rename from packages/frontend-next/firebase.json rename to packages/frontend-counter-react/firebase.json diff --git a/packages/frontend-counter-react/index.html b/packages/frontend-counter-react/index.html new file mode 100644 index 0000000..66e215b --- /dev/null +++ b/packages/frontend-counter-react/index.html @@ -0,0 +1,22 @@ + + + + + + %VITE_APP_NAME% + + + + + + + + + + + + +
+ + + diff --git a/packages/frontend-counter-react/package.json b/packages/frontend-counter-react/package.json new file mode 100644 index 0000000..2e0aa02 --- /dev/null +++ b/packages/frontend-counter-react/package.json @@ -0,0 +1,56 @@ +{ + "name": "frontend-counter-react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --open", + "build": "tsc && vite build", + "lint": "ESLINT_USE_FLAT_CONFIG=false eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "format": "prettier --write './index.html' './src/**/*.{js,jsx,ts,tsx}'", + "deploy:firebase:init": "firebase login && firebase use --add", + "deploy:firebase": "firebase deploy --only hosting", + "deploy:walrus": "pnpm run build && pnpm run walrus-site-deploy", + "deploy:arweave": "ARWEAVE_DEPLOYMENT=true pnpm run build && pnpx arkb deploy ./dist -w ./arweave-keyfile.json --auto-confirm", + "walrus-site-deploy": "node ./scripts/walrus-site-deploy.cjs" + }, + "dependencies": { + "@mysten/dapp-kit": "^0.14.47", + "@mysten/sui": "^1.20.0", + "@mysten/wallet-standard": "^0.13.23", + "@radix-ui/react-select": "^2.1.4", + "@radix-ui/react-toggle": "^1.1.1", + "@radix-ui/themes": "^3.1.6", + "@suiware/kit": "^0.7.0", + "@tanstack/react-query": "^5.64.2", + "clsx": "^2.1.1", + "lucide-react": "^0.473.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-hot-toast": "^2.5.1", + "react-router": "^7.1.3", + "react-use": "^17.6.0" + }, + "devDependencies": { + "@types/node": "^22.10.7", + "@types/react": "^19.0.7", + "@types/react-dom": "^19.0.3", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", + "@vitejs/plugin-react-swc": "^3.7.2", + "autoprefixer": "^10.4.20", + "env-file-rw": "^1.0.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "postcss": "^8.5.1", + "prettier": "^3.4.2", + "prettier-plugin-tailwindcss": "^0.6.10", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.3", + "vite": "^6.0.9", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/packages/frontend-counter-react/postcss.config.mjs b/packages/frontend-counter-react/postcss.config.mjs new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/packages/frontend-counter-react/postcss.config.mjs @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/frontend-next/public/android-chrome-192x192.png b/packages/frontend-counter-react/public/android-chrome-192x192.png similarity index 100% rename from packages/frontend-next/public/android-chrome-192x192.png rename to packages/frontend-counter-react/public/android-chrome-192x192.png diff --git a/packages/frontend-next/public/android-chrome-512x512.png b/packages/frontend-counter-react/public/android-chrome-512x512.png similarity index 100% rename from packages/frontend-next/public/android-chrome-512x512.png rename to packages/frontend-counter-react/public/android-chrome-512x512.png diff --git a/packages/frontend-next/public/apple-touch-icon.png b/packages/frontend-counter-react/public/apple-touch-icon.png similarity index 100% rename from packages/frontend-next/public/apple-touch-icon.png rename to packages/frontend-counter-react/public/apple-touch-icon.png diff --git a/packages/frontend-next/public/browserconfig.xml b/packages/frontend-counter-react/public/browserconfig.xml similarity index 100% rename from packages/frontend-next/public/browserconfig.xml rename to packages/frontend-counter-react/public/browserconfig.xml diff --git a/packages/frontend-next/public/favicon-16x16.png b/packages/frontend-counter-react/public/favicon-16x16.png similarity index 100% rename from packages/frontend-next/public/favicon-16x16.png rename to packages/frontend-counter-react/public/favicon-16x16.png diff --git a/packages/frontend-next/public/favicon-32x32.png b/packages/frontend-counter-react/public/favicon-32x32.png similarity index 100% rename from packages/frontend-next/public/favicon-32x32.png rename to packages/frontend-counter-react/public/favicon-32x32.png diff --git a/packages/frontend-next/public/favicon.ico b/packages/frontend-counter-react/public/favicon.ico similarity index 100% rename from packages/frontend-next/public/favicon.ico rename to packages/frontend-counter-react/public/favicon.ico diff --git a/packages/frontend-next/public/mstile-144x144.png b/packages/frontend-counter-react/public/mstile-144x144.png similarity index 100% rename from packages/frontend-next/public/mstile-144x144.png rename to packages/frontend-counter-react/public/mstile-144x144.png diff --git a/packages/frontend-next/public/mstile-150x150.png b/packages/frontend-counter-react/public/mstile-150x150.png similarity index 100% rename from packages/frontend-next/public/mstile-150x150.png rename to packages/frontend-counter-react/public/mstile-150x150.png diff --git a/packages/frontend-next/public/mstile-310x150.png b/packages/frontend-counter-react/public/mstile-310x150.png similarity index 100% rename from packages/frontend-next/public/mstile-310x150.png rename to packages/frontend-counter-react/public/mstile-310x150.png diff --git a/packages/frontend-next/public/mstile-310x310.png b/packages/frontend-counter-react/public/mstile-310x310.png similarity index 100% rename from packages/frontend-next/public/mstile-310x310.png rename to packages/frontend-counter-react/public/mstile-310x310.png diff --git a/packages/frontend-next/public/mstile-70x70.png b/packages/frontend-counter-react/public/mstile-70x70.png similarity index 100% rename from packages/frontend-next/public/mstile-70x70.png rename to packages/frontend-counter-react/public/mstile-70x70.png diff --git a/packages/frontend-next/public/robots.txt b/packages/frontend-counter-react/public/robots.txt similarity index 100% rename from packages/frontend-next/public/robots.txt rename to packages/frontend-counter-react/public/robots.txt diff --git a/packages/frontend-next/public/safari-pinned-tab.svg b/packages/frontend-counter-react/public/safari-pinned-tab.svg similarity index 100% rename from packages/frontend-next/public/safari-pinned-tab.svg rename to packages/frontend-counter-react/public/safari-pinned-tab.svg diff --git a/packages/frontend-next/public/webmanifest.json b/packages/frontend-counter-react/public/webmanifest.json similarity index 100% rename from packages/frontend-next/public/webmanifest.json rename to packages/frontend-counter-react/public/webmanifest.json diff --git a/packages/frontend-next/scripts/walrus-site-deploy.cjs b/packages/frontend-counter-react/scripts/walrus-site-deploy.cjs similarity index 100% rename from packages/frontend-next/scripts/walrus-site-deploy.cjs rename to packages/frontend-counter-react/scripts/walrus-site-deploy.cjs diff --git a/packages/frontend-next/src/app/assets/logo.svg b/packages/frontend-counter-react/src/assets/logo.svg similarity index 100% rename from packages/frontend-next/src/app/assets/logo.svg rename to packages/frontend-counter-react/src/assets/logo.svg diff --git a/packages/frontend-counter-react/src/components/App.tsx b/packages/frontend-counter-react/src/components/App.tsx new file mode 100644 index 0000000..0f451d4 --- /dev/null +++ b/packages/frontend-counter-react/src/components/App.tsx @@ -0,0 +1,43 @@ +import '@mysten/dapp-kit/dist/index.css' +import '@radix-ui/themes/styles.css' +import '@suiware/kit/main.css' +import SuiProvider from '@suiware/kit/SuiProvider' +import { FC, StrictMode } from 'react' +import { BrowserRouter, Route, Routes } from 'react-router' +import { APP_NAME } from '~~/config/main' +import { getThemeSettings } from '~~/helpers/theme' +import useNetworkConfig from '~~/hooks/useNetworkConfig' +import CounterPage from '~~/dapp/pages/CounterPage' +import IndexPage from '~~/dapp/pages/IndexPage' +import ThemeProvider from '~~/providers/ThemeProvider' +import '~~/styles/index.css' +import { ENetwork } from '~~/types/ENetwork' + +const themeSettings = getThemeSettings() + +const App: FC = () => { + const { networkConfig } = useNetworkConfig() + + return ( + + + + + + } /> + } /> + + + + + + ) +} + +export default App diff --git a/packages/frontend-counter-react/src/components/CustomConnectButton.tsx b/packages/frontend-counter-react/src/components/CustomConnectButton.tsx new file mode 100644 index 0000000..bd7771c --- /dev/null +++ b/packages/frontend-counter-react/src/components/CustomConnectButton.tsx @@ -0,0 +1,18 @@ +import { ConnectModal, useCurrentAccount } from '@mysten/dapp-kit' +import { Button } from '@radix-ui/themes' + +const CustomConnectButton = () => { + const currentAccount = useCurrentAccount() + + return ( + + {currentAccount ? 'Wallet Connected' : 'Connect Wallet'} + + } + /> + ) +} + +export default CustomConnectButton diff --git a/packages/frontend-counter-react/src/components/Loading.tsx b/packages/frontend-counter-react/src/components/Loading.tsx new file mode 100644 index 0000000..a5a1dbe --- /dev/null +++ b/packages/frontend-counter-react/src/components/Loading.tsx @@ -0,0 +1,13 @@ +import { Spinner } from '@radix-ui/themes' +import { FC } from 'react' + +const Loading: FC = () => { + return ( +
+ + Loading... +
+ ) +} + +export default Loading diff --git a/packages/frontend-counter-react/src/components/NetworkSupportChecker.tsx b/packages/frontend-counter-react/src/components/NetworkSupportChecker.tsx new file mode 100644 index 0000000..aad018a --- /dev/null +++ b/packages/frontend-counter-react/src/components/NetworkSupportChecker.tsx @@ -0,0 +1,35 @@ +import { useCurrentAccount } from '@mysten/dapp-kit' +import useNetworkType from '@suiware/kit/useNetworkType' +import { isNetworkSupported, supportedNetworks } from '~~/helpers/network' + +const NetworkSupportChecker = () => { + const { networkType } = useNetworkType() + const currentAccount = useCurrentAccount() + + const okNetworks = supportedNetworks() + + if (currentAccount == null || okNetworks.length === 0) { + return <> + } + + // @fixme: Find a better type for the networkType. + /* eslint-disable @typescript-eslint/no-explicit-any */ + if (networkType == null || isNetworkSupported(networkType as any)) { + return <> + } + + return ( +
+
+ The {networkType} is not currently + supported by the app. +
+ Please switch to a supported network [ + {okNetworks.join(', ')}] in your + wallet settings. +
+
+ ) +} + +export default NetworkSupportChecker diff --git a/packages/frontend-counter-react/src/components/Notification.tsx b/packages/frontend-counter-react/src/components/Notification.tsx new file mode 100644 index 0000000..f3e8e2d --- /dev/null +++ b/packages/frontend-counter-react/src/components/Notification.tsx @@ -0,0 +1,44 @@ +import { Button } from '@radix-ui/themes' +import c from 'clsx' +import { XIcon } from 'lucide-react' +import { FC, PropsWithChildren } from 'react' +import toast, { ToastType } from 'react-hot-toast' + +interface INotification { + id?: string + type: ToastType +} +const Notification: FC> = ({ + children, + id, + type, +}) => { + const isCloseButtonVisible = id !== null && type !== 'loading' + + return ( +
+
+ {children} +
+ {isCloseButtonVisible && ( + + )} +
+ ) +} + +export default Notification diff --git a/packages/frontend-counter-react/src/components/ThemeSwitcher.tsx b/packages/frontend-counter-react/src/components/ThemeSwitcher.tsx new file mode 100644 index 0000000..5a3f4e0 --- /dev/null +++ b/packages/frontend-counter-react/src/components/ThemeSwitcher.tsx @@ -0,0 +1,35 @@ +import * as Toggle from '@radix-ui/react-toggle' +import { Badge } from '@radix-ui/themes' +import { MoonIcon, SunIcon } from 'lucide-react' +import { useEffect } from 'react' +import { useLocalStorage } from 'react-use' +import { detectBrowserTheme } from '~~/helpers/theme' + +const ThemeSwitcher = () => { + const [theme, setTheme] = useLocalStorage('theme', detectBrowserTheme(), { + raw: true, + }) + + useEffect(() => { + document.documentElement.classList.remove('light', 'dark') + document.documentElement.classList.add(theme!) + }, [theme]) + + const toggleTheme = () => { + setTheme(theme === 'dark' ? 'light' : 'dark') + } + + return ( + + + {theme === 'dark' ? ( + + ) : ( + + )} + + + ) +} + +export default ThemeSwitcher diff --git a/packages/frontend-next/src/app/components/layout/Body.tsx b/packages/frontend-counter-react/src/components/layout/Body.tsx similarity index 100% rename from packages/frontend-next/src/app/components/layout/Body.tsx rename to packages/frontend-counter-react/src/components/layout/Body.tsx diff --git a/packages/frontend-counter-react/src/components/layout/Extra.tsx b/packages/frontend-counter-react/src/components/layout/Extra.tsx new file mode 100644 index 0000000..127d86e --- /dev/null +++ b/packages/frontend-counter-react/src/components/layout/Extra.tsx @@ -0,0 +1,18 @@ +import { Toaster } from 'react-hot-toast' + +const Extra = () => { + return ( + <> + + + ) +} +export default Extra diff --git a/packages/frontend-counter-react/src/components/layout/Footer.tsx b/packages/frontend-counter-react/src/components/layout/Footer.tsx new file mode 100644 index 0000000..d159287 --- /dev/null +++ b/packages/frontend-counter-react/src/components/layout/Footer.tsx @@ -0,0 +1,75 @@ +import { useCurrentAccount } from '@mysten/dapp-kit' +import { Link } from '@radix-ui/themes' +import Faucet from '@suiware/kit/Faucet' +import { HeartIcon, SearchIcon } from 'lucide-react' +import ThemeSwitcher from '~~/components/ThemeSwitcher' +import { + CONTRACT_PACKAGE_VARIABLE_NAME, + EXPLORER_URL_VARIABLE_NAME, +} from '~~/config/network' +import { packageUrl } from '~~/helpers/network' +import { notification } from '~~/helpers/notification' +import useNetworkConfig from '~~/hooks/useNetworkConfig' + +const Footer = () => { + const { useNetworkVariables } = useNetworkConfig() + const networkVariables = useNetworkVariables() + const explorerUrl = networkVariables[EXPLORER_URL_VARIABLE_NAME] + const packageId = networkVariables[CONTRACT_PACKAGE_VARIABLE_NAME] + const currentAccount = useCurrentAccount() + + return ( +
+
+ {currentAccount != null && ( + <> + + + + Block Explorer + + + )} +
+ +
+
+ Built with + + by + + @suiware + + ยท + + Support + +
+
+ +
+ +
+
+ ) +} +export default Footer diff --git a/packages/frontend-counter-react/src/components/layout/Header.tsx b/packages/frontend-counter-react/src/components/layout/Header.tsx new file mode 100644 index 0000000..8435c29 --- /dev/null +++ b/packages/frontend-counter-react/src/components/layout/Header.tsx @@ -0,0 +1,35 @@ +import { ConnectButton } from '@mysten/dapp-kit' +import { Link } from '@radix-ui/themes' +import Balance from '@suiware/kit/Balance' +import NetworkType from '@suiware/kit/NetworkType' +import Logo from '~~/assets/logo.svg' + +const Header = () => { + return ( +
+ + Logo +
+ {import.meta.env.VITE_APP_NAME} +
+ + +
+
+ + +
+ + {/* @todo: Find a better way to style ConnectButton for example through className, which is currently not supported. */} + {/* className="[&>button]:!px-4 [&>button]:!py-2 [&>div]:!text-base" */} +
+ +
+
+
+ ) +} +export default Header diff --git a/packages/frontend-counter-react/src/components/layout/Layout.tsx b/packages/frontend-counter-react/src/components/layout/Layout.tsx new file mode 100644 index 0000000..5e01569 --- /dev/null +++ b/packages/frontend-counter-react/src/components/layout/Layout.tsx @@ -0,0 +1,20 @@ +import { FC, PropsWithChildren } from 'react' +import Body from '~~/components/layout/Body' +import Extra from '~~/components/layout/Extra' +import Footer from '~~/components/layout/Footer' +import Header from '~~/components/layout/Header' + +const Layout: FC = ({ children }) => { + return ( +
+
+ + {children} + +
+ +
+ ) +} + +export default Layout diff --git a/packages/frontend-counter-react/src/config/main.ts b/packages/frontend-counter-react/src/config/main.ts new file mode 100644 index 0000000..7908491 --- /dev/null +++ b/packages/frontend-counter-react/src/config/main.ts @@ -0,0 +1 @@ +export const APP_NAME = import.meta.env.VITE_APP_NAME || 'Sui dApp Starter' diff --git a/packages/frontend-counter-react/src/config/network.ts b/packages/frontend-counter-react/src/config/network.ts new file mode 100644 index 0000000..5fb8a8d --- /dev/null +++ b/packages/frontend-counter-react/src/config/network.ts @@ -0,0 +1,24 @@ +// We automatically create/update .env.local with the deployed package ID after deployment. +export const CONTRACT_PACKAGE_ID_NOT_DEFINED = '0xNOTDEFINED' +export const LOCALNET_CONTRACT_PACKAGE_ID = + import.meta.env.VITE_LOCALNET_CONTRACT_PACKAGE_ID || + CONTRACT_PACKAGE_ID_NOT_DEFINED +export const DEVNET_CONTRACT_PACKAGE_ID = + import.meta.env.VITE_DEVNET_CONTRACT_PACKAGE_ID || + CONTRACT_PACKAGE_ID_NOT_DEFINED +export const TESTNET_CONTRACT_PACKAGE_ID = + import.meta.env.VITE_TESTNET_CONTRACT_PACKAGE_ID || + CONTRACT_PACKAGE_ID_NOT_DEFINED +export const MAINNET_CONTRACT_PACKAGE_ID = + import.meta.env.VITE_MAINNET_CONTRACT_PACKAGE_ID || + CONTRACT_PACKAGE_ID_NOT_DEFINED + +export const LOCALNET_EXPLORER_URL = 'http://localhost:9001' +export const DEVNET_EXPLORER_URL = 'https://devnet.suivision.xyz' +export const TESTNET_EXPLORER_URL = 'https://testnet.suivision.xyz' +export const MAINNET_EXPLORER_URL = 'https://suivision.xyz' + +export const CONTRACT_PACKAGE_VARIABLE_NAME = 'contractPackageId' +export const EXPLORER_URL_VARIABLE_NAME = 'explorerUrl' + +export const NETWORKS_WITH_FAUCET = ['localnet', 'devnet', 'testnet'] diff --git a/packages/frontend-next/src/app/config/themes.ts b/packages/frontend-counter-react/src/config/themes.ts similarity index 100% rename from packages/frontend-next/src/app/config/themes.ts rename to packages/frontend-counter-react/src/config/themes.ts diff --git a/packages/frontend-counter-react/src/dapp/components/CounterForm.tsx b/packages/frontend-counter-react/src/dapp/components/CounterForm.tsx new file mode 100644 index 0000000..58e534b --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/components/CounterForm.tsx @@ -0,0 +1,144 @@ +import { useCurrentAccount } from '@mysten/dapp-kit' +import { SuiSignAndExecuteTransactionOutput } from '@mysten/wallet-standard' +import { Badge, Button, Link } from '@radix-ui/themes' +import useTransact from '@suiware/kit/useTransact' +import { FC, MouseEvent, PropsWithChildren, useState } from 'react' +import CustomConnectButton from '~~/components/CustomConnectButton' +import Loading from '~~/components/Loading' +import { + CONTRACT_PACKAGE_VARIABLE_NAME, + EXPLORER_URL_VARIABLE_NAME, +} from '~~/config/network' +import { + prepareDecrementCounterTransaction, + prepareIncrementCounterTransaction, +} from '~~/dapp/helpers/transactions' +import useCounter from '~~/dapp/hooks/useCounter' +import { + getResponseContentField, + objectUrl, + transactionUrl, +} from '~~/helpers/network' +import { notification } from '~~/helpers/notification' +import useNetworkConfig from '~~/hooks/useNetworkConfig' + +const CounterForm: FC<{ counterId: string }> = ({ counterId }) => { + const currentAccount = useCurrentAccount() + const { useNetworkVariable } = useNetworkConfig() + const packageId = useNetworkVariable(CONTRACT_PACKAGE_VARIABLE_NAME) + const [notificationId, setNotificationId] = useState() + const explorerUrl = useNetworkVariable(EXPLORER_URL_VARIABLE_NAME) + + const { data, isPending, error, refetch } = useCounter(counterId) + + const { transact: increment } = useTransact({ + onBeforeStart: () => { + const nId = notification.txLoading() + setNotificationId(nId) + }, + onSuccess: (data: SuiSignAndExecuteTransactionOutput) => { + notification.txSuccess( + transactionUrl(explorerUrl, data.digest), + notificationId + ) + refetch() + }, + onError: (e: Error) => { + notification.txError(e, null, notificationId) + }, + }) + const { transact: decrement } = useTransact({ + onBeforeStart: () => { + const nId = notification.txLoading() + setNotificationId(nId) + }, + onSuccess: (data: SuiSignAndExecuteTransactionOutput) => { + notification.txSuccess( + transactionUrl(explorerUrl, data.digest), + notificationId + ) + refetch() + }, + onError: (e: Error) => { + notification.txError(e, null, notificationId) + }, + }) + + const handleIncrement = (objectId: string | null | undefined) => { + if (objectId == null) { + notification.error(null, 'Object ID is not valid') + return + } + + increment(prepareIncrementCounterTransaction(packageId, objectId)) + } + + const handleDecrement = (objectId: string | null | undefined) => { + if (objectId == null) { + notification.error(null, 'Object ID is not valid') + return + } + + decrement(prepareDecrementCounterTransaction(packageId, objectId)) + } + + if (currentAccount == null) return + + if (isPending) return + + // @todo: Handle the following errors with toasts. + if (error) return Error: {error.message} + + if (!data.data) return Counter not found + + return ( +
+
+
Counter
+
+ + {counterId} + +
+
+ +
+
+ + {getResponseContentField(data, 'value')} + +
+
+
+ ) +} + +export default CounterForm + +const TextMessage: FC = ({ children }) => ( +
{children}
+) diff --git a/packages/frontend-counter-react/src/dapp/components/CreateCounterForm.tsx b/packages/frontend-counter-react/src/dapp/components/CreateCounterForm.tsx new file mode 100644 index 0000000..f1518a6 --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/components/CreateCounterForm.tsx @@ -0,0 +1,70 @@ +import { useCurrentAccount } from '@mysten/dapp-kit' +import { SuiTransactionBlockResponse } from '@mysten/sui/client' +import { SuiSignAndExecuteTransactionOutput } from '@mysten/wallet-standard' +import { Button } from '@radix-ui/themes' +import useTransact from '@suiware/kit/useTransact' +import { MouseEvent, useState } from 'react' +import { useNavigate } from 'react-router' +import CustomConnectButton from '~~/components/CustomConnectButton' +import { + CONTRACT_PACKAGE_VARIABLE_NAME, + EXPLORER_URL_VARIABLE_NAME, +} from '~~/config/network' +import { prepareCreateCounterTransaction } from '~~/dapp/helpers/transactions' +import { transactionUrl } from '~~/helpers/network' +import { notification } from '~~/helpers/notification' +import useNetworkConfig from '~~/hooks/useNetworkConfig' + +const CreateCounterForm = () => { + const currentAccount = useCurrentAccount() + const { useNetworkVariable } = useNetworkConfig() + const packageId = useNetworkVariable(CONTRACT_PACKAGE_VARIABLE_NAME) + const [notificationId, setNotificationId] = useState() + const explorerUrl = useNetworkVariable(EXPLORER_URL_VARIABLE_NAME) + const navigate = useNavigate() + + const { transact: create } = useTransact({ + onBeforeStart: () => { + const nId = notification.txLoading() + setNotificationId(nId) + }, + onSuccess: ( + data: SuiSignAndExecuteTransactionOutput, + response: SuiTransactionBlockResponse + ) => { + notification.txSuccess( + transactionUrl(explorerUrl, data.digest), + notificationId + ) + + const counterId = response.effects?.created?.[0]?.reference?.objectId! + navigate(`/counter/${counterId}`) + }, + onError: (e: Error) => { + notification.txError(e, null, notificationId) + }, + waitForTransactionOptions: { + showEffects: true, + }, + }) + + const handleCreateCounterClick = (e: MouseEvent) => { + e.preventDefault() + + create(prepareCreateCounterTransaction(packageId)) + } + + if (currentAccount == null) return + + return ( +
+
+ +
+
+ ) +} + +export default CreateCounterForm diff --git a/packages/frontend-counter-react/src/dapp/config/network.ts b/packages/frontend-counter-react/src/dapp/config/network.ts new file mode 100644 index 0000000..9caa1c0 --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/config/network.ts @@ -0,0 +1 @@ +export const CONTRACT_MODULE_NAME = 'counter' diff --git a/packages/frontend-counter-react/src/dapp/helpers/transactions.ts b/packages/frontend-counter-react/src/dapp/helpers/transactions.ts new file mode 100644 index 0000000..7d5ed75 --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/helpers/transactions.ts @@ -0,0 +1,40 @@ +import { Transaction } from '@mysten/sui/transactions' +import { fullFunctionName } from '~~/helpers/network' + +export const prepareCreateCounterTransaction = ( + packageId: string +): Transaction => { + const tx = new Transaction() + tx.moveCall({ + arguments: [], + target: fullFunctionName(packageId, 'create'), + }) + + return tx +} + +export const prepareIncrementCounterTransaction = ( + packageId: string, + objectId: string +): Transaction => { + const tx = new Transaction() + tx.moveCall({ + arguments: [tx.object(objectId)], + target: fullFunctionName(packageId, 'increment'), + }) + + return tx +} + +export const prepareDecrementCounterTransaction = ( + packageId: string, + objectId: string +): Transaction => { + const tx = new Transaction() + tx.moveCall({ + arguments: [tx.object(objectId)], + target: fullFunctionName(packageId, 'decrement'), + }) + + return tx +} diff --git a/packages/frontend-counter-react/src/dapp/hooks/useCounter.tsx b/packages/frontend-counter-react/src/dapp/hooks/useCounter.tsx new file mode 100644 index 0000000..4f6a30b --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/hooks/useCounter.tsx @@ -0,0 +1,18 @@ +import { useSuiClientQuery } from '@mysten/dapp-kit' + +const useCounter = (counterId?: string) => { + return useSuiClientQuery( + 'getObject', + { + id: counterId!, + options: { + showContent: true, + }, + }, + { + enabled: !!counterId, + } + ) +} + +export default useCounter diff --git a/packages/frontend-counter-react/src/dapp/pages/CounterPage.tsx b/packages/frontend-counter-react/src/dapp/pages/CounterPage.tsx new file mode 100644 index 0000000..c376c2b --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/pages/CounterPage.tsx @@ -0,0 +1,24 @@ +import { isValidSuiObjectId } from '@mysten/sui/utils' +import { FC } from 'react' +import { useParams } from 'react-router' +import Layout from '~~/components/layout/Layout' +import CounterForm from '~~/dapp/components/CounterForm' +import NetworkSupportChecker from '../../components/NetworkSupportChecker' + +const CounterPage: FC = () => { + const { counterId } = useParams() + + if (counterId == null || !isValidSuiObjectId(counterId)) + return Counter ID not found + + return ( + + +
+ +
+
+ ) +} + +export default CounterPage diff --git a/packages/frontend-counter-react/src/dapp/pages/IndexPage.tsx b/packages/frontend-counter-react/src/dapp/pages/IndexPage.tsx new file mode 100644 index 0000000..ecb90f7 --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/pages/IndexPage.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react' +import Layout from '~~/components/layout/Layout' +import CreateCounterForm from '~~/dapp/components/CreateCounterForm' +import NetworkSupportChecker from '../../components/NetworkSupportChecker' + +const IndexPage: FC = () => { + return ( + + +
+ +
+
+ ) +} + +export default IndexPage diff --git a/packages/frontend-counter-react/src/dapp/types/ICounter.ts b/packages/frontend-counter-react/src/dapp/types/ICounter.ts new file mode 100644 index 0000000..5e6ae01 --- /dev/null +++ b/packages/frontend-counter-react/src/dapp/types/ICounter.ts @@ -0,0 +1,4 @@ +export interface ICounter { + owner: string + value: string +} diff --git a/packages/frontend-counter-react/src/helpers/misc.ts b/packages/frontend-counter-react/src/helpers/misc.ts new file mode 100644 index 0000000..5cc3388 --- /dev/null +++ b/packages/frontend-counter-react/src/helpers/misc.ts @@ -0,0 +1,10 @@ +import { ReactNode } from 'react' +import ReactDOM from 'react-dom/client' + +export const reactRender = (component: ReactNode) => { + return ReactDOM.createRoot(document.getElementById('root')!).render(component) +} + +export const fromBytesToString = (bytes: number[]): string => { + return new TextDecoder().decode(new Uint8Array(bytes)) +} diff --git a/packages/frontend-counter-react/src/helpers/network.ts b/packages/frontend-counter-react/src/helpers/network.ts new file mode 100644 index 0000000..6f5c985 --- /dev/null +++ b/packages/frontend-counter-react/src/helpers/network.ts @@ -0,0 +1,136 @@ +import { SuiObjectResponse } from '@mysten/sui/client' +import { isValidSuiObjectId } from '@mysten/sui/utils' +import { CONTRACT_PACKAGE_ID_NOT_DEFINED } from '~~/config/network' +import { CONTRACT_MODULE_NAME } from '~~/dapp/config/network' +import { ENetwork } from '~~/types/ENetwork' + +export const transactionUrl = (baseExplorerUrl: string, txDigest: string) => { + return `${baseExplorerUrl}/txblock/${txDigest}` +} + +export const objectUrl = (baseExplorerUrl: string, objectId: string) => { + return packageUrl(baseExplorerUrl, objectId) +} + +export const packageUrl = (baseExplorerUrl: string, packageId: string) => { + // Local explorer doesn't have a package view, so we stick with object view instead. + const subpath = + baseExplorerUrl.search('localhost') === -1 ? 'package' : 'object' + + return `${baseExplorerUrl}/${subpath}/${packageId}` +} + +export const formatNetworkType = (machineName: string) => { + if (machineName.startsWith('sui:')) { + return machineName.substring(4) + } + return machineName +} + +export const supportedNetworks = () => { + const keys = Object.keys(ENetwork) + + return ( + keys + .filter( + (key: string) => + import.meta.env[`VITE_${key.toUpperCase()}_CONTRACT_PACKAGE_ID`] != + null && + import.meta.env[`VITE_${key.toUpperCase()}_CONTRACT_PACKAGE_ID`] !== + CONTRACT_PACKAGE_ID_NOT_DEFINED + ) + // @ts-expect-error Hard to type cast string->ENetwork here. + .map((key: string) => ENetwork[key as ENetwork]) + ) +} + +export const isNetworkSupported = (network: ENetwork | undefined) => { + return supportedNetworks().includes(network) +} + +const fullModuleName = (packageId: string): `${string}::${string}` => { + return `${packageId}::${CONTRACT_MODULE_NAME}` +} + +export const fullFunctionName = ( + packageId: string, + functionName: string +): `${string}::${string}::${string}` => { + return `${fullModuleName(packageId)}::${functionName}` +} + +export const fullStructName = ( + packageId: string, + structName: string +): `${string}::${string}::${string}` => { + return `${fullModuleName(packageId)}::${structName}` +} + +export const getResponseContentField = ( + response: SuiObjectResponse | null | undefined, + field: string +) => { + if ( + response == null || + response.data == null || + response.data?.content == null + ) { + return null + } + + if (response.data.content?.dataType !== 'moveObject') { + return null + } + + // @todo Find a better way to extract fields from SuiParsedData. + /* eslint-disable @typescript-eslint/no-explicit-any */ + const content = response.data.content as any + + if (content.fields == null) { + return null + } + + return content.fields[field] +} + +export const getResponseDisplayField = ( + response: SuiObjectResponse | null | undefined, + field: string +) => { + if ( + response == null || + response.data == null || + response.data?.display == null + ) { + return null + } + + // @todo Find a better way to extract fields from SuiParsedData. + const display = response.data.display + + if (display.data == null) { + return null + } + + return display.data[field] +} + +export const getResponseObjectId = ( + response: SuiObjectResponse | null | undefined +) => { + if ( + response == null || + response.data == null || + response.data?.objectId == null + ) { + return null + } + + const objectId = response.data.objectId + + if (!isValidSuiObjectId(objectId)) { + return null + } + + return objectId +} diff --git a/packages/frontend-counter-react/src/helpers/notification.tsx b/packages/frontend-counter-react/src/helpers/notification.tsx new file mode 100644 index 0000000..1a88692 --- /dev/null +++ b/packages/frontend-counter-react/src/helpers/notification.tsx @@ -0,0 +1,81 @@ +import { Link } from '@radix-ui/themes' +import toast, { Renderable } from 'react-hot-toast' +import Notification from '~~/components/Notification' + +const reportLoading = (message: Renderable) => { + const content = {message} + + return toast.loading(content) +} + +const reportError = ( + error: Error | null, + userFriendlyMessage?: string | null, + id?: string +) => { + if (error != null) { + console.error(error) + } + + const message = + userFriendlyMessage || error?.message || 'An error has occurred' + + if (id == null) { + id = Date.now().toString() + } + + const content = ( + + {message} + + ) + + return toast.error(content, { id }) +} + +const reportSuccess = (message: Renderable, id?: string) => { + if (id == null) { + id = Date.now().toString() + } + + const content = ( + + {message} + + ) + + return toast.success(content, { id, duration: 4000 }) +} + +const reportTxLoading = () => { + return reportLoading('Confirm this transaction in your wallet') +} + +const reportTxError = ( + error: Error | null, + userFriendlyMessage?: string | null, + id?: string +) => { + return reportError(error, userFriendlyMessage, id) +} + +const reportTxSuccess = (transactionUrl: string, id?: string) => { + return reportSuccess( + <> + Transaction submitted{' '} + + (view) + + , + id + ) +} + +export const notification = { + loading: reportLoading, + success: reportSuccess, + error: reportError, + txLoading: reportTxLoading, + txSuccess: reportTxSuccess, + txError: reportTxError, +} diff --git a/packages/frontend-counter-react/src/helpers/theme.ts b/packages/frontend-counter-react/src/helpers/theme.ts new file mode 100644 index 0000000..6baf29b --- /dev/null +++ b/packages/frontend-counter-react/src/helpers/theme.ts @@ -0,0 +1,26 @@ +import { TTheme } from '~~/types/TTheme' +import { darkTheme, lightTheme } from '../config/themes' + +export const detectBrowserTheme = (): TTheme => { + return !('theme' in localStorage) && + window.matchMedia('(prefers-color-scheme: dark)').matches + ? 'dark' + : 'light' +} + +export const getThemeSettings = () => [ + { + // Default to light theme. + variables: lightTheme, + }, + { + // React to the color scheme media query. + mediaQuery: '(prefers-color-scheme: dark)', + variables: darkTheme, + }, + { + // Reacts to the dark class. + selector: '.dark', + variables: darkTheme, + }, +] diff --git a/packages/frontend-counter-react/src/hooks/useNetworkConfig.tsx b/packages/frontend-counter-react/src/hooks/useNetworkConfig.tsx new file mode 100644 index 0000000..7d3dc9e --- /dev/null +++ b/packages/frontend-counter-react/src/hooks/useNetworkConfig.tsx @@ -0,0 +1,50 @@ +import { createNetworkConfig } from '@mysten/dapp-kit' +import { getFullnodeUrl } from '@mysten/sui/client' +import { + CONTRACT_PACKAGE_VARIABLE_NAME, + DEVNET_CONTRACT_PACKAGE_ID, + DEVNET_EXPLORER_URL, + EXPLORER_URL_VARIABLE_NAME, + LOCALNET_CONTRACT_PACKAGE_ID, + LOCALNET_EXPLORER_URL, + MAINNET_CONTRACT_PACKAGE_ID, + MAINNET_EXPLORER_URL, + TESTNET_CONTRACT_PACKAGE_ID, + TESTNET_EXPLORER_URL, +} from '~~/config/network' +import { ENetwork } from '~~/types/ENetwork' + +const useNetworkConfig = () => { + return createNetworkConfig({ + [ENetwork.LOCALNET]: { + url: getFullnodeUrl(ENetwork.LOCALNET), + variables: { + [CONTRACT_PACKAGE_VARIABLE_NAME]: LOCALNET_CONTRACT_PACKAGE_ID, + [EXPLORER_URL_VARIABLE_NAME]: LOCALNET_EXPLORER_URL, + }, + }, + [ENetwork.DEVNET]: { + url: getFullnodeUrl(ENetwork.DEVNET), + variables: { + [CONTRACT_PACKAGE_VARIABLE_NAME]: DEVNET_CONTRACT_PACKAGE_ID, + [EXPLORER_URL_VARIABLE_NAME]: DEVNET_EXPLORER_URL, + }, + }, + [ENetwork.TESTNET]: { + url: getFullnodeUrl(ENetwork.TESTNET), + variables: { + [CONTRACT_PACKAGE_VARIABLE_NAME]: TESTNET_CONTRACT_PACKAGE_ID, + [EXPLORER_URL_VARIABLE_NAME]: TESTNET_EXPLORER_URL, + }, + }, + [ENetwork.MAINNET]: { + url: getFullnodeUrl(ENetwork.MAINNET), + variables: { + [CONTRACT_PACKAGE_VARIABLE_NAME]: MAINNET_CONTRACT_PACKAGE_ID, + [EXPLORER_URL_VARIABLE_NAME]: MAINNET_EXPLORER_URL, + }, + }, + }) +} + +export default useNetworkConfig diff --git a/packages/frontend-counter-react/src/main.tsx b/packages/frontend-counter-react/src/main.tsx new file mode 100644 index 0000000..28e5162 --- /dev/null +++ b/packages/frontend-counter-react/src/main.tsx @@ -0,0 +1,4 @@ +import ReactDOM from 'react-dom/client' +import App from './components/App' + +ReactDOM.createRoot(document.getElementById('root')!).render() diff --git a/packages/frontend-next/src/app/providers/ThemeProvider.tsx b/packages/frontend-counter-react/src/providers/ThemeProvider.tsx similarity index 100% rename from packages/frontend-next/src/app/providers/ThemeProvider.tsx rename to packages/frontend-counter-react/src/providers/ThemeProvider.tsx diff --git a/packages/frontend-next/src/app/styles/index.css b/packages/frontend-counter-react/src/styles/index.css similarity index 100% rename from packages/frontend-next/src/app/styles/index.css rename to packages/frontend-counter-react/src/styles/index.css diff --git a/packages/frontend-next/src/app/types/ENetwork.ts b/packages/frontend-counter-react/src/types/ENetwork.ts similarity index 100% rename from packages/frontend-next/src/app/types/ENetwork.ts rename to packages/frontend-counter-react/src/types/ENetwork.ts diff --git a/packages/frontend-next/src/app/types/ENetworksWithFaucet.ts b/packages/frontend-counter-react/src/types/ENetworksWithFaucet.ts similarity index 100% rename from packages/frontend-next/src/app/types/ENetworksWithFaucet.ts rename to packages/frontend-counter-react/src/types/ENetworksWithFaucet.ts diff --git a/packages/frontend-next/src/app/types/TTheme.ts b/packages/frontend-counter-react/src/types/TTheme.ts similarity index 100% rename from packages/frontend-next/src/app/types/TTheme.ts rename to packages/frontend-counter-react/src/types/TTheme.ts diff --git a/packages/frontend-counter-react/src/vite-env.d.ts b/packages/frontend-counter-react/src/vite-env.d.ts new file mode 100644 index 0000000..fba16d6 --- /dev/null +++ b/packages/frontend-counter-react/src/vite-env.d.ts @@ -0,0 +1,10 @@ +/// + +interface ImportMetaEnv { + readonly VITE_APP_NAME: string + readonly VITE_APP_DESCRIPTION: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/packages/frontend-counter-react/tailwind.config.mjs b/packages/frontend-counter-react/tailwind.config.mjs new file mode 100644 index 0000000..b0ae4f1 --- /dev/null +++ b/packages/frontend-counter-react/tailwind.config.mjs @@ -0,0 +1,34 @@ +/** @type {import('tailwindcss').Config} */ +export default { + // Support multiple approaches for switching between light and dark mode. + darkMode: [ + 'variant', + [ + '@media (prefers-color-scheme: dark) { &:not(.light *) }', + '&:is(.dark *)', + ], + ], + content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: { + colors: { + 'sds-light': 'var(--sds-light)', + 'sds-dark': 'var(--sds-dark)', + 'sds-pink': 'var(--sds-pink)', + 'sds-blue': 'var(--sds-blue)', + // The color from Radix theme is used. + // @todo: Move the color to our styles. + 'sds-accent-a11': 'var(--accent-a11)', + }, + fontFamily: { + inter: 'var(--sds-font-inter)', + }, + boxShadow: { + // The color from Radix theme is used. + // @todo: Move the color to our styles. + toast: 'inset 0 0 0 1px var(--accent-a7)', + }, + }, + }, + plugins: [], +} diff --git a/packages/frontend-counter-react/tsconfig.json b/packages/frontend-counter-react/tsconfig.json new file mode 100644 index 0000000..d7887df --- /dev/null +++ b/packages/frontend-counter-react/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Aliases */ + "paths": { + "~~/*": ["./src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/frontend-counter-react/tsconfig.node.json b/packages/frontend-counter-react/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/packages/frontend-counter-react/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/frontend-counter-react/vite.config.ts b/packages/frontend-counter-react/vite.config.ts new file mode 100644 index 0000000..0e1648e --- /dev/null +++ b/packages/frontend-counter-react/vite.config.ts @@ -0,0 +1,17 @@ +import react from "@vitejs/plugin-react-swc"; +import path from 'path' +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +const ARWEAVE_DEPLOYMENT = process.env.ARWEAVE_DEPLOYMENT === 'true' || false + +// https://vitejs.dev/config/ +export default defineConfig({ + base: !ARWEAVE_DEPLOYMENT ? '/' : './', + resolve: { + alias: { + '~~': path.resolve(__dirname, './src'), + }, + }, + plugins: [tsconfigPaths(), react()], +}) diff --git a/packages/frontend-next/walrus-sites.yaml b/packages/frontend-counter-react/walrus-sites.yaml similarity index 100% rename from packages/frontend-next/walrus-sites.yaml rename to packages/frontend-counter-react/walrus-sites.yaml diff --git a/packages/frontend-next/.env b/packages/frontend-greeting-next/.env similarity index 100% rename from packages/frontend-next/.env rename to packages/frontend-greeting-next/.env diff --git a/packages/frontend-greeting-next/.firebaserc b/packages/frontend-greeting-next/.firebaserc new file mode 100644 index 0000000..5b7ac5d --- /dev/null +++ b/packages/frontend-greeting-next/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "sui-dapp-starter" + } +} diff --git a/packages/frontend-next/.gitignore b/packages/frontend-greeting-next/.gitignore similarity index 100% rename from packages/frontend-next/.gitignore rename to packages/frontend-greeting-next/.gitignore diff --git a/packages/frontend-greeting-next/.prettierignore b/packages/frontend-greeting-next/.prettierignore new file mode 100644 index 0000000..fe2cbb6 --- /dev/null +++ b/packages/frontend-greeting-next/.prettierignore @@ -0,0 +1,3 @@ +node_modules +public +dist diff --git a/packages/frontend-next/.prettierrc.mjs b/packages/frontend-greeting-next/.prettierrc.mjs similarity index 100% rename from packages/frontend-next/.prettierrc.mjs rename to packages/frontend-greeting-next/.prettierrc.mjs diff --git a/packages/frontend-next/README.md b/packages/frontend-greeting-next/README.md similarity index 100% rename from packages/frontend-next/README.md rename to packages/frontend-greeting-next/README.md diff --git a/packages/frontend-next/eslint.config.mjs b/packages/frontend-greeting-next/eslint.config.mjs similarity index 100% rename from packages/frontend-next/eslint.config.mjs rename to packages/frontend-greeting-next/eslint.config.mjs diff --git a/packages/frontend-greeting-next/firebase.json b/packages/frontend-greeting-next/firebase.json new file mode 100644 index 0000000..9e6cb84 --- /dev/null +++ b/packages/frontend-greeting-next/firebase.json @@ -0,0 +1,22 @@ +{ + "hosting": { + "predeploy": "pnpm build", + "public": "dist", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + }, + "emulators": { + "hosting": { + "port": 5000 + } + } +} diff --git a/packages/frontend-next/next-env.d.ts b/packages/frontend-greeting-next/next-env.d.ts similarity index 100% rename from packages/frontend-next/next-env.d.ts rename to packages/frontend-greeting-next/next-env.d.ts diff --git a/packages/frontend-next/next.config.ts b/packages/frontend-greeting-next/next.config.ts similarity index 100% rename from packages/frontend-next/next.config.ts rename to packages/frontend-greeting-next/next.config.ts diff --git a/packages/frontend-next/package.json b/packages/frontend-greeting-next/package.json similarity index 98% rename from packages/frontend-next/package.json rename to packages/frontend-greeting-next/package.json index ab10418..45cf452 100644 --- a/packages/frontend-next/package.json +++ b/packages/frontend-greeting-next/package.json @@ -1,5 +1,5 @@ { - "name": "frontend-next", + "name": "frontend-greeting-next", "version": "0.1.0", "private": true, "scripts": { diff --git a/packages/frontend-next/postcss.config.mjs b/packages/frontend-greeting-next/postcss.config.mjs similarity index 100% rename from packages/frontend-next/postcss.config.mjs rename to packages/frontend-greeting-next/postcss.config.mjs diff --git a/packages/frontend-greeting-next/public/android-chrome-192x192.png b/packages/frontend-greeting-next/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb27fbec45c43d84d04254e6f61f3bd380f0e2d GIT binary patch literal 6394 zcmaKRby!qS)c@TjmhSEr>5%SjB$kqHmy+&S8WiaUN$HT55LgjJ8bkz^E=dIukmk33 ze}BDyyzg_Lx#yX4&zv)JpPBj0=S-rWt{OfL4GsVR_!{cU1}KU6SFkWqZ-Zqw2uh$k zE9fWyKywQ2tt|$s&SbA{paTHG8~^~10f1|i3cd#begXh+U;_Y>xd1@vS=g;FjrxFT zr=_M0Jp6k~daE)}8f;H>GamqeDE})UF8$kYC?&*KLq`R&he3cvL7DQl_ASbTt%kA! zG!XgoO-LcxT-I=ZRdA|;0&}91$R--AY*|o3zVZZS=-|4xSV`W@o;G1MXf6Lyox|4l z26x@()R@Zzgs-qyfTvLk8CDfi@lyj0-j@xgnZ8Vn|o`lojwhmf4-Wn``LyJC?9%HszssHDvd{iZ!+uU+E30?~-9swdBKXpt^n`#TRs!Z#P)0 zET-HbUVV@X>+-1 z@J&H6U*2{}(p&};=WswT6Ja5BAZ|F37pVpAk?Ho%FvpT_I;?=3{)U8(B%>ubvrbwY z7Iv?AOe1TXqcRr%2BcWhZbWbLzUxSW>Siu!Q*rjfM93ImKH2Wm#z;PanqIAH{5iAM zzR{~O1!d-aYmiioWxT4ki^*sjE87{sDH-1*;zRTQYZ#9(^ZVmh2(#uQ=7tNUkMH#% z*g?=8af12$iz!xE(YnBAYdnp(6!_EjUgK=@-xaF5@BWMCN=a7Y`hIGE#8y z&Y($Hp8C1F(QqkG3eQclI{K-)sW6t+6-O1W_IWA)%rXY0f17mvT zOut3%LCo{^dY45oHyl1g(+9~s|CELJwhcbNu$?%Stp~skr=cr^*p7!$<$Pi#E|h|y zb{IrV81aYjQrk9mPpCHtzcMUY>VklTXe5aNSDMJXwQm0hVi_-JzU{$lXc7QTPnTi~ zc*7l^e0nKqV^0lm!-2hhTS=P(tS!g8M-w~@P2iJ}?I1~mxjl~w`W5CS8HX2(1jc~u zW423%6XJ4J&i!jqnXkUqgQ%Ir__pQRD?yp5u20_F->l7{9tbT78>Uk-yWokMdPM1& z4`bbo>$MMj8y?BLrxBl+`>;P1hi3)KJ!&!~ievPp z>^n{==!whZ&Dd)%5ku+$%@V$H2xvFAqZ~^)hW45H+p5V$!O=J z&z^BGsj_5COy2bCq$0Mag*JNjQx`%yn;aF$=Se_CAiV24)-6iQaJisoTM1(=OCpyi zPBNXqKs?f3+Q8m1&)D6Ut(-{UG6teOH{YEpAp&%kHll5Nu^WZlm7&dGsu=pXQ>FD! zl|N6S5imcqyC_t^1agFbZks%zYMuu&naMM=80k1eXkd?odkeFd_qfMsfaAeR7*_tV zJw5q5DbZO*IfvZUDYAbCslE!>1b?r6>z$)uR3SUY6REYRYQ<+HiHk95m7|sPjW3dp zFs5=v<{p7I6;9_ zw*?D4QHef&^Z7K!U{;+QLq6rs-d3|!N@$%&U$Re(Zj1~jPxY4Y0QjG%B~iU%@&`9X%asj6(VLg(MC?T77e6v8#C#^Md(PNz zVc#CWWh^ZJ5PWX$)!LI!v~kfMayr*Jj^3OPqT66OT2FaW8|pad@*}^a+|-U8h>Z|& zkFMa%&v2Lg)J8l+#0?_)4Tom)67i*cx{=?;UnYr+;5>pM2^i}kR^+z5bsyNLDI1lk z`3P8zs0l*xs63F2Hkp%8# zDl7*wxbejz<94-;dPz*s>FA!1vi2(snGD+VckOIge$AshHv4Aclz#DxELb>lUPr1A z--_n1^wV5XI{`Z}H2Jl>m0undFH?ow$BdWLw8kD|UfY|>P7R%5oFGSh9|25-`L5Xn zvrc%bM@|4d_H~Qxf&dMRIH|N-wOqFktcyn6G)77%0DO`mju)O#12E;Y=!x`fqCC}3 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 Skt|dQKtn}Wxlz$3>i+@$fv>s% literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/android-chrome-512x512.png b/packages/frontend-greeting-next/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca3f80e018f013321f4f43f1bbe1186ca0a6186 GIT binary patch literal 17460 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 i#2my2%YaCrN-hBE7ZG&wLN%2D0000 + + + + + #011631 + + + diff --git a/packages/frontend-next/public/emoji/1.svg b/packages/frontend-greeting-next/public/emoji/1.svg similarity index 100% rename from packages/frontend-next/public/emoji/1.svg rename to packages/frontend-greeting-next/public/emoji/1.svg diff --git a/packages/frontend-next/public/emoji/10.svg b/packages/frontend-greeting-next/public/emoji/10.svg similarity index 100% rename from packages/frontend-next/public/emoji/10.svg rename to packages/frontend-greeting-next/public/emoji/10.svg diff --git a/packages/frontend-next/public/emoji/11.svg b/packages/frontend-greeting-next/public/emoji/11.svg similarity index 100% rename from packages/frontend-next/public/emoji/11.svg rename to packages/frontend-greeting-next/public/emoji/11.svg diff --git a/packages/frontend-next/public/emoji/12.svg b/packages/frontend-greeting-next/public/emoji/12.svg similarity index 100% rename from packages/frontend-next/public/emoji/12.svg rename to packages/frontend-greeting-next/public/emoji/12.svg diff --git a/packages/frontend-next/public/emoji/13.svg b/packages/frontend-greeting-next/public/emoji/13.svg similarity index 100% rename from packages/frontend-next/public/emoji/13.svg rename to packages/frontend-greeting-next/public/emoji/13.svg diff --git a/packages/frontend-next/public/emoji/14.svg b/packages/frontend-greeting-next/public/emoji/14.svg similarity index 100% rename from packages/frontend-next/public/emoji/14.svg rename to packages/frontend-greeting-next/public/emoji/14.svg diff --git a/packages/frontend-next/public/emoji/15.svg b/packages/frontend-greeting-next/public/emoji/15.svg similarity index 100% rename from packages/frontend-next/public/emoji/15.svg rename to packages/frontend-greeting-next/public/emoji/15.svg diff --git a/packages/frontend-next/public/emoji/16.svg b/packages/frontend-greeting-next/public/emoji/16.svg similarity index 100% rename from packages/frontend-next/public/emoji/16.svg rename to packages/frontend-greeting-next/public/emoji/16.svg diff --git a/packages/frontend-next/public/emoji/17.svg b/packages/frontend-greeting-next/public/emoji/17.svg similarity index 100% rename from packages/frontend-next/public/emoji/17.svg rename to packages/frontend-greeting-next/public/emoji/17.svg diff --git a/packages/frontend-next/public/emoji/18.svg b/packages/frontend-greeting-next/public/emoji/18.svg similarity index 100% rename from packages/frontend-next/public/emoji/18.svg rename to packages/frontend-greeting-next/public/emoji/18.svg diff --git a/packages/frontend-next/public/emoji/19.svg b/packages/frontend-greeting-next/public/emoji/19.svg similarity index 100% rename from packages/frontend-next/public/emoji/19.svg rename to packages/frontend-greeting-next/public/emoji/19.svg diff --git a/packages/frontend-next/public/emoji/2.svg b/packages/frontend-greeting-next/public/emoji/2.svg similarity index 100% rename from packages/frontend-next/public/emoji/2.svg rename to packages/frontend-greeting-next/public/emoji/2.svg diff --git a/packages/frontend-next/public/emoji/20.svg b/packages/frontend-greeting-next/public/emoji/20.svg similarity index 100% rename from packages/frontend-next/public/emoji/20.svg rename to packages/frontend-greeting-next/public/emoji/20.svg diff --git a/packages/frontend-next/public/emoji/21.svg b/packages/frontend-greeting-next/public/emoji/21.svg similarity index 100% rename from packages/frontend-next/public/emoji/21.svg rename to packages/frontend-greeting-next/public/emoji/21.svg diff --git a/packages/frontend-next/public/emoji/22.svg b/packages/frontend-greeting-next/public/emoji/22.svg similarity index 100% rename from packages/frontend-next/public/emoji/22.svg rename to packages/frontend-greeting-next/public/emoji/22.svg diff --git a/packages/frontend-next/public/emoji/23.svg b/packages/frontend-greeting-next/public/emoji/23.svg similarity index 100% rename from packages/frontend-next/public/emoji/23.svg rename to packages/frontend-greeting-next/public/emoji/23.svg diff --git a/packages/frontend-next/public/emoji/24.svg b/packages/frontend-greeting-next/public/emoji/24.svg similarity index 100% rename from packages/frontend-next/public/emoji/24.svg rename to packages/frontend-greeting-next/public/emoji/24.svg diff --git a/packages/frontend-next/public/emoji/25.svg b/packages/frontend-greeting-next/public/emoji/25.svg similarity index 100% rename from packages/frontend-next/public/emoji/25.svg rename to packages/frontend-greeting-next/public/emoji/25.svg diff --git a/packages/frontend-next/public/emoji/26.svg b/packages/frontend-greeting-next/public/emoji/26.svg similarity index 100% rename from packages/frontend-next/public/emoji/26.svg rename to packages/frontend-greeting-next/public/emoji/26.svg diff --git a/packages/frontend-next/public/emoji/27.svg b/packages/frontend-greeting-next/public/emoji/27.svg similarity index 100% rename from packages/frontend-next/public/emoji/27.svg rename to packages/frontend-greeting-next/public/emoji/27.svg diff --git a/packages/frontend-next/public/emoji/28.svg b/packages/frontend-greeting-next/public/emoji/28.svg similarity index 100% rename from packages/frontend-next/public/emoji/28.svg rename to packages/frontend-greeting-next/public/emoji/28.svg diff --git a/packages/frontend-next/public/emoji/29.svg b/packages/frontend-greeting-next/public/emoji/29.svg similarity index 100% rename from packages/frontend-next/public/emoji/29.svg rename to packages/frontend-greeting-next/public/emoji/29.svg diff --git a/packages/frontend-next/public/emoji/3.svg b/packages/frontend-greeting-next/public/emoji/3.svg similarity index 100% rename from packages/frontend-next/public/emoji/3.svg rename to packages/frontend-greeting-next/public/emoji/3.svg diff --git a/packages/frontend-next/public/emoji/30.svg b/packages/frontend-greeting-next/public/emoji/30.svg similarity index 100% rename from packages/frontend-next/public/emoji/30.svg rename to packages/frontend-greeting-next/public/emoji/30.svg diff --git a/packages/frontend-next/public/emoji/31.svg b/packages/frontend-greeting-next/public/emoji/31.svg similarity index 100% rename from packages/frontend-next/public/emoji/31.svg rename to packages/frontend-greeting-next/public/emoji/31.svg diff --git a/packages/frontend-next/public/emoji/32.svg b/packages/frontend-greeting-next/public/emoji/32.svg similarity index 100% rename from packages/frontend-next/public/emoji/32.svg rename to packages/frontend-greeting-next/public/emoji/32.svg diff --git a/packages/frontend-next/public/emoji/33.svg b/packages/frontend-greeting-next/public/emoji/33.svg similarity index 100% rename from packages/frontend-next/public/emoji/33.svg rename to packages/frontend-greeting-next/public/emoji/33.svg diff --git a/packages/frontend-next/public/emoji/34.svg b/packages/frontend-greeting-next/public/emoji/34.svg similarity index 100% rename from packages/frontend-next/public/emoji/34.svg rename to packages/frontend-greeting-next/public/emoji/34.svg diff --git a/packages/frontend-next/public/emoji/35.svg b/packages/frontend-greeting-next/public/emoji/35.svg similarity index 100% rename from packages/frontend-next/public/emoji/35.svg rename to packages/frontend-greeting-next/public/emoji/35.svg diff --git a/packages/frontend-next/public/emoji/36.svg b/packages/frontend-greeting-next/public/emoji/36.svg similarity index 100% rename from packages/frontend-next/public/emoji/36.svg rename to packages/frontend-greeting-next/public/emoji/36.svg diff --git a/packages/frontend-next/public/emoji/37.svg b/packages/frontend-greeting-next/public/emoji/37.svg similarity index 100% rename from packages/frontend-next/public/emoji/37.svg rename to packages/frontend-greeting-next/public/emoji/37.svg diff --git a/packages/frontend-next/public/emoji/38.svg b/packages/frontend-greeting-next/public/emoji/38.svg similarity index 100% rename from packages/frontend-next/public/emoji/38.svg rename to packages/frontend-greeting-next/public/emoji/38.svg diff --git a/packages/frontend-next/public/emoji/39.svg b/packages/frontend-greeting-next/public/emoji/39.svg similarity index 100% rename from packages/frontend-next/public/emoji/39.svg rename to packages/frontend-greeting-next/public/emoji/39.svg diff --git a/packages/frontend-next/public/emoji/4.svg b/packages/frontend-greeting-next/public/emoji/4.svg similarity index 100% rename from packages/frontend-next/public/emoji/4.svg rename to packages/frontend-greeting-next/public/emoji/4.svg diff --git a/packages/frontend-next/public/emoji/40.svg b/packages/frontend-greeting-next/public/emoji/40.svg similarity index 100% rename from packages/frontend-next/public/emoji/40.svg rename to packages/frontend-greeting-next/public/emoji/40.svg diff --git a/packages/frontend-next/public/emoji/41.svg b/packages/frontend-greeting-next/public/emoji/41.svg similarity index 100% rename from packages/frontend-next/public/emoji/41.svg rename to packages/frontend-greeting-next/public/emoji/41.svg diff --git a/packages/frontend-next/public/emoji/42.svg b/packages/frontend-greeting-next/public/emoji/42.svg similarity index 100% rename from packages/frontend-next/public/emoji/42.svg rename to packages/frontend-greeting-next/public/emoji/42.svg diff --git a/packages/frontend-next/public/emoji/43.svg b/packages/frontend-greeting-next/public/emoji/43.svg similarity index 100% rename from packages/frontend-next/public/emoji/43.svg rename to packages/frontend-greeting-next/public/emoji/43.svg diff --git a/packages/frontend-next/public/emoji/44.svg b/packages/frontend-greeting-next/public/emoji/44.svg similarity index 100% rename from packages/frontend-next/public/emoji/44.svg rename to packages/frontend-greeting-next/public/emoji/44.svg diff --git a/packages/frontend-next/public/emoji/45.svg b/packages/frontend-greeting-next/public/emoji/45.svg similarity index 100% rename from packages/frontend-next/public/emoji/45.svg rename to packages/frontend-greeting-next/public/emoji/45.svg diff --git a/packages/frontend-next/public/emoji/46.svg b/packages/frontend-greeting-next/public/emoji/46.svg similarity index 100% rename from packages/frontend-next/public/emoji/46.svg rename to packages/frontend-greeting-next/public/emoji/46.svg diff --git a/packages/frontend-next/public/emoji/47.svg b/packages/frontend-greeting-next/public/emoji/47.svg similarity index 100% rename from packages/frontend-next/public/emoji/47.svg rename to packages/frontend-greeting-next/public/emoji/47.svg diff --git a/packages/frontend-next/public/emoji/48.svg b/packages/frontend-greeting-next/public/emoji/48.svg similarity index 100% rename from packages/frontend-next/public/emoji/48.svg rename to packages/frontend-greeting-next/public/emoji/48.svg diff --git a/packages/frontend-next/public/emoji/49.svg b/packages/frontend-greeting-next/public/emoji/49.svg similarity index 100% rename from packages/frontend-next/public/emoji/49.svg rename to packages/frontend-greeting-next/public/emoji/49.svg diff --git a/packages/frontend-next/public/emoji/5.svg b/packages/frontend-greeting-next/public/emoji/5.svg similarity index 100% rename from packages/frontend-next/public/emoji/5.svg rename to packages/frontend-greeting-next/public/emoji/5.svg diff --git a/packages/frontend-next/public/emoji/50.svg b/packages/frontend-greeting-next/public/emoji/50.svg similarity index 100% rename from packages/frontend-next/public/emoji/50.svg rename to packages/frontend-greeting-next/public/emoji/50.svg diff --git a/packages/frontend-next/public/emoji/51.svg b/packages/frontend-greeting-next/public/emoji/51.svg similarity index 100% rename from packages/frontend-next/public/emoji/51.svg rename to packages/frontend-greeting-next/public/emoji/51.svg diff --git a/packages/frontend-next/public/emoji/52.svg b/packages/frontend-greeting-next/public/emoji/52.svg similarity index 100% rename from packages/frontend-next/public/emoji/52.svg rename to packages/frontend-greeting-next/public/emoji/52.svg diff --git a/packages/frontend-next/public/emoji/53.svg b/packages/frontend-greeting-next/public/emoji/53.svg similarity index 100% rename from packages/frontend-next/public/emoji/53.svg rename to packages/frontend-greeting-next/public/emoji/53.svg diff --git a/packages/frontend-next/public/emoji/54.svg b/packages/frontend-greeting-next/public/emoji/54.svg similarity index 100% rename from packages/frontend-next/public/emoji/54.svg rename to packages/frontend-greeting-next/public/emoji/54.svg diff --git a/packages/frontend-next/public/emoji/55.svg b/packages/frontend-greeting-next/public/emoji/55.svg similarity index 100% rename from packages/frontend-next/public/emoji/55.svg rename to packages/frontend-greeting-next/public/emoji/55.svg diff --git a/packages/frontend-next/public/emoji/56.svg b/packages/frontend-greeting-next/public/emoji/56.svg similarity index 100% rename from packages/frontend-next/public/emoji/56.svg rename to packages/frontend-greeting-next/public/emoji/56.svg diff --git a/packages/frontend-next/public/emoji/57.svg b/packages/frontend-greeting-next/public/emoji/57.svg similarity index 100% rename from packages/frontend-next/public/emoji/57.svg rename to packages/frontend-greeting-next/public/emoji/57.svg diff --git a/packages/frontend-next/public/emoji/58.svg b/packages/frontend-greeting-next/public/emoji/58.svg similarity index 100% rename from packages/frontend-next/public/emoji/58.svg rename to packages/frontend-greeting-next/public/emoji/58.svg diff --git a/packages/frontend-next/public/emoji/59.svg b/packages/frontend-greeting-next/public/emoji/59.svg similarity index 100% rename from packages/frontend-next/public/emoji/59.svg rename to packages/frontend-greeting-next/public/emoji/59.svg diff --git a/packages/frontend-next/public/emoji/6.svg b/packages/frontend-greeting-next/public/emoji/6.svg similarity index 100% rename from packages/frontend-next/public/emoji/6.svg rename to packages/frontend-greeting-next/public/emoji/6.svg diff --git a/packages/frontend-next/public/emoji/60.svg b/packages/frontend-greeting-next/public/emoji/60.svg similarity index 100% rename from packages/frontend-next/public/emoji/60.svg rename to packages/frontend-greeting-next/public/emoji/60.svg diff --git a/packages/frontend-next/public/emoji/61.svg b/packages/frontend-greeting-next/public/emoji/61.svg similarity index 100% rename from packages/frontend-next/public/emoji/61.svg rename to packages/frontend-greeting-next/public/emoji/61.svg diff --git a/packages/frontend-next/public/emoji/62.svg b/packages/frontend-greeting-next/public/emoji/62.svg similarity index 100% rename from packages/frontend-next/public/emoji/62.svg rename to packages/frontend-greeting-next/public/emoji/62.svg diff --git a/packages/frontend-next/public/emoji/63.svg b/packages/frontend-greeting-next/public/emoji/63.svg similarity index 100% rename from packages/frontend-next/public/emoji/63.svg rename to packages/frontend-greeting-next/public/emoji/63.svg diff --git a/packages/frontend-next/public/emoji/64.svg b/packages/frontend-greeting-next/public/emoji/64.svg similarity index 100% rename from packages/frontend-next/public/emoji/64.svg rename to packages/frontend-greeting-next/public/emoji/64.svg diff --git a/packages/frontend-next/public/emoji/7.svg b/packages/frontend-greeting-next/public/emoji/7.svg similarity index 100% rename from packages/frontend-next/public/emoji/7.svg rename to packages/frontend-greeting-next/public/emoji/7.svg diff --git a/packages/frontend-next/public/emoji/8.svg b/packages/frontend-greeting-next/public/emoji/8.svg similarity index 100% rename from packages/frontend-next/public/emoji/8.svg rename to packages/frontend-greeting-next/public/emoji/8.svg diff --git a/packages/frontend-next/public/emoji/9.svg b/packages/frontend-greeting-next/public/emoji/9.svg similarity index 100% rename from packages/frontend-next/public/emoji/9.svg rename to packages/frontend-greeting-next/public/emoji/9.svg diff --git a/packages/frontend-greeting-next/public/favicon-16x16.png b/packages/frontend-greeting-next/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab0ea56446bc08ecf242ff2931a4cff054bf608 GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>xO{tjlu}*hZi&U`v65{tz{b{|5pUEdCz^wg{pa zNP^t6_`fIEF(5&>>;jNEQ0IZ&4AJuc|Nn-L6{mon^ehST3ue$y-2IY2xJyXz&M!6D zhmZgLx^!E~?8o1Ppp{jOH`aaU=y=cS_~57X>-p@Q%haRqyL>PbE0Ns$OmV&5I?-bn zo36LJ@htz7wPgR1i@XvL>2?-*&xiwU%2=ykilN!>Fdh= zf|ZX$Oz8i)IBlTNbWaz@5Q)pl2?rP@W?o>K5g8HqBWK>cHy$y3etQ1?d2$x>r}xJn zxEvhd5y7IRp!G~sPf_#fOHE$U2@|JI4o^r32nlNY5E^pzimAy~i7l+9B?p+;^oo%5&@4mtWXm%*x7P}A$3xE9cfswJ)wB`Jv|saDBFsX&Us$iT=%*T7WQ&?Lmb z!pg|V%FsgFz`)AD;K+aOCny?n^HVa@DsgMrx@dC*P=h4MhT#0PlJdl&REF~Ma=pyF z?Be9af>gcyqV(DCY@~pS!mC0eN`ey06$*;-(=u~X6-p`#QWY`_N|G5ED&{=?#KTb- zrlE1l|MVHpr$G$N%G`R%+``Jj-jhX`g%w;HOb(|oD{l@_IDO;Fi6du@$Q)rm-Qcmn bOON4|xM0aAC)24wD;PXo{an^LB{Ts5&_`^O literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/favicon-32x32.png b/packages/frontend-greeting-next/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4447aa9e3f01793d0343b4485e891f08f1de51fd GIT binary patch literal 1300 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+0817kygPlzi}fzQJKzKg+V z(SNU{|GgLd_gw@+4F92mK(-H1!J_{S4gW(|ffx`jkm0!mqy|Fzfpq}|fyf`mhN}cw z0oSMq6O#xpkg3g6?ymzJuuU2f7pHa-hS2pgG`<1TYS2N`m}? z8Kg@Vf0H-YOq>tn8ei}Q$b4yT|GvNRSM|TI`}Wt>ztdKI^6wSTN%qz| z_u{V$e3-smVfI_D$-7U5v8E`UIlV{r9Lw4VHO$+j4({51^=aa>-)u&164!J+b3^qm zb33$p?Cg_E7R(g;bJ%zNx`{2Hg!rE~y?0r%@F4RupgS0oyxm>uJ@ywq1#&nGJR*yM zVrC%BDE6M|5m1o5#M9T6{RJx@hnUd+b8*^0xg1Xy#}JFtYbXA+X9^TK8b56rkCxJ@ zu#OY!R)}m;*>tQ!=Vs@oRQsQ|_s)FYo)-1z(I12P#^0--o!$Fg@YDUEsec7E*00bx zc~!<_>5gq&4_14#WI2Sc);{%>EoHMq>_rD#6-jBXOKw|NcCucG>6o3E`Sa<9E!&=^ z-pZW&KW)!pFZndr1IHrL!?zzhm(y=^;Wfjr3+tC&%Y3FOFA*YR$WkYve5U`Cgmn12 z1FYX!et3R+)_7h0_J=9<41T7(H`10gbso+!NSChKxYBabY<4lRrCuFkG2WjXX4LKA zi3nHPA|$45SD7$%*4EN2vpFp}r9+_(9+<-_t{RdGieu{EdDWK6oHt zVdZz?InToPZ6cxP_tVEEOn&ANYEN33Mtq!ty`?&!(~=T7Hoi1rqp zSt{y&WKY2zdk!TbIpzl2WjRV8MO2>5{B(x9(s%#U!e!-BKNM8I%zPLW|78AG=0$VM zMY40ftASCWTH+c}l9E`GYL#4+3Zxi}42(>44NP?nO+pMTtc;AT3@x+`46F2D?NY%?PN}v7CMhd7X zyecH3Bq*_5p`a)~Ei)%op`@}PRUxyWB$Jc1ICAEQ%n|m}4IT@;^cY@=3zmFxGMx&vg2B_( K&t;ucLK6T~q+wJ5 literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/favicon.ico b/packages/frontend-greeting-next/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e8eaddbca52ce85e8730e80c7e5a9e83ab66bf35 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/mstile-144x144.png b/packages/frontend-greeting-next/public/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..450f938c0391bdb4f483afd762f7cf3fdc8f143e GIT binary patch literal 3187 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 XsIN_*a9&#it^hn-NVs#(JJSCH8T2`~ literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/mstile-150x150.png b/packages/frontend-greeting-next/public/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..c96ce6fba41de602f9bd4e053a903ce9b5f25e66 GIT binary patch literal 3049 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 O*|wHwiyHHjiT?(1&n;yD literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/mstile-310x310.png b/packages/frontend-greeting-next/public/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..cc815f67be488670ab7fc1a9915b33e55b8d5222 GIT binary patch literal 10241 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 Dtb~*B literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/mstile-70x70.png b/packages/frontend-greeting-next/public/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..80875ced53406e8bdf533859e49aa2ab7e17ebf5 GIT binary patch literal 2467 zcmZ`(c|25WA3sB5Uo&VSqLPp?mbd5{d}c6)v7|`1j5U&_F}ALllISB0DQni$RYNIF zQXx`8Q8#P0kPs3j`+1*prtZD(AMg1*^DMvTyZnC7bIx3_qgjZHY!ZPWNStCxasVR> z`3doZ{@Y;6A{f>kGqo{=pz>tV6*nwcD|=Wv*g(*!9RPO@f|d~c7zBmjA!vdQL53L+ zBp;MhWxo%C__FM*9mxPdEre};HHRYDrT}T)nLmTHLf9HaieLzaEppIc5e$NWVv+~j zUPC6x5)gTP0es*lDsl}a7Q*%@7>FRSOxP+9L0Y3hgz~S37y;Pze}d*f97NCr0P=4m zt74dzkHBa}FeMe4P;!x7AWOT7EbUMiFyS?zjEJKO6p(WPY=tg)5k$Wbrsl(73nXui z)`C=l>VqD%pJ{{IQD0jWV_giJ)F8VEg;(G&M;;3)6Wszmk{ikbbEFWkta)Vh!r$S)g>=0@$8cZxO8f>t=sm843mz zfahUYEJPF8&4&Szil)Ik6C@KJ{`yZxgvh%f)Q+bKBFO2X2gL&*f@u5q%Z8MO)&jBx zyAXu*Kp(h(M|Wv`F?c(Bm=3i4kow67vm33mv0bZrjAxkjQ~T5Vg?24RJe;%373k3q zc`i5OG%SK&iLCv;rSScl!3+7XE+e8ktgvKj zm4HgBFWFnl&x$T|#ZQuBH?vwt(khqAOUp9PJUFV`++3#KZa7A|`=x>ryu=Ippk>RXR&w+Vj-bMpU?R$xyjXQY@lt zZGU-ml|3ZTwYx2GxW3lZU{3JZ3?KfP_nCqn#$uZTG-__-E!wizZqKLtsu90SOQq`9 znV;!berdT(Yq0MoU>eJ9@{`jfi-P@!h!d%zwH|UY7Ks~;Uc=e)=Oq`D4>u_hO+Bo? zu`yBxmns5maX1?HypjwZXQM8m&DOtsQ3Dgs$O?&M-58Y1G*+ES!|C=LuKCvmNRJ7G zHAxC|500k_Ep`dCl3F^&a>=-z;t3SVz!`tM1$xE~nFo6A$~OHU|ih zM~*!AVTVwi%@Sn$Ein(MvWk16)qOqrY??h+uPpn7V7btvHqN$f6k>-H#i;Ch!#>TK ze0@LaeNNG*%I4^i($3^>;&;Wbyv>~^DO8Vd>YWVCzJ9yGav-(~KCYT%A`$(y;1BL0 z*H>j%PB_^5ebM(ll%X)C>3wx__E8DhwRJ!<;BM@Dm1sXE-p9+-QXga70^QNHJHlaGm4qIV9swj>TMC~qGq>g zSK3MK`0?kL0@6eHsA96M?qwCfIc6rP-^t#rnRM&b&{4Vhb?^VeW9Jz$_roiPswIYh z?|Z?~f0?L0^D-)+g8w>WAf+HH5by6d!ewQ?5oUM9k}Ql)>{fF;Ek_D@OSu_( zbZ~Ab*7@eRPs0$&d2vbkvnafjqW$n{C@#+SxLO;=tJTdSq~}DUvM z5&j(c9V*d!!j&n+t?jd|8>EiqvRwE(HVNek-X$z<+-VAR530FEHtzW`7fWBQ6E2VW zqEcA9on2gfZ|fT4>BoihvIk#LE=SZHGTWZ6^Y(uJgjU>6;%n1KG} zT-V!{DY8!DwmuPE1If&oEGz$FPE;JLrlO9@AZQMM7Qj>!J0s1PxKW4sN~_LbBh4Py z90{zF&I+~E5z(6{eOJ4_dM^Xx5Uxls)f$kj7h-oMEKkmxdyWXZFQncIzpW%a`o$!t@YbKdo)yV}oCYrucob|%@G>FLJw zGW1}0fdL}m33^(1eJve5NBkZ`0>O}g*TCZq@%V^5Gy4A!`~y9Gy(9iVL8xx27Z99I zIXW{P+`^QD7=hltC%lxI5kX$czClb62nx>`o)r^1d2r{>Cfnu~%0~x?UsZIshp3FI z4D}L@Uq+e4(yRC6SH0(`+}!o9@mb3=g=d1zEX#bW-Oz-*G;`KW|1z+EC}bL`%#42a Ezs3vUG5`Po literal 0 HcmV?d00001 diff --git a/packages/frontend-greeting-next/public/robots.txt b/packages/frontend-greeting-next/public/robots.txt new file mode 100644 index 0000000..5a787ec --- /dev/null +++ b/packages/frontend-greeting-next/public/robots.txt @@ -0,0 +1 @@ +# This robots.txt file controls crawling of the app. diff --git a/packages/frontend-greeting-next/public/safari-pinned-tab.svg b/packages/frontend-greeting-next/public/safari-pinned-tab.svg new file mode 100644 index 0000000..bf9bc3b --- /dev/null +++ b/packages/frontend-greeting-next/public/safari-pinned-tab.svg @@ -0,0 +1,48 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/packages/frontend-greeting-next/public/webmanifest.json b/packages/frontend-greeting-next/public/webmanifest.json new file mode 100644 index 0000000..1533812 --- /dev/null +++ b/packages/frontend-greeting-next/public/webmanifest.json @@ -0,0 +1,21 @@ +{ + "name": "Sui dApp Starter", + "short_name": "Sui dApp Starter", + "description": "Full-Stack Sui Starter on Steroids", + "start_url": "/?utm_source=app_manifest", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#011631", + "background_color": "#011631", + "display": "standalone" +} diff --git a/packages/frontend-greeting-next/scripts/walrus-site-deploy.cjs b/packages/frontend-greeting-next/scripts/walrus-site-deploy.cjs new file mode 100755 index 0000000..2b4009e --- /dev/null +++ b/packages/frontend-greeting-next/scripts/walrus-site-deploy.cjs @@ -0,0 +1,141 @@ +#!/usr/bin/env node + +/** + * The script publishes to or updates the app on Walrus Sites. + * After publishing the app, site object ID is copied to .env.local, which is used later to update the app on Walrus Sites. + */ + +const { promises } = require('node:fs') +const path = require('node:path') +const EnvFileWriter = require('env-file-rw').default +const { execSync, exec } = require('node:child_process') + +const WALRUS_SITE_OBJECT_ID_VARIABLE_NAME = 'WALRUS_SITE_OBJECT_ID' + +const CONFIG_FILE_PATH = './.env.local' +const WALRUS_SITES_CONFIG_PATH = './walrus-sites.yaml' +const SITE_PATH = './dist' +const WALLET_CONFIG_PATH_FULL = '~/suibase/workdirs/testnet/config/client.yaml' + +const main = async () => { + const configFilePathFull = path.join(process.cwd(), CONFIG_FILE_PATH) + const walrusConfigPathFull = path.join( + process.cwd(), + WALRUS_SITES_CONFIG_PATH + ) + const sitePathFull = path.join(process.cwd(), SITE_PATH) + + await createFileIfNecessary(configFilePathFull) + + let siteObjectId = await readSiteObjectId(configFilePathFull) + + try { + console.log('Buying test WAL coins from the faucet...') + execSync(`walrus --wallet ${WALLET_CONFIG_PATH_FULL} get-wal`, { + stdio: 'inherit', + }) + } catch (e) { + console.warn(e) + } + + // If the site has not yet been published (no site object ID in the config), + // then publish the site to Walrus Sites. + if (siteObjectId == null) { + console.log('Publishing the app to Walrus Sites...') + const { stdout, stderr } = await exec( + `site-builder --config ${walrusConfigPathFull} --wallet ${WALLET_CONFIG_PATH_FULL} publish ${sitePathFull}` + ) + + // Get the site object ID from the publish command output. + stdout.on('data', async (data) => { + console.log(data) + + const regex = /New site object ID: (.+)/ + const result = data.match(regex) + + // If the line doesn't have site object ID, ignore it. + if (result == null) { + return + } + + siteObjectId = result[1].trim() + + // Save site object ID to the config file. + await setEnvVar( + configFilePathFull, + WALRUS_SITE_OBJECT_ID_VARIABLE_NAME, + siteObjectId + ) + }) + + stderr.on('data', async (error) => { + console.error(error) + // Do not exit if it's a warning. + // @todo: Find a better way to catch warnings, e.g. by severity level or error code. + if (error.startsWith('[warn]')) { + return + } + process.exit() + }) + + return + } + + if (siteObjectId == null) { + console.error('~ The script could not find the site object ID in the output.') + console.error( + '~ If you see it, please add WALRUS_SITE_OBJECT_ID=[site object ID from the output] into packages/frontend/.env.local manually.' + ) + return + } + + console.log('Updating the app on Walrus Sites...') + execSync( + `site-builder --config ${walrusConfigPathFull} --wallet ${WALLET_CONFIG_PATH_FULL} update ${sitePathFull} ${siteObjectId}`, + { stdio: 'inherit' } + ) +} + +/** + * Read Walrus site object ID from .env.local. + * + * @param {string} configFilePath + * @returns + */ +const readSiteObjectId = async (configFilePath) => { + const envFileWriter = new EnvFileWriter(configFilePath, false) + await envFileWriter.parse() + return envFileWriter.get(WALRUS_SITE_OBJECT_ID_VARIABLE_NAME, null) +} + +/** + * Create a file if it doesn't exist. + * + * @param {string} filePath + * @returns + */ +const createFileIfNecessary = async (filePath) => { + try { + await promises.writeFile(filePath, '', { flag: 'wx' }) + } catch {} +} + +/** + * Set the environment variable in the .env.local file. + * + * @param {string} envFilePath + * @param {string} name + * @param {string} value + * @returns + */ +const setEnvVar = async (envFilePath, name, value) => { + const envFileWriter = new EnvFileWriter(envFilePath, false) + await envFileWriter.parse() + envFileWriter.set(name, value) + await envFileWriter.save() +} + +// Main entry point. +main().catch((e) => { + console.error(e) +}) diff --git a/packages/frontend-greeting-next/src/app/assets/logo.svg b/packages/frontend-greeting-next/src/app/assets/logo.svg new file mode 100644 index 0000000..0d5c6eb --- /dev/null +++ b/packages/frontend-greeting-next/src/app/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/frontend-next/src/app/components/AnimatedBackground/index.css b/packages/frontend-greeting-next/src/app/components/AnimatedBackground/index.css similarity index 100% rename from packages/frontend-next/src/app/components/AnimatedBackground/index.css rename to packages/frontend-greeting-next/src/app/components/AnimatedBackground/index.css diff --git a/packages/frontend-next/src/app/components/AnimatedBackground/index.tsx b/packages/frontend-greeting-next/src/app/components/AnimatedBackground/index.tsx similarity index 100% rename from packages/frontend-next/src/app/components/AnimatedBackground/index.tsx rename to packages/frontend-greeting-next/src/app/components/AnimatedBackground/index.tsx diff --git a/packages/frontend-next/src/app/components/CustomConnectButton.tsx b/packages/frontend-greeting-next/src/app/components/CustomConnectButton.tsx similarity index 100% rename from packages/frontend-next/src/app/components/CustomConnectButton.tsx rename to packages/frontend-greeting-next/src/app/components/CustomConnectButton.tsx diff --git a/packages/frontend-next/src/app/components/Emoji.tsx b/packages/frontend-greeting-next/src/app/components/Emoji.tsx similarity index 100% rename from packages/frontend-next/src/app/components/Emoji.tsx rename to packages/frontend-greeting-next/src/app/components/Emoji.tsx diff --git a/packages/frontend-next/src/app/components/GreetingForm.tsx b/packages/frontend-greeting-next/src/app/components/GreetingForm.tsx similarity index 100% rename from packages/frontend-next/src/app/components/GreetingForm.tsx rename to packages/frontend-greeting-next/src/app/components/GreetingForm.tsx diff --git a/packages/frontend-next/src/app/components/Loading.tsx b/packages/frontend-greeting-next/src/app/components/Loading.tsx similarity index 100% rename from packages/frontend-next/src/app/components/Loading.tsx rename to packages/frontend-greeting-next/src/app/components/Loading.tsx diff --git a/packages/frontend-next/src/app/components/NetworkSupportChecker.tsx b/packages/frontend-greeting-next/src/app/components/NetworkSupportChecker.tsx similarity index 100% rename from packages/frontend-next/src/app/components/NetworkSupportChecker.tsx rename to packages/frontend-greeting-next/src/app/components/NetworkSupportChecker.tsx diff --git a/packages/frontend-next/src/app/components/Notification.tsx b/packages/frontend-greeting-next/src/app/components/Notification.tsx similarity index 100% rename from packages/frontend-next/src/app/components/Notification.tsx rename to packages/frontend-greeting-next/src/app/components/Notification.tsx diff --git a/packages/frontend-next/src/app/components/ThemeSwitcher.tsx b/packages/frontend-greeting-next/src/app/components/ThemeSwitcher.tsx similarity index 100% rename from packages/frontend-next/src/app/components/ThemeSwitcher.tsx rename to packages/frontend-greeting-next/src/app/components/ThemeSwitcher.tsx diff --git a/packages/frontend-greeting-next/src/app/components/layout/Body.tsx b/packages/frontend-greeting-next/src/app/components/layout/Body.tsx new file mode 100644 index 0000000..8799e9a --- /dev/null +++ b/packages/frontend-greeting-next/src/app/components/layout/Body.tsx @@ -0,0 +1,6 @@ +import { FC, PropsWithChildren } from 'react' + +const Body: FC = ({ children }) => { + return
{children}
+} +export default Body diff --git a/packages/frontend-next/src/app/components/layout/Extra.tsx b/packages/frontend-greeting-next/src/app/components/layout/Extra.tsx similarity index 100% rename from packages/frontend-next/src/app/components/layout/Extra.tsx rename to packages/frontend-greeting-next/src/app/components/layout/Extra.tsx diff --git a/packages/frontend-next/src/app/components/layout/Footer.tsx b/packages/frontend-greeting-next/src/app/components/layout/Footer.tsx similarity index 100% rename from packages/frontend-next/src/app/components/layout/Footer.tsx rename to packages/frontend-greeting-next/src/app/components/layout/Footer.tsx index b59de01..6aad368 100644 --- a/packages/frontend-next/src/app/components/layout/Footer.tsx +++ b/packages/frontend-greeting-next/src/app/components/layout/Footer.tsx @@ -4,7 +4,6 @@ import { useCurrentAccount } from '@mysten/dapp-kit' import { Link } from '@radix-ui/themes' import Faucet from '@suiware/kit/Faucet' import { HeartIcon, SearchIcon } from 'lucide-react' -import ThemeSwitcher from '../ThemeSwitcher' import { CONTRACT_PACKAGE_VARIABLE_NAME, EXPLORER_URL_VARIABLE_NAME, @@ -12,6 +11,7 @@ import { import { packageUrl } from '../../helpers/networks' import { notification } from '../../helpers/notification' import useNetworkConfig from '../../hooks/useNetworkConfig' +import ThemeSwitcher from '../ThemeSwitcher' const Footer = () => { const { useNetworkVariables } = useNetworkConfig() diff --git a/packages/frontend-next/src/app/components/layout/Header.tsx b/packages/frontend-greeting-next/src/app/components/layout/Header.tsx similarity index 100% rename from packages/frontend-next/src/app/components/layout/Header.tsx rename to packages/frontend-greeting-next/src/app/components/layout/Header.tsx diff --git a/packages/frontend-next/src/app/config/main.ts b/packages/frontend-greeting-next/src/app/config/main.ts similarity index 100% rename from packages/frontend-next/src/app/config/main.ts rename to packages/frontend-greeting-next/src/app/config/main.ts diff --git a/packages/frontend-next/src/app/config/networks.ts b/packages/frontend-greeting-next/src/app/config/networks.ts similarity index 100% rename from packages/frontend-next/src/app/config/networks.ts rename to packages/frontend-greeting-next/src/app/config/networks.ts diff --git a/packages/frontend-greeting-next/src/app/config/themes.ts b/packages/frontend-greeting-next/src/app/config/themes.ts new file mode 100644 index 0000000..9471e61 --- /dev/null +++ b/packages/frontend-greeting-next/src/app/config/themes.ts @@ -0,0 +1,120 @@ +// Created with https://sui-dapp-kit-theme-creator.app +// Installation guide https://sdk.mystenlabs.com/dapp-kit/themes + +import type { ThemeVars } from '@mysten/dapp-kit' + +export const lightTheme: ThemeVars = { + blurs: { + modalOverlay: 'blur(0)', + }, + backgroundColors: { + primaryButton: '#F6F7F9', + primaryButtonHover: '#F0F2F5', + outlineButtonHover: '#F0F2F5', + modalOverlay: 'rgba(6, 42, 87, 0.1)', + modalPrimary: '#F6F7F9', + modalSecondary: '#F0F2F5', + iconButton: 'transparent', + iconButtonHover: '#F0F2F5', + dropdownMenu: '#F6F7F9', + dropdownMenuSeparator: '#F0F2F5', + walletItemSelected: '#F6F7F9', + walletItemHover: '#F0F2F5', + }, + borderColors: { + outlineButton: '#F0F2F5', + }, + colors: { + primaryButton: '#062a57', + outlineButton: '#062a57', + iconButton: '#062a57', + body: '#062a57', + bodyMuted: 'rgba(6, 42, 87, 0.7)', + bodyDanger: '#FF794B', + }, + radii: { + small: '6px', + medium: '8px', + large: '12px', + xlarge: '16px', + }, + shadows: { + primaryButton: '0px 4px 12px rgba(246, 247, 249, 0.1)', + walletItemSelected: '0px 2px 6px rgba(246, 247, 249, 0.05)', + }, + fontWeights: { + normal: '400', + medium: '500', + bold: '600', + }, + fontSizes: { + small: '14px', + medium: '16px', + large: '18px', + xlarge: '20px', + }, + typography: { + fontFamily: 'inherit', + fontStyle: 'normal', + lineHeight: '1.3', + letterSpacing: '1', + }, +} + +export const darkTheme: ThemeVars = { + blurs: { + modalOverlay: 'blur(0)', + }, + backgroundColors: { + primaryButton: '#062a57', + primaryButtonHover: '#052246', + outlineButtonHover: '#052246', + modalOverlay: 'rgba(246, 247, 249, 0.1)', + modalPrimary: '#062a57', + modalSecondary: '#052246', + iconButton: 'transparent', + iconButtonHover: '#052246', + dropdownMenu: '#062a57', + dropdownMenuSeparator: '#052246', + walletItemSelected: '#062a57', + walletItemHover: '#052246', + }, + borderColors: { + outlineButton: '#052246', + }, + colors: { + primaryButton: '#F6F7F9', + outlineButton: '#F6F7F9', + iconButton: '#F6F7F9', + body: '#F6F7F9', + bodyMuted: 'rgba(246, 247, 249, 0.7)', + bodyDanger: '#FF794B', + }, + radii: { + small: '6px', + medium: '8px', + large: '12px', + xlarge: '16px', + }, + shadows: { + primaryButton: '0px 4px 12px rgba(6, 42, 87, 0.1)', + walletItemSelected: '0px 2px 6px rgba(6, 42, 87, 0.05)', + }, + fontWeights: { + normal: '400', + medium: '500', + bold: '600', + }, + fontSizes: { + small: '14px', + medium: '16px', + large: '18px', + xlarge: '20px', + }, + typography: { + fontFamily: 'inherit', + fontStyle: 'normal', + lineHeight: '1.3', + letterSpacing: '1', + }, +} diff --git a/packages/frontend-next/src/app/helpers/greeting/misc.ts b/packages/frontend-greeting-next/src/app/helpers/greeting/misc.ts similarity index 100% rename from packages/frontend-next/src/app/helpers/greeting/misc.ts rename to packages/frontend-greeting-next/src/app/helpers/greeting/misc.ts diff --git a/packages/frontend-next/src/app/helpers/greeting/transactions.ts b/packages/frontend-greeting-next/src/app/helpers/greeting/transactions.ts similarity index 100% rename from packages/frontend-next/src/app/helpers/greeting/transactions.ts rename to packages/frontend-greeting-next/src/app/helpers/greeting/transactions.ts diff --git a/packages/frontend-next/src/app/helpers/misc.ts b/packages/frontend-greeting-next/src/app/helpers/misc.ts similarity index 100% rename from packages/frontend-next/src/app/helpers/misc.ts rename to packages/frontend-greeting-next/src/app/helpers/misc.ts diff --git a/packages/frontend-next/src/app/helpers/networks.ts b/packages/frontend-greeting-next/src/app/helpers/networks.ts similarity index 100% rename from packages/frontend-next/src/app/helpers/networks.ts rename to packages/frontend-greeting-next/src/app/helpers/networks.ts diff --git a/packages/frontend-next/src/app/helpers/notification.tsx b/packages/frontend-greeting-next/src/app/helpers/notification.tsx similarity index 100% rename from packages/frontend-next/src/app/helpers/notification.tsx rename to packages/frontend-greeting-next/src/app/helpers/notification.tsx diff --git a/packages/frontend-next/src/app/helpers/theme.ts b/packages/frontend-greeting-next/src/app/helpers/theme.ts similarity index 100% rename from packages/frontend-next/src/app/helpers/theme.ts rename to packages/frontend-greeting-next/src/app/helpers/theme.ts diff --git a/packages/frontend-next/src/app/hooks/useNetworkConfig.tsx b/packages/frontend-greeting-next/src/app/hooks/useNetworkConfig.tsx similarity index 100% rename from packages/frontend-next/src/app/hooks/useNetworkConfig.tsx rename to packages/frontend-greeting-next/src/app/hooks/useNetworkConfig.tsx diff --git a/packages/frontend-next/src/app/hooks/useOwnGreeting.tsx b/packages/frontend-greeting-next/src/app/hooks/useOwnGreeting.tsx similarity index 100% rename from packages/frontend-next/src/app/hooks/useOwnGreeting.tsx rename to packages/frontend-greeting-next/src/app/hooks/useOwnGreeting.tsx diff --git a/packages/frontend-next/src/app/layout.tsx b/packages/frontend-greeting-next/src/app/layout.tsx similarity index 100% rename from packages/frontend-next/src/app/layout.tsx rename to packages/frontend-greeting-next/src/app/layout.tsx diff --git a/packages/frontend-next/src/app/page.tsx b/packages/frontend-greeting-next/src/app/page.tsx similarity index 100% rename from packages/frontend-next/src/app/page.tsx rename to packages/frontend-greeting-next/src/app/page.tsx diff --git a/packages/frontend-next/src/app/providers/ClientProviders.tsx b/packages/frontend-greeting-next/src/app/providers/ClientProviders.tsx similarity index 100% rename from packages/frontend-next/src/app/providers/ClientProviders.tsx rename to packages/frontend-greeting-next/src/app/providers/ClientProviders.tsx diff --git a/packages/frontend-greeting-next/src/app/providers/ThemeProvider.tsx b/packages/frontend-greeting-next/src/app/providers/ThemeProvider.tsx new file mode 100644 index 0000000..ec6b79b --- /dev/null +++ b/packages/frontend-greeting-next/src/app/providers/ThemeProvider.tsx @@ -0,0 +1,12 @@ +import { Theme } from '@radix-ui/themes' +import { FC, PropsWithChildren } from 'react' + +const ThemeProvider: FC = ({ children }) => { + return ( + + {children} + + ) +} + +export default ThemeProvider diff --git a/packages/frontend-greeting-next/src/app/styles/index.css b/packages/frontend-greeting-next/src/app/styles/index.css new file mode 100644 index 0000000..9d089fb --- /dev/null +++ b/packages/frontend-greeting-next/src/app/styles/index.css @@ -0,0 +1,42 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --sds-light: #ffffffde; + --sds-dark: #011631; + --sds-pink: #fed5f4; + --sds-blue: #4da2ff; + --sds-font-inter: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + + color-scheme: light dark; + + font-family: var(--sds-font-inter); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body, #root { + display: flex; + flex-direction: column; + justify-content:center; + align-items:center; + min-width: 100%; + min-height: 100vh; +} + +/* Custom styles where it's not possible to use Tailwind classes. */ +.sds-connect-button-container { + button { + padding: 8px 16px !important; + border-radius: 8px !important; + } + div { + font-size: 16px !important; + line-height: 24px !important; + font-family: inherit !important; + } +} +/* ~ Custom styles where it's not possible to use Tailwind classes. */ diff --git a/packages/frontend-greeting-next/src/app/types/ENetwork.ts b/packages/frontend-greeting-next/src/app/types/ENetwork.ts new file mode 100644 index 0000000..9f8bed1 --- /dev/null +++ b/packages/frontend-greeting-next/src/app/types/ENetwork.ts @@ -0,0 +1,6 @@ +export enum ENetwork { + LOCALNET = 'localnet', + DEVNET = 'devnet', + TESTNET = 'testnet', + MAINNET = 'mainnet', +} diff --git a/packages/frontend-greeting-next/src/app/types/ENetworksWithFaucet.ts b/packages/frontend-greeting-next/src/app/types/ENetworksWithFaucet.ts new file mode 100644 index 0000000..c6da541 --- /dev/null +++ b/packages/frontend-greeting-next/src/app/types/ENetworksWithFaucet.ts @@ -0,0 +1 @@ +export type ENetworksWithFaucet = 'localnet' | 'devnet' | 'testnet' diff --git a/packages/frontend-next/src/app/types/IGreeting.ts b/packages/frontend-greeting-next/src/app/types/IGreeting.ts similarity index 100% rename from packages/frontend-next/src/app/types/IGreeting.ts rename to packages/frontend-greeting-next/src/app/types/IGreeting.ts diff --git a/packages/frontend-greeting-next/src/app/types/TTheme.ts b/packages/frontend-greeting-next/src/app/types/TTheme.ts new file mode 100644 index 0000000..e6755dd --- /dev/null +++ b/packages/frontend-greeting-next/src/app/types/TTheme.ts @@ -0,0 +1 @@ +export type TTheme = 'dark' | 'light' diff --git a/packages/frontend-next/tailwind.config.ts b/packages/frontend-greeting-next/tailwind.config.ts similarity index 100% rename from packages/frontend-next/tailwind.config.ts rename to packages/frontend-greeting-next/tailwind.config.ts diff --git a/packages/frontend-next/tsconfig.json b/packages/frontend-greeting-next/tsconfig.json similarity index 100% rename from packages/frontend-next/tsconfig.json rename to packages/frontend-greeting-next/tsconfig.json diff --git a/packages/frontend-greeting-next/walrus-sites.yaml b/packages/frontend-greeting-next/walrus-sites.yaml new file mode 100644 index 0000000..80f3ea1 --- /dev/null +++ b/packages/frontend-greeting-next/walrus-sites.yaml @@ -0,0 +1,9 @@ +# module: site +# portal: walrus.site +package: 0xdf9033cac39b7a9b9f76fb6896c9fc5283ba730d6976a2b1d85ad1e6036c3272 +# general: +# rpc_url: https://fullnode.testnet.sui.io:443 +# wallet: /path/to/.sui/sui_config/client.yaml +# walrus_binary: /path/to/walrus +# walrus_config: /path/to/devnet_deployment/client_config.yaml +# gas_budget: 500000000 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e0ca62..65a8766 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,15 @@ importers: specifier: ^2.4.0 version: 2.4.0 + packages/backend-counter: + devDependencies: + env-file-rw: + specifier: ^1.0.0 + version: 1.0.0 + sui-explorer-local: + specifier: ^2.4.0 + version: 2.4.0 + packages/frontend: dependencies: '@mysten/dapp-kit': @@ -120,7 +129,113 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.7.0)) - packages/frontend-next: + packages/frontend-counter-react: + dependencies: + '@mysten/dapp-kit': + specifier: ^0.14.47 + version: 0.14.47(@tanstack/react-query@5.64.2(react@19.0.0))(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@mysten/sui': + specifier: ^1.20.0 + version: 1.20.0(typescript@5.7.3) + '@mysten/wallet-standard': + specifier: ^0.13.23 + version: 0.13.23(typescript@5.7.3) + '@radix-ui/react-select': + specifier: ^2.1.4 + version: 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toggle': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/themes': + specifier: ^3.1.6 + version: 3.1.6(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@suiware/kit': + specifier: ^0.7.0 + version: 0.7.0(@mysten/dapp-kit@0.14.47(@tanstack/react-query@5.64.2(react@19.0.0))(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@mysten/sui@1.20.0(typescript@5.7.3))(@mysten/suins@0.4.2(typescript@5.7.3))(@mysten/wallet-standard@0.13.23(typescript@5.7.3))(@tanstack/react-query@5.64.2(react@19.0.0))(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-query': + specifier: ^5.64.2 + version: 5.64.2(react@19.0.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.473.0 + version: 0.473.0(react@19.0.0) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-hot-toast: + specifier: ^2.5.1 + version: 2.5.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-router: + specifier: ^7.1.3 + version: 7.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-use: + specifier: ^17.6.0 + version: 17.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + devDependencies: + '@types/node': + specifier: ^22.10.7 + version: 22.10.7 + '@types/react': + specifier: ^19.0.7 + version: 19.0.7 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.7) + '@typescript-eslint/eslint-plugin': + specifier: ^8.20.0 + version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^8.20.0 + version: 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@vitejs/plugin-react-swc': + specifier: ^3.7.2 + version: 3.7.2(@swc/helpers@0.5.15)(vite@6.0.9(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.7.0)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.1) + env-file-rw: + specifier: ^1.0.0 + version: 1.0.0 + eslint: + specifier: ^9.18.0 + version: 9.18.0(jiti@1.21.7) + eslint-config-prettier: + specifier: ^10.0.1 + version: 10.0.1(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-react-hooks: + specifier: ^5.1.0 + version: 5.1.0(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-react-refresh: + specifier: ^0.4.18 + version: 0.4.18(eslint@9.18.0(jiti@1.21.7)) + postcss: + specifier: ^8.5.1 + version: 8.5.1 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.10 + version: 0.6.10(prettier@3.4.2) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + typescript: + specifier: ^5.7.3 + version: 5.7.3 + vite: + specifier: ^6.0.9 + version: 6.0.9(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.7.0) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.7.0)) + + packages/frontend-greeting-next: dependencies: '@mysten/dapp-kit': specifier: ^0.14.47 @@ -765,6 +880,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-accordion@1.2.2': + resolution: {integrity: sha512-b1oh54x4DMCdGsB4/7ahiSrViXxaBwRPotiZNnYXjLha9vfuURSAZErki6qjDoSIV0eXx5v57XnTGVtGwnfp2g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-alert-dialog@1.1.4': resolution: {integrity: sha512-A6Kh23qZDLy3PSU4bh2UJZznOrUdHImIXqF8YtUa6CN73f8EOO9XlXSCd9IHyPvIquTaa/kwaSWzZTtUvgXVGw==} peerDependencies: @@ -778,6 +906,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-alert-dialog@1.1.5': + resolution: {integrity: sha512-1Y2sI17QzSZP58RjGtrklfSGIf3AF7U/HkD3aAcAnhOUJrm7+7GG1wRDFaUlSe0nW5B/t4mYd/+7RNbP2Wexug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-arrow@1.1.1': resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} peerDependencies: @@ -830,6 +971,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collapsible@1.1.2': + resolution: {integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collection@1.1.1': resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} peerDependencies: @@ -865,6 +1019,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-context-menu@2.2.5': + resolution: {integrity: sha512-MY5PFCwo/ICaaQtpQBQ0g19AyjzI0mhz+a2GUWA2pJf4XFkvglAdcgDV2Iqm+lLbXn8hb+6rbLgcmRtc6ImPvg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-context@1.1.1': resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} peerDependencies: @@ -887,6 +1054,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dialog@1.1.5': + resolution: {integrity: sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-direction@1.1.0': resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} peerDependencies: @@ -909,6 +1089,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.4': + resolution: {integrity: sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-dropdown-menu@2.1.4': resolution: {integrity: sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==} peerDependencies: @@ -922,6 +1115,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dropdown-menu@2.1.5': + resolution: {integrity: sha512-50ZmEFL1kOuLalPKHrLWvPFMons2fGx9TqQCWlPwDVpbAnaUJ1g4XNcKqFNMQymYU0kKWR4MDDi+9vUQBGFgcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.1.1': resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} peerDependencies: @@ -944,6 +1150,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-form@0.1.1': + resolution: {integrity: sha512-Ah2TBvzl2trb4DL9DQtyUJgAUfq/djMN7j5CHzdpbdR3W7OL8N4JcJgE80cXMf3ssCE+8yg0zFQoJ0srxqfsFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-hover-card@1.1.4': resolution: {integrity: sha512-QSUUnRA3PQ2UhvoCv3eYvMnCAgGQW+sTu86QPuNb+ZMi+ZENd6UWpiXbcWDQ4AEaKF9KKpCHBeaJz9Rw6lRlaQ==} peerDependencies: @@ -957,6 +1176,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-hover-card@1.1.5': + resolution: {integrity: sha512-0jPlX3ZrUIhtMAY0m1SBn1koI4Yqsizq2UwdUiQF1GseSZLZBPa6b8tNS+m32K94Yb4wxtWFSQs85wujQvwahg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-id@1.1.0': resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} peerDependencies: @@ -966,6 +1198,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-label@2.1.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-menu@2.1.4': resolution: {integrity: sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==} peerDependencies: @@ -979,6 +1224,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-menu@2.1.5': + resolution: {integrity: sha512-uH+3w5heoMJtqVCgYOtYVMECk1TOrkUn0OG0p5MqXC0W2ppcuVeESbou8PTHoqAjbdTEK19AGXBWcEtR5WpEQg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.5': + resolution: {integrity: sha512-Kzbpcf2bxUmI/G+949+LvSvGkyzIaY7ctb8loydt6YpJR8pQF+j4QbVhYvjs7qxaWK0DEJL3XbP2p46YPRkS3A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-navigation-menu@1.2.3': resolution: {integrity: sha512-IQWAsQ7dsLIYDrn0WqPU+cdM7MONTv9nqrLVYoie3BPiabSfUVDe6Fr+oEt0Cofsr9ONDcDe9xhmJbL1Uq1yKg==} peerDependencies: @@ -992,6 +1263,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-navigation-menu@1.2.4': + resolution: {integrity: sha512-wUi01RrTDTOoGtjEPHsxlzPtVzVc3R/AZ5wfh0dyqMAqolhHAHvG5iQjBCTi2AjQqa77FWWbA3kE3RkD+bDMgQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-popover@1.1.4': resolution: {integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==} peerDependencies: @@ -1005,6 +1289,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popover@1.1.5': + resolution: {integrity: sha512-YXkTAftOIW2Bt3qKH8vYr6n9gCkVrvyvfiTObVjoHVTHnNj26rmvO87IKa3VgtgCjb8FAQ6qOjNViwl+9iIzlg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-popper@1.2.1': resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} peerDependencies: @@ -1122,6 +1419,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-select@2.1.5': + resolution: {integrity: sha512-eVV7N8jBXAXnyrc+PsOF89O9AfVgGnbLxUtBb0clJ8y8ENMWLARGMI/1/SBRLz7u4HqxLgN71BJ17eono3wcjA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.1': + resolution: {integrity: sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slider@1.2.2': resolution: {integrity: sha512-sNlU06ii1/ZcbHf8I9En54ZPW0Vil/yPVg4vQMcFNjrIx51jsHbFl1HYHQvCIWJSr1q0ZmA+iIs/ZTv8h7HHSA==} peerDependencies: @@ -1170,6 +1493,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-toast@1.2.5': + resolution: {integrity: sha512-ZzUsAaOx8NdXZZKcFNDhbSlbsCUy8qQWmzTdgrlrhhZAOx2ofLtKrBDW9fkqhFvXgmtv560Uj16pkLkqML7SHA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-toggle-group@1.1.1': resolution: {integrity: sha512-OgDLZEA30Ylyz8YSXvnGqIHtERqnUt1KUYTKdw/y8u7Ci6zGiJfXc02jahmcSNK3YcErqioj/9flWC9S1ihfwg==} peerDependencies: @@ -1196,6 +1532,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-toolbar@1.1.1': + resolution: {integrity: sha512-r7T80WOCHc2n3KRzFCbHWGVzkfVTCzDofGU4gqa5ZuIzgnVaLogGsdyifFJXWQDp0lAr5hrf+X9uqQdE0pa6Ww==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-tooltip@1.1.6': resolution: {integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==} peerDependencies: @@ -1209,6 +1558,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-tooltip@1.1.7': + resolution: {integrity: sha512-ss0s80BC0+g0+Zc53MvilcnTYSOi4mSuFWBPYPuTOFGjx+pUU+ZrmamMNwS56t8MTFlniA5ocjd4jYm/CdhbOg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -1301,6 +1663,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/themes@3.2.0': + resolution: {integrity: sha512-cG/47tfHN9FW1ZoAigd3oUeJaIm591vGtQ97PrhfwS22IJgWhE5h6D0w2m+NVbKRVo8qIWCG+hiWN04MlLoW4A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: 16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: 16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@rollup/rollup-android-arm-eabi@4.31.0': resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} cpu: [arm] @@ -1428,6 +1803,16 @@ packages: '@tanstack/react-query': ^5.62.15 react: ^19.0.0 + '@suiware/kit@0.7.0': + resolution: {integrity: sha512-j+ct7LcImyMwQCWxobsiSYScs/qOmhe+sKBpV+PaHmBFlQC5YZUvIJ6I3gOW0ei5ui+tqHOmdGJwpNimqJ00PA==} + peerDependencies: + '@mysten/dapp-kit': ^0.14.44 + '@mysten/sui': ^1.18.0 + '@mysten/suins': ^0.4.2 + '@mysten/wallet-standard': ^0.13.20 + '@tanstack/react-query': ^5.62.15 + react: ^19.0.0 + '@swc/core-darwin-arm64@1.10.8': resolution: {integrity: sha512-FtacTu9zS5YuepujQqujveNw8BQ8ESJ+pN1Z7C+WrKCHlCl+5dh0n6gMAlEj+3iRvY6UAYqkzTVeiX/bOMoJKA==} engines: {node: '>=10'} @@ -1517,6 +1902,9 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1899,6 +2287,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -3107,6 +3499,19 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix-ui@1.1.2: + resolution: {integrity: sha512-P2F30iTIG/eheoZbF3QXo7kDoFgnj/zxX1NwPq02G00ggq7OSXFsMuyn98WHtQCql2DsO8ZCbBk+VbbgVrlwOg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: @@ -3142,6 +3547,16 @@ packages: '@types/react': optional: true + react-router@7.1.3: + resolution: {integrity: sha512-EezYymLY6Guk/zLQ2vRA8WvdUhWFEj5fcE3RfWihhxXBW7+cd1LsIiA3lmx+KCmneAGQuyBv820o44L2+TtkSA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + react-style-singleton@2.2.3: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} @@ -3273,6 +3688,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3527,6 +3945,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + turbo-stream@2.4.0: + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} + tv4@1.3.0: resolution: {integrity: sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==} engines: {node: '>= 0.8.0'} @@ -4218,6 +4639,23 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-accordion@1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collapsible': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-alert-dialog@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4232,6 +4670,20 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-alert-dialog@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dialog': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -4278,6 +4730,22 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-collapsible@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) @@ -4310,6 +4778,20 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-context-menu@2.2.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-menu': 2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-context@1.1.1(@types/react@19.0.7)(react@19.0.0)': dependencies: react: 19.0.0 @@ -4338,6 +4820,28 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-dialog@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-direction@1.1.0(@types/react@19.0.7)(react@19.0.0)': dependencies: react: 19.0.0 @@ -4349,21 +4853,114 @@ snapshots: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-dropdown-menu@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-menu': 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-dropdown-menu@2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-menu': 2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.7)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.7 + + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-form@0.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-label': 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-hover-card@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) - '@radix-ui/react-dropdown-menu@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-hover-card@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-menu': 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) react: 19.0.0 @@ -4372,55 +4969,56 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.0.7)(react@19.0.0)': dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) react: 19.0.0 optionalDependencies: '@types/react': 19.0.7 - '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) - '@radix-ui/react-hover-card@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-menu@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + aria-hidden: 1.2.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0) optionalDependencies: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) - '@radix-ui/react-id@1.1.0(@types/react@19.0.7)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.7 - - '@radix-ui/react-menu@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-menu@2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) @@ -4439,6 +5037,24 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-menubar@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-menu': 2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-navigation-menu@1.2.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4461,6 +5077,28 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-navigation-menu@1.2.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-popover@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4484,6 +5122,29 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-popover@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -4622,6 +5283,44 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-select@2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + + '@radix-ui/react-separator@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-slider@1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 @@ -4679,6 +5378,26 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-toast@1.2.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-toggle-group@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4705,6 +5424,21 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-toolbar@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-separator': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toggle-group': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-tooltip@1.1.6(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4725,6 +5459,26 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-tooltip@1.1.7(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.7)(react@19.0.0)': dependencies: react: 19.0.0 @@ -4824,6 +5578,18 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@radix-ui/themes@3.2.0(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/colors': 3.0.0 + classnames: 2.5.1 + radix-ui: 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.0.7)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@rollup/rollup-android-arm-eabi@4.31.0': optional: true @@ -4919,6 +5685,23 @@ snapshots: - '@types/react-dom' - react-dom + '@suiware/kit@0.7.0(@mysten/dapp-kit@0.14.47(@tanstack/react-query@5.64.2(react@19.0.0))(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@mysten/sui@1.20.0(typescript@5.7.3))(@mysten/suins@0.4.2(typescript@5.7.3))(@mysten/wallet-standard@0.13.23(typescript@5.7.3))(@tanstack/react-query@5.64.2(react@19.0.0))(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@mysten/dapp-kit': 0.14.47(@tanstack/react-query@5.64.2(react@19.0.0))(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@mysten/sui': 1.20.0(typescript@5.7.3) + '@mysten/suins': 0.4.2(typescript@5.7.3) + '@mysten/wallet-standard': 0.13.23(typescript@5.7.3) + '@radix-ui/themes': 3.2.0(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-query': 5.64.2(react@19.0.0) + bignumber.js: 9.1.2 + lodash.debounce: 4.0.8 + lucide-react: 0.469.0(react@19.0.0) + react: 19.0.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + '@swc/core-darwin-arm64@1.10.8': optional: true @@ -4985,6 +5768,8 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} + '@types/cookie@0.6.0': {} + '@types/estree@1.0.6': {} '@types/js-cookie@2.2.7': {} @@ -5420,6 +6205,8 @@ snapshots: concat-map@0.0.1: {} + cookie@1.0.2: {} + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 @@ -6779,6 +7566,64 @@ snapshots: queue-microtask@1.2.3: {} + radix-ui@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-accessible-icon': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-accordion': 1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-alert-dialog': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-aspect-ratio': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-avatar': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-checkbox': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collapsible': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-context-menu': 2.2.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dialog': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dropdown-menu': 2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-form': 0.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-hover-card': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-label': 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-menu': 2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-menubar': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-navigation-menu': 1.2.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-popover': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-progress': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-radio-group': 1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-scroll-area': 1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-select': 2.1.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-separator': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slider': 1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-switch': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-tabs': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toast': 1.2.5(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toggle': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toggle-group': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toolbar': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-tooltip': 1.1.7(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.7 + '@types/react-dom': 19.0.3(@types/react@19.0.7) + react-dom@19.0.0(react@19.0.0): dependencies: react: 19.0.0 @@ -6812,6 +7657,16 @@ snapshots: optionalDependencies: '@types/react': 19.0.7 + react-router@7.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@types/cookie': 0.6.0 + cookie: 1.0.2 + react: 19.0.0 + set-cookie-parser: 2.7.1 + turbo-stream: 2.4.0 + optionalDependencies: + react-dom: 19.0.0(react@19.0.0) + react-style-singleton@2.2.3(@types/react@19.0.7)(react@19.0.0): dependencies: get-nonce: 1.0.1 @@ -6980,6 +7835,8 @@ snapshots: semver@7.6.3: {} + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -7305,6 +8162,8 @@ snapshots: tslib@2.8.1: {} + turbo-stream@2.4.0: {} + tv4@1.3.0: {} tx2@1.0.5: