@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.
Files changed (39) hide show
  1. package/dist/index.js +12 -3
  2. package/package.json +2 -2
  3. package/templates/blocks/AuthForm/AuthForm.tsx +9 -5
  4. package/templates/blocks/AuthForm/AuthForm.types.ts +3 -3
  5. package/templates/blocks/AuthForm/AuthForm.variants.ts +8 -2
  6. package/templates/blocks/CommandPalette/CommandPalette.tsx +15 -12
  7. package/templates/blocks/CommandPalette/CommandPalette.types.ts +2 -2
  8. package/templates/blocks/CommandPalette/CommandPalette.variants.ts +6 -6
  9. package/templates/blocks/DataTable/DataTable.tsx +2 -2
  10. package/templates/blocks/DataTable/DataTable.types.ts +2 -2
  11. package/templates/blocks/DataTable/DataTable.variants.ts +5 -4
  12. package/templates/blocks/FilterToolbar/FilterToolbar.tsx +12 -5
  13. package/templates/blocks/FilterToolbar/FilterToolbar.types.ts +4 -4
  14. package/templates/blocks/FilterToolbar/FilterToolbar.variants.ts +11 -5
  15. package/templates/blocks/FormField/FormField.tsx +1 -1
  16. package/templates/blocks/FormField/FormField.types.ts +1 -1
  17. package/templates/blocks/FormField/FormField.variants.ts +1 -1
  18. package/templates/blocks/PageHeader/PageHeader.tsx +2 -2
  19. package/templates/blocks/PageHeader/PageHeader.types.ts +2 -2
  20. package/templates/blocks/PageHeader/PageHeader.variants.ts +6 -5
  21. package/templates/blocks/SettingsPanel/SettingsPanel.tsx +1 -1
  22. package/templates/blocks/SettingsPanel/SettingsPanel.types.ts +1 -1
  23. package/templates/blocks/Sidebar/Sidebar.tsx +1048 -22
  24. package/templates/blocks/Sidebar/Sidebar.types.ts +185 -1
  25. package/templates/blocks/Sidebar/Sidebar.utils.ts +34 -0
  26. package/templates/blocks/Sidebar/Sidebar.variants.ts +445 -25
  27. package/templates/blocks/StatsCard/StatsCard.tsx +1 -1
  28. package/templates/blocks/StatsCard/StatsCard.types.ts +1 -1
  29. package/templates/blocks/StatsCard/StatsCard.variants.ts +7 -6
  30. package/templates/primitives/DatePicker/DatePicker.tsx +11 -1
  31. package/templates/primitives/DatePicker/DatePicker.types.ts +4 -1
  32. package/templates/primitives/DatePicker/DatePicker.variants.ts +11 -2
  33. package/templates/primitives/Toolbar/Toolbar.variants.ts +4 -2
  34. package/templates/styles/theme.css +14 -1
  35. package/templates/styles/tokens.css +147 -29
  36. package/templates/templates/DashboardShell/DashboardShell.variants.ts +19 -4
  37. package/templates/templates/SettingsPageLayout/SettingsPageLayout.tsx +2 -2
  38. package/templates/templates/SettingsPageLayout/SettingsPageLayout.types.ts +2 -2
  39. 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
- export const sidebarRootClasses = (): string => {
8
- return "lex-sidebar w-full shrink-0 md:h-full md:w-auto"
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 sidebarDesktopClasses = (): string => {
12
- return "lex-sidebar__desktop hidden h-full w-[var(--lex-size-sidebar-width,16rem)] shrink-0 border-r border-[var(--lex-border-default)] bg-[var(--lex-color-background-subtle)] md:flex md:flex-col"
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 "lex-sidebar__brand border-b border-[var(--lex-border-default)] px-[var(--lex-space-4)] py-[var(--lex-space-3)]"
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-[var(--lex-space-2)]"
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-[var(--lex-space-1)] p-0"
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 sidebarNavItemClasses = (active?: boolean): string => {
32
- const base = [
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 rounded-(--lex-menu-item-radius)",
35
- "px-(--lex-menu-item-padding-x) py-(--lex-menu-item-padding-y)",
36
- "text-(length:--lex-menu-item-font-size) font-(--lex-menu-item-font-weight)",
37
- "leading-(--lex-menu-item-font-line-height) text-(--lex-menu-item-foreground)",
38
- "no-underline outline-none transition-colors",
39
- "focus-visible:ring-(length:--lex-menu-item-focus-ring-width) focus-visible:ring-(--lex-menu-item-focus-ring-color)",
40
- "focus-visible:ring-offset-(length:--lex-menu-item-focus-ring-offset) focus-visible:ring-offset-(--lex-menu-item-focus-ring-offset-color)",
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-menu-item-checked-background) text-(--lex-menu-item-checked-foreground)",
48
- "hover:bg-(--lex-action-primary-hover) hover:text-(--lex-menu-item-checked-foreground)",
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
- "hover:bg-(--lex-action-secondary-hover) hover:text-(--lex-color-text-primary)",
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 "lex-sidebar__drawer-footer border-t border-[var(--lex-border-default)] p-[var(--lex-space-2)]"
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 "lex-sidebar__footer border-t border-[var(--lex-border-default)] p-[var(--lex-space-2)]"
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-[var(--lex-space-1)]"
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 "lex-sidebar__group-label px-[var(--lex-space-3)] py-[var(--lex-space-1)] text-(length:--lex-menu-group-label-font-size) font-(--lex-menu-group-label-font-weight) leading-(--lex-menu-group-label-font-line-height) text-(--lex-menu-group-label-foreground)"
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-[var(--lex-space-1)]"
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
  }
@@ -11,7 +11,7 @@ import {
11
11
  CardFooter,
12
12
  CardHeader,
13
13
  CardTitle,
14
- } from "@/components/primitives/Card"
14
+ } from "@/components/primitives/Card/Card"
15
15
  import type {
16
16
  StatsCardContentProps,
17
17
  StatsCardDescriptionProps,
@@ -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-typography-heading-md-font-size)",
15
- "font-(--lex-typography-heading-md-font-weight)",
16
- "leading-(--lex-typography-heading-md-font-line-height)",
17
- "text-(--lex-color-text-primary)",
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-typography-body-xs-font-size)",
26
- "text-(--lex-color-text-secondary)",
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 <Input ref={ref} className={className} {...props} />
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 type DatePickerInputProps = InputProps
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-space-1)",
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-space-1)",
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: "mx-(--lex-space-1) h-(--lex-separator-thickness) w-full",
77
- vertical: "my-(--lex-space-1) h-full w-(--lex-separator-thickness)",
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: {