@parallelworks/ui 0.18.0 → 0.19.1

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 (349) hide show
  1. package/README.md +86 -6
  2. package/dist/ai/adapter/memoryStore.d.ts +8 -0
  3. package/dist/ai/adapter/memoryStore.js +152 -0
  4. package/dist/ai/adapter/mock/index.d.ts +2 -0
  5. package/dist/ai/adapter/mock/index.js +3 -0
  6. package/dist/ai/adapter/mock/mockAdapter.d.ts +4 -0
  7. package/dist/ai/adapter/mock/mockAdapter.js +81 -0
  8. package/dist/ai/adapter/openai/createOpenAIStream.d.ts +9 -0
  9. package/dist/ai/adapter/openai/createOpenAIStream.js +33 -0
  10. package/dist/ai/adapter/openai/errors.d.ts +3 -0
  11. package/dist/ai/adapter/openai/errors.js +37 -0
  12. package/dist/ai/adapter/openai/index.d.ts +6 -0
  13. package/dist/ai/adapter/openai/index.js +6 -0
  14. package/dist/ai/adapter/openai/openaiAdapter.d.ts +9 -0
  15. package/dist/ai/adapter/openai/openaiAdapter.js +54 -0
  16. package/dist/ai/adapter/openai/responses.d.ts +4 -0
  17. package/dist/ai/adapter/openai/responses.js +108 -0
  18. package/dist/ai/adapter/openai/sse.d.ts +24 -0
  19. package/dist/ai/adapter/openai/sse.js +112 -0
  20. package/dist/ai/adapter/openai/wire.d.ts +40 -0
  21. package/dist/ai/adapter/types.d.ts +131 -0
  22. package/dist/ai/adapter/types.js +11 -0
  23. package/dist/ai/agent/classifier.d.ts +2 -0
  24. package/dist/ai/agent/classifier.js +12 -0
  25. package/dist/ai/agent/diff.d.ts +35 -0
  26. package/dist/ai/agent/diff.js +223 -0
  27. package/dist/ai/agent/diffHighlight.d.ts +6 -0
  28. package/dist/ai/agent/diffHighlight.js +101 -0
  29. package/dist/ai/agent/index.d.ts +6 -0
  30. package/dist/ai/agent/permissions.d.ts +11 -0
  31. package/dist/ai/agent/permissions.js +29 -0
  32. package/dist/ai/agent/toolfmt.d.ts +18 -0
  33. package/dist/ai/agent/toolfmt.js +383 -0
  34. package/dist/ai/agent/transcript.d.ts +38 -0
  35. package/dist/ai/agent/transcript.js +127 -0
  36. package/dist/ai/ai.css +325 -0
  37. package/dist/ai/components/AllocationSelector.d.ts +4 -0
  38. package/dist/ai/components/AllocationSelector.js +56 -0
  39. package/dist/ai/components/AttachmentManager.d.ts +1 -0
  40. package/dist/ai/components/AttachmentManager.js +144 -0
  41. package/dist/ai/components/AttachmentUpload.d.ts +24 -0
  42. package/dist/ai/components/AttachmentUpload.js +179 -0
  43. package/dist/ai/components/BlockedGroupBanner.d.ts +1 -0
  44. package/dist/ai/components/BlockedGroupBanner.js +29 -0
  45. package/dist/ai/components/BranchNavigator.d.ts +8 -0
  46. package/dist/ai/components/BranchNavigator.js +57 -0
  47. package/dist/ai/components/ChatEmptyState.d.ts +3 -0
  48. package/dist/ai/components/ChatEmptyState.js +171 -0
  49. package/dist/ai/components/ChatInput.d.ts +45 -0
  50. package/dist/ai/components/ChatInput.js +265 -0
  51. package/dist/ai/components/ChatLayout.d.ts +5 -0
  52. package/dist/ai/components/ChatLayout.js +15 -0
  53. package/dist/ai/components/ChatMessage.d.ts +24 -0
  54. package/dist/ai/components/ChatMessage.js +338 -0
  55. package/dist/ai/components/ChatMessageList.d.ts +35 -0
  56. package/dist/ai/components/ChatMessageList.js +301 -0
  57. package/dist/ai/components/ChatSidebar.d.ts +5 -0
  58. package/dist/ai/components/ChatSidebar.js +345 -0
  59. package/dist/ai/components/ChatThread.d.ts +3 -0
  60. package/dist/ai/components/ChatThread.js +198 -0
  61. package/dist/ai/components/ComposerChrome.d.ts +18 -0
  62. package/dist/ai/components/ComposerChrome.js +50 -0
  63. package/dist/ai/components/ComposerFrame.d.ts +16 -0
  64. package/dist/ai/components/ComposerFrame.js +33 -0
  65. package/dist/ai/components/DragOverlay.d.ts +5 -0
  66. package/dist/ai/components/DragOverlay.js +20 -0
  67. package/dist/ai/components/ModelSelector.d.ts +6 -0
  68. package/dist/ai/components/ModelSelector.js +343 -0
  69. package/dist/ai/components/ShareDialog.d.ts +11 -0
  70. package/dist/ai/components/ShareDialog.js +260 -0
  71. package/dist/ai/components/SlashMenu.d.ts +28 -0
  72. package/dist/ai/components/SlashMenu.js +91 -0
  73. package/dist/ai/components/agent/ActivityLine.d.ts +21 -0
  74. package/dist/ai/components/agent/ActivityLine.js +151 -0
  75. package/dist/ai/components/agent/AgentMessageParts.d.ts +54 -0
  76. package/dist/ai/components/agent/AgentMessageParts.js +721 -0
  77. package/dist/ai/components/agent/PermissionPicker.d.ts +11 -0
  78. package/dist/ai/components/agent/PermissionPicker.js +38 -0
  79. package/dist/ai/components/attachmentKeys.d.ts +4 -0
  80. package/dist/ai/components/attachmentKeys.js +10 -0
  81. package/dist/ai/core/ChatProvider.d.ts +66 -0
  82. package/dist/ai/core/ChatProvider.js +848 -0
  83. package/dist/ai/core/KeyboardShortcutsProvider.d.ts +5 -0
  84. package/dist/ai/core/KeyboardShortcutsProvider.js +9 -0
  85. package/dist/ai/core/chatReducer.d.ts +114 -0
  86. package/dist/ai/core/chatReducer.js +223 -0
  87. package/dist/ai/core/config.d.ts +47 -0
  88. package/dist/ai/core/config.js +45 -0
  89. package/dist/ai/core/events.d.ts +1 -0
  90. package/dist/ai/core/events.js +4 -0
  91. package/dist/ai/core/exportConversation.d.ts +4 -0
  92. package/dist/ai/core/exportConversation.js +42 -0
  93. package/dist/ai/core/greeting.d.ts +3 -0
  94. package/dist/ai/core/greeting.js +38 -0
  95. package/dist/ai/core/parts.d.ts +11 -0
  96. package/dist/ai/core/parts.js +84 -0
  97. package/dist/ai/core/useDragDrop.d.ts +14 -0
  98. package/dist/ai/core/useDragDrop.js +36 -0
  99. package/dist/ai/core/useKeyboardShortcuts.d.ts +12 -0
  100. package/dist/ai/core/useKeyboardShortcuts.js +77 -0
  101. package/dist/ai/core/useSSEStream.d.ts +34 -0
  102. package/dist/ai/core/useSSEStream.js +98 -0
  103. package/dist/ai/index.d.ts +40 -0
  104. package/dist/ai/index.js +44 -0
  105. package/dist/ai/strings.d.ts +167 -0
  106. package/dist/ai/strings.js +175 -0
  107. package/dist/ai/types.d.ts +236 -0
  108. package/dist/ai/ui/Avatar.d.ts +8 -0
  109. package/dist/ai/ui/Avatar.js +35 -0
  110. package/dist/ai/ui/Dropdown.d.ts +31 -0
  111. package/dist/ai/ui/Dropdown.js +110 -0
  112. package/dist/ai/ui/Markdown.d.ts +8 -0
  113. package/dist/ai/ui/Markdown.js +79 -0
  114. package/dist/ai/ui/Notice.d.ts +21 -0
  115. package/dist/ai/ui/Notice.js +77 -0
  116. package/dist/ai/ui/buttons.d.ts +1 -0
  117. package/dist/ai/ui/codeBreaks.d.ts +16 -0
  118. package/dist/ai/ui/codeBreaks.js +36 -0
  119. package/dist/ai/ui/prose.d.ts +1 -0
  120. package/dist/ai/ui/prose.js +13 -0
  121. package/dist/ai/ui/sidebar.d.ts +81 -0
  122. package/dist/ai/ui/sidebar.js +148 -0
  123. package/dist/ai/utils.d.ts +4 -0
  124. package/dist/ai/utils.js +23 -0
  125. package/dist/assets/{editor.worker-CuBRIwi-.js → editor.worker-BmHUIVG4.js} +194 -163
  126. package/dist/assets/{json.worker-8ytS02vz.js → json.worker-D8bJ92nw.js} +384 -338
  127. package/dist/assets/{yaml.worker-DJC-VUcv.js → yaml.worker-C4gyGAko.js} +15657 -13823
  128. package/dist/components/AddMenu.js +46 -0
  129. package/dist/components/Avatar.d.ts +1 -1
  130. package/dist/components/Avatar.js +46 -0
  131. package/dist/{chunks/BareModal-BtRiQezg.js → components/BareModal.js} +1 -1
  132. package/dist/components/Breadcrumbs.d.ts +1 -1
  133. package/dist/components/Breadcrumbs.js +83 -0
  134. package/dist/components/Button.js +83 -0
  135. package/dist/components/Callout.js +23 -0
  136. package/dist/components/Card.js +31 -0
  137. package/dist/components/CollapsiblePanel.js +77 -0
  138. package/dist/components/ConfirmModal.js +74 -0
  139. package/dist/components/CopyToClipboard.js +81 -0
  140. package/dist/{chunks/CreateModal-BY6DLmur.js → components/CreateModal.js} +10 -189
  141. package/dist/components/DescriptionList.js +42 -0
  142. package/dist/components/Dropdown.d.ts +1 -1
  143. package/dist/components/Dropdown.js +349 -0
  144. package/dist/components/EmptyState.d.ts +1 -1
  145. package/dist/components/EmptyState.js +27 -0
  146. package/dist/components/Filter.js +32 -0
  147. package/dist/components/FilterPill.js +13 -0
  148. package/dist/components/IconButton.js +34 -0
  149. package/dist/components/Indicator.d.ts +2 -2
  150. package/dist/{chunks/Indicator-hBSIxOPK.js → components/Indicator.js} +1 -1
  151. package/dist/components/Input.d.ts +1 -1
  152. package/dist/components/Input.js +88 -0
  153. package/dist/components/LetterBadge.d.ts +1 -1
  154. package/dist/components/LetterBadge.js +13 -0
  155. package/dist/components/Listbox.js +123 -0
  156. package/dist/{chunks/Loader-BXoXTZGc.js → components/Loader.js} +1 -1
  157. package/dist/components/Markdown.js +15 -0
  158. package/dist/components/MarkdownImpl.d.ts +1 -1
  159. package/dist/components/MultiSelect.js +171 -0
  160. package/dist/components/Overview.js +39 -0
  161. package/dist/components/PageHeader.js +194 -0
  162. package/dist/components/Pagination.js +35 -0
  163. package/dist/components/Provider.d.ts +16 -65
  164. package/dist/{chunks/Provider-Ghua9PkN.js → components/Provider.js} +54 -20
  165. package/dist/{chunks/RequiredMark-DfLdYbYZ.js → components/RequiredMark.js} +1 -1
  166. package/dist/components/SectionHeader.js +11 -0
  167. package/dist/components/SettingModeOption.js +30 -0
  168. package/dist/components/SettingRow.d.ts +1 -1
  169. package/dist/components/SettingRow.js +35 -0
  170. package/dist/components/SettingsCard.js +31 -0
  171. package/dist/components/SettingsGroup.d.ts +1 -1
  172. package/dist/components/SettingsGroup.js +17 -0
  173. package/dist/components/Sort.js +42 -0
  174. package/dist/components/StatusBadge.js +63 -0
  175. package/dist/components/SwitchToggle.js +59 -0
  176. package/dist/{chunks/SwitchToggleSmall-FcsaYSTs.js → components/SwitchToggleSmall.js} +1 -1
  177. package/dist/{chunks/Table-4OHjdKdO.js → components/Table.js} +7 -5
  178. package/dist/components/Toggle.js +20 -0
  179. package/dist/{chunks/Tooltip-Crxo_eU_.js → components/Tooltip.js} +6 -4
  180. package/dist/{chunks/StatusBadge-C1Blx_cW.js → components/dropdownUtils.js} +2 -63
  181. package/dist/components/focus.d.ts +2 -0
  182. package/dist/components/focus.js +7 -0
  183. package/dist/components/ghostButton.js +7 -0
  184. package/dist/components/inputClasses.js +4 -0
  185. package/dist/components/keys.d.ts +12 -0
  186. package/dist/components/keys.js +27 -0
  187. package/dist/components/relativeTime.js +32 -0
  188. package/dist/{chunks/useCssIsDark-DHr05dG2.js → components/useCssIsDark.js} +1 -1
  189. package/dist/duration.d.ts +3 -0
  190. package/dist/duration.js +17 -0
  191. package/dist/editor/Editor.js +13 -0
  192. package/dist/editor/EditorField.js +53 -0
  193. package/dist/editor/FormCodePanel.js +173 -0
  194. package/dist/editor/Monaco.d.ts +1 -20
  195. package/dist/editor/Monaco.js +112 -0
  196. package/dist/editor/index.d.ts +2 -1
  197. package/dist/editor/index.js +7 -2
  198. package/dist/editor/themes.js +91 -0
  199. package/dist/editor/workers.js +29 -0
  200. package/dist/editor/yaml.d.ts +5 -0
  201. package/dist/editor/yaml.js +15 -0
  202. package/dist/engine.d.ts +98 -0
  203. package/dist/file-explorer/FileExplorer.d.ts +11 -2
  204. package/dist/file-explorer/FileExplorer.js +1402 -0
  205. package/dist/file-explorer/FileExplorerContext.d.ts +1 -1
  206. package/dist/file-explorer/FileExplorerContext.js +370 -0
  207. package/dist/file-explorer/FilePreview/CodePreviewEditor.d.ts +1 -1
  208. package/dist/{chunks/CodePreviewEditor-4lx3kE-w.js → file-explorer/FilePreview/CodePreviewEditor.js} +3 -2
  209. package/dist/file-explorer/FilePreview/Inline.js +45 -0
  210. package/dist/file-explorer/FilePreview/StreamedBadge.js +16 -0
  211. package/dist/file-explorer/FilePreview/Viewer.js +526 -0
  212. package/dist/file-explorer/FilePreview/index.js +266 -0
  213. package/dist/file-explorer/FilePreview/parse.js +63 -0
  214. package/dist/file-explorer/FilePreview/previewCache.js +98 -0
  215. package/dist/file-explorer/FilePreview/previewType.d.ts +1 -1
  216. package/dist/file-explorer/FilePreview/previewType.js +151 -0
  217. package/dist/file-explorer/FilePreview/readCappedBytes.js +196 -0
  218. package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +95 -0
  219. package/dist/file-explorer/FilePreview/useObjectText.js +109 -0
  220. package/dist/file-explorer/FilePreview/usePresignedUrl.js +73 -0
  221. package/dist/file-explorer/FileRow.d.ts +1 -1
  222. package/dist/file-explorer/FileRow.js +165 -0
  223. package/dist/file-explorer/FileRowsWindow.js +92 -0
  224. package/dist/file-explorer/FileTable.js +172 -0
  225. package/dist/file-explorer/FileTableHeaders.js +49 -0
  226. package/dist/file-explorer/LoadMoreRow.js +46 -0
  227. package/dist/file-explorer/TreeView.js +376 -0
  228. package/dist/file-explorer/helpers.d.ts +4 -4
  229. package/dist/file-explorer/helpers.js +537 -0
  230. package/dist/file-explorer/index.d.ts +3 -3
  231. package/dist/file-explorer/index.js +7 -5705
  232. package/dist/file-explorer/lib/batch.js +39 -0
  233. package/dist/file-explorer/lib/errors.js +9 -0
  234. package/dist/file-explorer/lib/paging.js +124 -0
  235. package/dist/file-explorer/lib/types.d.ts +6 -1
  236. package/dist/file-explorer/lib/utils.d.ts +1 -3
  237. package/dist/file-explorer/lib/utils.js +322 -0
  238. package/dist/file-explorer/toasts.js +400 -0
  239. package/dist/file-explorer/treeRows.js +73 -0
  240. package/dist/file-explorer/useNearEnd.d.ts +1 -1
  241. package/dist/file-explorer/useNearEnd.js +27 -0
  242. package/dist/form/FieldWrapper.d.ts +2 -2
  243. package/dist/form/FieldWrapper.js +54 -0
  244. package/dist/form/Fields/BooleanField.js +51 -0
  245. package/dist/form/Fields/CheckboxGroupField.js +72 -0
  246. package/dist/form/Fields/ColorField.js +33 -0
  247. package/dist/form/Fields/DropdownField.js +49 -0
  248. package/dist/form/Fields/DurationField.js +130 -0
  249. package/dist/form/Fields/LabelField.js +19 -0
  250. package/dist/form/Fields/MultiDropdownField.js +40 -0
  251. package/dist/form/Fields/NumberField.js +51 -0
  252. package/dist/form/Fields/ObjectField.js +54 -0
  253. package/dist/form/Fields/RadioField.js +49 -0
  254. package/dist/form/Fields/RangeField.js +58 -0
  255. package/dist/form/Fields/ResourceOptionIcon.d.ts +1 -1
  256. package/dist/form/Fields/ResourceOptionIcon.js +21 -0
  257. package/dist/form/Fields/StepField.js +6 -0
  258. package/dist/form/Fields/StringField.js +37 -0
  259. package/dist/form/Fields/TextAreaField.js +31 -0
  260. package/dist/form/Fields/durationValidity.js +11 -0
  261. package/dist/form/Form.d.ts +4 -21
  262. package/dist/form/Form.js +643 -0
  263. package/dist/form/SpecialTypes/DropdownWrapper.js +30 -0
  264. package/dist/form/SpecialTypes/FormikCustomDropdown.js +122 -0
  265. package/dist/form/SpecialTypes/FormikCustomInput.js +111 -0
  266. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +31 -0
  267. package/dist/form/SpecialTypes/FormikNumericInput.js +60 -0
  268. package/dist/form/Wizard/WizardContainer.js +138 -0
  269. package/dist/form/Wizard/WizardNavigation.js +92 -0
  270. package/dist/form/Wizard/WizardStepContent.js +35 -0
  271. package/dist/form/Wizard/WizardStepIndicator.js +108 -0
  272. package/dist/form/Wizard/useWizardState.js +118 -0
  273. package/dist/form/Wizard/utils.js +34 -0
  274. package/dist/form/fieldContext.js +26 -0
  275. package/dist/form/fieldRegistry.js +50 -0
  276. package/dist/form/index.d.ts +11 -12
  277. package/dist/form/index.js +18 -2445
  278. package/dist/form/lib.d.ts +6 -1
  279. package/dist/{chunks/FieldWrapper-Bef01EWO.js → form/lib.js} +5 -104
  280. package/dist/form/types/fieldComponentTypes.d.ts +3 -2
  281. package/dist/form/types/fieldTypes.d.ts +6 -20
  282. package/dist/form/useParsedOpts.d.ts +1 -1
  283. package/dist/form/useParsedOpts.js +62 -0
  284. package/dist/form/usePrevious.js +11 -0
  285. package/dist/form/utils/checkShowIfObject.js +14 -0
  286. package/dist/form/utils/{slurmDuration.d.ts → duration.d.ts} +2 -2
  287. package/dist/form/utils/duration.js +69 -0
  288. package/dist/form/utils/getParentValue.js +23 -0
  289. package/dist/form/utils/getPlaceholder.js +9 -0
  290. package/dist/form/utils/getValueUsingPath.js +23 -0
  291. package/dist/form/utils/secondaryField.js +22 -0
  292. package/dist/graph/AnnotationBanner.js +141 -0
  293. package/dist/graph/Collapse.js +41 -0
  294. package/dist/{workflow/index.js → graph/DependencyGraph.js} +76 -1163
  295. package/dist/graph/JobSummary.js +104 -0
  296. package/dist/{workflow → graph}/MatrixGroup.d.ts +2 -2
  297. package/dist/graph/MatrixGroup.js +107 -0
  298. package/dist/graph/Reveal.js +57 -0
  299. package/dist/graph/TreeView.js +711 -0
  300. package/dist/{workflow → graph}/index.d.ts +1 -1
  301. package/dist/graph/index.js +2 -0
  302. package/dist/{workflow → graph}/types.d.ts +3 -3
  303. package/dist/graph/types.js +6 -0
  304. package/dist/icons.d.ts +20 -21
  305. package/dist/index.d.ts +38 -40
  306. package/dist/index.js +47 -599
  307. package/dist/list/ActionToolbar.js +184 -0
  308. package/dist/list/HoverCard.js +73 -0
  309. package/dist/list/ListPage.js +145 -0
  310. package/dist/list/ListPager.js +59 -0
  311. package/dist/list/ListTable.d.ts +1 -1
  312. package/dist/list/ListTable.js +163 -0
  313. package/dist/list/ListViewControls.d.ts +2 -2
  314. package/dist/list/ListViewControls.js +372 -0
  315. package/dist/list/RowContextMenu.js +350 -0
  316. package/dist/list/UserHoverCard.js +117 -0
  317. package/dist/list/index.d.ts +9 -9
  318. package/dist/list/index.js +11 -2
  319. package/dist/list/listSearch.js +137 -0
  320. package/dist/list/listView.js +210 -0
  321. package/dist/list/textEntry.js +10 -0
  322. package/dist/logviewer/LogViewer.d.ts +1 -1
  323. package/dist/logviewer/LogViewer.js +750 -0
  324. package/dist/logviewer/index.d.ts +1 -0
  325. package/dist/logviewer/index.js +3 -742
  326. package/dist/logviewer/segments.d.ts +9 -0
  327. package/dist/logviewer/segments.js +80 -0
  328. package/dist/styles/fonts.css +4 -4
  329. package/dist/styles/theme.css +6 -4
  330. package/dist/styles.css +1 -1
  331. package/dist/theme/index.js +2 -2
  332. package/package.json +38 -14
  333. package/LICENSE +0 -202
  334. package/dist/chunks/Monaco-C1POOdVv.js +0 -1046
  335. package/dist/chunks/PageHeader-l49p1nM9.js +0 -690
  336. package/dist/chunks/SwitchToggle-CHPP8uZQ.js +0 -755
  337. package/dist/chunks/editor-9_uVtUyy.js +0 -347
  338. package/dist/chunks/list-qrojZZNv.js +0 -1411
  339. package/dist/editor/usesGitlab.d.ts +0 -97
  340. package/dist/form/Fields/BucketReadOnlyField.d.ts +0 -7
  341. package/dist/form/types/workflow-schema.d.ts +0 -1145
  342. package/dist/form/utils/pwResolver.d.ts +0 -18
  343. package/dist/{chunks/MarkdownImpl-Bq4QhrtA.js → components/MarkdownImpl.js} +1 -1
  344. /package/dist/{workflow → graph}/AnnotationBanner.d.ts +0 -0
  345. /package/dist/{workflow → graph}/Collapse.d.ts +0 -0
  346. /package/dist/{workflow → graph}/DependencyGraph.d.ts +0 -0
  347. /package/dist/{workflow → graph}/JobSummary.d.ts +0 -0
  348. /package/dist/{workflow → graph}/Reveal.d.ts +0 -0
  349. /package/dist/{workflow → graph}/TreeView.d.ts +0 -0
@@ -1,193 +1,14 @@
1
- import { i as useNotify, u as useStrings } from "./Provider-Ghua9PkN.js";
2
- import { w as AddMenu } from "./PageHeader-l49p1nM9.js";
3
- import { AlertIcon, CheckIcon, ChevronDownIcon, ChevronRightIcon, ClipboardIcon, CopyIcon, FavoriteIcon, FavoriteOutlineIcon, HiddenFalseIcon, HiddenTrueIcon, InfoIcon, TooltipIcon } from "../icons.js";
4
- import { n as TOOLTIP_ID } from "./Tooltip-Crxo_eU_.js";
5
- import { a as filterOption, u as toggleSetMember } from "./StatusBadge-C1Blx_cW.js";
6
- import { n as modalPanelClasses, t as BareModal } from "./BareModal-BtRiQezg.js";
1
+ import { useStrings } from "./Provider.js";
2
+ import { ChevronDownIcon, ChevronRightIcon, FavoriteIcon, FavoriteOutlineIcon, TooltipIcon } from "../icons.js";
3
+ import { TOOLTIP_ID } from "./Tooltip.js";
4
+ import { AddMenu } from "./AddMenu.js";
5
+ import { BareModal, modalPanelClasses } from "./BareModal.js";
6
+ import { ghostButtonClasses } from "./ghostButton.js";
7
+ import { filterOption, toggleSetMember } from "./dropdownUtils.js";
8
+ import { Combobox, ComboboxInput, ComboboxOption, ComboboxOptions, Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react";
7
9
  import cx from "classnames";
8
- import { Suspense, lazy, useCallback, useEffect, useRef, useState } from "react";
10
+ import { useCallback, useEffect, useRef, useState } from "react";
9
11
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
- import { Combobox, ComboboxInput, ComboboxOption, ComboboxOptions, Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react";
11
- //#region src/components/Callout.tsx
12
- function CalloutIcon({ type }) {
13
- if (type === "warning" || type === "error") return /* @__PURE__ */ jsx(AlertIcon, { className: "h-6 w-6 mr-4 text-lg" });
14
- else return /* @__PURE__ */ jsx(InfoIcon, { className: "h-6 w-6 mr-4 text-lg" });
15
- }
16
- function Callout({ type, className = "", children }) {
17
- return /* @__PURE__ */ jsx("div", {
18
- className: cx(className, type === "warning" && "bg-orange-100 border-orange-500 text-orange-700", type === "error" && "bg-red-100 border-red-500 text-red-700", type === "info" && "bg-blue-100 border-blue-500 text-blue-700", "border-t-4 rounded-b px-4 py-3 shadow-md my-4"),
19
- role: "alert",
20
- children: /* @__PURE__ */ jsxs("div", {
21
- className: "flex",
22
- children: [/* @__PURE__ */ jsx("div", {
23
- className: "py-1",
24
- children: /* @__PURE__ */ jsx(CalloutIcon, { type })
25
- }), /* @__PURE__ */ jsx("div", { children })]
26
- })
27
- });
28
- }
29
- //#endregion
30
- //#region src/components/CopyToClipboard.tsx
31
- function CopyToClipboard({ as = "div", text, className, children, showIcon = true }) {
32
- const notify = useNotify();
33
- const strings = useStrings();
34
- const handleCopy = async () => {
35
- try {
36
- await navigator.clipboard.writeText(text);
37
- notify.info("Copied to clipboard");
38
- } catch {
39
- notify.error("Failed to copy to clipboard");
40
- }
41
- };
42
- return /* @__PURE__ */ jsxs(as, {
43
- className,
44
- onClick: handleCopy,
45
- ...as === "button" ? { type: "button" } : {
46
- role: "button",
47
- "aria-label": strings.common.copy,
48
- tabIndex: 0,
49
- onKeyDown: (e) => {
50
- if (e.key === "Enter" || e.key === " ") {
51
- e.preventDefault();
52
- handleCopy();
53
- }
54
- }
55
- },
56
- children: [showIcon && /* @__PURE__ */ jsx(ClipboardIcon, {}), children]
57
- });
58
- }
59
- function CopyCodeBlock({ textToCopy, children, secret = false, isRevealed = false, onRevealToggle }) {
60
- const notify = useNotify();
61
- const [copied, setCopied] = useState(false);
62
- const handleCopy = async () => {
63
- if (copied) return;
64
- try {
65
- await navigator.clipboard.writeText(textToCopy);
66
- setCopied(true);
67
- notify.info("Copied to clipboard");
68
- setTimeout(() => setCopied(false), 2e3);
69
- } catch {
70
- notify.error("Failed to copy to clipboard");
71
- }
72
- };
73
- return /* @__PURE__ */ jsxs("div", {
74
- className: "group relative",
75
- role: "none",
76
- onClick: handleCopy,
77
- children: [/* @__PURE__ */ jsx("pre", {
78
- className: `p-4 theme-hover border rounded-lg text-left font-mono text-sm overflow-x-auto ${secret ? "pr-24" : "pr-12"}`,
79
- children
80
- }), /* @__PURE__ */ jsxs("div", {
81
- className: "absolute top-0 right-0 bottom-0 flex items-center gap-1 pl-8 pr-2 bg-gradient-to-l from-[var(--color-panel)] from-70% to-transparent rounded-r-lg",
82
- children: [secret && /* @__PURE__ */ jsx("button", {
83
- type: "button",
84
- onClick: (e) => {
85
- e.stopPropagation();
86
- onRevealToggle?.();
87
- },
88
- className: "p-2 rounded-md opacity-0 group-hover:opacity-100 transition-all duration-150",
89
- "aria-label": isRevealed ? "Hide secret" : "Reveal secret",
90
- title: isRevealed ? "Hide secret" : "Reveal secret",
91
- children: isRevealed ? /* @__PURE__ */ jsx(HiddenFalseIcon, {}) : /* @__PURE__ */ jsx(HiddenTrueIcon, {})
92
- }), /* @__PURE__ */ jsx("button", {
93
- type: "button",
94
- onClick: (e) => {
95
- e.stopPropagation();
96
- handleCopy();
97
- },
98
- className: "p-2 rounded-md opacity-0 group-hover:opacity-100 transition-all duration-150",
99
- "aria-label": copied ? "Copied" : "Copy to clipboard",
100
- children: copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "text-green-400" }) : /* @__PURE__ */ jsx(CopyIcon, {})
101
- })]
102
- })]
103
- });
104
- }
105
- //#endregion
106
- //#region src/components/Markdown.tsx
107
- var MarkdownImpl = lazy(() => import("./MarkdownImpl-Bq4QhrtA.js"));
108
- function Markdown(props) {
109
- return /* @__PURE__ */ jsx(Suspense, {
110
- fallback: /* @__PURE__ */ jsx("div", {
111
- className: "markdown whitespace-pre-wrap text-start w-full",
112
- children: props.children
113
- }),
114
- children: /* @__PURE__ */ jsx(MarkdownImpl, { ...props })
115
- });
116
- }
117
- //#endregion
118
- //#region src/components/ghostButton.ts
119
- var ghostButtonClasses = "inline-flex cursor-pointer items-center gap-1.5 h-8 px-3 rounded-md text-sm text-(--theme-muted-text-color) hover:text-(--theme-app) hover:bg-(--theme-muted-panel-bg) transition-colors";
120
- var primaryButtonClasses = "inline-flex cursor-pointer items-center gap-1.5 h-7 px-2.5 rounded-md text-[12.5px] font-medium bg-(--theme-element) text-(--theme-element-text) hover:opacity-90 transition-opacity";
121
- /** Filled destructive button for confirming irreversible actions in ds modals. */
122
- var dangerButtonClasses = "inline-flex cursor-pointer items-center gap-1.5 h-7 px-2.5 rounded-md text-[12.5px] font-medium bg-red-600 text-white hover:bg-red-700 transition-colors";
123
- //#endregion
124
- //#region src/components/ConfirmModal.tsx
125
- function ConfirmModal({ open, onClose, title, description, children, confirmLabel, onConfirm, confirmDisabled = false, destructive = false, align = "top", cancelLabel, closeOnConfirm = true }) {
126
- const strings = useStrings();
127
- const [pending, setPending] = useState(false);
128
- const firedRef = useRef(false);
129
- useEffect(() => {
130
- if (open) firedRef.current = false;
131
- }, [open]);
132
- const onCloseRef = useRef(onClose);
133
- onCloseRef.current = onClose;
134
- const runConfirm = useCallback(async () => {
135
- if (firedRef.current) return;
136
- firedRef.current = true;
137
- setPending(true);
138
- try {
139
- await onConfirm();
140
- if (closeOnConfirm) onCloseRef.current();
141
- else firedRef.current = false;
142
- } catch (error) {
143
- firedRef.current = false;
144
- throw error;
145
- } finally {
146
- setPending(false);
147
- }
148
- }, [onConfirm, closeOnConfirm]);
149
- return /* @__PURE__ */ jsxs(BareModal, {
150
- open,
151
- onClose,
152
- ariaLabel: title,
153
- align,
154
- preventClose: pending,
155
- className: cx(modalPanelClasses, "w-[480px] max-w-full"),
156
- children: [/* @__PURE__ */ jsxs("div", {
157
- className: "px-5 pt-5",
158
- children: [
159
- /* @__PURE__ */ jsx("h2", {
160
- className: "text-lg font-semibold text-(--theme-app)",
161
- children: title
162
- }),
163
- description !== null && description !== void 0 && /* @__PURE__ */ jsx("p", {
164
- className: "mt-1.5 text-sm text-(--theme-muted-text-color)",
165
- children: description
166
- }),
167
- children !== null && children !== void 0 && /* @__PURE__ */ jsx("div", {
168
- className: "mt-4",
169
- children
170
- })
171
- ]
172
- }), /* @__PURE__ */ jsxs("div", {
173
- className: "mt-5 flex items-center justify-end gap-2 border-t border-(--theme-border) px-5 py-3",
174
- children: [/* @__PURE__ */ jsx("button", {
175
- type: "button",
176
- onClick: onClose,
177
- disabled: pending,
178
- className: cx(ghostButtonClasses, pending && "cursor-wait"),
179
- children: cancelLabel ?? strings.modal.cancel
180
- }), /* @__PURE__ */ jsx("button", {
181
- type: "button",
182
- onClick: runConfirm,
183
- disabled: confirmDisabled || pending,
184
- className: cx(destructive ? dangerButtonClasses : primaryButtonClasses, "disabled:cursor-not-allowed disabled:opacity-50", pending && "cursor-wait"),
185
- children: confirmLabel
186
- })]
187
- })]
188
- });
189
- }
190
- //#endregion
191
12
  //#region src/components/CreateModal.tsx
192
13
  /** Small info icon that surfaces field help via the global tooltip. */
193
14
  function FieldHelp({ tooltip }) {
@@ -655,4 +476,4 @@ function CreateModalSelect({ label, icon, value, options, onChange, disabled = f
655
476
  })] }) });
656
477
  }
657
478
  //#endregion
658
- export { CreateModalSelect as a, ConfirmModal as c, primaryButtonClasses as d, Markdown as f, Callout as h, CreateModalField as i, dangerButtonClasses as l, CopyToClipboard as m, CreateModal as n, CreateModalSwitch as o, CopyCodeBlock as p, CreateModalAutocompleteField as r, CreateModalTextarea as s, CREATE_MODAL_SELECT_FILTER_THRESHOLD as t, ghostButtonClasses as u };
479
+ export { CREATE_MODAL_SELECT_FILTER_THRESHOLD, CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, CreateModalSwitch, CreateModalTextarea };
@@ -0,0 +1,42 @@
1
+ import { TooltipInfo } from "./Tooltip.js";
2
+ import cx from "classnames";
3
+ import React from "react";
4
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/DescriptionList.tsx
6
+ function DescriptionListItem({ label, children, tooltip, className, ...props }) {
7
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("dt", {
8
+ className: cx("text-[13px] leading-6 col-span-1 font-normal flex gap-1", className),
9
+ children: [/* @__PURE__ */ jsx("span", {
10
+ className: "min-w-0 truncate",
11
+ children: label
12
+ }), tooltip && /* @__PURE__ */ jsx(TooltipInfo, {
13
+ className: "pr-2",
14
+ text: tooltip
15
+ })]
16
+ }), /* @__PURE__ */ jsx("dd", {
17
+ ...props,
18
+ className: "flex text-[13px] leading-6 col-span-4 font-light items-center overflow-auto",
19
+ children
20
+ })] });
21
+ }
22
+ function DescriptionList({ children, title, separators = true, subtitle, className, wrapperClassName, vertical = false }) {
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ className: cx("w-full", wrapperClassName),
25
+ children: [
26
+ title && /* @__PURE__ */ jsx("h2", {
27
+ className: "text-sm font-semibold w-full mb-1",
28
+ children: title
29
+ }),
30
+ subtitle && /* @__PURE__ */ jsx("div", {
31
+ className: "max-w-2xl text-sm/6 w-full",
32
+ children: subtitle
33
+ }),
34
+ /* @__PURE__ */ jsx("dl", {
35
+ className: cx("grid", separators && "*:not-last-of-type:border-b-1", vertical ? "grid-cols-1" : "grid-cols-5 gap-x-4 gap-y-0.5 *:pb-0.5", className),
36
+ children: Array.isArray(children) ? React.Children.toArray(children) : children
37
+ })
38
+ ]
39
+ });
40
+ }
41
+ //#endregion
42
+ export { DescriptionListItem, DescriptionList as default };
@@ -1,5 +1,5 @@
1
1
  import { type SetStateAction } from 'react';
2
- import { type IOptions, type ICategory } from './dropdownUtils.js';
2
+ import { type ICategory, type IOptions } from './dropdownUtils.js';
3
3
  export interface IProps {
4
4
  options: (ICategory | IOptions | string)[];
5
5
  onActiveChange?: (option: unknown) => void;
@@ -0,0 +1,349 @@
1
+ import { useStrings } from "./Provider.js";
2
+ import { CaretDownIcon } from "../icons.js";
3
+ import { truncationTooltipProps } from "./Tooltip.js";
4
+ import { DropdownCaret, flattenDisplayOptions, isCategory, toggleSetMember } from "./dropdownUtils.js";
5
+ import { Combobox, ComboboxButton, ComboboxInput, ComboboxOption, ComboboxOptions } from "@headlessui/react";
6
+ import cx from "classnames";
7
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
+ import { createPortal } from "react-dom";
10
+ import deepEqual from "fast-deep-equal";
11
+ import { usePopper } from "react-popper";
12
+ //#region src/components/Dropdown.tsx
13
+ var defaultCollapsedLabel = (count) => `${count} more`;
14
+ function isNamedValue(value) {
15
+ return typeof value === "object" && value !== null && "name" in value && typeof value.name === "string";
16
+ }
17
+ var checkEquals = (val, opt) => {
18
+ if (typeof val === "object" && !Array.isArray(val)) return deepEqual(val, opt);
19
+ return val === opt;
20
+ };
21
+ function getOptionFromValue(value, options) {
22
+ if (value === void 0) return {
23
+ label: "",
24
+ value: ""
25
+ };
26
+ const found = options?.find((option) => {
27
+ if (typeof option === "string") return checkEquals(value, option);
28
+ else if (isCategory(option)) return option.options.find((opt) => checkEquals(value, opt.value));
29
+ else return checkEquals(value, option.value);
30
+ });
31
+ if (found) {
32
+ if (typeof found === "string") return {
33
+ label: found,
34
+ value: found
35
+ };
36
+ else if (isCategory(found)) return found.options.find((opt) => checkEquals(value, opt.value)) || {
37
+ label: JSON.stringify(value),
38
+ value
39
+ };
40
+ else return found;
41
+ }
42
+ const isNamedObject = isNamedValue(value);
43
+ const fallbackLabel = typeof value === "string" ? value : isNamedObject ? value.name : JSON.stringify(value);
44
+ return {
45
+ label: fallbackLabel,
46
+ value: isNamedObject ? value : fallbackLabel
47
+ };
48
+ }
49
+ function Dropdown(props) {
50
+ const { onChange, value, options = [], ...others } = props;
51
+ const val = useMemo(() => {
52
+ return getOptionFromValue(value, options);
53
+ }, [value, options]);
54
+ const wrapperOnchange = (value) => {
55
+ if (onChange) onChange(value?.value);
56
+ };
57
+ const transformedOptions = useMemo(() => {
58
+ if (!options || options.length === 0) return [];
59
+ return options.map((item) => {
60
+ if (isCategory(item)) return {
61
+ ...item,
62
+ options: item.options.map((opt) => {
63
+ if (typeof opt === "string") return {
64
+ label: opt,
65
+ value: opt
66
+ };
67
+ return opt;
68
+ })
69
+ };
70
+ else if (typeof item === "string") return {
71
+ label: item,
72
+ value: item
73
+ };
74
+ return item;
75
+ });
76
+ }, [options]);
77
+ return /* @__PURE__ */ jsx(DropdownHelper, {
78
+ value: val,
79
+ onChange: wrapperOnchange,
80
+ options: transformedOptions,
81
+ ...others
82
+ });
83
+ }
84
+ function ActiveWatcher({ active, onChange }) {
85
+ const prev = useRef(null);
86
+ useEffect(() => {
87
+ if (prev.current !== active) {
88
+ onChange?.(active?.value);
89
+ prev.current = active;
90
+ }
91
+ }, [active, onChange]);
92
+ return null;
93
+ }
94
+ function OptionContent({ label, description, icon }) {
95
+ return /* @__PURE__ */ jsxs("span", {
96
+ className: cx("flex gap-1.5", description ? "items-start min-w-0" : "items-center truncate"),
97
+ ...truncationTooltipProps(label, (anchor) => anchor.lastElementChild),
98
+ children: [icon, description ? /* @__PURE__ */ jsxs("span", {
99
+ className: "flex flex-col min-w-0",
100
+ children: [/* @__PURE__ */ jsx("span", {
101
+ className: "truncate",
102
+ children: label
103
+ }), /* @__PURE__ */ jsx("span", {
104
+ className: "text-(--theme-muted-text-color) text-xs leading-snug",
105
+ children: description
106
+ })]
107
+ }) : /* @__PURE__ */ jsx("span", {
108
+ className: "truncate",
109
+ children: label
110
+ })]
111
+ });
112
+ }
113
+ function ToggleOption({ option, category, expanded, onToggle, ...virtualRowProps }) {
114
+ return /* @__PURE__ */ jsx(ComboboxOption, {
115
+ ...virtualRowProps,
116
+ "data-testid": "combobox-toggle",
117
+ value: option,
118
+ className: "w-full h-10 flex items-center pl-3",
119
+ children: /* @__PURE__ */ jsxs("button", {
120
+ type: "button",
121
+ "aria-expanded": expanded,
122
+ className: "flex items-center gap-1.5 cursor-pointer text-(--theme-muted-text-color) hover:text-(--theme-app)",
123
+ onMouseDown: (e) => e.preventDefault(),
124
+ onClick: (e) => {
125
+ e.preventDefault();
126
+ e.stopPropagation();
127
+ onToggle(category);
128
+ },
129
+ children: [/* @__PURE__ */ jsx(CaretDownIcon, { className: cx("w-3 h-3", !expanded && "-rotate-90") }), option.label]
130
+ })
131
+ });
132
+ }
133
+ function DropdownHelper({ wrapperClassName = "w-full", className, textBoxClassName = "w-full", options = [], onChange, onActiveChange, value, id, ariaLabel, "aria-describedby": describedBy, required, disabled = false, placeholder = "", loading = false, allowCustomValue = false, customValueLabel = "Use", collapsedLabel = defaultCollapsedLabel, portalEl, compact = false }) {
134
+ const DEBOUNCE_MS = 500;
135
+ const t = useStrings().dropdown;
136
+ const [query, setQuery] = useState("");
137
+ const [selectedIconWidth, setSelectedIconWidth] = useState(0);
138
+ const selectedIconRef = useCallback((node) => {
139
+ setSelectedIconWidth(node?.offsetWidth ?? 0);
140
+ }, []);
141
+ const selectedIcon = query === "" ? value?.icon : void 0;
142
+ const [referenceElement, setReferenceElement] = useState(null);
143
+ const [popperElement, setPopperElement] = useState(null);
144
+ const [boundaryEl, setBoundaryEl] = useState(null);
145
+ useEffect(() => {
146
+ if (!referenceElement) {
147
+ setBoundaryEl(null);
148
+ return;
149
+ }
150
+ const ref = referenceElement;
151
+ const dialog = ref.closest("[role=\"dialog\"]");
152
+ if (!dialog) {
153
+ setBoundaryEl(null);
154
+ return;
155
+ }
156
+ let node = ref.parentElement;
157
+ while (node) {
158
+ const style = getComputedStyle(node);
159
+ if (/(auto|scroll|hidden)/.test(`${style.overflowX} ${style.overflowY}`)) {
160
+ setBoundaryEl(node);
161
+ return;
162
+ }
163
+ if (node === dialog) break;
164
+ node = node.parentElement;
165
+ }
166
+ setBoundaryEl(dialog);
167
+ }, [referenceElement]);
168
+ const sameWidthModifier = useMemo(() => ({
169
+ name: "sameWidth",
170
+ enabled: true,
171
+ phase: "beforeWrite",
172
+ requires: ["computeStyles"],
173
+ fn: ({ state }) => {
174
+ const popperStyles = state.styles["popper"];
175
+ if (popperStyles) popperStyles.width = `${state.rects.reference.width}px`;
176
+ },
177
+ effect: ({ state }) => {
178
+ const { popper, reference } = state.elements;
179
+ if (reference instanceof HTMLElement) popper.style.width = `${reference.offsetWidth}px`;
180
+ }
181
+ }), []);
182
+ const popperModifiers = useMemo(() => boundaryEl ? [
183
+ sameWidthModifier,
184
+ {
185
+ name: "flip",
186
+ options: { boundary: boundaryEl }
187
+ },
188
+ {
189
+ name: "preventOverflow",
190
+ options: { boundary: boundaryEl }
191
+ }
192
+ ] : [sameWidthModifier], [boundaryEl, sameWidthModifier]);
193
+ const { styles, attributes } = usePopper(referenceElement, popperElement, {
194
+ strategy: "fixed",
195
+ modifiers: popperModifiers
196
+ });
197
+ const debounceRef = useRef(null);
198
+ const buttonRef = useRef(null);
199
+ const [expandedCategories, setExpandedCategories] = useState(/* @__PURE__ */ new Set());
200
+ const selectedCategory = useMemo(() => options.find((o) => isCategory(o) && o.options.some((opt) => checkEquals(value.value, opt.value)))?.category, [options, value]);
201
+ const lastAutoExpandedValue = useRef(void 0);
202
+ useEffect(() => {
203
+ if (!selectedCategory || checkEquals(lastAutoExpandedValue.current, value.value)) return;
204
+ lastAutoExpandedValue.current = value.value;
205
+ setExpandedCategories((prev) => prev.size === 1 && prev.has(selectedCategory) ? prev : /* @__PURE__ */ new Set([selectedCategory]));
206
+ }, [selectedCategory, value]);
207
+ const toggleCategory = (category) => setExpandedCategories((prev) => toggleSetMember(prev, category));
208
+ const flushCustomValue = useCallback((val) => {
209
+ onChange({
210
+ label: val,
211
+ value: val
212
+ });
213
+ }, [onChange]);
214
+ const onQueryChange = (val) => {
215
+ setQuery(val);
216
+ if (allowCustomValue) {
217
+ if (debounceRef.current) clearTimeout(debounceRef.current);
218
+ debounceRef.current = setTimeout(() => {
219
+ flushCustomValue(val);
220
+ debounceRef.current = null;
221
+ }, DEBOUNCE_MS);
222
+ }
223
+ };
224
+ const onInputBlur = () => {
225
+ if (allowCustomValue && debounceRef.current) {
226
+ clearTimeout(debounceRef.current);
227
+ debounceRef.current = null;
228
+ flushCustomValue(query);
229
+ }
230
+ setQuery("");
231
+ };
232
+ const onComboboxChange = (val) => {
233
+ if (debounceRef.current) {
234
+ clearTimeout(debounceRef.current);
235
+ debounceRef.current = null;
236
+ }
237
+ onChange(val);
238
+ };
239
+ const flattenedOptions = useMemo(() => flattenDisplayOptions({
240
+ options,
241
+ query,
242
+ expandedCategories,
243
+ collapsedLabel,
244
+ selectedValue: value?.value,
245
+ allowCustomValue,
246
+ customValueLabel
247
+ }), [
248
+ options,
249
+ query,
250
+ expandedCategories,
251
+ collapsedLabel,
252
+ value,
253
+ allowCustomValue,
254
+ customValueLabel
255
+ ]);
256
+ const comboOptions = /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx(ComboboxOptions, {
257
+ modal: false,
258
+ ref: setPopperElement,
259
+ style: styles["popper"],
260
+ className: cx("bg-(--theme-input-bg) border-(--theme-border) text-(--theme-app) max-h-60! empty:invisible border overflow-auto rounded-md shadow-lg focus:outline-hidden z-9999 data-[popper-reference-hidden=true]:invisible data-[popper-reference-hidden=true]:pointer-events-none", compact ? "text-xs" : "sm:text-sm"),
261
+ ...attributes["popper"],
262
+ children: ({ option }) => {
263
+ const optionLabel = typeof option === "string" ? option : option.label;
264
+ const optionDescription = typeof option !== "string" ? option.description : void 0;
265
+ const isCategoryRow = typeof option !== "string" && Boolean(option.category);
266
+ const toggleTarget = typeof option !== "string" ? option.toggle : void 0;
267
+ const isPinned = typeof option !== "string" && Boolean(option.pinned);
268
+ if (toggleTarget !== void 0) return /* @__PURE__ */ jsx(ToggleOption, {
269
+ option,
270
+ category: toggleTarget,
271
+ expanded: expandedCategories.has(toggleTarget),
272
+ onToggle: toggleCategory
273
+ });
274
+ return /* @__PURE__ */ jsx(ComboboxOption, {
275
+ "data-testid": "combobox-option",
276
+ value: option,
277
+ className: cx("w-full group relative flex", optionDescription ? "min-h-10 py-2" : compact ? "h-8" : "h-10", isCategoryRow ? "text-[14px] font-bold pl-1 items-center" : "data-disabled:text-(--theme-muted-text-color) data-disabled:bg-(--theme-muted-panel-bg) data-disabled:cursor-not-allowed cursor-pointer items-center pr-9 pl-3 leading-5 data-focus:bg-(--theme-muted-panel-bg) data-focus:text-(--theme-app) data-focus:outline-hidden", "data-selected:border-l-2 data-selected:border-(--theme-link) data-selected:bg-(--theme-muted-panel-bg) data-selected:text-(--theme-app)", isPinned && "border-t border-(--theme-border) font-medium"),
278
+ children: /* @__PURE__ */ jsx(OptionContent, {
279
+ label: optionLabel,
280
+ description: optionDescription,
281
+ icon: typeof option !== "string" && option.icon
282
+ })
283
+ });
284
+ }
285
+ }) });
286
+ return /* @__PURE__ */ jsx("div", {
287
+ className: cx("relative rounded-md flex items-center", wrapperClassName),
288
+ children: /* @__PURE__ */ jsx(Combobox, {
289
+ "data-testid": "combobox",
290
+ className: cx("relative w-full", className),
291
+ as: "div",
292
+ by: checkEquals,
293
+ value,
294
+ onChange: onComboboxChange,
295
+ onClose: () => {
296
+ setQuery("");
297
+ setExpandedCategories(new Set(selectedCategory ? [selectedCategory] : []));
298
+ },
299
+ immediate: true,
300
+ virtual: {
301
+ options: flattenedOptions,
302
+ disabled: (option) => Boolean(option.disabled)
303
+ },
304
+ disabled,
305
+ children: ({ activeOption, open }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
306
+ onActiveChange && /* @__PURE__ */ jsx(ActiveWatcher, {
307
+ active: activeOption,
308
+ onChange: onActiveChange
309
+ }),
310
+ selectedIcon && /* @__PURE__ */ jsx("span", {
311
+ ref: selectedIconRef,
312
+ className: "pointer-events-none absolute inset-y-0 left-3 z-10 flex items-center",
313
+ children: selectedIcon
314
+ }, value.label),
315
+ /* @__PURE__ */ jsx(ComboboxInput, {
316
+ id,
317
+ "aria-label": ariaLabel || void 0,
318
+ "aria-describedby": describedBy,
319
+ "aria-required": required || void 0,
320
+ placeholder: loading ? "Loading..." : placeholder,
321
+ onBlur: onInputBlur,
322
+ ref: setReferenceElement,
323
+ onClick: () => {
324
+ if (!open) buttonRef.current?.click();
325
+ },
326
+ style: selectedIcon && selectedIconWidth > 0 ? { paddingLeft: selectedIconWidth + 18 } : void 0,
327
+ className: cx("placeholder:text-xs bg-(--theme-input-bg) border-(--theme-border) text-(--theme-app) focus:border-(--theme-element) focus:outline-none focus:ring-1 focus:ring-(--theme-element) w-full h-full text-ellipsis pr-8", "disabled:bg-(--theme-input-disabled-bg) disabled:text-(--theme-input-disabled-text) disabled:cursor-not-allowed", textBoxClassName),
328
+ autoComplete: "off",
329
+ onChange: (event) => onQueryChange(event.target.value),
330
+ displayValue: (opt) => {
331
+ return opt?.label?.replaceAll("\"", "") || query || "";
332
+ },
333
+ disabled
334
+ }),
335
+ /* @__PURE__ */ jsx(ComboboxButton, {
336
+ ref: buttonRef,
337
+ "aria-label": t.showOptions,
338
+ className: "absolute inset-y-0 right-0 flex items-center pr-3 disabled:cursor-not-allowed",
339
+ "data-testid": "combobox-button",
340
+ disabled,
341
+ children: /* @__PURE__ */ jsx(DropdownCaret, {})
342
+ }),
343
+ typeof document !== "undefined" && createPortal(comboOptions, portalEl ?? document.querySelector(".ds-root") ?? document.body)
344
+ ] })
345
+ })
346
+ });
347
+ }
348
+ //#endregion
349
+ export { Dropdown as default };
@@ -7,5 +7,5 @@ interface EmptyStateProps {
7
7
  className?: string;
8
8
  }>;
9
9
  }
10
- export default function EmptyState({ title, description, action, icon: Icon, }: EmptyStateProps): React.JSX.Element;
10
+ export default function EmptyState({ title, description, action, icon: Icon }: EmptyStateProps): React.JSX.Element;
11
11
  export {};
@@ -0,0 +1,27 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ //#region src/components/EmptyState.tsx
3
+ function EmptyState({ title, description, action, icon: Icon }) {
4
+ return /* @__PURE__ */ jsxs("div", {
5
+ className: "border-solid rounded-2xl border border-(--theme-border) theme-panel flex flex-col items-center justify-center py-12 px-6",
6
+ children: [
7
+ Icon && /* @__PURE__ */ jsx("div", {
8
+ className: "w-10 h-10 rounded-full bg-(--theme-muted-panel-bg) flex items-center justify-center mb-3",
9
+ children: /* @__PURE__ */ jsx(Icon, { className: "w-5 h-5 theme-muted-text" })
10
+ }),
11
+ /* @__PURE__ */ jsx("p", {
12
+ className: "text-sm font-medium mb-1",
13
+ children: title
14
+ }),
15
+ description && /* @__PURE__ */ jsx("p", {
16
+ className: "text-xs theme-muted-text text-center max-w-xs",
17
+ children: description
18
+ }),
19
+ action && /* @__PURE__ */ jsx("div", {
20
+ className: "mt-4",
21
+ children: action
22
+ })
23
+ ]
24
+ });
25
+ }
26
+ //#endregion
27
+ export { EmptyState as default };
@@ -0,0 +1,32 @@
1
+ import { FilterIcon } from "../icons.js";
2
+ import cx from "classnames";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/Filter.tsx
5
+ function Filter({ filter, setFilter, placeholder = "Filter...", pills, activePill, onPillChange }) {
6
+ return /* @__PURE__ */ jsxs("div", {
7
+ className: "flex items-center gap-2",
8
+ children: [/* @__PURE__ */ jsxs("div", {
9
+ className: "relative flex items-center",
10
+ children: [/* @__PURE__ */ jsx("input", {
11
+ placeholder,
12
+ type: "text",
13
+ value: filter,
14
+ onChange: (e) => setFilter(e.target.value.toLowerCase()),
15
+ className: "shadow-sm focus:ring-1 block w-full pr-3 sm:text-sm theme-border rounded-md py-1.5 pl-8"
16
+ }), /* @__PURE__ */ jsx("div", {
17
+ className: "absolute inset-y-0 left-0 flex py-2.5 pl-2",
18
+ children: /* @__PURE__ */ jsx(FilterIcon, {})
19
+ })]
20
+ }), pills && onPillChange && /* @__PURE__ */ jsx("div", {
21
+ className: "flex gap-1",
22
+ children: pills.map((pill) => /* @__PURE__ */ jsx("button", {
23
+ type: "button",
24
+ onClick: () => onPillChange(pill.value),
25
+ className: cx("px-2.5 py-1 text-xs rounded-full transition-colors border", activePill === pill.value ? "bg-(--theme-element) text-(--theme-element-text) border-transparent" : "theme-border theme-text hover:theme-hover"),
26
+ children: pill.label
27
+ }, pill.value))
28
+ })]
29
+ });
30
+ }
31
+ //#endregion
32
+ export { Filter as default };