@fluityy/designsystem 0.1.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.
Files changed (37) hide show
  1. package/README.md +66 -0
  2. package/dist/components/Accordion/Accordion.d.ts +11 -0
  3. package/dist/components/Alert/Alert.d.ts +10 -0
  4. package/dist/components/Avatar/Avatar.d.ts +12 -0
  5. package/dist/components/Badge/Badge.d.ts +8 -0
  6. package/dist/components/Breadcrumb/Breadcrumb.d.ts +7 -0
  7. package/dist/components/Button/Button.d.ts +9 -0
  8. package/dist/components/Card/Card.d.ts +5 -0
  9. package/dist/components/Checkbox/Checkbox.d.ts +5 -0
  10. package/dist/components/Divider/Divider.d.ts +6 -0
  11. package/dist/components/Drawer/Drawer.d.ts +14 -0
  12. package/dist/components/Dropdown/Dropdown.d.ts +18 -0
  13. package/dist/components/Input/Input.d.ts +9 -0
  14. package/dist/components/Modal/Modal.d.ts +12 -0
  15. package/dist/components/Popover/Popover.d.ts +12 -0
  16. package/dist/components/Progress/Progress.d.ts +7 -0
  17. package/dist/components/Radio/Radio.d.ts +12 -0
  18. package/dist/components/Select/Select.d.ts +9 -0
  19. package/dist/components/Spinner/Spinner.d.ts +9 -0
  20. package/dist/components/StatCard/StatCard.d.ts +13 -0
  21. package/dist/components/Switch/Switch.d.ts +12 -0
  22. package/dist/components/Tabs/Tabs.d.ts +15 -0
  23. package/dist/components/Textarea/Textarea.d.ts +7 -0
  24. package/dist/components/Toast/Toast.d.ts +16 -0
  25. package/dist/components/Tooltip/Tooltip.d.ts +11 -0
  26. package/dist/components/index.d.ts +25 -0
  27. package/dist/hooks/useControllableState.d.ts +9 -0
  28. package/dist/hooks/useDismissable.d.ts +2 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.js +2559 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/styles.css +264 -0
  33. package/dist/theme/ThemeProvider.d.ts +34 -0
  34. package/dist/tokens/tokens.d.ts +10 -0
  35. package/dist/utils/Portal.d.ts +4 -0
  36. package/dist/utils/cn.d.ts +3 -0
  37. package/package.json +60 -0
@@ -0,0 +1,264 @@
1
+ /* flui-ds — design tokens + Tailwind v4 theme mapping */
2
+
3
+ /* tokens.css */
4
+ /**
5
+ * Do not edit directly, this file was auto-generated.
6
+ */
7
+
8
+ :root {
9
+ --flui-color-accent-scale-50: #f9ffe0;
10
+ --flui-color-accent-scale-100: #f3ffb8;
11
+ --flui-color-accent-scale-200: #e8ff80;
12
+ --flui-color-accent-scale-300: #dcff45;
13
+ --flui-color-accent-scale-400: #d7ff15;
14
+ --flui-color-accent-scale-500: #c4eb00;
15
+ --flui-color-accent-scale-600: #afd100;
16
+ --flui-color-accent-scale-700: #8ab000;
17
+ --flui-color-accent-scale-800: #638000;
18
+ --flui-color-accent-scale-900: #1a2200;
19
+ --flui-color-brand-50: #e8eeff;
20
+ --flui-color-brand-100: #ccd5ff;
21
+ --flui-color-brand-200: #99abff;
22
+ --flui-color-brand-300: #6680ff;
23
+ --flui-color-brand-400: #3355ff;
24
+ --flui-color-brand-500: #0033d6;
25
+ --flui-color-brand-600: #0029b0;
26
+ --flui-color-brand-700: #001f8a;
27
+ --flui-color-brand-800: #001566;
28
+ --flui-color-brand-900: #000b42;
29
+ --flui-color-neutral-0: #ffffff;
30
+ --flui-color-neutral-50: #f7f8fa;
31
+ --flui-color-neutral-100: #f3f4f7;
32
+ --flui-color-neutral-200: #dde1e9;
33
+ --flui-color-neutral-300: #c2c8d4;
34
+ --flui-color-neutral-400: #9aa2b4;
35
+ --flui-color-neutral-500: #6b7385;
36
+ --flui-color-neutral-600: #4c5263;
37
+ --flui-color-neutral-700: #363b49;
38
+ --flui-color-neutral-800: #22262f;
39
+ --flui-color-neutral-900: #13151b;
40
+ --flui-color-success-500: #1f9d55;
41
+ --flui-color-success-600: #157f43;
42
+ --flui-color-warning-500: #d9920a;
43
+ --flui-color-warning-600: #b6790a;
44
+ --flui-color-danger-500: #e02424;
45
+ --flui-color-danger-600: #bd1b1b;
46
+ --flui-space-0: 0;
47
+ --flui-space-1: 4px;
48
+ --flui-space-2: 8px;
49
+ --flui-space-3: 12px;
50
+ --flui-space-4: 16px;
51
+ --flui-space-5: 20px;
52
+ --flui-space-6: 24px;
53
+ --flui-space-8: 32px;
54
+ --flui-space-10: 40px;
55
+ --flui-space-12: 48px;
56
+ --flui-space-16: 64px;
57
+ --flui-radius-none: 0;
58
+ --flui-radius-sm: 8px;
59
+ --flui-radius-md: 12px;
60
+ --flui-radius-lg: 16px;
61
+ --flui-radius-xl: 24px;
62
+ --flui-radius-full: 9999px;
63
+ --flui-shadow-sm: 0 1px 2px rgba(19, 21, 27, 0.06);
64
+ --flui-shadow-md: 0 4px 12px rgba(19, 21, 27, 0.10);
65
+ --flui-shadow-lg: 0 12px 32px rgba(19, 21, 27, 0.14);
66
+ --flui-font-family-sans: Inter, system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
67
+ --flui-font-family-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
68
+ --flui-font-weight-regular: 400;
69
+ --flui-font-weight-medium: 500;
70
+ --flui-font-weight-semibold: 600;
71
+ --flui-font-weight-bold: 700;
72
+ --flui-font-size-xs: 12px;
73
+ --flui-font-size-sm: 14px;
74
+ --flui-font-size-md: 16px;
75
+ --flui-font-size-lg: 18px;
76
+ --flui-font-size-xl: 24px;
77
+ --flui-font-size-2xl: 32px;
78
+ --flui-font-line-height-tight: 1.2;
79
+ --flui-font-line-height-normal: 1.5;
80
+ --flui-font-line-height-relaxed: 1.75;
81
+ --flui-semantic-bg-base: var(--flui-color-neutral-0);
82
+ --flui-semantic-bg-subtle: var(--flui-color-neutral-50);
83
+ --flui-semantic-bg-muted: var(--flui-color-neutral-100);
84
+ --flui-semantic-fg-default: var(--flui-color-neutral-900);
85
+ --flui-semantic-fg-muted: var(--flui-color-neutral-500);
86
+ --flui-semantic-fg-on-brand: var(--flui-color-neutral-0);
87
+ --flui-semantic-border-default: var(--flui-color-neutral-200);
88
+ --flui-semantic-border-strong: var(--flui-color-neutral-300);
89
+ --flui-semantic-primary-default: var(--flui-color-brand-500);
90
+ --flui-semantic-primary-hover: var(--flui-color-brand-600);
91
+ --flui-semantic-primary-active: var(--flui-color-brand-700);
92
+ --flui-semantic-primary-subtle: var(--flui-color-brand-50);
93
+ --flui-semantic-accent-default: var(--flui-color-accent-scale-400);
94
+ --flui-semantic-accent-hover: var(--flui-color-accent-scale-500);
95
+ --flui-semantic-accent-active: var(--flui-color-accent-scale-600);
96
+ --flui-semantic-accent-subtle: var(--flui-color-accent-scale-100);
97
+ --flui-semantic-accent-foreground: var(--flui-color-accent-scale-900);
98
+ --flui-semantic-danger-default: var(--flui-color-danger-500);
99
+ --flui-semantic-danger-hover: var(--flui-color-danger-600);
100
+ --flui-semantic-success-default: var(--flui-color-accent-scale-600);
101
+ --flui-semantic-success-subtle: var(--flui-color-accent-scale-100);
102
+ --flui-semantic-success-foreground: var(--flui-color-accent-scale-900);
103
+ --flui-semantic-warning-default: var(--flui-color-warning-500);
104
+ --flui-semantic-warning-on-warning: var(--flui-color-neutral-900);
105
+ }
106
+
107
+ /* tokens.dark.css */
108
+ /**
109
+ * Do not edit directly, this file was auto-generated.
110
+ */
111
+
112
+ [data-theme="dark"] {
113
+ --flui-semantic-bg-base: var(--flui-color-neutral-900);
114
+ --flui-semantic-bg-subtle: var(--flui-color-neutral-800);
115
+ --flui-semantic-bg-muted: var(--flui-color-neutral-700);
116
+ --flui-semantic-fg-default: var(--flui-color-neutral-50);
117
+ --flui-semantic-fg-muted: var(--flui-color-neutral-400);
118
+ --flui-semantic-border-default: var(--flui-color-neutral-700);
119
+ --flui-semantic-border-strong: var(--flui-color-neutral-600);
120
+ --flui-semantic-primary-subtle: var(--flui-color-brand-800);
121
+ --flui-semantic-warning-on-warning: var(--flui-color-neutral-900);
122
+ }
123
+
124
+ /* tokens.brand-emerald.css */
125
+ /**
126
+ * Do not edit directly, this file was auto-generated.
127
+ */
128
+
129
+ [data-brand="emerald"] {
130
+ --flui-color-brand-50: #ecfdf5;
131
+ --flui-color-brand-100: #d1fae5;
132
+ --flui-color-brand-200: #a7f3d0;
133
+ --flui-color-brand-300: #6ee7b7;
134
+ --flui-color-brand-400: #34d399;
135
+ --flui-color-brand-500: #10b981;
136
+ --flui-color-brand-600: #059669;
137
+ --flui-color-brand-700: #047857;
138
+ --flui-color-brand-800: #065f46;
139
+ --flui-color-brand-900: #064e3b;
140
+ }
141
+
142
+ /* tokens.brand-violet.css */
143
+ /**
144
+ * Do not edit directly, this file was auto-generated.
145
+ */
146
+
147
+ [data-brand="violet"] {
148
+ --flui-color-brand-50: #f5f3ff;
149
+ --flui-color-brand-100: #ede9fe;
150
+ --flui-color-brand-200: #ddd6fe;
151
+ --flui-color-brand-300: #c4b5fd;
152
+ --flui-color-brand-400: #a78bfa;
153
+ --flui-color-brand-500: #7c3aed;
154
+ --flui-color-brand-600: #6d28d9;
155
+ --flui-color-brand-700: #5b21b6;
156
+ --flui-color-brand-800: #4c1d95;
157
+ --flui-color-brand-900: #3b0764;
158
+ }
159
+
160
+ /* tokens.brand-amber.css */
161
+ /**
162
+ * Do not edit directly, this file was auto-generated.
163
+ */
164
+
165
+ [data-brand="amber"] {
166
+ --flui-color-brand-50: #fffbeb;
167
+ --flui-color-brand-100: #fef3c7;
168
+ --flui-color-brand-200: #fde68a;
169
+ --flui-color-brand-300: #fcd34d;
170
+ --flui-color-brand-400: #fbbf24;
171
+ --flui-color-brand-500: #f59e0b;
172
+ --flui-color-brand-600: #d97706;
173
+ --flui-color-brand-700: #b45309;
174
+ --flui-color-brand-800: #92400e;
175
+ --flui-color-brand-900: #78350f;
176
+ }
177
+
178
+ /* Tailwind v4 theme mapping */
179
+ @theme inline {
180
+ /* cores semânticas */
181
+ --color-bg: var(--flui-semantic-bg-base);
182
+ --color-bg-subtle: var(--flui-semantic-bg-subtle);
183
+ --color-bg-muted: var(--flui-semantic-bg-muted);
184
+ --color-fg: var(--flui-semantic-fg-default);
185
+ --color-fg-muted: var(--flui-semantic-fg-muted);
186
+ --color-fg-on-brand: var(--flui-semantic-fg-on-brand);
187
+ --color-border-default: var(--flui-semantic-border-default);
188
+ --color-border-strong: var(--flui-semantic-border-strong);
189
+ --color-primary: var(--flui-semantic-primary-default);
190
+ --color-primary-hover: var(--flui-semantic-primary-hover);
191
+ --color-primary-active: var(--flui-semantic-primary-active);
192
+ --color-primary-subtle: var(--flui-semantic-primary-subtle);
193
+ --color-accent: var(--flui-semantic-accent-default);
194
+ --color-accent-hover: var(--flui-semantic-accent-hover);
195
+ --color-accent-active: var(--flui-semantic-accent-active);
196
+ --color-accent-subtle: var(--flui-semantic-accent-subtle);
197
+ --color-accent-fg: var(--flui-semantic-accent-foreground);
198
+ --color-danger: var(--flui-semantic-danger-default);
199
+ --color-danger-hover: var(--flui-semantic-danger-hover);
200
+ --color-success: var(--flui-semantic-success-default);
201
+ --color-success-subtle: var(--flui-semantic-success-subtle);
202
+ --color-success-fg: var(--flui-semantic-success-foreground);
203
+ --color-warning: var(--flui-semantic-warning-default);
204
+ --color-on-warning: var(--flui-semantic-warning-on-warning);
205
+
206
+ /* paleta primitiva (para swatches/utilitários quando necessário) */
207
+ --color-brand-50: var(--flui-color-brand-50);
208
+ --color-brand-100: var(--flui-color-brand-100);
209
+ --color-brand-800: var(--flui-color-brand-800);
210
+ --color-brand-500: var(--flui-color-brand-500);
211
+ --color-brand-600: var(--flui-color-brand-600);
212
+ --color-neutral-100: var(--flui-color-neutral-100);
213
+ --color-neutral-500: var(--flui-color-neutral-500);
214
+ --color-neutral-900: var(--flui-color-neutral-900);
215
+
216
+ /* espaçamento */
217
+ --spacing-1: var(--flui-space-1);
218
+ --spacing-2: var(--flui-space-2);
219
+ --spacing-3: var(--flui-space-3);
220
+ --spacing-4: var(--flui-space-4);
221
+ --spacing-5: var(--flui-space-5);
222
+ --spacing-6: var(--flui-space-6);
223
+ --spacing-8: var(--flui-space-8);
224
+ --spacing-10: var(--flui-space-10);
225
+ --spacing-12: var(--flui-space-12);
226
+ --spacing-16: var(--flui-space-16);
227
+
228
+ /* raio */
229
+ --radius-sm: var(--flui-radius-sm);
230
+ --radius-md: var(--flui-radius-md);
231
+ --radius-lg: var(--flui-radius-lg);
232
+ --radius-xl: var(--flui-radius-xl);
233
+ --radius-full: var(--flui-radius-full);
234
+
235
+ /* tipografia */
236
+ --font-display: var(--flui-font-family-display);
237
+ --font-sans: var(--flui-font-family-sans);
238
+ --font-mono: var(--flui-font-family-mono);
239
+ --text-xs: var(--flui-font-size-xs);
240
+ --text-sm: var(--flui-font-size-sm);
241
+ --text-md: var(--flui-font-size-md);
242
+ --text-lg: var(--flui-font-size-lg);
243
+ --text-xl: var(--flui-font-size-xl);
244
+ --text-2xl: var(--flui-font-size-2xl);
245
+
246
+ /* sombras */
247
+ --shadow-sm: var(--flui-shadow-sm);
248
+ --shadow-md: var(--flui-shadow-md);
249
+ --shadow-lg: var(--flui-shadow-lg);
250
+ }
251
+
252
+ /* Animations */
253
+ @keyframes flui-indeterminate {
254
+ 0% { transform: translateX(-100%); }
255
+ 100% { transform: translateX(300%); }
256
+ }
257
+ @keyframes flui-fade-in {
258
+ from { opacity: 0; }
259
+ to { opacity: 1; }
260
+ }
261
+ @keyframes flui-slide-up {
262
+ from { opacity: 0; transform: translateY(8px); }
263
+ to { opacity: 1; transform: translateY(0); }
264
+ }
@@ -0,0 +1,34 @@
1
+ /** Modo de cor. "system" segue a preferência do SO. */
2
+ export type ColorMode = "light" | "dark" | "system";
3
+ /**
4
+ * Marca/tema. "default" usa o ramp base (:root). Os demais correspondem aos
5
+ * blocos [data-brand="…"] gerados pelo Style Dictionary a partir de
6
+ * tokens/brands/*.json — daí o tipo aberto (string) para temas customizados.
7
+ */
8
+ export type Brand = "default" | (string & {});
9
+ interface ThemeContextValue {
10
+ /** Preferência escolhida (pode ser "system"). */
11
+ mode: ColorMode;
12
+ /** Modo efetivo já resolvido ("light" | "dark"). */
13
+ resolvedMode: "light" | "dark";
14
+ brand: Brand;
15
+ setMode: (mode: ColorMode) => void;
16
+ setBrand: (brand: Brand) => void;
17
+ /** Alterna entre claro e escuro (resolve "system" antes). */
18
+ toggleMode: () => void;
19
+ }
20
+ export interface ThemeProviderProps {
21
+ children: React.ReactNode;
22
+ /** Modo inicial caso não haja preferência salva. Padrão: "system". */
23
+ defaultMode?: ColorMode;
24
+ /** Marca inicial caso não haja preferência salva. Padrão: "default". */
25
+ defaultBrand?: Brand;
26
+ /**
27
+ * Onde aplicar os atributos data-theme / data-brand.
28
+ * Padrão: document.documentElement (escopo global do app).
29
+ */
30
+ target?: () => HTMLElement | null;
31
+ }
32
+ export declare function ThemeProvider({ children, defaultMode, defaultBrand, target, }: ThemeProviderProps): import("react").JSX.Element;
33
+ export declare function useTheme(): ThemeContextValue;
34
+ export {};
@@ -0,0 +1,10 @@
1
+ export interface TokenMeta {
2
+ name: string;
3
+ cssVar: string;
4
+ path: string[];
5
+ group: string;
6
+ value: string;
7
+ isColor: boolean;
8
+ reference: string | null;
9
+ }
10
+ export declare const tokens: TokenMeta[];
@@ -0,0 +1,4 @@
1
+ /** Renderiza os filhos em document.body, evitando problemas de overflow/z-index. */
2
+ export declare function Portal({ children }: {
3
+ children: React.ReactNode;
4
+ }): import('react').ReactPortal | null;
@@ -0,0 +1,3 @@
1
+ import { ClassValue } from 'clsx';
2
+ /** Combina classes condicionais e resolve conflitos do Tailwind. */
3
+ export declare function cn(...inputs: ClassValue[]): string;
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@fluityy/designsystem",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Flui Design System — componentes React com Tailwind v4 e tokens semânticos",
7
+ "keywords": ["design-system", "react", "tailwindcss", "components", "ui"],
8
+ "license": "MIT",
9
+ "main": "./dist/index.js",
10
+ "module": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ },
17
+ "./styles": "./dist/styles.css"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "tokens": "node style-dictionary.config.mjs",
24
+ "tokens:watch": "chokidar \"tokens/**/*.json\" -c \"npm run tokens\"",
25
+ "predev": "npm run tokens",
26
+ "dev": "vite",
27
+ "prebuild": "npm run tokens",
28
+ "build": "tsc -b && vite build",
29
+ "preview": "vite preview",
30
+ "build:lib": "npm run tokens && vite build --config vite.lib.config.ts && node scripts/build-styles.mjs",
31
+ "prepublishOnly": "npm run build:lib"
32
+ },
33
+ "peerDependencies": {
34
+ "react": ">=18",
35
+ "react-dom": ">=18",
36
+ "tailwindcss": ">=4"
37
+ },
38
+ "dependencies": {
39
+ "class-variance-authority": "^0.7.1",
40
+ "clsx": "^2.1.1",
41
+ "tailwind-merge": "^3.3.0"
42
+ },
43
+ "devDependencies": {
44
+ "@tabler/icons-react": "^3.44.0",
45
+ "@tailwindcss/vite": "^4.1.10",
46
+ "@types/node": "^22.19.21",
47
+ "@types/react": "^19.1.8",
48
+ "@types/react-dom": "^19.1.6",
49
+ "@vitejs/plugin-react": "^4.5.2",
50
+ "chokidar-cli": "^3.0.0",
51
+ "geist": "^1.7.2",
52
+ "react": "^19.1.0",
53
+ "react-dom": "^19.1.0",
54
+ "style-dictionary": "^4.3.3",
55
+ "tailwindcss": "^4.1.10",
56
+ "typescript": "^5.8.3",
57
+ "vite": "^6.3.5",
58
+ "vite-plugin-dts": "^5.0.2"
59
+ }
60
+ }