@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.
- package/README.md +216 -0
- package/package.json +133 -4
- package/src/assets/index.ts +120 -0
- package/src/assets/media/avatars/300-1.png +0 -0
- package/src/assets/media/avatars/300-10.png +0 -0
- package/src/assets/media/avatars/300-11.png +0 -0
- package/src/assets/media/avatars/300-12.png +0 -0
- package/src/assets/media/avatars/300-13.png +0 -0
- package/src/assets/media/avatars/300-14.png +0 -0
- package/src/assets/media/avatars/300-15.png +0 -0
- package/src/assets/media/avatars/300-16.png +0 -0
- package/src/assets/media/avatars/300-17.png +0 -0
- package/src/assets/media/avatars/300-18.png +0 -0
- package/src/assets/media/avatars/300-19.png +0 -0
- package/src/assets/media/avatars/300-2.png +0 -0
- package/src/assets/media/avatars/300-20.png +0 -0
- package/src/assets/media/avatars/300-21.png +0 -0
- package/src/assets/media/avatars/300-22.png +0 -0
- package/src/assets/media/avatars/300-23.png +0 -0
- package/src/assets/media/avatars/300-24.png +0 -0
- package/src/assets/media/avatars/300-25.png +0 -0
- package/src/assets/media/avatars/300-26.png +0 -0
- package/src/assets/media/avatars/300-27.png +0 -0
- package/src/assets/media/avatars/300-28.png +0 -0
- package/src/assets/media/avatars/300-29.png +0 -0
- package/src/assets/media/avatars/300-3.png +0 -0
- package/src/assets/media/avatars/300-30.png +0 -0
- package/src/assets/media/avatars/300-31.png +0 -0
- package/src/assets/media/avatars/300-32.png +0 -0
- package/src/assets/media/avatars/300-33.png +0 -0
- package/src/assets/media/avatars/300-34.png +0 -0
- package/src/assets/media/avatars/300-4.png +0 -0
- package/src/assets/media/avatars/300-5.png +0 -0
- package/src/assets/media/avatars/300-6.png +0 -0
- package/src/assets/media/avatars/300-7.png +0 -0
- package/src/assets/media/avatars/300-8.png +0 -0
- package/src/assets/media/avatars/300-9.png +0 -0
- package/src/assets/media/avatars/blank.png +0 -0
- package/src/assets/media/avatars/gray/1.png +0 -0
- package/src/assets/media/avatars/gray/2.png +0 -0
- package/src/assets/media/avatars/gray/3.png +0 -0
- package/src/assets/media/avatars/gray/4.png +0 -0
- package/src/assets/media/avatars/gray/5.png +0 -0
- package/src/assets/media/illustrations/1-dark.svg +78 -0
- package/src/assets/media/illustrations/1.svg +78 -0
- package/src/assets/media/illustrations/10-dark.svg +148 -0
- package/src/assets/media/illustrations/10.svg +148 -0
- package/src/assets/media/illustrations/11-dark.svg +234 -0
- package/src/assets/media/illustrations/11.svg +234 -0
- package/src/assets/media/illustrations/12.svg +138 -0
- package/src/assets/media/illustrations/13.svg +205 -0
- package/src/assets/media/illustrations/14.svg +259 -0
- package/src/assets/media/illustrations/15.svg +242 -0
- package/src/assets/media/illustrations/16.svg +128 -0
- package/src/assets/media/illustrations/17.svg +180 -0
- package/src/assets/media/illustrations/18-dark.svg +6 -0
- package/src/assets/media/illustrations/18.svg +6 -0
- package/src/assets/media/illustrations/19-dark.svg +8 -0
- package/src/assets/media/illustrations/19.svg +8 -0
- package/src/assets/media/illustrations/2-dark.svg +78 -0
- package/src/assets/media/illustrations/2.svg +78 -0
- package/src/assets/media/illustrations/20-dark.svg +13 -0
- package/src/assets/media/illustrations/20.svg +13 -0
- package/src/assets/media/illustrations/21-dark.svg +9 -0
- package/src/assets/media/illustrations/21.svg +9 -0
- package/src/assets/media/illustrations/22-dark.svg +17 -0
- package/src/assets/media/illustrations/22.svg +17 -0
- package/src/assets/media/illustrations/23-dark.svg +13 -0
- package/src/assets/media/illustrations/23.svg +13 -0
- package/src/assets/media/illustrations/24.svg +6 -0
- package/src/assets/media/illustrations/25.svg +8 -0
- package/src/assets/media/illustrations/26.svg +8 -0
- package/src/assets/media/illustrations/27.svg +6 -0
- package/src/assets/media/illustrations/28-dark.svg +28 -0
- package/src/assets/media/illustrations/28.svg +14 -0
- package/src/assets/media/illustrations/29-dark.svg +6 -0
- package/src/assets/media/illustrations/29.svg +6 -0
- package/src/assets/media/illustrations/3-dark.svg +70 -0
- package/src/assets/media/illustrations/3.svg +70 -0
- package/src/assets/media/illustrations/30-dark.svg +8 -0
- package/src/assets/media/illustrations/30.svg +8 -0
- package/src/assets/media/illustrations/31-dark.svg +9 -0
- package/src/assets/media/illustrations/31.svg +9 -0
- package/src/assets/media/illustrations/32-dark.svg +10 -0
- package/src/assets/media/illustrations/32.svg +10 -0
- package/src/assets/media/illustrations/33-dark.svg +15 -0
- package/src/assets/media/illustrations/33.svg +15 -0
- package/src/assets/media/illustrations/34-dark.svg +5 -0
- package/src/assets/media/illustrations/34.svg +5 -0
- package/src/assets/media/illustrations/35-dark.svg +11 -0
- package/src/assets/media/illustrations/35.svg +4 -0
- package/src/assets/media/illustrations/4-dark.svg +51 -0
- package/src/assets/media/illustrations/4.svg +51 -0
- package/src/assets/media/illustrations/5-dark.svg +78 -0
- package/src/assets/media/illustrations/5.svg +78 -0
- package/src/assets/media/illustrations/6.svg +58 -0
- package/src/assets/media/illustrations/7.svg +49 -0
- package/src/assets/media/illustrations/8.svg +61 -0
- package/src/assets/media/illustrations/9.svg +57 -0
- package/src/assets/media/misc/placeholder.svg +15 -0
- package/src/components/devices/devices-mini-map.tsx +32 -26
- package/src/components/devices/map-marker.tsx +98 -0
- package/src/components/ui/checklist-item.tsx +55 -0
- package/src/components/ui/plan-card.tsx +68 -0
- package/src/components/ui/settings-row.tsx +32 -0
- package/src/components/ui/settings-section.tsx +22 -0
- package/src/components/ui/usage-meter.tsx +35 -0
- package/src/index.ts +12 -1
- package/src/layouts/LayoutSwitcher.tsx +220 -0
- package/src/layouts/app/MegaMenuLayout.tsx +69 -34
- package/src/layouts/app/MegaMenuNavbarLayout.tsx +73 -37
- package/src/layouts/app/NavbarCollapsibleLayout.tsx +53 -4
- package/src/layouts/app/NavbarSidebarLayout.tsx +74 -29
- package/src/layouts/app/SidebarDualMenuLayout.tsx +48 -5
- package/src/layouts/app/SidebarFixedLayout.tsx +15 -10
- package/src/layouts/app/SidebarMinimalLayout.tsx +51 -3
- package/src/layouts/app/SidebarTabsLayout.tsx +48 -2
- package/src/layouts/app/SplitSidebarLayout.tsx +91 -43
- package/src/layouts/app/TopNavLayout.tsx +7 -12
- package/src/layouts/app/WorkspaceSidebarLayout.tsx +103 -46
- package/src/layouts/app/partials/Navbar.tsx +61 -10
- package/src/layouts/app/partials/Toolbar.tsx +1 -1
- package/src/layouts/auth/AuthCenteredLayout.tsx +10 -4
- package/src/lib/map-markers.ts +21 -3
- package/src/pages/login/ConfirmPasswordPage.tsx +35 -0
- package/src/pages/login/ForgotPasswordPage.tsx +41 -0
- package/src/pages/login/LoginPage.tsx +50 -0
- package/src/pages/login/RegisterPage.tsx +41 -0
- package/src/pages/login/ResetPasswordPage.tsx +35 -0
- package/src/pages/login/TwoFactorChallengePage.tsx +41 -0
- package/src/pages/login/VerifyEmailPage.tsx +31 -0
- package/src/pages/my/ActivityPage.tsx +160 -0
- package/src/pages/my/GetStartedPage.tsx +221 -0
- package/src/pages/my/NotificationsPage.tsx +133 -0
- package/src/pages/my/ProfilePage.tsx +650 -0
- package/src/pages/my/TenantsPage.tsx +37 -0
- package/src/pages/tenant/AssigneesPage.tsx +155 -0
- package/src/pages/tenant/BeatsPage.tsx +403 -0
- package/src/pages/tenant/DashboardPage.tsx +195 -0
- package/src/pages/tenant/GeofencePage.tsx +422 -0
- package/src/pages/tenant/IncidentsPage.tsx +214 -0
- package/src/pages/tenant/IntegrationsPage.tsx +352 -0
- package/src/pages/tenant/InvitePage.tsx +153 -0
- package/src/pages/tenant/LiveStreamPage.tsx +141 -0
- package/src/pages/tenant/MembersPage.tsx +414 -0
- package/src/pages/tenant/TenantProfilePage.tsx +701 -0
- package/src/platform/adapters/default.tsx +1 -1
- package/src/platform/types.ts +2 -0
- package/src/styles/components/apexcharts.css +101 -0
- package/src/styles/components/image-input.css +51 -0
- package/src/styles/components/leaflet.css +25 -0
- package/src/styles/components/rating.css +89 -0
- package/src/styles/components/scrollable.css +119 -0
- package/src/styles/layout.css +24 -0
- package/src/styles/layouts/sidebar-fixed.css +93 -138
- package/src/styles/themes.css +5 -5
- package/src/vite-env.d.ts +21 -0
- package/src/layouts/SettingsLayout.tsx +0 -21
- 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
|
|
package/src/platform/types.ts
CHANGED
|
@@ -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
|
|
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 CSS — plain CSS, no Tailwind directives.
|
|
3
|
+
* Imported directly by SidebarFixedLayout.tsx so consuming apps get it automatically.
|
|
13
4
|
*/
|
|
14
5
|
|
|
15
|
-
|
|
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
|
-
--
|
|
21
|
-
--sidebar-default-width: 280px;
|
|
22
|
-
--header-height: 70px;
|
|
18
|
+
--header-height: 60px;
|
|
23
19
|
}
|
|
20
|
+
}
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
}
|
|
22
|
+
/* Header + sidebar-header height */
|
|
23
|
+
.sidebar-fixed-layout .layout-header {
|
|
24
|
+
height: var(--header-height);
|
|
25
|
+
}
|
|
31
26
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
/*
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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.
|
|
158
|
-
|
|
159
|
-
|
|
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
|
}
|