@parallelworks/ui 0.41.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +25 -0
  2. package/dist/ai/components/AllocationSelector.d.ts +3 -4
  3. package/dist/ai/components/AllocationSelector.js +37 -33
  4. package/dist/ai/components/AttachmentManager.js +7 -7
  5. package/dist/ai/components/AttachmentUpload.js +5 -5
  6. package/dist/ai/components/BranchNavigator.js +1 -1
  7. package/dist/ai/components/ChatEmptyState.js +2 -2
  8. package/dist/ai/components/ChatInput.js +10 -8
  9. package/dist/ai/components/ChatLayout.js +4 -5
  10. package/dist/ai/components/ChatMessage.js +12 -12
  11. package/dist/ai/components/ChatMessageList.js +9 -9
  12. package/dist/ai/components/ChatSidebar.js +8 -9
  13. package/dist/ai/components/ChatThread.js +4 -4
  14. package/dist/ai/components/ComposerChrome.d.ts +2 -2
  15. package/dist/ai/components/ComposerChrome.js +3 -6
  16. package/dist/ai/components/DragOverlay.js +2 -2
  17. package/dist/ai/components/ModelSelector.d.ts +5 -3
  18. package/dist/ai/components/ModelSelector.js +102 -339
  19. package/dist/ai/components/PastedText.js +11 -11
  20. package/dist/ai/components/ProviderIssueBanner.d.ts +2 -0
  21. package/dist/ai/components/ProviderIssueBanner.js +34 -16
  22. package/dist/ai/components/Reasoning.js +4 -4
  23. package/dist/ai/components/ShareDialog.js +43 -35
  24. package/dist/ai/components/SlashMenu.d.ts +12 -2
  25. package/dist/ai/components/SlashMenu.js +29 -13
  26. package/dist/ai/components/agent/ActivityLine.js +3 -3
  27. package/dist/ai/components/agent/AgentMessageParts.js +20 -20
  28. package/dist/ai/components/agent/PermissionPicker.js +13 -11
  29. package/dist/ai/components/conversationActions.d.ts +4 -6
  30. package/dist/ai/components/conversationActions.js +9 -13
  31. package/dist/ai/core/ChatProvider.js +1 -1
  32. package/dist/ai/core/config.js +1 -1
  33. package/dist/ai/core/providerIssues.d.ts +7 -0
  34. package/dist/ai/core/providerIssues.js +9 -1
  35. package/dist/ai/core/useKeyboardShortcuts.d.ts +4 -0
  36. package/dist/ai/core/useKeyboardShortcuts.js +8 -2
  37. package/dist/ai/index.d.ts +0 -1
  38. package/dist/ai/index.js +1 -2
  39. package/dist/ai/strings.d.ts +19 -0
  40. package/dist/ai/strings.js +18 -1
  41. package/dist/ai/ui/Avatar.js +5 -5
  42. package/dist/ai/ui/ConversationSidebar.d.ts +0 -1
  43. package/dist/ai/ui/ConversationSidebar.js +6 -7
  44. package/dist/ai/ui/Markdown.js +3 -3
  45. package/dist/ai/ui/Notice.js +6 -6
  46. package/dist/ai/ui/chip.d.ts +4 -0
  47. package/dist/ai/ui/chip.js +8 -0
  48. package/dist/ai/ui/sidebar.d.ts +6 -5
  49. package/dist/ai/ui/sidebar.js +39 -43
  50. package/dist/components/ActionMenu.d.ts +13 -0
  51. package/dist/components/ActionMenu.js +30 -0
  52. package/dist/components/Avatar.js +6 -6
  53. package/dist/components/Breadcrumbs.js +1 -1
  54. package/dist/components/Button.js +10 -10
  55. package/dist/components/Callout.js +2 -2
  56. package/dist/components/Card.js +3 -3
  57. package/dist/components/Combobox.d.ts +49 -0
  58. package/dist/components/Combobox.js +405 -0
  59. package/dist/components/ConfirmModal.js +11 -11
  60. package/dist/components/ContextMenu.d.ts +23 -0
  61. package/dist/components/ContextMenu.js +89 -0
  62. package/dist/components/CopyToClipboard.js +2 -2
  63. package/dist/components/CreateModal.d.ts +19 -38
  64. package/dist/components/CreateModal.js +116 -267
  65. package/dist/components/DescriptionList.js +8 -8
  66. package/dist/components/Filter.js +2 -2
  67. package/dist/components/FilterPill.js +2 -2
  68. package/dist/components/HoverCard.d.ts +14 -0
  69. package/dist/components/HoverCard.js +33 -0
  70. package/dist/components/IconButton.d.ts +5 -5
  71. package/dist/components/IconButton.js +18 -22
  72. package/dist/components/InfoTip.d.ts +15 -0
  73. package/dist/components/InfoTip.js +60 -0
  74. package/dist/components/Input.js +5 -5
  75. package/dist/components/LetterBadge.js +2 -2
  76. package/dist/components/Loader.js +3 -3
  77. package/dist/components/Markdown.js +1 -1
  78. package/dist/components/MarkdownImpl.js +2 -2
  79. package/dist/components/Menu.d.ts +33 -0
  80. package/dist/components/Menu.js +86 -0
  81. package/dist/components/MenuEntries.d.ts +56 -0
  82. package/dist/components/MenuEntries.js +123 -0
  83. package/dist/components/Modal.d.ts +29 -0
  84. package/dist/components/Modal.js +47 -0
  85. package/dist/components/Overview.js +11 -10
  86. package/dist/components/PageHeader.d.ts +10 -16
  87. package/dist/components/PageHeader.js +69 -95
  88. package/dist/components/Pagination.js +5 -5
  89. package/dist/components/Provider.d.ts +5 -11
  90. package/dist/components/Provider.js +11 -14
  91. package/dist/components/Radio.d.ts +8 -0
  92. package/dist/components/Radio.js +16 -0
  93. package/dist/components/SectionHeader.js +2 -2
  94. package/dist/components/SegmentedControl.d.ts +6 -5
  95. package/dist/components/SegmentedControl.js +34 -30
  96. package/dist/components/Select.d.ts +27 -0
  97. package/dist/components/Select.js +78 -0
  98. package/dist/components/SettingModeOption.d.ts +5 -8
  99. package/dist/components/SettingModeOption.js +10 -12
  100. package/dist/components/SettingRow.js +4 -4
  101. package/dist/components/SettingsCard.js +4 -4
  102. package/dist/components/SettingsGroup.js +2 -2
  103. package/dist/components/Sort.js +1 -1
  104. package/dist/components/StatusBadge.js +7 -7
  105. package/dist/components/StatusIcons.js +4 -4
  106. package/dist/components/Switch.d.ts +22 -0
  107. package/dist/components/Switch.js +28 -0
  108. package/dist/components/Table.js +11 -11
  109. package/dist/components/Tooltip.d.ts +24 -20
  110. package/dist/components/Tooltip.js +58 -76
  111. package/dist/components/comboboxItems.d.ts +24 -0
  112. package/dist/components/comboboxItems.js +10 -0
  113. package/dist/components/floating.d.ts +14 -0
  114. package/dist/components/floating.js +21 -0
  115. package/dist/components/search.d.ts +2 -0
  116. package/dist/components/search.js +14 -0
  117. package/dist/editor/Editor.js +1 -1
  118. package/dist/editor/EditorField.js +16 -21
  119. package/dist/editor/FormCodePanel.js +19 -19
  120. package/dist/editor/Monaco.js +3 -3
  121. package/dist/file-explorer/FileExplorer.js +77 -81
  122. package/dist/file-explorer/FileExplorerContext.js +2 -2
  123. package/dist/file-explorer/FilePreview/CodePreviewEditor.js +1 -1
  124. package/dist/file-explorer/FilePreview/Inline.js +1 -1
  125. package/dist/file-explorer/FilePreview/StreamedBadge.js +5 -6
  126. package/dist/file-explorer/FilePreview/Viewer.js +8 -8
  127. package/dist/file-explorer/FilePreview/index.d.ts +1 -1
  128. package/dist/file-explorer/FilePreview/index.js +49 -83
  129. package/dist/file-explorer/FileRow.d.ts +4 -3
  130. package/dist/file-explorer/FileRow.js +32 -38
  131. package/dist/file-explorer/FileRowsWindow.d.ts +3 -2
  132. package/dist/file-explorer/FileRowsWindow.js +4 -4
  133. package/dist/file-explorer/FileTable.d.ts +3 -2
  134. package/dist/file-explorer/FileTable.js +3 -3
  135. package/dist/file-explorer/LoadMoreRow.js +1 -1
  136. package/dist/file-explorer/TreeView.js +11 -16
  137. package/dist/file-explorer/helpers.js +11 -12
  138. package/dist/file-explorer/toasts.js +11 -11
  139. package/dist/form/FieldGroup.d.ts +11 -0
  140. package/dist/form/FieldGroup.js +36 -0
  141. package/dist/form/FieldWrapper.js +4 -4
  142. package/dist/form/Fields/BooleanField.js +23 -33
  143. package/dist/form/Fields/CheckboxGroupField.d.ts +1 -1
  144. package/dist/form/Fields/CheckboxGroupField.js +9 -13
  145. package/dist/form/Fields/ColorField.d.ts +1 -2
  146. package/dist/form/Fields/ColorField.js +6 -11
  147. package/dist/form/Fields/DropdownField.d.ts +3 -13
  148. package/dist/form/Fields/DropdownField.js +40 -27
  149. package/dist/form/Fields/DurationField.d.ts +1 -2
  150. package/dist/form/Fields/DurationField.js +25 -32
  151. package/dist/form/Fields/LabelField.js +2 -2
  152. package/dist/form/Fields/MultiDropdownField.d.ts +6 -12
  153. package/dist/form/Fields/MultiDropdownField.js +31 -22
  154. package/dist/form/Fields/NumberField.d.ts +1 -1
  155. package/dist/form/Fields/NumberField.js +65 -35
  156. package/dist/form/Fields/ObjectField.d.ts +1 -1
  157. package/dist/form/Fields/ObjectField.js +12 -43
  158. package/dist/form/Fields/RadioField.d.ts +1 -1
  159. package/dist/form/Fields/RadioField.js +30 -41
  160. package/dist/form/Fields/RangeField.d.ts +1 -2
  161. package/dist/form/Fields/RangeField.js +23 -16
  162. package/dist/form/Fields/StringField.d.ts +1 -2
  163. package/dist/form/Fields/StringField.js +58 -26
  164. package/dist/form/Fields/TextAreaField.js +12 -10
  165. package/dist/form/Form.d.ts +30 -48
  166. package/dist/form/Form.js +306 -412
  167. package/dist/form/FormLayout.js +9 -9
  168. package/dist/form/Wizard/WizardContainer.d.ts +1 -4
  169. package/dist/form/Wizard/WizardContainer.js +40 -56
  170. package/dist/form/Wizard/WizardNavigation.js +1 -1
  171. package/dist/form/Wizard/WizardStepContent.d.ts +1 -5
  172. package/dist/form/Wizard/WizardStepContent.js +11 -16
  173. package/dist/form/Wizard/WizardStepIndicator.js +6 -6
  174. package/dist/form/Wizard/types.d.ts +0 -14
  175. package/dist/form/fieldRegistry.d.ts +1 -1
  176. package/dist/form/fieldRegistry.js +6 -6
  177. package/dist/form/formEditing.js +1 -1
  178. package/dist/form/index.d.ts +5 -4
  179. package/dist/form/index.js +6 -7
  180. package/dist/form/lib.js +3 -2
  181. package/dist/form/types/fieldComponentTypes.d.ts +8 -10
  182. package/dist/form/useChoiceField.d.ts +18 -0
  183. package/dist/form/useChoiceField.js +46 -0
  184. package/dist/form/useFieldValue.d.ts +7 -0
  185. package/dist/form/useFieldValue.js +20 -0
  186. package/dist/form/useParsedOpts.d.ts +3 -1
  187. package/dist/form/useParsedOpts.js +12 -17
  188. package/dist/form/utils/dependentOptions.d.ts +8 -4
  189. package/dist/form/utils/dependentOptions.js +25 -17
  190. package/dist/form/utils/fieldItems.d.ts +32 -0
  191. package/dist/form/utils/fieldItems.js +32 -0
  192. package/dist/form/utils/fieldPath.d.ts +10 -0
  193. package/dist/form/utils/fieldPath.js +20 -0
  194. package/dist/form/utils/shareEqual.d.ts +6 -0
  195. package/dist/form/utils/shareEqual.js +38 -0
  196. package/dist/graph/AnnotationBanner.js +8 -8
  197. package/dist/graph/Collapse.d.ts +1 -0
  198. package/dist/graph/Collapse.js +6 -27
  199. package/dist/graph/Connectors.js +5 -5
  200. package/dist/graph/DependencyGraph.js +20 -19
  201. package/dist/graph/GraphEditor.js +30 -41
  202. package/dist/graph/GraphEditorDialogs.js +17 -17
  203. package/dist/graph/GraphNode.js +1 -1
  204. package/dist/graph/InputDialog.js +19 -22
  205. package/dist/graph/InputsEditor.js +58 -66
  206. package/dist/graph/JobSummary.js +42 -39
  207. package/dist/graph/MatrixGroup.js +1 -1
  208. package/dist/graph/ProblemsButton.js +18 -19
  209. package/dist/graph/Reveal.js +1 -1
  210. package/dist/graph/ShortcutsButton.js +15 -18
  211. package/dist/graph/SuggestionInput.d.ts +5 -10
  212. package/dist/graph/SuggestionInput.js +14 -18
  213. package/dist/graph/ToolbarPopover.d.ts +11 -6
  214. package/dist/graph/ToolbarPopover.js +35 -67
  215. package/dist/graph/TreeView.js +24 -37
  216. package/dist/graph/WorkflowSettingsDialog.js +4 -4
  217. package/dist/graph/editorChrome.js +13 -12
  218. package/dist/graph/editorFields.js +29 -29
  219. package/dist/graph/editorPrimitives.d.ts +1 -1
  220. package/dist/graph/editorPrimitives.js +10 -7
  221. package/dist/graph/editorRows.js +103 -97
  222. package/dist/graph/fieldProblems.js +2 -2
  223. package/dist/graph/graphEditorState.d.ts +4 -3
  224. package/dist/graph/inputRefs.js +9 -9
  225. package/dist/graph/settingsViews.js +6 -7
  226. package/dist/graph/stepWith.js +6 -6
  227. package/dist/index.d.ts +14 -15
  228. package/dist/index.js +15 -14
  229. package/dist/list/ActionToolbar.d.ts +6 -14
  230. package/dist/list/ActionToolbar.js +48 -96
  231. package/dist/list/ListPage.d.ts +6 -12
  232. package/dist/list/ListPage.js +46 -29
  233. package/dist/list/ListPager.js +4 -4
  234. package/dist/list/ListTable.js +5 -5
  235. package/dist/list/ListViewControls.d.ts +5 -4
  236. package/dist/list/ListViewControls.js +177 -267
  237. package/dist/list/UserHoverCard.d.ts +3 -17
  238. package/dist/list/UserHoverCard.js +21 -45
  239. package/dist/list/index.d.ts +3 -4
  240. package/dist/list/index.js +3 -4
  241. package/dist/list/listSearch.js +12 -11
  242. package/dist/list/rowMenu.d.ts +68 -0
  243. package/dist/list/rowMenu.js +136 -0
  244. package/dist/logviewer/LogViewer.js +26 -26
  245. package/dist/styles.css +1 -1
  246. package/package.json +7 -13
  247. package/dist/ai/ui/Dropdown.d.ts +0 -31
  248. package/dist/ai/ui/Dropdown.js +0 -110
  249. package/dist/components/AddMenu.d.ts +0 -18
  250. package/dist/components/AddMenu.js +0 -46
  251. package/dist/components/BareModal.d.ts +0 -17
  252. package/dist/components/BareModal.js +0 -77
  253. package/dist/components/CollapsiblePanel.d.ts +0 -27
  254. package/dist/components/CollapsiblePanel.js +0 -77
  255. package/dist/components/Dropdown.d.ts +0 -28
  256. package/dist/components/Dropdown.js +0 -355
  257. package/dist/components/Listbox.d.ts +0 -21
  258. package/dist/components/Listbox.js +0 -119
  259. package/dist/components/MultiSelect.d.ts +0 -22
  260. package/dist/components/MultiSelect.js +0 -168
  261. package/dist/components/SwitchToggle.d.ts +0 -15
  262. package/dist/components/SwitchToggle.js +0 -57
  263. package/dist/components/SwitchToggleSmall.d.ts +0 -6
  264. package/dist/components/SwitchToggleSmall.js +0 -14
  265. package/dist/components/Toggle.d.ts +0 -6
  266. package/dist/components/Toggle.js +0 -20
  267. package/dist/components/dropdownUtils.d.ts +0 -37
  268. package/dist/components/dropdownUtils.js +0 -99
  269. package/dist/form/SpecialTypes/DropdownWrapper.d.ts +0 -25
  270. package/dist/form/SpecialTypes/DropdownWrapper.js +0 -28
  271. package/dist/form/SpecialTypes/FormikCustomDropdown.d.ts +0 -51
  272. package/dist/form/SpecialTypes/FormikCustomDropdown.js +0 -119
  273. package/dist/form/SpecialTypes/FormikCustomInput.d.ts +0 -19
  274. package/dist/form/SpecialTypes/FormikCustomInput.js +0 -121
  275. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.d.ts +0 -13
  276. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +0 -31
  277. package/dist/form/SpecialTypes/FormikNumericInput.d.ts +0 -9
  278. package/dist/form/SpecialTypes/FormikNumericInput.js +0 -60
  279. package/dist/form/SpecialTypes/index.d.ts +0 -3
  280. package/dist/list/HoverCard.d.ts +0 -24
  281. package/dist/list/HoverCard.js +0 -73
  282. package/dist/list/RowContextMenu.d.ts +0 -127
  283. package/dist/list/RowContextMenu.js +0 -515
@@ -1,40 +1,22 @@
1
- import { useStrings } from "./Provider.js";
2
1
  import { FaChevronDown } from "../icons/fa/FaChevronDown.js";
3
- import { HiQuestionMarkCircle } from "../icons/hi/HiQuestionMarkCircle.js";
4
2
  import { IoHeart } from "../icons/io5/IoHeart.js";
5
3
  import { IoHeartOutline } from "../icons/io5/IoHeartOutline.js";
6
4
  import { LuChevronRight } from "../icons/lu/LuChevronRight.js";
7
- import { TOOLTIP_ID } from "./Tooltip.js";
8
- import { AddMenu } from "./AddMenu.js";
9
- import { BareModal, modalPanelClasses } from "./BareModal.js";
5
+ import { Tooltip } from "./Tooltip.js";
6
+ import { useStrings } from "./Provider.js";
7
+ import { ActionMenu } from "./ActionMenu.js";
8
+ import { comboboxLeaves } from "./comboboxItems.js";
9
+ import { Autocomplete, Combobox } from "./Combobox.js";
10
10
  import { ghostButtonClasses } from "./ghostButton.js";
11
- import { filterOption, toggleSetMember } from "./dropdownUtils.js";
12
- import { Combobox, ComboboxInput, ComboboxOption, ComboboxOptions, Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react";
13
- import cx from "classnames";
14
- import { useCallback, useEffect, useRef, useState } from "react";
15
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
+ import { Modal } from "./Modal.js";
12
+ import { InfoTip } from "./InfoTip.js";
13
+ import { Switch } from "./Switch.js";
14
+ import { clsx } from "clsx";
15
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
+ import { useEffect, useId, useRef, useState } from "react";
17
+ import { Button } from "@base-ui/react/button";
18
+ import { Toggle } from "@base-ui/react/toggle";
16
19
  //#region src/components/CreateModal.tsx
17
- /** Small info icon that surfaces field help via the global tooltip. */
18
- function FieldHelp({ tooltip }) {
19
- if (!tooltip) return null;
20
- return /* @__PURE__ */ jsx("span", {
21
- "data-tooltip-id": TOOLTIP_ID,
22
- "data-tooltip-content": tooltip,
23
- className: "inline-flex cursor-help text-(--theme-muted-text-color)",
24
- children: /* @__PURE__ */ jsx(HiQuestionMarkCircle, { className: "w-3 h-3" })
25
- });
26
- }
27
- /** Anchors the tooltip on a non-focusable span so it opens on hover but not when focus returns to the button after its menu/toggle closes (which would leave it stuck). */
28
- function PillTooltip({ content, className, children }) {
29
- return /* @__PURE__ */ jsx("span", {
30
- ...content ? {
31
- "data-tooltip-id": TOOLTIP_ID,
32
- "data-tooltip-content": content
33
- } : {},
34
- className: cx("inline-flex items-center gap-1.5", className),
35
- children
36
- });
37
- }
38
20
  /** Submits on Enter in the name field or ⌘/Ctrl+Enter from anywhere in the panel. */
39
21
  function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceholder, hideName = false, initialName, showDescription = true, descriptionPlaceholder, submitLabel, submittingLabel, validateName, sanitizeName, nameHint, children, properties, advanced, submitDisabled = false, hideSubmit = false, nameOptional = false, onNameChange, dirty = false, showFavorite = false, onSubmit }) {
40
22
  const t = useStrings().modal;
@@ -59,13 +41,6 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
59
41
  setFavorite(false);
60
42
  setNameTouched(false);
61
43
  setInteracted(false);
62
- requestAnimationFrame(() => {
63
- const input = nameRef.current;
64
- const dialog = input?.closest("[role=\"dialog\"]");
65
- const active = document.activeElement;
66
- if (dialog?.contains(active) && active !== dialog) return;
67
- input?.focus();
68
- });
69
44
  }
70
45
  }, [open, initialName]);
71
46
  const nameError = name.trim() ? validateName?.(name.trim()) ?? null : null;
@@ -95,16 +70,17 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
95
70
  }
96
71
  if (close) onClose();
97
72
  };
98
- return /* @__PURE__ */ jsxs(BareModal, {
73
+ return /* @__PURE__ */ jsxs(Modal, {
99
74
  open,
100
75
  onClose,
101
- ariaLabel: `${submitText}: ${typeLabel}`,
102
- className: cx(modalPanelClasses, "w-[560px] max-w-full flex flex-col max-h-full"),
103
- preventClose: isDirty,
104
- onPanelKeyDown: (e) => {
76
+ "aria-label": `${submitText}: ${typeLabel}`,
77
+ className: "w-[560px] max-w-full flex flex-col max-h-full",
78
+ dismissible: !isDirty,
79
+ initialFocus: () => nameRef.current ?? true,
80
+ onKeyDown: (e) => {
105
81
  if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) handleSubmit();
106
82
  },
107
- onPanelMouseDown: (e) => {
83
+ onMouseDown: (e) => {
108
84
  if (e.target instanceof Element && !e.target.closest("input, textarea, button, a, select, label, code, pre, .select-all")) e.preventDefault();
109
85
  },
110
86
  children: [/* @__PURE__ */ jsxs("div", {
@@ -114,11 +90,10 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
114
90
  /* @__PURE__ */ jsxs("div", {
115
91
  className: "px-4 pt-4",
116
92
  children: [
117
- typeMenu && typeMenu.length > 0 ? /* @__PURE__ */ jsxs(AddMenu, {
93
+ typeMenu && typeMenu.length > 0 ? /* @__PURE__ */ jsxs(ActionMenu, {
118
94
  items: typeMenu,
119
95
  label: typeLabel,
120
- zClassName: "z-[9999]",
121
- buttonClassName: "inline-flex items-center gap-1.5 px-1.5 py-1 rounded-md bg-(--theme-muted-panel-bg) text-xs font-medium text-(--theme-muted-text-color) transition-colors hover:text-(--theme-app)",
96
+ triggerClassName: "inline-flex items-center gap-1.5 px-1.5 py-1 rounded-md bg-(--theme-muted-panel-bg) text-xs font-medium text-(--theme-muted-text-color) transition-colors hover:text-(--theme-app)",
122
97
  children: [
123
98
  typeIcon,
124
99
  typeLabel,
@@ -128,7 +103,7 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
128
103
  className: "inline-flex items-center gap-1.5 px-1.5 py-1 rounded-md bg-(--theme-muted-panel-bg) text-xs font-medium text-(--theme-muted-text-color)",
129
104
  children: [typeIcon, typeLabel]
130
105
  }),
131
- hideName ? /* @__PURE__ */ jsx("div", { className: "mt-3" }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
106
+ hideName ? /* @__PURE__ */ jsx("div", { className: "mt-3" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
132
107
  /* @__PURE__ */ jsx("input", {
133
108
  ref: nameRef,
134
109
  type: "text",
@@ -153,7 +128,7 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
153
128
  placeholder: namePlaceholder,
154
129
  "aria-label": namePlaceholder,
155
130
  onAnimationEnd: () => setNameFlash(false),
156
- className: cx("mt-2 -mb-1 -mx-1.5 w-[calc(100%+0.75rem)] rounded-md border-0 px-1.5 py-1 bg-transparent shadow-none text-lg font-medium text-(--theme-app) placeholder:text-(--theme-muted-text-color) focus:outline-none", nameFlash && "animate-field-flash", nameMissing ? "ring-1 ring-(--theme-error)" : "focus:ring-0")
131
+ className: clsx("mt-2 -mb-1 -mx-1.5 w-[calc(100%+0.75rem)] rounded-md border-0 px-1.5 py-1 bg-transparent shadow-none text-lg font-medium text-(--theme-app) placeholder:text-(--theme-muted-text-color) focus:outline-none", nameFlash && "animate-field-flash", nameMissing ? "ring-1 ring-(--theme-error)" : "focus:ring-0")
157
132
  }),
158
133
  nameError && /* @__PURE__ */ jsx("p", {
159
134
  className: "mt-1 text-xs text-(--theme-error)",
@@ -187,7 +162,7 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
187
162
  type: "button",
188
163
  onClick: () => setAdvancedOpen((o) => !o),
189
164
  className: "inline-flex items-center gap-1 text-xs font-medium text-(--theme-muted-text-color) hover:text-(--theme-app) transition-colors",
190
- children: [/* @__PURE__ */ jsx(LuChevronRight, { className: cx("w-3 h-3 transition-transform", advancedOpen && "rotate-90") }), t.advanced]
165
+ children: [/* @__PURE__ */ jsx(LuChevronRight, { className: clsx("w-3 h-3 transition-transform", advancedOpen && "rotate-90") }), t.advanced]
191
166
  }), advancedOpen && /* @__PURE__ */ jsx("div", {
192
167
  className: "mt-2",
193
168
  children: advanced
@@ -196,16 +171,13 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
196
171
  ]
197
172
  }), /* @__PURE__ */ jsxs("div", {
198
173
  className: "shrink-0 flex items-center justify-between gap-2 px-4 py-3",
199
- children: [showFavorite ? /* @__PURE__ */ jsx("button", {
200
- type: "button",
201
- role: "switch",
202
- "aria-checked": favorite,
203
- "aria-label": t.favorite,
204
- onClick: () => setFavorite((f) => !f),
205
- className: cx("inline-flex h-8 rounded-md text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-(--theme-focus-ring)", favorite ? "text-(--theme-favorite) bg-(--theme-favorite-muted)" : "text-(--theme-muted-text-color) hover:text-(--theme-app) hover:bg-(--theme-muted-panel-bg)"),
206
- children: /* @__PURE__ */ jsxs(PillTooltip, {
207
- content: favorite ? t.favoriteHintOn : t.favoriteHintOff,
208
- className: "px-2.5",
174
+ children: [showFavorite ? /* @__PURE__ */ jsx(Tooltip, {
175
+ content: favorite ? t.favoriteHintOn : t.favoriteHintOff,
176
+ children: /* @__PURE__ */ jsxs(Toggle, {
177
+ pressed: favorite,
178
+ onPressedChange: setFavorite,
179
+ "aria-label": t.favorite,
180
+ className: clsx("inline-flex h-8 items-center gap-1.5 px-2.5 rounded-md text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-(--theme-focus-ring)", favorite ? "text-(--theme-favorite) bg-(--theme-favorite-muted)" : "text-(--theme-muted-text-color) hover:text-(--theme-app) hover:bg-(--theme-muted-panel-bg)"),
209
181
  children: [favorite ? /* @__PURE__ */ jsx(IoHeart, { className: "w-4 h-4 scale-110 transition-transform" }) : /* @__PURE__ */ jsx(IoHeartOutline, { className: "w-4 h-4 transition-transform" }), favorite ? t.favorited : t.favorite]
210
182
  })
211
183
  }) : /* @__PURE__ */ jsx("span", {}), /* @__PURE__ */ jsxs("div", {
@@ -228,256 +200,133 @@ function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceho
228
200
  }
229
201
  var fieldInputClasses = "w-full h-8 px-2.5 rounded-md border border-(--theme-border) bg-(--theme-input-bg) shadow-none text-sm text-(--theme-app) placeholder:text-(--theme-muted-text-color) transition-colors focus:outline-none focus:ring-0 focus:border-(--theme-element)";
230
202
  var fieldLabelClasses = "block mb-1 text-xs font-medium text-(--theme-muted-text-color)";
203
+ /** A field's label, with its help beside it rather than inside the label, so
204
+ * the label names the field and not the help button. */
205
+ function FieldLabel({ id, label, tooltip }) {
206
+ return /* @__PURE__ */ jsxs("div", {
207
+ className: clsx(fieldLabelClasses, "flex items-center gap-1"),
208
+ children: [/* @__PURE__ */ jsx("label", {
209
+ htmlFor: id,
210
+ children: label
211
+ }), tooltip && /* @__PURE__ */ jsx(InfoTip, { text: tooltip })]
212
+ });
213
+ }
231
214
  /** Labeled single-line input row for the dialog's extra fields. */
232
- function CreateModalField({ label, tooltip, ...props }) {
233
- return /* @__PURE__ */ jsxs("label", {
234
- className: "block mb-3",
235
- children: [/* @__PURE__ */ jsxs("span", {
236
- className: cx(fieldLabelClasses, "flex items-center gap-1"),
237
- children: [label, /* @__PURE__ */ jsx(FieldHelp, { tooltip })]
215
+ function CreateModalField({ label, tooltip, id, ...props }) {
216
+ const fallbackId = useId();
217
+ const fieldId = id ?? fallbackId;
218
+ return /* @__PURE__ */ jsxs("div", {
219
+ className: "mb-3",
220
+ children: [/* @__PURE__ */ jsx(FieldLabel, {
221
+ id: fieldId,
222
+ label,
223
+ tooltip
238
224
  }), /* @__PURE__ */ jsx("input", {
239
225
  type: "text",
240
226
  autoComplete: "off",
241
227
  "data-1p-ignore": true,
242
228
  ...props,
229
+ id: fieldId,
243
230
  className: fieldInputClasses
244
231
  })]
245
232
  });
246
233
  }
247
234
  /** Labeled multi-line field for credential blobs (JSON keys, PEM keys). */
248
- function CreateModalTextarea({ label, tooltip, rows = 4, ...props }) {
249
- return /* @__PURE__ */ jsxs("label", {
250
- className: "block mb-3",
251
- children: [/* @__PURE__ */ jsxs("span", {
252
- className: cx(fieldLabelClasses, "flex items-center gap-1"),
253
- children: [label, /* @__PURE__ */ jsx(FieldHelp, { tooltip })]
235
+ function CreateModalTextarea({ label, tooltip, rows = 4, id, ...props }) {
236
+ const fallbackId = useId();
237
+ const fieldId = id ?? fallbackId;
238
+ return /* @__PURE__ */ jsxs("div", {
239
+ className: "mb-3",
240
+ children: [/* @__PURE__ */ jsx(FieldLabel, {
241
+ id: fieldId,
242
+ label,
243
+ tooltip
254
244
  }), /* @__PURE__ */ jsx("textarea", {
255
245
  autoComplete: "off",
256
246
  "data-1p-ignore": true,
257
247
  rows,
258
248
  ...props,
259
- className: cx(fieldInputClasses, "h-auto py-2 font-mono text-xs leading-relaxed resize-y")
249
+ id: fieldId,
250
+ className: clsx(fieldInputClasses, "h-auto py-2 font-mono text-xs leading-relaxed resize-y")
260
251
  })]
261
252
  });
262
253
  }
263
- /** Labeled input row with typeahead suggestions; free-form values allowed. */
264
- function CreateModalAutocompleteField({ label, tooltip, value, onChange, options, placeholder }) {
265
- const query = value.trim().toLowerCase();
266
- const filtered = query ? options.filter((option) => option.toLowerCase().includes(query)) : options;
254
+ /** Labeled input with suggestions; any text is allowed. */
255
+ function CreateModalAutocompleteField({ label, tooltip, value, onValueChange, items, placeholder }) {
256
+ const id = useId();
267
257
  return /* @__PURE__ */ jsxs("div", {
268
258
  className: "mb-3",
269
- children: [/* @__PURE__ */ jsxs("span", {
270
- className: cx(fieldLabelClasses, "flex items-center gap-1"),
271
- children: [label, /* @__PURE__ */ jsx(FieldHelp, { tooltip })]
272
- }), /* @__PURE__ */ jsxs(Combobox, {
259
+ children: [/* @__PURE__ */ jsx(FieldLabel, {
260
+ id,
261
+ label,
262
+ tooltip
263
+ }), /* @__PURE__ */ jsx(Autocomplete, {
264
+ id,
265
+ items,
273
266
  value,
274
- onChange: (next) => onChange(next ?? ""),
275
- immediate: true,
276
- children: [/* @__PURE__ */ jsx(ComboboxInput, {
277
- autoComplete: "off",
278
- "data-1p-ignore": true,
279
- "aria-label": label,
280
- placeholder,
281
- displayValue: (current) => current ?? "",
282
- onChange: (e) => onChange(e.target.value),
283
- className: fieldInputClasses
284
- }), filtered.length > 0 && /* @__PURE__ */ jsx(ComboboxOptions, {
285
- anchor: "bottom start",
286
- className: "z-[9999] mt-1 w-(--input-width) [--anchor-max-height:14rem] overflow-auto rounded-lg border border-(--theme-border) bg-(--theme-app-bg) py-1 shadow-lg focus:outline-none",
287
- children: filtered.map((option) => /* @__PURE__ */ jsx(ComboboxOption, {
288
- value: option,
289
- className: "px-3 py-1.5 text-[13px] text-(--theme-app) data-[focus]:bg-(--theme-muted-panel-bg) cursor-pointer",
290
- children: option
291
- }, option))
292
- })]
267
+ onValueChange,
268
+ placeholder
293
269
  })]
294
270
  });
295
271
  }
272
+ var pillClasses = "inline-flex h-7 items-center gap-1.5 rounded-md border border-(--theme-border) px-2 text-xs font-medium transition-colors";
296
273
  /** Compact property pill with an on/off switch. */
297
- function CreateModalSwitch({ label, checked, onChange, tooltip }) {
298
- return /* @__PURE__ */ jsx("button", {
299
- type: "button",
300
- role: "switch",
301
- "aria-checked": checked,
302
- onClick: () => onChange(!checked),
303
- className: cx("inline-flex h-7 rounded-md border border-(--theme-border) text-xs font-medium transition-colors hover:bg-(--theme-muted-panel-bg)", checked ? "text-(--theme-app)" : "text-(--theme-muted-text-color)"),
304
- children: /* @__PURE__ */ jsxs(PillTooltip, {
305
- content: tooltip,
306
- className: "px-2",
307
- children: [/* @__PURE__ */ jsx("span", {
308
- className: cx("relative inline-flex h-3.5 w-6 shrink-0 rounded-full transition-colors", checked ? "bg-(--theme-element)" : "bg-(--theme-border)"),
309
- children: /* @__PURE__ */ jsx("span", { className: cx("absolute top-0.5 left-0.5 h-2.5 w-2.5 rounded-full bg-white shadow-sm transition-transform", checked && "translate-x-2.5") })
274
+ function CreateModalSwitch({ label, checked, onCheckedChange, tooltip }) {
275
+ return /* @__PURE__ */ jsx(Tooltip, {
276
+ content: tooltip,
277
+ children: /* @__PURE__ */ jsxs("label", {
278
+ className: clsx(pillClasses, "cursor-pointer hover:bg-(--theme-muted-panel-bg)", checked ? "text-(--theme-app)" : "text-(--theme-muted-text-color)"),
279
+ children: [/* @__PURE__ */ jsx(Switch, {
280
+ size: "sm",
281
+ checked,
282
+ onCheckedChange
310
283
  }), label]
311
284
  })
312
285
  });
313
286
  }
314
- /** Callers gating collapse on list size must use this same threshold so
315
- * collapsed rows always come with a filter to find them. */
316
- var CREATE_MODAL_SELECT_FILTER_THRESHOLD = 8;
317
- function collapseToggleRow(group, count, collapse) {
318
- const expanded = collapse.expanded.has(group);
319
- return /* @__PURE__ */ jsxs("button", {
320
- type: "button",
321
- "aria-expanded": expanded,
322
- onMouseDown: (e) => e.preventDefault(),
323
- onClick: () => collapse.onToggle(group),
324
- className: "flex w-full items-center gap-1.5 px-3 py-1.5 text-[13px] text-(--theme-muted-text-color) hover:text-(--theme-app) cursor-pointer",
325
- children: [/* @__PURE__ */ jsx(expanded ? FaChevronDown : LuChevronRight, { className: "w-3 h-3" }), collapse.label(count)]
326
- }, `toggle-${group}`);
327
- }
328
- function collapsibleCountsByGroup(options) {
329
- const counts = /* @__PURE__ */ new Map();
330
- for (const o of options) if (o.collapsible && o.group) counts.set(o.group, (counts.get(o.group) ?? 0) + 1);
331
- return counts;
332
- }
333
- function pushToggleRowOnce(nodes, toggledGroups, group, count, collapse) {
334
- if (!toggledGroups.has(group)) {
335
- toggledGroups.add(group);
336
- nodes.push(collapseToggleRow(group, count, collapse));
337
- }
338
- }
339
- function buildOptionNodes(options, query, onChange, collapse) {
340
- const trimmed = query.trim();
341
- const q = trimmed.toLowerCase().replace(/-/g, "");
342
- const filtered = q ? options.filter((o) => o.pinned || filterOption({
343
- label: o.label,
344
- value: o.value,
345
- secondaryValue: o.group
346
- }, trimmed)) : options;
347
- const collapsibleCounts = !q && collapse ? collapsibleCountsByGroup(filtered) : /* @__PURE__ */ new Map();
348
- const nodes = [];
349
- let lastGroup;
350
- const toggledGroups = /* @__PURE__ */ new Set();
351
- for (const option of filtered) {
352
- const { group } = option;
353
- if (group && group !== lastGroup) {
354
- lastGroup = group;
355
- nodes.push(/* @__PURE__ */ jsx("div", {
356
- className: "px-3 pt-2 pb-1 text-[10px] font-semibold uppercase tracking-wide text-(--theme-muted-text-color)",
357
- children: group
358
- }, `group-${group}`));
359
- }
360
- if (!q && collapse && option.collapsible && group) {
361
- pushToggleRowOnce(nodes, toggledGroups, group, collapsibleCounts.get(group) ?? 0, collapse);
362
- if (!collapse.expanded.has(group)) continue;
363
- }
364
- nodes.push(/* @__PURE__ */ jsx(MenuItem, {
365
- disabled: option.disabled ?? false,
366
- children: /* @__PURE__ */ jsxs("button", {
367
- type: "button",
368
- disabled: option.disabled,
369
- "aria-disabled": option.disabled,
370
- "aria-label": option.description ? option.label : void 0,
371
- "aria-description": option.description,
372
- onClick: () => onChange(option.value),
373
- className: cx("flex w-full items-center gap-2 px-3 py-1.5 text-left text-[13px] data-[focus]:bg-(--theme-muted-panel-bg)", option.disabled ? "cursor-not-allowed text-(--theme-muted-text-color)" : "cursor-pointer text-(--theme-app)", option.pinned && "mt-1 border-t border-(--theme-border) pt-2 font-medium"),
374
- children: [option.icon, option.description ? /* @__PURE__ */ jsxs("span", {
375
- className: "flex min-w-0 flex-col",
376
- children: [/* @__PURE__ */ jsx("span", {
377
- className: "truncate",
378
- children: option.label
379
- }), /* @__PURE__ */ jsx("span", {
380
- className: "truncate text-[11px] font-normal text-(--theme-muted-text-color)",
381
- children: option.description
382
- })]
383
- }) : option.label]
384
- })
385
- }, option.value));
386
- }
387
- return nodes;
388
- }
389
- function CreateModalSelectPanel({ open, options, label, value, collapsedLabel, onChange }) {
287
+ /** Compact property pill that picks one value from a searchable list. Items may carry
288
+ * icons, descriptions and group headings (e.g. Clusters vs Kubernetes). */
289
+ function CreateModalSelect({ label, icon, value, items, onValueChange, disabled = false, disabledReason, tooltip }) {
390
290
  const t = useStrings().modal;
391
- const [query, setQuery] = useState("");
392
- const inputRef = useRef(null);
393
- const showFilter = options.length > 8;
394
- const selectedGroup = options.find((o) => o.value === value)?.group;
395
- const initialExpandedGroups = useCallback(() => new Set(selectedGroup ? [selectedGroup] : []), [selectedGroup]);
396
- const [expandedGroups, setExpandedGroups] = useState(initialExpandedGroups);
397
- useEffect(() => {
398
- if (!open) {
399
- setQuery("");
400
- setExpandedGroups(initialExpandedGroups());
401
- }
402
- }, [open, initialExpandedGroups]);
403
- useEffect(() => {
404
- if (!open || !showFilter) return;
405
- const raf = requestAnimationFrame(() => inputRef.current?.focus());
406
- return () => cancelAnimationFrame(raf);
407
- }, [open, showFilter]);
408
- const rendered = buildOptionNodes(options, query, onChange, collapsedLabel ? {
409
- expanded: expandedGroups,
410
- onToggle: (group) => setExpandedGroups((prev) => toggleSetMember(prev, group)),
411
- label: collapsedLabel
412
- } : void 0);
413
- return /* @__PURE__ */ jsxs(MenuItems, {
414
- anchor: "bottom start",
415
- className: "z-[9999] mt-1 flex min-w-44 max-w-[min(28rem,calc(100vw-2rem))] max-h-64 flex-col [--anchor-max-height:16rem] overflow-hidden rounded-lg border border-(--theme-border) bg-(--theme-app-bg) shadow-lg focus:outline-none",
416
- children: [showFilter && /* @__PURE__ */ jsx("div", {
417
- className: "shrink-0 bg-(--theme-app-bg) px-1.5 pt-1 pb-1.5 border-b border-(--theme-border)",
418
- children: /* @__PURE__ */ jsx("input", {
419
- ref: inputRef,
420
- type: "text",
421
- autoComplete: "off",
422
- "data-1p-ignore": true,
423
- "aria-label": label,
424
- placeholder: t.filter,
425
- value: query,
426
- onChange: (e) => setQuery(e.target.value),
427
- onKeyDown: (e) => {
428
- if (e.key !== "Escape") e.stopPropagation();
429
- },
430
- className: "w-full h-7 px-2 rounded-md border border-(--theme-border) bg-(--theme-input-bg) text-[13px] text-(--theme-app) placeholder:text-(--theme-muted-text-color) focus:outline-none focus:border-(--theme-element)"
431
- })
432
- }), /* @__PURE__ */ jsx("div", {
433
- className: "min-h-0 flex-1 overflow-y-auto py-1",
434
- children: rendered.length === 0 ? /* @__PURE__ */ jsx("div", {
435
- className: "px-3 py-1.5 text-[13px] text-(--theme-muted-text-color)",
436
- children: t.noOptions
437
- }) : rendered
438
- })]
439
- });
440
- }
441
- /** Compact property pill with a dropdown of options. Options may carry leading
442
- * icons and group headers (e.g. Clusters vs Kubernetes). */
443
- function CreateModalSelect({ label, icon, value, options, onChange, disabled = false, disabledHint, tooltip, collapsedLabel }) {
444
- const selected = options.find((o) => o.value === value);
291
+ const selected = comboboxLeaves(items).map((item) => typeof item === "string" ? {
292
+ value: item,
293
+ label: item
294
+ } : item).find((item) => item.value === value);
445
295
  const selectedLabel = selected?.label ?? (value || void 0);
446
- const pillContent = /* @__PURE__ */ jsxs(Fragment$1, { children: [
296
+ const pillContent = /* @__PURE__ */ jsxs(Fragment, { children: [
447
297
  selected?.icon ?? icon,
448
- selectedLabel ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
298
+ selectedLabel ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
449
299
  className: "font-normal text-(--theme-muted-text-color)",
450
300
  children: label
451
301
  }), selectedLabel] }) : label,
452
302
  /* @__PURE__ */ jsx(FaChevronDown, { className: "w-3 h-3 opacity-60" })
453
303
  ] });
454
- if (disabled) return /* @__PURE__ */ jsx("button", {
455
- type: "button",
456
- "aria-disabled": "true",
457
- "aria-label": label,
458
- className: cx("inline-flex h-7 rounded-md border border-(--theme-border) text-xs font-medium", "opacity-50 cursor-not-allowed text-(--theme-muted-text-color)"),
459
- children: /* @__PURE__ */ jsx(PillTooltip, {
460
- content: disabledHint ?? tooltip,
461
- className: "px-2",
304
+ if (disabled) return /* @__PURE__ */ jsx(Tooltip, {
305
+ content: disabledReason ?? tooltip,
306
+ children: /* @__PURE__ */ jsx(Button, {
307
+ disabled: true,
308
+ focusableWhenDisabled: true,
309
+ "aria-label": label,
310
+ className: clsx(pillClasses, "opacity-50 cursor-not-allowed text-(--theme-muted-text-color)"),
462
311
  children: pillContent
463
312
  })
464
313
  });
465
- return /* @__PURE__ */ jsx(Menu, { children: ({ open }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(MenuButton, {
314
+ return /* @__PURE__ */ jsx(Combobox, {
315
+ items,
316
+ value: value ?? null,
317
+ onValueChange: (next) => {
318
+ if (next !== null) onValueChange(next);
319
+ },
320
+ itemToStringLabel: (next) => next,
466
321
  "aria-label": label,
467
- className: cx("inline-flex h-7 rounded-md border border-(--theme-border) text-xs font-medium transition-colors hover:bg-(--theme-muted-panel-bg)", selectedLabel ? "text-(--theme-app)" : "text-(--theme-muted-text-color)"),
468
- children: /* @__PURE__ */ jsx(PillTooltip, {
469
- content: tooltip,
470
- className: "px-2",
322
+ placeholder: t.filter,
323
+ triggerTooltip: tooltip,
324
+ trigger: /* @__PURE__ */ jsx("button", {
325
+ type: "button",
326
+ className: clsx(pillClasses, "cursor-pointer hover:bg-(--theme-muted-panel-bg)", selectedLabel ? "text-(--theme-app)" : "text-(--theme-muted-text-color)"),
471
327
  children: pillContent
472
328
  })
473
- }), /* @__PURE__ */ jsx(CreateModalSelectPanel, {
474
- open,
475
- options,
476
- label,
477
- value,
478
- collapsedLabel,
479
- onChange
480
- })] }) });
329
+ });
481
330
  }
482
331
  //#endregion
483
- export { CREATE_MODAL_SELECT_FILTER_THRESHOLD, CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, CreateModalSwitch, CreateModalTextarea };
332
+ export { CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, CreateModalSwitch, CreateModalTextarea };
@@ -1,15 +1,15 @@
1
- import { TooltipInfo } from "./Tooltip.js";
2
- import cx from "classnames";
1
+ import { InfoTip } from "./InfoTip.js";
2
+ import { clsx } from "clsx";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
4
  import React from "react";
4
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/DescriptionList.tsx
6
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),
7
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("dt", {
8
+ className: clsx("text-[13px] leading-6 col-span-1 font-normal flex gap-1", className),
9
9
  children: [/* @__PURE__ */ jsx("span", {
10
10
  className: "min-w-0 truncate",
11
11
  children: label
12
- }), tooltip && /* @__PURE__ */ jsx(TooltipInfo, {
12
+ }), tooltip && /* @__PURE__ */ jsx(InfoTip, {
13
13
  className: "pr-2",
14
14
  text: tooltip
15
15
  })]
@@ -21,7 +21,7 @@ function DescriptionListItem({ label, children, tooltip, className, ...props })
21
21
  }
22
22
  function DescriptionList({ children, title, separators = true, subtitle, className, wrapperClassName, vertical = false }) {
23
23
  return /* @__PURE__ */ jsxs("div", {
24
- className: cx("w-full", wrapperClassName),
24
+ className: clsx("w-full", wrapperClassName),
25
25
  children: [
26
26
  title && /* @__PURE__ */ jsx("h2", {
27
27
  className: "text-sm font-semibold w-full mb-1",
@@ -32,7 +32,7 @@ function DescriptionList({ children, title, separators = true, subtitle, classNa
32
32
  children: subtitle
33
33
  }),
34
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),
35
+ className: clsx("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
36
  children: Array.isArray(children) ? React.Children.toArray(children) : children
37
37
  })
38
38
  ]
@@ -1,5 +1,5 @@
1
1
  import { FaFilter } from "../icons/fa/FaFilter.js";
2
- import cx from "classnames";
2
+ import { clsx } from "clsx";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/components/Filter.tsx
5
5
  function Filter({ filter, setFilter, placeholder = "Filter...", pills, activePill, onPillChange }) {
@@ -22,7 +22,7 @@ function Filter({ filter, setFilter, placeholder = "Filter...", pills, activePil
22
22
  children: pills.map((pill) => /* @__PURE__ */ jsx("button", {
23
23
  type: "button",
24
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"),
25
+ className: clsx("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
26
  children: pill.label
27
27
  }, pill.value))
28
28
  })]
@@ -1,4 +1,4 @@
1
- import cx from "classnames";
1
+ import { clsx } from "clsx";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/FilterPill.tsx
4
4
  function FilterPill({ active, onClick, children }) {
@@ -6,7 +6,7 @@ function FilterPill({ active, onClick, children }) {
6
6
  type: "button",
7
7
  "aria-pressed": active,
8
8
  onClick,
9
- className: cx("px-3 py-1.5 text-xs font-medium rounded-full border transition-all duration-200", active ? "bg-[var(--theme-panel-bg)] border-[var(--theme-border)] text-[var(--theme-panel)] shadow-sm" : "bg-transparent border-transparent text-[var(--theme-muted-text-color)] hover:text-[var(--theme-panel)] hover:bg-[var(--theme-hover)]"),
9
+ className: clsx("px-3 py-1.5 text-xs font-medium rounded-full border transition-all duration-200", active ? "bg-[var(--theme-panel-bg)] border-[var(--theme-border)] text-[var(--theme-panel)] shadow-sm" : "bg-transparent border-transparent text-[var(--theme-muted-text-color)] hover:text-[var(--theme-panel)] hover:bg-[var(--theme-hover)]"),
10
10
  children
11
11
  });
12
12
  }
@@ -0,0 +1,14 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ export interface HoverCardProps {
3
+ /** Mounted only while open, so a card that loads its own data loads on first hover. */
4
+ card: ReactNode;
5
+ /** The anchor. It receives the trigger's props and ref, so it must pass them to its element. */
6
+ children: ReactElement;
7
+ /** Opens on first render, for stories and screenshots. */
8
+ defaultOpen?: boolean;
9
+ }
10
+ /** Detail about its anchor, such as a person's profile, after a short hover or
11
+ * on focus. A visual enhancement: whatever the card shows must also be
12
+ * reachable another way, such as the page the anchor links to. The card
13
+ * stays open while the pointer is over it. */
14
+ export declare function HoverCard({ card, children, defaultOpen }: HoverCardProps): import("react").JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { cardClassName, portalContainer, positionerClassName } from "./floating.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { PreviewCard } from "@base-ui/react/preview-card";
4
+ //#region src/components/HoverCard.tsx
5
+ /** Detail about its anchor, such as a person's profile, after a short hover or
6
+ * on focus. A visual enhancement: whatever the card shows must also be
7
+ * reachable another way, such as the page the anchor links to. The card
8
+ * stays open while the pointer is over it. */
9
+ function HoverCard({ card, children, defaultOpen = false }) {
10
+ return /* @__PURE__ */ jsxs(PreviewCard.Root, {
11
+ defaultOpen,
12
+ children: [/* @__PURE__ */ jsx(PreviewCard.Trigger, {
13
+ delay: 350,
14
+ closeDelay: 150,
15
+ render: children
16
+ }), /* @__PURE__ */ jsx(PreviewCard.Portal, {
17
+ container: portalContainer(),
18
+ children: /* @__PURE__ */ jsx(PreviewCard.Positioner, {
19
+ side: "bottom",
20
+ align: "start",
21
+ sideOffset: 8,
22
+ collisionPadding: 8,
23
+ className: positionerClassName,
24
+ children: /* @__PURE__ */ jsx(PreviewCard.Popup, {
25
+ className: cardClassName,
26
+ children: card
27
+ })
28
+ })
29
+ })]
30
+ });
31
+ }
32
+ //#endregion
33
+ export { HoverCard };
@@ -1,8 +1,8 @@
1
- import type { ButtonHTMLAttributes, ReactNode } from 'react';
2
- interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1
+ import type { ComponentPropsWithRef, ReactNode } from 'react';
2
+ interface IconButtonProps extends ComponentPropsWithRef<'button'> {
3
3
  /** Icon to display */
4
4
  icon: ReactNode;
5
- /** Accessible label (used for aria-label and tooltip) */
5
+ /** The accessible name, also shown as the tooltip. */
6
6
  label: string;
7
7
  /** Button variant */
8
8
  variant?: 'default' | 'ghost' | 'primary' | 'success';
@@ -10,8 +10,8 @@ interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
10
10
  size?: 'sm' | 'md' | 'lg';
11
11
  /** Whether button is in active/selected state */
12
12
  active?: boolean;
13
- /** Whether to show tooltip on hover */
13
+ /** False hides the tooltip, such as while the button's own popup is open. */
14
14
  showTooltip?: boolean;
15
15
  }
16
- export declare const IconButton: import("react").ForwardRefExoticComponent<IconButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
16
+ export declare function IconButton({ icon, label, variant, size, active, showTooltip, className, ...props }: IconButtonProps): import("react").JSX.Element;
17
17
  export {};