@zerodev/react-ui 0.0.1 → 0.0.3

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.
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
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:52px}.zd\:h-16{height:calc(var(--zd-spacing) * 16)}.zd\:h-32{height:calc(var(--zd-spacing) * 32)}.zd\:h-\[52px\]{height:52px}.zd\:h-\[68px\]{height:68px}.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:52px}.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-\[52px\]{width:52px}.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:20px;line-height:var(--tw-leading,var(--zd-text-2xl--line-height))}.zd\:text-base{font-size:14px;line-height:var(--tw-leading,var(--zd-text-base--line-height))}.zd\:text-body1{font-size:16px;line-height:var(--tw-leading,130%)}.zd\:text-body2{font-size:14px;line-height:var(--tw-leading,130%)}.zd\:text-body3{font-size:12px;line-height:var(--tw-leading,130%)}.zd\:text-body4{font-size:10px;line-height:var(--tw-leading,130%)}.zd\:text-h1{font-size:42px;line-height:var(--tw-leading,110%)}.zd\:text-h2{font-size:28px;line-height:var(--tw-leading,110%)}.zd\:text-h3{font-size:18px;line-height:var(--tw-leading,130%)}.zd\:text-lg{font-size:16px;line-height:var(--tw-leading,var(--zd-text-lg--line-height))}.zd\:text-sm{font-size:12px;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)}}}@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}}
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-4{height:calc(var(--zd-spacing) * 4)}.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-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-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-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-11{width:calc(var(--zd-spacing) * 11)}.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-auto{width:auto}.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\:gap-\[5px\]{gap:5px}.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-\[14px\]{border-radius:14px}.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-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: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\: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-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\.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-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}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodev/react-ui",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "React UI primitives for ZeroDev",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,128 @@
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
+ return (
120
+ <div className="zd:relative zd:flex zd:flex-col zd:gap-1 zd:items-center zd:justify-center zd:w-full">
121
+ <ClippedCard position="top">{topCard}</ClippedCard>
122
+ <ClippedCard position="bottom">{bottomCard}</ClippedCard>
123
+ <div className="zd:absolute zd:inset-0 zd:flex zd:items-center zd:justify-center zd:pointer-events-none">
124
+ <Arrow />
125
+ </div>
126
+ </div>
127
+ )
128
+ }
@@ -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-offWhite/50 zd:animate-pulse" />
136
+ )}
137
+ <div className="zd:w-24 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse" />
138
+ </div>
139
+ )
140
+ }
@@ -21,7 +21,7 @@ export interface InputProps
21
21
 
22
22
  function getHeightClass(multiline: boolean | undefined, variant: Variant) {
23
23
  if (multiline) return 'zd:h-32 zd:py-3'
24
- if (variant === 'listItemStyle') return 'zd:h-[68px]'
24
+ if (variant === 'listItemStyle') return 'zd:h-17'
25
25
  return 'zd:h-11'
26
26
  }
27
27
 
@@ -51,7 +51,7 @@ function InputIcon({
51
51
  // width on mobile browsers (Chrome on Android most visibly), which would
52
52
  // squash the leading icon and the trailing chevron-button child.
53
53
  const baseInputClass =
54
- 'zd:flex-1 zd:min-w-0 zd:px-0 zd:text-gray-900 zd:font-medium zd:outline-none zd:bg-transparent zd:min-h-11 zd:placeholder:text-gray-900/50 zd:caret-gray-900'
54
+ 'zd:flex-1 zd:min-w-0 zd:px-0 zd:text-body1 zd:text-gray-900 zd:font-medium zd:outline-none zd:bg-transparent zd:min-h-11 zd:placeholder:text-gray-900/50 zd:caret-gray-900'
55
55
 
56
56
  export function Input({
57
57
  variant = 'default',
@@ -14,13 +14,13 @@ export function ListItemSkeleton({ className }: ListItemSkeletonProps) {
14
14
  return (
15
15
  <div
16
16
  className={cn(
17
- 'zd:w-full zd:h-[68px] zd:rounded-2xl zd:border-offWhite zd:border-[0.3px]',
17
+ 'zd:w-full zd:h-17 zd:rounded-2xl zd:border-offWhite zd:border-[0.3px]',
18
18
  className,
19
19
  )}
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-[52px] zd:h-[52px] zd:rounded-2xl zd:bg-offWhite/50 zd:animate-pulse" />
23
+ <div className="zd:w-13 zd:h-13 zd:rounded-2xl zd:bg-offWhite/50 zd:animate-pulse" />
24
24
  <div className="zd:gap-2">
25
25
  <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse zd:mb-2" />
26
26
  <div className="zd:w-14 zd:h-3 zd:rounded-lg zd:bg-offWhite/50 zd:animate-pulse" />
@@ -61,7 +61,7 @@ export function ListItem({
61
61
  return (
62
62
  <Wrapper
63
63
  className={cn(
64
- 'zd:w-full zd:h-[68px] zd:rounded-2xl',
64
+ 'zd:w-full zd:h-17 zd:rounded-2xl',
65
65
  alert && 'zd:border-0',
66
66
  className,
67
67
  )}
@@ -80,7 +80,7 @@ export function ListItem({
80
80
  <div className="zd:flex zd:flex-row zd:items-center zd:gap-3">
81
81
  <div
82
82
  className={cn(
83
- 'zd:w-[52px] zd:h-[52px] zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:shrink-0',
83
+ 'zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:shrink-0',
84
84
  alert ? 'zd:bg-offWhite/50' : 'zd:bg-white',
85
85
  )}
86
86
  >
@@ -0,0 +1,55 @@
1
+ import type { FC, SVGProps } from 'react'
2
+
3
+ import LockupBlack from '../../../assets/brand/zerodev-lockup-black.svg?react'
4
+ import LockupOffwhite from '../../../assets/brand/zerodev-lockup-offwhite.svg?react'
5
+ import MarkBlack from '../../../assets/brand/zerodev-mark-black.svg?react'
6
+ import MarkColor from '../../../assets/brand/zerodev-mark-color.svg?react'
7
+ import MarkOffwhite from '../../../assets/brand/zerodev-mark-offwhite.svg?react'
8
+ import MarkOrange from '../../../assets/brand/zerodev-mark-orange.svg?react'
9
+
10
+ // The `mark` (icon only) ships in four tones; the `lockup` (mark + wordmark)
11
+ // only in black/offwhite — there is no colorful lockup asset. The union keeps
12
+ // invalid combinations (e.g. lockup + color) from type-checking.
13
+ export type MarkTone = 'black' | 'offwhite' | 'color' | 'orange'
14
+ export type LockupTone = 'black' | 'offwhite'
15
+
16
+ export type ZeroDevLogoProps = SVGProps<SVGSVGElement> &
17
+ (
18
+ | { variant?: 'mark'; tone?: MarkTone }
19
+ | { variant: 'lockup'; tone?: LockupTone }
20
+ )
21
+
22
+ export function ZeroDevLogo({
23
+ variant = 'mark',
24
+ tone = 'black',
25
+ ...props
26
+ }: ZeroDevLogoProps) {
27
+ // Brand SVGs carry literal fills (the tone IS the color), so no text-color
28
+ // class is applied — unlike Icon, currentColor would have no effect here.
29
+ let Svg: FC<SVGProps<SVGSVGElement>>
30
+ if (variant === 'lockup') {
31
+ switch (tone) {
32
+ case 'offwhite':
33
+ Svg = LockupOffwhite
34
+ break
35
+ default:
36
+ Svg = LockupBlack
37
+ }
38
+ } else {
39
+ switch (tone) {
40
+ case 'offwhite':
41
+ Svg = MarkOffwhite
42
+ break
43
+ case 'color':
44
+ Svg = MarkColor
45
+ break
46
+ case 'orange':
47
+ Svg = MarkOrange
48
+ break
49
+ default:
50
+ Svg = MarkBlack
51
+ }
52
+ }
53
+
54
+ return <Svg {...props} />
55
+ }
package/src/index.ts CHANGED
@@ -3,9 +3,20 @@
3
3
  * React UI primitives for ZeroDev
4
4
  */
5
5
 
6
+ export {
7
+ ArrowCardPair,
8
+ type ArrowCardPairProps,
9
+ ArrowView,
10
+ } from './components/ArrowCardPair'
6
11
  export { Badge, type BadgeProps } from './components/Badge'
7
12
  export { Button, type ButtonProps } from './components/Button'
8
13
  export { Callout, type CalloutProps } from './components/Callout'
14
+ export {
15
+ DataRow,
16
+ type DataRowProps,
17
+ DataRowSkeleton,
18
+ type DataRowSkeletonProps,
19
+ } from './components/DataRow'
9
20
  export {
10
21
  Icon,
11
22
  type IconName,
@@ -30,4 +41,10 @@ export {
30
41
  type WrapperProps,
31
42
  type WrapperVariant,
32
43
  } from './components/Wrapper'
44
+ export {
45
+ type LockupTone,
46
+ type MarkTone,
47
+ ZeroDevLogo,
48
+ type ZeroDevLogoProps,
49
+ } from './components/ZeroDevLogo'
33
50
  export { cn } from './utils/common'
package/src/svg.d.ts CHANGED
@@ -4,3 +4,12 @@ declare module '*.svg' {
4
4
  const ReactComponent: FC<SVGProps<SVGSVGElement>>
5
5
  export default ReactComponent
6
6
  }
7
+
8
+ // Explicit `?react` query imports (vite-plugin-svgr) resolve to the same
9
+ // React-component default export.
10
+ declare module '*.svg?react' {
11
+ import type { FC, SVGProps } from 'react'
12
+
13
+ const ReactComponent: FC<SVGProps<SVGSVGElement>>
14
+ export default ReactComponent
15
+ }
@@ -4,9 +4,13 @@ const config: Config = {
4
4
  content: ['./src/**/*.{js,ts,jsx,tsx}'],
5
5
  theme: {
6
6
  extend: {
7
+ // Custom steps derive from the spacing base (var(--zd-spacing), default
8
+ // 0.25rem) so density variants rescale them like every other spacing
9
+ // utility. 13 = 52px, 17 = 68px, 4.5 = 18px at the default base.
7
10
  spacing: {
8
- 13: '52px',
9
- 4.5: '18px',
11
+ 13: 'calc(var(--zd-spacing) * 13)',
12
+ 17: 'calc(var(--zd-spacing) * 17)',
13
+ 4.5: 'calc(var(--zd-spacing) * 4.5)',
10
14
  },
11
15
  colors: {
12
16
  // Design color palette START
@@ -23,24 +27,27 @@ const config: Config = {
23
27
  negative: '#FF4221',
24
28
  },
25
29
  fontSize: {
26
- xs: '10px',
27
- sm: '12px',
28
- base: '14px',
29
- lg: '16px',
30
- xl: '18px',
31
- '2xl': '20px',
32
- '3xl': '24px',
33
- '4xl': '30px',
34
- '5xl': '36px',
35
- '6xl': '48px',
30
+ // Font sizes multiply by --zd-density (default 1) so text scales with
31
+ // the density variants like spacing does. Line-heights are percentages,
32
+ // which already track the scaled font-size.
33
+ xs: 'calc(10px * var(--zd-density))',
34
+ sm: 'calc(12px * var(--zd-density))',
35
+ base: 'calc(14px * var(--zd-density))',
36
+ lg: 'calc(16px * var(--zd-density))',
37
+ xl: 'calc(18px * var(--zd-density))',
38
+ '2xl': 'calc(20px * var(--zd-density))',
39
+ '3xl': 'calc(24px * var(--zd-density))',
40
+ '4xl': 'calc(30px * var(--zd-density))',
41
+ '5xl': 'calc(36px * var(--zd-density))',
42
+ '6xl': 'calc(48px * var(--zd-density))',
36
43
  // Design typography START
37
- h1: ['42px', '110%'],
38
- h2: ['28px', '110%'],
39
- h3: ['18px', '130%'],
40
- body1: ['16px', '130%'],
41
- body2: ['14px', '130%'],
42
- body3: ['12px', '130%'],
43
- body4: ['10px', '130%'],
44
+ h1: ['calc(42px * var(--zd-density))', '110%'],
45
+ h2: ['calc(28px * var(--zd-density))', '110%'],
46
+ h3: ['calc(18px * var(--zd-density))', '130%'],
47
+ body1: ['calc(16px * var(--zd-density))', '130%'],
48
+ body2: ['calc(14px * var(--zd-density))', '130%'],
49
+ body3: ['calc(12px * var(--zd-density))', '130%'],
50
+ body4: ['calc(10px * var(--zd-density))', '130%'],
44
51
  // Design typography END
45
52
  },
46
53
  fontFamily: {