@octaviaflow/core 3.1.0-beta.111 → 3.1.0-beta.113

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.
package/dist/index.cjs CHANGED
@@ -10236,13 +10236,18 @@ var CommandPalette = (0, import_react63.forwardRef)(
10236
10236
  open,
10237
10237
  onClose,
10238
10238
  groups,
10239
- placeholder = "Search for actions, pages, datasets\u2026",
10239
+ placeholder = "Search\u2026",
10240
10240
  onSelect,
10241
10241
  emptyState,
10242
10242
  footer,
10243
10243
  filter = defaultFilter2,
10244
10244
  container,
10245
10245
  disableAnimation = false,
10246
+ query: controlledQuery,
10247
+ onQueryChange,
10248
+ shouldFilter = true,
10249
+ loading = false,
10250
+ loadingLabel = "Searching\u2026",
10246
10251
  id: providedId,
10247
10252
  className,
10248
10253
  ...rest
@@ -10252,14 +10257,16 @@ var CommandPalette = (0, import_react63.forwardRef)(
10252
10257
  const reducedMotion = (0, import_framer_motion13.useReducedMotion)();
10253
10258
  const inputRef = (0, import_react63.useRef)(null);
10254
10259
  const listRef = (0, import_react63.useRef)(null);
10255
- const [query, setQuery] = (0, import_react63.useState)("");
10260
+ const isQueryControlled = controlledQuery !== void 0;
10261
+ const [internalQuery, setInternalQuery] = (0, import_react63.useState)("");
10262
+ const query = isQueryControlled ? controlledQuery : internalQuery;
10256
10263
  const [activeIndex, setActiveIndex] = (0, import_react63.useState)(0);
10257
10264
  const filteredGroups = (0, import_react63.useMemo)(() => {
10258
10265
  return groups.map((g) => ({
10259
10266
  ...g,
10260
- items: g.items.filter((it) => filter(it, query, g.heading))
10267
+ items: g.shouldFilter ?? shouldFilter ? g.items.filter((it) => filter(it, query, g.heading)) : g.items
10261
10268
  })).filter((g) => g.items.length > 0);
10262
- }, [groups, query, filter]);
10269
+ }, [groups, query, filter, shouldFilter]);
10263
10270
  const flatItems = (0, import_react63.useMemo)(
10264
10271
  () => filteredGroups.flatMap((g) => g.items),
10265
10272
  [filteredGroups]
@@ -10271,7 +10278,7 @@ var CommandPalette = (0, import_react63.forwardRef)(
10271
10278
  }, [flatItems.length, activeIndex]);
10272
10279
  (0, import_react63.useEffect)(() => {
10273
10280
  if (open) {
10274
- setQuery("");
10281
+ if (!isQueryControlled) setInternalQuery("");
10275
10282
  setActiveIndex(0);
10276
10283
  requestAnimationFrame(() => inputRef.current?.focus());
10277
10284
  }
@@ -10350,76 +10357,85 @@ var CommandPalette = (0, import_react63.forwardRef)(
10350
10357
  placeholder,
10351
10358
  value: query,
10352
10359
  onChange: (e) => {
10353
- setQuery(e.target.value);
10360
+ const next = e.target.value;
10361
+ if (!isQueryControlled) setInternalQuery(next);
10362
+ onQueryChange?.(next);
10354
10363
  setActiveIndex(0);
10355
10364
  }
10356
10365
  }
10357
10366
  ),
10358
10367
  /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("kbd", { className: "ods-cmdk__esc-hint", "aria-hidden": "true", children: "Esc" })
10359
10368
  ] }),
10360
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
10369
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
10361
10370
  "div",
10362
10371
  {
10363
10372
  ref: listRef,
10364
10373
  id: `${baseId}-list`,
10365
10374
  role: "listbox",
10366
10375
  className: "ods-cmdk__list",
10367
- children: filteredGroups.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ods-cmdk__empty", children: emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [
10368
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "ods-cmdk__empty-title", children: "No results" }),
10369
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "ods-cmdk__empty-hint", children: "Try a different keyword." })
10370
- ] }) }) : (() => {
10371
- let flatIdx = -1;
10372
- return filteredGroups.map((g, gi) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
10373
- "div",
10374
- {
10375
- className: "ods-cmdk__group",
10376
- role: "group",
10377
- "aria-label": typeof g.heading === "string" ? g.heading : void 0,
10378
- children: [
10379
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ods-cmdk__group-heading", children: g.heading }),
10380
- g.items.map((item) => {
10381
- flatIdx += 1;
10382
- const idx = flatIdx;
10383
- const isActive2 = idx === activeIndex;
10384
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
10385
- "div",
10386
- {
10387
- id: `${baseId}-opt-${idx}`,
10388
- role: "option",
10389
- "aria-selected": isActive2,
10390
- "aria-disabled": item.disabled || void 0,
10391
- className: cn(
10392
- "ods-cmdk__option",
10393
- isActive2 && "ods-cmdk__option--active",
10394
- item.danger && "ods-cmdk__option--danger",
10395
- item.disabled && "ods-cmdk__option--disabled"
10396
- ),
10397
- onMouseEnter: () => setActiveIndex(idx),
10398
- onClick: () => handleItemClick(item),
10399
- children: [
10400
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
10401
- "span",
10402
- {
10403
- className: "ods-cmdk__option-icon",
10404
- "aria-hidden": "true",
10405
- children: item.icon
10406
- }
10376
+ "aria-busy": loading || void 0,
10377
+ children: [
10378
+ filteredGroups.length === 0 ? loading ? null : /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ods-cmdk__empty", children: emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [
10379
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "ods-cmdk__empty-title", children: "No results" }),
10380
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "ods-cmdk__empty-hint", children: "Try a different keyword." })
10381
+ ] }) }) : (() => {
10382
+ let flatIdx = -1;
10383
+ return filteredGroups.map((g, gi) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
10384
+ "div",
10385
+ {
10386
+ className: "ods-cmdk__group",
10387
+ role: "group",
10388
+ "aria-label": typeof g.heading === "string" ? g.heading : void 0,
10389
+ children: [
10390
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ods-cmdk__group-heading", children: g.heading }),
10391
+ g.items.map((item) => {
10392
+ flatIdx += 1;
10393
+ const idx = flatIdx;
10394
+ const isActive2 = idx === activeIndex;
10395
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
10396
+ "div",
10397
+ {
10398
+ id: `${baseId}-opt-${idx}`,
10399
+ role: "option",
10400
+ "aria-selected": isActive2,
10401
+ "aria-disabled": item.disabled || void 0,
10402
+ className: cn(
10403
+ "ods-cmdk__option",
10404
+ isActive2 && "ods-cmdk__option--active",
10405
+ item.danger && "ods-cmdk__option--danger",
10406
+ item.disabled && "ods-cmdk__option--disabled"
10407
10407
  ),
10408
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("span", { className: "ods-cmdk__option-body", children: [
10409
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "ods-cmdk__option-label", children: item.label }),
10410
- item.description && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "ods-cmdk__option-desc", children: item.description })
10411
- ] }),
10412
- item.shortcut && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("kbd", { className: "ods-cmdk__option-shortcut", children: item.shortcut })
10413
- ]
10414
- },
10415
- item.id
10416
- );
10417
- })
10418
- ]
10419
- },
10420
- gi
10421
- ));
10422
- })()
10408
+ onMouseEnter: () => setActiveIndex(idx),
10409
+ onClick: () => handleItemClick(item),
10410
+ children: [
10411
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
10412
+ "span",
10413
+ {
10414
+ className: "ods-cmdk__option-icon",
10415
+ "aria-hidden": "true",
10416
+ children: item.icon
10417
+ }
10418
+ ),
10419
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("span", { className: "ods-cmdk__option-body", children: [
10420
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "ods-cmdk__option-label", children: item.label }),
10421
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "ods-cmdk__option-desc", children: item.description })
10422
+ ] }),
10423
+ item.shortcut && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("kbd", { className: "ods-cmdk__option-shortcut", children: item.shortcut })
10424
+ ]
10425
+ },
10426
+ item.id
10427
+ );
10428
+ })
10429
+ ]
10430
+ },
10431
+ gi
10432
+ ));
10433
+ })(),
10434
+ loading && /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "ods-cmdk__loading", role: "status", "aria-live": "polite", children: [
10435
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Spinner, { size: "sm", tone: "muted", "aria-hidden": "true" }),
10436
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { children: loadingLabel })
10437
+ ] })
10438
+ ]
10423
10439
  }
10424
10440
  ),
10425
10441
  footer && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ods-cmdk__footer", children: footer })
@@ -16859,7 +16875,10 @@ function shortReferenceLabel(token) {
16859
16875
  if (token.startsWith("{{ods://")) {
16860
16876
  const path = token.slice(8, -2);
16861
16877
  const parts = path.split("/");
16862
- if (parts[0] === "steps" && parts.length >= 4) return parts.slice(3).join(".");
16878
+ if (parts[0] === "steps") {
16879
+ if (parts.length >= 4) return parts.slice(3).join(".");
16880
+ return parts[2] ?? "output";
16881
+ }
16863
16882
  if (parts[0] === "flow") return `flow.${parts.slice(1).join(".")}`;
16864
16883
  return parts.join(".");
16865
16884
  }
@@ -40069,6 +40088,7 @@ function SlideoutContent({
40069
40088
  title,
40070
40089
  children,
40071
40090
  footer,
40091
+ headerActions,
40072
40092
  className,
40073
40093
  offsetTop = 0,
40074
40094
  offsetBottom = 0
@@ -40154,16 +40174,19 @@ function SlideoutContent({
40154
40174
  children: [
40155
40175
  title && /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("div", { className: "ods-slideout__header", children: [
40156
40176
  /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("h2", { ...titleProps, className: "ods-slideout__title", children: title }),
40157
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
40158
- "button",
40159
- {
40160
- className: "ods-slideout__close",
40161
- onClick: onClose,
40162
- "aria-label": "Close panel",
40163
- type: "button",
40164
- children: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("path", { d: "M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" }) })
40165
- }
40166
- )
40177
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("div", { className: "ods-slideout__header-actions", children: [
40178
+ headerActions,
40179
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
40180
+ "button",
40181
+ {
40182
+ className: "ods-slideout__close",
40183
+ onClick: onClose,
40184
+ "aria-label": "Close panel",
40185
+ type: "button",
40186
+ children: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("path", { d: "M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" }) })
40187
+ }
40188
+ )
40189
+ ] })
40167
40190
  ] }),
40168
40191
  /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("div", { className: "ods-slideout__body", children }),
40169
40192
  footer && /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("div", { className: "ods-slideout__footer", children: footer })
@@ -41676,15 +41699,57 @@ var defaultIcons = {
41676
41699
  ] })
41677
41700
  };
41678
41701
  var ToastContext = (0, import_react188.createContext)(null);
41679
- function ToastBody({ item, onDismiss }) {
41702
+ function ToastBody({ item, stacked, onDismiss }) {
41680
41703
  const dismiss = () => onDismiss(item.id);
41704
+ const [expanded, setExpanded] = (0, import_react188.useState)(false);
41705
+ const [overflowing, setOverflowing] = (0, import_react188.useState)(false);
41706
+ const descRef = (0, import_react188.useRef)(null);
41707
+ const cut = item.clampLines > 0 && !expanded;
41708
+ (0, import_react188.useLayoutEffect)(() => {
41709
+ if (!cut) return;
41710
+ const el = descRef.current;
41711
+ if (el) setOverflowing(el.scrollHeight > el.clientHeight + 1);
41712
+ }, [cut, item.description]);
41681
41713
  if (item.render) return /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(import_jsx_runtime174.Fragment, { children: item.render({ id: item.id, dismiss }) });
41682
41714
  const title = item.title ?? item.message;
41715
+ const toggles = overflowing && !stacked;
41716
+ const toggle = () => setExpanded((v) => !v);
41717
+ const onTextClick = (e) => {
41718
+ if (!toggles) return;
41719
+ if (window.getSelection()?.toString()) return;
41720
+ e.stopPropagation();
41721
+ toggle();
41722
+ };
41683
41723
  return /* @__PURE__ */ (0, import_jsx_runtime174.jsxs)(import_jsx_runtime174.Fragment, { children: [
41684
41724
  /* @__PURE__ */ (0, import_jsx_runtime174.jsx)("span", { className: "ods-toast__icon", "aria-hidden": "true", children: item.icon ?? defaultIcons[item.variant] }),
41685
- /* @__PURE__ */ (0, import_jsx_runtime174.jsxs)("div", { className: "ods-toast__body", children: [
41725
+ /* @__PURE__ */ (0, import_jsx_runtime174.jsxs)("div", { className: "ods-toast__body", onClick: onTextClick, children: [
41686
41726
  title && /* @__PURE__ */ (0, import_jsx_runtime174.jsx)("div", { className: "ods-toast__title", children: title }),
41687
- item.description && /* @__PURE__ */ (0, import_jsx_runtime174.jsx)("div", { className: "ods-toast__desc", children: item.description })
41727
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(
41728
+ "div",
41729
+ {
41730
+ ref: descRef,
41731
+ className: cn(
41732
+ "ods-toast__desc",
41733
+ cut && "ods-toast__desc--cut",
41734
+ toggles && "ods-toast__desc--toggles"
41735
+ ),
41736
+ style: cut ? { "--ods-toast-clamp": item.clampLines } : void 0,
41737
+ children: item.description
41738
+ }
41739
+ ),
41740
+ toggles && /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(
41741
+ "button",
41742
+ {
41743
+ type: "button",
41744
+ className: "ods-toast__more",
41745
+ "aria-expanded": expanded,
41746
+ onClick: (e) => {
41747
+ e.stopPropagation();
41748
+ toggle();
41749
+ },
41750
+ children: expanded ? "Less" : "More"
41751
+ }
41752
+ )
41688
41753
  ] }),
41689
41754
  (item.actionLabel || item.action) && /* @__PURE__ */ (0, import_jsx_runtime174.jsx)("div", { className: "ods-toast__action", children: item.actionLabel ? (
41690
41755
  // First-class action chip — consistent styling, auto-dismiss
@@ -41732,10 +41797,17 @@ function ToastBody({ item, onDismiss }) {
41732
41797
  )
41733
41798
  ] });
41734
41799
  }
41735
- function PositionStack({ items, position, onDismiss, maxStack }) {
41800
+ function PositionStack({ items, position, onDismiss, onHold, onRelease, maxStack }) {
41736
41801
  const [hovered, setHovered] = (0, import_react188.useState)(false);
41802
+ const [focused, setFocused] = (0, import_react188.useState)(false);
41737
41803
  const [pinned, setPinned] = (0, import_react188.useState)(false);
41738
41804
  const expanded = hovered || pinned;
41805
+ const held = hovered || focused;
41806
+ const ids = (0, import_react188.useMemo)(() => items.map((t) => t.id), [items]);
41807
+ (0, import_react188.useEffect)(() => {
41808
+ if (held) onHold(ids);
41809
+ else onRelease(ids);
41810
+ }, [held, ids, onHold, onRelease]);
41739
41811
  const ordered = (0, import_react188.useMemo)(() => [...items].reverse(), [items]);
41740
41812
  const isBottom = position.startsWith("bottom");
41741
41813
  const dir = isBottom ? -1 : 1;
@@ -41763,6 +41835,10 @@ function PositionStack({ items, position, onDismiss, maxStack }) {
41763
41835
  ),
41764
41836
  onMouseEnter: () => setHovered(true),
41765
41837
  onMouseLeave: () => setHovered(false),
41838
+ onFocus: () => setFocused(true),
41839
+ onBlur: (e) => {
41840
+ if (!e.currentTarget.contains(e.relatedTarget)) setFocused(false);
41841
+ },
41766
41842
  "aria-live": "polite",
41767
41843
  children: [
41768
41844
  /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(
@@ -41800,7 +41876,14 @@ function PositionStack({ items, position, onDismiss, maxStack }) {
41800
41876
  setPinned(true);
41801
41877
  }
41802
41878
  },
41803
- children: /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(ToastBody, { item, onDismiss })
41879
+ children: /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(
41880
+ ToastBody,
41881
+ {
41882
+ item,
41883
+ stacked: !expanded && items.length > 1,
41884
+ onDismiss
41885
+ }
41886
+ )
41804
41887
  },
41805
41888
  item.id
41806
41889
  );
@@ -41837,29 +41920,51 @@ function ToastProvider({
41837
41920
  const [toasts, setToasts] = (0, import_react188.useState)([]);
41838
41921
  const timers = (0, import_react188.useRef)(/* @__PURE__ */ new Map());
41839
41922
  const idCounter2 = (0, import_react188.useRef)(0);
41840
- const dismiss = (0, import_react188.useCallback)((id) => {
41841
- setToasts((prev) => prev.filter((t) => t.id !== id));
41842
- const timer = timers.current.get(id);
41843
- if (timer) {
41844
- clearTimeout(timer);
41845
- timers.current.delete(id);
41846
- }
41923
+ const forget = (0, import_react188.useCallback)((id) => {
41924
+ const c = timers.current.get(id);
41925
+ if (c?.handle) clearTimeout(c.handle);
41926
+ timers.current.delete(id);
41847
41927
  }, []);
41848
- const dismissAll = (0, import_react188.useCallback)((position) => {
41849
- setToasts((prev) => {
41850
- const remaining = position ? prev.filter((t) => t.position !== position) : [];
41851
- for (const t of prev) {
41852
- if (!remaining.find((r) => r.id === t.id)) {
41853
- const timer = timers.current.get(t.id);
41854
- if (timer) {
41855
- clearTimeout(timer);
41856
- timers.current.delete(t.id);
41857
- }
41928
+ const dismiss = (0, import_react188.useCallback)(
41929
+ (id) => {
41930
+ setToasts((prev) => prev.filter((t) => t.id !== id));
41931
+ forget(id);
41932
+ },
41933
+ [forget]
41934
+ );
41935
+ const dismissAll = (0, import_react188.useCallback)(
41936
+ (position) => {
41937
+ setToasts((prev) => {
41938
+ const remaining = position ? prev.filter((t) => t.position !== position) : [];
41939
+ for (const t of prev) {
41940
+ if (!remaining.find((r) => r.id === t.id)) forget(t.id);
41858
41941
  }
41859
- }
41860
- return remaining;
41861
- });
41942
+ return remaining;
41943
+ });
41944
+ },
41945
+ [forget]
41946
+ );
41947
+ const hold = (0, import_react188.useCallback)((ids) => {
41948
+ const now2 = Date.now();
41949
+ for (const id of ids) {
41950
+ const c = timers.current.get(id);
41951
+ if (!c || c.handle === null) continue;
41952
+ clearTimeout(c.handle);
41953
+ c.handle = null;
41954
+ c.remaining = Math.max(0, c.remaining - (now2 - c.since));
41955
+ }
41862
41956
  }, []);
41957
+ const release = (0, import_react188.useCallback)(
41958
+ (ids) => {
41959
+ for (const id of ids) {
41960
+ const c = timers.current.get(id);
41961
+ if (!c || c.handle !== null) continue;
41962
+ c.since = Date.now();
41963
+ c.handle = setTimeout(() => dismiss(id), c.remaining);
41964
+ }
41965
+ },
41966
+ [dismiss]
41967
+ );
41863
41968
  const toast = (0, import_react188.useCallback)(
41864
41969
  (options2) => {
41865
41970
  const id = `toast-${++idCounter2.current}`;
@@ -41876,12 +41981,16 @@ function ToastProvider({
41876
41981
  render: options2.render,
41877
41982
  duration: options2.duration ?? 5e3,
41878
41983
  closeable: options2.closeable ?? true,
41879
- position: options2.position ?? defaultPosition
41984
+ position: options2.position ?? defaultPosition,
41985
+ clampLines: options2.clampLines ?? 2
41880
41986
  };
41881
41987
  setToasts((prev) => [...prev, item]);
41882
41988
  if (item.duration > 0) {
41883
- const timer = setTimeout(() => dismiss(id), item.duration);
41884
- timers.current.set(id, timer);
41989
+ timers.current.set(id, {
41990
+ handle: setTimeout(() => dismiss(id), item.duration),
41991
+ remaining: item.duration,
41992
+ since: Date.now()
41993
+ });
41885
41994
  }
41886
41995
  return id;
41887
41996
  },
@@ -41909,7 +42018,9 @@ function ToastProvider({
41909
42018
  items: list,
41910
42019
  position: pos,
41911
42020
  maxStack,
41912
- onDismiss: dismiss
42021
+ onDismiss: dismiss,
42022
+ onHold: hold,
42023
+ onRelease: release
41913
42024
  },
41914
42025
  pos
41915
42026
  );
@@ -42810,7 +42921,20 @@ function VersionHistory({
42810
42921
  }) {
42811
42922
  const [expandedId, setExpandedId] = (0, import_react195.useState)(defaultExpandedId);
42812
42923
  const baseId = (0, import_react195.useId)();
42813
- const showToolbar = Boolean(tabs && tabs.length > 0 || onRefresh);
42924
+ const showToolbar = Boolean(tabs && tabs.length > 0);
42925
+ const refreshButton = onRefresh ? /* @__PURE__ */ (0, import_jsx_runtime182.jsx)(
42926
+ "button",
42927
+ {
42928
+ type: "button",
42929
+ className: "ods-version-history__refresh",
42930
+ onClick: onRefresh,
42931
+ disabled: refreshing,
42932
+ "aria-label": "Refresh history",
42933
+ title: "Refresh",
42934
+ "data-spinning": refreshing || void 0,
42935
+ children: /* @__PURE__ */ (0, import_jsx_runtime182.jsx)(RefreshGlyph, {})
42936
+ }
42937
+ ) : null;
42814
42938
  return /* @__PURE__ */ (0, import_jsx_runtime182.jsxs)(
42815
42939
  SlideoutPanel,
42816
42940
  {
@@ -42819,6 +42943,7 @@ function VersionHistory({
42819
42943
  position,
42820
42944
  width,
42821
42945
  title,
42946
+ headerActions: showToolbar ? void 0 : refreshButton,
42822
42947
  offsetTop,
42823
42948
  offsetBottom,
42824
42949
  className: cn("ods-version-history", className),
@@ -42846,19 +42971,7 @@ function VersionHistory({
42846
42971
  tab.id
42847
42972
  );
42848
42973
  }) }) : /* @__PURE__ */ (0, import_jsx_runtime182.jsx)("span", {}),
42849
- onRefresh && /* @__PURE__ */ (0, import_jsx_runtime182.jsx)(
42850
- "button",
42851
- {
42852
- type: "button",
42853
- className: "ods-version-history__refresh",
42854
- onClick: onRefresh,
42855
- disabled: refreshing,
42856
- "aria-label": "Refresh history",
42857
- title: "Refresh",
42858
- "data-spinning": refreshing || void 0,
42859
- children: /* @__PURE__ */ (0, import_jsx_runtime182.jsx)(RefreshGlyph, {})
42860
- }
42861
- )
42974
+ refreshButton
42862
42975
  ] }),
42863
42976
  error && /* @__PURE__ */ (0, import_jsx_runtime182.jsx)("div", { className: "ods-version-history__banner", children: /* @__PURE__ */ (0, import_jsx_runtime182.jsx)(Banner, { variant: "error", appearance: "subtle", title: "Couldn't load history", description: error }) }),
42864
42977
  /* @__PURE__ */ (0, import_jsx_runtime182.jsx)("div", { className: "ods-version-history__body", role: "tabpanel", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime182.jsxs)("div", { className: "ods-version-history__status", role: "status", "aria-live": "polite", children: [
@@ -47655,6 +47768,14 @@ var DEFAULT_NOTIFICATION_CATALOG = [
47655
47768
  subjectNoun: "app",
47656
47769
  defaultEmail: false
47657
47770
  },
47771
+ {
47772
+ key: "connector.expiring_soon",
47773
+ label: "App sign-in expires soon",
47774
+ phrase: "an app's sign-in is about to expire",
47775
+ severity: "warning",
47776
+ audience: "org",
47777
+ subjectNoun: "app"
47778
+ },
47658
47779
  {
47659
47780
  key: "connector.test_failed",
47660
47781
  label: "Connection test failed",