@trackany-device/components 1.0.0 → 1.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.
Files changed (159) hide show
  1. package/README.md +216 -0
  2. package/package.json +133 -4
  3. package/src/assets/index.ts +120 -0
  4. package/src/assets/media/avatars/300-1.png +0 -0
  5. package/src/assets/media/avatars/300-10.png +0 -0
  6. package/src/assets/media/avatars/300-11.png +0 -0
  7. package/src/assets/media/avatars/300-12.png +0 -0
  8. package/src/assets/media/avatars/300-13.png +0 -0
  9. package/src/assets/media/avatars/300-14.png +0 -0
  10. package/src/assets/media/avatars/300-15.png +0 -0
  11. package/src/assets/media/avatars/300-16.png +0 -0
  12. package/src/assets/media/avatars/300-17.png +0 -0
  13. package/src/assets/media/avatars/300-18.png +0 -0
  14. package/src/assets/media/avatars/300-19.png +0 -0
  15. package/src/assets/media/avatars/300-2.png +0 -0
  16. package/src/assets/media/avatars/300-20.png +0 -0
  17. package/src/assets/media/avatars/300-21.png +0 -0
  18. package/src/assets/media/avatars/300-22.png +0 -0
  19. package/src/assets/media/avatars/300-23.png +0 -0
  20. package/src/assets/media/avatars/300-24.png +0 -0
  21. package/src/assets/media/avatars/300-25.png +0 -0
  22. package/src/assets/media/avatars/300-26.png +0 -0
  23. package/src/assets/media/avatars/300-27.png +0 -0
  24. package/src/assets/media/avatars/300-28.png +0 -0
  25. package/src/assets/media/avatars/300-29.png +0 -0
  26. package/src/assets/media/avatars/300-3.png +0 -0
  27. package/src/assets/media/avatars/300-30.png +0 -0
  28. package/src/assets/media/avatars/300-31.png +0 -0
  29. package/src/assets/media/avatars/300-32.png +0 -0
  30. package/src/assets/media/avatars/300-33.png +0 -0
  31. package/src/assets/media/avatars/300-34.png +0 -0
  32. package/src/assets/media/avatars/300-4.png +0 -0
  33. package/src/assets/media/avatars/300-5.png +0 -0
  34. package/src/assets/media/avatars/300-6.png +0 -0
  35. package/src/assets/media/avatars/300-7.png +0 -0
  36. package/src/assets/media/avatars/300-8.png +0 -0
  37. package/src/assets/media/avatars/300-9.png +0 -0
  38. package/src/assets/media/avatars/blank.png +0 -0
  39. package/src/assets/media/avatars/gray/1.png +0 -0
  40. package/src/assets/media/avatars/gray/2.png +0 -0
  41. package/src/assets/media/avatars/gray/3.png +0 -0
  42. package/src/assets/media/avatars/gray/4.png +0 -0
  43. package/src/assets/media/avatars/gray/5.png +0 -0
  44. package/src/assets/media/illustrations/1-dark.svg +78 -0
  45. package/src/assets/media/illustrations/1.svg +78 -0
  46. package/src/assets/media/illustrations/10-dark.svg +148 -0
  47. package/src/assets/media/illustrations/10.svg +148 -0
  48. package/src/assets/media/illustrations/11-dark.svg +234 -0
  49. package/src/assets/media/illustrations/11.svg +234 -0
  50. package/src/assets/media/illustrations/12.svg +138 -0
  51. package/src/assets/media/illustrations/13.svg +205 -0
  52. package/src/assets/media/illustrations/14.svg +259 -0
  53. package/src/assets/media/illustrations/15.svg +242 -0
  54. package/src/assets/media/illustrations/16.svg +128 -0
  55. package/src/assets/media/illustrations/17.svg +180 -0
  56. package/src/assets/media/illustrations/18-dark.svg +6 -0
  57. package/src/assets/media/illustrations/18.svg +6 -0
  58. package/src/assets/media/illustrations/19-dark.svg +8 -0
  59. package/src/assets/media/illustrations/19.svg +8 -0
  60. package/src/assets/media/illustrations/2-dark.svg +78 -0
  61. package/src/assets/media/illustrations/2.svg +78 -0
  62. package/src/assets/media/illustrations/20-dark.svg +13 -0
  63. package/src/assets/media/illustrations/20.svg +13 -0
  64. package/src/assets/media/illustrations/21-dark.svg +9 -0
  65. package/src/assets/media/illustrations/21.svg +9 -0
  66. package/src/assets/media/illustrations/22-dark.svg +17 -0
  67. package/src/assets/media/illustrations/22.svg +17 -0
  68. package/src/assets/media/illustrations/23-dark.svg +13 -0
  69. package/src/assets/media/illustrations/23.svg +13 -0
  70. package/src/assets/media/illustrations/24.svg +6 -0
  71. package/src/assets/media/illustrations/25.svg +8 -0
  72. package/src/assets/media/illustrations/26.svg +8 -0
  73. package/src/assets/media/illustrations/27.svg +6 -0
  74. package/src/assets/media/illustrations/28-dark.svg +28 -0
  75. package/src/assets/media/illustrations/28.svg +14 -0
  76. package/src/assets/media/illustrations/29-dark.svg +6 -0
  77. package/src/assets/media/illustrations/29.svg +6 -0
  78. package/src/assets/media/illustrations/3-dark.svg +70 -0
  79. package/src/assets/media/illustrations/3.svg +70 -0
  80. package/src/assets/media/illustrations/30-dark.svg +8 -0
  81. package/src/assets/media/illustrations/30.svg +8 -0
  82. package/src/assets/media/illustrations/31-dark.svg +9 -0
  83. package/src/assets/media/illustrations/31.svg +9 -0
  84. package/src/assets/media/illustrations/32-dark.svg +10 -0
  85. package/src/assets/media/illustrations/32.svg +10 -0
  86. package/src/assets/media/illustrations/33-dark.svg +15 -0
  87. package/src/assets/media/illustrations/33.svg +15 -0
  88. package/src/assets/media/illustrations/34-dark.svg +5 -0
  89. package/src/assets/media/illustrations/34.svg +5 -0
  90. package/src/assets/media/illustrations/35-dark.svg +11 -0
  91. package/src/assets/media/illustrations/35.svg +4 -0
  92. package/src/assets/media/illustrations/4-dark.svg +51 -0
  93. package/src/assets/media/illustrations/4.svg +51 -0
  94. package/src/assets/media/illustrations/5-dark.svg +78 -0
  95. package/src/assets/media/illustrations/5.svg +78 -0
  96. package/src/assets/media/illustrations/6.svg +58 -0
  97. package/src/assets/media/illustrations/7.svg +49 -0
  98. package/src/assets/media/illustrations/8.svg +61 -0
  99. package/src/assets/media/illustrations/9.svg +57 -0
  100. package/src/assets/media/misc/placeholder.svg +15 -0
  101. package/src/components/devices/devices-mini-map.tsx +32 -26
  102. package/src/components/devices/map-marker.tsx +98 -0
  103. package/src/components/ui/checklist-item.tsx +55 -0
  104. package/src/components/ui/plan-card.tsx +68 -0
  105. package/src/components/ui/settings-row.tsx +32 -0
  106. package/src/components/ui/settings-section.tsx +22 -0
  107. package/src/components/ui/usage-meter.tsx +35 -0
  108. package/src/index.ts +12 -1
  109. package/src/layouts/LayoutSwitcher.tsx +220 -0
  110. package/src/layouts/app/MegaMenuLayout.tsx +69 -34
  111. package/src/layouts/app/MegaMenuNavbarLayout.tsx +73 -37
  112. package/src/layouts/app/NavbarCollapsibleLayout.tsx +53 -4
  113. package/src/layouts/app/NavbarSidebarLayout.tsx +74 -29
  114. package/src/layouts/app/SidebarDualMenuLayout.tsx +48 -5
  115. package/src/layouts/app/SidebarFixedLayout.tsx +15 -10
  116. package/src/layouts/app/SidebarMinimalLayout.tsx +51 -3
  117. package/src/layouts/app/SidebarTabsLayout.tsx +48 -2
  118. package/src/layouts/app/SplitSidebarLayout.tsx +91 -43
  119. package/src/layouts/app/TopNavLayout.tsx +7 -12
  120. package/src/layouts/app/WorkspaceSidebarLayout.tsx +103 -46
  121. package/src/layouts/app/partials/Navbar.tsx +61 -10
  122. package/src/layouts/app/partials/Toolbar.tsx +1 -1
  123. package/src/layouts/auth/AuthCenteredLayout.tsx +10 -4
  124. package/src/lib/map-markers.ts +21 -3
  125. package/src/pages/login/ConfirmPasswordPage.tsx +35 -0
  126. package/src/pages/login/ForgotPasswordPage.tsx +41 -0
  127. package/src/pages/login/LoginPage.tsx +50 -0
  128. package/src/pages/login/RegisterPage.tsx +41 -0
  129. package/src/pages/login/ResetPasswordPage.tsx +35 -0
  130. package/src/pages/login/TwoFactorChallengePage.tsx +41 -0
  131. package/src/pages/login/VerifyEmailPage.tsx +31 -0
  132. package/src/pages/my/ActivityPage.tsx +160 -0
  133. package/src/pages/my/GetStartedPage.tsx +221 -0
  134. package/src/pages/my/NotificationsPage.tsx +133 -0
  135. package/src/pages/my/ProfilePage.tsx +650 -0
  136. package/src/pages/my/TenantsPage.tsx +37 -0
  137. package/src/pages/tenant/AssigneesPage.tsx +155 -0
  138. package/src/pages/tenant/BeatsPage.tsx +403 -0
  139. package/src/pages/tenant/DashboardPage.tsx +195 -0
  140. package/src/pages/tenant/GeofencePage.tsx +422 -0
  141. package/src/pages/tenant/IncidentsPage.tsx +214 -0
  142. package/src/pages/tenant/IntegrationsPage.tsx +352 -0
  143. package/src/pages/tenant/InvitePage.tsx +153 -0
  144. package/src/pages/tenant/LiveStreamPage.tsx +141 -0
  145. package/src/pages/tenant/MembersPage.tsx +414 -0
  146. package/src/pages/tenant/TenantProfilePage.tsx +701 -0
  147. package/src/platform/adapters/default.tsx +1 -1
  148. package/src/platform/types.ts +2 -0
  149. package/src/styles/components/apexcharts.css +101 -0
  150. package/src/styles/components/image-input.css +51 -0
  151. package/src/styles/components/leaflet.css +25 -0
  152. package/src/styles/components/rating.css +89 -0
  153. package/src/styles/components/scrollable.css +119 -0
  154. package/src/styles/layout.css +24 -0
  155. package/src/styles/layouts/sidebar-fixed.css +93 -138
  156. package/src/styles/themes.css +5 -5
  157. package/src/vite-env.d.ts +21 -0
  158. package/src/layouts/SettingsLayout.tsx +0 -21
  159. package/src/layouts/app-layout.tsx +0 -29
@@ -11,7 +11,7 @@ import type {
11
11
 
12
12
  // ─── Link ────────────────────────────────────────────────────────────────────
13
13
 
14
- function DefaultLink({ href, children, preserveScroll: _ps, replace: _r, ...props }: PlatformLinkProps) {
14
+ function DefaultLink({ href, children, prefetch: _pf, preserveScroll: _ps, replace: _r, ...props }: PlatformLinkProps) {
15
15
  return <a href={href} {...props}>{children}</a>;
16
16
  }
17
17
 
@@ -9,6 +9,8 @@ export interface PlatformLinkProps {
9
9
  onClick?: (e?: React.MouseEvent) => void;
10
10
  target?: string;
11
11
  rel?: string;
12
+ /** Prefetch the linked page (Next.js option, ignored elsewhere) */
13
+ prefetch?: boolean;
12
14
  /** Preserve scroll position after navigation (Inertia option, ignored elsewhere) */
13
15
  preserveScroll?: boolean;
14
16
  /** Replace history entry instead of pushing (SPA routers) */
@@ -0,0 +1,101 @@
1
+ @layer components {
2
+ .apexcharts-text,
3
+ .apexcharts-title-text,
4
+ .apexcharts-legend-text {
5
+ font-family: inherit !important;
6
+ }
7
+
8
+ .apexcharts-title-text {
9
+ font-weight: var(--font-weight-normal);
10
+ }
11
+
12
+ .apexcharts-pie-label {
13
+ @apply text-xs;
14
+ }
15
+
16
+ .apexcharts-toolbar {
17
+ text-align: start !important;
18
+ }
19
+
20
+ .apexcharts-menu {
21
+ border: 1px solid var(--color-border) !important;
22
+ box-shadow: var(--box-shadow-sm) !important;
23
+ background-color: var(--color-background) !important;
24
+ border-radius: 0.625rem !important;
25
+ padding: 0.5rem 0 !important;
26
+ overflow: hidden;
27
+ min-width: 10rem !important;
28
+ }
29
+
30
+ .apexcharts-menu .apexcharts-menu-item {
31
+ padding: 0.5rem 0.5rem !important;
32
+ }
33
+
34
+ .apexcharts-menu .apexcharts-menu-item:hover {
35
+ background-color: var(--gray-100) !important;
36
+ }
37
+
38
+ .apexcharts-tooltip {
39
+ border: 1px solid var(--color-border) !important;
40
+ box-shadow: var(--box-shadow-sm) !important;
41
+ background-color: var(--color-background) !important;
42
+ border-radius: 0.625rem !important;
43
+ color: var(--color-secondary-foreground) !important;
44
+ }
45
+
46
+ .apexcharts-tooltip .apexcharts-tooltip-title {
47
+ @apply text-foreground text-sm font-medium;
48
+ padding: 0.25rem 0.5rem !important;
49
+ background-color: transparent !important;
50
+ border-bottom: 1px solid var(--color-border) !important;
51
+ }
52
+
53
+ .apexcharts-xaxistooltip {
54
+ border: 1px solid var(--color-border) !important;
55
+ box-shadow: var(--box-shadow-sm) !important;
56
+ background-color: var(--color-background) !important;
57
+ border-radius: 0.625rem;
58
+ color: var(--color-mono);
59
+ }
60
+
61
+ .apexcharts-xaxistooltip:before {
62
+ border-bottom: 0 !important;
63
+ }
64
+
65
+ .apexcharts-legend {
66
+ display: flex;
67
+ flex-direction: column;
68
+ @apply gap-2;
69
+ }
70
+
71
+ .apexcharts-legend .apexcharts-legend-series {
72
+ @apply gap-1;
73
+ display: flex;
74
+ align-items: center;
75
+ }
76
+
77
+ .apexcharts-legend .apexcharts-legend-series .apexcharts-legend-text {
78
+ @apply text-muted-foreground text-sm font-medium;
79
+ }
80
+
81
+ .apexcharts-card-rounded .apexcharts-canvas svg {
82
+ border-bottom-left-radius: var(--radius-xl);
83
+ border-bottom-right-radius: var(--radius-xl);
84
+ }
85
+
86
+ .apexcharts-rounded-sm .apexcharts-canvas svg {
87
+ border-radius: var(--radius-sm);
88
+ }
89
+
90
+ .apexcharts-rounded .apexcharts-canvas svg {
91
+ border-radius: var(--radius-md);
92
+ }
93
+
94
+ .apexcharts-rounded-lg .apexcharts-canvas svg {
95
+ border-radius: var(--radius-lg);
96
+ }
97
+
98
+ .apexcharts-rounded-xl .apexcharts-canvas svg {
99
+ border-radius: var(--radius-xl);
100
+ }
101
+ }
@@ -0,0 +1,51 @@
1
+ @layer components {
2
+ .kt-image-input {
3
+ @apply relative inline-flex size-20 cursor-pointer items-center justify-center;
4
+
5
+ input[type='file'] {
6
+ @apply absolute size-0 appearance-none opacity-0;
7
+ }
8
+ }
9
+
10
+ .kt-image-input-remove {
11
+ @apply bg-background border-border absolute end-0.25 top-0.25 z-[1] flex size-5 cursor-pointer items-center justify-center rounded-full border shadow-sm;
12
+
13
+ i {
14
+ @apply text-muted-foreground text-[11px];
15
+ }
16
+
17
+ svg {
18
+ @apply text-muted-foreground size-3.25;
19
+ }
20
+
21
+ &:hover {
22
+ i {
23
+ @apply text-foreground;
24
+ }
25
+
26
+ svg {
27
+ @apply text-foreground;
28
+ }
29
+ }
30
+ }
31
+
32
+ .kt-image-input-placeholder {
33
+ @apply border-border kt-image-input-empty:border-border relative size-full overflow-hidden rounded-full border bg-cover bg-no-repeat;
34
+ }
35
+
36
+ .kt-image-input-preview {
37
+ @apply relative size-full overflow-hidden rounded-full bg-cover bg-no-repeat;
38
+ }
39
+ }
40
+
41
+ @custom-variant kt-image-input-empty {
42
+ [data-kt-image-input-initialized].empty & {
43
+ @slot;
44
+ }
45
+ }
46
+
47
+ @custom-variant image-input-changed {
48
+ [data-kt-image-input-initialized].changed & {
49
+ @slot;
50
+ }
51
+ }
@@ -0,0 +1,25 @@
1
+ @layer components {
2
+ /* Base Leaflet container styles */
3
+ .leaflet-container {
4
+ /* Leaflet pane and control styles */
5
+ & .leaflet-pane,
6
+ & .leaflet-top,
7
+ & .leaflet-bottom,
8
+ & .leaflet-control {
9
+ z-index: 1 !important;
10
+ }
11
+
12
+ /* Leaflet popup content wrapper styles */
13
+ & .leaflet-popup-content-wrapper {
14
+ border-radius: var(--radius-md);
15
+ text-align: center;
16
+ background-color: var(--color-popover);
17
+
18
+ /* Leaflet popup content styles */
19
+ & .leaflet-popup-content {
20
+ font-family: inherit;
21
+ @apply text-xs;
22
+ }
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,89 @@
1
+ @layer components {
2
+ /* Base kt-rating styles */
3
+ .kt-rating {
4
+ display: inline-flex;
5
+ align-items: stretch;
6
+
7
+ & input {
8
+ appearance: none;
9
+ position: absolute;
10
+ inset-inline-start: 9999px;
11
+
12
+ &[disabled] {
13
+ display: none;
14
+ }
15
+ }
16
+ }
17
+
18
+ /* kt-rating on state */
19
+ .kt-rating-on {
20
+ @apply text-yellow-400;
21
+ }
22
+
23
+ /* kt-rating off state */
24
+ .kt-rating-off {
25
+ @apply text-muted-foreground;
26
+ }
27
+
28
+ /* kt-rating label base styles */
29
+ .kt-rating-label {
30
+ display: inline-flex !important;
31
+ align-items: center;
32
+
33
+ & .kt-rating-on {
34
+ display: none !important;
35
+ }
36
+
37
+ & .kt-rating-off {
38
+ display: inline-flex !important;
39
+ }
40
+ }
41
+
42
+ /* Hover and checked states for kt-rating label */
43
+ .kt-rating:hover label.kt-rating-label,
44
+ label.kt-rating-label,
45
+ label.kt-rating-label.checked,
46
+ div.kt-rating-label.checked {
47
+ & .kt-rating-on {
48
+ display: inline-flex !important;
49
+ }
50
+
51
+ & .kt-rating-off {
52
+ display: none !important;
53
+ }
54
+ }
55
+
56
+ /* Sibling hover and checked states */
57
+ label.kt-rating-label:hover ~ label.kt-rating-label,
58
+ .kt-rating-input:checked ~ .kt-rating-label {
59
+ & .kt-rating-on {
60
+ display: none !important;
61
+ }
62
+
63
+ & .kt-rating-off {
64
+ display: inline-flex !important;
65
+ }
66
+ }
67
+
68
+ /* Indeterminate kt-rating label state */
69
+ .kt-rating-label.indeterminate {
70
+ position: relative;
71
+
72
+ & .kt-rating-on {
73
+ display: inline-flex !important;
74
+ position: absolute;
75
+ z-index: 1;
76
+ overflow: hidden;
77
+ inset-inline-start: 0;
78
+ }
79
+
80
+ & .kt-rating-off {
81
+ display: inline-flex !important;
82
+ }
83
+ }
84
+
85
+ /* Cursor for label */
86
+ label.kt-rating-label {
87
+ cursor: pointer;
88
+ }
89
+ }
@@ -0,0 +1,119 @@
1
+ @layer components {
2
+ /* Base scrollable styles */
3
+ .kt-scrollable,
4
+ .kt-scrollable-y,
5
+ .kt-scrollable-x,
6
+ .kt-scrollable-hover,
7
+ .kt-scrollable-y-hover,
8
+ .kt-scrollable-x-hover,
9
+ .kt-scrollable-auto,
10
+ .kt-scrollable-y-auto,
11
+ .kt-scrollable-x-auto {
12
+ scrollbar-width: thin;
13
+ scrollbar-color: transparent transparent;
14
+ position: relative;
15
+
16
+ &::-webkit-scrollbar {
17
+ width: 0.35rem;
18
+ height: 0.35rem;
19
+ }
20
+
21
+ &::-webkit-scrollbar-track {
22
+ background-color: transparent;
23
+ }
24
+
25
+ &::-webkit-scrollbar-thumb {
26
+ border-radius: 1.25rem;
27
+ }
28
+
29
+ &::-webkit-scrollbar-corner {
30
+ background-color: transparent;
31
+ }
32
+ }
33
+
34
+ /* Overflow styles for scrollable variants */
35
+ .kt-scrollable,
36
+ .kt-scrollable-hover {
37
+ overflow: scroll;
38
+ }
39
+
40
+ .kt-scrollable-y,
41
+ .kt-scrollable-y-hover {
42
+ overflow-y: scroll;
43
+ }
44
+
45
+ .kt-scrollable-x,
46
+ .kt-scrollable-x-hover {
47
+ overflow-x: scroll;
48
+ }
49
+
50
+ .kt-scrollable-auto {
51
+ overflow: auto;
52
+ }
53
+
54
+ .kt-scrollable-y-auto {
55
+ overflow-y: auto;
56
+ }
57
+
58
+ .kt-scrollable-x-auto {
59
+ overflow-x: auto;
60
+ }
61
+
62
+ /* Scrollbar visibility and color */
63
+ .kt-scrollable,
64
+ .kt-scrollable-y,
65
+ .kt-scrollable-x,
66
+ .kt-scrollable-auto,
67
+ .kt-scrollable-y-auto,
68
+ .kt-scrollable-x-auto,
69
+ .kt-scrollable-hover:hover,
70
+ .kt-scrollable-y-hover:hover,
71
+ .kt-scrollable-x-hover:hover {
72
+ scrollbar-color: var(--scrollbar-thumb-color, var(--color-input))
73
+ transparent;
74
+
75
+ &::-webkit-scrollbar-thumb {
76
+ background-color: var(--scrollbar-thumb-color, var(--color-input));
77
+ }
78
+
79
+ &::-webkit-scrollbar-corner {
80
+ background-color: transparent;
81
+ }
82
+ }
83
+
84
+ /* Target safari browser only */
85
+ @supports (-webkit-hyphens: none) {
86
+ .kt-scrollable,
87
+ .kt-scrollable-hover {
88
+ overflow: auto;
89
+ }
90
+
91
+ .kt-scrollable-y,
92
+ .kt-scrollable-y-hover {
93
+ overflow-y: auto;
94
+ }
95
+
96
+ .kt-scrollable-x,
97
+ .kt-scrollable-x-hover {
98
+ overflow-x: auto;
99
+ }
100
+ }
101
+
102
+ /* Responsive adjustments for smaller screens */
103
+ @media (max-width: 64rem) {
104
+ .kt-scrollable,
105
+ .kt-scrollable-hover {
106
+ overflow: auto;
107
+ }
108
+
109
+ .kt-scrollable-y,
110
+ .kt-scrollable-y-hover {
111
+ overflow-y: auto;
112
+ }
113
+
114
+ .kt-scrollable-x,
115
+ .kt-scrollable-x-hover {
116
+ overflow-x: auto;
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,24 @@
1
+ /* ── Layout variables ────────────────────────────────────────────────────── */
2
+ :root {
3
+ --sidebar-width: 16rem; /* 256px */
4
+ --sidebar-collapsed-width: 4rem; /* 64px */
5
+ --header-height: 4rem; /* 64px */
6
+ --content-padding: 1.25rem; /* 20px */
7
+ }
8
+
9
+ @media (max-width: 768px) {
10
+ :root {
11
+ --sidebar-width: 100vw;
12
+ --sidebar-collapsed-width: 0;
13
+ }
14
+ }
15
+
16
+ /* ── Layout state utility classes ───────────────────────────────────────── */
17
+ .sidebar-expanded { width: var(--sidebar-width); }
18
+ .sidebar-collapsed { width: var(--sidebar-collapsed-width); }
19
+
20
+ .header-full-width { width: calc(100vw - var(--sidebar-width)); }
21
+ .header-full-width-collapsed { width: calc(100vw - var(--sidebar-collapsed-width)); }
22
+
23
+ .content-full-width { width: calc(100vw - var(--sidebar-width)); }
24
+ .content-full-width-collapsed { width: calc(100vw - var(--sidebar-collapsed-width)); }
@@ -1,161 +1,116 @@
1
1
  /**
2
- * SidebarFixedLayout (Metronic demo1)structural CSS.
3
- *
4
- * Applied via body class ".sidebar-fixed-layout" set by the layout component
5
- * on mount and removed on unmount.
6
- *
7
- * Variables:
8
- * --sidebar-width current sidebar width (collapses to --sidebar-width-collapse)
9
- * --sidebar-width-collapse icon-only width when sidebar is collapsed
10
- * --sidebar-default-width full expanded width (used on hover to re-expand)
11
- * --header-height height of the fixed header
12
- * --sidebar-transition-* animation timing
2
+ * SidebarFixedLayout structural CSSplain CSS, no Tailwind directives.
3
+ * Imported directly by SidebarFixedLayout.tsx so consuming apps get it automatically.
13
4
  */
14
5
 
15
- @layer components {
6
+ .sidebar-fixed-layout {
7
+ --sidebar-transition-duration: 0.3s;
8
+ --sidebar-transition-timing: ease;
9
+ --sidebar-width: 280px;
10
+ --sidebar-width-collapse: 80px;
11
+ --sidebar-default-width: 280px;
12
+ --header-height: 70px;
13
+ }
14
+
15
+ @media (max-width: 1023px) {
16
16
  .sidebar-fixed-layout {
17
- --sidebar-transition-duration: 0.3s;
18
- --sidebar-transition-timing: ease;
19
17
  --sidebar-width: 280px;
20
- --sidebar-width-collapse: 80px;
21
- --sidebar-default-width: 280px;
22
- --header-height: 70px;
18
+ --header-height: 60px;
23
19
  }
20
+ }
24
21
 
25
- @media (max-width: theme(--breakpoint-lg)) {
26
- .sidebar-fixed-layout {
27
- --sidebar-width: 280px;
28
- --header-height: 60px;
29
- }
30
- }
22
+ /* Header + sidebar-header height */
23
+ .sidebar-fixed-layout .layout-header {
24
+ height: var(--header-height);
25
+ }
31
26
 
32
- /* Base chrome */
33
- .sidebar-fixed-layout .layout-header {
34
- height: var(--header-height);
35
- }
27
+ .sidebar-fixed-layout .layout-sidebar .sidebar-header {
28
+ height: var(--header-height);
29
+ }
36
30
 
31
+ /* Fixed header pushes wrapper down */
32
+ .sidebar-fixed-layout.header-fixed .layout-wrapper {
33
+ padding-top: var(--header-height);
34
+ }
35
+
36
+ /* Desktop: sidebar width + wrapper offset */
37
+ @media (min-width: 1024px) {
37
38
  .sidebar-fixed-layout .layout-sidebar {
38
39
  width: var(--sidebar-width);
40
+ transition: width var(--sidebar-transition-duration) var(--sidebar-transition-timing);
41
+ }
42
+
43
+ .sidebar-fixed-layout .layout-sidebar .sidebar-wrapper {
44
+ width: var(--sidebar-default-width);
45
+ }
46
+
47
+ .sidebar-fixed-layout .layout-wrapper {
48
+ padding-inline-start: var(--sidebar-width);
49
+ transition: padding-inline-start var(--sidebar-transition-duration) var(--sidebar-transition-timing);
50
+ }
51
+
52
+ .sidebar-fixed-layout.header-fixed .layout-header {
53
+ inset-inline-start: var(--sidebar-width);
54
+ transition: inset-inline-start var(--sidebar-transition-duration) var(--sidebar-transition-timing);
39
55
  }
40
56
 
41
- /* Fixed header pushes wrapper down */
42
57
  .sidebar-fixed-layout.header-fixed .layout-wrapper {
43
58
  padding-top: var(--header-height);
44
59
  }
45
60
 
46
- /* Desktop: fixed sidebar offsets the wrapper */
47
- @media (min-width: theme(--breakpoint-lg)) {
48
- .sidebar-fixed-layout .layout-sidebar {
49
- width: var(--sidebar-width);
50
- transition: width var(--sidebar-transition-duration)
51
- var(--sidebar-transition-timing);
52
- }
53
-
54
- .sidebar-fixed-layout .layout-sidebar .sidebar-header {
55
- height: var(--header-height);
56
- }
57
-
58
- .sidebar-fixed-layout .layout-sidebar .sidebar-wrapper {
59
- width: var(--sidebar-default-width);
60
- }
61
-
62
- .sidebar-fixed-layout .layout-sidebar .sidebar-logo {
63
- width: var(--sidebar-default-width);
64
- }
65
-
66
- .sidebar-fixed-layout .layout-sidebar .small-logo {
67
- display: none;
68
- }
69
-
70
- .sidebar-fixed-layout .layout-wrapper {
71
- padding-inline-start: var(--sidebar-width);
72
- }
73
-
74
- .sidebar-fixed-layout.header-fixed .layout-header {
75
- inset-inline-start: var(--sidebar-width);
76
- }
77
-
78
- .sidebar-fixed-layout.header-fixed .layout-wrapper {
79
- padding-top: var(--header-height);
80
- }
81
-
82
- /* Collapsed state */
83
- .sidebar-fixed-layout.sidebar-collapse {
84
- --sidebar-width: var(--sidebar-width-collapse);
85
- }
86
-
87
- .sidebar-fixed-layout.sidebar-collapse .layout-sidebar {
88
- transition: width var(--sidebar-transition-duration)
89
- var(--sidebar-transition-timing);
90
- }
91
-
92
- .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:hover {
93
- width: var(--sidebar-default-width);
94
- }
95
-
96
- .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) .default-logo {
97
- display: none;
98
- }
99
-
100
- .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) .small-logo {
101
- display: flex;
102
- }
103
-
104
- /* Hide accordion labels/badges when collapsed and not hovered */
105
- .sidebar-fixed-layout.sidebar-collapse
106
- .layout-sidebar:not(:hover)
107
- [data-slot='accordion-menu-title'],
108
- .sidebar-fixed-layout.sidebar-collapse
109
- .layout-sidebar:not(:hover)
110
- [data-slot='badge'],
111
- .sidebar-fixed-layout.sidebar-collapse
112
- .layout-sidebar:not(:hover)
113
- [data-slot='accordion-menu-sub-indicator'] {
114
- display: none !important;
115
- transition: none !important;
116
- animation: none !important;
117
- }
118
-
119
- .sidebar-fixed-layout.sidebar-collapse
120
- .layout-sidebar:not(:hover)
121
- [data-slot='accordion-menu-sub-content'] {
122
- visibility: hidden;
123
- position: absolute;
124
- height: 0;
125
- width: 0;
126
- }
127
-
128
- .sidebar-fixed-layout.sidebar-collapse
129
- .layout-sidebar:not(:hover)
130
- [data-slot='accordion-menu-label'] {
131
- visibility: hidden;
132
- position: relative;
133
- }
134
-
135
- .sidebar-fixed-layout.sidebar-collapse
136
- .layout-sidebar:not(:hover)
137
- [data-slot='accordion-menu-label']::before {
138
- content: '...';
139
- color: currentColor;
140
- font-size: inherit;
141
- position: absolute;
142
- visibility: visible;
143
- display: inline-block;
144
- inset-inline-start: 0;
145
- top: 0.25rem;
146
- margin-inline-start: -0.15rem;
147
- transform: translateX(100%);
148
- }
61
+ /* Collapsed state — redefine sidebar-width via custom prop */
62
+ .sidebar-fixed-layout.sidebar-collapse {
63
+ --sidebar-width: var(--sidebar-width-collapse);
64
+ }
65
+
66
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:hover {
67
+ width: var(--sidebar-default-width);
68
+ }
69
+
70
+ /* When collapsed and not hovered, hide app name (logo icon stays visible) */
71
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) .sidebar-app-name {
72
+ display: none;
73
+ }
74
+
75
+ /* Hide accordion text labels when collapsed and not hovered */
76
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) [data-slot='accordion-menu-title'],
77
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) [data-slot='badge'],
78
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) [data-slot='accordion-menu-sub-indicator'] {
79
+ display: none !important;
80
+ transition: none !important;
81
+ animation: none !important;
149
82
  }
150
83
 
151
- /* Smooth transitions after layout initialises (avoids flash on mount) */
152
- .sidebar-fixed-layout.layout-initialized .layout-wrapper {
153
- transition: padding-inline-start var(--sidebar-transition-duration)
154
- var(--sidebar-transition-timing);
84
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) [data-slot='accordion-menu-sub-content'] {
85
+ visibility: hidden;
86
+ position: absolute;
87
+ height: 0;
88
+ width: 0;
155
89
  }
156
90
 
157
- .sidebar-fixed-layout.layout-initialized .layout-header {
158
- transition: inset-inline-start var(--sidebar-transition-duration)
159
- var(--sidebar-transition-timing);
91
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) [data-slot='accordion-menu-label'] {
92
+ visibility: hidden;
93
+ position: relative;
160
94
  }
95
+
96
+ .sidebar-fixed-layout.sidebar-collapse .layout-sidebar:not(:hover) [data-slot='accordion-menu-label']::before {
97
+ content: '•••';
98
+ color: currentColor;
99
+ font-size: 0.5rem;
100
+ letter-spacing: 0.1em;
101
+ position: absolute;
102
+ visibility: visible;
103
+ display: inline-block;
104
+ inset-inline-start: 0;
105
+ top: 0.15rem;
106
+ }
107
+ }
108
+
109
+ /* Smooth transitions after mount (prevents flash on init) */
110
+ .sidebar-fixed-layout.layout-initialized .layout-wrapper {
111
+ transition: padding-inline-start var(--sidebar-transition-duration) var(--sidebar-transition-timing);
112
+ }
113
+
114
+ .sidebar-fixed-layout.layout-initialized .layout-header {
115
+ transition: inset-inline-start var(--sidebar-transition-duration) var(--sidebar-transition-timing);
161
116
  }