@dalexto/lexsys-registry 0.0.2

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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/index.d.ts +25 -0
  4. package/dist/index.js +2164 -0
  5. package/dist/install-layer.d.ts +4 -0
  6. package/dist/items/accordion.d.ts +7 -0
  7. package/dist/items/alert-dialog.d.ts +7 -0
  8. package/dist/items/alert.d.ts +7 -0
  9. package/dist/items/auth-form.d.ts +7 -0
  10. package/dist/items/autocomplete.d.ts +7 -0
  11. package/dist/items/avatar.d.ts +7 -0
  12. package/dist/items/badge.d.ts +7 -0
  13. package/dist/items/button.d.ts +7 -0
  14. package/dist/items/card.d.ts +7 -0
  15. package/dist/items/checkbox-group.d.ts +7 -0
  16. package/dist/items/checkbox.d.ts +7 -0
  17. package/dist/items/collapsible.d.ts +7 -0
  18. package/dist/items/combobox.d.ts +7 -0
  19. package/dist/items/command-palette.d.ts +7 -0
  20. package/dist/items/context-menu.d.ts +7 -0
  21. package/dist/items/dashboard-shell.d.ts +7 -0
  22. package/dist/items/dialog.d.ts +7 -0
  23. package/dist/items/drawer.d.ts +7 -0
  24. package/dist/items/field.d.ts +7 -0
  25. package/dist/items/fieldset.d.ts +7 -0
  26. package/dist/items/form-field.d.ts +7 -0
  27. package/dist/items/form.d.ts +7 -0
  28. package/dist/items/index.d.ts +49 -0
  29. package/dist/items/input.d.ts +7 -0
  30. package/dist/items/menu.d.ts +7 -0
  31. package/dist/items/menubar.d.ts +7 -0
  32. package/dist/items/meter.d.ts +7 -0
  33. package/dist/items/navigation-menu.d.ts +7 -0
  34. package/dist/items/number-field.d.ts +7 -0
  35. package/dist/items/otp-field.d.ts +7 -0
  36. package/dist/items/popover.d.ts +7 -0
  37. package/dist/items/preview-card.d.ts +7 -0
  38. package/dist/items/progress.d.ts +7 -0
  39. package/dist/items/radio-group.d.ts +7 -0
  40. package/dist/items/scroll-area.d.ts +7 -0
  41. package/dist/items/select.d.ts +7 -0
  42. package/dist/items/separator.d.ts +7 -0
  43. package/dist/items/settings-panel.d.ts +7 -0
  44. package/dist/items/sidebar.d.ts +7 -0
  45. package/dist/items/slider.d.ts +7 -0
  46. package/dist/items/switch.d.ts +7 -0
  47. package/dist/items/tabs.d.ts +7 -0
  48. package/dist/items/textarea.d.ts +7 -0
  49. package/dist/items/toast.d.ts +7 -0
  50. package/dist/items/toggle-group.d.ts +7 -0
  51. package/dist/items/toggle.d.ts +7 -0
  52. package/dist/items/toolbar.d.ts +7 -0
  53. package/dist/items/tooltip.d.ts +7 -0
  54. package/dist/registry.types.d.ts +40 -0
  55. package/dist/styles/theme.d.ts +2 -0
  56. package/dist/utilities/cn.d.ts +2 -0
  57. package/dist/validate-registry-composition.d.ts +2 -0
  58. package/dist/validate-registry-item.d.ts +2 -0
  59. package/dist/validate-registry-template-imports.d.ts +4 -0
  60. package/dist/validate-registry.d.ts +9 -0
  61. package/package.json +52 -0
  62. package/templates/blocks/AuthForm/AuthForm.tsx +109 -0
  63. package/templates/blocks/AuthForm/AuthForm.types.ts +34 -0
  64. package/templates/blocks/AuthForm/AuthForm.variants.ts +11 -0
  65. package/templates/blocks/CommandPalette/CommandPalette.tsx +245 -0
  66. package/templates/blocks/CommandPalette/CommandPalette.types.ts +73 -0
  67. package/templates/blocks/CommandPalette/CommandPalette.variants.ts +26 -0
  68. package/templates/blocks/FormField/FormField.tsx +83 -0
  69. package/templates/blocks/FormField/FormField.types.ts +26 -0
  70. package/templates/blocks/FormField/FormField.variants.ts +9 -0
  71. package/templates/blocks/SettingsPanel/SettingsPanel.tsx +104 -0
  72. package/templates/blocks/SettingsPanel/SettingsPanel.types.ts +31 -0
  73. package/templates/blocks/SettingsPanel/SettingsPanel.variants.ts +9 -0
  74. package/templates/blocks/Sidebar/Sidebar.tsx +414 -0
  75. package/templates/blocks/Sidebar/Sidebar.types.ts +99 -0
  76. package/templates/blocks/Sidebar/Sidebar.variants.ts +84 -0
  77. package/templates/primitives/Accordion/Accordion.tsx +102 -0
  78. package/templates/primitives/Accordion/Accordion.types.ts +20 -0
  79. package/templates/primitives/Accordion/Accordion.variants.ts +32 -0
  80. package/templates/primitives/Alert/Alert.tsx +62 -0
  81. package/templates/primitives/Alert/Alert.types.ts +35 -0
  82. package/templates/primitives/Alert/Alert.variants.ts +41 -0
  83. package/templates/primitives/AlertDialog/AlertDialog.tsx +168 -0
  84. package/templates/primitives/AlertDialog/AlertDialog.types.ts +30 -0
  85. package/templates/primitives/AlertDialog/AlertDialog.variants.ts +57 -0
  86. package/templates/primitives/Autocomplete/Autocomplete.tsx +394 -0
  87. package/templates/primitives/Autocomplete/Autocomplete.types.ts +82 -0
  88. package/templates/primitives/Autocomplete/Autocomplete.variants.ts +154 -0
  89. package/templates/primitives/Avatar/Avatar.tsx +56 -0
  90. package/templates/primitives/Avatar/Avatar.types.ts +31 -0
  91. package/templates/primitives/Avatar/Avatar.variants.ts +40 -0
  92. package/templates/primitives/Badge/Badge.tsx +30 -0
  93. package/templates/primitives/Badge/Badge.types.ts +30 -0
  94. package/templates/primitives/Badge/Badge.variants.ts +81 -0
  95. package/templates/primitives/Button/Button.tsx +53 -0
  96. package/templates/primitives/Button/Button.types.ts +25 -0
  97. package/templates/primitives/Button/Button.variants.ts +69 -0
  98. package/templates/primitives/Card/Card.tsx +85 -0
  99. package/templates/primitives/Card/Card.types.ts +54 -0
  100. package/templates/primitives/Card/Card.variants.ts +46 -0
  101. package/templates/primitives/Checkbox/Checkbox.tsx +72 -0
  102. package/templates/primitives/Checkbox/Checkbox.types.ts +28 -0
  103. package/templates/primitives/Checkbox/Checkbox.variants.ts +39 -0
  104. package/templates/primitives/CheckboxGroup/CheckboxGroup.tsx +32 -0
  105. package/templates/primitives/CheckboxGroup/CheckboxGroup.types.ts +17 -0
  106. package/templates/primitives/CheckboxGroup/CheckboxGroup.variants.ts +25 -0
  107. package/templates/primitives/Collapsible/Collapsible.tsx +74 -0
  108. package/templates/primitives/Collapsible/Collapsible.types.ts +28 -0
  109. package/templates/primitives/Collapsible/Collapsible.variants.ts +44 -0
  110. package/templates/primitives/Combobox/Combobox.tsx +450 -0
  111. package/templates/primitives/Combobox/Combobox.types.ts +99 -0
  112. package/templates/primitives/Combobox/Combobox.variants.ts +180 -0
  113. package/templates/primitives/ContextMenu/ContextMenu.tsx +375 -0
  114. package/templates/primitives/ContextMenu/ContextMenu.types.ts +57 -0
  115. package/templates/primitives/ContextMenu/ContextMenu.variants.ts +39 -0
  116. package/templates/primitives/Dialog/Dialog.tsx +148 -0
  117. package/templates/primitives/Dialog/Dialog.types.ts +29 -0
  118. package/templates/primitives/Dialog/Dialog.variants.ts +56 -0
  119. package/templates/primitives/Drawer/Drawer.tsx +266 -0
  120. package/templates/primitives/Drawer/Drawer.types.ts +77 -0
  121. package/templates/primitives/Drawer/Drawer.variants.ts +175 -0
  122. package/templates/primitives/Field/Field.tsx +132 -0
  123. package/templates/primitives/Field/Field.types.ts +43 -0
  124. package/templates/primitives/Field/Field.variants.ts +77 -0
  125. package/templates/primitives/Fieldset/Fieldset.tsx +36 -0
  126. package/templates/primitives/Fieldset/Fieldset.types.ts +26 -0
  127. package/templates/primitives/Fieldset/Fieldset.variants.ts +37 -0
  128. package/templates/primitives/Form/Form.tsx +24 -0
  129. package/templates/primitives/Form/Form.types.ts +13 -0
  130. package/templates/primitives/Form/Form.variants.ts +11 -0
  131. package/templates/primitives/Input/Input.tsx +36 -0
  132. package/templates/primitives/Input/Input.types.ts +27 -0
  133. package/templates/primitives/Input/Input.variants.ts +41 -0
  134. package/templates/primitives/Menu/Menu.tsx +352 -0
  135. package/templates/primitives/Menu/Menu.types.ts +56 -0
  136. package/templates/primitives/Menu/Menu.variants.ts +73 -0
  137. package/templates/primitives/Menubar/Menubar.tsx +25 -0
  138. package/templates/primitives/Menubar/Menubar.types.ts +12 -0
  139. package/templates/primitives/Menubar/Menubar.variants.ts +22 -0
  140. package/templates/primitives/Meter/Meter.tsx +123 -0
  141. package/templates/primitives/Meter/Meter.types.ts +45 -0
  142. package/templates/primitives/Meter/Meter.variants.ts +47 -0
  143. package/templates/primitives/NavigationMenu/NavigationMenu.tsx +256 -0
  144. package/templates/primitives/NavigationMenu/NavigationMenu.types.ts +58 -0
  145. package/templates/primitives/NavigationMenu/NavigationMenu.variants.ts +40 -0
  146. package/templates/primitives/NumberField/NumberField.tsx +168 -0
  147. package/templates/primitives/NumberField/NumberField.types.ts +51 -0
  148. package/templates/primitives/NumberField/NumberField.variants.ts +92 -0
  149. package/templates/primitives/OtpField/OtpField.tsx +65 -0
  150. package/templates/primitives/OtpField/OtpField.types.ts +29 -0
  151. package/templates/primitives/OtpField/OtpField.variants.ts +45 -0
  152. package/templates/primitives/Popover/Popover.tsx +193 -0
  153. package/templates/primitives/Popover/Popover.types.ts +35 -0
  154. package/templates/primitives/Popover/Popover.variants.ts +68 -0
  155. package/templates/primitives/PreviewCard/PreviewCard.tsx +153 -0
  156. package/templates/primitives/PreviewCard/PreviewCard.types.ts +42 -0
  157. package/templates/primitives/PreviewCard/PreviewCard.variants.ts +24 -0
  158. package/templates/primitives/Progress/Progress.tsx +95 -0
  159. package/templates/primitives/Progress/Progress.types.ts +39 -0
  160. package/templates/primitives/Progress/Progress.variants.ts +39 -0
  161. package/templates/primitives/RadioGroup/RadioGroup.tsx +66 -0
  162. package/templates/primitives/RadioGroup/RadioGroup.types.ts +34 -0
  163. package/templates/primitives/RadioGroup/RadioGroup.variants.ts +59 -0
  164. package/templates/primitives/ScrollArea/ScrollArea.tsx +135 -0
  165. package/templates/primitives/ScrollArea/ScrollArea.types.ts +34 -0
  166. package/templates/primitives/ScrollArea/ScrollArea.variants.ts +38 -0
  167. package/templates/primitives/Select/Select.tsx +319 -0
  168. package/templates/primitives/Select/Select.types.ts +74 -0
  169. package/templates/primitives/Select/Select.variants.ts +94 -0
  170. package/templates/primitives/Separator/Separator.tsx +30 -0
  171. package/templates/primitives/Separator/Separator.types.ts +13 -0
  172. package/templates/primitives/Separator/Separator.variants.ts +19 -0
  173. package/templates/primitives/Slider/Slider.tsx +124 -0
  174. package/templates/primitives/Slider/Slider.types.ts +51 -0
  175. package/templates/primitives/Slider/Slider.variants.ts +38 -0
  176. package/templates/primitives/Switch/Switch.tsx +61 -0
  177. package/templates/primitives/Switch/Switch.types.ts +29 -0
  178. package/templates/primitives/Switch/Switch.variants.ts +48 -0
  179. package/templates/primitives/Tabs/Tabs.tsx +70 -0
  180. package/templates/primitives/Tabs/Tabs.types.ts +23 -0
  181. package/templates/primitives/Tabs/Tabs.variants.ts +29 -0
  182. package/templates/primitives/Textarea/Textarea.tsx +42 -0
  183. package/templates/primitives/Textarea/Textarea.types.ts +31 -0
  184. package/templates/primitives/Textarea/Textarea.variants.ts +46 -0
  185. package/templates/primitives/Toast/Toast.tsx +195 -0
  186. package/templates/primitives/Toast/Toast.types.ts +52 -0
  187. package/templates/primitives/Toast/Toast.variants.ts +88 -0
  188. package/templates/primitives/Toggle/Toggle.tsx +24 -0
  189. package/templates/primitives/Toggle/Toggle.types.ts +19 -0
  190. package/templates/primitives/Toggle/Toggle.variants.ts +32 -0
  191. package/templates/primitives/ToggleGroup/ToggleGroup.tsx +34 -0
  192. package/templates/primitives/ToggleGroup/ToggleGroup.types.ts +19 -0
  193. package/templates/primitives/ToggleGroup/ToggleGroup.variants.ts +32 -0
  194. package/templates/primitives/Toolbar/Toolbar.tsx +118 -0
  195. package/templates/primitives/Toolbar/Toolbar.types.ts +32 -0
  196. package/templates/primitives/Toolbar/Toolbar.variants.ts +84 -0
  197. package/templates/primitives/Tooltip/Tooltip.tsx +98 -0
  198. package/templates/primitives/Tooltip/Tooltip.types.ts +22 -0
  199. package/templates/primitives/Tooltip/Tooltip.variants.ts +24 -0
  200. package/templates/shared/utils/cn.ts +46 -0
  201. package/templates/styles/theme.css +311 -0
  202. package/templates/styles/tokens.css +1445 -0
  203. package/templates/templates/DashboardShell/DashboardShell.tsx +124 -0
  204. package/templates/templates/DashboardShell/DashboardShell.types.ts +37 -0
  205. package/templates/templates/DashboardShell/DashboardShell.variants.ts +25 -0
  206. package/templates/tsconfig.json +5 -0
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Sidebar.variants.ts
3
+ *
4
+ * Variant classes for the Sidebar block.
5
+ */
6
+
7
+ export const sidebarRootVariants = (): string => {
8
+ return "lsys-sidebar w-full shrink-0 md:h-full md:w-auto"
9
+ }
10
+
11
+ export const sidebarDesktopVariants = (): string => {
12
+ return "lsys-sidebar__desktop hidden h-full w-[var(--lsys-size-sidebar-width,16rem)] shrink-0 border-r border-[var(--lsys-border-default)] bg-[var(--lsys-color-background-subtle)] md:flex md:flex-col"
13
+ }
14
+
15
+ export const sidebarMobileTriggerVariants = (): string => {
16
+ return "lsys-sidebar__mobile-trigger sticky top-0 z-(--lsys-z-index-local) border-b border-[var(--lsys-border-default)] bg-[var(--lsys-color-background-base)] p-[var(--lsys-space-2)] md:hidden"
17
+ }
18
+
19
+ export const sidebarMobileHeaderVariants = (): string => {
20
+ return "lsys-sidebar__mobile-header min-w-0 flex-1"
21
+ }
22
+
23
+ export const sidebarBrandVariants = (): string => {
24
+ return "lsys-sidebar__brand border-b border-[var(--lsys-border-default)] px-[var(--lsys-space-4)] py-[var(--lsys-space-3)]"
25
+ }
26
+
27
+ export const sidebarNavVariants = (): string => {
28
+ return "lsys-sidebar__nav min-h-0 flex-1 p-[var(--lsys-space-2)]"
29
+ }
30
+
31
+ export const sidebarNavListVariants = (): string => {
32
+ return "lsys-sidebar__list m-0 flex list-none flex-col gap-[var(--lsys-space-1)] p-0"
33
+ }
34
+
35
+ export const sidebarNavItemVariants = (active?: boolean): string => {
36
+ const base = [
37
+ "lsys-sidebar__item",
38
+ "flex w-full items-center rounded-(--lsys-menu-item-radius)",
39
+ "px-(--lsys-menu-item-padding-x) py-(--lsys-menu-item-padding-y)",
40
+ "text-(length:--lsys-menu-item-font-size) font-(--lsys-menu-item-font-weight)",
41
+ "leading-(--lsys-menu-item-font-line-height) text-(--lsys-menu-item-foreground)",
42
+ "no-underline outline-none transition-colors",
43
+ "focus-visible:ring-(length:--lsys-menu-item-focus-ring-width) focus-visible:ring-(--lsys-menu-item-focus-ring-color)",
44
+ "focus-visible:ring-offset-(length:--lsys-menu-item-focus-ring-offset) focus-visible:ring-offset-(--lsys-menu-item-focus-ring-offset-color)",
45
+ ].join(" ")
46
+
47
+ if (active) {
48
+ return [
49
+ base,
50
+ "lsys-sidebar__item--active",
51
+ "bg-(--lsys-menu-item-checked-background) text-(--lsys-menu-item-checked-foreground)",
52
+ "hover:bg-(--lsys-action-primary-hover) hover:text-(--lsys-menu-item-checked-foreground)",
53
+ ].join(" ")
54
+ }
55
+
56
+ return [
57
+ base,
58
+ "hover:bg-(--lsys-action-secondary-hover) hover:text-(--lsys-color-text-primary)",
59
+ ].join(" ")
60
+ }
61
+
62
+ export const sidebarMainVariants = (): string => {
63
+ return "lsys-sidebar__drawer-content flex h-full min-h-0 flex-col"
64
+ }
65
+
66
+ export const sidebarDrawerFooterVariants = (): string => {
67
+ return "lsys-sidebar__drawer-footer border-t border-[var(--lsys-border-default)] p-[var(--lsys-space-2)]"
68
+ }
69
+
70
+ export const sidebarFooterVariants = (): string => {
71
+ return "lsys-sidebar__footer border-t border-[var(--lsys-border-default)] p-[var(--lsys-space-2)]"
72
+ }
73
+
74
+ export const sidebarGroupVariants = (): string => {
75
+ return "lsys-sidebar__group flex flex-col gap-[var(--lsys-space-1)]"
76
+ }
77
+
78
+ export const sidebarGroupLabelVariants = (): string => {
79
+ return "lsys-sidebar__group-label px-[var(--lsys-space-3)] py-[var(--lsys-space-1)] text-(length:--lsys-menu-group-label-font-size) font-(--lsys-menu-group-label-font-weight) leading-(--lsys-menu-group-label-font-line-height) text-(--lsys-menu-group-label-foreground)"
80
+ }
81
+
82
+ export const sidebarGroupContentVariants = (): string => {
83
+ return "lsys-sidebar__group-content flex flex-col gap-[var(--lsys-space-1)]"
84
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Accordion.tsx
3
+ *
4
+ * Reference Accordion component implementation.
5
+ */
6
+
7
+ import { Accordion as BaseAccordion } from "@base-ui/react/accordion"
8
+ import type {
9
+ AccordionHeaderProps,
10
+ AccordionItemProps,
11
+ AccordionPanelProps,
12
+ AccordionProps,
13
+ AccordionTriggerProps,
14
+ } from "./Accordion.types"
15
+ import {
16
+ accordionHeaderVariants,
17
+ accordionItemVariants,
18
+ accordionPanelVariants,
19
+ accordionTriggerVariants,
20
+ accordionVariants,
21
+ } from "./Accordion.variants"
22
+ import { mergeClassName } from "@/lib/utils"
23
+
24
+ const Accordion = ({ ref, className, ...props }: AccordionProps) => {
25
+ return (
26
+ <BaseAccordion.Root
27
+ ref={ref}
28
+ className={mergeClassName(accordionVariants(), className)}
29
+ {...props}
30
+ />
31
+ )
32
+ }
33
+
34
+ Accordion.displayName = "Accordion"
35
+
36
+ const AccordionItem = ({ ref, className, ...props }: AccordionItemProps) => {
37
+ return (
38
+ <BaseAccordion.Item
39
+ ref={ref}
40
+ className={mergeClassName(accordionItemVariants(), className)}
41
+ {...props}
42
+ />
43
+ )
44
+ }
45
+
46
+ AccordionItem.displayName = "AccordionItem"
47
+
48
+ const AccordionHeader = ({
49
+ ref,
50
+ className,
51
+ ...props
52
+ }: AccordionHeaderProps) => {
53
+ return (
54
+ <BaseAccordion.Header
55
+ ref={ref}
56
+ className={mergeClassName(accordionHeaderVariants(), className)}
57
+ {...props}
58
+ />
59
+ )
60
+ }
61
+
62
+ AccordionHeader.displayName = "AccordionHeader"
63
+
64
+ const AccordionTrigger = ({
65
+ ref,
66
+ className,
67
+ children,
68
+ ...props
69
+ }: AccordionTriggerProps) => {
70
+ return (
71
+ <BaseAccordion.Trigger
72
+ ref={ref}
73
+ className={mergeClassName(accordionTriggerVariants(), className)}
74
+ {...props}
75
+ >
76
+ <span>{children}</span>
77
+ <span aria-hidden="true">+</span>
78
+ </BaseAccordion.Trigger>
79
+ )
80
+ }
81
+
82
+ AccordionTrigger.displayName = "AccordionTrigger"
83
+
84
+ const AccordionPanel = ({ ref, className, ...props }: AccordionPanelProps) => {
85
+ return (
86
+ <BaseAccordion.Panel
87
+ ref={ref}
88
+ className={mergeClassName(accordionPanelVariants(), className)}
89
+ {...props}
90
+ />
91
+ )
92
+ }
93
+
94
+ AccordionPanel.displayName = "AccordionPanel"
95
+
96
+ export {
97
+ Accordion,
98
+ AccordionItem,
99
+ AccordionHeader,
100
+ AccordionTrigger,
101
+ AccordionPanel,
102
+ }
@@ -0,0 +1,20 @@
1
+ import type { Ref } from "react"
2
+ /**
3
+ * Accordion.types.ts
4
+ *
5
+ * Public and internal types for Accordion component.
6
+ */
7
+
8
+ import type { Accordion as BaseAccordion } from "@base-ui/react/accordion"
9
+
10
+ export type AccordionProps = BaseAccordion.Root.Props & {
11
+ ref?: Ref<HTMLDivElement>
12
+ }
13
+
14
+ export type AccordionItemProps = BaseAccordion.Item.Props
15
+
16
+ export type AccordionHeaderProps = BaseAccordion.Header.Props
17
+
18
+ export type AccordionTriggerProps = BaseAccordion.Trigger.Props
19
+
20
+ export type AccordionPanelProps = BaseAccordion.Panel.Props
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Accordion.variants.ts
3
+ *
4
+ * Defines visual variants using class composition.
5
+ */
6
+
7
+ import { cva } from "class-variance-authority"
8
+ import { disabledStateClasses } from "@/lib/utils"
9
+
10
+ export const accordionVariants = cva(
11
+ "grid overflow-hidden rounded-(--lsys-accordion-radius) border border-(--lsys-accordion-border-color) bg-(--lsys-accordion-background) text-(--lsys-accordion-foreground)",
12
+ )
13
+
14
+ export const accordionItemVariants = cva(
15
+ "border-b border-(--lsys-accordion-item-border-color) last:border-b-0",
16
+ )
17
+
18
+ export const accordionHeaderVariants = cva("flex")
19
+
20
+ export const accordionTriggerVariants = cva(
21
+ [
22
+ "flex w-full items-center justify-between px-(--lsys-accordion-trigger-padding-x) py-(--lsys-accordion-trigger-padding-y) text-left",
23
+ "text-(length:--lsys-accordion-trigger-font-size) font-(--lsys-accordion-trigger-font-weight) leading-(--lsys-accordion-trigger-font-line-height) text-(--lsys-accordion-foreground)",
24
+ "transition-colors duration-(--lsys-accordion-transition-duration) ease-(--lsys-accordion-transition-easing)",
25
+ "outline-none hover:bg-(--lsys-accordion-trigger-background-hover) focus-visible:ring-(length:--lsys-accordion-focus-ring-width) focus-visible:ring-inset focus-visible:ring-(--lsys-accordion-focus-ring-color)",
26
+ disabledStateClasses,
27
+ ].join(" "),
28
+ )
29
+
30
+ export const accordionPanelVariants = cva(
31
+ "px-(--lsys-accordion-panel-padding-x) pb-(--lsys-accordion-panel-padding-bottom) text-(length:--lsys-accordion-panel-font-size) leading-(--lsys-accordion-panel-font-line-height) text-(--lsys-accordion-panel-foreground)",
32
+ )
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Alert.tsx
3
+ *
4
+ * Reference Alert component implementation.
5
+ */
6
+
7
+ import type {
8
+ AlertDescriptionProps,
9
+ AlertProps,
10
+ AlertTitleProps,
11
+ } from "./Alert.types"
12
+ import {
13
+ alertDescriptionClassName,
14
+ alertTitleClassName,
15
+ alertVariants,
16
+ } from "./Alert.variants"
17
+ import { cn } from "@/lib/utils"
18
+
19
+ const Alert = ({
20
+ ref,
21
+ variant,
22
+ className,
23
+ role = "alert",
24
+ ...props
25
+ }: AlertProps) => {
26
+ return (
27
+ <div
28
+ ref={ref}
29
+ role={role}
30
+ className={cn(alertVariants({ variant }), className)}
31
+ {...props}
32
+ />
33
+ )
34
+ }
35
+
36
+ Alert.displayName = "Alert"
37
+
38
+ const AlertTitle = ({ ref, className, ...props }: AlertTitleProps) => {
39
+ return (
40
+ <h3 ref={ref} className={cn(alertTitleClassName, className)} {...props} />
41
+ )
42
+ }
43
+
44
+ AlertTitle.displayName = "AlertTitle"
45
+
46
+ const AlertDescription = ({
47
+ ref,
48
+ className,
49
+ ...props
50
+ }: AlertDescriptionProps) => {
51
+ return (
52
+ <p
53
+ ref={ref}
54
+ className={cn(alertDescriptionClassName, className)}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ AlertDescription.displayName = "AlertDescription"
61
+
62
+ export { Alert, AlertTitle, AlertDescription }
@@ -0,0 +1,35 @@
1
+ import type { Ref } from "react"
2
+ /**
3
+ * Alert.types.ts
4
+ *
5
+ * Public and internal types for Alert component.
6
+ */
7
+
8
+ import type { HTMLAttributes } from "react"
9
+
10
+ export type AlertVariant = "neutral" | "primary" | "danger"
11
+
12
+ export interface AlertProps extends Omit<
13
+ HTMLAttributes<HTMLDivElement>,
14
+ "className"
15
+ > {
16
+ ref?: Ref<HTMLDivElement>
17
+ variant?: AlertVariant
18
+ className?: string
19
+ }
20
+
21
+ export interface AlertTitleProps extends Omit<
22
+ HTMLAttributes<HTMLHeadingElement>,
23
+ "className"
24
+ > {
25
+ ref?: Ref<HTMLHeadingElement>
26
+ className?: string
27
+ }
28
+
29
+ export interface AlertDescriptionProps extends Omit<
30
+ HTMLAttributes<HTMLParagraphElement>,
31
+ "className"
32
+ > {
33
+ ref?: Ref<HTMLParagraphElement>
34
+ className?: string
35
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Alert.variants.ts
3
+ *
4
+ * Defines Alert visual slots using class composition.
5
+ */
6
+
7
+ import { cva } from "class-variance-authority"
8
+
9
+ const neutralVariant =
10
+ "border-(--lsys-alert-neutral-border-color) bg-(--lsys-alert-neutral-background) text-(--lsys-alert-neutral-foreground)"
11
+
12
+ const primaryVariant =
13
+ "border-(--lsys-alert-primary-border-color) bg-(--lsys-alert-primary-background) text-(--lsys-alert-primary-foreground)"
14
+
15
+ const dangerVariant =
16
+ "border-(--lsys-alert-danger-border-color) bg-(--lsys-alert-danger-background) text-(--lsys-alert-danger-foreground)"
17
+
18
+ export const alertVariants = cva(
19
+ [
20
+ "grid gap-(--lsys-alert-gap) rounded-(--lsys-alert-radius) border p-(--lsys-alert-padding)",
21
+ "transition-colors duration-(--lsys-alert-transition-duration) ease-(--lsys-alert-transition-easing)",
22
+ ].join(" "),
23
+ {
24
+ variants: {
25
+ variant: {
26
+ neutral: neutralVariant,
27
+ primary: primaryVariant,
28
+ danger: dangerVariant,
29
+ },
30
+ },
31
+ defaultVariants: {
32
+ variant: "neutral",
33
+ },
34
+ },
35
+ )
36
+
37
+ export const alertTitleClassName =
38
+ "text-(length:--lsys-alert-title-font-size) font-(--lsys-alert-title-font-weight) leading-(--lsys-alert-title-font-line-height)"
39
+
40
+ export const alertDescriptionClassName =
41
+ "text-(length:--lsys-alert-description-font-size) leading-(--lsys-alert-description-font-line-height) text-(--lsys-alert-description-foreground)"
@@ -0,0 +1,168 @@
1
+ /**
2
+ * AlertDialog.tsx
3
+ *
4
+ * Reference AlertDialog component implementation.
5
+ */
6
+
7
+ import { X } from "lucide-react"
8
+ import { AlertDialog as BaseAlertDialog } from "@base-ui/react/alert-dialog"
9
+ import type {
10
+ AlertDialogBackdropProps,
11
+ AlertDialogCloseProps,
12
+ AlertDialogDescriptionProps,
13
+ AlertDialogPopupProps,
14
+ AlertDialogPortalProps,
15
+ AlertDialogProps,
16
+ AlertDialogTitleProps,
17
+ AlertDialogTriggerProps,
18
+ AlertDialogViewportProps,
19
+ } from "./AlertDialog.types"
20
+ import {
21
+ alertDialogBackdropVariants,
22
+ alertDialogCloseVariants,
23
+ alertDialogDescriptionVariants,
24
+ alertDialogPopupVariants,
25
+ alertDialogTitleVariants,
26
+ alertDialogTriggerVariants,
27
+ alertDialogViewportVariants,
28
+ } from "./AlertDialog.variants"
29
+ import { mergeClassName } from "@/lib/utils"
30
+
31
+ const AlertDialog = <Payload = unknown,>(props: AlertDialogProps<Payload>) => {
32
+ return <BaseAlertDialog.Root {...props} />
33
+ }
34
+
35
+ AlertDialog.displayName = "AlertDialog"
36
+
37
+ const AlertDialogTrigger = ({
38
+ ref,
39
+ className,
40
+ ...props
41
+ }: AlertDialogTriggerProps) => {
42
+ return (
43
+ <BaseAlertDialog.Trigger
44
+ ref={ref}
45
+ className={mergeClassName(alertDialogTriggerVariants(), className)}
46
+ {...props}
47
+ />
48
+ )
49
+ }
50
+
51
+ AlertDialogTrigger.displayName = "AlertDialogTrigger"
52
+
53
+ const AlertDialogPortal = (props: AlertDialogPortalProps) => {
54
+ return <BaseAlertDialog.Portal {...props} />
55
+ }
56
+
57
+ AlertDialogPortal.displayName = "AlertDialogPortal"
58
+
59
+ const AlertDialogBackdrop = ({
60
+ ref,
61
+ className,
62
+ ...props
63
+ }: AlertDialogBackdropProps) => {
64
+ return (
65
+ <BaseAlertDialog.Backdrop
66
+ ref={ref}
67
+ className={mergeClassName(alertDialogBackdropVariants(), className)}
68
+ {...props}
69
+ />
70
+ )
71
+ }
72
+
73
+ AlertDialogBackdrop.displayName = "AlertDialogBackdrop"
74
+
75
+ const AlertDialogViewport = ({
76
+ ref,
77
+ className,
78
+ ...props
79
+ }: AlertDialogViewportProps) => {
80
+ return (
81
+ <BaseAlertDialog.Viewport
82
+ ref={ref}
83
+ className={mergeClassName(alertDialogViewportVariants(), className)}
84
+ {...props}
85
+ />
86
+ )
87
+ }
88
+
89
+ AlertDialogViewport.displayName = "AlertDialogViewport"
90
+
91
+ const AlertDialogPopup = ({
92
+ ref,
93
+ className,
94
+ ...props
95
+ }: AlertDialogPopupProps) => {
96
+ return (
97
+ <BaseAlertDialog.Popup
98
+ ref={ref}
99
+ className={mergeClassName(alertDialogPopupVariants(), className)}
100
+ {...props}
101
+ />
102
+ )
103
+ }
104
+
105
+ AlertDialogPopup.displayName = "AlertDialogPopup"
106
+
107
+ const AlertDialogTitle = ({
108
+ ref,
109
+ className,
110
+ ...props
111
+ }: AlertDialogTitleProps) => {
112
+ return (
113
+ <BaseAlertDialog.Title
114
+ ref={ref}
115
+ className={mergeClassName(alertDialogTitleVariants(), className)}
116
+ {...props}
117
+ />
118
+ )
119
+ }
120
+
121
+ AlertDialogTitle.displayName = "AlertDialogTitle"
122
+
123
+ const AlertDialogDescription = ({
124
+ ref,
125
+ className,
126
+ ...props
127
+ }: AlertDialogDescriptionProps) => {
128
+ return (
129
+ <BaseAlertDialog.Description
130
+ ref={ref}
131
+ className={mergeClassName(alertDialogDescriptionVariants(), className)}
132
+ {...props}
133
+ />
134
+ )
135
+ }
136
+
137
+ AlertDialogDescription.displayName = "AlertDialogDescription"
138
+
139
+ const AlertDialogClose = ({
140
+ ref,
141
+ className,
142
+ children,
143
+ ...props
144
+ }: AlertDialogCloseProps) => {
145
+ return (
146
+ <BaseAlertDialog.Close
147
+ ref={ref}
148
+ className={mergeClassName(alertDialogCloseVariants(), className)}
149
+ {...props}
150
+ >
151
+ {children ?? <X aria-hidden="true" size={16} />}
152
+ </BaseAlertDialog.Close>
153
+ )
154
+ }
155
+
156
+ AlertDialogClose.displayName = "AlertDialogClose"
157
+
158
+ export {
159
+ AlertDialog,
160
+ AlertDialogTrigger,
161
+ AlertDialogPortal,
162
+ AlertDialogBackdrop,
163
+ AlertDialogViewport,
164
+ AlertDialogPopup,
165
+ AlertDialogTitle,
166
+ AlertDialogDescription,
167
+ AlertDialogClose,
168
+ }
@@ -0,0 +1,30 @@
1
+ import type { Ref } from "react"
2
+ /**
3
+ * AlertDialog.types.ts
4
+ *
5
+ * Public and internal types for AlertDialog component.
6
+ */
7
+
8
+ import type { AlertDialog as BaseAlertDialog } from "@base-ui/react/alert-dialog"
9
+
10
+ export type AlertDialogProps<Payload = unknown> =
11
+ BaseAlertDialog.Root.Props<Payload>
12
+
13
+ export type AlertDialogTriggerProps<Payload = unknown> =
14
+ BaseAlertDialog.Trigger.Props<Payload> & {
15
+ ref?: Ref<HTMLButtonElement>
16
+ }
17
+
18
+ export type AlertDialogPortalProps = BaseAlertDialog.Portal.Props
19
+
20
+ export type AlertDialogBackdropProps = BaseAlertDialog.Backdrop.Props
21
+
22
+ export type AlertDialogViewportProps = BaseAlertDialog.Viewport.Props
23
+
24
+ export type AlertDialogPopupProps = BaseAlertDialog.Popup.Props
25
+
26
+ export type AlertDialogTitleProps = BaseAlertDialog.Title.Props
27
+
28
+ export type AlertDialogDescriptionProps = BaseAlertDialog.Description.Props
29
+
30
+ export type AlertDialogCloseProps = BaseAlertDialog.Close.Props
@@ -0,0 +1,57 @@
1
+ /**
2
+ * AlertDialog.variants.ts
3
+ *
4
+ * Defines visual variants using class composition.
5
+ */
6
+
7
+ import { cva } from "class-variance-authority"
8
+ import { disabledStateClasses } from "@/lib/utils"
9
+
10
+ export const alertDialogTriggerVariants = cva(
11
+ [
12
+ "inline-flex h-(--lsys-alert-dialog-trigger-height) items-center justify-center rounded-(--lsys-alert-dialog-trigger-radius)",
13
+ "bg-(--lsys-alert-dialog-trigger-background) px-(--lsys-alert-dialog-trigger-padding-x) text-(--lsys-alert-dialog-trigger-foreground)",
14
+ "text-(length:--lsys-alert-dialog-trigger-font-size) font-(--lsys-alert-dialog-trigger-font-weight) leading-(--lsys-alert-dialog-trigger-font-line-height)",
15
+ "transition-colors duration-(--lsys-alert-dialog-transition-duration) ease-(--lsys-alert-dialog-transition-easing)",
16
+ "outline-none hover:bg-(--lsys-alert-dialog-trigger-hover-background) focus-visible:ring-(length:--lsys-alert-dialog-focus-ring-width) focus-visible:ring-(--lsys-alert-dialog-focus-ring-color) focus-visible:ring-offset-(length:--lsys-alert-dialog-focus-ring-offset) focus-visible:ring-offset-(--lsys-alert-dialog-focus-ring-offset-color)",
17
+ disabledStateClasses,
18
+ ].join(" "),
19
+ )
20
+
21
+ export const alertDialogBackdropVariants = cva(
22
+ [
23
+ "fixed inset-0 z-(--lsys-alert-dialog-backdrop-z-index) bg-(--lsys-alert-dialog-backdrop-background) opacity-(--lsys-alert-dialog-backdrop-opacity)",
24
+ "data-[starting-style]:opacity-0 data-[ending-style]:opacity-0",
25
+ "transition-opacity duration-(--lsys-alert-dialog-transition-duration) ease-(--lsys-alert-dialog-transition-easing)",
26
+ ].join(" "),
27
+ )
28
+
29
+ export const alertDialogViewportVariants = cva(
30
+ "fixed inset-0 z-(--lsys-alert-dialog-viewport-z-index) grid place-items-center overflow-y-auto p-(--lsys-alert-dialog-viewport-padding)",
31
+ )
32
+
33
+ export const alertDialogPopupVariants = cva(
34
+ [
35
+ "grid w-[min(calc(100vw-(var(--lsys-alert-dialog-viewport-inset)*2)),var(--lsys-alert-dialog-popup-max-width))] gap-(--lsys-alert-dialog-popup-gap) rounded-(--lsys-alert-dialog-popup-radius) border",
36
+ "border-(--lsys-alert-dialog-popup-border-color) bg-(--lsys-alert-dialog-popup-background) p-(--lsys-alert-dialog-popup-padding) text-(--lsys-alert-dialog-popup-foreground) shadow-(--lsys-alert-dialog-popup-shadow)",
37
+ "outline-none data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
38
+ "transition-[opacity,transform] duration-(--lsys-alert-dialog-transition-duration) ease-(--lsys-alert-dialog-transition-easing)",
39
+ ].join(" "),
40
+ )
41
+
42
+ export const alertDialogTitleVariants = cva(
43
+ "pr-(--lsys-alert-dialog-title-padding-end) text-(length:--lsys-alert-dialog-title-font-size) font-(--lsys-alert-dialog-title-font-weight) leading-(--lsys-alert-dialog-title-font-line-height) text-(--lsys-alert-dialog-title-foreground)",
44
+ )
45
+
46
+ export const alertDialogDescriptionVariants = cva(
47
+ "text-(length:--lsys-alert-dialog-description-font-size) font-(--lsys-alert-dialog-description-font-weight) leading-(--lsys-alert-dialog-description-font-line-height) text-(--lsys-alert-dialog-description-foreground)",
48
+ )
49
+
50
+ export const alertDialogCloseVariants = cva(
51
+ [
52
+ "absolute right-(--lsys-alert-dialog-close-inset) top-(--lsys-alert-dialog-close-inset) inline-flex size-(--lsys-alert-dialog-close-size) items-center justify-center rounded-(--lsys-alert-dialog-close-radius)",
53
+ "text-(--lsys-alert-dialog-close-foreground) outline-none transition-colors duration-(--lsys-alert-dialog-transition-duration) ease-(--lsys-alert-dialog-transition-easing)",
54
+ "hover:bg-(--lsys-alert-dialog-close-hover-background) focus-visible:ring-(length:--lsys-alert-dialog-focus-ring-width) focus-visible:ring-(--lsys-alert-dialog-focus-ring-color) focus-visible:ring-offset-(length:--lsys-alert-dialog-focus-ring-offset) focus-visible:ring-offset-(--lsys-alert-dialog-focus-ring-offset-color)",
55
+ disabledStateClasses,
56
+ ].join(" "),
57
+ )