caplink-saas-ui-shared-component-library 0.0.1 → 0.2.0
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 +23 -4
- package/dist/index.d.ts +77 -0
- package/dist/src/index.css +2 -0
- package/dist/src/index.css.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +49 -11
package/README.md
CHANGED
|
@@ -24,7 +24,28 @@ import { Button } from '@caplink/saas-ui-shared-component-library';
|
|
|
24
24
|
|
|
25
25
|
## Development
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
### Components
|
|
28
|
+
|
|
29
|
+
All the components are located in the 'component-library' folder. Each component should be in its own folder, with the component file and any other files it needs (like styles, tests, etc).
|
|
30
|
+
|
|
31
|
+
An expected component development workflow would be:
|
|
32
|
+
|
|
33
|
+
1. Create a new folder for the component
|
|
34
|
+
2. Create the component file (e.g. MyComponent.js)
|
|
35
|
+
3. Create a story file (e.g. MyComponent.stories.js)
|
|
36
|
+
4. Create a test file (e.g. MyComponent.spec.js)
|
|
37
|
+
5. Create a style file (e.g. MyComponent.css) (if needed, we use tailwindcss for styles)
|
|
38
|
+
6. If it's a complex component, create a Cypress test file (e.g. MyComponent.spec.js in the 'cypress' folder)
|
|
39
|
+
|
|
40
|
+
### Folder structure
|
|
41
|
+
|
|
42
|
+
- All the components are located in the '/component-library' folder.
|
|
43
|
+
- Each component should be in its own folder, with the component file and any other files it needs (like styles, tests, etc).
|
|
44
|
+
- Cypress tests are located in the 'cypress' folder and should follow the same folder structure as the components.
|
|
45
|
+
|
|
46
|
+
### Storybook
|
|
47
|
+
|
|
48
|
+
We use Storybook to develop and test the components. To start the Storybook server, run:
|
|
28
49
|
|
|
29
50
|
```bash
|
|
30
51
|
npm run storybook
|
|
@@ -32,9 +53,7 @@ npm run storybook
|
|
|
32
53
|
|
|
33
54
|
This will start the Storybook server and open a browser window with the Storybook UI. You can use this to develop and test the components.
|
|
34
55
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
All the components are located in the 'component-library' folder.
|
|
56
|
+
This is the gallery of components that we use to develop and test the components. It's also used to generate the documentation for the components, so it's important to keep it up to date and encompassing relevant states and use cases within the stories.
|
|
38
57
|
|
|
39
58
|
## Testing
|
|
40
59
|
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
type Matrix<T> = Array<Array<T | undefined>>;
|
|
4
|
+
|
|
5
|
+
declare namespace MatrixConverter {
|
|
6
|
+
type Input = {
|
|
7
|
+
columns: Column[];
|
|
8
|
+
matrix: Matrix<unknown>;
|
|
9
|
+
};
|
|
10
|
+
type Output = {
|
|
11
|
+
value: unknown;
|
|
12
|
+
dataEditorType: DataEditorType;
|
|
13
|
+
convertedValue?: {
|
|
14
|
+
Boolean?: boolean;
|
|
15
|
+
Integer?: number;
|
|
16
|
+
Currency?: number;
|
|
17
|
+
Decimal?: number;
|
|
18
|
+
Float?: number;
|
|
19
|
+
Percentage?: number;
|
|
20
|
+
Date?: number;
|
|
21
|
+
Select?: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type SelectItem = {
|
|
27
|
+
text: string;
|
|
28
|
+
value: string;
|
|
29
|
+
};
|
|
30
|
+
type DataEditorType = 'Boolean' | 'String' | 'Select' | 'Date' | 'Integer' | 'Currency' | 'Float' | 'Decimal' | 'Percentage';
|
|
31
|
+
type Column = {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
width: number;
|
|
36
|
+
visible?: boolean;
|
|
37
|
+
position: number;
|
|
38
|
+
dataEditorType: DataEditorType;
|
|
39
|
+
alphabetLetter?: string;
|
|
40
|
+
readonly?: boolean;
|
|
41
|
+
settings?: {
|
|
42
|
+
select?: {
|
|
43
|
+
items: Array<SelectItem>;
|
|
44
|
+
};
|
|
45
|
+
numeric?: {
|
|
46
|
+
min?: number;
|
|
47
|
+
max?: number;
|
|
48
|
+
allowNegative?: boolean;
|
|
49
|
+
roundingRule?: string;
|
|
50
|
+
decimalPlaces?: number;
|
|
51
|
+
currency?: string;
|
|
52
|
+
};
|
|
53
|
+
string?: {
|
|
54
|
+
maskData?: string;
|
|
55
|
+
maskVisible?: boolean;
|
|
56
|
+
charLimit?: string;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
type InitialColumn = Pick<Column, Exclude<keyof Column, 'id' | 'alphabetLetter' | 'position' | 'width'>> & {
|
|
61
|
+
width?: number;
|
|
62
|
+
};
|
|
63
|
+
type Props = {
|
|
64
|
+
matrix: Matrix<unknown>;
|
|
65
|
+
onMatrixChange?: (matrix: MatrixConverter.Output[][]) => void;
|
|
66
|
+
startingColumns: InitialColumn[];
|
|
67
|
+
staticRows?: boolean;
|
|
68
|
+
className?: string;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
declare function Spreadsheet(props: Props): react_jsx_runtime.JSX.Element;
|
|
72
|
+
|
|
73
|
+
declare const CapLink: {
|
|
74
|
+
Spreadsheet: typeof Spreadsheet;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export { CapLink };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),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,samp,pre{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,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{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}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 0 0% 100%;--foreground: 240 10% 3.9%;--card: 0 0% 100%;--card-foreground: 240 10% 3.9%;--popover: 0 0% 100%;--popover-foreground: 240 10% 3.9%;--primary: 240 5.9% 10%;--primary-foreground: 0 0% 98%;--secondary: 240 4.8% 95.9%;--secondary-foreground: 240 5.9% 10%;--muted: 240 4.8% 95.9%;--muted-foreground: 240 3.8% 46.1%;--accent: 240 4.8% 95.9%;--accent-foreground: 240 5.9% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--border: 240 5.9% 90%;--input: 240 5.9% 90%;--ring: 240 5.9% 10%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-feature-settings:"rlig" 1,"calt" 1}*,:before,:after{--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: rgb(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: rgb(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: }.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-left-0{left:-0px}.-left-0\.5{left:-.125rem}.-right-\[3px\]{right:-3px}.-top-0{top:-0px}.-top-0\.5{top:-.125rem}.-top-1{top:-.25rem}.-top-4{top:-1rem}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-4{left:1rem}.right-0{right:0}.right-2{right:.5rem}.right-2\.5{right:.625rem}.top-0{top:0}.top-1\/2{top:50%}.top-8{top:2rem}.top-\[58px\]{top:58px}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mt-\[calc\(28px\+36px\)\]{margin-top:64px}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.flex{display:flex}.inline-flex{display:inline-flex}.h-0{height:0px}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[calc\(100\%-28px-28px\)\]{height:calc(100% - 56px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-px{height:1px}.max-h-96{max-height:24rem}.min-h-\[260px\]{min-height:260px}.w-0{width:0px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-56{width:14rem}.w-9{width:2.25rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-\[640px\]{min-width:640px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-\[240px\]{max-width:240px}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-6{gap:1.5rem}.overflow-hidden{overflow:hidden}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-t-md{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-l{border-left-width:1px}.border-l-0{border-left-width:0px}.border-r{border-right-width:1px}.border-r-0{border-right-width:0px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-none{border-style:none}.border-input{border-color:hsl(var(--input))}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[\#0085FF\]{--tw-bg-opacity: 1;background-color:rgb(0 133 255 / var(--tw-bg-opacity))}.bg-\[\#EAF5FF\]{--tw-bg-opacity: 1;background-color:rgb(234 245 255 / var(--tw-bg-opacity))}.bg-\[\#F6F6F9\]{--tw-bg-opacity: 1;background-color:rgb(246 246 249 / var(--tw-bg-opacity))}.bg-background{background-color:hsl(var(--background))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity))}.bg-muted{background-color:hsl(var(--muted))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity))}.bg-neutral-300{--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity: 1;background-color:rgb(163 163 163 / var(--tw-bg-opacity))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-white\/25{background-color:#ffffff40}.fill-current{fill:currentColor}.p-1{padding:.25rem}.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}.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-2\.5{padding-top:.625rem;padding-bottom:.625rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pr-px{padding-right:1px}.text-left{text-align:left}.text-\[10px\]{font-size:10px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.tracking-widest{letter-spacing:.1em}.text-\[\#4A4A6A\]{--tw-text-opacity: 1;color:rgb(74 74 106 / var(--tw-text-opacity))}.text-\[\#8E8EA9\]{--tw-text-opacity: 1;color:rgb(142 142 169 / var(--tw-text-opacity))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);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 rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);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 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-2{outline-width:2px}.outline-\[3px\]{outline-width:3px}.outline-offset-2{outline-offset:2px}.outline-blue-500{outline-color:#3b82f6}.outline-sky-100{outline-color:#e0f2fe}.outline-sky-200{outline-color:#bae6fd}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.drop-shadow-md{--tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / .07)) drop-shadow(0 2px 2px rgb(0 0 0 / .06));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)}.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)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;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-none{transition-property:none}.ease-linear{transition-timing-function:linear}@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))}}.animate-in{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}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.ease-linear{animation-timing-function:linear}*{font-family:Arial,Helvetica,sans-serif}.file\:border-0::file-selector-button{border-width:0px}.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}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:bg-\[\#8FD6FF\]:hover{--tw-bg-opacity: 1;background-color:rgb(143 214 255 / var(--tw-bg-opacity))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0: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(0px + 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-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-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.active\:bg-\[\#0085FF\]:active{--tw-bg-opacity: 1;background-color:rgb(0 133 255 / var(--tw-bg-opacity))}.active\:text-white:active{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(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: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(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: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=closed\]\:transform-none[data-state=closed]{transform:none}.data-\[side\=bottom\]\:animate-none[data-side=bottom],.data-\[state\=closed\]\:animate-none[data-state=closed]{animation:none}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:transition-none[data-state=closed]{transition-property:none}.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: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}
|
|
2
|
+
/*# sourceMappingURL=index.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/styles/globals.css"],"sourcesContent":["/*\n! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: var(--font-sans), ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n :root {\n --background: 0 0% 100%;\n --foreground: 240 10% 3.9%;\n\n --card: 0 0% 100%;\n --card-foreground: 240 10% 3.9%;\n\n --popover: 0 0% 100%;\n --popover-foreground: 240 10% 3.9%;\n\n --primary: 240 5.9% 10%;\n --primary-foreground: 0 0% 98%;\n\n --secondary: 240 4.8% 95.9%;\n --secondary-foreground: 240 5.9% 10%;\n\n --muted: 240 4.8% 95.9%;\n --muted-foreground: 240 3.8% 46.1%;\n\n --accent: 240 4.8% 95.9%;\n --accent-foreground: 240 5.9% 10%;\n\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 0 0% 98%;\n\n --border: 240 5.9% 90%;\n --input: 240 5.9% 90%;\n\n --ring: 240 5.9% 10%;\n --radius: 0.5rem;\n }\n * {\n border-color: hsl(var(--border));\n}\n body {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n font-feature-settings:\n 'rlig' 1,\n 'calt' 1;\n}\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.pointer-events-auto {\n pointer-events: auto;\n}\n.\\!visible {\n visibility: visible !important;\n}\n.visible {\n visibility: visible;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.sticky {\n position: sticky;\n}\n.-left-0 {\n left: -0px;\n}\n.-left-0\\.5 {\n left: -0.125rem;\n}\n.-right-\\[3px\\] {\n right: -3px;\n}\n.-top-0 {\n top: -0px;\n}\n.-top-0\\.5 {\n top: -0.125rem;\n}\n.-top-1 {\n top: -0.25rem;\n}\n.-top-4 {\n top: -1rem;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.left-0 {\n left: 0px;\n}\n.left-2 {\n left: 0.5rem;\n}\n.left-2\\.5 {\n left: 0.625rem;\n}\n.left-4 {\n left: 1rem;\n}\n.right-0 {\n right: 0px;\n}\n.right-2 {\n right: 0.5rem;\n}\n.right-2\\.5 {\n right: 0.625rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-1\\/2 {\n top: 50%;\n}\n.top-8 {\n top: 2rem;\n}\n.top-\\[58px\\] {\n top: 58px;\n}\n.z-20 {\n z-index: 20;\n}\n.z-40 {\n z-index: 40;\n}\n.z-50 {\n z-index: 50;\n}\n.-mx-1 {\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-\\[calc\\(28px\\+36px\\)\\] {\n margin-top: calc(28px + 36px);\n}\n.line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n}\n.line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.h-0 {\n height: 0px;\n}\n.h-0\\.5 {\n height: 0.125rem;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-3 {\n height: 0.75rem;\n}\n.h-3\\.5 {\n height: 0.875rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-7 {\n height: 1.75rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-\\[calc\\(100\\%-28px-28px\\)\\] {\n height: calc(100% - 28px - 28px);\n}\n.h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n}\n.h-fit {\n height: -moz-fit-content;\n height: fit-content;\n}\n.h-full {\n height: 100%;\n}\n.h-px {\n height: 1px;\n}\n.max-h-96 {\n max-height: 24rem;\n}\n.min-h-\\[260px\\] {\n min-height: 260px;\n}\n.w-0 {\n width: 0px;\n}\n.w-0\\.5 {\n width: 0.125rem;\n}\n.w-1 {\n width: 0.25rem;\n}\n.w-1\\.5 {\n width: 0.375rem;\n}\n.w-12 {\n width: 3rem;\n}\n.w-3 {\n width: 0.75rem;\n}\n.w-3\\.5 {\n width: 0.875rem;\n}\n.w-32 {\n width: 8rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-56 {\n width: 14rem;\n}\n.w-9 {\n width: 2.25rem;\n}\n.w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.w-full {\n width: 100%;\n}\n.min-w-\\[640px\\] {\n min-width: 640px;\n}\n.min-w-\\[8rem\\] {\n min-width: 8rem;\n}\n.min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n}\n.max-w-\\[240px\\] {\n max-width: 240px;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n 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));\n}\n.cursor-col-resize {\n cursor: col-resize;\n}\n.cursor-default {\n cursor: default;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.resize-none {\n resize: none;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-6 {\n gap: 1.5rem;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.break-words {\n overflow-wrap: break-word;\n}\n.break-all {\n word-break: break-all;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-md {\n border-radius: calc(var(--radius) - 2px);\n}\n.rounded-none {\n border-radius: 0px;\n}\n.rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n}\n.rounded-t-md {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-top-right-radius: calc(var(--radius) - 2px);\n}\n.border {\n border-width: 1px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-b-0 {\n border-bottom-width: 0px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-l-0 {\n border-left-width: 0px;\n}\n.border-r {\n border-right-width: 1px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-t-0 {\n border-top-width: 0px;\n}\n.border-none {\n border-style: none;\n}\n.border-input {\n border-color: hsl(var(--input));\n}\n.border-l-transparent {\n border-left-color: transparent;\n}\n.border-t-transparent {\n border-top-color: transparent;\n}\n.bg-\\[\\#0085FF\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(0 133 255 / var(--tw-bg-opacity));\n}\n.bg-\\[\\#EAF5FF\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(234 245 255 / var(--tw-bg-opacity));\n}\n.bg-\\[\\#F6F6F9\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(246 246 249 / var(--tw-bg-opacity));\n}\n.bg-background {\n background-color: hsl(var(--background));\n}\n.bg-blue-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(219 234 254 / var(--tw-bg-opacity));\n}\n.bg-blue-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(96 165 250 / var(--tw-bg-opacity));\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity));\n}\n.bg-destructive {\n background-color: hsl(var(--destructive));\n}\n.bg-gray-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity));\n}\n.bg-muted {\n background-color: hsl(var(--muted));\n}\n.bg-neutral-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(245 245 245 / var(--tw-bg-opacity));\n}\n.bg-neutral-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(212 212 212 / var(--tw-bg-opacity));\n}\n.bg-neutral-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(163 163 163 / var(--tw-bg-opacity));\n}\n.bg-popover {\n background-color: hsl(var(--popover));\n}\n.bg-primary {\n background-color: hsl(var(--primary));\n}\n.bg-secondary {\n background-color: hsl(var(--secondary));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.bg-white\\/25 {\n background-color: rgb(255 255 255 / 0.25);\n}\n.fill-current {\n fill: currentColor;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-2\\.5 {\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n.pl-1 {\n padding-left: 0.25rem;\n}\n.pl-2 {\n padding-left: 0.5rem;\n}\n.pl-3 {\n padding-left: 0.75rem;\n}\n.pl-8 {\n padding-left: 2rem;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pr-3 {\n padding-right: 0.75rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pr-px {\n padding-right: 1px;\n}\n.text-left {\n text-align: left;\n}\n.text-\\[10px\\] {\n font-size: 10px;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.tracking-widest {\n letter-spacing: 0.1em;\n}\n.text-\\[\\#4A4A6A\\] {\n --tw-text-opacity: 1;\n color: rgb(74 74 106 / var(--tw-text-opacity));\n}\n.text-\\[\\#8E8EA9\\] {\n --tw-text-opacity: 1;\n color: rgb(142 142 169 / var(--tw-text-opacity));\n}\n.text-black {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / var(--tw-text-opacity));\n}\n.text-blue-700 {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity));\n}\n.text-destructive-foreground {\n color: hsl(var(--destructive-foreground));\n}\n.text-neutral-500 {\n --tw-text-opacity: 1;\n color: rgb(115 115 115 / var(--tw-text-opacity));\n}\n.text-neutral-700 {\n --tw-text-opacity: 1;\n color: rgb(64 64 64 / var(--tw-text-opacity));\n}\n.text-popover-foreground {\n color: hsl(var(--popover-foreground));\n}\n.text-primary {\n color: hsl(var(--primary));\n}\n.text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.text-secondary-foreground {\n color: hsl(var(--secondary-foreground));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.outline {\n outline-style: solid;\n}\n.outline-2 {\n outline-width: 2px;\n}\n.outline-\\[3px\\] {\n outline-width: 3px;\n}\n.outline-offset-2 {\n outline-offset: 2px;\n}\n.outline-blue-500 {\n outline-color: #3b82f6;\n}\n.outline-sky-100 {\n outline-color: #e0f2fe;\n}\n.outline-sky-200 {\n outline-color: #bae6fd;\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.drop-shadow-md {\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\n 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);\n}\n.filter {\n 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);\n}\n.backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-none {\n transition-property: none;\n}\n.ease-linear {\n transition-timing-function: linear;\n}\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n 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));\n }\n}\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n 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));\n }\n}\n.animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.fade-in-0 {\n --tw-enter-opacity: 0;\n}\n.zoom-in-95 {\n --tw-enter-scale: .95;\n}\n.ease-linear {\n animation-timing-function: linear;\n}\n\n* {\n font-family: Arial, Helvetica, sans-serif;\n}\n\n.file\\:border-0::file-selector-button {\n border-width: 0px;\n}\n\n.file\\:bg-transparent::file-selector-button {\n background-color: transparent;\n}\n\n.file\\:text-sm::file-selector-button {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.file\\:font-medium::file-selector-button {\n font-weight: 500;\n}\n\n.placeholder\\:text-muted-foreground::-moz-placeholder {\n color: hsl(var(--muted-foreground));\n}\n\n.placeholder\\:text-muted-foreground::placeholder {\n color: hsl(var(--muted-foreground));\n}\n\n.hover\\:bg-\\[\\#8FD6FF\\]:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(143 214 255 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n\n.hover\\:bg-secondary\\/80:hover {\n background-color: hsl(var(--secondary) / 0.8);\n}\n\n.hover\\:text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.hover\\:opacity-100:hover {\n opacity: 1;\n}\n\n.focus\\:bg-accent:focus {\n background-color: hsl(var(--accent));\n}\n\n.focus\\:text-accent-foreground:focus {\n color: hsl(var(--accent-foreground));\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\:ring-0:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\:ring-1:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\:ring-ring:focus {\n --tw-ring-color: hsl(var(--ring));\n}\n\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus-visible\\:ring-1:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-color: hsl(var(--ring));\n}\n\n.active\\:bg-\\[\\#0085FF\\]:active {\n --tw-bg-opacity: 1;\n background-color: rgb(0 133 255 / var(--tw-bg-opacity));\n}\n\n.active\\:text-white:active {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n\n.disabled\\:cursor-not-allowed:disabled {\n cursor: not-allowed;\n}\n\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n\n.data-\\[disabled\\]\\:pointer-events-none[data-disabled] {\n pointer-events: none;\n}\n\n.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom] {\n --tw-translate-y: 0.25rem;\n 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));\n}\n\n.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left] {\n --tw-translate-x: -0.25rem;\n 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));\n}\n\n.data-\\[side\\=right\\]\\:translate-x-1[data-side=right] {\n --tw-translate-x: 0.25rem;\n 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));\n}\n\n.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top] {\n --tw-translate-y: -0.25rem;\n 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));\n}\n\n.data-\\[state\\=closed\\]\\:transform-none[data-state=closed] {\n transform: none;\n}\n\n.data-\\[side\\=bottom\\]\\:animate-none[data-side=bottom] {\n animation: none;\n}\n\n.data-\\[state\\=closed\\]\\:animate-none[data-state=closed] {\n animation: none;\n}\n\n.data-\\[state\\=open\\]\\:bg-accent[data-state=open] {\n background-color: hsl(var(--accent));\n}\n\n.data-\\[disabled\\]\\:opacity-50[data-disabled] {\n opacity: 0.5;\n}\n\n.data-\\[state\\=closed\\]\\:transition-none[data-state=closed] {\n transition-property: none;\n}\n\n.data-\\[state\\=open\\]\\:animate-in[data-state=open] {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n\n.data-\\[state\\=closed\\]\\:animate-out[data-state=closed] {\n animation-name: exit;\n animation-duration: 150ms;\n --tw-exit-opacity: initial;\n --tw-exit-scale: initial;\n --tw-exit-rotate: initial;\n --tw-exit-translate-x: initial;\n --tw-exit-translate-y: initial;\n}\n\n.data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed] {\n --tw-exit-opacity: 0;\n}\n\n.data-\\[state\\=open\\]\\:fade-in-0[data-state=open] {\n --tw-enter-opacity: 0;\n}\n\n.data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed] {\n --tw-exit-scale: .95;\n}\n\n.data-\\[state\\=open\\]\\:zoom-in-95[data-state=open] {\n --tw-enter-scale: .95;\n}\n\n.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom] {\n --tw-enter-translate-y: -0.5rem;\n}\n\n.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left] {\n --tw-enter-translate-x: 0.5rem;\n}\n\n.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right] {\n --tw-enter-translate-x: -0.5rem;\n}\n\n.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top] {\n --tw-enter-translate-y: 0.5rem;\n}\n\n.\\[\\&\\>span\\]\\:line-clamp-1>span {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n}\n"],"mappings":"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AAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,aACA,aACA,kBACA,6BAA6B,UAC7B,8BACA,6BACA,4BACA,eACA,oBACA,sBACA,uBACA,wBACA,kBACA,wBAAwB,IACxB,wBAAwB,KACxB,iBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE,IAClC,yBAAyB,EAAE,EAAE,MAC7B,kBAAkB,EAAE,EAAE,MACtB,aAAa,EAAE,EAAE,MACjB,qBAAqB,EAAE,EAAE,MACzB,YACA,kBACA,gBACA,iBACA,kBACA,cACA,gBACA,aACA,mBACA,qBACA,2BACA,yBACA,0BACA,2BACA,uBACA,wBACA,yBACA,sBACA,oBACA,sBACA,qBACA,oBACF,CAEA,WACE,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,aACA,aACA,kBACA,6BAA6B,UAC7B,8BACA,6BACA,4BACA,eACA,oBACA,sBACA,uBACA,wBACA,kBACA,wBAAwB,IACxB,wBAAwB,KACxB,iBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE,IAClC,yBAAyB,EAAE,EAAE,MAC7B,kBAAkB,EAAE,EAAE,MACtB,aAAa,EAAE,EAAE,MACjB,qBAAqB,EAAE,EAAE,MACzB,YACA,kBACA,gBACA,iBACA,kBACA,cACA,gBACA,aACA,mBACA,qBACA,2BACA,yBACA,0BACA,2BACA,uBACA,wBACA,yBACA,sBACA,oBACA,sBACA,qBACA,oBACF,CACA,CAAC,oBACC,eAAgB,IAClB,CACA,CAAC,oBACC,eAAgB,IAClB,CACA,CAAC,UACC,WAAY,iBACd,CACA,CAAC,QACC,WAAY,OACd,CACA,CAAC,SACC,SAAU,QACZ,CACA,CAAC,SACC,SAAU,QACZ,CACA,CAAC,OACC,SAAU,MACZ,CACA,CAAC,QACC,KAAM,IACR,CACA,CAAC,WACC,KAAM,QACR,CACA,CAAC,eACC,MAAO,IACT,CACA,CAAC,OACC,IAAK,IACP,CACA,CAAC,UACC,IAAK,QACP,CACA,CAAC,OACC,IAAK,OACP,CACA,CAAC,OACC,IAAK,KACP,CACA,CAAC,SACC,OAAQ,CACV,CACA,CAAC,OACC,KAAM,CACR,CACA,CAAC,OACC,KAAM,KACR,CACA,CAAC,UACC,KAAM,OACR,CACA,CAAC,OACC,KAAM,IACR,CACA,CAAC,QACC,MAAO,CACT,CACA,CAAC,QACC,MAAO,KACT,CACA,CAAC,WACC,MAAO,OACT,CACA,CAAC,MACC,IAAK,CACP,CACA,CAAC,SACC,IAAK,GACP,CACA,CAAC,MACC,IAAK,IACP,CACA,CAAC,aACC,IAAK,IACP,CACA,CAAC,KACC,QAAS,EACX,CACA,CAAC,KACC,QAAS,EACX,CACA,CAAC,KACC,QAAS,EACX,CACA,CAAC,MACC,YAAa,QACb,aAAc,OAChB,CACA,CAAC,KACC,WAAY,OACZ,cAAe,MACjB,CACA,CAAC,QACC,YAAa,IACf,CACA,CAAC,KACC,aAAc,KAChB,CACA,CAAC,0BACC,WAAY,IACd,CACA,CAAC,aACC,SAAU,OACV,QAAS,YACT,mBAAoB,SACpB,mBAAoB,CACtB,CACA,CAAC,aACC,SAAU,OACV,QAAS,YACT,mBAAoB,SACpB,mBAAoB,CACtB,CACA,CAAC,KACC,QAAS,IACX,CACA,CAAC,YACC,QAAS,WACX,CACA,CAAC,IACC,OAAQ,GACV,CACA,CAAC,OACC,OAAQ,OACV,CACA,CAAC,KACC,OAAQ,MACV,CACA,CAAC,IACC,OAAQ,MACV,CACA,CAAC,OACC,OAAQ,OACV,CACA,CAAC,IACC,OAAQ,IACV,CACA,CAAC,IACC,OAAQ,OACV,CACA,CAAC,IACC,OAAQ,IACV,CACA,CAAC,IACC,OAAQ,OACV,CACA,CAAC,8BACC,OAAQ,KAAK,KAAK,EAAE,KACtB,CACA,CAAC,2CACC,OAAQ,IAAI,8BACd,CACA,CAAC,MACC,OAAQ,iBACR,OAAQ,WACV,CACA,CAAC,OACC,OAAQ,IACV,CACA,CAAC,KACC,OAAQ,GACV,CACA,CAAC,SACC,WAAY,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AI,IAAI,EAAE,IAAI,iBAC1C,CACA,CAAC,WACC,iBAAkB,IAAI,IAAI,WAC5B,CACA,CAAC,WACC,iBAAkB,IAAI,IAAI,WAC5B,CACA,CAAC,aACC,iBAAkB,IAAI,IAAI,aAC5B,CACA,CAAC,eACC,iBAAkB,WACpB,CACA,CAAC,SACC,iBAAiB,EACjB,iBAAkB,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,iBAC1C,CACA,CAAC,aACC,iBAAkB,SACpB,CACA,CAAC,aACC,KAAM,YACR,CACA,CAAC,IA16BD,QA26BW,MACX,CACA,CAAC,KACC,aAAc,MACd,cAAe,KACjB,CACA,CAAC,KACC,aAAc,OACd,cAAe,MACjB,CACA,CAAC,KACC,aAAc,KACd,cAAe,IACjB,CACA,CAAC,KACC,aAAc,KACd,cAAe,IACjB,CACA,CAAC,KACC,YAAa,OACb,eAAgB,MAClB,CACA,CAAC,QACC,YAAa,QACb,eAAgB,OAClB,CACA,CAAC,KACC,YAAa,MACb,eAAgB,KAClB,CACA,CAAC,QACC,YAAa,QACb,eAAgB,OAClB,CACA,CAAC,KACC,aAAc,MAChB,CACA,CAAC,KACC,aAAc,KAChB,CACA,CAAC,KACC,aAAc,MAChB,CACA,CAAC,KACC,aAAc,IAChB,CACA,CAAC,KACC,cAAe,KACjB,CACA,CAAC,KACC,cAAe,MACjB,CACA,CAAC,KACC,cAAe,IACjB,CACA,CAAC,MACC,cAAe,GACjB,CACA,CAAC,UACC,WAAY,IACd,CACA,CAAC,cACC,UAAW,IACb,CACA,CAAC,QACC,UAAW,QACX,YAAa,OACf,CACA,CAAC,QACC,UAAW,OACX,YAAa,IACf,CACA,CAAC,UACC,YAAa,GACf,CACA,CAAC,YACC,YAAa,GACf,CACA,CAAC,cACC,YAAa,GACf,CACA,CAAC,gBACC,eAAgB,IAClB,CACA,CAAC,kBACC,mBAAmB,EACnB,MAAO,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,mBAC7B,CACA,CAAC,kBACC,mBAAmB,EACnB,MAAO,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,mBAC/B,CACA,CAAC,WACC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","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import * as Q from 'react';
|
|
3
|
+
import { createContext, useState, useCallback, useMemo, useEffect, useId, useContext, useRef } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
import { clsx } from 'clsx';
|
|
6
|
+
import { twMerge } from 'tailwind-merge';
|
|
7
|
+
import { useClickAway } from 'react-use';
|
|
8
|
+
import * as Z from '@radix-ui/react-tooltip';
|
|
9
|
+
import { CaretSortIcon, ChevronUpIcon, ChevronDownIcon, CheckIcon, ChevronRightIcon, DotFilledIcon, TextIcon, QuestionMarkCircledIcon } from '@radix-ui/react-icons';
|
|
10
|
+
import { ChevronDown, CalendarIcon, CopyCheckIcon, ListTodoIcon, DivideIcon, DollarSignIcon, PercentIcon } from 'lucide-react';
|
|
11
|
+
import * as m from '@radix-ui/react-select';
|
|
12
|
+
import { NumericFormat } from 'react-number-format';
|
|
13
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
14
|
+
import { cva } from 'class-variance-authority';
|
|
15
|
+
import * as u from '@radix-ui/react-dropdown-menu';
|
|
16
|
+
|
|
17
|
+
function Ae(e){if(e<=0)return "";let t=65,o=(e-1)%26,r=Math.floor((e-1)/26);return Ae(r)+String.fromCharCode(t+o)}function tt(e){let{columns:t,matrix:o}=e;return o.map(r=>r.map((a,i)=>{let n=t[i].dataEditorType;t[i].settings?.select?.items||[];let l={value:a,dataEditorType:n};return n==="Boolean"&&(l.convertedValue={Boolean:JSON.parse(a)}),n==="Integer"&&(l.convertedValue={Integer:Number(a)}),n==="Currency"&&(l.convertedValue={Currency:Number(a)}),n==="Decimal"&&(l.convertedValue={Decimal:Number(a)}),n==="Float"&&(l.convertedValue={Float:Number(a)}),n==="Percentage"&&(l.convertedValue={Percentage:Number(a)}),n==="Date"&&(l.convertedValue={Date:Number(a)}),n==="Select"&&(l.convertedValue={Select:a}),l}))}function ot(e){try{return e.includes("/")?new Date(e.split("/").reverse().join("-")).toISOString().split("T")[0].replace("+",""):new Date(e).toISOString().split("T")[0].replace("+","")}catch{return null}}var rt=["Decimal","Float","Integer","Percentage","Currency"];function at(e){let{value:t,dataEditorType:o}=e;return o==="Date"?ot(t)||"":o==="Boolean"?t===!0?"true":"false":rt.includes(o)&&Number.isNaN(Number(t))?"":t}function po(e,t){return new Array(e.rows).fill(void 0).map(()=>new Array(e.columns).fill(t))}function mo(e){return e?.length}function Ce(e){let t=e?.[0];return t?t.length:0}function Se(e){return {columns:Ce(e),rows:mo(e)}}function nt(e,t){return t.row>=e.start.row&&t.column>=e.start.column&&t.row<=e.end.row&&t.column<=e.end.column}function me(e){let{matrix:t,pointRange:o}=e;return o.start.column===0&&o.end.column===Ce(t)}function it(e){let{matrix:t,pointRange:o,row:r}=e;return r>=o.start.row&&r<=o.end.row&&me({matrix:t,pointRange:o})}function st(e){return e.split(`
|
|
18
|
+
`).map(t=>t.split(" "))}function lt(e){let{mA:t,mB:o,point:r={column:0,row:0}}=e,a=Se(t),i=Se(o),n=r.row+i.rows>a.rows,h=r.column+i.columns>i.columns,l=n?r.row+i.rows:a.rows,y=h?r.column+i.columns:a.columns,d=po({rows:l,columns:y});for(let b=0;b<a.rows;b+=1)for(let v=0;v<a.columns;v+=1)d[b][v]=t[b][v];for(let b=0;b<i.rows;b+=1)for(let v=0;v<i.columns;v+=1)d[b+r.row][v+r.column]=o[b][v];return d}var Ve,He=createContext(null);function pt(e){let{children:t,startingColumns:o,matrix:r=[],staticRows:a,onMatrixChange:i}=e,[n,h]=useState(r),[l,y]=useState(()=>ct(o)),[d,b]=useState(null),[v,k]=useState({height:0,width:0}),[E,P]=useState(!1),L=useCallback((f=2e3)=>{P(!0),Ve&&clearTimeout(Ve),Ve=setTimeout(()=>P(!1),f);},[]),w=useMemo(()=>Ce(n)||l.length,[n,l.length]),S=useMemo(()=>Se(n),[n]),g=useMemo(()=>S.rows===0,[S.rows]),W=useMemo(()=>!!(d&&me({matrix:n,pointRange:d})),[d,n]),R=useCallback(f=>{if(i){let M=tt({columns:l,matrix:f});i(M);}},[i,l]),j=useCallback(async f=>{let{state:M}=await navigator.permissions.query({name:"clipboard-read"});if(M==="denied"){console.log("denied");return}let D=await navigator.clipboard.readText(),O=st(D),Le=lt({mA:n,mB:O,point:f}).map(pe=>pe.map((_e,ze)=>l[ze]?.readonly?"":_e)).map(pe=>pe.map((_e,ze)=>at({value:_e,dataEditorType:l[ze]?.dataEditorType}))).map(pe=>pe.slice(0,o.length)),ce=a?Le.slice(0,n.length):Le;h(ce),R(ce);},[l,n,o.length,R,a]),F=useCallback(f=>{let{data:M,point:D}=f,{column:O,row:ie}=D,U=structuredClone(n);U[ie][O]=M,h(U),R(U);},[n,R]),A=useCallback(()=>{if(d&&!a){let f=d.start.row,M=d.end.row,D=M-f+1;if(!W)return;let O=D>1?`Voc\xEA ir\xE1 excluir ${D} linhas, deseja continuar?
|
|
19
|
+
Linha N\xB0 ${f+1} at\xE9 N\xB0 ${M+1}`:`Voc\xEA ir\xE1 excluir a linha N\xB0 ${f+1}, deseja continuar?`;if(!confirm(O))return;let U=n.filter((Le,ce)=>ce<f||ce>M);b(null),h(U),R(U);}},[n,d,a,W,R]),K=useCallback((f,M)=>{if(d&&M&&M.shiftKey){let D=f<d.start.row?f:d.start.row,O=f<d.start.row?d.start.row:f;return b({start:{row:D,column:0},end:{row:O,column:w}})}b({start:{row:f,column:0},end:{row:f,column:w}});},[w,d]),q=useCallback(f=>{f.row===d?.start.row&&f.column===d.start.column||b({start:f,end:f});},[d?.start.row,d?.start.column]),ne=useCallback(f=>!!(d&&nt(d,f)),[d]),x=useCallback(f=>{let{columnId:M,width:D}=f,O=D;D>320&&(O=320),D<160&&(O=160),y(ie=>ie.map(U=>U.id===M?{...U,width:O}:U));},[]),V=useCallback(()=>{if(a)return;let f=[...structuredClone(n),new Array(w).fill("")];h(f),R(f),L();},[a,n,w,L,R]),_=useCallback(()=>{let f={column:0,row:0},M={column:S.columns,row:S.rows-1};b({start:f,end:M});},[S]),G=useCallback(f=>{y(M=>M.map(D=>D.id===f?{...D,visible:!D.visible}:D));},[]);useEffect(()=>{h(r);},[r]),useEffect(()=>{y(()=>ct(o));},[o]);let co=useMemo(()=>({size:S,matrix:n,columns:l,emptySize:g,staticRows:a,hasSomeEntireRow:W,highlightLastRow:E,pointRange:d,setPointRange:b,containerDimensions:v,setContainerDimensions:k,onPaste:j,onChange:F,onRemoveRow:A,onSelectRow:K,onSelectCell:q,isCellSelected:ne,onInsertNewRow:V,onColumnResize:x,onSelectSpreadsheet:_,onColumnVisibilityChange:G}),[S,n,l,g,a,W,E,d,v,j,F,A,K,q,ne,V,x,_,G]);return jsx(He.Provider,{value:co,children:t})}function ct(e){return e.map((t,o)=>({...t,id:`spreadsheet__column__id__${nanoid()}`,alphabetLetter:Ae(o+1),position:o,width:t.width||160,visible:!0}))}function N(){let e=useContext(He);if(!e)throw new Error("useSpreadsheet has to be used within <SpreadsheetContext.Provider>");return e}function s(...e){return twMerge(clsx(e))}function mt(e){let{children:t,className:o}=e,{size:r,staticRows:a,setContainerDimensions:i}=N(),n=useRef(null),h=useMemo(()=>r.rows*26+36,[r.rows]);return useEffect(()=>{let l=n.current;if(!l)return;let y=new ResizeObserver(d=>{let b=d[0];if(b){let v=b.contentRect.width,k=b.contentRect.height;i({height:k,width:v});}});return y.observe(l),()=>{y.disconnect();}},[i]),jsx("div",{ref:n,className:s("relative w-full border border-t-0 border-r-0",r.rows>=7?"border-b-0":"border-b",a?`${h}px border-b-0`:"min-h-[260px]",o),children:t})}function ut(e){let{children:t,className:o}=e,{setPointRange:r}=N(),a=useRef(null);return useClickAway(a,()=>r(null)),jsx("div",{ref:a,className:s("min-w-[640px]",o),children:t})}var We={Matrix:mt,Root:ut};function ft(e){let{className:t,...o}=e;return jsx("button",{draggable:!0,className:s("h-9 w-1.5 cursor-col-resize rounded-sm bg-neutral-400 drop-shadow-md",t),...o,children:jsxs("div",{className:"relative",children:[jsx("span",{className:"-translate-y-1/2 absolute top-1/2 right-2.5 h-3 w-1 rounded-full bg-neutral-300"}),jsx("span",{className:"-translate-y-1/2 absolute top-1/2 left-2.5 h-3 w-1 rounded-full bg-neutral-300"})]})})}function wt(e){let{className:t,column:o,children:r}=e,{id:a,width:i,position:n,visible:h,alphabetLetter:l}=o,{matrix:y,pointRange:d,containerDimensions:b,onColumnResize:v}=N(),k=useRef(null),E=useMemo(()=>(b?.height||0)+32,[b?.height]),[P,L]=useState(!1),[w,S]=useState(0),[g,W]=useState(0),R=useMemo(()=>P?g-w:0,[P,g,w]),j=useCallback(x=>{S(x.clientX),L(!0);},[]),F=useCallback(x=>{let V=k.current;if(!V)return;let _=x.clientX-w,G=i+_;G>320&&(G=320),G<160&&(G=160),V.style.left=`${G}px`,W(x.clientX);},[w,i]),A=useCallback(x=>{let V=x.clientX-w,_=i+V;v({width:_,columnId:a}),L(!1);},[w,i,a,v]),K=useCallback(()=>{if(P)return `bg-neutral-100 font-bold text-neutral-700 ${t}`;if(d&&!P){let{start:x,end:V}=d,_=me({matrix:y,pointRange:d}),G=n>=x.column&&n<=V.column;if(_)return `bg-[#0085FF] font-bold text-white ${t}`;if(G)return `bg-blue-100 font-bold text-blue-700 ${t}`}return t},[P,t,y,d,n]),q=useCallback(()=>{let x=i+R;return x>320&&(x=320),x<160&&(x=160),`${x}px`},[i,R]),ne=useMemo(()=>({onDragStart:j,onDrag:F,onDragEnd:A}),[j,F,A]);return useEffect(()=>{let x=k.current;x&&(x.style.left=`${i}px`);},[i]),h?jsxs("div",{style:{width:i},className:s("relative flex h-7 w-32 shrink-0 items-center justify-center border border-t-0 border-l-0 text-[#8E8EA9] text-xs",K()),children:[jsx(ft,{...ne,className:s("-right-[3px] -top-1 absolute z-50 opacity-0 hover:opacity-100",P&&"opacity-0")}),jsx("div",{ref:k,style:{height:E},className:s("-top-4 pointer-events-none absolute z-50 h-full w-1.5 rounded-full bg-blue-400 shadow-lg outline outline-sky-100",P?"opacity-100":"opacity-0"),children:jsx("span",{className:"-translate-y-1/2 relative top-8 left-4 z-50 select-none rounded-md border bg-white p-1 font-semibold drop-shadow-md",children:q()})}),jsx("span",{children:r||l})]}):null}function gt(e){return jsx("svg",{stroke:"currentColor",fill:"currentColor",strokeWidth:"0",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",...e,children:jsx("path",{d:"M13.003 7.754a.75.75 0 0 1 .75-.75h5.232a.75.75 0 0 1 .53 1.28l-2.776 2.777c.55.097 1.057.253 1.492.483.905.477 1.504 1.284 1.504 2.418 0 .966-.471 1.75-1.172 2.27-.687.511-1.587.77-2.521.77-1.367 0-2.274-.528-2.667-.756a.75.75 0 0 1 .755-1.297c.331.193.953.553 1.912.553.673 0 1.243-.188 1.627-.473.37-.275.566-.635.566-1.067 0-.5-.219-.836-.703-1.091-.538-.284-1.375-.443-2.471-.443a.75.75 0 0 1-.53-1.28l2.643-2.644h-3.421a.75.75 0 0 1-.75-.75ZM7.88 15.215a1.4 1.4 0 0 0-1.446.83.75.75 0 0 1-1.37-.61 2.899 2.899 0 0 1 2.986-1.71c.589.06 1.139.323 1.557.743.434.446.685 1.058.685 1.778 0 1.641-1.254 2.437-2.12 2.986-.538.341-1.18.694-1.495 1.273H9.75a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75c0-1.799 1.337-2.63 2.243-3.21 1.032-.659 1.55-1.031 1.55-1.8 0-.355-.116-.584-.26-.732a1.071 1.071 0 0 0-.652-.298Zm.234-13.121a.75.75 0 0 1 .386.656V9h1.252a.75.75 0 0 1 0 1.5H5.75a.75.75 0 0 1 0-1.5H7V4.103l-.853.533a.749.749 0 1 1-.795-1.272l2-1.25a.749.749 0 0 1 .762-.02Z"})})}var Pe=Z.Provider,Ne=Z.Root,Me=Z.Trigger,he=Q.forwardRef(({className:e,sideOffset:t=4,...o},r)=>jsx(Z.Content,{ref:r,sideOffset:t,className:s("fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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 z-50 animate-in overflow-hidden rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs data-[state=closed]:animate-out",e),...o}));he.displayName=Z.Content.displayName;function xt({column:e}){let{width:t,name:o,visible:r,dataEditorType:a,description:i}=e;return r?jsxs("div",{className:"flex h-9 w-32 shrink-0 items-center border border-t-0 border-l-0 bg-[#F6F6F9] px-2",style:{width:t,height:36},children:[jsxs("div",{className:"mr-2 w-4 shrink-0 text-[#8E8EA9]",children:[a==="String"&&jsx(TextIcon,{className:"h-4 w-4"}),a==="Date"&&jsx(CalendarIcon,{className:"h-4 w-4"}),a==="Boolean"&&jsx(CopyCheckIcon,{className:"h-4 w-4"}),a==="Select"&&jsx(ListTodoIcon,{className:"h-4 w-4"}),a==="Float"&&jsx(DivideIcon,{className:"h-4 w-4"}),a==="Decimal"&&jsx(DivideIcon,{className:"h-4 w-4"}),a==="Integer"&&jsx(gt,{className:"h-4 w-4"}),a==="Currency"&&jsx(DollarSignIcon,{className:"h-4 w-4"}),a==="Percentage"&&jsx(PercentIcon,{className:"h-4 w-4"})]}),jsx("p",{title:o,className:"mr-2 line-clamp-2 w-full break-words font-semibold text-[#4A4A6A] text-xs",children:o}),i?jsx(Pe,{children:jsxs(Ne,{delayDuration:100,children:[jsx(Me,{children:jsx(QuestionMarkCircledIcon,{className:"h-4 w-4 text-[#4A4A6A]"})}),jsx(he,{className:"max-w-[240px]",children:jsx("p",{children:i})})]})}):jsx("div",{className:"w-4 shrink-0"})]}):null}function St({className:e}){let{emptySize:t,onSelectSpreadsheet:o}=N();return jsxs("button",{disabled:t,className:s("relative flex h-7 w-12 shrink-0 items-center justify-center border border-l border-t bg-white text-xs",e),onClick:o,children:[jsx("span",{className:"absolute right-0 top-0 h-full w-0.5 bg-gray-300"}),jsx("span",{className:"absolute bottom-0 left-0 h-0.5 w-full bg-gray-300"})]})}function Ct(){let{columns:e}=N();return jsxs("div",{className:"sticky top-[58px] z-50",children:[jsxs("div",{className:"relative flex items-center bg-white",children:[jsx(St,{className:"border-t-0 border-l-0"}),e.map(t=>jsx(wt,{column:t},`spreadsheet__column__indicator__key__${t.name}__${t.position}`))]}),jsxs("div",{className:"flex items-center",children:[jsx("div",{className:"h-9 w-12 shrink-0 cursor-default border border-t-0 border-l-0 bg-[#F6F6F9]"}),e.map(t=>jsx(xt,{column:t},`spreadsheet__column__header__key__${t.name}__${t.position}`))]})]})}var Ee=m.Root;var Re=m.Value,ge=Q.forwardRef(({className:e,children:t,...o},r)=>jsxs(m.Trigger,{ref:r,className:s("flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent py-2 pr-px pl-3 text-sm shadow-sm ring-offset-background [&>span]:line-clamp-1 disabled:cursor-not-allowed placeholder:text-muted-foreground disabled:opacity-50 focus:outline-none focus:ring-1 focus:ring-ring",e),...o,children:[t,jsx(m.Icon,{asChild:!0,children:jsx(CaretSortIcon,{className:"h-4 w-4 opacity-50"})})]}));ge.displayName=m.Trigger.displayName;var kt=Q.forwardRef(({className:e,...t},o)=>jsx(m.ScrollUpButton,{ref:o,className:s("flex cursor-default items-center justify-center py-1",e),...t,children:jsx(ChevronUpIcon,{})}));kt.displayName=m.ScrollUpButton.displayName;var Pt=Q.forwardRef(({className:e,...t},o)=>jsx(m.ScrollDownButton,{ref:o,className:s("flex cursor-default items-center justify-center py-1",e),...t,children:jsx(ChevronDownIcon,{})}));Pt.displayName=m.ScrollDownButton.displayName;var be=Q.forwardRef(({className:e,children:t,position:o="popper",...r},a)=>jsx(m.Portal,{children:jsxs(m.Content,{ref:a,className:s("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 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in",o==="popper"&&"data-[side=left]:-translate-x-1 data-[side=top]:-translate-y-1 data-[side=right]:translate-x-1 data-[side=bottom]:translate-y-1",e),position:o,...r,children:[jsx(kt,{}),jsx(m.Viewport,{className:s("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t}),jsx(Pt,{})]})}));be.displayName=m.Content.displayName;var Go=Q.forwardRef(({className:e,...t},o)=>jsx(m.Label,{ref:o,className:s("px-2 py-1.5 font-semibold text-sm",e),...t}));Go.displayName=m.Label.displayName;var se=Q.forwardRef(({className:e,children:t,...o},r)=>jsxs(m.Item,{ref:r,className:s("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50",e),...o,children:[jsx("span",{className:"absolute right-2 flex h-3.5 w-3.5 items-center justify-center",children:jsx(m.ItemIndicator,{children:jsx(CheckIcon,{className:"h-4 w-4"})})}),jsx(m.ItemText,{children:t})]}));se.displayName=m.Item.displayName;var Xo=Q.forwardRef(({className:e,...t},o)=>jsx(m.Separator,{ref:o,className:s("-mx-1 my-1 h-px bg-muted",e),...t}));Xo.displayName=m.Separator.displayName;function Nt(e){let{value:t,onBlur:o,onChange:r,onPaste:a}=e,i=useCallback(n=>{n.preventDefault(),a?.();},[a]);return jsxs(Ee,{value:t,onValueChange:n=>r?.({data:n}),defaultOpen:!0,children:[jsx(ge,{onBlur:o,onPaste:i,className:s("h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0"),autoFocus:!0,children:jsx(Re,{placeholder:"Selecionar"})}),jsxs(be,{children:[jsx(se,{className:"text-xs",value:"true",children:"Sim"}),jsx(se,{className:"text-xs",value:"false",children:"N\xE3o"})]})]})}function Mt({value:e}){return jsxs("div",{className:"flex h-full w-full items-center justify-between pr-px pl-1",children:[jsx("p",{className:"line-clamp-1 text-xs",children:e===""?"Selecionar":e==="true"?"Sim":"N\xE3o"}),jsx(CaretSortIcon,{className:"h-4 w-4 opacity-50"})]})}function Dt(e){let{value:t,onBlur:o,onChange:r,onPaste:a}=e,i=useCallback(n=>{n.preventDefault(),a?.();},[a]);return jsx("input",{type:"date",onBlur:o,onPaste:i,value:t,onChange:n=>r?.({data:n.target.value}),className:s("h-full w-full bg-transparent pl-1 text-xs outline-none"),autoFocus:!0})}function Et(e){let{value:t}=e,o=Intl.DateTimeFormat("pt-BR",{dateStyle:"short"}),r=t?o.format(new Date(t)):"dd/mm/yyyy";return jsx("div",{className:"flex h-full w-full items-center",children:jsx("p",{className:"line-clamp-1 pl-1 text-xs",children:r})})}function qe(e){let{className:t,dataEditorType:o,onFocus:r,onBlur:a,onChange:i,onClick:n,onPaste:h,settings:l,testid:y,value:d,disabled:b,dataCypress:v,tabIndex:k}=e,E=".",P=",",L=Jo({dataEditorType:o,decimalScale:l?.numeric?.decimalPlaces}),w=l?.numeric?.allowNegative,S=l?.numeric?.min,g=l?.numeric?.max,W=o.toLocaleLowerCase()==="currency"?"R$ ":"",R=o.toLocaleLowerCase()==="percentage"?"%":"",[j,F]=useState(d),[A,K]=useState(!1),q=({value:x})=>{F(x),i?.(x);},ne=()=>{let x=!1,V=Number(d),_=d;typeof S=="number"&&V<S&&(_=S.toString()),typeof g=="number"&&V>g&&(_=g.toString()),_!==d&&(x=!0,i?.(_),F(_),K(x)),x||a?.();};return useEffect(()=>{A&&(a?.(),K(!1));},[a,A]),useEffect(()=>{F(d);},[d]),jsx(NumericFormat,{tabIndex:k,value:j,onPaste:h,prefix:W,suffix:R,fixedDecimalScale:!0,onBlur:ne,"data-testid":y,valueIsNumericString:!0,onFocus:r,onClick:n,decimalScale:L,onValueChange:q,allowNegative:w,decimalSeparator:P,thousandSeparator:E,className:s("h-full w-full rounded-none bg-transparent pl-1 text-xs outline-none",t),disabled:b,"data-cypress":v,autoFocus:!0})}var qo=2;function Jo(e){let{dataEditorType:t,decimalScale:o}=e,r=o;return t.toLowerCase()==="percentage"&&(o?r=o>2?o-qo:0:r=0),o||(t.toLowerCase()==="decimal"&&(r=2),t.toLowerCase()==="float"&&(r=2),t.toLowerCase()==="integer"&&(r=0),t.toLowerCase()==="currency"&&(r=2)),r}function Lt(e){let{value:t,onBlur:o,onChange:r,onPaste:a,setMode:i,column:n}=e,h=useCallback(y=>{y.preventDefault(),a?.();},[a]),l=useCallback(()=>{o?.(),i?.("view");},[o,i]);return jsx(qe,{dataEditorType:n.dataEditorType,value:t,onPaste:h,onBlur:l,onChange:y=>r?.({data:y}),settings:n.settings})}function _t(e){let{value:t,column:o}=e;return jsx(qe,{dataEditorType:o.dataEditorType,value:t,settings:o.settings,disabled:!0,className:"pointer-events-none"})}function Ft(e){let{value:t,onBlur:o,onChange:r,onPaste:a,items:i}=e,n=useCallback(h=>{h.preventDefault(),a?.();},[a]);return jsxs(Ee,{value:t,onValueChange:h=>r?.({data:h}),defaultOpen:!0,children:[jsx(ge,{onBlur:o,onPaste:n,className:s("h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0"),children:jsx(Re,{placeholder:"Selecionar"})}),jsx(be,{children:i.map(({value:h,text:l})=>jsx(se,{className:"text-xs",value:h,children:l},h))})]})}function Vt(e){let{value:t,items:o}=e,r=useMemo(()=>o.find(i=>i.value===t),[o,t]),a=useMemo(()=>r?r.text:"Selecionar",[r]);return jsxs("div",{className:"flex h-full w-full items-center justify-between pr-px pl-1",children:[jsx("p",{className:"line-clamp-1 text-xs",children:a}),jsx(CaretSortIcon,{className:"h-4 w-4 opacity-50"})]})}function Bt(e){e.selectionStart=e.selectionEnd=e.value.length;}var tr="text/plain";function Wt(e){return window.clipboardData?.getData?window.clipboardData.getData("Text"):e.clipboardData?.getData?e.clipboardData.getData(tr):""}var ar=6,Ot=200;function Gt(e){let{value:t,onBlur:o,onChange:r,onPaste:a,setMode:i,column:n,selected:h}=e,l=t,y=useRef(null),[d,b]=useState(0),v=useMemo(()=>$t(l,n.width),[l,n.width]),k=useCallback(w=>{let S=Wt(w);nr(S)||(w.preventDefault(),a?.());},[a]),E=useCallback(()=>{o?.(),i?.("view");},[o,i]),P=useCallback(()=>{let w=y.current;if(!w)return;let S=w.scrollHeight;w.style.height=`${S}px`,b(S);},[]),L=useCallback(w=>{r?.({data:w.target.value}),P();},[P,r]);return v?jsx("div",{style:{height:d},className:s("-left-0.5 -top-0.5 absolute z-40 h-fit w-fit border bg-white shadow-lg outline outline-2 outline-blue-500",h?"bg-blue-50":"bg-white"),children:jsx("div",{style:{height:d-1},className:"h-full w-full outline outline-[3px] outline-sky-200 outline-offset-2",children:jsx("textarea",{ref:y,onBlur:E,onPaste:k,value:l,onChange:L,className:s("resize-none break-all rounded-none bg-transparent py-1.5 pr-3 pl-1 text-xs outline-none"),onFocus:w=>Bt(w.target),maxLength:Ot,style:{width:n.width},autoFocus:!0})})}):jsx("input",{onBlur:o,onPaste:k,value:l,maxLength:Ot,onChange:L,className:s("h-full w-full bg-transparent pl-1 text-xs outline-none"),autoFocus:!0})}function Xt(e){let{value:t,column:o,selected:r}=e,a=t;return useMemo(()=>$t(a,o.width),[a,o.width])?jsx(Pe,{delayDuration:0,children:jsxs(Ne,{children:[jsx(Me,{className:"w-full",children:jsx("div",{className:"flex h-full w-full items-center overflow-hidden",children:jsx("p",{className:"line-clamp-1 break-all pl-1 text-left text-xs",children:a})})}),jsx(he,{align:"start",side:"bottom",alignOffset:-2,sideOffset:-26,className:s("h-fit w-full break-all rounded-none border bg-white pl-1 text-black shadow-lg","data-[state=closed]:transform-none data-[side=bottom]:animate-none data-[state=closed]:animate-none data-[state=closed]:transition-none",r?"bg-blue-50":"bg-white"),style:{width:o.width},children:jsx("p",{children:a})})]})}):jsx("div",{className:"flex h-full w-full items-center overflow-hidden",children:jsx("p",{className:"line-clamp-1 break-all pl-1 text-left text-xs",title:a,children:a})})}function $t(e,t){return ar*e?.length>t}function nr(e){return [" ",`
|
|
20
|
+
`,"\r"].every(t=>!e.includes(t))}var X={Date:Dt,Text:Gt,Boolean:Nt,Numeric:Lt,Select:Ft},$={Date:Et,Text:Xt,Boolean:Mt,Numeric:_t,Select:Vt};function Yt(e){let{value:t,coordinates:o}=e,{columns:r,isCellSelected:a,onChange:i,onPaste:n,onSelectCell:h}=N(),{dataEditorType:l,readonly:y,width:d,visible:b,settings:v}=r[o.column],[k,E]=useState(y?"readonly":"view"),P=useRef(null),L=useMemo(()=>r[o.column],[r,o.column]),w=useMemo(()=>a(o),[o,a]),S=useMemo(()=>v?.select?.items||[],[v?.select?.items]),g=useMemo(()=>({dataEditor:{value:t,column:L,setMode:E,selected:w,onPaste:()=>n(o),onChange:({data:A})=>i({data:A,point:o})},dataViewer:{value:t,column:L,selected:w}}),[o,t,L,w,n,i]),W=useMemo(()=>({Date:jsx(X.Date,{...g.dataEditor}),String:jsx(X.Text,{...g.dataEditor}),Currency:jsx(X.Numeric,{...g.dataEditor}),Decimal:jsx(X.Numeric,{...g.dataEditor}),Float:jsx(X.Numeric,{...g.dataEditor}),Integer:jsx(X.Numeric,{...g.dataEditor}),Percentage:jsx(X.Numeric,{...g.dataEditor}),Boolean:jsx(X.Boolean,{...g.dataEditor}),Select:jsx(X.Select,{...g.dataEditor,items:S})}),[g.dataEditor,S]),R=useMemo(()=>({Date:jsx($.Date,{...g.dataViewer}),String:jsx($.Text,{...g.dataViewer}),Currency:jsx($.Numeric,{...g.dataViewer}),Decimal:jsx($.Numeric,{...g.dataViewer}),Float:jsx($.Numeric,{...g.dataViewer}),Integer:jsx($.Numeric,{...g.dataViewer}),Percentage:jsx($.Numeric,{...g.dataViewer}),Boolean:jsx($.Boolean,{...g.dataViewer}),Select:jsx($.Select,{...g.dataViewer,items:S})}),[g.dataViewer,S]),j=useMemo(()=>l?W[l]:null,[l,W]),F=useMemo(()=>l?R[l]:null,[l,R]);return useEffect(()=>{let A=K=>{let q=K.code==="Enter";q&&w&&k==="view"&&E("edit"),q&&w&&k==="edit"&&E("view");};return window.addEventListener("keydown",A),()=>window.removeEventListener("keydown",A)},[w,k]),useClickAway(P,()=>E("view")),b?k==="readonly"?jsx("div",{onClick:()=>h(o),className:s("flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent bg-[#F6F6F9]",w&&"bg-[#EAF5FF]"),style:{width:d,height:26},children:F}):k==="view"?jsx("div",{onClick:()=>h(o),onDoubleClick:()=>E("edit"),className:s("relative flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent",w&&"bg-[#EAF5FF]"),style:{width:d,height:26},children:F}):jsx("div",{ref:P,"data-testid":"cell__testid",className:"relative h-7 w-32 shrink-0 border border-l-transparent border-t-transparent bg-[#EAF5FF] shadow-lg outline outline-2 outline-blue-500",style:{width:d,height:26,top:o.row===0?"4px":"0px"},children:jsx("div",{className:"h-full w-full outline outline-[3px] outline-offset-2 outline-sky-200",children:j})}):null}function Kt({row:e}){let{onSelectRow:t,pointRange:o,matrix:r}=N(),a=useMemo(()=>o&&e>=o.start.row&&e<=o.end.row,[o,e]),i=useMemo(()=>!!(o&&it({matrix:r,pointRange:o,row:e})),[r,o,e]);return jsx("div",{className:s("flex h-7 w-12 shrink-0 cursor-default select-none items-center justify-center border-r border-b text-[#8E8EA9] text-xs",a&&"bg-blue-100 font-bold text-blue-700",i&&"bg-[#0085FF] font-bold text-white"),onClick:n=>t(e,n),style:{height:26},children:e+1})}function qt(){let e=useId(),{highlightLastRow:t,matrix:o}=N();return jsx("div",{className:"relative",children:o.map((r,a)=>jsxs("div",{className:s("flex items-center transition-all ease-linear",a===o.length-1&&t&&"bg-blue-50"),children:[jsx(Kt,{row:a}),r.map((i,n)=>jsx(Yt,{value:i,coordinates:{column:n,row:a}},`spreadsheet__cell__key__${e}__${a}__${n}`))]},`spreadsheet__row__key__${e}__${a}}`))})}function Jt({className:e}){let{staticRows:t,emptySize:o,onInsertNewRow:r}=N();return t?null:jsx("div",{className:s("pointer-events-none mt-[calc(28px+36px)] flex h-[calc(100%-28px-28px)] w-full items-center justify-center",o&&"pointer-events-auto bg-white/25 backdrop-blur-sm",e),children:o&&jsxs("p",{className:"text-neutral-500",children:[jsx("span",{children:"Clique "}),jsx("button",{type:"button",onClick:r,className:"font-bold",children:"AQUI"}),jsx("span",{children:" para come\xE7ar a preencher a tabela."})]})})}function Qt(e){return jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",fill:"none",viewBox:"0 0 20 20",...e,children:jsx("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.5",d:"M10 6.667v6.666M6.667 10h6.666M6.5 17.5h7c1.4 0 2.1 0 2.635-.273a2.5 2.5 0 001.092-1.092c.273-.535.273-1.235.273-2.635v-7c0-1.4 0-2.1-.273-2.635a2.5 2.5 0 00-1.092-1.093C15.6 2.5 14.9 2.5 13.5 2.5h-7c-1.4 0-2.1 0-2.635.272a2.5 2.5 0 00-1.093 1.093C2.5 4.4 2.5 5.1 2.5 6.5v7c0 1.4 0 2.1.272 2.635a2.5 2.5 0 001.093 1.092C4.4 17.5 5.1 17.5 6.5 17.5z"})})}function to(e){return jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",fill:"none",viewBox:"0 0 20 20",...e,children:jsx("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.5",d:"M13.333 5v-.667c0-.933 0-1.4-.181-1.756a1.667 1.667 0 00-.729-.729c-.356-.181-.823-.181-1.756-.181H9.333c-.933 0-1.4 0-1.756.181-.314.16-.569.415-.729.729-.181.356-.181.823-.181 1.756V5m1.666 4.583v4.167m3.334-4.167v4.167M2.5 5h15m-1.667 0v9.333c0 1.4 0 2.1-.272 2.635a2.5 2.5 0 01-1.093 1.093c-.534.272-1.235.272-2.635.272H8.167c-1.4 0-2.1 0-2.635-.272a2.5 2.5 0 01-1.093-1.093c-.272-.535-.272-1.235-.272-2.635V5"})})}var gr=cva("inline-flex items-center justify-center whitespace-nowrap rounded-md 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",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),ve=Q.forwardRef(({className:e,variant:t,size:o,asChild:r=!1,...a},i)=>jsx(r?Slot:"button",{className:s(gr({variant:t,size:o,className:e})),ref:i,...a}));ve.displayName="Button";var ro=u.Root,ao=u.Trigger;var Sr=Q.forwardRef(({className:e,inset:t,children:o,...r},a)=>jsxs(u.SubTrigger,{ref:a,className:s("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent",t&&"pl-8",e),...r,children:[o,jsx(ChevronRightIcon,{className:"ml-auto h-4 w-4"})]}));Sr.displayName=u.SubTrigger.displayName;var Cr=Q.forwardRef(({className:e,...t},o)=>jsx(u.SubContent,{ref:o,className:s("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 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=open]:animate-in",e),...t}));Cr.displayName=u.SubContent.displayName;var Ze=Q.forwardRef(({className:e,sideOffset:t=4,...o},r)=>jsx(u.Portal,{children:jsx(u.Content,{ref:r,sideOffset:t,className:s("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md","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 data-[state=closed]:animate-out data-[state=open]:animate-in",e),...o})}));Ze.displayName=u.Content.displayName;var kr=Q.forwardRef(({className:e,inset:t,...o},r)=>jsx(u.Item,{ref:r,className:s("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50",t&&"pl-8",e),...o}));kr.displayName=u.Item.displayName;var Qe=Q.forwardRef(({className:e,children:t,checked:o,...r},a)=>jsxs(u.CheckboxItem,{ref:a,className:s("relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50",e),checked:o,...r,children:[jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:jsx(u.ItemIndicator,{children:jsx(CheckIcon,{className:"h-4 w-4"})})}),t]}));Qe.displayName=u.CheckboxItem.displayName;var Pr=Q.forwardRef(({className:e,children:t,...o},r)=>jsxs(u.RadioItem,{ref:r,className:s("relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50",e),...o,children:[jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:jsx(u.ItemIndicator,{children:jsx(DotFilledIcon,{className:"h-4 w-4 fill-current"})})}),t]}));Pr.displayName=u.RadioItem.displayName;var Nr=Q.forwardRef(({className:e,inset:t,...o},r)=>jsx(u.Label,{ref:r,className:s("px-2 py-1.5 font-semibold text-sm",t&&"pl-8",e),...o}));Nr.displayName=u.Label.displayName;var Mr=Q.forwardRef(({className:e,...t},o)=>jsx(u.Separator,{ref:o,className:s("-mx-1 my-1 h-px bg-muted",e),...t}));Mr.displayName=u.Separator.displayName;function io(){let{hasSomeEntireRow:e,emptySize:t,staticRows:o,columns:r,onInsertNewRow:a,onRemoveRow:i,onColumnVisibilityChange:n}=N(),h=useMemo(()=>r.filter(({visible:v})=>v),[r]),l=useMemo(()=>r.length===h.length,[r.length,h.length]),y="Exibindo todas as colunas",d=`Exibindo ${h.length} de ${r.length} colunas`;return jsxs("div",{className:"sticky top-0 z-50 flex w-full items-center justify-between rounded-t-md border bg-[#EAF5FF] px-4 py-2.5",children:[jsxs("div",{className:"flex items-center gap-6",children:[jsx(ve,{disabled:o,size:"icon",variant:"ghost",onClick:a,className:"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white",children:jsx(Qt,{})}),jsx(ve,{disabled:o||t||!e,size:"icon",variant:"ghost",onClick:i,className:"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white",children:jsx(to,{})})]}),jsxs(ro,{children:[jsx(ao,{asChild:!0,className:"w-56",children:jsxs(ve,{variant:"outline",className:"justify-between px-2",children:[jsx("span",{className:"text-xs",children:l?y:d}),jsx(ChevronDown,{className:"h-4 w-4"})]})}),jsx(Ze,{className:"w-56",children:r.map(({name:v,id:k,alphabetLetter:E,visible:P})=>jsxs(Qe,{checked:P,onCheckedChange:()=>n(k),className:"justify-between text-xs",children:[jsx("span",{children:v}),jsx("span",{className:"text-[10px] text-neutral-500",children:E})]},`spreadsheet__column__dropdown_checkbox__key__${nanoid()}`))})]})]})}function lo(e){let{className:t,...o}=e;return jsx(pt,{...o,children:jsxs(We.Root,{className:t,children:[jsx(io,{}),jsxs(We.Matrix,{children:[jsx(Jt,{className:"absolute z-50"}),jsx(Ct,{}),jsx(qt,{})]})]})})}var xs={Spreadsheet:lo};
|
|
21
|
+
|
|
22
|
+
export { xs as CapLink };
|
|
23
|
+
//# sourceMappingURL=out.js.map
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/spreadsheet/lib/indexed-alphabet.ts","../../src/components/spreadsheet/lib/matrix-output.ts","../../src/components/spreadsheet/lib/date-formatter.ts","../../src/components/spreadsheet/model/spreadsheet.ts","../../src/components/spreadsheet/lib/normalize-value.ts","../../src/components/spreadsheet/model/matrix.ts","../../src/components/spreadsheet/ui/context.tsx","../../src/components/spreadsheet/lib/use-spreadsheet.ts","../../src/shared/lib/cn.ts","../../src/components/spreadsheet/ui/containers/matrix.tsx","../../src/components/spreadsheet/ui/containers/root.tsx","../../src/components/spreadsheet/ui/containers/index.ts","../../src/components/spreadsheet/ui/indicators/drag-indicator.tsx","../../src/components/spreadsheet/ui/indicators/column-indicator.tsx","../../src/components/spreadsheet/ui/icons/integer-icon.tsx","../../src/shared/ui/tooltip.tsx","../../src/components/spreadsheet/ui/indicators/column-title-indicator.tsx","../../src/components/spreadsheet/ui/indicators/corner-indicator.tsx","../../src/components/spreadsheet/ui/header.tsx","../../src/shared/ui/select.tsx","../../src/components/spreadsheet/ui/data-editor/boolean.tsx","../../src/components/spreadsheet/ui/data-editor/date.tsx","../../src/components/tmp/numeric.tsx","../../src/components/spreadsheet/ui/data-editor/numeric.tsx","../../src/components/spreadsheet/ui/data-editor/select.tsx","../../src/shared/lib/move-input-cursor-to-end.ts","../../src/shared/lib/read-text-from-clipboard.ts","../../src/components/spreadsheet/ui/data-editor/text.tsx","../../src/components/spreadsheet/ui/data-editor/index.tsx","../../src/components/spreadsheet/ui/cell.tsx","../../src/components/spreadsheet/ui/indicators/row-indicator.tsx","../../src/components/spreadsheet/ui/rows.tsx","../../src/components/spreadsheet/ui/start.tsx","../../src/components/spreadsheet/ui/icons/add-row-icon.tsx","../../src/components/spreadsheet/ui/icons/remove-row-icon.tsx","../../src/shared/ui/button.tsx","../../src/shared/ui/dropdown-menu.tsx","../../src/components/spreadsheet/ui/toolbar.tsx","../../src/components/spreadsheet/ui/index.tsx","../../src/index.ts"],"names":["indexedAlphabet","columns","asciiA","remainder","quotient","matrixConverter","params","matrix","rowValue","columnValue","column","dataEditorType","selectItems","newColumn","dateFormatter","value","NUMERIC_DATA_EDITOR_TYPES","normalizeValue","createEmpty","size","fill","getRowsCount","getColumnsCount","firstRow","getSize","hasPointInRange","pointRange","point","hasEntireColumns","hasEntireRows","row","parseString","overlap","mA","mB","mASize","mBSize","fillRows","fillColumns","rows","mC","y","x","nanoid","createContext","useCallback","useEffect","useMemo","useState","jsx","timeoutId","SpreadsheetContext","SpreadsheetContextProvider","props","children","startingColumns","startingMatrix","staticRows","onMatrixChange","setMatrix","setColumns","setupColumns","setPointRange","containerDimensions","setContainerDimensions","highlightLastRow","setHighlightLastRow","highlight","ms","columnsCount","emptySize","hasSomeEntireRow","onConvertedMatrixChange","newMatrix","onPaste","state","nextColumns","nextMatrix","onChange","data","onRemoveRow","rowStart","rowEnd","delta","confirmedMessage","index","onSelectRow","event","normalizedStart","normalizedEnd","onSelectCell","isCellSelected","onColumnResize","columnId","width","newWidth","previous","onInsertNewRow","onSelectSpreadsheet","start","end","onColumnVisibilityChange","useContext","useSpreadsheet","context","clsx","twMerge","cn","inputs","useRef","Matrix","className","containerRef","height","containerElement","resizeObserver","entries","entry","useClickAway","Root","rootRef","Container","jsxs","DragIndicator","rest","ColumnIndicator","id","position","visible","alphabetLetter","rulerIndicatorRef","rulerIndicatorHeight","dragging","setDragging","startClientX","setStartClientX","clientX","setClientX","difference","onDragStart","e","onDrag","rulerIndicatorElement","onDragEnd","nextWidth","createClassName","columnInRange","rulerIndicatorToPx","dragEventListeners","IntegerIcon","TooltipPrimitive","React","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","sideOffset","ref","QuestionMarkCircledIcon","TextIcon","CalendarIcon","CopyCheckIcon","DivideIcon","DollarSignIcon","ListTodoIcon","PercentIcon","ColumnTitleIndicator","name","description","CornerIndicator","Header","CaretSortIcon","CheckIcon","ChevronDownIcon","ChevronUpIcon","SelectPrimitive","Select","SelectValue","SelectTrigger","SelectScrollUpButton","SelectScrollDownButton","SelectContent","SelectLabel","SelectItem","SelectSeparator","BooleanDataEditor","onBlur","_onPaste","BooleanDataViewer","DateDataEditor","DateDataViewer","formatter","formatted","NumericFormat","NumericField","onFocus","onClick","settings","testid","disabled","dataCypress","tabIndex","thousandSeparator","decimalSeparator","decimalScale","getDecimalScale","allowNegative","min","max","prefix","suffix","strValue","setStrValue","waitCapToOnBlur","setWaitCapToOnBlur","onValueChange","_onBlur","numValue","newStrValue","percentageScaleToBeDisregarded","newDecimalScale","NumericEditor","setMode","NumericDataViewer","SelectDataEditor","items","text","SelectDataViewer","selected","item","displayValue","moveInputCursorToEnd","element","PLAIN_TEXT_MIME","readTextFromClipboard","CHAR_WIDTH","INPUT_MAX_LENGTH","TextDataEditor","valueAsString","textareaRef","textareaHeight","setTextareaHeight","overflow","charOverflow","clipboard","oneLineString","updateTextareaHeight","scrollHeight","_onChange","TextDataViewer","string","regex","DataEditor","DataViewer","Cell","coordinates","readonly","mode","dataEditorContainerRef","common","dataEditorElementMap","dataViewerElementMap","dataEditorElement","dataViewerElement","enterEditMode","enterKey","RowIndicator","isRowInRange","isEntireRowSelected","useId","Rows","Start","AddRowIcon","RemoveRowIcon","Slot","cva","buttonVariants","Button","variant","asChild","DropdownMenuPrimitive","ChevronRightIcon","DotFilledIcon","DropdownMenu","DropdownMenuTrigger","DropdownMenuSubTrigger","inset","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","ChevronDown","Toolbar","visibleColumns","allVisible","allVisibleLabel","visibleColumnsLabel","Spreadsheet","CapLink"],"mappings":"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","sourcesContent":["export function indexedAlphabet(columns: number): string {\n if (columns <= 0) {\n return '';\n }\n\n const asciiA = 'A'.charCodeAt(0);\n const remainder = (columns - 1) % 26;\n const quotient = Math.floor((columns - 1) / 26);\n\n return indexedAlphabet(quotient) + String.fromCharCode(asciiA + remainder);\n}\n","import type { Matrix } from '@/src/components/spreadsheet/model/matrix';\nimport type { Column, DataEditorType } from '@/src/components/spreadsheet/model/spreadsheet';\n\nexport namespace MatrixConverter {\n export type Input = {\n columns: Column[];\n matrix: Matrix<unknown>;\n };\n\n export type Output = {\n value: unknown;\n dataEditorType: DataEditorType;\n convertedValue?: {\n Boolean?: boolean;\n Integer?: number;\n Currency?: number;\n Decimal?: number;\n Float?: number;\n Percentage?: number;\n Date?: number;\n Select?: string;\n };\n };\n}\n\nexport function matrixConverter(params: MatrixConverter.Input): MatrixConverter.Output[][] {\n const { columns, matrix } = params;\n\n return matrix.map((rowValue) =>\n rowValue.map((columnValue, column) => {\n const dataEditorType = columns[column].dataEditorType;\n const selectItems = columns[column].settings?.select?.items || [];\n\n const newColumn: MatrixConverter.Output = { value: columnValue, dataEditorType };\n\n if (dataEditorType === 'Boolean') {\n newColumn.convertedValue = { Boolean: JSON.parse(columnValue as string) };\n }\n\n if (dataEditorType === 'Integer') {\n newColumn.convertedValue = { Integer: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Currency') {\n newColumn.convertedValue = { Currency: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Decimal') {\n newColumn.convertedValue = { Decimal: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Float') {\n newColumn.convertedValue = { Float: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Percentage') {\n newColumn.convertedValue = { Percentage: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Date') {\n newColumn.convertedValue = { Date: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Select') {\n newColumn.convertedValue = { Select: columnValue as string };\n }\n\n return newColumn;\n }),\n );\n}\n","export function dateFormatter(value: string) {\n try {\n if (value.includes('/'))\n return new Date(value.split('/').reverse().join('-'))\n .toISOString()\n .split('T')[0]\n .replace('+', '');\n\n return new Date(value).toISOString().split('T')[0].replace('+', '');\n } catch (error) {\n return null;\n }\n}\n","import type { MatrixConverter } from '@/src/components/spreadsheet/lib/matrix-output';\nimport type * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport type { MouseEvent, PropsWithChildren } from 'react';\n\n/** Spreadsheet column initial width */\nexport const COLUMN_INITIAL_WIDTH = 160;\n/** Spreadsheet column max width */\nexport const COLUMN_MAX_WIDTH = 320;\n/** Spreadsheet column min width */\nexport const COLUMN_MIN_WIDTH = 160;\n\n/** Spreadsheet column title initial height */\nexport const COLUMN_TITLE_INITIAL_HEIGHT = 36;\n/** Spreadsheet cell initial height */\nexport const CELL_INITIAL_HEIGHT = 26;\n\nexport const NUMERIC_DATA_EDITOR_TYPES: DataEditorType[] = [\n 'Decimal',\n 'Float',\n 'Integer',\n 'Percentage',\n 'Currency',\n];\n\n/** Dimensions of an element */\nexport type Dimensions = {\n /** The element's width in pixels */\n width: number;\n /** The element's height in pixels */\n height: number;\n};\n\n/** Select component item props */\nexport type SelectItem = { text: string; value: string };\n\n/** The mode of the cell */\nexport type Mode = 'edit' | 'readonly' | 'view';\n\n/** Cell data editor type */\nexport type DataEditorType =\n | 'Boolean'\n | 'String'\n | 'Select'\n | 'Date'\n | 'Integer'\n | 'Currency'\n | 'Float'\n | 'Decimal'\n | 'Percentage';\n\nexport type DataEditor = {\n /** Data editor current value */\n value?: unknown;\n /** Whether data editor data changes */\n onChange?: ({ data, point }: { data: unknown; point?: Matrix.Point }) => void;\n /** Whether user paste any value on data editor */\n onPaste?: (point?: Matrix.Point) => void;\n /** Whether user blur current data editor */\n onBlur?: () => void;\n /** Whether user clicks current data editor */\n onClick?: <T>(e: MouseEvent<T>) => void;\n /** Cell mode setter */\n setMode?: (mode: Mode) => void;\n\n selected?: boolean;\n\n column: Column;\n};\n\nexport type DataViewer = {\n /** Data viewer current value */\n value?: unknown;\n column: Column;\n\n selected?: boolean;\n};\n\n/** Spreadsheet column meta data and settings */\nexport type Column = {\n /** Column identifier */\n id: string;\n /** Column name to be displayed */\n name: string;\n /** Column tooltip description */\n description?: string;\n /** Column width */\n width: number;\n /** Whether column is visible to user */\n visible?: boolean;\n /** Column position */\n position: number;\n /** Column data editor type */\n dataEditorType: DataEditorType;\n /** Alphabet letter by position */\n alphabetLetter?: string;\n /** Whether column is readonly to user */\n readonly?: boolean;\n\n /** Column settings */\n settings?: {\n select?: {\n items: Array<SelectItem>;\n };\n\n numeric?: {\n min?: number;\n max?: number;\n allowNegative?: boolean;\n roundingRule?: string;\n decimalPlaces?: number;\n currency?: string;\n };\n\n string?: {\n maskData?: string;\n maskVisible?: boolean;\n charLimit?: string;\n };\n };\n};\n\n/** Initial column params before spreadsheet internal setup */\nexport type InitialColumn = Pick<\n Column,\n Exclude<keyof Column, 'id' | 'alphabetLetter' | 'position' | 'width'>\n> & {\n width?: number;\n};\n\n/** Spreadsheet Cell component */\nexport type Cell = {\n /** The cell value */\n value?: unknown;\n /** Point coordinates of the cell */\n coordinates: Matrix.Point;\n};\n\nexport type Props = {\n matrix: Matrix.Matrix<unknown>;\n onMatrixChange?: (matrix: MatrixConverter.Output[][]) => void;\n startingColumns: InitialColumn[];\n /** Defines if user can add or delete rows */\n staticRows?: boolean;\n className?: string;\n};\n\nexport type Context = {\n size: Matrix.Size;\n matrix: Matrix.Matrix<unknown>;\n columns: Column[];\n emptySize: boolean;\n /** Defines if user can add or delete rows */\n staticRows?: boolean;\n hasSomeEntireRow?: boolean;\n /** Whether last row is highlighted */\n highlightLastRow?: boolean;\n\n pointRange: Matrix.PointRange | null;\n setPointRange: (pointRange: Matrix.PointRange | null) => void;\n\n containerDimensions: Dimensions;\n setContainerDimensions: (dimensions: Dimensions) => void;\n\n onPaste: (point: Matrix.Point) => void;\n onChange: (params: { data: unknown; point: Matrix.Point }) => void;\n onRemoveRow: () => void;\n onSelectRow: (row: number, event?: MouseEvent) => void;\n onSelectCell: (point: Matrix.Point) => void;\n isCellSelected: (point: Matrix.Point) => boolean;\n onInsertNewRow: () => void;\n onColumnResize: (params: { width: number; columnId: string }) => void;\n onSelectSpreadsheet: () => void;\n onColumnVisibilityChange: (columnId: string) => void;\n};\n\nexport type ContextProvider = Omit<PropsWithChildren<Props>, 'className'>;\n","import { dateFormatter } from '@/src/components/spreadsheet/lib/date-formatter';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\n\nexport function normalizeValue(params: {\n value: unknown;\n dataEditorType: Spreadsheet.DataEditorType;\n}) {\n const { value, dataEditorType } = params;\n\n if (dataEditorType === 'Date') {\n return dateFormatter(value as string) || '';\n }\n\n if (dataEditorType === 'Boolean') {\n return value === true ? 'true' : 'false';\n }\n\n const isNumeric = Spreadsheet.NUMERIC_DATA_EDITOR_TYPES.includes(dataEditorType);\n\n if (isNumeric) {\n return Number.isNaN(Number(value)) ? '' : value;\n }\n\n return value;\n}\n","/** A cell cordinates in matrix */\nexport type Point = {\n row: number;\n column: number;\n};\n\n/** Range between two points. */\nexport type PointRange = {\n /** The top-left point */\n start: Point;\n /** The bottom-right point */\n end: Point;\n};\n\n/** Counts of the rows and column in a matrix */\nexport type Size = {\n /** Count of the rows in the matrix */\n rows: number;\n /** Count of the columns in the matrix */\n columns: number;\n};\n\nexport type Matrix<T> = Array<Array<T | undefined>>;\n\n/** Creates an empty matrix with given rows and columns */\nexport function createEmpty<T>(size: Size, fill?: T): Matrix<T> {\n return new Array(size.rows).fill(undefined).map(() => new Array(size.columns).fill(fill));\n}\n\n/** Gets the count of rows of given matrix */\nexport function getRowsCount(matrix: Matrix<unknown>) {\n return matrix?.length;\n}\n\n/** Gets the count of columns of given matrix */\nexport function getColumnsCount(matrix: Matrix<unknown>) {\n const firstRow = matrix?.[0];\n return firstRow ? firstRow.length : 0;\n}\n\n/** Gets the count of rows and columns of given matrix */\nexport function getSize(matrix: Matrix<unknown>): Size {\n return {\n columns: getColumnsCount(matrix),\n rows: getRowsCount(matrix),\n };\n}\n\n/** Gets the value at row and column of matrix. */\nexport function getPoint<T>(params: { point: Point; matrix: Matrix<T> }) {\n const { point, matrix } = params;\n\n const columns = matrix[point.row];\n\n if (columns === undefined) {\n return undefined;\n }\n\n return columns[point.column];\n}\n\n/** Checks if the source and target point are equal */\nexport function isSamePoint(source: Point, target: Point) {\n return source.column === target.column && source.row === target.row;\n}\n\n/** Returns whether given point exists in given range */\nexport function hasPointInRange(pointRange: PointRange, point: Point): boolean {\n return (\n point.row >= pointRange.start.row &&\n point.column >= pointRange.start.column &&\n point.row <= pointRange.end.row &&\n point.column <= pointRange.end.column\n );\n}\n\n/** Determines whether all columns are selected */\nexport function hasEntireColumns(params: { matrix: Matrix<unknown>; pointRange: PointRange }) {\n const { matrix, pointRange } = params;\n return pointRange.start.column === 0 && pointRange.end.column === getColumnsCount(matrix);\n}\n\n/** Determines which row is entirely selected in given selection */\nexport function hasEntireRows(params: {\n matrix: Matrix<unknown>;\n pointRange: PointRange;\n row: number;\n}) {\n const { matrix, pointRange, row } = params;\n return (\n row >= pointRange.start.row &&\n row <= pointRange.end.row &&\n hasEntireColumns({ matrix, pointRange })\n );\n}\n\n/** Converts string value into an matrix */\nexport function parseString(value: string): Matrix<unknown> {\n return value.split('\\n').map((row) => row.split('\\t'));\n}\n\n/**\n * Overlaps a given Matrix B (mB) starting in a specific point into a given Matrix A (mA)\n * Matrix B (mB) always has priority when replacing cell values\n */\nexport function overlap(params: {\n mA: Matrix<unknown>;\n mB: Matrix<unknown>;\n point: Point;\n}): Matrix<unknown> {\n const { mA, mB, point = { column: 0, row: 0 } } = params;\n\n const mASize = getSize(mA);\n const mBSize = getSize(mB);\n\n const fillRows = point.row + mBSize.rows > mASize.rows;\n const fillColumns = point.column + mBSize.columns > mBSize.columns;\n\n const rows = fillRows ? point.row + mBSize.rows : mASize.rows;\n const columns = fillColumns ? point.column + mBSize.columns : mASize.columns;\n\n const mC = createEmpty({ rows, columns });\n\n for (let y = 0; y < mASize.rows; y += 1) {\n for (let x = 0; x < mASize.columns; x += 1) {\n mC[y][x] = mA[y][x];\n }\n }\n\n for (let y = 0; y < mBSize.rows; y += 1) {\n for (let x = 0; x < mBSize.columns; x += 1) {\n mC[y + point.row][x + point.column] = mB[y][x];\n }\n }\n\n return mC;\n}\n","import { indexedAlphabet } from '@/src/components/spreadsheet/lib/indexed-alphabet';\nimport { matrixConverter } from '@/src/components/spreadsheet/lib/matrix-output';\nimport { normalizeValue } from '@/src/components/spreadsheet/lib/normalize-value';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport {\n COLUMN_INITIAL_WIDTH,\n COLUMN_MAX_WIDTH,\n COLUMN_MIN_WIDTH,\n type Column,\n type Dimensions,\n type InitialColumn,\n} from '@/src/components/spreadsheet/model/spreadsheet';\nimport { nanoid } from 'nanoid';\nimport { type MouseEvent, createContext, useCallback, useEffect, useMemo, useState } from 'react';\n\nlet timeoutId: ReturnType<typeof setTimeout>;\n\nexport const SpreadsheetContext = createContext<Spreadsheet.Context | null>(null);\n\nexport function SpreadsheetContextProvider(props: Spreadsheet.ContextProvider) {\n const {\n children,\n startingColumns,\n matrix: startingMatrix = [],\n staticRows,\n onMatrixChange,\n } = props;\n\n const [matrix, setMatrix] = useState(startingMatrix);\n const [columns, setColumns] = useState<Column[]>(() => setupColumns(startingColumns));\n const [pointRange, setPointRange] = useState<Matrix.PointRange | null>(null);\n const [containerDimensions, setContainerDimensions] = useState<Dimensions>({\n height: 0,\n width: 0,\n });\n\n const [highlightLastRow, setHighlightLastRow] = useState(false);\n\n /** Function called to highlight when user add a new row */\n const highlight = useCallback((ms = 2000) => {\n setHighlightLastRow(true);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => setHighlightLastRow(false), ms);\n }, []);\n\n const columnsCount = useMemo(\n () => Matrix.getColumnsCount(matrix) || columns.length,\n [matrix, columns.length],\n );\n const size = useMemo(() => Matrix.getSize(matrix), [matrix]);\n const emptySize = useMemo(() => size.rows === 0, [size.rows]);\n\n const hasSomeEntireRow = useMemo(\n () => !!(pointRange && Matrix.hasEntireColumns({ matrix, pointRange })),\n [pointRange, matrix],\n );\n\n const onConvertedMatrixChange = useCallback(\n (matrix: Matrix.Matrix<unknown>) => {\n if (onMatrixChange) {\n const newMatrix = matrixConverter({ columns, matrix });\n onMatrixChange(newMatrix);\n }\n },\n [onMatrixChange, columns],\n );\n\n const onPaste = useCallback(\n async (point: Matrix.Point) => {\n const { state } = await navigator.permissions.query({\n name: 'clipboard-read' as PermissionName,\n });\n\n if (state === 'denied') {\n console.log('denied');\n return;\n }\n\n const value = await navigator.clipboard.readText();\n\n const mB = Matrix.parseString(value);\n\n /** Overlaps mA and mB, also prevent putting values in readonly columns */\n const overlapped = Matrix.overlap({ mA: matrix, mB, point }).map((row) =>\n row.map((columnValue, column) => (columns[column]?.readonly ? '' : columnValue)),\n );\n\n const normalized = overlapped.map((row) =>\n row.map((columnValue, column) =>\n normalizeValue({ value: columnValue, dataEditorType: columns[column]?.dataEditorType }),\n ),\n );\n\n const nextColumns = normalized.map((row) => row.slice(0, startingColumns.length));\n const nextMatrix = staticRows ? nextColumns.slice(0, matrix.length) : nextColumns;\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n },\n [columns, matrix, startingColumns.length, onConvertedMatrixChange, staticRows],\n );\n\n const onChange = useCallback(\n (params: { data: unknown; point: Matrix.Point }) => {\n const { data, point } = params;\n const { column, row } = point;\n\n const nextMatrix = structuredClone(matrix);\n nextMatrix[row][column] = data;\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n },\n [matrix, onConvertedMatrixChange],\n );\n\n const onRemoveRow = useCallback(() => {\n if (pointRange && !staticRows) {\n const rowStart = pointRange.start.row;\n const rowEnd = pointRange.end.row;\n const delta = rowEnd - rowStart + 1;\n\n if (!hasSomeEntireRow) return;\n\n const confirmedMessage =\n delta > 1\n ? `Você irá excluir ${delta} linhas, deseja continuar?\\nLinha N° ${rowStart + 1} até N° ${\n rowEnd + 1\n }`\n : `Você irá excluir a linha N° ${rowStart + 1}, deseja continuar?`;\n\n const confirmed = confirm(confirmedMessage);\n\n if (!confirmed) return;\n\n const nextMatrix = matrix.filter((row, index) => index < rowStart || index > rowEnd);\n\n setPointRange(null);\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n }\n }, [matrix, pointRange, staticRows, hasSomeEntireRow, onConvertedMatrixChange]);\n\n const onSelectRow = useCallback(\n (row: number, event?: MouseEvent) => {\n if (pointRange && event && event.shiftKey) {\n const normalizedStart = row < pointRange.start.row ? row : pointRange.start.row;\n const normalizedEnd = row < pointRange.start.row ? pointRange.start.row : row;\n\n const newPointRange: Matrix.PointRange = {\n start: { row: normalizedStart, column: 0 },\n end: { row: normalizedEnd, column: columnsCount },\n };\n\n return setPointRange(newPointRange);\n }\n\n setPointRange({ start: { row, column: 0 }, end: { row, column: columnsCount } });\n },\n [columnsCount, pointRange],\n );\n\n const onSelectCell = useCallback(\n (point: Matrix.Point) => {\n if (point.row === pointRange?.start.row && point.column === pointRange.start.column) return;\n setPointRange({ start: point, end: point });\n },\n [pointRange?.start.row, pointRange?.start.column],\n );\n\n const isCellSelected = useCallback(\n (point: Matrix.Point) => {\n return !!(pointRange && Matrix.hasPointInRange(pointRange, point));\n },\n [pointRange],\n );\n\n const onColumnResize = useCallback((params: { width: number; columnId: string }) => {\n const { columnId, width } = params;\n\n let newWidth = width;\n\n if (width > COLUMN_MAX_WIDTH) {\n newWidth = COLUMN_MAX_WIDTH;\n }\n\n if (width < COLUMN_MIN_WIDTH) {\n newWidth = COLUMN_MIN_WIDTH;\n }\n\n /** When X matches the column to be resized, it returns new width,\n * otherwise returns previous column value */\n setColumns((previous) =>\n previous.map((column) => (column.id === columnId ? { ...column, width: newWidth } : column)),\n );\n }, []);\n\n const onInsertNewRow = useCallback(() => {\n if (staticRows) return;\n\n const nextMatrix = [...structuredClone(matrix), new Array(columnsCount).fill('')];\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n\n highlight();\n }, [staticRows, matrix, columnsCount, highlight, onConvertedMatrixChange]);\n\n const onSelectSpreadsheet = useCallback(() => {\n const start: Matrix.Point = { column: 0, row: 0 };\n const end: Matrix.Point = { column: size.columns, row: size.rows - 1 };\n setPointRange({ start, end });\n }, [size]);\n\n const onColumnVisibilityChange = useCallback((columnId: string) => {\n setColumns((previous) =>\n previous.map((column) =>\n column.id === columnId ? { ...column, visible: !column.visible } : column,\n ),\n );\n }, []);\n\n useEffect(() => {\n setMatrix(startingMatrix);\n }, [startingMatrix]);\n\n useEffect(() => {\n setColumns(() => setupColumns(startingColumns));\n }, [startingColumns]);\n\n const value: Spreadsheet.Context = useMemo(\n () => ({\n size,\n matrix,\n columns,\n emptySize,\n staticRows,\n hasSomeEntireRow,\n highlightLastRow,\n\n pointRange,\n setPointRange,\n\n containerDimensions,\n setContainerDimensions,\n\n onPaste,\n onChange,\n onRemoveRow,\n onSelectRow,\n onSelectCell,\n isCellSelected,\n onInsertNewRow,\n onColumnResize,\n onSelectSpreadsheet,\n onColumnVisibilityChange,\n }),\n [\n size,\n matrix,\n columns,\n emptySize,\n staticRows,\n hasSomeEntireRow,\n highlightLastRow,\n\n pointRange,\n containerDimensions,\n\n onPaste,\n onChange,\n onRemoveRow,\n onSelectRow,\n onSelectCell,\n isCellSelected,\n onInsertNewRow,\n onColumnResize,\n onSelectSpreadsheet,\n onColumnVisibilityChange,\n ],\n );\n\n return <SpreadsheetContext.Provider value={value}>{children}</SpreadsheetContext.Provider>;\n}\n\n/** Spreadsheet columns internal states and values setup function */\nfunction setupColumns(columns: InitialColumn[]): Column[] {\n return columns.map((column, index) => ({\n ...column,\n id: `spreadsheet__column__id__${nanoid()}`,\n alphabetLetter: indexedAlphabet(index + 1),\n position: index,\n width: column.width || COLUMN_INITIAL_WIDTH,\n visible: true,\n }));\n}\n","import { SpreadsheetContext } from '@/src/components/spreadsheet/ui/context';\nimport { useContext } from 'react';\n\nexport function useSpreadsheet() {\n const context = useContext(SpreadsheetContext);\n\n if (!context) {\n throw new Error('useSpreadsheet has to be used within <SpreadsheetContext.Provider>');\n }\n\n return context;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type PropsWithChildren, useEffect, useMemo, useRef } from 'react';\n\ntype MatrixProps = PropsWithChildren<{\n className?: string;\n}>;\n\nexport function Matrix(props: MatrixProps) {\n const { children, className } = props;\n const { size, staticRows, setContainerDimensions } = useSpreadsheet();\n\n const containerRef = useRef<null | HTMLDivElement>(null);\n\n const height = useMemo(\n () => size.rows * Spreadsheet.CELL_INITIAL_HEIGHT + Spreadsheet.COLUMN_TITLE_INITIAL_HEIGHT,\n [size.rows],\n );\n\n useEffect(() => {\n const containerElement = containerRef.current;\n\n if (!containerElement) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n setContainerDimensions({ height, width });\n }\n });\n\n resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setContainerDimensions]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'relative w-full border border-t-0 border-r-0',\n size.rows >= 7 ? 'border-b-0' : 'border-b',\n staticRows ? `${height}px border-b-0` : 'min-h-[260px]',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { type PropsWithChildren, useRef } from 'react';\nimport { useClickAway } from 'react-use';\n\nimport { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\ntype RootProps = PropsWithChildren<{\n className?: string;\n}>;\n\nexport function Root(props: RootProps) {\n const { children, className } = props;\n const { setPointRange } = useSpreadsheet();\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n useClickAway(rootRef, () => setPointRange(null));\n\n return (\n <div ref={rootRef} className={cn('min-w-[640px]', className)}>\n {children}\n </div>\n );\n}\n","import { Matrix } from '@/src/components/spreadsheet/ui/containers/matrix';\nimport { Root } from '@/src/components/spreadsheet/ui/containers/root';\n\nexport const Container = {\n Matrix,\n Root,\n};\n","import { cn } from '@/src/shared/lib/cn';\nimport type { DragEvent } from 'react';\n\ntype DragIndicatorProps = {\n\tonDragStart?: (e: DragEvent<HTMLButtonElement>) => void;\n\tonDrag?: (e: DragEvent<HTMLButtonElement>) => void;\n\tonDragEnd?: (e: DragEvent<HTMLButtonElement>) => void;\n\n\tclassName?: string;\n};\n\nexport function DragIndicator(props: DragIndicatorProps) {\n\tconst { className, ...rest } = props;\n\n\treturn (\n\t\t<button\n\t\t\tdraggable\n\t\t\tclassName={cn(\n\t\t\t\t'h-9 w-1.5 cursor-col-resize rounded-sm bg-neutral-400 drop-shadow-md',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<div className=\"relative\">\n\t\t\t\t<span className=\"-translate-y-1/2 absolute top-1/2 right-2.5 h-3 w-1 rounded-full bg-neutral-300\" />\n\t\t\t\t<span className=\"-translate-y-1/2 absolute top-1/2 left-2.5 h-3 w-1 rounded-full bg-neutral-300\" />\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { DragIndicator } from '@/src/components/spreadsheet/ui/indicators/drag-indicator';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n type DragEvent,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ntype ColumnIndicatorProps = PropsWithChildren<{\n className?: string;\n column: Spreadsheet.Column;\n}>;\n\nexport function ColumnIndicator(props: ColumnIndicatorProps) {\n const { className, column, children } = props;\n const { id, width, position, visible, alphabetLetter } = column;\n\n const { matrix, pointRange, containerDimensions, onColumnResize } = useSpreadsheet();\n\n const rulerIndicatorRef = useRef<HTMLDivElement | null>(null);\n const rulerIndicatorHeight = useMemo(\n () => (containerDimensions?.height || 0) + 32,\n [containerDimensions?.height],\n );\n\n const [dragging, setDragging] = useState(false);\n const [startClientX, setStartClientX] = useState(0);\n const [clientX, setClientX] = useState(0);\n\n const difference = useMemo(\n () => (dragging ? clientX - startClientX : 0),\n [dragging, clientX, startClientX],\n );\n\n const onDragStart = useCallback((e: DragEvent<HTMLButtonElement>) => {\n setStartClientX(e.clientX);\n setDragging(true);\n }, []);\n\n const onDrag = useCallback(\n (e: DragEvent<HTMLButtonElement>) => {\n const rulerIndicatorElement = rulerIndicatorRef.current;\n\n if (!rulerIndicatorElement) return;\n\n const difference = e.clientX - startClientX;\n\n let newWidth = width + difference;\n\n if (newWidth > Spreadsheet.COLUMN_MAX_WIDTH) newWidth = Spreadsheet.COLUMN_MAX_WIDTH;\n if (newWidth < Spreadsheet.COLUMN_MIN_WIDTH) newWidth = Spreadsheet.COLUMN_MIN_WIDTH;\n\n rulerIndicatorElement.style.left = `${newWidth}px`;\n\n setClientX(e.clientX);\n },\n [startClientX, width],\n );\n\n const onDragEnd = useCallback(\n (e: DragEvent<HTMLButtonElement>) => {\n const difference = e.clientX - startClientX;\n const nextWidth = width + difference;\n onColumnResize({ width: nextWidth, columnId: id });\n setDragging(false);\n },\n [startClientX, width, id, onColumnResize],\n );\n\n const createClassName = useCallback(() => {\n if (dragging) return `bg-neutral-100 font-bold text-neutral-700 ${className}`;\n\n if (pointRange && !dragging) {\n const { start, end } = pointRange;\n\n const hasEntireColumns = Matrix.hasEntireColumns({ matrix, pointRange });\n const columnInRange = position >= start.column && position <= end.column;\n\n if (hasEntireColumns) return `bg-[#0085FF] font-bold text-white ${className}`;\n\n if (columnInRange) return `bg-blue-100 font-bold text-blue-700 ${className}`;\n }\n\n return className;\n }, [dragging, className, matrix, pointRange, position]);\n\n const rulerIndicatorToPx = useCallback(() => {\n let newWidth = width + difference;\n\n if (newWidth > Spreadsheet.COLUMN_MAX_WIDTH) newWidth = Spreadsheet.COLUMN_MAX_WIDTH;\n if (newWidth < Spreadsheet.COLUMN_MIN_WIDTH) newWidth = Spreadsheet.COLUMN_MIN_WIDTH;\n\n return `${newWidth}px`;\n }, [width, difference]);\n\n const dragEventListeners = useMemo(\n () => ({ onDragStart, onDrag, onDragEnd }),\n [onDragStart, onDrag, onDragEnd],\n );\n\n useEffect(() => {\n const rulerIndicatorElement = rulerIndicatorRef.current;\n\n if (!rulerIndicatorElement) return;\n\n rulerIndicatorElement.style.left = `${width}px`;\n }, [width]);\n\n if (!visible) return null;\n\n return (\n <div\n style={{ width }}\n className={cn(\n 'relative flex h-7 w-32 shrink-0 items-center justify-center border border-t-0 border-l-0 text-[#8E8EA9] text-xs',\n createClassName(),\n )}\n >\n <DragIndicator\n {...dragEventListeners}\n className={cn(\n '-right-[3px] -top-1 absolute z-50 opacity-0 hover:opacity-100',\n dragging && 'opacity-0',\n )}\n />\n\n <div\n ref={rulerIndicatorRef}\n style={{ height: rulerIndicatorHeight }}\n className={cn(\n '-top-4 pointer-events-none absolute z-50 h-full w-1.5 rounded-full bg-blue-400 shadow-lg outline outline-sky-100',\n dragging ? 'opacity-100' : 'opacity-0',\n )}\n >\n <span className=\"-translate-y-1/2 relative top-8 left-4 z-50 select-none rounded-md border bg-white p-1 font-semibold drop-shadow-md\">\n {rulerIndicatorToPx()}\n </span>\n </div>\n\n <span>{children || alphabetLetter}</span>\n </div>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function IntegerIcon(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\tstroke=\"currentColor\"\n\t\t\tfill=\"currentColor\"\n\t\t\tstrokeWidth=\"0\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path d=\"M13.003 7.754a.75.75 0 0 1 .75-.75h5.232a.75.75 0 0 1 .53 1.28l-2.776 2.777c.55.097 1.057.253 1.492.483.905.477 1.504 1.284 1.504 2.418 0 .966-.471 1.75-1.172 2.27-.687.511-1.587.77-2.521.77-1.367 0-2.274-.528-2.667-.756a.75.75 0 0 1 .755-1.297c.331.193.953.553 1.912.553.673 0 1.243-.188 1.627-.473.37-.275.566-.635.566-1.067 0-.5-.219-.836-.703-1.091-.538-.284-1.375-.443-2.471-.443a.75.75 0 0 1-.53-1.28l2.643-2.644h-3.421a.75.75 0 0 1-.75-.75ZM7.88 15.215a1.4 1.4 0 0 0-1.446.83.75.75 0 0 1-1.37-.61 2.899 2.899 0 0 1 2.986-1.71c.589.06 1.139.323 1.557.743.434.446.685 1.058.685 1.778 0 1.641-1.254 2.437-2.12 2.986-.538.341-1.18.694-1.495 1.273H9.75a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75c0-1.799 1.337-2.63 2.243-3.21 1.032-.659 1.55-1.031 1.55-1.8 0-.355-.116-.584-.26-.732a1.071 1.071 0 0 0-.652-.298Zm.234-13.121a.75.75 0 0 1 .386.656V9h1.252a.75.75 0 0 1 0 1.5H5.75a.75.75 0 0 1 0-1.5H7V4.103l-.853.533a.749.749 0 1 1-.795-1.272l2-1.25a.749.749 0 0 1 .762-.02Z\"></path>\n\t\t</svg>\n\t);\n}\n","'use client';\n\nimport { cn } from '@/src/shared/lib/cn';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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 z-50 animate-in overflow-hidden rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs data-[state=closed]:animate-out',\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { IntegerIcon } from '@/src/components/spreadsheet/ui/icons/integer-icon';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/src/shared/ui/tooltip';\nimport { QuestionMarkCircledIcon, TextIcon } from '@radix-ui/react-icons';\nimport {\n CalendarIcon,\n CopyCheckIcon,\n DivideIcon,\n DollarSignIcon,\n ListTodoIcon,\n PercentIcon,\n} from 'lucide-react';\n\nexport function ColumnTitleIndicator({ column }: { column: Spreadsheet.Column }) {\n const { width, name, visible, dataEditorType, description } = column;\n\n if (!visible) return null;\n\n return (\n <div\n className=\"flex h-9 w-32 shrink-0 items-center border border-t-0 border-l-0 bg-[#F6F6F9] px-2\"\n style={{\n width,\n height: Spreadsheet.COLUMN_TITLE_INITIAL_HEIGHT,\n }}\n >\n <div className=\"mr-2 w-4 shrink-0 text-[#8E8EA9]\">\n {dataEditorType === 'String' && <TextIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Date' && <CalendarIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Boolean' && <CopyCheckIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Select' && <ListTodoIcon className=\"h-4 w-4\" />}\n\n {dataEditorType === 'Float' && <DivideIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Decimal' && <DivideIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Integer' && <IntegerIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Currency' && <DollarSignIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Percentage' && <PercentIcon className=\"h-4 w-4\" />}\n </div>\n\n <p\n title={name}\n className=\"mr-2 line-clamp-2 w-full break-words font-semibold text-[#4A4A6A] text-xs\"\n >\n {name}\n </p>\n\n {description ? (\n <TooltipProvider>\n <Tooltip delayDuration={100}>\n <TooltipTrigger>\n <QuestionMarkCircledIcon className=\"h-4 w-4 text-[#4A4A6A]\" />\n </TooltipTrigger>\n\n <TooltipContent className=\"max-w-[240px]\">\n <p>{description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"w-4 shrink-0\" />\n )}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\nexport function CornerIndicator({ className }: { className?: string }) {\n\tconst { emptySize, onSelectSpreadsheet } = useSpreadsheet();\n\n\treturn (\n\t\t<button\n\t\t\tdisabled={emptySize}\n\t\t\tclassName={cn(\n\t\t\t\t'relative flex h-7 w-12 shrink-0 items-center justify-center border border-l border-t bg-white text-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={onSelectSpreadsheet}\n\t\t>\n\t\t\t<span className=\"absolute right-0 top-0 h-full w-0.5 bg-gray-300\" />\n\t\t\t<span className=\"absolute bottom-0 left-0 h-0.5 w-full bg-gray-300\" />\n\t\t</button>\n\t);\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { ColumnIndicator } from '@/src/components/spreadsheet/ui/indicators/column-indicator';\nimport { ColumnTitleIndicator } from '@/src/components/spreadsheet/ui/indicators/column-title-indicator';\nimport { CornerIndicator } from '@/src/components/spreadsheet/ui/indicators/corner-indicator';\n\nexport function Header() {\n const { columns } = useSpreadsheet();\n\n return (\n <div className=\"sticky top-[58px] z-50\">\n <div className=\"relative flex items-center bg-white\">\n <CornerIndicator className=\"border-t-0 border-l-0\" />\n\n {columns.map((column) => (\n <ColumnIndicator\n key={`spreadsheet__column__indicator__key__${column.name}__${column.position}`}\n column={column}\n />\n ))}\n </div>\n\n <div className=\"flex items-center\">\n <div className=\"h-9 w-12 shrink-0 cursor-default border border-t-0 border-l-0 bg-[#F6F6F9]\" />\n\n {columns.map((column) => (\n <ColumnTitleIndicator\n key={`spreadsheet__column__header__key__${column.name}__${column.position}`}\n column={column}\n />\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { cn } from '@/src/shared/lib/cn';\nimport { CaretSortIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport * as React from 'react';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent py-2 pr-px pl-3 text-sm shadow-sm ring-offset-background [&>span]:line-clamp-1 disabled:cursor-not-allowed placeholder:text-muted-foreground disabled:opacity-50 focus:outline-none focus:ring-1 focus:ring-ring',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n '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 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in',\n position === 'popper' &&\n 'data-[side=left]:-translate-x-1 data-[side=top]:-translate-y-1 data-[side=right]:translate-x-1 data-[side=bottom]:translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 font-semibold text-sm', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/src/shared/ui/select';\nimport { CaretSortIcon } from '@radix-ui/react-icons';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function BooleanDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLButtonElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <Select value={value as string} onValueChange={(data) => onChange?.({ data })} defaultOpen>\n <SelectTrigger\n onBlur={onBlur}\n onPaste={_onPaste}\n className={cn(\n 'h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0',\n )}\n autoFocus\n >\n <SelectValue placeholder=\"Selecionar\" />\n </SelectTrigger>\n\n <SelectContent>\n <SelectItem className=\"text-xs\" value=\"true\">\n Sim\n </SelectItem>\n\n <SelectItem className=\"text-xs\" value=\"false\">\n Não\n </SelectItem>\n </SelectContent>\n </Select>\n );\n}\n\nexport function BooleanDataViewer({ value }: Spreadsheet.DataViewer) {\n const empty = value === '';\n const displayValue = empty ? 'Selecionar' : value === 'true' ? 'Sim' : 'Não';\n\n return (\n <div className=\"flex h-full w-full items-center justify-between pr-px pl-1\">\n <p className=\"line-clamp-1 text-xs\">{displayValue}</p>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </div>\n );\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function DateDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <input\n type=\"date\"\n onBlur={onBlur}\n onPaste={_onPaste}\n value={value as string}\n onChange={(e) => onChange?.({ data: e.target.value })}\n className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n autoFocus\n />\n );\n}\n\nexport function DateDataViewer(props: Spreadsheet.DataViewer) {\n const { value } = props;\n const formatter = Intl.DateTimeFormat('pt-BR', { dateStyle: 'short' });\n const formatted = value ? formatter.format(new Date(value as string)) : 'dd/mm/yyyy';\n\n return (\n <div className=\"flex h-full w-full items-center\">\n <p className=\"line-clamp-1 pl-1 text-xs\">{formatted as string}</p>\n </div>\n );\n}\n","import type { Column, DataEditorType } from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type ClipboardEvent, type FocusEvent, type MouseEvent, useEffect, useState } from 'react';\nimport { type NumberFormatValues, NumericFormat } from 'react-number-format';\n\nexport type NumericFieldProps = {\n value?: string;\n onChange?: (value?: string) => void;\n onBlur?: () => void;\n onFocus?: (e: FocusEvent<HTMLInputElement>) => void;\n onClick?: (e: MouseEvent<HTMLInputElement>) => void;\n onPaste?: (e: ClipboardEvent<HTMLInputElement>) => void;\n tabIndex?: number;\n\n dataEditorType: DataEditorType;\n settings?: Partial<Column['settings']>;\n disabled?: boolean;\n\n testid?: string;\n className?: string;\n\n dataCypress?: string;\n};\n\nexport function NumericField(props: NumericFieldProps) {\n const {\n className,\n dataEditorType,\n onFocus,\n onBlur,\n onChange,\n onClick,\n onPaste,\n settings,\n testid,\n value,\n disabled,\n dataCypress,\n tabIndex,\n } = props;\n\n const thousandSeparator = '.';\n const decimalSeparator = ',';\n const decimalScale = getDecimalScale({\n dataEditorType,\n decimalScale: settings?.numeric?.decimalPlaces,\n });\n const allowNegative = settings?.numeric?.allowNegative;\n const min = settings?.numeric?.min;\n const max = settings?.numeric?.max;\n\n const prefix = dataEditorType.toLocaleLowerCase() === 'currency' ? 'R$ ' : '';\n const suffix = dataEditorType.toLocaleLowerCase() === 'percentage' ? '%' : '';\n\n const [strValue, setStrValue] = useState<string | undefined>(value);\n\n const [waitCapToOnBlur, setWaitCapToOnBlur] = useState(false);\n\n const onValueChange = ({ value }: NumberFormatValues) => {\n setStrValue(value);\n onChange?.(value);\n };\n\n const _onBlur = () => {\n let waitCapToOnBlur = false;\n\n const numValue = Number(value);\n\n let newStrValue = value;\n\n if (typeof min === 'number') {\n if (numValue < min) newStrValue = min.toString();\n }\n\n if (typeof max === 'number') {\n if (numValue > max) newStrValue = max.toString();\n }\n\n if (newStrValue !== value) {\n waitCapToOnBlur = true;\n\n onChange?.(newStrValue);\n setStrValue(newStrValue);\n setWaitCapToOnBlur(waitCapToOnBlur);\n }\n\n if (!waitCapToOnBlur) onBlur?.();\n };\n\n useEffect(() => {\n if (waitCapToOnBlur) {\n onBlur?.();\n setWaitCapToOnBlur(false);\n }\n }, [onBlur, waitCapToOnBlur]);\n\n useEffect(() => {\n setStrValue(value);\n }, [value]);\n\n return (\n <NumericFormat\n tabIndex={tabIndex}\n value={strValue}\n onPaste={onPaste}\n prefix={prefix}\n suffix={suffix}\n fixedDecimalScale\n onBlur={_onBlur}\n data-testid={testid}\n valueIsNumericString\n onFocus={onFocus}\n onClick={onClick}\n decimalScale={decimalScale}\n onValueChange={onValueChange}\n allowNegative={allowNegative}\n decimalSeparator={decimalSeparator}\n thousandSeparator={thousandSeparator}\n className={cn(\n 'h-full w-full rounded-none bg-transparent pl-1 text-xs outline-none',\n className,\n )}\n disabled={disabled}\n data-cypress={dataCypress}\n autoFocus\n />\n );\n}\n\nexport const percentageRatio = 100;\nexport const percentageScaleToBeDisregarded = 2;\n\nexport function getDecimalScale(params: { dataEditorType: DataEditorType; decimalScale?: number }) {\n const { dataEditorType, decimalScale } = params;\n\n let newDecimalScale = decimalScale;\n\n if (dataEditorType.toLowerCase() === 'percentage') {\n if (decimalScale) {\n newDecimalScale = decimalScale > 2 ? decimalScale - percentageScaleToBeDisregarded : 0;\n } else {\n newDecimalScale = 0;\n }\n }\n\n if (!decimalScale) {\n if (dataEditorType.toLowerCase() === 'decimal') newDecimalScale = 2;\n if (dataEditorType.toLowerCase() === 'float') newDecimalScale = 2;\n if (dataEditorType.toLowerCase() === 'integer') newDecimalScale = 0;\n if (dataEditorType.toLowerCase() === 'currency') newDecimalScale = 2;\n }\n\n return newDecimalScale;\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { NumericField } from '@/src/components/tmp/numeric';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function NumericEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste, setMode, column } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n const _onBlur = useCallback(() => {\n onBlur?.();\n setMode?.('view');\n }, [onBlur, setMode]);\n\n return (\n <NumericField\n dataEditorType={column.dataEditorType}\n value={value as string}\n onPaste={_onPaste}\n onBlur={_onBlur}\n onChange={(value) => onChange?.({ data: value })}\n settings={column.settings}\n />\n );\n\n // return (\n // <input\n // type=\"number\"\n // onBlur={_onBlur}\n // onPaste={_onPaste}\n // value={value as string}\n // onChange={(e) => onChange?.({ data: e.target.value })}\n // className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n // autoFocus\n // />\n // );\n}\n\nexport function NumericDataViewer(props: Spreadsheet.DataViewer) {\n const { value, column } = props;\n\n return (\n <NumericField\n dataEditorType={column.dataEditorType}\n value={value as string}\n settings={column.settings}\n disabled\n className=\"pointer-events-none\"\n />\n // <div className=\"flex h-full w-full items-center\">\n // <p className=\"line-clamp-1 pl-1 text-xs\">{value as string}</p>\n // </div>\n );\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/src/shared/ui/select';\nimport { CaretSortIcon } from '@radix-ui/react-icons';\nimport { type ClipboardEvent, useCallback, useMemo } from 'react';\n\nexport function SelectDataEditor(\n props: { items: Array<Spreadsheet.SelectItem> } & Spreadsheet.DataEditor,\n) {\n const { value, onBlur, onChange, onPaste, items } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLButtonElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <Select value={value as string} onValueChange={(data) => onChange?.({ data })} defaultOpen>\n <SelectTrigger\n onBlur={onBlur}\n onPaste={_onPaste}\n className={cn(\n 'h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0',\n )}\n >\n <SelectValue placeholder=\"Selecionar\" />\n </SelectTrigger>\n\n <SelectContent>\n {items.map(({ value, text }) => (\n <SelectItem key={value} className=\"text-xs\" value={value}>\n {text}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function SelectDataViewer(\n props: { items: Array<Spreadsheet.SelectItem> } & Spreadsheet.DataViewer,\n) {\n const { value, items } = props;\n\n const selected = useMemo(() => items.find((item) => item.value === value), [items, value]);\n const displayValue = useMemo(() => (selected ? selected.text : 'Selecionar'), [selected]);\n\n return (\n <div className=\"flex h-full w-full items-center justify-between pr-px pl-1\">\n <p className=\"line-clamp-1 text-xs\">{displayValue}</p>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </div>\n );\n}\n","/** Move the cursor of given input (or textarea) element to it's end */\nexport function moveInputCursorToEnd(element: HTMLInputElement | HTMLTextAreaElement) {\n element.selectionStart = element.selectionEnd = element.value.length;\n}\n","import type { ClipboardEvent } from 'react';\n\nexport const PLAIN_TEXT_MIME = 'text/plain';\n\n/** Read text from given clipboard event */\nexport function readTextFromClipboard<T>(event: ClipboardEvent<T>): string {\n // @ts-ignore\n if (window.clipboardData?.getData) {\n // @ts-ignore\n return window.clipboardData.getData('Text');\n }\n\n if (event.clipboardData?.getData) {\n return event.clipboardData.getData(PLAIN_TEXT_MIME);\n }\n\n return '';\n}\n","import * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { moveInputCursorToEnd } from '@/src/shared/lib/move-input-cursor-to-end';\nimport { readTextFromClipboard } from '@/src/shared/lib/read-text-from-clipboard';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/src/shared/ui/tooltip';\nimport {\n type ChangeEvent,\n type ClipboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst CHAR_WIDTH = 6;\nconst INPUT_MAX_LENGTH = 200;\n\nexport function TextDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste, setMode, column, selected } = props;\n const valueAsString = value as string;\n\n const textareaRef = useRef<null | HTMLTextAreaElement>(null);\n const [textareaHeight, setTextareaHeight] = useState(0);\n\n const overflow = useMemo(\n () => charOverflow(valueAsString, column.width),\n [valueAsString, column.width],\n );\n\n const _onPaste = useCallback(\n <T extends HTMLInputElement | HTMLTextAreaElement>(e: ClipboardEvent<T>) => {\n const clipboard = readTextFromClipboard(e);\n const singleLine = oneLineString(clipboard);\n\n if (!singleLine) {\n e.preventDefault();\n onPaste?.();\n }\n },\n [onPaste],\n );\n\n const _onBlur = useCallback(() => {\n onBlur?.();\n setMode?.('view');\n }, [onBlur, setMode]);\n\n const updateTextareaHeight = useCallback(() => {\n const element = textareaRef.current;\n\n if (!element) return;\n\n const scrollHeight = element.scrollHeight;\n element.style.height = `${scrollHeight}px`;\n setTextareaHeight(scrollHeight);\n }, []);\n\n const _onChange = useCallback(\n <T extends HTMLInputElement | HTMLTextAreaElement>(e: ChangeEvent<T>) => {\n onChange?.({ data: e.target.value });\n updateTextareaHeight();\n },\n [updateTextareaHeight, onChange],\n );\n\n if (overflow) {\n return (\n <div\n style={{ height: textareaHeight }}\n className={cn(\n '-left-0.5 -top-0.5 absolute z-40 h-fit w-fit border bg-white shadow-lg outline outline-2 outline-blue-500',\n selected ? 'bg-blue-50' : 'bg-white',\n )}\n >\n <div\n style={{ height: textareaHeight - 1 }}\n className=\"h-full w-full outline outline-[3px] outline-sky-200 outline-offset-2\"\n >\n <textarea\n ref={textareaRef}\n onBlur={_onBlur}\n onPaste={_onPaste}\n value={valueAsString}\n onChange={_onChange}\n className={cn(\n 'resize-none break-all rounded-none bg-transparent py-1.5 pr-3 pl-1 text-xs outline-none',\n )}\n onFocus={(e) => moveInputCursorToEnd(e.target)}\n maxLength={INPUT_MAX_LENGTH}\n style={{ width: column.width }}\n autoFocus\n />\n </div>\n </div>\n );\n }\n\n return (\n <input\n onBlur={onBlur}\n onPaste={_onPaste}\n value={valueAsString}\n maxLength={INPUT_MAX_LENGTH}\n onChange={_onChange}\n className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n autoFocus\n />\n );\n}\n\nexport function TextDataViewer(props: Spreadsheet.DataViewer) {\n const { value, column, selected } = props;\n const valueAsString = value as string;\n\n const overflow = useMemo(\n () => charOverflow(valueAsString, column.width),\n [valueAsString, column.width],\n );\n\n if (overflow) {\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger className=\"w-full\">\n <div className=\"flex h-full w-full items-center overflow-hidden\">\n <p className=\"line-clamp-1 break-all pl-1 text-left text-xs\">{valueAsString}</p>\n </div>\n </TooltipTrigger>\n\n <TooltipContent\n align=\"start\"\n side=\"bottom\"\n alignOffset={-2}\n sideOffset={-Spreadsheet.CELL_INITIAL_HEIGHT}\n className={cn(\n 'h-fit w-full break-all rounded-none border bg-white pl-1 text-black shadow-lg',\n 'data-[state=closed]:transform-none data-[side=bottom]:animate-none data-[state=closed]:animate-none data-[state=closed]:transition-none',\n selected ? 'bg-blue-50' : 'bg-white',\n )}\n style={{ width: column.width }}\n >\n <p>{valueAsString}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return (\n <div className=\"flex h-full w-full items-center overflow-hidden\">\n <p className=\"line-clamp-1 break-all pl-1 text-left text-xs\" title={valueAsString}>\n {valueAsString}\n </p>\n </div>\n );\n}\n\nfunction charOverflow(string: string, width: number) {\n return CHAR_WIDTH * string?.length > width;\n}\n\nfunction oneLineString(value: string) {\n return ['\\t', '\\n', '\\r'].every((regex) => !value.includes(regex));\n}\n","import {\n\tBooleanDataEditor,\n\tBooleanDataViewer,\n} from '@/src/components/spreadsheet/ui/data-editor/boolean';\nimport { DateDataEditor, DateDataViewer } from '@/src/components/spreadsheet/ui/data-editor/date';\nimport {\n\tNumericDataViewer,\n\tNumericEditor,\n} from '@/src/components/spreadsheet/ui/data-editor/numeric';\nimport {\n\tSelectDataEditor,\n\tSelectDataViewer,\n} from '@/src/components/spreadsheet/ui/data-editor/select';\nimport { TextDataEditor, TextDataViewer } from '@/src/components/spreadsheet/ui/data-editor/text';\n\nexport const DataEditor = {\n\tDate: DateDataEditor,\n\tText: TextDataEditor,\n\tBoolean: BooleanDataEditor,\n\tNumeric: NumericEditor,\n\tSelect: SelectDataEditor,\n};\n\nexport const DataViewer = {\n\tDate: DateDataViewer,\n\tText: TextDataViewer,\n\tBoolean: BooleanDataViewer,\n\tNumeric: NumericDataViewer,\n\tSelect: SelectDataViewer,\n};\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { DataEditor, DataViewer } from '@/src/components/spreadsheet/ui/data-editor';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useClickAway } from 'react-use';\n\nexport function Cell(props: Spreadsheet.Cell) {\n const { value, coordinates } = props;\n\n const { columns, isCellSelected, onChange, onPaste, onSelectCell } = useSpreadsheet();\n const { dataEditorType, readonly, width, visible, settings } = columns[coordinates.column];\n\n const [mode, setMode] = useState<Spreadsheet.Mode>(readonly ? 'readonly' : 'view');\n const dataEditorContainerRef = useRef<HTMLDivElement | null>(null);\n\n /** Cell correspondent column */\n const column = useMemo(() => columns[coordinates.column], [columns, coordinates.column]);\n /** Whether the cell is selected */\n const selected = useMemo(() => isCellSelected(coordinates), [coordinates, isCellSelected]);\n /** Select component custom items by prop */\n const selectItems = useMemo(() => settings?.select?.items || [], [settings?.select?.items]);\n\n const common: Record<'dataEditor' | 'dataViewer', Spreadsheet.DataEditor> = useMemo(\n () => ({\n dataEditor: {\n value,\n column,\n setMode,\n selected,\n onPaste: () => onPaste(coordinates),\n onChange: ({ data }) => onChange({ data, point: coordinates }),\n },\n dataViewer: {\n value,\n column,\n selected,\n },\n }),\n [coordinates, value, column, selected, onPaste, onChange],\n );\n\n const dataEditorElementMap: Partial<Record<Spreadsheet.DataEditorType, JSX.Element>> = useMemo(\n () => ({\n Date: <DataEditor.Date {...common.dataEditor} />,\n String: <DataEditor.Text {...common.dataEditor} />,\n Currency: <DataEditor.Numeric {...common.dataEditor} />,\n Decimal: <DataEditor.Numeric {...common.dataEditor} />,\n Float: <DataEditor.Numeric {...common.dataEditor} />,\n Integer: <DataEditor.Numeric {...common.dataEditor} />,\n Percentage: <DataEditor.Numeric {...common.dataEditor} />,\n Boolean: <DataEditor.Boolean {...common.dataEditor} />,\n Select: <DataEditor.Select {...common.dataEditor} items={selectItems} />,\n }),\n [common.dataEditor, selectItems],\n );\n\n const dataViewerElementMap: Partial<Record<Spreadsheet.DataEditorType, JSX.Element>> = useMemo(\n () => ({\n Date: <DataViewer.Date {...common.dataViewer} />,\n String: <DataViewer.Text {...common.dataViewer} />,\n Currency: <DataViewer.Numeric {...common.dataViewer} />,\n Decimal: <DataViewer.Numeric {...common.dataViewer} />,\n Float: <DataViewer.Numeric {...common.dataViewer} />,\n Integer: <DataViewer.Numeric {...common.dataViewer} />,\n Percentage: <DataViewer.Numeric {...common.dataViewer} />,\n Boolean: <DataViewer.Boolean {...common.dataViewer} />,\n Select: <DataViewer.Select {...common.dataViewer} items={selectItems} />,\n }),\n [common.dataViewer, selectItems],\n );\n\n const dataEditorElement = useMemo(\n () => (dataEditorType ? dataEditorElementMap[dataEditorType] : null),\n [dataEditorType, dataEditorElementMap],\n );\n\n const dataViewerElement = useMemo(\n () => (dataEditorType ? dataViewerElementMap[dataEditorType] : null),\n [dataEditorType, dataViewerElementMap],\n );\n\n useEffect(() => {\n const enterEditMode = (e: KeyboardEvent) => {\n const enterKey = e.code === 'Enter';\n\n if (enterKey && selected && mode === 'view') {\n setMode('edit');\n }\n\n if (enterKey && selected && mode === 'edit') {\n setMode('view');\n }\n };\n\n window.addEventListener('keydown', enterEditMode);\n\n return () => window.removeEventListener('keydown', enterEditMode);\n }, [selected, mode]);\n\n useClickAway(dataEditorContainerRef, () => setMode('view'));\n\n if (!visible) return null;\n\n if (mode === 'readonly') {\n return (\n <div\n onClick={() => onSelectCell(coordinates)}\n className={cn(\n 'flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent bg-[#F6F6F9]',\n selected && 'bg-[#EAF5FF]',\n )}\n style={{ width, height: Spreadsheet.CELL_INITIAL_HEIGHT }}\n >\n {dataViewerElement}\n </div>\n );\n }\n\n if (mode === 'view') {\n return (\n <div\n onClick={() => onSelectCell(coordinates)}\n onDoubleClick={() => setMode('edit')}\n className={cn(\n 'relative flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent',\n selected && 'bg-[#EAF5FF]',\n )}\n style={{ width, height: Spreadsheet.CELL_INITIAL_HEIGHT }}\n >\n {dataViewerElement}\n </div>\n );\n }\n\n return (\n <div\n ref={dataEditorContainerRef}\n data-testid=\"cell__testid\"\n className=\"relative h-7 w-32 shrink-0 border border-l-transparent border-t-transparent bg-[#EAF5FF] shadow-lg outline outline-2 outline-blue-500\"\n style={{\n width,\n height: Spreadsheet.CELL_INITIAL_HEIGHT,\n top: coordinates.row === 0 ? '4px' : '0px',\n }}\n >\n <div className=\"h-full w-full outline outline-[3px] outline-offset-2 outline-sky-200\">\n {dataEditorElement}\n </div>\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useMemo } from 'react';\n\nexport function RowIndicator({ row }: { row: number }) {\n const { onSelectRow, pointRange, matrix } = useSpreadsheet();\n\n const isRowInRange = useMemo(\n () => pointRange && row >= pointRange.start.row && row <= pointRange.end.row,\n [pointRange, row],\n );\n const isEntireRowSelected = useMemo(\n () => !!(pointRange && Matrix.hasEntireRows({ matrix, pointRange, row })),\n [matrix, pointRange, row],\n );\n\n return (\n <div\n className={cn(\n 'flex h-7 w-12 shrink-0 cursor-default select-none items-center justify-center border-r border-b text-[#8E8EA9] text-xs',\n isRowInRange && 'bg-blue-100 font-bold text-blue-700',\n isEntireRowSelected && 'bg-[#0085FF] font-bold text-white',\n )}\n onClick={(e) => onSelectRow(row, e)}\n style={{\n height: Spreadsheet.CELL_INITIAL_HEIGHT,\n }}\n >\n {row + 1}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { Cell } from '@/src/components/spreadsheet/ui/cell';\nimport { RowIndicator } from '@/src/components/spreadsheet/ui/indicators/row-indicator';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useId } from 'react';\n\nexport function Rows() {\n const id = useId();\n\n const { highlightLastRow, matrix } = useSpreadsheet();\n\n return (\n <div className=\"relative\">\n {matrix.map((rowValue, row) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: Using ID as key.\n key={`spreadsheet__row__key__${id}__${row}}`}\n className={cn(\n 'flex items-center transition-all ease-linear',\n row === matrix.length - 1 && highlightLastRow && 'bg-blue-50',\n )}\n >\n <RowIndicator row={row} />\n\n {rowValue.map((columnValue, column) => (\n <Cell\n // biome-ignore lint/suspicious/noArrayIndexKey: Using ID as key.\n key={`spreadsheet__cell__key__${id}__${row}__${column}`}\n value={columnValue}\n coordinates={{ column, row }}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\nexport function Start({ className }: { className?: string }) {\n const { staticRows, emptySize, onInsertNewRow } = useSpreadsheet();\n\n if (staticRows) return null;\n\n return (\n <div\n className={cn(\n 'pointer-events-none mt-[calc(28px+36px)] flex h-[calc(100%-28px-28px)] w-full items-center justify-center',\n emptySize && 'pointer-events-auto bg-white/25 backdrop-blur-sm',\n className,\n )}\n >\n {emptySize && (\n <p className=\"text-neutral-500\">\n <span>Clique </span>\n <button type=\"button\" onClick={onInsertNewRow} className=\"font-bold\">\n AQUI\n </button>\n <span> para começar a preencher a tabela.</span>\n </p>\n )}\n </div>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function AddRowIcon(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"20\"\n\t\t\theight=\"20\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\td=\"M10 6.667v6.666M6.667 10h6.666M6.5 17.5h7c1.4 0 2.1 0 2.635-.273a2.5 2.5 0 001.092-1.092c.273-.535.273-1.235.273-2.635v-7c0-1.4 0-2.1-.273-2.635a2.5 2.5 0 00-1.092-1.093C15.6 2.5 14.9 2.5 13.5 2.5h-7c-1.4 0-2.1 0-2.635.272a2.5 2.5 0 00-1.093 1.093C2.5 4.4 2.5 5.1 2.5 6.5v7c0 1.4 0 2.1.272 2.635a2.5 2.5 0 001.093 1.092C4.4 17.5 5.1 17.5 6.5 17.5z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import type { SVGProps } from 'react';\n\nexport function RemoveRowIcon(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"20\"\n\t\t\theight=\"20\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\td=\"M13.333 5v-.667c0-.933 0-1.4-.181-1.756a1.667 1.667 0 00-.729-.729c-.356-.181-.823-.181-1.756-.181H9.333c-.933 0-1.4 0-1.756.181-.314.16-.569.415-.729.729-.181.356-.181.823-.181 1.756V5m1.666 4.583v4.167m3.334-4.167v4.167M2.5 5h15m-1.667 0v9.333c0 1.4 0 2.1-.272 2.635a2.5 2.5 0 01-1.093 1.093c-.534.272-1.235.272-2.635.272H8.167c-1.4 0-2.1 0-2.635-.272a2.5 2.5 0 01-1.093-1.093c-.272-.535-.272-1.235-.272-2.635V5\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import { cn } from '@/src/shared/lib/cn';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md 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',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline:\n 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n },\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","'use client';\nimport { cn } from '@/src/shared/lib/cn';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons';\nimport * as React from 'react';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n '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 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',\n '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 data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 font-semibold text-sm', inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n );\n};\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { AddRowIcon } from '@/src/components/spreadsheet/ui/icons/add-row-icon';\nimport { RemoveRowIcon } from '@/src/components/spreadsheet/ui/icons/remove-row-icon';\nimport { Button } from '@/src/shared/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/src/shared/ui/dropdown-menu';\nimport { ChevronDown } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport { useMemo } from 'react';\n\nexport function Toolbar() {\n const {\n hasSomeEntireRow,\n emptySize,\n staticRows,\n columns,\n onInsertNewRow,\n onRemoveRow,\n onColumnVisibilityChange,\n } = useSpreadsheet();\n\n const visibleColumns = useMemo(() => columns.filter(({ visible }) => visible), [columns]);\n const allVisible = useMemo(\n () => columns.length === visibleColumns.length,\n [columns.length, visibleColumns.length],\n );\n\n const allVisibleLabel = 'Exibindo todas as colunas';\n const visibleColumnsLabel = `Exibindo ${visibleColumns.length} de ${columns.length} colunas`;\n const columnVisibilityLabel = allVisible ? allVisibleLabel : visibleColumnsLabel;\n\n return (\n <div className=\"sticky top-0 z-50 flex w-full items-center justify-between rounded-t-md border bg-[#EAF5FF] px-4 py-2.5\">\n <div className=\"flex items-center gap-6\">\n <Button\n disabled={staticRows}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onInsertNewRow}\n className=\"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white\"\n >\n <AddRowIcon />\n </Button>\n\n <Button\n disabled={staticRows || emptySize || !hasSomeEntireRow}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onRemoveRow}\n className=\"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white\"\n >\n <RemoveRowIcon />\n </Button>\n </div>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild className=\"w-56\">\n <Button variant=\"outline\" className=\"justify-between px-2\">\n <span className=\"text-xs\">{columnVisibilityLabel}</span>\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent className=\"w-56\">\n {columns.map(({ name, id, alphabetLetter, visible }) => (\n <DropdownMenuCheckboxItem\n key={`spreadsheet__column__dropdown_checkbox__key__${nanoid()}`}\n checked={visible}\n onCheckedChange={() => onColumnVisibilityChange(id)}\n className=\"justify-between text-xs\"\n >\n <span>{name}</span>\n <span className=\"text-[10px] text-neutral-500\">{alphabetLetter}</span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import type { Props } from '@/src/components/spreadsheet/model/spreadsheet';\nimport { Container } from '@/src/components/spreadsheet/ui/containers/index';\nimport { SpreadsheetContextProvider } from '@/src/components/spreadsheet/ui/context';\nimport { Header } from '@/src/components/spreadsheet/ui/header';\nimport { Rows } from '@/src/components/spreadsheet/ui/rows';\nimport { Start } from '@/src/components/spreadsheet/ui/start';\nimport { Toolbar } from '@/src/components/spreadsheet/ui/toolbar';\n\nexport function Spreadsheet(props: Props) {\n const { className, ...rest } = props;\n\n return (\n <SpreadsheetContextProvider {...rest}>\n <Container.Root className={className}>\n <Toolbar />\n\n <Container.Matrix>\n <Start className=\"absolute z-50\" />\n <Header />\n <Rows />\n </Container.Matrix>\n </Container.Root>\n </SpreadsheetContextProvider>\n );\n}\n","import { Spreadsheet } from '@/src/components/spreadsheet/ui';\nimport '@/src/shared/styles/globals.css';\n\nexport const CapLink = {\n Spreadsheet,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "caplink-saas-ui-shared-component-library",
|
|
3
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.2.0",
|
|
4
5
|
"description": "A shared UI component library for React projects from Caplink",
|
|
5
|
-
"main": "index.js",
|
|
6
|
+
"main": "dist/src/index.js",
|
|
7
|
+
"module": "dist/src/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"files": ["dist"],
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/src/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
},
|
|
15
|
+
"./styles": "./dist/src/index.css"
|
|
16
|
+
},
|
|
6
17
|
"scripts": {
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
18
|
+
"tsc:build": "tsc",
|
|
19
|
+
"tsup:build": "tsup",
|
|
20
|
+
"storybook:dev": "storybook dev -p 6006",
|
|
21
|
+
"storybook:build": "storybook build",
|
|
22
|
+
"dist:build": "tsup"
|
|
10
23
|
},
|
|
11
|
-
"files": [
|
|
12
|
-
"dist"
|
|
13
|
-
],
|
|
14
24
|
"keywords": [],
|
|
15
25
|
"author": "",
|
|
16
26
|
"license": "ISC",
|
|
@@ -19,7 +29,9 @@
|
|
|
19
29
|
"@babel/preset-env": "^7.24.0",
|
|
20
30
|
"@babel/preset-react": "^7.23.3",
|
|
21
31
|
"@babel/preset-typescript": "^7.23.3",
|
|
32
|
+
"@biomejs/biome": "1.7.1",
|
|
22
33
|
"@chromatic-com/storybook": "^1.2.22",
|
|
34
|
+
"@eslint/js": "^9.1.1",
|
|
23
35
|
"@storybook/addon-essentials": "^8.0.0",
|
|
24
36
|
"@storybook/addon-interactions": "^8.0.0",
|
|
25
37
|
"@storybook/addon-links": "^8.0.0",
|
|
@@ -29,16 +41,42 @@
|
|
|
29
41
|
"@storybook/nextjs": "^8.0.0",
|
|
30
42
|
"@storybook/react": "^8.0.0",
|
|
31
43
|
"@storybook/test": "^8.0.0",
|
|
44
|
+
"@swc/core": "^1.5.0",
|
|
32
45
|
"@testing-library/react": "^14.2.1",
|
|
33
46
|
"@types/jest": "^29.5.12",
|
|
34
|
-
"autoprefixer": "^10.4.
|
|
47
|
+
"autoprefixer": "^10.4.19",
|
|
35
48
|
"babel-jest": "^29.7.0",
|
|
36
49
|
"cypress": "^13.7.0",
|
|
50
|
+
"eslint": "^8.57.0",
|
|
51
|
+
"eslint-config-airbnb": "^19.0.4",
|
|
52
|
+
"eslint-config-prettier": "^9.1.0",
|
|
53
|
+
"eslint-plugin-prettier": "^5.1.3",
|
|
54
|
+
"eslint-plugin-react": "^7.34.1",
|
|
55
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
56
|
+
"globals": "^15.0.0",
|
|
37
57
|
"identity-obj-proxy": "^3.0.0",
|
|
38
58
|
"jest": "^29.7.0",
|
|
39
59
|
"jest-environment-jsdom": "^29.7.0",
|
|
40
|
-
"postcss": "^8.4.
|
|
60
|
+
"postcss": "^8.4.38",
|
|
61
|
+
"prettier": "^3.2.5",
|
|
41
62
|
"storybook": "^8.0.0",
|
|
42
|
-
"tailwindcss": "^3.4.
|
|
63
|
+
"tailwindcss": "^3.4.3",
|
|
64
|
+
"tsup": "^8.0.2",
|
|
65
|
+
"typescript": "^5.4.5"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"@radix-ui/react-dropdown-menu": "^2.0.6",
|
|
69
|
+
"@radix-ui/react-icons": "^1.3.0",
|
|
70
|
+
"@radix-ui/react-select": "^2.0.0",
|
|
71
|
+
"@radix-ui/react-slot": "^1.0.2",
|
|
72
|
+
"@radix-ui/react-tooltip": "^1.0.7",
|
|
73
|
+
"class-variance-authority": "^0.7.0",
|
|
74
|
+
"clsx": "^2.1.0",
|
|
75
|
+
"lucide-react": "^0.364.0",
|
|
76
|
+
"nanoid": "^5.0.7",
|
|
77
|
+
"react-number-format": "^5.3.4",
|
|
78
|
+
"react-use": "^17.5.0",
|
|
79
|
+
"tailwind-merge": "^2.2.2",
|
|
80
|
+
"tailwindcss-animate": "^1.0.7"
|
|
43
81
|
}
|
|
44
82
|
}
|