@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,755 +0,0 @@
1
- import { u as useStrings } from "./Provider-Ghua9PkN.js";
2
- import { AngleDownIcon, AngleRightIcon, CaretDownIcon } from "../icons.js";
3
- import { a as truncationTooltipProps, n as TOOLTIP_ID } from "./Tooltip-Crxo_eU_.js";
4
- import { a as filterOption, c as isCategory, i as DropdownCaret, l as isOption, o as flattenDisplayOptions, s as flattenOptions, u as toggleSetMember } from "./StatusBadge-C1Blx_cW.js";
5
- import cx from "classnames";
6
- import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
- import { createPortal } from "react-dom";
9
- import { Combobox, ComboboxButton, ComboboxInput, ComboboxOption, ComboboxOptions, Listbox, ListboxButton, ListboxOption, ListboxOptions, Switch, Transition } from "@headlessui/react";
10
- import deepEqual from "fast-deep-equal";
11
- import { usePopper } from "react-popper";
12
- import AnimateHeight from "react-animate-height";
13
- //#region src/components/Dropdown.tsx
14
- var defaultCollapsedLabel = (count) => `${count} more`;
15
- function isResourceValue(value) {
16
- if (typeof value !== "object" || value === null || !("name" in value)) return false;
17
- if (typeof value.name !== "string") return false;
18
- if ("$type" in value && value.$type === "computeResource") return true;
19
- return "type" in value && (value.type === "computeResource" || value.type === "bucket");
20
- }
21
- var checkEquals = (val, opt) => {
22
- if (typeof val === "object" && !Array.isArray(val)) return deepEqual(val, opt);
23
- return val === opt;
24
- };
25
- function getOptionFromValue(value, options) {
26
- if (value === void 0) return {
27
- label: "",
28
- value: ""
29
- };
30
- const found = options?.find((option) => {
31
- if (typeof option === "string") return checkEquals(value, option);
32
- else if (isCategory(option)) return option.options.find((opt) => checkEquals(value, opt.value));
33
- else return checkEquals(value, option.value);
34
- });
35
- if (found) if (typeof found === "string") return {
36
- label: found,
37
- value: found
38
- };
39
- else if (isCategory(found)) return found.options.find((opt) => checkEquals(value, opt.value)) || {
40
- label: JSON.stringify(value),
41
- value
42
- };
43
- else return found;
44
- const isResourceObject = isResourceValue(value);
45
- const fallbackLabel = typeof value === "string" ? value : isResourceObject ? value.name : JSON.stringify(value);
46
- return {
47
- label: fallbackLabel,
48
- value: isResourceObject ? value : fallbackLabel
49
- };
50
- }
51
- function Dropdown(props) {
52
- const { onChange, value, options = [], ...others } = props;
53
- const val = useMemo(() => {
54
- return getOptionFromValue(value, options);
55
- }, [value, options]);
56
- const wrapperOnchange = (value) => {
57
- if (onChange) onChange(value?.value);
58
- };
59
- return /* @__PURE__ */ jsx(DropdownHelper, {
60
- value: val,
61
- onChange: wrapperOnchange,
62
- options: useMemo(() => {
63
- if (!options || options.length === 0) return [];
64
- return options.map((item) => {
65
- if (isCategory(item)) return {
66
- ...item,
67
- options: item.options.map((opt) => {
68
- if (typeof opt === "string") return {
69
- label: opt,
70
- value: opt
71
- };
72
- return opt;
73
- })
74
- };
75
- else if (typeof item === "string") return {
76
- label: item,
77
- value: item
78
- };
79
- return item;
80
- });
81
- }, [options]),
82
- ...others
83
- });
84
- }
85
- function ActiveWatcher({ active, onChange }) {
86
- const prev = useRef(null);
87
- useEffect(() => {
88
- if (prev.current !== active) {
89
- onChange?.(active?.value);
90
- prev.current = active;
91
- }
92
- }, [active, onChange]);
93
- return null;
94
- }
95
- function OptionContent({ label, description, icon }) {
96
- return /* @__PURE__ */ jsxs("span", {
97
- className: cx("flex gap-1.5", description ? "items-start min-w-0" : "items-center truncate"),
98
- ...truncationTooltipProps(label, (anchor) => anchor.lastElementChild),
99
- children: [icon, description ? /* @__PURE__ */ jsxs("span", {
100
- className: "flex flex-col min-w-0",
101
- children: [/* @__PURE__ */ jsx("span", {
102
- className: "truncate",
103
- children: label
104
- }), /* @__PURE__ */ jsx("span", {
105
- className: "text-(--theme-muted-text-color) text-xs leading-snug",
106
- children: description
107
- })]
108
- }) : /* @__PURE__ */ jsx("span", {
109
- className: "truncate",
110
- children: label
111
- })]
112
- });
113
- }
114
- function ToggleOption({ option, category, expanded, onToggle, ...virtualRowProps }) {
115
- return /* @__PURE__ */ jsx(ComboboxOption, {
116
- ...virtualRowProps,
117
- "data-testid": "combobox-toggle",
118
- value: option,
119
- className: "w-full h-10 flex items-center pl-3",
120
- children: /* @__PURE__ */ jsxs("button", {
121
- type: "button",
122
- "aria-expanded": expanded,
123
- className: "flex items-center gap-1.5 cursor-pointer text-(--theme-muted-text-color) hover:text-(--theme-app)",
124
- onMouseDown: (e) => e.preventDefault(),
125
- onClick: (e) => {
126
- e.preventDefault();
127
- e.stopPropagation();
128
- onToggle(category);
129
- },
130
- children: [/* @__PURE__ */ jsx(CaretDownIcon, { className: cx("w-3 h-3", !expanded && "-rotate-90") }), option.label]
131
- })
132
- });
133
- }
134
- 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 }) {
135
- const DEBOUNCE_MS = 500;
136
- const t = useStrings().dropdown;
137
- const [query, setQuery] = useState("");
138
- const [selectedIconWidth, setSelectedIconWidth] = useState(0);
139
- const selectedIconRef = useCallback((node) => {
140
- setSelectedIconWidth(node?.offsetWidth ?? 0);
141
- }, []);
142
- const selectedIcon = query === "" ? value?.icon : void 0;
143
- const [referenceElement, setReferenceElement] = useState(null);
144
- const [popperElement, setPopperElement] = useState(null);
145
- const [boundaryEl, setBoundaryEl] = useState(null);
146
- useEffect(() => {
147
- if (!referenceElement) {
148
- setBoundaryEl(null);
149
- return;
150
- }
151
- const ref = referenceElement;
152
- const dialog = ref.closest("[role=\"dialog\"]");
153
- if (!dialog) {
154
- setBoundaryEl(null);
155
- return;
156
- }
157
- let node = ref.parentElement;
158
- while (node) {
159
- const style = getComputedStyle(node);
160
- if (/(auto|scroll|hidden)/.test(`${style.overflowX} ${style.overflowY}`)) {
161
- setBoundaryEl(node);
162
- return;
163
- }
164
- if (node === dialog) break;
165
- node = node.parentElement;
166
- }
167
- setBoundaryEl(dialog);
168
- }, [referenceElement]);
169
- const sameWidthModifier = useMemo(() => ({
170
- name: "sameWidth",
171
- enabled: true,
172
- phase: "beforeWrite",
173
- requires: ["computeStyles"],
174
- fn: ({ state }) => {
175
- const popperStyles = state.styles["popper"];
176
- if (popperStyles) popperStyles.width = `${state.rects.reference.width}px`;
177
- },
178
- effect: ({ state }) => {
179
- const { popper, reference } = state.elements;
180
- if (reference instanceof HTMLElement) popper.style.width = `${reference.offsetWidth}px`;
181
- }
182
- }), []);
183
- const { styles, attributes } = usePopper(referenceElement, popperElement, {
184
- strategy: "fixed",
185
- modifiers: useMemo(() => boundaryEl ? [
186
- sameWidthModifier,
187
- {
188
- name: "flip",
189
- options: { boundary: boundaryEl }
190
- },
191
- {
192
- name: "preventOverflow",
193
- options: { boundary: boundaryEl }
194
- }
195
- ] : [sameWidthModifier], [boundaryEl, sameWidthModifier])
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 : 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
- //#region src/components/Listbox.tsx
350
- function CustomListbox({ options = [], handleOptionSelected, type, allowSearch = false, closeOnSelect = true, className = "", invalid = false, required = false, id, "aria-describedby": describedBy }) {
351
- const { dropdown: strings } = useStrings();
352
- const [filter, setFilter] = useState("");
353
- const [controlledOpen, setControlledOpen] = useState(false);
354
- const optionsToShow = options.filter((option) => !option.selected && option.label && option.label.toLowerCase().includes(filter.toLowerCase()));
355
- function useOutsideAlerter(ref) {
356
- useEffect(() => {
357
- function handleClickOutside(event) {
358
- if (ref.current && event.target instanceof Node && !ref.current.contains(event.target)) {
359
- setControlledOpen(false);
360
- setFilter("");
361
- }
362
- }
363
- document.addEventListener("mousedown", handleClickOutside);
364
- return () => {
365
- document.removeEventListener("mousedown", handleClickOutside);
366
- };
367
- }, [ref]);
368
- }
369
- const wrapperRef = useRef(null);
370
- useOutsideAlerter(wrapperRef);
371
- const optionsElement = /* @__PURE__ */ jsxs(ListboxOptions, {
372
- modal: false,
373
- static: true,
374
- className: "absolute w-full py-1 z-50 theme-input rounded-md",
375
- children: [allowSearch && /* @__PURE__ */ jsx("div", {
376
- className: "pl-2 pr-4 mb-1",
377
- children: /* @__PURE__ */ jsx("input", {
378
- autoComplete: "off",
379
- type: "search",
380
- autoFocus: true,
381
- onChange: (e) => setFilter(e.target.value),
382
- value: filter,
383
- className: "w-full p-1 theme-input",
384
- onKeyDown: (e) => {
385
- if (![
386
- "ArrowUp",
387
- "ArrowDown",
388
- "Enter",
389
- "Home",
390
- "End",
391
- "Escape"
392
- ].includes(e.key)) e.stopPropagation();
393
- }
394
- })
395
- }), /* @__PURE__ */ jsx("div", {
396
- className: "overflow-auto max-h-60 theme-panel",
397
- children: optionsToShow.length > 0 ? optionsToShow.map((option, index) => /* @__PURE__ */ jsx(ListboxOption, {
398
- className: "relative hover:theme-hover select-none pl-2 pr-4",
399
- value: option.value,
400
- children: /* @__PURE__ */ jsx("div", {
401
- className: "w-full flex flex-row",
402
- children: /* @__PURE__ */ jsxs("div", {
403
- className: "w-3/4 py-2 flex items-center",
404
- children: [
405
- /* @__PURE__ */ jsx("div", {
406
- className: "w-4 h-6 btn btn-info text-xl line-height-0 mr-2",
407
- children: "+"
408
- }),
409
- option.icon && /* @__PURE__ */ jsx("span", {
410
- className: "mr-2 flex items-center",
411
- children: option.icon
412
- }),
413
- /* @__PURE__ */ jsx("span", {
414
- className: "mr-2",
415
- children: option.label
416
- }),
417
- /* @__PURE__ */ jsx("span", {
418
- className: "italic",
419
- children: option.secondaryLabel
420
- })
421
- ]
422
- })
423
- }, index)
424
- }, index)) : /* @__PURE__ */ jsx("div", {
425
- className: "w-full flex flex-row",
426
- children: /* @__PURE__ */ jsx("div", {
427
- className: "w-3/4 py-2 pl-2 capitalize flex items-center",
428
- children: filter === "" ? `All ${type} Added` : `No ${type} Found`
429
- })
430
- })
431
- })]
432
- });
433
- return /* @__PURE__ */ jsxs(Listbox, {
434
- as: "div",
435
- className: cx("relative mt-1 theme-input border theme-border rounded-md", className),
436
- ref: wrapperRef,
437
- onChange: handleOptionSelected,
438
- children: [/* @__PURE__ */ jsxs(ListboxButton, {
439
- id,
440
- "aria-describedby": describedBy,
441
- "aria-required": required || void 0,
442
- onClick: () => setControlledOpen((prev) => !prev),
443
- className: cx("relative w-full py-2 pl-3 text-left", invalid && "border-red-600 focus:border-red-600 focus:ring-red-500"),
444
- children: [/* @__PURE__ */ jsx("span", {
445
- className: "block truncate",
446
- children: strings.select(type)
447
- }), /* @__PURE__ */ jsx("span", {
448
- className: "pointer-events-none absolute inset-y-0 right-0 flex items-center justify-items-center",
449
- children: /* @__PURE__ */ jsx(AngleDownIcon, {
450
- className: "h-5 w-8",
451
- "aria-hidden": "true"
452
- })
453
- })]
454
- }), closeOnSelect ? /* @__PURE__ */ jsx(Transition, {
455
- leave: "transition ease-in duration-100",
456
- leaveFrom: "opacity-100",
457
- leaveTo: "opacity-0",
458
- children: optionsElement || null
459
- }) : /* @__PURE__ */ jsx(Fragment$1, { children: controlledOpen && optionsElement })]
460
- });
461
- }
462
- //#endregion
463
- //#region src/components/MultiSelect.tsx
464
- function MultiSelectDropdown({ options, value, onChange, id, "aria-labelledby": labelledBy, "aria-describedby": describedBy, required, className, wrapperClassName = "w-full", textBoxClassName, disabled = false, placeholder, loading = false, searchable = true, maxTagCount = 2, compareBy }) {
465
- const strings = useStrings();
466
- const [query, setQuery] = useState("");
467
- const [referenceEl, setReferenceEl] = useState(null);
468
- const [popperEl, setPopperEl] = useState(null);
469
- const { styles, attributes } = usePopper(referenceEl, popperEl, {
470
- placement: "bottom-start",
471
- modifiers: [{
472
- name: "offset",
473
- options: { offset: [0, 4] }
474
- }]
475
- });
476
- const allOptions = useMemo(() => flattenOptions(options), [options]);
477
- const compare = compareBy ?? ((a, b) => a === b);
478
- const selectedOptions = useMemo(() => {
479
- const result = [];
480
- for (const val of value) {
481
- const found = allOptions.find((opt) => isOption(opt) && compare(opt.value, val));
482
- if (found) result.push(found);
483
- }
484
- return result;
485
- }, [
486
- value,
487
- allOptions,
488
- compare
489
- ]);
490
- const filteredOptions = useMemo(() => {
491
- if (!searchable || query.trim() === "") return allOptions;
492
- const result = [];
493
- for (const opt of allOptions) if (isCategory(opt)) {
494
- const matchedChildren = (Array.isArray(opt.options) ? opt.options : []).filter((o) => filterOption(o, query));
495
- if (matchedChildren.length > 0) result.push(opt, ...matchedChildren);
496
- } else if (isOption(opt) && filterOption(opt, query)) result.push(opt);
497
- return result;
498
- }, [
499
- allOptions,
500
- query,
501
- searchable
502
- ]);
503
- const display = useMemo(() => {
504
- const shown = selectedOptions.slice(0, maxTagCount);
505
- return {
506
- label: shown.map((o) => o.label).join(", "),
507
- overflow: selectedOptions.length - shown.length
508
- };
509
- }, [selectedOptions, maxTagCount]);
510
- const handleChange = useCallback((newValues) => {
511
- if (!Array.isArray(newValues)) return;
512
- onChange(newValues);
513
- }, [onChange]);
514
- const isDisabled = disabled || loading;
515
- const isEmpty = filteredOptions.length === 0;
516
- return /* @__PURE__ */ jsx(Combobox, {
517
- multiple: true,
518
- value: Array.isArray(value) ? value : [],
519
- onChange: handleChange,
520
- disabled: isDisabled,
521
- onClose: () => setQuery(""),
522
- by: compare,
523
- children: ({ open }) => /* @__PURE__ */ jsxs("div", {
524
- ref: setReferenceEl,
525
- className: cx("relative", wrapperClassName),
526
- children: [
527
- /* @__PURE__ */ jsx(ComboboxButton, {
528
- as: "div",
529
- id,
530
- "aria-labelledby": labelledBy,
531
- "aria-describedby": describedBy,
532
- "aria-required": required || void 0,
533
- className: cx("theme-input flex items-center cursor-pointer rounded border text-[14px] w-full px-2 pr-8 py-1 min-h-[30px] overflow-hidden", isDisabled && "opacity-50 cursor-not-allowed", textBoxClassName, className),
534
- children: loading ? /* @__PURE__ */ jsx("span", {
535
- className: "theme-muted-text",
536
- children: strings.loading
537
- }) : selectedOptions.length > 0 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
538
- className: "min-w-0 truncate",
539
- children: display.label
540
- }), display.overflow > 0 && /* @__PURE__ */ jsxs("span", {
541
- className: "ml-1 shrink-0 theme-muted-text",
542
- children: ["+", display.overflow]
543
- })] }) : /* @__PURE__ */ jsx("span", {
544
- className: "theme-muted-text truncate",
545
- children: placeholder
546
- })
547
- }),
548
- /* @__PURE__ */ jsx(DropdownCaret, {}),
549
- open && /* @__PURE__ */ jsxs(ComboboxOptions, {
550
- modal: false,
551
- ref: setPopperEl,
552
- static: true,
553
- "data-testid": "msd-list",
554
- style: styles["popper"],
555
- ...attributes["popper"],
556
- className: "theme-panel z-10 max-h-60 w-full overflow-auto rounded-md shadow-lg focus:outline-none",
557
- children: [searchable && /* @__PURE__ */ jsx("div", {
558
- className: "sticky top-0 theme-panel p-2 border-b z-10",
559
- children: /* @__PURE__ */ jsx("input", {
560
- placeholder,
561
- "data-1p-ignore": true,
562
- autoComplete: "off",
563
- type: "text",
564
- className: "theme-input w-full",
565
- value: query,
566
- onChange: (e) => setQuery(e.target.value),
567
- onKeyDown: (e) => e.stopPropagation(),
568
- autoFocus: true
569
- })
570
- }), /* @__PURE__ */ jsx("div", {
571
- className: "py-1",
572
- children: isEmpty ? /* @__PURE__ */ jsx("div", {
573
- className: "px-4 py-2 text-sm theme-muted-text",
574
- children: strings.dropdown.noOptionsFound
575
- }) : filteredOptions.map((opt, index) => {
576
- if (isCategory(opt)) return /* @__PURE__ */ jsx("li", {
577
- role: "presentation",
578
- className: "px-4 py-2 text-sm font-bold theme-muted-text",
579
- children: opt.category
580
- }, `category-${opt.category ?? "uncat"}-${index}`);
581
- const option = opt;
582
- return /* @__PURE__ */ jsx(ComboboxOption, {
583
- value: option.value,
584
- disabled: option.disabled ?? false,
585
- "data-testid": `msd-option-${String(option.value)}`,
586
- className: ({ focus }) => cx("relative cursor-pointer select-none py-2 pl-10 pr-4 text-sm", focus && "theme-hover", option.disabled && "cursor-not-allowed opacity-50"),
587
- children: ({ selected }) => /* @__PURE__ */ jsxs("div", {
588
- className: "flex items-center",
589
- children: [
590
- /* @__PURE__ */ jsx("span", {
591
- className: "absolute inset-y-0 left-0 flex items-center pl-3",
592
- children: /* @__PURE__ */ jsx("input", {
593
- autoComplete: "off",
594
- type: "checkbox",
595
- checked: selected,
596
- readOnly: true,
597
- tabIndex: -1,
598
- className: "h-4 w-4 cursor-pointer",
599
- "aria-hidden": "true"
600
- })
601
- }),
602
- option.icon && /* @__PURE__ */ jsx("span", {
603
- className: "mr-2 flex items-center",
604
- children: option.icon
605
- }),
606
- /* @__PURE__ */ jsx("div", {
607
- className: "flex flex-col",
608
- children: /* @__PURE__ */ jsx("span", {
609
- className: "block truncate",
610
- children: option.label
611
- })
612
- })
613
- ]
614
- })
615
- }, `option-${String(option.value)}`);
616
- })
617
- })]
618
- })
619
- ]
620
- })
621
- });
622
- }
623
- //#endregion
624
- //#region src/components/CollapsiblePanel.tsx
625
- var noop = () => {};
626
- function ControlledCollapsiblePanel({ title = "", children, open, setOpen, onClick = noop, wrapperElement, customizedButton = null, titleAction, className }) {
627
- const toggleOpen = useCallback(() => {
628
- if (onClick) onClick();
629
- setOpen?.((open) => !open);
630
- }, [setOpen, onClick]);
631
- const contentId = React.useId();
632
- const Wrapper = wrapperElement ? wrapperElement : React.Fragment;
633
- return React.isValidElement(title) ? /* @__PURE__ */ jsxs(Fragment$1, { children: [title, /* @__PURE__ */ jsx(Wrapper, { children: /* @__PURE__ */ jsx(AnimateHeight, {
634
- duration: 300,
635
- height: open ? "auto" : 0,
636
- children
637
- }) })] }) : /* @__PURE__ */ jsxs("div", {
638
- className: cx("border border-solid rounded-2xl border-(--theme-border) bg-(--theme-panel-bg) text-(--theme-panel) mb-1 w-full", className),
639
- children: [/* @__PURE__ */ jsxs("div", {
640
- className: cx(!open && "text-(--theme-muted-text-color)", "w-full flex items-center transform ease-in transition text-sm py-3 px-2 cursor-pointer"),
641
- children: [
642
- /* @__PURE__ */ jsxs("button", {
643
- type: "button",
644
- "aria-expanded": !!open,
645
- "aria-controls": contentId,
646
- className: cx("flex items-center text-left cursor-pointer", !titleAction && "w-full"),
647
- onClick: toggleOpen,
648
- children: [/* @__PURE__ */ jsx(AngleRightIcon, { className: cx(open && "transform rotate-90", "px-1 ml-1 text-[1.25rem] transition ease-in") }), /* @__PURE__ */ jsx("span", {
649
- className: "px-2 font-bold select-none",
650
- children: title?.toString()
651
- })]
652
- }),
653
- titleAction,
654
- /* @__PURE__ */ jsx("div", {
655
- className: "ml-auto",
656
- children: customizedButton
657
- })
658
- ]
659
- }), /* @__PURE__ */ jsx(AnimateHeight, {
660
- id: contentId,
661
- duration: 300,
662
- height: open ? "auto" : 0,
663
- children
664
- })]
665
- });
666
- }
667
- function UncontrolledCollapsiblePanel({ title, children, onClick, wrapperElement, initialState = true, className, customizedButton = null }) {
668
- const [open, setOpen] = React.useState(initialState);
669
- return /* @__PURE__ */ jsx(ControlledCollapsiblePanel, {
670
- title: typeof title === "function" ? title(open, setOpen) : title,
671
- open,
672
- setOpen,
673
- onClick,
674
- wrapperElement,
675
- className,
676
- customizedButton,
677
- children
678
- });
679
- }
680
- function MaybeCollapsible({ className, initialState, children, title, customizedButton, collapsible }) {
681
- if (collapsible) return /* @__PURE__ */ jsx(UncontrolledCollapsiblePanel, {
682
- className,
683
- initialState,
684
- title,
685
- customizedButton,
686
- children
687
- });
688
- return /* @__PURE__ */ jsx("div", {
689
- className,
690
- children
691
- });
692
- }
693
- //#endregion
694
- //#region src/components/SectionHeader.tsx
695
- function SectionHeader({ children, className = "", size = "md" }) {
696
- return /* @__PURE__ */ jsx("div", {
697
- className: cx("w-full font-semibold", size === "sm" ? "mb-2 text-sm theme-text" : "text-lg", className),
698
- children
699
- });
700
- }
701
- //#endregion
702
- //#region src/components/SwitchToggle.tsx
703
- function SwitchToggle({ onChange, id, "aria-describedby": describedBy, value = void 0, yesLabel = "Yes", noLabel = "No", disabled = false, datatip = "", invalid = false }) {
704
- const [enabled, setEnabled] = useState(value ?? false);
705
- const [isFocused, setIsFocused] = useState(false);
706
- const setIsEnabled = (e) => {
707
- setEnabled(e);
708
- onChange(e);
709
- };
710
- useEffect(() => {
711
- if (value !== void 0) setEnabled(value);
712
- }, [value]);
713
- const checked = value ?? enabled;
714
- return /* @__PURE__ */ jsx("div", {
715
- ...datatip ? {
716
- "data-tooltip-content": datatip,
717
- "data-tooltip-id": TOOLTIP_ID
718
- } : {},
719
- className: cx("w-[198px] h-[30px] overflow-hidden shadow-sm rounded-md cursor-pointer ring-(--theme-border) ring-1", invalid && "border-red-600 focus:border-red-600 focus:ring-red-500 ring-1 ring-red-500", !invalid && isFocused && "ring-1 ring-[rgba(82,168,236,.8)] drop-shadow-[0_1px_2px_rgba(82,168,236,0.8)]"),
720
- children: /* @__PURE__ */ jsx(Switch, {
721
- id,
722
- "aria-describedby": describedBy,
723
- checked,
724
- onChange: setIsEnabled,
725
- className: "text-white text-sm shadow-sm rounded-md cursor-pointer",
726
- onClick: (e) => e.stopPropagation(),
727
- onFocus: () => setIsFocused(true),
728
- onBlur: () => setIsFocused(false),
729
- children: /* @__PURE__ */ jsxs("div", {
730
- className: cx(checked ? "translate-x-0" : "-translate-x-[100px]", "relative transform flex flex-row ease-in-out duration-500", disabled && "cursor-not-allowed opacity-50"),
731
- children: [
732
- /* @__PURE__ */ jsx("div", {
733
- className: "inline text-center capitalize px-2 py-1 w-[99px] border-0",
734
- style: {
735
- background: `linear-gradient(
736
- to bottom,
737
- var(--theme-element, #04c) 0%,
738
- var(--theme-element, #08c) 100%
739
- )`,
740
- color: "var(--theme-element-text, #ffffff)"
741
- },
742
- children: yesLabel
743
- }),
744
- /* @__PURE__ */ jsx("div", { className: "inline px-2 py-1 h-8 w-[99px] bg-linear-to-b from-white to-[#e6e6e6]" }),
745
- /* @__PURE__ */ jsx("div", {
746
- className: "inline text-center capitalize px-2 py-1 w-[99px] bg-linear-to-b from-[#e6e6e6] to-white bg-[#04c] text-black",
747
- children: noLabel
748
- })
749
- ]
750
- })
751
- })
752
- });
753
- }
754
- //#endregion
755
- export { UncontrolledCollapsiblePanel as a, Dropdown as c, MaybeCollapsible as i, SectionHeader as n, MultiSelectDropdown as o, ControlledCollapsiblePanel as r, CustomListbox as s, SwitchToggle as t };