@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,41 @@
1
+ /**
2
+ * Input.variants.ts
3
+ *
4
+ * Defines visual variants using class composition.
5
+ */
6
+
7
+ import { cva } from "class-variance-authority"
8
+ import { disabledStateClasses, invalidStateClasses } from "@/lib/utils"
9
+
10
+ export const inputVariants = cva(
11
+ [
12
+ "flex w-full min-w-0 border bg-(--lsys-input-background) text-(--lsys-input-foreground)",
13
+ "rounded-(--lsys-input-radius) border-(--lsys-input-border-color)",
14
+ "font-(family-name:--lsys-input-font-family) font-(--lsys-input-font-weight) leading-(--lsys-input-font-line-height) tracking-(--lsys-input-font-letter-spacing)",
15
+ "placeholder:text-(--lsys-input-placeholder-color)",
16
+ "transition-colors duration-(--lsys-input-transition-duration) ease-(--lsys-input-transition-easing)",
17
+ "outline-none focus-visible:border-(--lsys-input-focus-border-color) focus-visible:ring-(length:--lsys-input-focus-ring-width) focus-visible:ring-(--lsys-input-focus-ring-color) focus-visible:ring-offset-(length:--lsys-input-focus-ring-offset) focus-visible:ring-offset-(--lsys-input-focus-ring-offset-color)",
18
+ "disabled:cursor-not-allowed",
19
+ "read-only:cursor-default read-only:bg-(--lsys-color-background-subtle) read-only:text-(--lsys-color-text-secondary)",
20
+ disabledStateClasses,
21
+ invalidStateClasses,
22
+ ].join(" "),
23
+ {
24
+ variants: {
25
+ variant: {
26
+ default: "",
27
+ ghost:
28
+ "border-transparent bg-transparent focus-visible:bg-(--lsys-input-background)",
29
+ },
30
+ size: {
31
+ sm: "h-(--lsys-input-height-sm) px-(--lsys-input-padding-x-sm) text-(length:--lsys-input-font-size-sm)",
32
+ md: "h-(--lsys-input-height-md) px-(--lsys-input-padding-x-md) text-(length:--lsys-input-font-size-md)",
33
+ lg: "h-(--lsys-input-height-lg) px-(--lsys-input-padding-x-lg) text-(length:--lsys-input-font-size-lg)",
34
+ },
35
+ },
36
+ defaultVariants: {
37
+ variant: "default",
38
+ size: "md",
39
+ },
40
+ },
41
+ )
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Menu.tsx
3
+ *
4
+ * Reference Menu component implementation.
5
+ */
6
+
7
+ import { Check, ChevronRight } from "lucide-react"
8
+ import { Menu as BaseMenu } from "@base-ui/react/menu"
9
+ import type {
10
+ MenuArrowProps,
11
+ MenuBackdropProps,
12
+ MenuCheckboxItemIndicatorProps,
13
+ MenuCheckboxItemProps,
14
+ MenuGroupLabelProps,
15
+ MenuGroupProps,
16
+ MenuItemProps,
17
+ MenuLinkItemProps,
18
+ MenuPopupProps,
19
+ MenuPortalProps,
20
+ MenuPositionerProps,
21
+ MenuProps,
22
+ MenuRadioGroupProps,
23
+ MenuRadioItemIndicatorProps,
24
+ MenuRadioItemProps,
25
+ MenuSeparatorProps,
26
+ MenuSubmenuRootProps,
27
+ MenuSubmenuTriggerProps,
28
+ MenuTriggerProps,
29
+ MenuViewportProps,
30
+ } from "./Menu.types"
31
+ import {
32
+ menuArrowVariants,
33
+ menuBackdropVariants,
34
+ menuGroupLabelVariants,
35
+ menuGroupVariants,
36
+ menuItemIndicatorVariants,
37
+ menuItemTextVariants,
38
+ menuItemVariants,
39
+ menuPopupVariants,
40
+ menuPositionerVariants,
41
+ menuSeparatorVariants,
42
+ menuSubmenuTriggerIconVariants,
43
+ menuTriggerVariants,
44
+ menuViewportVariants,
45
+ } from "./Menu.variants"
46
+ import { mergeClassName } from "@/lib/utils"
47
+ import { overlayPositionerSideOffset } from "@/lib/utils"
48
+
49
+ const horizontalMenuSides = new Set<NonNullable<MenuPositionerProps["side"]>>([
50
+ "left",
51
+ "right",
52
+ "inline-start",
53
+ "inline-end",
54
+ ])
55
+
56
+ const popupCollisionAvoidance = {
57
+ fallbackAxisSide: "end",
58
+ } as const
59
+
60
+ const Menu = <Payload = unknown,>(props: MenuProps<Payload>) => {
61
+ return <BaseMenu.Root {...props} />
62
+ }
63
+
64
+ Menu.displayName = "Menu"
65
+
66
+ const MenuTrigger = ({ ref, className, ...props }: MenuTriggerProps) => {
67
+ return (
68
+ <BaseMenu.Trigger
69
+ ref={ref}
70
+ className={mergeClassName(menuTriggerVariants(), className)}
71
+ {...props}
72
+ />
73
+ )
74
+ }
75
+
76
+ MenuTrigger.displayName = "MenuTrigger"
77
+
78
+ const MenuPortal = (props: MenuPortalProps) => {
79
+ return <BaseMenu.Portal {...props} />
80
+ }
81
+
82
+ MenuPortal.displayName = "MenuPortal"
83
+
84
+ const MenuBackdrop = ({ ref, className, ...props }: MenuBackdropProps) => {
85
+ return (
86
+ <BaseMenu.Backdrop
87
+ ref={ref}
88
+ className={mergeClassName(menuBackdropVariants(), className)}
89
+ {...props}
90
+ />
91
+ )
92
+ }
93
+
94
+ MenuBackdrop.displayName = "MenuBackdrop"
95
+
96
+ const MenuPositioner = ({
97
+ ref,
98
+ className,
99
+ sideOffset = overlayPositionerSideOffset,
100
+ side,
101
+ collisionAvoidance,
102
+ ...props
103
+ }: MenuPositionerProps) => {
104
+ const resolvedCollisionAvoidance =
105
+ collisionAvoidance ??
106
+ (side && horizontalMenuSides.has(side)
107
+ ? popupCollisionAvoidance
108
+ : undefined)
109
+
110
+ return (
111
+ <BaseMenu.Positioner
112
+ ref={ref}
113
+ sideOffset={sideOffset}
114
+ side={side}
115
+ collisionAvoidance={resolvedCollisionAvoidance}
116
+ className={mergeClassName(menuPositionerVariants(), className)}
117
+ {...props}
118
+ />
119
+ )
120
+ }
121
+
122
+ MenuPositioner.displayName = "MenuPositioner"
123
+
124
+ const MenuPopup = ({ ref, className, ...props }: MenuPopupProps) => {
125
+ return (
126
+ <BaseMenu.Popup
127
+ ref={ref}
128
+ className={mergeClassName(menuPopupVariants(), className)}
129
+ {...props}
130
+ />
131
+ )
132
+ }
133
+
134
+ MenuPopup.displayName = "MenuPopup"
135
+
136
+ const MenuArrow = ({ ref, className, ...props }: MenuArrowProps) => {
137
+ return (
138
+ <BaseMenu.Arrow
139
+ ref={ref}
140
+ className={mergeClassName(menuArrowVariants(), className)}
141
+ {...props}
142
+ />
143
+ )
144
+ }
145
+
146
+ MenuArrow.displayName = "MenuArrow"
147
+
148
+ const MenuViewport = ({ ref, className, ...props }: MenuViewportProps) => {
149
+ return (
150
+ <BaseMenu.Viewport
151
+ ref={ref}
152
+ className={mergeClassName(menuViewportVariants(), className)}
153
+ {...props}
154
+ />
155
+ )
156
+ }
157
+
158
+ MenuViewport.displayName = "MenuViewport"
159
+
160
+ const MenuItem = ({ ref, className, ...props }: MenuItemProps) => {
161
+ return (
162
+ <BaseMenu.Item
163
+ ref={ref}
164
+ className={mergeClassName(menuItemVariants(), className)}
165
+ {...props}
166
+ />
167
+ )
168
+ }
169
+
170
+ MenuItem.displayName = "MenuItem"
171
+
172
+ const MenuLinkItem = ({ ref, className, ...props }: MenuLinkItemProps) => {
173
+ return (
174
+ <BaseMenu.LinkItem
175
+ ref={ref}
176
+ className={mergeClassName(menuItemVariants(), className)}
177
+ {...props}
178
+ />
179
+ )
180
+ }
181
+
182
+ MenuLinkItem.displayName = "MenuLinkItem"
183
+
184
+ const MenuCheckboxItem = ({
185
+ ref,
186
+ className,
187
+ ...props
188
+ }: MenuCheckboxItemProps) => {
189
+ return (
190
+ <BaseMenu.CheckboxItem
191
+ ref={ref}
192
+ className={mergeClassName(menuItemVariants(), className)}
193
+ {...props}
194
+ />
195
+ )
196
+ }
197
+
198
+ MenuCheckboxItem.displayName = "MenuCheckboxItem"
199
+
200
+ const MenuCheckboxItemIndicator = ({
201
+ ref,
202
+ className,
203
+ children,
204
+ ...props
205
+ }: MenuCheckboxItemIndicatorProps) => {
206
+ return (
207
+ <BaseMenu.CheckboxItemIndicator
208
+ ref={ref}
209
+ className={mergeClassName(menuItemIndicatorVariants(), className)}
210
+ {...props}
211
+ >
212
+ {children ?? <Check aria-hidden="true" size={14} />}
213
+ </BaseMenu.CheckboxItemIndicator>
214
+ )
215
+ }
216
+
217
+ MenuCheckboxItemIndicator.displayName = "MenuCheckboxItemIndicator"
218
+
219
+ const MenuRadioGroup = ({ ref, className, ...props }: MenuRadioGroupProps) => {
220
+ return (
221
+ <BaseMenu.RadioGroup
222
+ ref={ref}
223
+ className={mergeClassName(menuGroupVariants(), className)}
224
+ {...props}
225
+ />
226
+ )
227
+ }
228
+
229
+ MenuRadioGroup.displayName = "MenuRadioGroup"
230
+
231
+ const MenuRadioItem = ({ ref, className, ...props }: MenuRadioItemProps) => {
232
+ return (
233
+ <BaseMenu.RadioItem
234
+ ref={ref}
235
+ className={mergeClassName(menuItemVariants(), className)}
236
+ {...props}
237
+ />
238
+ )
239
+ }
240
+
241
+ MenuRadioItem.displayName = "MenuRadioItem"
242
+
243
+ const MenuRadioItemIndicator = ({
244
+ ref,
245
+ className,
246
+ children,
247
+ ...props
248
+ }: MenuRadioItemIndicatorProps) => {
249
+ return (
250
+ <BaseMenu.RadioItemIndicator
251
+ ref={ref}
252
+ className={mergeClassName(menuItemIndicatorVariants(), className)}
253
+ {...props}
254
+ >
255
+ {children ?? <Check aria-hidden="true" size={14} />}
256
+ </BaseMenu.RadioItemIndicator>
257
+ )
258
+ }
259
+
260
+ MenuRadioItemIndicator.displayName = "MenuRadioItemIndicator"
261
+
262
+ const MenuGroup = ({ ref, className, ...props }: MenuGroupProps) => {
263
+ return (
264
+ <BaseMenu.Group
265
+ ref={ref}
266
+ className={mergeClassName(menuGroupVariants(), className)}
267
+ {...props}
268
+ />
269
+ )
270
+ }
271
+
272
+ MenuGroup.displayName = "MenuGroup"
273
+
274
+ const MenuGroupLabel = ({ ref, className, ...props }: MenuGroupLabelProps) => {
275
+ return (
276
+ <BaseMenu.GroupLabel
277
+ ref={ref}
278
+ className={mergeClassName(menuGroupLabelVariants(), className)}
279
+ {...props}
280
+ />
281
+ )
282
+ }
283
+
284
+ MenuGroupLabel.displayName = "MenuGroupLabel"
285
+
286
+ const MenuSeparator = ({ ref, className, ...props }: MenuSeparatorProps) => {
287
+ return (
288
+ <BaseMenu.Separator
289
+ ref={ref}
290
+ className={mergeClassName(menuSeparatorVariants(), className)}
291
+ {...props}
292
+ />
293
+ )
294
+ }
295
+
296
+ MenuSeparator.displayName = "MenuSeparator"
297
+
298
+ const MenuSubmenuRoot = (props: MenuSubmenuRootProps) => {
299
+ return <BaseMenu.SubmenuRoot {...props} />
300
+ }
301
+
302
+ MenuSubmenuRoot.displayName = "MenuSubmenuRoot"
303
+
304
+ const MenuSubmenuTrigger = ({
305
+ ref,
306
+ className,
307
+ children,
308
+ ...props
309
+ }: MenuSubmenuTriggerProps) => {
310
+ return (
311
+ <BaseMenu.SubmenuTrigger
312
+ ref={ref}
313
+ className={mergeClassName(menuTriggerVariants(), className)}
314
+ {...props}
315
+ >
316
+ <span className={menuItemTextVariants()}>{children}</span>
317
+ <span className={menuSubmenuTriggerIconVariants()}>
318
+ <ChevronRight aria-hidden="true" size={14} />
319
+ </span>
320
+ </BaseMenu.SubmenuTrigger>
321
+ )
322
+ }
323
+
324
+ MenuSubmenuTrigger.displayName = "MenuSubmenuTrigger"
325
+
326
+ const createMenuHandle = BaseMenu.createHandle
327
+
328
+ export {
329
+ Menu,
330
+ MenuTrigger,
331
+ MenuPortal,
332
+ MenuBackdrop,
333
+ MenuPositioner,
334
+ MenuPopup,
335
+ MenuArrow,
336
+ MenuViewport,
337
+ MenuItem,
338
+ MenuLinkItem,
339
+ MenuCheckboxItem,
340
+ MenuCheckboxItemIndicator,
341
+ MenuRadioGroup,
342
+ MenuRadioItem,
343
+ MenuRadioItemIndicator,
344
+ MenuGroup,
345
+ MenuGroupLabel,
346
+ MenuSeparator,
347
+ MenuSubmenuRoot,
348
+ MenuSubmenuTrigger,
349
+ createMenuHandle,
350
+ }
351
+
352
+ export type { MenuHandle } from "./Menu.types"
@@ -0,0 +1,56 @@
1
+ import type { Ref } from "react"
2
+ /**
3
+ * Menu.types.ts
4
+ *
5
+ * Public and internal types for Menu component.
6
+ */
7
+
8
+ import type { Menu as BaseMenu } from "@base-ui/react/menu"
9
+
10
+ export type MenuProps<Payload = unknown> = BaseMenu.Root.Props<Payload>
11
+
12
+ export type MenuHandle<Payload = unknown> = BaseMenu.Handle<Payload>
13
+
14
+ export type MenuTriggerProps<Payload = unknown> =
15
+ BaseMenu.Trigger.Props<Payload> & {
16
+ ref?: Ref<HTMLButtonElement>
17
+ }
18
+
19
+ export type MenuPortalProps = BaseMenu.Portal.Props
20
+
21
+ export type MenuBackdropProps = BaseMenu.Backdrop.Props
22
+
23
+ export type MenuPositionerProps = BaseMenu.Positioner.Props
24
+
25
+ export type MenuPopupProps = BaseMenu.Popup.Props
26
+
27
+ export type MenuArrowProps = BaseMenu.Arrow.Props
28
+
29
+ export type MenuViewportProps = BaseMenu.Viewport.Props
30
+
31
+ export interface MenuItemProps extends Omit<BaseMenu.Item.Props, "className"> {
32
+ className?: BaseMenu.Item.Props["className"]
33
+ }
34
+
35
+ export type MenuLinkItemProps = BaseMenu.LinkItem.Props
36
+
37
+ export type MenuCheckboxItemProps = BaseMenu.CheckboxItem.Props
38
+
39
+ export type MenuCheckboxItemIndicatorProps =
40
+ BaseMenu.CheckboxItemIndicator.Props
41
+
42
+ export type MenuRadioGroupProps = BaseMenu.RadioGroup.Props
43
+
44
+ export type MenuRadioItemProps = BaseMenu.RadioItem.Props
45
+
46
+ export type MenuRadioItemIndicatorProps = BaseMenu.RadioItemIndicator.Props
47
+
48
+ export type MenuGroupProps = BaseMenu.Group.Props
49
+
50
+ export type MenuGroupLabelProps = BaseMenu.GroupLabel.Props
51
+
52
+ export type MenuSeparatorProps = BaseMenu.Separator.Props
53
+
54
+ export type MenuSubmenuRootProps = BaseMenu.SubmenuRoot.Props
55
+
56
+ export type MenuSubmenuTriggerProps = BaseMenu.SubmenuTrigger.Props
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Menu.variants.ts
3
+ *
4
+ * Defines visual variants using class composition.
5
+ */
6
+
7
+ import { cva } from "class-variance-authority"
8
+
9
+ export const menuTriggerVariants = cva(
10
+ [
11
+ "inline-flex min-w-0 items-center justify-center gap-(--lsys-menu-trigger-gap) rounded-(--lsys-menu-trigger-radius) border",
12
+ "h-(--lsys-menu-trigger-height) border-(--lsys-menu-trigger-border-color) bg-(--lsys-menu-trigger-background) px-(--lsys-menu-trigger-padding-x)",
13
+ "text-(length:--lsys-menu-trigger-font-size) font-(--lsys-menu-trigger-font-weight) leading-(--lsys-menu-trigger-font-line-height) text-(--lsys-menu-trigger-foreground)",
14
+ "transition-colors duration-(--lsys-menu-transition-duration) ease-(--lsys-menu-transition-easing)",
15
+ "outline-none data-[popup-open]:border-(--lsys-menu-trigger-open-border-color) data-[popup-open]:bg-(--lsys-menu-trigger-open-background)",
16
+ "data-[focused]:border-(--lsys-menu-focus-border-color) data-[focused]:ring-(length:--lsys-menu-focus-ring-width) data-[focused]:ring-(--lsys-menu-focus-ring-color) data-[focused]:ring-offset-(length:--lsys-menu-focus-ring-offset) data-[focused]:ring-offset-(--lsys-menu-focus-ring-offset-color)",
17
+ "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-(--lsys-opacity-disabled)",
18
+ ].join(" "),
19
+ )
20
+
21
+ export const menuBackdropVariants = cva(
22
+ "fixed inset-0 z-(--lsys-menu-backdrop-z-index) bg-(--lsys-menu-backdrop-background) opacity-(--lsys-menu-backdrop-opacity) data-[starting-style]:opacity-0 data-[ending-style]:opacity-0",
23
+ )
24
+
25
+ export const menuPositionerVariants = cva("z-(--lsys-menu-positioner-z-index)")
26
+
27
+ export const menuPopupVariants = cva(
28
+ [
29
+ "min-w-[var(--anchor-width)] max-w-(--lsys-menu-popup-max-width) rounded-(--lsys-menu-radius) border",
30
+ "border-(--lsys-menu-popup-border-color) bg-(--lsys-menu-popup-background) text-(--lsys-menu-popup-foreground) shadow-(--lsys-menu-popup-shadow)",
31
+ "data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
32
+ "origin-[var(--transform-origin)] transition-[opacity,transform] duration-(--lsys-menu-transition-duration) ease-(--lsys-menu-transition-easing)",
33
+ ].join(" "),
34
+ )
35
+
36
+ export const menuViewportVariants = cva(
37
+ "grid max-h-(--lsys-menu-viewport-max-height) gap-(--lsys-menu-list-gap) overflow-y-auto p-(--lsys-menu-list-padding)",
38
+ )
39
+
40
+ export const menuItemVariants = cva(
41
+ [
42
+ "relative flex min-w-0 cursor-default select-none items-center gap-(--lsys-menu-item-gap) rounded-(--lsys-menu-item-radius)",
43
+ "px-(--lsys-menu-item-padding-x) py-(--lsys-menu-item-padding-y) text-(length:--lsys-menu-item-font-size) font-(--lsys-menu-item-font-weight) leading-(--lsys-menu-item-font-line-height)",
44
+ "text-(--lsys-menu-item-foreground) outline-none",
45
+ "data-[highlighted]:bg-(--lsys-menu-item-highlight-background) data-[highlighted]:text-(--lsys-menu-item-highlight-foreground)",
46
+ "data-[checked]:bg-(--lsys-menu-item-checked-background) data-[checked]:text-(--lsys-menu-item-checked-foreground)",
47
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-(--lsys-opacity-disabled)",
48
+ ].join(" "),
49
+ )
50
+
51
+ export const menuItemTextVariants = cva("min-w-0 flex-1 truncate")
52
+
53
+ export const menuItemIndicatorVariants = cva(
54
+ "inline-flex size-(--lsys-menu-item-indicator-size) shrink-0 items-center justify-center text-current",
55
+ )
56
+
57
+ export const menuSubmenuTriggerIconVariants = cva(
58
+ "ml-auto inline-flex size-(--lsys-menu-submenu-icon-size) shrink-0 items-center justify-center text-current",
59
+ )
60
+
61
+ export const menuArrowVariants = cva(
62
+ "size-(--lsys-menu-arrow-size) rotate-45 border border-(--lsys-menu-popup-border-color) bg-(--lsys-menu-popup-background)",
63
+ )
64
+
65
+ export const menuGroupVariants = cva("grid gap-(--lsys-menu-group-gap)")
66
+
67
+ export const menuGroupLabelVariants = cva(
68
+ "px-(--lsys-menu-item-padding-x) py-(--lsys-menu-group-label-padding-y) 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)",
69
+ )
70
+
71
+ export const menuSeparatorVariants = cva(
72
+ "my-(--lsys-menu-separator-margin-y) h-px bg-(--lsys-menu-separator-background)",
73
+ )
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Menubar.tsx
3
+ *
4
+ * Reference Menubar component implementation.
5
+ */
6
+
7
+ import { Menubar as BaseMenubar } from "@base-ui/react/menubar"
8
+ import type { MenubarProps } from "./Menubar.types"
9
+ import { menubarVariants } from "./Menubar.variants"
10
+ import { mergeClassName } from "@/lib/utils"
11
+
12
+ const Menubar = ({ ref, className, orientation, ...props }: MenubarProps) => {
13
+ return (
14
+ <BaseMenubar
15
+ ref={ref}
16
+ orientation={orientation}
17
+ className={mergeClassName(menubarVariants({ orientation }), className)}
18
+ {...props}
19
+ />
20
+ )
21
+ }
22
+
23
+ Menubar.displayName = "Menubar"
24
+
25
+ export { Menubar }
@@ -0,0 +1,12 @@
1
+ import type { Ref } from "react"
2
+ /**
3
+ * Menubar.types.ts
4
+ *
5
+ * Public and internal types for Menubar component.
6
+ */
7
+
8
+ import type { MenubarProps as BaseMenubarProps } from "@base-ui/react/menubar"
9
+
10
+ export type MenubarProps = BaseMenubarProps & {
11
+ ref?: Ref<HTMLDivElement>
12
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Menubar.variants.ts
3
+ *
4
+ * Defines visual variants using class composition.
5
+ */
6
+
7
+ import { cva } from "class-variance-authority"
8
+
9
+ export const menubarVariants = cva(
10
+ "flex items-center gap-(--lsys-menu-list-gap) rounded-(--lsys-menu-radius) border border-(--lsys-menu-trigger-border-color) bg-(--lsys-menu-trigger-background) p-(--lsys-menu-list-padding)",
11
+ {
12
+ variants: {
13
+ orientation: {
14
+ horizontal: "flex-row",
15
+ vertical: "flex-col",
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ orientation: "horizontal",
20
+ },
21
+ },
22
+ )
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Meter.tsx
3
+ *
4
+ * Reference Meter component implementation.
5
+ */
6
+
7
+ import { Meter as BaseMeter } from "@base-ui/react/meter"
8
+ import type {
9
+ MeterIndicatorProps,
10
+ MeterLabelProps,
11
+ MeterProps,
12
+ MeterTrackProps,
13
+ MeterValueProps,
14
+ } from "./Meter.types"
15
+ import {
16
+ meterHeaderVariants,
17
+ meterIndicatorVariants,
18
+ meterLabelVariants,
19
+ meterTrackVariants,
20
+ meterValueVariants,
21
+ meterVariants,
22
+ } from "./Meter.variants"
23
+ import { mergeClassName } from "@/lib/utils"
24
+
25
+ const Meter = ({
26
+ ref,
27
+ size,
28
+ label,
29
+ showValue,
30
+ children,
31
+ className,
32
+ trackClassName,
33
+ indicatorClassName,
34
+ labelClassName,
35
+ valueClassName,
36
+ ...props
37
+ }: MeterProps) => {
38
+ if (children !== undefined) {
39
+ return (
40
+ <BaseMeter.Root
41
+ ref={ref}
42
+ className={mergeClassName(meterVariants(), className)}
43
+ {...props}
44
+ >
45
+ {children}
46
+ </BaseMeter.Root>
47
+ )
48
+ }
49
+
50
+ return (
51
+ <BaseMeter.Root
52
+ ref={ref}
53
+ className={mergeClassName(meterVariants(), className)}
54
+ {...props}
55
+ >
56
+ {label === undefined && showValue !== true ? null : (
57
+ <div className={meterHeaderVariants()}>
58
+ {label === undefined ? null : (
59
+ <MeterLabel className={labelClassName}>{label}</MeterLabel>
60
+ )}
61
+ {showValue === true ? (
62
+ <MeterValue className={valueClassName} />
63
+ ) : null}
64
+ </div>
65
+ )}
66
+ <MeterTrack size={size} className={trackClassName}>
67
+ <MeterIndicator className={indicatorClassName} />
68
+ </MeterTrack>
69
+ </BaseMeter.Root>
70
+ )
71
+ }
72
+
73
+ Meter.displayName = "Meter"
74
+
75
+ const MeterTrack = ({ ref, size, className, ...props }: MeterTrackProps) => {
76
+ return (
77
+ <BaseMeter.Track
78
+ ref={ref}
79
+ className={mergeClassName(meterTrackVariants({ size }), className)}
80
+ {...props}
81
+ />
82
+ )
83
+ }
84
+
85
+ MeterTrack.displayName = "MeterTrack"
86
+
87
+ const MeterIndicator = ({ ref, className, ...props }: MeterIndicatorProps) => {
88
+ return (
89
+ <BaseMeter.Indicator
90
+ ref={ref}
91
+ className={mergeClassName(meterIndicatorVariants(), className)}
92
+ {...props}
93
+ />
94
+ )
95
+ }
96
+
97
+ MeterIndicator.displayName = "MeterIndicator"
98
+
99
+ const MeterValue = ({ ref, className, ...props }: MeterValueProps) => {
100
+ return (
101
+ <BaseMeter.Value
102
+ ref={ref}
103
+ className={mergeClassName(meterValueVariants(), className)}
104
+ {...props}
105
+ />
106
+ )
107
+ }
108
+
109
+ MeterValue.displayName = "MeterValue"
110
+
111
+ const MeterLabel = ({ ref, className, ...props }: MeterLabelProps) => {
112
+ return (
113
+ <BaseMeter.Label
114
+ ref={ref}
115
+ className={mergeClassName(meterLabelVariants(), className)}
116
+ {...props}
117
+ />
118
+ )
119
+ }
120
+
121
+ MeterLabel.displayName = "MeterLabel"
122
+
123
+ export { Meter, MeterTrack, MeterIndicator, MeterValue, MeterLabel }