@brijbyte/agentic-ui 0.0.2 → 0.0.4

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 (227) hide show
  1. package/README.md +132 -35
  2. package/dist/accordion/accordion.d.ts +15 -1
  3. package/dist/accordion/accordion.d.ts.map +1 -1
  4. package/dist/accordion/accordion.js +6 -1
  5. package/dist/accordion/accordion.js.map +1 -1
  6. package/dist/accordion/parts.d.ts +1 -1
  7. package/dist/accordion/parts.js +2 -2
  8. package/dist/alert-dialog/alert-dialog.d.ts +12 -1
  9. package/dist/alert-dialog/alert-dialog.d.ts.map +1 -1
  10. package/dist/alert-dialog/alert-dialog.js +6 -1
  11. package/dist/alert-dialog/alert-dialog.js.map +1 -1
  12. package/dist/alert-dialog/parts.d.ts +1 -1
  13. package/dist/alert-dialog/parts.js +2 -2
  14. package/dist/badge/badge.d.ts +7 -1
  15. package/dist/badge/badge.d.ts.map +1 -1
  16. package/dist/badge/badge.js +4 -0
  17. package/dist/badge/badge.js.map +1 -1
  18. package/dist/button/button.css +22 -8
  19. package/dist/button/button.d.ts +19 -8
  20. package/dist/button/button.d.ts.map +1 -1
  21. package/dist/button/button.js +6 -1
  22. package/dist/button/button.js.map +1 -1
  23. package/dist/button/button.module.js.map +1 -1
  24. package/dist/card/card.d.ts +11 -1
  25. package/dist/card/card.d.ts.map +1 -1
  26. package/dist/card/card.js +7 -0
  27. package/dist/card/card.js.map +1 -1
  28. package/dist/checkbox/checkbox.d.ts +14 -1
  29. package/dist/checkbox/checkbox.d.ts.map +1 -1
  30. package/dist/checkbox/checkbox.js +5 -1
  31. package/dist/checkbox/checkbox.js.map +1 -1
  32. package/dist/checkbox/parts.js +1 -1
  33. package/dist/collapsible/collapsible.d.ts +12 -1
  34. package/dist/collapsible/collapsible.d.ts.map +1 -1
  35. package/dist/collapsible/collapsible.js +5 -0
  36. package/dist/collapsible/collapsible.js.map +1 -1
  37. package/dist/collapsible/parts.js +1 -1
  38. package/dist/context-menu/context-menu.d.ts +6 -1
  39. package/dist/context-menu/context-menu.d.ts.map +1 -1
  40. package/dist/context-menu/context-menu.js +4 -0
  41. package/dist/context-menu/context-menu.js.map +1 -1
  42. package/dist/context-menu/parts.js +1 -1
  43. package/dist/dialog/dialog.d.ts +14 -2
  44. package/dist/dialog/dialog.d.ts.map +1 -1
  45. package/dist/dialog/dialog.js +6 -0
  46. package/dist/dialog/dialog.js.map +1 -1
  47. package/dist/dialog/parts.js +1 -1
  48. package/dist/drawer/drawer.d.ts +12 -1
  49. package/dist/drawer/drawer.d.ts.map +1 -1
  50. package/dist/drawer/drawer.js +5 -0
  51. package/dist/drawer/drawer.js.map +1 -1
  52. package/dist/drawer/parts.d.ts +1 -1
  53. package/dist/drawer/parts.js +1 -1
  54. package/dist/index.css +1773 -1316
  55. package/dist/index.d.ts +29 -20
  56. package/dist/index.js +50 -37
  57. package/dist/input/input.d.ts +8 -0
  58. package/dist/input/input.d.ts.map +1 -1
  59. package/dist/input/input.js +6 -1
  60. package/dist/input/input.js.map +1 -1
  61. package/dist/menu/menu.css +3 -8
  62. package/dist/menu/menu.d.ts +12 -5
  63. package/dist/menu/menu.d.ts.map +1 -1
  64. package/dist/menu/menu.js +10 -24
  65. package/dist/menu/menu.js.map +1 -1
  66. package/dist/menu/menu.module.js +1 -1
  67. package/dist/menu/menu.module.js.map +1 -1
  68. package/dist/menu/menuitemshortcut.js +1 -1
  69. package/dist/menu/parts.js +1 -1
  70. package/dist/meter/circular-meter.d.ts +48 -0
  71. package/dist/meter/circular-meter.d.ts.map +1 -0
  72. package/dist/meter/circular-meter.js +86 -0
  73. package/dist/meter/circular-meter.js.map +1 -0
  74. package/dist/meter/index.d.ts +4 -0
  75. package/dist/meter/index.js +5 -0
  76. package/dist/meter/meter.css +152 -0
  77. package/dist/meter/meter.d.ts +58 -0
  78. package/dist/meter/meter.d.ts.map +1 -0
  79. package/dist/meter/meter.js +50 -0
  80. package/dist/meter/meter.js.map +1 -0
  81. package/dist/meter/meter.module.css.d.ts +2 -0
  82. package/dist/meter/meter.module.js +27 -0
  83. package/dist/meter/meter.module.js.map +1 -0
  84. package/dist/meter/meterState.js +18 -0
  85. package/dist/meter/meterState.js.map +1 -0
  86. package/dist/meter/parts.d.ts +31 -0
  87. package/dist/meter/parts.d.ts.map +1 -0
  88. package/dist/meter/parts.js +56 -0
  89. package/dist/meter/parts.js.map +1 -0
  90. package/dist/number-field/number-field.d.ts +17 -1
  91. package/dist/number-field/number-field.d.ts.map +1 -1
  92. package/dist/number-field/number-field.js +5 -1
  93. package/dist/number-field/number-field.js.map +1 -1
  94. package/dist/number-field/parts.js +1 -1
  95. package/dist/popover/index.d.ts +3 -0
  96. package/dist/popover/index.js +4 -0
  97. package/dist/popover/parts.d.ts +43 -0
  98. package/dist/popover/parts.d.ts.map +1 -0
  99. package/dist/popover/parts.js +96 -0
  100. package/dist/popover/parts.js.map +1 -0
  101. package/dist/popover/popover.css +173 -0
  102. package/dist/popover/popover.d.ts +49 -0
  103. package/dist/popover/popover.d.ts.map +1 -0
  104. package/dist/popover/popover.js +68 -0
  105. package/dist/popover/popover.js.map +1 -0
  106. package/dist/popover/popover.module.css.d.ts +2 -0
  107. package/dist/popover/popover.module.js +16 -0
  108. package/dist/popover/popover.module.js.map +1 -0
  109. package/dist/progress/parts.js +1 -1
  110. package/dist/progress/progress.d.ts +11 -0
  111. package/dist/progress/progress.d.ts.map +1 -1
  112. package/dist/progress/progress.js +5 -0
  113. package/dist/progress/progress.js.map +1 -1
  114. package/dist/radio/index.d.ts +3 -0
  115. package/dist/radio/index.js +4 -0
  116. package/dist/radio/parts.d.ts +18 -0
  117. package/dist/radio/parts.d.ts.map +1 -0
  118. package/dist/radio/parts.js +42 -0
  119. package/dist/radio/parts.js.map +1 -0
  120. package/dist/radio/radio.css +84 -0
  121. package/dist/radio/radio.d.ts +31 -0
  122. package/dist/radio/radio.d.ts.map +1 -0
  123. package/dist/radio/radio.js +33 -0
  124. package/dist/radio/radio.js.map +1 -0
  125. package/dist/radio/radio.module.css.d.ts +2 -0
  126. package/dist/radio/radio.module.js +11 -0
  127. package/dist/radio/radio.module.js.map +1 -0
  128. package/dist/radio-group/index.d.ts +3 -0
  129. package/dist/radio-group/index.js +4 -0
  130. package/dist/radio-group/parts.d.ts +13 -0
  131. package/dist/radio-group/parts.d.ts.map +1 -0
  132. package/dist/radio-group/parts.js +31 -0
  133. package/dist/radio-group/parts.js.map +1 -0
  134. package/dist/radio-group/radio-group.css +17 -0
  135. package/dist/radio-group/radio-group.d.ts +37 -0
  136. package/dist/radio-group/radio-group.d.ts.map +1 -0
  137. package/dist/radio-group/radio-group.js +28 -0
  138. package/dist/radio-group/radio-group.js.map +1 -0
  139. package/dist/radio-group/radio-group.module.css.d.ts +2 -0
  140. package/dist/radio-group/radio-group.module.js +9 -0
  141. package/dist/radio-group/radio-group.module.js.map +1 -0
  142. package/dist/select/parts.js +1 -1
  143. package/dist/select/select.d.ts +15 -2
  144. package/dist/select/select.d.ts.map +1 -1
  145. package/dist/select/select.js +5 -1
  146. package/dist/select/select.js.map +1 -1
  147. package/dist/separator/separator.d.ts +4 -0
  148. package/dist/separator/separator.d.ts.map +1 -1
  149. package/dist/separator/separator.js +5 -1
  150. package/dist/separator/separator.js.map +1 -1
  151. package/dist/shared/PopupArrow.js +22 -0
  152. package/dist/shared/PopupArrow.js.map +1 -0
  153. package/dist/slider/parts.js +1 -1
  154. package/dist/slider/slider.d.ts +19 -1
  155. package/dist/slider/slider.d.ts.map +1 -1
  156. package/dist/slider/slider.js +6 -0
  157. package/dist/slider/slider.js.map +1 -1
  158. package/dist/styles/tokens.css +21 -8
  159. package/dist/switch/parts.js +1 -1
  160. package/dist/switch/switch.css +11 -2
  161. package/dist/switch/switch.d.ts +13 -1
  162. package/dist/switch/switch.d.ts.map +1 -1
  163. package/dist/switch/switch.js +5 -1
  164. package/dist/switch/switch.js.map +1 -1
  165. package/dist/switch/switch.module.js.map +1 -1
  166. package/dist/tabs/parts.js +1 -1
  167. package/dist/tabs/tabs.d.ts +9 -2
  168. package/dist/tabs/tabs.d.ts.map +1 -1
  169. package/dist/tabs/tabs.js +4 -0
  170. package/dist/tabs/tabs.js.map +1 -1
  171. package/dist/toast/parts.js +1 -1
  172. package/dist/toast/toast.d.ts +12 -1
  173. package/dist/toast/toast.d.ts.map +1 -1
  174. package/dist/toast/toast.js +8 -0
  175. package/dist/toast/toast.js.map +1 -1
  176. package/dist/tokens.css +23 -11
  177. package/dist/tooltip/parts.js +1 -1
  178. package/dist/tooltip/tooltip.d.ts +10 -1
  179. package/dist/tooltip/tooltip.d.ts.map +1 -1
  180. package/dist/tooltip/tooltip.js +4 -0
  181. package/dist/tooltip/tooltip.js.map +1 -1
  182. package/package.json +23 -2
  183. package/src/accordion/accordion.tsx +14 -0
  184. package/src/alert-dialog/alert-dialog.tsx +11 -0
  185. package/src/badge/badge.tsx +6 -0
  186. package/src/button/button.module.css +29 -13
  187. package/src/button/button.tsx +19 -8
  188. package/src/card/card.tsx +10 -0
  189. package/src/checkbox/checkbox.tsx +13 -0
  190. package/src/collapsible/collapsible.tsx +11 -0
  191. package/src/context-menu/context-menu.tsx +5 -0
  192. package/src/dialog/dialog.tsx +13 -1
  193. package/src/drawer/drawer.tsx +11 -0
  194. package/src/index.ts +25 -233
  195. package/src/input/input.tsx +8 -0
  196. package/src/menu/menu.module.css +3 -10
  197. package/src/menu/menu.tsx +13 -26
  198. package/src/meter/circular-meter.tsx +114 -0
  199. package/src/meter/index.ts +9 -0
  200. package/src/meter/meter.module.css +162 -0
  201. package/src/meter/meter.tsx +86 -0
  202. package/src/meter/meterState.ts +29 -0
  203. package/src/meter/parts.tsx +72 -0
  204. package/src/number-field/number-field.tsx +16 -0
  205. package/src/popover/index.ts +14 -0
  206. package/src/popover/parts.tsx +120 -0
  207. package/src/popover/popover.module.css +189 -0
  208. package/src/popover/popover.tsx +80 -0
  209. package/src/progress/progress.tsx +11 -0
  210. package/src/radio/index.ts +6 -0
  211. package/src/radio/parts.tsx +43 -0
  212. package/src/radio/radio.module.css +96 -0
  213. package/src/radio/radio.tsx +37 -0
  214. package/src/radio-group/index.ts +5 -0
  215. package/src/radio-group/parts.tsx +32 -0
  216. package/src/radio-group/radio-group.module.css +17 -0
  217. package/src/radio-group/radio-group.tsx +63 -0
  218. package/src/select/select.tsx +14 -1
  219. package/src/separator/separator.tsx +4 -0
  220. package/src/shared/PopupArrow.tsx +41 -0
  221. package/src/slider/slider.tsx +18 -0
  222. package/src/styles/tokens.css +23 -11
  223. package/src/switch/switch.module.css +11 -2
  224. package/src/switch/switch.tsx +12 -0
  225. package/src/tabs/tabs.tsx +8 -1
  226. package/src/toast/toast.tsx +11 -0
  227. package/src/tooltip/tooltip.tsx +9 -0
package/src/index.ts CHANGED
@@ -2,236 +2,28 @@
2
2
  import "./styles/tokens.css";
3
3
  import "./styles/reset.css";
4
4
 
5
- // ─── AlertDialog ─────────────────────────────────────────────────────
6
- export { AlertDialog, AlertDialogBackdrop, AlertDialogPopup, AlertDialogTitle, AlertDialogDescription } from "./alert-dialog";
7
- export type {
8
- AlertDialogProps,
9
- AlertAction,
10
- AlertDialogBackdropProps,
11
- AlertDialogPopupProps,
12
- AlertDialogTitleProps,
13
- AlertDialogDescriptionProps,
14
- } from "./alert-dialog";
15
-
16
- // ─── ContextMenu ─────────────────────────────────────────────────────
17
- export {
18
- ContextMenu,
19
- ContextMenuPopup,
20
- ContextMenuItem,
21
- ContextMenuSeparator,
22
- ContextMenuGroup,
23
- ContextMenuGroupLabel,
24
- } from "./context-menu";
25
- export type {
26
- ContextMenuProps,
27
- ContextMenuEntry,
28
- ContextMenuItemDef,
29
- ContextMenuSeparatorDef,
30
- ContextMenuGroupDef,
31
- ContextMenuPopupProps,
32
- ContextMenuItemProps,
33
- ContextMenuSeparatorProps,
34
- ContextMenuGroupProps,
35
- ContextMenuGroupLabelProps,
36
- } from "./context-menu";
37
-
38
- // ─── Button ──────────────────────────────────────────────────────────
39
- export { Button } from "./button";
40
- export type { ButtonProps, ButtonVariant, ButtonSize } from "./button";
41
-
42
- // ─── Badge ───────────────────────────────────────────────────────────
43
- export { Badge } from "./badge";
44
- export type { BadgeProps, BadgeVariant } from "./badge";
45
-
46
- // ─── Card ────────────────────────────────────────────────────────────
47
- export { Card, CardHeader, CardBody, CardFooter } from "./card";
48
- export type { CardProps, CardHeaderProps } from "./card";
49
-
50
- // ─── Input ───────────────────────────────────────────────────────────
51
- export { Input } from "./input";
52
- export type { InputProps, InputSize } from "./input";
53
-
54
- // ─── Checkbox ────────────────────────────────────────────────────────
55
- export { Checkbox, CheckboxRoot, CheckboxIndicator } from "./checkbox";
56
- export type { CheckboxProps, CheckboxRootProps, CheckboxIndicatorProps } from "./checkbox";
57
-
58
- // ─── Switch ──────────────────────────────────────────────────────────
59
- export { Switch, SwitchRoot, SwitchThumb } from "./switch";
60
- export type { SwitchProps, SwitchRootProps, SwitchThumbProps } from "./switch";
61
-
62
- // ─── Select ──────────────────────────────────────────────────────────
63
- export {
64
- Select,
65
- SelectTrigger,
66
- SelectValue,
67
- SelectPositioner,
68
- SelectPopup,
69
- SelectList,
70
- SelectItem,
71
- SelectItemText,
72
- SelectItemIndicator,
73
- SelectGroupContainer,
74
- SelectGroupLabel,
75
- SelectSeparator,
76
- } from "./select";
77
- export type {
78
- SelectProps,
79
- SelectOption,
80
- SelectGroup,
81
- SelectTriggerProps,
82
- SelectValueProps,
83
- SelectPositionerProps,
84
- SelectPopupProps,
85
- SelectListProps,
86
- SelectItemProps,
87
- SelectItemTextProps,
88
- SelectItemIndicatorProps,
89
- SelectGroupProps,
90
- SelectGroupLabelProps,
91
- SelectSeparatorProps,
92
- } from "./select";
93
-
94
- // ─── Dialog ──────────────────────────────────────────────────────────
95
- export { Dialog, DialogBackdrop, DialogViewport, DialogPopup, DialogTitle, DialogDescription, DialogClose } from "./dialog";
96
- export type {
97
- DialogProps,
98
- DialogBackdropProps,
99
- DialogViewportProps,
100
- DialogPopupProps,
101
- DialogTitleProps,
102
- DialogDescriptionProps,
103
- DialogCloseProps,
104
- } from "./dialog";
105
-
106
- // ─── Tooltip ─────────────────────────────────────────────────────────
107
- export { Tooltip, TooltipPositioner, TooltipPopup, TooltipArrow } from "./tooltip";
108
- export type { TooltipProps, TooltipPositionerProps, TooltipPopupProps, TooltipArrowProps } from "./tooltip";
109
-
110
- // ─── Tabs ────────────────────────────────────────────────────────────
111
- export { Tabs, TabsList, TabsTab, TabsPanel } from "./tabs";
112
- export type { TabsProps, TabItem, TabsListProps, TabsTabProps, TabsPanelProps } from "./tabs";
113
-
114
- // ─── Accordion ───────────────────────────────────────────────────────
115
- export { Accordion, AccordionItemPart, AccordionHeader, AccordionTrigger, AccordionPanel } from "./accordion";
116
- export type {
117
- AccordionProps,
118
- AccordionItem,
119
- AccordionItemProps,
120
- AccordionHeaderProps,
121
- AccordionTriggerProps,
122
- AccordionPanelProps,
123
- } from "./accordion";
124
-
125
- // ─── Progress ────────────────────────────────────────────────────────
126
- export { Progress, ProgressTrack, ProgressIndicator } from "./progress";
127
- export type { ProgressProps, ProgressStatus, ProgressSize, ProgressTrackProps, ProgressIndicatorProps } from "./progress";
128
-
129
- // ─── Toast ───────────────────────────────────────────────────────────
130
- export { ToastViewport, useToastManager, ToastRoot, ToastTitle, ToastDescription, ToastClose, ToastViewportPart } from "./toast";
131
- export type { ToastType, ToastRootProps, ToastTitleProps, ToastDescriptionProps, ToastCloseProps, ToastViewportPartProps } from "./toast";
132
-
133
- // ─── Drawer ──────────────────────────────────────────────────────────
134
- export {
135
- Drawer,
136
- DrawerBackdrop,
137
- DrawerViewport,
138
- DrawerPopup,
139
- DrawerContent,
140
- DrawerTitle,
141
- DrawerDescription,
142
- DrawerClose,
143
- DrawerHandleBar,
144
- DrawerFooter,
145
- } from "./drawer";
146
- export type {
147
- DrawerProps,
148
- DrawerSide,
149
- DrawerBackdropProps,
150
- DrawerViewportProps,
151
- DrawerPopupProps,
152
- DrawerContentProps,
153
- DrawerTitleProps,
154
- DrawerDescriptionProps,
155
- DrawerCloseProps,
156
- } from "./drawer";
157
-
158
- // ─── Separator ───────────────────────────────────────────────────────
159
- export { Separator } from "./separator";
160
- export type { SeparatorProps } from "./separator";
161
-
162
- // ─── Slider ──────────────────────────────────────────────────────────
163
- export { Slider, SliderControl, SliderTrack, SliderIndicator, SliderThumb, SliderLabel, SliderValue } from "./slider";
164
- export type {
165
- SliderProps,
166
- SliderControlProps,
167
- SliderTrackProps,
168
- SliderIndicatorProps,
169
- SliderThumbProps,
170
- SliderLabelProps,
171
- SliderValueProps,
172
- } from "./slider";
173
-
174
- // ─── Collapsible ─────────────────────────────────────────────────────
175
- export { Collapsible, CollapsibleRoot, CollapsibleTrigger, CollapsiblePanel } from "./collapsible";
176
- export type { CollapsibleProps, CollapsibleRootProps, CollapsibleTriggerProps, CollapsiblePanelProps } from "./collapsible";
177
-
178
- // ─── NumberField ─────────────────────────────────────────────────────
179
- export {
180
- NumberField,
181
- NumberFieldGroup,
182
- NumberFieldInput,
183
- NumberFieldDecrement,
184
- NumberFieldIncrement,
185
- NumberFieldScrubArea,
186
- NumberFieldScrubAreaCursor,
187
- } from "./number-field";
188
- export type {
189
- NumberFieldProps,
190
- NumberFieldGroupProps,
191
- NumberFieldInputProps,
192
- NumberFieldDecrementProps,
193
- NumberFieldIncrementProps,
194
- NumberFieldScrubAreaProps,
195
- NumberFieldScrubAreaCursorProps,
196
- } from "./number-field";
197
-
198
- // ─── Menu ────────────────────────────────────────────────────────────
199
- export { Menu, MenuPositioner, MenuPopup, MenuItem, MenuSeparator, MenuGroupLabel, MenuArrow, MenuItemShortcut } from "./menu";
200
- export type {
201
- MenuProps,
202
- MenuEntry,
203
- MenuItemDef,
204
- MenuSeparatorDef,
205
- MenuGroupDef,
206
- MenuPositionerProps,
207
- MenuPopupProps,
208
- MenuItemProps,
209
- MenuSeparatorProps,
210
- MenuGroupLabelProps,
211
- MenuArrowProps,
212
- MenuItemShortcutProps,
213
- } from "./menu";
214
-
215
- // ─── CSS module class name maps ───────────────────────────────────────
216
- // Import these to reference the hashed class names in custom CSS or tests.
217
- export { AlertDialogStyles } from "./alert-dialog";
218
- export { ContextMenuStyles } from "./context-menu";
219
- export { AccordionStyles } from "./accordion";
220
- export { BadgeStyles } from "./badge";
221
- export { ButtonStyles } from "./button";
222
- export { CardStyles } from "./card";
223
- export { CheckboxStyles } from "./checkbox";
224
- export { CollapsibleStyles } from "./collapsible";
225
- export { DialogStyles } from "./dialog";
226
- export { DrawerStyles } from "./drawer";
227
- export { InputStyles } from "./input";
228
- export { MenuStyles } from "./menu";
229
- export { NumberFieldStyles } from "./number-field";
230
- export { ProgressStyles } from "./progress";
231
- export { SelectStyles } from "./select";
232
- export { SeparatorStyles } from "./separator";
233
- export { SliderStyles } from "./slider";
234
- export { SwitchStyles } from "./switch";
235
- export { TabsStyles } from "./tabs";
236
- export { ToastStyles } from "./toast";
237
- export { TooltipStyles } from "./tooltip";
5
+ export * from "./accordion";
6
+ export * from "./alert-dialog";
7
+ export * from "./badge";
8
+ export * from "./button";
9
+ export * from "./card";
10
+ export * from "./checkbox";
11
+ export * from "./collapsible";
12
+ export * from "./context-menu";
13
+ export * from "./dialog";
14
+ export * from "./drawer";
15
+ export * from "./input";
16
+ export * from "./menu";
17
+ export * from "./meter";
18
+ export * from "./number-field";
19
+ export * from "./popover";
20
+ export * from "./progress";
21
+ export * from "./radio";
22
+ export * from "./radio-group";
23
+ export * from "./select";
24
+ export * from "./separator";
25
+ export * from "./slider";
26
+ export * from "./switch";
27
+ export * from "./tabs";
28
+ export * from "./toast";
29
+ export * from "./tooltip";
@@ -9,11 +9,19 @@ export type InputSize = "sm" | "md" | "lg";
9
9
  export interface InputProps extends Omit<ComponentPropsWithoutRef<"input">, "size"> {
10
10
  /** Visual size. Maps to height + font-size design tokens. Default: `"md"`. */
11
11
  size?: InputSize;
12
+ /** Icon or element rendered before the input text. */
12
13
  leftAdornment?: ReactNode;
14
+ /** Icon or element rendered after the input text. */
13
15
  rightAdornment?: ReactNode;
16
+ /** Applies error styling and sets `aria-invalid`. */
14
17
  invalid?: boolean;
15
18
  }
16
19
 
20
+ /**
21
+ * Text input with optional left and right adornment slots. Extends the
22
+ * native `<input>` API — replaces the numeric `size` attribute with a
23
+ * token-based size prop.
24
+ */
17
25
  export const Input = forwardRef<HTMLInputElement, InputProps>(function Input(
18
26
  { size = "md", leftAdornment, rightAdornment, invalid, className, ...props },
19
27
  ref,
@@ -14,8 +14,8 @@
14
14
  font-family: var(--font-mono);
15
15
  font-size: var(--font-size-sm);
16
16
  min-width: 200px;
17
- transform-origin: var(--transform-origin);
18
17
  outline: none;
18
+ transition: opacity 150ms var(--easing-ease-out);
19
19
  }
20
20
  @supports (backdrop-filter: blur(12px)) {
21
21
  .popup {
@@ -25,17 +25,10 @@
25
25
  }
26
26
  .popup[data-starting-style] {
27
27
  opacity: 0;
28
- transform: scale(0.95);
29
- transition:
30
- opacity 150ms var(--easing-ease-out),
31
- transform 150ms var(--easing-ease-out);
32
28
  }
33
29
  .popup[data-ending-style] {
34
30
  opacity: 0;
35
- transform: scale(0.98);
36
- transition:
37
- opacity 75ms var(--easing-ease-in),
38
- transform 75ms var(--easing-ease-in);
31
+ transition: opacity 75ms var(--easing-ease-in);
39
32
  }
40
33
  /* ─── Item ───────────────────────────────────────────────────────── */
41
34
  .item {
@@ -136,7 +129,7 @@
136
129
  .arrow-fill {
137
130
  fill: var(--color-overlay);
138
131
  }
139
- .arrow-stroke {
132
+ .arrow-seam {
140
133
  fill: var(--color-line);
141
134
  }
142
135
  }
package/src/menu/menu.tsx CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { ReactNode, ReactElement } from "react";
2
2
  import { Menu as BaseMenu } from "@base-ui/react/menu";
3
3
  import styles from "./menu.module.css";
4
+ import { PopupArrow } from "../shared/PopupArrow";
4
5
 
5
6
  // ─── Types ──────────────────────────────────────────────────────────────────
6
7
 
@@ -28,40 +29,21 @@ export type MenuEntry = MenuItemDef | MenuSeparatorDef | MenuGroupDef;
28
29
  export interface MenuProps {
29
30
  /** The button/element that opens the menu. */
30
31
  trigger: ReactElement;
32
+ /** Array of menu entries: items, separators, and groups. */
31
33
  items: MenuEntry[];
32
- /** @default "bottom" */
34
+ /** Which edge of the trigger the menu appears on. @default "bottom" */
33
35
  side?: "top" | "bottom" | "left" | "right";
34
- /** @default "start" */
36
+ /** Alignment along the side axis. @default "start" */
35
37
  align?: "start" | "center" | "end";
36
- /** @default 4 */
38
+ /** Gap between the trigger and the menu popup in pixels. @default 4 */
37
39
  sideOffset?: number;
38
- /** controlled open state */
40
+ /** Controlled open state. */
39
41
  open?: boolean;
42
+ /** Called when the menu opens or closes. */
40
43
  onOpenChange?: (open: boolean) => void;
41
44
  className?: string;
42
45
  }
43
46
 
44
- // ─── Arrow SVG ─────────────────────────────────────────────────────────────
45
-
46
- function ArrowSvg() {
47
- return (
48
- <svg width="20" height="10" viewBox="0 0 20 10" fill="none" aria-hidden>
49
- <path
50
- d="M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z"
51
- className={styles["arrow-fill"]}
52
- />
53
- <path
54
- d="M8.99542 1.85876C9.75604 1.17425 10.9106 1.17422 11.6713 1.85878L16.5281 6.22989C17.0789 6.72568 17.7938 7.00001 18.5349 7.00001L15.89 7L11.0023 2.60207C10.622 2.2598 10.0447 2.2598 9.66436 2.60207L4.77734 7L2.13171 7.00001C2.87284 7.00001 3.58774 6.72568 4.13861 6.22989L8.99542 1.85876Z"
55
- className={styles["arrow-stroke"]}
56
- />
57
- <path
58
- d="M10.3333 3.34539L5.47654 7.71648C4.55842 8.54279 3.36693 9 2.13172 9H0V8H2.13172C3.11989 8 4.07308 7.63423 4.80758 6.97318L9.66437 2.60207C10.0447 2.25979 10.622 2.2598 11.0023 2.60207L15.8591 6.97318C16.5936 7.63423 17.5468 8 18.5349 8H20V9H18.5349C17.2998 9 16.1083 8.54278 15.1901 7.71648L10.3333 3.34539Z"
59
- className={styles["arrow-stroke"]}
60
- />
61
- </svg>
62
- );
63
- }
64
-
65
47
  // ─── Item renderer ──────────────────────────────────────────────────────────
66
48
 
67
49
  function renderEntry(entry: MenuEntry, index: number): ReactNode {
@@ -88,6 +70,11 @@ function renderEntry(entry: MenuEntry, index: number): ReactNode {
88
70
 
89
71
  // ─── High-level Menu ────────────────────────────────────────────────────────
90
72
 
73
+ /**
74
+ * A dropdown list of actions with full keyboard navigation. Supports
75
+ * separators, groups, and keyboard shortcuts. Items can be disabled
76
+ * individually.
77
+ */
91
78
  export function Menu({ trigger, items, side = "bottom", align = "start", sideOffset = 4, className, onOpenChange, ...props }: MenuProps) {
92
79
  return (
93
80
  <BaseMenu.Root onOpenChange={onOpenChange as never} {...props}>
@@ -96,7 +83,7 @@ export function Menu({ trigger, items, side = "bottom", align = "start", sideOff
96
83
  <BaseMenu.Positioner className={`${styles.positioner} ${className ?? ""}`} side={side} align={align} sideOffset={sideOffset}>
97
84
  <BaseMenu.Popup className={styles.popup}>
98
85
  <BaseMenu.Arrow className={styles.arrow}>
99
- <ArrowSvg />
86
+ <PopupArrow fillClass={styles["arrow-fill"]!} seamClass={styles["arrow-seam"]!} />
100
87
  </BaseMenu.Arrow>
101
88
  {items.map((entry, i) => renderEntry(entry, i))}
102
89
  </BaseMenu.Popup>
@@ -0,0 +1,114 @@
1
+ import type { ReactNode } from "react";
2
+ import { Meter as BaseMeter } from "@base-ui/react/meter";
3
+ import styles from "./meter.module.css";
4
+ import { getMeterState } from "./meterState";
5
+
6
+ export type CircularMeterSize = "sm" | "md" | "lg";
7
+
8
+ export interface CircularMeterProps {
9
+ /** Current value. Must be between `min` and `max`. */
10
+ value: number;
11
+ /** @default 0 */
12
+ min?: number;
13
+ /** @default 100 */
14
+ max?: number;
15
+ /** Upper boundary of the low zone. Values ≤ this are "low". */
16
+ low?: number;
17
+ /** Lower boundary of the high zone. Values ≥ this are "high". */
18
+ high?: number;
19
+ /**
20
+ * Which zone is optimal — determines stroke colour:
21
+ * - `"high"` (default) → high=green, mid=amber, low=red (battery, signal)
22
+ * - `"low"` → low=green, mid=amber, high=red (CPU load, disk)
23
+ * - `"mid"` → mid=green, low/high=amber (temperature)
24
+ */
25
+ optimum?: "low" | "mid" | "high";
26
+ /** Accessible + visible label shown below the value inside the circle. */
27
+ label?: ReactNode;
28
+ /** Show the formatted value inside the circle. @default false */
29
+ showValue?: boolean;
30
+ /** `Intl.NumberFormatOptions` for value formatting. */
31
+ format?: Intl.NumberFormatOptions;
32
+ size?: CircularMeterSize;
33
+ className?: string;
34
+ }
35
+
36
+ const SIZES: Record<CircularMeterSize, { diameter: number; strokeWidth: number }> = {
37
+ sm: { diameter: 56, strokeWidth: 5 },
38
+ md: { diameter: 80, strokeWidth: 7 },
39
+ lg: { diameter: 112, strokeWidth: 9 },
40
+ };
41
+
42
+ export function CircularMeter({
43
+ value,
44
+ min = 0,
45
+ max = 100,
46
+ low,
47
+ high,
48
+ optimum = "high",
49
+ label,
50
+ showValue = false,
51
+ format,
52
+ size = "md",
53
+ className = "",
54
+ }: CircularMeterProps) {
55
+ const clampedValue = Math.min(Math.max(value, min), max);
56
+ const state = getMeterState(clampedValue, min, max, low, high, optimum);
57
+
58
+ const { diameter, strokeWidth } = SIZES[size];
59
+ const radius = (diameter - strokeWidth) / 2;
60
+ const circumference = 2 * Math.PI * radius;
61
+ const dashOffset = circumference * (1 - (clampedValue - min) / (max - min));
62
+ const center = diameter / 2;
63
+
64
+ return (
65
+ <BaseMeter.Root
66
+ value={clampedValue}
67
+ min={min}
68
+ max={max}
69
+ {...(format !== undefined && { format })}
70
+ className={`${styles["circular-root"]} ${styles[`circular-${size}`]} ${className}`}
71
+ >
72
+ <div style={{ position: "relative", width: diameter, height: diameter }}>
73
+ <svg
74
+ width={diameter}
75
+ height={diameter}
76
+ viewBox={`0 0 ${diameter} ${diameter}`}
77
+ className={styles["circular-svg"]}
78
+ aria-hidden="true"
79
+ >
80
+ {/* Background track ring */}
81
+ <circle cx={center} cy={center} r={radius} strokeWidth={strokeWidth} className={styles["circular-track"]} />
82
+ {/* Value arc — origin at 12 o'clock */}
83
+ <circle
84
+ cx={center}
85
+ cy={center}
86
+ r={radius}
87
+ strokeWidth={strokeWidth}
88
+ strokeDasharray={circumference}
89
+ strokeDashoffset={dashOffset}
90
+ className={styles["circular-indicator"]}
91
+ data-meter-state={state}
92
+ style={{ transform: "rotate(-90deg)", transformOrigin: "center" }}
93
+ />
94
+ </svg>
95
+
96
+ {(showValue || label != null) && (
97
+ <div
98
+ style={{
99
+ position: "absolute",
100
+ inset: 0,
101
+ display: "flex",
102
+ flexDirection: "column",
103
+ alignItems: "center",
104
+ justifyContent: "center",
105
+ }}
106
+ >
107
+ {showValue && <BaseMeter.Value className={styles["circular-value"]} />}
108
+ {label != null && <BaseMeter.Label className={styles["circular-label"]}>{label}</BaseMeter.Label>}
109
+ </div>
110
+ )}
111
+ </div>
112
+ </BaseMeter.Root>
113
+ );
114
+ }
@@ -0,0 +1,9 @@
1
+ export { Meter } from "./meter";
2
+ export type { MeterProps, MeterSize } from "./meter";
3
+ export { MeterStyles } from "./meter";
4
+
5
+ export { CircularMeter } from "./circular-meter";
6
+ export type { CircularMeterProps, CircularMeterSize } from "./circular-meter";
7
+
8
+ export { MeterTrack, MeterIndicator, MeterLabel, MeterValue } from "./parts";
9
+ export type { MeterTrackProps, MeterIndicatorProps, MeterLabelProps, MeterValueProps } from "./parts";
@@ -0,0 +1,162 @@
1
+ @layer components {
2
+ .root {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--space-1-5);
6
+ width: 100%;
7
+ }
8
+
9
+ /* ── Label row ──────────────────────────────────────────────────── */
10
+
11
+ .label-row {
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ font-family: var(--font-mono);
16
+ font-size: var(--font-size-xs);
17
+ color: var(--color-secondary);
18
+ }
19
+
20
+ .label {
21
+ font-family: var(--font-mono);
22
+ font-size: var(--font-size-xs);
23
+ color: var(--color-secondary);
24
+ }
25
+
26
+ .value {
27
+ font-family: var(--font-mono);
28
+ font-size: var(--font-size-xs);
29
+ color: var(--color-secondary);
30
+ }
31
+
32
+ /* ── Track (the outer bar) ──────────────────────────────────────── */
33
+
34
+ .track {
35
+ position: relative;
36
+ width: 100%;
37
+ background-color: var(--color-surface-3);
38
+ border-radius: var(--radius-full);
39
+ overflow: hidden;
40
+ }
41
+
42
+ .track-sm {
43
+ height: 4px;
44
+ }
45
+ .track-md {
46
+ height: 6px;
47
+ }
48
+ .track-lg {
49
+ height: 8px;
50
+ }
51
+
52
+ /* ── Indicator (the fill) ───────────────────────────────────────── */
53
+
54
+ .indicator {
55
+ height: 100%;
56
+ border-radius: var(--radius-full);
57
+ background-color: var(--color-accent);
58
+ transition: width var(--duration-slower) var(--easing-standard);
59
+ }
60
+
61
+ /* Threshold-based colours — driven by data attributes set in JS */
62
+ .indicator[data-meter-state="optimum"] {
63
+ background-color: var(--color-success-solid);
64
+ }
65
+ .indicator[data-meter-state="suboptimal"] {
66
+ background-color: var(--color-warning-solid);
67
+ }
68
+ .indicator[data-meter-state="critical"] {
69
+ background-color: var(--color-error-solid);
70
+ }
71
+
72
+ /* ── Tick marks for low / high thresholds ───────────────────────── */
73
+
74
+ .tick {
75
+ position: absolute;
76
+ top: 0;
77
+ bottom: 0;
78
+ width: 1px;
79
+ background-color: var(--color-canvas);
80
+ opacity: 0.6;
81
+ pointer-events: none;
82
+ }
83
+
84
+ /* ── Circular gauge ─────────────────────────────────────────────── */
85
+
86
+ .circular-root {
87
+ display: inline-flex;
88
+ flex-direction: column;
89
+ align-items: center;
90
+ gap: var(--space-1-5);
91
+ }
92
+
93
+ .circular-svg {
94
+ overflow: visible;
95
+ }
96
+
97
+ /* Track ring */
98
+ .circular-track {
99
+ fill: none;
100
+ stroke: var(--color-surface-3);
101
+ }
102
+
103
+ /* Value arc */
104
+ .circular-indicator {
105
+ fill: none;
106
+ stroke: var(--color-accent);
107
+ stroke-linecap: round;
108
+ transition: stroke-dashoffset var(--duration-slower) var(--easing-standard);
109
+ }
110
+
111
+ .circular-indicator[data-meter-state="optimum"] {
112
+ stroke: var(--color-success-solid);
113
+ }
114
+ .circular-indicator[data-meter-state="suboptimal"] {
115
+ stroke: var(--color-warning-solid);
116
+ }
117
+ .circular-indicator[data-meter-state="critical"] {
118
+ stroke: var(--color-error-solid);
119
+ }
120
+
121
+ /* Centre text stack */
122
+ .circular-center {
123
+ display: flex;
124
+ flex-direction: column;
125
+ align-items: center;
126
+ justify-content: center;
127
+ gap: var(--space-0-5);
128
+ }
129
+
130
+ .circular-value {
131
+ font-family: var(--font-mono);
132
+ font-weight: var(--font-weight-semibold);
133
+ color: var(--color-primary);
134
+ line-height: 1;
135
+ }
136
+
137
+ .circular-label {
138
+ font-family: var(--font-mono);
139
+ color: var(--color-secondary);
140
+ line-height: 1;
141
+ }
142
+
143
+ /* Size variants */
144
+ .circular-sm .circular-value {
145
+ font-size: var(--font-size-sm);
146
+ }
147
+ .circular-sm .circular-label {
148
+ font-size: var(--font-size-xs);
149
+ }
150
+ .circular-md .circular-value {
151
+ font-size: var(--font-size-xl);
152
+ }
153
+ .circular-md .circular-label {
154
+ font-size: var(--font-size-xs);
155
+ }
156
+ .circular-lg .circular-value {
157
+ font-size: var(--font-size-2xl);
158
+ }
159
+ .circular-lg .circular-label {
160
+ font-size: var(--font-size-sm);
161
+ }
162
+ }