@zerodev/wallet-react-ui 0.0.11 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +38 -7
  2. package/dist/_types/auth/brandAssets.d.ts +2 -0
  3. package/dist/_types/auth/brandAssets.d.ts.map +1 -0
  4. package/dist/_types/auth/components/WalletSheet/index.d.ts +20 -0
  5. package/dist/_types/auth/components/WalletSheet/index.d.ts.map +1 -0
  6. package/dist/_types/auth/hooks/useWalletConnectPairing.d.ts +19 -0
  7. package/dist/_types/auth/hooks/useWalletConnectPairing.d.ts.map +1 -0
  8. package/dist/_types/auth/hooks/useWalletInfo.d.ts +32 -0
  9. package/dist/_types/auth/hooks/useWalletInfo.d.ts.map +1 -0
  10. package/dist/_types/auth/pages/SignUp/MoreWallets.d.ts.map +1 -1
  11. package/dist/_types/auth/pages/SignUp/Wallet.d.ts.map +1 -1
  12. package/dist/_types/auth/pages/SignUp/WalletConnect.d.ts +5 -0
  13. package/dist/_types/auth/pages/SignUp/WalletConnect.d.ts.map +1 -0
  14. package/dist/_types/auth/pages/SignUp/context.d.ts +4 -0
  15. package/dist/_types/auth/pages/SignUp/context.d.ts.map +1 -1
  16. package/dist/_types/auth/pages/SignUp/index.d.ts +2 -0
  17. package/dist/_types/auth/pages/SignUp/index.d.ts.map +1 -1
  18. package/dist/_types/auth/utils/isMobile.d.ts +2 -0
  19. package/dist/_types/auth/utils/isMobile.d.ts.map +1 -0
  20. package/dist/_types/auth/utils/isZeroDevWalletConnect.d.ts +6 -0
  21. package/dist/_types/auth/utils/isZeroDevWalletConnect.d.ts.map +1 -0
  22. package/dist/_types/auth/utils/walletDeepLink.d.ts +18 -0
  23. package/dist/_types/auth/utils/walletDeepLink.d.ts.map +1 -0
  24. package/dist/_types/auth/walletGuide.d.ts +21 -3
  25. package/dist/_types/auth/walletGuide.d.ts.map +1 -1
  26. package/dist/_types/index.d.ts +3 -0
  27. package/dist/_types/index.d.ts.map +1 -1
  28. package/dist/_types/zeroDevWalletConnect.d.ts +13 -0
  29. package/dist/_types/zeroDevWalletConnect.d.ts.map +1 -0
  30. package/dist/index.cjs +3 -3
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.mjs +1009 -659
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/styles.css +1 -1
  35. package/package.json +6 -5
  36. package/src/assets.d.ts +5 -0
  37. package/src/auth/brandAssets.ts +5 -0
  38. package/src/auth/components/WalletSheet/index.tsx +220 -0
  39. package/src/auth/hooks/useWalletConnectPairing.ts +134 -0
  40. package/src/auth/hooks/useWalletInfo.ts +145 -0
  41. package/src/auth/pages/SignUp/InstalledWallets.tsx +1 -1
  42. package/src/auth/pages/SignUp/MoreWallets.tsx +44 -9
  43. package/src/auth/pages/SignUp/Wallet.tsx +43 -13
  44. package/src/auth/pages/SignUp/WalletConnect.tsx +32 -0
  45. package/src/auth/pages/SignUp/context.tsx +4 -0
  46. package/src/auth/pages/SignUp/index.tsx +31 -0
  47. package/src/auth/utils/isMobile.ts +9 -0
  48. package/src/auth/utils/isZeroDevWalletConnect.ts +8 -0
  49. package/src/auth/utils/walletDeepLink.ts +23 -0
  50. package/src/auth/walletGuide.ts +42 -8
  51. package/src/index.ts +7 -2
  52. package/src/zeroDevWalletConnect.ts +95 -0
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}:root,:host{--zd-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--zd-color-red-500:oklch(63.7% .237 25.331);--zd-color-gray-50:oklch(98.5% .002 247.839);--zd-color-gray-100:oklch(96.7% .003 264.542);--zd-color-gray-400:oklch(70.7% .022 261.325);--zd-color-gray-500:oklch(55.1% .027 264.364);--zd-color-gray-700:oklch(37.3% .034 259.733);--zd-color-gray-900:oklch(21% .034 264.665);--zd-color-white:#fff;--zd-spacing:.25rem;--zd-container-md:28rem;--zd-text-xs--line-height:calc(1 / .75);--zd-text-sm--line-height:calc(1.25 / .875);--zd-text-base--line-height:calc(1.5 / 1);--zd-text-lg--line-height:calc(1.75 / 1.125);--zd-text-xl--line-height:calc(1.75 / 1.25);--zd-text-2xl--line-height:calc(2 / 1.5);--zd-font-weight-medium:500;--zd-font-weight-semibold:600;--zd-font-weight-bold:700;--zd-radius-md:.375rem;--zd-radius-lg:.5rem;--zd-radius-xl:.75rem;--zd-radius-2xl:1rem;--zd-radius-3xl:1.5rem;--zd-radius-4xl:2rem;--zd-animate-spin:spin 1s linear infinite;--zd-default-transition-duration:.15s;--zd-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--zd-default-font-family:sans-serif}.zd-scope{font-family:var(--zd-default-font-family,ui-sans-serif, system-ui, sans-serif);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;box-sizing:border-box;border:0 solid;margin:0;padding:0;line-height:1.5}.zd-scope :where(*){box-sizing:border-box;border:0 solid;margin:0;padding:0}.zd-scope :where(img,svg,video){max-width:100%;display:block}.zd-scope :where(img,video){height:auto}.zd-scope :where(button,input,textarea){font:inherit;letter-spacing:inherit;color:inherit;background:0 0;border-radius:0}.zd-scope :where(input,textarea)::placeholder{opacity:1;color:currentColor}@supports (color:color-mix(in lab, red, red)){.zd-scope :where(input,textarea)::placeholder{color:color-mix(in oklab, currentColor 50%, transparent)}}.zd-scope :where(textarea){resize:vertical}.zd-scope :where(a){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.zd-scope :where(ol,ul){list-style:none}.zd-scope :where(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}.zd-scope :where(pre){font-family:var(--zd-font-mono)}.zd\:pointer-events-none{pointer-events:none}.zd\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.zd\:absolute{position:absolute}.zd\:relative{position:relative}.zd\:inset-0{inset:0}.zd\:top-0{top:0}.zd\:top-1\/2{top:50%}.zd\:right-0{right:0}.zd\:right-1{right:var(--zd-spacing)}.zd\:bottom-0{bottom:0}.zd\:bottom-1{bottom:var(--zd-spacing)}.zd\:left-0{left:0}.zd\:left-1\/2{left:50%}.zd\:isolate{isolation:isolate}.zd\:z-0{z-index:0}.zd\:z-10{z-index:10}.zd\:z-20{z-index:20}.zd\:z-50{z-index:50}.zd\:m-1\.5{margin:calc(var(--zd-spacing) * 1.5)}.zd\:-mx-4{margin-inline:calc(var(--zd-spacing) * -4)}.zd\:mx-2{margin-inline:calc(var(--zd-spacing) * 2)}.zd\:my-1{margin-block:var(--zd-spacing)}.zd\:my-2{margin-block:calc(var(--zd-spacing) * 2)}.zd\:my-\[1\.5px\]{margin-block:1.5px}.zd\:mt-1{margin-top:var(--zd-spacing)}.zd\:mt-2{margin-top:calc(var(--zd-spacing) * 2)}.zd\:mt-3{margin-top:calc(var(--zd-spacing) * 3)}.zd\:mt-6{margin-top:calc(var(--zd-spacing) * 6)}.zd\:mb-1{margin-bottom:var(--zd-spacing)}.zd\:mb-1\.5{margin-bottom:calc(var(--zd-spacing) * 1.5)}.zd\:mb-2{margin-bottom:calc(var(--zd-spacing) * 2)}.zd\:mb-3{margin-bottom:calc(var(--zd-spacing) * 3)}.zd\:mb-4{margin-bottom:calc(var(--zd-spacing) * 4)}.zd\:flex{display:flex}.zd\:grid{display:grid}.zd\:hidden{display:none}.zd\:inline-block{display:inline-block}.zd\:inline-flex{display:inline-flex}.zd\:size-3{width:calc(var(--zd-spacing) * 3);height:calc(var(--zd-spacing) * 3)}.zd\:size-4{width:calc(var(--zd-spacing) * 4);height:calc(var(--zd-spacing) * 4)}.zd\:size-5{width:calc(var(--zd-spacing) * 5);height:calc(var(--zd-spacing) * 5)}.zd\:size-8\.5{width:calc(var(--zd-spacing) * 8.5);height:calc(var(--zd-spacing) * 8.5)}.zd\:size-10\.5{width:calc(var(--zd-spacing) * 10.5);height:calc(var(--zd-spacing) * 10.5)}.zd\:size-11{width:calc(var(--zd-spacing) * 11);height:calc(var(--zd-spacing) * 11)}.zd\:size-18\.5{width:calc(var(--zd-spacing) * 18.5);height:calc(var(--zd-spacing) * 18.5)}.zd\:size-full{width:100%;height:100%}.zd\:h-2\.5{height:calc(var(--zd-spacing) * 2.5)}.zd\:h-3{height:calc(var(--zd-spacing) * 3)}.zd\:h-3\.5{height:calc(var(--zd-spacing) * 3.5)}.zd\:h-4{height:calc(var(--zd-spacing) * 4)}.zd\:h-4\.5{height:calc(var(--zd-spacing) * 4.5)}.zd\:h-5{height:calc(var(--zd-spacing) * 5)}.zd\:h-6{height:calc(var(--zd-spacing) * 6)}.zd\:h-7{height:calc(var(--zd-spacing) * 7)}.zd\:h-8{height:calc(var(--zd-spacing) * 8)}.zd\:h-9{height:calc(var(--zd-spacing) * 9)}.zd\:h-10{height:calc(var(--zd-spacing) * 10)}.zd\:h-11{height:calc(var(--zd-spacing) * 11)}.zd\:h-12{height:calc(var(--zd-spacing) * 12)}.zd\:h-13{height:calc(var(--zd-spacing) * 13)}.zd\:h-16{height:calc(var(--zd-spacing) * 16)}.zd\:h-17{height:calc(var(--zd-spacing) * 17)}.zd\:h-32{height:calc(var(--zd-spacing) * 32)}.zd\:h-202\.5{height:calc(var(--zd-spacing) * 202.5)}.zd\:h-\[18px\]{height:18px}.zd\:h-\[52px\]{height:52px}.zd\:h-\[68px\]{height:68px}.zd\:h-\[84px\]{height:84px}.zd\:h-\[118px\]{height:118px}.zd\:h-auto{height:auto}.zd\:h-full{height:100%}.zd\:h-px{height:1px}.zd\:max-h-48{max-height:calc(var(--zd-spacing) * 48)}.zd\:max-h-80{max-height:calc(var(--zd-spacing) * 80)}.zd\:max-h-202\.5{max-height:calc(var(--zd-spacing) * 202.5)}.zd\:max-h-full{max-height:100%}.zd\:min-h-0{min-height:0}.zd\:min-h-11{min-height:calc(var(--zd-spacing) * 11)}.zd\:min-h-75{min-height:calc(var(--zd-spacing) * 75)}.zd\:min-h-100{min-height:calc(var(--zd-spacing) * 100)}.zd\:w-1\/2{width:50%}.zd\:w-1\/3{width:33.3333%}.zd\:w-2\.5{width:calc(var(--zd-spacing) * 2.5)}.zd\:w-3{width:calc(var(--zd-spacing) * 3)}.zd\:w-3\.5{width:calc(var(--zd-spacing) * 3.5)}.zd\:w-4{width:calc(var(--zd-spacing) * 4)}.zd\:w-5{width:calc(var(--zd-spacing) * 5)}.zd\:w-6{width:calc(var(--zd-spacing) * 6)}.zd\:w-7{width:calc(var(--zd-spacing) * 7)}.zd\:w-8{width:calc(var(--zd-spacing) * 8)}.zd\:w-9{width:calc(var(--zd-spacing) * 9)}.zd\:w-10{width:calc(var(--zd-spacing) * 10)}.zd\:w-11{width:calc(var(--zd-spacing) * 11)}.zd\:w-12{width:calc(var(--zd-spacing) * 12)}.zd\:w-13{width:calc(var(--zd-spacing) * 13)}.zd\:w-14{width:calc(var(--zd-spacing) * 14)}.zd\:w-16{width:calc(var(--zd-spacing) * 16)}.zd\:w-24{width:calc(var(--zd-spacing) * 24)}.zd\:w-72{width:calc(var(--zd-spacing) * 72)}.zd\:w-80{width:calc(var(--zd-spacing) * 80)}.zd\:w-100{width:calc(var(--zd-spacing) * 100)}.zd\:w-125{width:calc(var(--zd-spacing) * 125)}.zd\:w-\[18px\]{width:18px}.zd\:w-\[52px\]{width:52px}.zd\:w-\[105px\]{width:105px}.zd\:w-\[118px\]{width:118px}.zd\:w-auto{width:auto}.zd\:w-full{width:100%}.zd\:w-px{width:1px}.zd\:max-w-\[220px\]{max-width:220px}.zd\:max-w-full{max-width:100%}.zd\:max-w-md{max-width:var(--zd-container-md)}.zd\:min-w-0{min-width:0}.zd\:flex-1{flex:1}.zd\:shrink-0{flex-shrink:0}.zd\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.zd\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.zd\:animate-skel-pulse{animation:1.1s ease-in-out infinite skel-pulse}.zd\:animate-spin{animation:var(--zd-animate-spin)}.zd\:cursor-help{cursor:help}.zd\:cursor-not-allowed{cursor:not-allowed}.zd\:cursor-pointer{cursor:pointer}.zd\:cursor-text{cursor:text}.zd\:resize-none{resize:none}.zd\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.zd\:flex-col{flex-direction:column}.zd\:flex-row{flex-direction:row}.zd\:flex-wrap{flex-wrap:wrap}.zd\:place-items-center{place-items:center}.zd\:items-center{align-items:center}.zd\:items-end{align-items:flex-end}.zd\:items-start{align-items:flex-start}.zd\:justify-between{justify-content:space-between}.zd\:justify-center{justify-content:center}.zd\:gap-1{gap:var(--zd-spacing)}.zd\:gap-1\.5{gap:calc(var(--zd-spacing) * 1.5)}.zd\:gap-2{gap:calc(var(--zd-spacing) * 2)}.zd\:gap-3{gap:calc(var(--zd-spacing) * 3)}.zd\:gap-4{gap:calc(var(--zd-spacing) * 4)}.zd\:gap-5{gap:calc(var(--zd-spacing) * 5)}.zd\:gap-6{gap:calc(var(--zd-spacing) * 6)}.zd\:gap-8{gap:calc(var(--zd-spacing) * 8)}.zd\:gap-\[5px\]{gap:5px}.zd\:self-center{align-self:center}.zd\:self-end{align-self:flex-end}.zd\:self-start{align-self:flex-start}.zd\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zd\:overflow-auto{overflow:auto}.zd\:overflow-hidden{overflow:hidden}.zd\:overflow-x-hidden{overflow-x:hidden}.zd\:overflow-y-auto{overflow-y:auto}.zd\:rounded-2xl{border-radius:var(--zd-radius-2xl)}.zd\:rounded-3xl{border-radius:var(--zd-radius-3xl)}.zd\:rounded-4xl{border-radius:var(--zd-radius-4xl)}.zd\:rounded-\[14px\]{border-radius:14px}.zd\:rounded-\[30px\]{border-radius:30px}.zd\:rounded-\[32px\]{border-radius:32px}.zd\:rounded-\[34px\]{border-radius:34px}.zd\:rounded-\[38px\]{border-radius:38px}.zd\:rounded-full{border-radius:3.40282e38px}.zd\:rounded-lg{border-radius:var(--zd-radius-lg)}.zd\:rounded-md{border-radius:var(--zd-radius-md)}.zd\:rounded-xl{border-radius:var(--zd-radius-xl)}.zd\:border{border-style:var(--tw-border-style);border-width:1px}.zd\:border-2{border-style:var(--tw-border-style);border-width:2px}.zd\:border-\[0\.3px\]{border-style:var(--tw-border-style);border-width:.3px}.zd\:border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.zd\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.zd\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.zd\:border-gray-100{border-color:var(--zd-color-gray-100)}.zd\:border-greyScale{border-color:#130e0b}.zd\:border-greyScale\/30{border-color:oklab(16.9052% .00636494 .00836386/.3)}.zd\:border-negative{border-color:#ff4221}.zd\:border-offWhite{border-color:#f7f5f0}.zd\:border-offWhite\/50{border-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:border-solarOrange{border-color:#e76000}.zd\:border-transparent{border-color:#0000}.zd\:border-white\/0{border-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:border-white\/0{border-color:color-mix(in oklab, var(--zd-color-white) 0%, transparent)}}.zd\:border-white\/20{border-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:border-white\/20{border-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}.zd\:border-t-transparent{border-top-color:#0000}.zd\:bg-gray-50{background-color:var(--zd-color-gray-50)}.zd\:bg-greyScale\/5{background-color:oklab(16.9052% .00636494 .00836386/.05)}.zd\:bg-greyScale\/10{background-color:oklab(16.9052% .00636494 .00836386/.1)}.zd\:bg-greyScale\/15{background-color:oklab(16.9052% .00636494 .00836386/.15)}.zd\:bg-greyScale\/20{background-color:oklab(16.9052% .00636494 .00836386/.2)}.zd\:bg-greyScale\/30{background-color:oklab(16.9052% .00636494 .00836386/.3)}.zd\:bg-offWhite{background-color:#f7f5f0}.zd\:bg-offWhite\/50{background-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:bg-offWhite\/80{background-color:oklab(97.0302% .000165075 .00696582/.8)}.zd\:bg-offWhite\/85{background-color:oklab(97.0302% .000165075 .00696582/.85)}.zd\:bg-orange\/10{background-color:oklab(70.9342% .114827 .116983/.1)}.zd\:bg-solarOrange{background-color:#e76000}.zd\:bg-solarOrange\/60{background-color:oklab(65.138% .131584 .131685/.6)}.zd\:bg-transparent{background-color:#0000}.zd\:bg-white,.zd\:bg-white\/20{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/20{background-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}.zd\:bg-white\/40{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/40{background-color:color-mix(in oklab, var(--zd-color-white) 40%, transparent)}}.zd\:bg-white\/60{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/60{background-color:color-mix(in oklab, var(--zd-color-white) 60%, transparent)}}.zd\:bg-white\/70{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/70{background-color:color-mix(in oklab, var(--zd-color-white) 70%, transparent)}}.zd\:object-contain{object-fit:contain}.zd\:object-cover{object-fit:cover}.zd\:p-0{padding:0}.zd\:p-1{padding:var(--zd-spacing)}.zd\:p-2{padding:calc(var(--zd-spacing) * 2)}.zd\:p-3{padding:calc(var(--zd-spacing) * 3)}.zd\:p-4{padding:calc(var(--zd-spacing) * 4)}.zd\:p-6{padding:calc(var(--zd-spacing) * 6)}.zd\:p-px{padding:1px}.zd\:px-0{padding-inline:0}.zd\:px-2{padding-inline:calc(var(--zd-spacing) * 2)}.zd\:px-3{padding-inline:calc(var(--zd-spacing) * 3)}.zd\:px-4{padding-inline:calc(var(--zd-spacing) * 4)}.zd\:px-5{padding-inline:calc(var(--zd-spacing) * 5)}.zd\:px-6{padding-inline:calc(var(--zd-spacing) * 6)}.zd\:px-16{padding-inline:calc(var(--zd-spacing) * 16)}.zd\:py-1{padding-block:var(--zd-spacing)}.zd\:py-1\.5{padding-block:calc(var(--zd-spacing) * 1.5)}.zd\:py-2{padding-block:calc(var(--zd-spacing) * 2)}.zd\:py-3{padding-block:calc(var(--zd-spacing) * 3)}.zd\:py-3\.5{padding-block:calc(var(--zd-spacing) * 3.5)}.zd\:py-4{padding-block:calc(var(--zd-spacing) * 4)}.zd\:py-5{padding-block:calc(var(--zd-spacing) * 5)}.zd\:py-6{padding-block:calc(var(--zd-spacing) * 6)}.zd\:pt-0\.5{padding-top:calc(var(--zd-spacing) * .5)}.zd\:pt-2{padding-top:calc(var(--zd-spacing) * 2)}.zd\:pt-4{padding-top:calc(var(--zd-spacing) * 4)}.zd\:pt-7{padding-top:calc(var(--zd-spacing) * 7)}.zd\:pt-16{padding-top:calc(var(--zd-spacing) * 16)}.zd\:pr-1{padding-right:var(--zd-spacing)}.zd\:pr-2{padding-right:calc(var(--zd-spacing) * 2)}.zd\:pb-2{padding-bottom:calc(var(--zd-spacing) * 2)}.zd\:pb-3{padding-bottom:calc(var(--zd-spacing) * 3)}.zd\:pb-4{padding-bottom:calc(var(--zd-spacing) * 4)}.zd\:pb-6{padding-bottom:calc(var(--zd-spacing) * 6)}.zd\:pl-1{padding-left:var(--zd-spacing)}.zd\:pl-2{padding-left:calc(var(--zd-spacing) * 2)}.zd\:pl-3{padding-left:calc(var(--zd-spacing) * 3)}.zd\:pl-4{padding-left:calc(var(--zd-spacing) * 4)}.zd\:pl-6{padding-left:calc(var(--zd-spacing) * 6)}.zd\:pl-8{padding-left:calc(var(--zd-spacing) * 8)}.zd\:text-center{text-align:center}.zd\:text-left{text-align:left}.zd\:text-right{text-align:right}.zd\:font-roboto{font-family:Roboto,sans-serif}.zd\:font-sans{font-family:sans-serif}.zd\:text-2xl{font-size:calc(20px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-2xl--line-height))}.zd\:text-base{font-size:calc(14px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-base--line-height))}.zd\:text-body1{font-size:calc(16px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-body2{font-size:calc(14px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-body3{font-size:calc(12px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-body4{font-size:calc(10px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-h1{font-size:calc(42px * var(--zd-density));line-height:var(--tw-leading,110%)}.zd\:text-h2{font-size:calc(28px * var(--zd-density));line-height:var(--tw-leading,110%)}.zd\:text-h3{font-size:calc(18px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-lg{font-size:calc(16px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-lg--line-height))}.zd\:text-sm{font-size:calc(12px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-sm--line-height))}.zd\:text-xl{font-size:calc(18px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-xl--line-height))}.zd\:text-xs{font-size:calc(10px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-xs--line-height))}.zd\:font-bold{--tw-font-weight:var(--zd-font-weight-bold);font-weight:var(--zd-font-weight-bold)}.zd\:font-medium{--tw-font-weight:var(--zd-font-weight-medium);font-weight:var(--zd-font-weight-medium)}.zd\:font-semibold{--tw-font-weight:var(--zd-font-weight-semibold);font-weight:var(--zd-font-weight-semibold)}.zd\:break-all{word-break:break-all}.zd\:whitespace-nowrap{white-space:nowrap}.zd\:whitespace-pre-wrap{white-space:pre-wrap}.zd\:text-gray-400{color:var(--zd-color-gray-400)}.zd\:text-gray-500{color:var(--zd-color-gray-500)}.zd\:text-gray-700{color:var(--zd-color-gray-700)}.zd\:text-gray-900{color:var(--zd-color-gray-900)}.zd\:text-greyScale{color:#130e0b}.zd\:text-greyScale\/50{color:oklab(16.9052% .00636494 .00836386/.5)}.zd\:text-greyScale\/60{color:oklab(16.9052% .00636494 .00836386/.6)}.zd\:text-greyScale\/90{color:oklab(16.9052% .00636494 .00836386/.9)}.zd\:text-negative{color:#ff4221}.zd\:text-orange{color:#f27b3e}.zd\:text-positive{color:#228300}.zd\:text-red-500{color:var(--zd-color-red-500)}.zd\:text-solarOrange{color:#e76000}.zd\:text-white{color:var(--zd-color-white)}.zd\:underline{text-decoration-line:underline}.zd\:caret-gray-900{caret-color:var(--zd-color-gray-900)}.zd\:accent-solarOrange{accent-color:#e76000}.zd\:\[color-scheme\:light\]{color-scheme:light}.zd\:opacity-0{opacity:0}.zd\:opacity-30{opacity:.3}.zd\:opacity-50{opacity:.5}.zd\:shadow-\[0_8px_22px_-10px_rgba\(25\,17\,11\,0\.45\)\]{--tw-shadow:0 8px 22px -10px var(--tw-shadow-color,#19110b73);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-\[inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.1\)\,inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\],.zd\:shadow-\[inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.10\)\,inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\]{--tw-shadow:inset 0 -4px 4px 0 var(--tw-shadow-color,#ffffff1a), inset 0 3px 4px 0 var(--tw-shadow-color,#00000005);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-\[inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\,inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.1\)\]{--tw-shadow:inset 0 3px 4px 0 var(--tw-shadow-color,#00000005), inset 0 -4px 4px 0 var(--tw-shadow-color,#ffffff1a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:backdrop-blur-\[15px\]{--tw-backdrop-blur:blur(15px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.zd\:backdrop-blur-\[30px\]{--tw-backdrop-blur:blur(30px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.zd\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--zd-default-transition-timing-function));transition-duration:var(--tw-duration,var(--zd-default-transition-duration))}.zd\:outline-none{--tw-outline-style:none;outline-style:none}.zd\:select-none{-webkit-user-select:none;user-select:none}.zd\:placeholder\:text-gray-900\/50::placeholder{color:var(--zd-color-gray-900)}@supports (color:color-mix(in lab, red, red)){.zd\:placeholder\:text-gray-900\/50::placeholder{color:color-mix(in oklab, var(--zd-color-gray-900) 50%, transparent)}}@media (hover:hover){.zd\:hover\:bg-offWhite\/40:hover{background-color:oklab(97.0302% .000165075 .00696582/.4)}.zd\:hover\:bg-white\/5:hover{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab, var(--zd-color-white) 5%, transparent)}}.zd\:hover\:bg-white\/20:hover{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}}.zd\:active\:bg-white\/10:active{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:active\:bg-white\/10:active{background-color:color-mix(in oklab, var(--zd-color-white) 10%, transparent)}}.zd\:active\:bg-white\/30:active{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:active\:bg-white\/30:active{background-color:color-mix(in oklab, var(--zd-color-white) 30%, transparent)}}.zd\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.zd\:disabled\:opacity-50:disabled{opacity:.5}.zd\:data-\[highlighted\]\:bg-offWhite\/40[data-highlighted]{background-color:oklab(97.0302% .000165075 .00696582/.4)}.zd\:data-\[state\=checked\]\:bg-offWhite\/60[data-state=checked]{background-color:oklab(97.0302% .000165075 .00696582/.6)}.zd\:data-\[state\=closed\]\:animate-backdrop-out[data-state=closed]{animation:.2s ease-out forwards backdrop-out}.zd\:data-\[state\=closed\]\:animate-sheet-out[data-state=closed]{animation:.25s cubic-bezier(.32,.72,0,1) forwards sheet-out}.zd\:data-\[state\=delayed-open\]\:animate-popper-in[data-state=delayed-open]{animation:.16s ease-out both popper-in}.zd\:data-\[state\=open\]\:pointer-events-auto[data-state=open]{pointer-events:auto}.zd\:data-\[state\=open\]\:animate-backdrop-in[data-state=open]{animation:.2s ease-out forwards backdrop-in}.zd\:data-\[state\=open\]\:animate-popper-in[data-state=open]{animation:.16s ease-out both popper-in}.zd\:data-\[state\=open\]\:animate-sheet-in[data-state=open]{animation:.3s cubic-bezier(.32,.72,0,1) forwards sheet-in}:root{--zd-density:1}[data-zd-size]{--zd-spacing:calc(.25rem * var(--zd-density))}[data-zd-size=sm]{--zd-density:.8}[data-zd-size=md]{--zd-density:.9}[data-zd-size=lg]{--zd-density:1}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes sheet-in{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sheet-out{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes backdrop-in{0%{opacity:0}to{opacity:1}}@keyframes backdrop-out{0%{opacity:1}to{opacity:0}}@keyframes skel-pulse{0%,to{opacity:.65}50%{opacity:1}}@keyframes popper-in{0%{opacity:0;transform:scale(.97)translateY(-3px)}to{opacity:1;transform:scale(1)translateY(0)}}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}:root,:host{--zd-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--zd-color-red-500:oklch(63.7% .237 25.331);--zd-color-gray-50:oklch(98.5% .002 247.839);--zd-color-gray-100:oklch(96.7% .003 264.542);--zd-color-gray-400:oklch(70.7% .022 261.325);--zd-color-gray-500:oklch(55.1% .027 264.364);--zd-color-gray-700:oklch(37.3% .034 259.733);--zd-color-gray-900:oklch(21% .034 264.665);--zd-color-white:#fff;--zd-spacing:.25rem;--zd-container-md:28rem;--zd-text-xs--line-height:calc(1 / .75);--zd-text-sm--line-height:calc(1.25 / .875);--zd-text-base--line-height:calc(1.5 / 1);--zd-text-lg--line-height:calc(1.75 / 1.125);--zd-text-xl--line-height:calc(1.75 / 1.25);--zd-text-2xl--line-height:calc(2 / 1.5);--zd-font-weight-medium:500;--zd-font-weight-semibold:600;--zd-font-weight-bold:700;--zd-radius-md:.375rem;--zd-radius-lg:.5rem;--zd-radius-xl:.75rem;--zd-radius-2xl:1rem;--zd-radius-3xl:1.5rem;--zd-radius-4xl:2rem;--zd-animate-spin:spin 1s linear infinite;--zd-default-transition-duration:.15s;--zd-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--zd-default-font-family:sans-serif}.zd-scope{font-family:var(--zd-default-font-family,ui-sans-serif, system-ui, sans-serif);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;box-sizing:border-box;border:0 solid;margin:0;padding:0;line-height:1.5}.zd-scope :where(*){box-sizing:border-box;border:0 solid;margin:0;padding:0}.zd-scope :where(img,svg,video){max-width:100%;display:block}.zd-scope :where(img,video){height:auto}.zd-scope :where(button,input,textarea){font:inherit;letter-spacing:inherit;color:inherit;background:0 0;border-radius:0}.zd-scope :where(input,textarea)::placeholder{opacity:1;color:currentColor}@supports (color:color-mix(in lab, red, red)){.zd-scope :where(input,textarea)::placeholder{color:color-mix(in oklab, currentColor 50%, transparent)}}.zd-scope :where(textarea){resize:vertical}.zd-scope :where(a){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.zd-scope :where(ol,ul){list-style:none}.zd-scope :where(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}.zd-scope :where(pre){font-family:var(--zd-font-mono)}.zd\:pointer-events-none{pointer-events:none}.zd\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.zd\:absolute{position:absolute}.zd\:relative{position:relative}.zd\:inset-0{inset:0}.zd\:top-0{top:0}.zd\:top-1\/2{top:50%}.zd\:right-0{right:0}.zd\:right-1{right:var(--zd-spacing)}.zd\:bottom-0{bottom:0}.zd\:bottom-1{bottom:var(--zd-spacing)}.zd\:left-0{left:0}.zd\:left-1\/2{left:50%}.zd\:isolate{isolation:isolate}.zd\:z-0{z-index:0}.zd\:z-10{z-index:10}.zd\:z-20{z-index:20}.zd\:z-50{z-index:50}.zd\:m-1\.5{margin:calc(var(--zd-spacing) * 1.5)}.zd\:-mx-4{margin-inline:calc(var(--zd-spacing) * -4)}.zd\:mx-2{margin-inline:calc(var(--zd-spacing) * 2)}.zd\:my-1{margin-block:var(--zd-spacing)}.zd\:my-2{margin-block:calc(var(--zd-spacing) * 2)}.zd\:my-\[1\.5px\]{margin-block:1.5px}.zd\:mt-1{margin-top:var(--zd-spacing)}.zd\:mt-2{margin-top:calc(var(--zd-spacing) * 2)}.zd\:mt-3{margin-top:calc(var(--zd-spacing) * 3)}.zd\:mt-6{margin-top:calc(var(--zd-spacing) * 6)}.zd\:mb-1{margin-bottom:var(--zd-spacing)}.zd\:mb-1\.5{margin-bottom:calc(var(--zd-spacing) * 1.5)}.zd\:mb-2{margin-bottom:calc(var(--zd-spacing) * 2)}.zd\:mb-3{margin-bottom:calc(var(--zd-spacing) * 3)}.zd\:mb-4{margin-bottom:calc(var(--zd-spacing) * 4)}.zd\:flex{display:flex}.zd\:grid{display:grid}.zd\:hidden{display:none}.zd\:inline-block{display:inline-block}.zd\:inline-flex{display:inline-flex}.zd\:size-3{width:calc(var(--zd-spacing) * 3);height:calc(var(--zd-spacing) * 3)}.zd\:size-4{width:calc(var(--zd-spacing) * 4);height:calc(var(--zd-spacing) * 4)}.zd\:size-5{width:calc(var(--zd-spacing) * 5);height:calc(var(--zd-spacing) * 5)}.zd\:size-8\.5{width:calc(var(--zd-spacing) * 8.5);height:calc(var(--zd-spacing) * 8.5)}.zd\:size-10\.5{width:calc(var(--zd-spacing) * 10.5);height:calc(var(--zd-spacing) * 10.5)}.zd\:size-11{width:calc(var(--zd-spacing) * 11);height:calc(var(--zd-spacing) * 11)}.zd\:size-18\.5{width:calc(var(--zd-spacing) * 18.5);height:calc(var(--zd-spacing) * 18.5)}.zd\:size-full{width:100%;height:100%}.zd\:h-2\.5{height:calc(var(--zd-spacing) * 2.5)}.zd\:h-3{height:calc(var(--zd-spacing) * 3)}.zd\:h-3\.5{height:calc(var(--zd-spacing) * 3.5)}.zd\:h-4{height:calc(var(--zd-spacing) * 4)}.zd\:h-4\.5{height:calc(var(--zd-spacing) * 4.5)}.zd\:h-5{height:calc(var(--zd-spacing) * 5)}.zd\:h-6{height:calc(var(--zd-spacing) * 6)}.zd\:h-7{height:calc(var(--zd-spacing) * 7)}.zd\:h-8{height:calc(var(--zd-spacing) * 8)}.zd\:h-9{height:calc(var(--zd-spacing) * 9)}.zd\:h-10{height:calc(var(--zd-spacing) * 10)}.zd\:h-11{height:calc(var(--zd-spacing) * 11)}.zd\:h-12{height:calc(var(--zd-spacing) * 12)}.zd\:h-13{height:calc(var(--zd-spacing) * 13)}.zd\:h-16{height:calc(var(--zd-spacing) * 16)}.zd\:h-17{height:calc(var(--zd-spacing) * 17)}.zd\:h-32{height:calc(var(--zd-spacing) * 32)}.zd\:h-202\.5{height:calc(var(--zd-spacing) * 202.5)}.zd\:h-\[18px\]{height:18px}.zd\:h-\[52px\]{height:52px}.zd\:h-\[68px\]{height:68px}.zd\:h-\[84px\]{height:84px}.zd\:h-\[118px\]{height:118px}.zd\:h-\[176px\]{height:176px}.zd\:h-auto{height:auto}.zd\:h-full{height:100%}.zd\:h-px{height:1px}.zd\:max-h-48{max-height:calc(var(--zd-spacing) * 48)}.zd\:max-h-80{max-height:calc(var(--zd-spacing) * 80)}.zd\:max-h-202\.5{max-height:calc(var(--zd-spacing) * 202.5)}.zd\:max-h-full{max-height:100%}.zd\:min-h-0{min-height:0}.zd\:min-h-11{min-height:calc(var(--zd-spacing) * 11)}.zd\:min-h-75{min-height:calc(var(--zd-spacing) * 75)}.zd\:min-h-100{min-height:calc(var(--zd-spacing) * 100)}.zd\:w-1\/2{width:50%}.zd\:w-1\/3{width:33.3333%}.zd\:w-2\.5{width:calc(var(--zd-spacing) * 2.5)}.zd\:w-3{width:calc(var(--zd-spacing) * 3)}.zd\:w-3\.5{width:calc(var(--zd-spacing) * 3.5)}.zd\:w-4{width:calc(var(--zd-spacing) * 4)}.zd\:w-5{width:calc(var(--zd-spacing) * 5)}.zd\:w-6{width:calc(var(--zd-spacing) * 6)}.zd\:w-7{width:calc(var(--zd-spacing) * 7)}.zd\:w-8{width:calc(var(--zd-spacing) * 8)}.zd\:w-9{width:calc(var(--zd-spacing) * 9)}.zd\:w-10{width:calc(var(--zd-spacing) * 10)}.zd\:w-11{width:calc(var(--zd-spacing) * 11)}.zd\:w-12{width:calc(var(--zd-spacing) * 12)}.zd\:w-13{width:calc(var(--zd-spacing) * 13)}.zd\:w-14{width:calc(var(--zd-spacing) * 14)}.zd\:w-16{width:calc(var(--zd-spacing) * 16)}.zd\:w-24{width:calc(var(--zd-spacing) * 24)}.zd\:w-72{width:calc(var(--zd-spacing) * 72)}.zd\:w-80{width:calc(var(--zd-spacing) * 80)}.zd\:w-100{width:calc(var(--zd-spacing) * 100)}.zd\:w-125{width:calc(var(--zd-spacing) * 125)}.zd\:w-\[18px\]{width:18px}.zd\:w-\[52px\]{width:52px}.zd\:w-\[105px\]{width:105px}.zd\:w-\[118px\]{width:118px}.zd\:w-\[176px\]{width:176px}.zd\:w-auto{width:auto}.zd\:w-full{width:100%}.zd\:w-px{width:1px}.zd\:max-w-\[220px\]{max-width:220px}.zd\:max-w-full{max-width:100%}.zd\:max-w-md{max-width:var(--zd-container-md)}.zd\:min-w-0{min-width:0}.zd\:flex-1{flex:1}.zd\:shrink-0{flex-shrink:0}.zd\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.zd\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.zd\:animate-skel-pulse{animation:1.1s ease-in-out infinite skel-pulse}.zd\:animate-spin{animation:var(--zd-animate-spin)}.zd\:cursor-help{cursor:help}.zd\:cursor-not-allowed{cursor:not-allowed}.zd\:cursor-pointer{cursor:pointer}.zd\:cursor-text{cursor:text}.zd\:resize-none{resize:none}.zd\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.zd\:flex-col{flex-direction:column}.zd\:flex-row{flex-direction:row}.zd\:flex-wrap{flex-wrap:wrap}.zd\:place-items-center{place-items:center}.zd\:items-center{align-items:center}.zd\:items-end{align-items:flex-end}.zd\:items-start{align-items:flex-start}.zd\:justify-between{justify-content:space-between}.zd\:justify-center{justify-content:center}.zd\:gap-1{gap:var(--zd-spacing)}.zd\:gap-1\.5{gap:calc(var(--zd-spacing) * 1.5)}.zd\:gap-2{gap:calc(var(--zd-spacing) * 2)}.zd\:gap-3{gap:calc(var(--zd-spacing) * 3)}.zd\:gap-4{gap:calc(var(--zd-spacing) * 4)}.zd\:gap-5{gap:calc(var(--zd-spacing) * 5)}.zd\:gap-6{gap:calc(var(--zd-spacing) * 6)}.zd\:gap-8{gap:calc(var(--zd-spacing) * 8)}.zd\:gap-\[5px\]{gap:5px}.zd\:self-center{align-self:center}.zd\:self-end{align-self:flex-end}.zd\:self-start{align-self:flex-start}.zd\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zd\:overflow-auto{overflow:auto}.zd\:overflow-hidden{overflow:hidden}.zd\:overflow-x-hidden{overflow-x:hidden}.zd\:overflow-y-auto{overflow-y:auto}.zd\:rounded-2xl{border-radius:var(--zd-radius-2xl)}.zd\:rounded-3xl{border-radius:var(--zd-radius-3xl)}.zd\:rounded-4xl{border-radius:var(--zd-radius-4xl)}.zd\:rounded-\[14px\]{border-radius:14px}.zd\:rounded-\[30px\]{border-radius:30px}.zd\:rounded-\[32px\]{border-radius:32px}.zd\:rounded-\[34px\]{border-radius:34px}.zd\:rounded-\[38px\]{border-radius:38px}.zd\:rounded-full{border-radius:3.40282e38px}.zd\:rounded-lg{border-radius:var(--zd-radius-lg)}.zd\:rounded-md{border-radius:var(--zd-radius-md)}.zd\:rounded-xl{border-radius:var(--zd-radius-xl)}.zd\:border{border-style:var(--tw-border-style);border-width:1px}.zd\:border-2{border-style:var(--tw-border-style);border-width:2px}.zd\:border-\[0\.3px\]{border-style:var(--tw-border-style);border-width:.3px}.zd\:border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.zd\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.zd\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.zd\:border-gray-100{border-color:var(--zd-color-gray-100)}.zd\:border-greyScale{border-color:#130e0b}.zd\:border-greyScale\/10{border-color:oklab(16.9052% .00636494 .00836386/.1)}.zd\:border-greyScale\/30{border-color:oklab(16.9052% .00636494 .00836386/.3)}.zd\:border-negative{border-color:#ff4221}.zd\:border-offWhite{border-color:#f7f5f0}.zd\:border-offWhite\/50{border-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:border-solarOrange{border-color:#e76000}.zd\:border-transparent{border-color:#0000}.zd\:border-white\/0{border-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:border-white\/0{border-color:color-mix(in oklab, var(--zd-color-white) 0%, transparent)}}.zd\:border-white\/20{border-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:border-white\/20{border-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}.zd\:border-t-transparent{border-top-color:#0000}.zd\:bg-gray-50{background-color:var(--zd-color-gray-50)}.zd\:bg-greyScale\/5{background-color:oklab(16.9052% .00636494 .00836386/.05)}.zd\:bg-greyScale\/10{background-color:oklab(16.9052% .00636494 .00836386/.1)}.zd\:bg-greyScale\/15{background-color:oklab(16.9052% .00636494 .00836386/.15)}.zd\:bg-greyScale\/20{background-color:oklab(16.9052% .00636494 .00836386/.2)}.zd\:bg-greyScale\/30{background-color:oklab(16.9052% .00636494 .00836386/.3)}.zd\:bg-offWhite{background-color:#f7f5f0}.zd\:bg-offWhite\/50{background-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:bg-offWhite\/80{background-color:oklab(97.0302% .000165075 .00696582/.8)}.zd\:bg-offWhite\/85{background-color:oklab(97.0302% .000165075 .00696582/.85)}.zd\:bg-orange\/10{background-color:oklab(70.9342% .114827 .116983/.1)}.zd\:bg-solarOrange{background-color:#e76000}.zd\:bg-solarOrange\/60{background-color:oklab(65.138% .131584 .131685/.6)}.zd\:bg-transparent{background-color:#0000}.zd\:bg-white,.zd\:bg-white\/20{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/20{background-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}.zd\:bg-white\/40{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/40{background-color:color-mix(in oklab, var(--zd-color-white) 40%, transparent)}}.zd\:bg-white\/60{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/60{background-color:color-mix(in oklab, var(--zd-color-white) 60%, transparent)}}.zd\:bg-white\/70{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/70{background-color:color-mix(in oklab, var(--zd-color-white) 70%, transparent)}}.zd\:object-contain{object-fit:contain}.zd\:object-cover{object-fit:cover}.zd\:p-0{padding:0}.zd\:p-1{padding:var(--zd-spacing)}.zd\:p-2{padding:calc(var(--zd-spacing) * 2)}.zd\:p-3{padding:calc(var(--zd-spacing) * 3)}.zd\:p-4{padding:calc(var(--zd-spacing) * 4)}.zd\:p-6{padding:calc(var(--zd-spacing) * 6)}.zd\:p-px{padding:1px}.zd\:px-0{padding-inline:0}.zd\:px-2{padding-inline:calc(var(--zd-spacing) * 2)}.zd\:px-3{padding-inline:calc(var(--zd-spacing) * 3)}.zd\:px-4{padding-inline:calc(var(--zd-spacing) * 4)}.zd\:px-5{padding-inline:calc(var(--zd-spacing) * 5)}.zd\:px-6{padding-inline:calc(var(--zd-spacing) * 6)}.zd\:px-16{padding-inline:calc(var(--zd-spacing) * 16)}.zd\:py-1{padding-block:var(--zd-spacing)}.zd\:py-1\.5{padding-block:calc(var(--zd-spacing) * 1.5)}.zd\:py-2{padding-block:calc(var(--zd-spacing) * 2)}.zd\:py-3{padding-block:calc(var(--zd-spacing) * 3)}.zd\:py-3\.5{padding-block:calc(var(--zd-spacing) * 3.5)}.zd\:py-4{padding-block:calc(var(--zd-spacing) * 4)}.zd\:py-5{padding-block:calc(var(--zd-spacing) * 5)}.zd\:py-6{padding-block:calc(var(--zd-spacing) * 6)}.zd\:pt-0\.5{padding-top:calc(var(--zd-spacing) * .5)}.zd\:pt-2{padding-top:calc(var(--zd-spacing) * 2)}.zd\:pt-4{padding-top:calc(var(--zd-spacing) * 4)}.zd\:pt-7{padding-top:calc(var(--zd-spacing) * 7)}.zd\:pt-16{padding-top:calc(var(--zd-spacing) * 16)}.zd\:pr-1{padding-right:var(--zd-spacing)}.zd\:pr-2{padding-right:calc(var(--zd-spacing) * 2)}.zd\:pb-2{padding-bottom:calc(var(--zd-spacing) * 2)}.zd\:pb-3{padding-bottom:calc(var(--zd-spacing) * 3)}.zd\:pb-4{padding-bottom:calc(var(--zd-spacing) * 4)}.zd\:pb-6{padding-bottom:calc(var(--zd-spacing) * 6)}.zd\:pl-1{padding-left:var(--zd-spacing)}.zd\:pl-2{padding-left:calc(var(--zd-spacing) * 2)}.zd\:pl-3{padding-left:calc(var(--zd-spacing) * 3)}.zd\:pl-4{padding-left:calc(var(--zd-spacing) * 4)}.zd\:pl-6{padding-left:calc(var(--zd-spacing) * 6)}.zd\:pl-8{padding-left:calc(var(--zd-spacing) * 8)}.zd\:text-center{text-align:center}.zd\:text-left{text-align:left}.zd\:text-right{text-align:right}.zd\:font-roboto{font-family:Roboto,sans-serif}.zd\:font-sans{font-family:sans-serif}.zd\:text-2xl{font-size:calc(20px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-2xl--line-height))}.zd\:text-base{font-size:calc(14px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-base--line-height))}.zd\:text-body1{font-size:calc(16px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-body2{font-size:calc(14px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-body3{font-size:calc(12px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-body4{font-size:calc(10px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-h1{font-size:calc(42px * var(--zd-density));line-height:var(--tw-leading,110%)}.zd\:text-h2{font-size:calc(28px * var(--zd-density));line-height:var(--tw-leading,110%)}.zd\:text-h3{font-size:calc(18px * var(--zd-density));line-height:var(--tw-leading,130%)}.zd\:text-lg{font-size:calc(16px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-lg--line-height))}.zd\:text-sm{font-size:calc(12px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-sm--line-height))}.zd\:text-xl{font-size:calc(18px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-xl--line-height))}.zd\:text-xs{font-size:calc(10px * var(--zd-density));line-height:var(--tw-leading,var(--zd-text-xs--line-height))}.zd\:font-bold{--tw-font-weight:var(--zd-font-weight-bold);font-weight:var(--zd-font-weight-bold)}.zd\:font-medium{--tw-font-weight:var(--zd-font-weight-medium);font-weight:var(--zd-font-weight-medium)}.zd\:font-semibold{--tw-font-weight:var(--zd-font-weight-semibold);font-weight:var(--zd-font-weight-semibold)}.zd\:break-all{word-break:break-all}.zd\:whitespace-nowrap{white-space:nowrap}.zd\:whitespace-pre-wrap{white-space:pre-wrap}.zd\:text-gray-400{color:var(--zd-color-gray-400)}.zd\:text-gray-500{color:var(--zd-color-gray-500)}.zd\:text-gray-700{color:var(--zd-color-gray-700)}.zd\:text-gray-900{color:var(--zd-color-gray-900)}.zd\:text-greyScale{color:#130e0b}.zd\:text-greyScale\/50{color:oklab(16.9052% .00636494 .00836386/.5)}.zd\:text-greyScale\/60{color:oklab(16.9052% .00636494 .00836386/.6)}.zd\:text-greyScale\/90{color:oklab(16.9052% .00636494 .00836386/.9)}.zd\:text-negative{color:#ff4221}.zd\:text-orange{color:#f27b3e}.zd\:text-positive{color:#228300}.zd\:text-red-500{color:var(--zd-color-red-500)}.zd\:text-solarOrange{color:#e76000}.zd\:text-white{color:var(--zd-color-white)}.zd\:underline{text-decoration-line:underline}.zd\:caret-gray-900{caret-color:var(--zd-color-gray-900)}.zd\:accent-solarOrange{accent-color:#e76000}.zd\:\[color-scheme\:light\]{color-scheme:light}.zd\:opacity-0{opacity:0}.zd\:opacity-30{opacity:.3}.zd\:opacity-50{opacity:.5}.zd\:shadow-\[0_8px_22px_-10px_rgba\(25\,17\,11\,0\.45\)\]{--tw-shadow:0 8px 22px -10px var(--tw-shadow-color,#19110b73);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-\[inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.1\)\,inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\],.zd\:shadow-\[inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.10\)\,inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\]{--tw-shadow:inset 0 -4px 4px 0 var(--tw-shadow-color,#ffffff1a), inset 0 3px 4px 0 var(--tw-shadow-color,#00000005);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-\[inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\,inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.1\)\]{--tw-shadow:inset 0 3px 4px 0 var(--tw-shadow-color,#00000005), inset 0 -4px 4px 0 var(--tw-shadow-color,#ffffff1a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:backdrop-blur-\[15px\]{--tw-backdrop-blur:blur(15px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.zd\:backdrop-blur-\[30px\]{--tw-backdrop-blur:blur(30px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.zd\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--zd-default-transition-timing-function));transition-duration:var(--tw-duration,var(--zd-default-transition-duration))}.zd\:outline-none{--tw-outline-style:none;outline-style:none}.zd\:select-none{-webkit-user-select:none;user-select:none}.zd\:placeholder\:text-gray-900\/50::placeholder{color:var(--zd-color-gray-900)}@supports (color:color-mix(in lab, red, red)){.zd\:placeholder\:text-gray-900\/50::placeholder{color:color-mix(in oklab, var(--zd-color-gray-900) 50%, transparent)}}@media (hover:hover){.zd\:hover\:bg-offWhite\/40:hover{background-color:oklab(97.0302% .000165075 .00696582/.4)}.zd\:hover\:bg-white\/5:hover{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab, var(--zd-color-white) 5%, transparent)}}.zd\:hover\:bg-white\/20:hover{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}}.zd\:active\:bg-white\/10:active{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:active\:bg-white\/10:active{background-color:color-mix(in oklab, var(--zd-color-white) 10%, transparent)}}.zd\:active\:bg-white\/30:active{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:active\:bg-white\/30:active{background-color:color-mix(in oklab, var(--zd-color-white) 30%, transparent)}}.zd\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.zd\:disabled\:opacity-50:disabled{opacity:.5}.zd\:data-\[highlighted\]\:bg-offWhite\/40[data-highlighted]{background-color:oklab(97.0302% .000165075 .00696582/.4)}.zd\:data-\[state\=checked\]\:bg-offWhite\/60[data-state=checked]{background-color:oklab(97.0302% .000165075 .00696582/.6)}.zd\:data-\[state\=closed\]\:animate-backdrop-out[data-state=closed]{animation:.2s ease-out forwards backdrop-out}.zd\:data-\[state\=closed\]\:animate-sheet-out[data-state=closed]{animation:.25s cubic-bezier(.32,.72,0,1) forwards sheet-out}.zd\:data-\[state\=delayed-open\]\:animate-popper-in[data-state=delayed-open]{animation:.16s ease-out both popper-in}.zd\:data-\[state\=open\]\:pointer-events-auto[data-state=open]{pointer-events:auto}.zd\:data-\[state\=open\]\:animate-backdrop-in[data-state=open]{animation:.2s ease-out forwards backdrop-in}.zd\:data-\[state\=open\]\:animate-popper-in[data-state=open]{animation:.16s ease-out both popper-in}.zd\:data-\[state\=open\]\:animate-sheet-in[data-state=open]{animation:.3s cubic-bezier(.32,.72,0,1) forwards sheet-in}:root{--zd-density:1}[data-zd-size]{--zd-spacing:calc(.25rem * var(--zd-density))}[data-zd-size=sm]{--zd-density:.8}[data-zd-size=md]{--zd-density:.9}[data-zd-size=lg]{--zd-density:1}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes sheet-in{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sheet-out{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes backdrop-in{0%{opacity:0}to{opacity:1}}@keyframes backdrop-out{0%{opacity:1}to{opacity:0}}@keyframes skel-pulse{0%,to{opacity:.65}50%{opacity:1}}@keyframes popper-in{0%{opacity:0;transform:scale(.97)translateY(-3px)}to{opacity:1;transform:scale(1)translateY(0)}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodev/wallet-react-ui",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "React wallet UI kit for ZeroDev (auth + signing flows)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -43,7 +43,9 @@
43
43
  "web3"
44
44
  ],
45
45
  "dependencies": {
46
- "@zerodev/react-ui": "0.0.7"
46
+ "@walletconnect/ethereum-provider": "^2.21.1",
47
+ "zustand": "^5.0.3",
48
+ "@zerodev/react-ui": "0.0.8"
47
49
  },
48
50
  "peerDependencies": {
49
51
  "@tanstack/react-query": "^5.0.0",
@@ -52,9 +54,8 @@
52
54
  "react-dom": "^18.0.0 || ^19.0.0",
53
55
  "viem": "^2.47.18",
54
56
  "wagmi": "^2.19.0 || ^3.0.0",
55
- "zustand": "^5.0.3",
56
- "@zerodev/wallet-core": "0.0.5",
57
- "@zerodev/wallet-react": "0.0.7"
57
+ "@zerodev/wallet-react": "0.0.8",
58
+ "@zerodev/wallet-core": "0.0.5"
58
59
  },
59
60
  "devDependencies": {
60
61
  "@storybook/addon-a11y": "^10.3.3",
package/src/assets.d.ts CHANGED
@@ -12,3 +12,8 @@ declare module '*.webm' {
12
12
  const src: string
13
13
  export default src
14
14
  }
15
+
16
+ declare module '*.svg?url' {
17
+ const src: string
18
+ export default src
19
+ }
@@ -0,0 +1,5 @@
1
+ import url from './assets/wallet-connect.svg?url'
2
+
3
+ // Typed explicitly so the emitted d.ts is self-contained — a bare re-export
4
+ // would leak the `.svg?url` specifier into consumers' typecheck.
5
+ export const walletConnectLogo: string = url
@@ -0,0 +1,220 @@
1
+ import {
2
+ BottomSheet,
3
+ BottomSheetClose,
4
+ BottomSheetContent,
5
+ BottomSheetTitle,
6
+ Button,
7
+ QrCode,
8
+ Text,
9
+ } from '@zerodev/react-ui'
10
+ import { useState } from 'react'
11
+ import { useConnect, useConnectors } from 'wagmi'
12
+ import { walletConnectLogo } from '../../brandAssets'
13
+ import { useAuth } from '../../hooks/useAuth'
14
+ import type { WalletConnectPairing } from '../../hooks/useWalletConnectPairing'
15
+ import { isCancellationError } from '../../utils/isCancellationError'
16
+ import { matchesWallet, type WalletGuideEntry } from '../../walletGuide'
17
+
18
+ export type WalletSheetProps = {
19
+ open: boolean
20
+ onOpenChange: (open: boolean) => void
21
+ /** Absent = generic WalletConnect mode (raw-URI QR, no tabs). */
22
+ wallet?: WalletGuideEntry | undefined
23
+ /** Page-level pairing (preloaded by the SignUp root) shared by every wallet
24
+ * surface. */
25
+ pairing: WalletConnectPairing
26
+ }
27
+
28
+ /**
29
+ * Bottom sheet with the connection paths for one wallet (or the generic
30
+ * WalletConnect pairing). The pairing is preloaded at page level so the QR is
31
+ * ready on open and mobile row taps can deep-link synchronously; when the
32
+ * proposal expires, WalletConnect rejects the pending connect and the error
33
+ * branch offers Try again.
34
+ */
35
+ export function WalletSheet({
36
+ open,
37
+ onOpenChange,
38
+ wallet,
39
+ pairing,
40
+ }: WalletSheetProps) {
41
+ return (
42
+ <BottomSheet open={open} onOpenChange={onOpenChange}>
43
+ <BottomSheetContent className="zd:p-4">
44
+ <BottomSheetTitle>
45
+ {wallet ? `Connect ${wallet.name}` : 'WalletConnect'}
46
+ </BottomSheetTitle>
47
+ <SheetBody wallet={wallet} pairing={pairing} />
48
+ </BottomSheetContent>
49
+ </BottomSheet>
50
+ )
51
+ }
52
+
53
+ function SheetBody({
54
+ wallet,
55
+ pairing,
56
+ }: {
57
+ wallet?: WalletGuideEntry | undefined
58
+ pairing: WalletConnectPairing
59
+ }) {
60
+ const { goToStep } = useAuth()
61
+ const { uri, error, retry } = pairing
62
+ const connectors = useConnectors()
63
+ const { connect } = useConnect()
64
+
65
+ // Installed (announced/configured) connector for the selected wallet —
66
+ // drives the Browser tab: connect directly instead of "get the extension".
67
+ const installed = wallet
68
+ ? connectors.find((c) => matchesWallet(c, wallet))
69
+ : undefined
70
+ const [tab, setTab] = useState<'mobile' | 'browser'>(
71
+ installed ? 'browser' : 'mobile',
72
+ )
73
+ const [connectError, setConnectError] = useState<string | null>(null)
74
+ const [copied, setCopied] = useState(false)
75
+
76
+ // Wallet-specific QR encodes the wallet's own deep link so phone cameras
77
+ // route to THAT app (`wc:` is claimed by every wallet app). Generic mode
78
+ // keeps the raw URI so any wallet's in-app scanner can claim the pairing.
79
+ const qrValue =
80
+ uri && wallet?.mobileLink
81
+ ? `${wallet.mobileLink}${encodeURIComponent(uri)}`
82
+ : uri
83
+
84
+ const copyUri = async () => {
85
+ if (!uri) return
86
+ // Clipboard access throws in insecure contexts (non-HTTPS) or when the
87
+ // user denies it — don't let that surface as an unhandled rejection.
88
+ try {
89
+ await navigator.clipboard.writeText(uri)
90
+ setCopied(true)
91
+ setTimeout(() => setCopied(false), 2000)
92
+ } catch {
93
+ // No clipboard — the QR / deep link remain the primary paths.
94
+ }
95
+ }
96
+
97
+ const connectInstalled = () => {
98
+ if (!installed) return
99
+ setConnectError(null)
100
+ connect(
101
+ { connector: installed },
102
+ {
103
+ onSuccess: () => goToStep(null),
104
+ onError: (err) => {
105
+ if (!isCancellationError(err)) {
106
+ setConnectError(err instanceof Error ? err.message : String(err))
107
+ }
108
+ },
109
+ },
110
+ )
111
+ }
112
+
113
+ const shownError = error ?? connectError
114
+
115
+ return (
116
+ <div className="zd:flex zd:flex-col zd:items-center zd:gap-3">
117
+ <div className="zd:flex zd:w-full zd:items-center zd:gap-2">
118
+ <img
119
+ src={wallet ? wallet.icon : walletConnectLogo}
120
+ alt=""
121
+ className="zd:w-8 zd:h-8 zd:rounded-xl"
122
+ />
123
+ <Text className="zd:text-h3 zd:flex-1">
124
+ {wallet ? wallet.name : 'WalletConnect'}
125
+ </Text>
126
+ <BottomSheetClose asChild>
127
+ <button
128
+ type="button"
129
+ aria-label="Close"
130
+ className="zd:cursor-pointer zd:px-2 zd:text-greyScale/60"
131
+ >
132
+
133
+ </button>
134
+ </BottomSheetClose>
135
+ </div>
136
+
137
+ {wallet && (
138
+ <div className="zd:flex zd:w-full zd:gap-2">
139
+ {(['mobile', 'browser'] as const).map((t) => (
140
+ <button
141
+ key={t}
142
+ type="button"
143
+ onClick={() => setTab(t)}
144
+ className={`zd:flex-1 zd:rounded-2xl zd:py-1.5 zd:text-body3 zd:cursor-pointer ${
145
+ tab === t
146
+ ? 'zd:bg-greyScale/10 zd:font-semibold'
147
+ : 'zd:text-greyScale/60'
148
+ }`}
149
+ >
150
+ {t === 'mobile' ? 'Mobile' : 'Browser'}
151
+ </button>
152
+ ))}
153
+ </div>
154
+ )}
155
+
156
+ {!wallet || tab === 'mobile' ? (
157
+ shownError ? (
158
+ <div className="zd:flex zd:flex-col zd:gap-2 zd:items-center">
159
+ <Text className="zd:text-center zd:text-red-500">{shownError}</Text>
160
+ <Button action="secondary" text="Try again" onClick={retry} />
161
+ </div>
162
+ ) : (
163
+ <>
164
+ <div className="zd:bg-white zd:rounded-2xl zd:p-2 zd:border zd:border-greyScale/10">
165
+ {qrValue ? (
166
+ <QrCode value={qrValue} size={176} />
167
+ ) : (
168
+ <div className="zd:w-[176px] zd:h-[176px] zd:flex zd:items-center zd:justify-center">
169
+ <div className="zd:w-8 zd:h-8 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin" />
170
+ </div>
171
+ )}
172
+ </div>
173
+ {qrValue && wallet?.mobileLink && (
174
+ <a
175
+ href={qrValue}
176
+ className="zd:w-full zd:rounded-2xl zd:bg-greyScale/10 zd:py-2 zd:text-center zd:text-body2 zd:font-semibold"
177
+ >
178
+ Open in {wallet.name}
179
+ </a>
180
+ )}
181
+ <Button
182
+ action="secondary"
183
+ text={copied ? 'Copied' : 'Copy link'}
184
+ onClick={copyUri}
185
+ disabled={!qrValue}
186
+ />
187
+ </>
188
+ )
189
+ ) : shownError ? (
190
+ <div className="zd:flex zd:flex-col zd:gap-2 zd:items-center">
191
+ <Text className="zd:text-center zd:text-red-500">{shownError}</Text>
192
+ <Button
193
+ action="secondary"
194
+ text="Try again"
195
+ onClick={installed ? connectInstalled : retry}
196
+ />
197
+ </div>
198
+ ) : installed && wallet ? (
199
+ <button
200
+ type="button"
201
+ onClick={connectInstalled}
202
+ className="zd:w-full zd:cursor-pointer zd:rounded-2xl zd:bg-greyScale/10 zd:py-2 zd:text-center zd:text-body2 zd:font-semibold"
203
+ >
204
+ Open in {wallet.name}
205
+ </button>
206
+ ) : (
207
+ wallet && (
208
+ <a
209
+ href={wallet.downloadUrl}
210
+ target="_blank"
211
+ rel="noopener noreferrer"
212
+ className="zd:w-full zd:rounded-2xl zd:bg-greyScale/10 zd:py-2 zd:text-center zd:text-body2 zd:font-semibold"
213
+ >
214
+ Get {wallet.name}
215
+ </a>
216
+ )
217
+ )}
218
+ </div>
219
+ )
220
+ }
@@ -0,0 +1,134 @@
1
+ import { useEffect, useRef, useState } from 'react'
2
+ import {
3
+ type Connector,
4
+ useAccount,
5
+ useConnect,
6
+ useConnections,
7
+ useConnectors,
8
+ } from 'wagmi'
9
+ import { isMobile } from '../utils/isMobile'
10
+ import { isZeroDevWalletConnect } from '../utils/isZeroDevWalletConnect'
11
+ import { walletDeepLink } from '../utils/walletDeepLink'
12
+ import type { WalletGuideEntry } from '../walletGuide'
13
+ import { useAuth } from './useAuth'
14
+
15
+ type WcExpiryEvents = {
16
+ on: (event: 'proposal_expire', listener: () => void) => unknown
17
+ off: (event: 'proposal_expire', listener: () => void) => unknown
18
+ }
19
+ /** The slice of `@walletconnect/ethereum-provider` this hook touches: the
20
+ * provider emits `connect` only when a session settles fresh (a pairing the
21
+ * user just approved) — never for a session restored from storage — and the
22
+ * sign-client's emitter fires `proposal_expire` when the pairing offer's TTL
23
+ * runs out. */
24
+ type WcPairingProvider = {
25
+ on: (event: 'connect', listener: () => void) => unknown
26
+ off: (event: 'connect', listener: () => void) => unknown
27
+ signer?: { client?: { events?: WcExpiryEvents } }
28
+ }
29
+
30
+ export type WalletConnectPairing = {
31
+ /** Pairing URI from the connector's `display_uri` event; null until it
32
+ * arrives (or after a retry reset). */
33
+ uri: string | null
34
+ error: string | null
35
+ retry: () => void
36
+ /** Wrapped deep link for the one-tap mobile redirect into `wallet`'s app,
37
+ * or null when the tap should just open the sheet (desktop, claiming
38
+ * installed connector, no usable URI). An errored pairing — including
39
+ * WalletConnect's own proposal expiry — never redirects. */
40
+ deepLinkFor: (wallet: WalletGuideEntry) => string | null
41
+ }
42
+
43
+ /**
44
+ * Runs one WalletConnect pairing for the lifetime of the mounting component —
45
+ * mount kicks it, unmount abandons it.
46
+ */
47
+ export function useWalletConnectPairing(): WalletConnectPairing {
48
+ const { goToStep } = useAuth()
49
+ const connectors = useConnectors()
50
+ const wcConnector = connectors.find(isZeroDevWalletConnect)
51
+ const { connect } = useConnect()
52
+ // A restored WC session means the connector is already live — kicking
53
+ // connect() on it would throw ConnectorAlreadyConnectedError.
54
+ const connections = useConnections()
55
+ const wcConnected = connections.some(
56
+ (c) => c.connector.uid === wcConnector?.uid,
57
+ )
58
+ // While wagmi is still rehydrating persisted sessions, hold the pairing
59
+ // kick — a connector mid-restore may be about to come back as connected.
60
+ const { isReconnecting } = useAccount()
61
+
62
+ const [uri, setUri] = useState<string | null>(null)
63
+ const [error, setError] = useState<string | null>(null)
64
+ const startedRef = useRef(false)
65
+
66
+ const startConnect = (target: Connector) => {
67
+ setError(null)
68
+ setUri(null)
69
+ connect({ connector: target }, { onError: (err) => setError(err.message) })
70
+ }
71
+ // biome-ignore lint/correctness/useExhaustiveDependencies: mount-only pairing setup — startConnect closes over kick-time callbacks (connect, goToStep), which must not retrigger the subscription
72
+ useEffect(() => {
73
+ if (!wcConnector || wcConnected) return
74
+ const onMessage = ({ type, data }: { type: string; data?: unknown }) => {
75
+ if (type === 'display_uri' && typeof data === 'string') setUri(data)
76
+ }
77
+ // Subscribe before the connect kick — `display_uri` fires mid-connect.
78
+ wcConnector.emitter.on('message', onMessage)
79
+
80
+ // Expiry comes from the sign-client's own event, not the connect
81
+ // mutation — this subscription is re-established every effect run, so it
82
+ // survives Strict Mode where the mutation's `onError` does not.
83
+ const onExpire = () => setError('Proposal expired')
84
+ // Success is the provider's `connect` event — emitted only when a session
85
+ // settles fresh (the user approved a pairing), never when wagmi restores
86
+ // a persisted session, so rehydration can't close a flow the user is
87
+ // looking at. Whether an already-connected user should see sign-up at
88
+ // all stays the host's `isConnected` decision.
89
+ const onConnect = () => goToStep(null)
90
+
91
+ let wcProvider: WcPairingProvider | undefined
92
+ let disposed = false
93
+
94
+ wcConnector
95
+ .getProvider()
96
+ .then((provider) => {
97
+ if (disposed) return
98
+ wcProvider = provider as WcPairingProvider
99
+ wcProvider.signer?.client?.events?.on('proposal_expire', onExpire)
100
+ wcProvider.on('connect', onConnect)
101
+ })
102
+ .catch((err) => {
103
+ // Provider init failed — surface through the pairing's error state
104
+ // instead of an unhandled rejection.
105
+ if (!disposed)
106
+ setError(err instanceof Error ? err.message : String(err))
107
+ })
108
+ if (!startedRef.current && !isReconnecting) {
109
+ startedRef.current = true
110
+ startConnect(wcConnector)
111
+ }
112
+ return () => {
113
+ disposed = true
114
+ wcProvider?.signer?.client?.events?.off('proposal_expire', onExpire)
115
+ wcProvider?.off('connect', onConnect)
116
+ wcConnector.emitter.off('message', onMessage)
117
+ }
118
+ }, [wcConnector, wcConnected, isReconnecting])
119
+
120
+ return {
121
+ uri,
122
+ error,
123
+ retry: () => {
124
+ if (wcConnector) startConnect(wcConnector)
125
+ },
126
+ deepLinkFor: (wallet) =>
127
+ walletDeepLink({
128
+ wallet,
129
+ connectors,
130
+ uri: error ? null : uri,
131
+ mobile: isMobile(),
132
+ }),
133
+ }
134
+ }
@@ -0,0 +1,145 @@
1
+ import { useEffect, useMemo, useState } from 'react'
2
+ import { useAccount } from 'wagmi'
3
+ import {
4
+ matchesWallet,
5
+ WALLET_GUIDE,
6
+ type WalletGuideEntry,
7
+ type WalletId,
8
+ } from '../walletGuide'
9
+
10
+ /** How the active connection reaches the wallet. */
11
+ export type WalletSource = 'injected' | 'walletconnect' | 'embedded' | 'other'
12
+
13
+ export type WalletInfo = {
14
+ /** Human-readable wallet name ('MetaMask', 'Trust Wallet', …). */
15
+ name?: string | undefined
16
+ /** Wallet icon URL or data: URI, when one is known. */
17
+ icon?: string | undefined
18
+ /** Guide id when the wallet matches the kit's wallet guide. */
19
+ walletId?: WalletId | undefined
20
+ source: WalletSource
21
+ }
22
+
23
+ /** The slice of `@walletconnect/ethereum-provider` this hook reads. */
24
+ type WcPeerProvider = {
25
+ session?: {
26
+ peer?: {
27
+ metadata?: { name?: string; icons?: readonly string[] }
28
+ }
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Guide entry for a WalletConnect peer, matched by name. Peers report their
34
+ * own branding ('MetaMask Wallet', 'Trust Wallet', …), so match by
35
+ * case-insensitive containment in either direction against the guide names.
36
+ */
37
+ function guideEntryForPeerName(name: string): WalletGuideEntry | undefined {
38
+ const peer = name.toLowerCase()
39
+ return WALLET_GUIDE.find((wallet) => {
40
+ const guide = wallet.name.toLowerCase()
41
+ return peer.includes(guide) || guide.includes(peer)
42
+ })
43
+ }
44
+
45
+ function guideEntryForConnector(connector: {
46
+ id: string
47
+ name?: string
48
+ type?: string
49
+ rdns?: string | readonly string[] | undefined
50
+ }): WalletGuideEntry | undefined {
51
+ return WALLET_GUIDE.find((wallet) => matchesWallet(connector, wallet))
52
+ }
53
+
54
+ function useResolvedWalletInfo(): WalletInfo | undefined {
55
+ const { connector, isConnected } = useAccount()
56
+ const [peerMetadata, setPeerMetadata] = useState<
57
+ { name?: string; icons?: readonly string[] } | undefined
58
+ >(undefined)
59
+
60
+ const isWalletConnect = !!connector && connector.type === 'walletConnect'
61
+
62
+ useEffect(() => {
63
+ if (!connector || !isWalletConnect) {
64
+ setPeerMetadata(undefined)
65
+ return
66
+ }
67
+ let cancelled = false
68
+ connector
69
+ .getProvider()
70
+ .then((provider) => {
71
+ if (cancelled) return
72
+ const metadata = (provider as WcPeerProvider).session?.peer?.metadata
73
+ setPeerMetadata(metadata)
74
+ })
75
+ .catch(() => {
76
+ // Provider unavailable (torn down mid-flight) — stay unresolved.
77
+ })
78
+ return () => {
79
+ cancelled = true
80
+ }
81
+ }, [connector, isWalletConnect])
82
+
83
+ // Memoized so the identity is reference-stable across renders: consumers
84
+ // put `walletInfo` in effect deps (analytics on wallet change), and a fresh
85
+ // object every render would fire those on every render instead.
86
+ return useMemo((): WalletInfo | undefined => {
87
+ if (!isConnected || !connector) return undefined
88
+
89
+ if (connector.id === 'zerodev-wallet') {
90
+ return {
91
+ name: connector.name,
92
+ icon: connector.icon,
93
+ source: 'embedded',
94
+ }
95
+ }
96
+
97
+ if (isWalletConnect) {
98
+ const entry = peerMetadata?.name
99
+ ? guideEntryForPeerName(peerMetadata.name)
100
+ : undefined
101
+ return {
102
+ name: peerMetadata?.name ?? undefined,
103
+ icon: peerMetadata?.icons?.[0] ?? entry?.icon,
104
+ walletId: entry?.id as WalletId | undefined,
105
+ // Identity is about the session, so a raw walletConnect() connector
106
+ // resolves here too — unlike pairing, which is kit-connector-only.
107
+ source: 'walletconnect',
108
+ }
109
+ }
110
+
111
+ const entry = guideEntryForConnector(connector)
112
+
113
+ return {
114
+ name: connector.name,
115
+ icon: connector.icon ?? entry?.icon,
116
+ walletId: entry?.id as WalletId | undefined,
117
+ source: connector.type === 'injected' ? 'injected' : 'other',
118
+ }
119
+ }, [connector, isConnected, isWalletConnect, peerMetadata])
120
+ }
121
+
122
+ /**
123
+ * Identity of the wallet behind the active wagmi connection, for
124
+ * wallet-specific handling and analytics attribution. Call-compatible with
125
+ * AppKit's `useWalletInfo` — same name, same `{ walletInfo }` return shape,
126
+ * so migrating is an import swap; `walletId` and `source` are kit extras.
127
+ *
128
+ * wagmi's `useAccount().connector` already names injected wallets, but a
129
+ * WalletConnect connection only reports "WalletConnect" — the actual wallet
130
+ * on the other end (Trust, Rainbow, … on a phone) is in the session's peer
131
+ * metadata, which this hook reads from the provider. `walletInfo` is
132
+ * `undefined` while disconnected, and the WalletConnect case resolves
133
+ * asynchronously (briefly `name: undefined` after connect/reload).
134
+ *
135
+ * @param _namespace - Accepted for AppKit call-compatibility ('eip155');
136
+ * ignored — the kit is EVM-only.
137
+ */
138
+ export function useWalletInfo(_namespace?: string): {
139
+ walletInfo: WalletInfo | undefined
140
+ } {
141
+ const walletInfo = useResolvedWalletInfo()
142
+ // The wrapper is memoized too, so the returned object is stable for
143
+ // consumers that depend on it whole rather than destructuring.
144
+ return useMemo(() => ({ walletInfo }), [walletInfo])
145
+ }