@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,95 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { Button as t } from "../button/Button.js";
3
+ import { Checkbox as n } from "../checkbox/Checkbox.js";
4
+ import { Input as r, TextField as i } from "./Input.js";
5
+ import { DatePicker as a } from "../date-picker/DatePicker.js";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
+ import { createFormHook as c, createFormHookContexts as l } from "@tanstack/react-form";
8
+ //#region src/components/form/app-form.tsx
9
+ var { fieldContext: u, formContext: d, useFieldContext: f, useFormContext: p } = l();
10
+ function m() {
11
+ let { errors: e, isTouched: t } = f().state.meta;
12
+ return !t || e.length === 0 ? null : /* @__PURE__ */ o("p", {
13
+ className: "m-0 px-3 text-body-small text-error",
14
+ children: e.map((e) => typeof e == "string" ? e : e?.message ?? "").filter(Boolean).join(" ")
15
+ });
16
+ }
17
+ function h({ className: t, ...n }) {
18
+ let i = f(), a = i.state.meta.isTouched && i.state.meta.errors.length > 0;
19
+ return /* @__PURE__ */ s("div", {
20
+ className: e("flex w-full flex-col gap-1", t),
21
+ children: [/* @__PURE__ */ o(r, {
22
+ name: i.name,
23
+ value: i.state.value,
24
+ onChange: (e) => i.handleChange(e.target.value),
25
+ onBlur: i.handleBlur,
26
+ "data-invalid": a ? "" : void 0,
27
+ ...n
28
+ }), /* @__PURE__ */ o(m, {})]
29
+ });
30
+ }
31
+ function g({ className: t, ...n }) {
32
+ let r = f(), a = r.state.meta.isTouched && r.state.meta.errors.length > 0;
33
+ return /* @__PURE__ */ s("div", {
34
+ className: e("flex w-full flex-col gap-1", t),
35
+ children: [/* @__PURE__ */ o(i, {
36
+ name: r.name,
37
+ value: r.state.value,
38
+ onChange: (e) => r.handleChange(e.target.value),
39
+ onBlur: r.handleBlur,
40
+ "data-invalid": a ? "" : void 0,
41
+ ...n
42
+ }), /* @__PURE__ */ o(m, {})]
43
+ });
44
+ }
45
+ function _({ label: e }) {
46
+ let t = f();
47
+ return /* @__PURE__ */ s("div", {
48
+ className: "flex flex-col gap-1",
49
+ children: [/* @__PURE__ */ o(n, {
50
+ name: t.name,
51
+ label: e,
52
+ checked: t.state.value,
53
+ onCheckedChange: (e) => t.handleChange(e === !0),
54
+ onBlur: t.handleBlur
55
+ }), /* @__PURE__ */ o(m, {})]
56
+ });
57
+ }
58
+ function v({ className: t, ...n }) {
59
+ let r = f();
60
+ return /* @__PURE__ */ s("div", {
61
+ className: e("flex w-full flex-col gap-1", t),
62
+ children: [/* @__PURE__ */ o(a, {
63
+ name: r.name,
64
+ value: r.state.value,
65
+ onChange: (e) => r.handleChange(e),
66
+ ...n
67
+ }), /* @__PURE__ */ o(m, {})]
68
+ });
69
+ }
70
+ function y({ children: e, ...n }) {
71
+ return /* @__PURE__ */ o(p().Subscribe, {
72
+ selector: (e) => [e.canSubmit, e.isSubmitting],
73
+ children: ([r, i]) => /* @__PURE__ */ o(t.Root, {
74
+ type: "submit",
75
+ disabled: !r,
76
+ ...n,
77
+ children: i ? "Submitting…" : e
78
+ })
79
+ });
80
+ }
81
+ var { useAppForm: b, withForm: x } = c({
82
+ fieldContext: u,
83
+ formContext: d,
84
+ fieldComponents: {
85
+ TextField: h,
86
+ TextArea: g,
87
+ Checkbox: _,
88
+ DatePicker: v
89
+ },
90
+ formComponents: { SubmitButton: y }
91
+ });
92
+ //#endregion
93
+ export { b as useAppForm, f as useFieldContext, p as useFormContext, x as withForm };
94
+
95
+ //# sourceMappingURL=app-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-form.js","names":[],"sources":["../../../src/components/form/app-form.tsx"],"sourcesContent":["import { createFormHook, createFormHookContexts } from '@tanstack/react-form'\nimport { Button } from '#/components/button'\nimport { Checkbox } from '#/components/checkbox'\nimport { DatePicker } from '#/components/date-picker'\nimport { cn } from '#/lib/cn'\nimport { Input, TextField } from './Input'\n\nimport type { ComponentProps, ReactNode } from 'react'\n\n/**\n * App forms — TanStack Form (https://tanstack.com/form) bound to the M3 text\n * fields ported from port/core/ui/components/text-field. This is the\n * recommended way to build forms in this app; the Base UI Form/Field family\n * remains for the design-guide catalog.\n *\n * `useAppForm` pre-binds field components via TanStack's createFormHook, so\n * fields read state from field context — no manual value/onChange wiring:\n *\n * const form = useAppForm({\n * defaultValues: { email: '', story: '', agree: false },\n * onSubmit: async ({ value }) => save(value),\n * })\n *\n * <form onSubmit={(e) => { e.preventDefault(); form.handleSubmit() }}>\n * <form.AppField\n * name=\"email\"\n * validators={{ onChange: ({ value }) => (!value ? 'Required' : undefined) }}\n * >\n * {(field) => <field.TextField label=\"Email\" />}\n * </form.AppField>\n * <form.AppForm>\n * <form.SubmitButton>Save</form.SubmitButton>\n * </form.AppForm>\n * </form>\n */\n\nexport const { fieldContext, formContext, useFieldContext, useFormContext } =\n createFormHookContexts()\n\n/** M3 error supporting text under a field; shown once the field was touched. */\nfunction FieldErrors() {\n const field = useFieldContext()\n const { errors, isTouched } = field.state.meta\n if (!isTouched || errors.length === 0) return null\n return (\n <p className=\"m-0 px-3 text-body-small text-error\">\n {errors\n .map((e: unknown) =>\n typeof e === 'string' ? e : ((e as { message?: string } | null)?.message ?? ''),\n )\n .filter(Boolean)\n .join(' ')}\n </p>\n )\n}\n\ntype BoundTextFieldProps = Omit<\n ComponentProps<typeof Input>,\n 'value' | 'onChange' | 'onBlur' | 'name'\n>\n\n/** Single-line M3 text field bound to the field context (port anatomy). */\nfunction AppTextField({ className, ...props }: BoundTextFieldProps) {\n const field = useFieldContext<string>()\n const invalid = field.state.meta.isTouched && field.state.meta.errors.length > 0\n return (\n <div className={cn('flex w-full flex-col gap-1', className)}>\n <Input\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n data-invalid={invalid ? '' : undefined}\n {...props}\n />\n <FieldErrors />\n </div>\n )\n}\n\ntype BoundTextAreaProps = Omit<\n ComponentProps<typeof TextField>,\n 'value' | 'onChange' | 'onBlur' | 'name'\n>\n\n/** Multi-line M3 text field bound to the field context (port anatomy). */\nfunction AppTextArea({ className, ...props }: BoundTextAreaProps) {\n const field = useFieldContext<string>()\n const invalid = field.state.meta.isTouched && field.state.meta.errors.length > 0\n return (\n <div className={cn('flex w-full flex-col gap-1', className)}>\n <TextField\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n data-invalid={invalid ? '' : undefined}\n {...props}\n />\n <FieldErrors />\n </div>\n )\n}\n\n/** Port-styled checkbox bound to a boolean field. */\nfunction AppCheckbox({ label }: { label: ReactNode }) {\n const field = useFieldContext<boolean>()\n return (\n <div className=\"flex flex-col gap-1\">\n <Checkbox\n name={field.name}\n label={label}\n checked={field.state.value}\n onCheckedChange={(checked) => field.handleChange(checked === true)}\n onBlur={field.handleBlur}\n />\n <FieldErrors />\n </div>\n )\n}\n\ntype BoundDatePickerProps = Omit<\n ComponentProps<typeof DatePicker>,\n 'value' | 'onChange' | 'name'\n>\n\n/** M3 docked date picker bound to a `Date | null` field. */\nfunction AppDatePicker({ className, ...props }: BoundDatePickerProps) {\n const field = useFieldContext<Date | null>()\n return (\n <div className={cn('flex w-full flex-col gap-1', className)}>\n <DatePicker\n name={field.name}\n value={field.state.value}\n onChange={(date) => field.handleChange(date)}\n {...props}\n />\n <FieldErrors />\n </div>\n )\n}\n\n/** Filled M3 submit button; disabled while the form can't submit. */\nfunction SubmitButton({ children, ...props }: ComponentProps<typeof Button.Root>) {\n const form = useFormContext()\n return (\n <form.Subscribe selector={(state) => [state.canSubmit, state.isSubmitting]}>\n {([canSubmit, isSubmitting]) => (\n <Button.Root type=\"submit\" disabled={!canSubmit} {...props}>\n {isSubmitting ? 'Submitting…' : children}\n </Button.Root>\n )}\n </form.Subscribe>\n )\n}\n\nexport const { useAppForm, withForm } = createFormHook({\n fieldContext,\n formContext,\n fieldComponents: {\n TextField: AppTextField,\n TextArea: AppTextArea,\n Checkbox: AppCheckbox,\n DatePicker: AppDatePicker,\n },\n formComponents: {\n SubmitButton,\n },\n})\n"],"mappings":";;;;;;;;AAoCA,IAAa,EAAE,iBAAc,gBAAa,oBAAiB,sBACzD,EAAuB;AAGzB,SAAS,IAAc;CAErB,IAAM,EAAE,WAAQ,iBADF,EACgB,EAAM,MAAM;CAE1C,OADI,CAAC,KAAa,EAAO,WAAW,IAAU,OAE5C,kBAAC,KAAD;EAAG,WAAU;YACV,EACE,KAAK,MACJ,OAAO,KAAM,WAAW,IAAM,GAAmC,WAAW,EAC9E,EACC,OAAO,OAAO,EACd,KAAK,GAAG;CACV,CAAA;AAEP;AAQA,SAAS,EAAa,EAAE,cAAW,GAAG,KAA8B;CAClE,IAAM,IAAQ,EAAwB,GAChC,IAAU,EAAM,MAAM,KAAK,aAAa,EAAM,MAAM,KAAK,OAAO,SAAS;CAC/E,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,8BAA8B,CAAS;YAA1D,CACE,kBAAC,GAAD;GACE,MAAM,EAAM;GACZ,OAAO,EAAM,MAAM;GACnB,WAAW,MAAM,EAAM,aAAa,EAAE,OAAO,KAAK;GAClD,QAAQ,EAAM;GACd,gBAAc,IAAU,KAAK,KAAA;GAC7B,GAAI;EACL,CAAA,GACD,kBAAC,GAAD,CAAc,CAAA,CACX;;AAET;AAQA,SAAS,EAAY,EAAE,cAAW,GAAG,KAA6B;CAChE,IAAM,IAAQ,EAAwB,GAChC,IAAU,EAAM,MAAM,KAAK,aAAa,EAAM,MAAM,KAAK,OAAO,SAAS;CAC/E,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,8BAA8B,CAAS;YAA1D,CACE,kBAAC,GAAD;GACE,MAAM,EAAM;GACZ,OAAO,EAAM,MAAM;GACnB,WAAW,MAAM,EAAM,aAAa,EAAE,OAAO,KAAK;GAClD,QAAQ,EAAM;GACd,gBAAc,IAAU,KAAK,KAAA;GAC7B,GAAI;EACL,CAAA,GACD,kBAAC,GAAD,CAAc,CAAA,CACX;;AAET;AAGA,SAAS,EAAY,EAAE,YAA+B;CACpD,IAAM,IAAQ,EAAyB;CACvC,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD;GACE,MAAM,EAAM;GACL;GACP,SAAS,EAAM,MAAM;GACrB,kBAAkB,MAAY,EAAM,aAAa,MAAY,EAAI;GACjE,QAAQ,EAAM;EACf,CAAA,GACD,kBAAC,GAAD,CAAc,CAAA,CACX;;AAET;AAQA,SAAS,EAAc,EAAE,cAAW,GAAG,KAA+B;CACpE,IAAM,IAAQ,EAA6B;CAC3C,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,8BAA8B,CAAS;YAA1D,CACE,kBAAC,GAAD;GACE,MAAM,EAAM;GACZ,OAAO,EAAM,MAAM;GACnB,WAAW,MAAS,EAAM,aAAa,CAAI;GAC3C,GAAI;EACL,CAAA,GACD,kBAAC,GAAD,CAAc,CAAA,CACX;;AAET;AAGA,SAAS,EAAa,EAAE,aAAU,GAAG,KAA6C;CAEhF,OACE,kBAFW,EAEV,EAAK,WAAN;EAAgB,WAAW,MAAU,CAAC,EAAM,WAAW,EAAM,YAAY;aACrE,CAAC,GAAW,OACZ,kBAAC,EAAO,MAAR;GAAa,MAAK;GAAS,UAAU,CAAC;GAAW,GAAI;aAClD,IAAe,gBAAgB;EACrB,CAAA;CAED,CAAA;AAEpB;AAEA,IAAa,EAAE,eAAY,gBAAa,EAAe;CACrD;CACA;CACA,iBAAiB;EACf,WAAW;EACX,UAAU;EACV,UAAU;EACV,YAAY;CACd;CACA,gBAAgB,EACd,gBACF;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { Field, fieldControlClasses } from './Field';
2
+ export { Fieldset } from './Fieldset';
3
+ export { Form } from './Form';
4
+ export { Input, TextField, InputOutlined, InputFilled, TextFieldOutlined, TextFieldFilled, } from './Input';
5
+ export { useAppForm, withForm, useFieldContext, useFormContext } from './app-form';
@@ -0,0 +1,6 @@
1
+ import { Input as e, InputFilled as t, InputOutlined as n, TextField as r, TextFieldFilled as i, TextFieldOutlined as a } from "./Input.js";
2
+ import { Field as o, fieldControlClasses as s } from "./Field.js";
3
+ import { Fieldset as c } from "./Fieldset.js";
4
+ import { Form as l } from "./Form.js";
5
+ import { useAppForm as u, useFieldContext as d, useFormContext as f, withForm as p } from "./app-form.js";
6
+ export { o as Field, c as Fieldset, l as Form, e as Input, t as InputFilled, n as InputOutlined, r as TextField, i as TextFieldFilled, a as TextFieldOutlined, s as fieldControlClasses, u as useAppForm, d as useFieldContext, f as useFormContext, p as withForm };
@@ -0,0 +1,20 @@
1
+ import { ComponentProps } from 'react';
2
+ /**
3
+ * Kbd / Hotkey — M3 keyboard-key chips over TanStack Hotkeys' formatting
4
+ * helpers (https://tanstack.com/hotkeys). Behaviour hooks (useHotkey, …)
5
+ * re-export from './hotkeys'; this file is display only.
6
+ *
7
+ * <Kbd>⌘K</Kbd> — single key cap
8
+ * <Hotkey hotkey="mod+k" /> — combo rendered as platform-aware key caps
9
+ */
10
+ /** Single M3 key cap: surface-container-high chip with key-cap bottom edge. */
11
+ declare function Kbd({ className, ...props }: ComponentProps<'kbd'>): import("react").JSX.Element;
12
+ type HotkeyProps = Omit<ComponentProps<'span'>, 'children'> & {
13
+ /** Hotkey string, e.g. 'mod+k', 'Shift+/'. `mod` adapts per platform. */
14
+ hotkey: string;
15
+ /** Force a platform's symbols (⌘⇧ on mac, Ctrl/Shift text elsewhere). Defaults to auto-detection. */
16
+ platform?: 'mac' | 'windows' | 'linux';
17
+ };
18
+ /** Hotkey combo as a row of Kbd chips joined with '+', platform-aware symbols. */
19
+ declare function Hotkey({ hotkey, platform, className, ...props }: HotkeyProps): import("react").JSX.Element;
20
+ export { Kbd, Hotkey };
@@ -0,0 +1,31 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { Fragment as r } from "react";
4
+ import { detectPlatform as i, formatForDisplay as a } from "@tanstack/react-hotkeys";
5
+ //#region src/components/hotkeys/Kbd.tsx
6
+ function o({ className: n, ...r }) {
7
+ return /* @__PURE__ */ t("kbd", {
8
+ className: e("inline-flex h-6 min-w-6 items-center justify-center px-1.5", "rounded-extra-small border border-b-2 border-outline-variant bg-surface-container-high", "font-sans text-label-small text-on-surface-variant tabular-nums", n),
9
+ ...r
10
+ });
11
+ }
12
+ var s = "\0";
13
+ function c({ hotkey: c, platform: l, className: u, ...d }) {
14
+ let f = a(c, {
15
+ platform: l ?? i(),
16
+ separatorToken: s
17
+ }).split(s);
18
+ return /* @__PURE__ */ t("span", {
19
+ className: e("inline-flex items-center gap-1", u),
20
+ ...d,
21
+ children: f.map((e, i) => /* @__PURE__ */ n(r, { children: [i > 0 && /* @__PURE__ */ t("span", {
22
+ "aria-hidden": !0,
23
+ className: "text-label-small text-on-surface-variant",
24
+ children: "+"
25
+ }), /* @__PURE__ */ t(o, { children: e })] }, `${i}-${e}`))
26
+ });
27
+ }
28
+ //#endregion
29
+ export { c as Hotkey, o as Kbd };
30
+
31
+ //# sourceMappingURL=Kbd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kbd.js","names":[],"sources":["../../../src/components/hotkeys/Kbd.tsx"],"sourcesContent":["import { Fragment } from 'react'\nimport { detectPlatform, formatForDisplay } from '@tanstack/react-hotkeys'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Kbd / Hotkey — M3 keyboard-key chips over TanStack Hotkeys' formatting\n * helpers (https://tanstack.com/hotkeys). Behaviour hooks (useHotkey, …)\n * re-export from './hotkeys'; this file is display only.\n *\n * <Kbd>⌘K</Kbd> — single key cap\n * <Hotkey hotkey=\"mod+k\" /> — combo rendered as platform-aware key caps\n */\n\n/** Single M3 key cap: surface-container-high chip with key-cap bottom edge. */\nfunction Kbd({ className, ...props }: ComponentProps<'kbd'>) {\n return (\n <kbd\n className={cn(\n 'inline-flex h-6 min-w-6 items-center justify-center px-1.5',\n 'rounded-extra-small border border-b-2 border-outline-variant bg-surface-container-high',\n 'font-sans text-label-small text-on-surface-variant tabular-nums',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Sentinel separator so display tokens split safely even when the key is '+'. */\nconst TOKEN_SEPARATOR = '\u0000'\n\ntype HotkeyProps = Omit<ComponentProps<'span'>, 'children'> & {\n /** Hotkey string, e.g. 'mod+k', 'Shift+/'. `mod` adapts per platform. */\n hotkey: string\n /** Force a platform's symbols (⌘⇧ on mac, Ctrl/Shift text elsewhere). Defaults to auto-detection. */\n platform?: 'mac' | 'windows' | 'linux'\n}\n\n/** Hotkey combo as a row of Kbd chips joined with '+', platform-aware symbols. */\nfunction Hotkey({ hotkey, platform, className, ...props }: HotkeyProps) {\n const resolved = platform ?? detectPlatform()\n const tokens = formatForDisplay(hotkey, {\n platform: resolved,\n separatorToken: TOKEN_SEPARATOR,\n }).split(TOKEN_SEPARATOR)\n return (\n <span className={cn('inline-flex items-center gap-1', className)} {...props}>\n {tokens.map((token, index) => (\n <Fragment key={`${index}-${token}`}>\n {index > 0 && (\n <span aria-hidden className=\"text-label-small text-on-surface-variant\">\n +\n </span>\n )}\n <Kbd>{token}</Kbd>\n </Fragment>\n ))}\n </span>\n )\n}\n\nexport { Kbd, Hotkey }\n"],"mappings":";;;;;AAgBA,SAAS,EAAI,EAAE,cAAW,GAAG,KAAgC;CAC3D,OACE,kBAAC,OAAD;EACE,WAAW,EACT,8DACA,0FACA,mEACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,IAAM,IAAkB;AAUxB,SAAS,EAAO,EAAE,WAAQ,aAAU,cAAW,GAAG,KAAsB;CAEtE,IAAM,IAAS,EAAiB,GAAQ;EACtC,UAFe,KAAY,EAAe;EAG1C,gBAAgB;CAClB,CAAC,EAAE,MAAM,CAAe;CACxB,OACE,kBAAC,QAAD;EAAM,WAAW,EAAG,kCAAkC,CAAS;EAAG,GAAI;YACnE,EAAO,KAAK,GAAO,MAClB,kBAAC,GAAD,EAAA,UAAA,CACG,IAAQ,KACP,kBAAC,QAAD;GAAM,eAAA;GAAY,WAAU;aAA2C;EAEjE,CAAA,GAER,kBAAC,GAAD,EAAA,UAAM,EAAW,CAAA,CACT,EAAA,GAPK,GAAG,EAAM,GAAG,GAOjB,CACX;CACG,CAAA;AAEV"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Hotkeys — TanStack Hotkeys (https://tanstack.com/hotkeys) is this app's
3
+ * keyboard-shortcut engine. App code imports the blessed surface from
4
+ * '#/components/hotkeys' rather than the library directly, mirroring how
5
+ * forms wrap TanStack Form (see src/components/form/app-form.tsx).
6
+ *
7
+ * useHotkey('Mod+K', openPalette) — single combo (Mod = ⌘ / Ctrl)
8
+ * useHotkeys([...]) — several combos at once
9
+ * useHotkeySequence(['G', 'D'], goHome) — Vim-style sequences
10
+ * useKeyHold('Shift') — reactive held-key boolean
11
+ * <HotkeysProvider> — scoped defaults (optional)
12
+ * formatForDisplay('Mod+K') — '⌘ K' / 'Ctrl+K' for UI text
13
+ */
14
+ export { HotkeysProvider, formatForDisplay, useHotkey, useHotkeys, useHotkeySequence, useKeyHold, } from '@tanstack/react-hotkeys';
@@ -0,0 +1,2 @@
1
+ import { HotkeysProvider as e, formatForDisplay as t, useHotkey as n, useHotkeySequence as r, useHotkeys as i, useKeyHold as a } from "@tanstack/react-hotkeys";
2
+ export { e as HotkeysProvider, t as formatForDisplay, n as useHotkey, r as useHotkeySequence, i as useHotkeys, a as useKeyHold };
@@ -0,0 +1,2 @@
1
+ export { Kbd, Hotkey } from './Kbd';
2
+ export { HotkeysProvider, formatForDisplay, useHotkey, useHotkeys, useHotkeySequence, useKeyHold, } from './hotkeys';
@@ -0,0 +1,3 @@
1
+ import { Hotkey as e, Kbd as t } from "./Kbd.js";
2
+ import { HotkeysProvider as n, formatForDisplay as r, useHotkey as i, useHotkeySequence as a, useHotkeys as o, useKeyHold as s } from "./hotkeys.js";
3
+ export { e as Hotkey, n as HotkeysProvider, t as Kbd, r as formatForDisplay, i as useHotkey, a as useHotkeySequence, o as useHotkeys, s as useKeyHold };
@@ -0,0 +1,84 @@
1
+ import { Menu as BaseMenu } from '@base-ui/react/menu';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * Menu — Material 3 styled wrapper over Base UI's headless Menu.
5
+ * Behaviour/accessibility (click/keyboard open, typeahead, roving focus,
6
+ * submenus, detached triggers): Base UI (https://base-ui.com/react/components/menu).
7
+ * Visuals: M3 menu anatomy — surface-container at elevation 2, small (8px)
8
+ * corner, 48px label-large items with leading/trailing slots, state layers.
9
+ * Design ref: port/core/ui/components/dropdown + overflow-menu (see CLAUDE.md).
10
+ *
11
+ * Compound API mirrors Base UI:
12
+ * <Menu.Root>
13
+ * <Menu.Trigger>Open</Menu.Trigger>
14
+ * <Menu.Portal>
15
+ * <Menu.Positioner>
16
+ * <Menu.Popup>
17
+ * <Menu.Item>Copy</Menu.Item>
18
+ * <Menu.Separator />
19
+ * <Menu.SubmenuRoot>
20
+ * <Menu.SubmenuTrigger>Share</Menu.SubmenuTrigger>
21
+ * …
22
+ * </Menu.SubmenuRoot>
23
+ * </Menu.Popup>
24
+ * </Menu.Positioner>
25
+ * </Menu.Portal>
26
+ * </Menu.Root>
27
+ */
28
+ declare const Root: <Payload>(props: BaseMenu.Root.Props<Payload>) => import("react").JSX.Element;
29
+ declare const Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ContextMenuPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
30
+ declare const SubmenuRoot: typeof BaseMenu.SubmenuRoot;
31
+ /** Imperative handle connecting a Menu.Root with detached Menu.Trigger components. */
32
+ declare const Handle: typeof BaseMenu.Handle;
33
+ declare const createHandle: typeof BaseMenu.createHandle;
34
+ /** Button that opens the menu — style it like any M3 button at the call site. */
35
+ declare function Trigger({ className, ...props }: ComponentProps<typeof BaseMenu.Trigger>): import("react").JSX.Element;
36
+ /** Invisible click-capture layer behind the menu (menus use no scrim). */
37
+ declare function Backdrop({ className, ...props }: ComponentProps<typeof BaseMenu.Backdrop>): import("react").JSX.Element;
38
+ declare function Positioner({ className, sideOffset, ...props }: ComponentProps<typeof BaseMenu.Positioner>): import("react").JSX.Element;
39
+ declare function Popup({ className, ...props }: ComponentProps<typeof BaseMenu.Popup>): import("react").JSX.Element;
40
+ /** Optional pointer toward the anchor — rarely used for menus; unstyled hook point. */
41
+ declare function Arrow({ className, ...props }: ComponentProps<typeof BaseMenu.Arrow>): import("react").JSX.Element;
42
+ /** Transition container — only needed when one menu is shared by several triggers. */
43
+ declare function Viewport({ className, ...props }: ComponentProps<typeof BaseMenu.Viewport>): import("react").JSX.Element;
44
+ declare function Group({ className, ...props }: ComponentProps<typeof BaseMenu.Group>): import("react").JSX.Element;
45
+ declare function GroupLabel({ className, ...props }: ComponentProps<typeof BaseMenu.GroupLabel>): import("react").JSX.Element;
46
+ declare function Item({ className, ...props }: ComponentProps<typeof BaseMenu.Item>): import("react").JSX.Element;
47
+ /** Menu item that renders an anchor element. */
48
+ declare function LinkItem({ className, ...props }: ComponentProps<typeof BaseMenu.LinkItem>): import("react").JSX.Element;
49
+ declare function CheckboxItem({ className, ...props }: ComponentProps<typeof BaseMenu.CheckboxItem>): import("react").JSX.Element;
50
+ /** Leading 20px slot for the check mark — pass `keepMounted` to hold alignment. */
51
+ declare function CheckboxItemIndicator({ className, ...props }: ComponentProps<typeof BaseMenu.CheckboxItemIndicator>): import("react").JSX.Element;
52
+ declare function RadioGroup({ className, ...props }: ComponentProps<typeof BaseMenu.RadioGroup>): import("react").JSX.Element;
53
+ declare function RadioItem({ className, ...props }: ComponentProps<typeof BaseMenu.RadioItem>): import("react").JSX.Element;
54
+ /** Leading 20px slot for the selected mark — pass `keepMounted` to hold alignment. */
55
+ declare function RadioItemIndicator({ className, ...props }: ComponentProps<typeof BaseMenu.RadioItemIndicator>): import("react").JSX.Element;
56
+ /** Item that opens a nested menu; renders a trailing chevron automatically. */
57
+ declare function SubmenuTrigger({ className, children, ...props }: ComponentProps<typeof BaseMenu.SubmenuTrigger>): import("react").JSX.Element;
58
+ /** M3 divider between menu sections. */
59
+ declare function Separator({ className, ...props }: ComponentProps<typeof BaseMenu.Separator>): import("react").JSX.Element;
60
+ export declare const Menu: {
61
+ Root: <Payload>(props: BaseMenu.Root.Props<Payload>) => import("react").JSX.Element;
62
+ Trigger: typeof Trigger;
63
+ Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ContextMenuPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
64
+ Backdrop: typeof Backdrop;
65
+ Positioner: typeof Positioner;
66
+ Popup: typeof Popup;
67
+ Arrow: typeof Arrow;
68
+ Viewport: typeof Viewport;
69
+ Group: typeof Group;
70
+ GroupLabel: typeof GroupLabel;
71
+ Item: typeof Item;
72
+ LinkItem: typeof LinkItem;
73
+ CheckboxItem: typeof CheckboxItem;
74
+ CheckboxItemIndicator: typeof CheckboxItemIndicator;
75
+ RadioGroup: typeof RadioGroup;
76
+ RadioItem: typeof RadioItem;
77
+ RadioItemIndicator: typeof RadioItemIndicator;
78
+ SubmenuRoot: typeof BaseMenu.SubmenuRoot;
79
+ SubmenuTrigger: typeof SubmenuTrigger;
80
+ Separator: typeof Separator;
81
+ Handle: typeof BaseMenu.Handle;
82
+ createHandle: typeof BaseMenu.createHandle;
83
+ };
84
+ export { Root, Trigger, Portal, Backdrop, Positioner, Popup, Arrow, Viewport, Group, GroupLabel, Item, LinkItem, CheckboxItem, CheckboxItemIndicator, RadioGroup, RadioItem, RadioItemIndicator, SubmenuRoot, SubmenuTrigger, Separator, Handle, createHandle, };
@@ -0,0 +1,142 @@
1
+ import { cn as e } from "../../lib/cn.js";
2
+ import { ChevronRight as t } from "lucide-react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ import { Menu as i } from "@base-ui/react/menu";
5
+ //#region src/components/menu/Menu.tsx
6
+ var a = i.Root, o = i.Portal, s = i.SubmenuRoot, c = i.Handle, l = i.createHandle;
7
+ function u({ className: t, ...r }) {
8
+ return /* @__PURE__ */ n(i.Trigger, {
9
+ className: e("select-none", t),
10
+ ...r
11
+ });
12
+ }
13
+ function d({ className: t, ...r }) {
14
+ return /* @__PURE__ */ n(i.Backdrop, {
15
+ className: e("fixed inset-0 z-40", t),
16
+ ...r
17
+ });
18
+ }
19
+ function f({ className: t, sideOffset: r = 4, ...a }) {
20
+ return /* @__PURE__ */ n(i.Positioner, {
21
+ className: e("z-50 outline-none", t),
22
+ sideOffset: r,
23
+ ...a
24
+ });
25
+ }
26
+ function p({ className: t, ...r }) {
27
+ return /* @__PURE__ */ n(i.Popup, {
28
+ className: e("flex max-h-[310px] min-w-[112px] max-w-[280px] flex-col overflow-y-auto", "rounded-small bg-surface-container py-2 text-on-surface shadow-mm-2", "origin-(--transform-origin) transition-[opacity,transform] duration-150 ease-out focus:outline-none", "data-[starting-style]:scale-95 data-[starting-style]:opacity-0", "data-[ending-style]:scale-95 data-[ending-style]:opacity-0", t),
29
+ ...r
30
+ });
31
+ }
32
+ function m({ className: t, ...r }) {
33
+ return /* @__PURE__ */ n(i.Arrow, {
34
+ className: e(t),
35
+ ...r
36
+ });
37
+ }
38
+ function h({ className: t, ...r }) {
39
+ return /* @__PURE__ */ n(i.Viewport, {
40
+ className: e("relative flex flex-col", t),
41
+ ...r
42
+ });
43
+ }
44
+ function g({ className: t, ...r }) {
45
+ return /* @__PURE__ */ n(i.Group, {
46
+ className: e("flex flex-col", t),
47
+ ...r
48
+ });
49
+ }
50
+ function _({ className: t, ...r }) {
51
+ return /* @__PURE__ */ n(i.GroupLabel, {
52
+ className: e("px-3 py-2 text-label-small text-on-surface-variant", t),
53
+ ...r
54
+ });
55
+ }
56
+ var v = e("flex h-12 cursor-pointer select-none items-center gap-3 pl-3 pr-6", "text-label-large text-on-surface outline-none transition-colors", "data-[highlighted]:bg-on-surface/[0.08]", "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-[0.38]");
57
+ function y({ className: t, ...r }) {
58
+ return /* @__PURE__ */ n(i.Item, {
59
+ className: e(v, t),
60
+ ...r
61
+ });
62
+ }
63
+ function b({ className: t, ...r }) {
64
+ return /* @__PURE__ */ n(i.LinkItem, {
65
+ className: e(v, "no-underline", t),
66
+ ...r
67
+ });
68
+ }
69
+ function x({ className: t, ...r }) {
70
+ return /* @__PURE__ */ n(i.CheckboxItem, {
71
+ className: e(v, t),
72
+ ...r
73
+ });
74
+ }
75
+ function S({ className: t, ...r }) {
76
+ return /* @__PURE__ */ n(i.CheckboxItemIndicator, {
77
+ className: e("flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible", t),
78
+ ...r
79
+ });
80
+ }
81
+ function C({ className: t, ...r }) {
82
+ return /* @__PURE__ */ n(i.RadioGroup, {
83
+ className: e("flex flex-col", t),
84
+ ...r
85
+ });
86
+ }
87
+ function w({ className: t, ...r }) {
88
+ return /* @__PURE__ */ n(i.RadioItem, {
89
+ className: e(v, t),
90
+ ...r
91
+ });
92
+ }
93
+ function T({ className: t, ...r }) {
94
+ return /* @__PURE__ */ n(i.RadioItemIndicator, {
95
+ className: e("flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible", t),
96
+ ...r
97
+ });
98
+ }
99
+ function E({ className: a, children: o, ...s }) {
100
+ return /* @__PURE__ */ r(i.SubmenuTrigger, {
101
+ className: e(v, "data-[popup-open]:bg-on-surface/[0.08]", a),
102
+ ...s,
103
+ children: [o, /* @__PURE__ */ n(t, {
104
+ "aria-hidden": !0,
105
+ className: "ml-auto size-5 shrink-0 text-on-surface-variant"
106
+ })]
107
+ });
108
+ }
109
+ function D({ className: t, ...r }) {
110
+ return /* @__PURE__ */ n(i.Separator, {
111
+ className: e("my-2 h-px shrink-0 bg-outline-variant", t),
112
+ ...r
113
+ });
114
+ }
115
+ var O = {
116
+ Root: a,
117
+ Trigger: u,
118
+ Portal: o,
119
+ Backdrop: d,
120
+ Positioner: f,
121
+ Popup: p,
122
+ Arrow: m,
123
+ Viewport: h,
124
+ Group: g,
125
+ GroupLabel: _,
126
+ Item: y,
127
+ LinkItem: b,
128
+ CheckboxItem: x,
129
+ CheckboxItemIndicator: S,
130
+ RadioGroup: C,
131
+ RadioItem: w,
132
+ RadioItemIndicator: T,
133
+ SubmenuRoot: s,
134
+ SubmenuTrigger: E,
135
+ Separator: D,
136
+ Handle: c,
137
+ createHandle: l
138
+ };
139
+ //#endregion
140
+ export { m as Arrow, d as Backdrop, x as CheckboxItem, S as CheckboxItemIndicator, g as Group, _ as GroupLabel, c as Handle, y as Item, b as LinkItem, O as Menu, p as Popup, o as Portal, f as Positioner, C as RadioGroup, w as RadioItem, T as RadioItemIndicator, a as Root, D as Separator, s as SubmenuRoot, E as SubmenuTrigger, u as Trigger, h as Viewport, l as createHandle };
141
+
142
+ //# sourceMappingURL=Menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.js","names":[],"sources":["../../../src/components/menu/Menu.tsx"],"sourcesContent":["import { Menu as BaseMenu } from '@base-ui/react/menu'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Menu — Material 3 styled wrapper over Base UI's headless Menu.\n * Behaviour/accessibility (click/keyboard open, typeahead, roving focus,\n * submenus, detached triggers): Base UI (https://base-ui.com/react/components/menu).\n * Visuals: M3 menu anatomy — surface-container at elevation 2, small (8px)\n * corner, 48px label-large items with leading/trailing slots, state layers.\n * Design ref: port/core/ui/components/dropdown + overflow-menu (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <Menu.Root>\n * <Menu.Trigger>Open</Menu.Trigger>\n * <Menu.Portal>\n * <Menu.Positioner>\n * <Menu.Popup>\n * <Menu.Item>Copy</Menu.Item>\n * <Menu.Separator />\n * <Menu.SubmenuRoot>\n * <Menu.SubmenuTrigger>Share</Menu.SubmenuTrigger>\n * …\n * </Menu.SubmenuRoot>\n * </Menu.Popup>\n * </Menu.Positioner>\n * </Menu.Portal>\n * </Menu.Root>\n */\n\nconst Root = BaseMenu.Root\nconst Portal = BaseMenu.Portal\nconst SubmenuRoot = BaseMenu.SubmenuRoot\n/** Imperative handle connecting a Menu.Root with detached Menu.Trigger components. */\nconst Handle = BaseMenu.Handle\nconst createHandle = BaseMenu.createHandle\n\n/** Button that opens the menu — style it like any M3 button at the call site. */\nfunction Trigger({ className, ...props }: ComponentProps<typeof BaseMenu.Trigger>) {\n return <BaseMenu.Trigger className={cn('select-none', className)} {...props} />\n}\n\n/** Invisible click-capture layer behind the menu (menus use no scrim). */\nfunction Backdrop({ className, ...props }: ComponentProps<typeof BaseMenu.Backdrop>) {\n return <BaseMenu.Backdrop className={cn('fixed inset-0 z-40', className)} {...props} />\n}\n\nfunction Positioner({\n className,\n sideOffset = 4,\n ...props\n}: ComponentProps<typeof BaseMenu.Positioner>) {\n return (\n <BaseMenu.Positioner\n className={cn('z-50 outline-none', className)}\n sideOffset={sideOffset}\n {...props}\n />\n )\n}\n\nfunction Popup({ className, ...props }: ComponentProps<typeof BaseMenu.Popup>) {\n return (\n <BaseMenu.Popup\n className={cn(\n 'flex max-h-[310px] min-w-[112px] max-w-[280px] flex-col overflow-y-auto',\n 'rounded-small bg-surface-container py-2 text-on-surface shadow-mm-2',\n 'origin-(--transform-origin) transition-[opacity,transform] duration-150 ease-out focus:outline-none',\n 'data-[starting-style]:scale-95 data-[starting-style]:opacity-0',\n 'data-[ending-style]:scale-95 data-[ending-style]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Optional pointer toward the anchor — rarely used for menus; unstyled hook point. */\nfunction Arrow({ className, ...props }: ComponentProps<typeof BaseMenu.Arrow>) {\n return <BaseMenu.Arrow className={cn(className)} {...props} />\n}\n\n/** Transition container — only needed when one menu is shared by several triggers. */\nfunction Viewport({ className, ...props }: ComponentProps<typeof BaseMenu.Viewport>) {\n return <BaseMenu.Viewport className={cn('relative flex flex-col', className)} {...props} />\n}\n\nfunction Group({ className, ...props }: ComponentProps<typeof BaseMenu.Group>) {\n return <BaseMenu.Group className={cn('flex flex-col', className)} {...props} />\n}\n\nfunction GroupLabel({ className, ...props }: ComponentProps<typeof BaseMenu.GroupLabel>) {\n return (\n <BaseMenu.GroupLabel\n className={cn('px-3 py-2 text-label-small text-on-surface-variant', className)}\n {...props}\n />\n )\n}\n\n/** Shared M3 list-item recipe: 48px row, label-large, state layers. */\nconst itemClasses = cn(\n 'flex h-12 cursor-pointer select-none items-center gap-3 pl-3 pr-6',\n 'text-label-large text-on-surface outline-none transition-colors',\n 'data-[highlighted]:bg-on-surface/[0.08]',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-[0.38]',\n)\n\nfunction Item({ className, ...props }: ComponentProps<typeof BaseMenu.Item>) {\n return <BaseMenu.Item className={cn(itemClasses, className)} {...props} />\n}\n\n/** Menu item that renders an anchor element. */\nfunction LinkItem({ className, ...props }: ComponentProps<typeof BaseMenu.LinkItem>) {\n return <BaseMenu.LinkItem className={cn(itemClasses, 'no-underline', className)} {...props} />\n}\n\nfunction CheckboxItem({ className, ...props }: ComponentProps<typeof BaseMenu.CheckboxItem>) {\n return <BaseMenu.CheckboxItem className={cn(itemClasses, className)} {...props} />\n}\n\n/** Leading 20px slot for the check mark — pass `keepMounted` to hold alignment. */\nfunction CheckboxItemIndicator({\n className,\n ...props\n}: ComponentProps<typeof BaseMenu.CheckboxItemIndicator>) {\n return (\n <BaseMenu.CheckboxItemIndicator\n className={cn(\n 'flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction RadioGroup({ className, ...props }: ComponentProps<typeof BaseMenu.RadioGroup>) {\n return <BaseMenu.RadioGroup className={cn('flex flex-col', className)} {...props} />\n}\n\nfunction RadioItem({ className, ...props }: ComponentProps<typeof BaseMenu.RadioItem>) {\n return <BaseMenu.RadioItem className={cn(itemClasses, className)} {...props} />\n}\n\n/** Leading 20px slot for the selected mark — pass `keepMounted` to hold alignment. */\nfunction RadioItemIndicator({\n className,\n ...props\n}: ComponentProps<typeof BaseMenu.RadioItemIndicator>) {\n return (\n <BaseMenu.RadioItemIndicator\n className={cn(\n 'flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Item that opens a nested menu; renders a trailing chevron automatically. */\nfunction SubmenuTrigger({\n className,\n children,\n ...props\n}: ComponentProps<typeof BaseMenu.SubmenuTrigger>) {\n return (\n <BaseMenu.SubmenuTrigger\n className={cn(itemClasses, 'data-[popup-open]:bg-on-surface/[0.08]', className)}\n {...props}\n >\n {children}\n <ChevronRight aria-hidden className=\"ml-auto size-5 shrink-0 text-on-surface-variant\" />\n </BaseMenu.SubmenuTrigger>\n )\n}\n\n/** M3 divider between menu sections. */\nfunction Separator({ className, ...props }: ComponentProps<typeof BaseMenu.Separator>) {\n return (\n <BaseMenu.Separator\n className={cn('my-2 h-px shrink-0 bg-outline-variant', className)}\n {...props}\n />\n )\n}\n\nexport const Menu = {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Positioner,\n Popup,\n Arrow,\n Viewport,\n Group,\n GroupLabel,\n Item,\n LinkItem,\n CheckboxItem,\n CheckboxItemIndicator,\n RadioGroup,\n RadioItem,\n RadioItemIndicator,\n SubmenuRoot,\n SubmenuTrigger,\n Separator,\n Handle,\n createHandle,\n}\nexport {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Positioner,\n Popup,\n Arrow,\n Viewport,\n Group,\n GroupLabel,\n Item,\n LinkItem,\n CheckboxItem,\n CheckboxItemIndicator,\n RadioGroup,\n RadioItem,\n RadioItemIndicator,\n SubmenuRoot,\n SubmenuTrigger,\n Separator,\n Handle,\n createHandle,\n}\n"],"mappings":";;;;;AAgCA,IAAM,IAAO,EAAS,MAChB,IAAS,EAAS,QAClB,IAAc,EAAS,aAEvB,IAAS,EAAS,QAClB,IAAe,EAAS;AAG9B,SAAS,EAAQ,EAAE,cAAW,GAAG,KAAkD;CACjF,OAAO,kBAAC,EAAS,SAAV;EAAkB,WAAW,EAAG,eAAe,CAAS;EAAG,GAAI;CAAQ,CAAA;AAChF;AAGA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAmD;CACnF,OAAO,kBAAC,EAAS,UAAV;EAAmB,WAAW,EAAG,sBAAsB,CAAS;EAAG,GAAI;CAAQ,CAAA;AACxF;AAEA,SAAS,EAAW,EAClB,cACA,gBAAa,GACb,GAAG,KAC0C;CAC7C,OACE,kBAAC,EAAS,YAAV;EACE,WAAW,EAAG,qBAAqB,CAAS;EAChC;EACZ,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAgD;CAC7E,OACE,kBAAC,EAAS,OAAV;EACE,WAAW,EACT,2EACA,uEACA,uGACA,kEACA,8DACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAgD;CAC7E,OAAO,kBAAC,EAAS,OAAV;EAAgB,WAAW,EAAG,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC/D;AAGA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAmD;CACnF,OAAO,kBAAC,EAAS,UAAV;EAAmB,WAAW,EAAG,0BAA0B,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC5F;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAgD;CAC7E,OAAO,kBAAC,EAAS,OAAV;EAAgB,WAAW,EAAG,iBAAiB,CAAS;EAAG,GAAI;CAAQ,CAAA;AAChF;AAEA,SAAS,EAAW,EAAE,cAAW,GAAG,KAAqD;CACvF,OACE,kBAAC,EAAS,YAAV;EACE,WAAW,EAAG,sDAAsD,CAAS;EAC7E,GAAI;CACL,CAAA;AAEL;AAGA,IAAM,IAAc,EAClB,qEACA,mEACA,2CACA,mEACF;AAEA,SAAS,EAAK,EAAE,cAAW,GAAG,KAA+C;CAC3E,OAAO,kBAAC,EAAS,MAAV;EAAe,WAAW,EAAG,GAAa,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC3E;AAGA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAmD;CACnF,OAAO,kBAAC,EAAS,UAAV;EAAmB,WAAW,EAAG,GAAa,gBAAgB,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC/F;AAEA,SAAS,EAAa,EAAE,cAAW,GAAG,KAAuD;CAC3F,OAAO,kBAAC,EAAS,cAAV;EAAuB,WAAW,EAAG,GAAa,CAAS;EAAG,GAAI;CAAQ,CAAA;AACnF;AAGA,SAAS,EAAsB,EAC7B,cACA,GAAG,KACqD;CACxD,OACE,kBAAC,EAAS,uBAAV;EACE,WAAW,EACT,+FACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAW,EAAE,cAAW,GAAG,KAAqD;CACvF,OAAO,kBAAC,EAAS,YAAV;EAAqB,WAAW,EAAG,iBAAiB,CAAS;EAAG,GAAI;CAAQ,CAAA;AACrF;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAoD;CACrF,OAAO,kBAAC,EAAS,WAAV;EAAoB,WAAW,EAAG,GAAa,CAAS;EAAG,GAAI;CAAQ,CAAA;AAChF;AAGA,SAAS,EAAmB,EAC1B,cACA,GAAG,KACkD;CACrD,OACE,kBAAC,EAAS,oBAAV;EACE,WAAW,EACT,+FACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAe,EACtB,cACA,aACA,GAAG,KAC8C;CACjD,OACE,kBAAC,EAAS,gBAAV;EACE,WAAW,EAAG,GAAa,0CAA0C,CAAS;EAC9E,GAAI;YAFN,CAIG,GACD,kBAAC,GAAD;GAAc,eAAA;GAAY,WAAU;EAAmD,CAAA,CAChE;;AAE7B;AAGA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAoD;CACrF,OACE,kBAAC,EAAS,WAAV;EACE,WAAW,EAAG,yCAAyC,CAAS;EAChE,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,IAAO;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -0,0 +1 @@
1
+ export { Menu, Root, Trigger, Portal, Backdrop, Positioner, Popup, Arrow, Viewport, Group, GroupLabel, Item, LinkItem, CheckboxItem, CheckboxItemIndicator, RadioGroup, RadioItem, RadioItemIndicator, SubmenuRoot, SubmenuTrigger, Separator, Handle, createHandle, } from './Menu';
@@ -0,0 +1,2 @@
1
+ import { Arrow as e, Backdrop as t, CheckboxItem as n, CheckboxItemIndicator as r, Group as i, GroupLabel as a, Handle as o, Item as s, LinkItem as c, Menu as l, Popup as u, Portal as d, Positioner as f, RadioGroup as p, RadioItem as m, RadioItemIndicator as h, Root as g, Separator as _, SubmenuRoot as v, SubmenuTrigger as y, Trigger as b, Viewport as x, createHandle as S } from "./Menu.js";
2
+ export { e as Arrow, t as Backdrop, n as CheckboxItem, r as CheckboxItemIndicator, i as Group, a as GroupLabel, o as Handle, s as Item, c as LinkItem, l as Menu, u as Popup, d as Portal, f as Positioner, p as RadioGroup, m as RadioItem, h as RadioItemIndicator, g as Root, _ as Separator, v as SubmenuRoot, y as SubmenuTrigger, b as Trigger, x as Viewport, S as createHandle };
@@ -0,0 +1,87 @@
1
+ import { Menubar as BaseMenubar } from '@base-ui/react/menubar';
2
+ import { Menu as BaseMenu } from '@base-ui/react/menu';
3
+ import { ComponentProps } from 'react';
4
+ /**
5
+ * Menubar — Material 3 styled wrapper over Base UI's headless Menubar.
6
+ * Behaviour/accessibility (roving focus across triggers, arrow-key navigation,
7
+ * hover-to-switch open menus, typeahead, submenus): Base UI
8
+ * (https://base-ui.com/react/components/menubar). The menubar package exports
9
+ * only the container; each menu inside is composed from `@base-ui/react/menu`
10
+ * parts, all wrapped here.
11
+ * Visuals: M3 — surface-container bar with full-shape text-button triggers
12
+ * (top-app-bar action anatomy), menus as surface-container at elevation 2,
13
+ * small (8px) corner, 48px label-large items with leading/trailing slots.
14
+ * Design ref: port/core/ui/components/top-app-bar + dropdown (see CLAUDE.md).
15
+ *
16
+ * Compound API:
17
+ * <Menubar.Root>
18
+ * <Menubar.Menu>
19
+ * <Menubar.Trigger>File</Menubar.Trigger>
20
+ * <Menubar.Portal>
21
+ * <Menubar.Positioner>
22
+ * <Menubar.Popup>
23
+ * <Menubar.Item>New…</Menubar.Item>
24
+ * <Menubar.Separator />
25
+ * <Menubar.SubmenuRoot>
26
+ * <Menubar.SubmenuTrigger>Share</Menubar.SubmenuTrigger>
27
+ * …
28
+ * </Menubar.SubmenuRoot>
29
+ * </Menubar.Popup>
30
+ * </Menubar.Positioner>
31
+ * </Menubar.Portal>
32
+ * </Menubar.Menu>
33
+ * </Menubar.Root>
34
+ */
35
+ /** The horizontal bar that hosts the menus (M3: surface-container strip). */
36
+ declare function Root({ className, ...props }: ComponentProps<typeof BaseMenubar>): import("react").JSX.Element;
37
+ /** One menu inside the bar — Base UI Menu.Root (renders no element itself). */
38
+ declare const Menu: <Payload>(props: BaseMenu.Root.Props<Payload>) => import("react").JSX.Element;
39
+ declare const Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ContextMenuPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
40
+ declare const SubmenuRoot: typeof BaseMenu.SubmenuRoot;
41
+ /** Menubar button (M3 text-button anatomy: 40px, full shape, label-large). */
42
+ declare function Trigger({ className, ...props }: ComponentProps<typeof BaseMenu.Trigger>): import("react").JSX.Element;
43
+ /** Invisible click-capture layer behind an open menu (menus use no scrim). */
44
+ declare function Backdrop({ className, ...props }: ComponentProps<typeof BaseMenu.Backdrop>): import("react").JSX.Element;
45
+ declare function Positioner({ className, ...props }: ComponentProps<typeof BaseMenu.Positioner>): import("react").JSX.Element;
46
+ declare function Popup({ className, ...props }: ComponentProps<typeof BaseMenu.Popup>): import("react").JSX.Element;
47
+ /** Optional pointer toward the anchor — rarely used for menus; unstyled hook point. */
48
+ declare function Arrow({ className, ...props }: ComponentProps<typeof BaseMenu.Arrow>): import("react").JSX.Element;
49
+ declare function Group({ className, ...props }: ComponentProps<typeof BaseMenu.Group>): import("react").JSX.Element;
50
+ declare function GroupLabel({ className, ...props }: ComponentProps<typeof BaseMenu.GroupLabel>): import("react").JSX.Element;
51
+ declare function Item({ className, ...props }: ComponentProps<typeof BaseMenu.Item>): import("react").JSX.Element;
52
+ /** Menu item that renders an anchor element. */
53
+ declare function LinkItem({ className, ...props }: ComponentProps<typeof BaseMenu.LinkItem>): import("react").JSX.Element;
54
+ declare function CheckboxItem({ className, ...props }: ComponentProps<typeof BaseMenu.CheckboxItem>): import("react").JSX.Element;
55
+ /** Leading 20px slot for the check mark — pass `keepMounted` to hold alignment. */
56
+ declare function CheckboxItemIndicator({ className, ...props }: ComponentProps<typeof BaseMenu.CheckboxItemIndicator>): import("react").JSX.Element;
57
+ declare function RadioGroup({ className, ...props }: ComponentProps<typeof BaseMenu.RadioGroup>): import("react").JSX.Element;
58
+ declare function RadioItem({ className, ...props }: ComponentProps<typeof BaseMenu.RadioItem>): import("react").JSX.Element;
59
+ /** Leading 20px slot for the selected mark — pass `keepMounted` to hold alignment. */
60
+ declare function RadioItemIndicator({ className, ...props }: ComponentProps<typeof BaseMenu.RadioItemIndicator>): import("react").JSX.Element;
61
+ /** Item that opens a nested menu; renders a trailing chevron automatically. */
62
+ declare function SubmenuTrigger({ className, children, ...props }: ComponentProps<typeof BaseMenu.SubmenuTrigger>): import("react").JSX.Element;
63
+ /** M3 divider between menu sections. */
64
+ declare function Separator({ className, ...props }: ComponentProps<typeof BaseMenu.Separator>): import("react").JSX.Element;
65
+ export declare const Menubar: {
66
+ Root: typeof Root;
67
+ Menu: <Payload>(props: BaseMenu.Root.Props<Payload>) => import("react").JSX.Element;
68
+ Trigger: typeof Trigger;
69
+ Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ContextMenuPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
70
+ Backdrop: typeof Backdrop;
71
+ Positioner: typeof Positioner;
72
+ Popup: typeof Popup;
73
+ Arrow: typeof Arrow;
74
+ Group: typeof Group;
75
+ GroupLabel: typeof GroupLabel;
76
+ Item: typeof Item;
77
+ LinkItem: typeof LinkItem;
78
+ CheckboxItem: typeof CheckboxItem;
79
+ CheckboxItemIndicator: typeof CheckboxItemIndicator;
80
+ RadioGroup: typeof RadioGroup;
81
+ RadioItem: typeof RadioItem;
82
+ RadioItemIndicator: typeof RadioItemIndicator;
83
+ SubmenuRoot: typeof BaseMenu.SubmenuRoot;
84
+ SubmenuTrigger: typeof SubmenuTrigger;
85
+ Separator: typeof Separator;
86
+ };
87
+ export { Root, Menu, Trigger, Portal, Backdrop, Positioner, Popup, Arrow, Group, GroupLabel, Item, LinkItem, CheckboxItem, CheckboxItemIndicator, RadioGroup, RadioItem, RadioItemIndicator, SubmenuRoot, SubmenuTrigger, Separator, };