@zerodev/react-ui 0.0.2 → 0.0.4

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 (72) hide show
  1. package/README.md +1 -0
  2. package/dist/_types/components/ArrowCardPair/index.d.ts +10 -0
  3. package/dist/_types/components/ArrowCardPair/index.d.ts.map +1 -0
  4. package/dist/_types/components/Badge/index.d.ts +1 -1
  5. package/dist/_types/components/Badge/index.d.ts.map +1 -1
  6. package/dist/_types/components/BottomSheet/index.d.ts +17 -0
  7. package/dist/_types/components/BottomSheet/index.d.ts.map +1 -0
  8. package/dist/_types/components/Button/index.d.ts +1 -1
  9. package/dist/_types/components/Button/index.d.ts.map +1 -1
  10. package/dist/_types/components/Callout/index.d.ts +1 -1
  11. package/dist/_types/components/Callout/index.d.ts.map +1 -1
  12. package/dist/_types/components/DataRow/index.d.ts +33 -0
  13. package/dist/_types/components/DataRow/index.d.ts.map +1 -0
  14. package/dist/_types/components/Icon/index.d.ts +1 -1
  15. package/dist/_types/components/Icon/index.d.ts.map +1 -1
  16. package/dist/_types/components/IconButton/index.d.ts +1 -1
  17. package/dist/_types/components/IconButton/index.d.ts.map +1 -1
  18. package/dist/_types/components/Input/index.d.ts +1 -1
  19. package/dist/_types/components/Input/index.d.ts.map +1 -1
  20. package/dist/_types/components/ListItem/index.d.ts +32 -15
  21. package/dist/_types/components/ListItem/index.d.ts.map +1 -1
  22. package/dist/_types/components/Pill/index.d.ts +25 -0
  23. package/dist/_types/components/Pill/index.d.ts.map +1 -0
  24. package/dist/_types/components/PoweredBy/index.d.ts +6 -0
  25. package/dist/_types/components/PoweredBy/index.d.ts.map +1 -0
  26. package/dist/_types/components/Screen/EllipticalRadial.d.ts +23 -0
  27. package/dist/_types/components/Screen/EllipticalRadial.d.ts.map +1 -0
  28. package/dist/_types/components/Screen/MultiRadialBackground.d.ts +4 -0
  29. package/dist/_types/components/Screen/MultiRadialBackground.d.ts.map +1 -0
  30. package/dist/_types/components/Screen/index.d.ts +15 -0
  31. package/dist/_types/components/Screen/index.d.ts.map +1 -0
  32. package/dist/_types/components/Select/index.d.ts +28 -0
  33. package/dist/_types/components/Select/index.d.ts.map +1 -0
  34. package/dist/_types/components/Switch/index.d.ts +1 -1
  35. package/dist/_types/components/Switch/index.d.ts.map +1 -1
  36. package/dist/_types/components/Text/index.d.ts +1 -1
  37. package/dist/_types/components/Text/index.d.ts.map +1 -1
  38. package/dist/_types/components/TokenListItem/index.d.ts +33 -0
  39. package/dist/_types/components/TokenListItem/index.d.ts.map +1 -0
  40. package/dist/_types/components/TopNav/index.d.ts +20 -0
  41. package/dist/_types/components/TopNav/index.d.ts.map +1 -0
  42. package/dist/_types/components/WrappedPressable/index.d.ts +1 -1
  43. package/dist/_types/components/WrappedPressable/index.d.ts.map +1 -1
  44. package/dist/_types/components/Wrapper/index.d.ts +3 -2
  45. package/dist/_types/components/Wrapper/index.d.ts.map +1 -1
  46. package/dist/_types/components/ZeroDevLogo/index.d.ts +12 -0
  47. package/dist/_types/components/ZeroDevLogo/index.d.ts.map +1 -0
  48. package/dist/_types/index.d.ts +11 -1
  49. package/dist/_types/index.d.ts.map +1 -1
  50. package/dist/index.cjs +111 -1
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.mjs +6164 -1199
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/styles.css +2 -2
  55. package/package.json +7 -5
  56. package/src/components/ArrowCardPair/index.tsx +148 -0
  57. package/src/components/BottomSheet/index.tsx +57 -0
  58. package/src/components/DataRow/index.tsx +140 -0
  59. package/src/components/ListItem/index.tsx +74 -79
  60. package/src/components/Pill/index.tsx +167 -0
  61. package/src/components/PoweredBy/index.tsx +29 -0
  62. package/src/components/Screen/EllipticalRadial.tsx +65 -0
  63. package/src/components/Screen/MultiRadialBackground.tsx +323 -0
  64. package/src/components/Screen/index.tsx +121 -0
  65. package/src/components/Select/index.tsx +153 -0
  66. package/src/components/TokenListItem/index.tsx +192 -0
  67. package/src/components/TopNav/index.tsx +67 -0
  68. package/src/components/Wrapper/index.tsx +4 -1
  69. package/src/components/ZeroDevLogo/index.tsx +55 -0
  70. package/src/index.ts +50 -0
  71. package/src/svg.d.ts +9 -0
  72. package/tailwind.config.ts +39 -0
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
- /*! tailwindcss v4.2.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-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}}}@layer theme{:root,:host{--zd-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--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-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-2xl--line-height:calc(2 / 1.5);--zd-font-weight-medium:500;--zd-font-weight-semibold:600;--zd-font-weight-bold:700;--zd-radius-lg:.5rem;--zd-radius-xl:.75rem;--zd-radius-2xl:1rem;--zd-radius-3xl:1.5rem;--zd-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--zd-default-transition-duration:.15s;--zd-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--zd-default-font-family:sans-serif;--zd-default-mono-font-family:var(--zd-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--zd-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--zd-default-font-feature-settings,normal);font-variation-settings:var(--zd-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--zd-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--zd-default-mono-font-feature-settings,normal);font-variation-settings:var(--zd-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.zd\:pointer-events-none{pointer-events:none}.zd\:absolute{position:absolute}.zd\:relative{position:relative}.zd\:inset-0{inset:calc(var(--zd-spacing) * 0)}.zd\:mb-2{margin-bottom:calc(var(--zd-spacing) * 2)}.zd\:flex{display:flex}.zd\:grid{display:grid}.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-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-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-full{height:100%}.zd\:min-h-11{min-height:calc(var(--zd-spacing) * 11)}.zd\:min-h-\[300px\]{min-height:300px}.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-5{width:calc(var(--zd-spacing) * 5)}.zd\:w-6{width:calc(var(--zd-spacing) * 6)}.zd\:w-13{width:calc(var(--zd-spacing) * 13)}.zd\:w-14{width:calc(var(--zd-spacing) * 14)}.zd\:w-72{width:calc(var(--zd-spacing) * 72)}.zd\:w-80{width:calc(var(--zd-spacing) * 80)}.zd\:w-full{width:100%}.zd\:min-w-0{min-width:calc(var(--zd-spacing) * 0)}.zd\:min-w-\[400px\]{min-width:400px}.zd\:flex-1{flex:1}.zd\:shrink-0{flex-shrink:0}.zd\:animate-pulse{animation:var(--zd-animate-pulse)}.zd\:cursor-not-allowed{cursor:not-allowed}.zd\:cursor-pointer{cursor:pointer}.zd\:resize-none{resize:none}.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\:justify-between{justify-content:space-between}.zd\:justify-center{justify-content:center}.zd\:gap-1{gap:calc(var(--zd-spacing) * 1)}.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\:self-end{align-self:flex-end}.zd\:self-start{align-self:flex-start}.zd\:overflow-hidden{overflow:hidden}.zd\:rounded-2xl{border-radius:var(--zd-radius-2xl)}.zd\:rounded-3xl{border-radius:var(--zd-radius-3xl)}.zd\:rounded-full{border-radius:3.40282e38px}.zd\:rounded-lg{border-radius:var(--zd-radius-lg)}.zd\:rounded-xl{border-radius:var(--zd-radius-xl)}.zd\:border-0{border-style:var(--tw-border-style);border-width:0}.zd\:border-\[0\.3px\]{border-style:var(--tw-border-style);border-width:.3px}.zd\:border-offWhite{border-color:#f7f5f0}.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\:bg-greyScale\/30{background-color:oklab(16.9052% .00636494 .00836386/.3)}.zd\:bg-offWhite\/50{background-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:bg-orange\/10{background-color:oklab(70.9342% .114827 .116983/.1)}.zd\:bg-solarOrange{background-color:#e76000}.zd\:bg-solarOrange\/15{background-color:oklab(65.138% .131584 .131685/.15)}.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\/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\:p-1{padding:calc(var(--zd-spacing) * 1)}.zd\:p-2{padding:calc(var(--zd-spacing) * 2)}.zd\:p-4{padding:calc(var(--zd-spacing) * 4)}.zd\:p-6{padding:calc(var(--zd-spacing) * 6)}.zd\:px-0{padding-inline:calc(var(--zd-spacing) * 0)}.zd\:px-2{padding-inline:calc(var(--zd-spacing) * 2)}.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\:py-1{padding-block:calc(var(--zd-spacing) * 1)}.zd\:py-3{padding-block:calc(var(--zd-spacing) * 3)}.zd\:py-3\.5{padding-block:calc(var(--zd-spacing) * 3.5)}.zd\:py-5{padding-block:calc(var(--zd-spacing) * 5)}.zd\:pr-1{padding-right:calc(var(--zd-spacing) * 1)}.zd\:pr-2{padding-right:calc(var(--zd-spacing) * 2)}.zd\:pl-2{padding-left:calc(var(--zd-spacing) * 2)}.zd\:pl-4{padding-left:calc(var(--zd-spacing) * 4)}.zd\:text-left{text-align:left}.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\: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\: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\/90{color:oklab(16.9052% .00636494 .00836386/.9)}.zd\:text-orange{color:#f27b3e}.zd\:text-solarOrange{color:#e76000}.zd\:text-white{color:var(--zd-color-white)}.zd\:caret-gray-900{caret-color:var(--zd-color-gray-900)}.zd\:opacity-50{opacity:.5}.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-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\: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\: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-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)}}}:root{--zd-density:1;--zd-spacing:calc(.25rem * var(--zd-density))}@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 pulse{50%{opacity:.5}}
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}}}@layer theme{:root,:host{--zd-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--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-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-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-default-transition-duration:.15s;--zd-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--zd-default-font-family:sans-serif;--zd-default-mono-font-family:var(--zd-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--zd-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--zd-default-font-feature-settings,normal);font-variation-settings:var(--zd-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--zd-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--zd-default-mono-font-feature-settings,normal);font-variation-settings:var(--zd-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.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\:top-4{top:calc(var(--zd-spacing) * 4)}.zd\:right-0{right:0}.zd\:bottom-0{bottom:0}.zd\:left-0{left:0}.zd\:left-1\/2{left:50%}.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-2{margin-inline:calc(var(--zd-spacing) * 2)}.zd\:my-1{margin-block:var(--zd-spacing)}.zd\:-mr-4{margin-right:calc(var(--zd-spacing) * -4)}.zd\:mb-2{margin-bottom:calc(var(--zd-spacing) * 2)}.zd\:flex{display:flex}.zd\:grid{display:grid}.zd\:inline-flex{display:inline-flex}.zd\:size-4{width:calc(var(--zd-spacing) * 4);height:calc(var(--zd-spacing) * 4)}.zd\:size-8\.5{width:calc(var(--zd-spacing) * 8.5);height:calc(var(--zd-spacing) * 8.5)}.zd\:size-11{width:calc(var(--zd-spacing) * 11);height:calc(var(--zd-spacing) * 11)}.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-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-full{height:100%}.zd\:h-px{height:1px}.zd\:max-h-80{max-height:calc(var(--zd-spacing) * 80)}.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-\[300px\]{min-height:300px}.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-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-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-auto{width:auto}.zd\:w-full{width:100%}.zd\:max-w-full{max-width:100%}.zd\:min-w-0{min-width:0}.zd\:min-w-\[400px\]{min-width:400px}.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\:cursor-not-allowed{cursor:not-allowed}.zd\:cursor-pointer{cursor:pointer}.zd\:resize-none{resize:none}.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-\[5px\]{gap:5px}.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-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-\[32px\]{border-radius:32px}.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-\[0\.3px\]{border-style:var(--tw-border-style);border-width:.3px}.zd\:border-offWhite{border-color:#f7f5f0}.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\: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\/50{background-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:bg-orange\/10{background-color:oklab(70.9342% .114827 .116983/.1)}.zd\:bg-solarOrange{background-color:#e76000}.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\/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\:p-0{padding:0}.zd\:p-1{padding:var(--zd-spacing)}.zd\:p-2{padding:calc(var(--zd-spacing) * 2)}.zd\:p-4{padding:calc(var(--zd-spacing) * 4)}.zd\:p-6{padding:calc(var(--zd-spacing) * 6)}.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\:py-1{padding-block:var(--zd-spacing)}.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-5{padding-block:calc(var(--zd-spacing) * 5)}.zd\:pr-1{padding-right:var(--zd-spacing)}.zd\:pr-2{padding-right:calc(var(--zd-spacing) * 2)}.zd\:pr-4{padding-right:calc(var(--zd-spacing) * 4)}.zd\:pl-1{padding-left:var(--zd-spacing)}.zd\:pl-2{padding-left:calc(var(--zd-spacing) * 2)}.zd\:pl-4{padding-left:calc(var(--zd-spacing) * 4)}.zd\:text-left{text-align:left}.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\: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\: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\/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-solarOrange{color:#e76000}.zd\:text-white{color:var(--zd-color-white)}.zd\:caret-gray-900{caret-color:var(--zd-color-gray-900)}.zd\:opacity-50{opacity:.5}.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-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\: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\: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\=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;--zd-spacing:calc(.25rem * var(--zd-density))}@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 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/react-ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "React UI primitives for ZeroDev",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,9 +42,11 @@
42
42
  "zerodev"
43
43
  ],
44
44
  "peerDependencies": {
45
+ "radix-ui": "^1.4.0",
45
46
  "react": "^18.0.0 || ^19.0.0"
46
47
  },
47
48
  "devDependencies": {
49
+ "radix-ui": "^1.4.0",
48
50
  "@storybook/addon-a11y": "^10.3.3",
49
51
  "@storybook/addon-docs": "^10.3.3",
50
52
  "@storybook/react-vite": "^10.3.3",
@@ -54,13 +56,13 @@
54
56
  "@types/react": "^19",
55
57
  "@types/react-dom": "^19",
56
58
  "@vitejs/plugin-react": "^4.7.0",
57
- "postcss": "^8.5.10",
58
- "react": "19.2.0",
59
- "react-dom": "19.2.0",
59
+ "postcss": "^8.5.16",
60
+ "react": "19.2.3",
61
+ "react-dom": "19.2.3",
60
62
  "storybook": "^10.3.3",
61
63
  "tailwindcss": "^4.2.2",
62
64
  "typescript": "5.9.3",
63
- "vite": "^6.4.1",
65
+ "vite": "^6.4.3",
64
66
  "vite-plugin-svgr": "5.0.0"
65
67
  },
66
68
  "dependencies": {
@@ -0,0 +1,148 @@
1
+ import { type ReactNode, useEffect, useRef, useState } from 'react'
2
+ import { cn } from '../../utils/common'
3
+ import { Icon } from '../Icon'
4
+ import { Wrapper } from '../Wrapper'
5
+
6
+ const ARROW_INNER = 44
7
+ const PADDING = 4
8
+ const ARROW_OUTER = ARROW_INNER + PADDING * 2
9
+ const GAP = 4
10
+ const OVERLAP = (ARROW_OUTER - GAP) / 2
11
+ const HALF = ARROW_OUTER / 2
12
+ const R = 16
13
+
14
+ function buildClipPath(
15
+ w: number,
16
+ h: number,
17
+ position: 'top' | 'bottom',
18
+ ): string {
19
+ const cx = w / 2
20
+
21
+ if (position === 'top') {
22
+ const ny = h - OVERLAP
23
+ return [
24
+ 'M 0 0',
25
+ `L ${w} 0`,
26
+ `L ${w} ${h}`,
27
+ `L ${cx + HALF} ${h}`,
28
+ `L ${cx + HALF} ${ny + R}`,
29
+ `A ${R} ${R} 0 0 0 ${cx + HALF - R} ${ny}`,
30
+ `L ${cx - HALF + R} ${ny}`,
31
+ `A ${R} ${R} 0 0 0 ${cx - HALF} ${ny + R}`,
32
+ `L ${cx - HALF} ${h}`,
33
+ `L 0 ${h}`,
34
+ 'Z',
35
+ ].join(' ')
36
+ }
37
+
38
+ const nb = OVERLAP
39
+ return [
40
+ 'M 0 0',
41
+ `L ${cx - HALF} 0`,
42
+ `L ${cx - HALF} ${nb - R}`,
43
+ `A ${R} ${R} 0 0 0 ${cx - HALF + R} ${nb}`,
44
+ `L ${cx + HALF - R} ${nb}`,
45
+ `A ${R} ${R} 0 0 0 ${cx + HALF} ${nb - R}`,
46
+ `L ${cx + HALF} 0`,
47
+ `L ${w} 0`,
48
+ `L ${w} ${h}`,
49
+ `L 0 ${h}`,
50
+ 'Z',
51
+ ].join(' ')
52
+ }
53
+
54
+ function ClippedCard({
55
+ position,
56
+ children,
57
+ }: {
58
+ position: 'top' | 'bottom'
59
+ children: ReactNode
60
+ }) {
61
+ const ref = useRef<HTMLDivElement>(null)
62
+ const [layout, setLayout] = useState<{ width: number; height: number }>()
63
+
64
+ useEffect(() => {
65
+ const node = ref.current
66
+ if (!node) return
67
+ const observer = new ResizeObserver((entries) => {
68
+ const entry = entries[0]
69
+ if (!entry) return
70
+ const { width, height } = entry.contentRect
71
+ setLayout((prev) =>
72
+ prev && prev.width === width && prev.height === height
73
+ ? prev
74
+ : { width, height },
75
+ )
76
+ })
77
+ observer.observe(node)
78
+ return () => {
79
+ observer.disconnect()
80
+ }
81
+ }, [])
82
+
83
+ const clipPath = layout
84
+ ? `path("${buildClipPath(layout.width, layout.height, position)}")`
85
+ : undefined
86
+
87
+ return (
88
+ <div
89
+ ref={ref}
90
+ data-testid={`clipped-card-${position}`}
91
+ className="zd:w-full"
92
+ style={{ clipPath }}
93
+ >
94
+ {children}
95
+ </div>
96
+ )
97
+ }
98
+
99
+ function Arrow({ className }: { className?: string }) {
100
+ return (
101
+ <div className={cn('zd:p-1 zd:rounded-2xl', className)}>
102
+ <Wrapper className="zd:w-11 zd:h-11 zd:flex zd:items-center zd:justify-center zd:rounded-xl">
103
+ <Icon name="chevronDown" className="zd:w-4 zd:h-4" />
104
+ </Wrapper>
105
+ </div>
106
+ )
107
+ }
108
+
109
+ export function ArrowView({ className }: { className?: string }) {
110
+ return <Arrow {...(className !== undefined && { className })} />
111
+ }
112
+
113
+ export interface ArrowCardPairProps {
114
+ topCard: ReactNode
115
+ bottomCard: ReactNode
116
+ }
117
+
118
+ export function ArrowCardPair({ topCard, bottomCard }: ArrowCardPairProps) {
119
+ // Pure CSS layout — no measurement, no ResizeObserver. Between the two
120
+ // ClippedCards we drop a zero-height "seam" anchor with equal margins on
121
+ // top and bottom that add up to GAP. The seam's y-coordinate is therefore
122
+ // exactly at the centre of the gap, and the arrow — absolutely positioned
123
+ // inside the seam with `top: 0` and `translate(-50%, -50%)` — centres on
124
+ // that y regardless of either card's height.
125
+ const seamMargin = GAP / 2
126
+
127
+ return (
128
+ <div className="zd:relative zd:flex zd:flex-col zd:items-center zd:w-full">
129
+ <ClippedCard position="top">{topCard}</ClippedCard>
130
+ <div
131
+ className="zd:relative zd:w-full"
132
+ style={{
133
+ height: 0,
134
+ marginTop: seamMargin,
135
+ marginBottom: seamMargin,
136
+ }}
137
+ >
138
+ <div
139
+ className="zd:absolute zd:left-1/2 zd:top-0 zd:pointer-events-none"
140
+ style={{ transform: 'translate(-50%, -50%)' }}
141
+ >
142
+ <Arrow />
143
+ </div>
144
+ </div>
145
+ <ClippedCard position="bottom">{bottomCard}</ClippedCard>
146
+ </div>
147
+ )
148
+ }
@@ -0,0 +1,57 @@
1
+ import { Dialog } from 'radix-ui'
2
+ import type { ComponentProps, ReactNode } from 'react'
3
+
4
+ import { cn } from '../../utils/common'
5
+ import { useScreenOverlayContainer } from '../Screen'
6
+
7
+ export const BottomSheet = Dialog.Root
8
+ export const BottomSheetClose = Dialog.Close
9
+
10
+ /** Accessible label for the sheet. `sr-only` by default — consumers who want
11
+ * a visible title render their own heading inside `<BottomSheetContent>` and keep
12
+ * `<BottomSheetTitle>` as the screen-reader label. */
13
+ export function BottomSheetTitle({
14
+ className,
15
+ ...props
16
+ }: ComponentProps<typeof Dialog.Title>) {
17
+ return <Dialog.Title className={cn('zd:sr-only', className)} {...props} />
18
+ }
19
+
20
+ /** Bottom-anchored sheet chrome. Portals into the nearest `Screen`, renders
21
+ * the backdrop + panel, and drives open/close animations from Radix's
22
+ * `data-state` attribute. Wrap in `<BottomSheet open onOpenChange>` and
23
+ * compose children freely (title, body, `<BottomSheetClose>` action). */
24
+ export function BottomSheetContent({
25
+ children,
26
+ className,
27
+ }: {
28
+ children: ReactNode
29
+ className?: string
30
+ }) {
31
+ const container = useScreenOverlayContainer()
32
+ if (!container) return null
33
+
34
+ return (
35
+ <Dialog.Portal container={container}>
36
+ <Dialog.Overlay
37
+ className={cn(
38
+ 'zd:absolute zd:inset-0 zd:z-20 zd:bg-greyScale/20',
39
+ 'zd:data-[state=open]:animate-backdrop-in',
40
+ 'zd:data-[state=closed]:animate-backdrop-out',
41
+ )}
42
+ />
43
+ <Dialog.Content
44
+ className={cn(
45
+ 'zd:absolute zd:bottom-0 zd:left-0 zd:right-0 zd:z-20',
46
+ 'zd:bg-white zd:rounded-[32px] zd:overflow-hidden',
47
+ 'zd:outline-none',
48
+ 'zd:data-[state=open]:animate-sheet-in',
49
+ 'zd:data-[state=closed]:animate-sheet-out',
50
+ className,
51
+ )}
52
+ >
53
+ {children}
54
+ </Dialog.Content>
55
+ </Dialog.Portal>
56
+ )
57
+ }
@@ -0,0 +1,140 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { cn } from '../../utils/common'
4
+ import { Icon } from '../Icon'
5
+ import { Text } from '../Text'
6
+
7
+ export interface DataRowProps {
8
+ /** Label rendered on the left (e.g., "Max slippage"). */
9
+ label: string
10
+ /** Value rendered on the right. Accepts a string (wrapped in `Text`) or an
11
+ * arbitrary ReactNode (rendered verbatim). */
12
+ value: ReactNode
13
+ /** Renders a small info icon (14×14, greyScale/50) between the label and
14
+ * the value. */
15
+ info?: boolean
16
+ /** Handler for the info icon; when supplied, the icon becomes a keyboard-
17
+ * accessible button. Requires `info` to be true. */
18
+ onInfoClick?: () => void
19
+ /** Content rendered inside the value group, before the value. Typically a
20
+ * small decorative or status icon (e.g. warning). */
21
+ leading?: ReactNode
22
+ /** Content rendered inside the value group, after the value. Typically a
23
+ * chevron or trailing icon. */
24
+ trailing?: ReactNode
25
+ /** `'default'` for a plain inline row; `'warning'` for the orange-tinted
26
+ * card treatment (Figma "Minimum deposit"). */
27
+ variant?: 'default' | 'warning'
28
+ className?: string
29
+ }
30
+
31
+ export function DataRow({
32
+ label,
33
+ value,
34
+ info,
35
+ onInfoClick,
36
+ leading,
37
+ trailing,
38
+ variant = 'default',
39
+ className,
40
+ }: DataRowProps) {
41
+ const isWarning = variant === 'warning'
42
+ const textColorClass = isWarning ? 'zd:text-solarOrange' : undefined
43
+
44
+ return (
45
+ <div
46
+ className={cn(
47
+ 'zd:relative zd:flex zd:w-full zd:items-center',
48
+ isWarning
49
+ ? // Warning: card treatment — 14px radius, border, backdrop blur,
50
+ // 10% orange tint, universal inner shadow, tighter row padding.
51
+ [
52
+ 'zd:gap-2 zd:overflow-hidden zd:rounded-[14px] zd:border-[0.3px] zd:border-offWhite zd:px-4 zd:py-2 zd:backdrop-blur-[15px]',
53
+ 'zd:shadow-[inset_0_-4px_4px_0_rgba(255,255,255,0.1),inset_0_3px_4px_0_rgba(0,0,0,0.02)]',
54
+ ]
55
+ : // Default: plain inline row with a 4px gap between children and
56
+ // 4px vertical padding.
57
+ 'zd:gap-1 zd:py-1',
58
+ className,
59
+ )}
60
+ style={
61
+ isWarning ? { backgroundColor: 'rgba(242, 123, 62, 0.1)' } : undefined
62
+ }
63
+ >
64
+ <Text className={cn('zd:whitespace-nowrap', textColorClass)}>
65
+ {label}
66
+ </Text>
67
+ {info &&
68
+ (onInfoClick ? (
69
+ <button
70
+ type="button"
71
+ onClick={onInfoClick}
72
+ aria-label={`${label} — more info`}
73
+ className="zd:flex zd:items-center zd:justify-center zd:cursor-pointer"
74
+ data-testid="data-row-info"
75
+ >
76
+ <Icon
77
+ name="info"
78
+ className={cn(
79
+ 'zd:w-3.5 zd:h-3.5',
80
+ isWarning ? 'zd:text-solarOrange' : 'zd:text-greyScale/50',
81
+ )}
82
+ aria-hidden
83
+ />
84
+ </button>
85
+ ) : (
86
+ <Icon
87
+ name="info"
88
+ className={cn(
89
+ 'zd:w-3.5 zd:h-3.5',
90
+ isWarning ? 'zd:text-solarOrange' : 'zd:text-greyScale/50',
91
+ )}
92
+ data-testid="data-row-info"
93
+ aria-hidden
94
+ />
95
+ ))}
96
+ {/* Spacer pushes the value to the right end. min-w-0 so the label and
97
+ value can shrink independently if the container is narrow. */}
98
+ <div className="zd:min-w-0 zd:flex-1" />
99
+ <div
100
+ className="zd:flex zd:items-center zd:gap-[5px]"
101
+ data-testid="data-row-value"
102
+ >
103
+ {leading}
104
+ {typeof value === 'string' ? (
105
+ <Text className={cn('zd:whitespace-nowrap', textColorClass)}>
106
+ {value}
107
+ </Text>
108
+ ) : (
109
+ value
110
+ )}
111
+ {trailing}
112
+ </div>
113
+ </div>
114
+ )
115
+ }
116
+
117
+ export interface DataRowSkeletonProps {
118
+ /** Optional label to render as-is on the left; when omitted a pulse
119
+ * placeholder is drawn in its place. */
120
+ label?: string
121
+ className?: string
122
+ }
123
+
124
+ export function DataRowSkeleton({ label, className }: DataRowSkeletonProps) {
125
+ return (
126
+ <div
127
+ className={cn(
128
+ 'zd:flex zd:flex-row zd:items-center zd:justify-between zd:py-1',
129
+ className,
130
+ )}
131
+ >
132
+ {label ? (
133
+ <Text>{label}</Text>
134
+ ) : (
135
+ <div className="zd:w-24 zd:h-3 zd:rounded-lg zd:bg-greyScale/15 zd:animate-skel-pulse" />
136
+ )}
137
+ <div className="zd:w-24 zd:h-3 zd:rounded-lg zd:bg-greyScale/15 zd:animate-skel-pulse" />
138
+ </div>
139
+ )
140
+ }
@@ -1,7 +1,7 @@
1
- import type { ButtonHTMLAttributes } from 'react'
1
+ import { Slot } from 'radix-ui'
2
+ import type { ButtonHTMLAttributes, ReactElement, ReactNode } from 'react'
2
3
 
3
4
  import { cn } from '../../utils/common'
4
- import { Badge, type BadgeProps } from '../Badge'
5
5
  import { Icon, type IconName } from '../Icon'
6
6
  import { Text } from '../Text'
7
7
  import { Wrapper } from '../Wrapper'
@@ -20,117 +20,112 @@ export function ListItemSkeleton({ className }: ListItemSkeletonProps) {
20
20
  >
21
21
  <div className="zd:flex zd:flex-row zd:justify-between zd:items-center zd:p-2">
22
22
  <div className="zd:flex zd:flex-row zd:items-center zd:gap-3">
23
- <div className="zd:w-13 zd:h-13 zd:rounded-2xl zd:bg-offWhite/50 zd:animate-pulse" />
23
+ <div className="zd:w-13 zd:h-13 zd:rounded-2xl zd:bg-greyScale/15 zd:animate-skel-pulse" />
24
24
  <div className="zd:gap-2">
25
- <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse zd:mb-2" />
26
- <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse" />
25
+ <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-greyScale/15 zd:animate-skel-pulse zd:mb-2" />
26
+ <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-greyScale/15 zd:animate-skel-pulse" />
27
27
  </div>
28
28
  </div>
29
29
  <div className="zd:gap-2">
30
- <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse zd:mb-2" />
31
- <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse" />
30
+ <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-greyScale/15 zd:animate-skel-pulse zd:mb-2" />
31
+ <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-greyScale/15 zd:animate-skel-pulse" />
32
32
  </div>
33
33
  </div>
34
34
  </div>
35
35
  )
36
36
  }
37
37
 
38
- export interface ListItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {
39
- iconName?: IconName
40
- imageUri?: string
38
+ interface ListItemBaseProps
39
+ extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
41
40
  title: string
42
- subtitle?: string
43
- badgeProps?: BadgeProps
44
- details?: { text: string; subtext?: string }
45
- chevron?: boolean
46
- alert?: boolean
41
+ /** Secondary line under the title — plain text (auto-styled) or any node,
42
+ * e.g. a `<Badge />`. */
43
+ subtitle?: ReactNode
44
+ /** Leading tile content — any node (`ListItemIcon`, `<img>`, a brand mark).
45
+ * Size the node itself (e.g. `zd:w-6 zd:h-6`); the tile keeps its frame. */
46
+ icon?: ReactNode
47
+ /** Right side of the row — `<ListItemChevron />` or any custom node. */
48
+ trailing?: ReactNode
47
49
  }
48
50
 
51
+ // `children` is only meaningful as the asChild target — the union makes the
52
+ // pairing a compile-time contract.
53
+ type ListItemAsChildProps =
54
+ | {
55
+ /** Render the row into the child element (e.g. an `<a>`) instead of a
56
+ * `<button>`. Pass a single childless element; the row layout is
57
+ * injected into it. */
58
+ asChild: true
59
+ children: ReactElement
60
+ }
61
+ | { asChild?: false; children?: never }
62
+
63
+ export type ListItemProps = ListItemBaseProps & ListItemAsChildProps
64
+
49
65
  export function ListItem({
50
- iconName,
51
- imageUri,
66
+ icon,
52
67
  title,
53
68
  subtitle,
54
- badgeProps,
55
- details,
56
- chevron,
57
- alert,
69
+ trailing,
70
+ asChild,
71
+ children,
58
72
  className,
59
73
  ...rest
60
74
  }: ListItemProps) {
75
+ const Comp = asChild ? Slot.Root : 'button'
61
76
  return (
62
- <Wrapper
63
- className={cn(
64
- 'zd:w-full zd:h-17 zd:rounded-2xl',
65
- alert && 'zd:border-0',
66
- className,
67
- )}
68
- >
69
- <button
70
- type="button"
77
+ <Wrapper className={cn('zd:w-full zd:h-17 zd:rounded-2xl', className)}>
78
+ <Comp
79
+ {...(!asChild && { type: 'button' as const })}
71
80
  className={cn(
72
- 'zd:w-full zd:flex zd:flex-row zd:justify-between zd:items-center zd:p-2 zd:transition-colors zd:cursor-pointer',
73
- alert
74
- ? 'zd:bg-solarOrange/15'
75
- : 'zd:hover:bg-white/20 zd:active:bg-white/30',
81
+ 'zd:w-full zd:flex zd:flex-row zd:justify-between zd:items-center zd:p-2 zd:transition-colors zd:cursor-pointer zd:hover:bg-white/20 zd:active:bg-white/30',
76
82
  rest.disabled && 'zd:opacity-50 zd:cursor-not-allowed',
77
83
  )}
78
84
  {...rest}
79
85
  >
86
+ {asChild && <Slot.Slottable>{children}</Slot.Slottable>}
80
87
  <div className="zd:flex zd:flex-row zd:items-center zd:gap-3">
81
- <div
82
- className={cn(
83
- 'zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:shrink-0',
84
- alert ? 'zd:bg-offWhite/50' : 'zd:bg-white',
85
- )}
86
- >
87
- {imageUri ? (
88
- <img src={imageUri} alt="" className="zd:w-6 zd:h-6" />
89
- ) : iconName ? (
90
- <Icon
91
- name={iconName}
92
- className={cn(
93
- 'zd:w-6 zd:h-6',
94
- details || alert
95
- ? 'zd:text-solarOrange'
96
- : 'zd:text-greyScale',
97
- )}
98
- />
99
- ) : null}
88
+ <div className="zd:w-13 zd:h-13 zd:rounded-2xl zd:bg-white zd:flex zd:items-center zd:justify-center zd:shrink-0">
89
+ {icon}
100
90
  </div>
101
- <div
102
- className={cn(
103
- 'zd:flex zd:flex-col zd:justify-center zd:text-left',
104
- badgeProps ? 'zd:gap-2' : 'zd:gap-1',
105
- )}
106
- >
91
+ <div className="zd:flex zd:flex-col zd:justify-center zd:text-left zd:gap-1">
107
92
  <Text className="zd:text-body1">{title}</Text>
108
- {subtitle && (
93
+ {typeof subtitle === 'string' ? (
109
94
  <Text className="zd:text-body3 zd:text-greyScale/50">
110
95
  {subtitle}
111
96
  </Text>
97
+ ) : (
98
+ subtitle
112
99
  )}
113
- {badgeProps && <Badge {...badgeProps} />}
114
100
  </div>
115
101
  </div>
116
- {details ? (
117
- <div className="zd:flex zd:flex-col zd:pr-1">
118
- <Text className="zd:text-body1">{details.text}</Text>
119
- {details.subtext && (
120
- <Text className="zd:text-body3 zd:text-greyScale/50 zd:self-end">
121
- {details.subtext}
122
- </Text>
123
- )}
124
- </div>
125
- ) : chevron ? (
126
- <div className="zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center">
127
- <Icon
128
- name="chevronRight"
129
- className="zd:h-6 zd:w-6 zd:text-greyScale"
130
- />
131
- </div>
132
- ) : null}
133
- </button>
102
+ {trailing}
103
+ </Comp>
134
104
  </Wrapper>
135
105
  )
136
106
  }
107
+
108
+ export interface ListItemIconProps {
109
+ name: IconName
110
+ className?: string
111
+ }
112
+
113
+ /** Standard leading icon for the tile — pre-sized and colored for the slot;
114
+ * override via `className` (e.g. `zd:text-solarOrange`). */
115
+ export function ListItemIcon({ name, className }: ListItemIconProps) {
116
+ return (
117
+ <Icon
118
+ name={name}
119
+ className={cn('zd:w-6 zd:h-6 zd:text-greyScale', className)}
120
+ />
121
+ )
122
+ }
123
+
124
+ /** Standard trailing chevron for navigation rows. */
125
+ export function ListItemChevron() {
126
+ return (
127
+ <div className="zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center">
128
+ <Icon name="chevronRight" className="zd:h-6 zd:w-6 zd:text-greyScale" />
129
+ </div>
130
+ )
131
+ }