@parallelworks/ui 0.77.0 → 0.79.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 (268) hide show
  1. package/README.md +42 -6
  2. package/dist/access/AccessDrawer.d.ts +49 -7
  3. package/dist/access/AccessDrawer.js +243 -38
  4. package/dist/access/AccessList.d.ts +19 -1
  5. package/dist/access/AccessList.js +220 -9
  6. package/dist/access/GrantView.d.ts +3 -1
  7. package/dist/access/GrantView.js +17 -4
  8. package/dist/access/PrincipalPicker.js +5 -5
  9. package/dist/access/focus.js +1 -1
  10. package/dist/access/index.d.ts +2 -2
  11. package/dist/access/index.js +2 -2
  12. package/dist/access/strings.d.ts +25 -1
  13. package/dist/access/strings.js +27 -3
  14. package/dist/access/types.d.ts +26 -0
  15. package/dist/ai/components/AllocationSelector.js +1 -1
  16. package/dist/ai/components/AttachmentManager.js +5 -5
  17. package/dist/ai/components/AttachmentUpload.js +2 -2
  18. package/dist/ai/components/BranchNavigator.js +1 -1
  19. package/dist/ai/components/ChatActivity.js +1 -1
  20. package/dist/ai/components/ChatEmptyState.js +3 -3
  21. package/dist/ai/components/ChatInput.js +3 -5
  22. package/dist/ai/components/ChatLayout.js +1 -1
  23. package/dist/ai/components/ChatMessage.js +1 -1
  24. package/dist/ai/components/ChatMessageList.js +23 -8
  25. package/dist/ai/components/ChatSidebar.js +3 -3
  26. package/dist/ai/components/ChatThread.js +4 -4
  27. package/dist/ai/components/ComposerAddMenu.js +9 -20
  28. package/dist/ai/components/ModelSelector.js +3 -3
  29. package/dist/ai/components/PastedText.js +5 -5
  30. package/dist/ai/components/SessionView.js +1 -1
  31. package/dist/ai/components/ShareDialog.js +3 -3
  32. package/dist/ai/components/SlashMenu.d.ts +31 -4
  33. package/dist/ai/components/SlashMenu.js +36 -63
  34. package/dist/ai/components/agent/ActivityLine.js +1 -1
  35. package/dist/ai/components/agent/AgentMessageParts.js +13 -13
  36. package/dist/ai/components/conversationActions.js +3 -3
  37. package/dist/ai/core/ChatProvider.js +1 -1
  38. package/dist/ai/core/config.js +1 -1
  39. package/dist/ai/ui/ConversationSidebar.js +3 -3
  40. package/dist/ai/ui/sidebar.js +3 -3
  41. package/dist/assets/yaml.worker-DOBV2lND.js +884 -0
  42. package/dist/components/ActionMenu.d.ts +38 -9
  43. package/dist/components/ActionMenu.js +48 -22
  44. package/dist/components/Avatar.d.ts +66 -6
  45. package/dist/components/Avatar.js +130 -18
  46. package/dist/components/Breadcrumbs.d.ts +4 -0
  47. package/dist/components/Breadcrumbs.js +26 -10
  48. package/dist/components/Button.d.ts +3 -2
  49. package/dist/components/Button.js +11 -1
  50. package/dist/components/Callout.d.ts +3 -2
  51. package/dist/components/Callout.js +3 -2
  52. package/dist/components/Card.d.ts +33 -9
  53. package/dist/components/Card.js +24 -8
  54. package/dist/components/Checkbox.d.ts +3 -1
  55. package/dist/components/Checkbox.js +4 -2
  56. package/dist/components/ColorInput.js +1 -1
  57. package/dist/components/Combobox.d.ts +23 -0
  58. package/dist/components/Combobox.js +252 -86
  59. package/dist/components/ConfirmModal.d.ts +28 -2
  60. package/dist/components/ConfirmModal.js +100 -15
  61. package/dist/components/ContextMenu.d.ts +29 -2
  62. package/dist/components/ContextMenu.js +60 -8
  63. package/dist/components/CopyButton.d.ts +21 -8
  64. package/dist/components/CopyButton.js +29 -9
  65. package/dist/components/CreateModal.d.ts +20 -4
  66. package/dist/components/CreateModal.js +28 -17
  67. package/dist/components/DatePicker.d.ts +31 -1
  68. package/dist/components/DatePicker.js +178 -47
  69. package/dist/components/DescriptionList.d.ts +13 -3
  70. package/dist/components/DescriptionList.js +43 -11
  71. package/dist/components/Disclosure.d.ts +10 -2
  72. package/dist/components/Disclosure.js +18 -7
  73. package/dist/components/Drawer.js +5 -5
  74. package/dist/components/EmptyState.d.ts +12 -4
  75. package/dist/components/EmptyState.js +18 -10
  76. package/dist/components/ErrorPage.d.ts +40 -0
  77. package/dist/components/ErrorPage.js +101 -0
  78. package/dist/components/ExternalLink.d.ts +4 -1
  79. package/dist/components/ExternalLink.js +4 -5
  80. package/dist/components/Field.d.ts +21 -6
  81. package/dist/components/Field.js +32 -16
  82. package/dist/components/FileButton.d.ts +19 -0
  83. package/dist/components/FileButton.js +32 -0
  84. package/dist/components/HoverCard.d.ts +26 -6
  85. package/dist/components/HoverCard.js +11 -5
  86. package/dist/components/IconButton.js +4 -2
  87. package/dist/components/InfoTip.js +3 -3
  88. package/dist/components/Input.d.ts +33 -3
  89. package/dist/components/Input.js +149 -14
  90. package/dist/components/Kbd.d.ts +40 -0
  91. package/dist/components/Kbd.js +168 -0
  92. package/dist/components/Listbox.d.ts +103 -0
  93. package/dist/components/Listbox.js +190 -0
  94. package/dist/components/Loader.d.ts +8 -2
  95. package/dist/components/Loader.js +16 -1
  96. package/dist/components/Markdown.js +1 -1
  97. package/dist/components/MarkdownImpl.js +1 -1
  98. package/dist/components/Menu.d.ts +20 -2
  99. package/dist/components/Menu.js +48 -19
  100. package/dist/components/MenuEntries.d.ts +41 -4
  101. package/dist/components/MenuEntries.js +266 -39
  102. package/dist/components/Meter.d.ts +50 -11
  103. package/dist/components/Meter.js +71 -21
  104. package/dist/components/Modal.d.ts +9 -3
  105. package/dist/components/Modal.js +68 -29
  106. package/dist/components/OneTimeCodeInput.js +1 -1
  107. package/dist/components/PageHeader.js +111 -7
  108. package/dist/components/PageHeaderAction.d.ts +8 -3
  109. package/dist/components/PageHeaderAction.js +122 -34
  110. package/dist/components/Pagination.d.ts +13 -1
  111. package/dist/components/Pagination.js +90 -19
  112. package/dist/components/Popover.d.ts +16 -2
  113. package/dist/components/Popover.js +20 -21
  114. package/dist/components/Provider.d.ts +172 -5
  115. package/dist/components/Provider.js +157 -14
  116. package/dist/components/RefreshButton.d.ts +13 -6
  117. package/dist/components/RefreshButton.js +17 -9
  118. package/dist/components/RunStatusIcon.d.ts +16 -7
  119. package/dist/components/RunStatusIcon.js +21 -8
  120. package/dist/components/Section.d.ts +11 -4
  121. package/dist/components/Section.js +33 -22
  122. package/dist/components/SegmentedControl.d.ts +16 -3
  123. package/dist/components/SegmentedControl.js +7 -3
  124. package/dist/components/Select.d.ts +19 -3
  125. package/dist/components/Select.js +114 -68
  126. package/dist/components/SelectionCopy.d.ts +10 -0
  127. package/dist/components/SelectionCopy.js +105 -0
  128. package/dist/components/SettingModeOption.js +1 -1
  129. package/dist/components/SettingsCard.js +1 -1
  130. package/dist/components/Skeleton.js +1 -1
  131. package/dist/components/StatusBadge.d.ts +55 -10
  132. package/dist/components/StatusBadge.js +91 -15
  133. package/dist/components/StickyBar.js +1 -1
  134. package/dist/components/Table.d.ts +22 -4
  135. package/dist/components/Table.js +46 -24
  136. package/dist/components/Tabs.d.ts +9 -4
  137. package/dist/components/Tabs.js +9 -4
  138. package/dist/components/Tag.d.ts +49 -0
  139. package/dist/components/Tag.js +199 -0
  140. package/dist/components/ThemeEditor.js +1 -1
  141. package/dist/components/Toast.js +1 -1
  142. package/dist/components/ToggleGroup.d.ts +4 -1
  143. package/dist/components/ToggleGroup.js +30 -13
  144. package/dist/components/Tooltip.d.ts +9 -3
  145. package/dist/components/Tooltip.js +55 -39
  146. package/dist/components/buttonClasses.d.ts +5 -2
  147. package/dist/components/buttonClasses.js +11 -10
  148. package/dist/components/chart.d.ts +69 -0
  149. package/dist/components/chart.js +145 -0
  150. package/dist/components/comboboxItems.d.ts +7 -1
  151. package/dist/components/comboboxItems.js +6 -2
  152. package/dist/components/dismiss.d.ts +5 -1
  153. package/dist/components/dismiss.js +6 -2
  154. package/dist/components/floating.d.ts +4 -4
  155. package/dist/components/floating.js +5 -5
  156. package/dist/components/headerActionsFit.d.ts +37 -0
  157. package/dist/components/headerActionsFit.js +81 -0
  158. package/dist/components/pageHeaderStore.d.ts +3 -0
  159. package/dist/components/pageHeaderStore.js +3 -0
  160. package/dist/components/pathBreaks.js +2 -2
  161. package/dist/components/popupContainer.d.ts +17 -0
  162. package/dist/components/popupContainer.js +69 -0
  163. package/dist/components/relativeTime.d.ts +21 -10
  164. package/dist/components/relativeTime.js +50 -22
  165. package/dist/components/segmented.d.ts +18 -4
  166. package/dist/components/segmented.js +48 -6
  167. package/dist/components/typedDate.d.ts +5 -0
  168. package/dist/components/typedDate.js +50 -0
  169. package/dist/components/useClosingValue.d.ts +4 -0
  170. package/dist/components/useClosingValue.js +12 -0
  171. package/dist/components/useCopy.d.ts +6 -0
  172. package/dist/components/useCopy.js +3 -3
  173. package/dist/components/useNarrow.d.ts +2 -0
  174. package/dist/components/useNarrow.js +16 -0
  175. package/dist/editor/Editor.js +1 -1
  176. package/dist/editor/FormCodePanel.js +1 -1
  177. package/dist/editor/Monaco.js +1 -1
  178. package/dist/editor/workers.js +1 -1
  179. package/dist/file-explorer/FileExplorer.js +16 -15
  180. package/dist/file-explorer/FileExplorerContext.js +2 -2
  181. package/dist/file-explorer/FilePreview/Viewer.js +3 -3
  182. package/dist/file-explorer/FilePreview/index.js +2 -2
  183. package/dist/file-explorer/FileRowsWindow.js +3 -3
  184. package/dist/file-explorer/FileTable.js +1 -1
  185. package/dist/file-explorer/LoadMoreRow.js +1 -1
  186. package/dist/file-explorer/TreeView.js +5 -5
  187. package/dist/file-explorer/helpers.js +2 -2
  188. package/dist/file-explorer/toasts.js +2 -2
  189. package/dist/form/Fields/CheckboxGroupField.js +1 -1
  190. package/dist/form/Fields/DropdownField.js +1 -1
  191. package/dist/form/Fields/DurationField.js +2 -2
  192. package/dist/form/Fields/MultiDropdownField.js +1 -1
  193. package/dist/form/Fields/NumberField.js +1 -1
  194. package/dist/form/Fields/ObjectField.js +1 -1
  195. package/dist/form/Fields/RangeField.js +1 -1
  196. package/dist/form/Fields/StringField.js +1 -1
  197. package/dist/form/Form.js +3 -3
  198. package/dist/form/FormLayout.js +1 -1
  199. package/dist/form/Wizard/WizardContainer.js +1 -1
  200. package/dist/form/Wizard/WizardNavigation.js +1 -1
  201. package/dist/form/Wizard/WizardStepContent.js +1 -1
  202. package/dist/form/fieldRegistry.js +1 -1
  203. package/dist/form/formEditing.js +1 -1
  204. package/dist/format.d.ts +17 -7
  205. package/dist/format.js +39 -16
  206. package/dist/graph/AnnotationBanner.js +2 -2
  207. package/dist/graph/Connectors.js +5 -5
  208. package/dist/graph/DependencyGraph.js +10 -9
  209. package/dist/graph/GraphEditor.js +4 -4
  210. package/dist/graph/GraphEditorDialogs.js +13 -12
  211. package/dist/graph/GraphNode.js +1 -1
  212. package/dist/graph/InputDialog.js +5 -5
  213. package/dist/graph/InputsEditor.js +10 -9
  214. package/dist/graph/MatrixGroup.js +2 -2
  215. package/dist/graph/ProblemPageLink.d.ts +9 -0
  216. package/dist/graph/ProblemPageLink.js +21 -0
  217. package/dist/graph/ProblemsButton.js +26 -16
  218. package/dist/graph/Reveal.js +1 -1
  219. package/dist/graph/RunWarningsList.js +21 -12
  220. package/dist/graph/ShortcutsButton.js +25 -8
  221. package/dist/graph/StepSummaries.js +1 -1
  222. package/dist/graph/TreeView.js +2 -2
  223. package/dist/graph/WorkflowSettingsDialog.js +3 -3
  224. package/dist/graph/editorApi.d.ts +10 -0
  225. package/dist/graph/editorFields.js +3 -3
  226. package/dist/graph/editorPrimitives.js +1 -1
  227. package/dist/graph/editorRows.js +8 -6
  228. package/dist/graph/editorStrings.d.ts +1 -0
  229. package/dist/graph/editorStrings.js +1 -0
  230. package/dist/graph/fieldProblems.js +2 -2
  231. package/dist/graph/inputRefs.js +7 -6
  232. package/dist/graph/runWarnings.d.ts +12 -1
  233. package/dist/graph/stepWith.js +2 -2
  234. package/dist/index.d.ts +30 -21
  235. package/dist/index.js +20 -12
  236. package/dist/list/ActionToolbar.d.ts +4 -0
  237. package/dist/list/ActionToolbar.js +35 -12
  238. package/dist/list/ListFilterBar.d.ts +42 -0
  239. package/dist/list/ListFilterBar.js +789 -0
  240. package/dist/list/ListPage.d.ts +42 -4
  241. package/dist/list/ListPage.js +56 -22
  242. package/dist/list/ListTable.d.ts +27 -3
  243. package/dist/list/ListTable.js +48 -23
  244. package/dist/list/ListToolbar.d.ts +31 -0
  245. package/dist/list/ListToolbar.js +43 -0
  246. package/dist/list/ListViewControls.d.ts +8 -4
  247. package/dist/list/ListViewControls.js +22 -14
  248. package/dist/list/UserHoverCard.d.ts +8 -2
  249. package/dist/list/UserHoverCard.js +26 -13
  250. package/dist/list/filterModel.d.ts +122 -0
  251. package/dist/list/filterModel.js +308 -0
  252. package/dist/list/index.d.ts +6 -2
  253. package/dist/list/index.js +6 -2
  254. package/dist/list/listSearch.d.ts +1 -1
  255. package/dist/list/listSearch.js +8 -4
  256. package/dist/list/listView.d.ts +24 -2
  257. package/dist/list/listView.js +47 -45
  258. package/dist/list/rowMenu.d.ts +10 -5
  259. package/dist/list/rowMenu.js +17 -7
  260. package/dist/list/useListFilters.d.ts +68 -0
  261. package/dist/list/useListFilters.js +252 -0
  262. package/dist/logviewer/LogViewer.js +4 -4
  263. package/dist/styles/theme.css +94 -0
  264. package/dist/styles.css +1 -1
  265. package/package.json +11 -11
  266. package/dist/assets/yaml.worker-k9AdOqzf.js +0 -1441
  267. package/dist/components/fullscreen.d.ts +0 -4
  268. package/dist/components/fullscreen.js +0 -18
@@ -1,12 +1,42 @@
1
1
  import { safeUrl } from "../safeUrl.js";
2
+ import { ContextMenuProvider } from "./ContextMenu.js";
2
3
  import { useLocalPersistedState } from "./persistedState.js";
3
4
  import { Toaster } from "./Toast.js";
4
5
  import { TooltipProvider } from "./Tooltip.js";
5
- import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { createContext, use, useCallback, useContext, useEffect, useRef, useState } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import { CSPProvider } from "@base-ui/react/csp-provider";
8
9
  import { dequal } from "dequal";
9
10
  //#region src/components/Provider.tsx
11
+ /** What a host passes to translate the strings: any group, any string in it, at any depth.
12
+ * A string it leaves out stays in English. */
13
+ var OPERATOR_WORDS = {
14
+ is: (n) => n > 1 ? "is any of" : "is",
15
+ isNot: (n) => n > 1 ? "is none of" : "is not",
16
+ includesAll: (n) => n > 1 ? "includes all of" : "includes",
17
+ after: () => "is after",
18
+ before: () => "is before",
19
+ between: () => "is between",
20
+ contains: () => "contains",
21
+ notContains: () => "does not contain",
22
+ isSet: () => "is set",
23
+ isNotSet: () => "is not set"
24
+ };
25
+ var dayFormats = /* @__PURE__ */ new Map();
26
+ function dayFormat(locale) {
27
+ let formats = dayFormats.get(locale);
28
+ if (!formats) {
29
+ formats = {
30
+ short: new Intl.DateTimeFormat(locale, {
31
+ month: "short",
32
+ day: "numeric"
33
+ }),
34
+ medium: new Intl.DateTimeFormat(locale, { dateStyle: "medium" })
35
+ };
36
+ dayFormats.set(locale, formats);
37
+ }
38
+ return formats;
39
+ }
10
40
  var isGroup = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
11
41
  function mergeStrings(defaults, overrides) {
12
42
  if (!isGroup(overrides) || !isGroup(defaults)) return defaults;
@@ -81,6 +111,7 @@ var DEFAULTS = {
81
111
  copyThing: (label) => `Copy ${label}`,
82
112
  copiedThing: (label) => `Copied ${label}`,
83
113
  copyThingFailed: (label) => `Couldn't copy ${label}`,
114
+ countOverflow: (max) => `${max}+`,
84
115
  noValue: "None",
85
116
  invalidName: "Use letters, numbers, dashes, and underscores.",
86
117
  invalidNumber: "Use a number.",
@@ -122,7 +153,10 @@ var DEFAULTS = {
122
153
  panelWidth: (px) => `${px} pixels wide`,
123
154
  refresh: "Refresh",
124
155
  refreshing: "Refreshing",
125
- updated: (ago) => `Updated ${ago}`
156
+ updated: (ago) => `Updated ${ago}`,
157
+ moreCount: (count) => `${count} more`,
158
+ copySelection: "Copy selection",
159
+ hiddenValue: "Hidden value"
126
160
  },
127
161
  dropdown: {
128
162
  select: (type) => `Select ${type}`,
@@ -130,6 +164,8 @@ var DEFAULTS = {
130
164
  searching: "Searching…",
131
165
  showOptions: "Show options",
132
166
  add: (text) => `Add “${text}”`,
167
+ create: (text) => `Create “${text}”`,
168
+ suggested: "Suggested",
133
169
  limitReached: (max) => `Up to ${max}`,
134
170
  removeValue: (label) => `Remove ${label}`
135
171
  },
@@ -137,7 +173,9 @@ var DEFAULTS = {
137
173
  pickDate: "Pick a date",
138
174
  time: "Time",
139
175
  previousMonth: "Previous month",
140
- nextMonth: "Next month"
176
+ nextMonth: "Next month",
177
+ typeDate: "Type a date",
178
+ invalidDate: "Not a date that can be chosen"
141
179
  },
142
180
  colorInput: {
143
181
  pick: (name) => name ? `Pick ${name.toLowerCase()}` : "Pick a color",
@@ -282,7 +320,8 @@ var DEFAULTS = {
282
320
  ].filter(([count]) => count).map(([count, one, many]) => `${count} ${count === 1 ? one : many}`).join(", ")}`,
283
321
  annotationSource: (job, step) => `in ${job} → ${step}`,
284
322
  stepNumber: (index) => `step ${index}`,
285
- warningCount: (count) => count === 1 ? "1 warning" : `${count} warnings`
323
+ warningCount: (count) => count === 1 ? "1 warning" : `${count} warnings`,
324
+ warningAbout: "About this warning"
286
325
  },
287
326
  jobActions: {
288
327
  openSubworkflowLogs: "Open subworkflow logs",
@@ -524,8 +563,23 @@ var DEFAULTS = {
524
563
  minutes: (n) => `${n}m`,
525
564
  hours: (n) => `${n}h`,
526
565
  days: (n) => `${n}d`,
527
- years: (n) => `${n}y`
566
+ years: (n) => `${n}y`,
567
+ inFuture: (label) => `in ${label}`,
568
+ date: (date, locale) => dayFormat(locale)[date.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear() ? "short" : "medium"].format(date)
569
+ },
570
+ keys: {
571
+ ctrl: "Ctrl",
572
+ alt: "Alt",
573
+ shift: "Shift",
574
+ meta: "Meta",
575
+ enter: "Enter",
576
+ escape: "Esc",
577
+ space: "Space",
578
+ tab: "Tab",
579
+ backspace: "Backspace",
580
+ delete: "Delete"
528
581
  },
582
+ chart: { total: "Total" },
529
583
  list: {
530
584
  moreActions: "More actions",
531
585
  labelName: "name",
@@ -535,6 +589,7 @@ var DEFAULTS = {
535
589
  labelId: "ID",
536
590
  labelUrl: "URL",
537
591
  couldNotLoad: (noun) => `Couldn't load ${noun}`,
592
+ couldNotLoadHint: "Something went wrong. Try again in a moment.",
538
593
  data: "data",
539
594
  count: (count, noun) => `${count} ${noun}`,
540
595
  matchCount: (matches, total, nounPlural) => `${matches} of ${total} ${nounPlural}`,
@@ -562,7 +617,62 @@ var DEFAULTS = {
562
617
  paginationPrevious: "Previous",
563
618
  paginationNext: "Next",
564
619
  pagination: "Pagination",
620
+ page: (page) => `Page ${page}`,
565
621
  removeSearchTerm: (term) => `Remove filter ${term}`
622
+ },
623
+ filters: {
624
+ addFilter: "Filter",
625
+ searchFields: "Filter by…",
626
+ activeFilters: "Active filters",
627
+ filterButton: (count) => count > 0 ? `Filter, ${count} on` : "Filter",
628
+ any: "Any",
629
+ pending: "Choose…",
630
+ operator: (op, count) => OPERATOR_WORDS[op](count),
631
+ more: (count) => `+${count}`,
632
+ overflow: (count) => `+${count} ${count === 1 ? "filter" : "filters"}`,
633
+ sheetTitle: "Filters",
634
+ remove: (field) => `Remove ${field} filter`,
635
+ chip: (field, operator, values) => [
636
+ field,
637
+ operator,
638
+ values
639
+ ].filter(Boolean).join(" "),
640
+ changeField: (field) => `Field: ${field}`,
641
+ changeOperator: (operator) => `Condition: ${operator}`,
642
+ changeValue: (values) => `Value: ${values}`,
643
+ list: (values) => values.join(", "),
644
+ datePreset: (preset) => {
645
+ const days = preset.match(/^-(\d+)d$/)?.[1];
646
+ return preset === "today" ? "Today" : preset === "month" ? "This month" : days ? `Last ${days} days` : preset;
647
+ },
648
+ customDate: "Custom…",
649
+ between: (from, to) => `${from} – ${to}`,
650
+ formatDate: (date, locale) => dayFormat(locale)[date.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear() ? "short" : "medium"].format(date),
651
+ textPlaceholder: "Type, then press Enter",
652
+ yes: "Yes",
653
+ no: "No"
654
+ },
655
+ errorPage: {
656
+ back: "Back",
657
+ home: "Back to home",
658
+ error: "This page couldn’t load",
659
+ statusTitle: (status) => `Error ${status}`,
660
+ titles: {
661
+ notFound: "Could not find the requested page",
662
+ forbidden: "No access",
663
+ unauthenticated: "Signed out",
664
+ unavailable: "The service is unreachable",
665
+ server: "Something went wrong on our side",
666
+ network: "You’re offline"
667
+ },
668
+ descriptions: {
669
+ notFound: "This page does not exist, or you do not have access to it.",
670
+ forbidden: "You can’t open this. Ask an administrator for access.",
671
+ unauthenticated: "Your session ended. Sign in again to pick up where you were.",
672
+ unavailable: "The server isn’t answering right now. Try again in a moment.",
673
+ server: "The page couldn’t load because of an error on the server.",
674
+ network: "The server couldn’t be reached. Check your connection and try again."
675
+ }
566
676
  }
567
677
  },
568
678
  navigation: {
@@ -577,11 +687,14 @@ var DEFAULTS = {
577
687
  openExternal: (href) => {
578
688
  const url = safeUrl(href);
579
689
  if (url) window.open(url, "_blank");
580
- }
690
+ },
691
+ goBack: () => window.history.back(),
692
+ canGoBack: () => typeof window !== "undefined" && window.history.length > 1
581
693
  },
582
694
  data: {
583
695
  useRunFile: defaultUseRunFile,
584
- usePersistedState: useLocalPersistedState
696
+ usePersistedState: useLocalPersistedState,
697
+ useProblemMessage: useNoProblemMessage
585
698
  },
586
699
  slots: {}
587
700
  };
@@ -590,9 +703,20 @@ var NavigationContext = createContext(DEFAULTS.navigation);
590
703
  var DataContext = createContext(DEFAULTS.data);
591
704
  var SlotsContext = createContext(DEFAULTS.slots);
592
705
  var EngineContext = createContext(void 0);
706
+ var LocaleContext = createContext(void 0);
707
+ var AvatarColoringContext = createContext("name");
593
708
  function useStrings() {
594
709
  return useContext(StringsContext);
595
710
  }
711
+ /** The host's locale for dates and times, such as `de-DE`. Undefined without one, which leaves
712
+ * each format's own default: the date library's for its times, the browser's for the rest. */
713
+ function useLocale() {
714
+ return useContext(LocaleContext);
715
+ }
716
+ /** How the host colors avatars, UIProvider's `avatarColoring`. */
717
+ function useAvatarColoring() {
718
+ return useContext(AvatarColoringContext);
719
+ }
596
720
  function useNavigation() {
597
721
  return useContext(NavigationContext);
598
722
  }
@@ -680,6 +804,17 @@ function useRunFile(slug, path, options) {
680
804
  const { useRunFile: boundUseRunFile } = useContext(DataContext);
681
805
  return boundUseRunFile(slug, path, options);
682
806
  }
807
+ var noProblemMessage = () => void 0;
808
+ function useNoProblemMessage() {
809
+ return noProblemMessage;
810
+ }
811
+ /** A coded problem's text in the reader's language: the host's message for its code and type, or
812
+ * else its own `message`. */
813
+ function useProblemText() {
814
+ const { useProblemMessage: boundUseProblemMessage } = useContext(DataContext);
815
+ const message = boundUseProblemMessage();
816
+ return useCallback((problem) => (problem.code ? message(problem.code, problem.params ?? void 0, problem.type ?? void 0) : void 0) ?? problem.message, [message]);
817
+ }
683
818
  function usePersistedState(key, defaultValue) {
684
819
  const { usePersistedState: boundUsePersistedState } = useContext(DataContext);
685
820
  return boundUsePersistedState(key, defaultValue);
@@ -698,7 +833,7 @@ function useMerged(compute, input) {
698
833
  };
699
834
  return ref.current.value;
700
835
  }
701
- function UIProvider({ strings, navigation, data, slots, engine: engineProp, nonce, children }) {
836
+ function UIProvider({ strings, navigation, data, slots, engine: engineProp, nonce, locale, avatarColoring = "name", children }) {
702
837
  const [firstLoader] = useState(() => typeof engineProp === "function" ? engineProp : void 0);
703
838
  const engine = typeof engineProp === "function" ? firstLoader ?? engineProp : engineProp;
704
839
  useEffect(() => {
@@ -715,7 +850,9 @@ function UIProvider({ strings, navigation, data, slots, engine: engineProp, nonc
715
850
  const [stableNavigation] = useState(() => ({
716
851
  goTo: (to) => (navigationRef.current?.goTo ?? DEFAULTS.navigation.goTo)(to),
717
852
  openStepSource: (uses, sourceUrl) => (navigationRef.current?.openStepSource ?? DEFAULTS.navigation.openStepSource)(uses, sourceUrl),
718
- openExternal: (href) => (navigationRef.current?.openExternal ?? DEFAULTS.navigation.openExternal)(href)
853
+ openExternal: (href) => (navigationRef.current?.openExternal ?? DEFAULTS.navigation.openExternal)(href),
854
+ goBack: () => (navigationRef.current?.goBack ?? DEFAULTS.navigation.goBack)(),
855
+ canGoBack: () => (navigationRef.current?.canGoBack ?? DEFAULTS.navigation.canGoBack)()
719
856
  }));
720
857
  return /* @__PURE__ */ jsx(StringsContext, {
721
858
  value: mergedStrings,
@@ -727,10 +864,16 @@ function UIProvider({ strings, navigation, data, slots, engine: engineProp, nonc
727
864
  value: stableSlots,
728
865
  children: /* @__PURE__ */ jsx(EngineContext, {
729
866
  value: engine,
730
- children: /* @__PURE__ */ jsxs(CSPProvider, {
731
- nonce,
732
- disableStyleElements: true,
733
- children: [/* @__PURE__ */ jsx(TooltipProvider, { children }), /* @__PURE__ */ jsx(Toaster, {})]
867
+ children: /* @__PURE__ */ jsx(LocaleContext, {
868
+ value: locale,
869
+ children: /* @__PURE__ */ jsx(AvatarColoringContext, {
870
+ value: avatarColoring,
871
+ children: /* @__PURE__ */ jsxs(CSPProvider, {
872
+ nonce,
873
+ disableStyleElements: true,
874
+ children: [/* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(ContextMenuProvider, { children }) }), /* @__PURE__ */ jsx(Toaster, {})]
875
+ })
876
+ })
734
877
  })
735
878
  })
736
879
  })
@@ -739,4 +882,4 @@ function UIProvider({ strings, navigation, data, slots, engine: engineProp, nonc
739
882
  });
740
883
  }
741
884
  //#endregion
742
- export { UIProvider, useLink, useLoadedWorkflowEngine, useNavigation, useOptionalWorkflowEngine, usePersistedState, useProvisionCorsRules, useRepoSuggestions, useRunFile, useSecretVariablesResolver, useSlots, useStrings, useWorkflowActions, useWorkflowEditing, useWorkflowEngine, useWorkflowEngineLoader, useWorkflowJsonResolver };
885
+ export { UIProvider, useAvatarColoring, useLink, useLoadedWorkflowEngine, useLocale, useNavigation, useOptionalWorkflowEngine, usePersistedState, useProblemText, useProvisionCorsRules, useRepoSuggestions, useRunFile, useSecretVariablesResolver, useSlots, useStrings, useWorkflowActions, useWorkflowEditing, useWorkflowEngine, useWorkflowEngineLoader, useWorkflowJsonResolver };
@@ -1,15 +1,22 @@
1
- import { type ButtonSize } from './buttonClasses.js';
1
+ import type { TimeValue } from '../format.js';
2
+ import { type ButtonSize, type ButtonVariant } from './buttonClasses.js';
2
3
  export interface RefreshButtonProps {
3
- /** May return a promise; the button spins until it settles. */
4
+ /** May return a promise; the button spins until it settles. A rejection only
5
+ * stops the spinning, so report a failure from the handler. */
4
6
  onRefresh: () => unknown;
5
7
  /** Spins for a refresh the host tracks itself, such as a revalidation. */
6
8
  refreshing?: boolean | undefined;
7
- /** When the data was last fetched. The button then reads "Updated 5
8
- * seconds ago" instead of "Refresh", and keeps that current. */
9
- updatedAt?: Date | number | null | undefined;
9
+ /** When the data was last fetched: a Date, epoch milliseconds, an ISO string or a luxon
10
+ * DateTime. The button then reads "Updated 5 seconds ago" instead of "Refresh", and
11
+ * keeps that current. */
12
+ updatedAt?: TimeValue;
10
13
  size?: ButtonSize | undefined;
14
+ /** A button's look, `ghost` by default; `inline` is text-sized muted text with no box, for
15
+ * a line of details such as a header's "Updated 2 minutes ago". */
16
+ variant?: ButtonVariant | 'inline' | undefined;
11
17
  /** Only the icon shows, with "Refresh" as its name and tooltip. */
12
18
  iconOnly?: boolean | undefined;
19
+ className?: string | undefined;
13
20
  }
14
21
  /** Fetches again on demand, and says so while it does, out loud too. */
15
- export declare function RefreshButton({ onRefresh, refreshing, updatedAt, size, iconOnly, }: RefreshButtonProps): import("react").JSX.Element;
22
+ export declare function RefreshButton({ onRefresh, refreshing, updatedAt, size, variant, iconOnly, className, }: RefreshButtonProps): import("react").JSX.Element;
@@ -4,11 +4,12 @@ import { RefreshIcon } from "../icons.js";
4
4
  import { Tooltip } from "./Tooltip.js";
5
5
  import { useStrings } from "./Provider.js";
6
6
  import { useRelativeTime } from "./relativeTime.js";
7
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
7
  import { useState } from "react";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/components/RefreshButton.tsx
10
+ var inlineClasses = "inline-flex cursor-pointer items-center gap-1 rounded px-1 py-0.5 text-(--theme-muted-text-color) transition-colors hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app) focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-(--theme-focus) [&_svg]:size-3";
10
11
  /** Fetches again on demand, and says so while it does, out loud too. */
11
- function RefreshButton({ onRefresh, refreshing = false, updatedAt, size = "md", iconOnly = false }) {
12
+ function RefreshButton({ onRefresh, refreshing = false, updatedAt, size = "md", variant = "ghost", iconOnly = false, className }) {
12
13
  const { common: t } = useStrings();
13
14
  const [pending, setPending] = useState(false);
14
15
  const busy = refreshing || pending;
@@ -18,7 +19,8 @@ function RefreshButton({ onRefresh, refreshing = false, updatedAt, size = "md",
18
19
  const result = onRefresh();
19
20
  if (result instanceof Promise) {
20
21
  setPending(true);
21
- result.finally(() => setPending(false));
22
+ const done = () => setPending(false);
23
+ result.then(done, done);
22
24
  }
23
25
  };
24
26
  const button = /* @__PURE__ */ jsxs("button", {
@@ -26,20 +28,26 @@ function RefreshButton({ onRefresh, refreshing = false, updatedAt, size = "md",
26
28
  onClick: refresh,
27
29
  "aria-busy": busy,
28
30
  "aria-label": iconOnly ? t.refresh : void 0,
29
- className: cx(buttonClasses({
30
- variant: "ghost",
31
+ className: cx(variant === "inline" ? inlineClasses : buttonClasses({
32
+ variant,
31
33
  size,
32
34
  iconOnly
33
- }), "group aria-busy:cursor-progress"),
35
+ }), "group aria-busy:cursor-progress", className),
34
36
  children: [/* @__PURE__ */ jsx(RefreshIcon, {
35
37
  "aria-hidden": "true",
36
38
  className: cx("shrink-0 motion-reduce:animate-none motion-reduce:transition-none", busy ? "animate-spin" : "transition-transform duration-300 group-hover:rotate-180")
37
- }), !iconOnly && (ago ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("span", {
39
+ }), !iconOnly && (ago ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("span", {
38
40
  className: "sr-only",
39
41
  children: [t.refresh, ". "]
40
- }), t.updated(ago)] }) : t.refresh)]
42
+ }), t.updated(ago)] }) : busy ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
43
+ className: "sr-only",
44
+ children: t.refresh
45
+ }), /* @__PURE__ */ jsx("span", {
46
+ "aria-hidden": "true",
47
+ children: t.refreshing
48
+ })] }) : t.refresh)]
41
49
  });
42
- return /* @__PURE__ */ jsxs(Fragment, { children: [iconOnly ? /* @__PURE__ */ jsx(Tooltip, {
50
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [iconOnly ? /* @__PURE__ */ jsx(Tooltip, {
43
51
  content: t.refresh,
44
52
  children: button
45
53
  }) : button, /* @__PURE__ */ jsx("span", {
@@ -1,12 +1,21 @@
1
1
  import type { RunStatus } from '../engine.js';
2
2
  import { type Tone } from './tone.js';
3
+ /** A status the icon shows: a run's, or one a host maps onto it, such as
4
+ * `pending` for something queued and `warning` for something done with problems. */
5
+ export type RunStatusIconStatus = RunStatus | 'pending' | 'warning';
3
6
  /** The tone a run status reads in, so a badge that says the status in words matches the
4
7
  * icon: `<StatusBadge variant={runStatusTone(status)}>`. */
5
- export declare function runStatusTone(status: RunStatus): Tone;
6
- /** A run's, job's or step's status as an icon in its tone, beside the name of what ran. It
7
- * is named by `strings.dag.statusLabel`. To say the status in words, use `StatusBadge` with
8
- * `runStatusTone`. */
9
- export declare function RunStatusIcon({ status, className, }: {
10
- status: RunStatus;
8
+ export declare function runStatusTone(status: RunStatusIconStatus): Tone;
9
+ export interface RunStatusIconProps {
10
+ status: RunStatusIconStatus;
11
+ /** Names the icon in place of `strings.dag.statusLabel`, for a host's own status
12
+ * shown in a run's look, such as "Provisioning" as running. */
13
+ label?: string | undefined;
14
+ /** Shows the name on hover and focus too, for an icon that stands without words. */
15
+ tooltip?: boolean | undefined;
11
16
  className?: string | undefined;
12
- }): import("react").JSX.Element;
17
+ }
18
+ /** A run's, job's or step's status as an icon in its tone, beside the name of what ran. It
19
+ * is named by `label`, or else `strings.dag.statusLabel`. To say the status in words, use
20
+ * `StatusBadge` with `runStatusTone`. */
21
+ export declare function RunStatusIcon({ status, label: ownLabel, tooltip, className, }: RunStatusIconProps): import("react").JSX.Element;
@@ -1,17 +1,22 @@
1
1
  import { cx } from "../cx.js";
2
- import { CancelIcon, FailIcon, NotRunningIcon, RunningIcon, SkipIcon, SuccessIcon } from "../icons.js";
2
+ import { CancelIcon, FailIcon, NotRunningIcon, PendingIcon, RunningIcon, SkipIcon, SuccessIcon, WarningIcon } from "../icons.js";
3
3
  import { toneIcon } from "./tone.js";
4
+ import { Tooltip } from "./Tooltip.js";
4
5
  import { useStrings } from "./Provider.js";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region src/components/RunStatusIcon.tsx
7
8
  var looks = {
9
+ pending: {
10
+ tone: "muted",
11
+ icon: PendingIcon
12
+ },
8
13
  started: {
9
- tone: "warning",
14
+ tone: "info",
10
15
  icon: RunningIcon,
11
16
  spin: true
12
17
  },
13
18
  running: {
14
- tone: "warning",
19
+ tone: "info",
15
20
  icon: RunningIcon,
16
21
  spin: true
17
22
  },
@@ -19,6 +24,10 @@ var looks = {
19
24
  tone: "success",
20
25
  icon: SuccessIcon
21
26
  },
27
+ warning: {
28
+ tone: "warning",
29
+ icon: WarningIcon
30
+ },
22
31
  failed: {
23
32
  tone: "error",
24
33
  icon: FailIcon
@@ -60,14 +69,14 @@ function runStatusTone(status) {
60
69
  return looks[status ?? ""].tone;
61
70
  }
62
71
  /** A run's, job's or step's status as an icon in its tone, beside the name of what ran. It
63
- * is named by `strings.dag.statusLabel`. To say the status in words, use `StatusBadge` with
64
- * `runStatusTone`. */
65
- function RunStatusIcon({ status, className }) {
72
+ * is named by `label`, or else `strings.dag.statusLabel`. To say the status in words, use
73
+ * `StatusBadge` with `runStatusTone`. */
74
+ function RunStatusIcon({ status, label: ownLabel, tooltip = false, className }) {
66
75
  const { dag } = useStrings();
67
76
  const look = looks[status ?? ""];
68
77
  const Icon = look.icon;
69
- const label = dag.statusLabel(status ?? "");
70
- return /* @__PURE__ */ jsx("span", {
78
+ const label = ownLabel ?? dag.statusLabel(status ?? "");
79
+ const icon = /* @__PURE__ */ jsx("span", {
71
80
  ...label ? {
72
81
  role: "img",
73
82
  "aria-label": label
@@ -79,6 +88,10 @@ function RunStatusIcon({ status, className }) {
79
88
  className: cx(look.spin && "animate-spin rounded-full")
80
89
  })
81
90
  });
91
+ return tooltip && label ? /* @__PURE__ */ jsx(Tooltip, {
92
+ content: label,
93
+ children: icon
94
+ }) : icon;
82
95
  }
83
96
  //#endregion
84
97
  export { RunStatusIcon, runStatusTone };
@@ -1,5 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
- export type SectionVariant = 'plain' | 'card';
2
+ export type SectionVariant = 'plain' | 'bare' | 'card';
3
+ export type SectionTone = 'default' | 'error';
3
4
  export type SectionSpacing = 'regular' | 'tight';
4
5
  export interface SectionProps {
5
6
  title: ReactNode;
@@ -10,9 +11,15 @@ export interface SectionProps {
10
11
  beside?: ReactNode;
11
12
  /** At the header's far end, such as an add button or a range picker. */
12
13
  actions?: ReactNode;
13
- /** `plain` rules the title off from the content under it; `card` frames the
14
- * section as a panel. */
14
+ /** `plain` rules the title off from the content under it; `bare` sets the title
15
+ * over the content with no rule; `card` frames the section as a panel. */
15
16
  variant?: SectionVariant | undefined;
17
+ /** `error` marks a card of irreversible actions, such as deleting what the page
18
+ * shows: its border and title turn the error color over a clear body. */
19
+ tone?: SectionTone | undefined;
20
+ /** A card's content reaches its edges, such as a table or a list ruled to its
21
+ * sides, instead of sitting inset under the header. */
22
+ flush?: boolean | undefined;
16
23
  /** The room between a `plain` section's rule and its content. `tight` suits content that
17
24
  * spaces itself tightly, such as a form with its labels over its fields, so the first row
18
25
  * sits as far under the rule as the rows under it sit under one another. */
@@ -35,4 +42,4 @@ export interface SectionProps {
35
42
  * that can fold away. Folding keeps the content mounted, so fields hold their
36
43
  * values and validation while closed. For a line inside content that reveals
37
44
  * more detail, use Disclosure. */
38
- export declare function Section({ title, description, beside, actions, variant, spacing, collapsible, open, onOpenChange, defaultOpen, headingLevel, id, className, children, }: SectionProps): import("react").JSX.Element;
45
+ export declare function Section({ title, description, beside, actions, variant, tone, flush, spacing, collapsible, open, onOpenChange, defaultOpen, headingLevel, id, className, children, }: SectionProps): import("react").JSX.Element;
@@ -1,18 +1,22 @@
1
1
  import { cx } from "../cx.js";
2
2
  import { ChevronRightIcon } from "../icons.js";
3
3
  import { collapsePanelClassName } from "./Disclosure.js";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
4
  import { useId } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Collapsible } from "@base-ui/react/collapsible";
7
7
  //#region src/components/Section.tsx
8
8
  var rootClasses = {
9
9
  plain: "flex w-full flex-col",
10
+ bare: "flex w-full flex-col",
10
11
  card: "panel mb-1 flex w-full flex-col"
11
12
  };
13
+ var errorCardClassName = "border-(--theme-error)/30 bg-transparent";
12
14
  var headerClasses = {
13
- plain: "flex w-full items-center gap-2 border-b border-(--theme-border) pb-1",
14
- card: "flex w-full items-center gap-2 p-4"
15
+ plain: "@container/section-header flex w-full flex-wrap items-center gap-x-2 gap-y-2 border-b border-(--theme-border) pb-1",
16
+ bare: "@container/section-header flex w-full flex-wrap items-center gap-x-2 gap-y-2",
17
+ card: "@container/section-header flex w-full flex-wrap items-center gap-x-2 gap-y-2 px-4 py-3"
15
18
  };
19
+ var actionsClassName = "flex shrink-0 ms-auto @max-[24rem]/section-header:ms-0 @max-[24rem]/section-header:basis-full";
16
20
  var ruleGaps = {
17
21
  regular: "mb-4",
18
22
  tight: "mb-1.5"
@@ -20,10 +24,12 @@ var ruleGaps = {
20
24
  var cardBodyClassName = "px-4 pb-4";
21
25
  var titleClasses = {
22
26
  plain: "text-base font-semibold",
27
+ bare: "text-base font-semibold",
23
28
  card: "text-base font-semibold"
24
29
  };
25
30
  var foldedTitleClasses = {
26
31
  plain: "",
32
+ bare: "",
27
33
  card: "not-data-panel-open:text-(--theme-muted-text-color)"
28
34
  };
29
35
  var chevronIndent = "pl-6";
@@ -31,19 +37,27 @@ var chevronIndent = "pl-6";
31
37
  * that can fold away. Folding keeps the content mounted, so fields hold their
32
38
  * values and validation while closed. For a line inside content that reveals
33
39
  * more detail, use Disclosure. */
34
- function Section({ title, description, beside, actions, variant = "plain", spacing = "regular", collapsible = true, open, onOpenChange, defaultOpen = true, headingLevel = 3, id, className, children }) {
40
+ function Section({ title, description, beside, actions, variant = "plain", tone = "default", flush = false, spacing = "regular", collapsible = true, open, onOpenChange, defaultOpen = true, headingLevel = 3, id, className, children }) {
35
41
  const Heading = `h${headingLevel}`;
36
42
  const descriptionId = useId();
37
43
  const describedBy = description ? descriptionId : void 0;
38
44
  const titleProps = { "data-section-title": "" };
39
45
  const fill = !beside && !actions;
46
+ const card = variant === "card";
47
+ const danger = card && tone === "error";
48
+ const rootClassName = cx(rootClasses[variant], danger && errorCardClassName, className);
49
+ const titleTone = danger && "text-(--theme-error-text)";
50
+ const body = card && !flush ? /* @__PURE__ */ jsx("div", {
51
+ className: cardBodyClassName,
52
+ children
53
+ }) : children;
40
54
  const header = (heading) => /* @__PURE__ */ jsxs("div", {
41
- className: cx(headerClasses[variant], variant === "plain" && ruleGaps[spacing]),
55
+ className: cx(headerClasses[variant], !card && ruleGaps[spacing]),
42
56
  "data-section-header": true,
43
57
  children: [/* @__PURE__ */ jsxs("div", {
44
- className: "flex min-w-0 flex-1 flex-col gap-0.5",
58
+ className: "flex min-w-0 grow basis-0 flex-col gap-0.5",
45
59
  children: [/* @__PURE__ */ jsxs("div", {
46
- className: "flex min-w-0 items-center gap-2",
60
+ className: "flex min-w-0 items-start gap-2",
47
61
  children: [heading, beside]
48
62
  }), description && /* @__PURE__ */ jsx("p", {
49
63
  id: descriptionId,
@@ -51,22 +65,22 @@ function Section({ title, description, beside, actions, variant = "plain", spaci
51
65
  children: description
52
66
  })]
53
67
  }), actions && /* @__PURE__ */ jsx("div", {
54
- className: "flex shrink-0 items-center gap-2",
55
- children: actions
68
+ className: cx(actionsClassName, collapsible && "@max-[24rem]/section-header:ps-6"),
69
+ children: /* @__PURE__ */ jsx("div", {
70
+ className: "flex w-fit items-center gap-2",
71
+ children: actions
72
+ })
56
73
  })]
57
74
  });
58
75
  if (!collapsible) return /* @__PURE__ */ jsxs("section", {
59
76
  id,
60
77
  "aria-describedby": describedBy,
61
- className: cx(rootClasses[variant], className),
78
+ className: rootClassName,
62
79
  children: [header(/* @__PURE__ */ jsx(Heading, {
63
80
  ...titleProps,
64
- className: cx("flex items-center", titleClasses[variant]),
81
+ className: cx("flex items-center", titleClasses[variant], titleTone),
65
82
  children: title
66
- })), variant === "card" ? /* @__PURE__ */ jsx("div", {
67
- className: cardBodyClassName,
68
- children
69
- }) : children]
83
+ })), body]
70
84
  });
71
85
  return /* @__PURE__ */ jsxs(Collapsible.Root, {
72
86
  id,
@@ -74,25 +88,22 @@ function Section({ title, description, beside, actions, variant = "plain", spaci
74
88
  open,
75
89
  onOpenChange: (next) => onOpenChange?.(next),
76
90
  defaultOpen,
77
- className: cx(rootClasses[variant], className),
91
+ className: rootClassName,
78
92
  children: [header(/* @__PURE__ */ jsx(Heading, {
79
93
  className: cx("flex min-w-0", fill && "flex-1"),
80
94
  children: /* @__PURE__ */ jsxs(Collapsible.Trigger, {
81
95
  ...titleProps,
82
96
  "aria-describedby": describedBy,
83
- className: cx("group flex min-w-0 cursor-pointer items-center gap-1 rounded-sm text-left focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--theme-focus)", fill && "w-full", titleClasses[variant], foldedTitleClasses[variant]),
97
+ className: cx("group flex min-w-0 cursor-pointer items-start gap-1 rounded-sm text-left select-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--theme-focus)", fill && "w-full", titleClasses[variant], titleTone || foldedTitleClasses[variant]),
84
98
  children: [/* @__PURE__ */ jsx(ChevronRightIcon, {
85
99
  "aria-hidden": "true",
86
- className: cx("shrink-0 transition-transform group-data-panel-open:rotate-90 motion-reduce:transition-none", "px-1 text-[1.25rem]")
100
+ className: cx("shrink-0 transition-transform group-data-panel-open:rotate-90 motion-reduce:transition-none", "mt-0.5 px-1 text-[1.25rem]")
87
101
  }), title]
88
102
  })
89
103
  })), /* @__PURE__ */ jsx(Collapsible.Panel, {
90
104
  keepMounted: true,
91
105
  className: collapsePanelClassName,
92
- children: variant === "card" ? /* @__PURE__ */ jsx("div", {
93
- className: cardBodyClassName,
94
- children
95
- }) : children
106
+ children: body
96
107
  })]
97
108
  });
98
109
  }