@duestel/ui 0.1.0

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 (226) hide show
  1. package/README.md +110 -0
  2. package/dist/components/accordion/Accordion.d.ts +34 -0
  3. package/dist/components/accordion/Accordion.js +54 -0
  4. package/dist/components/accordion/Accordion.js.map +1 -0
  5. package/dist/components/accordion/index.d.ts +1 -0
  6. package/dist/components/accordion/index.js +2 -0
  7. package/dist/components/alert-dialog/AlertDialog.d.ts +53 -0
  8. package/dist/components/alert-dialog/AlertDialog.js +69 -0
  9. package/dist/components/alert-dialog/AlertDialog.js.map +1 -0
  10. package/dist/components/alert-dialog/index.d.ts +1 -0
  11. package/dist/components/alert-dialog/index.js +2 -0
  12. package/dist/components/autocomplete/Autocomplete.d.ts +90 -0
  13. package/dist/components/autocomplete/Autocomplete.js +137 -0
  14. package/dist/components/autocomplete/Autocomplete.js.map +1 -0
  15. package/dist/components/autocomplete/index.d.ts +1 -0
  16. package/dist/components/autocomplete/index.js +2 -0
  17. package/dist/components/avatar/Avatar.d.ts +44 -0
  18. package/dist/components/avatar/Avatar.js +45 -0
  19. package/dist/components/avatar/Avatar.js.map +1 -0
  20. package/dist/components/avatar/index.d.ts +2 -0
  21. package/dist/components/avatar/index.js +2 -0
  22. package/dist/components/badge/Badge.d.ts +43 -0
  23. package/dist/components/badge/Badge.js +32 -0
  24. package/dist/components/badge/Badge.js.map +1 -0
  25. package/dist/components/badge/index.d.ts +2 -0
  26. package/dist/components/badge/index.js +2 -0
  27. package/dist/components/button/Button.d.ts +60 -0
  28. package/dist/components/button/Button.js +61 -0
  29. package/dist/components/button/Button.js.map +1 -0
  30. package/dist/components/button/index.d.ts +1 -0
  31. package/dist/components/button/index.js +2 -0
  32. package/dist/components/carousel/Carousel.d.ts +32 -0
  33. package/dist/components/carousel/Carousel.js +113 -0
  34. package/dist/components/carousel/Carousel.js.map +1 -0
  35. package/dist/components/carousel/index.d.ts +1 -0
  36. package/dist/components/carousel/index.js +2 -0
  37. package/dist/components/checkbox/Checkbox.d.ts +64 -0
  38. package/dist/components/checkbox/Checkbox.js +59 -0
  39. package/dist/components/checkbox/Checkbox.js.map +1 -0
  40. package/dist/components/checkbox/index.d.ts +1 -0
  41. package/dist/components/checkbox/index.js +2 -0
  42. package/dist/components/collapsible/Collapsible.d.ts +28 -0
  43. package/dist/components/collapsible/Collapsible.js +40 -0
  44. package/dist/components/collapsible/Collapsible.js.map +1 -0
  45. package/dist/components/collapsible/index.d.ts +1 -0
  46. package/dist/components/collapsible/index.js +2 -0
  47. package/dist/components/combobox/Combobox.d.ts +113 -0
  48. package/dist/components/combobox/Combobox.js +189 -0
  49. package/dist/components/combobox/Combobox.js.map +1 -0
  50. package/dist/components/combobox/index.d.ts +1 -0
  51. package/dist/components/combobox/index.js +2 -0
  52. package/dist/components/command/Command.d.ts +37 -0
  53. package/dist/components/command/Command.js +90 -0
  54. package/dist/components/command/Command.js.map +1 -0
  55. package/dist/components/command/index.d.ts +1 -0
  56. package/dist/components/command/index.js +2 -0
  57. package/dist/components/context-menu/ContextMenu.d.ts +76 -0
  58. package/dist/components/context-menu/ContextMenu.js +132 -0
  59. package/dist/components/context-menu/ContextMenu.js.map +1 -0
  60. package/dist/components/context-menu/index.d.ts +1 -0
  61. package/dist/components/context-menu/index.js +2 -0
  62. package/dist/components/data-table/DataTable.d.ts +32 -0
  63. package/dist/components/data-table/DataTable.js +102 -0
  64. package/dist/components/data-table/DataTable.js.map +1 -0
  65. package/dist/components/data-table/Table.d.ts +51 -0
  66. package/dist/components/data-table/Table.js +69 -0
  67. package/dist/components/data-table/Table.js.map +1 -0
  68. package/dist/components/data-table/index.d.ts +3 -0
  69. package/dist/components/data-table/index.js +3 -0
  70. package/dist/components/date-picker/DatePicker.d.ts +63 -0
  71. package/dist/components/date-picker/DatePicker.js +247 -0
  72. package/dist/components/date-picker/DatePicker.js.map +1 -0
  73. package/dist/components/date-picker/index.d.ts +2 -0
  74. package/dist/components/date-picker/index.js +2 -0
  75. package/dist/components/dialog/Dialog.d.ts +59 -0
  76. package/dist/components/dialog/Dialog.js +71 -0
  77. package/dist/components/dialog/Dialog.js.map +1 -0
  78. package/dist/components/dialog/index.d.ts +1 -0
  79. package/dist/components/dialog/index.js +2 -0
  80. package/dist/components/drawer/Drawer.d.ts +93 -0
  81. package/dist/components/drawer/Drawer.js +106 -0
  82. package/dist/components/drawer/Drawer.js.map +1 -0
  83. package/dist/components/drawer/index.d.ts +1 -0
  84. package/dist/components/drawer/index.js +2 -0
  85. package/dist/components/form/Field.d.ts +52 -0
  86. package/dist/components/form/Field.js +54 -0
  87. package/dist/components/form/Field.js.map +1 -0
  88. package/dist/components/form/Fieldset.d.ts +24 -0
  89. package/dist/components/form/Fieldset.js +24 -0
  90. package/dist/components/form/Fieldset.js.map +1 -0
  91. package/dist/components/form/Form.d.ts +18 -0
  92. package/dist/components/form/Form.js +14 -0
  93. package/dist/components/form/Form.js.map +1 -0
  94. package/dist/components/form/Input.d.ts +33 -0
  95. package/dist/components/form/Input.js +99 -0
  96. package/dist/components/form/Input.js.map +1 -0
  97. package/dist/components/form/app-form.d.ts +71 -0
  98. package/dist/components/form/app-form.js +95 -0
  99. package/dist/components/form/app-form.js.map +1 -0
  100. package/dist/components/form/index.d.ts +5 -0
  101. package/dist/components/form/index.js +6 -0
  102. package/dist/components/hotkeys/Kbd.d.ts +20 -0
  103. package/dist/components/hotkeys/Kbd.js +31 -0
  104. package/dist/components/hotkeys/Kbd.js.map +1 -0
  105. package/dist/components/hotkeys/hotkeys.d.ts +14 -0
  106. package/dist/components/hotkeys/hotkeys.js +2 -0
  107. package/dist/components/hotkeys/index.d.ts +2 -0
  108. package/dist/components/hotkeys/index.js +3 -0
  109. package/dist/components/menu/Menu.d.ts +84 -0
  110. package/dist/components/menu/Menu.js +142 -0
  111. package/dist/components/menu/Menu.js.map +1 -0
  112. package/dist/components/menu/index.d.ts +1 -0
  113. package/dist/components/menu/index.js +2 -0
  114. package/dist/components/menubar/Menubar.d.ts +87 -0
  115. package/dist/components/menubar/Menubar.js +142 -0
  116. package/dist/components/menubar/Menubar.js.map +1 -0
  117. package/dist/components/menubar/index.d.ts +1 -0
  118. package/dist/components/menubar/index.js +2 -0
  119. package/dist/components/meter/Meter.d.ts +33 -0
  120. package/dist/components/meter/Meter.js +45 -0
  121. package/dist/components/meter/Meter.js.map +1 -0
  122. package/dist/components/meter/index.d.ts +1 -0
  123. package/dist/components/meter/index.js +2 -0
  124. package/dist/components/navigation-menu/NavigationMenu.d.ts +81 -0
  125. package/dist/components/navigation-menu/NavigationMenu.js +112 -0
  126. package/dist/components/navigation-menu/NavigationMenu.js.map +1 -0
  127. package/dist/components/navigation-menu/index.d.ts +1 -0
  128. package/dist/components/navigation-menu/index.js +2 -0
  129. package/dist/components/number-field/NumberField.d.ts +53 -0
  130. package/dist/components/number-field/NumberField.js +72 -0
  131. package/dist/components/number-field/NumberField.js.map +1 -0
  132. package/dist/components/number-field/index.d.ts +1 -0
  133. package/dist/components/number-field/index.js +2 -0
  134. package/dist/components/otp-field/OtpField.d.ts +33 -0
  135. package/dist/components/otp-field/OtpField.js +31 -0
  136. package/dist/components/otp-field/OtpField.js.map +1 -0
  137. package/dist/components/otp-field/index.d.ts +1 -0
  138. package/dist/components/otp-field/index.js +2 -0
  139. package/dist/components/pagination/Pagination.d.ts +17 -0
  140. package/dist/components/pagination/Pagination.js +75 -0
  141. package/dist/components/pagination/Pagination.js.map +1 -0
  142. package/dist/components/pagination/index.d.ts +1 -0
  143. package/dist/components/pagination/index.js +2 -0
  144. package/dist/components/popover/Popover.d.ts +73 -0
  145. package/dist/components/popover/Popover.js +97 -0
  146. package/dist/components/popover/Popover.js.map +1 -0
  147. package/dist/components/popover/index.d.ts +1 -0
  148. package/dist/components/popover/index.js +2 -0
  149. package/dist/components/preview-card/PreviewCard.d.ts +60 -0
  150. package/dist/components/preview-card/PreviewCard.js +83 -0
  151. package/dist/components/preview-card/PreviewCard.js.map +1 -0
  152. package/dist/components/preview-card/index.d.ts +1 -0
  153. package/dist/components/preview-card/index.js +2 -0
  154. package/dist/components/progress/Progress.d.ts +36 -0
  155. package/dist/components/progress/Progress.js +45 -0
  156. package/dist/components/progress/Progress.js.map +1 -0
  157. package/dist/components/progress/index.d.ts +1 -0
  158. package/dist/components/progress/index.js +2 -0
  159. package/dist/components/radio/Radio.d.ts +39 -0
  160. package/dist/components/radio/Radio.js +39 -0
  161. package/dist/components/radio/Radio.js.map +1 -0
  162. package/dist/components/radio/index.d.ts +1 -0
  163. package/dist/components/radio/index.js +2 -0
  164. package/dist/components/resizable/Resizable.d.ts +35 -0
  165. package/dist/components/resizable/Resizable.js +38 -0
  166. package/dist/components/resizable/Resizable.js.map +1 -0
  167. package/dist/components/resizable/index.d.ts +1 -0
  168. package/dist/components/resizable/index.js +2 -0
  169. package/dist/components/scroll-area/ScrollArea.d.ts +37 -0
  170. package/dist/components/scroll-area/ScrollArea.js +52 -0
  171. package/dist/components/scroll-area/ScrollArea.js.map +1 -0
  172. package/dist/components/scroll-area/index.d.ts +1 -0
  173. package/dist/components/scroll-area/index.js +2 -0
  174. package/dist/components/select/Select.d.ts +94 -0
  175. package/dist/components/select/Select.js +151 -0
  176. package/dist/components/select/Select.js.map +1 -0
  177. package/dist/components/select/index.d.ts +1 -0
  178. package/dist/components/select/index.js +2 -0
  179. package/dist/components/separator/Separator.d.ts +29 -0
  180. package/dist/components/separator/Separator.js +20 -0
  181. package/dist/components/separator/Separator.js.map +1 -0
  182. package/dist/components/separator/index.d.ts +1 -0
  183. package/dist/components/separator/index.js +2 -0
  184. package/dist/components/slider/Slider.d.ts +53 -0
  185. package/dist/components/slider/Slider.js +70 -0
  186. package/dist/components/slider/Slider.js.map +1 -0
  187. package/dist/components/slider/index.d.ts +1 -0
  188. package/dist/components/slider/index.js +2 -0
  189. package/dist/components/switch/Switch.d.ts +28 -0
  190. package/dist/components/switch/Switch.js +31 -0
  191. package/dist/components/switch/Switch.js.map +1 -0
  192. package/dist/components/switch/index.d.ts +1 -0
  193. package/dist/components/switch/index.js +2 -0
  194. package/dist/components/tabs/Tabs.d.ts +41 -0
  195. package/dist/components/tabs/Tabs.js +45 -0
  196. package/dist/components/tabs/Tabs.js.map +1 -0
  197. package/dist/components/tabs/index.d.ts +1 -0
  198. package/dist/components/tabs/index.js +2 -0
  199. package/dist/components/toast/Toast.d.ts +70 -0
  200. package/dist/components/toast/Toast.js +95 -0
  201. package/dist/components/toast/Toast.js.map +1 -0
  202. package/dist/components/toast/index.d.ts +1 -0
  203. package/dist/components/toast/index.js +2 -0
  204. package/dist/components/toggle/Toggle.d.ts +38 -0
  205. package/dist/components/toggle/Toggle.js +30 -0
  206. package/dist/components/toggle/Toggle.js.map +1 -0
  207. package/dist/components/toggle/index.d.ts +1 -0
  208. package/dist/components/toggle/index.js +2 -0
  209. package/dist/components/toolbar/Toolbar.d.ts +50 -0
  210. package/dist/components/toolbar/Toolbar.js +59 -0
  211. package/dist/components/toolbar/Toolbar.js.map +1 -0
  212. package/dist/components/toolbar/index.d.ts +1 -0
  213. package/dist/components/toolbar/index.js +2 -0
  214. package/dist/components/tooltip/Tooltip.d.ts +58 -0
  215. package/dist/components/tooltip/Tooltip.js +57 -0
  216. package/dist/components/tooltip/Tooltip.js.map +1 -0
  217. package/dist/components/tooltip/index.d.ts +1 -0
  218. package/dist/components/tooltip/index.js +2 -0
  219. package/dist/index.d.ts +60 -0
  220. package/dist/index.js +48 -0
  221. package/dist/lib/cn.d.ts +3 -0
  222. package/dist/lib/cn.js +29 -0
  223. package/dist/lib/cn.js.map +1 -0
  224. package/dist/styles.css +2 -0
  225. package/dist/theme.css +109 -0
  226. package/package.json +131 -0
@@ -0,0 +1,36 @@
1
+ import { Progress as BaseProgress } from '@base-ui/react/progress';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * Progress — Material 3 styled wrapper over Base UI's headless Progress.
5
+ * Behaviour/accessibility (role="progressbar", aria-valuenow/-min/-max,
6
+ * data-progressing/-complete/-indeterminate states, formatted value text):
7
+ * Base UI (https://base-ui.com/react/components/progress).
8
+ * Visuals: M3 linear progress-indicator anatomy — 4px rounded track in
9
+ * surface-container-high with a primary active indicator, label-large label
10
+ * and label-medium value text. The indeterminate state sweeps the indicator
11
+ * across the track using the ported keyframes.
12
+ * Design ref: port/core/ui/components/progress-bar + determinate/indeterminate
13
+ * keyframes in port/tailwind.config.ts (see CLAUDE.md).
14
+ *
15
+ * Compound API mirrors Base UI:
16
+ * <Progress.Root value={65}> // value={null} → indeterminate
17
+ * <Progress.Label>Downloading…</Progress.Label>
18
+ * <Progress.Value />
19
+ * <Progress.Track>
20
+ * <Progress.Indicator />
21
+ * </Progress.Track>
22
+ * </Progress.Root>
23
+ */
24
+ declare function Root({ className, ...props }: ComponentProps<typeof BaseProgress.Root>): import("react").JSX.Element;
25
+ declare function Label({ className, ...props }: ComponentProps<typeof BaseProgress.Label>): import("react").JSX.Element;
26
+ declare function Value({ className, ...props }: ComponentProps<typeof BaseProgress.Value>): import("react").JSX.Element;
27
+ declare function Track({ className, ...props }: ComponentProps<typeof BaseProgress.Track>): import("react").JSX.Element;
28
+ declare function Indicator({ className, ...props }: ComponentProps<typeof BaseProgress.Indicator>): import("react").JSX.Element;
29
+ export declare const Progress: {
30
+ Root: typeof Root;
31
+ Label: typeof Label;
32
+ Value: typeof Value;
33
+ Track: typeof Track;
34
+ Indicator: typeof Indicator;
35
+ };
36
+ export { Root, Label, Value, Track, Indicator };
@@ -0,0 +1,45 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { Progress as n } from "@base-ui/react/progress";
4
+ //#region src/components/progress/Progress.tsx
5
+ function r({ className: r, ...i }) {
6
+ return /* @__PURE__ */ t(n.Root, {
7
+ className: e("flex w-full flex-col gap-2 text-on-surface", r),
8
+ ...i
9
+ });
10
+ }
11
+ function i({ className: r, ...i }) {
12
+ return /* @__PURE__ */ t(n.Label, {
13
+ className: e("text-label-large text-on-surface", r),
14
+ ...i
15
+ });
16
+ }
17
+ function a({ className: r, ...i }) {
18
+ return /* @__PURE__ */ t(n.Value, {
19
+ className: e("text-label-medium text-on-surface-variant tabular-nums", r),
20
+ ...i
21
+ });
22
+ }
23
+ function o({ className: r, ...i }) {
24
+ return /* @__PURE__ */ t(n.Track, {
25
+ className: e("relative h-1 w-full overflow-hidden rounded-full bg-surface-container-high", r),
26
+ ...i
27
+ });
28
+ }
29
+ function s({ className: r, ...i }) {
30
+ return /* @__PURE__ */ t(n.Indicator, {
31
+ className: e("absolute top-0 left-0 h-full rounded-full bg-primary transition-[width] duration-500 ease-out", "data-[indeterminate]:w-full data-[indeterminate]:animate-[progress-indeterminate_2s_cubic-bezier(0.7,0.1,0.5,1)_infinite]", r),
32
+ ...i
33
+ });
34
+ }
35
+ var c = {
36
+ Root: r,
37
+ Label: i,
38
+ Value: a,
39
+ Track: o,
40
+ Indicator: s
41
+ };
42
+ //#endregion
43
+ export { s as Indicator, i as Label, c as Progress, r as Root, o as Track, a as Value };
44
+
45
+ //# sourceMappingURL=Progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.js","names":[],"sources":["../../../src/components/progress/Progress.tsx"],"sourcesContent":["import { Progress as BaseProgress } from '@base-ui/react/progress'\nimport { cn } from '#/lib/cn'\n// Keyframes (progress-indeterminate) live in the shipped token layer (styles.css\n// / theme.css), consistent with how all other Tailwind styles are delivered.\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Progress — Material 3 styled wrapper over Base UI's headless Progress.\n * Behaviour/accessibility (role=\"progressbar\", aria-valuenow/-min/-max,\n * data-progressing/-complete/-indeterminate states, formatted value text):\n * Base UI (https://base-ui.com/react/components/progress).\n * Visuals: M3 linear progress-indicator anatomy — 4px rounded track in\n * surface-container-high with a primary active indicator, label-large label\n * and label-medium value text. The indeterminate state sweeps the indicator\n * across the track using the ported keyframes.\n * Design ref: port/core/ui/components/progress-bar + determinate/indeterminate\n * keyframes in port/tailwind.config.ts (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <Progress.Root value={65}> // value={null} → indeterminate\n * <Progress.Label>Downloading…</Progress.Label>\n * <Progress.Value />\n * <Progress.Track>\n * <Progress.Indicator />\n * </Progress.Track>\n * </Progress.Root>\n */\n\nfunction Root({ className, ...props }: ComponentProps<typeof BaseProgress.Root>) {\n return (\n <BaseProgress.Root\n className={cn('flex w-full flex-col gap-2 text-on-surface', className)}\n {...props}\n />\n )\n}\n\nfunction Label({ className, ...props }: ComponentProps<typeof BaseProgress.Label>) {\n return (\n <BaseProgress.Label\n className={cn('text-label-large text-on-surface', className)}\n {...props}\n />\n )\n}\n\nfunction Value({ className, ...props }: ComponentProps<typeof BaseProgress.Value>) {\n return (\n <BaseProgress.Value\n className={cn('text-label-medium text-on-surface-variant tabular-nums', className)}\n {...props}\n />\n )\n}\n\nfunction Track({ className, ...props }: ComponentProps<typeof BaseProgress.Track>) {\n return (\n <BaseProgress.Track\n className={cn(\n 'relative h-1 w-full overflow-hidden rounded-full bg-surface-container-high',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Indicator({ className, ...props }: ComponentProps<typeof BaseProgress.Indicator>) {\n return (\n <BaseProgress.Indicator\n className={cn(\n // Determinate: Base UI sets width/inset inline; animate width changes.\n 'absolute top-0 left-0 h-full rounded-full bg-primary transition-[width] duration-500 ease-out',\n // Indeterminate (value=null): full-width bar sweeping across the track.\n 'data-[indeterminate]:w-full data-[indeterminate]:animate-[progress-indeterminate_2s_cubic-bezier(0.7,0.1,0.5,1)_infinite]',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport const Progress = { Root, Label, Value, Track, Indicator }\nexport { Root, Label, Value, Track, Indicator }\n"],"mappings":";;;;AA6BA,SAAS,EAAK,EAAE,cAAW,GAAG,KAAmD;CAC/E,OACE,kBAAC,EAAa,MAAd;EACE,WAAW,EAAG,8CAA8C,CAAS;EACrE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAoD;CACjF,OACE,kBAAC,EAAa,OAAd;EACE,WAAW,EAAG,oCAAoC,CAAS;EAC3D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAoD;CACjF,OACE,kBAAC,EAAa,OAAd;EACE,WAAW,EAAG,0DAA0D,CAAS;EACjF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAoD;CACjF,OACE,kBAAC,EAAa,OAAd;EACE,WAAW,EACT,8EACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAwD;CACzF,OACE,kBAAC,EAAa,WAAd;EACE,WAAW,EAET,iGAEA,6HACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,IAAW;CAAE;CAAM;CAAO;CAAO;CAAO;AAAU"}
@@ -0,0 +1 @@
1
+ export { Progress, Root, Label, Value, Track, Indicator } from './Progress';
@@ -0,0 +1,2 @@
1
+ import { Indicator as e, Label as t, Progress as n, Root as r, Track as i, Value as a } from "./Progress.js";
2
+ export { e as Indicator, t as Label, n as Progress, r as Root, i as Track, a as Value };
@@ -0,0 +1,39 @@
1
+ import { Radio as BaseRadio } from '@base-ui/react/radio';
2
+ import { RadioGroup as BaseRadioGroup } from '@base-ui/react/radio-group';
3
+ import { ComponentProps } from 'react';
4
+ /**
5
+ * Radio — Material 3 styled wrapper over Base UI's headless Radio +
6
+ * Radio Group.
7
+ * Behaviour/accessibility (hidden input, role="radio"/"radiogroup",
8
+ * roving-tabindex arrow-key selection, form integration): Base UI
9
+ * (https://base-ui.com/react/components/radio and
10
+ * https://base-ui.com/react/components/radio-group).
11
+ * Visuals: M3 radio button anatomy — 20px circle with a 2px outline ring
12
+ * (on-surface-variant unselected, primary selected), 10px primary inner dot,
13
+ * 40px state layer, body-medium label.
14
+ * Design ref: port/core/ui/elements/common/Radio.tsx +
15
+ * port/pages/examples/selection (see CLAUDE.md).
16
+ *
17
+ * Compound API mirrors Base UI:
18
+ * <Radio.Group defaultValue="tokyo" aria-label="City">
19
+ * <Radio.Label>
20
+ * <Radio.Root value="tokyo">
21
+ * <Radio.Indicator />
22
+ * </Radio.Root>
23
+ * Tokyo
24
+ * </Radio.Label>
25
+ * </Radio.Group>
26
+ */
27
+ declare function Root({ className, ...props }: ComponentProps<typeof BaseRadio.Root>): import("react").JSX.Element;
28
+ declare function Indicator({ className, ...props }: ComponentProps<typeof BaseRadio.Indicator>): import("react").JSX.Element;
29
+ /** Shared single-selection state for a series of radio buttons. */
30
+ declare function Group({ className, ...props }: ComponentProps<typeof BaseRadioGroup>): import("react").JSX.Element;
31
+ /** Convenience `<label>` row pairing a radio circle with its M3 body-medium text. */
32
+ declare function Label({ className, ...props }: ComponentProps<'label'>): import("react").JSX.Element;
33
+ export declare const Radio: {
34
+ Root: typeof Root;
35
+ Indicator: typeof Indicator;
36
+ Group: typeof Group;
37
+ Label: typeof Label;
38
+ };
39
+ export { Root, Indicator, Group, Label };
@@ -0,0 +1,39 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { Radio as n } from "@base-ui/react/radio";
4
+ import { RadioGroup as r } from "@base-ui/react/radio-group";
5
+ //#region src/components/radio/Radio.tsx
6
+ function i({ className: r, ...i }) {
7
+ return /* @__PURE__ */ t(n.Root, {
8
+ className: e("group relative flex size-5 shrink-0 cursor-pointer items-center justify-center", "rounded-full border-2 border-on-surface-variant transition-colors duration-150", "data-[checked]:border-primary", "before:absolute before:-inset-2.5 before:rounded-full before:transition-colors", "hover:before:bg-on-surface/[0.08] data-[checked]:hover:before:bg-primary/[0.08]", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary", "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-[0.38]", "data-[readonly]:cursor-default", r),
9
+ ...i
10
+ });
11
+ }
12
+ function a({ className: r, ...i }) {
13
+ return /* @__PURE__ */ t(n.Indicator, {
14
+ className: e("size-2.5 rounded-full bg-primary", "transition-all duration-150 ease-out", "data-[starting-style]:scale-0 data-[starting-style]:opacity-0", "data-[ending-style]:scale-0 data-[ending-style]:opacity-0", r),
15
+ ...i
16
+ });
17
+ }
18
+ function o({ className: n, ...i }) {
19
+ return /* @__PURE__ */ t(r, {
20
+ className: e("flex flex-col items-start gap-3", n),
21
+ ...i
22
+ });
23
+ }
24
+ function s({ className: n, ...r }) {
25
+ return /* @__PURE__ */ t("label", {
26
+ className: e("flex cursor-pointer items-center gap-3 text-body-medium text-on-surface", "has-data-[disabled]:cursor-not-allowed", n),
27
+ ...r
28
+ });
29
+ }
30
+ var c = {
31
+ Root: i,
32
+ Indicator: a,
33
+ Group: o,
34
+ Label: s
35
+ };
36
+ //#endregion
37
+ export { o as Group, a as Indicator, s as Label, c as Radio, i as Root };
38
+
39
+ //# sourceMappingURL=Radio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Radio.js","names":[],"sources":["../../../src/components/radio/Radio.tsx"],"sourcesContent":["import { Radio as BaseRadio } from '@base-ui/react/radio'\nimport { RadioGroup as BaseRadioGroup } from '@base-ui/react/radio-group'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Radio — Material 3 styled wrapper over Base UI's headless Radio +\n * Radio Group.\n * Behaviour/accessibility (hidden input, role=\"radio\"/\"radiogroup\",\n * roving-tabindex arrow-key selection, form integration): Base UI\n * (https://base-ui.com/react/components/radio and\n * https://base-ui.com/react/components/radio-group).\n * Visuals: M3 radio button anatomy — 20px circle with a 2px outline ring\n * (on-surface-variant unselected, primary selected), 10px primary inner dot,\n * 40px state layer, body-medium label.\n * Design ref: port/core/ui/elements/common/Radio.tsx +\n * port/pages/examples/selection (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <Radio.Group defaultValue=\"tokyo\" aria-label=\"City\">\n * <Radio.Label>\n * <Radio.Root value=\"tokyo\">\n * <Radio.Indicator />\n * </Radio.Root>\n * Tokyo\n * </Radio.Label>\n * </Radio.Group>\n */\n\nfunction Root({ className, ...props }: ComponentProps<typeof BaseRadio.Root>) {\n return (\n <BaseRadio.Root\n className={cn(\n 'group relative flex size-5 shrink-0 cursor-pointer items-center justify-center',\n 'rounded-full border-2 border-on-surface-variant transition-colors duration-150',\n 'data-[checked]:border-primary',\n // 40px M3 state layer (radial hover ring around the 20px circle).\n 'before:absolute before:-inset-2.5 before:rounded-full before:transition-colors',\n 'hover:before:bg-on-surface/[0.08] data-[checked]:hover:before:bg-primary/[0.08]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-[0.38]',\n 'data-[readonly]:cursor-default',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Indicator({ className, ...props }: ComponentProps<typeof BaseRadio.Indicator>) {\n return (\n <BaseRadio.Indicator\n className={cn(\n 'size-2.5 rounded-full bg-primary',\n 'transition-all duration-150 ease-out',\n 'data-[starting-style]:scale-0 data-[starting-style]:opacity-0',\n 'data-[ending-style]:scale-0 data-[ending-style]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Shared single-selection state for a series of radio buttons. */\nfunction Group({ className, ...props }: ComponentProps<typeof BaseRadioGroup>) {\n return (\n <BaseRadioGroup className={cn('flex flex-col items-start gap-3', className)} {...props} />\n )\n}\n\n/** Convenience `<label>` row pairing a radio circle with its M3 body-medium text. */\nfunction Label({ className, ...props }: ComponentProps<'label'>) {\n return (\n <label\n className={cn(\n 'flex cursor-pointer items-center gap-3 text-body-medium text-on-surface',\n 'has-data-[disabled]:cursor-not-allowed',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport const Radio = { Root, Indicator, Group, Label }\nexport { Root, Indicator, Group, Label }\n"],"mappings":";;;;;AA8BA,SAAS,EAAK,EAAE,cAAW,GAAG,KAAgD;CAC5E,OACE,kBAAC,EAAU,MAAX;EACE,WAAW,EACT,kFACA,kFACA,iCAEA,kFACA,mFACA,wFACA,qEACA,kCACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAqD;CACtF,OACE,kBAAC,EAAU,WAAX;EACE,WAAW,EACT,oCACA,wCACA,iEACA,6DACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAgD;CAC7E,OACE,kBAAC,GAAD;EAAgB,WAAW,EAAG,mCAAmC,CAAS;EAAG,GAAI;CAAQ,CAAA;AAE7F;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAkC;CAC/D,OACE,kBAAC,SAAD;EACE,WAAW,EACT,2EACA,0CACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,IAAQ;CAAE;CAAM;CAAW;CAAO;AAAM"}
@@ -0,0 +1 @@
1
+ export { Radio, Root, Indicator, Group, Label } from './Radio';
@@ -0,0 +1,2 @@
1
+ import { Group as e, Indicator as t, Label as n, Radio as r, Root as i } from "./Radio.js";
2
+ export { e as Group, t as Indicator, n as Label, r as Radio, i as Root };
@@ -0,0 +1,35 @@
1
+ import { Group as BaseGroup, Panel as BasePanel, Separator as BaseSeparator } from 'react-resizable-panels';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * Resizable — Material 3 styled wrapper over react-resizable-panels v4
5
+ * (headless Group / Panel / Separator API).
6
+ * Behaviour/accessibility: react-resizable-panels (https://github.com/bvaughn/react-resizable-panels).
7
+ * Visuals: M3 surface, shape, and state layers (see CLAUDE.md).
8
+ *
9
+ * Compound API mirrors the library (Separator is exposed as Handle):
10
+ * <Resizable.Group orientation="horizontal">
11
+ * <Resizable.Panel defaultSize="60%" minSize="20%">Left</Resizable.Panel>
12
+ * <Resizable.Handle />
13
+ * <Resizable.Panel minSize="20%">Right</Resizable.Panel>
14
+ * </Resizable.Group>
15
+ *
16
+ * Panel is intentionally unopinionated — give content its own surface
17
+ * (e.g. `bg-surface` / `bg-surface-container` + `rounded-medium`) where sensible.
18
+ */
19
+ declare function Group({ className, ...props }: ComponentProps<typeof BaseGroup>): import("react").JSX.Element;
20
+ declare function Panel({ className, ...props }: ComponentProps<typeof BasePanel>): import("react").JSX.Element;
21
+ type HandleProps = Omit<ComponentProps<typeof BaseSeparator>, 'children'>;
22
+ /**
23
+ * M3 drag handle: a thin outline-variant divider line with a centered grab
24
+ * pill (4x32px). The library renders the separator with `aria-orientation`
25
+ * opposite to the group axis (a vertical line splits a horizontal group), so
26
+ * both axes are styled off that attribute. State styling uses the
27
+ * `data-separator` attribute (`inactive | hover | active | focus | disabled`).
28
+ */
29
+ declare function Handle({ className, ...props }: HandleProps): import("react").JSX.Element;
30
+ export declare const Resizable: {
31
+ Group: typeof Group;
32
+ Panel: typeof Panel;
33
+ Handle: typeof Handle;
34
+ };
35
+ export { Group, Panel, Handle };
@@ -0,0 +1,38 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { Group as r, Panel as i, Separator as a } from "react-resizable-panels";
4
+ //#region src/components/resizable/Resizable.tsx
5
+ function o({ className: n, ...i }) {
6
+ return /* @__PURE__ */ t(r, {
7
+ className: e("h-full w-full", n),
8
+ ...i
9
+ });
10
+ }
11
+ function s({ className: n, ...r }) {
12
+ return /* @__PURE__ */ t(i, {
13
+ className: e(n),
14
+ ...r
15
+ });
16
+ }
17
+ function c({ className: r, ...i }) {
18
+ return /* @__PURE__ */ n(a, {
19
+ className: e("group/handle relative flex shrink-0 items-center justify-center outline-none", "aria-[orientation=vertical]:w-3 aria-[orientation=horizontal]:h-3", "focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary", r),
20
+ ...i,
21
+ children: [/* @__PURE__ */ t("span", {
22
+ "aria-hidden": !0,
23
+ className: e("pointer-events-none absolute bg-outline-variant", "group-aria-[orientation=vertical]/handle:inset-y-0 group-aria-[orientation=vertical]/handle:left-1/2 group-aria-[orientation=vertical]/handle:w-px group-aria-[orientation=vertical]/handle:-translate-x-1/2", "group-aria-[orientation=horizontal]/handle:inset-x-0 group-aria-[orientation=horizontal]/handle:top-1/2 group-aria-[orientation=horizontal]/handle:h-px group-aria-[orientation=horizontal]/handle:-translate-y-1/2")
24
+ }), /* @__PURE__ */ t("span", {
25
+ "aria-hidden": !0,
26
+ className: e("pointer-events-none relative rounded-full bg-on-surface-variant/40 transition-colors duration-200 ease-out", "group-aria-[orientation=vertical]/handle:h-8 group-aria-[orientation=vertical]/handle:w-1", "group-aria-[orientation=horizontal]/handle:h-1 group-aria-[orientation=horizontal]/handle:w-8", "group-data-[separator=hover]/handle:bg-primary group-data-[separator=active]/handle:bg-primary", "group-data-[separator=disabled]/handle:bg-on-surface/[0.12]")
27
+ })]
28
+ });
29
+ }
30
+ var l = {
31
+ Group: o,
32
+ Panel: s,
33
+ Handle: c
34
+ };
35
+ //#endregion
36
+ export { o as Group, c as Handle, s as Panel, l as Resizable };
37
+
38
+ //# sourceMappingURL=Resizable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Resizable.js","names":[],"sources":["../../../src/components/resizable/Resizable.tsx"],"sourcesContent":["import {\n Group as BaseGroup,\n Panel as BasePanel,\n Separator as BaseSeparator,\n} from 'react-resizable-panels'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Resizable — Material 3 styled wrapper over react-resizable-panels v4\n * (headless Group / Panel / Separator API).\n * Behaviour/accessibility: react-resizable-panels (https://github.com/bvaughn/react-resizable-panels).\n * Visuals: M3 surface, shape, and state layers (see CLAUDE.md).\n *\n * Compound API mirrors the library (Separator is exposed as Handle):\n * <Resizable.Group orientation=\"horizontal\">\n * <Resizable.Panel defaultSize=\"60%\" minSize=\"20%\">Left</Resizable.Panel>\n * <Resizable.Handle />\n * <Resizable.Panel minSize=\"20%\">Right</Resizable.Panel>\n * </Resizable.Group>\n *\n * Panel is intentionally unopinionated — give content its own surface\n * (e.g. `bg-surface` / `bg-surface-container` + `rounded-medium`) where sensible.\n */\n\nfunction Group({ className, ...props }: ComponentProps<typeof BaseGroup>) {\n return <BaseGroup className={cn('h-full w-full', className)} {...props} />\n}\n\nfunction Panel({ className, ...props }: ComponentProps<typeof BasePanel>) {\n // Library applies `className` to the inner scrollable content div.\n return <BasePanel className={cn(className)} {...props} />\n}\n\ntype HandleProps = Omit<ComponentProps<typeof BaseSeparator>, 'children'>\n\n/**\n * M3 drag handle: a thin outline-variant divider line with a centered grab\n * pill (4x32px). The library renders the separator with `aria-orientation`\n * opposite to the group axis (a vertical line splits a horizontal group), so\n * both axes are styled off that attribute. State styling uses the\n * `data-separator` attribute (`inactive | hover | active | focus | disabled`).\n */\nfunction Handle({ className, ...props }: HandleProps) {\n return (\n <BaseSeparator\n className={cn(\n 'group/handle relative flex shrink-0 items-center justify-center outline-none',\n 'aria-[orientation=vertical]:w-3 aria-[orientation=horizontal]:h-3',\n 'focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary',\n className,\n )}\n {...props}\n >\n {/* divider line */}\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute bg-outline-variant',\n 'group-aria-[orientation=vertical]/handle:inset-y-0 group-aria-[orientation=vertical]/handle:left-1/2 group-aria-[orientation=vertical]/handle:w-px group-aria-[orientation=vertical]/handle:-translate-x-1/2',\n 'group-aria-[orientation=horizontal]/handle:inset-x-0 group-aria-[orientation=horizontal]/handle:top-1/2 group-aria-[orientation=horizontal]/handle:h-px group-aria-[orientation=horizontal]/handle:-translate-y-1/2',\n )}\n />\n {/* grab pill */}\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none relative rounded-full bg-on-surface-variant/40 transition-colors duration-200 ease-out',\n 'group-aria-[orientation=vertical]/handle:h-8 group-aria-[orientation=vertical]/handle:w-1',\n 'group-aria-[orientation=horizontal]/handle:h-1 group-aria-[orientation=horizontal]/handle:w-8',\n 'group-data-[separator=hover]/handle:bg-primary group-data-[separator=active]/handle:bg-primary',\n 'group-data-[separator=disabled]/handle:bg-on-surface/[0.12]',\n )}\n />\n </BaseSeparator>\n )\n}\n\nexport const Resizable = { Group, Panel, Handle }\nexport { Group, Panel, Handle }\n"],"mappings":";;;;AA0BA,SAAS,EAAM,EAAE,cAAW,GAAG,KAA2C;CACxE,OAAO,kBAAC,GAAD;EAAW,WAAW,EAAG,iBAAiB,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC3E;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAA2C;CAExE,OAAO,kBAAC,GAAD;EAAW,WAAW,EAAG,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC1D;AAWA,SAAS,EAAO,EAAE,cAAW,GAAG,KAAsB;CACpD,OACE,kBAAC,GAAD;EACE,WAAW,EACT,gFACA,qEACA,yFACA,CACF;EACA,GAAI;YAPN,CAUE,kBAAC,QAAD;GACE,eAAA;GACA,WAAW,EACT,mDACA,gNACA,qNACF;EACD,CAAA,GAED,kBAAC,QAAD;GACE,eAAA;GACA,WAAW,EACT,8GACA,6FACA,iGACA,kGACA,6DACF;EACD,CAAA,CACY;;AAEnB;AAEA,IAAa,IAAY;CAAE,OAAA;CAAO,OAAA;CAAO;AAAO"}
@@ -0,0 +1 @@
1
+ export { Resizable, Group, Panel, Handle } from './Resizable';
@@ -0,0 +1,2 @@
1
+ import { Group as e, Handle as t, Panel as n, Resizable as r } from "./Resizable.js";
2
+ export { e as Group, t as Handle, n as Panel, r as Resizable };
@@ -0,0 +1,37 @@
1
+ import { ScrollArea as BaseScrollArea } from '@base-ui/react/scroll-area';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * ScrollArea — Material 3 styled wrapper over Base UI's headless Scroll Area.
5
+ * Behaviour/accessibility (native scrolling, thumb dragging, track paging,
6
+ * RTL support): Base UI (https://base-ui.com/react/components/scroll-area).
7
+ * Visuals: minimal M3 scrollbar — transparent track, outline-variant thumb
8
+ * with a full-round shape; the bar fades in while hovering or scrolling and
9
+ * fades back out when idle (Base UI `data-hovering` / `data-scrolling`).
10
+ * Design ref: none mapped — minimal scrollbar per CLAUDE.md M3 tokens.
11
+ *
12
+ * Compound API mirrors Base UI:
13
+ * <ScrollArea.Root>
14
+ * <ScrollArea.Viewport>
15
+ * <ScrollArea.Content>…</ScrollArea.Content>
16
+ * </ScrollArea.Viewport>
17
+ * <ScrollArea.Scrollbar orientation="vertical">
18
+ * <ScrollArea.Thumb />
19
+ * </ScrollArea.Scrollbar>
20
+ * <ScrollArea.Corner />
21
+ * </ScrollArea.Root>
22
+ */
23
+ declare function Root({ className, ...props }: ComponentProps<typeof BaseScrollArea.Root>): import("react").JSX.Element;
24
+ declare function Viewport({ className, ...props }: ComponentProps<typeof BaseScrollArea.Viewport>): import("react").JSX.Element;
25
+ declare function Content({ className, ...props }: ComponentProps<typeof BaseScrollArea.Content>): import("react").JSX.Element;
26
+ declare function Scrollbar({ className, ...props }: ComponentProps<typeof BaseScrollArea.Scrollbar>): import("react").JSX.Element;
27
+ declare function Thumb({ className, ...props }: ComponentProps<typeof BaseScrollArea.Thumb>): import("react").JSX.Element;
28
+ declare function Corner({ className, ...props }: ComponentProps<typeof BaseScrollArea.Corner>): import("react").JSX.Element;
29
+ export declare const ScrollArea: {
30
+ Root: typeof Root;
31
+ Viewport: typeof Viewport;
32
+ Content: typeof Content;
33
+ Scrollbar: typeof Scrollbar;
34
+ Thumb: typeof Thumb;
35
+ Corner: typeof Corner;
36
+ };
37
+ export { Root, Viewport, Content, Scrollbar, Thumb, Corner };
@@ -0,0 +1,52 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { ScrollArea as n } from "@base-ui/react/scroll-area";
4
+ //#region src/components/scroll-area/ScrollArea.tsx
5
+ function r({ className: r, ...i }) {
6
+ return /* @__PURE__ */ t(n.Root, {
7
+ className: e("text-on-surface", r),
8
+ ...i
9
+ });
10
+ }
11
+ function i({ className: r, ...i }) {
12
+ return /* @__PURE__ */ t(n.Viewport, {
13
+ className: e("h-full w-full overscroll-contain rounded-[inherit]", "focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-primary", r),
14
+ ...i
15
+ });
16
+ }
17
+ function a({ className: r, ...i }) {
18
+ return /* @__PURE__ */ t(n.Content, {
19
+ className: e(r),
20
+ ...i
21
+ });
22
+ }
23
+ function o({ className: r, ...i }) {
24
+ return /* @__PURE__ */ t(n.Scrollbar, {
25
+ className: e("flex bg-transparent p-px", "data-[orientation=vertical]:w-2 data-[orientation=vertical]:justify-center", "data-[orientation=horizontal]:h-2 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:justify-center", "opacity-0 transition-opacity duration-200 delay-300", "data-[hovering]:opacity-100 data-[hovering]:delay-0 data-[hovering]:duration-100", "data-[scrolling]:opacity-100 data-[scrolling]:delay-0 data-[scrolling]:duration-100", r),
26
+ ...i
27
+ });
28
+ }
29
+ function s({ className: r, ...i }) {
30
+ return /* @__PURE__ */ t(n.Thumb, {
31
+ className: e("rounded-full bg-outline-variant transition-colors hover:bg-outline", "data-[orientation=vertical]:w-full data-[orientation=horizontal]:h-full", r),
32
+ ...i
33
+ });
34
+ }
35
+ function c({ className: r, ...i }) {
36
+ return /* @__PURE__ */ t(n.Corner, {
37
+ className: e("bg-transparent", r),
38
+ ...i
39
+ });
40
+ }
41
+ var l = {
42
+ Root: r,
43
+ Viewport: i,
44
+ Content: a,
45
+ Scrollbar: o,
46
+ Thumb: s,
47
+ Corner: c
48
+ };
49
+ //#endregion
50
+ export { a as Content, c as Corner, r as Root, l as ScrollArea, o as Scrollbar, s as Thumb, i as Viewport };
51
+
52
+ //# sourceMappingURL=ScrollArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.js","names":[],"sources":["../../../src/components/scroll-area/ScrollArea.tsx"],"sourcesContent":["import { ScrollArea as BaseScrollArea } from '@base-ui/react/scroll-area'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * ScrollArea — Material 3 styled wrapper over Base UI's headless Scroll Area.\n * Behaviour/accessibility (native scrolling, thumb dragging, track paging,\n * RTL support): Base UI (https://base-ui.com/react/components/scroll-area).\n * Visuals: minimal M3 scrollbar — transparent track, outline-variant thumb\n * with a full-round shape; the bar fades in while hovering or scrolling and\n * fades back out when idle (Base UI `data-hovering` / `data-scrolling`).\n * Design ref: none mapped — minimal scrollbar per CLAUDE.md M3 tokens.\n *\n * Compound API mirrors Base UI:\n * <ScrollArea.Root>\n * <ScrollArea.Viewport>\n * <ScrollArea.Content>…</ScrollArea.Content>\n * </ScrollArea.Viewport>\n * <ScrollArea.Scrollbar orientation=\"vertical\">\n * <ScrollArea.Thumb />\n * </ScrollArea.Scrollbar>\n * <ScrollArea.Corner />\n * </ScrollArea.Root>\n */\n\nfunction Root({ className, ...props }: ComponentProps<typeof BaseScrollArea.Root>) {\n // Base UI applies `position: relative` and corner CSS vars inline.\n return <BaseScrollArea.Root className={cn('text-on-surface', className)} {...props} />\n}\n\nfunction Viewport({ className, ...props }: ComponentProps<typeof BaseScrollArea.Viewport>) {\n return (\n <BaseScrollArea.Viewport\n className={cn(\n 'h-full w-full overscroll-contain rounded-[inherit]',\n // The viewport is keyboard-focusable when scrollable.\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-primary',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Content({ className, ...props }: ComponentProps<typeof BaseScrollArea.Content>) {\n return <BaseScrollArea.Content className={cn(className)} {...props} />\n}\n\nfunction Scrollbar({ className, ...props }: ComponentProps<typeof BaseScrollArea.Scrollbar>) {\n // Base UI positions the bar absolutely along the matching edge inline;\n // the track itself stays transparent (minimal M3 scrollbar).\n return (\n <BaseScrollArea.Scrollbar\n className={cn(\n 'flex bg-transparent p-px',\n 'data-[orientation=vertical]:w-2 data-[orientation=vertical]:justify-center',\n 'data-[orientation=horizontal]:h-2 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:justify-center',\n // Fade in while hovering/scrolling, fade out after a short idle delay.\n 'opacity-0 transition-opacity duration-200 delay-300',\n 'data-[hovering]:opacity-100 data-[hovering]:delay-0 data-[hovering]:duration-100',\n 'data-[scrolling]:opacity-100 data-[scrolling]:delay-0 data-[scrolling]:duration-100',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Thumb({ className, ...props }: ComponentProps<typeof BaseScrollArea.Thumb>) {\n // Base UI sets the thumb's scroll-proportional length inline\n // (--scroll-area-thumb-height / --scroll-area-thumb-width).\n return (\n <BaseScrollArea.Thumb\n className={cn(\n 'rounded-full bg-outline-variant transition-colors hover:bg-outline',\n 'data-[orientation=vertical]:w-full data-[orientation=horizontal]:h-full',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Corner({ className, ...props }: ComponentProps<typeof BaseScrollArea.Corner>) {\n return <BaseScrollArea.Corner className={cn('bg-transparent', className)} {...props} />\n}\n\nexport const ScrollArea = { Root, Viewport, Content, Scrollbar, Thumb, Corner }\nexport { Root, Viewport, Content, Scrollbar, Thumb, Corner }\n"],"mappings":";;;;AA0BA,SAAS,EAAK,EAAE,cAAW,GAAG,KAAqD;CAEjF,OAAO,kBAAC,EAAe,MAAhB;EAAqB,WAAW,EAAG,mBAAmB,CAAS;EAAG,GAAI;CAAQ,CAAA;AACvF;AAEA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAyD;CACzF,OACE,kBAAC,EAAe,UAAhB;EACE,WAAW,EACT,sDAEA,yFACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAQ,EAAE,cAAW,GAAG,KAAwD;CACvF,OAAO,kBAAC,EAAe,SAAhB;EAAwB,WAAW,EAAG,CAAS;EAAG,GAAI;CAAQ,CAAA;AACvE;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAA0D;CAG3F,OACE,kBAAC,EAAe,WAAhB;EACE,WAAW,EACT,4BACA,8EACA,yHAEA,uDACA,oFACA,uFACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAsD;CAGnF,OACE,kBAAC,EAAe,OAAhB;EACE,WAAW,EACT,sEACA,2EACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAO,EAAE,cAAW,GAAG,KAAuD;CACrF,OAAO,kBAAC,EAAe,QAAhB;EAAuB,WAAW,EAAG,kBAAkB,CAAS;EAAG,GAAI;CAAQ,CAAA;AACxF;AAEA,IAAa,IAAa;CAAE;CAAM;CAAU;CAAS;CAAW;CAAO;AAAO"}
@@ -0,0 +1 @@
1
+ export { ScrollArea, Root, Viewport, Content, Scrollbar, Thumb, Corner, } from './ScrollArea';
@@ -0,0 +1,2 @@
1
+ import { Content as e, Corner as t, Root as n, ScrollArea as r, Scrollbar as i, Thumb as a, Viewport as o } from "./ScrollArea.js";
2
+ export { e as Content, t as Corner, n as Root, r as ScrollArea, i as Scrollbar, a as Thumb, o as Viewport };
@@ -0,0 +1,94 @@
1
+ import { Select as BaseSelect } from '@base-ui/react/select';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * Select — Material 3 styled wrapper over Base UI's headless Select.
5
+ * Behaviour/accessibility (listbox semantics, typeahead, keyboard navigation,
6
+ * form integration via hidden input): Base UI
7
+ * (https://base-ui.com/react/components/select).
8
+ * Visuals: M3 "exposed dropdown menu" anatomy — outlined text-field trigger
9
+ * (56px, extra-small corner, outline → primary while open/focused, trailing
10
+ * chevron), menu popup on surface-container with small corner + level-2
11
+ * elevation, 48px list items with state layers and a trailing selected check.
12
+ * Design refs: port/core/ui/components/dropdown, port/core/ui/components/text-field
13
+ * (see CLAUDE.md).
14
+ *
15
+ * Compound API mirrors Base UI:
16
+ * <Select.Root>
17
+ * <Select.Label>Fruit</Select.Label>
18
+ * <Select.Trigger>
19
+ * <Select.Value placeholder="Pick a fruit" />
20
+ * <Select.Icon />
21
+ * </Select.Trigger>
22
+ * <Select.Portal>
23
+ * <Select.Positioner>
24
+ * <Select.Popup>
25
+ * <Select.List>
26
+ * <Select.Item value="apple">
27
+ * <Select.ItemText>Apple</Select.ItemText>
28
+ * <Select.ItemIndicator />
29
+ * </Select.Item>
30
+ * </Select.List>
31
+ * </Select.Popup>
32
+ * </Select.Positioner>
33
+ * </Select.Portal>
34
+ * </Select.Root>
35
+ */
36
+ declare const Root: typeof BaseSelect.Root;
37
+ declare const Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').SelectPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
38
+ /** M3 label above the field (label-large, on-surface). */
39
+ declare function Label({ className, ...props }: ComponentProps<typeof BaseSelect.Label>): import("react").JSX.Element;
40
+ /**
41
+ * The M3 outlined text-field box (56px, extra-small corner): outline turns
42
+ * primary while focused or while the popup is open.
43
+ */
44
+ declare function Trigger({ className, ...props }: ComponentProps<typeof BaseSelect.Trigger>): import("react").JSX.Element;
45
+ /** Selected-item text; shows the on-surface-variant placeholder when empty. */
46
+ declare function Value({ className, ...props }: ComponentProps<typeof BaseSelect.Value>): import("react").JSX.Element;
47
+ /** Trailing chevron; flips while the popup is open (parent Trigger is `group`). */
48
+ declare function Icon({ className, children, ...props }: ComponentProps<typeof BaseSelect.Icon>): import("react").JSX.Element;
49
+ declare function Backdrop({ className, ...props }: ComponentProps<typeof BaseSelect.Backdrop>): import("react").JSX.Element;
50
+ /**
51
+ * Positions the popup as an M3 menu below the field (4px gap) instead of
52
+ * Base UI's native-like "align selected item with trigger" default.
53
+ */
54
+ declare function Positioner({ className, ...props }: ComponentProps<typeof BaseSelect.Positioner>): import("react").JSX.Element;
55
+ /** M3 menu container: surface-container, small corner, level-2 elevation. */
56
+ declare function Popup({ className, ...props }: ComponentProps<typeof BaseSelect.Popup>): import("react").JSX.Element;
57
+ declare function Arrow({ className, ...props }: ComponentProps<typeof BaseSelect.Arrow>): import("react").JSX.Element;
58
+ declare function List({ className, ...props }: ComponentProps<typeof BaseSelect.List>): import("react").JSX.Element;
59
+ /** M3 menu item: 48px row, label-large, hover/highlight state layers. */
60
+ declare function Item({ className, ...props }: ComponentProps<typeof BaseSelect.Item>): import("react").JSX.Element;
61
+ /** The item's label text; mirrored into the trigger's Value when selected. */
62
+ declare function ItemText({ className, ...props }: ComponentProps<typeof BaseSelect.ItemText>): import("react").JSX.Element;
63
+ /** Trailing selected check (primary role); only mounted while selected. */
64
+ declare function ItemIndicator({ className, children, ...props }: ComponentProps<typeof BaseSelect.ItemIndicator>): import("react").JSX.Element;
65
+ /** Hover-to-scroll affordance pinned to the top of an overflowing popup. */
66
+ declare function ScrollUpArrow({ className, children, ...props }: ComponentProps<typeof BaseSelect.ScrollUpArrow>): import("react").JSX.Element;
67
+ /** Hover-to-scroll affordance pinned to the bottom of an overflowing popup. */
68
+ declare function ScrollDownArrow({ className, children, ...props }: ComponentProps<typeof BaseSelect.ScrollDownArrow>): import("react").JSX.Element;
69
+ declare function Group({ className, ...props }: ComponentProps<typeof BaseSelect.Group>): import("react").JSX.Element;
70
+ /** M3 list subheader. */
71
+ declare function GroupLabel({ className, ...props }: ComponentProps<typeof BaseSelect.GroupLabel>): import("react").JSX.Element;
72
+ declare function Separator({ className, ...props }: ComponentProps<typeof BaseSelect.Separator>): import("react").JSX.Element;
73
+ export declare const Select: {
74
+ Root: typeof BaseSelect.Root;
75
+ Label: typeof Label;
76
+ Trigger: typeof Trigger;
77
+ Value: typeof Value;
78
+ Icon: typeof Icon;
79
+ Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').SelectPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
80
+ Backdrop: typeof Backdrop;
81
+ Positioner: typeof Positioner;
82
+ Popup: typeof Popup;
83
+ Arrow: typeof Arrow;
84
+ List: typeof List;
85
+ Item: typeof Item;
86
+ ItemText: typeof ItemText;
87
+ ItemIndicator: typeof ItemIndicator;
88
+ ScrollUpArrow: typeof ScrollUpArrow;
89
+ ScrollDownArrow: typeof ScrollDownArrow;
90
+ Group: typeof Group;
91
+ GroupLabel: typeof GroupLabel;
92
+ Separator: typeof Separator;
93
+ };
94
+ export { Root, Label, Trigger, Value, Icon, Portal, Backdrop, Positioner, Popup, Arrow, List, Item, ItemText, ItemIndicator, ScrollUpArrow, ScrollDownArrow, Group, GroupLabel, Separator, };