@parallelworks/ui 0.79.0 → 0.80.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.
@@ -91,6 +91,11 @@ function Combobox$1(props) {
91
91
  const list = useRef(null);
92
92
  const uid = useId();
93
93
  const [inputValue, setInputValue] = useState(null);
94
+ /** Empties the search, and tells a host that mirrors it. */
95
+ const clearQuery = (to = "") => {
96
+ if (inputValue) onQueryChange?.("");
97
+ setInputValue(to);
98
+ };
94
99
  const [highlighted, setHighlighted] = useState(void 0);
95
100
  const [startsOpen] = useState(open === void 0 && defaultOpen === true);
96
101
  const [ownOpen, setOwnOpen] = useState(false);
@@ -152,7 +157,7 @@ function Combobox$1(props) {
152
157
  }
153
158
  if (next.length === chosen.length) return false;
154
159
  setValues(next);
155
- setInputValue("");
160
+ clearQuery();
156
161
  return true;
157
162
  };
158
163
  const separators = props.multiple && props.creatable ? props.separators ?? [] : [];
@@ -173,11 +178,16 @@ function Combobox$1(props) {
173
178
  };
174
179
  const freeEntry = creatable && entries.flat.length === 0;
175
180
  const [first] = entries.items;
176
- const listItems = !created ? entries.items : first !== void 0 && "items" in first ? [{
181
+ const createLast = created?.action === true;
182
+ const listItems = !created ? entries.items : first !== void 0 && "items" in first ? createLast ? [...entries.items, {
183
+ label: "",
184
+ items: [created],
185
+ order: entries.items.length
186
+ }] : [{
177
187
  label: "",
178
188
  items: [created],
179
189
  order: -1
180
- }, ...entries.items] : [created, ...entries.items];
190
+ }, ...entries.items] : createLast ? [...entries.items, created] : [created, ...entries.items];
181
191
  const selectedIcon = selected?.icon && (inputValue === null || inputValue === selected.label) ? selected.icon : null;
182
192
  const input = /* @__PURE__ */ jsx(Combobox.Input, {
183
193
  id: trigger ? void 0 : id,
@@ -227,34 +237,48 @@ function Combobox$1(props) {
227
237
  })]
228
238
  })]
229
239
  }, rowProps.key);
230
- const parts = trigger ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Tooltip, {
231
- content: triggerTooltip,
232
- children: /* @__PURE__ */ jsx(Combobox.Trigger, {
233
- id,
234
- "aria-label": ariaLabel || void 0,
235
- "aria-labelledby": ariaLabelledBy,
236
- "aria-describedby": ariaDescribedBy,
237
- "aria-invalid": ariaInvalid || void 0,
238
- "aria-required": ariaRequired || required || void 0,
239
- render: trigger
240
- })
241
- }), /* @__PURE__ */ jsx(ListPopup, {
242
- listRef: list,
243
- empty: t.noOptionsFound,
244
- statusGroups: entries.statusGroups,
245
- query: inputValue ?? "",
246
- header: /* @__PURE__ */ jsx("div", {
247
- className: "border-b border-(--theme-border) p-1.5",
248
- children: input
240
+ const labelId = `${uid}-label`;
241
+ const valueId = `${uid}-value`;
242
+ const named = Boolean(ariaLabel || ariaLabelledBy);
243
+ const parts = trigger ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
244
+ named && /* @__PURE__ */ jsxs(Fragment$1, { children: [ariaLabel && !ariaLabelledBy && /* @__PURE__ */ jsx("span", {
245
+ id: labelId,
246
+ hidden: true,
247
+ children: ariaLabel
248
+ }), /* @__PURE__ */ jsx("span", {
249
+ id: valueId,
250
+ hidden: true,
251
+ children: /* @__PURE__ */ jsx(Combobox.Value, { children: (value) => Array.isArray(value) ? value.map(entryLabel).join(", ") : entryLabel(value) })
252
+ })] }),
253
+ /* @__PURE__ */ jsx(Tooltip, {
254
+ content: triggerTooltip,
255
+ children: /* @__PURE__ */ jsx(Combobox.Trigger, {
256
+ id,
257
+ "aria-labelledby": named ? `${ariaLabelledBy || labelId} ${valueId}` : void 0,
258
+ "aria-describedby": ariaDescribedBy,
259
+ "aria-invalid": ariaInvalid || void 0,
260
+ "aria-required": ariaRequired || required || void 0,
261
+ render: trigger
262
+ })
249
263
  }),
250
- className: details ? "w-[min(36rem,var(--available-width))]" : "w-max min-w-[min(max(14rem,var(--anchor-width)),var(--available-width))] max-w-[min(28rem,var(--available-width))]",
251
- sizer: details ? void 0 : /* @__PURE__ */ jsx(ListSizer, { entries: entries.flat }),
252
- align,
253
- loading: loading ? t.searching : void 0,
254
- details: details?.(highlighted?.created ? void 0 : highlighted?.value),
255
- collisionBoundary,
256
- renderItem: itemRow
257
- })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
264
+ /* @__PURE__ */ jsx(ListPopup, {
265
+ listRef: list,
266
+ empty: t.noOptionsFound,
267
+ statusGroups: entries.statusGroups,
268
+ query: inputValue ?? "",
269
+ header: /* @__PURE__ */ jsx("div", {
270
+ className: "border-b border-(--theme-border) p-1.5",
271
+ children: input
272
+ }),
273
+ className: details ? "w-[min(36rem,var(--available-width))]" : "w-max min-w-[min(max(14rem,var(--anchor-width)),var(--available-width))] max-w-[min(28rem,var(--available-width))]",
274
+ sizer: details ? void 0 : /* @__PURE__ */ jsx(ListSizer, { entries: entries.flat }),
275
+ align,
276
+ loading: loading ? t.searching : void 0,
277
+ details: details?.(highlighted?.created ? void 0 : highlighted?.value),
278
+ collisionBoundary,
279
+ renderItem: itemRow
280
+ })
281
+ ] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
258
282
  /* @__PURE__ */ jsxs(Combobox.InputGroup, {
259
283
  "data-testid": "combobox",
260
284
  className: cx(fieldClassName(size), freeEntry && "pr-2", className),
@@ -324,7 +348,7 @@ function Combobox$1(props) {
324
348
  ...open !== void 0 ? { open } : startsOpen ? { open: ownOpen } : {},
325
349
  onOpenChange: (next) => {
326
350
  setOwnOpen(next);
327
- if (!next && (trigger || !props.multiple)) setInputValue(null);
351
+ if (!next && (trigger || !props.multiple)) clearQuery(null);
328
352
  onOpenChange?.(next);
329
353
  },
330
354
  children: parts
@@ -343,7 +367,7 @@ function Combobox$1(props) {
343
367
  const action = next.find((entry) => entry.action);
344
368
  if (action) {
345
369
  details.cancel();
346
- setInputValue("");
370
+ clearQuery();
347
371
  onCreate?.(String(action.value));
348
372
  return;
349
373
  }
@@ -10,7 +10,11 @@ export interface OpenMenuOptions {
10
10
  size?: MenuSize | undefined;
11
11
  /** As `MenuPopup`'s: classes on the menu and its submenus, such as a terminal's colors. */
12
12
  themeClassName?: string | undefined;
13
+ /** What else closes it, for a menu over something that moves under it, such as a
14
+ * terminal's: a wheel outside the menu, the window losing focus, or the window resizing. */
15
+ closeOn?: readonly MenuCloseTrigger[] | undefined;
13
16
  }
17
+ export type MenuCloseTrigger = 'wheel' | 'blur' | 'resize';
14
18
  /** Where a menu opens: an element, such as the button that opened it, or a pointer event,
15
19
  * such as a right-click. An event with Shift held is left to the browser, whose own menu
16
20
  * then shows; any other has its default prevented. */
@@ -29,6 +33,7 @@ export type OpenMenu = (at: MenuOpener, items: MenuEntry[], options?: OpenMenuOp
29
33
  */
30
34
  export declare function useContextMenu(): {
31
35
  openMenu: OpenMenu;
36
+ closeMenu: () => void;
32
37
  contextMenu: import("react").JSX.Element | null;
33
38
  openedBy: Element | null;
34
39
  };
@@ -40,5 +45,8 @@ export declare function ContextMenuProvider({ children }: {
40
45
  /** Opens the app's one shared menu: `openMenu(e, items)` from a right-click, or
41
46
  * `openMenu(button, items)` under a button, which a second press closes. */
42
47
  export declare function useOpenMenu(): OpenMenu;
48
+ /** Closes the app's shared menu, if it is open, for a host whose surface moves out from under
49
+ * it in a way `closeOn` doesn't cover, such as a pane that switches. */
50
+ export declare function useCloseMenu(): () => void;
43
51
  /** The element the shared menu is open under, so its button can say it's expanded. */
44
52
  export declare function useMenuOpenedBy(): Element | null;
@@ -3,7 +3,7 @@ import { MenuPopup } from "./Menu.js";
3
3
  import { isDev } from "../dev.js";
4
4
  import { MenuEntries, MenuFilter } from "./MenuEntries.js";
5
5
  import { Menu } from "@base-ui/react/menu";
6
- import { createContext, use, useCallback, useRef, useState } from "react";
6
+ import { createContext, use, useCallback, useEffect, useRef, useState } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  //#region src/components/ContextMenu.tsx
9
9
  /**
@@ -44,6 +44,31 @@ function useContextMenu() {
44
44
  setOpen(true);
45
45
  return true;
46
46
  }, [release]);
47
+ /** Closes the menu, if one is open, as Escape would. */
48
+ const closeMenu = useCallback(() => {
49
+ if (current.current) {
50
+ current.current = null;
51
+ setOpen(false);
52
+ }
53
+ }, []);
54
+ const closeOn = open ? opened?.closeOn : void 0;
55
+ useEffect(() => {
56
+ if (!closeOn?.length) return;
57
+ const onWheel = (event) => {
58
+ if (!(event.target instanceof Element && event.target.closest("[role=\"menu\"]"))) closeMenu();
59
+ };
60
+ const listeners = [];
61
+ if (closeOn.includes("wheel")) listeners.push(["wheel", onWheel]);
62
+ if (closeOn.includes("blur")) listeners.push(["blur", closeMenu]);
63
+ if (closeOn.includes("resize")) listeners.push(["resize", closeMenu]);
64
+ for (const [type, listener] of listeners) window.addEventListener(type, listener, {
65
+ capture: true,
66
+ passive: true
67
+ });
68
+ return () => {
69
+ for (const [type, listener] of listeners) window.removeEventListener(type, listener, { capture: true });
70
+ };
71
+ }, [closeOn, closeMenu]);
47
72
  const onOpenChange = useCallback((next, details) => {
48
73
  if (next) return;
49
74
  const element = current.current?.element;
@@ -61,6 +86,7 @@ function useContextMenu() {
61
86
  }, [release]);
62
87
  return {
63
88
  openMenu,
89
+ closeMenu,
64
90
  contextMenu: opened && /* @__PURE__ */ jsx(MenuFilter, {
65
91
  search: opened.search,
66
92
  children: (query) => /* @__PURE__ */ jsx(Menu.Root, {
@@ -85,15 +111,19 @@ function useContextMenu() {
85
111
  }
86
112
  var OpenMenuContext = createContext(null);
87
113
  var OpenedByContext = createContext(null);
114
+ var CloseMenuContext = createContext(null);
88
115
  /** The one menu every row, button and canvas below it opens through `useOpenMenu`, so none
89
116
  * renders a menu of its own. `UIProvider` mounts it; nothing else needs to. */
90
117
  function ContextMenuProvider({ children }) {
91
- const { openMenu, contextMenu, openedBy } = useContextMenu();
118
+ const { openMenu, closeMenu, contextMenu, openedBy } = useContextMenu();
92
119
  return /* @__PURE__ */ jsx(OpenMenuContext, {
93
120
  value: openMenu,
94
- children: /* @__PURE__ */ jsxs(OpenedByContext, {
95
- value: openedBy,
96
- children: [children, contextMenu]
121
+ children: /* @__PURE__ */ jsx(CloseMenuContext, {
122
+ value: closeMenu,
123
+ children: /* @__PURE__ */ jsxs(OpenedByContext, {
124
+ value: openedBy,
125
+ children: [children, contextMenu]
126
+ })
97
127
  })
98
128
  });
99
129
  }
@@ -106,9 +136,15 @@ var warnNoProvider = () => {
106
136
  function useOpenMenu() {
107
137
  return use(OpenMenuContext) ?? warnNoProvider;
108
138
  }
139
+ var noMenu = () => {};
140
+ /** Closes the app's shared menu, if it is open, for a host whose surface moves out from under
141
+ * it in a way `closeOn` doesn't cover, such as a pane that switches. */
142
+ function useCloseMenu() {
143
+ return use(CloseMenuContext) ?? noMenu;
144
+ }
109
145
  /** The element the shared menu is open under, so its button can say it's expanded. */
110
146
  function useMenuOpenedBy() {
111
147
  return use(OpenedByContext);
112
148
  }
113
149
  //#endregion
114
- export { ContextMenuProvider, useContextMenu, useMenuOpenedBy, useOpenMenu };
150
+ export { ContextMenuProvider, useCloseMenu, useContextMenu, useMenuOpenedBy, useOpenMenu };
@@ -1,4 +1,4 @@
1
- import type { MouseEventHandler, ReactNode } from 'react';
1
+ import { type MouseEventHandler, type ReactNode } from 'react';
2
2
  /** The height a collapsible panel animates as it opens and closes. It clips
3
3
  * only while it moves, so focus rings and overflowing content show once open. */
4
4
  export declare const collapsePanelClassName = "h-(--collapsible-panel-height) transition-[height,opacity] duration-200 ease-out motion-reduce:transition-none data-starting-style:h-0 data-starting-style:overflow-hidden data-starting-style:opacity-0 data-ending-style:h-0 data-ending-style:overflow-hidden data-ending-style:opacity-0";
@@ -23,6 +23,10 @@ export interface DisclosureProps {
23
23
  /** Controls beside the summary, outside the toggle, so a row can hold buttons without
24
24
  * nesting them in it. */
25
25
  actions?: ReactNode;
26
+ /** Controls that read as part of the summary, right after it on its line, such as a button
27
+ * that says why a row failed. They sit outside the toggle, so no button holds another and
28
+ * each is its own stop for Tab; a click on the rest of the line still toggles. */
29
+ summaryControls?: ReactNode;
26
30
  /** On the whole disclosure, summary and detail, such as a row's own menu. */
27
31
  onContextMenu?: MouseEventHandler<HTMLDivElement> | undefined;
28
32
  children: ReactNode;
@@ -30,7 +34,7 @@ export interface DisclosureProps {
30
34
  /** A line inside content that reveals more detail beneath it, such as a tool
31
35
  * call's arguments or a model's reasoning. For a titled part of a page or
32
36
  * form, which belongs in the page's outline, use Section. */
33
- export declare function Disclosure({ summary, open, onOpenChange, defaultOpen, disabled, keepMounted, className, summaryClassName, panelClassName, chevron, actions, onContextMenu, children, }: DisclosureProps): import("react").JSX.Element;
37
+ export declare function Disclosure({ summary, open, onOpenChange, defaultOpen, disabled, keepMounted, className, summaryClassName, panelClassName, chevron, actions, summaryControls, onContextMenu, children, }: DisclosureProps): import("react").JSX.Element;
34
38
  /** The revealing panel alone, for a toggle that lives elsewhere, such as a
35
39
  * tree row's chevron that names this panel with `aria-controls`. */
36
40
  export declare function DisclosurePanel({ open, id, keepMounted, className, children, }: {
@@ -1,5 +1,6 @@
1
1
  import { cx } from "../cx.js";
2
2
  import { ChevronRightIcon } from "../icons.js";
3
+ import { useRef } from "react";
3
4
  import { jsx, jsxs } from "react/jsx-runtime";
4
5
  import { Collapsible } from "@base-ui/react/collapsible";
5
6
  //#region src/components/Disclosure.tsx
@@ -9,8 +10,11 @@ var collapsePanelClassName = "h-(--collapsible-panel-height) transition-[height,
9
10
  /** A line inside content that reveals more detail beneath it, such as a tool
10
11
  * call's arguments or a model's reasoning. For a titled part of a page or
11
12
  * form, which belongs in the page's outline, use Section. */
12
- function Disclosure({ summary, open, onOpenChange, defaultOpen = false, disabled = false, keepMounted = false, className, summaryClassName, panelClassName, chevron = true, actions, onContextMenu, children }) {
13
+ function Disclosure({ summary, open, onOpenChange, defaultOpen = false, disabled = false, keepMounted = false, className, summaryClassName, panelClassName, chevron = true, actions, summaryControls, onContextMenu, children }) {
14
+ const trigger = useRef(null);
15
+ const hasControls = summaryControls !== void 0 && summaryControls !== null && summaryControls !== false;
13
16
  const toggle = /* @__PURE__ */ jsxs(Collapsible.Trigger, {
17
+ ref: trigger,
14
18
  className: cx("group/disclosure flex min-w-0 items-start gap-2 rounded-sm text-left focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--theme-focus)", disabled ? "cursor-default" : "cursor-pointer", summaryClassName),
15
19
  children: [summary, !disabled && chevron && /* @__PURE__ */ jsx(ChevronRightIcon, {
16
20
  "aria-hidden": "true",
@@ -24,7 +28,25 @@ function Disclosure({ summary, open, onOpenChange, defaultOpen = false, disabled
24
28
  disabled,
25
29
  className,
26
30
  onContextMenu,
27
- children: [actions ? /* @__PURE__ */ jsxs("div", {
31
+ children: [hasControls ? /* @__PURE__ */ jsxs("div", {
32
+ className: "flex min-w-0 items-center gap-2",
33
+ children: [
34
+ toggle,
35
+ /* @__PURE__ */ jsx("div", {
36
+ className: "flex shrink-0 items-center gap-1",
37
+ children: summaryControls
38
+ }),
39
+ /* @__PURE__ */ jsx("div", {
40
+ "aria-hidden": "true",
41
+ className: cx("min-w-0 flex-1 self-stretch", !disabled && "cursor-pointer"),
42
+ onClick: () => trigger.current?.click()
43
+ }),
44
+ actions && /* @__PURE__ */ jsx("div", {
45
+ className: "flex shrink-0 items-center gap-1",
46
+ children: actions
47
+ })
48
+ ]
49
+ }) : actions ? /* @__PURE__ */ jsxs("div", {
28
50
  className: "flex min-w-0 items-center gap-2",
29
51
  children: [/* @__PURE__ */ jsx("div", {
30
52
  className: "flex min-w-0 flex-1",
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { Checkbox, CheckboxGroup, type CheckboxProps } from './components/Checkb
10
10
  export { ColorInput, type ColorInputProps } from './components/ColorInput.js';
11
11
  export { Autocomplete, type AutocompleteProps, Combobox, type ComboboxGroup, type ComboboxItem, type ComboboxItems, type ComboboxProps, } from './components/Combobox.js';
12
12
  export { ConfirmModal, type ConfirmModalProps, type ConfirmRequest, useConfirm, } from './components/ConfirmModal.js';
13
- export { ContextMenuProvider, type MenuOpener, type OpenMenu, type OpenMenuOptions, useContextMenu, useMenuOpenedBy, useOpenMenu, } from './components/ContextMenu.js';
13
+ export { ContextMenuProvider, type MenuCloseTrigger, type MenuOpener, type OpenMenu, type OpenMenuOptions, useCloseMenu, useContextMenu, useMenuOpenedBy, useOpenMenu, } from './components/ContextMenu.js';
14
14
  export { CopyButton, type CopyButtonProps, CopyCodeBlock, type CopyCodeBlockProps, } from './components/CopyButton.js';
15
15
  export { CreateModal, CreateModalSelect, CreateModalSwitch, } from './components/CreateModal.js';
16
16
  export { categoryClasses, categoryOf } from './components/category.js';
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { cx } from "./cx.js";
2
2
  import { buttonClasses } from "./components/buttonClasses.js";
3
3
  import { EmptyState } from "./components/EmptyState.js";
4
4
  import { MenuCheckboxItem, MenuGroupLabel, MenuItem, MenuLinkItem, MenuPopup, MenuRadioItem, MenuSeparator, MenuSubmenuTrigger } from "./components/Menu.js";
5
- import { ContextMenuProvider, useContextMenu, useMenuOpenedBy, useOpenMenu } from "./components/ContextMenu.js";
5
+ import { ContextMenuProvider, useCloseMenu, useContextMenu, useMenuOpenedBy, useOpenMenu } from "./components/ContextMenu.js";
6
6
  import { Loader } from "./components/Loader.js";
7
7
  import { toast } from "./components/Toast.js";
8
8
  import { Kbd, ariaKeyShortcuts, formatShortcut, isApplePlatform, shortcutText, useShortcutFormat } from "./components/Kbd.js";
@@ -83,4 +83,4 @@ import { ToggleGroup } from "./components/ToggleGroup.js";
83
83
  import { useClosingValue } from "./components/useClosingValue.js";
84
84
  import { useCssIsDark } from "./components/useCssIsDark.js";
85
85
  import { useApplyTheme, useColorMode } from "./components/useTheme.js";
86
- export { ActionMenu, AppLink, Autocomplete, Avatar, AvatarGroup, Breadcrumbs, Button, CODE_STYLES, Calendar, Callout, Card, CardHeader, ChartLegendList, ChartTooltipContent, Checkbox, CheckboxGroup, ColorInput, Combobox, ConfirmModal, ContextMenuProvider, CopyButton, CopyCodeBlock, CountBadge, CreateModal, CreateModalSelect, CreateModalSwitch, DEFAULT_CONTRAST, DEFAULT_PRESET, DEFAULT_THEME, DatePicker, DescriptionList, DescriptionListGroup, DescriptionListItem, Disclosure, DisclosurePanel, Drawer, Elapsed, EmptyState, ErrorPage, ErrorText, ExternalLink, Field, FieldOption, FieldValue, FileButton, HoverCard, IconButton, InfoTip, Input, JND, Kbd, LetterBadge, ListboxGroup, ListboxOption, ListboxPanel, Loader, LoadingRegion, Markdown, MenuCheckboxItem, MenuEntries, MenuFilter, MenuGroupLabel, MenuItem, MenuLinkItem, MenuPopup, MenuRadioItem, MenuSeparator, MenuSubmenuTrigger, Meter, MethodButton, Modal, ModalDescription, ModalTitle, NumberInput, OneTimeCodeInput, Overview, PAGE_SIZES, PageHeader, PageHeaderAction, PageHeaderAddButton, PageHeaderBar, PageHeaderMenu, PageHeaderProvider, Pagination, Popover, PopoverClose, ProgressBar, Radio, RadioGroup, RefreshButton, RelativeTime, RequiredMark, RevealToggle, RunStatusIcon, SIDEBAR_TOKENS, SearchInput, Section, SegmentedControl, Select, SelectionCopy, SeriesSwatch, SettingModeOption, SettingRow, SettingsCard, SettingsHeading, Skeleton, Slider, StatusBadge, StatusDot, StickyBar, Switch, THEME_PRESETS, THEME_TOKENS, TabPanel, Table, Tabs, Tag, TagList, Textarea, ThemeEditor, ThemePreview, TitleInput, ToggleGroup, Tooltip, TooltipProvider, UIProvider, apcaContrast, applyTheme, ariaKeyShortcuts, avatarInitials, buttonClasses, categoryClasses, categoryOf, collapsePanelClassName, composite, contrastRatio, cx, deltaE, deriveTheme, errorPageKind, fieldBox, fitSeed, formatBytes, formatCount, formatDateTime, formatDuration, formatInfoTipContent, formatShortcut, formatTimeLeft, generateTheme, isApplePlatform, isDarkColor, isMenuDivider, isMenuGroup, isMenuSubmenu, isPlainClick, isTextEntryContext, levelTone, menuDivider, modalPanelClassName, modeOf, normalizeTags, parseColor, parseTheme, prefersWideGamut, resolveMode, runStatusTone, schemeFor, serializeTheme, seriesColor, seriesColors, seriesOpacity, seriesSlotColor, shortcutText, statusTextClass, tagClasses, themeStylesheet, toHex, toP3, toast, useApplyTheme, useAvatarColoring, useClock, useClosePopover, useClosingValue, useColorMode, useConfirm, useContextMenu, useCopy, useCssIsDark, useElapsed, useFieldControl, useFieldLabelledControl, useListboxNavigation, useLocale, useMenuOpenedBy, useNavigation, useOpenMenu, useOptionalWorkflowEngine, usePersistedState, useProblemText, useProvisionCorsRules, useRelativeTime, useRunFile, useSeriesHighlight, useShortcutFormat, useShortcutKey, useSlots, useStrings, useWorkflowActions, useWorkflowEditing, useWorkflowEngine, useWorkflowEngineLoader };
86
+ export { ActionMenu, AppLink, Autocomplete, Avatar, AvatarGroup, Breadcrumbs, Button, CODE_STYLES, Calendar, Callout, Card, CardHeader, ChartLegendList, ChartTooltipContent, Checkbox, CheckboxGroup, ColorInput, Combobox, ConfirmModal, ContextMenuProvider, CopyButton, CopyCodeBlock, CountBadge, CreateModal, CreateModalSelect, CreateModalSwitch, DEFAULT_CONTRAST, DEFAULT_PRESET, DEFAULT_THEME, DatePicker, DescriptionList, DescriptionListGroup, DescriptionListItem, Disclosure, DisclosurePanel, Drawer, Elapsed, EmptyState, ErrorPage, ErrorText, ExternalLink, Field, FieldOption, FieldValue, FileButton, HoverCard, IconButton, InfoTip, Input, JND, Kbd, LetterBadge, ListboxGroup, ListboxOption, ListboxPanel, Loader, LoadingRegion, Markdown, MenuCheckboxItem, MenuEntries, MenuFilter, MenuGroupLabel, MenuItem, MenuLinkItem, MenuPopup, MenuRadioItem, MenuSeparator, MenuSubmenuTrigger, Meter, MethodButton, Modal, ModalDescription, ModalTitle, NumberInput, OneTimeCodeInput, Overview, PAGE_SIZES, PageHeader, PageHeaderAction, PageHeaderAddButton, PageHeaderBar, PageHeaderMenu, PageHeaderProvider, Pagination, Popover, PopoverClose, ProgressBar, Radio, RadioGroup, RefreshButton, RelativeTime, RequiredMark, RevealToggle, RunStatusIcon, SIDEBAR_TOKENS, SearchInput, Section, SegmentedControl, Select, SelectionCopy, SeriesSwatch, SettingModeOption, SettingRow, SettingsCard, SettingsHeading, Skeleton, Slider, StatusBadge, StatusDot, StickyBar, Switch, THEME_PRESETS, THEME_TOKENS, TabPanel, Table, Tabs, Tag, TagList, Textarea, ThemeEditor, ThemePreview, TitleInput, ToggleGroup, Tooltip, TooltipProvider, UIProvider, apcaContrast, applyTheme, ariaKeyShortcuts, avatarInitials, buttonClasses, categoryClasses, categoryOf, collapsePanelClassName, composite, contrastRatio, cx, deltaE, deriveTheme, errorPageKind, fieldBox, fitSeed, formatBytes, formatCount, formatDateTime, formatDuration, formatInfoTipContent, formatShortcut, formatTimeLeft, generateTheme, isApplePlatform, isDarkColor, isMenuDivider, isMenuGroup, isMenuSubmenu, isPlainClick, isTextEntryContext, levelTone, menuDivider, modalPanelClassName, modeOf, normalizeTags, parseColor, parseTheme, prefersWideGamut, resolveMode, runStatusTone, schemeFor, serializeTheme, seriesColor, seriesColors, seriesOpacity, seriesSlotColor, shortcutText, statusTextClass, tagClasses, themeStylesheet, toHex, toP3, toast, useApplyTheme, useAvatarColoring, useClock, useCloseMenu, useClosePopover, useClosingValue, useColorMode, useConfirm, useContextMenu, useCopy, useCssIsDark, useElapsed, useFieldControl, useFieldLabelledControl, useListboxNavigation, useLocale, useMenuOpenedBy, useNavigation, useOpenMenu, useOptionalWorkflowEngine, usePersistedState, useProblemText, useProvisionCorsRules, useRelativeTime, useRunFile, useSeriesHighlight, useShortcutFormat, useShortcutKey, useSlots, useStrings, useWorkflowActions, useWorkflowEditing, useWorkflowEngine, useWorkflowEngineLoader };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parallelworks/ui",
3
- "version": "0.79.0",
3
+ "version": "0.80.0",
4
4
  "description": "React UI components: a theme contract, icons, brand logos, primitives, lists, forms, a job graph, a code editor, a log viewer, a file explorer and an AI chat, each on its own subpath",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {