@eml-payments/ui-kit 0.1.15 → 0.1.17
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 +32 -37
- package/dist/index.css +1 -1
- package/dist/src/components/Button/Button.js +3 -3
- package/dist/src/components/Button/Button.stories.js +5 -5
- package/dist/src/components/Button/Button.types.d.ts +4 -1
- package/dist/src/components/Button/ButtonVariants.js +3 -3
- package/dist/src/components/Input/Input.js +1 -1
- package/dist/src/components/Pills/Pills.js +1 -1
- package/dist/src/components/Select/Select.js +3 -3
- package/dist/src/components/SelectWrapper/select.js +3 -3
- package/dist/src/components/Table/Pagination/PaginationControls.d.ts +3 -2
- package/dist/src/components/Table/Pagination/PaginationControls.js +16 -8
- package/dist/src/components/Table/Pagination/PaginationControls.types.d.ts +11 -1
- package/dist/src/components/Table/Table.js +12 -12
- package/dist/src/components/Table/Table.stories.d.ts +1 -0
- package/dist/src/components/Table/Table.stories.js +5 -2
- package/dist/src/components/Table/Table.types.d.ts +3 -1
- package/dist/src/components/Table/hooks/useTableController.d.ts +1 -2
- package/dist/src/components/Table/hooks/useTableController.js +9 -6
- package/dist/src/components/Table/table.helpers.js +11 -3
- package/dist/src/components/Tooltip/Tooltip.js +1 -1
- package/dist/src/components/Tooltip/Tooltip.stories.d.ts +0 -3
- package/dist/src/components/Tooltip/Tooltip.stories.js +4 -4
- package/dist/src/config/defaultTheme.js +11 -11
- package/dist/src/config/uikitConfig.d.ts +15 -11
- package/dist/src/context/UIKitProvider.js +38 -10
- package/dist/src/stories/Header.js +1 -1
- package/package.json +12 -5
package/README.md
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
# @eml-payments/ui-kit
|
|
3
2
|
|
|
4
3
|
A fully-typed, design token-driven React UI Kit for modern web apps, powered by TailwindCSS, HeadlessUI, and Tanstack Table.
|
|
@@ -34,32 +33,28 @@ npm install @eml-payments/ui-kit
|
|
|
34
33
|
1. **Import the CSS for styles and tokens:**
|
|
35
34
|
|
|
36
35
|
```tsx
|
|
37
|
-
import
|
|
36
|
+
import '@eml-payments/ui-kit/style.css';
|
|
38
37
|
```
|
|
39
38
|
|
|
40
39
|
2. **Wrap your app in the `UIKitProvider` (optional: pass your design tokens):**
|
|
41
40
|
|
|
42
41
|
```tsx
|
|
43
|
-
import React from
|
|
44
|
-
import { UIKitProvider } from
|
|
42
|
+
import React from 'react';
|
|
43
|
+
import { UIKitProvider } from '@eml-payments/ui-kit';
|
|
45
44
|
|
|
46
45
|
const theme = {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
colors: {
|
|
47
|
+
primary: '#0A5FFF',
|
|
48
|
+
success: '#16c784',
|
|
49
|
+
error: '#d7263d',
|
|
50
|
+
// ...override any design token here
|
|
51
|
+
},
|
|
52
|
+
radius: '10px',
|
|
53
|
+
fontFamily: 'Inter, sans-serif',
|
|
55
54
|
};
|
|
56
55
|
|
|
57
56
|
export default function App() {
|
|
58
|
-
|
|
59
|
-
<UIKitProvider config={theme}>
|
|
60
|
-
{/* Your app code */}
|
|
61
|
-
</UIKitProvider>
|
|
62
|
-
);
|
|
57
|
+
return <UIKitProvider config={theme}>{/* Your app code */}</UIKitProvider>;
|
|
63
58
|
}
|
|
64
59
|
```
|
|
65
60
|
|
|
@@ -68,7 +63,7 @@ export default function App() {
|
|
|
68
63
|
```tsx
|
|
69
64
|
import { Button, Input, Table } from "@eml-payments/ui-kit";
|
|
70
65
|
|
|
71
|
-
<Button variant="primary"
|
|
66
|
+
<Button variant="primary" title="Primary Button" />
|
|
72
67
|
<Input label="Email" placeholder="user@email.com" />
|
|
73
68
|
```
|
|
74
69
|
|
|
@@ -80,18 +75,18 @@ You can fully override the theme tokens using the `config` prop:
|
|
|
80
75
|
|
|
81
76
|
```ts
|
|
82
77
|
type UIKitConfig = {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
78
|
+
colors?: {
|
|
79
|
+
primary?: string;
|
|
80
|
+
secondary?: string;
|
|
81
|
+
accent?: string;
|
|
82
|
+
success?: string;
|
|
83
|
+
warning?: string;
|
|
84
|
+
error?: string;
|
|
85
|
+
[key: string]: string | undefined;
|
|
86
|
+
};
|
|
87
|
+
radius?: string; // e.g. "8px"
|
|
88
|
+
fontFamily?: string;
|
|
89
|
+
// ...extend as needed
|
|
95
90
|
};
|
|
96
91
|
```
|
|
97
92
|
|
|
@@ -101,7 +96,7 @@ Any value not set falls back to a sensible default.
|
|
|
101
96
|
|
|
102
97
|
## 📚 Documentation & Storybook
|
|
103
98
|
|
|
104
|
-
- **Interactive Docs & Playground:**
|
|
99
|
+
- **Interactive Docs & Playground:**
|
|
105
100
|
run locally: `npm run storybook`
|
|
106
101
|
|
|
107
102
|
---
|
|
@@ -119,18 +114,18 @@ Any value not set falls back to a sensible default.
|
|
|
119
114
|
## 🧩 Example: Table
|
|
120
115
|
|
|
121
116
|
```tsx
|
|
122
|
-
import { Table } from
|
|
117
|
+
import { Table } from '@eml-payments/ui-kit';
|
|
123
118
|
|
|
124
119
|
const columns = [
|
|
125
|
-
|
|
126
|
-
|
|
120
|
+
{ header: 'Name', accessorKey: 'name' },
|
|
121
|
+
{ header: 'Email', accessorKey: 'email' },
|
|
127
122
|
];
|
|
128
123
|
const data = [
|
|
129
|
-
|
|
130
|
-
|
|
124
|
+
{ name: 'Alice', email: 'alice@email.com' },
|
|
125
|
+
{ name: 'Bob', email: 'bob@email.com' },
|
|
131
126
|
];
|
|
132
127
|
|
|
133
|
-
<Table columns={columns} data={data}
|
|
128
|
+
<Table columns={columns} data={data} />;
|
|
134
129
|
```
|
|
135
130
|
|
|
136
131
|
---
|
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}*{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}.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}.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}.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-1\/3{width:33.333333%}.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-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-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-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-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)}.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}.pr-8{padding-right:2rem}.text-left{text-align:left}.text-center{text-align:center}.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}.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}.accent-\[var\(--uikit-primary\)\]{accent-color:var(--uikit-primary)}.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-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;--hover-bg-color:#dff2fe}@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(--hover-bg-color);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-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-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\=unchecked\]\:bg-black[data-state=unchecked]{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.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-\[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}@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\]\: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}.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}.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}.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-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-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-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)}.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}.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}.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-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;--hover-bg-color:#dff2fe}@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(--hover-bg-color);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-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-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\=unchecked\]\:bg-black[data-state=unchecked]{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.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-\[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}@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\]\: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,11 +1,11 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
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,
|
|
7
|
+
export const Button = React.forwardRef(({ variant, size, asChild = false, loading = false, className, icon, iconPosition = 'left', loadingText, title, ...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: _jsxs("
|
|
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 })] })) }));
|
|
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
|
-
|
|
8
|
+
title: '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, {
|
|
49
|
+
render: () => _jsx(Button, { icon: "\u26A1", iconPosition: "left", title: "Click me" }),
|
|
50
50
|
};
|
|
51
51
|
export const WithIconRight = {
|
|
52
|
-
render: () => _jsx(Button, {
|
|
52
|
+
render: () => _jsx(Button, { icon: "\u26A1", iconPosition: "right", title: "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",
|
|
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 })] })),
|
|
56
56
|
};
|
|
57
57
|
export const AllSizes = {
|
|
58
|
-
render: () => (_jsxs("div", { style: { display: 'flex', gap: '12px', flexWrap: 'wrap' }, children: [_jsx(Button, { size: "sm",
|
|
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" })] })),
|
|
59
59
|
};
|
|
@@ -1,8 +1,11 @@
|
|
|
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
|
|
4
|
+
children?: React.ReactNode;
|
|
5
5
|
asChild?: boolean;
|
|
6
6
|
loading?: boolean;
|
|
7
7
|
loadingText?: string;
|
|
8
|
+
title: string;
|
|
9
|
+
icon?: React.ReactNode;
|
|
10
|
+
iconPosition?: 'left' | 'right';
|
|
8
11
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cva } from 'class-variance-authority';
|
|
2
|
-
export const buttonVariants = cva('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-
|
|
2
|
+
export const buttonVariants = cva('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--uikit-radius)] text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', {
|
|
3
3
|
variants: {
|
|
4
4
|
variant: {
|
|
5
5
|
primary: 'bg-[var(--uikit-primary)] text-white ' +
|
|
@@ -19,8 +19,8 @@ export const buttonVariants = cva('inline-flex items-center justify-center gap-2
|
|
|
19
19
|
},
|
|
20
20
|
size: {
|
|
21
21
|
default: 'h-9 px-4 py-2',
|
|
22
|
-
sm: 'h-8
|
|
23
|
-
lg: 'h-10
|
|
22
|
+
sm: 'h-8 px-3 text-xs',
|
|
23
|
+
lg: 'h-10 px-8',
|
|
24
24
|
icon: 'h-9 w-9',
|
|
25
25
|
},
|
|
26
26
|
},
|
|
@@ -4,6 +4,6 @@ import { useUIKitTheme } from '../../context/useUIKitTheme';
|
|
|
4
4
|
import { cn } from '../../lib/utils';
|
|
5
5
|
export const Input = React.forwardRef(({ type, label, error, className, helperText, icon, ...props }, ref) => {
|
|
6
6
|
const theme = useUIKitTheme();
|
|
7
|
-
return (_jsxs("div", { className: cn(className), children: [label && _jsx("label", { className: cn('text-sm font-medium text-foreground'), children: label }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: type, style: { fontFamily: theme.fontFamily }, className: cn('flex h-10 w-full rounded-
|
|
7
|
+
return (_jsxs("div", { className: cn(className), children: [label && _jsx("label", { className: cn('text-sm font-medium text-foreground'), children: label }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: type, style: { fontFamily: theme.fontFamily }, className: cn('flex h-10 w-full rounded-[var(--uikit-radius)] border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm transition ', { 'border-error focus-visible:ring-error': error }, className), ref: ref, onChange: props.onChange, ...props }), icon && _jsx("span", { className: "absolute inset-y-0 right-3 flex items-center pl-3", children: icon })] }), error && _jsx("label", { className: cn('text-sm font-medium text-error'), children: error }), !error && helperText && (_jsx("label", { className: cn('text-sm font-medium text-foreground'), children: helperText }))] }));
|
|
8
8
|
});
|
|
9
9
|
Input.displayName = 'Input';
|
|
@@ -22,7 +22,7 @@ export const Pills = ({ label, size = 'default', variant = 'filled', color = 'pr
|
|
|
22
22
|
success: 'border border-[var(--uikit-success)] text-[var(--uikit-success)]',
|
|
23
23
|
},
|
|
24
24
|
};
|
|
25
|
-
return (_jsxs("div", { className: cn('inline-flex items-center rounded-
|
|
25
|
+
return (_jsxs("div", { className: cn('inline-flex items-center rounded-[var(--uikit-radius)] px-[4px] py-[3px] text-sm font-medium', {
|
|
26
26
|
'py-[4px]': size === 'default',
|
|
27
27
|
'opacity-50 cursor-not-allowed': disabled,
|
|
28
28
|
}, pillStyles[variant][color], className), children: [_jsx(Label, { className: cn('text-sm font-medium px-[6px]', {
|
|
@@ -6,19 +6,19 @@ import { cn } from '../../lib/utils';
|
|
|
6
6
|
const Select = SelectPrimitive.Root;
|
|
7
7
|
const SelectGroup = SelectPrimitive.Group;
|
|
8
8
|
const SelectValue = SelectPrimitive.Value;
|
|
9
|
-
const SelectTrigger = React.forwardRef(({ className, children, size = 'md', error, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('flex w-full items-center justify-between whitespace-nowrap rounded-
|
|
9
|
+
const SelectTrigger = React.forwardRef(({ className, children, size = 'md', error, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('flex w-full items-center justify-between whitespace-nowrap rounded-[var(--uikit-radius)] border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1', { 'h-9': size === 'md', 'h-7': size === 'sm' }, { 'border-[var(--uikit-error)]': error }, className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: "h-4 w-4 opacity-50" }) })] })));
|
|
10
10
|
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
11
11
|
const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollUpButton, { ref: ref, className: cn('flex cursor-default items-center justify-center py-1', className), ...props, children: _jsx(ChevronUp, { className: "h-4 w-4" }) })));
|
|
12
12
|
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
13
13
|
const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollDownButton, { ref: ref, className: cn('flex cursor-default items-center justify-center py-1', className), ...props, children: _jsx(ChevronDown, { className: "h-4 w-4" }) })));
|
|
14
14
|
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
15
|
-
const SelectContent = React.forwardRef(({ className, children, position = 'popper', ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn('relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-
|
|
15
|
+
const SelectContent = React.forwardRef(({ className, children, position = 'popper', ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn('relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-[var(--uikit-radius)] border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]', position === 'popper' &&
|
|
16
16
|
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn('p-1', position === 'popper' &&
|
|
17
17
|
'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'), children: children }), _jsx(SelectScrollDownButton, {})] }) })));
|
|
18
18
|
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
19
19
|
const SelectLabel = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Label, { ref: ref, className: cn('px-2 py-1.5 text-sm font-semibold', className), ...props })));
|
|
20
20
|
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
21
|
-
const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn('relative flex w-full cursor-default select-none items-center rounded-
|
|
21
|
+
const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn('relative flex w-full cursor-default select-none items-center rounded-[var(--uikit-radius)] py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', className), ...props, children: [_jsx("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { className: "h-4 w-4" }) }) }), _jsx(SelectPrimitive.ItemText, { children: children })] })));
|
|
22
22
|
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
23
23
|
const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Separator, { ref: ref, className: cn('-mx-1 my-1 h-px bg-muted', className), ...props })));
|
|
24
24
|
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
@@ -6,19 +6,19 @@ import { cn } from '../../../lib/utils';
|
|
|
6
6
|
const Select = SelectPrimitive.Root;
|
|
7
7
|
const SelectGroup = SelectPrimitive.Group;
|
|
8
8
|
const SelectValue = SelectPrimitive.Value;
|
|
9
|
-
const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('flex h-9 w-full items-center justify-between whitespace-nowrap rounded-
|
|
9
|
+
const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('flex h-9 w-full items-center justify-between whitespace-nowrap rounded-[var(--uikit-radius)] border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1', className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: "h-4 w-4 opacity-50" }) })] })));
|
|
10
10
|
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
11
11
|
const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollUpButton, { ref: ref, className: cn('flex cursor-default items-center justify-center py-1', className), ...props, children: _jsx(ChevronUp, { className: "h-4 w-4" }) })));
|
|
12
12
|
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
13
13
|
const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollDownButton, { ref: ref, className: cn('flex cursor-default items-center justify-center py-1', className), ...props, children: _jsx(ChevronDown, { className: "h-4 w-4" }) })));
|
|
14
14
|
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
15
|
-
const SelectContent = React.forwardRef(({ className, children, position = 'popper', ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn('relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-
|
|
15
|
+
const SelectContent = React.forwardRef(({ className, children, position = 'popper', ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn('relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-[var(--uikit-radius)] border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]', position === 'popper' &&
|
|
16
16
|
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn('p-1', position === 'popper' &&
|
|
17
17
|
'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'), children: children }), _jsx(SelectScrollDownButton, {})] }) })));
|
|
18
18
|
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
19
19
|
const SelectLabel = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Label, { ref: ref, className: cn('px-2 py-1.5 text-sm font-semibold', className), ...props })));
|
|
20
20
|
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
21
|
-
const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn('relative flex w-full cursor-default select-none items-center rounded-
|
|
21
|
+
const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn('relative flex w-full cursor-default select-none items-center rounded-[var(--uikit-radius)] py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', className), ...props, children: [_jsx("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { className: "h-4 w-4" }) }) }), _jsx(SelectPrimitive.ItemText, { children: children })] })));
|
|
22
22
|
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
23
23
|
const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Separator, { ref: ref, className: cn('-mx-1 my-1 h-px bg-muted', className), ...props })));
|
|
24
24
|
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type { PaginationControlsProps } from './PaginationControls.types';
|
|
2
|
-
export declare const
|
|
1
|
+
import type { PageSizeSelectorProps, PaginationControlsProps } from './PaginationControls.types';
|
|
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;
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Button } from '../../Button';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return (_jsxs("div", { className:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
import { SelectWrapper } from '../../SelectWrapper';
|
|
4
|
+
import { cn } from '../../../lib/utils';
|
|
5
|
+
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), 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
|
+
label: option,
|
|
8
|
+
value: option,
|
|
9
|
+
})) }) })] }));
|
|
10
|
+
};
|
|
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) => {
|
|
15
|
+
const newSize = Number(val);
|
|
16
|
+
table.setPageSize(newSize);
|
|
17
|
+
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", 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", children: ["Page ", pageIndex + 1, " of ", totalPages] })] }));
|
|
11
19
|
};
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import type { Table } from '@tanstack/react-table';
|
|
2
|
+
import type { SelectWrapperProps } from '../../SelectWrapper';
|
|
2
3
|
export interface PaginationControlsProps<T> {
|
|
3
4
|
tableId: string;
|
|
4
5
|
table: Table<T>;
|
|
5
6
|
paginationMode?: 'client' | 'server';
|
|
6
7
|
pageCount?: number;
|
|
7
|
-
pageSizeOptions?:
|
|
8
|
+
pageSizeOptions?: string[];
|
|
8
9
|
onPageSizeChange?: (size: number) => void;
|
|
9
10
|
}
|
|
11
|
+
export type PageSizeSelectorProps = {
|
|
12
|
+
id: string;
|
|
13
|
+
value: string;
|
|
14
|
+
onChange: (val: string) => void;
|
|
15
|
+
options?: string[];
|
|
16
|
+
label?: string;
|
|
17
|
+
className?: SelectWrapperProps['className'];
|
|
18
|
+
size?: SelectWrapperProps['size'];
|
|
19
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { flexRender } from '@tanstack/react-table';
|
|
3
3
|
import { classNames } from '../../utils/classNames';
|
|
4
|
-
import {
|
|
4
|
+
import { PaginationFooter } from './Pagination/PaginationControls';
|
|
5
5
|
import { useTableController } from './hooks/useTableController';
|
|
6
6
|
export function Table(props) {
|
|
7
7
|
var _a;
|
|
@@ -16,17 +16,17 @@ export function Table(props) {
|
|
|
16
16
|
else {
|
|
17
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
18
|
const width = cell.column.getSize();
|
|
19
|
-
return (_jsx("td", { style: { width }, className:
|
|
19
|
+
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
20
|
}) }, row.id)));
|
|
21
21
|
}
|
|
22
|
-
return (_jsxs("div", { className: "relative w-full overflow-auto", children: [props.isLoading && _jsx("div", { className: "mui-loader" }), _jsxs("table", { className: classNames('min-w-full
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
return (_jsxs("div", { className: "relative w-full overflow-auto", children: [props.isLoading && _jsx("div", { className: "mui-loader" }), _jsx("div", { className: "rounded-[var(--uikit-radius)] overflow-hidden border", children: _jsxs("table", { className: classNames('min-w-full text-sm table-fixed', props.className), role: "table", children: [_jsx("thead", { className: "bg-[var(--uikit-tertiary)]", children: table.getHeaderGroups().map((headerGroup) => (_jsx("tr", { children: headerGroup.headers.map((header) => {
|
|
23
|
+
return (_jsx("th", { style: { width: header.getSize() }, className: classNames('select-none text-[16px]', header.id === 'select' ? 'p-0' : 'px-4 py-2 text-left cursor-pointer'), onClick: header.column.getCanSort()
|
|
24
|
+
? header.column.getToggleSortingHandler()
|
|
25
|
+
: undefined, children: _jsxs("div", { className: classNames('w-full h-full', header.id === 'select'
|
|
26
|
+
? 'flex justify-center items-center'
|
|
27
|
+
: '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: '↓',
|
|
30
|
+
}[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
32
|
}
|
|
@@ -16,5 +16,6 @@ export declare const NoRows: Story;
|
|
|
16
16
|
export declare const LoadingWithSkeleton: Story;
|
|
17
17
|
export declare const ClientPagination: Story;
|
|
18
18
|
export declare const WithCheckboxSelection: Story;
|
|
19
|
+
export declare const WithDisabledSelection: Story;
|
|
19
20
|
export declare const FlexColumnWidths: Story;
|
|
20
21
|
export declare const WithControlledSorting: Story;
|
|
@@ -38,11 +38,11 @@ const meta = {
|
|
|
38
38
|
title: 'UIKit/Table',
|
|
39
39
|
component: Table,
|
|
40
40
|
tags: ['autodocs'],
|
|
41
|
-
render: () => _jsx(Table, { id: "example-table", data: data
|
|
41
|
+
render: () => _jsx(Table, { id: "example-table", data: data, columns: columns }),
|
|
42
42
|
};
|
|
43
43
|
export default meta;
|
|
44
44
|
export const Basic = {
|
|
45
|
-
render: () => _jsx(Table, { id: "example-table", data: data
|
|
45
|
+
render: () => _jsx(Table, { id: "example-table", data: data, columns: columns }),
|
|
46
46
|
};
|
|
47
47
|
export const NoRows = {
|
|
48
48
|
render: () => _jsx(Table, { id: "example-table", data: [], columns: columns }),
|
|
@@ -56,6 +56,9 @@ export const ClientPagination = {
|
|
|
56
56
|
export const WithCheckboxSelection = {
|
|
57
57
|
render: () => (_jsx(Table, { id: "example-table", data: data, columns: columns, checkboxSelection: true, checkboxPosition: "start", paginationMode: "client" })),
|
|
58
58
|
};
|
|
59
|
+
export const WithDisabledSelection = {
|
|
60
|
+
render: () => (_jsx(Table, { id: "example-table", data: data, columns: columns, checkboxSelection: true, checkboxPosition: "start", enableRowSelection: (row) => row.original.role !== 'Admin' })),
|
|
61
|
+
};
|
|
59
62
|
export const FlexColumnWidths = {
|
|
60
63
|
render: () => {
|
|
61
64
|
const testColumns = [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ColumnDef, SortingState } from '@tanstack/react-table';
|
|
1
|
+
import type { ColumnDef, Row, SortingState } from '@tanstack/react-table';
|
|
2
2
|
export type FlexColumnDef<T> = ColumnDef<T> & {
|
|
3
3
|
flex?: number;
|
|
4
4
|
};
|
|
@@ -15,6 +15,8 @@ export interface TableProps<T extends {
|
|
|
15
15
|
checkboxPosition?: 'start' | 'end';
|
|
16
16
|
sorting?: SortingState;
|
|
17
17
|
onSortingChange?: (s: SortingState) => void;
|
|
18
|
+
onSelectionChange?: (selectedRows: T[]) => void;
|
|
19
|
+
enableRowSelection?: (row: Row<T>) => boolean;
|
|
18
20
|
pageCount?: number;
|
|
19
21
|
paginationMode?: 'client' | 'server';
|
|
20
22
|
noRowsMessage?: string;
|
|
@@ -2,12 +2,11 @@ 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, rowsPerPage, }: TableProps<T>): {
|
|
5
|
+
}>({ data, columns, checkboxSelection, checkboxPosition, paginationMode, pageCount, sorting, onSortingChange, onSelectionChange, enableRowSelection, rowsPerPage, }: TableProps<T>): {
|
|
6
6
|
table: import("@tanstack/react-table").Table<T>;
|
|
7
7
|
pageSize: number;
|
|
8
8
|
pageIndex: number;
|
|
9
9
|
setPageSize: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
10
10
|
setPageIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
11
|
-
rowSelection: {};
|
|
12
11
|
sorting: SortingState;
|
|
13
12
|
};
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
1
|
+
import { useEffect, useMemo, 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 = '
|
|
4
|
+
export function useTableController({ data, columns, checkboxSelection, checkboxPosition = 'start', paginationMode = 'client', pageCount, sorting, onSortingChange, onSelectionChange, enableRowSelection, rowsPerPage = 10, }) {
|
|
5
5
|
const safeData = Array.isArray(data) ? data : [];
|
|
6
6
|
const [tableColumns, setTableColumns] = useState(() => applyFlexSizes(columns !== null && columns !== void 0 ? columns : []));
|
|
7
|
-
const [rowSelection, setRowSelection] = useState({});
|
|
8
7
|
const [internalSorting, setInternalSorting] = useState(sorting !== null && sorting !== void 0 ? sorting : []);
|
|
9
8
|
const [pageIndex, setPageIndex] = useState(0);
|
|
10
9
|
const [pageSize, setPageSize] = useState(rowsPerPage !== null && rowsPerPage !== void 0 ? rowsPerPage : 10);
|
|
@@ -14,10 +13,8 @@ export function useTableController({ data, columns, checkboxSelection, checkboxP
|
|
|
14
13
|
getRowId: (row) => row.id,
|
|
15
14
|
state: {
|
|
16
15
|
pagination: { pageSize, pageIndex },
|
|
17
|
-
rowSelection,
|
|
18
16
|
sorting: sorting !== null && sorting !== void 0 ? sorting : internalSorting,
|
|
19
17
|
},
|
|
20
|
-
onRowSelectionChange: setRowSelection,
|
|
21
18
|
getSortedRowModel: getSortedRowModel(),
|
|
22
19
|
getCoreRowModel: getCoreRowModel(),
|
|
23
20
|
getPaginationRowModel: getPaginationRowModel(),
|
|
@@ -33,6 +30,7 @@ export function useTableController({ data, columns, checkboxSelection, checkboxP
|
|
|
33
30
|
setInternalSorting(nextSorting);
|
|
34
31
|
onSortingChange === null || onSortingChange === void 0 ? void 0 : onSortingChange(nextSorting);
|
|
35
32
|
},
|
|
33
|
+
enableRowSelection: enableRowSelection !== null && enableRowSelection !== void 0 ? enableRowSelection : true,
|
|
36
34
|
});
|
|
37
35
|
useEffect(() => {
|
|
38
36
|
const normalized = applyFlexSizes(columns !== null && columns !== void 0 ? columns : []);
|
|
@@ -54,13 +52,18 @@ export function useTableController({ data, columns, checkboxSelection, checkboxP
|
|
|
54
52
|
}
|
|
55
53
|
setTableColumns(finalColumns);
|
|
56
54
|
}, [columns, checkboxSelection, checkboxPosition, table]);
|
|
55
|
+
const selectedRows = useMemo(() => {
|
|
56
|
+
return table.getSelectedRowModel().rows.map((row) => row.original);
|
|
57
|
+
}, [table.getSelectedRowModel().rows]);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(selectedRows);
|
|
60
|
+
}, [selectedRows, onSelectionChange]);
|
|
57
61
|
return {
|
|
58
62
|
table,
|
|
59
63
|
pageSize,
|
|
60
64
|
pageIndex,
|
|
61
65
|
setPageSize,
|
|
62
66
|
setPageIndex,
|
|
63
|
-
rowSelection,
|
|
64
67
|
sorting: sorting !== null && sorting !== void 0 ? sorting : internalSorting,
|
|
65
68
|
};
|
|
66
69
|
}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Checkbox } from '../Checkbox';
|
|
2
3
|
export function getCheckboxSelectionColumn(table) {
|
|
3
4
|
return {
|
|
4
5
|
id: 'select',
|
|
5
|
-
size:
|
|
6
|
-
header: () =>
|
|
7
|
-
|
|
6
|
+
size: 24,
|
|
7
|
+
header: () => {
|
|
8
|
+
const hasSelectableRows = table.getRowModel().rows.some((row) => row.getCanSelect());
|
|
9
|
+
return (_jsx("div", { className: "flex justify-center items-center h-full", children: _jsx(Checkbox, { checked: table.getIsAllPageRowsSelected(), disabled: !hasSelectableRows, onCheckedChange: (checked) => {
|
|
10
|
+
table.toggleAllPageRowsSelected(Boolean(checked));
|
|
11
|
+
} }) }));
|
|
12
|
+
},
|
|
13
|
+
cell: ({ row }) => (_jsx("div", { className: "flex justify-center items-center h-full", children: _jsx(Checkbox, { checked: row.getIsSelected(), disabled: !row.getCanSelect(), onCheckedChange: (checked) => {
|
|
14
|
+
row.toggleSelected(Boolean(checked));
|
|
15
|
+
} }) })),
|
|
8
16
|
enableSorting: false,
|
|
9
17
|
enableColumnFilter: false,
|
|
10
18
|
meta: { isSelectionColumn: true },
|
|
@@ -5,6 +5,6 @@ import { cn } from '../../lib/utils';
|
|
|
5
5
|
const TooltipProvider = TooltipPrimitive.Provider;
|
|
6
6
|
const Tooltip = TooltipPrimitive.Root;
|
|
7
7
|
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
8
|
-
const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn('z-50 overflow-hidden rounded-
|
|
8
|
+
const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn('z-50 overflow-hidden rounded-[var(--uikit-radius)] bg-[var(--uikit-info)] px-3 py-1.5 text-xs text-[var(--uikit-text-primary)] font-[var(--uikit-font-family)] break-words max-w-xs sm:max-w-sm md:max-w-md', className), ...props }) })));
|
|
9
9
|
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
10
10
|
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
-
import type { TooltipStoryWrapperProps } from './Tooltip.types';
|
|
4
|
-
export declare const TooltipStoryWrapper: React.FC<TooltipStoryWrapperProps>;
|
|
5
2
|
declare const meta: Meta;
|
|
6
3
|
export default meta;
|
|
7
4
|
export declare const Default: StoryObj;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './Tooltip';
|
|
3
3
|
import { Button } from '../Button';
|
|
4
|
-
|
|
4
|
+
const TooltipStoryWrapper = ({ content, children, ...props }) => (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: children }), _jsx(TooltipContent, { ...props, children: content })] }) }));
|
|
5
5
|
const meta = {
|
|
6
6
|
title: 'UIKit/Tooltip',
|
|
7
7
|
component: TooltipContent,
|
|
@@ -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, {
|
|
12
|
+
render: () => (_jsx(TooltipStoryWrapper, { content: "Simple tooltip", children: _jsx(Button, { title: "Hover me" }) })),
|
|
13
13
|
};
|
|
14
14
|
export const LongTextResponsive = {
|
|
15
|
-
render: () => (_jsx(
|
|
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" }) })),
|
|
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, {
|
|
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" }) })] })),
|
|
19
19
|
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
export const defaultTheme = {
|
|
2
2
|
colors: {
|
|
3
3
|
// Base tokens
|
|
4
|
-
primary: '#0A5FFF',
|
|
5
|
-
secondary: '#F3F5FB',
|
|
6
|
-
accent: '#E3ECFF',
|
|
7
|
-
// Semantic intent
|
|
8
|
-
success: '#16c784',
|
|
9
|
-
warning: '#f4b740',
|
|
10
|
-
error: '#d7263d',
|
|
11
|
-
info: '#FEF9BF',
|
|
4
|
+
primary: { light: '#0A5FFF', dark: '#7c80f8' },
|
|
5
|
+
secondary: { light: '#F3F5FB', dark: '#1e293b' },
|
|
6
|
+
accent: { light: '#E3ECFF', dark: '#334155' },
|
|
12
7
|
// Layout
|
|
13
|
-
background: '#ffffff',
|
|
14
|
-
foreground: '#1a2236',
|
|
8
|
+
background: { light: '#ffffff', dark: '#0f172a' },
|
|
9
|
+
foreground: { light: '#1a2236', dark: '#f8fafc' },
|
|
10
|
+
// Semantic intent
|
|
11
|
+
success: { light: '#16c784', dark: '#16c784' },
|
|
12
|
+
warning: { light: '#f4b740', dark: '#f4b740' },
|
|
13
|
+
error: { light: '#d7263d', dark: '#d7263d' },
|
|
14
|
+
info: { light: '#FEF9BF', dark: '#FEF9BF' },
|
|
15
15
|
// Text
|
|
16
|
-
textPrimary: '#27272A',
|
|
16
|
+
textPrimary: { light: '#27272A', dark: '#f4f4f5' },
|
|
17
17
|
},
|
|
18
18
|
radius: '8px',
|
|
19
19
|
fontFamily: 'Inter, system-ui, sans-serif',
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
+
export type ColorVariant = string | {
|
|
2
|
+
light: string;
|
|
3
|
+
dark: string;
|
|
4
|
+
};
|
|
1
5
|
export type UIKitColors = {
|
|
2
|
-
primary?:
|
|
3
|
-
secondary?:
|
|
4
|
-
accent?:
|
|
5
|
-
success?:
|
|
6
|
-
warning?:
|
|
7
|
-
error?:
|
|
8
|
-
info?:
|
|
9
|
-
background?:
|
|
10
|
-
foreground?:
|
|
11
|
-
textPrimary?:
|
|
12
|
-
[key: string]:
|
|
6
|
+
primary?: ColorVariant;
|
|
7
|
+
secondary?: ColorVariant;
|
|
8
|
+
accent?: ColorVariant;
|
|
9
|
+
success?: ColorVariant;
|
|
10
|
+
warning?: ColorVariant;
|
|
11
|
+
error?: ColorVariant;
|
|
12
|
+
info?: ColorVariant;
|
|
13
|
+
background?: ColorVariant;
|
|
14
|
+
foreground?: ColorVariant;
|
|
15
|
+
textPrimary?: ColorVariant;
|
|
16
|
+
[key: string]: ColorVariant | undefined;
|
|
13
17
|
};
|
|
14
18
|
export type UIKitConfig = {
|
|
15
19
|
colors?: UIKitColors;
|
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
2
|
+
import { useMemo, useEffect, useState, useCallback } from 'react';
|
|
3
3
|
import { defaultTheme } from '../config/defaultTheme';
|
|
4
4
|
import { UIKitContext } from './UIKitContext';
|
|
5
|
-
|
|
5
|
+
function resolveColorValue(value, isDark) {
|
|
6
|
+
var _a, _b, _c, _d;
|
|
7
|
+
if (typeof value === 'string') {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
// falls back to the opposite variant if the current one is not defined
|
|
11
|
+
return isDark ? ((_b = (_a = value.dark) !== null && _a !== void 0 ? _a : value.light) !== null && _b !== void 0 ? _b : '') : ((_d = (_c = value.light) !== null && _c !== void 0 ? _c : value.dark) !== null && _d !== void 0 ? _d : '');
|
|
12
|
+
}
|
|
13
|
+
function mergeTheme(user) {
|
|
14
|
+
var _a;
|
|
6
15
|
return {
|
|
7
16
|
...defaultTheme,
|
|
8
17
|
...user,
|
|
9
|
-
colors: {
|
|
18
|
+
colors: {
|
|
19
|
+
...defaultTheme.colors,
|
|
20
|
+
...((_a = user === null || user === void 0 ? void 0 : user.colors) !== null && _a !== void 0 ? _a : {}),
|
|
21
|
+
},
|
|
10
22
|
};
|
|
11
|
-
}
|
|
12
|
-
function applyThemeToRoot(theme) {
|
|
23
|
+
}
|
|
24
|
+
function applyThemeToRoot(theme, isDark) {
|
|
13
25
|
if (typeof window === 'undefined') {
|
|
14
26
|
return;
|
|
15
27
|
}
|
|
16
28
|
const root = document.documentElement;
|
|
17
29
|
const { colors = {}, radius, fontFamily } = theme;
|
|
18
30
|
Object.entries(colors).forEach(([key, value]) => {
|
|
19
|
-
if (value) {
|
|
20
|
-
|
|
31
|
+
if (value !== undefined) {
|
|
32
|
+
const resolved = resolveColorValue(value, isDark);
|
|
33
|
+
if (resolved) {
|
|
34
|
+
root.style.setProperty(`--uikit-${key}`, resolved);
|
|
35
|
+
}
|
|
21
36
|
}
|
|
22
37
|
});
|
|
23
38
|
if (radius) {
|
|
@@ -29,8 +44,21 @@ function applyThemeToRoot(theme) {
|
|
|
29
44
|
}
|
|
30
45
|
export const UIKitProvider = ({ config, children }) => {
|
|
31
46
|
const mergedTheme = useMemo(() => mergeTheme(config), [config]);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
47
|
+
const [isDark, setIsDark] = useState(() => document.documentElement.classList.contains('dark'));
|
|
48
|
+
const mutationCallback = useCallback(() => {
|
|
49
|
+
const dark = document.documentElement.classList.contains('dark');
|
|
50
|
+
setIsDark(dark);
|
|
51
|
+
}, []);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const observer = new MutationObserver(mutationCallback);
|
|
54
|
+
observer.observe(document.documentElement, {
|
|
55
|
+
attributes: true,
|
|
56
|
+
attributeFilter: ['class'],
|
|
57
|
+
});
|
|
58
|
+
return () => observer.disconnect();
|
|
59
|
+
}, [mutationCallback]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
applyThemeToRoot(mergedTheme, isDark);
|
|
62
|
+
}, [mergedTheme, isDark]);
|
|
35
63
|
return _jsx(UIKitContext.Provider, { value: mergedTheme, children: children });
|
|
36
64
|
};
|
|
@@ -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",
|
|
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 })] })) })] }) }));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eml-payments/ui-kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "ARLO UIKit",
|
|
6
6
|
"homepage": "https://github.com/EML-Payments/arlo.npm.uikit#readme",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"dist"
|
|
34
34
|
],
|
|
35
35
|
"scripts": {
|
|
36
|
+
"prepare": "husky install",
|
|
36
37
|
"storybook": "storybook dev -p 6006",
|
|
37
38
|
"build-storybook": "storybook build",
|
|
38
39
|
"build:css": "tailwindcss -i ./src/index.css -o ./dist/index.css --minify",
|
|
@@ -69,13 +70,15 @@
|
|
|
69
70
|
"tw-animate-css": "^1.3.5"
|
|
70
71
|
},
|
|
71
72
|
"devDependencies": {
|
|
73
|
+
"@eslint/js": "^9.30.1",
|
|
72
74
|
"@storybook/addon-a11y": "^9.0.15",
|
|
73
75
|
"@storybook/addon-docs": "^9.0.15",
|
|
74
76
|
"@storybook/addon-onboarding": "^9.0.15",
|
|
77
|
+
"@storybook/addon-styling-webpack": "^2.0.0",
|
|
78
|
+
"@storybook/addon-themes": "^9.0.17",
|
|
75
79
|
"@storybook/react-vite": "^9.0.15",
|
|
76
80
|
"@typescript-eslint/eslint-plugin": "^8.35.1",
|
|
77
81
|
"autoprefixer": "^10.4.13",
|
|
78
|
-
"@eslint/js": "^9.30.1",
|
|
79
82
|
"eslint": "^9.31.0",
|
|
80
83
|
"eslint-config-prettier": "^10.1.5",
|
|
81
84
|
"eslint-plugin-import": "^2.32.0",
|
|
@@ -84,12 +87,13 @@
|
|
|
84
87
|
"eslint-plugin-react": "^7.37.5",
|
|
85
88
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
86
89
|
"eslint-plugin-react-refresh": "^0.4.20",
|
|
87
|
-
"typescript-eslint": "^8.36.0",
|
|
88
90
|
"eslint-plugin-storybook": "^9.0.15",
|
|
89
91
|
"husky": "^8.0.3",
|
|
92
|
+
"lint-staged": "^16.1.2",
|
|
90
93
|
"postcss": "^8.4.21",
|
|
91
94
|
"storybook": "^9.0.15",
|
|
92
|
-
"typescript": "^5.4.0"
|
|
95
|
+
"typescript": "^5.4.0",
|
|
96
|
+
"typescript-eslint": "^8.36.0"
|
|
93
97
|
},
|
|
94
98
|
"peerDependencies": {
|
|
95
99
|
"react": ">=18.0.0",
|
|
@@ -99,5 +103,8 @@
|
|
|
99
103
|
"extends": [
|
|
100
104
|
"plugin:storybook/recommended"
|
|
101
105
|
]
|
|
106
|
+
},
|
|
107
|
+
"lint-staged": {
|
|
108
|
+
"*.{js,ts,tsx}": "eslint --fix"
|
|
102
109
|
}
|
|
103
|
-
}
|
|
110
|
+
}
|