@octaviaflow/core 3.1.0-beta.84 → 3.1.0-beta.86

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.js CHANGED
@@ -7843,6 +7843,7 @@ ContextMenu.displayName = "ContextMenu";
7843
7843
  // src/components/DataMapper/DataMapper.tsx
7844
7844
  import {
7845
7845
  forwardRef as forwardRef35,
7846
+ Fragment as Fragment17,
7846
7847
  useCallback as useCallback14,
7847
7848
  useEffect as useEffect16,
7848
7849
  useImperativeHandle as useImperativeHandle3,
@@ -7850,7 +7851,7 @@ import {
7850
7851
  useRef as useRef17,
7851
7852
  useState as useState22
7852
7853
  } from "react";
7853
- import { Fragment as Fragment17, jsx as jsx43, jsxs as jsxs43 } from "react/jsx-runtime";
7854
+ import { Fragment as Fragment18, jsx as jsx43, jsxs as jsxs43 } from "react/jsx-runtime";
7854
7855
  var TYPE_CLASSES = {
7855
7856
  string: "string",
7856
7857
  integer: "integer",
@@ -7867,22 +7868,92 @@ var TYPE_CLASSES = {
7867
7868
  function pathOf(f) {
7868
7869
  return f.path ?? f.key;
7869
7870
  }
7870
- function flatten(fields, expanded, depth = 0, parentArray = false) {
7871
+ function flatten(fields, expanded, depth = 0, parentKey = null, ancestors = []) {
7871
7872
  const out = [];
7872
- for (const f of fields) {
7873
- out.push({ field: f, depth, isArrayItem: parentArray });
7874
- if (f.children && f.children.length > 0 && expanded.has(f.key)) {
7875
- out.push(...flatten(f.children, expanded, depth + 1, !!f.isArray || f.type === "array"));
7873
+ fields.forEach((f, i) => {
7874
+ const isGroup = isGroupField(f);
7875
+ const isOpen = expanded.has(f.key);
7876
+ const insertAt = isGroup && isOpen ? { parentKey: f.key, index: 0, depth: depth + 1 } : { parentKey, index: i + 1, depth };
7877
+ out.push({
7878
+ field: f,
7879
+ depth,
7880
+ insertAt,
7881
+ // Deepest first, so one step left is one level out. When the gap is
7882
+ // already inside a group, this level's own "after me" point is the
7883
+ // first alternative.
7884
+ insertAlternatives: [
7885
+ ...isGroup && isOpen ? [{ parentKey, index: i + 1, depth }] : [],
7886
+ ...[...ancestors].reverse()
7887
+ ]
7888
+ });
7889
+ if (isGroup && isOpen) {
7890
+ out.push(
7891
+ ...flatten(f.children ?? [], expanded, depth + 1, f.key, [
7892
+ ...ancestors,
7893
+ { parentKey, index: i + 1, depth }
7894
+ ])
7895
+ );
7876
7896
  }
7877
- }
7897
+ });
7878
7898
  return out;
7879
7899
  }
7900
+ function flattenFields(fields, expanded) {
7901
+ return flatten(fields, expanded);
7902
+ }
7880
7903
  function collectAll(fields) {
7881
7904
  return fields.flatMap((f) => [f, ...f.children ? collectAll(f.children) : []]);
7882
7905
  }
7906
+ function isGroupField(f) {
7907
+ if (f.children && f.children.length > 0) return true;
7908
+ const t = String(f.type ?? "").toLowerCase();
7909
+ return !!f.custom && (f.isArray === true || t === "array" || t === "object");
7910
+ }
7911
+ function isArrayField(f) {
7912
+ return f.isArray === true || String(f.type ?? "").toLowerCase() === "array";
7913
+ }
7883
7914
  function collectGroupKeys(fields) {
7884
7915
  return collectAll(fields).filter((f) => !!f.children && f.children.length > 0).map((f) => f.key);
7885
7916
  }
7917
+ var DEFAULT_ADD_FIELD_TYPES = [
7918
+ "string",
7919
+ "number",
7920
+ "boolean",
7921
+ "datetime",
7922
+ "object",
7923
+ "array"
7924
+ ];
7925
+ function insertField(fields, parentKey, index, field) {
7926
+ if (parentKey === null) {
7927
+ const next = [...fields];
7928
+ next.splice(index, 0, field);
7929
+ return next;
7930
+ }
7931
+ return fields.map((f) => {
7932
+ if (f.key === parentKey) {
7933
+ const kids = [...f.children ?? []];
7934
+ kids.splice(index, 0, field);
7935
+ return { ...f, children: kids };
7936
+ }
7937
+ if (f.children && f.children.length > 0) {
7938
+ return { ...f, children: insertField(f.children, parentKey, index, field) };
7939
+ }
7940
+ return f;
7941
+ });
7942
+ }
7943
+ function removeField(fields, key) {
7944
+ return fields.filter((f) => f.key !== key).map(
7945
+ (f) => f.children && f.children.length > 0 ? { ...f, children: removeField(f.children, key) } : f
7946
+ );
7947
+ }
7948
+ function makeFieldKey(fields, parentKey, name) {
7949
+ const slug = name.trim().replace(/\s+/g, "_");
7950
+ const base = parentKey ? `${parentKey}.${slug}` : slug;
7951
+ const taken = new Set(collectAll(fields).map((f) => f.key));
7952
+ if (!taken.has(base)) return base;
7953
+ let n = 2;
7954
+ while (taken.has(`${base}_${n}`)) n += 1;
7955
+ return `${base}_${n}`;
7956
+ }
7886
7957
  var TOKEN_RE = /\{\{([^}]+)\}\}/g;
7887
7958
  var FN_RE = /\b([a-zA-Z_][a-zA-Z0-9_]*)\(/g;
7888
7959
  function fieldToken(path) {
@@ -8199,6 +8270,9 @@ var DataMapper = forwardRef35(
8199
8270
  onClose,
8200
8271
  defaultSidebarOpen = true,
8201
8272
  defaultGroupsExpanded = true,
8273
+ allowAddFields = false,
8274
+ onTargetFieldsChange,
8275
+ addFieldTypes = DEFAULT_ADD_FIELD_TYPES,
8202
8276
  className,
8203
8277
  ...rest
8204
8278
  }, forwardedRef) {
@@ -8211,6 +8285,68 @@ var DataMapper = forwardRef35(
8211
8285
  const appliedGroupKeysRef = useRef17(
8212
8286
  new Set(defaultGroupsExpanded ? collectGroupKeys(targetFields) : [])
8213
8287
  );
8288
+ const [addingAt, setAddingAt] = useState22(null);
8289
+ const [newFieldName, setNewFieldName] = useState22("");
8290
+ const [hoverDepth, setHoverDepth] = useState22({});
8291
+ const [newFieldType, setNewFieldType] = useState22(addFieldTypes[0] ?? "string");
8292
+ const canAddFields = allowAddFields && typeof onTargetFieldsChange === "function";
8293
+ const commitAddField = useCallback14(() => {
8294
+ const raw = newFieldName.trim();
8295
+ if (!raw || !onTargetFieldsChange || !addingAt) return;
8296
+ const { parentKey, index } = addingAt;
8297
+ const parsed = raw.split(".").map((p) => p.trim()).filter(Boolean).map((p) => {
8298
+ const isArr = p.endsWith("[]");
8299
+ return { name: isArr ? p.slice(0, -2).trim() : p, isArray: isArr };
8300
+ }).filter((p) => p.name.length > 0);
8301
+ if (parsed.length === 0) return;
8302
+ const last = parsed[parsed.length - 1];
8303
+ const leafType = last.isArray ? "array" : newFieldType;
8304
+ const leafIsGroup = leafType === "object" || leafType === "array";
8305
+ const baseKey = makeFieldKey(targetFields, parentKey, parsed[0].name);
8306
+ const prefixOf = (depth) => [baseKey, ...parsed.slice(1, depth + 1).map((p) => p.name)].join(".");
8307
+ let node = {
8308
+ key: prefixOf(parsed.length - 1),
8309
+ label: last.name,
8310
+ type: leafType,
8311
+ custom: true,
8312
+ // A group with no children renders as a leaf and could never be added
8313
+ // to; seed it so it is immediately expandable.
8314
+ ...leafIsGroup ? { children: [], isArray: leafType === "array" } : {}
8315
+ };
8316
+ const opened = leafIsGroup ? [node.key] : [];
8317
+ for (let i = parsed.length - 2; i >= 0; i--) {
8318
+ const key = prefixOf(i);
8319
+ const seg = parsed[i];
8320
+ node = {
8321
+ key,
8322
+ label: seg.name,
8323
+ // Intermediate levels are objects unless explicitly marked `[]`.
8324
+ type: seg.isArray ? "array" : "object",
8325
+ custom: true,
8326
+ ...seg.isArray ? { isArray: true } : {},
8327
+ children: [node]
8328
+ };
8329
+ opened.push(key);
8330
+ }
8331
+ onTargetFieldsChange(insertField(targetFields, parentKey, index, node));
8332
+ setNewFieldName("");
8333
+ setAddingAt(null);
8334
+ if (opened.length > 0) {
8335
+ setExpandedTargets((prev) => {
8336
+ const next = new Set(prev);
8337
+ opened.forEach((k) => next.add(k));
8338
+ return next;
8339
+ });
8340
+ }
8341
+ }, [newFieldName, newFieldType, addingAt, targetFields, onTargetFieldsChange]);
8342
+ const commitRemoveField = useCallback14(
8343
+ (key) => {
8344
+ if (!onTargetFieldsChange) return;
8345
+ onTargetFieldsChange(removeField(targetFields, key));
8346
+ onChange(mappings.filter((m) => m.target !== key && !m.target.startsWith(`${key}.`)));
8347
+ },
8348
+ [targetFields, onTargetFieldsChange, mappings, onChange]
8349
+ );
8214
8350
  const [targetSearch, setTargetSearch] = useState22("");
8215
8351
  const [sourceSearch, setSourceSearch] = useState22("");
8216
8352
  const [display, setDisplay] = useState22(defaultDisplay);
@@ -8366,13 +8502,119 @@ var DataMapper = forwardRef35(
8366
8502
  e.dataTransfer.setData("application/x-ods-mapper", JSON.stringify({ snippet }));
8367
8503
  e.dataTransfer.setData("text/plain", snippet);
8368
8504
  };
8505
+ const renderGap = (at, key, alternatives = []) => {
8506
+ const hovered = hoverDepth[key];
8507
+ const choices = [at, ...alternatives];
8508
+ const active = choices[Math.min(hovered ?? 0, choices.length - 1)] ?? at;
8509
+ const isOpen = addingAt?.parentKey === active.parentKey && addingAt?.index === active.index;
8510
+ if (isOpen) {
8511
+ return /* @__PURE__ */ jsxs43(
8512
+ "div",
8513
+ {
8514
+ className: "ods-data-mapper__add-form",
8515
+ style: { paddingLeft: 12 + active.depth * 16 },
8516
+ onKeyDown: (e) => {
8517
+ if (e.key === "Enter") {
8518
+ e.preventDefault();
8519
+ commitAddField();
8520
+ }
8521
+ if (e.key === "Escape") {
8522
+ e.preventDefault();
8523
+ setAddingAt(null);
8524
+ setNewFieldName("");
8525
+ }
8526
+ },
8527
+ children: [
8528
+ /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__add-name", children: /* @__PURE__ */ jsx43(
8529
+ Input,
8530
+ {
8531
+ size: "sm",
8532
+ autoFocus: true,
8533
+ value: newFieldName,
8534
+ placeholder: "Name \xB7 Address.City to nest \xB7 Lines[].Amount for a list",
8535
+ "aria-label": "New field name",
8536
+ onChange: (e) => setNewFieldName(e.target.value)
8537
+ }
8538
+ ) }),
8539
+ /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__add-type", children: /* @__PURE__ */ jsx43(
8540
+ Select,
8541
+ {
8542
+ size: "sm",
8543
+ options: addFieldTypes.map((t) => ({ value: t, label: t })),
8544
+ value: newFieldType,
8545
+ "aria-label": "New field type",
8546
+ onChange: setNewFieldType
8547
+ }
8548
+ ) }),
8549
+ /* @__PURE__ */ jsx43(Button, { size: "sm", disabled: !newFieldName.trim(), onClick: commitAddField, children: "Add" }),
8550
+ /* @__PURE__ */ jsx43(
8551
+ Button,
8552
+ {
8553
+ size: "sm",
8554
+ variant: "ghost",
8555
+ onClick: () => {
8556
+ setAddingAt(null);
8557
+ setNewFieldName("");
8558
+ },
8559
+ children: "Cancel"
8560
+ }
8561
+ )
8562
+ ]
8563
+ },
8564
+ key
8565
+ );
8566
+ }
8567
+ return /* @__PURE__ */ jsx43(
8568
+ "button",
8569
+ {
8570
+ type: "button",
8571
+ className: "ods-data-mapper__gap",
8572
+ "aria-label": choices.length > 1 ? "Add a field here \u2014 move left to add it to an outer level" : "Add a field here",
8573
+ onMouseMove: (e) => {
8574
+ if (choices.length < 2) return;
8575
+ const x = e.clientX - e.currentTarget.getBoundingClientRect().left;
8576
+ const stepsOut = Math.round(Math.max(0, 12 + at.depth * 16 - x) / 16);
8577
+ const next = Math.min(stepsOut, choices.length - 1);
8578
+ setHoverDepth((prev) => prev[key] === next ? prev : { ...prev, [key]: next });
8579
+ },
8580
+ onMouseLeave: () => setHoverDepth((prev) => {
8581
+ if (prev[key] === void 0) return prev;
8582
+ const next = { ...prev };
8583
+ delete next[key];
8584
+ return next;
8585
+ }),
8586
+ onClick: () => {
8587
+ setAddingAt(active);
8588
+ setNewFieldName("");
8589
+ },
8590
+ children: /* @__PURE__ */ jsxs43(
8591
+ "span",
8592
+ {
8593
+ className: "ods-data-mapper__gap-line",
8594
+ style: { left: 12 + active.depth * 16 },
8595
+ "aria-hidden": "true",
8596
+ children: [
8597
+ /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__gap-rule" }),
8598
+ /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__gap-label", children: [
8599
+ /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__gap-plus", children: "+" }),
8600
+ "Add field"
8601
+ ] }),
8602
+ /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__gap-rule" })
8603
+ ]
8604
+ }
8605
+ )
8606
+ },
8607
+ key
8608
+ );
8609
+ };
8369
8610
  const rows = useMemo9(
8370
8611
  () => flatten(targetFields, expandedTargets),
8371
8612
  [targetFields, expandedTargets]
8372
8613
  );
8373
8614
  const filteredRows = useMemo9(() => {
8374
8615
  const q2 = targetSearch.trim().toLowerCase();
8375
- return rows.filter(({ field }) => {
8616
+ return rows.filter((row) => {
8617
+ const { field } = row;
8376
8618
  if (q2) {
8377
8619
  const hay = `${field.label} ${field.apiName ?? ""} ${field.key}`.toLowerCase();
8378
8620
  if (!hay.includes(q2)) return false;
@@ -8391,7 +8633,7 @@ var DataMapper = forwardRef35(
8391
8633
  return all.filter((f) => f.required && !mappings.some((m) => m.target === f.key)).length;
8392
8634
  }, [targetFields, mappings]);
8393
8635
  const sourceRows = useMemo9(() => {
8394
- const flat = flatten(sourceFields, expandedSource);
8636
+ const flat = flattenFields(sourceFields, expandedSource);
8395
8637
  const q2 = sourceSearch.trim().toLowerCase();
8396
8638
  if (!q2) return flat;
8397
8639
  return flat.filter(
@@ -8461,7 +8703,7 @@ var DataMapper = forwardRef35(
8461
8703
  " mapped"
8462
8704
  ] })
8463
8705
  ] }),
8464
- requiredUnmapped > 0 && /* @__PURE__ */ jsxs43(Fragment17, { children: [
8706
+ requiredUnmapped > 0 && /* @__PURE__ */ jsxs43(Fragment18, { children: [
8465
8707
  /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__stat-sep", children: "\xB7" }),
8466
8708
  /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__stat ods-data-mapper__stat--warn", children: [
8467
8709
  /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__stat-value", children: requiredUnmapped }),
@@ -8597,218 +8839,241 @@ var DataMapper = forwardRef35(
8597
8839
  /* @__PURE__ */ jsx43("div", { className: "ods-data-mapper__grid-head-cell", children: "Target field" }),
8598
8840
  /* @__PURE__ */ jsx43("div", { className: "ods-data-mapper__grid-head-cell", children: "Expression" })
8599
8841
  ] }),
8600
- filteredRows.length === 0 ? /* @__PURE__ */ jsx43("div", { className: "ods-data-mapper__empty", children: targetSearch ? "No matching target fields" : "No target fields" }) : filteredRows.map(({ field, depth, isArrayItem }) => {
8842
+ canAddFields && !targetSearch.trim() && display === "all" && renderGap({ parentKey: null, index: 0, depth: 0 }, "gap-top"),
8843
+ filteredRows.length === 0 ? /* @__PURE__ */ jsx43("div", { className: "ods-data-mapper__empty", children: targetSearch ? "No matching target fields" : "No target fields" }) : filteredRows.map((row) => {
8844
+ const { field, depth } = row;
8601
8845
  const isSelected = selectedTarget === field.key;
8602
- const hasChildren = !!(field.children && field.children.length > 0);
8846
+ const hasChildren = isGroupField(field);
8847
+ const isInert = hasChildren;
8603
8848
  const isExpanded = expandedTargets.has(field.key);
8604
8849
  const expr = expressionFor(field.key);
8605
8850
  const isMapped = !!expr;
8606
8851
  const mappedChildren = hasChildren ? mappedDescendantCount(field) : 0;
8607
8852
  const groupHasHiddenMappings = hasChildren && !isExpanded && mappedChildren > 0;
8608
- return /* @__PURE__ */ jsxs43(
8609
- "div",
8610
- {
8611
- className: cn(
8612
- "ods-data-mapper__row",
8613
- isSelected && "ods-data-mapper__row--selected",
8614
- isMapped && "ods-data-mapper__row--mapped",
8615
- groupHasHiddenMappings && "ods-data-mapper__row--group-mapped",
8616
- dropTarget === field.key && "ods-data-mapper__row--drop-target"
8617
- ),
8618
- "data-target-key": field.key,
8619
- onDragEnter: (e) => {
8620
- if (hasChildren) return;
8621
- e.preventDefault();
8622
- setDropTarget((prev) => prev === field.key ? prev : field.key);
8623
- },
8624
- onDragOver: (e) => {
8625
- if (hasChildren) return;
8626
- e.preventDefault();
8627
- e.dataTransfer.dropEffect = "copy";
8628
- if (dropTarget !== field.key) setDropTarget(field.key);
8629
- },
8630
- onDragLeave: (e) => {
8631
- if (hasChildren) return;
8632
- const next = e.relatedTarget;
8633
- if (next && e.currentTarget.contains(next)) return;
8634
- setDropTarget((prev) => prev === field.key ? null : prev);
8635
- },
8636
- onDrop: (e) => {
8637
- if (hasChildren) return;
8638
- e.preventDefault();
8639
- const snippet = readDragSnippet(e);
8640
- setDropTarget(null);
8641
- if (snippet) dropOntoTarget(field.key, snippet);
8642
- },
8643
- children: [
8644
- /* @__PURE__ */ jsxs43(
8645
- "div",
8646
- {
8647
- className: "ods-data-mapper__cell ods-data-mapper__cell--target",
8648
- onClick: () => !hasChildren && setSelectedTarget(field.key),
8649
- children: [
8650
- depth > 0 && /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__guides", "aria-hidden": "true", children: Array.from({ length: depth }).map((_, i) => /* @__PURE__ */ jsx43(
8651
- "span",
8652
- {
8653
- className: cn(
8654
- "ods-data-mapper__guide",
8655
- i === depth - 1 && "ods-data-mapper__guide--last"
8656
- )
8657
- },
8658
- i
8659
- )) }),
8660
- hasChildren ? /* @__PURE__ */ jsx43(
8661
- "button",
8662
- {
8663
- type: "button",
8664
- className: cn(
8665
- "ods-data-mapper__caret",
8666
- isExpanded && "ods-data-mapper__caret--open"
8667
- ),
8668
- onClick: (e) => {
8669
- e.stopPropagation();
8670
- handleToggleTarget(field.key);
8671
- },
8672
- "aria-label": isExpanded ? "Collapse" : "Expand",
8673
- "aria-expanded": isExpanded,
8674
- children: isExpanded ? /* @__PURE__ */ jsx43(ChevronDownIcon3, {}) : /* @__PURE__ */ jsx43(ChevronRightIcon2, {})
8675
- }
8676
- ) : /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__caret-spacer" }),
8677
- /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__field-meta", children: [
8678
- /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__field-label", children: [
8679
- field.label,
8680
- field.required && // Asterisk is decorative; the required state is
8681
- // communicated to AT via the visually-hidden text
8682
- // below — keeping `aria-label` on a plain <span>
8683
- // would trigger axe's aria-prohibited-attr rule.
8684
- /* @__PURE__ */ jsxs43(Fragment17, { children: [
8685
- /* @__PURE__ */ jsx43(
8686
- "span",
8687
- {
8688
- className: "ods-data-mapper__field-req",
8689
- "aria-hidden": "true",
8690
- children: "*"
8691
- }
8692
- ),
8693
- /* @__PURE__ */ jsxs43(
8694
- "span",
8695
- {
8696
- style: {
8697
- position: "absolute",
8698
- width: 1,
8699
- height: 1,
8700
- padding: 0,
8701
- margin: -1,
8702
- overflow: "hidden",
8703
- clip: "rect(0,0,0,0)",
8704
- whiteSpace: "nowrap",
8705
- border: 0
8706
- },
8707
- children: [
8708
- " ",
8709
- "(required)"
8710
- ]
8711
- }
8712
- )
8713
- ] })
8714
- ] }),
8715
- field.apiName && /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__field-api", children: field.apiName })
8716
- ] }),
8717
- renderTypePill(field.type),
8718
- (field.isArray || field.type === "array" || isArrayItem) && hasChildren && /* @__PURE__ */ jsxs43(
8719
- "label",
8720
- {
8721
- className: "ods-data-mapper__foreach",
8722
- onClick: (e) => e.stopPropagation(),
8723
- children: [
8724
- /* @__PURE__ */ jsx43("input", { type: "checkbox", defaultChecked: true, "aria-label": "For each record" }),
8725
- /* @__PURE__ */ jsx43("span", { children: "For each record" })
8726
- ]
8727
- }
8728
- )
8729
- ]
8730
- }
8853
+ const showGaps = canAddFields && !targetSearch.trim() && display === "all";
8854
+ return /* @__PURE__ */ jsxs43(Fragment17, { children: [
8855
+ /* @__PURE__ */ jsxs43(
8856
+ "div",
8857
+ {
8858
+ className: cn(
8859
+ "ods-data-mapper__row",
8860
+ isSelected && "ods-data-mapper__row--selected",
8861
+ isMapped && "ods-data-mapper__row--mapped",
8862
+ groupHasHiddenMappings && "ods-data-mapper__row--group-mapped",
8863
+ dropTarget === field.key && "ods-data-mapper__row--drop-target"
8731
8864
  ),
8732
- /* @__PURE__ */ jsx43(
8733
- "div",
8734
- {
8735
- className: cn(
8736
- "ods-data-mapper__cell",
8737
- "ods-data-mapper__cell--expr",
8738
- isSelected && "ods-data-mapper__cell--expr-editing"
8739
- ),
8740
- onClick: () => !hasChildren && setSelectedTarget(field.key),
8741
- children: hasChildren ? /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__expr-group", children: [
8742
- /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__expr-group-count", children: [
8743
- "Group \xB7 ",
8744
- field.children?.length ?? 0,
8745
- " sub-field",
8746
- field.children?.length === 1 ? "" : "s"
8747
- ] }),
8748
- mappedChildren > 0 && /* @__PURE__ */ jsxs43(
8749
- "span",
8750
- {
8751
- className: "ods-data-mapper__expr-group-badge",
8752
- title: `${mappedChildren} of ${field.children?.length ?? 0} sub-fields mapped`,
8753
- children: [
8754
- mappedChildren,
8755
- " mapped"
8756
- ]
8757
- }
8758
- )
8759
- ] }) : isSelected ? /* @__PURE__ */ jsxs43("div", { className: "ods-data-mapper__editor", onClick: (e) => e.stopPropagation(), children: [
8760
- /* @__PURE__ */ jsx43(
8761
- ExpressionEditor,
8762
- {
8763
- editorRef,
8764
- value: expr,
8765
- sourceFields,
8766
- variables,
8767
- onChange: (v) => setExpression(field.key, v),
8768
- onEscape: () => setSelectedTarget(null),
8769
- onDropSnippet: (snippet) => dropOntoTarget(field.key, snippet),
8770
- readDragSnippet
8771
- }
8772
- ),
8773
- /* @__PURE__ */ jsxs43("div", { className: "ods-data-mapper__editor-actions", children: [
8774
- /* @__PURE__ */ jsx43(
8865
+ "data-target-key": field.key,
8866
+ onDragEnter: (e) => {
8867
+ if (isInert) return;
8868
+ e.preventDefault();
8869
+ setDropTarget((prev) => prev === field.key ? prev : field.key);
8870
+ },
8871
+ onDragOver: (e) => {
8872
+ if (isInert) return;
8873
+ e.preventDefault();
8874
+ e.dataTransfer.dropEffect = "copy";
8875
+ if (dropTarget !== field.key) setDropTarget(field.key);
8876
+ },
8877
+ onDragLeave: (e) => {
8878
+ if (isInert) return;
8879
+ const next = e.relatedTarget;
8880
+ if (next && e.currentTarget.contains(next)) return;
8881
+ setDropTarget((prev) => prev === field.key ? null : prev);
8882
+ },
8883
+ onDrop: (e) => {
8884
+ if (isInert) return;
8885
+ e.preventDefault();
8886
+ const snippet = readDragSnippet(e);
8887
+ setDropTarget(null);
8888
+ if (snippet) dropOntoTarget(field.key, snippet);
8889
+ },
8890
+ children: [
8891
+ /* @__PURE__ */ jsxs43(
8892
+ "div",
8893
+ {
8894
+ className: "ods-data-mapper__cell ods-data-mapper__cell--target",
8895
+ onClick: () => !isInert && setSelectedTarget(field.key),
8896
+ children: [
8897
+ depth > 0 && /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__guides", "aria-hidden": "true", children: Array.from({ length: depth }).map((_, i) => /* @__PURE__ */ jsx43(
8898
+ "span",
8899
+ {
8900
+ className: cn(
8901
+ "ods-data-mapper__guide",
8902
+ i === depth - 1 && "ods-data-mapper__guide--last"
8903
+ )
8904
+ },
8905
+ i
8906
+ )) }),
8907
+ hasChildren ? /* @__PURE__ */ jsx43(
8775
8908
  "button",
8776
8909
  {
8777
8910
  type: "button",
8778
- className: "ods-data-mapper__editor-fx",
8779
- onClick: () => {
8780
- setSidebarOpen(true);
8781
- setSidebarTab("functions");
8911
+ className: cn(
8912
+ "ods-data-mapper__caret",
8913
+ isExpanded && "ods-data-mapper__caret--open"
8914
+ ),
8915
+ onClick: (e) => {
8916
+ e.stopPropagation();
8917
+ handleToggleTarget(field.key);
8782
8918
  },
8783
- "aria-label": "Insert function",
8784
- title: "Functions",
8785
- children: /* @__PURE__ */ jsx43(FxIcon, {})
8919
+ "aria-label": isExpanded ? "Collapse" : "Expand",
8920
+ "aria-expanded": isExpanded,
8921
+ children: isExpanded ? /* @__PURE__ */ jsx43(ChevronDownIcon3, {}) : /* @__PURE__ */ jsx43(ChevronRightIcon2, {})
8786
8922
  }
8787
- ),
8788
- expr && /* @__PURE__ */ jsx43(
8789
- "button",
8923
+ ) : /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__caret-spacer" }),
8924
+ /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__field-meta", children: [
8925
+ /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__field-label", children: [
8926
+ field.label,
8927
+ field.required && // Asterisk is decorative; the required state is
8928
+ // communicated to AT via the visually-hidden text
8929
+ // below — keeping `aria-label` on a plain <span>
8930
+ // would trigger axe's aria-prohibited-attr rule.
8931
+ /* @__PURE__ */ jsxs43(Fragment18, { children: [
8932
+ /* @__PURE__ */ jsx43(
8933
+ "span",
8934
+ {
8935
+ className: "ods-data-mapper__field-req",
8936
+ "aria-hidden": "true",
8937
+ children: "*"
8938
+ }
8939
+ ),
8940
+ /* @__PURE__ */ jsxs43(
8941
+ "span",
8942
+ {
8943
+ style: {
8944
+ position: "absolute",
8945
+ width: 1,
8946
+ height: 1,
8947
+ padding: 0,
8948
+ margin: -1,
8949
+ overflow: "hidden",
8950
+ clip: "rect(0,0,0,0)",
8951
+ whiteSpace: "nowrap",
8952
+ border: 0
8953
+ },
8954
+ children: [
8955
+ " ",
8956
+ "(required)"
8957
+ ]
8958
+ }
8959
+ )
8960
+ ] })
8961
+ ] }),
8962
+ field.apiName && /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__field-api", children: field.apiName })
8963
+ ] }),
8964
+ field.custom && /* @__PURE__ */ jsxs43(Fragment18, { children: [
8965
+ /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__field-custom", children: "custom" }),
8966
+ canAddFields && /* @__PURE__ */ jsx43(
8967
+ "button",
8968
+ {
8969
+ type: "button",
8970
+ className: "ods-data-mapper__field-remove",
8971
+ "aria-label": `Remove ${field.label}`,
8972
+ title: `Remove ${field.label}`,
8973
+ onClick: (e) => {
8974
+ e.stopPropagation();
8975
+ commitRemoveField(field.key);
8976
+ },
8977
+ children: "\xD7"
8978
+ }
8979
+ )
8980
+ ] }),
8981
+ renderTypePill(field.type),
8982
+ isArrayField(field) && hasChildren && /* @__PURE__ */ jsxs43(
8983
+ "label",
8790
8984
  {
8791
- type: "button",
8792
- className: "ods-data-mapper__editor-clear",
8793
- onClick: () => setExpression(field.key, ""),
8794
- "aria-label": "Clear expression",
8795
- title: "Clear",
8796
- children: /* @__PURE__ */ jsx43(TrashIcon, {})
8985
+ className: "ods-data-mapper__foreach",
8986
+ onClick: (e) => e.stopPropagation(),
8987
+ children: [
8988
+ /* @__PURE__ */ jsx43("input", { type: "checkbox", defaultChecked: true, "aria-label": "For each record" }),
8989
+ /* @__PURE__ */ jsx43("span", { children: "For each record" })
8990
+ ]
8797
8991
  }
8798
8992
  )
8799
- ] })
8800
- ] }) : isMapped ? /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__expr-render", title: expr, children: renderExpressionSegments(
8801
- expr,
8802
- sourceFields,
8803
- variables,
8804
- (tokenIndex) => removeTokenAt(field.key, tokenIndex)
8805
- ) }) : /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__expr-empty", children: dropTarget === field.key ? "Drop to map" : "Drag a field here or click to edit" })
8806
- }
8807
- )
8808
- ]
8809
- },
8810
- field.key
8811
- );
8993
+ ]
8994
+ }
8995
+ ),
8996
+ /* @__PURE__ */ jsx43(
8997
+ "div",
8998
+ {
8999
+ className: cn(
9000
+ "ods-data-mapper__cell",
9001
+ "ods-data-mapper__cell--expr",
9002
+ isSelected && "ods-data-mapper__cell--expr-editing"
9003
+ ),
9004
+ onClick: () => !isInert && setSelectedTarget(field.key),
9005
+ children: isInert ? /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__expr-group", children: [
9006
+ /* @__PURE__ */ jsxs43("span", { className: "ods-data-mapper__expr-group-count", children: [
9007
+ "Group \xB7 ",
9008
+ field.children?.length ?? 0,
9009
+ " sub-field",
9010
+ field.children?.length === 1 ? "" : "s"
9011
+ ] }),
9012
+ mappedChildren > 0 && /* @__PURE__ */ jsxs43(
9013
+ "span",
9014
+ {
9015
+ className: "ods-data-mapper__expr-group-badge",
9016
+ title: `${mappedChildren} of ${field.children?.length ?? 0} sub-fields mapped`,
9017
+ children: [
9018
+ mappedChildren,
9019
+ " mapped"
9020
+ ]
9021
+ }
9022
+ )
9023
+ ] }) : isSelected ? /* @__PURE__ */ jsxs43("div", { className: "ods-data-mapper__editor", onClick: (e) => e.stopPropagation(), children: [
9024
+ /* @__PURE__ */ jsx43(
9025
+ ExpressionEditor,
9026
+ {
9027
+ editorRef,
9028
+ value: expr,
9029
+ sourceFields,
9030
+ variables,
9031
+ onChange: (v) => setExpression(field.key, v),
9032
+ onEscape: () => setSelectedTarget(null),
9033
+ onDropSnippet: (snippet) => dropOntoTarget(field.key, snippet),
9034
+ readDragSnippet
9035
+ }
9036
+ ),
9037
+ /* @__PURE__ */ jsxs43("div", { className: "ods-data-mapper__editor-actions", children: [
9038
+ /* @__PURE__ */ jsx43(
9039
+ "button",
9040
+ {
9041
+ type: "button",
9042
+ className: "ods-data-mapper__editor-fx",
9043
+ onClick: () => {
9044
+ setSidebarOpen(true);
9045
+ setSidebarTab("functions");
9046
+ },
9047
+ "aria-label": "Insert function",
9048
+ title: "Functions",
9049
+ children: /* @__PURE__ */ jsx43(FxIcon, {})
9050
+ }
9051
+ ),
9052
+ expr && /* @__PURE__ */ jsx43(
9053
+ "button",
9054
+ {
9055
+ type: "button",
9056
+ className: "ods-data-mapper__editor-clear",
9057
+ onClick: () => setExpression(field.key, ""),
9058
+ "aria-label": "Clear expression",
9059
+ title: "Clear",
9060
+ children: /* @__PURE__ */ jsx43(TrashIcon, {})
9061
+ }
9062
+ )
9063
+ ] })
9064
+ ] }) : isMapped ? /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__expr-render", title: expr, children: renderExpressionSegments(
9065
+ expr,
9066
+ sourceFields,
9067
+ variables,
9068
+ (tokenIndex) => removeTokenAt(field.key, tokenIndex)
9069
+ ) }) : /* @__PURE__ */ jsx43("span", { className: "ods-data-mapper__expr-empty", children: dropTarget === field.key ? "Drop to map" : "Drag a field here or click to edit" })
9070
+ }
9071
+ )
9072
+ ]
9073
+ }
9074
+ ),
9075
+ showGaps && renderGap(row.insertAt, `gap-${field.key}`, row.insertAlternatives)
9076
+ ] }, field.key);
8812
9077
  })
8813
9078
  ] }),
8814
9079
  sidebarOpen && /* @__PURE__ */ jsxs43("aside", { className: "ods-data-mapper__sidebar", "aria-label": "Data Stream", children: [
@@ -9321,7 +9586,7 @@ import {
9321
9586
  forwardRef as forwardRef36,
9322
9587
  useId as useId18
9323
9588
  } from "react";
9324
- import { Fragment as Fragment18, jsx as jsx44, jsxs as jsxs44 } from "react/jsx-runtime";
9589
+ import { Fragment as Fragment19, jsx as jsx44, jsxs as jsxs44 } from "react/jsx-runtime";
9325
9590
  var HEALTH_LABEL = {
9326
9591
  fresh: "Fresh",
9327
9592
  stale: "Stale",
@@ -9371,7 +9636,7 @@ var DatasetCard = forwardRef36(
9371
9636
  children: name
9372
9637
  }
9373
9638
  ) : name;
9374
- const body = /* @__PURE__ */ jsxs44(Fragment18, { children: [
9639
+ const body = /* @__PURE__ */ jsxs44(Fragment19, { children: [
9375
9640
  /* @__PURE__ */ jsxs44("div", { className: "ods-dataset-card__head", children: [
9376
9641
  sourceIcon && /* @__PURE__ */ jsx44("span", { className: "ods-dataset-card__icon", "aria-hidden": "true", children: sourceIcon }),
9377
9642
  /* @__PURE__ */ jsxs44("div", { className: "ods-dataset-card__head-body", children: [
@@ -9516,7 +9781,7 @@ import {
9516
9781
  useState as useState23
9517
9782
  } from "react";
9518
9783
  import { createPortal as createPortal7 } from "react-dom";
9519
- import { Fragment as Fragment19, jsx as jsx45, jsxs as jsxs45 } from "react/jsx-runtime";
9784
+ import { Fragment as Fragment20, jsx as jsx45, jsxs as jsxs45 } from "react/jsx-runtime";
9520
9785
  function readValue(row, col) {
9521
9786
  if (typeof col.accessor === "function") return col.accessor(row);
9522
9787
  const k = col.accessor ?? col.key;
@@ -9710,7 +9975,7 @@ function ExportPopover({
9710
9975
  }) {
9711
9976
  const [open, setOpen] = useState23(false);
9712
9977
  const triggerRef = useRef18(null);
9713
- return /* @__PURE__ */ jsxs45(Fragment19, { children: [
9978
+ return /* @__PURE__ */ jsxs45(Fragment20, { children: [
9714
9979
  /* @__PURE__ */ jsx45(
9715
9980
  "button",
9716
9981
  {
@@ -10384,7 +10649,7 @@ function Row({
10384
10649
  }) {
10385
10650
  const [menuOpen, setMenuOpen] = useState23(false);
10386
10651
  const triggerRef = useRef18(null);
10387
- return /* @__PURE__ */ jsxs45(Fragment19, { children: [
10652
+ return /* @__PURE__ */ jsxs45(Fragment20, { children: [
10388
10653
  /* @__PURE__ */ jsxs45(
10389
10654
  "tr",
10390
10655
  {
@@ -10808,7 +11073,7 @@ import {
10808
11073
  useId as useId20,
10809
11074
  useMemo as useMemo11
10810
11075
  } from "react";
10811
- import { Fragment as Fragment20, jsx as jsx47, jsxs as jsxs47 } from "react/jsx-runtime";
11076
+ import { Fragment as Fragment21, jsx as jsx47, jsxs as jsxs47 } from "react/jsx-runtime";
10812
11077
  var DonutChart = forwardRef38(
10813
11078
  function DonutChart2({
10814
11079
  data,
@@ -10942,7 +11207,7 @@ var DonutChart = forwardRef38(
10942
11207
  ]
10943
11208
  }
10944
11209
  ),
10945
- /* @__PURE__ */ jsx47("div", { className: "ods-donut__center", children: centerLabel ?? /* @__PURE__ */ jsxs47(Fragment20, { children: [
11210
+ /* @__PURE__ */ jsx47("div", { className: "ods-donut__center", children: centerLabel ?? /* @__PURE__ */ jsxs47(Fragment21, { children: [
10946
11211
  /* @__PURE__ */ jsx47("div", { className: "ods-donut__value", children: valueLabel ?? total }),
10947
11212
  /* @__PURE__ */ jsx47("div", { className: "ods-donut__small", children: unit })
10948
11213
  ] }) })
@@ -11100,7 +11365,7 @@ import { AnimatePresence as AnimatePresence9, motion as motion12 } from "framer-
11100
11365
  import { useEffect as useEffect20, useMemo as useMemo12, useRef as useRef20 } from "react";
11101
11366
  import { useButton as useButton2, useMenu, useMenuItem, useMenuTrigger } from "react-aria";
11102
11367
  import { createPortal as createPortal9 } from "react-dom";
11103
- import { Fragment as Fragment21, jsx as jsx50, jsxs as jsxs50 } from "react/jsx-runtime";
11368
+ import { Fragment as Fragment22, jsx as jsx50, jsxs as jsxs50 } from "react/jsx-runtime";
11104
11369
  function MenuItemComponent({ item, state, onAction }) {
11105
11370
  const ref = useRef20(null);
11106
11371
  const { menuItemProps } = useMenuItem({ key: item.key, onAction }, state, ref);
@@ -11291,7 +11556,7 @@ function DropdownMenu({
11291
11556
  });
11292
11557
  const { buttonProps } = useButton2({ ...menuTriggerProps, ...ariaNameProps }, triggerRef);
11293
11558
  const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTriggerProps } = buttonProps;
11294
- return /* @__PURE__ */ jsxs50(Fragment21, { children: [
11559
+ return /* @__PURE__ */ jsxs50(Fragment22, { children: [
11295
11560
  /* @__PURE__ */ jsx50(
11296
11561
  "button",
11297
11562
  {
@@ -11362,7 +11627,7 @@ EmptyState.displayName = "EmptyState";
11362
11627
  // src/components/ExecutionConsole/ExecutionConsole.tsx
11363
11628
  import { motion as motion13 } from "framer-motion";
11364
11629
  import { memo, useCallback as useCallback17, useEffect as useEffect21, useMemo as useMemo13, useRef as useRef21, useState as useState26 } from "react";
11365
- import { Fragment as Fragment22, jsx as jsx52, jsxs as jsxs52 } from "react/jsx-runtime";
11630
+ import { Fragment as Fragment23, jsx as jsx52, jsxs as jsxs52 } from "react/jsx-runtime";
11366
11631
  var iconProps = {
11367
11632
  xmlns: "http://www.w3.org/2000/svg",
11368
11633
  viewBox: "0 0 24 24",
@@ -11680,7 +11945,7 @@ function ExecutionConsole({
11680
11945
  children: /* @__PURE__ */ jsx52(TrashIcon2, {})
11681
11946
  }
11682
11947
  ),
11683
- toolbar && /* @__PURE__ */ jsxs52(Fragment22, { children: [
11948
+ toolbar && /* @__PURE__ */ jsxs52(Fragment23, { children: [
11684
11949
  /* @__PURE__ */ jsx52("span", { className: "ods-console__action-separator", "aria-hidden": "true" }),
11685
11950
  toolbar
11686
11951
  ] }),
@@ -11845,7 +12110,7 @@ function q(query, text) {
11845
12110
  const lc = text.toLowerCase();
11846
12111
  const idx = lc.indexOf(trimmed.toLowerCase());
11847
12112
  if (idx < 0) return text;
11848
- return /* @__PURE__ */ jsxs52(Fragment22, { children: [
12113
+ return /* @__PURE__ */ jsxs52(Fragment23, { children: [
11849
12114
  text.slice(0, idx),
11850
12115
  /* @__PURE__ */ jsx52("mark", { className: "ods-console__match", children: text.slice(idx, idx + trimmed.length) }),
11851
12116
  text.slice(idx + trimmed.length)
@@ -12054,7 +12319,7 @@ function sanitizeHref(url) {
12054
12319
  }
12055
12320
 
12056
12321
  // src/components/FileDropzone/FileDropzone.tsx
12057
- import { Fragment as Fragment23, jsx as jsx54, jsxs as jsxs54 } from "react/jsx-runtime";
12322
+ import { Fragment as Fragment24, jsx as jsx54, jsxs as jsxs54 } from "react/jsx-runtime";
12058
12323
  var UPLOAD_ICON = /* @__PURE__ */ jsx54(UploadIcon, { width: 20, height: 20, "aria-hidden": "true" });
12059
12324
  var SPIN_ICON = /* @__PURE__ */ jsx54("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx54(
12060
12325
  "circle",
@@ -12381,7 +12646,7 @@ var FileDropzone = forwardRef43(
12381
12646
  children: CHECK_ICON
12382
12647
  }
12383
12648
  ),
12384
- status === "error" && /* @__PURE__ */ jsxs54(Fragment23, { children: [
12649
+ status === "error" && /* @__PURE__ */ jsxs54(Fragment24, { children: [
12385
12650
  /* @__PURE__ */ jsx54(
12386
12651
  "span",
12387
12652
  {
@@ -13010,7 +13275,7 @@ import {
13010
13275
  useMemo as useMemo15,
13011
13276
  useState as useState29
13012
13277
  } from "react";
13013
- import { Fragment as Fragment24, jsx as jsx57, jsxs as jsxs56 } from "react/jsx-runtime";
13278
+ import { Fragment as Fragment25, jsx as jsx57, jsxs as jsxs56 } from "react/jsx-runtime";
13014
13279
  function parseXml(src) {
13015
13280
  if (typeof window !== "undefined" && typeof window.DOMParser !== "undefined") {
13016
13281
  try {
@@ -13255,7 +13520,7 @@ function XmlNodeRow({
13255
13520
  const inlineTextChild = children.length === 1 && children[0].type === "text" ? children[0].text ?? "" : null;
13256
13521
  if (inlineTextChild !== null) {
13257
13522
  const isMultiLine = inlineTextChild.includes("\n");
13258
- const openTag = /* @__PURE__ */ jsxs56(Fragment24, { children: [
13523
+ const openTag = /* @__PURE__ */ jsxs56(Fragment25, { children: [
13259
13524
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: "<" }),
13260
13525
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__tag", children: node.name }),
13261
13526
  showAttributes && attrs.map(([k, v]) => /* @__PURE__ */ jsxs56("span", { className: "ods-xml-viewer__attr", children: [
@@ -13265,7 +13530,7 @@ function XmlNodeRow({
13265
13530
  ] }, k)),
13266
13531
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: ">" })
13267
13532
  ] });
13268
- const closeTag = /* @__PURE__ */ jsxs56(Fragment24, { children: [
13533
+ const closeTag = /* @__PURE__ */ jsxs56(Fragment25, { children: [
13269
13534
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: "</" }),
13270
13535
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__tag", children: node.name }),
13271
13536
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: ">" })
@@ -13330,9 +13595,9 @@ function XmlNodeRow({
13330
13595
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__attr-eq", children: "=" }),
13331
13596
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__attr-value", children: `"${v}"` })
13332
13597
  ] }, k)),
13333
- isSelfClosing ? /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: " />" }) : /* @__PURE__ */ jsxs56(Fragment24, { children: [
13598
+ isSelfClosing ? /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: " />" }) : /* @__PURE__ */ jsxs56(Fragment25, { children: [
13334
13599
  /* @__PURE__ */ jsx57("span", { className: "ods-xml-viewer__bracket", children: ">" }),
13335
- !open && /* @__PURE__ */ jsxs56(Fragment24, { children: [
13600
+ !open && /* @__PURE__ */ jsxs56(Fragment25, { children: [
13336
13601
  /* @__PURE__ */ jsxs56("span", { className: "ods-xml-viewer__preview", children: [
13337
13602
  children.length,
13338
13603
  " child",
@@ -13359,7 +13624,7 @@ function XmlNodeRow({
13359
13624
  ]
13360
13625
  }
13361
13626
  ),
13362
- !isSelfClosing && open && /* @__PURE__ */ jsxs56(Fragment24, { children: [
13627
+ !isSelfClosing && open && /* @__PURE__ */ jsxs56(Fragment25, { children: [
13363
13628
  children.map((c, i) => /* @__PURE__ */ jsx57(
13364
13629
  XmlNodeRow,
13365
13630
  {
@@ -13397,7 +13662,7 @@ import {
13397
13662
  useState as useState30
13398
13663
  } from "react";
13399
13664
  import YAML from "yaml";
13400
- import { Fragment as Fragment25, jsx as jsx58, jsxs as jsxs57 } from "react/jsx-runtime";
13665
+ import { Fragment as Fragment26, jsx as jsx58, jsxs as jsxs57 } from "react/jsx-runtime";
13401
13666
  function toYaml(value, indent = 0) {
13402
13667
  const pad2 = " ".repeat(indent);
13403
13668
  if (value === null) return "null";
@@ -13671,7 +13936,7 @@ var YamlViewer = forwardRef46(
13671
13936
  }
13672
13937
  ) : /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__caret-spacer" }),
13673
13938
  t.kind === "comment" && /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__comment", children: t.raw.trim() }),
13674
- t.kind === "key" && /* @__PURE__ */ jsxs57(Fragment25, { children: [
13939
+ t.kind === "key" && /* @__PURE__ */ jsxs57(Fragment26, { children: [
13675
13940
  t.raw.trim().startsWith("-") && /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__dash", children: "- " }),
13676
13941
  /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__key", children: t.key }),
13677
13942
  /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__colon", children: ":" }),
@@ -13690,7 +13955,7 @@ var YamlViewer = forwardRef46(
13690
13955
  ),
13691
13956
  isCollapsed && /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__preview", children: " \u2026" })
13692
13957
  ] }),
13693
- t.kind === "sequence" && /* @__PURE__ */ jsxs57(Fragment25, { children: [
13958
+ t.kind === "sequence" && /* @__PURE__ */ jsxs57(Fragment26, { children: [
13694
13959
  /* @__PURE__ */ jsx58("span", { className: "ods-yaml-viewer__dash", children: "- " }),
13695
13960
  /* @__PURE__ */ jsx58(
13696
13961
  "span",
@@ -15824,7 +16089,7 @@ import {
15824
16089
  StethoscopeIcon,
15825
16090
  WarningFilledIcon
15826
16091
  } from "@octaviaflow/icons";
15827
- import { Fragment as Fragment26, jsx as jsx66, jsxs as jsxs65 } from "react/jsx-runtime";
16092
+ import { Fragment as Fragment27, jsx as jsx66, jsxs as jsxs65 } from "react/jsx-runtime";
15828
16093
  function flowDoctorTone(issues) {
15829
16094
  if (issues.some((i) => i.severity === "error")) return "error";
15830
16095
  if (issues.length > 0) return "warning";
@@ -15859,7 +16124,7 @@ function IssueRow({
15859
16124
  onIssueClick
15860
16125
  }) {
15861
16126
  const icon = issue.severity === "error" ? /* @__PURE__ */ jsx66(ErrorFilledIcon, { size: "sm", "aria-hidden": "true" }) : /* @__PURE__ */ jsx66(WarningFilledIcon, { size: "sm", "aria-hidden": "true" });
15862
- const body = /* @__PURE__ */ jsxs65(Fragment26, { children: [
16127
+ const body = /* @__PURE__ */ jsxs65(Fragment27, { children: [
15863
16128
  /* @__PURE__ */ jsx66(
15864
16129
  "span",
15865
16130
  {
@@ -16618,7 +16883,7 @@ import { useEffect as useEffect32, useRef as useRef29, useState as useState39 }
16618
16883
  // src/components/HoverCard/HoverCard.tsx
16619
16884
  import { useCallback as useCallback28, useEffect as useEffect31, useLayoutEffect as useLayoutEffect7, useRef as useRef28, useState as useState38 } from "react";
16620
16885
  import { createPortal as createPortal11 } from "react-dom";
16621
- import { Fragment as Fragment27, jsx as jsx70, jsxs as jsxs69 } from "react/jsx-runtime";
16886
+ import { Fragment as Fragment28, jsx as jsx70, jsxs as jsxs69 } from "react/jsx-runtime";
16622
16887
  function computePosition2(rect, panelRect, placement, offset) {
16623
16888
  const cx = rect.left + rect.width / 2;
16624
16889
  const cy = rect.top + rect.height / 2;
@@ -16723,14 +16988,14 @@ function HoverCard({
16723
16988
  ),
16724
16989
  document.body
16725
16990
  ) : null;
16726
- return /* @__PURE__ */ jsxs69(Fragment27, { children: [
16991
+ return /* @__PURE__ */ jsxs69(Fragment28, { children: [
16727
16992
  triggerEl,
16728
16993
  portal
16729
16994
  ] });
16730
16995
  }
16731
16996
 
16732
16997
  // src/components/FlowToolbar/FlowToolbar.tsx
16733
- import { Fragment as Fragment28, jsx as jsx71, jsxs as jsxs70 } from "react/jsx-runtime";
16998
+ import { Fragment as Fragment29, jsx as jsx71, jsxs as jsxs70 } from "react/jsx-runtime";
16734
16999
  function FlowToolbar({ children, placement = "left", className }) {
16735
17000
  return /* @__PURE__ */ jsx71(
16736
17001
  "div",
@@ -17195,7 +17460,7 @@ function FlowToolbarStatus({
17195
17460
  `ods-flow-toolbar__status-trigger--${status}`,
17196
17461
  busy && "ods-flow-toolbar__status-trigger--busy"
17197
17462
  ),
17198
- trigger: /* @__PURE__ */ jsxs70(Fragment28, { children: [
17463
+ trigger: /* @__PURE__ */ jsxs70(Fragment29, { children: [
17199
17464
  busy ? /* @__PURE__ */ jsx71(Spinner, { size: 12, label: "Updating flow status" }) : /* @__PURE__ */ jsx71("span", { className: "ods-flow-toolbar__status-dot", "aria-hidden": "true" }),
17200
17465
  /* @__PURE__ */ jsx71("span", { className: "ods-flow-toolbar__status-label", children: label }),
17201
17466
  /* @__PURE__ */ jsx71("span", { className: "ods-flow-toolbar__status-caret", "aria-hidden": "true", children: /* @__PURE__ */ jsx71(ChevronDownIcon6, { size: "sm", "aria-hidden": "true" }) })
@@ -18223,7 +18488,7 @@ var Stepper = forwardRef52(
18223
18488
  Stepper.displayName = "Stepper";
18224
18489
 
18225
18490
  // src/components/OnboardingFlow/OnboardingFlow.tsx
18226
- import { Fragment as Fragment29, jsx as jsx77, jsxs as jsxs76 } from "react/jsx-runtime";
18491
+ import { Fragment as Fragment30, jsx as jsx77, jsxs as jsxs76 } from "react/jsx-runtime";
18227
18492
  function usePromiseBusy() {
18228
18493
  const [busy, setBusy] = useState41(false);
18229
18494
  const run = (result) => {
@@ -18512,7 +18777,7 @@ function SetupIncompleteBanner({
18512
18777
  " of ",
18513
18778
  totalSteps,
18514
18779
  " steps done",
18515
- missingLabels && missingLabels.length > 0 && /* @__PURE__ */ jsxs76(Fragment29, { children: [
18780
+ missingLabels && missingLabels.length > 0 && /* @__PURE__ */ jsxs76(Fragment30, { children: [
18516
18781
  " \u2014 still missing: ",
18517
18782
  missingLabels.join(", ")
18518
18783
  ] }),
@@ -18538,7 +18803,7 @@ function SetupIncompleteBanner({
18538
18803
 
18539
18804
  // src/components/MembersSettings/MembersSettings.tsx
18540
18805
  import { useState as useState42 } from "react";
18541
- import { Fragment as Fragment30, jsx as jsx78, jsxs as jsxs77 } from "react/jsx-runtime";
18806
+ import { Fragment as Fragment31, jsx as jsx78, jsxs as jsxs77 } from "react/jsx-runtime";
18542
18807
  var ROLE_BADGE = {
18543
18808
  owner: "info",
18544
18809
  admin: "info",
@@ -18648,7 +18913,7 @@ function MembersSettings({
18648
18913
  {
18649
18914
  align: "end",
18650
18915
  triggerClassName: "ods-members-settings__row-menu",
18651
- trigger: busyId === m.id ? /* @__PURE__ */ jsx78(Spinner, { size: 14, label: "Updating member" }) : /* @__PURE__ */ jsxs77(Fragment30, { children: [
18916
+ trigger: busyId === m.id ? /* @__PURE__ */ jsx78(Spinner, { size: 14, label: "Updating member" }) : /* @__PURE__ */ jsxs77(Fragment31, { children: [
18652
18917
  /* @__PURE__ */ jsx78("span", { "aria-hidden": "true", children: "\u22EF" }),
18653
18918
  /* @__PURE__ */ jsxs77("span", { className: "ods-members-settings__sr-only", children: [
18654
18919
  "Actions for ",
@@ -18802,7 +19067,7 @@ function MembersSettings({
18802
19067
 
18803
19068
  // src/components/OrganizationSettings/OrganizationSettings.tsx
18804
19069
  import { useEffect as useEffect35, useState as useState43 } from "react";
18805
- import { Fragment as Fragment31, jsx as jsx79, jsxs as jsxs78 } from "react/jsx-runtime";
19070
+ import { Fragment as Fragment32, jsx as jsx79, jsxs as jsxs78 } from "react/jsx-runtime";
18806
19071
  function OrganizationSettings({
18807
19072
  values,
18808
19073
  slug,
@@ -18987,7 +19252,7 @@ function OrganizationSettings({
18987
19252
  tone: "danger",
18988
19253
  confirmLabel: "Delete organization",
18989
19254
  requireConfirmText: values.name,
18990
- requireConfirmLabel: /* @__PURE__ */ jsxs78(Fragment31, { children: [
19255
+ requireConfirmLabel: /* @__PURE__ */ jsxs78(Fragment32, { children: [
18991
19256
  "Type ",
18992
19257
  /* @__PURE__ */ jsx79("strong", { children: values.name }),
18993
19258
  " to confirm"
@@ -19000,7 +19265,7 @@ function OrganizationSettings({
19000
19265
 
19001
19266
  // src/components/ProfileSettings/ProfileSettings.tsx
19002
19267
  import { useEffect as useEffect36, useState as useState44 } from "react";
19003
- import { Fragment as Fragment32, jsx as jsx80, jsxs as jsxs79 } from "react/jsx-runtime";
19268
+ import { Fragment as Fragment33, jsx as jsx80, jsxs as jsxs79 } from "react/jsx-runtime";
19004
19269
  function ProfileSettings({
19005
19270
  values,
19006
19271
  email,
@@ -19259,7 +19524,7 @@ function ProfileSettings({
19259
19524
  tone: "danger",
19260
19525
  confirmLabel: "Delete account",
19261
19526
  requireConfirmText: email,
19262
- requireConfirmLabel: /* @__PURE__ */ jsxs79(Fragment32, { children: [
19527
+ requireConfirmLabel: /* @__PURE__ */ jsxs79(Fragment33, { children: [
19263
19528
  "Type ",
19264
19529
  /* @__PURE__ */ jsx80("strong", { children: email }),
19265
19530
  " to confirm"
@@ -19920,7 +20185,7 @@ import {
19920
20185
  forwardRef as forwardRef56,
19921
20186
  useId as useId34
19922
20187
  } from "react";
19923
- import { Fragment as Fragment33, jsx as jsx84, jsxs as jsxs82 } from "react/jsx-runtime";
20188
+ import { Fragment as Fragment34, jsx as jsx84, jsxs as jsxs82 } from "react/jsx-runtime";
19924
20189
  var IconCard = forwardRef56(
19925
20190
  function IconCard2({
19926
20191
  variant = "default",
@@ -19944,7 +20209,7 @@ var IconCard = forwardRef56(
19944
20209
  const titleId = `${baseId}-title`;
19945
20210
  const descId = description ? `${baseId}-desc` : void 0;
19946
20211
  const isInteractive = Boolean(href || onClick) && !disabled;
19947
- const body = /* @__PURE__ */ jsxs82(Fragment33, { children: [
20212
+ const body = /* @__PURE__ */ jsxs82(Fragment34, { children: [
19948
20213
  /* @__PURE__ */ jsx84("span", { className: "ods-icon-card__icon", "aria-hidden": "true", children: icon }),
19949
20214
  /* @__PURE__ */ jsxs82("div", { className: "ods-icon-card__body", children: [
19950
20215
  /* @__PURE__ */ jsx84(
@@ -20025,7 +20290,7 @@ import {
20025
20290
  forwardRef as forwardRef57,
20026
20291
  useId as useId35
20027
20292
  } from "react";
20028
- import { Fragment as Fragment34, jsx as jsx85, jsxs as jsxs83 } from "react/jsx-runtime";
20293
+ import { Fragment as Fragment35, jsx as jsx85, jsxs as jsxs83 } from "react/jsx-runtime";
20029
20294
  var CATEGORY_LABEL = {
20030
20295
  communication: "Communication",
20031
20296
  incident: "Incident",
@@ -20089,7 +20354,7 @@ var IntegrationCard = forwardRef57(function IntegrationCard2({
20089
20354
  }
20090
20355
  ) : name;
20091
20356
  const stop = (e) => e.stopPropagation();
20092
- const body = /* @__PURE__ */ jsxs83(Fragment34, { children: [
20357
+ const body = /* @__PURE__ */ jsxs83(Fragment35, { children: [
20093
20358
  /* @__PURE__ */ jsxs83("div", { className: "ods-integration-card__head", children: [
20094
20359
  logo && /* @__PURE__ */ jsx85("span", { className: "ods-integration-card__logo", "aria-hidden": "true", children: logo }),
20095
20360
  /* @__PURE__ */ jsxs83("div", { className: "ods-integration-card__head-body", children: [
@@ -20244,7 +20509,7 @@ import {
20244
20509
  forwardRef as forwardRef58,
20245
20510
  useId as useId36
20246
20511
  } from "react";
20247
- import { Fragment as Fragment35, jsx as jsx86, jsxs as jsxs84 } from "react/jsx-runtime";
20512
+ import { Fragment as Fragment36, jsx as jsx86, jsxs as jsxs84 } from "react/jsx-runtime";
20248
20513
  function isAssigneeObject(v) {
20249
20514
  return typeof v === "object" && v !== null && "name" in v;
20250
20515
  }
@@ -20299,7 +20564,7 @@ var KanbanCard = forwardRef58(function KanbanCard2({
20299
20564
  }
20300
20565
  );
20301
20566
  };
20302
- const body = /* @__PURE__ */ jsxs84(Fragment35, { children: [
20567
+ const body = /* @__PURE__ */ jsxs84(Fragment36, { children: [
20303
20568
  (tagList.length > 0 || badge || onMore) && /* @__PURE__ */ jsxs84("div", { className: "ods-kanban-card__head", children: [
20304
20569
  tagList.length > 0 && /* @__PURE__ */ jsx86("span", { className: "ods-kanban-card__tags", children: tagList.map((t, i) => /* @__PURE__ */ jsx86("span", { className: "ods-kanban-card__tag", children: t }, i)) }),
20305
20570
  badge && /* @__PURE__ */ jsx86("span", { className: "ods-kanban-card__badge", children: badge }),
@@ -21774,7 +22039,7 @@ function BlockFieldsEditor({
21774
22039
  }
21775
22040
 
21776
22041
  // src/components/MessageBlockBuilder/MessagePreview.tsx
21777
- import { Fragment as Fragment36 } from "react";
22042
+ import { Fragment as Fragment37 } from "react";
21778
22043
  import { jsx as jsx92, jsxs as jsxs90 } from "react/jsx-runtime";
21779
22044
  var CLS = "ods-message-block-builder";
21780
22045
  function tokenized(text, resolve, inline) {
@@ -21786,13 +22051,13 @@ function tokenized(text, resolve, inline) {
21786
22051
  if (isToken) {
21787
22052
  return /* @__PURE__ */ jsx92("span", { className: `${CLS}__pill`, title: part, children: resolve?.(part) ?? compactTokenLabel(part) }, `t-${index}`);
21788
22053
  }
21789
- return /* @__PURE__ */ jsx92(Fragment36, { children: inline ? inline(part) : part }, `c-${index}`);
22054
+ return /* @__PURE__ */ jsx92(Fragment37, { children: inline ? inline(part) : part }, `c-${index}`);
21790
22055
  });
21791
22056
  }
21792
22057
  var MRKDWN_INLINE = /(\*[^*\n]+\*|_[^_\n]+_|~[^~\n]+~|`[^`\n]+`|<[^<>\n]+>)/g;
21793
22058
  function mrkdwnInline(chunk) {
21794
22059
  const lines = chunk.split("\n");
21795
- return lines.map((line, lineIndex) => /* @__PURE__ */ jsxs90(Fragment36, { children: [
22060
+ return lines.map((line, lineIndex) => /* @__PURE__ */ jsxs90(Fragment37, { children: [
21796
22061
  lineIndex > 0 && /* @__PURE__ */ jsx92("br", {}),
21797
22062
  line.split(MRKDWN_INLINE).map((part, index) => {
21798
22063
  if (part === "") return null;
@@ -21814,7 +22079,7 @@ function mrkdwnInline(chunk) {
21814
22079
  const [, label] = inner.split("|");
21815
22080
  return /* @__PURE__ */ jsx92("span", { className: `${CLS}__preview-link`, children: label ?? inner }, key);
21816
22081
  }
21817
- return /* @__PURE__ */ jsx92(Fragment36, { children: part }, key);
22082
+ return /* @__PURE__ */ jsx92(Fragment37, { children: part }, key);
21818
22083
  })
21819
22084
  ] }, `l-${lineIndex}`));
21820
22085
  }
@@ -21973,7 +22238,7 @@ function SlackBlockPreview({ block, resolve }) {
21973
22238
  case "context":
21974
22239
  return /* @__PURE__ */ jsx92("div", { className: `${CLS}__slack-context`, children: asItems(p.elements).map((el, index) => (
21975
22240
  // eslint-disable-next-line react/no-array-index-key
21976
- /* @__PURE__ */ jsx92(Fragment36, { children: asString(el.type) === "image" ? previewImage(
22241
+ /* @__PURE__ */ jsx92(Fragment37, { children: asString(el.type) === "image" ? previewImage(
21977
22242
  asString(el.imageUrl),
21978
22243
  asString(el.altText),
21979
22244
  `${CLS}__slack-context-img`
@@ -22055,7 +22320,7 @@ function TeamsBlockPreview({ block, resolve }) {
22055
22320
  case "imageSet":
22056
22321
  return /* @__PURE__ */ jsx92("div", { className: `${CLS}__teams-imageset`, children: asItems(p.images).map((img, index) => (
22057
22322
  // eslint-disable-next-line react/no-array-index-key
22058
- /* @__PURE__ */ jsx92(Fragment36, { children: previewImage(asString(img.url), asString(img.altText), `${CLS}__teams-imageset-img`) }, index)
22323
+ /* @__PURE__ */ jsx92(Fragment37, { children: previewImage(asString(img.url), asString(img.altText), `${CLS}__teams-imageset-img`) }, index)
22059
22324
  )) });
22060
22325
  case "factSet":
22061
22326
  return /* @__PURE__ */ jsx92("dl", { className: `${CLS}__teams-facts`, children: asItems(p.facts).map((fact, index) => (
@@ -22278,7 +22543,7 @@ function MessagePreview({ platform, blocks, meta, resolveTokenLabel }) {
22278
22543
  }
22279
22544
 
22280
22545
  // src/components/MessageBlockBuilder/glyphs.tsx
22281
- import { Fragment as Fragment37, jsx as jsx93, jsxs as jsxs91 } from "react/jsx-runtime";
22546
+ import { Fragment as Fragment38, jsx as jsx93, jsxs as jsxs91 } from "react/jsx-runtime";
22282
22547
  function glyph(children) {
22283
22548
  return /* @__PURE__ */ jsx93(
22284
22549
  "svg",
@@ -22297,80 +22562,80 @@ function glyph(children) {
22297
22562
  );
22298
22563
  }
22299
22564
  var headingGlyph = glyph(
22300
- /* @__PURE__ */ jsx93(Fragment37, { children: /* @__PURE__ */ jsx93("path", { d: "M3 3v10M11 3v10M3 8h8" }) })
22565
+ /* @__PURE__ */ jsx93(Fragment38, { children: /* @__PURE__ */ jsx93("path", { d: "M3 3v10M11 3v10M3 8h8" }) })
22301
22566
  );
22302
22567
  var textGlyph = glyph(
22303
- /* @__PURE__ */ jsx93(Fragment37, { children: /* @__PURE__ */ jsx93("path", { d: "M2.5 4h11M2.5 8h11M2.5 12h7" }) })
22568
+ /* @__PURE__ */ jsx93(Fragment38, { children: /* @__PURE__ */ jsx93("path", { d: "M2.5 4h11M2.5 8h11M2.5 12h7" }) })
22304
22569
  );
22305
22570
  var contextGlyph = glyph(
22306
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22571
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22307
22572
  /* @__PURE__ */ jsx93("circle", { cx: "4", cy: "8", r: "1.8" }),
22308
22573
  /* @__PURE__ */ jsx93("path", { d: "M8 6.5h5.5M8 9.5h4" })
22309
22574
  ] })
22310
22575
  );
22311
22576
  var imageGlyph = glyph(
22312
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22577
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22313
22578
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "3", width: "11", height: "10", rx: "1" }),
22314
22579
  /* @__PURE__ */ jsx93("circle", { cx: "6", cy: "6.5", r: "1", fill: "currentColor", stroke: "none" }),
22315
22580
  /* @__PURE__ */ jsx93("path", { d: "M3.5 11.5l3-3 2 2 2.5-2.5 1.5 1.5" })
22316
22581
  ] })
22317
22582
  );
22318
22583
  var dividerGlyph = glyph(
22319
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22584
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22320
22585
  /* @__PURE__ */ jsx93("path", { d: "M2.5 8h11" }),
22321
22586
  /* @__PURE__ */ jsx93("path", { d: "M2.5 3.5h11M2.5 12.5h11", opacity: "0.35" })
22322
22587
  ] })
22323
22588
  );
22324
22589
  var buttonGlyph = glyph(
22325
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22590
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22326
22591
  /* @__PURE__ */ jsx93("rect", { x: "2", y: "5", width: "12", height: "6", rx: "2" }),
22327
22592
  /* @__PURE__ */ jsx93("path", { d: "M5.5 8h5" })
22328
22593
  ] })
22329
22594
  );
22330
22595
  var videoGlyph = glyph(
22331
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22596
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22332
22597
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "3.5", width: "11", height: "9", rx: "1.5" }),
22333
22598
  /* @__PURE__ */ jsx93("path", { d: "M7 6.2v3.6L10 8z", fill: "currentColor", stroke: "none" })
22334
22599
  ] })
22335
22600
  );
22336
22601
  var factGlyph = glyph(
22337
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22602
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22338
22603
  /* @__PURE__ */ jsx93("path", { d: "M2.5 4.5h4M2.5 8h4M2.5 11.5h4", opacity: "0.55" }),
22339
22604
  /* @__PURE__ */ jsx93("path", { d: "M8.5 4.5h5M8.5 8h5M8.5 11.5h3.5" })
22340
22605
  ] })
22341
22606
  );
22342
22607
  var columnsGlyph = glyph(
22343
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22608
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22344
22609
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "3", width: "4.5", height: "10", rx: "1" }),
22345
22610
  /* @__PURE__ */ jsx93("rect", { x: "9", y: "3", width: "4.5", height: "10", rx: "1" })
22346
22611
  ] })
22347
22612
  );
22348
22613
  var containerGlyph = glyph(
22349
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22614
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22350
22615
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "3", width: "11", height: "10", rx: "1.5" }),
22351
22616
  /* @__PURE__ */ jsx93("path", { d: "M4.5 6h7M4.5 8.8h5" })
22352
22617
  ] })
22353
22618
  );
22354
22619
  var tableGlyph = glyph(
22355
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22620
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22356
22621
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "3", width: "11", height: "10", rx: "1" }),
22357
22622
  /* @__PURE__ */ jsx93("path", { d: "M2.5 6.5h11M2.5 9.8h11M8 3v10" })
22358
22623
  ] })
22359
22624
  );
22360
22625
  var imageSetGlyph = glyph(
22361
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22626
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22362
22627
  /* @__PURE__ */ jsx93("rect", { x: "2", y: "4.5", width: "7", height: "7", rx: "1" }),
22363
22628
  /* @__PURE__ */ jsx93("path", { d: "M5.5 3H13a1 1 0 011 1v7.5", opacity: "0.55" })
22364
22629
  ] })
22365
22630
  );
22366
22631
  var decoratedTextGlyph = glyph(
22367
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22632
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22368
22633
  /* @__PURE__ */ jsx93("circle", { cx: "4.5", cy: "8", r: "2" }),
22369
22634
  /* @__PURE__ */ jsx93("path", { d: "M8.5 5.5h5M8.5 8h4M8.5 10.5h5" })
22370
22635
  ] })
22371
22636
  );
22372
22637
  var gridGlyph = glyph(
22373
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22638
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22374
22639
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "2.5", width: "4.6", height: "4.6", rx: "0.8" }),
22375
22640
  /* @__PURE__ */ jsx93("rect", { x: "8.9", y: "2.5", width: "4.6", height: "4.6", rx: "0.8" }),
22376
22641
  /* @__PURE__ */ jsx93("rect", { x: "2.5", y: "8.9", width: "4.6", height: "4.6", rx: "0.8" }),
@@ -22378,13 +22643,13 @@ var gridGlyph = glyph(
22378
22643
  ] })
22379
22644
  );
22380
22645
  var chartGlyph = glyph(
22381
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22646
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22382
22647
  /* @__PURE__ */ jsx93("path", { d: "M2.5 2.5v11h11" }),
22383
22648
  /* @__PURE__ */ jsx93("path", { d: "M5 10.5V7M8 10.5V4.5M11 10.5V6", strokeWidth: "1.8" })
22384
22649
  ] })
22385
22650
  );
22386
22651
  var chipGlyph = glyph(
22387
- /* @__PURE__ */ jsxs91(Fragment37, { children: [
22652
+ /* @__PURE__ */ jsxs91(Fragment38, { children: [
22388
22653
  /* @__PURE__ */ jsx93("rect", { x: "1.5", y: "5.5", width: "7", height: "5", rx: "2.5" }),
22389
22654
  /* @__PURE__ */ jsx93("rect", { x: "9.5", y: "5.5", width: "5", height: "5", rx: "2.5", opacity: "0.55" })
22390
22655
  ] })
@@ -24273,7 +24538,7 @@ var messagePlatformAdapters = {
24273
24538
  // src/components/MessageBlockBuilder/TokenPanel.tsx
24274
24539
  import { CloseIcon as CloseIcon14 } from "@octaviaflow/icons";
24275
24540
  import { useEffect as useEffect40, useMemo as useMemo25, useState as useState49 } from "react";
24276
- import { Fragment as Fragment38, jsx as jsx94, jsxs as jsxs92 } from "react/jsx-runtime";
24541
+ import { Fragment as Fragment39, jsx as jsx94, jsxs as jsxs92 } from "react/jsx-runtime";
24277
24542
  function TokenPanel({
24278
24543
  tokenGroups,
24279
24544
  resolveTokenLabel,
@@ -24325,7 +24590,7 @@ function TokenPanel({
24325
24590
  hintFlash && "ods-message-block-builder__tokens-target--flash"
24326
24591
  ),
24327
24592
  "aria-live": "polite",
24328
- children: hasTarget ? /* @__PURE__ */ jsxs92(Fragment38, { children: [
24593
+ children: hasTarget ? /* @__PURE__ */ jsxs92(Fragment39, { children: [
24329
24594
  "Click inserts into ",
24330
24595
  /* @__PURE__ */ jsx94("strong", { children: targetLabel }),
24331
24596
  " \u2014 or drag any ref into a field."
@@ -24396,7 +24661,7 @@ function TokenPanel({
24396
24661
  }
24397
24662
 
24398
24663
  // src/components/MessageBlockBuilder/MessageBlockBuilder.tsx
24399
- import { Fragment as Fragment39, jsx as jsx95, jsxs as jsxs93 } from "react/jsx-runtime";
24664
+ import { Fragment as Fragment40, jsx as jsx95, jsxs as jsxs93 } from "react/jsx-runtime";
24400
24665
  var CLS2 = "ods-message-block-builder";
24401
24666
  function prettyJson(value) {
24402
24667
  try {
@@ -24828,7 +25093,7 @@ function MessageBlockBuilder({
24828
25093
  }
24829
25094
  ),
24830
25095
  !jsonParse.ok && /* @__PURE__ */ jsx95("p", { className: `${CLS2}__json-error`, role: "alert", children: jsonParse.message })
24831
- ] }) : /* @__PURE__ */ jsxs93(Fragment39, { children: [
25096
+ ] }) : /* @__PURE__ */ jsxs93(Fragment40, { children: [
24832
25097
  adapter.metaFields && adapter.metaFields.length > 0 && /* @__PURE__ */ jsx95(Disclosure, { title: "Card settings", size: "sm", className: `${CLS2}__meta`, children: /* @__PURE__ */ jsx95(
24833
25098
  BlockFieldsEditor,
24834
25099
  {
@@ -25019,7 +25284,7 @@ import {
25019
25284
  useId as useId38,
25020
25285
  useMemo as useMemo27
25021
25286
  } from "react";
25022
- import { Fragment as Fragment40, jsx as jsx96, jsxs as jsxs94 } from "react/jsx-runtime";
25287
+ import { Fragment as Fragment41, jsx as jsx96, jsxs as jsxs94 } from "react/jsx-runtime";
25023
25288
  var defaultFormat6 = (n) => {
25024
25289
  if (Math.abs(n) >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
25025
25290
  if (Math.abs(n) >= 1e3) return `${(n / 1e3).toFixed(1)}k`;
@@ -25233,7 +25498,7 @@ function LineVariant({
25233
25498
  ]);
25234
25499
  const path = smooth ? buildSmoothPath(pts) : buildLinePath(pts);
25235
25500
  const areaPath = fill2 ? `${path} L${pts[pts.length - 1][0]},${height - PAD2} L${pts[0][0]},${height - PAD2} Z` : null;
25236
- return /* @__PURE__ */ jsxs94(Fragment40, { children: [
25501
+ return /* @__PURE__ */ jsxs94(Fragment41, { children: [
25237
25502
  areaPath && /* @__PURE__ */ jsx96(
25238
25503
  motion19.path,
25239
25504
  {
@@ -25284,7 +25549,7 @@ function BarVariant({
25284
25549
  const gap = 1;
25285
25550
  const slot = (width - PAD2 * 2) / data.length;
25286
25551
  const barW = Math.max(1, slot - gap);
25287
- return /* @__PURE__ */ jsx96(Fragment40, { children: data.map((v, i) => {
25552
+ return /* @__PURE__ */ jsx96(Fragment41, { children: data.map((v, i) => {
25288
25553
  const x = PAD2 + i * slot + gap / 2;
25289
25554
  const h = (v - lo) / range * (height - PAD2 * 2);
25290
25555
  const y = height - PAD2 - h;
@@ -25324,7 +25589,7 @@ function WinLossVariant({
25324
25589
  const barW = Math.max(1, slot - gap);
25325
25590
  const mid = height / 2;
25326
25591
  const barH = (height - PAD2 * 2) * 0.4;
25327
- return /* @__PURE__ */ jsx96(Fragment40, { children: data.map((v, i) => {
25592
+ return /* @__PURE__ */ jsx96(Fragment41, { children: data.map((v, i) => {
25328
25593
  const x = PAD2 + i * slot + gap / 2;
25329
25594
  if (v === threshold) {
25330
25595
  return null;
@@ -25359,7 +25624,7 @@ function WinLossVariant({
25359
25624
  }
25360
25625
 
25361
25626
  // src/components/MetricCard/MetricCard.tsx
25362
- import { Fragment as Fragment41, jsx as jsx97, jsxs as jsxs95 } from "react/jsx-runtime";
25627
+ import { Fragment as Fragment42, jsx as jsx97, jsxs as jsxs95 } from "react/jsx-runtime";
25363
25628
  function resolveDeltaTone(trend, direction) {
25364
25629
  if (trend === "neutral") return "neutral";
25365
25630
  if (direction === "positive") {
@@ -25461,7 +25726,7 @@ var MetricCard = forwardRef64(
25461
25726
  children: label
25462
25727
  }
25463
25728
  ) : label;
25464
- const body = /* @__PURE__ */ jsxs95(Fragment41, { children: [
25729
+ const body = /* @__PURE__ */ jsxs95(Fragment42, { children: [
25465
25730
  /* @__PURE__ */ jsxs95("div", { className: "ods-metric-card__head", children: [
25466
25731
  icon && /* @__PURE__ */ jsx97("span", { className: "ods-metric-card__icon", "aria-hidden": "true", children: icon }),
25467
25732
  /* @__PURE__ */ jsxs95("div", { className: "ods-metric-card__head-body", children: [
@@ -25567,7 +25832,7 @@ import {
25567
25832
  CloseIcon as CloseIcon15,
25568
25833
  SearchIcon as SearchIcon12
25569
25834
  } from "@octaviaflow/icons";
25570
- import { Fragment as Fragment42, jsx as jsx98, jsxs as jsxs96 } from "react/jsx-runtime";
25835
+ import { Fragment as Fragment43, jsx as jsx98, jsxs as jsxs96 } from "react/jsx-runtime";
25571
25836
  var RESERVED_TAIL_PX = 64;
25572
25837
  var TAGS_GAP = 6;
25573
25838
  function OverflowTooltip({
@@ -26057,7 +26322,7 @@ var MultiSelect = forwardRef65(
26057
26322
  filteredOptions.length > 0 ? filteredOptions.map((opt, idx) => {
26058
26323
  const isSelected = selectedSet.has(opt.value);
26059
26324
  const optionId = `${baseId}-opt-${opt.value}`;
26060
- const tooltipContent = opt.description ? /* @__PURE__ */ jsxs96(Fragment42, { children: [
26325
+ const tooltipContent = opt.description ? /* @__PURE__ */ jsxs96(Fragment43, { children: [
26061
26326
  /* @__PURE__ */ jsx98("span", { children: opt.label }),
26062
26327
  /* @__PURE__ */ jsx98("br", {}),
26063
26328
  /* @__PURE__ */ jsx98("span", { style: { opacity: 0.75 }, children: opt.description })
@@ -26458,7 +26723,7 @@ import {
26458
26723
  forwardRef as forwardRef67,
26459
26724
  useId as useId42
26460
26725
  } from "react";
26461
- import { Fragment as Fragment43, jsx as jsx101, jsxs as jsxs99 } from "react/jsx-runtime";
26726
+ import { Fragment as Fragment44, jsx as jsx101, jsxs as jsxs99 } from "react/jsx-runtime";
26462
26727
  var STATUS_LABEL5 = {
26463
26728
  queued: "Queued",
26464
26729
  running: "Running",
@@ -26490,7 +26755,7 @@ function StatusRing({
26490
26755
  height: "20",
26491
26756
  animate,
26492
26757
  transition: animate ? { duration: 1.2, repeat: Infinity, ease: "linear" } : void 0,
26493
- children: status === "running" ? /* @__PURE__ */ jsxs99(Fragment43, { children: [
26758
+ children: status === "running" ? /* @__PURE__ */ jsxs99(Fragment44, { children: [
26494
26759
  /* @__PURE__ */ jsx101(
26495
26760
  "circle",
26496
26761
  {
@@ -26513,7 +26778,7 @@ function StatusRing({
26513
26778
  strokeLinecap: "round"
26514
26779
  }
26515
26780
  )
26516
- ] }) : status === "succeeded" ? /* @__PURE__ */ jsxs99(Fragment43, { children: [
26781
+ ] }) : status === "succeeded" ? /* @__PURE__ */ jsxs99(Fragment44, { children: [
26517
26782
  /* @__PURE__ */ jsx101("circle", { cx: "12", cy: "12", r: "9", fill: "currentColor", opacity: "0.18" }),
26518
26783
  /* @__PURE__ */ jsx101(
26519
26784
  "path",
@@ -26526,7 +26791,7 @@ function StatusRing({
26526
26791
  strokeLinejoin: "round"
26527
26792
  }
26528
26793
  )
26529
- ] }) : status === "failed" ? /* @__PURE__ */ jsxs99(Fragment43, { children: [
26794
+ ] }) : status === "failed" ? /* @__PURE__ */ jsxs99(Fragment44, { children: [
26530
26795
  /* @__PURE__ */ jsx101("circle", { cx: "12", cy: "12", r: "9", fill: "currentColor", opacity: "0.18" }),
26531
26796
  /* @__PURE__ */ jsx101(
26532
26797
  "path",
@@ -26537,7 +26802,7 @@ function StatusRing({
26537
26802
  strokeLinecap: "round"
26538
26803
  }
26539
26804
  )
26540
- ] }) : status === "paused" ? /* @__PURE__ */ jsxs99(Fragment43, { children: [
26805
+ ] }) : status === "paused" ? /* @__PURE__ */ jsxs99(Fragment44, { children: [
26541
26806
  /* @__PURE__ */ jsx101("circle", { cx: "12", cy: "12", r: "9", fill: "currentColor", opacity: "0.18" }),
26542
26807
  /* @__PURE__ */ jsx101(
26543
26808
  "path",
@@ -26548,7 +26813,7 @@ function StatusRing({
26548
26813
  strokeLinecap: "round"
26549
26814
  }
26550
26815
  )
26551
- ] }) : status === "skipped" ? /* @__PURE__ */ jsxs99(Fragment43, { children: [
26816
+ ] }) : status === "skipped" ? /* @__PURE__ */ jsxs99(Fragment44, { children: [
26552
26817
  /* @__PURE__ */ jsx101("circle", { cx: "12", cy: "12", r: "9", fill: "currentColor", opacity: "0.18" }),
26553
26818
  /* @__PURE__ */ jsx101(
26554
26819
  "path",
@@ -26561,7 +26826,7 @@ function StatusRing({
26561
26826
  strokeLinejoin: "round"
26562
26827
  }
26563
26828
  )
26564
- ] }) : status === "scheduled" ? /* @__PURE__ */ jsxs99(Fragment43, { children: [
26829
+ ] }) : status === "scheduled" ? /* @__PURE__ */ jsxs99(Fragment44, { children: [
26565
26830
  /* @__PURE__ */ jsx101(
26566
26831
  "circle",
26567
26832
  {
@@ -26586,7 +26851,7 @@ function StatusRing({
26586
26851
  )
26587
26852
  ] }) : (
26588
26853
  // queued
26589
- /* @__PURE__ */ jsx101(Fragment43, { children: /* @__PURE__ */ jsx101(
26854
+ /* @__PURE__ */ jsx101(Fragment44, { children: /* @__PURE__ */ jsx101(
26590
26855
  "circle",
26591
26856
  {
26592
26857
  cx: "12",
@@ -26656,7 +26921,7 @@ var PipelineCard = forwardRef67(
26656
26921
  }
26657
26922
  ) : name;
26658
26923
  const stop = (e) => e.stopPropagation();
26659
- const body = /* @__PURE__ */ jsxs99(Fragment43, { children: [
26924
+ const body = /* @__PURE__ */ jsxs99(Fragment44, { children: [
26660
26925
  /* @__PURE__ */ jsxs99("div", { className: "ods-pipeline-card__head", children: [
26661
26926
  /* @__PURE__ */ jsx101(
26662
26927
  StatusRing,
@@ -26859,7 +27124,7 @@ function usePlanPickerContext() {
26859
27124
  }
26860
27125
 
26861
27126
  // src/components/PlanCard/PlanCard.tsx
26862
- import { Fragment as Fragment44, jsx as jsx102, jsxs as jsxs100 } from "react/jsx-runtime";
27127
+ import { Fragment as Fragment45, jsx as jsx102, jsxs as jsxs100 } from "react/jsx-runtime";
26863
27128
  function isStructuredFeature(f) {
26864
27129
  return typeof f === "object" && f !== null && "text" in f;
26865
27130
  }
@@ -26936,7 +27201,7 @@ var PlanCard = forwardRef68(
26936
27201
  offer && /* @__PURE__ */ jsx102("div", { className: "ods-plan-card__offer", children: offer }),
26937
27202
  allowance && /* @__PURE__ */ jsx102("div", { className: "ods-plan-card__allowance", children: allowance }),
26938
27203
  description && /* @__PURE__ */ jsx102("div", { className: "ods-plan-card__desc", children: description }),
26939
- features && features.length > 0 && /* @__PURE__ */ jsxs100(Fragment44, { children: [
27204
+ features && features.length > 0 && /* @__PURE__ */ jsxs100(Fragment45, { children: [
26940
27205
  /* @__PURE__ */ jsx102("hr", { className: "ods-plan-card__sep" }),
26941
27206
  /* @__PURE__ */ jsx102("ul", { className: "ods-plan-card__features", children: features.map((f, i) => {
26942
27207
  const structured = isStructuredFeature(f);
@@ -27045,7 +27310,7 @@ PlanPicker.displayName = "PlanPicker";
27045
27310
  // src/components/Popover/Popover.tsx
27046
27311
  import { useCallback as useCallback37, useEffect as useEffect43, useLayoutEffect as useLayoutEffect9, useRef as useRef37, useState as useState53 } from "react";
27047
27312
  import { createPortal as createPortal13 } from "react-dom";
27048
- import { Fragment as Fragment45, jsx as jsx104, jsxs as jsxs101 } from "react/jsx-runtime";
27313
+ import { Fragment as Fragment46, jsx as jsx104, jsxs as jsxs101 } from "react/jsx-runtime";
27049
27314
  function computePosition3(rect, popRect, placement, offset) {
27050
27315
  const cx = rect.left + rect.width / 2;
27051
27316
  const cy = rect.top + rect.height / 2;
@@ -27165,7 +27430,7 @@ function Popover({
27165
27430
  ),
27166
27431
  document.body
27167
27432
  ) : null;
27168
- return /* @__PURE__ */ jsxs101(Fragment45, { children: [
27433
+ return /* @__PURE__ */ jsxs101(Fragment46, { children: [
27169
27434
  triggerEl,
27170
27435
  portal
27171
27436
  ] });
@@ -27287,7 +27552,7 @@ import {
27287
27552
  forwardRef as forwardRef71,
27288
27553
  useId as useId44
27289
27554
  } from "react";
27290
- import { Fragment as Fragment46, jsx as jsx106, jsxs as jsxs103 } from "react/jsx-runtime";
27555
+ import { Fragment as Fragment47, jsx as jsx106, jsxs as jsxs103 } from "react/jsx-runtime";
27291
27556
  function Stars({ value, max = 5, count }) {
27292
27557
  return /* @__PURE__ */ jsxs103(
27293
27558
  "span",
@@ -27336,7 +27601,7 @@ var ProductCard = forwardRef71(
27336
27601
  const descId = description ? `${baseId}-desc` : void 0;
27337
27602
  const tagList = tags ?? (tag ? [tag] : []);
27338
27603
  const isInteractive = Boolean(href || onClick) && !disabled;
27339
- const body = /* @__PURE__ */ jsxs103(Fragment46, { children: [
27604
+ const body = /* @__PURE__ */ jsxs103(Fragment47, { children: [
27340
27605
  image && /* @__PURE__ */ jsx106(
27341
27606
  "div",
27342
27607
  {
@@ -28391,7 +28656,7 @@ import {
28391
28656
  StarHalfIcon,
28392
28657
  StarIcon as StarIcon2
28393
28658
  } from "@octaviaflow/icons";
28394
- import { Fragment as Fragment47, jsx as jsx113, jsxs as jsxs110 } from "react/jsx-runtime";
28659
+ import { Fragment as Fragment48, jsx as jsx113, jsxs as jsxs110 } from "react/jsx-runtime";
28395
28660
  var Rating = forwardRef78(function Rating2({
28396
28661
  value,
28397
28662
  onChange,
@@ -28482,7 +28747,7 @@ var Rating = forwardRef78(function Rating2({
28482
28747
  "aria-hidden": "true",
28483
28748
  children: [
28484
28749
  /* @__PURE__ */ jsx113(Glyph, {}),
28485
- interactive && /* @__PURE__ */ jsxs110(Fragment47, { children: [
28750
+ interactive && /* @__PURE__ */ jsxs110(Fragment48, { children: [
28486
28751
  allowHalf && /* @__PURE__ */ jsx113(
28487
28752
  "span",
28488
28753
  {
@@ -29035,7 +29300,7 @@ var ScrollArea = forwardRef82(
29035
29300
  ScrollArea.displayName = "ScrollArea";
29036
29301
 
29037
29302
  // src/components/SettingsLayout/SettingsLayout.tsx
29038
- import { Fragment as Fragment48, jsx as jsx118, jsxs as jsxs114 } from "react/jsx-runtime";
29303
+ import { Fragment as Fragment49, jsx as jsx118, jsxs as jsxs114 } from "react/jsx-runtime";
29039
29304
  function SettingsLayout({
29040
29305
  groups,
29041
29306
  activeId,
@@ -29054,7 +29319,7 @@ function SettingsLayout({
29054
29319
  group.label && /* @__PURE__ */ jsx118("div", { className: "ods-settings-layout__group-label", children: group.label }),
29055
29320
  /* @__PURE__ */ jsx118("ul", { className: "ods-settings-layout__list", children: group.items.map((item) => {
29056
29321
  const active = item.id === activeId;
29057
- const content = /* @__PURE__ */ jsxs114(Fragment48, { children: [
29322
+ const content = /* @__PURE__ */ jsxs114(Fragment49, { children: [
29058
29323
  item.icon && /* @__PURE__ */ jsx118("span", { className: "ods-settings-layout__item-icon", "aria-hidden": "true", children: item.icon }),
29059
29324
  /* @__PURE__ */ jsx118("span", { className: "ods-settings-layout__item-label", children: item.label })
29060
29325
  ] });
@@ -29095,7 +29360,7 @@ function SettingsLayout({
29095
29360
  import { AnimatePresence as AnimatePresence14, motion as motion22 } from "framer-motion";
29096
29361
  import { useEffect as useEffect46 } from "react";
29097
29362
  import { createPortal as createPortal14 } from "react-dom";
29098
- import { Fragment as Fragment49, jsx as jsx119, jsxs as jsxs115 } from "react/jsx-runtime";
29363
+ import { Fragment as Fragment50, jsx as jsx119, jsxs as jsxs115 } from "react/jsx-runtime";
29099
29364
  var slideVariants = {
29100
29365
  top: { initial: { y: "-100%" }, animate: { y: 0 }, exit: { y: "-100%" } },
29101
29366
  bottom: { initial: { y: "100%" }, animate: { y: 0 }, exit: { y: "100%" } },
@@ -29139,7 +29404,7 @@ function Sheet({
29139
29404
  const variant = slideVariants[side];
29140
29405
  const resolved = resolveSize(side, size);
29141
29406
  const isVertical = side === "left" || side === "right";
29142
- const content = /* @__PURE__ */ jsx119(AnimatePresence14, { children: open && /* @__PURE__ */ jsxs115(Fragment49, { children: [
29407
+ const content = /* @__PURE__ */ jsx119(AnimatePresence14, { children: open && /* @__PURE__ */ jsxs115(Fragment50, { children: [
29143
29408
  /* @__PURE__ */ jsx119(
29144
29409
  motion22.div,
29145
29410
  {
@@ -29198,7 +29463,7 @@ Show.displayName = "Show";
29198
29463
 
29199
29464
  // src/components/Sidebar/Sidebar.tsx
29200
29465
  import { useCallback as useCallback40, useEffect as useEffect47, useRef as useRef42, useState as useState57 } from "react";
29201
- import { Fragment as Fragment50, jsx as jsx121, jsxs as jsxs116 } from "react/jsx-runtime";
29466
+ import { Fragment as Fragment51, jsx as jsx121, jsxs as jsxs116 } from "react/jsx-runtime";
29202
29467
  function Sidebar({
29203
29468
  variant = "expanded",
29204
29469
  sections,
@@ -29335,7 +29600,7 @@ function RailLayout({
29335
29600
  tooltipDelay,
29336
29601
  suppressTooltips
29337
29602
  }) {
29338
- return /* @__PURE__ */ jsxs116(Fragment50, { children: [
29603
+ return /* @__PURE__ */ jsxs116(Fragment51, { children: [
29339
29604
  /* @__PURE__ */ jsx121("div", { className: "ods-sidebar__nav-rail", children: sections.flatMap((s) => s.items).map((item) => /* @__PURE__ */ jsx121(
29340
29605
  RailItem,
29341
29606
  {
@@ -29493,7 +29758,7 @@ function ExpandedLayout({
29493
29758
  onPinToggle
29494
29759
  }) {
29495
29760
  const hasFooterControl = Boolean(onPinToggle || onToggle);
29496
- return /* @__PURE__ */ jsxs116(Fragment50, { children: [
29761
+ return /* @__PURE__ */ jsxs116(Fragment51, { children: [
29497
29762
  /* @__PURE__ */ jsx121("div", { className: "ods-sidebar__body", children: sections.map((section, sIdx) => /* @__PURE__ */ jsxs116("div", { className: "ods-sidebar__section", children: [
29498
29763
  section.label && /* @__PURE__ */ jsx121("div", { className: "ods-sidebar__section-label", children: section.label }),
29499
29764
  section.items.map((item) => /* @__PURE__ */ jsx121(ExpandedItem, { item, level: 0 }, item.id))
@@ -29556,7 +29821,7 @@ function ExpandedItem({ item, level }) {
29556
29821
  item.defaultExpanded ?? (hasChildren && hasActiveDescendant(item))
29557
29822
  );
29558
29823
  if (hasChildren) {
29559
- return /* @__PURE__ */ jsxs116(Fragment50, { children: [
29824
+ return /* @__PURE__ */ jsxs116(Fragment51, { children: [
29560
29825
  /* @__PURE__ */ jsxs116(
29561
29826
  "button",
29562
29827
  {
@@ -29638,7 +29903,7 @@ function ExpandedItem({ item, level }) {
29638
29903
  }
29639
29904
  function SidebarUserCard({ user }) {
29640
29905
  const labelText = typeof user.name === "string" ? user.name : "User";
29641
- const body = /* @__PURE__ */ jsxs116(Fragment50, { children: [
29906
+ const body = /* @__PURE__ */ jsxs116(Fragment51, { children: [
29642
29907
  /* @__PURE__ */ jsx121("span", { className: "ods-sidebar__user-avatar", children: user.avatar ?? /* @__PURE__ */ jsx121("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") }) }),
29643
29908
  /* @__PURE__ */ jsxs116("span", { className: "ods-sidebar__user-info", children: [
29644
29909
  /* @__PURE__ */ jsx121("span", { className: "ods-sidebar__user-name", children: user.name }),
@@ -29679,7 +29944,7 @@ import { AnimatePresence as AnimatePresence15, motion as motion23 } from "framer
29679
29944
  import { useEffect as useEffect48, useRef as useRef43 } from "react";
29680
29945
  import { FocusScope as FocusScope2, OverlayProvider as OverlayProvider2, useDialog as useDialog2, useModal as useModal2, useOverlay as useOverlay2 } from "react-aria";
29681
29946
  import { createPortal as createPortal15 } from "react-dom";
29682
- import { Fragment as Fragment51, jsx as jsx122, jsxs as jsxs117 } from "react/jsx-runtime";
29947
+ import { Fragment as Fragment52, jsx as jsx122, jsxs as jsxs117 } from "react/jsx-runtime";
29683
29948
  var slideVariants2 = {
29684
29949
  left: {
29685
29950
  initial: { x: "-100%" },
@@ -29745,7 +30010,7 @@ function SlideoutContent({
29745
30010
  const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeOverlayProps } = overlayProps;
29746
30011
  const variant = slideVariants2[position];
29747
30012
  const panelWidth = typeof width === "number" ? `${width}px` : width;
29748
- return /* @__PURE__ */ jsx122(AnimatePresence15, { children: open && /* @__PURE__ */ jsxs117(Fragment51, { children: [
30013
+ return /* @__PURE__ */ jsx122(AnimatePresence15, { children: open && /* @__PURE__ */ jsxs117(Fragment52, { children: [
29749
30014
  /* @__PURE__ */ jsx122(
29750
30015
  motion23.div,
29751
30016
  {
@@ -30034,7 +30299,7 @@ function VersionHistory({
30034
30299
  VersionHistory.displayName = "VersionHistory";
30035
30300
 
30036
30301
  // src/components/StatusList/StatusList.tsx
30037
- import { Fragment as Fragment52, jsx as jsx124, jsxs as jsxs119 } from "react/jsx-runtime";
30302
+ import { Fragment as Fragment53, jsx as jsx124, jsxs as jsxs119 } from "react/jsx-runtime";
30038
30303
  var TONE_TO_CHIP2 = {
30039
30304
  success: "success",
30040
30305
  running: "primary",
@@ -30056,7 +30321,7 @@ function StatusList({
30056
30321
  }) {
30057
30322
  const visible = typeof max === "number" ? items.slice(0, max) : items;
30058
30323
  const overflow = items.length - visible.length;
30059
- const renderRowInner = (item) => /* @__PURE__ */ jsxs119(Fragment52, { children: [
30324
+ const renderRowInner = (item) => /* @__PURE__ */ jsxs119(Fragment53, { children: [
30060
30325
  /* @__PURE__ */ jsx124(
30061
30326
  "span",
30062
30327
  {
@@ -30243,7 +30508,7 @@ Slider.displayName = "Slider";
30243
30508
  import {
30244
30509
  Children as Children2,
30245
30510
  forwardRef as forwardRef84,
30246
- Fragment as Fragment53
30511
+ Fragment as Fragment54
30247
30512
  } from "react";
30248
30513
  import { jsx as jsx126 } from "react/jsx-runtime";
30249
30514
  function resolveGap2(gap) {
@@ -30284,9 +30549,9 @@ var Stack = forwardRef84(function Stack2({
30284
30549
  const Component = as ?? "div";
30285
30550
  const items = divider ? Children2.toArray(children).flatMap(
30286
30551
  (child, i, arr) => i < arr.length - 1 ? [
30287
- /* @__PURE__ */ jsx126(Fragment53, { children: child }, `item-${i}`),
30288
- /* @__PURE__ */ jsx126(Fragment53, { children: divider }, `divider-${i}`)
30289
- ] : [/* @__PURE__ */ jsx126(Fragment53, { children: child }, `item-${i}`)]
30552
+ /* @__PURE__ */ jsx126(Fragment54, { children: child }, `item-${i}`),
30553
+ /* @__PURE__ */ jsx126(Fragment54, { children: divider }, `divider-${i}`)
30554
+ ] : [/* @__PURE__ */ jsx126(Fragment54, { children: child }, `item-${i}`)]
30290
30555
  ) : children;
30291
30556
  return /* @__PURE__ */ jsx126(
30292
30557
  Component,
@@ -31047,7 +31312,7 @@ import {
31047
31312
  CaretSortIcon as CaretSortIcon2,
31048
31313
  CaretUpIcon as CaretUpIcon3
31049
31314
  } from "@octaviaflow/icons";
31050
- import { Fragment as Fragment54, jsx as jsx131, jsxs as jsxs125 } from "react/jsx-runtime";
31315
+ import { Fragment as Fragment55, jsx as jsx131, jsxs as jsxs125 } from "react/jsx-runtime";
31051
31316
  function TableInner({
31052
31317
  columns,
31053
31318
  data,
@@ -31181,7 +31446,7 @@ function TableRow({
31181
31446
  }) {
31182
31447
  const isSelected = selectedRows?.has(rowIndex) ?? false;
31183
31448
  const [expanded, setExpanded] = useState63(false);
31184
- return /* @__PURE__ */ jsxs125(Fragment54, { children: [
31449
+ return /* @__PURE__ */ jsxs125(Fragment55, { children: [
31185
31450
  /* @__PURE__ */ jsxs125(
31186
31451
  "tr",
31187
31452
  {
@@ -31350,7 +31615,7 @@ import {
31350
31615
  forwardRef as forwardRef91,
31351
31616
  useId as useId53
31352
31617
  } from "react";
31353
- import { Fragment as Fragment55, jsx as jsx133, jsxs as jsxs127 } from "react/jsx-runtime";
31618
+ import { Fragment as Fragment56, jsx as jsx133, jsxs as jsxs127 } from "react/jsx-runtime";
31354
31619
  var TemplateCard = forwardRef91(function TemplateCard2({
31355
31620
  name,
31356
31621
  nameAs = "h3",
@@ -31456,7 +31721,7 @@ var TemplateCard = forwardRef91(function TemplateCard2({
31456
31721
  if (iconConnector === "plus") return "+";
31457
31722
  return iconConnector;
31458
31723
  };
31459
- const body = /* @__PURE__ */ jsxs127(Fragment55, { children: [
31724
+ const body = /* @__PURE__ */ jsxs127(Fragment56, { children: [
31460
31725
  showMedia && /* @__PURE__ */ jsxs127(
31461
31726
  "div",
31462
31727
  {
@@ -31656,7 +31921,7 @@ Timeline.displayName = "Timeline";
31656
31921
  // src/components/TimePicker/TimePicker.tsx
31657
31922
  import {
31658
31923
  forwardRef as forwardRef93,
31659
- Fragment as Fragment56,
31924
+ Fragment as Fragment57,
31660
31925
  useCallback as useCallback45,
31661
31926
  useEffect as useEffect51,
31662
31927
  useId as useId54,
@@ -31670,7 +31935,7 @@ import {
31670
31935
  ChevronDownIcon as ChevronDownIcon9,
31671
31936
  TimeIcon as TimeIcon2
31672
31937
  } from "@octaviaflow/icons";
31673
- import { Fragment as Fragment57, jsx as jsx135, jsxs as jsxs129 } from "react/jsx-runtime";
31938
+ import { Fragment as Fragment58, jsx as jsx135, jsxs as jsxs129 } from "react/jsx-runtime";
31674
31939
  var pad = (n) => n.toString().padStart(2, "0");
31675
31940
  function format(v, use24h, showSeconds) {
31676
31941
  const base = `${pad(v.hours)}:${pad(v.minutes)}${showSeconds ? `:${pad(v.seconds ?? 0)}` : ""}`;
@@ -31991,7 +32256,7 @@ var TimePicker = forwardRef93(
31991
32256
  segButton("hours", value.hours),
31992
32257
  /* @__PURE__ */ jsx135("span", { className: "ods-timepicker__display-sep", children: ":" }),
31993
32258
  segButton("minutes", value.minutes),
31994
- showSeconds && /* @__PURE__ */ jsxs129(Fragment57, { children: [
32259
+ showSeconds && /* @__PURE__ */ jsxs129(Fragment58, { children: [
31995
32260
  /* @__PURE__ */ jsx135("span", { className: "ods-timepicker__display-sep", children: ":" }),
31996
32261
  segButton("seconds", value.seconds ?? 0)
31997
32262
  ] })
@@ -32023,7 +32288,7 @@ var TimePicker = forwardRef93(
32023
32288
  )
32024
32289
  ] })
32025
32290
  ] }),
32026
- /* @__PURE__ */ jsx135("div", { className: "ods-timepicker__body", children: segOrder().map((seg, i, arr) => /* @__PURE__ */ jsxs129(Fragment56, { children: [
32291
+ /* @__PURE__ */ jsx135("div", { className: "ods-timepicker__body", children: segOrder().map((seg, i, arr) => /* @__PURE__ */ jsxs129(Fragment57, { children: [
32027
32292
  /* @__PURE__ */ jsxs129("div", { className: "ods-timepicker__col", children: [
32028
32293
  /* @__PURE__ */ jsx135("span", { className: "ods-timepicker__col-lbl", children: seg === "hours" ? "HOUR" : seg === "minutes" ? "MIN" : "SEC" }),
32029
32294
  /* @__PURE__ */ jsx135(
@@ -32089,7 +32354,7 @@ import {
32089
32354
  GlobeIcon,
32090
32355
  SearchIcon as SearchIcon13
32091
32356
  } from "@octaviaflow/icons";
32092
- import { Fragment as Fragment58, jsx as jsx136, jsxs as jsxs130 } from "react/jsx-runtime";
32357
+ import { Fragment as Fragment59, jsx as jsx136, jsxs as jsxs130 } from "react/jsx-runtime";
32093
32358
  var DEFAULT_TZS = [
32094
32359
  { iana: "America/Los_Angeles", label: "Pacific Time", offset: "UTC\u22128" },
32095
32360
  { iana: "America/Denver", label: "Mountain Time", offset: "UTC\u22127" },
@@ -32264,7 +32529,7 @@ var TimezonePicker = forwardRef94(
32264
32529
  "aria-invalid": error ? true : void 0,
32265
32530
  children: [
32266
32531
  /* @__PURE__ */ jsx136("span", { className: "ods-tzpicker__trigger-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx136(GlobeIcon, { size: "xs" }) }),
32267
- /* @__PURE__ */ jsx136("span", { className: "ods-tzpicker__info", children: selected ? /* @__PURE__ */ jsxs130(Fragment58, { children: [
32532
+ /* @__PURE__ */ jsx136("span", { className: "ods-tzpicker__info", children: selected ? /* @__PURE__ */ jsxs130(Fragment59, { children: [
32268
32533
  /* @__PURE__ */ jsx136("span", { className: "ods-tzpicker__name", children: selected.label }),
32269
32534
  /* @__PURE__ */ jsxs130("span", { className: "ods-tzpicker__meta", children: [
32270
32535
  selected.iana.split("/").pop()?.replace(/_/g, " "),
@@ -32393,7 +32658,7 @@ import {
32393
32658
  useState as useState67
32394
32659
  } from "react";
32395
32660
  import { createPortal as createPortal18 } from "react-dom";
32396
- import { Fragment as Fragment59, jsx as jsx137, jsxs as jsxs131 } from "react/jsx-runtime";
32661
+ import { Fragment as Fragment60, jsx as jsx137, jsxs as jsxs131 } from "react/jsx-runtime";
32397
32662
  var defaultIcons = {
32398
32663
  success: /* @__PURE__ */ jsxs131("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
32399
32664
  /* @__PURE__ */ jsx137(
@@ -32484,9 +32749,9 @@ var defaultIcons = {
32484
32749
  var ToastContext = createContext3(null);
32485
32750
  function ToastBody({ item, onDismiss }) {
32486
32751
  const dismiss = () => onDismiss(item.id);
32487
- if (item.render) return /* @__PURE__ */ jsx137(Fragment59, { children: item.render({ id: item.id, dismiss }) });
32752
+ if (item.render) return /* @__PURE__ */ jsx137(Fragment60, { children: item.render({ id: item.id, dismiss }) });
32488
32753
  const title = item.title ?? item.message;
32489
- return /* @__PURE__ */ jsxs131(Fragment59, { children: [
32754
+ return /* @__PURE__ */ jsxs131(Fragment60, { children: [
32490
32755
  /* @__PURE__ */ jsx137("span", { className: "ods-toast__icon", "aria-hidden": "true", children: item.icon ?? defaultIcons[item.variant] }),
32491
32756
  /* @__PURE__ */ jsxs131("div", { className: "ods-toast__body", children: [
32492
32757
  title && /* @__PURE__ */ jsx137("div", { className: "ods-toast__title", children: title }),
@@ -32706,7 +32971,7 @@ function ToastProvider({
32706
32971
  return out;
32707
32972
  }, [toasts]);
32708
32973
  const ctx = { toast, dismiss, dismissAll };
32709
- const containers = /* @__PURE__ */ jsx137(Fragment59, { children: POSITIONS.map((pos) => {
32974
+ const containers = /* @__PURE__ */ jsx137(Fragment60, { children: POSITIONS.map((pos) => {
32710
32975
  const list = groups[pos];
32711
32976
  if (list.length === 0) return null;
32712
32977
  return /* @__PURE__ */ jsx137(
@@ -33468,7 +33733,7 @@ import {
33468
33733
  forwardRef as forwardRef98,
33469
33734
  useId as useId60
33470
33735
  } from "react";
33471
- import { Fragment as Fragment60, jsx as jsx144, jsxs as jsxs138 } from "react/jsx-runtime";
33736
+ import { Fragment as Fragment61, jsx as jsx144, jsxs as jsxs138 } from "react/jsx-runtime";
33472
33737
  var UserCard = forwardRef98(function UserCard2({
33473
33738
  name,
33474
33739
  nameAs = "h3",
@@ -33512,7 +33777,7 @@ var UserCard = forwardRef98(function UserCard2({
33512
33777
  }
33513
33778
  );
33514
33779
  };
33515
- const body = /* @__PURE__ */ jsxs138(Fragment60, { children: [
33780
+ const body = /* @__PURE__ */ jsxs138(Fragment61, { children: [
33516
33781
  renderAvatar(),
33517
33782
  /* @__PURE__ */ jsxs138("div", { className: "ods-user-card__body", children: [
33518
33783
  /* @__PURE__ */ jsx144(Card.Title, { as: nameAs, id: nameId, className: "ods-user-card__name", children: name }),
@@ -34703,7 +34968,7 @@ function useWorkflowRuntime(startedAt, active) {
34703
34968
  }
34704
34969
 
34705
34970
  // src/components/WorkflowHeader/WorkflowHeader.tsx
34706
- import { Fragment as Fragment61, jsx as jsx146, jsxs as jsxs140 } from "react/jsx-runtime";
34971
+ import { Fragment as Fragment62, jsx as jsx146, jsxs as jsxs140 } from "react/jsx-runtime";
34707
34972
  function WorkflowHeader({
34708
34973
  name,
34709
34974
  statusTone,
@@ -34789,7 +35054,7 @@ function WorkflowHeader({
34789
35054
  children: name
34790
35055
  }
34791
35056
  ),
34792
- saveIndicator && /* @__PURE__ */ jsxs140(Fragment61, { children: [
35057
+ saveIndicator && /* @__PURE__ */ jsxs140(Fragment62, { children: [
34793
35058
  /* @__PURE__ */ jsx146("span", { className: "ods-workflow-header__sep", "aria-hidden": "true" }),
34794
35059
  /* @__PURE__ */ jsxs140(
34795
35060
  "span",
@@ -34867,7 +35132,7 @@ function WorkflowHeader({
34867
35132
  onClick: onStop,
34868
35133
  children: /* @__PURE__ */ jsxs140("span", { className: "ods-workflow-header__stop-label", children: [
34869
35134
  /* @__PURE__ */ jsx146("span", { children: "Stop" }),
34870
- runtime && /* @__PURE__ */ jsxs140(Fragment61, { children: [
35135
+ runtime && /* @__PURE__ */ jsxs140(Fragment62, { children: [
34871
35136
  /* @__PURE__ */ jsx146("span", { className: "ods-workflow-header__stop-dot", "aria-hidden": "true", children: "\xB7" }),
34872
35137
  /* @__PURE__ */ jsx146("span", { className: "ods-workflow-header__runtime", children: runtime })
34873
35138
  ] })
@@ -34908,7 +35173,7 @@ import {
34908
35173
  StopFilledAltIcon as StopFilledAltIcon3,
34909
35174
  TerminalIcon as TerminalIcon2
34910
35175
  } from "@octaviaflow/icons";
34911
- import { Fragment as Fragment62, jsx as jsx147, jsxs as jsxs141 } from "react/jsx-runtime";
35176
+ import { Fragment as Fragment63, jsx as jsx147, jsxs as jsxs141 } from "react/jsx-runtime";
34912
35177
  function WorkflowHeaderExpanded({
34913
35178
  name,
34914
35179
  statusTone = "draft",
@@ -35013,7 +35278,7 @@ function WorkflowHeaderExpanded({
35013
35278
  onClick: onStop,
35014
35279
  children: /* @__PURE__ */ jsxs141("span", { style: { display: "inline-flex", gap: 4, alignItems: "center" }, children: [
35015
35280
  /* @__PURE__ */ jsx147("span", { children: "Stop" }),
35016
- runtime && /* @__PURE__ */ jsxs141(Fragment62, { children: [
35281
+ runtime && /* @__PURE__ */ jsxs141(Fragment63, { children: [
35017
35282
  /* @__PURE__ */ jsx147("span", { "aria-hidden": "true", style: { opacity: 0.6 }, children: "\xB7" }),
35018
35283
  /* @__PURE__ */ jsx147("span", { className: "ods-workflow-header-expanded__runtime", children: runtime })
35019
35284
  ] })