@nocoo/basalt 2.0.3 → 2.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 (295) hide show
  1. package/README.md +134 -15
  2. package/ai/COMPATIBILITY.md +180 -0
  3. package/ai/INTEGRATION.md +1760 -0
  4. package/ai/RECIPES.md +161 -0
  5. package/ai/USAGE.md +99 -0
  6. package/ai/registry.json +38099 -0
  7. package/ai/sources.json +10 -0
  8. package/dist/assets/brand-mark.d.ts +1 -0
  9. package/dist/assets/brand-mark.js +7 -0
  10. package/dist/assets/brand-mark.js.map +1 -0
  11. package/dist/charts/area.d.ts +58 -5
  12. package/dist/charts/area.js +20 -12
  13. package/dist/charts/area.js.map +1 -1
  14. package/dist/charts/bar.d.ts +54 -5
  15. package/dist/charts/bar.js +16 -10
  16. package/dist/charts/bar.js.map +1 -1
  17. package/dist/charts/bullet.d.ts +18 -1
  18. package/dist/charts/bullet.js +6 -3
  19. package/dist/charts/bullet.js.map +1 -1
  20. package/dist/charts/charts.d.ts +58 -5
  21. package/dist/charts/charts.js +13 -2
  22. package/dist/charts/charts.js.map +1 -1
  23. package/dist/charts/config.d.ts +7 -0
  24. package/dist/charts/config.js +5 -1
  25. package/dist/charts/config.js.map +1 -1
  26. package/dist/charts/custom-chart.d.ts +58 -5
  27. package/dist/charts/custom-chart.js +13 -2
  28. package/dist/charts/custom-chart.js.map +1 -1
  29. package/dist/charts/donut.d.ts +18 -1
  30. package/dist/charts/donut.js +6 -3
  31. package/dist/charts/donut.js.map +1 -1
  32. package/dist/charts/frame.d.ts +40 -3
  33. package/dist/charts/frame.js +55 -28
  34. package/dist/charts/frame.js.map +1 -1
  35. package/dist/charts/funnel.d.ts +18 -1
  36. package/dist/charts/funnel.js +5 -1
  37. package/dist/charts/funnel.js.map +1 -1
  38. package/dist/charts/gauge.d.ts +18 -1
  39. package/dist/charts/gauge.js +38 -20
  40. package/dist/charts/gauge.js.map +1 -1
  41. package/dist/charts/grouped-bar.d.ts +54 -5
  42. package/dist/charts/grouped-bar.js +16 -10
  43. package/dist/charts/grouped-bar.js.map +1 -1
  44. package/dist/charts/heatmap-calendar.d.ts +61 -0
  45. package/dist/charts/heatmap-calendar.js +287 -96
  46. package/dist/charts/heatmap-calendar.js.map +1 -1
  47. package/dist/charts/heatmap-matrix.d.ts +99 -0
  48. package/dist/charts/heatmap-matrix.js +249 -0
  49. package/dist/charts/heatmap-matrix.js.map +1 -0
  50. package/dist/charts/line.d.ts +66 -5
  51. package/dist/charts/line.js +37 -30
  52. package/dist/charts/line.js.map +1 -1
  53. package/dist/charts/palette.d.ts +1 -0
  54. package/dist/charts/palette.js +7 -1
  55. package/dist/charts/palette.js.map +1 -1
  56. package/dist/charts/radar.d.ts +18 -1
  57. package/dist/charts/radar.js +26 -19
  58. package/dist/charts/radar.js.map +1 -1
  59. package/dist/charts/sankey.d.ts +18 -1
  60. package/dist/charts/sankey.js +4 -1
  61. package/dist/charts/sankey.js.map +1 -1
  62. package/dist/charts/series.d.ts +5 -7
  63. package/dist/charts/series.js.map +1 -1
  64. package/dist/charts/slot-bar.d.ts +38 -6
  65. package/dist/charts/slot-bar.js +5 -2
  66. package/dist/charts/slot-bar.js.map +1 -1
  67. package/dist/charts/sparkline.d.ts +35 -5
  68. package/dist/charts/sparkline.js +22 -18
  69. package/dist/charts/sparkline.js.map +1 -1
  70. package/dist/charts/stacked-bar.d.ts +58 -5
  71. package/dist/charts/stacked-bar.js +19 -12
  72. package/dist/charts/stacked-bar.js.map +1 -1
  73. package/dist/charts/stat-card.d.ts +51 -1
  74. package/dist/charts/stat-card.js +66 -39
  75. package/dist/charts/stat-card.js.map +1 -1
  76. package/dist/charts/timeline.d.ts +3 -0
  77. package/dist/charts/timeline.js +4 -3
  78. package/dist/charts/timeline.js.map +1 -1
  79. package/dist/charts/timeseries.d.ts +58 -5
  80. package/dist/charts/timeseries.js +13 -2
  81. package/dist/charts/timeseries.js.map +1 -1
  82. package/dist/charts/tooltip.d.ts +57 -0
  83. package/dist/charts/tooltip.js +119 -2
  84. package/dist/charts/tooltip.js.map +1 -1
  85. package/dist/components/accordion.d.ts +117 -2
  86. package/dist/components/accordion.js +20 -13
  87. package/dist/components/accordion.js.map +1 -1
  88. package/dist/components/alert-dialog.d.ts +131 -13
  89. package/dist/components/alert-dialog.js +12 -9
  90. package/dist/components/alert-dialog.js.map +1 -1
  91. package/dist/components/app-header.js +18 -17
  92. package/dist/components/app-header.js.map +1 -1
  93. package/dist/components/app-shell.js +15 -14
  94. package/dist/components/app-shell.js.map +1 -1
  95. package/dist/components/autocomplete.d.ts +4 -0
  96. package/dist/components/autocomplete.js.map +1 -1
  97. package/dist/components/avatar.d.ts +76 -3
  98. package/dist/components/avatar.js.map +1 -1
  99. package/dist/components/badge.d.ts +15 -1
  100. package/dist/components/badge.js +17 -16
  101. package/dist/components/badge.js.map +1 -1
  102. package/dist/components/banner.d.ts +88 -2
  103. package/dist/components/banner.js +41 -40
  104. package/dist/components/banner.js.map +1 -1
  105. package/dist/components/basalt-mark.js +14 -8
  106. package/dist/components/basalt-mark.js.map +1 -1
  107. package/dist/components/battery-meter.d.ts +10 -0
  108. package/dist/components/battery-meter.js +56 -0
  109. package/dist/components/battery-meter.js.map +1 -0
  110. package/dist/components/breadcrumbs.d.ts +27 -7
  111. package/dist/components/breadcrumbs.js +21 -20
  112. package/dist/components/breadcrumbs.js.map +1 -1
  113. package/dist/components/button.d.ts +48 -2
  114. package/dist/components/button.js +87 -36
  115. package/dist/components/button.js.map +1 -1
  116. package/dist/components/chat-bubble.d.ts +7 -0
  117. package/dist/components/chat-bubble.js +14 -13
  118. package/dist/components/chat-bubble.js.map +1 -1
  119. package/dist/components/chat-composer.d.ts +7 -3
  120. package/dist/components/chat-composer.js.map +1 -1
  121. package/dist/components/chat-header.d.ts +6 -1
  122. package/dist/components/chat-header.js +17 -16
  123. package/dist/components/chat-header.js.map +1 -1
  124. package/dist/components/chat-inbox.d.ts +7 -2
  125. package/dist/components/chat-inbox.js.map +1 -1
  126. package/dist/components/checkbox.js +84 -53
  127. package/dist/components/checkbox.js.map +1 -1
  128. package/dist/components/clipboard-text.d.ts +13 -2
  129. package/dist/components/clipboard-text.js +4 -4
  130. package/dist/components/clipboard-text.js.map +1 -1
  131. package/dist/components/collapsible.d.ts +58 -15
  132. package/dist/components/collapsible.js.map +1 -1
  133. package/dist/components/command-palette.d.ts +151 -61
  134. package/dist/components/command-palette.js.map +1 -1
  135. package/dist/components/confirm-dialog.d.ts +1 -1
  136. package/dist/components/confirm-dialog.js +6 -4
  137. package/dist/components/confirm-dialog.js.map +1 -1
  138. package/dist/components/context-menu.d.ts +210 -2
  139. package/dist/components/context-menu.js +7 -4
  140. package/dist/components/context-menu.js.map +1 -1
  141. package/dist/components/data-table.d.ts +40 -2
  142. package/dist/components/data-table.js +168 -120
  143. package/dist/components/data-table.js.map +1 -1
  144. package/dist/components/date-picker.d.ts +53 -2
  145. package/dist/components/date-picker.js +387 -219
  146. package/dist/components/date-picker.js.map +1 -1
  147. package/dist/components/delete-resource.d.ts +7 -1
  148. package/dist/components/delete-resource.js +22 -18
  149. package/dist/components/delete-resource.js.map +1 -1
  150. package/dist/components/description-list.js +16 -15
  151. package/dist/components/description-list.js.map +1 -1
  152. package/dist/components/dialog.d.ts +141 -12
  153. package/dist/components/dialog.js +42 -38
  154. package/dist/components/dialog.js.map +1 -1
  155. package/dist/components/dock.d.ts +1 -1
  156. package/dist/components/dock.js +39 -58
  157. package/dist/components/dock.js.map +1 -1
  158. package/dist/components/dropdown-menu.d.ts +229 -15
  159. package/dist/components/dropdown-menu.js +9 -6
  160. package/dist/components/dropdown-menu.js.map +1 -1
  161. package/dist/components/editable-nav-item.d.ts +33 -0
  162. package/dist/components/editable-nav-item.js +90 -0
  163. package/dist/components/editable-nav-item.js.map +1 -0
  164. package/dist/components/empty.d.ts +22 -2
  165. package/dist/components/empty.js +22 -13
  166. package/dist/components/empty.js.map +1 -1
  167. package/dist/components/field.js +31 -30
  168. package/dist/components/field.js.map +1 -1
  169. package/dist/components/file-dropzone.d.ts +37 -0
  170. package/dist/components/file-dropzone.js +103 -0
  171. package/dist/components/file-dropzone.js.map +1 -0
  172. package/dist/components/filter-bar.d.ts +34 -0
  173. package/dist/components/filter-bar.js +52 -0
  174. package/dist/components/filter-bar.js.map +1 -0
  175. package/dist/components/flow.js +19 -18
  176. package/dist/components/flow.js.map +1 -1
  177. package/dist/components/grid.d.ts +3 -1
  178. package/dist/components/grid.js.map +1 -1
  179. package/dist/components/hover-card.d.ts +111 -1
  180. package/dist/components/hover-card.js +9 -6
  181. package/dist/components/hover-card.js.map +1 -1
  182. package/dist/components/icon-picker.d.ts +34 -0
  183. package/dist/components/icon-picker.js +77 -0
  184. package/dist/components/icon-picker.js.map +1 -0
  185. package/dist/components/inline-editable.d.ts +46 -0
  186. package/dist/components/inline-editable.js +124 -0
  187. package/dist/components/inline-editable.js.map +1 -0
  188. package/dist/components/input-area.js +3 -3
  189. package/dist/components/input-group.js +7 -7
  190. package/dist/components/input.js +3 -3
  191. package/dist/components/label.js +18 -17
  192. package/dist/components/label.js.map +1 -1
  193. package/dist/components/layer-card.d.ts +10 -2
  194. package/dist/components/layer-card.js +71 -68
  195. package/dist/components/layer-card.js.map +1 -1
  196. package/dist/components/loader.d.ts +10 -2
  197. package/dist/components/loader.js.map +1 -1
  198. package/dist/components/menu-bar.d.ts +174 -6
  199. package/dist/components/menu-bar.js +33 -29
  200. package/dist/components/menu-bar.js.map +1 -1
  201. package/dist/components/meter.d.ts +27 -2
  202. package/dist/components/meter.js.map +1 -1
  203. package/dist/components/multi-select.d.ts +64 -0
  204. package/dist/components/multi-select.js +218 -0
  205. package/dist/components/multi-select.js.map +1 -0
  206. package/dist/components/navigation-menu.d.ts +88 -5
  207. package/dist/components/navigation-menu.js.map +1 -1
  208. package/dist/components/overlay.js +6 -5
  209. package/dist/components/overlay.js.map +1 -1
  210. package/dist/components/page-header.js +23 -21
  211. package/dist/components/page-header.js.map +1 -1
  212. package/dist/components/pagination.js +7 -7
  213. package/dist/components/popover.d.ts +136 -16
  214. package/dist/components/popover.js +32 -28
  215. package/dist/components/popover.js.map +1 -1
  216. package/dist/components/radio.js +38 -37
  217. package/dist/components/radio.js.map +1 -1
  218. package/dist/components/resource-list.d.ts +26 -1
  219. package/dist/components/resource-list.js +28 -15
  220. package/dist/components/resource-list.js.map +1 -1
  221. package/dist/components/responsive-master-detail.d.ts +27 -0
  222. package/dist/components/responsive-master-detail.js +85 -0
  223. package/dist/components/responsive-master-detail.js.map +1 -0
  224. package/dist/components/section-rule.js +23 -22
  225. package/dist/components/section-rule.js.map +1 -1
  226. package/dist/components/select.d.ts +27 -3
  227. package/dist/components/select.js +11 -11
  228. package/dist/components/select.js.map +1 -1
  229. package/dist/components/sheet.d.ts +115 -11
  230. package/dist/components/sheet.js +37 -30
  231. package/dist/components/sheet.js.map +1 -1
  232. package/dist/components/sidebar.d.ts +109 -17
  233. package/dist/components/sidebar.js +109 -108
  234. package/dist/components/sidebar.js.map +1 -1
  235. package/dist/components/skeleton-line.d.ts +22 -2
  236. package/dist/components/skeleton-line.js.map +1 -1
  237. package/dist/components/slider.d.ts +61 -1
  238. package/dist/components/slider.js +31 -15
  239. package/dist/components/slider.js.map +1 -1
  240. package/dist/components/stat-strip.js +16 -15
  241. package/dist/components/stat-strip.js.map +1 -1
  242. package/dist/components/switch.js +78 -47
  243. package/dist/components/switch.js.map +1 -1
  244. package/dist/components/table-of-contents.js +18 -17
  245. package/dist/components/table-of-contents.js.map +1 -1
  246. package/dist/components/table-pager.js +20 -19
  247. package/dist/components/table-pager.js.map +1 -1
  248. package/dist/components/table.d.ts +9 -3
  249. package/dist/components/table.js +19 -18
  250. package/dist/components/table.js.map +1 -1
  251. package/dist/components/tabs.js +29 -22
  252. package/dist/components/tabs.js.map +1 -1
  253. package/dist/components/tag-badge.d.ts +58 -0
  254. package/dist/components/tag-badge.js +72 -0
  255. package/dist/components/tag-badge.js.map +1 -0
  256. package/dist/components/tag-color-picker.d.ts +20 -0
  257. package/dist/components/tag-color-picker.js +42 -0
  258. package/dist/components/tag-color-picker.js.map +1 -0
  259. package/dist/components/text.js +17 -16
  260. package/dist/components/text.js.map +1 -1
  261. package/dist/components/toast.d.ts +173 -3
  262. package/dist/components/toast.js +1 -1
  263. package/dist/components/toast.js.map +1 -1
  264. package/dist/components/toggle-group.d.ts +88 -2
  265. package/dist/components/toggle-group.js +32 -31
  266. package/dist/components/toggle-group.js.map +1 -1
  267. package/dist/components/toggle.d.ts +35 -2
  268. package/dist/components/toggle.js +12 -11
  269. package/dist/components/toggle.js.map +1 -1
  270. package/dist/components/tooltip.d.ts +144 -6
  271. package/dist/components/tooltip.js +9 -6
  272. package/dist/components/tooltip.js.map +1 -1
  273. package/dist/components/typeahead-field.js +193 -132
  274. package/dist/components/typeahead-field.js.map +1 -1
  275. package/dist/components/upload-queue.d.ts +51 -0
  276. package/dist/components/upload-queue.js +116 -0
  277. package/dist/components/upload-queue.js.map +1 -0
  278. package/dist/providers/accent.d.ts +46 -2
  279. package/dist/providers/accent.js +358 -172
  280. package/dist/providers/accent.js.map +1 -1
  281. package/dist/providers/link.d.ts +14 -4
  282. package/dist/providers/link.js.map +1 -1
  283. package/dist/providers/theme.d.ts +38 -2
  284. package/dist/providers/theme.js +160 -27
  285. package/dist/providers/theme.js.map +1 -1
  286. package/dist/styles/base.css +83 -0
  287. package/dist/styles/standalone.css +711 -120
  288. package/dist/styles/tailwind.css +21 -7
  289. package/dist/styles/tokens.css +145 -91
  290. package/dist/utils/control-surface.d.ts +2 -1
  291. package/dist/utils/control-surface.js +4 -4
  292. package/dist/utils/control-surface.js.map +1 -1
  293. package/dist/utils/selection-indicator.js +2 -2
  294. package/dist/utils/selection-indicator.js.map +1 -1
  295. package/package.json +8 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-select.js","names":[],"sources":["../../src/components/multi-select.tsx"],"sourcesContent":["import { Check, ChevronDown, X } from \"lucide-react\";\nimport { type ReactNode, useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport interface MultiSelectOption {\n\t/** Stable identifier, independent of the display label. */\n\tvalue: string;\n\t/** Searchable and accessible display name. */\n\tlabel: string;\n\t/** Optional secondary searchable text. */\n\tdescription?: string;\n\t/** Caller-provided icon or avatar. */\n\tleading?: ReactNode;\n\t/** Prevent adding or removing this option. */\n\tdisabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n\t/** Accessible field and popup name. */\n\tlabel: string;\n\t/** Available options; retain selected options to preserve their display labels. */\n\toptions: readonly MultiSelectOption[];\n\t/** Controlled selected identifiers. */\n\tvalue?: readonly string[];\n\t/** Initial uncontrolled selection. @default [] */\n\tdefaultValue?: readonly string[];\n\t/** Selection requests; controlled values change only when accepted by the caller. */\n\tonValueChange?: (value: string[]) => void;\n\t/** Controlled search text; asynchronous requests belong to the caller. */\n\tquery?: string;\n\t/** Initial uncontrolled search text. @default \"\" */\n\tdefaultQuery?: string;\n\t/** Search text requests. */\n\tonQueryChange?: (query: string) => void;\n\t/** Controlled popup visibility. */\n\topen?: boolean;\n\t/** Initial uncontrolled popup visibility. @default false */\n\tdefaultOpen?: boolean;\n\t/** Popup visibility requests. */\n\tonOpenChange?: (open: boolean) => void;\n\t/** Use local label/description filtering; disable for server-filtered options. @default true */\n\tfilterOptions?: boolean;\n\t/** Loading content replaces the option list. @default false */\n\tloading?: boolean;\n\t/** Disables the trigger, chips, and native form entries. @default false */\n\tdisabled?: boolean;\n\t/** Repeated native form entry name, one entry per selected identifier. */\n\tname?: string;\n\t/** Optional external native form owner. Uncontrolled state respects uncancelled form resets. */\n\tform?: string;\n\t/** Empty selection prompt. @default \"Select options\" */\n\tplaceholder?: string;\n\t/** Search input prompt. @default \"Search options…\" */\n\tsearchPlaceholder?: string;\n\t/** Empty search result text. @default \"No options found.\" */\n\temptyLabel?: string;\n\t/** Loading announcement. @default \"Loading options…\" */\n\tloadingLabel?: string;\n\t/** Chip removal label prefix. @default \"Remove\" */\n\tremoveLabel?: string;\n\t/** Show removable selection chips; disable when a FilterBar renders its own chips. @default true */\n\tshowChips?: boolean;\n\t/** Selection count formatter, including localization. */\n\tformatSelectionCount?: (count: number) => string;\n\t/** Additional root classes. */\n\tclassName?: string;\n}\n\nexport function MultiSelect({\n\tlabel,\n\toptions,\n\tvalue,\n\tdefaultValue = [],\n\tonValueChange,\n\tquery,\n\tdefaultQuery = \"\",\n\tonQueryChange,\n\topen,\n\tdefaultOpen = false,\n\tonOpenChange,\n\tfilterOptions = true,\n\tloading = false,\n\tdisabled = false,\n\tname,\n\tform,\n\tplaceholder = \"Select options\",\n\tsearchPlaceholder = \"Search options…\",\n\temptyLabel = \"No options found.\",\n\tloadingLabel = \"Loading options…\",\n\tremoveLabel = \"Remove\",\n\tshowChips = true,\n\tformatSelectionCount,\n\tclassName,\n}: MultiSelectProps) {\n\tconst [localValue, setLocalValue] = useState(defaultValue);\n\tconst [localQuery, setLocalQuery] = useState(defaultQuery);\n\tconst [localOpen, setLocalOpen] = useState(defaultOpen);\n\tconst [active, setActive] = useState<string | null>(null);\n\tconst input = useRef<HTMLInputElement>(null);\n\tconst trigger = useRef<HTMLButtonElement>(null);\n\tconst list = useRef<HTMLDivElement>(null);\n\tconst pointer = useRef<{ x: number; y: number } | null>(null);\n\tconst resetConfig = useRef({ value, defaultValue, query, defaultQuery, open });\n\tuseEffect(() => {\n\t\tresetConfig.current = { value, defaultValue, query, defaultQuery, open };\n\t});\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: form changes the native owner of the same trigger and requires rebinding its reset listener.\n\tuseEffect(() => {\n\t\tconst owner = trigger.current?.form;\n\t\tif (!owner) return;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tfunction reset(event: Event) {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (event.defaultPrevented) return;\n\t\t\t\tconst config = resetConfig.current;\n\t\t\t\tif (config.value === undefined) setLocalValue(config.defaultValue);\n\t\t\t\tif (config.query === undefined) setLocalQuery(config.defaultQuery);\n\t\t\t\tif (config.open === undefined) setLocalOpen(false);\n\t\t\t\tsetActive(null);\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t}\n\t\towner.addEventListener(\"reset\", reset);\n\t\treturn () => {\n\t\t\tfor (const timer of timers) clearTimeout(timer);\n\t\t\towner.removeEventListener(\"reset\", reset);\n\t\t};\n\t}, [form]);\n\tconst id = useId();\n\tconst selected = value ?? localValue;\n\tconst search = query ?? localQuery;\n\tconst expanded = (open ?? localOpen) && !disabled;\n\tconst visible = options.filter(\n\t\t(option) =>\n\t\t\t!filterOptions ||\n\t\t\t`${option.label} ${option.description ?? \"\"}`\n\t\t\t\t.toLocaleLowerCase()\n\t\t\t\t.includes(search.trim().toLocaleLowerCase()),\n\t);\n\tconst enabled = visible.filter((option) => !option.disabled);\n\tconst activeValue = enabled.some((option) => option.value === active)\n\t\t? active\n\t\t: enabled[0]?.value;\n\tconst activeIndex = visible.findIndex((option) => option.value === activeValue);\n\tconst countText = formatSelectionCount\n\t\t? formatSelectionCount(selected.length)\n\t\t: `${selected.length} selected`;\n\n\tfunction changeOpen(next: boolean) {\n\t\tif (disabled) return;\n\t\tif (open === undefined) setLocalOpen(next);\n\t\tonOpenChange?.(next);\n\t}\n\tfunction changeValue(next: string[]) {\n\t\tif (disabled) return;\n\t\tif (value === undefined) setLocalValue(next);\n\t\tonValueChange?.(next);\n\t}\n\tfunction toggle(option: MultiSelectOption) {\n\t\tif (option.disabled) return;\n\t\tchangeValue(\n\t\t\tselected.includes(option.value)\n\t\t\t\t? selected.filter((item) => item !== option.value)\n\t\t\t\t: [...selected, option.value],\n\t\t);\n\t}\n\tfunction removeLast() {\n\t\tif (search) return;\n\t\tconst item = [...selected]\n\t\t\t.reverse()\n\t\t\t.find((value) => !options.find((option) => option.value === value)?.disabled);\n\t\tif (item !== undefined) changeValue(selected.filter((value) => value !== item));\n\t}\n\n\treturn (\n\t\t<div className={cn(BASALT_UI_CLASS, \"min-w-0 space-y-2\", className)}>\n\t\t\t{showChips && selected.length > 0 && (\n\t\t\t\t<div role=\"group\" className=\"flex flex-wrap gap-1.5\" aria-label={`${label}: ${countText}`}>\n\t\t\t\t\t{selected.map((item) => {\n\t\t\t\t\t\tconst option = options.find((option) => option.value === item);\n\t\t\t\t\t\tconst text = option?.label ?? item;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex max-w-full items-center gap-1 rounded-basalt-md border border-basalt-border bg-basalt-accent py-0.5 pl-2 text-xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"min-w-0 break-words\">{text}</span>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={disabled || option?.disabled}\n\t\t\t\t\t\t\t\t\taria-label={`${removeLabel} ${text}`}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded p-1 focus-visible:outline-2 focus-visible:outline-basalt-ring disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\tonClick={() => changeValue(selected.filter((value) => value !== item))}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<X className=\"size-3\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!disabled &&\n\t\t\t\tname &&\n\t\t\t\tselected.map((item) => (\n\t\t\t\t\t<input key={item} type=\"hidden\" name={name} form={form} value={item} />\n\t\t\t\t))}\n\t\t\t<Popover open={expanded} onOpenChange={changeOpen}>\n\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={trigger}\n\t\t\t\t\t\tform={form}\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\taria-describedby={`${id}-count`}\n\t\t\t\t\t\tclassName=\"w-full justify-between\"\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing) return;\n\t\t\t\t\t\t\tif (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tchangeOpen(true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"Backspace\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tremoveLast();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{selected.length ? countText : placeholder}</span>\n\t\t\t\t\t\t<ChevronDown aria-hidden=\"true\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverTrigger>\n\t\t\t\t<PopoverContent\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\tclassName=\"w-72 max-w-[calc(100vw-2rem)] p-2\"\n\t\t\t\t\taria-label={label}\n\t\t\t\t\tonOpenAutoFocus={(event) => {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tinput.current?.focus();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={input}\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-label={`${label}: search`}\n\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-controls={`${id}-list`}\n\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\t!loading && activeIndex >= 0 ? `${id}-option-${activeIndex}` : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tif (query === undefined) setLocalQuery(event.target.value);\n\t\t\t\t\t\t\tonQueryChange?.(event.target.value);\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing) return;\n\t\t\t\t\t\t\tif (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tif (!loading && enabled.length) {\n\t\t\t\t\t\t\t\t\tconst index = enabled.findIndex((option) => option.value === activeValue);\n\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\tenabled[\n\t\t\t\t\t\t\t\t\t\t\t(index + (event.key === \"ArrowDown\" ? 1 : -1) + enabled.length) %\n\t\t\t\t\t\t\t\t\t\t\t\tenabled.length\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tsetActive(next.value);\n\t\t\t\t\t\t\t\t\tlist.current\n\t\t\t\t\t\t\t\t\t\t?.querySelector<HTMLElement>(`[data-option-index=\"${visible.indexOf(next)}\"]`)\n\t\t\t\t\t\t\t\t\t\t?.scrollIntoView({ block: \"nearest\" });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tconst option = enabled.find((option) => option.value === activeValue);\n\t\t\t\t\t\t\t\tif (!loading && option) toggle(option);\n\t\t\t\t\t\t\t} else if (event.key === \"Backspace\" && !search) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tremoveLast();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={list}\n\t\t\t\t\t\tid={`${id}-list`}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\taria-multiselectable=\"true\"\n\t\t\t\t\t\taria-busy={loading}\n\t\t\t\t\t\tclassName=\"mt-2 max-h-60 overflow-y-auto\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{!loading &&\n\t\t\t\t\t\t\tvisible.map((option, index) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\tid={`${id}-option-${index}`}\n\t\t\t\t\t\t\t\t\tdata-option-index={index}\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\taria-selected={selected.includes(option.value)}\n\t\t\t\t\t\t\t\t\taria-disabled={option.disabled || undefined}\n\t\t\t\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex w-full items-center gap-2 rounded-basalt-md px-2 py-2 text-left text-sm disabled:opacity-40\",\n\t\t\t\t\t\t\t\t\t\tactiveValue === option.value && \"bg-basalt-accent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\t\t\t\tconst previous = pointer.current;\n\t\t\t\t\t\t\t\t\t\tif (previous?.x === event.clientX && previous.y === event.clientY) return;\n\t\t\t\t\t\t\t\t\t\tpointer.current = { x: event.clientX, y: event.clientY };\n\t\t\t\t\t\t\t\t\t\tif (!option.disabled) setActive(option.value);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoggle(option);\n\t\t\t\t\t\t\t\t\t\tinput.current?.focus();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.leading}\n\t\t\t\t\t\t\t\t\t<span className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"block break-words\">{option.label}</span>\n\t\t\t\t\t\t\t\t\t\t{option.description && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"block text-xs text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{option.description}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{selected.includes(option.value) && (\n\t\t\t\t\t\t\t\t\t\t<Check className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t{(loading || visible.length === 0) && (\n\t\t\t\t\t\t<p role=\"status\" className=\"px-2 py-4 text-sm text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t{loading ? loadingLabel : emptyLabel}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\t\t\t<span id={`${id}-count`} className=\"sr-only\" aria-live=\"polite\">\n\t\t\t\t{countText}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;AAwEA,SAAgB,EAAY,EAC3B,UACA,YACA,UACA,kBAAe,CAAC,GAChB,kBACA,UACA,kBAAe,IACf,mBACA,SACA,kBAAc,IACd,kBACA,oBAAgB,IAChB,aAAU,IACV,cAAW,IACX,SACA,SACA,kBAAc,kBACd,wBAAoB,mBACpB,gBAAa,qBACb,kBAAe,oBACf,iBAAc,UACd,eAAY,IACZ,yBACA,gBACoB;CACpB,IAAM,CAAC,IAAY,KAAiB,EAAS,CAAY,GACnD,CAAC,IAAY,KAAiB,EAAS,CAAY,GACnD,CAAC,IAAW,KAAgB,EAAS,EAAW,GAChD,CAAC,GAAQ,KAAa,EAAwB,IAAI,GAClD,IAAQ,EAAyB,IAAI,GACrC,IAAU,EAA0B,IAAI,GACxC,IAAO,EAAuB,IAAI,GAClC,IAAU,EAAwC,IAAI,GACtD,IAAc,EAAO;EAAE;EAAO;EAAc;EAAO;EAAc;CAAK,CAAC;CAK7E,AAJA,QAAgB;EACf,EAAY,UAAU;GAAE;GAAO;GAAc;GAAO;GAAc;EAAK;CACxE,CAAC,GAED,QAAgB;EACf,IAAM,IAAQ,EAAQ,SAAS;EAC/B,IAAI,CAAC,GAAO;EACZ,IAAM,oBAAS,IAAI,IAAmC;EACtD,SAAS,EAAM,GAAc;GAC5B,IAAM,IAAQ,iBAAiB;IAE9B,IADA,EAAO,OAAO,CAAK,GACf,EAAM,kBAAkB;IAC5B,IAAM,IAAS,EAAY;IAI3B,AAHI,EAAO,UAAU,KAAA,KAAW,EAAc,EAAO,YAAY,GAC7D,EAAO,UAAU,KAAA,KAAW,EAAc,EAAO,YAAY,GAC7D,EAAO,SAAS,KAAA,KAAW,EAAa,EAAK,GACjD,EAAU,IAAI;GACf,GAAG,CAAC;GACJ,EAAO,IAAI,CAAK;EACjB;EAEA,OADA,EAAM,iBAAiB,SAAS,CAAK,SACxB;GACZ,KAAK,IAAM,KAAS,GAAQ,aAAa,CAAK;GAC9C,EAAM,oBAAoB,SAAS,CAAK;EACzC;CACD,GAAG,CAAC,CAAI,CAAC;CACT,IAAM,IAAK,EAAM,GACX,IAAW,KAAS,IACpB,IAAS,KAAS,IAClB,KAAY,KAAQ,OAAc,CAAC,GACnC,IAAU,EAAQ,QACtB,MACA,CAAC,MACD,GAAG,EAAO,MAAM,GAAG,EAAO,eAAe,KACvC,kBAAkB,CAAC,CACnB,SAAS,EAAO,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAC9C,GACM,IAAU,EAAQ,QAAQ,MAAW,CAAC,EAAO,QAAQ,GACrD,IAAc,EAAQ,MAAM,MAAW,EAAO,UAAU,CAAM,IACjE,IACA,EAAQ,EAAE,EAAE,OACT,IAAc,EAAQ,WAAW,MAAW,EAAO,UAAU,CAAW,GACxE,IAAY,IACf,EAAqB,EAAS,MAAM,IACpC,GAAG,EAAS,OAAO;CAEtB,SAAS,EAAW,GAAe;EAC9B,MACA,MAAS,KAAA,KAAW,EAAa,CAAI,GACzC,KAAe,CAAI;CACpB;CACA,SAAS,EAAY,GAAgB;EAChC,MACA,MAAU,KAAA,KAAW,EAAc,CAAI,GAC3C,IAAgB,CAAI;CACrB;CACA,SAAS,EAAO,GAA2B;EACtC,EAAO,YACX,EACC,EAAS,SAAS,EAAO,KAAK,IAC3B,EAAS,QAAQ,MAAS,MAAS,EAAO,KAAK,IAC/C,CAAC,GAAG,GAAU,EAAO,KAAK,CAC9B;CACD;CACA,SAAS,IAAa;EACrB,IAAI,GAAQ;EACZ,IAAM,IAAO,CAAC,GAAG,CAAQ,CAAC,CACxB,QAAQ,CAAC,CACT,MAAM,MAAU,CAAC,EAAQ,MAAM,MAAW,EAAO,UAAU,CAAK,CAAC,EAAE,QAAQ;EAC7E,AAAI,MAAS,KAAA,KAAW,EAAY,EAAS,QAAQ,MAAU,MAAU,CAAI,CAAC;CAC/E;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,GAAiB,qBAAqB,CAAS;EAAlE,UAAA;GACE,KAAa,EAAS,SAAS,KAC/B,kBAAC,OAAD;IAAK,MAAK;IAAQ,WAAU;IAAyB,cAAY,GAAG,EAAM,IAAI;IAC5E,UAAA,EAAS,KAAK,MAAS;KACvB,IAAM,IAAS,EAAQ,MAAM,MAAW,EAAO,UAAU,CAAI,GACvD,IAAO,GAAQ,SAAS;KAC9B,OACC,kBAAC,QAAD;MAEC,WAAU;MAFX,UAAA,CAIC,kBAAC,QAAD;OAAM,WAAU;OAAuB,UAAA;MAAW,CAAA,GAClD,kBAAC,UAAD;OACC,MAAK;OACL,UAAU,KAAY,GAAQ;OAC9B,cAAY,GAAG,EAAY,GAAG;OAC9B,WAAU;OACV,eAAe,EAAY,EAAS,QAAQ,MAAU,MAAU,CAAI,CAAC;OAErE,UAAA,kBAAC,GAAD;QAAG,WAAU;QAAS,eAAY;OAAQ,CAAA;MACnC,CAAA,CACH;KAbA,GAAA,CAaA;IAER,CAAC;GACG,CAAA;GAEL,CAAC,KACD,KACA,EAAS,KAAK,MACb,kBAAC,SAAD;IAAkB,MAAK;IAAe;IAAY;IAAM,OAAO;GAAO,GAA1D,CAA0D,CACtE;GACF,kBAAC,IAAD;IAAS,MAAM;IAAU,cAAc;IAAvC,UAAA,CACC,kBAAC,IAAD;KAAgB,SAAA;KACf,UAAA,kBAAC,GAAD;MACC,KAAK;MACC;MACN,SAAQ;MACE;MACV,cAAY;MACZ,oBAAkB,GAAG,EAAG;MACxB,WAAU;MACV,YAAY,MAAU;OACjB,EAAM,YAAY,iBAClB,EAAM,QAAQ,eAAe,EAAM,QAAQ,eAC9C,EAAM,eAAe,GACrB,EAAW,EAAI,IAEZ,EAAM,QAAQ,gBACjB,EAAM,eAAe,GACrB,EAAW;MAEb;MAlBD,UAAA,CAoBC,kBAAC,QAAD;OAAM,WAAU;OAAY,UAAA,EAAS,SAAS,IAAY;MAAkB,CAAA,GAC5E,kBAAC,GAAD,EAAa,eAAY,OAAQ,CAAA,CAC1B;;IACO,CAAA,GAChB,kBAAC,IAAD;KACC,OAAM;KACN,WAAU;KACV,cAAY;KACZ,kBAAkB,MAAU;MAE3B,AADA,EAAM,eAAe,GACrB,EAAM,SAAS,MAAM;KACtB;KAPD,UAAA;MASC,kBAAC,GAAD;OACC,KAAK;OACL,MAAK;OACL,cAAY,GAAG,EAAM;OACrB,iBAAe;OACf,qBAAkB;OAClB,iBAAe,GAAG,EAAG;OACrB,yBACC,CAAC,KAAW,KAAe,IAAI,GAAG,EAAG,UAAU,MAAgB,KAAA;OAEhE,aAAa;OACb,OAAO;OACP,WAAW,MAAU;QAGpB,AAFI,MAAU,KAAA,KAAW,EAAc,EAAM,OAAO,KAAK,GACzD,KAAgB,EAAM,OAAO,KAAK,GAClC,EAAU,IAAI;OACf;OACA,YAAY,MAAU;QACjB,OAAM,YAAY,aACtB;aAAI,EAAM,QAAQ,eAAe,EAAM,QAAQ,WAE9C;cADA,EAAM,eAAe,GACjB,CAAC,KAAW,EAAQ,QAAQ;WAC/B,IAAM,IAAQ,EAAQ,WAAW,MAAW,EAAO,UAAU,CAAW,GAClE,IACL,GACE,KAAS,EAAM,QAAQ,cAAc,IAAI,MAAM,EAAQ,UACvD,EAAQ;WAGX,AADA,EAAU,EAAK,KAAK,GACpB,EAAK,SACF,cAA2B,uBAAuB,EAAQ,QAAQ,CAAI,EAAE,GAAG,CAAC,EAC5E,eAAe,EAAE,OAAO,UAAU,CAAC;UACvC;gBACM,IAAI,EAAM,QAAQ,SAAS;UACjC,EAAM,eAAe;UACrB,IAAM,IAAS,EAAQ,MAAM,MAAW,EAAO,UAAU,CAAW;UACpE,AAAI,CAAC,KAAW,KAAQ,EAAO,CAAM;SACtC,OAAO,AAAI,EAAM,QAAQ,eAAe,CAAC,MACxC,EAAM,eAAe,GACrB,EAAW;QACZ;OACD;MACA,CAAA;MACD,kBAAC,OAAD;OACC,KAAK;OACL,IAAI,GAAG,EAAG;OACV,MAAK;OACL,cAAY;OACZ,wBAAqB;OACrB,aAAW;OACX,WAAU;OAET,UAAA,CAAC,KACD,EAAQ,KAAK,GAAQ,MACpB,kBAAC,UAAD;QACC,MAAK;QACL,MAAK;QACL,IAAI,GAAG,EAAG,UAAU;QACpB,qBAAmB;QAEnB,UAAU;QACV,iBAAe,EAAS,SAAS,EAAO,KAAK;QAC7C,iBAAe,EAAO,YAAY,KAAA;QAClC,UAAU,EAAO;QACjB,WAAW,EACV,oGACA,MAAgB,EAAO,SAAS,kBACjC;QACA,gBAAgB,MAAU;SACzB,IAAM,IAAW,EAAQ;SACrB,IAAU,MAAM,EAAM,WAAW,EAAS,MAAM,EAAM,aAC1D,EAAQ,UAAU;UAAE,GAAG,EAAM;UAAS,GAAG,EAAM;SAAQ,GAClD,EAAO,YAAU,EAAU,EAAO,KAAK;QAC7C;QACA,cAAc,MAAU,EAAM,eAAe;QAC7C,eAAe;SAEd,AADA,EAAO,CAAM,GACb,EAAM,SAAS,MAAM;QACtB;QAxBD,UAAA;SA0BE,EAAO;SACR,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA,CACC,kBAAC,QAAD;WAAM,WAAU;WAAqB,UAAA,EAAO;UAAY,CAAA,GACvD,EAAO,eACP,kBAAC,QAAD;WAAM,WAAU;WACd,UAAA,EAAO;UACH,CAAA,CAEF;;SACL,EAAS,SAAS,EAAO,KAAK,KAC9B,kBAAC,GAAD;UAAO,WAAU;UAAkB,eAAY;SAAQ,CAAA;QAEjD;OAjCF,GAAA,EAAO,KAiCL,CACR;MACE,CAAA;OACH,KAAW,EAAQ,WAAW,MAC/B,kBAAC,KAAD;OAAG,MAAK;OAAS,WAAU;OACzB,UAAA,IAAU,IAAe;MACxB,CAAA;KAEW;IACR,CAAA,CAAA;;GACT,kBAAC,QAAD;IAAM,IAAI,GAAG,EAAG;IAAS,WAAU;IAAU,aAAU;IACrD,UAAA;GACI,CAAA;EACF;;AAEP"}
@@ -1,6 +1,89 @@
1
1
  import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
2
- import type { ComponentProps } from "react";
3
- export declare const NavigationMenu: import("react").ForwardRefExoticComponent<NavigationMenuPrimitive.NavigationMenuProps & import("react").RefAttributes<HTMLElement>>;
4
- export declare const NavigationMenuList: import("react").ForwardRefExoticComponent<NavigationMenuPrimitive.NavigationMenuListProps & import("react").RefAttributes<HTMLUListElement>>;
5
- export declare const NavigationMenuItem: import("react").ForwardRefExoticComponent<NavigationMenuPrimitive.NavigationMenuItemProps & import("react").RefAttributes<HTMLLIElement>>;
6
- export declare function NavigationMenuLink({ className, ...props }: ComponentProps<typeof NavigationMenuPrimitive.Link>): import("react").JSX.Element;
2
+ import type * as React from "react";
3
+ type RadixNavigationMenuProps = React.ComponentProps<typeof NavigationMenuPrimitive.Root>;
4
+ type RadixNavigationMenuListProps = React.ComponentProps<typeof NavigationMenuPrimitive.List>;
5
+ type RadixNavigationMenuItemProps = React.ComponentProps<typeof NavigationMenuPrimitive.Item>;
6
+ type RadixNavigationMenuLinkProps = React.ComponentProps<typeof NavigationMenuPrimitive.Link>;
7
+ export interface NavigationMenuProps extends Omit<RadixNavigationMenuProps, "value" | "defaultValue" | "onValueChange" | "dir" | "orientation" | "delayDuration" | "skipDelayDuration" | "asChild"> {
8
+ /**
9
+ * Controlled value of the currently active navigation item.
10
+ */
11
+ value?: RadixNavigationMenuProps["value"];
12
+ /**
13
+ * Uncontrolled initial active navigation item value.
14
+ */
15
+ defaultValue?: RadixNavigationMenuProps["defaultValue"];
16
+ /**
17
+ * Callback invoked when active navigation item value changes.
18
+ */
19
+ onValueChange?: RadixNavigationMenuProps["onValueChange"];
20
+ /**
21
+ * Reading direction of the navigation menu. Inherits from nearest DirectionProvider or ltr.
22
+ * @default "ltr"
23
+ */
24
+ dir?: RadixNavigationMenuProps["dir"];
25
+ /**
26
+ * Orientation of the navigation menu items and keyboard navigation axis.
27
+ * @default "horizontal"
28
+ */
29
+ orientation?: RadixNavigationMenuProps["orientation"];
30
+ /**
31
+ * Duration in milliseconds from pointer entering trigger until menu opens.
32
+ * @default 200
33
+ */
34
+ delayDuration?: RadixNavigationMenuProps["delayDuration"];
35
+ /**
36
+ * Duration in milliseconds to move between triggers without re-triggering delay.
37
+ * @default 300
38
+ */
39
+ skipDelayDuration?: RadixNavigationMenuProps["skipDelayDuration"];
40
+ /**
41
+ * Change the default rendered nav element to the child element, merging props and behavior.
42
+ * NavigationMenu forwards ref to HTMLElement and inherits native nav attributes.
43
+ * @default false
44
+ */
45
+ asChild?: RadixNavigationMenuProps["asChild"];
46
+ }
47
+ export declare const NavigationMenu: React.ForwardRefExoticComponent<NavigationMenuPrimitive.NavigationMenuProps & React.RefAttributes<HTMLElement>>;
48
+ export interface NavigationMenuListProps extends Omit<RadixNavigationMenuListProps, "asChild"> {
49
+ /**
50
+ * Change the default rendered ul element to the child element, merging props and behavior.
51
+ * NavigationMenuList forwards ref to HTMLUListElement and inherits native ul attributes.
52
+ * @default false
53
+ */
54
+ asChild?: RadixNavigationMenuListProps["asChild"];
55
+ }
56
+ export declare const NavigationMenuList: React.ForwardRefExoticComponent<NavigationMenuPrimitive.NavigationMenuListProps & React.RefAttributes<HTMLUListElement>>;
57
+ export interface NavigationMenuItemProps extends Omit<RadixNavigationMenuItemProps, "value" | "asChild"> {
58
+ /**
59
+ * Unique value that associates the item with sub-navigation state.
60
+ */
61
+ value?: RadixNavigationMenuItemProps["value"];
62
+ /**
63
+ * Change the default rendered li element to the child element, merging props and behavior.
64
+ * NavigationMenuItem forwards ref to HTMLLIElement and inherits native li attributes.
65
+ * @default false
66
+ */
67
+ asChild?: RadixNavigationMenuItemProps["asChild"];
68
+ }
69
+ export declare const NavigationMenuItem: React.ForwardRefExoticComponent<NavigationMenuPrimitive.NavigationMenuItemProps & React.RefAttributes<HTMLLIElement>>;
70
+ export interface NavigationMenuLinkProps extends Omit<RadixNavigationMenuLinkProps, "active" | "onSelect" | "asChild"> {
71
+ /**
72
+ * Whether the link represents the currently active destination.
73
+ * Adds data-active attribute for styling.
74
+ * @default false
75
+ */
76
+ active?: RadixNavigationMenuLinkProps["active"];
77
+ /**
78
+ * Event handler called when the navigation link is selected via pointer or keyboard.
79
+ */
80
+ onSelect?: RadixNavigationMenuLinkProps["onSelect"];
81
+ /**
82
+ * Change the default rendered anchor element to the child element, merging props and behavior.
83
+ * NavigationMenuLink forwards ref to HTMLAnchorElement and inherits native anchor attributes.
84
+ * @default false
85
+ */
86
+ asChild?: RadixNavigationMenuLinkProps["asChild"];
87
+ }
88
+ export declare function NavigationMenuLink({ className, ...props }: NavigationMenuLinkProps): React.JSX.Element;
89
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-menu.js","names":[],"sources":["../../src/components/navigation-menu.tsx"],"sourcesContent":["import * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport const NavigationMenu = NavigationMenuPrimitive.Root;\nexport const NavigationMenuList = NavigationMenuPrimitive.List;\nexport const NavigationMenuItem = NavigationMenuPrimitive.Item;\n\nexport function NavigationMenuLink({\n\tclassName,\n\t...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n\treturn (\n\t\t<NavigationMenuPrimitive.Link\n\t\t\tclassName={cn(\"rounded-basalt-md px-3 py-2 text-sm hover:bg-basalt-accent\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;;AAIA,IAAa,IAAiB,EAAwB,MACzC,IAAqB,EAAwB,MAC7C,IAAqB,EAAwB;AAE1D,SAAgB,EAAmB,EAClC,cACA,GAAG,KACoD;CACvD,OACC,kBAAC,EAAwB,MAAzB;EACC,WAAW,EAAG,8DAA8D,CAAS;EACrF,GAAI;CACJ,CAAA;AAEH"}
1
+ {"version":3,"file":"navigation-menu.js","names":[],"sources":["../../src/components/navigation-menu.tsx"],"sourcesContent":["import * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\n\ntype RadixNavigationMenuProps = React.ComponentProps<typeof NavigationMenuPrimitive.Root>;\ntype RadixNavigationMenuListProps = React.ComponentProps<typeof NavigationMenuPrimitive.List>;\ntype RadixNavigationMenuItemProps = React.ComponentProps<typeof NavigationMenuPrimitive.Item>;\ntype RadixNavigationMenuLinkProps = React.ComponentProps<typeof NavigationMenuPrimitive.Link>;\n\nexport interface NavigationMenuProps\n\textends Omit<\n\t\tRadixNavigationMenuProps,\n\t\t| \"value\"\n\t\t| \"defaultValue\"\n\t\t| \"onValueChange\"\n\t\t| \"dir\"\n\t\t| \"orientation\"\n\t\t| \"delayDuration\"\n\t\t| \"skipDelayDuration\"\n\t\t| \"asChild\"\n\t> {\n\t/**\n\t * Controlled value of the currently active navigation item.\n\t */\n\tvalue?: RadixNavigationMenuProps[\"value\"];\n\t/**\n\t * Uncontrolled initial active navigation item value.\n\t */\n\tdefaultValue?: RadixNavigationMenuProps[\"defaultValue\"];\n\t/**\n\t * Callback invoked when active navigation item value changes.\n\t */\n\tonValueChange?: RadixNavigationMenuProps[\"onValueChange\"];\n\t/**\n\t * Reading direction of the navigation menu. Inherits from nearest DirectionProvider or ltr.\n\t * @default \"ltr\"\n\t */\n\tdir?: RadixNavigationMenuProps[\"dir\"];\n\t/**\n\t * Orientation of the navigation menu items and keyboard navigation axis.\n\t * @default \"horizontal\"\n\t */\n\torientation?: RadixNavigationMenuProps[\"orientation\"];\n\t/**\n\t * Duration in milliseconds from pointer entering trigger until menu opens.\n\t * @default 200\n\t */\n\tdelayDuration?: RadixNavigationMenuProps[\"delayDuration\"];\n\t/**\n\t * Duration in milliseconds to move between triggers without re-triggering delay.\n\t * @default 300\n\t */\n\tskipDelayDuration?: RadixNavigationMenuProps[\"skipDelayDuration\"];\n\t/**\n\t * Change the default rendered nav element to the child element, merging props and behavior.\n\t * NavigationMenu forwards ref to HTMLElement and inherits native nav attributes.\n\t * @default false\n\t */\n\tasChild?: RadixNavigationMenuProps[\"asChild\"];\n}\n\nexport const NavigationMenu = NavigationMenuPrimitive.Root;\n\nexport interface NavigationMenuListProps extends Omit<RadixNavigationMenuListProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered ul element to the child element, merging props and behavior.\n\t * NavigationMenuList forwards ref to HTMLUListElement and inherits native ul attributes.\n\t * @default false\n\t */\n\tasChild?: RadixNavigationMenuListProps[\"asChild\"];\n}\n\nexport const NavigationMenuList = NavigationMenuPrimitive.List;\n\nexport interface NavigationMenuItemProps\n\textends Omit<RadixNavigationMenuItemProps, \"value\" | \"asChild\"> {\n\t/**\n\t * Unique value that associates the item with sub-navigation state.\n\t */\n\tvalue?: RadixNavigationMenuItemProps[\"value\"];\n\t/**\n\t * Change the default rendered li element to the child element, merging props and behavior.\n\t * NavigationMenuItem forwards ref to HTMLLIElement and inherits native li attributes.\n\t * @default false\n\t */\n\tasChild?: RadixNavigationMenuItemProps[\"asChild\"];\n}\n\nexport const NavigationMenuItem = NavigationMenuPrimitive.Item;\n\nexport interface NavigationMenuLinkProps\n\textends Omit<RadixNavigationMenuLinkProps, \"active\" | \"onSelect\" | \"asChild\"> {\n\t/**\n\t * Whether the link represents the currently active destination.\n\t * Adds data-active attribute for styling.\n\t * @default false\n\t */\n\tactive?: RadixNavigationMenuLinkProps[\"active\"];\n\t/**\n\t * Event handler called when the navigation link is selected via pointer or keyboard.\n\t */\n\tonSelect?: RadixNavigationMenuLinkProps[\"onSelect\"];\n\t/**\n\t * Change the default rendered anchor element to the child element, merging props and behavior.\n\t * NavigationMenuLink forwards ref to HTMLAnchorElement and inherits native anchor attributes.\n\t * @default false\n\t */\n\tasChild?: RadixNavigationMenuLinkProps[\"asChild\"];\n}\n\nexport function NavigationMenuLink({ className, ...props }: NavigationMenuLinkProps) {\n\treturn (\n\t\t<NavigationMenuPrimitive.Link\n\t\t\tclassName={cn(\"rounded-basalt-md px-3 py-2 text-sm hover:bg-basalt-accent\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;;AA6DA,IAAa,IAAiB,EAAwB,MAWzC,IAAqB,EAAwB,MAgB7C,IAAqB,EAAwB;AAsB1D,SAAgB,EAAmB,EAAE,cAAW,GAAG,KAAkC;CACpF,OACC,kBAAC,EAAwB,MAAzB;EACC,WAAW,EAAG,8DAA8D,CAAS;EACrF,GAAI;CACJ,CAAA;AAEH"}
@@ -1,14 +1,15 @@
1
1
  "use client";
2
2
  import { cn as e } from "../utils/cn.js";
3
+ import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
3
4
  //#region src/components/overlay.ts
4
- var t = 4, n = 8, r = "z-50", i = "motion-reduce:animate-none motion-reduce:transition-none", a = "outline-hidden focus-visible:border-basalt-ring", o = "outline-hidden focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-basalt-ring", s = "outline-hidden focus-visible:ring-2 focus-visible:ring-basalt-ring focus-visible:ring-offset-2 focus-visible:ring-offset-basalt-background";
5
- function c(t) {
6
- return e(r, "overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover py-1.5 text-sm text-basalt-popover-foreground shadow-md", i, t);
5
+ var n = 4, r = 8, i = "z-50", a = "motion-reduce:animate-none motion-reduce:transition-none", o = "outline-hidden focus-visible:border-basalt-ring", s = "outline-hidden focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-basalt-ring", c = "outline-hidden focus-visible:ring-2 focus-visible:ring-basalt-ring focus-visible:ring-offset-2 focus-visible:ring-offset-basalt-background";
6
+ function l(n) {
7
+ return e(t, i, "overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover py-1.5 text-sm text-basalt-popover-foreground shadow-md", a, n);
7
8
  }
8
- function l(t) {
9
+ function u(t) {
9
10
  return e("mx-1.5 flex w-[calc(100%-0.75rem)] cursor-default items-center rounded-basalt-sm px-2 py-1.5 text-left text-sm outline-hidden select-none", t);
10
11
  }
11
12
  //#endregion
12
- export { a as FOCUS_BORDER, o as FOCUS_INSET, s as FOCUS_RING, n as MENU_GAP, t as OVERLAY_GAP, r as OVERLAY_LAYER, i as OVERLAY_MOTION, l as overlayItemClass, c as overlayPanelClass };
13
+ export { o as FOCUS_BORDER, s as FOCUS_INSET, c as FOCUS_RING, r as MENU_GAP, n as OVERLAY_GAP, i as OVERLAY_LAYER, a as OVERLAY_MOTION, u as overlayItemClass, l as overlayPanelClass };
13
14
 
14
15
  //# sourceMappingURL=overlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","names":[],"sources":["../../src/components/overlay.ts"],"sourcesContent":["import { cn } from \"../utils/cn\";\n\n/** Gap between a field trigger and its list. Matches Kumo Select/Combobox. */\nexport const OVERLAY_GAP = 4;\n/** Gap between a menu trigger and its panel. Matches Kumo Dropdown/Popover. */\nexport const MENU_GAP = 8;\n/** Shared stacking layer for portals, menus, and chrome overlays. */\nexport const OVERLAY_LAYER = \"z-50\";\n/** Kill CSS animation and transition when the user prefers reduced motion. */\nexport const OVERLAY_MOTION = \"motion-reduce:animate-none motion-reduce:transition-none\";\n\n/** Recolor the existing 1px border. No extra ring, no layout shift. */\nexport const FOCUS_BORDER = \"outline-hidden focus-visible:border-basalt-ring\";\n/** Inset 1px theme ring for borderless controls. Outer size stays put. */\nexport const FOCUS_INSET =\n\t\"outline-hidden focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-basalt-ring\";\n/** Offset ring stays visible on primary fills (ring token equals primary). */\nexport const FOCUS_RING =\n\t\"outline-hidden focus-visible:ring-2 focus-visible:ring-basalt-ring focus-visible:ring-offset-2 focus-visible:ring-offset-basalt-background\";\n\nexport function overlayPanelClass(className?: string) {\n\treturn cn(\n\t\tOVERLAY_LAYER,\n\t\t\"overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover py-1.5 text-sm text-basalt-popover-foreground shadow-md\",\n\t\tOVERLAY_MOTION,\n\t\tclassName,\n\t);\n}\n\nexport function overlayItemClass(className?: string) {\n\treturn cn(\n\t\t\"mx-1.5 flex w-[calc(100%-0.75rem)] cursor-default items-center rounded-basalt-sm px-2 py-1.5 text-left text-sm outline-hidden select-none\",\n\t\tclassName,\n\t);\n}\n"],"mappings":";;;AAGA,IAAa,IAAc,GAEd,IAAW,GAEX,IAAgB,QAEhB,IAAiB,4DAGjB,IAAe,mDAEf,IACZ,+FAEY,IACZ;AAED,SAAgB,EAAkB,GAAoB;CACrD,OAAO,EACN,GACA,2IACA,GACA,CACD;AACD;AAEA,SAAgB,EAAiB,GAAoB;CACpD,OAAO,EACN,6IACA,CACD;AACD"}
1
+ {"version":3,"file":"overlay.js","names":[],"sources":["../../src/components/overlay.ts"],"sourcesContent":["import { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\n/** Gap between a field trigger and its list. Matches Kumo Select/Combobox. */\nexport const OVERLAY_GAP = 4;\n/** Gap between a menu trigger and its panel. Matches Kumo Dropdown/Popover. */\nexport const MENU_GAP = 8;\n/** Shared stacking layer for portals, menus, and chrome overlays. */\nexport const OVERLAY_LAYER = \"z-50\";\n/** Kill CSS animation and transition when the user prefers reduced motion. */\nexport const OVERLAY_MOTION = \"motion-reduce:animate-none motion-reduce:transition-none\";\n\n/** Recolor the existing 1px border. No extra ring, no layout shift. */\nexport const FOCUS_BORDER = \"outline-hidden focus-visible:border-basalt-ring\";\n/** Inset 1px theme ring for borderless controls. Outer size stays put. */\nexport const FOCUS_INSET =\n\t\"outline-hidden focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-basalt-ring\";\n/** Offset ring stays visible on primary fills (ring token equals primary). */\nexport const FOCUS_RING =\n\t\"outline-hidden focus-visible:ring-2 focus-visible:ring-basalt-ring focus-visible:ring-offset-2 focus-visible:ring-offset-basalt-background\";\n\nexport function overlayPanelClass(className?: string) {\n\treturn cn(\n\t\tBASALT_UI_CLASS,\n\t\tOVERLAY_LAYER,\n\t\t\"overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover py-1.5 text-sm text-basalt-popover-foreground shadow-md\",\n\t\tOVERLAY_MOTION,\n\t\tclassName,\n\t);\n}\n\nexport function overlayItemClass(className?: string) {\n\treturn cn(\n\t\t\"mx-1.5 flex w-[calc(100%-0.75rem)] cursor-default items-center rounded-basalt-sm px-2 py-1.5 text-left text-sm outline-hidden select-none\",\n\t\tclassName,\n\t);\n}\n"],"mappings":";;;;AAIA,IAAa,IAAc,GAEd,IAAW,GAEX,IAAgB,QAEhB,IAAiB,4DAGjB,IAAe,mDAEf,IACZ,+FAEY,IACZ;AAED,SAAgB,EAAkB,GAAoB;CACrD,OAAO,EACN,GACA,GACA,2IACA,GACA,CACD;AACD;AAEA,SAAgB,EAAiB,GAAoB;CACpD,OAAO,EACN,6IACA,CACD;AACD"}
@@ -1,40 +1,42 @@
1
1
  "use client";
2
- import { Breadcrumbs as e } from "./breadcrumbs.js";
3
- import * as t from "react";
4
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
4
+ import { Breadcrumbs as n } from "./breadcrumbs.js";
5
+ import * as r from "react";
6
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
7
  //#region src/components/page-header.tsx
6
- function i({ actions: i, breadcrumbs: a, description: o, filters: s, title: c }) {
7
- let l = t.useId();
8
- return /* @__PURE__ */ r("header", {
9
- "aria-labelledby": l,
10
- className: "space-y-4",
8
+ function o({ actions: o, breadcrumbs: s, description: c, filters: l, title: u }) {
9
+ let d = r.useId();
10
+ return /* @__PURE__ */ a("header", {
11
+ "aria-labelledby": d,
12
+ className: e(t, "space-y-4"),
11
13
  children: [
12
- a && a.length > 0 ? /* @__PURE__ */ n(e, { items: [...a] }) : null,
13
- /* @__PURE__ */ r("div", {
14
+ s && s.length > 0 ? /* @__PURE__ */ i(n, { items: [...s] }) : null,
15
+ /* @__PURE__ */ a("div", {
14
16
  className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between",
15
- children: [/* @__PURE__ */ r("div", {
17
+ children: [/* @__PURE__ */ a("div", {
16
18
  className: "min-w-0 flex-1 space-y-1",
17
- children: [/* @__PURE__ */ n("h1", {
18
- id: l,
19
+ children: [/* @__PURE__ */ i("h1", {
20
+ id: d,
19
21
  className: "text-2xl font-semibold tracking-tight text-basalt-foreground",
20
- children: c
21
- }), o ? /* @__PURE__ */ n("p", {
22
+ children: u
23
+ }), c ? /* @__PURE__ */ i("p", {
22
24
  className: "text-sm text-basalt-muted-foreground",
23
- children: o
25
+ children: c
24
26
  }) : null]
25
- }), i ? /* @__PURE__ */ n("div", {
27
+ }), o ? /* @__PURE__ */ i("div", {
26
28
  className: "flex flex-wrap items-center justify-end gap-2",
27
- children: i
29
+ children: o
28
30
  }) : null]
29
31
  }),
30
- s ? /* @__PURE__ */ n("div", {
32
+ l ? /* @__PURE__ */ i("div", {
31
33
  className: "flex flex-wrap items-center gap-2",
32
- children: s
34
+ children: l
33
35
  }) : null
34
36
  ]
35
37
  });
36
38
  }
37
39
  //#endregion
38
- export { i as PageHeader };
40
+ export { o as PageHeader };
39
41
 
40
42
  //# sourceMappingURL=page-header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page-header.js","names":[],"sources":["../../src/components/page-header.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\n\nexport interface PageHeaderBreadcrumb {\n\thref?: string;\n\tlabel: React.ReactNode;\n\ticon?: React.ReactNode;\n}\n\nexport interface PageHeaderProps {\n\t/** The page title, rendered as the only heading. */\n\ttitle: React.ReactNode;\n\t/** Supporting text below the title. */\n\tdescription?: React.ReactNode;\n\t/** Trail of parent pages. */\n\tbreadcrumbs?: readonly PageHeaderBreadcrumb[];\n\t/** Right-side title-row actions. Put the create button last. */\n\tactions?: React.ReactNode;\n\t/** Own-row filters. Keep short filters in actions. */\n\tfilters?: React.ReactNode;\n}\n\nexport function PageHeader({ actions, breadcrumbs, description, filters, title }: PageHeaderProps) {\n\tconst titleId = React.useId();\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useAriaPropsSupportedByRole: the title heading names this header\n\t\t<header aria-labelledby={titleId} className=\"space-y-4\">\n\t\t\t{breadcrumbs && breadcrumbs.length > 0 ? <Breadcrumbs items={[...breadcrumbs]} /> : null}\n\t\t\t<div className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n\t\t\t\t<div className=\"min-w-0 flex-1 space-y-1\">\n\t\t\t\t\t<h1 id={titleId} className=\"text-2xl font-semibold tracking-tight text-basalt-foreground\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h1>\n\t\t\t\t\t{description ? (\n\t\t\t\t\t\t<p className=\"text-sm text-basalt-muted-foreground\">{description}</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t{actions ? (\n\t\t\t\t\t<div className=\"flex flex-wrap items-center justify-end gap-2\">{actions}</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{filters ? <div className=\"flex flex-wrap items-center gap-2\">{filters}</div> : null}\n\t\t</header>\n\t);\n}\n"],"mappings":";;;;;AAsBA,SAAgB,EAAW,EAAE,YAAS,gBAAa,gBAAa,YAAS,YAA0B;CAClG,IAAM,IAAU,EAAM,MAAM;CAE5B,OAEC,kBAAC,UAAD;EAAQ,mBAAiB;EAAS,WAAU;EAA5C,UAAA;GACE,KAAe,EAAY,SAAS,IAAI,kBAAC,GAAD,EAAa,OAAO,CAAC,GAAG,CAAW,EAAI,CAAA,IAAI;GACpF,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;MACzB,UAAA;KACE,CAAA,GACH,IACA,kBAAC,KAAD;MAAG,WAAU;MAAwC,UAAA;KAAe,CAAA,IACjE,IACA;IACJ,CAAA,GAAA,IACA,kBAAC,OAAD;KAAK,WAAU;KAAiD,UAAA;IAAa,CAAA,IAC1E,IACA;;GACJ,IAAU,kBAAC,OAAD;IAAK,WAAU;IAAqC,UAAA;GAAa,CAAA,IAAI;EACzE;;AAEV"}
1
+ {"version":3,"file":"page-header.js","names":[],"sources":["../../src/components/page-header.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\n\nexport interface PageHeaderBreadcrumb {\n\thref?: string;\n\tlabel: React.ReactNode;\n\ticon?: React.ReactNode;\n}\n\nexport interface PageHeaderProps {\n\t/** The page title, rendered as the only heading. */\n\ttitle: React.ReactNode;\n\t/** Supporting text below the title. */\n\tdescription?: React.ReactNode;\n\t/** Trail of parent pages. */\n\tbreadcrumbs?: readonly PageHeaderBreadcrumb[];\n\t/** Right-side title-row actions. Put the create button last. */\n\tactions?: React.ReactNode;\n\t/** Own-row filters. Keep short filters in actions. */\n\tfilters?: React.ReactNode;\n}\n\nexport function PageHeader({ actions, breadcrumbs, description, filters, title }: PageHeaderProps) {\n\tconst titleId = React.useId();\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useAriaPropsSupportedByRole: the title heading names this header\n\t\t<header aria-labelledby={titleId} className={cn(BASALT_UI_CLASS, \"space-y-4\")}>\n\t\t\t{breadcrumbs && breadcrumbs.length > 0 ? <Breadcrumbs items={[...breadcrumbs]} /> : null}\n\t\t\t<div className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n\t\t\t\t<div className=\"min-w-0 flex-1 space-y-1\">\n\t\t\t\t\t<h1 id={titleId} className=\"text-2xl font-semibold tracking-tight text-basalt-foreground\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h1>\n\t\t\t\t\t{description ? (\n\t\t\t\t\t\t<p className=\"text-sm text-basalt-muted-foreground\">{description}</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t{actions ? (\n\t\t\t\t\t<div className=\"flex flex-wrap items-center justify-end gap-2\">{actions}</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{filters ? <div className=\"flex flex-wrap items-center gap-2\">{filters}</div> : null}\n\t\t</header>\n\t);\n}\n"],"mappings":";;;;;;;AAwBA,SAAgB,EAAW,EAAE,YAAS,gBAAa,gBAAa,YAAS,YAA0B;CAClG,IAAM,IAAU,EAAM,MAAM;CAE5B,OAEC,kBAAC,UAAD;EAAQ,mBAAiB;EAAS,WAAW,EAAG,GAAiB,WAAW;EAA5E,UAAA;GACE,KAAe,EAAY,SAAS,IAAI,kBAAC,GAAD,EAAa,OAAO,CAAC,GAAG,CAAW,EAAI,CAAA,IAAI;GACpF,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;MACzB,UAAA;KACE,CAAA,GACH,IACA,kBAAC,KAAD;MAAG,WAAU;MAAwC,UAAA;KAAe,CAAA,IACjE,IACA;IACJ,CAAA,GAAA,IACA,kBAAC,OAAD;KAAK,WAAU;KAAiD,UAAA;IAAa,CAAA,IAC1E,IACA;;GACJ,IAAU,kBAAC,OAAD;IAAK,WAAU;IAAqC,UAAA;GAAa,CAAA,IAAI;EACzE;;AAEV"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn as e } from "../utils/cn.js";
3
- import { Button as t } from "./button.js";
4
- import { controlSurfaceClass as n } from "../utils/control-surface.js";
3
+ import { controlSurfaceClass as t } from "../utils/control-surface.js";
4
+ import { Button as n } from "./button.js";
5
5
  import { useState as r } from "react";
6
6
  import { ChevronLeft as i, ChevronRight as a, ChevronsLeft as o, ChevronsRight as s } from "lucide-react";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
@@ -15,9 +15,9 @@ function d({ page: d, defaultPage: f = 1, pageCount: p = 10, onPageChange: m, si
15
15
  "aria-label": "Pagination",
16
16
  className: _,
17
17
  children: /* @__PURE__ */ l("div", {
18
- className: n(e("inline-flex h-9 items-stretch", "[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border", "[&>:first-child]:rounded-l-basalt-md [&>:last-child]:rounded-r-basalt-md")),
18
+ className: t(e("inline-flex h-9 items-stretch", "[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border", "[&>:first-child]:rounded-l-basalt-md [&>:last-child]:rounded-r-basalt-md")),
19
19
  children: [
20
- h ? null : /* @__PURE__ */ c(t, {
20
+ h ? null : /* @__PURE__ */ c(n, {
21
21
  variant: "ghost",
22
22
  size: "icon",
23
23
  icon: /* @__PURE__ */ c(o, {}),
@@ -26,7 +26,7 @@ function d({ page: d, defaultPage: f = 1, pageCount: p = 10, onPageChange: m, si
26
26
  disabled: T,
27
27
  onClick: () => S(1)
28
28
  }),
29
- /* @__PURE__ */ c(t, {
29
+ /* @__PURE__ */ c(n, {
30
30
  variant: "ghost",
31
31
  size: "icon",
32
32
  icon: /* @__PURE__ */ c(i, {}),
@@ -40,7 +40,7 @@ function d({ page: d, defaultPage: f = 1, pageCount: p = 10, onPageChange: m, si
40
40
  className: "flex h-full min-w-9 items-center justify-center px-3 text-sm font-medium tabular-nums text-basalt-foreground",
41
41
  children: x
42
42
  }),
43
- /* @__PURE__ */ c(t, {
43
+ /* @__PURE__ */ c(n, {
44
44
  variant: "ghost",
45
45
  size: "icon",
46
46
  icon: /* @__PURE__ */ c(a, {}),
@@ -49,7 +49,7 @@ function d({ page: d, defaultPage: f = 1, pageCount: p = 10, onPageChange: m, si
49
49
  disabled: E,
50
50
  onClick: () => S(Math.min(b, x + 1))
51
51
  }),
52
- h ? null : /* @__PURE__ */ c(t, {
52
+ h ? null : /* @__PURE__ */ c(n, {
53
53
  variant: "ghost",
54
54
  size: "icon",
55
55
  icon: /* @__PURE__ */ c(s, {}),
@@ -2,37 +2,157 @@ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
2
  import * as React from "react";
3
3
  export declare const POPOVER_SIDES: readonly ["top", "bottom", "left", "right"];
4
4
  export type PopoverSide = (typeof POPOVER_SIDES)[number];
5
- export type PopoverProps = Omit<React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>, "open" | "defaultOpen" | "onOpenChange"> & {
5
+ type RadixPopoverProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>;
6
+ type RadixPopoverTriggerProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger>;
7
+ type RadixPopoverCloseProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Close>;
8
+ type RadixPopoverContentProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>;
9
+ export interface PopoverProps extends Omit<RadixPopoverProps, "children" | "open" | "defaultOpen" | "onOpenChange" | "modal"> {
6
10
  /**
7
- * The controlled open state.
11
+ * Popover structure elements, typically PopoverTrigger and PopoverContent.
8
12
  */
9
- open?: boolean;
13
+ children?: React.ReactNode;
10
14
  /**
11
- * The uncontrolled initial open state.
15
+ * Controlled open state of the popover.
16
+ */
17
+ open?: RadixPopoverProps["open"];
18
+ /**
19
+ * Uncontrolled initial open state of the popover.
12
20
  * @default false
13
21
  */
14
- defaultOpen?: boolean;
22
+ defaultOpen?: RadixPopoverProps["defaultOpen"];
15
23
  /**
16
- * Called when the open state changes.
24
+ * Callback called when the open state changes.
17
25
  */
18
- onOpenChange?: (open: boolean) => void;
19
- };
26
+ onOpenChange?: RadixPopoverProps["onOpenChange"];
27
+ /**
28
+ * Whether the popover renders modally, preventing outside interaction and hiding background content from screen readers.
29
+ * @default false
30
+ */
31
+ modal?: RadixPopoverProps["modal"];
32
+ }
20
33
  export declare const Popover: React.FC<PopoverProps>;
34
+ export interface PopoverTriggerProps extends Omit<RadixPopoverTriggerProps, "asChild"> {
35
+ /**
36
+ * Change the default rendered button element to the child element, merging props and behavior.
37
+ * PopoverTrigger forwards ref to HTMLButtonElement and inherits native button attributes.
38
+ * @default false
39
+ */
40
+ asChild?: RadixPopoverTriggerProps["asChild"];
41
+ }
21
42
  export declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
43
+ export interface PopoverCloseProps extends Omit<RadixPopoverCloseProps, "asChild"> {
44
+ /**
45
+ * Change the default rendered button element to the child element, merging props and behavior.
46
+ * PopoverClose forwards ref to HTMLButtonElement and inherits native button attributes.
47
+ * @default false
48
+ */
49
+ asChild?: RadixPopoverCloseProps["asChild"];
50
+ }
22
51
  export declare const PopoverClose: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverCloseProps & React.RefAttributes<HTMLButtonElement>>;
23
- export type PopoverContentProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {
52
+ export interface PopoverContentProps extends Omit<RadixPopoverContentProps, "side" | "sideOffset" | "align" | "alignOffset" | "avoidCollisions" | "collisionBoundary" | "collisionPadding" | "arrowPadding" | "sticky" | "hideWhenDetached" | "updatePositionStrategy" | "forceMount" | "asChild" | "onOpenAutoFocus" | "onCloseAutoFocus" | "onEscapeKeyDown" | "onPointerDownOutside" | "onFocusOutside" | "onInteractOutside"> {
24
53
  /**
25
- * Show the pointing arrow.
54
+ * Preferred placement side relative to trigger.
55
+ * @default "bottom"
56
+ */
57
+ side?: RadixPopoverContentProps["side"];
58
+ /**
59
+ * Distance in pixels between trigger and floating content panel.
60
+ * @default 8
61
+ */
62
+ sideOffset?: RadixPopoverContentProps["sideOffset"];
63
+ /**
64
+ * Preferred alignment along the side axis.
65
+ * @default "center"
66
+ */
67
+ align?: RadixPopoverContentProps["align"];
68
+ /**
69
+ * Offset in pixels from the start or end alignment position.
70
+ * @default 0
71
+ */
72
+ alignOffset?: RadixPopoverContentProps["alignOffset"];
73
+ /**
74
+ * Whether to reposition content to avoid viewport boundary collisions.
26
75
  * @default true
27
76
  */
28
- arrow?: boolean;
29
- };
30
- export declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
77
+ avoidCollisions?: RadixPopoverContentProps["avoidCollisions"];
78
+ /**
79
+ * Element or elements bounding boundary collision calculations.
80
+ * @default []
81
+ */
82
+ collisionBoundary?: RadixPopoverContentProps["collisionBoundary"];
83
+ /**
84
+ * Virtual padding from collision boundaries in pixels.
85
+ * @default 0
86
+ */
87
+ collisionPadding?: RadixPopoverContentProps["collisionPadding"];
88
+ /**
89
+ * Padding in pixels between popper arrow and floating panel edge.
90
+ * @default 0
91
+ */
92
+ arrowPadding?: RadixPopoverContentProps["arrowPadding"];
93
+ /**
94
+ * Sticky positioning behavior along the align axis when overflowing.
95
+ * @default "partial"
96
+ */
97
+ sticky?: RadixPopoverContentProps["sticky"];
98
+ /**
99
+ * Whether to hide content completely when trigger is fully occluded.
100
+ * @default false
101
+ */
102
+ hideWhenDetached?: RadixPopoverContentProps["hideWhenDetached"];
103
+ /**
104
+ * Strategy used to calculate and update popper position.
105
+ * @default "optimized"
106
+ */
107
+ updatePositionStrategy?: RadixPopoverContentProps["updatePositionStrategy"];
108
+ /**
109
+ * Force mounting content in DOM for external animation controls.
110
+ * When forceMount is true, the content remains mounted even when closed.
111
+ * The caller is responsible for visibility transitions and unmounting after animation completes.
112
+ * Note: Keeping modal content forceMounted may isolate background interactions until unmounted.
113
+ */
114
+ forceMount?: true;
115
+ /**
116
+ * Change the default rendered div element to the child element, merging props and behavior.
117
+ * PopoverContent forwards ref to HTMLDivElement and inherits native div attributes.
118
+ * @default false
119
+ */
120
+ asChild?: RadixPopoverContentProps["asChild"];
121
+ /**
122
+ * Callback fired when auto-focusing on open. Can be prevented.
123
+ */
124
+ onOpenAutoFocus?: RadixPopoverContentProps["onOpenAutoFocus"];
125
+ /**
126
+ * Callback fired when auto-focusing on close. Can be prevented.
127
+ */
128
+ onCloseAutoFocus?: RadixPopoverContentProps["onCloseAutoFocus"];
129
+ /**
130
+ * Callback fired when the Escape key is down on the dismissable layer. Can be prevented.
131
+ */
132
+ onEscapeKeyDown?: RadixPopoverContentProps["onEscapeKeyDown"];
133
+ /**
134
+ * Callback fired when a pointerdown event happens outside the bounds of the dismissable layer. Can be prevented.
135
+ */
136
+ onPointerDownOutside?: RadixPopoverContentProps["onPointerDownOutside"];
137
+ /**
138
+ * Callback fired when focus moves outside the bounds of the dismissable layer. Can be prevented.
139
+ */
140
+ onFocusOutside?: RadixPopoverContentProps["onFocusOutside"];
141
+ /**
142
+ * Callback fired when an interaction (pointerdown or focus) happens outside the bounds of the dismissable layer. Can be prevented.
143
+ */
144
+ onInteractOutside?: RadixPopoverContentProps["onInteractOutside"];
31
145
  /**
32
146
  * Show the pointing arrow.
33
147
  * @default true
34
148
  */
35
149
  arrow?: boolean;
36
- } & React.RefAttributes<HTMLDivElement>>;
37
- export declare const PopoverTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
38
- export declare const PopoverDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
150
+ }
151
+ export declare const PopoverContent: React.ForwardRefExoticComponent<PopoverContentProps & React.RefAttributes<HTMLDivElement>>;
152
+ export interface PopoverTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
153
+ }
154
+ export declare const PopoverTitle: React.ForwardRefExoticComponent<PopoverTitleProps & React.RefAttributes<HTMLHeadingElement>>;
155
+ export interface PopoverDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {
156
+ }
157
+ export declare const PopoverDescription: React.ForwardRefExoticComponent<PopoverDescriptionProps & React.RefAttributes<HTMLParagraphElement>>;
158
+ export {};
@@ -2,57 +2,61 @@
2
2
  import { cn as e } from "../utils/cn.js";
3
3
  import { OVERLAY_LAYER as t, OVERLAY_MOTION as n } from "./overlay.js";
4
4
  import * as r from "react";
5
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
- import * as o from "@radix-ui/react-popover";
5
+ import { Slottable as i } from "@radix-ui/react-slot";
6
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ import * as s from "@radix-ui/react-popover";
7
8
  //#region src/components/popover.tsx
8
- var s = [
9
+ var c = [
9
10
  "top",
10
11
  "bottom",
11
12
  "left",
12
13
  "right"
13
- ], c = o.Root, l = o.Trigger, u = o.Close, d = r.forwardRef(({ className: r, align: s = "center", side: c = "bottom", sideOffset: l = 8, arrow: u = !0, children: d, ...f }, p) => /* @__PURE__ */ i(o.Portal, { children: /* @__PURE__ */ a(o.Content, {
14
- ref: p,
15
- align: s,
16
- side: c,
17
- sideOffset: l,
18
- className: e(t, n, "rounded-basalt-md border border-basalt-border bg-basalt-popover px-4 py-3 text-sm text-basalt-popover-foreground shadow-md outline-hidden", r),
19
- ...f,
20
- children: [d, u ? /* @__PURE__ */ i(o.Arrow, {
21
- asChild: !0,
22
- width: 20,
23
- height: 10,
24
- children: /* @__PURE__ */ i(m, {})
25
- }) : null]
26
- }) }));
27
- d.displayName = o.Content.displayName;
28
- var f = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i("h2", {
14
+ ], l = s.Root, u = s.Trigger, d = s.Close, f = r.forwardRef(({ className: r, align: c = "center", side: l = "bottom", sideOffset: u = 8, arrow: d = !0, children: f, ...p }, m) => /* @__PURE__ */ a(s.Portal, {
15
+ forceMount: p.forceMount,
16
+ children: /* @__PURE__ */ o(s.Content, {
17
+ ref: m,
18
+ align: c,
19
+ side: l,
20
+ sideOffset: u,
21
+ className: e(t, n, "rounded-basalt-md border border-basalt-border bg-basalt-popover px-4 py-3 text-sm text-basalt-popover-foreground shadow-md outline-hidden", r),
22
+ ...p,
23
+ children: [/* @__PURE__ */ a(i, { children: f }), d ? /* @__PURE__ */ a(s.Arrow, {
24
+ asChild: !0,
25
+ width: 20,
26
+ height: 10,
27
+ children: /* @__PURE__ */ a(h, {})
28
+ }) : null]
29
+ })
30
+ }));
31
+ f.displayName = s.Content.displayName;
32
+ var p = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a("h2", {
29
33
  ref: r,
30
34
  className: e("m-0 text-base font-medium leading-6 text-basalt-foreground", t),
31
35
  ...n
32
36
  }));
33
- f.displayName = "PopoverTitle";
34
- var p = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i("p", {
37
+ p.displayName = "PopoverTitle";
38
+ var m = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a("p", {
35
39
  ref: r,
36
40
  className: e("m-0 text-base leading-6 text-basalt-muted-foreground", t),
37
41
  ...n
38
42
  }));
39
- p.displayName = "PopoverDescription";
40
- function m(e) {
41
- return /* @__PURE__ */ i("svg", {
43
+ m.displayName = "PopoverDescription";
44
+ function h(e) {
45
+ return /* @__PURE__ */ a("svg", {
42
46
  width: 20,
43
47
  height: 10,
44
48
  "aria-hidden": !0,
45
49
  ...e,
46
- children: /* @__PURE__ */ a("svg", {
50
+ children: /* @__PURE__ */ o("svg", {
47
51
  width: "100%",
48
52
  height: "100%",
49
53
  viewBox: "0 0 20 10",
50
54
  preserveAspectRatio: "none",
51
55
  "aria-hidden": !0,
52
- children: [/* @__PURE__ */ i("path", {
56
+ children: [/* @__PURE__ */ a("path", {
53
57
  d: "M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z",
54
58
  className: "fill-basalt-popover"
55
- }), /* @__PURE__ */ i("path", {
59
+ }), /* @__PURE__ */ a("path", {
56
60
  d: "M8.99542 1.85876C9.75604 1.17425 10.9106 1.17422 11.6713 1.85878L16.5281 6.22989C17.0789 6.72568 17.7938 7.00001 18.5349 7.00001L15.89 7L11.0023 2.60207C10.622 2.2598 10.0447 2.2598 9.66436 2.60207L4.77734 7L2.13171 7.00001C2.87284 7.00001 3.58774 6.72568 4.13861 6.22989L8.99542 1.85876Z",
57
61
  className: "fill-basalt-border"
58
62
  })]
@@ -60,6 +64,6 @@ function m(e) {
60
64
  });
61
65
  }
62
66
  //#endregion
63
- export { s as POPOVER_SIDES, c as Popover, u as PopoverClose, d as PopoverContent, p as PopoverDescription, f as PopoverTitle, l as PopoverTrigger };
67
+ export { c as POPOVER_SIDES, l as Popover, d as PopoverClose, f as PopoverContent, m as PopoverDescription, p as PopoverTitle, u as PopoverTrigger };
64
68
 
65
69
  //# sourceMappingURL=popover.js.map