@trackany-device/components 1.0.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 (289) hide show
  1. package/package.json +185 -0
  2. package/src/assets/logo.png +0 -0
  3. package/src/assets/map/arrows/map-arrow-blue.png +0 -0
  4. package/src/assets/map/arrows/map-arrow-green.png +0 -0
  5. package/src/assets/map/arrows/map-arrow-purple.png +0 -0
  6. package/src/assets/map/arrows/map-arrow-red.png +0 -0
  7. package/src/assets/map/flags/flag-blue.png +0 -0
  8. package/src/assets/map/flags/flag-green.png +0 -0
  9. package/src/assets/map/flags/flag-red.png +0 -0
  10. package/src/assets/map/flags/flag-yellow.png +0 -0
  11. package/src/assets/map/pins/map-pin-blue.png +0 -0
  12. package/src/assets/map/pins/map-pin-green.png +0 -0
  13. package/src/assets/map/pins/map-pin-purple.png +0 -0
  14. package/src/assets/map/pins/map-pin-red.png +0 -0
  15. package/src/components/Card.tsx +9 -0
  16. package/src/components/alert-error.tsx +24 -0
  17. package/src/components/app-content.tsx +22 -0
  18. package/src/components/app-header.tsx +153 -0
  19. package/src/components/app-logo-icon.tsx +13 -0
  20. package/src/components/app-logo.tsx +21 -0
  21. package/src/components/app-shell.tsx +19 -0
  22. package/src/components/app-sidebar-header.tsx +68 -0
  23. package/src/components/app-sidebar.tsx +106 -0
  24. package/src/components/appearance-tabs.tsx +46 -0
  25. package/src/components/breadcrumbs.tsx +50 -0
  26. package/src/components/cms/blurred-image.tsx +111 -0
  27. package/src/components/cms/section-bg.tsx +473 -0
  28. package/src/components/cms/section-button.tsx +127 -0
  29. package/src/components/cms/sections/banner-5050-section.tsx +135 -0
  30. package/src/components/cms/sections/blogs-listing-section.tsx +270 -0
  31. package/src/components/cms/sections/cards-grid-section.tsx +185 -0
  32. package/src/components/cms/sections/contact-form-section.tsx +157 -0
  33. package/src/components/cms/sections/cta-section.tsx +101 -0
  34. package/src/components/cms/sections/featured-blog-slider-section.tsx +256 -0
  35. package/src/components/cms/sections/featured-products-grid-section.tsx +173 -0
  36. package/src/components/cms/sections/featured-solutions-grid-section.tsx +183 -0
  37. package/src/components/cms/sections/hero-section.tsx +180 -0
  38. package/src/components/cms/sections/solutions-with-filter-section.tsx +234 -0
  39. package/src/components/cms/sections/text-section.tsx +77 -0
  40. package/src/components/cutout-image.tsx +228 -0
  41. package/src/components/devices/devices-mini-map.tsx +275 -0
  42. package/src/components/docs/docs-shell.tsx +280 -0
  43. package/src/components/fleet-hero-animated.tsx +383 -0
  44. package/src/components/input-error.tsx +17 -0
  45. package/src/components/keenicons/assets/duotone/Read Me.txt +7 -0
  46. package/src/components/keenicons/assets/duotone/demo-files/demo.css +160 -0
  47. package/src/components/keenicons/assets/duotone/demo-files/demo.js +32 -0
  48. package/src/components/keenicons/assets/duotone/demo.html +12424 -0
  49. package/src/components/keenicons/assets/duotone/fonts/keenicons-duotone.svg +1109 -0
  50. package/src/components/keenicons/assets/duotone/fonts/keenicons-duotone.ttf +0 -0
  51. package/src/components/keenicons/assets/duotone/fonts/keenicons-duotone.woff +0 -0
  52. package/src/components/keenicons/assets/duotone/selection.json +17313 -0
  53. package/src/components/keenicons/assets/duotone/style.css +4931 -0
  54. package/src/components/keenicons/assets/filled/Read Me.txt +7 -0
  55. package/src/components/keenicons/assets/filled/demo-files/demo.css +160 -0
  56. package/src/components/keenicons/assets/filled/demo-files/demo.js +32 -0
  57. package/src/components/keenicons/assets/filled/demo.html +12370 -0
  58. package/src/components/keenicons/assets/filled/fonts/keenicons-filled.svg +1082 -0
  59. package/src/components/keenicons/assets/filled/fonts/keenicons-filled.ttf +0 -0
  60. package/src/components/keenicons/assets/filled/fonts/keenicons-filled.woff +0 -0
  61. package/src/components/keenicons/assets/filled/selection.json +17096 -0
  62. package/src/components/keenicons/assets/filled/style.css +4769 -0
  63. package/src/components/keenicons/assets/outline/Read Me.txt +7 -0
  64. package/src/components/keenicons/assets/outline/demo-files/demo.css +160 -0
  65. package/src/components/keenicons/assets/outline/demo-files/demo.js +32 -0
  66. package/src/components/keenicons/assets/outline/demo.html +11356 -0
  67. package/src/components/keenicons/assets/outline/fonts/keenicons-outline.svg +575 -0
  68. package/src/components/keenicons/assets/outline/fonts/keenicons-outline.ttf +0 -0
  69. package/src/components/keenicons/assets/outline/fonts/keenicons-outline.woff +0 -0
  70. package/src/components/keenicons/assets/outline/selection.json +13054 -0
  71. package/src/components/keenicons/assets/outline/style.css +1721 -0
  72. package/src/components/keenicons/assets/solid/Read Me.txt +7 -0
  73. package/src/components/keenicons/assets/solid/demo-files/demo.css +160 -0
  74. package/src/components/keenicons/assets/solid/demo-files/demo.js +32 -0
  75. package/src/components/keenicons/assets/solid/demo.html +11356 -0
  76. package/src/components/keenicons/assets/solid/fonts/keenicons-solid.svg +575 -0
  77. package/src/components/keenicons/assets/solid/fonts/keenicons-solid.ttf +0 -0
  78. package/src/components/keenicons/assets/solid/fonts/keenicons-solid.woff +0 -0
  79. package/src/components/keenicons/assets/solid/selection.json +13048 -0
  80. package/src/components/keenicons/assets/solid/style.css +1721 -0
  81. package/src/components/keenicons/assets/styles.css +4 -0
  82. package/src/components/keenicons/index.ts +2 -0
  83. package/src/components/keenicons/keenicons.tsx +16 -0
  84. package/src/components/keenicons/types.ts +7 -0
  85. package/src/components/nav-footer.tsx +49 -0
  86. package/src/components/nav-main.tsx +53 -0
  87. package/src/components/nav-user.tsx +59 -0
  88. package/src/components/notification-bell.tsx +190 -0
  89. package/src/components/products/product-card.tsx +159 -0
  90. package/src/components/text-link.tsx +23 -0
  91. package/src/components/ui/accordion-menu.tsx +322 -0
  92. package/src/components/ui/accordion.tsx +133 -0
  93. package/src/components/ui/alert-dialog.tsx +82 -0
  94. package/src/components/ui/alert.tsx +63 -0
  95. package/src/components/ui/avatar-group.tsx +129 -0
  96. package/src/components/ui/avatar.tsx +67 -0
  97. package/src/components/ui/badge.tsx +230 -0
  98. package/src/components/ui/breadcrumb.tsx +88 -0
  99. package/src/components/ui/button.tsx +412 -0
  100. package/src/components/ui/calendar.tsx +56 -0
  101. package/src/components/ui/card.tsx +147 -0
  102. package/src/components/ui/chart.tsx +290 -0
  103. package/src/components/ui/checkbox.tsx +47 -0
  104. package/src/components/ui/code.tsx +45 -0
  105. package/src/components/ui/collapsible.tsx +31 -0
  106. package/src/components/ui/command-palette.tsx +189 -0
  107. package/src/components/ui/command.tsx +138 -0
  108. package/src/components/ui/cookie-banner.tsx +220 -0
  109. package/src/components/ui/copy-button.tsx +60 -0
  110. package/src/components/ui/data-grid-column-filter.tsx +124 -0
  111. package/src/components/ui/data-grid-column-header.tsx +284 -0
  112. package/src/components/ui/data-grid-column-visibility.tsx +38 -0
  113. package/src/components/ui/data-grid-pagination.tsx +206 -0
  114. package/src/components/ui/data-grid-table-dnd-rows.tsx +147 -0
  115. package/src/components/ui/data-grid-table-dnd.tsx +175 -0
  116. package/src/components/ui/data-grid-table.tsx +500 -0
  117. package/src/components/ui/data-grid.tsx +193 -0
  118. package/src/components/ui/data-list.tsx +76 -0
  119. package/src/components/ui/datefield.tsx +91 -0
  120. package/src/components/ui/dialog.tsx +139 -0
  121. package/src/components/ui/divider.tsx +41 -0
  122. package/src/components/ui/drawer.tsx +59 -0
  123. package/src/components/ui/dropdown-menu.tsx +224 -0
  124. package/src/components/ui/empty-state.tsx +54 -0
  125. package/src/components/ui/file-upload.tsx +152 -0
  126. package/src/components/ui/form.tsx +88 -0
  127. package/src/components/ui/icon.tsx +14 -0
  128. package/src/components/ui/input-otp.tsx +71 -0
  129. package/src/components/ui/input.tsx +155 -0
  130. package/src/components/ui/kbd.tsx +26 -0
  131. package/src/components/ui/label.tsx +31 -0
  132. package/src/components/ui/navigation-menu.tsx +168 -0
  133. package/src/components/ui/pagination.tsx +37 -0
  134. package/src/components/ui/placeholder-pattern.tsx +21 -0
  135. package/src/components/ui/popover.tsx +50 -0
  136. package/src/components/ui/progress.tsx +65 -0
  137. package/src/components/ui/radio-group.tsx +73 -0
  138. package/src/components/ui/resizable.tsx +39 -0
  139. package/src/components/ui/scroll-area.tsx +50 -0
  140. package/src/components/ui/select.tsx +234 -0
  141. package/src/components/ui/separator.tsx +24 -0
  142. package/src/components/ui/sheet.tsx +147 -0
  143. package/src/components/ui/sidebar.tsx +721 -0
  144. package/src/components/ui/skeleton.tsx +15 -0
  145. package/src/components/ui/slider.tsx +35 -0
  146. package/src/components/ui/sonner.tsx +28 -0
  147. package/src/components/ui/sortable.tsx +724 -0
  148. package/src/components/ui/spinner.tsx +17 -0
  149. package/src/components/ui/stat-card.tsx +82 -0
  150. package/src/components/ui/stepper.tsx +410 -0
  151. package/src/components/ui/switch.tsx +68 -0
  152. package/src/components/ui/table.tsx +42 -0
  153. package/src/components/ui/tabs.tsx +196 -0
  154. package/src/components/ui/timeline.tsx +90 -0
  155. package/src/components/ui/toggle-group.tsx +73 -0
  156. package/src/components/ui/toggle.tsx +45 -0
  157. package/src/components/ui/tooltip.tsx +55 -0
  158. package/src/components/user-info.tsx +33 -0
  159. package/src/components/user-menu-content.tsx +53 -0
  160. package/src/components/web/SiteFooter.tsx +154 -0
  161. package/src/components/web/SiteHeader.tsx +159 -0
  162. package/src/components/workflows/workflow-canvas.tsx +321 -0
  163. package/src/controls/Blockquote.tsx +25 -0
  164. package/src/controls/Button.tsx +101 -0
  165. package/src/controls/Checkbox.tsx +29 -0
  166. package/src/controls/DateField.tsx +37 -0
  167. package/src/controls/FormField.tsx +20 -0
  168. package/src/controls/Heading.tsx +28 -0
  169. package/src/controls/Input.tsx +21 -0
  170. package/src/controls/Label.tsx +18 -0
  171. package/src/controls/Paragraph.tsx +39 -0
  172. package/src/controls/PasswordInput.tsx +40 -0
  173. package/src/controls/RadioGroup.tsx +70 -0
  174. package/src/controls/Select.tsx +24 -0
  175. package/src/controls/Slider.tsx +33 -0
  176. package/src/controls/Switch.tsx +31 -0
  177. package/src/controls/Textarea.tsx +22 -0
  178. package/src/elements/ConfirmPasswordForm.tsx +43 -0
  179. package/src/elements/DeviceStatusBadge.tsx +38 -0
  180. package/src/elements/DriverCard.tsx +67 -0
  181. package/src/elements/ForgotPasswordForm.tsx +64 -0
  182. package/src/elements/IncidentCard.tsx +67 -0
  183. package/src/elements/LoginForm.tsx +100 -0
  184. package/src/elements/OtpForm.tsx +71 -0
  185. package/src/elements/RegisterForm.tsx +150 -0
  186. package/src/elements/ResetPasswordForm.tsx +72 -0
  187. package/src/elements/SmsChallengeForm.tsx +104 -0
  188. package/src/elements/VehicleCard.tsx +73 -0
  189. package/src/elements/VerifyEmailForm.tsx +39 -0
  190. package/src/hooks/use-appearance.tsx +117 -0
  191. package/src/hooks/use-applied-theme.ts +98 -0
  192. package/src/hooks/use-clipboard.ts +34 -0
  193. package/src/hooks/use-current-url.ts +83 -0
  194. package/src/hooks/use-dark-mode.ts +48 -0
  195. package/src/hooks/use-flash-toast.ts +29 -0
  196. package/src/hooks/use-initials.tsx +24 -0
  197. package/src/hooks/use-mobile-navigation.ts +12 -0
  198. package/src/hooks/use-mobile.tsx +38 -0
  199. package/src/index.ts +408 -0
  200. package/src/layouts/AppLayout.tsx +60 -0
  201. package/src/layouts/AuthLayout.tsx +32 -0
  202. package/src/layouts/SettingsLayout.tsx +21 -0
  203. package/src/layouts/app/AIChatLayout.tsx +73 -0
  204. package/src/layouts/app/AsideSidebarLayout.tsx +3 -0
  205. package/src/layouts/app/CalendarSidebarLayout.tsx +69 -0
  206. package/src/layouts/app/CommunitiesNavbarLayout.tsx +3 -0
  207. package/src/layouts/app/DualNavbarSidebarLayout.tsx +3 -0
  208. package/src/layouts/app/FocusSidebarLayout.tsx +75 -0
  209. package/src/layouts/app/MailLayout.tsx +69 -0
  210. package/src/layouts/app/MegaMenuHeaderLayout.tsx +3 -0
  211. package/src/layouts/app/MegaMenuLayout.tsx +81 -0
  212. package/src/layouts/app/MegaMenuNavbarLayout.tsx +88 -0
  213. package/src/layouts/app/MegaMenuSearchNavbarLayout.tsx +3 -0
  214. package/src/layouts/app/NavbarCollapsibleLayout.tsx +88 -0
  215. package/src/layouts/app/NavbarCollapsibleLinksLayout.tsx +3 -0
  216. package/src/layouts/app/NavbarMinimalLayout.tsx +3 -0
  217. package/src/layouts/app/NavbarMinimalSidebarLayout.tsx +3 -0
  218. package/src/layouts/app/NavbarSidebarDashboardLayout.tsx +3 -0
  219. package/src/layouts/app/NavbarSidebarLayout.tsx +92 -0
  220. package/src/layouts/app/NavbarSimpleSidebarLayout.tsx +3 -0
  221. package/src/layouts/app/NavbarTitledSidebarLayout.tsx +3 -0
  222. package/src/layouts/app/PanelSidebarLayout.tsx +3 -0
  223. package/src/layouts/app/SearchNavbarSidebarLayout.tsx +3 -0
  224. package/src/layouts/app/SidebarBreadcrumbLayout.tsx +3 -0
  225. package/src/layouts/app/SidebarCleanLayout.tsx +3 -0
  226. package/src/layouts/app/SidebarCommunitiesLayout.tsx +3 -0
  227. package/src/layouts/app/SidebarContentLayout.tsx +3 -0
  228. package/src/layouts/app/SidebarDualMenuLayout.tsx +104 -0
  229. package/src/layouts/app/SidebarFixedLayout.tsx +166 -0
  230. package/src/layouts/app/SidebarFooterNavbarLayout.tsx +3 -0
  231. package/src/layouts/app/SidebarHeaderMenuLayout.tsx +3 -0
  232. package/src/layouts/app/SidebarMegaMenuLayout.tsx +4 -0
  233. package/src/layouts/app/SidebarMinimalLayout.tsx +70 -0
  234. package/src/layouts/app/SidebarMobileSearchLayout.tsx +3 -0
  235. package/src/layouts/app/SidebarMultiPanelLayout.tsx +3 -0
  236. package/src/layouts/app/SidebarPrimarySecondaryLayout.tsx +3 -0
  237. package/src/layouts/app/SidebarSearchHeaderLayout.tsx +103 -0
  238. package/src/layouts/app/SidebarSearchToolbarLayout.tsx +3 -0
  239. package/src/layouts/app/SidebarTabsDualLayout.tsx +3 -0
  240. package/src/layouts/app/SidebarTabsLayout.tsx +98 -0
  241. package/src/layouts/app/SidebarTreeLayout.tsx +3 -0
  242. package/src/layouts/app/SplitNavbarLayout.tsx +3 -0
  243. package/src/layouts/app/SplitSidebarDashboardLayout.tsx +3 -0
  244. package/src/layouts/app/SplitSidebarLayout.tsx +99 -0
  245. package/src/layouts/app/TopNavLayout.tsx +105 -0
  246. package/src/layouts/app/TopNavLinksLayout.tsx +3 -0
  247. package/src/layouts/app/WorkspaceBreadcrumbLayout.tsx +3 -0
  248. package/src/layouts/app/WorkspaceCommunitiesLayout.tsx +3 -0
  249. package/src/layouts/app/WorkspaceNavbarLayout.tsx +3 -0
  250. package/src/layouts/app/WorkspaceSidebarLayout.tsx +98 -0
  251. package/src/layouts/app/WorkspaceSidebarTitleLayout.tsx +3 -0
  252. package/src/layouts/app/app-header-layout.tsx +45 -0
  253. package/src/layouts/app/app-sidebar-layout.tsx +56 -0
  254. package/src/layouts/app/layout-context.tsx +44 -0
  255. package/src/layouts/app/layout-types.ts +47 -0
  256. package/src/layouts/app/partials/Footer.tsx +35 -0
  257. package/src/layouts/app/partials/HeaderTopbar.tsx +96 -0
  258. package/src/layouts/app/partials/Navbar.tsx +85 -0
  259. package/src/layouts/app/partials/Toolbar.tsx +47 -0
  260. package/src/layouts/app-layout.tsx +29 -0
  261. package/src/layouts/auth/AuthBrandedLayout.tsx +58 -0
  262. package/src/layouts/auth/AuthCardLayout.tsx +31 -0
  263. package/src/layouts/auth/AuthCenteredLayout.tsx +41 -0
  264. package/src/layouts/auth/AuthClassicLayout.tsx +41 -0
  265. package/src/layouts/auth/AuthSimpleLayout.tsx +33 -0
  266. package/src/layouts/auth/AuthSplitLayout.tsx +89 -0
  267. package/src/layouts/web-app-layout.tsx +162 -0
  268. package/src/layouts/web-layout.tsx +23 -0
  269. package/src/lib/datetime.ts +188 -0
  270. package/src/lib/google-maps-loader.ts +99 -0
  271. package/src/lib/location.ts +127 -0
  272. package/src/lib/lucide-icon-map.ts +132 -0
  273. package/src/lib/map-markers.ts +124 -0
  274. package/src/lib/map-styles.ts +351 -0
  275. package/src/lib/utils.ts +11 -0
  276. package/src/platform/adapters/default.tsx +156 -0
  277. package/src/platform/adapters/inertia.tsx +88 -0
  278. package/src/platform/adapters/nextjs.ts +86 -0
  279. package/src/platform/context.tsx +106 -0
  280. package/src/platform/index.ts +27 -0
  281. package/src/platform/types.ts +105 -0
  282. package/src/styles/layouts/sidebar-fixed.css +161 -0
  283. package/src/styles/themes.css +583 -0
  284. package/src/types/assets.d.ts +5 -0
  285. package/src/types/auth.ts +25 -0
  286. package/src/types/global.d.ts +13 -0
  287. package/src/types/index.ts +9 -0
  288. package/src/types/navigation.ts +15 -0
  289. package/src/types/ui.ts +32 -0
@@ -0,0 +1,583 @@
1
+ /*
2
+ * Base design tokens (Metronic-compatible).
3
+ *
4
+ * These tokens extend the shadcn/ui base with Metronic-specific additions:
5
+ * --mono / --mono-foreground high-contrast text (zinc-950 / zinc-50)
6
+ * --chart-1 … --chart-5 chart series colours
7
+ * --sidebar-* sidebar surface tokens
8
+ * --text-2sm / --text-2xs Metronic custom font-size steps
9
+ *
10
+ * Consuming apps import this file via:
11
+ * @import '@trackany-device/components/styles/themes.css';
12
+ * and must also import their Tailwind entry so @theme inline picks up the
13
+ * --color-* mappings.
14
+ */
15
+
16
+ /* ──────────────────────────────────────────────────────────────────────
17
+ METRONIC BASE TOKENS (light)
18
+ ────────────────────────────────────────────────────────────────────── */
19
+
20
+ :root {
21
+ /* Mono — near-black text used for headings, badges, code */
22
+ --mono: oklch(0.09 0 0);
23
+ --mono-foreground: oklch(0.99 0 0);
24
+
25
+ /* Chart series — mapped to Tailwind palette */
26
+ --chart-1: #3b82f6; /* blue-500 */
27
+ --chart-2: #22c55e; /* green-500 */
28
+ --chart-3: #eab308; /* yellow-500 */
29
+ --chart-4: #ef4444; /* red-500 */
30
+ --chart-5: #a855f7; /* purple-500 */
31
+
32
+ /* Sidebar surface (light) */
33
+ --sidebar: oklch(0.985 0 0);
34
+ --sidebar-foreground: oklch(0.145 0 0);
35
+ --sidebar-primary: #2563eb;
36
+ --sidebar-primary-foreground: #ffffff;
37
+ --sidebar-accent: oklch(0.97 0 0);
38
+ --sidebar-accent-foreground: oklch(0.205 0 0);
39
+ --sidebar-border: oklch(0.922 0 0);
40
+ --sidebar-ring: #3b82f6;
41
+ }
42
+
43
+ .dark {
44
+ /* Mono — near-white in dark mode */
45
+ --mono: oklch(0.99 0 0);
46
+ --mono-foreground: oklch(0.09 0 0);
47
+
48
+ /* Chart series stay the same in dark — components handle opacity */
49
+ --chart-1: #3b82f6;
50
+ --chart-2: #22c55e;
51
+ --chart-3: #eab308;
52
+ --chart-4: #ef4444;
53
+ --chart-5: #a855f7;
54
+
55
+ /* Sidebar surface (dark) */
56
+ --sidebar: oklch(0.18 0 0);
57
+ --sidebar-foreground: oklch(0.985 0 0);
58
+ --sidebar-primary: #60a5fa;
59
+ --sidebar-primary-foreground: #0a0a0a;
60
+ --sidebar-accent: oklch(0.22 0 0);
61
+ --sidebar-accent-foreground: oklch(0.985 0 0);
62
+ --sidebar-border: oklch(0.26 0 0);
63
+ --sidebar-ring: #60a5fa;
64
+ }
65
+
66
+ /*
67
+ * Per-tenant color schemes.
68
+ *
69
+ * Each [data-theme="..."] selector overrides ONLY the primary accent
70
+ * tokens. The neutral / status / surface tokens stay shared across
71
+ * schemes (defined in app.css :root and .dark blocks) so swapping the
72
+ * theme name only changes brand colour — neutrals, success greens,
73
+ * danger reds, warning oranges, and info blues remain stable.
74
+ *
75
+ * Tokens overridden per scheme:
76
+ * --primary base accent
77
+ * --primary-hover hover state of the accent
78
+ * --primary-subtle low-alpha tint background
79
+ * --primary-foreground text colour on the accent
80
+ * --ring focus ring colour
81
+ * --accent default accent panel bg (= primary-subtle)
82
+ * --accent-foreground text on accent panel
83
+ *
84
+ * Dark mode pairs: matched by appending `.dark` to the data-theme
85
+ * selector. Order matters — the unscoped .dark block in app.css runs
86
+ * first; these data-theme.dark blocks come AFTER (because this file
87
+ * is @imported at the top of app.css before the rest) so they win on
88
+ * specificity (data-attribute + class).
89
+ *
90
+ * Compliance: this file is colour-only. It does not change behaviour,
91
+ * data collection, or any policy-bound surface. No PolicyVersion bump
92
+ * required.
93
+ */
94
+
95
+ /* ──────────────────────────────────────────────────────────────────────
96
+ STATUS TOKENS (shared, light + dark)
97
+ ────────────────────────────────────────────────────────────────────── */
98
+
99
+ :root {
100
+ --primary-hover: #1d4ed8;
101
+ --primary-subtle: #dbeafe;
102
+
103
+ --success: #16a34a;
104
+ --success-subtle: #dcfce7;
105
+ --success-foreground: #ffffff;
106
+
107
+ --warning-foreground: #ffffff;
108
+ --warning-subtle: #fef3c7;
109
+
110
+ --info-foreground: #ffffff;
111
+ --info-subtle: #dbeafe;
112
+
113
+ --danger-foreground: #ffffff;
114
+ --danger-subtle: #fee2e2;
115
+
116
+ --surface: oklch(0.99 0 0);
117
+ --surface-raised: oklch(1 0 0);
118
+ }
119
+
120
+ .dark {
121
+ --primary-hover: #3b82f6;
122
+ --primary-subtle: oklch(0.27 0.04 250);
123
+
124
+ --success: #22c55e;
125
+ --success-subtle: oklch(0.27 0.06 145);
126
+ --success-foreground: #052e16;
127
+
128
+ --warning-foreground: #1f1500;
129
+ --warning-subtle: oklch(0.27 0.05 70);
130
+
131
+ --info-foreground: #02132c;
132
+ --info-subtle: oklch(0.27 0.05 250);
133
+
134
+ --danger-foreground: #ffffff;
135
+ --danger-subtle: oklch(0.27 0.06 25);
136
+
137
+ --surface: oklch(0.18 0 0);
138
+ --surface-raised: oklch(0.21 0 0);
139
+ }
140
+
141
+ /* ──────────────────────────────────────────────────────────────────────
142
+ TAILWIND V4 @THEME MAPPINGS
143
+ Expose custom tokens as Tailwind utility classes.
144
+ Must come after the :root / .dark declarations above.
145
+ ────────────────────────────────────────────────────────────────────── */
146
+
147
+ @theme inline {
148
+ /* Mono */
149
+ --color-mono: var(--mono);
150
+ --color-mono-foreground: var(--mono-foreground);
151
+
152
+ /* Sidebar surface */
153
+ --color-sidebar: var(--sidebar);
154
+ --color-sidebar-foreground: var(--sidebar-foreground);
155
+ --color-sidebar-primary: var(--sidebar-primary);
156
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
157
+ --color-sidebar-accent: var(--sidebar-accent);
158
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
159
+ --color-sidebar-border: var(--sidebar-border);
160
+ --color-sidebar-ring: var(--sidebar-ring);
161
+
162
+ /* Chart series */
163
+ --color-chart-1: var(--chart-1);
164
+ --color-chart-2: var(--chart-2);
165
+ --color-chart-3: var(--chart-3);
166
+ --color-chart-4: var(--chart-4);
167
+ --color-chart-5: var(--chart-5);
168
+ }
169
+
170
+ @theme {
171
+ /* Extra font-size steps (Metronic) — between xs and sm */
172
+ --text-2sm: 0.8125rem; /* 13px */
173
+ --text-2sm--line-height: 1.3231; /* 17.2px / 13px */
174
+
175
+ --text-2xs: 0.6875rem; /* 11px */
176
+ --text-2xs--line-height: 1.1818; /* 13px / 11px */
177
+ }
178
+
179
+ /* ──────────────────────────────────────────────────────────────────────
180
+ PER-SCHEME PRIMARY OVERRIDES
181
+ ────────────────────────────────────────────────────────────────────── */
182
+
183
+ /* default — Blue-600 — canonical scheme for central host */
184
+ [data-theme='default'],
185
+ [data-theme='blue'] {
186
+ --primary: #2563eb;
187
+ --primary-hover: #1d4ed8;
188
+ --primary-subtle: #dbeafe;
189
+ --primary-foreground: #ffffff;
190
+ --ring: #3b82f6;
191
+ --accent: #dbeafe;
192
+ --accent-foreground: #1e3a8a;
193
+ }
194
+ [data-theme='default'].dark,
195
+ [data-theme='blue'].dark {
196
+ --primary: #60a5fa;
197
+ --primary-hover: #93c5fd;
198
+ --primary-subtle: oklch(0.27 0.06 250);
199
+ --primary-foreground: #0a0a0a;
200
+ --ring: #60a5fa;
201
+ --accent: oklch(0.27 0.06 250);
202
+ --accent-foreground: #dbeafe;
203
+ }
204
+
205
+ /* neutral — Neutral-700 */
206
+ [data-theme='neutral'] {
207
+ --primary: #404040;
208
+ --primary-hover: #262626;
209
+ --primary-subtle: #f5f5f5;
210
+ --primary-foreground: #ffffff;
211
+ --ring: #525252;
212
+ --accent: #f5f5f5;
213
+ --accent-foreground: #171717;
214
+ }
215
+ [data-theme='neutral'].dark {
216
+ --primary: #d4d4d4;
217
+ --primary-hover: #e5e5e5;
218
+ --primary-subtle: oklch(0.27 0 0);
219
+ --primary-foreground: #0a0a0a;
220
+ --ring: #a3a3a3;
221
+ --accent: oklch(0.27 0 0);
222
+ --accent-foreground: #fafafa;
223
+ }
224
+
225
+ /* slate — Slate-600 */
226
+ [data-theme='slate'] {
227
+ --primary: #475569;
228
+ --primary-hover: #334155;
229
+ --primary-subtle: #f1f5f9;
230
+ --primary-foreground: #ffffff;
231
+ --ring: #64748b;
232
+ --accent: #f1f5f9;
233
+ --accent-foreground: #0f172a;
234
+ }
235
+ [data-theme='slate'].dark {
236
+ --primary: #94a3b8;
237
+ --primary-hover: #cbd5e1;
238
+ --primary-subtle: oklch(0.28 0.02 260);
239
+ --primary-foreground: #0a0a0a;
240
+ --ring: #94a3b8;
241
+ --accent: oklch(0.28 0.02 260);
242
+ --accent-foreground: #e2e8f0;
243
+ }
244
+
245
+ /* gray — Gray-600 */
246
+ [data-theme='gray'] {
247
+ --primary: #4b5563;
248
+ --primary-hover: #374151;
249
+ --primary-subtle: #f3f4f6;
250
+ --primary-foreground: #ffffff;
251
+ --ring: #6b7280;
252
+ --accent: #f3f4f6;
253
+ --accent-foreground: #111827;
254
+ }
255
+ [data-theme='gray'].dark {
256
+ --primary: #9ca3af;
257
+ --primary-hover: #d1d5db;
258
+ --primary-subtle: oklch(0.28 0.01 260);
259
+ --primary-foreground: #0a0a0a;
260
+ --ring: #9ca3af;
261
+ --accent: oklch(0.28 0.01 260);
262
+ --accent-foreground: #e5e7eb;
263
+ }
264
+
265
+ /* red — Red-600 */
266
+ [data-theme='red'] {
267
+ --primary: #dc2626;
268
+ --primary-hover: #b91c1c;
269
+ --primary-subtle: #fee2e2;
270
+ --primary-foreground: #ffffff;
271
+ --ring: #ef4444;
272
+ --accent: #fee2e2;
273
+ --accent-foreground: #7f1d1d;
274
+ }
275
+ [data-theme='red'].dark {
276
+ --primary: #f87171;
277
+ --primary-hover: #fca5a5;
278
+ --primary-subtle: oklch(0.27 0.06 25);
279
+ --primary-foreground: #0a0a0a;
280
+ --ring: #f87171;
281
+ --accent: oklch(0.27 0.06 25);
282
+ --accent-foreground: #fecaca;
283
+ }
284
+
285
+ /* green — Green-600 (Suthra Punjab brand) */
286
+ [data-theme='green'] {
287
+ --primary: #16a34a;
288
+ --primary-hover: #15803d;
289
+ --primary-subtle: #dcfce7;
290
+ --primary-foreground: #ffffff;
291
+ --ring: #22c55e;
292
+ --accent: #dcfce7;
293
+ --accent-foreground: #14532d;
294
+ }
295
+ [data-theme='green'].dark {
296
+ --primary: #4ade80;
297
+ --primary-hover: #86efac;
298
+ --primary-subtle: oklch(0.27 0.06 145);
299
+ --primary-foreground: #052e16;
300
+ --ring: #4ade80;
301
+ --accent: oklch(0.27 0.06 145);
302
+ --accent-foreground: #bbf7d0;
303
+ }
304
+
305
+ /* purple — Purple-600 */
306
+ [data-theme='purple'] {
307
+ --primary: #9333ea;
308
+ --primary-hover: #7e22ce;
309
+ --primary-subtle: #f3e8ff;
310
+ --primary-foreground: #ffffff;
311
+ --ring: #a855f7;
312
+ --accent: #f3e8ff;
313
+ --accent-foreground: #581c87;
314
+ }
315
+ [data-theme='purple'].dark {
316
+ --primary: #c084fc;
317
+ --primary-hover: #d8b4fe;
318
+ --primary-subtle: oklch(0.27 0.07 310);
319
+ --primary-foreground: #0a0a0a;
320
+ --ring: #c084fc;
321
+ --accent: oklch(0.27 0.07 310);
322
+ --accent-foreground: #e9d5ff;
323
+ }
324
+
325
+ /* orange — Orange-500 */
326
+ [data-theme='orange'] {
327
+ --primary: #f97316;
328
+ --primary-hover: #ea580c;
329
+ --primary-subtle: #ffedd5;
330
+ --primary-foreground: #ffffff;
331
+ --ring: #fb923c;
332
+ --accent: #ffedd5;
333
+ --accent-foreground: #7c2d12;
334
+ }
335
+ [data-theme='orange'].dark {
336
+ --primary: #fb923c;
337
+ --primary-hover: #fdba74;
338
+ --primary-subtle: oklch(0.27 0.07 50);
339
+ --primary-foreground: #0a0a0a;
340
+ --ring: #fb923c;
341
+ --accent: oklch(0.27 0.07 50);
342
+ --accent-foreground: #fed7aa;
343
+ }
344
+
345
+ /* rose — Rose-600 */
346
+ [data-theme='rose'] {
347
+ --primary: #e11d48;
348
+ --primary-hover: #be123c;
349
+ --primary-subtle: #ffe4e6;
350
+ --primary-foreground: #ffffff;
351
+ --ring: #f43f5e;
352
+ --accent: #ffe4e6;
353
+ --accent-foreground: #881337;
354
+ }
355
+ [data-theme='rose'].dark {
356
+ --primary: #fb7185;
357
+ --primary-hover: #fda4af;
358
+ --primary-subtle: oklch(0.27 0.06 15);
359
+ --primary-foreground: #0a0a0a;
360
+ --ring: #fb7185;
361
+ --accent: oklch(0.27 0.06 15);
362
+ --accent-foreground: #fecdd3;
363
+ }
364
+
365
+ /* sky — Sky-500 */
366
+ [data-theme='sky'] {
367
+ --primary: #0ea5e9;
368
+ --primary-hover: #0284c7;
369
+ --primary-subtle: #e0f2fe;
370
+ --primary-foreground: #ffffff;
371
+ --ring: #38bdf8;
372
+ --accent: #e0f2fe;
373
+ --accent-foreground: #0c4a6e;
374
+ }
375
+ [data-theme='sky'].dark {
376
+ --primary: #38bdf8;
377
+ --primary-hover: #7dd3fc;
378
+ --primary-subtle: oklch(0.27 0.06 230);
379
+ --primary-foreground: #0a0a0a;
380
+ --ring: #38bdf8;
381
+ --accent: oklch(0.27 0.06 230);
382
+ --accent-foreground: #bae6fd;
383
+ }
384
+
385
+ /* yellow — Yellow-500 */
386
+ [data-theme='yellow'] {
387
+ --primary: #eab308;
388
+ --primary-hover: #ca8a04;
389
+ --primary-subtle: #fef9c3;
390
+ --primary-foreground: #422006;
391
+ --ring: #facc15;
392
+ --accent: #fef9c3;
393
+ --accent-foreground: #713f12;
394
+ }
395
+ [data-theme='yellow'].dark {
396
+ --primary: #facc15;
397
+ --primary-hover: #fde047;
398
+ --primary-subtle: oklch(0.27 0.07 90);
399
+ --primary-foreground: #0a0a0a;
400
+ --ring: #facc15;
401
+ --accent: oklch(0.27 0.07 90);
402
+ --accent-foreground: #fef08a;
403
+ }
404
+
405
+ /* fuchsia — Fuchsia-600 */
406
+ [data-theme='fuchsia'] {
407
+ --primary: #c026d3;
408
+ --primary-hover: #a21caf;
409
+ --primary-subtle: #fae8ff;
410
+ --primary-foreground: #ffffff;
411
+ --ring: #d946ef;
412
+ --accent: #fae8ff;
413
+ --accent-foreground: #701a75;
414
+ }
415
+ [data-theme='fuchsia'].dark {
416
+ --primary: #e879f9;
417
+ --primary-hover: #f0abfc;
418
+ --primary-subtle: oklch(0.27 0.08 330);
419
+ --primary-foreground: #0a0a0a;
420
+ --ring: #e879f9;
421
+ --accent: oklch(0.27 0.08 330);
422
+ --accent-foreground: #f5d0fe;
423
+ }
424
+
425
+ /* amber — Amber-500 */
426
+ [data-theme='amber'] {
427
+ --primary: #f59e0b;
428
+ --primary-hover: #d97706;
429
+ --primary-subtle: #fef3c7;
430
+ --primary-foreground: #422006;
431
+ --ring: #fbbf24;
432
+ --accent: #fef3c7;
433
+ --accent-foreground: #78350f;
434
+ }
435
+ [data-theme='amber'].dark {
436
+ --primary: #fbbf24;
437
+ --primary-hover: #fcd34d;
438
+ --primary-subtle: oklch(0.27 0.07 70);
439
+ --primary-foreground: #0a0a0a;
440
+ --ring: #fbbf24;
441
+ --accent: oklch(0.27 0.07 70);
442
+ --accent-foreground: #fde68a;
443
+ }
444
+
445
+ /* pink — Pink-500 */
446
+ [data-theme='pink'] {
447
+ --primary: #ec4899;
448
+ --primary-hover: #db2777;
449
+ --primary-subtle: #fce7f3;
450
+ --primary-foreground: #ffffff;
451
+ --ring: #f472b6;
452
+ --accent: #fce7f3;
453
+ --accent-foreground: #831843;
454
+ }
455
+ [data-theme='pink'].dark {
456
+ --primary: #f472b6;
457
+ --primary-hover: #f9a8d4;
458
+ --primary-subtle: oklch(0.27 0.07 350);
459
+ --primary-foreground: #0a0a0a;
460
+ --ring: #f472b6;
461
+ --accent: oklch(0.27 0.07 350);
462
+ --accent-foreground: #fbcfe8;
463
+ }
464
+
465
+ /* lime — Lime-600 */
466
+ [data-theme='lime'] {
467
+ --primary: #65a30d;
468
+ --primary-hover: #4d7c0f;
469
+ --primary-subtle: #ecfccb;
470
+ --primary-foreground: #ffffff;
471
+ --ring: #84cc16;
472
+ --accent: #ecfccb;
473
+ --accent-foreground: #365314;
474
+ }
475
+ [data-theme='lime'].dark {
476
+ --primary: #a3e635;
477
+ --primary-hover: #bef264;
478
+ --primary-subtle: oklch(0.27 0.07 130);
479
+ --primary-foreground: #0a0a0a;
480
+ --ring: #a3e635;
481
+ --accent: oklch(0.27 0.07 130);
482
+ --accent-foreground: #d9f99d;
483
+ }
484
+
485
+ /* cyan — Cyan-600 */
486
+ [data-theme='cyan'] {
487
+ --primary: #0891b2;
488
+ --primary-hover: #0e7490;
489
+ --primary-subtle: #cffafe;
490
+ --primary-foreground: #ffffff;
491
+ --ring: #06b6d4;
492
+ --accent: #cffafe;
493
+ --accent-foreground: #164e63;
494
+ }
495
+ [data-theme='cyan'].dark {
496
+ --primary: #22d3ee;
497
+ --primary-hover: #67e8f9;
498
+ --primary-subtle: oklch(0.27 0.06 200);
499
+ --primary-foreground: #0a0a0a;
500
+ --ring: #22d3ee;
501
+ --accent: oklch(0.27 0.06 200);
502
+ --accent-foreground: #a5f3fc;
503
+ }
504
+
505
+ /* emerald — Emerald-600 */
506
+ [data-theme='emerald'] {
507
+ --primary: #059669;
508
+ --primary-hover: #047857;
509
+ --primary-subtle: #d1fae5;
510
+ --primary-foreground: #ffffff;
511
+ --ring: #10b981;
512
+ --accent: #d1fae5;
513
+ --accent-foreground: #064e3b;
514
+ }
515
+ [data-theme='emerald'].dark {
516
+ --primary: #34d399;
517
+ --primary-hover: #6ee7b7;
518
+ --primary-subtle: oklch(0.27 0.06 165);
519
+ --primary-foreground: #0a0a0a;
520
+ --ring: #34d399;
521
+ --accent: oklch(0.27 0.06 165);
522
+ --accent-foreground: #a7f3d0;
523
+ }
524
+
525
+ /* violet — Violet-600 */
526
+ [data-theme='violet'] {
527
+ --primary: #7c3aed;
528
+ --primary-hover: #6d28d9;
529
+ --primary-subtle: #ede9fe;
530
+ --primary-foreground: #ffffff;
531
+ --ring: #8b5cf6;
532
+ --accent: #ede9fe;
533
+ --accent-foreground: #4c1d95;
534
+ }
535
+ [data-theme='violet'].dark {
536
+ --primary: #a78bfa;
537
+ --primary-hover: #c4b5fd;
538
+ --primary-subtle: oklch(0.27 0.07 290);
539
+ --primary-foreground: #0a0a0a;
540
+ --ring: #a78bfa;
541
+ --accent: oklch(0.27 0.07 290);
542
+ --accent-foreground: #ddd6fe;
543
+ }
544
+
545
+ /* teal — Teal-600 */
546
+ [data-theme='teal'] {
547
+ --primary: #0d9488;
548
+ --primary-hover: #0f766e;
549
+ --primary-subtle: #ccfbf1;
550
+ --primary-foreground: #ffffff;
551
+ --ring: #14b8a6;
552
+ --accent: #ccfbf1;
553
+ --accent-foreground: #134e4a;
554
+ }
555
+ [data-theme='teal'].dark {
556
+ --primary: #2dd4bf;
557
+ --primary-hover: #5eead4;
558
+ --primary-subtle: oklch(0.27 0.06 180);
559
+ --primary-foreground: #0a0a0a;
560
+ --ring: #2dd4bf;
561
+ --accent: oklch(0.27 0.06 180);
562
+ --accent-foreground: #99f6e4;
563
+ }
564
+
565
+ /* indigo — Indigo-600 */
566
+ [data-theme='indigo'] {
567
+ --primary: #4f46e5;
568
+ --primary-hover: #4338ca;
569
+ --primary-subtle: #e0e7ff;
570
+ --primary-foreground: #ffffff;
571
+ --ring: #6366f1;
572
+ --accent: #e0e7ff;
573
+ --accent-foreground: #312e81;
574
+ }
575
+ [data-theme='indigo'].dark {
576
+ --primary: #818cf8;
577
+ --primary-hover: #a5b4fc;
578
+ --primary-subtle: oklch(0.27 0.08 270);
579
+ --primary-foreground: #0a0a0a;
580
+ --ring: #818cf8;
581
+ --accent: oklch(0.27 0.08 270);
582
+ --accent-foreground: #c7d2fe;
583
+ }
@@ -0,0 +1,5 @@
1
+ declare module '*.png' { const src: string; export default src; }
2
+ declare module '*.jpg' { const src: string; export default src; }
3
+ declare module '*.jpeg' { const src: string; export default src; }
4
+ declare module '*.svg' { const src: string; export default src; }
5
+ declare module '*.webp' { const src: string; export default src; }
@@ -0,0 +1,25 @@
1
+ export type User = {
2
+ id: number;
3
+ name: string;
4
+ email: string;
5
+ avatar?: string;
6
+ email_verified_at: string | null;
7
+ display_timezone?: string | null;
8
+ two_factor_enabled?: boolean;
9
+ created_at: string;
10
+ updated_at: string;
11
+ [key: string]: unknown;
12
+ };
13
+
14
+ export type Auth = {
15
+ user: User;
16
+ };
17
+
18
+ export type TwoFactorSetupData = {
19
+ svg: string;
20
+ url: string;
21
+ };
22
+
23
+ export type TwoFactorSecretKey = {
24
+ secretKey: string;
25
+ };
@@ -0,0 +1,13 @@
1
+ import type { Auth } from './auth';
2
+
3
+ declare module '@inertiajs/core' {
4
+ export interface InertiaConfig {
5
+ sharedPageProps: {
6
+ name: string;
7
+ auth: Auth;
8
+ sidebarOpen: boolean;
9
+ unreadNotificationsCount: number;
10
+ [key: string]: unknown;
11
+ };
12
+ }
13
+ }
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ export interface AuthLayoutProps {
4
+ children: ReactNode;
5
+ title?: string;
6
+ description?: string;
7
+ }
8
+
9
+ export type AuthLayoutVariant = 'branded' | 'classic' | 'split' | 'centered' | 'simple' | 'card';
@@ -0,0 +1,15 @@
1
+ import type { PlatformLinkProps } from '../platform/types';
2
+ import type { LucideIcon } from 'lucide-react';
3
+
4
+ export type BreadcrumbItem = {
5
+ title: string;
6
+ href: NonNullable<PlatformLinkProps['href']>;
7
+ };
8
+
9
+ export type NavItem = {
10
+ title: string;
11
+ href: NonNullable<PlatformLinkProps['href']>;
12
+ icon?: LucideIcon | null;
13
+ isActive?: boolean;
14
+ items?: NavItem[];
15
+ };
@@ -0,0 +1,32 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { BreadcrumbItem } from './navigation';
3
+
4
+ export type AppLayoutProps = {
5
+ children: ReactNode;
6
+ breadcrumbs?: BreadcrumbItem[];
7
+ };
8
+
9
+ export type AppVariant = 'header' | 'sidebar';
10
+
11
+ export type FlashToast = {
12
+ type: 'success' | 'info' | 'warning' | 'error';
13
+ message: string;
14
+ };
15
+
16
+ /**
17
+ * 'branded' → split screen: form card left, full branded panel right (Metronic)
18
+ * 'classic' → centered card on a full-page background image (Metronic)
19
+ * 'split' → left feature panel + right form card (legacy default)
20
+ * 'centered' → single centred card on auth background image (legacy)
21
+ * 'simple' → minimal, no background
22
+ * 'card' → card-only, plain background
23
+ */
24
+ export type AuthLayoutVariant = 'branded' | 'classic' | 'split' | 'centered' | 'simple' | 'card';
25
+
26
+ export type AuthLayoutProps = {
27
+ children?: ReactNode;
28
+ name?: string;
29
+ title?: string;
30
+ description?: string;
31
+ variant?: AuthLayoutVariant;
32
+ };