@innertia-solutions/innertia-nuxt 0.1.1

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 (108) hide show
  1. package/.github/workflows/auto-publish.yml +64 -0
  2. package/.github/workflows/release.yml +59 -0
  3. package/README.md +60 -0
  4. package/app.config.ts +70 -0
  5. package/components/Admin/Base.vue +144 -0
  6. package/components/Admin/Header.vue +32 -0
  7. package/components/Admin/Page.vue +65 -0
  8. package/components/Admin/PageHeader.vue +31 -0
  9. package/components/App/Button.vue +59 -0
  10. package/components/App/DevEnvironmentBar.vue +43 -0
  11. package/components/App/Dropdown.vue +286 -0
  12. package/components/App/EmptyState.vue +433 -0
  13. package/components/App/LoadingState.vue +40 -0
  14. package/components/App/PageLoadingSpinner.vue +118 -0
  15. package/components/App/PreviewDock.vue +64 -0
  16. package/components/App/SwitchColorTheme.vue +51 -0
  17. package/components/App/Tag.vue +193 -0
  18. package/components/DataTable.vue +713 -0
  19. package/components/Forms/DatePicker.vue +255 -0
  20. package/components/Forms/Input.vue +75 -0
  21. package/components/Forms/Select.vue +100 -0
  22. package/components/Forms/SelectServer.vue +726 -0
  23. package/components/Layout/Admin.vue +32 -0
  24. package/components/Layout/Auth.vue +29 -0
  25. package/components/Layout/SidebarWithAppColumn.vue +388 -0
  26. package/components/Layout/TopBar.vue +113 -0
  27. package/components/MobileBlocker.vue +85 -0
  28. package/components/MobileLoginPicker.vue +83 -0
  29. package/components/Modal/Base.vue +29 -0
  30. package/components/Modal/DeleteConfirm.vue +48 -0
  31. package/components/Modal.vue +103 -0
  32. package/components/Nav/Tabs.vue +55 -0
  33. package/components/PermissionsTree.vue +272 -0
  34. package/components/Table/Database.vue +183 -0
  35. package/components/Table/DownloadDropdown.vue +111 -0
  36. package/components/Table/Enterprise.vue +540 -0
  37. package/components/Table/FilterDropdown.vue +226 -0
  38. package/components/Table/Grid.vue +62 -0
  39. package/components/Table/Kanban.vue +188 -0
  40. package/components/Table/List.vue +128 -0
  41. package/components/Table/PreviewTimeline.vue +118 -0
  42. package/components/Table/Standard.vue +1217 -0
  43. package/components/Table/index.vue +974 -0
  44. package/components/TableExportable.vue +172 -0
  45. package/components/TableFilter.vue +93 -0
  46. package/components/Toast/Alert.vue +113 -0
  47. package/components/Toast/Container.vue +34 -0
  48. package/components/Toast/Notification.vue +45 -0
  49. package/components/Toast/Process.vue +88 -0
  50. package/composables/useApi.js +95 -0
  51. package/composables/useApp.ts +46 -0
  52. package/composables/useAuth.js +82 -0
  53. package/composables/useContext.js +44 -0
  54. package/composables/useDate.js +241 -0
  55. package/composables/useDevice.js +21 -0
  56. package/composables/useDockedPreviews.js +56 -0
  57. package/composables/useDownload.js +87 -0
  58. package/composables/useEntity.js +82 -0
  59. package/composables/useForm.js +119 -0
  60. package/composables/useInnertiaMode.ts +25 -0
  61. package/composables/useMobileGuard.ts +81 -0
  62. package/composables/useNotifications.js +22 -0
  63. package/composables/usePermissions.js +23 -0
  64. package/composables/useRealtime.js +123 -0
  65. package/composables/useRequestInterceptors.js +27 -0
  66. package/composables/useRoles.js +53 -0
  67. package/composables/useRutFormatter.js +39 -0
  68. package/composables/useTable.ts +94 -0
  69. package/composables/useTablePreferences.ts +33 -0
  70. package/composables/useTenant.js +27 -0
  71. package/composables/useTimeAgo.js +37 -0
  72. package/composables/useToast.js +69 -0
  73. package/composables/useUserRealtime.js +17 -0
  74. package/composables/useUsers.js +111 -0
  75. package/css/themes/autumn.css +401 -0
  76. package/css/themes/bubblegum.css +408 -0
  77. package/css/themes/cashmere.css +412 -0
  78. package/css/themes/harvest.css +416 -0
  79. package/css/themes/moon.css +140 -0
  80. package/css/themes/ocean.css +273 -0
  81. package/css/themes/olive.css +413 -0
  82. package/css/themes/retro.css +431 -0
  83. package/css/themes/theme.css +725 -0
  84. package/error.vue +78 -0
  85. package/middleware/01.detect-subdomain.global.ts +43 -0
  86. package/middleware/02.validate-tenant.global.ts +67 -0
  87. package/middleware/03.apps.global.ts +88 -0
  88. package/middleware/auth.ts +9 -0
  89. package/middleware/guest.ts +9 -0
  90. package/nuxt.config.ts +42 -0
  91. package/package.json +60 -0
  92. package/pages/tenant-error.vue +50 -0
  93. package/plugins/api-auth.ts +12 -0
  94. package/plugins/api-tenant.client.ts +21 -0
  95. package/plugins/appearance.ts +8 -0
  96. package/plugins/auth-init.ts +34 -0
  97. package/plugins/dark-state.client.ts +29 -0
  98. package/plugins/dockedPreviewsSync.client.js +17 -0
  99. package/plugins/preline.client.ts +68 -0
  100. package/plugins/theme.client.ts +7 -0
  101. package/plugins/vue-query.ts +29 -0
  102. package/public/init-theme.js +15 -0
  103. package/spark.css +721 -0
  104. package/stores/auth.js +130 -0
  105. package/stores/dockedPreviews.js +34 -0
  106. package/stores/notifications.js +24 -0
  107. package/stores/tenant.js +54 -0
  108. package/stores/toast.js +129 -0
package/spark.css ADDED
@@ -0,0 +1,721 @@
1
+ @import "tailwindcss";
2
+ @import "preline/variants.css";
3
+ @import "./css/themes/harvest.css";
4
+ @import "./css/themes/retro.css";
5
+ @import "./css/themes/ocean.css";
6
+ @import "./css/themes/autumn.css";
7
+ @import "./css/themes/moon.css";
8
+ @import "./css/themes/bubblegum.css";
9
+ @import "./css/themes/olive.css";
10
+ @import "./css/themes/cashmere.css";
11
+ @plugin "@tailwindcss/forms";
12
+ @plugin "@tailwindcss/aspect-ratio";
13
+
14
+ /* Escanear componentes del paquete spark (en node_modules) */
15
+ @source "./components/**/*.vue";
16
+ @source "./shared/**/*.{js,ts}";
17
+ @source "./plugins/**/*.{js,ts}";
18
+
19
+ @custom-variant dark (&:where(.dark, .dark *));
20
+ @custom-variant hover (&:hover);
21
+
22
+ /* ─── Color tokens ─────────────────────────────────────────── */
23
+ @theme {
24
+ /* Backgrounds */
25
+ --color-background: var(--background);
26
+ --color-background-1: var(--background-1);
27
+ --color-background-2: var(--background-2);
28
+ --color-plain: var(--background-plain);
29
+
30
+ /* Foreground */
31
+ --color-foreground: var(--foreground);
32
+ --color-foreground-inverse: var(--foreground-inverse);
33
+ --color-inverse: var(--inverse);
34
+
35
+ /* Borders */
36
+ --color-border: var(--border);
37
+ --color-line-inverse: var(--border-line-inverse);
38
+ --color-line-1: var(--border-line-1);
39
+ --color-line-2: var(--border-line-2);
40
+ --color-line-3: var(--border-line-3);
41
+ --color-line-4: var(--border-line-4);
42
+ --color-line-5: var(--border-line-5);
43
+ --color-line-6: var(--border-line-6);
44
+ --color-line-7: var(--border-line-7);
45
+ --color-line-8: var(--border-line-8);
46
+
47
+ /* Primary scale */
48
+ --color-primary-50: var(--primary-50);
49
+ --color-primary-100: var(--primary-100);
50
+ --color-primary-200: var(--primary-200);
51
+ --color-primary-300: var(--primary-300);
52
+ --color-primary-400: var(--primary-400);
53
+ --color-primary-500: var(--primary-500);
54
+ --color-primary-600: var(--primary-600);
55
+ --color-primary-700: var(--primary-700);
56
+ --color-primary-800: var(--primary-800);
57
+ --color-primary-900: var(--primary-900);
58
+ --color-primary-950: var(--primary-950);
59
+
60
+ /* Primary semantic */
61
+ --color-primary: var(--primary);
62
+ --color-primary-line: var(--primary-line);
63
+ --color-primary-foreground: var(--primary-foreground);
64
+ --color-primary-hover: var(--primary-hover);
65
+ --color-primary-focus: var(--primary-focus);
66
+ --color-primary-active: var(--primary-active);
67
+ --color-primary-checked: var(--primary-checked);
68
+
69
+ /* Secondary */
70
+ --color-secondary: var(--secondary);
71
+ --color-secondary-line: var(--secondary-line);
72
+ --color-secondary-foreground: var(--secondary-foreground);
73
+ --color-secondary-hover: var(--secondary-hover);
74
+ --color-secondary-focus: var(--secondary-focus);
75
+ --color-secondary-active: var(--secondary-active);
76
+
77
+ /* Layer */
78
+ --color-layer: var(--layer);
79
+ --color-layer-line: var(--layer-line);
80
+ --color-layer-foreground: var(--layer-foreground);
81
+ --color-layer-hover: var(--layer-hover);
82
+ --color-layer-focus: var(--layer-focus);
83
+ --color-layer-active: var(--layer-active);
84
+
85
+ /* Surface */
86
+ --color-surface: var(--surface);
87
+ --color-surface-1: var(--surface-1);
88
+ --color-surface-2: var(--surface-2);
89
+ --color-surface-3: var(--surface-3);
90
+ --color-surface-4: var(--surface-4);
91
+ --color-surface-5: var(--surface-5);
92
+ --color-surface-line: var(--surface-line);
93
+ --color-surface-foreground: var(--surface-foreground);
94
+ --color-surface-hover: var(--surface-hover);
95
+ --color-surface-focus: var(--surface-focus);
96
+ --color-surface-active: var(--surface-active);
97
+
98
+ /* Muted */
99
+ --color-muted: var(--muted);
100
+ --color-muted-foreground: var(--muted-foreground);
101
+ --color-muted-foreground-1: var(--muted-foreground-1);
102
+ --color-muted-foreground-2: var(--muted-foreground-2);
103
+ --color-muted-hover: var(--muted-hover);
104
+ --color-muted-focus: var(--muted-focus);
105
+ --color-muted-active: var(--muted-active);
106
+
107
+ /* Destructive */
108
+ --color-destructive: var(--destructive);
109
+ --color-destructive-foreground: var(--destructive-foreground);
110
+ --color-destructive-hover: var(--destructive-hover);
111
+ --color-destructive-focus: var(--destructive-focus);
112
+
113
+ /* Navbar */
114
+ --color-navbar: var(--navbar);
115
+ --color-navbar-line: var(--navbar-line);
116
+ --color-navbar-divider: var(--navbar-divider);
117
+ --color-navbar-nav-foreground: var(--navbar-nav-foreground);
118
+ --color-navbar-nav-hover: var(--navbar-nav-hover);
119
+ --color-navbar-nav-focus: var(--navbar-nav-focus);
120
+ --color-navbar-nav-active: var(--navbar-nav-active);
121
+ --color-navbar-nav-list-divider: var(--navbar-nav-list-divider);
122
+ --color-navbar-inverse: var(--navbar-inverse);
123
+
124
+ --color-navbar-1: var(--navbar-1);
125
+ --color-navbar-1-line: var(--navbar-1-line);
126
+ --color-navbar-1-divider: var(--navbar-1-divider);
127
+ --color-navbar-1-nav-foreground: var(--navbar-1-nav-foreground);
128
+ --color-navbar-1-nav-hover: var(--navbar-1-nav-hover);
129
+ --color-navbar-1-nav-focus: var(--navbar-1-nav-focus);
130
+ --color-navbar-1-nav-active: var(--navbar-1-nav-active);
131
+ --color-navbar-1-nav-list-divider: var(--navbar-1-nav-list-divider);
132
+
133
+ --color-navbar-2: var(--navbar-2);
134
+ --color-navbar-2-line: var(--navbar-2-line);
135
+ --color-navbar-2-divider: var(--navbar-2-divider);
136
+ --color-navbar-2-nav-foreground: var(--navbar-2-nav-foreground);
137
+ --color-navbar-2-nav-hover: var(--navbar-2-nav-hover);
138
+ --color-navbar-2-nav-focus: var(--navbar-2-nav-focus);
139
+ --color-navbar-2-nav-active: var(--navbar-2-nav-active);
140
+ --color-navbar-2-nav-list-divider: var(--navbar-2-nav-list-divider);
141
+
142
+ /* Sidebar */
143
+ --color-sidebar: var(--sidebar);
144
+ --color-sidebar-line: var(--sidebar-line);
145
+ --color-sidebar-divider: var(--sidebar-divider);
146
+ --color-sidebar-nav-foreground: var(--sidebar-nav-foreground);
147
+ --color-sidebar-nav-hover: var(--sidebar-nav-hover);
148
+ --color-sidebar-nav-focus: var(--sidebar-nav-focus);
149
+ --color-sidebar-nav-active: var(--sidebar-nav-active);
150
+ --color-sidebar-nav-list-divider: var(--sidebar-nav-list-divider);
151
+ --color-sidebar-inverse: var(--sidebar-inverse);
152
+
153
+ --color-sidebar-1: var(--sidebar-1);
154
+ --color-sidebar-1-line: var(--sidebar-1-line);
155
+ --color-sidebar-1-divider: var(--sidebar-1-divider);
156
+ --color-sidebar-1-nav-foreground: var(--sidebar-1-nav-foreground);
157
+ --color-sidebar-1-nav-hover: var(--sidebar-1-nav-hover);
158
+ --color-sidebar-1-nav-focus: var(--sidebar-1-nav-focus);
159
+ --color-sidebar-1-nav-active: var(--sidebar-1-nav-active);
160
+ --color-sidebar-1-nav-list-divider: var(--sidebar-1-nav-list-divider);
161
+
162
+ --color-sidebar-2: var(--sidebar-2);
163
+ --color-sidebar-2-line: var(--sidebar-2-line);
164
+ --color-sidebar-2-divider: var(--sidebar-2-divider);
165
+ --color-sidebar-2-nav-foreground: var(--sidebar-2-nav-foreground);
166
+ --color-sidebar-2-nav-hover: var(--sidebar-2-nav-hover);
167
+ --color-sidebar-2-nav-focus: var(--sidebar-2-nav-focus);
168
+ --color-sidebar-2-nav-active: var(--sidebar-2-nav-active);
169
+ --color-sidebar-2-nav-list-divider: var(--sidebar-2-nav-list-divider);
170
+
171
+ /* Card */
172
+ --color-card: var(--card);
173
+ --color-card-line: var(--card-line);
174
+ --color-card-divider: var(--card-divider);
175
+ --color-card-header: var(--card-header);
176
+ --color-card-footer: var(--card-footer);
177
+ --color-card-inverse: var(--card-inverse);
178
+
179
+ /* Dropdown */
180
+ --color-dropdown: var(--dropdown);
181
+ --color-dropdown-1: var(--dropdown-1);
182
+ --color-dropdown-line: var(--dropdown-line);
183
+ --color-dropdown-divider: var(--dropdown-divider);
184
+ --color-dropdown-header: var(--dropdown-header);
185
+ --color-dropdown-footer: var(--dropdown-footer);
186
+ --color-dropdown-item-foreground: var(--dropdown-item-foreground);
187
+ --color-dropdown-item-hover: var(--dropdown-item-hover);
188
+ --color-dropdown-item-focus: var(--dropdown-item-focus);
189
+ --color-dropdown-item-active: var(--dropdown-item-active);
190
+ --color-dropdown-inverse: var(--dropdown-inverse);
191
+
192
+ /* Select */
193
+ --color-select: var(--select);
194
+ --color-select-1: var(--select-1);
195
+ --color-select-line: var(--select-line);
196
+ --color-select-item-foreground: var(--select-item-foreground);
197
+ --color-select-item-hover: var(--select-item-hover);
198
+ --color-select-item-focus: var(--select-item-focus);
199
+ --color-select-item-active: var(--select-item-active);
200
+ --color-select-inverse: var(--select-inverse);
201
+
202
+ /* Overlay */
203
+ --color-overlay: var(--overlay);
204
+ --color-overlay-line: var(--overlay-line);
205
+ --color-overlay-divider: var(--overlay-divider);
206
+ --color-overlay-header: var(--overlay-header);
207
+ --color-overlay-footer: var(--overlay-footer);
208
+ --color-overlay-inverse: var(--overlay-inverse);
209
+
210
+ /* Popover */
211
+ --color-popover: var(--popover);
212
+ --color-popover-line: var(--popover-line);
213
+
214
+ /* Tooltip */
215
+ --color-tooltip: var(--tooltip);
216
+ --color-tooltip-line: var(--tooltip-line);
217
+ --color-tooltip-foreground: var(--tooltip-foreground);
218
+
219
+ /* Table */
220
+ --color-table-line: var(--table-line);
221
+
222
+ /* Switch */
223
+ --color-switch: var(--switch);
224
+
225
+ /* Footer */
226
+ --color-footer: var(--footer);
227
+ --color-footer-line: var(--footer-line);
228
+ --color-footer-inverse: var(--footer-inverse);
229
+
230
+ /* Scrollbar */
231
+ --color-scrollbar-track: var(--scrollbar-track);
232
+ --color-scrollbar-thumb: var(--scrollbar-thumb);
233
+ --color-scrollbar-track-inverse: var(--scrollbar-track-inverse);
234
+ --color-scrollbar-thumb-inverse: var(--scrollbar-thumb-inverse);
235
+
236
+ /* Charts */
237
+ --color-chart-primary: var(--chart-primary);
238
+ --color-chart-1: var(--chart-1);
239
+ --color-chart-2: var(--chart-2);
240
+ --color-chart-3: var(--chart-3);
241
+ --color-chart-4: var(--chart-4);
242
+ --color-chart-5: var(--chart-5);
243
+ --color-chart-6: var(--chart-6);
244
+ --color-chart-7: var(--chart-7);
245
+ --color-chart-8: var(--chart-8);
246
+ --color-chart-9: var(--chart-9);
247
+ --color-chart-10: var(--chart-10);
248
+
249
+ --shadow-2xs: 0 1px 2px 0 rgb(15 23 42 / 0.04);
250
+ }
251
+
252
+ /* ─── Light theme ───────────────────────────────────────────── */
253
+ :root {
254
+ --background: #ffffff;
255
+ --background-1: #f8fafc;
256
+ --background-2: #f1f5f9;
257
+ --background-plain: #ffffff;
258
+ --foreground: #111827;
259
+ --foreground-inverse: #ffffff;
260
+ --inverse: #111827;
261
+
262
+ --border: #e5e7eb;
263
+ --border-line-inverse: #ffffff;
264
+ --border-line-1: #f3f4f6;
265
+ --border-line-2: #e5e7eb;
266
+ --border-line-3: #d1d5db;
267
+ --border-line-4: #9ca3af;
268
+ --border-line-5: #6b7280;
269
+ --border-line-6: #4b5563;
270
+ --border-line-7: #374151;
271
+ --border-line-8: #1f2937;
272
+
273
+ --primary-50: #eff6ff;
274
+ --primary-100: #dbeafe;
275
+ --primary-200: #bfdbfe;
276
+ --primary-300: #93c5fd;
277
+ --primary-400: #60a5fa;
278
+ --primary-500: #3b82f6;
279
+ --primary-600: #2563eb;
280
+ --primary-700: #1d4ed8;
281
+ --primary-800: #1e40af;
282
+ --primary-900: #1e3a8a;
283
+ --primary-950: #172554;
284
+
285
+ --primary: #2563eb;
286
+ --primary-line: transparent;
287
+ --primary-foreground: #ffffff;
288
+ --primary-hover: #1d4ed8;
289
+ --primary-focus: #1d4ed8;
290
+ --primary-active: #1d4ed8;
291
+ --primary-checked: #2563eb;
292
+
293
+ --secondary: #111827;
294
+ --secondary-line: transparent;
295
+ --secondary-foreground: #ffffff;
296
+ --secondary-hover: #1f2937;
297
+ --secondary-focus: #1f2937;
298
+ --secondary-active: #1f2937;
299
+
300
+ --card: #ffffff;
301
+ --card-line: #e5e7eb;
302
+ --card-divider: #e5e7eb;
303
+ --card-header: #e5e7eb;
304
+ --card-footer: #e5e7eb;
305
+ --card-inverse: #111827;
306
+
307
+ --layer: #ffffff;
308
+ --layer-line: #e5e7eb;
309
+ --layer-foreground: #111827;
310
+ --layer-hover: #f8fafc;
311
+ --layer-focus: #f1f5f9;
312
+ --layer-active: #f1f5f9;
313
+
314
+ --surface: #f3f4f6;
315
+ --surface-1: #e5e7eb;
316
+ --surface-2: #d1d5db;
317
+ --surface-3: #9ca3af;
318
+ --surface-4: #6b7280;
319
+ --surface-5: #4b5563;
320
+ --surface-line: transparent;
321
+ --surface-foreground: #374151;
322
+ --surface-hover: #e5e7eb;
323
+ --surface-focus: #e5e7eb;
324
+ --surface-active: #e5e7eb;
325
+
326
+ --muted: #f8fafc;
327
+ --muted-foreground: #64748b;
328
+ --muted-foreground-1: #475569;
329
+ --muted-foreground-2: #94a3b8;
330
+ --muted-hover: #f1f5f9;
331
+ --muted-focus: #e2e8f0;
332
+ --muted-active: #f1f5f9;
333
+
334
+ --destructive: #ef4444;
335
+ --destructive-foreground: #ffffff;
336
+ --destructive-hover: #dc2626;
337
+ --destructive-focus: #dc2626;
338
+
339
+ --navbar: #ffffff;
340
+ --navbar-line: #e5e7eb;
341
+ --navbar-divider: #e5e7eb;
342
+ --navbar-nav-foreground: #374151;
343
+ --navbar-nav-hover: #f3f4f6;
344
+ --navbar-nav-focus: #f3f4f6;
345
+ --navbar-nav-active: #f3f4f6;
346
+ --navbar-nav-list-divider: #e5e7eb;
347
+ --navbar-inverse: #1e293b;
348
+
349
+ --navbar-1: #f8fafc;
350
+ --navbar-1-line: #e5e7eb;
351
+ --navbar-1-divider: #e5e7eb;
352
+ --navbar-1-nav-foreground: #374151;
353
+ --navbar-1-nav-hover: #e5e7eb;
354
+ --navbar-1-nav-focus: #e5e7eb;
355
+ --navbar-1-nav-active: #e5e7eb;
356
+ --navbar-1-nav-list-divider: #e5e7eb;
357
+
358
+ --navbar-2: #f3f4f6;
359
+ --navbar-2-line: transparent;
360
+ --navbar-2-divider: #d1d5db;
361
+ --navbar-2-nav-foreground: #374151;
362
+ --navbar-2-nav-hover: #e5e7eb;
363
+ --navbar-2-nav-focus: #e5e7eb;
364
+ --navbar-2-nav-active: #e5e7eb;
365
+ --navbar-2-nav-list-divider: #e5e7eb;
366
+
367
+ --sidebar: #ffffff;
368
+ --sidebar-line: #e5e7eb;
369
+ --sidebar-divider: #e5e7eb;
370
+ --sidebar-nav-foreground: #475569;
371
+ --sidebar-nav-hover: #f1f5f9;
372
+ --sidebar-nav-focus: #f1f5f9;
373
+ --sidebar-nav-active: #f1f5f9;
374
+ --sidebar-nav-list-divider: #e5e7eb;
375
+ --sidebar-inverse: #172554;
376
+
377
+ --sidebar-1: #f8fafc;
378
+ --sidebar-1-line: #e5e7eb;
379
+ --sidebar-1-divider: #e5e7eb;
380
+ --sidebar-1-nav-foreground: #374151;
381
+ --sidebar-1-nav-hover: #e5e7eb;
382
+ --sidebar-1-nav-focus: #e5e7eb;
383
+ --sidebar-1-nav-active: #e5e7eb;
384
+ --sidebar-1-nav-list-divider: #e5e7eb;
385
+
386
+ --sidebar-2: #f3f4f6;
387
+ --sidebar-2-line: transparent;
388
+ --sidebar-2-divider: #e5e7eb;
389
+ --sidebar-2-nav-foreground: #374151;
390
+ --sidebar-2-nav-hover: #e5e7eb;
391
+ --sidebar-2-nav-focus: #e5e7eb;
392
+ --sidebar-2-nav-active: #e5e7eb;
393
+ --sidebar-2-nav-list-divider: #e5e7eb;
394
+
395
+ --dropdown: #ffffff;
396
+ --dropdown-1: #ffffff;
397
+ --dropdown-line: transparent;
398
+ --dropdown-divider: #e5e7eb;
399
+ --dropdown-header: #e5e7eb;
400
+ --dropdown-footer: #e5e7eb;
401
+ --dropdown-item-foreground: #334155;
402
+ --dropdown-item-hover: #f1f5f9;
403
+ --dropdown-item-focus: #e2e8f0;
404
+ --dropdown-item-active: #f1f5f9;
405
+ --dropdown-inverse: #111827;
406
+
407
+ --select: #ffffff;
408
+ --select-1: #ffffff;
409
+ --select-line: transparent;
410
+ --select-item-foreground: #334155;
411
+ --select-item-hover: #f1f5f9;
412
+ --select-item-focus: #e2e8f0;
413
+ --select-item-active: #e2e8f0;
414
+ --select-inverse: #111827;
415
+
416
+ --overlay: #ffffff;
417
+ --overlay-line: transparent;
418
+ --overlay-divider: #e5e7eb;
419
+ --overlay-header: #e5e7eb;
420
+ --overlay-footer: #e5e7eb;
421
+ --overlay-inverse: #111827;
422
+
423
+ --popover: #ffffff;
424
+ --popover-line: #f3f4f6;
425
+
426
+ --tooltip: #111827;
427
+ --tooltip-line: transparent;
428
+ --tooltip-foreground: #ffffff;
429
+
430
+ --table-line: #e5e7eb;
431
+
432
+ --switch: #ffffff;
433
+
434
+ --footer: #ffffff;
435
+ --footer-line: #e5e7eb;
436
+ --footer-inverse: #111827;
437
+
438
+ --scrollbar-track: #f1f5f9;
439
+ --scrollbar-thumb: #cbd5e1;
440
+ --scrollbar-track-inverse: transparent;
441
+ --scrollbar-thumb-inverse: #ffffff;
442
+
443
+ --chart-primary: #2563eb;
444
+ --chart-1: #eff6ff;
445
+ --chart-2: #bfdbfe;
446
+ --chart-3: #60a5fa;
447
+ --chart-4: #1e40af;
448
+ --chart-5: #9333ea;
449
+ --chart-6: #22d3ee;
450
+ --chart-7: #f97316;
451
+ --chart-8: #f3f4f6;
452
+ --chart-9: #e5e7eb;
453
+ --chart-10: #d1d5db;
454
+ }
455
+
456
+ /* ─── Dark theme ────────────────────────────────────────────── */
457
+ .dark {
458
+ --background: #020617;
459
+ --background-1: #0f172a;
460
+ --background-2: #111827;
461
+ --background-plain: #0f172a;
462
+ --foreground: #f8fafc;
463
+ --foreground-inverse: #f8fafc;
464
+ --inverse: #020617;
465
+
466
+ --border: #1f2937;
467
+ --border-line-inverse: #020617;
468
+ --border-line-1: #111827;
469
+ --border-line-2: #1f2937;
470
+ --border-line-3: #374151;
471
+ --border-line-4: #4b5563;
472
+ --border-line-5: #6b7280;
473
+ --border-line-6: #9ca3af;
474
+ --border-line-7: #d1d5db;
475
+ --border-line-8: #f3f4f6;
476
+
477
+ --primary-50: #172554;
478
+ --primary-100: #1e3a8a;
479
+ --primary-200: #1e40af;
480
+ --primary-300: #1d4ed8;
481
+ --primary-400: #2563eb;
482
+ --primary-500: #3b82f6;
483
+ --primary-600: #60a5fa;
484
+ --primary-700: #93c5fd;
485
+ --primary-800: #bfdbfe;
486
+ --primary-900: #dbeafe;
487
+ --primary-950: #eff6ff;
488
+
489
+ --primary: #60a5fa;
490
+ --primary-line: transparent;
491
+ --primary-foreground: #0f172a;
492
+ --primary-hover: #93c5fd;
493
+ --primary-focus: #93c5fd;
494
+ --primary-active: #93c5fd;
495
+ --primary-checked: #60a5fa;
496
+
497
+ --secondary: #f8fafc;
498
+ --secondary-line: transparent;
499
+ --secondary-foreground: #0f172a;
500
+ --secondary-hover: #e2e8f0;
501
+ --secondary-focus: #e2e8f0;
502
+ --secondary-active: #e2e8f0;
503
+
504
+ --card: #111827;
505
+ --card-line: #1f2937;
506
+ --card-divider: #1f2937;
507
+ --card-header: #1f2937;
508
+ --card-footer: #1f2937;
509
+ --card-inverse: #0f172a;
510
+
511
+ --layer: #111827;
512
+ --layer-line: #1f2937;
513
+ --layer-foreground: #f8fafc;
514
+ --layer-hover: #1e293b;
515
+ --layer-focus: #334155;
516
+ --layer-active: #1e293b;
517
+
518
+ --surface: #1f2937;
519
+ --surface-1: #334155;
520
+ --surface-2: #475569;
521
+ --surface-3: #64748b;
522
+ --surface-4: #94a3b8;
523
+ --surface-5: #cbd5e1;
524
+ --surface-line: transparent;
525
+ --surface-foreground: #e5e7eb;
526
+ --surface-hover: #1e293b;
527
+ --surface-focus: #1e293b;
528
+ --surface-active: #1e293b;
529
+
530
+ --muted: #111827;
531
+ --muted-foreground: #94a3b8;
532
+ --muted-foreground-1: #cbd5e1;
533
+ --muted-foreground-2: #64748b;
534
+ --muted-hover: #1e293b;
535
+ --muted-focus: #334155;
536
+ --muted-active: #1e293b;
537
+
538
+ --destructive: #ef4444;
539
+ --destructive-foreground: #ffffff;
540
+ --destructive-hover: #dc2626;
541
+ --destructive-focus: #dc2626;
542
+
543
+ --navbar: #111827;
544
+ --navbar-line: #1f2937;
545
+ --navbar-divider: #1f2937;
546
+ --navbar-nav-foreground: #cbd5e1;
547
+ --navbar-nav-hover: #1e293b;
548
+ --navbar-nav-focus: #1e293b;
549
+ --navbar-nav-active: #1e293b;
550
+ --navbar-nav-list-divider: #334155;
551
+ --navbar-inverse: #0f172a;
552
+
553
+ --navbar-1: #0f172a;
554
+ --navbar-1-line: #1f2937;
555
+ --navbar-1-divider: #1f2937;
556
+ --navbar-1-nav-foreground: #cbd5e1;
557
+ --navbar-1-nav-hover: #1e293b;
558
+ --navbar-1-nav-focus: #1e293b;
559
+ --navbar-1-nav-active: #1e293b;
560
+ --navbar-1-nav-list-divider: #334155;
561
+
562
+ --navbar-2: #0f172a;
563
+ --navbar-2-line: transparent;
564
+ --navbar-2-divider: #1e293b;
565
+ --navbar-2-nav-foreground: #cbd5e1;
566
+ --navbar-2-nav-hover: #111827;
567
+ --navbar-2-nav-focus: #111827;
568
+ --navbar-2-nav-active: #111827;
569
+ --navbar-2-nav-list-divider: #111827;
570
+
571
+ --sidebar: #111827;
572
+ --sidebar-line: #1f2937;
573
+ --sidebar-divider: #1f2937;
574
+ --sidebar-nav-foreground: #94a3b8;
575
+ --sidebar-nav-hover: #1e293b;
576
+ --sidebar-nav-focus: #1e293b;
577
+ --sidebar-nav-active: #1e293b;
578
+ --sidebar-nav-list-divider: #334155;
579
+ --sidebar-inverse: #020617;
580
+
581
+ --sidebar-1: #0f172a;
582
+ --sidebar-1-line: #1f2937;
583
+ --sidebar-1-divider: #1f2937;
584
+ --sidebar-1-nav-foreground: #cbd5e1;
585
+ --sidebar-1-nav-hover: #1e293b;
586
+ --sidebar-1-nav-focus: #1e293b;
587
+ --sidebar-1-nav-active: #1e293b;
588
+ --sidebar-1-nav-list-divider: #334155;
589
+
590
+ --sidebar-2: #0f172a;
591
+ --sidebar-2-line: transparent;
592
+ --sidebar-2-divider: #1e293b;
593
+ --sidebar-2-nav-foreground: #cbd5e1;
594
+ --sidebar-2-nav-hover: #111827;
595
+ --sidebar-2-nav-focus: #111827;
596
+ --sidebar-2-nav-active: #111827;
597
+ --sidebar-2-nav-list-divider: #111827;
598
+
599
+ --dropdown: #111827;
600
+ --dropdown-1: #0f172a;
601
+ --dropdown-line: transparent;
602
+ --dropdown-divider: #1f2937;
603
+ --dropdown-header: #1f2937;
604
+ --dropdown-footer: #1f2937;
605
+ --dropdown-item-foreground: #e5e7eb;
606
+ --dropdown-item-hover: #1e293b;
607
+ --dropdown-item-focus: #334155;
608
+ --dropdown-item-active: #1e293b;
609
+ --dropdown-inverse: #0f172a;
610
+
611
+ --select: #0f172a;
612
+ --select-1: #020617;
613
+ --select-line: transparent;
614
+ --select-item-foreground: #e5e7eb;
615
+ --select-item-hover: #1e293b;
616
+ --select-item-focus: #1e293b;
617
+ --select-item-active: #1e293b;
618
+ --select-inverse: #0f172a;
619
+
620
+ --overlay: #111827;
621
+ --overlay-line: transparent;
622
+ --overlay-divider: #1f2937;
623
+ --overlay-header: #1f2937;
624
+ --overlay-footer: #1f2937;
625
+ --overlay-inverse: #0f172a;
626
+
627
+ --popover: #0f172a;
628
+ --popover-line: #1f2937;
629
+
630
+ --tooltip: #f8fafc;
631
+ --tooltip-line: transparent;
632
+ --tooltip-foreground: #020617;
633
+
634
+ --table-line: #1f2937;
635
+
636
+ --switch: #1f2937;
637
+
638
+ --footer: #111827;
639
+ --footer-line: #1f2937;
640
+ --footer-inverse: #0f172a;
641
+
642
+ --scrollbar-track: #111827;
643
+ --scrollbar-thumb: #475569;
644
+ --scrollbar-track-inverse: #334155;
645
+ --scrollbar-thumb-inverse: #475569;
646
+
647
+ --chart-primary: #60a5fa;
648
+ --chart-1: #eff6ff;
649
+ --chart-2: #bfdbfe;
650
+ --chart-3: #60a5fa;
651
+ --chart-4: #1e40af;
652
+ --chart-5: #a855f7;
653
+ --chart-6: #22d3ee;
654
+ --chart-7: #f97316;
655
+ --chart-8: #374151;
656
+ --chart-9: #1f2937;
657
+ --chart-10: #374151;
658
+ }
659
+
660
+ /* ─── Base styles ───────────────────────────────────────────── */
661
+ @layer base {
662
+ html {
663
+ scrollbar-gutter: stable;
664
+ }
665
+
666
+ ::-webkit-scrollbar {
667
+ width: 6px;
668
+ height: 6px;
669
+ }
670
+ ::-webkit-scrollbar-track {
671
+ background: var(--scrollbar-track);
672
+ }
673
+ ::-webkit-scrollbar-thumb {
674
+ background: var(--scrollbar-thumb);
675
+ border-radius: 9999px;
676
+ }
677
+ ::-webkit-scrollbar-thumb:hover {
678
+ background: var(--muted-foreground-2);
679
+ }
680
+ ::-webkit-scrollbar-corner {
681
+ background: var(--scrollbar-track);
682
+ }
683
+
684
+ button:not(:disabled),
685
+ [role="button"]:not(:disabled) {
686
+ cursor: pointer;
687
+ }
688
+
689
+ body {
690
+ font-family: 'Inter', sans-serif;
691
+ font-size: 13px;
692
+ -webkit-font-smoothing: antialiased;
693
+ -moz-osx-font-smoothing: grayscale;
694
+ }
695
+ }
696
+
697
+ /* ─── Page transitions ──────────────────────────────────────── */
698
+ .page-enter-active,
699
+ .page-leave-active {
700
+ transition: all 0.2s ease-out;
701
+ }
702
+ .page-enter-from { opacity: 0; filter: blur(2px); }
703
+ .page-leave-to { opacity: 0; filter: blur(2px); }
704
+ .page-enter-to,
705
+ .page-leave-from { opacity: 1; filter: blur(0px); }
706
+
707
+ /* ─── Layout transitions ────────────────────────────────────── */
708
+ .layout-enter-active,
709
+ .layout-leave-active {
710
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
711
+ }
712
+ .layout-enter-from { opacity: 0; transform: scale(0.96); filter: blur(4px); }
713
+ .layout-leave-to { opacity: 0; transform: scale(1.02); filter: blur(4px); }
714
+ .layout-enter-to,
715
+ .layout-leave-from { opacity: 1; transform: scale(1); filter: blur(0px); }
716
+
717
+ /* ─── Page loader ───────────────────────────────────────────── */
718
+ .page-loading-blur {
719
+ filter: blur(2px);
720
+ transition: filter 0.2s ease-out;
721
+ }