entangle-ui 0.8.1 → 0.9.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 (260) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/esm/assets/src/components/controls/Combobox/Combobox.css.ts.vanilla-B7B5ttkq.css +210 -0
  3. package/dist/esm/assets/src/components/controls/FileUploader/FileUploader.css.ts.vanilla-T4nRiI7s.css +194 -0
  4. package/dist/esm/assets/src/components/controls/MultiSelect/MultiSelect.css.ts.vanilla-CdYayqaF.css +311 -0
  5. package/dist/esm/assets/src/components/controls/TagInput/TagInput.css.ts.vanilla-hnkMOPp1.css +141 -0
  6. package/dist/esm/assets/src/components/data/DataTable/DataTable.css.ts.vanilla-CmRgtjIW.css +231 -0
  7. package/dist/esm/assets/src/components/feedback/Alert/{Alert.css.ts.vanilla-CRAI-xHx.css → Alert.css.ts.vanilla-CfCDsIEg.css} +2 -0
  8. package/dist/esm/assets/src/components/feedback/CommandPalette/CommandPalette.css.ts.vanilla-DGdrLKYZ.css +160 -0
  9. package/dist/esm/assets/src/components/feedback/Drawer/Drawer.css.ts.vanilla-CLPTOUrA.css +247 -0
  10. package/dist/esm/assets/src/components/feedback/Skeleton/SkeletonLayout.css.ts.vanilla-Db7bpqiI.css +75 -0
  11. package/dist/esm/assets/src/components/feedback/Stat/Stat.css.ts.vanilla-GBk3JAMB.css +69 -0
  12. package/dist/esm/assets/src/components/layout/Card/Card.css.ts.vanilla-Ducn1gUX.css +124 -0
  13. package/dist/esm/assets/src/components/navigation/Pagination/Pagination.css.ts.vanilla-CmlFyyjh.css +103 -0
  14. package/dist/esm/assets/src/components/primitives/HoverCard/HoverCard.css.ts.vanilla-BYT0qbLp.css +41 -0
  15. package/dist/esm/components/Icons/ArchiveIcon.js +30 -0
  16. package/dist/esm/components/Icons/ArchiveIcon.js.map +1 -0
  17. package/dist/esm/components/Icons/BugIcon.js +30 -0
  18. package/dist/esm/components/Icons/BugIcon.js.map +1 -0
  19. package/dist/esm/components/Icons/BuildingIcon.js +30 -0
  20. package/dist/esm/components/Icons/BuildingIcon.js.map +1 -0
  21. package/dist/esm/components/Icons/ChevronLeftIcon.js +30 -0
  22. package/dist/esm/components/Icons/ChevronLeftIcon.js.map +1 -0
  23. package/dist/esm/components/Icons/ChevronRightIcon.js +30 -0
  24. package/dist/esm/components/Icons/ChevronRightIcon.js.map +1 -0
  25. package/dist/esm/components/Icons/CloudUploadIcon.js +24 -0
  26. package/dist/esm/components/Icons/CloudUploadIcon.js.map +1 -0
  27. package/dist/esm/components/Icons/DotsHorizontalIcon.js +30 -0
  28. package/dist/esm/components/Icons/DotsHorizontalIcon.js.map +1 -0
  29. package/dist/esm/components/Icons/DotsVerticalIcon.js +30 -0
  30. package/dist/esm/components/Icons/DotsVerticalIcon.js.map +1 -0
  31. package/dist/esm/components/Icons/ExternalLinkIcon.js +26 -0
  32. package/dist/esm/components/Icons/ExternalLinkIcon.js.map +1 -0
  33. package/dist/esm/components/Icons/FileTextIcon.js +30 -0
  34. package/dist/esm/components/Icons/FileTextIcon.js.map +1 -0
  35. package/dist/esm/components/Icons/FirstIcon.js +23 -0
  36. package/dist/esm/components/Icons/FirstIcon.js.map +1 -0
  37. package/dist/esm/components/Icons/FolderCogIcon.js +30 -0
  38. package/dist/esm/components/Icons/FolderCogIcon.js.map +1 -0
  39. package/dist/esm/components/Icons/FolderOpenIcon.js +30 -0
  40. package/dist/esm/components/Icons/FolderOpenIcon.js.map +1 -0
  41. package/dist/esm/components/Icons/GitBranchIcon.js +30 -0
  42. package/dist/esm/components/Icons/GitBranchIcon.js.map +1 -0
  43. package/dist/esm/components/Icons/LastIcon.js +23 -0
  44. package/dist/esm/components/Icons/LastIcon.js.map +1 -0
  45. package/dist/esm/components/Icons/MinusIcon.js +30 -0
  46. package/dist/esm/components/Icons/MinusIcon.js.map +1 -0
  47. package/dist/esm/components/Icons/PauseIcon.js +30 -0
  48. package/dist/esm/components/Icons/PauseIcon.js.map +1 -0
  49. package/dist/esm/components/Icons/PinIcon.js +31 -0
  50. package/dist/esm/components/Icons/PinIcon.js.map +1 -0
  51. package/dist/esm/components/Icons/SendIcon.js +30 -0
  52. package/dist/esm/components/Icons/SendIcon.js.map +1 -0
  53. package/dist/esm/components/Icons/StopIcon.js +30 -0
  54. package/dist/esm/components/Icons/StopIcon.js.map +1 -0
  55. package/dist/esm/components/Icons/TerminalIcon.js +30 -0
  56. package/dist/esm/components/Icons/TerminalIcon.js.map +1 -0
  57. package/dist/esm/components/Icons/UnlinkIcon.js +26 -0
  58. package/dist/esm/components/Icons/UnlinkIcon.js.map +1 -0
  59. package/dist/esm/components/Icons/UsersIcon.js +31 -0
  60. package/dist/esm/components/Icons/UsersIcon.js.map +1 -0
  61. package/dist/esm/components/controls/Combobox/Combobox.css.js +20 -0
  62. package/dist/esm/components/controls/Combobox/Combobox.css.js.map +1 -0
  63. package/dist/esm/components/controls/Combobox/Combobox.js +354 -0
  64. package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -0
  65. package/dist/esm/components/controls/FileUploader/FileUploader.css.js +20 -0
  66. package/dist/esm/components/controls/FileUploader/FileUploader.css.js.map +1 -0
  67. package/dist/esm/components/controls/FileUploader/FileUploader.js +264 -0
  68. package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -0
  69. package/dist/esm/components/controls/MultiSelect/MultiSelect.css.js +23 -0
  70. package/dist/esm/components/controls/MultiSelect/MultiSelect.css.js.map +1 -0
  71. package/dist/esm/components/controls/MultiSelect/MultiSelect.js +269 -0
  72. package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -0
  73. package/dist/esm/components/controls/Select/Select.js +5 -4
  74. package/dist/esm/components/controls/Select/Select.js.map +1 -1
  75. package/dist/esm/components/controls/TagInput/TagInput.css.js +12 -0
  76. package/dist/esm/components/controls/TagInput/TagInput.css.js.map +1 -0
  77. package/dist/esm/components/controls/TagInput/TagInput.js +189 -0
  78. package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -0
  79. package/dist/esm/components/controls/TreeView/TreeNode.js +87 -1
  80. package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
  81. package/dist/esm/components/controls/VectorInput/VectorInput.js +87 -4
  82. package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
  83. package/dist/esm/components/data/DataTable/DataTable.css.js +25 -0
  84. package/dist/esm/components/data/DataTable/DataTable.css.js.map +1 -0
  85. package/dist/esm/components/data/DataTable/DataTable.js +502 -0
  86. package/dist/esm/components/data/DataTable/DataTable.js.map +1 -0
  87. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js +87 -5
  88. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
  89. package/dist/esm/components/editor/ChatPanel/ChatInput.js +87 -5
  90. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  91. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +87 -2
  92. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  93. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +87 -3
  94. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -1
  95. package/dist/esm/components/editor/PropertyInspector/PropertySection.js +87 -3
  96. package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -1
  97. package/dist/esm/components/feedback/Alert/Alert.css.js +1 -1
  98. package/dist/esm/components/feedback/Alert/Alert.js +3 -2
  99. package/dist/esm/components/feedback/Alert/Alert.js.map +1 -1
  100. package/dist/esm/components/feedback/CommandPalette/CommandPalette.css.js +20 -0
  101. package/dist/esm/components/feedback/CommandPalette/CommandPalette.css.js.map +1 -0
  102. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js +261 -0
  103. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js.map +1 -0
  104. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js +86 -0
  105. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js.map +1 -0
  106. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js +63 -0
  107. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -0
  108. package/dist/esm/components/feedback/Dialog/DialogHeader.js +2 -1
  109. package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
  110. package/dist/esm/components/feedback/Drawer/Drawer.css.js +17 -0
  111. package/dist/esm/components/feedback/Drawer/Drawer.css.js.map +1 -0
  112. package/dist/esm/components/feedback/Drawer/Drawer.js +120 -0
  113. package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -0
  114. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js +74 -0
  115. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -0
  116. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.css.js +18 -0
  117. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.css.js.map +1 -0
  118. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js +95 -0
  119. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -0
  120. package/dist/esm/components/feedback/Stat/Stat.css.js +15 -0
  121. package/dist/esm/components/feedback/Stat/Stat.css.js.map +1 -0
  122. package/dist/esm/components/feedback/Stat/Stat.js +55 -0
  123. package/dist/esm/components/feedback/Stat/Stat.js.map +1 -0
  124. package/dist/esm/components/feedback/Toast/ToastItem.js +12 -15
  125. package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -1
  126. package/dist/esm/components/layout/Accordion/Accordion.js +2 -1
  127. package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
  128. package/dist/esm/components/layout/Accordion/AccordionTrigger.js +2 -3
  129. package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
  130. package/dist/esm/components/layout/Card/Card.css.js +18 -0
  131. package/dist/esm/components/layout/Card/Card.css.js.map +1 -0
  132. package/dist/esm/components/layout/Card/Card.js +66 -0
  133. package/dist/esm/components/layout/Card/Card.js.map +1 -0
  134. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +1 -0
  135. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
  136. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +1 -0
  137. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -1
  138. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +23 -0
  139. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
  140. package/dist/esm/components/navigation/Pagination/Pagination.css.js +12 -0
  141. package/dist/esm/components/navigation/Pagination/Pagination.css.js.map +1 -0
  142. package/dist/esm/components/navigation/Pagination/Pagination.js +107 -0
  143. package/dist/esm/components/navigation/Pagination/Pagination.js.map +1 -0
  144. package/dist/esm/components/navigation/Pagination/usePagination.js +143 -0
  145. package/dist/esm/components/navigation/Pagination/usePagination.js.map +1 -0
  146. package/dist/esm/components/primitives/Avatar/Avatar.js +87 -1
  147. package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
  148. package/dist/esm/components/primitives/Badge/Badge.js +87 -1
  149. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -1
  150. package/dist/esm/components/primitives/Checkbox/Checkbox.js +5 -2
  151. package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
  152. package/dist/esm/components/primitives/Collapsible/Collapsible.js +2 -3
  153. package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
  154. package/dist/esm/components/primitives/HoverCard/HoverCard.css.js +7 -0
  155. package/dist/esm/components/primitives/HoverCard/HoverCard.css.js.map +1 -0
  156. package/dist/esm/components/primitives/HoverCard/HoverCard.js +169 -0
  157. package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -0
  158. package/dist/esm/components/primitives/Icon/Icon.js +16 -2
  159. package/dist/esm/components/primitives/Icon/Icon.js.map +1 -1
  160. package/dist/esm/components/primitives/Link/Link.js +3 -3
  161. package/dist/esm/components/primitives/Link/Link.js.map +1 -1
  162. package/dist/esm/components/primitives/Popover/PopoverClose.js +2 -3
  163. package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
  164. package/dist/esm/components/primitives/Radio/Radio.js +1 -1
  165. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js +44 -0
  166. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -0
  167. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js +97 -0
  168. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -0
  169. package/dist/esm/hooks/useDebounced/useDebouncedValue.js +35 -0
  170. package/dist/esm/hooks/useDebounced/useDebouncedValue.js.map +1 -0
  171. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +73 -0
  172. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -0
  173. package/dist/esm/hooks/useListboxNav/useListboxNav.js +181 -0
  174. package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -0
  175. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js +54 -0
  176. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -0
  177. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js +78 -0
  178. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -0
  179. package/dist/esm/index.js +43 -0
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/esm/theme/breakpoints.js +27 -0
  182. package/dist/esm/theme/breakpoints.js.map +1 -0
  183. package/dist/esm/theme/index.js +1 -0
  184. package/dist/esm/theme/index.js.map +1 -1
  185. package/dist/tokens/tokens.dark.css +1 -1
  186. package/dist/tokens/tokens.json +1 -1
  187. package/dist/tokens/tokens.light.css +1 -1
  188. package/dist/types/components/Icons/ArchiveIcon.d.ts +33 -0
  189. package/dist/types/components/Icons/BugIcon.d.ts +33 -0
  190. package/dist/types/components/Icons/BuildingIcon.d.ts +33 -0
  191. package/dist/types/components/Icons/ChevronLeftIcon.d.ts +33 -0
  192. package/dist/types/components/Icons/ChevronRightIcon.d.ts +33 -0
  193. package/dist/types/components/Icons/CloudUploadIcon.d.ts +27 -0
  194. package/dist/types/components/Icons/DotsHorizontalIcon.d.ts +33 -0
  195. package/dist/types/components/Icons/DotsVerticalIcon.d.ts +33 -0
  196. package/dist/types/components/Icons/ExternalLinkIcon.d.ts +29 -0
  197. package/dist/types/components/Icons/FileTextIcon.d.ts +33 -0
  198. package/dist/types/components/Icons/FirstIcon.d.ts +26 -0
  199. package/dist/types/components/Icons/FolderCogIcon.d.ts +33 -0
  200. package/dist/types/components/Icons/FolderOpenIcon.d.ts +33 -0
  201. package/dist/types/components/Icons/GitBranchIcon.d.ts +33 -0
  202. package/dist/types/components/Icons/LastIcon.d.ts +26 -0
  203. package/dist/types/components/Icons/MinusIcon.d.ts +33 -0
  204. package/dist/types/components/Icons/PauseIcon.d.ts +33 -0
  205. package/dist/types/components/Icons/PinIcon.d.ts +34 -0
  206. package/dist/types/components/Icons/SendIcon.d.ts +33 -0
  207. package/dist/types/components/Icons/StopIcon.d.ts +33 -0
  208. package/dist/types/components/Icons/TerminalIcon.d.ts +33 -0
  209. package/dist/types/components/Icons/UnlinkIcon.d.ts +29 -0
  210. package/dist/types/components/Icons/UsersIcon.d.ts +34 -0
  211. package/dist/types/components/controls/Combobox/Combobox.d.ts +29 -0
  212. package/dist/types/components/controls/Combobox/Combobox.types.d.ts +109 -0
  213. package/dist/types/components/controls/FileUploader/FileUploader.d.ts +34 -0
  214. package/dist/types/components/controls/FileUploader/FileUploader.types.d.ts +94 -0
  215. package/dist/types/components/controls/MultiSelect/MultiSelect.d.ts +31 -0
  216. package/dist/types/components/controls/MultiSelect/MultiSelect.types.d.ts +85 -0
  217. package/dist/types/components/controls/TagInput/TagInput.d.ts +24 -0
  218. package/dist/types/components/controls/TagInput/TagInput.types.d.ts +100 -0
  219. package/dist/types/components/data/DataTable/DataTable.d.ts +8 -0
  220. package/dist/types/components/data/DataTable/DataTable.types.d.ts +159 -0
  221. package/dist/types/components/editor/ChatPanel/ChatAttachment.d.ts +1 -1
  222. package/dist/types/components/editor/ChatPanel/ChatInput.d.ts +1 -1
  223. package/dist/types/components/feedback/Alert/Alert.d.ts +1 -0
  224. package/dist/types/components/feedback/Alert/Alert.types.d.ts +7 -0
  225. package/dist/types/components/feedback/CommandPalette/CommandPalette.d.ts +29 -0
  226. package/dist/types/components/feedback/CommandPalette/CommandPalette.types.d.ts +61 -0
  227. package/dist/types/components/feedback/CommandPalette/fuzzySearch.d.ts +6 -0
  228. package/dist/types/components/feedback/Drawer/Drawer.d.ts +12 -0
  229. package/dist/types/components/feedback/Drawer/Drawer.types.d.ts +70 -0
  230. package/dist/types/components/feedback/EmptyState/EmptyState.d.ts +1 -1
  231. package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +44 -1
  232. package/dist/types/components/feedback/Skeleton/SkeletonLayout.d.ts +314 -0
  233. package/dist/types/components/feedback/Stat/Stat.d.ts +23 -0
  234. package/dist/types/components/feedback/Stat/Stat.types.d.ts +38 -0
  235. package/dist/types/components/layout/Accordion/Accordion.types.d.ts +7 -0
  236. package/dist/types/components/layout/Card/Card.d.ts +12 -0
  237. package/dist/types/components/layout/Card/Card.types.d.ts +54 -0
  238. package/dist/types/components/layout/PageHeader/PageHeader.d.ts +1 -1
  239. package/dist/types/components/navigation/Pagination/Pagination.d.ts +22 -0
  240. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +49 -0
  241. package/dist/types/components/primitives/HoverCard/HoverCard.d.ts +10 -0
  242. package/dist/types/components/primitives/HoverCard/HoverCard.types.d.ts +64 -0
  243. package/dist/types/components/primitives/Icon/Icon.d.ts +14 -1
  244. package/dist/types/components/primitives/Radio/Radio.d.ts +1 -1
  245. package/dist/types/hooks/useBreakpoint/useBreakpoint.d.ts +19 -0
  246. package/dist/types/hooks/useBreakpoint/useBreakpoint.types.d.ts +20 -0
  247. package/dist/types/hooks/useDebounced/useDebounced.types.d.ts +15 -0
  248. package/dist/types/hooks/useDebounced/useDebouncedCallback.d.ts +22 -0
  249. package/dist/types/hooks/useDebounced/useDebouncedValue.d.ts +16 -0
  250. package/dist/types/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +22 -0
  251. package/dist/types/hooks/useIntersectionObserver/useIntersectionObserver.types.d.ts +22 -0
  252. package/dist/types/hooks/useListboxNav/useListboxNav.d.ts +75 -0
  253. package/dist/types/hooks/useMediaQuery/useMediaQuery.d.ts +19 -0
  254. package/dist/types/hooks/useMediaQuery/useMediaQuery.types.d.ts +6 -0
  255. package/dist/types/hooks/useThrottledCallback/useThrottledCallback.d.ts +23 -0
  256. package/dist/types/hooks/useThrottledCallback/useThrottledCallback.types.d.ts +13 -0
  257. package/dist/types/index.d.ts +61 -1
  258. package/dist/types/theme/breakpoints.d.ts +22 -0
  259. package/dist/types/theme/index.d.ts +1 -0
  260. package/package.json +3 -1
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Minus icon component for remove/decrement actions.
8
+ *
9
+ * A single horizontal stroke commonly used to remove items, decrement
10
+ * counters, and zoom out. Pairs with `AddIcon` for [+/-] controls.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Basic usage
15
+ * <MinusIcon />
16
+ *
17
+ * // With custom size and color
18
+ * <MinusIcon size="sm" color="muted" />
19
+ *
20
+ * // In a counter control
21
+ * <IconButton icon={<MinusIcon />} label="Decrease" />
22
+ * ```
23
+ */
24
+ const MinusIcon = /*#__PURE__*/ React.memo(props => {
25
+ return (jsx(Icon, { ...props, children: jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }) }));
26
+ });
27
+ MinusIcon.displayName = 'MinusIcon';
28
+
29
+ export { MinusIcon };
30
+ //# sourceMappingURL=MinusIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MinusIcon.js","sources":["../../../../../src/components/Icons/MinusIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;AAiBG;AACI;;AAOL;AAGF;;"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Pause icon component for pausing playback and processes.
8
+ *
9
+ * Two parallel vertical bars commonly used to pause animations, video,
10
+ * preview playback, and long-running operations. Pairs with `PlayIcon`.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Basic usage
15
+ * <PauseIcon />
16
+ *
17
+ * // With custom size and color
18
+ * <PauseIcon size="lg" color="primary" />
19
+ *
20
+ * // In a transport bar
21
+ * <IconButton icon={<PauseIcon />} label="Pause" />
22
+ * ```
23
+ */
24
+ const PauseIcon = /*#__PURE__*/ React.memo(props => {
25
+ return (jsxs(Icon, { ...props, children: [jsx("rect", { x: "6", y: "4", width: "4", height: "16", rx: "1" }), jsx("rect", { x: "14", y: "4", width: "4", height: "16", rx: "1" })] }));
26
+ });
27
+ PauseIcon.displayName = 'PauseIcon';
28
+
29
+ export { PauseIcon };
30
+ //# sourceMappingURL=PauseIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PauseIcon.js","sources":["../../../../../src/components/Icons/PauseIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;AAiBG;AACI;;AAQL;AAGF;;"}
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Pin icon component for pinning items to keep them visible.
8
+ *
9
+ * A push-pin silhouette commonly used to pin tabs, conversations,
10
+ * or list items so they stay in view. A filled visual variant could
11
+ * indicate the pinned state.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * // Basic usage
16
+ * <PinIcon />
17
+ *
18
+ * // With custom size and color
19
+ * <PinIcon size="sm" color="accent" />
20
+ *
21
+ * // In a pin/unpin toggle
22
+ * <IconButton icon={<PinIcon />} label="Pin item" />
23
+ * ```
24
+ */
25
+ const PinIcon = /*#__PURE__*/ React.memo(props => {
26
+ return (jsxs(Icon, { ...props, children: [jsx("line", { x1: "12", y1: "17", x2: "12", y2: "22" }), jsx("path", { d: "M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24z" })] }));
27
+ });
28
+ PinIcon.displayName = 'PinIcon';
29
+
30
+ export { PinIcon };
31
+ //# sourceMappingURL=PinIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PinIcon.js","sources":["../../../../../src/components/Icons/PinIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;;AAkBG;AACI;AAEH;AAMF;AAGF;;"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Send icon component for submitting messages and forms.
8
+ *
9
+ * A paper plane silhouette commonly used as the trigger for
10
+ * sending chat messages, dispatching commands, and form submissions.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Basic usage
15
+ * <SendIcon />
16
+ *
17
+ * // With custom size and color
18
+ * <SendIcon size="md" color="accent" />
19
+ *
20
+ * // In a chat input
21
+ * <IconButton icon={<SendIcon />} label="Send message" />
22
+ * ```
23
+ */
24
+ const SendIcon = /*#__PURE__*/ React.memo(props => {
25
+ return (jsxs(Icon, { ...props, children: [jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }), jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })] }));
26
+ });
27
+ SendIcon.displayName = 'SendIcon';
28
+
29
+ export { SendIcon };
30
+ //# sourceMappingURL=SendIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SendIcon.js","sources":["../../../../../src/components/Icons/SendIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;AAiBG;AACI;AAEH;AAMF;AAGF;;"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Stop icon component for halting playback and streams.
8
+ *
9
+ * A solid square commonly used to stop transport playback, abort
10
+ * generations, and cancel long-running streaming operations.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Basic usage
15
+ * <StopIcon />
16
+ *
17
+ * // With custom size and color
18
+ * <StopIcon size="md" color="error" />
19
+ *
20
+ * // In a stop streaming button
21
+ * <IconButton icon={<StopIcon />} label="Stop" />
22
+ * ```
23
+ */
24
+ const StopIcon = /*#__PURE__*/ React.memo(props => {
25
+ return (jsx(Icon, { ...props, children: jsx("rect", { x: "5", y: "5", width: "14", height: "14", rx: "1" }) }));
26
+ });
27
+ StopIcon.displayName = 'StopIcon';
28
+
29
+ export { StopIcon };
30
+ //# sourceMappingURL=StopIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopIcon.js","sources":["../../../../../src/components/Icons/StopIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;AAiBG;AACI;AAEH;AAKF;AAGF;;"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Terminal icon component for shells, command palettes, and CLI panels.
8
+ *
9
+ * A prompt caret with an underscore line, commonly used for terminal
10
+ * panels, command palette triggers, and shell-related actions.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Basic usage
15
+ * <TerminalIcon />
16
+ *
17
+ * // With custom size and color
18
+ * <TerminalIcon size="md" color="secondary" />
19
+ *
20
+ * // In a command palette trigger
21
+ * <IconButton icon={<TerminalIcon />} label="Open terminal" />
22
+ * ```
23
+ */
24
+ const TerminalIcon = /*#__PURE__*/ React.memo(props => {
25
+ return (jsxs(Icon, { ...props, children: [jsx("polyline", { points: "4 17 10 11 4 5" }), jsx("line", { x1: "12", y1: "19", x2: "20", y2: "19" })] }));
26
+ });
27
+ TerminalIcon.displayName = 'TerminalIcon';
28
+
29
+ export { TerminalIcon };
30
+ //# sourceMappingURL=TerminalIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalIcon.js","sources":["../../../../../src/components/Icons/TerminalIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;AAiBG;AACI;AAGL;AAMF;AAEA;;"}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Unlink icon — a broken chain.
8
+ *
9
+ * Indicates that two values are decoupled (no longer linked). Pair with
10
+ * `LinkIcon` to render a toggle: link → unlink. Common in coordinate
11
+ * inputs, transform locks, color-channel groups.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <IconButton aria-label="Unlink axes">
16
+ * <UnlinkIcon />
17
+ * </IconButton>
18
+ * ```
19
+ */
20
+ const UnlinkIcon = /*#__PURE__*/ React.memo(props => {
21
+ return (jsxs(Icon, { ...props, children: [jsx("path", { d: "M9 17H7A5 5 0 0 1 7 7h2" }), jsx("path", { d: "M15 7h2a5 5 0 0 1 0 10h-2" }), jsx("line", { x1: "3", y1: "3", x2: "21", y2: "21" })] }));
22
+ });
23
+ UnlinkIcon.displayName = 'UnlinkIcon';
24
+
25
+ export { UnlinkIcon };
26
+ //# sourceMappingURL=UnlinkIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnlinkIcon.js","sources":["../../../../../src/components/Icons/UnlinkIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;AAaG;AACI;AAEH;AAOF;AAGF;;"}
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import React from 'react';
4
+ import { Icon } from '../primitives/Icon/Icon.js';
5
+
6
+ /**
7
+ * Users icon component for groups, teams, and multi-user contexts.
8
+ *
9
+ * Two overlapping user silhouettes commonly used for team membership,
10
+ * shared resources, and group-level actions. Pairs with `UserIcon` for
11
+ * single-user contexts.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * // Basic usage
16
+ * <UsersIcon />
17
+ *
18
+ * // With custom size and color
19
+ * <UsersIcon size="md" color="secondary" />
20
+ *
21
+ * // In a team selector
22
+ * <Button icon={<UsersIcon />}>Team</Button>
23
+ * ```
24
+ */
25
+ const UsersIcon = /*#__PURE__*/ React.memo(props => {
26
+ return (jsxs(Icon, { ...props, children: [jsx("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }), jsx("circle", { cx: "9", cy: "7", r: "4" }), jsx("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87" }), jsx("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })] }));
27
+ });
28
+ UsersIcon.displayName = 'UsersIcon';
29
+
30
+ export { UsersIcon };
31
+ //# sourceMappingURL=UsersIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersIcon.js","sources":["../../../../../src/components/Icons/UsersIcon.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;;AAkBG;AACI;AAEH;AAQF;AAGF;;"}
@@ -0,0 +1,20 @@
1
+ import './../../../assets/src/components/controls/Combobox/Combobox.css.ts.vanilla-B7B5ttkq.css';
2
+ import { createRuntimeFn } from '@vanilla-extract/recipes/createRuntimeFn';
3
+
4
+ var checkmarkStyle = 'Combobox_checkmarkStyle__1pazsaxx';
5
+ var chevronButtonStyle = 'Combobox_chevronButtonStyle__1pazsaxg';
6
+ var chevronIconRecipe = createRuntimeFn({defaultClassName:'Combobox_chevronIconRecipe__1pazsaxh',variantClassNames:{open:{true:'Combobox_chevronIconRecipe_open_true__1pazsaxi',false:'Combobox_chevronIconRecipe_open_false__1pazsaxj'}},defaultVariants:{open:false},compoundVariants:[]});
7
+ var clearButtonStyle = 'Combobox_clearButtonStyle__1pazsaxf';
8
+ var containerStyle = 'Combobox_containerStyle__1pazsax0';
9
+ var createRowStyle = 'Combobox_createRowStyle__1pazsaxy';
10
+ var dropdownStyle = 'Combobox_dropdownStyle__1pazsaxl';
11
+ var emptyMessageStyle = 'Combobox_emptyMessageStyle__1pazsaxw';
12
+ var inputStyle = 'Combobox_inputStyle__1pazsaxe';
13
+ var inputWrapperRecipe = createRuntimeFn({defaultClassName:'Combobox_inputWrapperRecipe__1pazsax1',variantClassNames:{size:{sm:'Combobox_inputWrapperRecipe_size_sm__1pazsax2',md:'Combobox_inputWrapperRecipe_size_md__1pazsax3',lg:'Combobox_inputWrapperRecipe_size_lg__1pazsax4'},variant:{'default':'Combobox_inputWrapperRecipe_variant_default__1pazsax5',ghost:'Combobox_inputWrapperRecipe_variant_ghost__1pazsax6',filled:'Combobox_inputWrapperRecipe_variant_filled__1pazsax7'},focused:{true:'Combobox_inputWrapperRecipe_focused_true__1pazsax8',false:'Combobox_inputWrapperRecipe_focused_false__1pazsax9'},error:{true:'Combobox_inputWrapperRecipe_error_true__1pazsaxa',false:'Combobox_inputWrapperRecipe_error_false__1pazsaxb'},disabled:{true:'Combobox_inputWrapperRecipe_disabled_true__1pazsaxc',false:'Combobox_inputWrapperRecipe_disabled_false__1pazsaxd'}},defaultVariants:{size:'md',variant:'default',focused:false,error:false,disabled:false},compoundVariants:[]});
14
+ var optionDescriptionStyle = 'Combobox_optionDescriptionStyle__1pazsaxv';
15
+ var optionItemRecipe = createRuntimeFn({defaultClassName:'Combobox_optionItemRecipe__1pazsaxn',variantClassNames:{active:{true:'Combobox_optionItemRecipe_active_true__1pazsaxo',false:'Combobox_optionItemRecipe_active_false__1pazsaxp'},selected:{true:'Combobox_optionItemRecipe_selected_true__1pazsaxq',false:'Combobox_optionItemRecipe_selected_false__1pazsaxr'},disabled:{true:'Combobox_optionItemRecipe_disabled_true__1pazsaxs',false:'Combobox_optionItemRecipe_disabled_false__1pazsaxt'}},defaultVariants:{active:false,selected:false,disabled:false},compoundVariants:[]});
16
+ var optionLabelStyle = 'Combobox_optionLabelStyle__1pazsaxu';
17
+ var optionsListStyle = 'Combobox_optionsListStyle__1pazsaxm';
18
+
19
+ export { checkmarkStyle, chevronButtonStyle, chevronIconRecipe, clearButtonStyle, containerStyle, createRowStyle, dropdownStyle, emptyMessageStyle, inputStyle, inputWrapperRecipe, optionDescriptionStyle, optionItemRecipe, optionLabelStyle, optionsListStyle };
20
+ //# sourceMappingURL=Combobox.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combobox.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,354 @@
1
+ "use client";
2
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
+ import { useId, useRef, useCallback, useState, useEffect, useMemo } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { CheckIcon } from '../../Icons/CheckIcon.js';
6
+ import { ChevronDownIcon } from '../../Icons/ChevronDownIcon.js';
7
+ import { CloseIcon } from '../../Icons/CloseIcon.js';
8
+ import { fuzzyScore } from '../../feedback/CommandPalette/fuzzySearch.js';
9
+ import { FormHelperText } from '../../form/FormHelperText.js';
10
+ import { FormLabel } from '../../form/FormLabel.js';
11
+ import { ScrollArea } from '../../layout/ScrollArea/ScrollArea.js';
12
+ import { Spinner } from '../../feedback/Spinner/Spinner.js';
13
+ import { useControlledState } from '../../../hooks/useControlledState/useControlledState.js';
14
+ import { useListboxNav } from '../../../hooks/useListboxNav/useListboxNav.js';
15
+ import { useMergedRef } from '../../../hooks/useMergedRef/useMergedRef.js';
16
+ import { cx } from '../../../utils/cx.js';
17
+ import { inputStyle, clearButtonStyle, chevronButtonStyle, chevronIconRecipe, inputWrapperRecipe, dropdownStyle, optionsListStyle, containerStyle, emptyMessageStyle, optionLabelStyle, optionDescriptionStyle, checkmarkStyle, createRowStyle, optionItemRecipe } from './Combobox.css.js';
18
+
19
+ const CHEVRON_SIZES = {
20
+ sm: 10,
21
+ md: 12,
22
+ lg: 14,
23
+ };
24
+ const CREATE_ROW_VALUE = '__combobox_create__';
25
+ function defaultFilter(option, query) {
26
+ const haystack = `${option.label ?? option.value} ${option.description ?? ''}`;
27
+ return fuzzyScore(query, haystack);
28
+ }
29
+ function applyFilter(options, query, custom) {
30
+ if (!query)
31
+ return options;
32
+ const scored = [];
33
+ for (const option of options) {
34
+ let score;
35
+ if (custom) {
36
+ const result = custom(option, query);
37
+ if (typeof result === 'boolean') {
38
+ score = result ? 1 : 0;
39
+ }
40
+ else {
41
+ score = result;
42
+ }
43
+ }
44
+ else {
45
+ score = defaultFilter(option, query);
46
+ }
47
+ if (score > 0)
48
+ scored.push({ option, score });
49
+ }
50
+ scored.sort((a, b) => b.score - a.score);
51
+ return scored.map(entry => entry.option);
52
+ }
53
+ /**
54
+ * Single-value select with an editable input. Filters the option list as the
55
+ * user types (built-in fuzzy matcher, configurable via `filterFn`), supports
56
+ * controlled and uncontrolled modes, optional `freeSolo` typing, optional
57
+ * `creatable` mode for adding new entries, and an `loading` state for async
58
+ * data sources.
59
+ *
60
+ * @example
61
+ * ```tsx
62
+ * <Combobox
63
+ * label="Framework"
64
+ * options={[
65
+ * { value: 'react', label: 'React' },
66
+ * { value: 'vue', label: 'Vue' },
67
+ * ]}
68
+ * value={framework}
69
+ * onChange={setFramework}
70
+ * />
71
+ * ```
72
+ */
73
+ function Combobox({ value, defaultValue, options, placeholder, filterFn, emptyMessage = 'No results found', loading = false, loadingMessage = 'Loading...', freeSolo = false, creatable = false, createLabel, openOnFocus = false, size = 'md', variant = 'default', label, helperText, error = false, errorMessage, disabled = false, required = false, readOnly = false, clearable = false, maxDropdownHeight = 240, minDropdownWidth, name, onChange, onInputChange, onCreate, onOpenChange, className, style, testId, ref, id: idProp, ...rest }) {
74
+ const autoId = useId();
75
+ const fieldId = idProp ?? autoId;
76
+ const labelId = `${fieldId}-label`;
77
+ const helperId = `${fieldId}-helper`;
78
+ const listboxId = `${fieldId}-listbox`;
79
+ const inputRef = useRef(null);
80
+ const wrapperRef = useRef(null);
81
+ const dropdownRef = useRef(null);
82
+ const setInputRef = useMergedRef(inputRef, ref);
83
+ const [selected, setSelected] = useControlledState({
84
+ value,
85
+ defaultValue,
86
+ onChange,
87
+ fallback: null,
88
+ });
89
+ const labelOf = useCallback((val) => {
90
+ if (val === null)
91
+ return '';
92
+ const found = options.find(o => o.value === val);
93
+ return found?.label ?? String(val);
94
+ }, [options]);
95
+ const [query, setQuery] = useState(() => labelOf(selected));
96
+ const [isOpen, setIsOpen] = useState(false);
97
+ const [focused, setFocused] = useState(false);
98
+ const [dropdownPos, setDropdownPos] = useState({});
99
+ const isEditingRef = useRef(false);
100
+ // Sync the query with the selected label when it changes externally and the
101
+ // user is not actively typing.
102
+ useEffect(() => {
103
+ if (!isEditingRef.current) {
104
+ setQuery(labelOf(selected));
105
+ }
106
+ }, [labelOf, selected]);
107
+ const effectiveCreatable = creatable;
108
+ const effectiveFreeSolo = freeSolo || creatable;
109
+ const filteredOptions = useMemo(() => applyFilter(options,
110
+ // When the user hasn't typed yet (query equals the selected label) we
111
+ // show the full list so the dropdown serves as a browseable menu.
112
+ isEditingRef.current ? query : '', filterFn), [filterFn, options, query]);
113
+ const hasExactMatch = useMemo(() => {
114
+ if (!query)
115
+ return false;
116
+ const q = query.toLowerCase();
117
+ return options.some(o => (o.label ?? o.value).toLowerCase() === q);
118
+ }, [options, query]);
119
+ const showCreateRow = effectiveCreatable && query.length > 0 && !hasExactMatch && !loading;
120
+ // The list passed to useListboxNav. The "create" row is appended at the
121
+ // end as a synthetic option so the same navigation works.
122
+ const navItems = useMemo(() => {
123
+ const list = [...filteredOptions];
124
+ if (showCreateRow) {
125
+ list.push({
126
+ value: CREATE_ROW_VALUE,
127
+ label: query,
128
+ });
129
+ }
130
+ return list;
131
+ }, [filteredOptions, query, showCreateRow]);
132
+ const open = useCallback(() => {
133
+ if (disabled || readOnly)
134
+ return;
135
+ if (isOpen)
136
+ return;
137
+ setIsOpen(true);
138
+ onOpenChange?.(true);
139
+ }, [disabled, readOnly, isOpen, onOpenChange]);
140
+ const close = useCallback(() => {
141
+ if (!isOpen)
142
+ return;
143
+ setIsOpen(false);
144
+ onOpenChange?.(false);
145
+ }, [isOpen, onOpenChange]);
146
+ const commitOption = useCallback((opt) => {
147
+ if (opt.disabled)
148
+ return;
149
+ if (opt.value === CREATE_ROW_VALUE) {
150
+ const created = query;
151
+ if (onCreate)
152
+ onCreate(created);
153
+ else
154
+ setSelected(created);
155
+ }
156
+ else {
157
+ setSelected(opt.value);
158
+ }
159
+ isEditingRef.current = false;
160
+ setQuery(opt.value === CREATE_ROW_VALUE
161
+ ? query
162
+ : (opt.label ?? String(opt.value)));
163
+ close();
164
+ }, [close, onCreate, query, setSelected]);
165
+ const listbox = useListboxNav({
166
+ items: navItems,
167
+ isItemDisabled: opt => Boolean(opt.disabled),
168
+ onSelect: commitOption,
169
+ onEscape: close,
170
+ });
171
+ const updateDropdownPosition = useCallback(() => {
172
+ const wrapper = wrapperRef.current;
173
+ if (!wrapper)
174
+ return;
175
+ const rect = wrapper.getBoundingClientRect();
176
+ const spaceBelow = window.innerHeight - rect.bottom;
177
+ const openAbove = spaceBelow < maxDropdownHeight + 8 && rect.top > spaceBelow;
178
+ const dropdownW = minDropdownWidth !== undefined
179
+ ? Math.max(rect.width, minDropdownWidth)
180
+ : rect.width;
181
+ setDropdownPos({
182
+ left: rect.left,
183
+ width: dropdownW,
184
+ ...(openAbove
185
+ ? {
186
+ bottom: window.innerHeight - rect.top + 4,
187
+ transformOrigin: 'bottom',
188
+ }
189
+ : { top: rect.bottom + 4, transformOrigin: 'top' }),
190
+ });
191
+ }, [maxDropdownHeight, minDropdownWidth]);
192
+ useEffect(() => {
193
+ if (!isOpen)
194
+ return;
195
+ updateDropdownPosition();
196
+ }, [isOpen, updateDropdownPosition]);
197
+ // Outside click
198
+ useEffect(() => {
199
+ if (!isOpen)
200
+ return;
201
+ const handleClick = (e) => {
202
+ const target = e.target;
203
+ if (!wrapperRef.current?.contains(target) &&
204
+ !dropdownRef.current?.contains(target)) {
205
+ close();
206
+ }
207
+ };
208
+ document.addEventListener('mousedown', handleClick);
209
+ return () => {
210
+ document.removeEventListener('mousedown', handleClick);
211
+ };
212
+ }, [close, isOpen]);
213
+ const handleInputChange = useCallback((event) => {
214
+ const next = event.target.value;
215
+ isEditingRef.current = true;
216
+ setQuery(next);
217
+ onInputChange?.(next);
218
+ if (!isOpen)
219
+ open();
220
+ // Clearing the input clears the selection.
221
+ if (next === '' && selected !== null) {
222
+ setSelected(null);
223
+ }
224
+ }, [isOpen, onInputChange, open, selected, setSelected]);
225
+ const handleInputKeyDown = useCallback((event) => {
226
+ if (disabled || readOnly)
227
+ return;
228
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
229
+ if (!isOpen) {
230
+ event.preventDefault();
231
+ open();
232
+ return;
233
+ }
234
+ }
235
+ if (event.key === 'Enter') {
236
+ // freeSolo / creatable take precedence when no suggestion is active.
237
+ if (effectiveFreeSolo && listbox.activeIndex < 0 && query.length > 0) {
238
+ event.preventDefault();
239
+ if (effectiveCreatable && !hasExactMatch) {
240
+ if (onCreate)
241
+ onCreate(query);
242
+ else
243
+ setSelected(query);
244
+ }
245
+ else {
246
+ setSelected(query);
247
+ }
248
+ isEditingRef.current = false;
249
+ close();
250
+ return;
251
+ }
252
+ }
253
+ if (event.key === 'Tab' && isOpen) {
254
+ // Commit the active suggestion if any, otherwise close.
255
+ if (listbox.activeIndex >= 0) {
256
+ listbox.selectActive();
257
+ }
258
+ else {
259
+ close();
260
+ }
261
+ return;
262
+ }
263
+ listbox.handleKeyDown(event);
264
+ }, [
265
+ close,
266
+ disabled,
267
+ effectiveCreatable,
268
+ effectiveFreeSolo,
269
+ hasExactMatch,
270
+ isOpen,
271
+ listbox,
272
+ onCreate,
273
+ open,
274
+ query,
275
+ readOnly,
276
+ setSelected,
277
+ ]);
278
+ const handleFocus = useCallback(() => {
279
+ setFocused(true);
280
+ if (openOnFocus)
281
+ open();
282
+ }, [open, openOnFocus]);
283
+ const handleBlur = useCallback(() => {
284
+ setFocused(false);
285
+ isEditingRef.current = false;
286
+ // Restore the last selected label unless freeSolo allowed the typed value.
287
+ if (!effectiveFreeSolo) {
288
+ setQuery(labelOf(selected));
289
+ }
290
+ }, [effectiveFreeSolo, labelOf, selected]);
291
+ const handleClear = useCallback((event) => {
292
+ event.preventDefault();
293
+ event.stopPropagation();
294
+ setSelected(null);
295
+ setQuery('');
296
+ isEditingRef.current = false;
297
+ inputRef.current?.focus();
298
+ }, [setSelected]);
299
+ const handleToggleClick = useCallback(() => {
300
+ if (disabled || readOnly)
301
+ return;
302
+ if (isOpen)
303
+ close();
304
+ else
305
+ open();
306
+ inputRef.current?.focus();
307
+ }, [close, disabled, isOpen, open, readOnly]);
308
+ const showHelperText = error && errorMessage ? errorMessage : helperText;
309
+ const chevronSize = CHEVRON_SIZES[size];
310
+ const renderOptions = () => {
311
+ if (loading) {
312
+ return (jsxs("div", { className: emptyMessageStyle, children: [jsx(Spinner, { size: "xs" }), " ", loadingMessage] }));
313
+ }
314
+ if (navItems.length === 0) {
315
+ return jsx("div", { className: emptyMessageStyle, children: emptyMessage });
316
+ }
317
+ return navItems.map((opt, idx) => {
318
+ const isCreate = opt.value === CREATE_ROW_VALUE;
319
+ const isSelected = !isCreate && opt.value === selected;
320
+ const isActive = idx === listbox.activeIndex;
321
+ const isDisabled = opt.disabled ?? false;
322
+ return (jsxs("div", { role: "option", "aria-selected": isSelected, "aria-disabled": isDisabled || undefined, id: `${listboxId}-${String(idx)}`, className: cx(optionItemRecipe({
323
+ active: isActive,
324
+ selected: isSelected,
325
+ disabled: isDisabled,
326
+ }), isCreate && createRowStyle), onClick: () => {
327
+ commitOption(opt);
328
+ }, onMouseEnter: () => {
329
+ if (!isDisabled)
330
+ listbox.setActiveIndex(idx);
331
+ }, children: [opt.icon && jsx("span", { children: opt.icon }), jsx("span", { className: optionLabelStyle, children: isCreate
332
+ ? (createLabel?.(query) ?? jsxs(Fragment, { children: ["Create \"", query, "\""] }))
333
+ : (opt.label ?? opt.value) }), opt.description && !isCreate && (jsx("span", { className: optionDescriptionStyle, children: opt.description })), isSelected && (jsx("span", { className: checkmarkStyle, children: jsx(CheckIcon, { size: 10, decorative: true }) }))] }, isCreate ? `create-${query}` : `${opt.value}-${String(idx)}`));
334
+ });
335
+ };
336
+ const formValue = selected ?? '';
337
+ const displayValue = focused || isOpen ? query : labelOf(selected);
338
+ return (jsxs("div", { className: cx(containerStyle, className), style: style, children: [label && (jsx(FormLabel, { id: labelId, htmlFor: fieldId, required: required, disabled: disabled, children: label })), jsxs("div", { ref: wrapperRef, className: inputWrapperRecipe({
339
+ size,
340
+ variant,
341
+ focused,
342
+ error,
343
+ disabled,
344
+ }), children: [jsx("input", { ref: setInputRef, id: fieldId, type: "text", role: "combobox", "aria-expanded": isOpen, "aria-controls": isOpen ? listboxId : undefined, "aria-autocomplete": "list", "aria-activedescendant": isOpen && listbox.activeIndex >= 0
345
+ ? `${listboxId}-${String(listbox.activeIndex)}`
346
+ : undefined, "aria-labelledby": label ? labelId : undefined, "aria-required": required || undefined, "aria-invalid": error || undefined, "aria-describedby": showHelperText ? helperId : undefined, autoComplete: "off", spellCheck: false, disabled: disabled, readOnly: readOnly, required: required, placeholder: placeholder, value: displayValue, className: inputStyle, onChange: handleInputChange, onKeyDown: handleInputKeyDown, onFocus: handleFocus, onBlur: handleBlur, "data-testid": testId, ...rest }), clearable && selected !== null && !disabled && !readOnly && (jsx("button", { type: "button", tabIndex: -1, "aria-label": "Clear selection", className: clearButtonStyle, onMouseDown: handleClear, children: jsx(CloseIcon, { size: "sm", decorative: true }) })), jsx("button", { type: "button", tabIndex: -1, "aria-label": isOpen ? 'Close suggestions' : 'Open suggestions', className: chevronButtonStyle, onMouseDown: e => {
347
+ e.preventDefault();
348
+ }, onClick: handleToggleClick, disabled: disabled, children: jsx("span", { className: chevronIconRecipe({ open: isOpen }), children: jsx(ChevronDownIcon, { size: chevronSize, decorative: true }) }) })] }), name && jsx("input", { type: "hidden", name: name, value: formValue }), isOpen &&
349
+ createPortal(jsx("div", { ref: dropdownRef, role: "listbox", id: listboxId, "aria-labelledby": label ? labelId : undefined, className: dropdownStyle, style: dropdownPos, tabIndex: -1, children: jsx(ScrollArea, { className: optionsListStyle, maxHeight: maxDropdownHeight, scrollbarWidth: 4, scrollbarVisibility: "auto", hideDelay: 600, children: renderOptions() }) }), document.body), showHelperText && (jsx(FormHelperText, { id: helperId, error: error, children: showHelperText }))] }));
350
+ }
351
+ Combobox.displayName = 'Combobox';
352
+
353
+ export { Combobox };
354
+ //# sourceMappingURL=Combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combobox.js","sources":["../../../../../../src/components/controls/Combobox/Combobox.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA6CA;AACE;AACA;AACA;;AAGF;AAOA;AAIE;AACA;AACF;AAEA;AAKE;AAAY;;AAGZ;AACE;;;AAGE;;;;;;;;AAMA;;;;;AAIJ;AACA;AACF;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACG;AAqCJ;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAIA;;;;AAIE;AACD;AAED;;AAEsB;AAClB;;AAEF;AAIF;;;;AAIA;;;;AAKE;AACE;;AAEJ;;AAGA;;;;;AAcA;AACE;AAAY;AACZ;;AAEF;AAEA;;;AAKA;AACE;;;AAGI;AACA;AACD;;AAEH;;AAGF;;;AAEE;;;AAEA;;AAGF;AACE;;;AAEA;AACF;AAEA;;;AAGI;;AAEE;;;;;;AAGA;;AAEF;AACA;AAEI;AACA;AAEJ;;;AAMF;;AAEA;AACA;AACD;AAED;AACE;AACA;;AACA;;AAEA;AAGA;;AAGI;AAEJ;;AAEE;AACA;AACE;;AAEI;AACD;AACH;AACH;AACH;;AAGE;;AACA;AACF;;;AAIE;;AACA;AACE;;;AAKE;;AAEJ;AACA;AACA;AACE;AACF;AACF;AAEA;AAEI;AACA;;AAEA;AACA;AAAa;;;;;AAKf;AAIF;;;AAII;;;AAGI;;;;AAKJ;;AAEE;;AAEE;AACE;;;;;;;;AAKF;AACA;;;;;;AAOF;;;;AAGE;;;;AAKJ;AACF;;;;;;;;;;;;;AAcC;AAGH;;AAEE;AAAiB;AACnB;AAEA;;AAEE;;;AAGE;;;AAIJ;;;;;AAMI;AACA;AACF;AAIF;;;AAEE;AAAY;;AACP;AACL;AACF;AAEA;AACA;;;AAII;;AAMF;AACE;;;AAGA;;AAEA;AACA;AACA;AASQ;AACA;AACA;;;AAMJ;AAEE;AAAiB;AACnB;;AAMI;AAYV;AACF;AAEA;AACA;;;;;;;AAuBO;;AAaK;;;AAsDN;AA8BR;AAEA;;"}