@dalexto/lexsys-registry 0.1.1 → 0.1.3
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/dist/index.js +12 -3
- package/package.json +2 -2
- package/templates/blocks/AuthForm/AuthForm.tsx +9 -5
- package/templates/blocks/AuthForm/AuthForm.types.ts +3 -3
- package/templates/blocks/AuthForm/AuthForm.variants.ts +8 -2
- package/templates/blocks/CommandPalette/CommandPalette.tsx +15 -12
- package/templates/blocks/CommandPalette/CommandPalette.types.ts +2 -2
- package/templates/blocks/CommandPalette/CommandPalette.variants.ts +6 -6
- package/templates/blocks/DataTable/DataTable.tsx +2 -2
- package/templates/blocks/DataTable/DataTable.types.ts +2 -2
- package/templates/blocks/DataTable/DataTable.variants.ts +5 -4
- package/templates/blocks/FilterToolbar/FilterToolbar.tsx +12 -5
- package/templates/blocks/FilterToolbar/FilterToolbar.types.ts +4 -4
- package/templates/blocks/FilterToolbar/FilterToolbar.variants.ts +11 -5
- package/templates/blocks/FormField/FormField.tsx +1 -1
- package/templates/blocks/FormField/FormField.types.ts +1 -1
- package/templates/blocks/FormField/FormField.variants.ts +1 -1
- package/templates/blocks/PageHeader/PageHeader.tsx +2 -2
- package/templates/blocks/PageHeader/PageHeader.types.ts +2 -2
- package/templates/blocks/PageHeader/PageHeader.variants.ts +6 -5
- package/templates/blocks/SettingsPanel/SettingsPanel.tsx +1 -1
- package/templates/blocks/SettingsPanel/SettingsPanel.types.ts +1 -1
- package/templates/blocks/Sidebar/Sidebar.tsx +1048 -22
- package/templates/blocks/Sidebar/Sidebar.types.ts +185 -1
- package/templates/blocks/Sidebar/Sidebar.utils.ts +34 -0
- package/templates/blocks/Sidebar/Sidebar.variants.ts +445 -25
- package/templates/blocks/StatsCard/StatsCard.tsx +1 -1
- package/templates/blocks/StatsCard/StatsCard.types.ts +1 -1
- package/templates/blocks/StatsCard/StatsCard.variants.ts +7 -6
- package/templates/primitives/DatePicker/DatePicker.tsx +11 -1
- package/templates/primitives/DatePicker/DatePicker.types.ts +4 -1
- package/templates/primitives/DatePicker/DatePicker.variants.ts +11 -2
- package/templates/primitives/Toolbar/Toolbar.variants.ts +4 -2
- package/templates/styles/theme.css +14 -1
- package/templates/styles/tokens.css +147 -29
- package/templates/templates/DashboardShell/DashboardShell.variants.ts +19 -4
- package/templates/templates/SettingsPageLayout/SettingsPageLayout.tsx +2 -2
- package/templates/templates/SettingsPageLayout/SettingsPageLayout.types.ts +2 -2
- package/templates/templates/SettingsPageLayout/SettingsPageLayout.variants.ts +16 -7
|
@@ -4,54 +4,441 @@
|
|
|
4
4
|
* Variant classes for the Sidebar block.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import { disabledStateClasses } from "@/lib/utils"
|
|
8
|
+
import type { BadgeVariant } from "@/components/primitives/Badge/Badge.types"
|
|
9
|
+
import type { SidebarShellOptions } from "./Sidebar.types"
|
|
10
|
+
|
|
11
|
+
export const sidebarRootClasses = ({
|
|
12
|
+
collapsed = false,
|
|
13
|
+
collapsible = "none",
|
|
14
|
+
side = "left",
|
|
15
|
+
}: SidebarShellOptions = {}): string => {
|
|
16
|
+
const classes = [
|
|
17
|
+
"group/sidebar lex-sidebar w-full shrink-0 md:h-full md:w-auto",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
if (collapsible !== "none" && collapsed) {
|
|
21
|
+
classes.push("lex-sidebar--collapsed")
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (collapsible === "offcanvas" && collapsed) {
|
|
25
|
+
classes.push("lex-sidebar--offcanvas")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (side === "right") {
|
|
29
|
+
classes.push("lex-sidebar--right")
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return classes.join(" ")
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const sidebarCollapsedItemClasses = (): string => {
|
|
36
|
+
return "md:group-data-[collapsed=true]/sidebar:justify-center md:group-data-[collapsed=true]/sidebar:px-2"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const sidebarCollapsedGroupLabelClasses = (): string => {
|
|
40
|
+
return "md:group-data-[collapsed=true]/sidebar:hidden"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const sidebarExpandableClasses = (): string => {
|
|
44
|
+
return [
|
|
45
|
+
"sidebar-expandable transition-[opacity,width] duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
46
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
47
|
+
].join(" ")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const sidebarCollapsedBrandClasses = (): string => {
|
|
51
|
+
return "md:group-data-[collapsed=true]/sidebar:justify-center"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const sidebarCollapsedFooterClasses = (): string => {
|
|
55
|
+
return "md:group-data-[collapsed=true]/sidebar:justify-center"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const sidebarDesktopClasses = ({
|
|
59
|
+
collapsed = false,
|
|
60
|
+
collapsible = "none",
|
|
61
|
+
side = "left",
|
|
62
|
+
}: SidebarShellOptions = {}): string => {
|
|
63
|
+
const classes = [
|
|
64
|
+
"lex-sidebar__desktop hidden h-full shrink-0 bg-(--lex-sidebar-desktop-background) md:flex md:flex-col",
|
|
65
|
+
"overflow-hidden transition-[width,transform] duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing) motion-reduce:transition-none",
|
|
66
|
+
side === "right"
|
|
67
|
+
? "border-s border-(--lex-sidebar-desktop-border-color)"
|
|
68
|
+
: "border-e border-(--lex-sidebar-desktop-border-color)",
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
if (collapsible === "icon" && collapsed) {
|
|
72
|
+
classes.push("w-(--lex-sidebar-width-collapsed)")
|
|
73
|
+
} else if (collapsible === "offcanvas" && collapsed) {
|
|
74
|
+
classes.push(
|
|
75
|
+
"w-(--lex-sidebar-width-default)",
|
|
76
|
+
side === "right"
|
|
77
|
+
? "translate-x-full rtl:-translate-x-full"
|
|
78
|
+
: "-translate-x-full rtl:translate-x-full",
|
|
79
|
+
)
|
|
80
|
+
} else {
|
|
81
|
+
classes.push("w-(--lex-sidebar-width-default)")
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return classes.join(" ")
|
|
9
85
|
}
|
|
10
86
|
|
|
11
|
-
export const
|
|
12
|
-
|
|
87
|
+
export const sidebarRailClasses = ({
|
|
88
|
+
side = "left",
|
|
89
|
+
}: SidebarShellOptions = {}): string => {
|
|
90
|
+
return [
|
|
91
|
+
"lex-sidebar__rail absolute inset-y-0 hidden w-4 md:block",
|
|
92
|
+
side === "right" ? "-start-2" : "-end-2",
|
|
93
|
+
"cursor-pointer border-0 bg-transparent p-0 outline-none",
|
|
94
|
+
"after:absolute after:inset-y-0 after:w-px after:bg-(--lex-sidebar-desktop-border-color)",
|
|
95
|
+
side === "right" ? "after:start-2" : "after:end-2",
|
|
96
|
+
].join(" ")
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export const sidebarMobileBarClasses = (): string => {
|
|
100
|
+
return [
|
|
101
|
+
"lex-sidebar__mobile-bar flex items-center",
|
|
102
|
+
"gap-(--lex-sidebar-mobile-bar-gap)",
|
|
103
|
+
"border-b border-(--lex-sidebar-mobile-bar-border-color)",
|
|
104
|
+
"bg-(--lex-sidebar-mobile-bar-background)",
|
|
105
|
+
"px-(--lex-sidebar-mobile-bar-padding-x) py-(--lex-sidebar-mobile-bar-padding-y)",
|
|
106
|
+
].join(" ")
|
|
13
107
|
}
|
|
14
108
|
|
|
15
109
|
export const sidebarMobileHeaderClasses = (): string => {
|
|
16
|
-
return "lex-sidebar__mobile-header min-w-0 flex-1"
|
|
110
|
+
return "lex-sidebar__mobile-header flex min-w-0 flex-1 items-center gap-(--lex-sidebar-mobile-bar-gap)"
|
|
17
111
|
}
|
|
18
112
|
|
|
19
113
|
export const sidebarBrandClasses = (): string => {
|
|
20
|
-
return
|
|
114
|
+
return [
|
|
115
|
+
"lex-sidebar__brand border-b border-(--lex-sidebar-brand-border-color)",
|
|
116
|
+
"px-(--lex-sidebar-brand-padding-x) py-(--lex-sidebar-brand-padding-y)",
|
|
117
|
+
].join(" ")
|
|
21
118
|
}
|
|
22
119
|
|
|
23
120
|
export const sidebarNavClasses = (): string => {
|
|
24
|
-
return "lex-sidebar__nav min-h-0 flex-1 p-
|
|
121
|
+
return "lex-sidebar__nav min-h-0 flex-1 p-(--lex-sidebar-nav-padding)"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export const sidebarInputClasses = (): string => {
|
|
125
|
+
return [
|
|
126
|
+
"lex-sidebar__input w-full",
|
|
127
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
128
|
+
].join(" ")
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export const sidebarSeparatorClasses = (): string => {
|
|
132
|
+
return [
|
|
133
|
+
"lex-sidebar__separator",
|
|
134
|
+
"mx-(--lex-sidebar-separator-margin-x) w-auto",
|
|
135
|
+
"my-(--lex-sidebar-separator-margin-y)",
|
|
136
|
+
].join(" ")
|
|
25
137
|
}
|
|
26
138
|
|
|
27
139
|
export const sidebarNavListClasses = (): string => {
|
|
28
|
-
return "lex-sidebar__list m-0 flex list-none flex-col gap-
|
|
140
|
+
return "lex-sidebar__list m-0 flex list-none flex-col gap-(--lex-sidebar-list-gap) p-0"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const sidebarItemClasses = (): string => {
|
|
144
|
+
return [
|
|
145
|
+
"lex-sidebar__row group/sidebar-row relative flex flex-col items-stretch",
|
|
146
|
+
"[&>:first-child]:min-w-0",
|
|
147
|
+
"[&>.lex-sidebar__item-row]:min-w-0",
|
|
148
|
+
"has-[.lex-sidebar__item-action]:[&>:first-child]:pe-8",
|
|
149
|
+
].join(" ")
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export const sidebarItemRowClasses = (): string => {
|
|
153
|
+
return [
|
|
154
|
+
"lex-sidebar__item-row flex w-full min-h-(--lex-sidebar-item-height-min) items-stretch",
|
|
155
|
+
].join(" ")
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export const sidebarItemDisclosureRowClasses = (): string => {
|
|
159
|
+
return [
|
|
160
|
+
"lex-sidebar__item-row lex-sidebar__item-row--disclosure group/sidebar-item-row",
|
|
161
|
+
"flex w-full min-h-(--lex-sidebar-item-height-min) items-stretch overflow-hidden",
|
|
162
|
+
"rounded-(--lex-sidebar-item-radius)",
|
|
163
|
+
"transition-colors duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
164
|
+
"hover:bg-(--lex-sidebar-item-background-hover)",
|
|
165
|
+
"has-[.lex-sidebar__item--active]:bg-(--lex-sidebar-item-background-active)",
|
|
166
|
+
"has-[.lex-sidebar__item--active]:text-(--lex-sidebar-item-foreground-active)",
|
|
167
|
+
"has-[.lex-sidebar__item--active]:[&_.lex-sidebar__item-expand]:text-(--lex-sidebar-item-foreground-active)",
|
|
168
|
+
].join(" ")
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const sidebarItemTrailingClasses = (): string => {
|
|
172
|
+
return [
|
|
173
|
+
"lex-sidebar__item-trailing ms-auto flex shrink-0 items-center gap-(--lex-sidebar-item-gap)",
|
|
174
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
175
|
+
].join(" ")
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** @deprecated Prefer `sidebarItemTrailingClasses` inside the item shell. */
|
|
179
|
+
export const sidebarItemAdornmentsClasses = (): string => {
|
|
180
|
+
return sidebarItemTrailingClasses()
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export const sidebarNavItemRowLeadClasses = (
|
|
184
|
+
active?: boolean,
|
|
185
|
+
disabled?: boolean,
|
|
186
|
+
): string => {
|
|
187
|
+
return sidebarNavItemDisclosureLeadClasses(active, disabled)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export const sidebarNavItemExpandTriggerClasses = (
|
|
191
|
+
open = false,
|
|
192
|
+
variant: "default" | "disclosure" = "default",
|
|
193
|
+
): string => {
|
|
194
|
+
const classes = [
|
|
195
|
+
"lex-sidebar__item-expand flex shrink-0 items-center justify-center",
|
|
196
|
+
"min-h-(--lex-sidebar-item-height-min) w-(--lex-sidebar-item-height-min)",
|
|
197
|
+
"rounded-(--lex-sidebar-item-radius) rounded-s-none",
|
|
198
|
+
"text-(--lex-sidebar-item-foreground)",
|
|
199
|
+
"transition-colors duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
200
|
+
"focus-visible:outline-none focus-visible:ring-(length:--lex-sidebar-item-focus-ring-width) focus-visible:ring-inset focus-visible:ring-(--lex-sidebar-item-focus-ring-color)",
|
|
201
|
+
"[&>svg]:size-(--lex-sidebar-item-icon-size) [&>svg]:shrink-0 [&>svg]:transition-transform",
|
|
202
|
+
open ? "[&>svg]:rotate-180" : "",
|
|
203
|
+
]
|
|
204
|
+
|
|
205
|
+
if (variant === "disclosure") {
|
|
206
|
+
classes.push("hover:bg-transparent")
|
|
207
|
+
} else {
|
|
208
|
+
classes.push(
|
|
209
|
+
"hover:bg-(--lex-sidebar-item-background-hover) hover:text-(--lex-color-text-primary)",
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return classes.join(" ")
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export const sidebarItemIconClasses = (): string => {
|
|
217
|
+
return [
|
|
218
|
+
"lex-sidebar__item-icon flex size-(--lex-sidebar-item-icon-size) shrink-0 items-center justify-center",
|
|
219
|
+
"transition-[width,height] duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
220
|
+
"md:group-data-[collapsed=true]/sidebar:size-(--lex-sidebar-item-icon-size-collapsed)",
|
|
221
|
+
"[&_svg]:size-full",
|
|
222
|
+
].join(" ")
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export const sidebarItemActionClasses = (showOnHover = true): string => {
|
|
226
|
+
const classes = [
|
|
227
|
+
"lex-sidebar__item-action absolute top-1/2 end-1 -translate-y-1/2",
|
|
228
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
229
|
+
]
|
|
230
|
+
|
|
231
|
+
if (showOnHover) {
|
|
232
|
+
classes.push(
|
|
233
|
+
"opacity-0 transition-opacity duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
234
|
+
"group-hover/sidebar-row:opacity-100 focus-visible:opacity-100",
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return classes.join(" ")
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export const sidebarItemShortcutClasses = (): string => {
|
|
242
|
+
return [
|
|
243
|
+
"lex-sidebar__item-shortcut inline-flex shrink-0 items-center justify-center",
|
|
244
|
+
"h-(--lex-sidebar-item-adornment-height) min-w-(--lex-sidebar-item-adornment-height)",
|
|
245
|
+
"rounded-(--lex-sidebar-item-radius) border border-[var(--lex-border-default)]",
|
|
246
|
+
"px-(--lex-sidebar-item-shortcut-padding-x)",
|
|
247
|
+
"text-(length:--lex-sidebar-item-font-size) font-(--lex-sidebar-item-font-weight)",
|
|
248
|
+
"leading-(--lex-sidebar-item-font-line-height) text-(--lex-sidebar-item-foreground)",
|
|
249
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
250
|
+
].join(" ")
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export const sidebarGroupActionClasses = (): string => {
|
|
254
|
+
return [
|
|
255
|
+
"lex-sidebar__group-action shrink-0",
|
|
256
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
257
|
+
].join(" ")
|
|
29
258
|
}
|
|
30
259
|
|
|
31
|
-
export const
|
|
32
|
-
|
|
260
|
+
export const sidebarItemBadgeClasses = (): string => {
|
|
261
|
+
return [
|
|
262
|
+
"lex-sidebar__item-badge inline-flex shrink-0 items-center self-center",
|
|
263
|
+
"max-w-(--lex-sidebar-item-badge-max-width) truncate",
|
|
264
|
+
"md:group-data-[collapsed=true]/sidebar:absolute md:group-data-[collapsed=true]/sidebar:top-1",
|
|
265
|
+
"md:group-data-[collapsed=true]/sidebar:end-1 md:group-data-[collapsed=true]/sidebar:max-w-none",
|
|
266
|
+
].join(" ")
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export const sidebarItemBadgeCollapsedClasses = (): string => {
|
|
270
|
+
return [
|
|
271
|
+
"md:group-data-[collapsed=true]/sidebar:h-2 md:group-data-[collapsed=true]/sidebar:min-h-2",
|
|
272
|
+
"md:group-data-[collapsed=true]/sidebar:w-2 md:group-data-[collapsed=true]/sidebar:min-w-2",
|
|
273
|
+
"md:group-data-[collapsed=true]/sidebar:px-0",
|
|
274
|
+
"md:group-data-[collapsed=true]/sidebar:text-[0px] md:group-data-[collapsed=true]/sidebar:leading-(--lex-badge-font-line-height)",
|
|
275
|
+
].join(" ")
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export const sidebarItemBadgeLabelClasses = (): string => {
|
|
279
|
+
return "md:group-data-[collapsed=true]/sidebar:sr-only"
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const sidebarItemBadgeDotVariantClasses: Record<BadgeVariant, string> = {
|
|
283
|
+
neutral: "bg-(--lex-badge-neutral-foreground)",
|
|
284
|
+
primary: "bg-(--lex-badge-primary-background)",
|
|
285
|
+
success: "bg-(--lex-color-feedback-success-foreground)",
|
|
286
|
+
warning: "bg-(--lex-color-feedback-warning-foreground)",
|
|
287
|
+
danger: "bg-(--lex-badge-danger-background)",
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export const sidebarItemBadgeDotClasses = (
|
|
291
|
+
variant: BadgeVariant = "neutral",
|
|
292
|
+
): string => {
|
|
293
|
+
return [
|
|
294
|
+
"size-2 rounded-full border-0 p-0",
|
|
295
|
+
sidebarItemBadgeDotVariantClasses[variant],
|
|
296
|
+
].join(" ")
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export const sidebarSubListClasses = (): string => {
|
|
300
|
+
return [
|
|
301
|
+
"lex-sidebar__sub-list m-0 flex list-none flex-col gap-(--lex-sidebar-list-gap) p-0",
|
|
302
|
+
"ms-[calc(var(--lex-sidebar-item-padding-x)+(var(--lex-sidebar-item-icon-size)/2))]",
|
|
303
|
+
"border-s border-[var(--lex-border-default)] ps-(--lex-sidebar-item-sub-indent)",
|
|
304
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
305
|
+
].join(" ")
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export const sidebarSubNavItemClasses = (
|
|
309
|
+
active?: boolean,
|
|
310
|
+
disabled?: boolean,
|
|
311
|
+
): string => {
|
|
312
|
+
const base = sidebarNavItemClasses(active, disabled)
|
|
313
|
+
|
|
314
|
+
return [
|
|
315
|
+
base,
|
|
316
|
+
"ps-[calc(var(--lex-sidebar-item-padding-x)+var(--lex-sidebar-item-sub-indent))]",
|
|
317
|
+
].join(" ")
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const sidebarNavItemActiveAccentClasses = (): string => {
|
|
321
|
+
return [
|
|
322
|
+
"before:absolute before:inset-y-1 before:w-(--lex-sidebar-item-accent-width)",
|
|
323
|
+
"before:rounded-full before:bg-(--lex-sidebar-item-accent-color) before:content-['']",
|
|
324
|
+
"before:start-0 group-data-[side=right]/sidebar:before:start-auto",
|
|
325
|
+
"group-data-[side=right]/sidebar:before:end-0",
|
|
326
|
+
].join(" ")
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const sidebarNavItemShellBaseClasses = (): string => {
|
|
330
|
+
return [
|
|
33
331
|
"lex-sidebar__item",
|
|
34
|
-
"flex w-full items-center
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"focus-visible:ring-
|
|
332
|
+
"relative flex min-h-(--lex-sidebar-item-height-min) w-full min-w-0 items-center gap-(--lex-sidebar-item-gap)",
|
|
333
|
+
"rounded-(--lex-sidebar-item-radius)",
|
|
334
|
+
"px-(--lex-sidebar-item-padding-x) py-(--lex-sidebar-item-padding-y)",
|
|
335
|
+
"text-(length:--lex-sidebar-item-font-size) font-(--lex-sidebar-item-font-weight)",
|
|
336
|
+
"leading-(--lex-sidebar-item-font-line-height)",
|
|
337
|
+
"no-underline outline-none transition-colors duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
338
|
+
"focus-visible:ring-(length:--lex-sidebar-item-focus-ring-width) focus-visible:ring-inset focus-visible:ring-(--lex-sidebar-item-focus-ring-color)",
|
|
41
339
|
].join(" ")
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export const sidebarNavItemClasses = (
|
|
343
|
+
active?: boolean,
|
|
344
|
+
disabled?: boolean,
|
|
345
|
+
): string => {
|
|
346
|
+
const base = sidebarNavItemShellBaseClasses()
|
|
347
|
+
|
|
348
|
+
if (disabled) {
|
|
349
|
+
return [
|
|
350
|
+
base,
|
|
351
|
+
disabledStateClasses,
|
|
352
|
+
"cursor-not-allowed text-(--lex-color-text-disabled)",
|
|
353
|
+
"hover:bg-transparent hover:text-(--lex-color-text-disabled)",
|
|
354
|
+
"data-[disabled]:text-(--lex-color-text-disabled)",
|
|
355
|
+
].join(" ")
|
|
356
|
+
}
|
|
42
357
|
|
|
43
358
|
if (active) {
|
|
44
359
|
return [
|
|
45
360
|
base,
|
|
46
361
|
"lex-sidebar__item--active",
|
|
47
|
-
"bg-(--lex-
|
|
48
|
-
"
|
|
362
|
+
"bg-(--lex-sidebar-item-background-active) text-(--lex-sidebar-item-foreground-active)",
|
|
363
|
+
"font-(--lex-sidebar-item-font-weight-active)",
|
|
364
|
+
sidebarNavItemActiveAccentClasses(),
|
|
365
|
+
"hover:bg-(--lex-sidebar-item-background-active) hover:text-(--lex-sidebar-item-foreground-active)",
|
|
49
366
|
].join(" ")
|
|
50
367
|
}
|
|
51
368
|
|
|
52
369
|
return [
|
|
53
370
|
base,
|
|
54
|
-
"
|
|
371
|
+
"text-(--lex-sidebar-item-foreground)",
|
|
372
|
+
"hover:bg-(--lex-sidebar-item-background-hover) hover:text-(--lex-color-text-primary)",
|
|
373
|
+
].join(" ")
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
export const sidebarNavItemDisclosureLeadClasses = (
|
|
377
|
+
active?: boolean,
|
|
378
|
+
disabled?: boolean,
|
|
379
|
+
): string => {
|
|
380
|
+
const base = sidebarNavItemShellBaseClasses()
|
|
381
|
+
|
|
382
|
+
if (disabled) {
|
|
383
|
+
return [
|
|
384
|
+
base,
|
|
385
|
+
disabledStateClasses,
|
|
386
|
+
"min-w-0 flex-1 rounded-e-none bg-transparent",
|
|
387
|
+
"cursor-not-allowed text-(--lex-color-text-disabled)",
|
|
388
|
+
"hover:bg-transparent hover:text-(--lex-color-text-disabled)",
|
|
389
|
+
"data-[disabled]:text-(--lex-color-text-disabled)",
|
|
390
|
+
].join(" ")
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if (active) {
|
|
394
|
+
return [
|
|
395
|
+
base,
|
|
396
|
+
"lex-sidebar__item--active",
|
|
397
|
+
"min-w-0 flex-1 rounded-e-none bg-transparent",
|
|
398
|
+
"text-(--lex-sidebar-item-foreground-active)",
|
|
399
|
+
"font-(--lex-sidebar-item-font-weight-active)",
|
|
400
|
+
sidebarNavItemActiveAccentClasses(),
|
|
401
|
+
"hover:bg-transparent hover:text-(--lex-sidebar-item-foreground-active)",
|
|
402
|
+
].join(" ")
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return [
|
|
406
|
+
base,
|
|
407
|
+
"min-w-0 flex-1 rounded-e-none bg-transparent",
|
|
408
|
+
"text-(--lex-sidebar-item-foreground)",
|
|
409
|
+
"hover:bg-transparent hover:text-(--lex-sidebar-item-foreground)",
|
|
410
|
+
].join(" ")
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export const sidebarItemSkeletonClasses = (indent = false): string => {
|
|
414
|
+
const classes = [
|
|
415
|
+
"lex-sidebar__item-skeleton flex min-h-(--lex-sidebar-item-height-min) w-full min-w-0 flex-1 items-center gap-(--lex-sidebar-item-gap)",
|
|
416
|
+
"rounded-(--lex-sidebar-item-radius)",
|
|
417
|
+
"px-(--lex-sidebar-item-padding-x) py-(--lex-sidebar-item-padding-y)",
|
|
418
|
+
sidebarCollapsedItemClasses(),
|
|
419
|
+
]
|
|
420
|
+
|
|
421
|
+
if (indent) {
|
|
422
|
+
classes.push(
|
|
423
|
+
"ps-[calc(var(--lex-sidebar-item-padding-x)+var(--lex-sidebar-item-sub-indent))]",
|
|
424
|
+
)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return classes.join(" ")
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export const sidebarItemSkeletonIconClasses = (): string => {
|
|
431
|
+
return [
|
|
432
|
+
"lex-sidebar__item-skeleton-icon size-(--lex-sidebar-item-icon-size) shrink-0",
|
|
433
|
+
"rounded-(--lex-sidebar-item-radius) animate-pulse bg-(--lex-color-background-subtle)",
|
|
434
|
+
].join(" ")
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export const sidebarItemSkeletonLabelClasses = (): string => {
|
|
438
|
+
return [
|
|
439
|
+
"lex-sidebar__item-skeleton-label h-[1em] min-w-0 flex-1",
|
|
440
|
+
"rounded-(--lex-sidebar-item-radius) animate-pulse bg-(--lex-color-background-subtle)",
|
|
441
|
+
"md:group-data-[collapsed=true]/sidebar:hidden",
|
|
55
442
|
].join(" ")
|
|
56
443
|
}
|
|
57
444
|
|
|
@@ -60,21 +447,54 @@ export const sidebarMainClasses = (): string => {
|
|
|
60
447
|
}
|
|
61
448
|
|
|
62
449
|
export const sidebarDrawerFooterClasses = (): string => {
|
|
63
|
-
return
|
|
450
|
+
return [
|
|
451
|
+
"lex-sidebar__drawer-footer border-t border-(--lex-sidebar-drawer-footer-border-color)",
|
|
452
|
+
"p-(--lex-sidebar-drawer-footer-padding)",
|
|
453
|
+
].join(" ")
|
|
64
454
|
}
|
|
65
455
|
|
|
66
456
|
export const sidebarFooterClasses = (): string => {
|
|
67
|
-
return
|
|
457
|
+
return [
|
|
458
|
+
"lex-sidebar__footer border-t border-(--lex-sidebar-footer-border-color)",
|
|
459
|
+
"p-(--lex-sidebar-footer-padding)",
|
|
460
|
+
].join(" ")
|
|
68
461
|
}
|
|
69
462
|
|
|
70
463
|
export const sidebarGroupClasses = (): string => {
|
|
71
|
-
return "lex-sidebar__group flex flex-col gap-
|
|
464
|
+
return "lex-sidebar__group flex flex-col gap-(--lex-sidebar-group-gap)"
|
|
72
465
|
}
|
|
73
466
|
|
|
74
467
|
export const sidebarGroupLabelClasses = (): string => {
|
|
75
|
-
return
|
|
468
|
+
return [
|
|
469
|
+
"lex-sidebar__group-label flex items-center justify-between gap-(--lex-sidebar-group-label-gap)",
|
|
470
|
+
"px-(--lex-sidebar-group-label-padding-x) py-(--lex-sidebar-group-label-padding-y)",
|
|
471
|
+
"text-(length:--lex-menu-group-label-font-size) font-(--lex-menu-group-label-font-weight)",
|
|
472
|
+
"leading-(--lex-menu-group-label-font-line-height) text-(--lex-menu-group-label-foreground)",
|
|
473
|
+
].join(" ")
|
|
76
474
|
}
|
|
77
475
|
|
|
78
476
|
export const sidebarGroupContentClasses = (): string => {
|
|
79
|
-
return "lex-sidebar__group-content flex flex-col gap-
|
|
477
|
+
return "lex-sidebar__group-content flex flex-col gap-(--lex-sidebar-group-gap)"
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export const sidebarGroupCollapsibleClasses = (): string => {
|
|
481
|
+
return "group/sidebar-group-collapsible lex-sidebar__group-collapsible"
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export const sidebarGroupCollapsibleTriggerClasses = (): string => {
|
|
485
|
+
return [
|
|
486
|
+
"lex-sidebar__group-collapsible-trigger",
|
|
487
|
+
"flex min-w-0 flex-1 items-center gap-(--lex-sidebar-group-collapsible-trigger-gap) text-left outline-none",
|
|
488
|
+
"text-(length:--lex-menu-group-label-font-size) font-(--lex-menu-group-label-font-weight)",
|
|
489
|
+
"leading-(--lex-menu-group-label-font-line-height) text-(--lex-menu-group-label-foreground)",
|
|
490
|
+
"transition-colors duration-(--lex-sidebar-transition-duration) ease-(--lex-sidebar-transition-easing)",
|
|
491
|
+
"hover:text-(--lex-menu-group-label-foreground)",
|
|
492
|
+
"focus-visible:ring-(length:--lex-focus-ring-width) focus-visible:ring-inset focus-visible:ring-(--lex-focus-ring-color)",
|
|
493
|
+
"[&>svg]:ms-auto [&>svg]:size-(--lex-sidebar-item-icon-size) [&>svg]:shrink-0 [&>svg]:transition-transform",
|
|
494
|
+
"group-data-[panel-open]/sidebar-group-collapsible:[&>svg]:rotate-180",
|
|
495
|
+
].join(" ")
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
export const sidebarGroupCollapsiblePanelClasses = (): string => {
|
|
499
|
+
return "lex-sidebar__group-collapsible-panel p-0"
|
|
80
500
|
}
|
|
@@ -12,7 +12,7 @@ import type {
|
|
|
12
12
|
CardHeaderProps,
|
|
13
13
|
CardProps,
|
|
14
14
|
CardTitleProps,
|
|
15
|
-
} from "@/components/primitives/Card"
|
|
15
|
+
} from "@/components/primitives/Card/Card.types"
|
|
16
16
|
|
|
17
17
|
export interface StatsCardProps extends Omit<CardProps, "children"> {
|
|
18
18
|
ref?: Ref<HTMLDivElement>
|
|
@@ -11,10 +11,10 @@ export const statsCardClasses = (): string => {
|
|
|
11
11
|
export const statsCardValueClasses = (): string => {
|
|
12
12
|
return [
|
|
13
13
|
"lex-stats-card__value",
|
|
14
|
-
"text-(length:--lex-
|
|
15
|
-
"font-(--lex-
|
|
16
|
-
"leading-(--lex-
|
|
17
|
-
"text-(--lex-
|
|
14
|
+
"text-(length:--lex-stats-card-value-font-size)",
|
|
15
|
+
"font-(--lex-stats-card-value-font-weight)",
|
|
16
|
+
"leading-(--lex-stats-card-value-font-line-height)",
|
|
17
|
+
"text-(--lex-stats-card-value-foreground)",
|
|
18
18
|
"m-0",
|
|
19
19
|
].join(" ")
|
|
20
20
|
}
|
|
@@ -22,7 +22,8 @@ export const statsCardValueClasses = (): string => {
|
|
|
22
22
|
export const statsCardTrendClasses = (): string => {
|
|
23
23
|
return [
|
|
24
24
|
"lex-stats-card__trend",
|
|
25
|
-
"text-(length:--lex-
|
|
26
|
-
"
|
|
25
|
+
"text-(length:--lex-stats-card-trend-font-size)",
|
|
26
|
+
"leading-(--lex-stats-card-trend-font-line-height)",
|
|
27
|
+
"text-(--lex-stats-card-trend-foreground)",
|
|
27
28
|
].join(" ")
|
|
28
29
|
}
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
datePickerDayVariants,
|
|
29
29
|
datePickerGridVariants,
|
|
30
30
|
datePickerHeaderVariants,
|
|
31
|
+
datePickerInputEmbeddedClasses,
|
|
31
32
|
datePickerMonthLabelVariants,
|
|
32
33
|
datePickerNavButtonVariants,
|
|
33
34
|
datePickerWeekdayVariants,
|
|
@@ -102,9 +103,18 @@ DatePickerTrigger.displayName = "DatePickerTrigger"
|
|
|
102
103
|
const DatePickerInput = ({
|
|
103
104
|
ref,
|
|
104
105
|
className,
|
|
106
|
+
embedded = false,
|
|
107
|
+
size,
|
|
105
108
|
...props
|
|
106
109
|
}: DatePickerInputProps) => {
|
|
107
|
-
return
|
|
110
|
+
return (
|
|
111
|
+
<Input
|
|
112
|
+
ref={ref}
|
|
113
|
+
size={size ?? (embedded ? "sm" : undefined)}
|
|
114
|
+
className={cn(embedded && datePickerInputEmbeddedClasses(), className)}
|
|
115
|
+
{...props}
|
|
116
|
+
/>
|
|
117
|
+
)
|
|
108
118
|
}
|
|
109
119
|
|
|
110
120
|
DatePickerInput.displayName = "DatePickerInput"
|
|
@@ -16,7 +16,10 @@ export type DatePickerProps<Payload = unknown> = PopoverProps<Payload>
|
|
|
16
16
|
export type DatePickerTriggerProps<Payload = unknown> =
|
|
17
17
|
PopoverTriggerProps<Payload>
|
|
18
18
|
|
|
19
|
-
export
|
|
19
|
+
export interface DatePickerInputProps extends InputProps {
|
|
20
|
+
/** Flat chrome for toolbar/filter row slots — no outer border. */
|
|
21
|
+
embedded?: boolean
|
|
22
|
+
}
|
|
20
23
|
|
|
21
24
|
export interface DatePickerContentProps extends Omit<
|
|
22
25
|
HTMLAttributes<HTMLDivElement>,
|
|
@@ -9,6 +9,15 @@ import { disabledStateClasses } from "@/lib/utils"
|
|
|
9
9
|
|
|
10
10
|
export const datePickerContentVariants = cva("p-0")
|
|
11
11
|
|
|
12
|
+
export const datePickerInputEmbeddedClasses = (): string => {
|
|
13
|
+
return [
|
|
14
|
+
"h-(--lex-date-picker-trigger-input-embedded-height)",
|
|
15
|
+
"border-0 bg-(--lex-date-picker-trigger-input-embedded-background) shadow-none",
|
|
16
|
+
"px-(--lex-date-picker-trigger-input-embedded-padding-x)",
|
|
17
|
+
"focus-visible:border-0 focus-visible:ring-0",
|
|
18
|
+
].join(" ")
|
|
19
|
+
}
|
|
20
|
+
|
|
12
21
|
export const datePickerCalendarVariants = cva(
|
|
13
22
|
"flex w-(--lex-date-picker-calendar-width) flex-col gap-(--lex-date-picker-calendar-gap) rounded-(--lex-date-picker-calendar-radius) border border-(--lex-date-picker-calendar-border-color) bg-(--lex-date-picker-calendar-background) p-(--lex-date-picker-calendar-padding) text-(--lex-date-picker-calendar-foreground)",
|
|
14
23
|
)
|
|
@@ -32,7 +41,7 @@ export const datePickerNavButtonVariants = cva(
|
|
|
32
41
|
)
|
|
33
42
|
|
|
34
43
|
export const datePickerWeekdaysVariants = cva(
|
|
35
|
-
"grid grid-cols-7 gap-(--lex-
|
|
44
|
+
"grid grid-cols-7 gap-(--lex-date-picker-calendar-grid-gap)",
|
|
36
45
|
)
|
|
37
46
|
|
|
38
47
|
export const datePickerWeekdayVariants = cva(
|
|
@@ -40,7 +49,7 @@ export const datePickerWeekdayVariants = cva(
|
|
|
40
49
|
)
|
|
41
50
|
|
|
42
51
|
export const datePickerGridVariants = cva(
|
|
43
|
-
"grid grid-cols-7 gap-(--lex-
|
|
52
|
+
"grid grid-cols-7 gap-(--lex-date-picker-calendar-grid-gap)",
|
|
44
53
|
)
|
|
45
54
|
|
|
46
55
|
export const datePickerDayVariants = cva(
|
|
@@ -73,8 +73,10 @@ export const toolbarSeparatorVariants = cva(
|
|
|
73
73
|
{
|
|
74
74
|
variants: {
|
|
75
75
|
orientation: {
|
|
76
|
-
horizontal:
|
|
77
|
-
|
|
76
|
+
horizontal:
|
|
77
|
+
"mx-(--lex-toolbar-separator-margin) h-(--lex-separator-thickness) w-full",
|
|
78
|
+
vertical:
|
|
79
|
+
"my-(--lex-toolbar-separator-margin) h-full w-(--lex-separator-thickness)",
|
|
78
80
|
},
|
|
79
81
|
},
|
|
80
82
|
defaultVariants: {
|