@eml-payments/ui-kit 0.1.19 → 0.1.21

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/README.md CHANGED
@@ -44,8 +44,8 @@ import { UIKitProvider } from '@eml-payments/ui-kit';
44
44
 
45
45
  const theme = {
46
46
  colors: {
47
- primary: '#0A5FFF',
48
- success: '#16c784',
47
+ primary: { light: "#0A5FFF", dark: "#7c80f8" },
48
+ success: { light: "#12D176", dark: "#16c784" },
49
49
  error: '#d7263d',
50
50
  // ...override any design token here
51
51
  },
@@ -63,7 +63,7 @@ export default function App() {
63
63
  ```tsx
64
64
  import { Button, Input, Table } from "@eml-payments/ui-kit";
65
65
 
66
- <Button variant="primary" title="Primary Button" />
66
+ <Button variant="primary">Primary Button</Button>
67
67
  <Input label="Email" placeholder="user@email.com" />
68
68
  ```
69
69
 
@@ -76,12 +76,12 @@ You can fully override the theme tokens using the `config` prop:
76
76
  ```ts
77
77
  type UIKitConfig = {
78
78
  colors?: {
79
- primary?: string;
80
- secondary?: string;
81
- accent?: string;
82
- success?: string;
83
- warning?: string;
84
- error?: string;
79
+ primary?: string | { light: string; dark: string };
80
+ secondary?: string | { light: string; dark: string };
81
+ accent?: string | { light: string; dark: string };
82
+ success?: string | { light: string; dark: string };
83
+ warning?: string | { light: string; dark: string };
84
+ error?: string | { light: string; dark: string };
85
85
  [key: string]: string | undefined;
86
86
  };
87
87
  radius?: string; // e.g. "8px"
@@ -130,13 +130,6 @@ const data = [
130
130
 
131
131
  ---
132
132
 
133
- ## 🤝 Contributing
134
-
135
- We welcome PRs and issues!
136
- See [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
137
-
138
- ---
139
-
140
133
  ## 📝 License
141
134
 
142
135
  MIT &copy; EML Payments
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:0 0% 100%;--foreground:0 0% 3.9%;--card:0 0% 100%;--card-foreground:0 0% 3.9%;--popover:0 0% 100%;--popover-foreground:0 0% 3.9%;--primary:0 0% 9%;--primary-foreground:0 0% 98%;--secondary:0 0% 96.1%;--secondary-foreground:0 0% 9%;--muted:0 0% 96.1%;--muted-foreground:0 0% 45.1%;--accent:0 0% 96.1%;--accent-foreground:0 0% 9%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:0 0% 89.8%;--input:0 0% 89.8%;--ring:0 0% 3.9%;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%;--radius:0.5rem}.dark{--background:0 0% 3.9%;--foreground:0 0% 98%;--card:0 0% 3.9%;--card-foreground:0 0% 98%;--popover:0 0% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:0 0% 9%;--secondary:0 0% 14.9%;--secondary-foreground:0 0% 98%;--muted:0 0% 14.9%;--muted-foreground:0 0% 63.9%;--accent:0 0% 14.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:0 0% 14.9%;--input:0 0% 14.9%;--ring:0 0% 83.1%;--chart-1:220 70% 50%;--chart-2:160 60% 45%;--chart-3:30 80% 55%;--chart-4:280 65% 60%;--chart-5:340 75% 55%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-y-0{top:0;bottom:0}.left-2{left:.5rem}.right-2{right:.5rem}.right-3{right:.75rem}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.ml-auto{margin-left:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.size-2{width:.5rem;height:.5rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[12px\]{height:12px}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-\[22px\]{height:22px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:var(--radix-select-content-available-height)}.w-11{width:2.75rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[12px\]{width:12px}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[20px\]{width:20px}.w-\[320px\]{width:320px}.w-\[40px\]{width:40px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.origin-\[--radix-select-content-transform-origin\]{transform-origin:var(--radix-select-content-transform-origin)}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:var(--uikit-radius,.5rem)}.rounded-\[var\(--uikit-radius\)\]{border-radius:var(--uikit-radius)}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-\[3px\]{border-width:3px}.border-t{border-top-width:1px}.border-\[var\(--uikit-error\)\]{border-color:var(--uikit-error)}.border-\[var\(--uikit-info\)\]{border-color:var(--uikit-info)}.border-\[var\(--uikit-primary\)\]{border-color:var(--uikit-primary)}.border-\[var\(--uikit-secondary\)\]{border-color:var(--uikit-secondary)}.border-\[var\(--uikit-success\)\]{border-color:var(--uikit-success)}.border-\[var\(--uikit-warning\)\]{border-color:var(--uikit-warning)}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-error{border-color:var(--uikit-error,#d7263d)}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.bg-\[var\(--hover-bg-color\)\]{background-color:var(--hover-bg-color)}.bg-\[var\(--uikit-error\)\]{background-color:var(--uikit-error)}.bg-\[var\(--uikit-info\)\]{background-color:var(--uikit-info)}.bg-\[var\(--uikit-primary\)\]{background-color:var(--uikit-primary)}.bg-\[var\(--uikit-secondary\)\]{background-color:var(--uikit-secondary)}.bg-\[var\(--uikit-success\)\]{background-color:var(--uikit-success)}.bg-\[var\(--uikit-tertiary\)\]{background-color:var(--uikit-tertiary)}.bg-\[var\(--uikit-warning\)\]{background-color:var(--uikit-warning)}.bg-background{background-color:hsl(var(--background))}.bg-border{background-color:hsl(var(--border))}.bg-muted{background-color:hsl(var(--muted))}.bg-popover{background-color:hsl(var(--popover))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.fill-\[var\(--uikit-primary\)\]{fill:var(--uikit-primary)}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[4px\]{padding-left:4px;padding-right:4px}.px-\[6px\]{padding-left:6px;padding-right:6px}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.py-\[4px\]{padding-top:4px;padding-bottom:4px}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-\[16px\]{font-size:16px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-\[var\(--uikit-font-family\)\]{font-weight:var(--uikit-font-family)}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-none{line-height:1}.tracking-widest{letter-spacing:.1em}.text-\[var\(--uikit-error\)\]{color:var(--uikit-error)}.text-\[var\(--uikit-info\)\]{color:var(--uikit-info)}.text-\[var\(--uikit-primary\)\]{color:var(--uikit-primary)}.text-\[var\(--uikit-secondary\)\]{color:var(--uikit-secondary)}.text-\[var\(--uikit-success\)\]{color:var(--uikit-success)}.text-\[var\(--uikit-text-primary\)\]{color:var(--uikit-text-primary)}.text-\[var\(--uikit-warning\)\]{color:var(--uikit-warning)}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-current{color:currentColor}.text-error{color:var(--uikit-error,#d7263d)}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-\[var\(--uikit-error\)\]{--tw-ring-color:var(--uikit-error)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}:root{--uikit-primary:#0a5fff;--uikit-primary-10:color-mix(in srgb,var(--uikit-primary) 10%,transparent);--uikit-secondary:#71717b;--uikit-tertiary:#f3f5fb;--uikit-accent:#e3ecff;--uikit-success:#16c784;--uikit-warning:#f4b740;--uikit-error:#d7263d;--uikit-info:#fef9bf;--uikit-radius:8px;--uikit-font-family:Inter,system-ui,sans-serif;--uikit-text-primary:#27272a}@keyframes mui-bar1{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes mui-bar2{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.mui-loader{position:absolute;top:37px;left:0;right:0;height:4px;overflow:hidden;background-color:var(--uikit-primary-10);z-index:10}.mui-loader:after,.mui-loader:before{content:"";position:absolute;height:100%;background-color:var(--uikit-primary)}.mui-loader:before{animation:mui-bar1 2.5s cubic-bezier(.65,.815,.735,.395) infinite}.mui-loader:after{animation:mui-bar2 2.5s cubic-bezier(.165,.84,.44,1) infinite}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:border:hover{border-width:1px}.hover\:border-\[var\(--uikit-primary\)\]:hover{border-color:var(--uikit-primary)}.hover\:bg-\[var\(--hover-bg-color\)\]:hover{background-color:var(--hover-bg-color)}.hover\:bg-\[var\(--uikit-secondary\)\]:hover{background-color:var(--uikit-secondary)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-transparent:hover{background-color:transparent}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.focus\:border-\[var\(--uikit-primary\)\]:focus{border-color:var(--uikit-primary)}.focus\:border-\[var\(--uikit-secondary\)\]:focus{border-color:var(--uikit-secondary)}.focus\:bg-\[var\(--uikit-error\)\]:focus{background-color:var(--uikit-error)}.focus\:bg-\[var\(--uikit-primary\)\]:focus{background-color:var(--uikit-primary)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:bg-muted:focus{background-color:hsl(var(--muted))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:text-\[var\(--uikit-secondary\)\]:focus{color:var(--uikit-secondary)}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-error:focus-visible{--tw-ring-color:var(--uikit-error,#d7263d)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right],.data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked],.data-\[state\=checked\]\:translate-x-5[data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=checked\]\:translate-x-7[data-state=checked]{--tw-translate-x:1.75rem}.data-\[state\=checked\]\:translate-x-7[data-state=checked],.data-\[state\=checked\]\:translate-x-\[21px\][data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-\[21px\][data-state=checked]{--tw-translate-x:21px}.data-\[state\=unchecked\]\:translate-x-\[2px\][data-state=unchecked]{--tw-translate-x:2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:bg-\[var\(--uikit-primary\)\][data-state=checked]{background-color:var(--uikit-primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=unchecked\]\:bg-black[data-state=unchecked]{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.data-\[inset\]\:pl-8[data-inset]{padding-left:2rem}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[state\=checked\]\:text-\[var\(--uikit-primary\)\][data-state=checked]{color:var(--uikit-primary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:hsl(var(--destructive))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10:focus[data-variant=destructive]{background-color:hsl(var(--destructive)/.1)}.data-\[variant\=destructive\]\:focus\:text-destructive:focus[data-variant=destructive]{color:hsl(var(--destructive))}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:focus[data-variant=destructive]:is(.dark *){background-color:hsl(var(--destructive)/.2)}@media (min-width:640px){.sm\:max-w-sm{max-width:24rem}}@media (min-width:768px){.md\:max-w-md{max-width:28rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:1rem;height:1rem}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:hsl(var(--muted-foreground))}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:h-3 svg{height:.75rem}.\[\&_svg\]\:h-4 svg{height:1rem}.\[\&_svg\]\:w-3 svg{width:.75rem}.\[\&_svg\]\:w-4 svg{width:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}
1
+ *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:0 0% 100%;--foreground:0 0% 3.9%;--card:0 0% 100%;--card-foreground:0 0% 3.9%;--popover:0 0% 100%;--popover-foreground:0 0% 3.9%;--primary:0 0% 9%;--primary-foreground:0 0% 98%;--secondary:0 0% 96.1%;--secondary-foreground:0 0% 9%;--muted:0 0% 96.1%;--muted-foreground:0 0% 45.1%;--accent:0 0% 96.1%;--accent-foreground:0 0% 9%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:0 0% 89.8%;--input:0 0% 89.8%;--ring:0 0% 3.9%;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%;--radius:0.5rem}.dark{--background:0 0% 3.9%;--foreground:0 0% 98%;--card:0 0% 3.9%;--card-foreground:0 0% 98%;--popover:0 0% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:0 0% 9%;--secondary:0 0% 14.9%;--secondary-foreground:0 0% 98%;--muted:0 0% 14.9%;--muted-foreground:0 0% 63.9%;--accent:0 0% 14.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:0 0% 14.9%;--input:0 0% 14.9%;--ring:0 0% 83.1%;--chart-1:220 70% 50%;--chart-2:160 60% 45%;--chart-3:30 80% 55%;--chart-4:280 65% 60%;--chart-5:340 75% 55%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-y-0{top:0;bottom:0}.left-2{left:.5rem}.right-2{right:.5rem}.right-3{right:.75rem}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.ml-auto{margin-left:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.size-2{width:.5rem;height:.5rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[12px\]{height:12px}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-\[22px\]{height:22px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:var(--radix-select-content-available-height)}.w-11{width:2.75rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[12px\]{width:12px}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[20px\]{width:20px}.w-\[320px\]{width:320px}.w-\[40px\]{width:40px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.origin-\[--radix-select-content-transform-origin\]{transform-origin:var(--radix-select-content-transform-origin)}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:var(--uikit-radius,.5rem)}.rounded-\[var\(--uikit-radius\)\]{border-radius:var(--uikit-radius)}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-\[3px\]{border-width:3px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-\[var\(--uikit-error\)\]{border-color:var(--uikit-error)}.border-\[var\(--uikit-info\)\]{border-color:var(--uikit-info)}.border-\[var\(--uikit-primary\)\]{border-color:var(--uikit-primary)}.border-\[var\(--uikit-secondary\)\]{border-color:var(--uikit-secondary)}.border-\[var\(--uikit-success\)\]{border-color:var(--uikit-success)}.border-\[var\(--uikit-warning\)\]{border-color:var(--uikit-warning)}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-error{border-color:var(--uikit-error,#d7263d)}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.bg-\[var\(--uikit-error\)\]{background-color:var(--uikit-error)}.bg-\[var\(--uikit-info\)\]{background-color:var(--uikit-info)}.bg-\[var\(--uikit-primary\)\]{background-color:var(--uikit-primary)}.bg-\[var\(--uikit-primary-10\)\]{background-color:var(--uikit-primary-10)}.bg-\[var\(--uikit-secondary\)\]{background-color:var(--uikit-secondary)}.bg-\[var\(--uikit-success\)\]{background-color:var(--uikit-success)}.bg-\[var\(--uikit-tertiary\)\]{background-color:var(--uikit-tertiary)}.bg-\[var\(--uikit-warning\)\]{background-color:var(--uikit-warning)}.bg-background{background-color:hsl(var(--background))}.bg-border{background-color:hsl(var(--border))}.bg-muted{background-color:hsl(var(--muted))}.bg-popover{background-color:hsl(var(--popover))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.fill-\[var\(--uikit-primary\)\]{fill:var(--uikit-primary)}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[4px\]{padding-left:4px;padding-right:4px}.px-\[6px\]{padding-left:6px;padding-right:6px}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.py-\[4px\]{padding-top:4px;padding-bottom:4px}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-\[16px\]{font-size:16px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-\[var\(--uikit-font-family\)\]{font-weight:var(--uikit-font-family)}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-none{line-height:1}.tracking-widest{letter-spacing:.1em}.text-\[var\(--uikit-error\)\]{color:var(--uikit-error)}.text-\[var\(--uikit-info\)\]{color:var(--uikit-info)}.text-\[var\(--uikit-primary\)\]{color:var(--uikit-primary)}.text-\[var\(--uikit-secondary\)\]{color:var(--uikit-secondary)}.text-\[var\(--uikit-success\)\]{color:var(--uikit-success)}.text-\[var\(--uikit-text-primary\)\]{color:var(--uikit-text-primary)}.text-\[var\(--uikit-textPrimary\)\]{color:var(--uikit-textPrimary)}.text-\[var\(--uikit-warning\)\]{color:var(--uikit-warning)}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-current{color:currentColor}.text-error{color:var(--uikit-error,#d7263d)}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-\[var\(--uikit-error\)\]{--tw-ring-color:var(--uikit-error)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}:root{--uikit-primary:#0a5fff;--uikit-primary-10:color-mix(in srgb,var(--uikit-primary) 10%,transparent);--uikit-secondary:#71717b;--uikit-tertiary:#f3f5fb;--uikit-accent:#e3ecff;--uikit-success:#16c784;--uikit-warning:#f4b740;--uikit-error:#d7263d;--uikit-info:#fef9bf;--uikit-radius:8px;--uikit-font-family:Inter,system-ui,sans-serif;--uikit-text-primary:#27272a}@keyframes mui-bar1{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes mui-bar2{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.mui-loader{position:absolute;top:37px;left:0;right:0;height:4px;overflow:hidden;background-color:var(--uikit-primary-10);z-index:10}.mui-loader:after,.mui-loader:before{content:"";position:absolute;height:100%;background-color:var(--uikit-primary)}.mui-loader:before{animation:mui-bar1 2.5s cubic-bezier(.65,.815,.735,.395) infinite}.mui-loader:after{animation:mui-bar2 2.5s cubic-bezier(.165,.84,.44,1) infinite}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:border:hover{border-width:1px}.hover\:border-\[var\(--uikit-primary\)\]:hover{border-color:var(--uikit-primary)}.hover\:bg-\[var\(--uikit-primary-10\)\]:hover{background-color:var(--uikit-primary-10)}.hover\:bg-\[var\(--uikit-secondary\)\]:hover{background-color:var(--uikit-secondary)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-transparent:hover{background-color:transparent}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.focus\:border-\[var\(--uikit-primary\)\]:focus{border-color:var(--uikit-primary)}.focus\:border-\[var\(--uikit-secondary\)\]:focus{border-color:var(--uikit-secondary)}.focus\:bg-\[var\(--uikit-error\)\]:focus{background-color:var(--uikit-error)}.focus\:bg-\[var\(--uikit-primary\)\]:focus{background-color:var(--uikit-primary)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:bg-muted:focus{background-color:hsl(var(--muted))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:text-\[var\(--uikit-secondary\)\]:focus{color:var(--uikit-secondary)}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-error:focus-visible{--tw-ring-color:var(--uikit-error,#d7263d)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right],.data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked],.data-\[state\=checked\]\:translate-x-5[data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=checked\]\:translate-x-7[data-state=checked]{--tw-translate-x:1.75rem}.data-\[state\=checked\]\:translate-x-7[data-state=checked],.data-\[state\=checked\]\:translate-x-\[21px\][data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-\[21px\][data-state=checked]{--tw-translate-x:21px}.data-\[state\=unchecked\]\:translate-x-\[2px\][data-state=unchecked]{--tw-translate-x:2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:bg-\[var\(--uikit-primary\)\][data-state=checked]{background-color:var(--uikit-primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=unchecked\]\:bg-black[data-state=unchecked]{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.data-\[inset\]\:pl-8[data-inset]{padding-left:2rem}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[state\=checked\]\:text-\[var\(--uikit-primary\)\][data-state=checked]{color:var(--uikit-primary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:hsl(var(--destructive))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10:focus[data-variant=destructive]{background-color:hsl(var(--destructive)/.1)}.data-\[variant\=destructive\]\:focus\:text-destructive:focus[data-variant=destructive]{color:hsl(var(--destructive))}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:focus[data-variant=destructive]:is(.dark *){background-color:hsl(var(--destructive)/.2)}@media (min-width:640px){.sm\:max-w-sm{max-width:24rem}}@media (min-width:768px){.md\:max-w-md{max-width:28rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:1rem;height:1rem}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:hsl(var(--muted-foreground))}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:h-3 svg{height:.75rem}.\[\&_svg\]\:h-4 svg{height:1rem}.\[\&_svg\]\:w-3 svg{width:.75rem}.\[\&_svg\]\:w-4 svg{width:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}
@@ -4,8 +4,8 @@ import { Slot } from '@radix-ui/react-slot';
4
4
  import { cn } from '../../lib/utils';
5
5
  import { Loader2Icon } from 'lucide-react';
6
6
  import { buttonVariants } from './ButtonVariants';
7
- export const Button = React.forwardRef(({ variant, size, asChild = false, loading = false, className, icon, iconPosition = 'left', loadingText, title, ...props }, ref) => {
7
+ export const Button = React.forwardRef(({ variant, size, asChild = false, loading = false, className, icon, iconPosition = 'left', loadingText, children, ...props }, ref) => {
8
8
  const Comp = asChild ? Slot : 'button';
9
- return (_jsx(Comp, { className: cn(buttonVariants({ variant, size }), className), ref: ref, disabled: loading || props.disabled, ...props, children: loading ? (_jsxs(_Fragment, { children: [_jsx(Loader2Icon, { className: "animate-spin" }), loadingText] })) : (_jsxs("div", { className: cn('flex items-center', iconPosition === 'right' && 'flex-row-reverse', iconPosition === 'left' && 'flex-row', icon && title && 'gap-2'), children: [icon && _jsx("span", { children: icon }), _jsx("span", { children: title })] })) }));
9
+ return (_jsx(Comp, { className: cn(buttonVariants({ variant, size }), className), ref: ref, disabled: loading || props.disabled, ...props, children: loading ? (_jsxs(_Fragment, { children: [_jsx(Loader2Icon, { className: "animate-spin" }), loadingText] })) : (_jsxs("span", { className: cn('flex items-center', iconPosition === 'right' && 'flex-row-reverse', iconPosition === 'left' && 'flex-row', icon && 'gap-2'), children: [icon && _jsx("span", { children: icon }), children] })) }));
10
10
  });
11
11
  Button.displayName = 'Button';
@@ -5,7 +5,7 @@ const meta = {
5
5
  component: Button,
6
6
  tags: ['autodocs'],
7
7
  args: {
8
- title: 'Click me',
8
+ children: 'Click me',
9
9
  },
10
10
  };
11
11
  export default meta;
@@ -46,14 +46,14 @@ export const WithLoadingText = {
46
46
  },
47
47
  };
48
48
  export const WithIconLeft = {
49
- render: () => _jsx(Button, { icon: "\u26A1", iconPosition: "left", title: "Click me" }),
49
+ render: () => (_jsx(Button, { icon: "\u26A1", iconPosition: "left", children: "Click me" })),
50
50
  };
51
51
  export const WithIconRight = {
52
- render: () => _jsx(Button, { icon: "\u26A1", iconPosition: "right", title: "Click me" }),
52
+ render: () => (_jsx(Button, { icon: "\u26A1", iconPosition: "right", children: "Click me" })),
53
53
  };
54
54
  export const DisabledVariants = {
55
- render: () => (_jsxs("div", { style: { display: 'flex', gap: '12px', flexWrap: 'wrap' }, children: [_jsx(Button, { variant: "primary", title: "Primary", disabled: true }), _jsx(Button, { variant: "secondary", title: "Secondary", disabled: true }), _jsx(Button, { variant: "outlined", title: "Outlined", disabled: true }), _jsx(Button, { variant: "ghost", title: "Ghost", disabled: true })] })),
55
+ render: () => (_jsxs("div", { style: { display: 'flex', gap: '12px', flexWrap: 'wrap' }, children: [_jsx(Button, { variant: "primary", disabled: true, children: "Primary" }), _jsx(Button, { variant: "secondary", disabled: true, children: "Secondary" }), _jsx(Button, { variant: "outlined", disabled: true, children: "Outlined" }), _jsx(Button, { variant: "ghost", disabled: true, children: "Ghost" })] })),
56
56
  };
57
57
  export const AllSizes = {
58
- render: () => (_jsxs("div", { style: { display: 'flex', gap: '12px', flexWrap: 'wrap' }, children: [_jsx(Button, { size: "sm", title: "Small" }), _jsx(Button, { size: "default", title: "Default" }), _jsx(Button, { size: "lg", title: "Large" })] })),
58
+ render: () => (_jsxs("div", { style: { display: 'flex', gap: '12px', flexWrap: 'wrap' }, children: [_jsx(Button, { size: "sm", children: "Small" }), _jsx(Button, { size: "default", children: "Default" }), _jsx(Button, { size: "lg", children: "Large" }), _jsx(Button, { size: "icon", "aria-label": "Icon", children: "\u26A1" })] })),
59
59
  };
@@ -1,11 +1,10 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import { type buttonVariants } from './ButtonVariants';
3
3
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
4
- children?: React.ReactNode;
4
+ children: React.ReactNode;
5
5
  asChild?: boolean;
6
6
  loading?: boolean;
7
7
  loadingText?: string;
8
- title: string;
9
8
  icon?: React.ReactNode;
10
9
  iconPosition?: 'left' | 'right';
11
10
  }
@@ -10,9 +10,9 @@ export const buttonVariants = cva('inline-flex items-center justify-center gap-2
10
10
  'focus:bg-white focus:text-[var(--uikit-secondary)] focus:border-[var(--uikit-primary)]',
11
11
  outlined: 'bg-transparent border border-[var(--uikit-primary)] text-[var(--uikit-secondary)] ' +
12
12
  'focus:border-[var(--uikit-secondary)]',
13
- ghost: 'bg-transparent text-[var(--uikit-secondary)] ' +
14
- 'hover:bg-transparent hover:border hover:border-[var(--uikit-primary)] ' +
15
- 'focus:text-[var(--uikit-secondary)] focus:border-[var(--uikit-secondary)]',
13
+ ghost: 'bg-transparent text-[var(--uikit-textPrimary)] ' +
14
+ 'hover:bg-transparent hover:border hover:border-[var(--uikit-primary)] ',
15
+ // 'focus:text-[var(--uikit-secondary)] focus:border-[var(--uikit-secondary)]', // to be discussed
16
16
  destructive: 'bg-[var(--uikit-error)] text-white ' +
17
17
  'hover:bg-[var(--uikit-error)]/90 ' +
18
18
  'focus:bg-[var(--uikit-error)]',
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Divider } from './Divider';
3
+ import { Button } from '../Button';
3
4
  const meta = {
4
5
  title: 'UIKit/Divider',
5
6
  component: Divider,
@@ -13,7 +14,7 @@ export const HorizontalCustomColor = {
13
14
  render: () => (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "text-sm", children: "Above custom divider" }), _jsx(Divider, { orientation: "horizontal", color: "#f97316" }), _jsx("div", { className: "text-sm", children: "Below custom divider" })] })),
14
15
  };
15
16
  export const Vertical = {
16
- render: () => (_jsxs("div", { className: "flex items-center space-x-2 h-8", children: [_jsx("button", { className: "text-sm px-3 py-1", children: "Option A" }), _jsx(Divider, { orientation: "vertical" }), _jsx("button", { className: "text-sm px-3 py-1", children: "Option B" })] })),
17
+ render: () => (_jsxs("div", { className: "flex items-center space-x-2 h-8", children: [_jsx(Button, { children: "Option A" }), _jsx(Divider, { orientation: "vertical" }), _jsx(Button, { children: "Option B" })] })),
17
18
  };
18
19
  export const VerticalTall = {
19
20
  render: () => (_jsxs("div", { className: "flex gap-4 items-stretch h-24", children: [_jsx("div", { className: "flex-1 bg-muted p-2", children: "Column A" }), _jsx(Divider, { orientation: "vertical" }), _jsx("div", { className: "flex-1 bg-muted p-2", children: "Column B" })] })),
@@ -9,24 +9,24 @@ const meta = {
9
9
  };
10
10
  export default meta;
11
11
  export const DefaultItems = {
12
- render: () => (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { title: "Menu" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuItem, { children: "Profile" }), _jsx(DropdownMenuItem, { children: "Billing" }), _jsx(DropdownMenuItem, { children: "Log out" })] })] })),
12
+ render: () => (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { children: "Menu" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuItem, { children: "Profile" }), _jsx(DropdownMenuItem, { children: "Billing" }), _jsx(DropdownMenuItem, { children: "Log out" })] })] })),
13
13
  };
14
14
  export const WithCheckboxItems = {
15
15
  render: () => {
16
16
  const [showSidebar, setShowSidebar] = useState(true);
17
17
  const [enableSync, setEnableSync] = useState(false);
18
- return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { title: "Settings" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuCheckboxItem, { checked: showSidebar, onCheckedChange: setShowSidebar, children: "Show Sidebar" }), _jsx(DropdownMenuCheckboxItem, { checked: enableSync, onCheckedChange: setEnableSync, children: "Enable Sync" })] })] }));
18
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { children: "Settings" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuCheckboxItem, { checked: showSidebar, onCheckedChange: setShowSidebar, children: "Show Sidebar" }), _jsx(DropdownMenuCheckboxItem, { checked: enableSync, onCheckedChange: setEnableSync, children: "Enable Sync" })] })] }));
19
19
  },
20
20
  };
21
21
  export const WithRadioItems = {
22
22
  render: () => {
23
23
  const [theme, setTheme] = useState('light');
24
- return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { title: "Theme" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuLabel, { children: "Theme" }), _jsxs(DropdownMenuRadioGroup, { value: theme, onValueChange: setTheme, children: [_jsx(DropdownMenuRadioItem, { value: "light", children: "Light" }), _jsx(DropdownMenuRadioItem, { value: "dark", children: "Dark" }), _jsx(DropdownMenuRadioItem, { value: "system", children: "System" })] })] })] }));
24
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { children: "Theme" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuLabel, { children: "Theme" }), _jsxs(DropdownMenuRadioGroup, { value: theme, onValueChange: setTheme, children: [_jsx(DropdownMenuRadioItem, { value: "light", children: "Light" }), _jsx(DropdownMenuRadioItem, { value: "dark", children: "Dark" }), _jsx(DropdownMenuRadioItem, { value: "system", children: "System" })] })] })] }));
25
25
  },
26
26
  };
27
27
  export const WithLabelAndSeparator = {
28
- render: () => (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { title: "Account" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuLabel, { children: "Account" }), _jsx(DropdownMenuItem, { children: "Email" }), _jsx(DropdownMenuItem, { children: "Password" }), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { variant: "destructive", children: "Delete Account" })] })] })),
28
+ render: () => (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { children: "Account" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuLabel, { children: "Account" }), _jsx(DropdownMenuItem, { children: "Email" }), _jsx(DropdownMenuItem, { children: "Password" }), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { variant: "destructive", children: "Delete Account" })] })] })),
29
29
  };
30
30
  export const WithSubMenu = {
31
- render: () => (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { title: "More" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuItem, { children: "Dashboard" }), _jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: "Tools" }), _jsxs(DropdownMenuSubContent, { children: [_jsx(DropdownMenuItem, { children: "Editor" }), _jsx(DropdownMenuItem, { children: "Console" })] })] })] })] })),
31
+ render: () => (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { children: "More" }) }), _jsxs(DropdownMenuContent, { children: [_jsx(DropdownMenuItem, { children: "Dashboard" }), _jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: "Tools" }), _jsxs(DropdownMenuSubContent, { children: [_jsx(DropdownMenuItem, { children: "Editor" }), _jsx(DropdownMenuItem, { children: "Console" })] })] })] })] })),
32
32
  };
@@ -15,7 +15,7 @@ export const Default = {
15
15
  { label: 'Settings', onSelect: () => alert('Settings selected') },
16
16
  { label: 'Logout', onSelect: () => alert('Logout selected') },
17
17
  ];
18
- return (_jsx(DropdownWrapper, { structure: "default", options: options, triggerElement: _jsx(Button, { title: "Open Default" }) }));
18
+ return _jsx(DropdownWrapper, { structure: "default", options: options, triggerElement: _jsx(Button, { children: "Open Default" }) });
19
19
  },
20
20
  };
21
21
  export const Checkbox = {
@@ -26,7 +26,7 @@ export const Checkbox = {
26
26
  { label: 'Enable Notifications', checked: optA, onCheckedChange: setOptA },
27
27
  { label: 'Auto Sync', checked: optB, onCheckedChange: setOptB },
28
28
  ];
29
- return (_jsx(DropdownWrapper, { structure: "checkbox", options: options, triggerElement: _jsx(Button, { title: "Checkbox Settings" }) }));
29
+ return (_jsx(DropdownWrapper, { structure: "checkbox", options: options, triggerElement: _jsx(Button, { children: "Checkbox Settings" }) }));
30
30
  },
31
31
  };
32
32
  export const Radio = {
@@ -37,7 +37,7 @@ export const Radio = {
37
37
  { label: 'Dark', value: 'dark' },
38
38
  { label: 'System', value: 'system' },
39
39
  ];
40
- return (_jsx(DropdownWrapper, { structure: "radio", options: options, selectedValue: selected, onValueChange: setSelected, triggerElement: _jsx(Button, { title: "Choose Theme" }) }));
40
+ return (_jsx(DropdownWrapper, { structure: "radio", options: options, selectedValue: selected, onValueChange: setSelected, triggerElement: _jsx(Button, { children: "Choose Theme" }) }));
41
41
  },
42
42
  };
43
43
  export const Grouped = {
@@ -47,7 +47,7 @@ export const Grouped = {
47
47
  { groupLabel: 'Account', label: 'Password', onSelect: () => alert('Password') },
48
48
  { groupLabel: 'Danger zone', label: 'Delete Account', onSelect: () => alert('Deleted'), disabled: false },
49
49
  ];
50
- return (_jsx(DropdownWrapper, { structure: "grouped", options: options, triggerElement: _jsx(Button, { title: "Grouped Menu" }) }));
50
+ return _jsx(DropdownWrapper, { structure: "grouped", options: options, triggerElement: _jsx(Button, { children: "Grouped Menu" }) });
51
51
  },
52
52
  };
53
53
  export const Submenu = {
@@ -69,6 +69,6 @@ export const Submenu = {
69
69
  onSelect: () => alert('Support'),
70
70
  },
71
71
  ];
72
- return (_jsx(DropdownWrapper, { structure: "submenu", options: options, triggerElement: _jsx(Button, { title: "With Submenu" }) }));
72
+ return _jsx(DropdownWrapper, { structure: "submenu", options: options, triggerElement: _jsx(Button, { children: "With Submenu" }) });
73
73
  },
74
74
  };
@@ -1,3 +1,3 @@
1
1
  import type { PageSizeSelectorProps, PaginationControlsProps } from './PaginationControls.types';
2
2
  export declare const PageSizeSelector: ({ id, value, onChange, options, label, className, size, }: PageSizeSelectorProps) => import("react/jsx-runtime").JSX.Element;
3
- export declare const PaginationFooter: <T>({ table, tableId, paginationMode, pageCount, onPageSizeChange, }: PaginationControlsProps<T>) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const PaginationFooter: <T>({ table, tableId, paginationMode, onPageSizeChange, totalServerRows, onNextPage, onPrevPage, }: PaginationControlsProps<T>) => import("react/jsx-runtime").JSX.Element;
@@ -1,19 +1,22 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Button } from '../../Button';
3
2
  import { SelectWrapper } from '../../SelectWrapper';
4
3
  import { cn } from '../../../lib/utils';
4
+ import { FaChevronLeft, FaChevronRight } from 'react-icons/fa';
5
+ import { Button } from '../../Button';
5
6
  export const PageSizeSelector = ({ id, value, onChange, options = ['5', '10', '20', '50', '100'], label = 'Rows per page:', className, size = 'default', }) => {
6
- return (_jsxs("div", { className: cn('flex items-center gap-2 px-4 py-2 text-sm', className), id: `page-size-select-${id}`, children: [_jsx("label", { htmlFor: `page-size-select-${id}`, children: label }), _jsx("div", { className: "w-fit", children: _jsx(SelectWrapper, { size: size, value: value, onChange: onChange, options: options.map((option) => ({
7
+ return (_jsxs("div", { className: cn('flex items-center gap-2 text-sm', className), id: `page-size-select-${id}`, children: [_jsx("label", { htmlFor: `page-size-select-${id}`, children: label }), _jsx("div", { className: "w-fit", children: _jsx(SelectWrapper, { size: size, value: value, onChange: onChange, options: options.map((option) => ({
7
8
  label: option,
8
9
  value: option,
9
- })) }) })] }));
10
+ })), className: "bg-transparent shadow-none border-none gap-1" }) })] }));
10
11
  };
11
- export const PaginationFooter = ({ table, tableId, paginationMode = 'client', pageCount, onPageSizeChange, }) => {
12
- const { pageIndex } = table.getState().pagination;
13
- const totalPages = paginationMode === 'server' ? (pageCount !== null && pageCount !== void 0 ? pageCount : 1) : Math.max(table.getPageCount(), 1);
14
- return (_jsxs("div", { className: "flex items-center justify-between px-4 py-2 text-sm w-full", children: [_jsx(PageSizeSelector, { id: tableId, value: String(table.getState().pagination.pageSize), onChange: (val) => {
12
+ export const PaginationFooter = ({ table, tableId, paginationMode = 'client', onPageSizeChange, totalServerRows, onNextPage, onPrevPage, }) => {
13
+ const { pageIndex, pageSize } = table.getState().pagination;
14
+ const totalRows = paginationMode === 'server' ? (totalServerRows !== null && totalServerRows !== void 0 ? totalServerRows : 0) : table.getFilteredRowModel().rows.length;
15
+ const startRow = pageIndex * pageSize + 1;
16
+ const endRow = Math.min((pageIndex + 1) * pageSize, totalRows);
17
+ return (_jsxs("div", { className: "flex justify-end items-center gap-6 px-4 py-2 text-sm w-full", children: [_jsx(PageSizeSelector, { id: tableId, value: String(pageSize), onChange: (val) => {
15
18
  const newSize = Number(val);
16
19
  table.setPageSize(newSize);
17
20
  onPageSizeChange === null || onPageSizeChange === void 0 ? void 0 : onPageSizeChange(newSize);
18
- }, size: "small" }), table.getRowModel().rows.length > 0 && (_jsxs("div", { className: "flex justify-center gap-3", id: `pagination-controls-${tableId}`, children: [_jsx(Button, { variant: "secondary", title: "Previous", onClick: () => table.previousPage(), disabled: !table.getCanPreviousPage() }), _jsx(Button, { variant: "secondary", title: "Next", onClick: () => table.nextPage(), disabled: !table.getCanNextPage() })] })), _jsxs("div", { className: "flex justify-end", id: `page-indicator-${tableId}`, children: ["Page ", pageIndex + 1, " of ", totalPages] })] }));
21
+ }, size: "small", label: "Rows per page" }), totalRows > 0 && _jsx("div", { id: `page-indicator-${tableId}`, children: `${startRow} - ${endRow} of ${totalRows}` }), totalRows > 0 && (_jsxs("div", { className: "flex gap-4", id: `pagination-controls-${tableId}`, children: [_jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Previous page", onClick: onPrevPage, disabled: !table.getCanPreviousPage(), children: _jsx(FaChevronLeft, {}) }), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Next page", onClick: onNextPage, disabled: !table.getCanNextPage(), children: _jsx(FaChevronRight, {}) })] }))] }));
19
22
  };
@@ -4,9 +4,13 @@ export interface PaginationControlsProps<T> {
4
4
  tableId: string;
5
5
  table: Table<T>;
6
6
  paginationMode?: 'client' | 'server';
7
- pageCount?: number;
7
+ totalServerRows?: number;
8
8
  pageSizeOptions?: string[];
9
9
  onPageSizeChange?: (size: number) => void;
10
+ onNextPage: () => void;
11
+ onPrevPage: () => void;
12
+ canNextPage: boolean;
13
+ canPrevPage: boolean;
10
14
  }
11
15
  export type PageSizeSelectorProps = {
12
16
  id: string;
@@ -3,9 +3,10 @@ import { flexRender } from '@tanstack/react-table';
3
3
  import { classNames } from '../../utils/classNames';
4
4
  import { PaginationFooter } from './Pagination/PaginationControls';
5
5
  import { useTableController } from './hooks/useTableController';
6
+ import { FaChevronDown, FaChevronUp } from 'react-icons/fa';
6
7
  export function Table(props) {
7
8
  var _a;
8
- const { table, setPageSize } = useTableController(props);
9
+ const { table, setPageSize, ...pagination } = useTableController(props);
9
10
  let tableContent;
10
11
  if (props.isLoading && props.showSkeletonRows) {
11
12
  tableContent = Array.from({ length: 3 }).map((_c) => (_jsx("tr", { className: "border-t animate-pulse", children: table.getVisibleFlatColumns().map((__c) => (_jsx("td", { className: "px-4 py-2", children: _jsx("div", { className: "h-4 w-3/4 bg-[var(--uikit-tertiary)] rounded" }) }, `skeleton-cell-${__c.id}`))) }, `skeleton-row`)));
@@ -14,7 +15,7 @@ export function Table(props) {
14
15
  tableContent = (_jsx("tr", { children: _jsx("td", { colSpan: table.getVisibleFlatColumns().length, className: "px-4 py-8 text-center text-muted-foreground", children: (_a = props.noRowsMessage) !== null && _a !== void 0 ? _a : 'No rows to display' }) }));
15
16
  }
16
17
  else {
17
- tableContent = table.getRowModel().rows.map((row) => (_jsx("tr", { className: classNames('border-t hover:bg-[var(--hover-bg-color)]', row.getIsSelected() && 'bg-[var(--hover-bg-color)]'), children: row.getVisibleCells().map((cell) => {
18
+ tableContent = table.getRowModel().rows.map((row) => (_jsx("tr", { className: classNames('border-t hover:bg-[var(--uikit-primary-10)]', row.getIsSelected() && 'bg-[var(--uikit-primary-10)]'), children: row.getVisibleCells().map((cell) => {
18
19
  const width = cell.column.getSize();
19
20
  return (_jsx("td", { style: { width }, className: cell.column.id === 'select' ? 'p-1' : 'px-4 py-2', children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
20
21
  }) }, row.id)));
@@ -25,8 +26,8 @@ export function Table(props) {
25
26
  : undefined, children: _jsxs("div", { className: classNames('w-full h-full', header.id === 'select'
26
27
  ? 'flex justify-center items-center'
27
28
  : 'flex items-center gap-2'), children: [flexRender(header.column.columnDef.header, header.getContext()), header.column.getCanSort() && (_jsx("span", { className: "text-xs", children: {
28
- asc: '↑',
29
- desc: '↓',
29
+ asc: _jsx(FaChevronUp, {}),
30
+ desc: _jsx(FaChevronDown, {}),
30
31
  }[header.column.getIsSorted()] || null }))] }) }, header.id));
31
- }) }, headerGroup.id))) }), _jsx("tbody", { children: tableContent })] }) }), _jsx(PaginationFooter, { tableId: props.id, table: table, paginationMode: props.paginationMode, pageCount: props.pageCount, onPageSizeChange: setPageSize })] }));
32
+ }) }, headerGroup.id))) }), _jsx("tbody", { children: tableContent })] }) }), _jsx(PaginationFooter, { tableId: props.id, table: table, paginationMode: props.paginationMode, totalServerRows: props.totalServerRows, onPageSizeChange: setPageSize, ...pagination })] }));
32
33
  }
@@ -1,13 +1,5 @@
1
1
  import { Table } from './Table';
2
- import type { FlexColumnDef } from './Table.types';
3
2
  import type { Meta, StoryObj } from '@storybook/react';
4
- type User = {
5
- id: string;
6
- name: string;
7
- email: string;
8
- role: string;
9
- };
10
- export declare const columns: FlexColumnDef<User>[];
11
3
  declare const meta: Meta<typeof Table>;
12
4
  export default meta;
13
5
  type Story = StoryObj<typeof Table>;
@@ -15,6 +7,7 @@ export declare const Basic: Story;
15
7
  export declare const NoRows: Story;
16
8
  export declare const LoadingWithSkeleton: Story;
17
9
  export declare const ClientPagination: Story;
10
+ export declare const ServerSidePagination: Story;
18
11
  export declare const WithCheckboxSelection: Story;
19
12
  export declare const WithDisabledSelection: Story;
20
13
  export declare const WithSingleRowSelection: Story;
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useState } from 'react';
2
+ import { useCallback, useState } from 'react';
3
3
  import { Table } from './Table';
4
4
  const data = Array.from({ length: 10 }).map((_, i) => ({
5
5
  id: `user-${i + 1}`,
@@ -7,7 +7,7 @@ const data = Array.from({ length: 10 }).map((_, i) => ({
7
7
  email: `user${i + 1}@example.com`,
8
8
  role: i % 2 === 0 ? 'Admin' : 'User',
9
9
  }));
10
- export const columns = [
10
+ const columns = [
11
11
  {
12
12
  accessorKey: 'id',
13
13
  header: 'ID',
@@ -53,6 +53,36 @@ export const LoadingWithSkeleton = {
53
53
  export const ClientPagination = {
54
54
  render: () => _jsx(Table, { id: "example-table", data: data, columns: columns, paginationMode: "client", rowsPerPage: 5 }),
55
55
  };
56
+ const fetchServerData = (pageIndex, pageSize) => {
57
+ return new Promise((resolve) => {
58
+ setTimeout(() => {
59
+ const start = pageIndex * pageSize;
60
+ const data = Array.from({ length: pageSize }).map((_, i) => {
61
+ const id = start + i + 1;
62
+ return {
63
+ id: `user-${id}`,
64
+ name: `User ${id}`,
65
+ email: `user${id}@example.com`,
66
+ role: id % 2 === 0 ? 'Admin' : 'User',
67
+ };
68
+ });
69
+ resolve(data);
70
+ }, 500);
71
+ });
72
+ };
73
+ export const ServerSidePagination = {
74
+ render: () => {
75
+ const [data, setData] = useState([]);
76
+ const [isLoading, setIsLoading] = useState(false);
77
+ const fetchData = useCallback(async (pageIndex, pageSize) => {
78
+ setIsLoading(true);
79
+ const results = await fetchServerData(pageIndex, pageSize);
80
+ setData(results);
81
+ setIsLoading(false);
82
+ }, []);
83
+ return (_jsx(Table, { id: "server-table", data: data, columns: columns, paginationMode: "server", totalServerRows: 100, onRefetch: fetchData, isLoading: isLoading }));
84
+ },
85
+ };
56
86
  const handleSelectionChange = (selectedRowIds) => {
57
87
  console.log('Selected Row IDs:', selectedRowIds);
58
88
  // Update your state or perform actions based on selected rows
@@ -16,8 +16,9 @@ export interface TableProps<T> {
16
16
  onSortingChange?: (s: SortingState) => void;
17
17
  onSelectionChange?: (selectedIds: string[]) => void;
18
18
  enableRowSelection?: (row: Row<T>) => boolean;
19
+ onRefetch?: (pageIndex: number, pageSize: number) => void;
19
20
  isMultiRowSelection?: boolean;
20
- pageCount?: number;
21
+ totalServerRows?: number;
21
22
  paginationMode?: 'client' | 'server';
22
23
  noRowsMessage?: string;
23
24
  rowsPerPage?: number;
@@ -0,0 +1,15 @@
1
+ import type { Table } from '@tanstack/react-table';
2
+ interface UsePaginationControllerOptions<T> {
3
+ table: Table<T>;
4
+ paginationMode: 'client' | 'server';
5
+ onRefetch?: (pageIndex: number, pageSize: number) => void;
6
+ }
7
+ export declare function usePaginationController<T>({ table, paginationMode, onRefetch }: UsePaginationControllerOptions<T>): {
8
+ pageIndex: number;
9
+ pageSize: number;
10
+ canNextPage: boolean;
11
+ canPrevPage: boolean;
12
+ onNextPage: () => void;
13
+ onPrevPage: () => void;
14
+ };
15
+ export {};
@@ -0,0 +1,30 @@
1
+ import { useCallback, useEffect, useMemo } from 'react';
2
+ export function usePaginationController({ table, paginationMode, onRefetch }) {
3
+ const { pageIndex, pageSize } = table.getState().pagination;
4
+ const canNextPage = table.getCanNextPage();
5
+ const canPrevPage = table.getCanPreviousPage();
6
+ const onNextPage = useCallback(() => {
7
+ if (canNextPage) {
8
+ table.nextPage();
9
+ }
10
+ }, [canNextPage, table]);
11
+ const onPrevPage = useCallback(() => {
12
+ if (canPrevPage) {
13
+ table.previousPage();
14
+ }
15
+ }, [canPrevPage, table]);
16
+ // Only refetch in server mode
17
+ useEffect(() => {
18
+ if (paginationMode === 'server' && onRefetch) {
19
+ onRefetch(pageIndex, pageSize);
20
+ }
21
+ }, [paginationMode, pageIndex, pageSize, onRefetch]);
22
+ return useMemo(() => ({
23
+ pageIndex,
24
+ pageSize,
25
+ canNextPage,
26
+ canPrevPage,
27
+ onNextPage,
28
+ onPrevPage,
29
+ }), [pageIndex, pageSize, canNextPage, canPrevPage, onNextPage, onPrevPage]);
30
+ }
@@ -2,10 +2,14 @@ import { type SortingState } from '@tanstack/react-table';
2
2
  import type { TableProps } from '../Table.types';
3
3
  export declare function useTableController<T extends {
4
4
  id: string;
5
- }>({ data, columns, checkboxSelection, checkboxPosition, paginationMode, pageCount, sorting, onSortingChange, onSelectionChange, enableRowSelection, rowsPerPage, isMultiRowSelection, selectedRowIds, rowIdKey, }: TableProps<T>): {
6
- table: import("@tanstack/react-table").Table<T>;
7
- pageSize: number;
5
+ }>({ data, columns, checkboxSelection, checkboxPosition, paginationMode, sorting, onSortingChange, onSelectionChange, enableRowSelection, rowsPerPage, isMultiRowSelection, selectedRowIds, rowIdKey, totalServerRows, onRefetch, }: TableProps<T>): {
8
6
  pageIndex: number;
7
+ pageSize: number;
8
+ canNextPage: boolean;
9
+ canPrevPage: boolean;
10
+ onNextPage: () => void;
11
+ onPrevPage: () => void;
12
+ table: import("@tanstack/react-table").Table<T>;
9
13
  setPageSize: import("react").Dispatch<import("react").SetStateAction<number>>;
10
14
  setPageIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
11
15
  sorting: SortingState;
@@ -1,7 +1,8 @@
1
1
  import { useEffect, useState } from 'react';
2
2
  import { useReactTable, getCoreRowModel, getSortedRowModel, getPaginationRowModel, } from '@tanstack/react-table';
3
3
  import { applyFlexSizes, getCheckboxSelectionColumn } from '../table.helpers';
4
- export function useTableController({ data, columns, checkboxSelection, checkboxPosition = 'start', paginationMode = 'client', pageCount, sorting, onSortingChange, onSelectionChange, enableRowSelection, rowsPerPage = 10, isMultiRowSelection = true, selectedRowIds, rowIdKey = 'id', }) {
4
+ import { usePaginationController } from './usePaginationController';
5
+ export function useTableController({ data, columns, checkboxSelection, checkboxPosition = 'start', paginationMode = 'client', sorting, onSortingChange, onSelectionChange, enableRowSelection, rowsPerPage = 10, isMultiRowSelection = true, selectedRowIds, rowIdKey = 'id', totalServerRows, onRefetch, }) {
5
6
  const safeData = Array.isArray(data) ? data : [];
6
7
  const [tableColumns, setTableColumns] = useState(() => applyFlexSizes(columns !== null && columns !== void 0 ? columns : []));
7
8
  const [internalSorting, setInternalSorting] = useState(sorting !== null && sorting !== void 0 ? sorting : []);
@@ -29,7 +30,7 @@ export function useTableController({ data, columns, checkboxSelection, checkboxP
29
30
  getCoreRowModel: getCoreRowModel(),
30
31
  getPaginationRowModel: getPaginationRowModel(),
31
32
  manualPagination: paginationMode === 'server',
32
- pageCount: paginationMode === 'server' ? pageCount : undefined,
33
+ pageCount: paginationMode === 'server' ? Math.ceil((totalServerRows !== null && totalServerRows !== void 0 ? totalServerRows : 0) / pageSize) : undefined,
33
34
  onPaginationChange: (updater) => {
34
35
  const next = typeof updater === 'function' ? updater({ pageIndex, pageSize }) : updater;
35
36
  setPageIndex(next.pageIndex);
@@ -51,6 +52,11 @@ export function useTableController({ data, columns, checkboxSelection, checkboxP
51
52
  },
52
53
  enableMultiRowSelection: isMultiRowSelection,
53
54
  });
55
+ const pagination = usePaginationController({
56
+ table,
57
+ paginationMode,
58
+ onRefetch,
59
+ });
54
60
  useEffect(() => {
55
61
  const normalized = applyFlexSizes(columns !== null && columns !== void 0 ? columns : []);
56
62
  const selectionColumn = checkboxSelection ? getCheckboxSelectionColumn(table) : null;
@@ -73,10 +79,9 @@ export function useTableController({ data, columns, checkboxSelection, checkboxP
73
79
  }, [columns, checkboxSelection, checkboxPosition, table]);
74
80
  return {
75
81
  table,
76
- pageSize,
77
- pageIndex,
78
82
  setPageSize,
79
83
  setPageIndex,
80
84
  sorting: sorting !== null && sorting !== void 0 ? sorting : internalSorting,
85
+ ...pagination,
81
86
  };
82
87
  }
@@ -9,11 +9,11 @@ const meta = {
9
9
  };
10
10
  export default meta;
11
11
  export const Default = {
12
- render: () => (_jsx(TooltipStoryWrapper, { content: "Simple tooltip", children: _jsx(Button, { title: "Hover me" }) })),
12
+ render: () => (_jsx(TooltipStoryWrapper, { content: "Simple tooltip", children: _jsx(Button, { children: "Hover me" }) })),
13
13
  };
14
14
  export const LongTextResponsive = {
15
- render: () => (_jsx(TooltipStoryWrapper, { content: "This tooltip contains a longer message that wraps gracefully across multiple lines. On smaller\n\t\tscreens, it narrows and stacks vertically so it's easier to read\u2014especially useful for\n\t\taccessibility, mobile devices, or multi-language support.", side: "top", children: _jsx(Button, { variant: "outlined", title: "Hover me" }) })),
15
+ render: () => (_jsx(TooltipStoryWrapper, { content: "This tooltip contains a longer message that wraps gracefully across multiple lines. On smaller\r\n\t\tscreens, it narrows and stacks vertically so it's easier to read\u2014especially useful for\r\n\t\taccessibility, mobile devices, or multi-language support.", side: "top", children: _jsx(Button, { children: "Hover me" }) })),
16
16
  };
17
17
  export const OnDifferentSides = {
18
- render: () => (_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(TooltipStoryWrapper, { content: "Top tooltip", side: "top", children: _jsx(Button, { title: "Top" }) }), _jsx(TooltipStoryWrapper, { content: "Bottom tooltip", side: "bottom", children: _jsx(Button, { title: "Bottom" }) }), _jsx(TooltipStoryWrapper, { content: "Left tooltip", side: "left", children: _jsx(Button, { title: "Left" }) }), _jsx(TooltipStoryWrapper, { content: "Right tooltip", side: "right", children: _jsx(Button, { title: "Right" }) })] })),
18
+ render: () => (_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(TooltipStoryWrapper, { content: "Top tooltip", side: "top", children: _jsx(Button, { children: "Top" }) }), _jsx(TooltipStoryWrapper, { content: "Bottom tooltip", side: "bottom", children: _jsx(Button, { children: "Bottom" }) }), _jsx(TooltipStoryWrapper, { content: "Left tooltip", side: "left", children: _jsx(Button, { children: "Left" }) }), _jsx(TooltipStoryWrapper, { content: "Right tooltip", side: "right", children: _jsx(Button, { children: "Right" }) })] })),
19
19
  };
@@ -1,4 +1,4 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import './header.css';
3
3
  import { Button } from '../components/Button';
4
- export const Header = ({ user, onLogin, onLogout, onCreateAccount }) => (_jsx("header", { children: _jsxs("div", { className: "storybook-header", children: [_jsxs("div", { children: [_jsx("svg", { width: "32", height: "32", viewBox: "0 0 32 32", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: _jsxs("g", { fill: "none", fillRule: "evenodd", children: [_jsx("path", { d: "M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z", fill: "#FFF" }), _jsx("path", { d: "M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z", fill: "#555AB9" }), _jsx("path", { d: "M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z", fill: "#91BAF8" })] }) }), _jsx("h1", { children: "Acme" })] }), _jsx("div", { children: user ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "welcome", children: ["Welcome, ", _jsx("b", { children: user.name }), "!"] }), _jsx(Button, { size: "sm", title: "Log out", onClick: onLogout })] })) : (_jsxs(_Fragment, { children: [_jsx(Button, { size: "sm", title: "Log in", onClick: onLogin }), _jsx(Button, { variant: "primary", size: "sm", title: "Sign up", onClick: onCreateAccount })] })) })] }) }));
4
+ export const Header = ({ user, onLogin, onLogout, onCreateAccount }) => (_jsx("header", { children: _jsxs("div", { className: "storybook-header", children: [_jsxs("div", { children: [_jsx("svg", { width: "32", height: "32", viewBox: "0 0 32 32", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: _jsxs("g", { fill: "none", fillRule: "evenodd", children: [_jsx("path", { d: "M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z", fill: "#FFF" }), _jsx("path", { d: "M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z", fill: "#555AB9" }), _jsx("path", { d: "M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z", fill: "#91BAF8" })] }) }), _jsx("h1", { children: "Acme" })] }), _jsx("div", { children: user ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "welcome", children: ["Welcome, ", _jsx("b", { children: user.name }), "!"] }), _jsx(Button, { size: "sm", onClick: onLogout, children: "Log out" })] })) : (_jsxs(_Fragment, { children: [_jsx(Button, { size: "sm", onClick: onLogin, children: "Log in" }), _jsx(Button, { variant: "primary", size: "sm", onClick: onCreateAccount, children: "Sign up" })] })) })] }) }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eml-payments/ui-kit",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "private": false,
5
5
  "description": "ARLO UIKit",
6
6
  "homepage": "https://github.com/EML-Payments/arlo.npm.uikit#readme",