From 226d8956d8ee4ead976f5b4a7bcce3685a6ec05a Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 10:32:49 +0530 Subject: [PATCH 01/16] add basic todo --- TODO.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 TODO.md diff --git a/TODO.md b/TODO.md new file mode 100644 index 000000000..13877a65f --- /dev/null +++ b/TODO.md @@ -0,0 +1,13 @@ +- [ ] Get basic configuration working +- [ ] Update pages + - [ ] Header/footer + - [ ] Home + - [ ] Debug (can be broken down into subtask) + - [ ] Blockexplorer (can be broken down into subtask) +- [ ] Migrate all the main components + - [ ] Address + - [ ] AddressInput (this will require updating InputBase etc) + - [ ] Balance +- [ ] Update meta things like + - [ ] transaction toast with shadcn toast + - [ ] modals From a69c0e4fbfff721ef542f3a927b3e6e3701486f0 Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 10:53:01 +0530 Subject: [PATCH 02/16] up tailwind --- packages/nextjs/package.json | 6 +- packages/nextjs/styles/globals.css | 6 +- yarn.lock | 134 ++++++++++++++++++++--------- 3 files changed, 97 insertions(+), 49 deletions(-) diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index f79c69388..50a951d2a 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -44,14 +44,14 @@ "@types/react-copy-to-clipboard": "^5.0.4", "@typescript-eslint/eslint-plugin": "^5.39.0", "abitype": "1.0.6", - "autoprefixer": "^10.4.12", + "autoprefixer": "^10.4.20", "eslint": "^8.15.0", "eslint-config-next": "^14.0.4", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", - "postcss": "^8.4.16", + "postcss": "^8.4.47", "prettier": "^2.8.4", - "tailwindcss": "^3.4.3", + "tailwindcss": "^3.4.11", "type-fest": "^4.6.0", "typescript": "5.5.3", "vercel": "^32.4.1" diff --git a/packages/nextjs/styles/globals.css b/packages/nextjs/styles/globals.css index 3fb55aecf..ca0863acc 100644 --- a/packages/nextjs/styles/globals.css +++ b/packages/nextjs/styles/globals.css @@ -1,6 +1,6 @@ -@import "tailwindcss/base"; -@import "tailwindcss/components"; -@import "tailwindcss/utilities"; +@tailwind base; +@tailwind components; +@tailwind utilities; :root, [data-theme] { diff --git a/yarn.lock b/yarn.lock index 64f91e41a..c248c6ede 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2236,7 +2236,7 @@ __metadata: "@uniswap/sdk-core": ^4.0.1 "@uniswap/v2-sdk": ^3.0.1 abitype: 1.0.6 - autoprefixer: ^10.4.12 + autoprefixer: ^10.4.20 blo: ^1.0.1 burner-connector: ^0.0.8 daisyui: 4.5.0 @@ -2247,14 +2247,14 @@ __metadata: next: ^14.0.4 next-themes: ^0.2.1 nprogress: ^0.2.0 - postcss: ^8.4.16 + postcss: ^8.4.47 prettier: ^2.8.4 qrcode.react: ^3.1.0 react: ^18.2.0 react-copy-to-clipboard: ^5.1.0 react-dom: ^18.2.0 react-hot-toast: ^2.4.0 - tailwindcss: ^3.4.3 + tailwindcss: ^3.4.11 type-fest: ^4.6.0 typescript: 5.5.3 use-debounce: ^8.0.4 @@ -4555,21 +4555,21 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.12": - version: 10.4.16 - resolution: "autoprefixer@npm:10.4.16" +"autoprefixer@npm:^10.4.20": + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" dependencies: - browserslist: ^4.21.10 - caniuse-lite: ^1.0.30001538 - fraction.js: ^4.3.6 + browserslist: ^4.23.3 + caniuse-lite: ^1.0.30001646 + fraction.js: ^4.3.7 normalize-range: ^0.1.2 - picocolors: ^1.0.0 + picocolors: ^1.0.1 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 45fad7086495048dacb14bb7b00313e70e135b5d8e8751dcc60548889400763705ab16fc2d99ea628b44c3472698fb0e39598f595ba28409c965ab159035afde + checksum: 187cec2ec356631932b212f76dc64f4419c117fdb2fb9eeeb40867d38ba5ca5ba734e6ceefc9e3af4eec8258e60accdf5cbf2b7708798598fde35cdc3de562d6 languageName: node linkType: hard @@ -4798,17 +4798,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.10": - version: 4.22.0 - resolution: "browserslist@npm:4.22.0" +"browserslist@npm:^4.23.3": + version: 4.23.3 + resolution: "browserslist@npm:4.23.3" dependencies: - caniuse-lite: ^1.0.30001539 - electron-to-chromium: ^1.4.530 - node-releases: ^2.0.13 - update-browserslist-db: ^1.0.13 + caniuse-lite: ^1.0.30001646 + electron-to-chromium: ^1.5.4 + node-releases: ^2.0.18 + update-browserslist-db: ^1.1.0 bin: browserslist: cli.js - checksum: 14fc119bbfb85b65e2ee4a82205fabf9327520d010c4c586f1176ceaf9136cfdb391397045a4eafaa9defe52b6dbdf875916714695826c69091a936d5838f9ec + checksum: 7906064f9970aeb941310b2fcb8b4ace4a1b50aa657c986677c6f1553a8cabcc94ee9c5922f715baffbedaa0e6cf0831b6fed7b059dde6873a4bfadcbe069c7e languageName: node linkType: hard @@ -4965,13 +4965,20 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001406, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001539": +"caniuse-lite@npm:^1.0.30001406": version: 1.0.30001540 resolution: "caniuse-lite@npm:1.0.30001540" checksum: 95b9203a85ad0187a2480c341bfff6f32d61b9eb9cc323d2942025cd29fbe3f9c3dd056646996d303a0a42c968954f32994f97250e931b2ea5b9531099d6ba2d languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001646": + version: 1.0.30001660 + resolution: "caniuse-lite@npm:1.0.30001660" + checksum: 8b2c5de2f5facd31980426afbba68238270984acfe8c1ae925b8b6480448eea2fae292f815674617e9170c730c8a238d7cc0db919f184dc0e3cd9bec18f5e5ad + languageName: node + linkType: hard + "case@npm:^1.6.3": version: 1.6.3 resolution: "case@npm:1.6.3" @@ -6069,10 +6076,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.530": - version: 1.4.531 - resolution: "electron-to-chromium@npm:1.4.531" - checksum: a9e21d767ea6705ce2374d8e2a75b975271a9f1ce0eb9eda36c85783fbd5af6b10f9d56469f4ff313202631db5c27f24b9730149e32c01eca7a65d497c1c1df4 +"electron-to-chromium@npm:^1.5.4": + version: 1.5.23 + resolution: "electron-to-chromium@npm:1.5.23" + checksum: bc80f540120ffcc762caa199fb79fafb83aad97b2548e89222e61b31e7b7c58b7b10755b495d5ab3a245972a8790b4786ce9c1e2210e49a1231e012c42d44f73 languageName: node linkType: hard @@ -6549,6 +6556,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.1.2": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + "escape-string-regexp@npm:1.0.5, escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" @@ -7634,10 +7648,10 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.3.6": - version: 4.3.6 - resolution: "fraction.js@npm:4.3.6" - checksum: e96ae77e64ebfd442d3a5a01a3f0637b0663fc2440bcf2841b3ad9341ba24c81fb2e3e7142e43ef7d088558c6b3f8609df135b201adc7a1c674aea6a71384162 +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f languageName: node linkType: hard @@ -10532,6 +10546,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + languageName: node + linkType: hard + "napi-macros@npm:^2.2.2": version: 2.2.2 resolution: "napi-macros@npm:2.2.2" @@ -10775,10 +10798,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.13": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 languageName: node linkType: hard @@ -11424,6 +11447,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.0.7, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -11619,7 +11649,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.16, postcss@npm:^8.4.23": +"postcss@npm:^8.4.23": version: 8.4.30 resolution: "postcss@npm:8.4.30" dependencies: @@ -11630,6 +11660,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.47": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: ^3.3.7 + picocolors: ^1.1.0 + source-map-js: ^1.2.1 + checksum: f78440a9d8f97431dd2ab1ab8e1de64f12f3eff38a3d8d4a33919b96c381046a314658d2de213a5fa5eb296b656de76a3ec269fdea27f16d5ab465b916a0f52c + languageName: node + linkType: hard + "preact@npm:^10.16.0": version: 10.19.3 resolution: "preact@npm:10.19.3" @@ -12951,6 +12992,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b + languageName: node + linkType: hard + "source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -13477,9 +13525,9 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:^3.4.3": - version: 3.4.3 - resolution: "tailwindcss@npm:3.4.3" +"tailwindcss@npm:^3.4.11": + version: 3.4.11 + resolution: "tailwindcss@npm:3.4.11" dependencies: "@alloc/quick-lru": ^5.2.0 arg: ^5.0.2 @@ -13506,7 +13554,7 @@ __metadata: bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 7d181a6aafb520c5760d23d0a199444a324dfa36538edd31934daa253ed9a7ac4bde18c4205aaa89c1269bc2ff11781efda04d2e27ded535a9a2547667a344b1 + checksum: 41d7ff8e4d7b8e2df925853b0eb43efa25459462fea29dce0be14fdf32370445c403a2f512e3357ecd800c30ad813dc01ef1ca592fe3c90a2a84d0a1b71e2ba6 languageName: node linkType: hard @@ -14293,17 +14341,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.1.0": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 + escalade: ^3.1.2 + picocolors: ^1.0.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562 languageName: node linkType: hard From 293f134876eb5138baee53758b96693811db800d Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 10:57:11 +0530 Subject: [PATCH 03/16] tweak todo + add comments to tailwind configs files --- TODO.md | 1 + packages/nextjs/styles/globals.css | 2 ++ packages/nextjs/tailwind.config.js | 1 + 3 files changed, 4 insertions(+) diff --git a/TODO.md b/TODO.md index 13877a65f..833c86be8 100644 --- a/TODO.md +++ b/TODO.md @@ -9,5 +9,6 @@ - [ ] AddressInput (this will require updating InputBase etc) - [ ] Balance - [ ] Update meta things like + - [ ] Remove heroicons and use lucide react(comes default with shadcn) - [ ] transaction toast with shadcn toast - [ ] modals diff --git a/packages/nextjs/styles/globals.css b/packages/nextjs/styles/globals.css index ca0863acc..984eac47e 100644 --- a/packages/nextjs/styles/globals.css +++ b/packages/nextjs/styles/globals.css @@ -2,6 +2,7 @@ @tailwind components; @tailwind utilities; +/* Remove this defaults */ :root, [data-theme] { background: oklch(var(--b2)); @@ -30,3 +31,4 @@ p { .btn.btn-ghost { @apply shadow-none; } +/* Remove this defaults */ diff --git a/packages/nextjs/tailwind.config.js b/packages/nextjs/tailwind.config.js index 9099dc5f4..90519d242 100644 --- a/packages/nextjs/tailwind.config.js +++ b/packages/nextjs/tailwind.config.js @@ -74,6 +74,7 @@ module.exports = { }, ], }, + // remove this defaults theme: { extend: { boxShadow: { From ca89ea8c56b67a3f97eaf8800454906f32b38afd Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 14:03:05 +0530 Subject: [PATCH 04/16] init shadcn --- packages/nextjs/components.json | 20 ++++++++++ packages/nextjs/package.json | 6 +++ packages/nextjs/styles/globals.css | 63 ++++++++++++++++++++++++++++++ packages/nextjs/tailwind.config.js | 53 ++++++++++++++++++++++++- packages/nextjs/~/lib/utils.ts | 6 +++ yarn.lock | 63 ++++++++++++++++++++++++++++++ 6 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 packages/nextjs/components.json create mode 100644 packages/nextjs/~/lib/utils.ts diff --git a/packages/nextjs/components.json b/packages/nextjs/components.json new file mode 100644 index 000000000..cbd37c4ca --- /dev/null +++ b/packages/nextjs/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "styles/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "~/components", + "utils": "~/lib/utils", + "ui": "~/components/ui", + "lib": "~/lib", + "hooks": "~/hooks" + } +} \ No newline at end of file diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 50a951d2a..a92da87a1 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -15,13 +15,17 @@ }, "dependencies": { "@heroicons/react": "^2.0.11", + "@radix-ui/react-icons": "^1.3.0", "@rainbow-me/rainbowkit": "2.1.5", "@tanstack/react-query": "^5.28.6", "@uniswap/sdk-core": "^4.0.1", "@uniswap/v2-sdk": "^3.0.1", "blo": "^1.0.1", "burner-connector": "^0.0.8", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", "daisyui": "4.5.0", + "lucide-react": "^0.441.0", "next": "^14.0.4", "next-themes": "^0.2.1", "nprogress": "^0.2.0", @@ -30,6 +34,8 @@ "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.2.0", "react-hot-toast": "^2.4.0", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", "use-debounce": "^8.0.4", "usehooks-ts": "^2.13.0", "viem": "2.21.2", diff --git a/packages/nextjs/styles/globals.css b/packages/nextjs/styles/globals.css index 984eac47e..46b189f6e 100644 --- a/packages/nextjs/styles/globals.css +++ b/packages/nextjs/styles/globals.css @@ -32,3 +32,66 @@ p { @apply shadow-none; } /* Remove this defaults */ +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 240 10% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 240 10% 3.9%; + --foreground: 0 0% 98%; + --card: 240 10% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 240 10% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + --muted: 240 3.7% 15.9%; + --muted-foreground: 240 5% 64.9%; + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 240 4.9% 83.9%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/packages/nextjs/tailwind.config.js b/packages/nextjs/tailwind.config.js index 90519d242..34403edd2 100644 --- a/packages/nextjs/tailwind.config.js +++ b/packages/nextjs/tailwind.config.js @@ -1,9 +1,9 @@ /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./app/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}", "./utils/**/*.{js,ts,jsx,tsx}"], - plugins: [require("daisyui")], + plugins: [require("daisyui"), require("tailwindcss-animate")], darkTheme: "dark", - darkMode: ["selector", "[data-theme='dark']"], + darkMode: ["selector", "[data-theme='dark']", "class"], // DaisyUI theme colors daisyui: { themes: [ @@ -77,12 +77,61 @@ module.exports = { // remove this defaults theme: { extend: { + // TODO: Remove default boxShadow: { center: "0 0 12px -2px rgb(0 0 0 / 0.05)", }, animation: { "pulse-fast": "pulse 1s cubic-bezier(0.4, 0, 0.6, 1) infinite", }, + // ShadCN added this + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + colors: { + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + chart: { + 1: "hsl(var(--chart-1))", + 2: "hsl(var(--chart-2))", + 3: "hsl(var(--chart-3))", + 4: "hsl(var(--chart-4))", + 5: "hsl(var(--chart-5))", + }, + }, }, }, }; diff --git a/packages/nextjs/~/lib/utils.ts b/packages/nextjs/~/lib/utils.ts new file mode 100644 index 000000000..365058ceb --- /dev/null +++ b/packages/nextjs/~/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/yarn.lock b/yarn.lock index c248c6ede..a01be8db8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1992,6 +1992,15 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-icons@npm:^1.3.0": + version: 1.3.0 + resolution: "@radix-ui/react-icons@npm:1.3.0" + peerDependencies: + react: ^16.x || ^17.x || ^18.x + checksum: 982f3ee2271eaaa12b944506ef7701d20fad847082592d99b393b66a2ebbd4cc89e3a0ba48146ed8801418a7bfd76cd55901dc5cb7c6ef404001e7e4c73d05f6 + languageName: node + linkType: hard + "@rainbow-me/rainbowkit@npm:2.1.0": version: 2.1.0 resolution: "@rainbow-me/rainbowkit@npm:2.1.0" @@ -2225,6 +2234,7 @@ __metadata: resolution: "@se-2/nextjs@workspace:packages/nextjs" dependencies: "@heroicons/react": ^2.0.11 + "@radix-ui/react-icons": ^1.3.0 "@rainbow-me/rainbowkit": 2.1.5 "@tanstack/react-query": ^5.28.6 "@trivago/prettier-plugin-sort-imports": ^4.1.1 @@ -2239,11 +2249,14 @@ __metadata: autoprefixer: ^10.4.20 blo: ^1.0.1 burner-connector: ^0.0.8 + class-variance-authority: ^0.7.0 + clsx: ^2.1.1 daisyui: 4.5.0 eslint: ^8.15.0 eslint-config-next: ^14.0.4 eslint-config-prettier: ^8.5.0 eslint-plugin-prettier: ^4.2.1 + lucide-react: ^0.441.0 next: ^14.0.4 next-themes: ^0.2.1 nprogress: ^0.2.0 @@ -2254,7 +2267,9 @@ __metadata: react-copy-to-clipboard: ^5.1.0 react-dom: ^18.2.0 react-hot-toast: ^2.4.0 + tailwind-merge: ^2.5.2 tailwindcss: ^3.4.11 + tailwindcss-animate: ^1.0.7 type-fest: ^4.6.0 typescript: 5.5.3 use-debounce: ^8.0.4 @@ -5193,6 +5208,15 @@ __metadata: languageName: node linkType: hard +"class-variance-authority@npm:^0.7.0": + version: 0.7.0 + resolution: "class-variance-authority@npm:0.7.0" + dependencies: + clsx: 2.0.0 + checksum: e7fd1fab433ef06f52a1b7b241b70b4a185864deef199d3b0a2c3412f1cc179517288264c383f3b971a00d76811625fc8f7ffe709e6170219e88cd7368f08a20 + languageName: node + linkType: hard + "classic-level@npm:^1.2.0": version: 1.3.0 resolution: "classic-level@npm:1.3.0" @@ -5309,6 +5333,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:2.0.0": + version: 2.0.0 + resolution: "clsx@npm:2.0.0" + checksum: a2cfb2351b254611acf92faa0daf15220f4cd648bdf96ce369d729813b85336993871a4bf6978ddea2b81b5a130478339c20d9d0b5c6fc287e5147f0c059276e + languageName: node + linkType: hard + "clsx@npm:2.1.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" @@ -5323,6 +5354,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 + languageName: node + linkType: hard + "cluster-key-slot@npm:^1.1.0": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" @@ -9957,6 +9995,15 @@ __metadata: languageName: node linkType: hard +"lucide-react@npm:^0.441.0": + version: 0.441.0 + resolution: "lucide-react@npm:0.441.0" + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + checksum: ad9616c16e351f90f936bdcf2d8df5191b18a08d761ee38d6d6ff0f2f109c338d7381ba4c266780517d77daf6ab11f8554fefd577714fbc4c30b08735371568e + languageName: node + linkType: hard + "make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -13525,6 +13572,22 @@ __metadata: languageName: node linkType: hard +"tailwind-merge@npm:^2.5.2": + version: 2.5.2 + resolution: "tailwind-merge@npm:2.5.2" + checksum: af745fc16245ac14eb5d3f0b9d076c024321877ad45f43b324465f6aa7f8b5de3816640594fbf6ac8b3500f70ff2687345787888744196ff6f82dfe9a1f99b97 + languageName: node + linkType: hard + +"tailwindcss-animate@npm:^1.0.7": + version: 1.0.7 + resolution: "tailwindcss-animate@npm:1.0.7" + peerDependencies: + tailwindcss: "*" + checksum: c1760983eb3fec0c8421e95082bf308e6845df43e2f90862386366e82545c801b26b4d189c4cd23d6915252b76d18005c8e5f591f8b119944c7fb8650d0f8bce + languageName: node + linkType: hard + "tailwindcss@npm:^3.4.11": version: 3.4.11 resolution: "tailwindcss@npm:3.4.11" From 791034295a54d5a586c15d87e802a3a09704ce26 Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 14:43:41 +0530 Subject: [PATCH 05/16] WIP: port daisyUI theme to shadcn, dark mode not working (attribute='class') --- packages/nextjs/app/layout.tsx | 2 +- packages/nextjs/styles/globals.css | 4 -- packages/nextjs/tailwind.config.js | 61 +++++++++++++++--------------- 3 files changed, 32 insertions(+), 35 deletions(-) diff --git a/packages/nextjs/app/layout.tsx b/packages/nextjs/app/layout.tsx index be1234b59..8a29992a3 100644 --- a/packages/nextjs/app/layout.tsx +++ b/packages/nextjs/app/layout.tsx @@ -13,7 +13,7 @@ const ScaffoldEthApp = ({ children }: { children: React.ReactNode }) => { return ( - + {children} diff --git a/packages/nextjs/styles/globals.css b/packages/nextjs/styles/globals.css index 46b189f6e..071390f0b 100644 --- a/packages/nextjs/styles/globals.css +++ b/packages/nextjs/styles/globals.css @@ -3,10 +3,6 @@ @tailwind utilities; /* Remove this defaults */ -:root, -[data-theme] { - background: oklch(var(--b2)); -} body { min-height: 100vh; diff --git a/packages/nextjs/tailwind.config.js b/packages/nextjs/tailwind.config.js index 34403edd2..b045fbf0b 100644 --- a/packages/nextjs/tailwind.config.js +++ b/packages/nextjs/tailwind.config.js @@ -1,3 +1,6 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const daisyuiColorObj = require("daisyui/src/theming/index"); + /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./app/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}", "./utils/**/*.{js,ts,jsx,tsx}"], @@ -91,47 +94,45 @@ module.exports = { sm: "calc(var(--radius) - 4px)", }, colors: { - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", - card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", - }, - popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", - }, + border: daisyuiColorObj["base-content"], + input: daisyuiColorObj["base-content"], + ring: daisyuiColorObj["base-content"], + background: daisyuiColorObj["base-100"], + foreground: daisyuiColorObj["base-content"], primary: { - DEFAULT: "hsl(var(--primary))", - foreground: "hsl(var(--primary-foreground))", + DEFAULT: daisyuiColorObj["primary"], + foreground: daisyuiColorObj["primary-content"], }, secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", + DEFAULT: daisyuiColorObj["secondary"], + foreground: daisyuiColorObj["secondary-content"], + }, + destructive: { + DEFAULT: daisyuiColorObj["error"], + foreground: daisyuiColorObj["error-content"], }, muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", + DEFAULT: daisyuiColorObj["base-300"], + foreground: daisyuiColorObj["base-content"], }, accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", + DEFAULT: daisyuiColorObj["accent"], + foreground: daisyuiColorObj["accent-content"], }, - destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", + popover: { + DEFAULT: daisyuiColorObj["base-100"], + foreground: daisyuiColorObj["base-content"], }, - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - chart: { - 1: "hsl(var(--chart-1))", - 2: "hsl(var(--chart-2))", - 3: "hsl(var(--chart-3))", - 4: "hsl(var(--chart-4))", - 5: "hsl(var(--chart-5))", + card: { + DEFAULT: daisyuiColorObj["base-100"], + foreground: daisyuiColorObj["base-content"], }, }, + borderRadius: { + lg: "var(--rounded-btn)", + md: "calc(var(--rounded-btn) - 2px)", + sm: "calc(var(--rounded-btn) - 4px)", + }, }, }, }; From 8ccf10e0cbfeb30ffa81f62982f90965e20ed381 Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 14:45:28 +0530 Subject: [PATCH 06/16] attribute data-theme for now --- packages/nextjs/app/layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/app/layout.tsx b/packages/nextjs/app/layout.tsx index 8a29992a3..42d783677 100644 --- a/packages/nextjs/app/layout.tsx +++ b/packages/nextjs/app/layout.tsx @@ -13,7 +13,7 @@ const ScaffoldEthApp = ({ children }: { children: React.ReactNode }) => { return ( - + {children} From c1a2166374a134d936e092f42cb2cfae3e404d48 Mon Sep 17 00:00:00 2001 From: Shiv Bhonde Date: Sun, 15 Sep 2024 15:07:56 +0530 Subject: [PATCH 07/16] fix config paths and add button and dropdown --- packages/nextjs/components.json | 13 +- packages/nextjs/components/Footer.tsx | 3 +- packages/nextjs/components/SwitchTheme.tsx | 53 +- packages/nextjs/components/ui/button.tsx | 46 ++ .../nextjs/components/ui/dropdown-menu.tsx | 181 +++++++ packages/nextjs/{~ => }/lib/utils.ts | 0 packages/nextjs/package.json | 2 + yarn.lock | 491 ++++++++++++++++++ 8 files changed, 761 insertions(+), 28 deletions(-) create mode 100644 packages/nextjs/components/ui/button.tsx create mode 100644 packages/nextjs/components/ui/dropdown-menu.tsx rename packages/nextjs/{~ => }/lib/utils.ts (100%) diff --git a/packages/nextjs/components.json b/packages/nextjs/components.json index cbd37c4ca..41ff320f2 100644 --- a/packages/nextjs/components.json +++ b/packages/nextjs/components.json @@ -11,10 +11,11 @@ "prefix": "" }, "aliases": { - "components": "~/components", - "utils": "~/lib/utils", - "ui": "~/components/ui", - "lib": "~/lib", - "hooks": "~/hooks" + "components": "~~/components", + "utils": "~~/lib/utils", + "ui": "~~/components/ui", + "lib": "~~/lib", + "hooks": "~~/hooks" } -} \ No newline at end of file +} + diff --git a/packages/nextjs/components/Footer.tsx b/packages/nextjs/components/Footer.tsx index 92b3c62d3..f3f485bb7 100644 --- a/packages/nextjs/components/Footer.tsx +++ b/packages/nextjs/components/Footer.tsx @@ -40,7 +40,8 @@ export const Footer = () => { )} - + {/* Broken switch theme */} +
diff --git a/packages/nextjs/components/SwitchTheme.tsx b/packages/nextjs/components/SwitchTheme.tsx index 4dc20af90..2d45ebe20 100644 --- a/packages/nextjs/components/SwitchTheme.tsx +++ b/packages/nextjs/components/SwitchTheme.tsx @@ -1,11 +1,38 @@ "use client"; -import { useEffect, useState } from "react"; +import * as React from "react"; +import { Moon, Sun } from "lucide-react"; import { useTheme } from "next-themes"; -import { MoonIcon, SunIcon } from "@heroicons/react/24/outline"; +import { Button } from "~~/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "~~/components/ui/dropdown-menu"; -export const SwitchTheme = ({ className }: { className?: string }) => { - const { setTheme, resolvedTheme } = useTheme(); +export function SwitchTheme() { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}>Light + setTheme("dark")}>Dark + setTheme("system")}>System + + + ); +} + +/* const { setTheme, resolvedTheme } = useTheme(); const [mounted, setMounted] = useState(false); const isDarkMode = resolvedTheme === "dark"; @@ -23,20 +50,4 @@ export const SwitchTheme = ({ className }: { className?: string }) => { }, []); if (!mounted) return null; - - return ( -
- - -
- ); -}; +*/ diff --git a/packages/nextjs/components/ui/button.tsx b/packages/nextjs/components/ui/button.tsx new file mode 100644 index 000000000..514a030a3 --- /dev/null +++ b/packages/nextjs/components/ui/button.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { type VariantProps, cva } from "class-variance-authority"; +import { cn } from "~~/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ; + }, +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/packages/nextjs/components/ui/dropdown-menu.tsx b/packages/nextjs/components/ui/dropdown-menu.tsx new file mode 100644 index 000000000..785d56cb6 --- /dev/null +++ b/packages/nextjs/components/ui/dropdown-menu.tsx @@ -0,0 +1,181 @@ +"use client"; + +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { CheckIcon, ChevronRightIcon, DotFilledIcon } from "@radix-ui/react-icons"; +import { cn } from "~~/lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { + return ; +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/packages/nextjs/~/lib/utils.ts b/packages/nextjs/lib/utils.ts similarity index 100% rename from packages/nextjs/~/lib/utils.ts rename to packages/nextjs/lib/utils.ts diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index a92da87a1..d570c05d6 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -15,7 +15,9 @@ }, "dependencies": { "@heroicons/react": "^2.0.11", + "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-slot": "^1.1.0", "@rainbow-me/rainbowkit": "2.1.5", "@tanstack/react-query": "^5.28.6", "@uniswap/sdk-core": "^4.0.1", diff --git a/yarn.lock b/yarn.lock index a01be8db8..803c2b822 100644 --- a/yarn.lock +++ b/yarn.lock @@ -815,6 +815,44 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.6.0": + version: 1.6.8 + resolution: "@floating-ui/core@npm:1.6.8" + dependencies: + "@floating-ui/utils": ^0.2.8 + checksum: 82faa6ea9d57e466779324e51308d6d49c098fb9d184a08d9bb7f4fad83f08cc070fc491f8d56f0cad44a16215fb43f9f829524288413e6c33afcb17303698de + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.0.0": + version: 1.6.11 + resolution: "@floating-ui/dom@npm:1.6.11" + dependencies: + "@floating-ui/core": ^1.6.0 + "@floating-ui/utils": ^0.2.8 + checksum: d6413759abd06a541edfad829c45313f930310fe76a3322e74a00eb655e283db33fe3e65b5265c4072eb54db7447e11225acd355a9a02cabd1d1b0d5fc8fc21d + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0": + version: 2.1.2 + resolution: "@floating-ui/react-dom@npm:2.1.2" + dependencies: + "@floating-ui/dom": ^1.0.0 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 25bb031686e23062ed4222a8946e76b3f9021d40a48437bd747233c4964a766204b8a55f34fa8b259839af96e60db7c6e3714d81f1de06914294f90e86ffbc48 + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.8": + version: 0.2.8 + resolution: "@floating-ui/utils@npm:0.2.8" + checksum: deb98bba017c4e073c7ad5740d4dec33a4d3e0942d412e677ac0504f3dade15a68fc6fd164d43c93c0bb0bcc5dc5015c1f4080dfb1a6161140fe660624f7c875 + languageName: node + linkType: hard + "@heroicons/react@npm:^2.0.11": version: 2.0.18 resolution: "@heroicons/react@npm:2.0.18" @@ -1992,6 +2030,175 @@ __metadata: languageName: node linkType: hard +"@radix-ui/primitive@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/primitive@npm:1.1.0" + checksum: 7cbf70bfd4b2200972dbd52a9366801b5a43dd844743dc97eb673b3ec8e64f5dd547538faaf9939abbfe8bb275773767ecf5a87295d90ba09c15cba2b5528c89 + languageName: node + linkType: hard + +"@radix-ui/react-arrow@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-arrow@npm:1.1.0" + dependencies: + "@radix-ui/react-primitive": 2.0.0 + 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 + checksum: 8522e0a8095ecc32d3a719f9c3bc0514c677a9c9d5ac26985d5416576dbc487c2a49ba2484397d9de502b54657856cb41ca3ea0b2165563eeeae45a83750885b + languageName: node + linkType: hard + +"@radix-ui/react-collection@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-collection@npm:1.1.0" + dependencies: + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-slot": 1.1.0 + 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 + checksum: 70cee7f23cf19b0a9533723ba2ce80a40013d7b5e3588acd40e3f155cb46e0d94d9ebef58fd907d9862e2cb2b65f3f73315719597a790aefabfeae8a64566807 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-compose-refs@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 047a4ed5f87cb848be475507cd62836cf5af5761484681f521ea543ea7c9d59d61d42806d6208863d5e2380bf38cdf4cff73c2bbe5f52dbbe50fb04e1a13ac72 + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-context@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: d48df5e5193a1d963a1ff7a58f08497c60ddc364216c59090c8267985bd478447dd617847ea277afe10e67c4e0c528894c8d7407082325e0650038625140558a + languageName: node + linkType: hard + +"@radix-ui/react-direction@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-direction@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 25ad0d1d65ad08c93cebfbefdff9ef2602e53f4573a66b37d2c366ede9485e75ec6fc8e7dd7d2939b34ea5504ca0fe6ac4a3acc2f6ee9b62d131d65486eafd49 + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-escape-keydown": 1.1.0 + 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 + checksum: 857feab2d5184a72df4e6dd9430c8e4b9fe7304790ef69512733346eee5fc33a6527256fc135d4bee6d94e8cc9c1b83c3d91da96cb4bf8300f88e9c660b71b08 + languageName: node + linkType: hard + +"@radix-ui/react-dropdown-menu@npm:^2.1.1": + version: 2.1.1 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.1" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-menu": 2.1.1 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + 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 + checksum: 511bedb9bae481bed38391a9e47f5c722b8325351a2dc8e2a46fc57ced9cf653d859555fe8295a2990b774677eaa0a08f9782038a817f9ba36b6a59aded0d277 + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-focus-guards@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 199717e7da1ba9b3fa74b04f6a245aaebf6bdb8ae7d6f4b5f21f95f4086414a3587beebc77399a99be7d3a4b2499eaa52bf72bef660f8e69856b0fd0593b074f + languageName: node + linkType: hard + +"@radix-ui/react-focus-scope@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-focus-scope@npm:1.1.0" + dependencies: + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + 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 + checksum: bea6c993752780c46c69f0c21a0fd96f11b9ed7edac23deb0953fbd8524d90938bf4c8060ccac7cad14caba3eb493f2642be7f8933910f4b6fa184666b7fcb40 + languageName: node + linkType: hard + "@radix-ui/react-icons@npm:^1.3.0": version: 1.3.0 resolution: "@radix-ui/react-icons@npm:1.3.0" @@ -2001,6 +2208,279 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-id@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-id@npm:1.1.0" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 6fbc9d1739b3b082412da10359e63967b4f3a60383ebda4c9e56b07a722d29bee53b203b3b1418f88854a29315a7715867133bb149e6e22a027a048cdd20d970 + languageName: node + linkType: hard + +"@radix-ui/react-menu@npm:2.1.1": + version: 2.1.1 + resolution: "@radix-ui/react-menu@npm:2.1.1" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-collection": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-dismissable-layer": 1.1.0 + "@radix-ui/react-focus-guards": 1.1.0 + "@radix-ui/react-focus-scope": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-popper": 1.2.0 + "@radix-ui/react-portal": 1.1.1 + "@radix-ui/react-presence": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-roving-focus": 1.1.0 + "@radix-ui/react-slot": 1.1.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + aria-hidden: ^1.1.1 + react-remove-scroll: 2.5.7 + 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 + checksum: 098a2e78994bada7fb0c54f5fc7c9dcda058c7ffd31b6b83c9ce4c6999e371ecade3aa18c92aab703af8ac36db002fcf5f9c8d0d66461d2d1ac4d24a692e947a + languageName: node + linkType: hard + +"@radix-ui/react-popper@npm:1.2.0": + version: 1.2.0 + resolution: "@radix-ui/react-popper@npm:1.2.0" + dependencies: + "@floating-ui/react-dom": ^2.0.0 + "@radix-ui/react-arrow": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + "@radix-ui/react-use-rect": 1.1.0 + "@radix-ui/react-use-size": 1.1.0 + "@radix-ui/rect": 1.1.0 + 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 + checksum: 95b2390181abe3296274b3e3836d295dc7b1624462ca88cc283b70c4efa25b1a640ff56cfe2cc8606bfe493f81b57a86345f962d86a027ad673aed58390545c6 + languageName: node + linkType: hard + +"@radix-ui/react-portal@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-portal@npm:1.1.1" + dependencies: + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + 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 + checksum: 84dab64ce9c9f4ed7d75df6d1d82877dc7976a98cc192287d39ba2ea512415ed7bf34caf02d579a18fe21766403fa9ae41d2482a14dee5514179ee1b09cc333c + languageName: node + linkType: hard + +"@radix-ui/react-presence@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-presence@npm:1.1.0" + dependencies: + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + 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 + checksum: 7f482268aa5bb5a4214dcf39d20ad93cac96585f1f248931be897ed8a9f99965b7f9b2e8bd4f4140c64eb243b471c471bf148e107f49578cc582faa773d3e83a + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:2.0.0": + version: 2.0.0 + resolution: "@radix-ui/react-primitive@npm:2.0.0" + dependencies: + "@radix-ui/react-slot": 1.1.0 + 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 + checksum: 04afc0f3a5ccf1de6e4861f755a89f31640d5a07237c5ac5bffe47bcd8fdf318257961fa56fedc823af49281800ee755752a371561c36fd92f008536a0553748 + languageName: node + linkType: hard + +"@radix-ui/react-roving-focus@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-roving-focus@npm:1.1.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-collection": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + 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 + checksum: 6f3a3fd047b0ac503f8a97297fba937c15653d01c883f344970f1c4206e9485572bc613f2561973f9010e96525ca87030ca5abf83a2e4dd67511f8b5afa20581 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.1.0, @radix-ui/react-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-slot@npm:1.1.0" + dependencies: + "@radix-ui/react-compose-refs": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 3c9cd90aabf08f541e20dbecb581744be01c552a0cd16e90d7c218381bcc5307aa8a6013d045864e692ba89d3d8c17bfae08df18ed18be6d223d9330ab0302fa + languageName: node + linkType: hard + +"@radix-ui/react-use-callback-ref@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-callback-ref@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 2ec7903c67e3034b646005556f44fd975dc5204db6885fc58403e3584f27d95f0b573bc161de3d14fab9fda25150bf3b91f718d299fdfc701c736bd0bd2281fa + languageName: node + linkType: hard + +"@radix-ui/react-use-controllable-state@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-controllable-state@npm:1.1.0" + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: a6c167cf8eb0744effbeab1f92ea6c0ad71838b222670c0488599f28eecd941d87ac1eed4b5d3b10df6dc7b7b2edb88a54e99d92c2942ce3b21f81d5c188f32d + languageName: node + linkType: hard + +"@radix-ui/react-use-escape-keydown@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 9bf88ea272b32ea0f292afd336780a59c5646f795036b7e6105df2d224d73c54399ee5265f61d571eb545d28382491a8b02dc436e3088de8dae415d58b959b71 + languageName: node + linkType: hard + +"@radix-ui/react-use-layout-effect@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-layout-effect@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 271ea0bf1cd74718895a68414a6e95537737f36e02ad08eeb61a82b229d6abda9cff3135a479e134e1f0ce2c3ff97bb85babbdce751985fb755a39b231d7ccf2 + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-rect@npm:1.1.0" + dependencies: + "@radix-ui/rect": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: facc9528af43df3b01952dbb915ff751b5924db2c31d41f053ddea19a7cc5cac5b096c4d7a2059e8f564a3f0d4a95bcd909df8faed52fa01709af27337628e2c + languageName: node + linkType: hard + +"@radix-ui/react-use-size@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-size@npm:1.1.0" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 01a11d4c07fc620b8a081e53d7ec8495b19a11e02688f3d9f47cf41a5fe0428d1e52ed60b2bf88dfd447dc2502797b9dad2841097389126dd108530913c4d90d + languageName: node + linkType: hard + +"@radix-ui/rect@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/rect@npm:1.1.0" + checksum: 1ad93efbc9fc3b878bae5e8bb26ffa1005235d8b5b9fca8339eb5dbcf7bf53abc9ccd2a8ce128557820168c8600521e48e0ea4dda96aa5f116381f66f46aeda3 + languageName: node + linkType: hard + "@rainbow-me/rainbowkit@npm:2.1.0": version: 2.1.0 resolution: "@rainbow-me/rainbowkit@npm:2.1.0" @@ -2234,7 +2714,9 @@ __metadata: resolution: "@se-2/nextjs@workspace:packages/nextjs" dependencies: "@heroicons/react": ^2.0.11 + "@radix-ui/react-dropdown-menu": ^2.1.1 "@radix-ui/react-icons": ^1.3.0 + "@radix-ui/react-slot": ^1.1.0 "@rainbow-me/rainbowkit": 2.1.5 "@tanstack/react-query": ^5.28.6 "@trivago/prettier-plugin-sort-imports": ^4.1.1 @@ -4314,6 +4796,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: ^2.0.0 + checksum: 2ac90b70d29c6349d86d90e022cf01f4885f9be193932d943a14127cf28560dd0baf068a6625f084163437a4be0578f513cf7892f4cc63bfe91aa41dce27c6b2 + languageName: node + linkType: hard + "aria-query@npm:^5.1.3": version: 5.3.0 resolution: "aria-query@npm:5.3.0" From c0f5336ce3f2ada2b433fe1238d3a4b7b5031370 Mon Sep 17 00:00:00 2001 From: Rinat Date: Sun, 15 Sep 2024 15:05:47 +0300 Subject: [PATCH 08/16] fix: theme switcher click --- packages/nextjs/components/Footer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/components/Footer.tsx b/packages/nextjs/components/Footer.tsx index f3f485bb7..d4cfae75a 100644 --- a/packages/nextjs/components/Footer.tsx +++ b/packages/nextjs/components/Footer.tsx @@ -20,7 +20,7 @@ export const Footer = () => { return (
-
+
{nativeCurrencyPrice > 0 && (
From 7eefe299a6764bf3be0f2b2c3be93756465b2212 Mon Sep 17 00:00:00 2001 From: Rinat Date: Thu, 19 Sep 2024 12:46:27 +0300 Subject: [PATCH 09/16] Shadcn faucet button (#945) * feat: faucet button * fix: tooltip behavior --- .../components/scaffold-eth/FaucetButton.tsx | 34 ++++++------- packages/nextjs/components/ui/tooltip.tsx | 29 +++++++++++ packages/nextjs/package.json | 1 + yarn.lock | 50 +++++++++++++++++++ 4 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 packages/nextjs/components/ui/tooltip.tsx diff --git a/packages/nextjs/components/scaffold-eth/FaucetButton.tsx b/packages/nextjs/components/scaffold-eth/FaucetButton.tsx index 440b70bfe..264b040d8 100644 --- a/packages/nextjs/components/scaffold-eth/FaucetButton.tsx +++ b/packages/nextjs/components/scaffold-eth/FaucetButton.tsx @@ -5,6 +5,8 @@ import { createWalletClient, http, parseEther } from "viem"; import { hardhat } from "viem/chains"; import { useAccount } from "wagmi"; import { BanknotesIcon } from "@heroicons/react/24/outline"; +import { Button } from "~~/components/ui/button"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "~~/components/ui/tooltip"; import { useTransactor } from "~~/hooks/scaffold-eth"; import { useWatchBalance } from "~~/hooks/scaffold-eth/useWatchBalance"; @@ -50,24 +52,22 @@ export const FaucetButton = () => { return null; } - const isBalanceZero = balance && balance.value === 0n; + const isBalanceZero = Boolean(balance && balance.value === 0n); return ( -
- -
+ + + + + + Grab funds from faucet + + ); }; diff --git a/packages/nextjs/components/ui/tooltip.tsx b/packages/nextjs/components/ui/tooltip.tsx new file mode 100644 index 000000000..96f239714 --- /dev/null +++ b/packages/nextjs/components/ui/tooltip.tsx @@ -0,0 +1,29 @@ +"use client"; + +import * as React from "react"; +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; +import { cn } from "~~/lib/utils"; + +const TooltipProvider = TooltipPrimitive.Provider; + +const Tooltip = TooltipPrimitive.Root; + +const TooltipTrigger = TooltipPrimitive.Trigger; + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)); +TooltipContent.displayName = TooltipPrimitive.Content.displayName; + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index d570c05d6..7c12d6722 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.2", "@rainbow-me/rainbowkit": "2.1.5", "@tanstack/react-query": "^5.28.6", "@uniswap/sdk-core": "^4.0.1", diff --git a/yarn.lock b/yarn.lock index 803c2b822..33bcaa1bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2388,6 +2388,36 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-tooltip@npm:^1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-tooltip@npm:1.1.2" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-dismissable-layer": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-popper": 1.2.0 + "@radix-ui/react-portal": 1.1.1 + "@radix-ui/react-presence": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-slot": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + "@radix-ui/react-visually-hidden": 1.1.0 + 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 + checksum: b346b93779cd763d12a0f10a696e88a1302c4b1ef124dae63dec95c70571942d482ee471d4adc06c2e5ed4e982918bcb9862f88c058a52cc8053a3ddf1720475 + languageName: node + linkType: hard + "@radix-ui/react-use-callback-ref@npm:1.1.0": version: 1.1.0 resolution: "@radix-ui/react-use-callback-ref@npm:1.1.0" @@ -2474,6 +2504,25 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-visually-hidden@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-visually-hidden@npm:1.1.0" + dependencies: + "@radix-ui/react-primitive": 2.0.0 + 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 + checksum: 9e30775dc3bd562722b5671d91545e3e16111f9d1942c98188cb84935eb4a7d31ef1ad1e028e1f1d41e490392f295fbd55424106263869cc7028de9f6141363d + languageName: node + linkType: hard + "@radix-ui/rect@npm:1.1.0": version: 1.1.0 resolution: "@radix-ui/rect@npm:1.1.0" @@ -2717,6 +2766,7 @@ __metadata: "@radix-ui/react-dropdown-menu": ^2.1.1 "@radix-ui/react-icons": ^1.3.0 "@radix-ui/react-slot": ^1.1.0 + "@radix-ui/react-tooltip": ^1.1.2 "@rainbow-me/rainbowkit": 2.1.5 "@tanstack/react-query": ^5.28.6 "@trivago/prettier-plugin-sort-imports": ^4.1.1 From f1e5c1b37071e44552a482fa7ec5ab5a68fc8372 Mon Sep 17 00:00:00 2001 From: Rinat Date: Thu, 19 Sep 2024 13:48:48 +0300 Subject: [PATCH 10/16] Shadcn rainbowkit button + dropdown (#937) * feat: shadcn rainbowkit button * revert: ghost button colors * chore: prevent qr modal autofocus * fix: network options * fix: redundant comment * chore: ring-accent * fix: open menu and qr modal on enter and close on esc * revert: button changes * revert: dropdown-menu changes * fix: avoid passing classNames * fix: return w-full justify-start * fix: dropdow items was clickable during closing menu animation --- .../AddressInfoDropdown.tsx | 181 ++++++++++-------- .../AddressQRCodeModal.tsx | 37 ++-- .../NetworkOptions.tsx | 17 +- .../WrongNetworkDropdown.tsx | 45 +++-- .../RainbowKitCustomConnectButton/index.tsx | 7 +- packages/nextjs/components/ui/button.tsx | 2 +- packages/nextjs/components/ui/dialog.tsx | 96 ++++++++++ .../nextjs/components/ui/dropdown-menu.tsx | 2 +- packages/nextjs/package.json | 1 + packages/nextjs/tailwind.config.js | 4 - yarn.lock | 33 ++++ 11 files changed, 283 insertions(+), 142 deletions(-) create mode 100644 packages/nextjs/components/ui/dialog.tsx diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx index a9e31251b..4f8ba6c01 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx @@ -1,4 +1,5 @@ -import { useRef, useState } from "react"; +import { useState } from "react"; +import { AddressQRCodeModal } from "./AddressQRCodeModal"; import { NetworkOptions } from "./NetworkOptions"; import CopyToClipboard from "react-copy-to-clipboard"; import { getAddress } from "viem"; @@ -14,7 +15,13 @@ import { QrCodeIcon, } from "@heroicons/react/24/outline"; import { BlockieAvatar, isENS } from "~~/components/scaffold-eth"; -import { useOutsideClick } from "~~/hooks/scaffold-eth"; +import { Button } from "~~/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "~~/components/ui/dropdown-menu"; import { getTargetNetworks } from "~~/utils/scaffold-eth"; const allowedNetworks = getTargetNetworks(); @@ -34,104 +41,112 @@ export const AddressInfoDropdown = ({ }: AddressInfoDropdownProps) => { const { disconnect } = useDisconnect(); const checkSumAddress = getAddress(address); + const [open, setOpen] = useState(false); const [addressCopied, setAddressCopied] = useState(false); const [selectingNetwork, setSelectingNetwork] = useState(false); - const dropdownRef = useRef(null); const closeDropdown = () => { setSelectingNetwork(false); - dropdownRef.current?.removeAttribute("open"); + setOpen(false); }; - useOutsideClick(dropdownRef, closeDropdown); return ( - <> -
- + + setOpen(open => !open)}> + -
    -
-
- + + Disconnect + + + + )} + + ); }; diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx index b5bb2efb8..1dc220b56 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx @@ -1,33 +1,26 @@ import { QRCodeSVG } from "qrcode.react"; import { Address as AddressType } from "viem"; import { Address } from "~~/components/scaffold-eth"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "~~/components/ui/dialog"; type AddressQRCodeModalProps = { address: AddressType; - modalId: string; + children: React.ReactNode; }; -export const AddressQRCodeModal = ({ address, modalId }: AddressQRCodeModalProps) => { +export const AddressQRCodeModal = ({ address, children }: AddressQRCodeModalProps) => { return ( - <> -
- - -
- + + {children} + e.preventDefault()}> + + Address QR Code + +
+ +
+
+
+
); }; diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx index bf16a56f3..49c0b65f6 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx @@ -1,6 +1,8 @@ import { useTheme } from "next-themes"; import { useAccount, useSwitchChain } from "wagmi"; import { ArrowsRightLeftIcon } from "@heroicons/react/24/solid"; +import { Button } from "~~/components/ui/button"; +import { DropdownMenuItem } from "~~/components/ui/dropdown-menu"; import { getNetworkColor } from "~~/hooks/scaffold-eth"; import { getTargetNetworks } from "~~/utils/scaffold-eth"; @@ -21,15 +23,16 @@ export const NetworkOptions = ({ hidden = false }: NetworkOptionsProps) => { {allowedNetworks .filter(allowedNetwork => allowedNetwork.id !== chain?.id) .map(allowedNetwork => ( -
  • - -
  • + + ))} ); diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/WrongNetworkDropdown.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/WrongNetworkDropdown.tsx index f9f0fd885..f42e6924d 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/WrongNetworkDropdown.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/WrongNetworkDropdown.tsx @@ -1,32 +1,35 @@ import { NetworkOptions } from "./NetworkOptions"; +import { ChevronDown } from "lucide-react"; import { useDisconnect } from "wagmi"; -import { ArrowLeftOnRectangleIcon, ChevronDownIcon } from "@heroicons/react/24/outline"; +import { ArrowLeftOnRectangleIcon } from "@heroicons/react/24/outline"; +import { Button } from "~~/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "~~/components/ui/dropdown-menu"; export const WrongNetworkDropdown = () => { const { disconnect } = useDisconnect(); return ( -
    - -
      + + + + + -
    • - -
    • -
    -
    + + + + ); }; diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/index.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/index.tsx index 6521200dc..0171470c2 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/index.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/index.tsx @@ -7,6 +7,7 @@ import { AddressQRCodeModal } from "./AddressQRCodeModal"; import { WrongNetworkDropdown } from "./WrongNetworkDropdown"; import { ConnectButton } from "@rainbow-me/rainbowkit"; import { Address } from "viem"; +import { Button } from "~~/components/ui/button"; import { useNetworkColor } from "~~/hooks/scaffold-eth"; import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork"; import { getBlockExplorerAddressLink } from "~~/utils/scaffold-eth"; @@ -31,9 +32,9 @@ export const RainbowKitCustomConnectButton = () => { {(() => { if (!connected) { return ( - + ); } @@ -55,7 +56,7 @@ export const RainbowKitCustomConnectButton = () => { ensAvatar={account.ensAvatar} blockExplorerAddressLink={blockExplorerAddressLink} /> - + QR ); })()} diff --git a/packages/nextjs/components/ui/button.tsx b/packages/nextjs/components/ui/button.tsx index 514a030a3..694690488 100644 --- a/packages/nextjs/components/ui/button.tsx +++ b/packages/nextjs/components/ui/button.tsx @@ -12,7 +12,7 @@ const buttonVariants = cva( destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", + ghost: "hover:bg-accent hover:bg-accent", link: "text-primary underline-offset-4 hover:underline", }, size: { diff --git a/packages/nextjs/components/ui/dialog.tsx b/packages/nextjs/components/ui/dialog.tsx new file mode 100644 index 000000000..415f24327 --- /dev/null +++ b/packages/nextjs/components/ui/dialog.tsx @@ -0,0 +1,96 @@ +"use client"; + +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { Cross2Icon } from "@radix-ui/react-icons"; +import { cn } from "~~/lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
    +); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => ( +
    +); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogTrigger, + DialogClose, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/packages/nextjs/components/ui/dropdown-menu.tsx b/packages/nextjs/components/ui/dropdown-menu.tsx index 785d56cb6..3334e34e7 100644 --- a/packages/nextjs/components/ui/dropdown-menu.tsx +++ b/packages/nextjs/components/ui/dropdown-menu.tsx @@ -26,7 +26,7 @@ const DropdownMenuSubTrigger = React.forwardRef< Date: Thu, 19 Sep 2024 21:19:08 +0300 Subject: [PATCH 11/16] fix: qr code description --- .../AddressQRCodeModal.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx index 8c5484c3a..18b18853a 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx @@ -1,7 +1,14 @@ import { QRCodeSVG } from "qrcode.react"; import { Address as AddressType } from "viem"; import { Address } from "~~/components/scaffold-eth"; -import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "~~/components/ui/dialog"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "~~/components/ui/dialog"; type AddressQRCodeModalProps = { address: AddressType; @@ -16,6 +23,7 @@ export const AddressQRCodeModal = ({ address, children }: AddressQRCodeModalProp Address QR Code + Address QR Code
    From 6a57d673d5d530f85cd098133f4710dc1e454882 Mon Sep 17 00:00:00 2001 From: Rinat Date: Thu, 19 Sep 2024 21:20:47 +0300 Subject: [PATCH 12/16] fix: copy to clipboard button accessibility --- .../AddressInfoDropdown.tsx | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx index 4f8ba6c01..2a0e8fd77 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx @@ -71,34 +71,34 @@ export const AddressInfoDropdown = ({
    - - )} - - + + )} + + +
    -
    +
    diff --git a/packages/nextjs/components/scaffold-eth/FaucetButton.tsx b/packages/nextjs/components/scaffold-eth/FaucetButton.tsx index 264b040d8..90416c6af 100644 --- a/packages/nextjs/components/scaffold-eth/FaucetButton.tsx +++ b/packages/nextjs/components/scaffold-eth/FaucetButton.tsx @@ -58,7 +58,7 @@ export const FaucetButton = () => { -