@octaviaflow/core 3.0.17-beta.0 → 3.0.18-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/chunk-2RD5OERK.js +2553 -0
  2. package/dist/chunk-2RD5OERK.js.map +1 -0
  3. package/dist/chunk-CGWNV2HS.js +2549 -0
  4. package/dist/chunk-CGWNV2HS.js.map +1 -0
  5. package/dist/chunk-CS7JWNQD.js +2552 -0
  6. package/dist/chunk-CS7JWNQD.js.map +1 -0
  7. package/dist/chunk-D6CFZILB.js +2550 -0
  8. package/dist/chunk-D6CFZILB.js.map +1 -0
  9. package/dist/chunk-ECOTUJWJ.js +2548 -0
  10. package/dist/chunk-ECOTUJWJ.js.map +1 -0
  11. package/dist/chunk-F3ZHEDDP.js +2548 -0
  12. package/dist/chunk-F3ZHEDDP.js.map +1 -0
  13. package/dist/chunk-QWICIDGH.js +2547 -0
  14. package/dist/chunk-QWICIDGH.js.map +1 -0
  15. package/dist/chunk-TTKIDRN7.js +2551 -0
  16. package/dist/chunk-TTKIDRN7.js.map +1 -0
  17. package/dist/chunk-UFGAO5OY.js +2546 -0
  18. package/dist/chunk-UFGAO5OY.js.map +1 -0
  19. package/dist/components/ActionsDrawer/ActionsDrawer.d.ts +6 -0
  20. package/dist/components/ActionsDrawer/ActionsDrawer.d.ts.map +1 -1
  21. package/dist/components/ConfigPanel/ConfigPanel.d.ts +20 -1
  22. package/dist/components/ConfigPanel/ConfigPanel.d.ts.map +1 -1
  23. package/dist/components/ExecutionConsole/ExecutionConsole.d.ts +18 -2
  24. package/dist/components/ExecutionConsole/ExecutionConsole.d.ts.map +1 -1
  25. package/dist/components/FlowMinimap/FlowMinimap.d.ts +27 -2
  26. package/dist/components/FlowMinimap/FlowMinimap.d.ts.map +1 -1
  27. package/dist/components/FlowToolbar/FlowToolbar.d.ts +91 -1
  28. package/dist/components/FlowToolbar/FlowToolbar.d.ts.map +1 -1
  29. package/dist/components/FlowToolbar/index.d.ts +1 -1
  30. package/dist/components/FlowToolbar/index.d.ts.map +1 -1
  31. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  32. package/dist/index.cjs +1417 -994
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1193 -778
  37. package/dist/index.js.map +1 -1
  38. package/dist/styles.css +1 -1
  39. package/dist/workflow/components/kinds/BaseNode.d.ts +7 -1
  40. package/dist/workflow/components/kinds/BaseNode.d.ts.map +1 -1
  41. package/dist/workflow/components/kinds/index.d.ts +6 -0
  42. package/dist/workflow/components/kinds/index.d.ts.map +1 -1
  43. package/dist/workflow.cjs +9 -2
  44. package/dist/workflow.cjs.map +1 -1
  45. package/dist/workflow.js +1 -1
  46. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  applyEdgeChanges,
4
4
  applyNodeChanges,
5
5
  buildEdgePath
6
- } from "./chunk-LSDAQCUJ.js";
6
+ } from "./chunk-2RD5OERK.js";
7
7
  import {
8
8
  __export,
9
9
  cn
@@ -182,6 +182,7 @@ function ActionsDrawer({
182
182
  "aria-controls": `${uid}-group-${group.id}`,
183
183
  children: [
184
184
  /* @__PURE__ */ jsx(ChevronIcon, { open: !isCollapsed }),
185
+ group.icon && /* @__PURE__ */ jsx("span", { className: "ods-actions-drawer__group-icon", "aria-hidden": "true", children: group.icon }),
185
186
  /* @__PURE__ */ jsx("span", { className: "ods-actions-drawer__group-label", children: group.label }),
186
187
  /* @__PURE__ */ jsx("span", { className: "ods-actions-drawer__group-count", children: group.items.length })
187
188
  ]
@@ -4068,13 +4069,15 @@ function ConditionBuilder({
4068
4069
  import { AnimatePresence, motion as motion3 } from "framer-motion";
4069
4070
  import { useRef as useRef8 } from "react";
4070
4071
  import { useButton as useButton2 } from "react-aria";
4071
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
4072
+ import { Fragment as Fragment5, jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
4072
4073
  function ConfigPanel({
4073
4074
  open = false,
4074
4075
  onClose,
4075
4076
  title = "Configure",
4076
4077
  icon,
4077
4078
  children,
4079
+ customRender,
4080
+ customFooter,
4078
4081
  onSave,
4079
4082
  onCancel,
4080
4083
  className
@@ -4091,6 +4094,7 @@ function ConfigPanel({
4091
4094
  const safeCloseProps = stripMotionConflicts(closeProps);
4092
4095
  const safeSaveProps = stripMotionConflicts(saveProps);
4093
4096
  const safeCancelProps = stripMotionConflicts(cancelProps);
4097
+ const bodyContent = customRender ?? children;
4094
4098
  return /* @__PURE__ */ jsx21(AnimatePresence, { children: open && /* @__PURE__ */ jsxs20(
4095
4099
  motion3.div,
4096
4100
  {
@@ -4119,8 +4123,8 @@ function ConfigPanel({
4119
4123
  }
4120
4124
  )
4121
4125
  ] }),
4122
- /* @__PURE__ */ jsx21("div", { className: "ods-config-panel__body", "data-testid": "config-panel-body", children }),
4123
- /* @__PURE__ */ jsxs20("div", { className: "ods-config-panel__footer", children: [
4126
+ /* @__PURE__ */ jsx21("div", { className: "ods-config-panel__body", "data-testid": "config-panel-body", children: bodyContent }),
4127
+ /* @__PURE__ */ jsx21("div", { className: "ods-config-panel__footer", children: customFooter ?? /* @__PURE__ */ jsxs20(Fragment5, { children: [
4124
4128
  /* @__PURE__ */ jsx21(
4125
4129
  "button",
4126
4130
  {
@@ -4141,7 +4145,7 @@ function ConfigPanel({
4141
4145
  children: "Save"
4142
4146
  }
4143
4147
  )
4144
- ] })
4148
+ ] }) })
4145
4149
  ]
4146
4150
  }
4147
4151
  ) });
@@ -4153,7 +4157,7 @@ function stripMotionConflicts(props) {
4153
4157
 
4154
4158
  // src/components/DataMapper/DataMapper.tsx
4155
4159
  import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo5, useRef as useRef9, useState as useState7 } from "react";
4156
- import { Fragment as Fragment5, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
4160
+ import { Fragment as Fragment6, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
4157
4161
  var TYPE_CLASSES = {
4158
4162
  string: "string",
4159
4163
  integer: "integer",
@@ -4693,7 +4697,7 @@ function DataMapper({
4693
4697
  " mapped"
4694
4698
  ] })
4695
4699
  ] }),
4696
- requiredUnmapped > 0 && /* @__PURE__ */ jsxs21(Fragment5, { children: [
4700
+ requiredUnmapped > 0 && /* @__PURE__ */ jsxs21(Fragment6, { children: [
4697
4701
  /* @__PURE__ */ jsx22("span", { className: "ods-data-mapper__stat-sep", children: "\xB7" }),
4698
4702
  /* @__PURE__ */ jsxs21("span", { className: "ods-data-mapper__stat ods-data-mapper__stat--warn", children: [
4699
4703
  /* @__PURE__ */ jsx22("span", { className: "ods-data-mapper__stat-value", children: requiredUnmapped }),
@@ -5459,7 +5463,7 @@ import { AnimatePresence as AnimatePresence2, motion as motion4 } from "framer-m
5459
5463
  import { useCallback as useCallback4, useEffect as useEffect4, useMemo as useMemo6, useRef as useRef10, useState as useState8 } from "react";
5460
5464
  import { HiddenSelect, useButton as useButton3, useListBox, useOption, useSelect } from "react-aria";
5461
5465
  import { createPortal } from "react-dom";
5462
- import { Fragment as Fragment6, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
5466
+ import { Fragment as Fragment7, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
5463
5467
  function ListBox(props) {
5464
5468
  const ref = useRef10(null);
5465
5469
  const { listBoxRef = ref, state, showCheckmark } = props;
@@ -5681,7 +5685,7 @@ function Select({
5681
5685
  "aria-required": required || void 0,
5682
5686
  className: cn("ods-select__trigger", state.isOpen && "ods-select__trigger--open"),
5683
5687
  children: [
5684
- /* @__PURE__ */ jsx23("span", { className: "ods-select__value", children: selectedOption ? /* @__PURE__ */ jsxs22(Fragment6, { children: [
5688
+ /* @__PURE__ */ jsx23("span", { className: "ods-select__value", children: selectedOption ? /* @__PURE__ */ jsxs22(Fragment7, { children: [
5685
5689
  selectedOption.icon && /* @__PURE__ */ jsx23("span", { className: "ods-select__value-icon", children: selectedOption.icon }),
5686
5690
  selectedOption.label
5687
5691
  ] }) : /* @__PURE__ */ jsx23("span", { className: "ods-select__placeholder", children: placeholder }) }),
@@ -5750,7 +5754,7 @@ function Select({
5750
5754
  }
5751
5755
 
5752
5756
  // src/components/DataTable/DataTable.tsx
5753
- import { Fragment as Fragment7, jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
5757
+ import { Fragment as Fragment8, jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
5754
5758
  function readValue(row, col) {
5755
5759
  if (typeof col.accessor === "function") return col.accessor(row);
5756
5760
  const k = col.accessor ?? col.key;
@@ -6219,7 +6223,7 @@ function DataTable(props) {
6219
6223
  const showBulkBar = selectable && selectedCount > 0;
6220
6224
  const wrapperClass = cn("ods-datatable", `ods-datatable--${density}`, className);
6221
6225
  return /* @__PURE__ */ jsxs23("div", { className: wrapperClass, role: "region", "aria-label": "Data table", children: [
6222
- /* @__PURE__ */ jsx24("div", { className: "ods-datatable__toolbar", children: showBulkBar ? /* @__PURE__ */ jsxs23(Fragment7, { children: [
6226
+ /* @__PURE__ */ jsx24("div", { className: "ods-datatable__toolbar", children: showBulkBar ? /* @__PURE__ */ jsxs23(Fragment8, { children: [
6223
6227
  /* @__PURE__ */ jsxs23("div", { className: "ods-datatable__bulk-summary", children: [
6224
6228
  /* @__PURE__ */ jsx24("span", { className: "ods-datatable__bulk-count", children: selectedCount }),
6225
6229
  /* @__PURE__ */ jsx24("span", { children: "selected" }),
@@ -6253,7 +6257,7 @@ function DataTable(props) {
6253
6257
  },
6254
6258
  i
6255
6259
  )) })
6256
- ] }) : /* @__PURE__ */ jsxs23(Fragment7, { children: [
6260
+ ] }) : /* @__PURE__ */ jsxs23(Fragment8, { children: [
6257
6261
  /* @__PURE__ */ jsxs23("div", { className: "ods-datatable__title-block", children: [
6258
6262
  title && /* @__PURE__ */ jsxs23("h2", { className: "ods-datatable__title", children: [
6259
6263
  title,
@@ -6523,7 +6527,7 @@ function Row({
6523
6527
  }) {
6524
6528
  const [menuOpen, setMenuOpen] = useState9(false);
6525
6529
  const triggerRef = useRef11(null);
6526
- return /* @__PURE__ */ jsxs23(Fragment7, { children: [
6530
+ return /* @__PURE__ */ jsxs23(Fragment8, { children: [
6527
6531
  /* @__PURE__ */ jsxs23(
6528
6532
  "tr",
6529
6533
  {
@@ -6951,7 +6955,7 @@ function Dialog(props) {
6951
6955
  }
6952
6956
 
6953
6957
  // src/components/DonutChart/DonutChart.tsx
6954
- import { Fragment as Fragment8, jsx as jsx28, jsxs as jsxs27 } from "react/jsx-runtime";
6958
+ import { Fragment as Fragment9, jsx as jsx28, jsxs as jsxs27 } from "react/jsx-runtime";
6955
6959
  function DonutChart({
6956
6960
  data,
6957
6961
  size = 160,
@@ -7002,7 +7006,7 @@ function DonutChart({
7002
7006
  i
7003
7007
  )) })
7004
7008
  ] }),
7005
- /* @__PURE__ */ jsx28("div", { className: "ods-donut__center", children: centerLabel ?? /* @__PURE__ */ jsxs27(Fragment8, { children: [
7009
+ /* @__PURE__ */ jsx28("div", { className: "ods-donut__center", children: centerLabel ?? /* @__PURE__ */ jsxs27(Fragment9, { children: [
7006
7010
  /* @__PURE__ */ jsx28("div", { className: "ods-donut__value", children: total }),
7007
7011
  /* @__PURE__ */ jsx28("div", { className: "ods-donut__small", children: "total" })
7008
7012
  ] }) })
@@ -7073,7 +7077,7 @@ import { AnimatePresence as AnimatePresence4, motion as motion6 } from "framer-m
7073
7077
  import { useEffect as useEffect7, useRef as useRef14 } from "react";
7074
7078
  import { useButton as useButton4, useMenu, useMenuItem, useMenuTrigger } from "react-aria";
7075
7079
  import { createPortal as createPortal4 } from "react-dom";
7076
- import { Fragment as Fragment9, jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
7080
+ import { Fragment as Fragment10, jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
7077
7081
  function MenuItemComponent({ item, state, onAction }) {
7078
7082
  const ref = useRef14(null);
7079
7083
  const { menuItemProps } = useMenuItem({ key: item.key, onAction }, state, ref);
@@ -7227,7 +7231,7 @@ function DropdownMenu({
7227
7231
  });
7228
7232
  const { buttonProps } = useButton4({ ...menuTriggerProps, ...ariaNameProps }, triggerRef);
7229
7233
  const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTriggerProps } = buttonProps;
7230
- return /* @__PURE__ */ jsxs29(Fragment9, { children: [
7234
+ return /* @__PURE__ */ jsxs29(Fragment10, { children: [
7231
7235
  /* @__PURE__ */ jsx30(
7232
7236
  "button",
7233
7237
  {
@@ -7266,7 +7270,7 @@ function EmptyState({ icon, title, description, action, className }) {
7266
7270
  // src/components/ExecutionConsole/ExecutionConsole.tsx
7267
7271
  import { motion as motion7 } from "framer-motion";
7268
7272
  import { useEffect as useEffect8, useMemo as useMemo8, useRef as useRef15, useState as useState11 } from "react";
7269
- import { Fragment as Fragment10, jsx as jsx32, jsxs as jsxs31 } from "react/jsx-runtime";
7273
+ import { Fragment as Fragment11, jsx as jsx32, jsxs as jsxs31 } from "react/jsx-runtime";
7270
7274
  var iconProps = {
7271
7275
  xmlns: "http://www.w3.org/2000/svg",
7272
7276
  viewBox: "0 0 24 24",
@@ -7324,6 +7328,7 @@ function ExecutionConsole({
7324
7328
  showNodeFilter = true,
7325
7329
  exportable = true,
7326
7330
  expandedHeight = DEFAULT_EXPANDED_HEIGHT,
7331
+ height,
7327
7332
  toolbar,
7328
7333
  emptyState,
7329
7334
  className
@@ -7430,12 +7435,16 @@ function ExecutionConsole({
7430
7435
  }, [logs]);
7431
7436
  const showNodeChrome = showNodeFilter && nodeOptions.length > 0;
7432
7437
  const hasFilterChrome = searchable || showLevelFilter || showNodeChrome;
7438
+ const useFlexFill = height === "fill" || height === "100%";
7439
+ const explicitHeightStyle = useFlexFill ? { flex: "1 1 auto", minHeight: 0, height: "100%" } : height !== void 0 ? { height: typeof height === "number" ? `${height}px` : height } : void 0;
7440
+ const motionAnimate = explicitHeightStyle ? false : { height: open ? expandedHeight : COLLAPSED_HEIGHT };
7433
7441
  return /* @__PURE__ */ jsxs31(
7434
7442
  motion7.div,
7435
7443
  {
7436
7444
  className: cn("ods-console", open && "ods-console--open", className),
7437
- animate: { height: open ? expandedHeight : COLLAPSED_HEIGHT },
7445
+ animate: motionAnimate,
7438
7446
  transition: { type: "spring", stiffness: 300, damping: 30 },
7447
+ style: explicitHeightStyle,
7439
7448
  "data-testid": "execution-console",
7440
7449
  children: [
7441
7450
  /* @__PURE__ */ jsxs31("div", { className: "ods-console__bar", "data-testid": "console-bar", children: [
@@ -7554,7 +7563,7 @@ function ExecutionConsole({
7554
7563
  children: /* @__PURE__ */ jsx32(TrashIcon2, {})
7555
7564
  }
7556
7565
  ),
7557
- toolbar && /* @__PURE__ */ jsxs31(Fragment10, { children: [
7566
+ toolbar && /* @__PURE__ */ jsxs31(Fragment11, { children: [
7558
7567
  /* @__PURE__ */ jsx32("span", { className: "ods-console__action-separator", "aria-hidden": "true" }),
7559
7568
  toolbar
7560
7569
  ] })
@@ -7683,7 +7692,7 @@ function q(query, text) {
7683
7692
  const lc = text.toLowerCase();
7684
7693
  const idx = lc.indexOf(trimmed.toLowerCase());
7685
7694
  if (idx < 0) return text;
7686
- return /* @__PURE__ */ jsxs31(Fragment10, { children: [
7695
+ return /* @__PURE__ */ jsxs31(Fragment11, { children: [
7687
7696
  text.slice(0, idx),
7688
7697
  /* @__PURE__ */ jsx32("mark", { className: "ods-console__match", children: text.slice(idx, idx + trimmed.length) }),
7689
7698
  text.slice(idx + trimmed.length)
@@ -7820,7 +7829,7 @@ function sanitizeHref(url) {
7820
7829
  }
7821
7830
 
7822
7831
  // src/components/FileDropzone/FileDropzone.tsx
7823
- import { Fragment as Fragment11, jsx as jsx34, jsxs as jsxs33 } from "react/jsx-runtime";
7832
+ import { Fragment as Fragment12, jsx as jsx34, jsxs as jsxs33 } from "react/jsx-runtime";
7824
7833
  var UPLOAD_ICON = /* @__PURE__ */ jsx34("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx34(
7825
7834
  "path",
7826
7835
  {
@@ -8217,7 +8226,7 @@ function FileDropzone({
8217
8226
  children: CHECK_ICON
8218
8227
  }
8219
8228
  ),
8220
- status === "error" && /* @__PURE__ */ jsxs33(Fragment11, { children: [
8229
+ status === "error" && /* @__PURE__ */ jsxs33(Fragment12, { children: [
8221
8230
  /* @__PURE__ */ jsx34(
8222
8231
  "span",
8223
8232
  {
@@ -8973,7 +8982,13 @@ function FlowCanvas2({
8973
8982
  }
8974
8983
 
8975
8984
  // src/components/FlowMinimap/FlowMinimap.tsx
8976
- import { useCallback as useCallback9, useMemo as useMemo9 } from "react";
8985
+ import {
8986
+ useCallback as useCallback9,
8987
+ useEffect as useEffect11,
8988
+ useMemo as useMemo9,
8989
+ useRef as useRef19,
8990
+ useState as useState15
8991
+ } from "react";
8977
8992
  import { jsx as jsx38, jsxs as jsxs37 } from "react/jsx-runtime";
8978
8993
  var MINIMAP_WIDTH = 140;
8979
8994
  var MINIMAP_HEIGHT = 100;
@@ -8981,6 +8996,7 @@ function FlowMinimap({
8981
8996
  nodes = [],
8982
8997
  edges = [],
8983
8998
  viewportRect,
8999
+ viewport,
8984
9000
  totalWidth = 2e3,
8985
9001
  totalHeight = 1500,
8986
9002
  onViewportChange,
@@ -9016,72 +9032,200 @@ function FlowMinimap({
9016
9032
  height: viewportRect.height * scaleY
9017
9033
  };
9018
9034
  }, [viewportRect, scaleX, scaleY]);
9019
- const handleClick = useCallback9(
9020
- (e) => {
9035
+ const reportViewportChange = useCallback9(
9036
+ (worldX, worldY) => {
9021
9037
  if (!onViewportChange) return;
9038
+ if (onViewportChange.length <= 1) {
9039
+ onViewportChange({
9040
+ x: worldX,
9041
+ y: worldY,
9042
+ zoom: viewport?.zoom
9043
+ });
9044
+ } else {
9045
+ onViewportChange(worldX, worldY);
9046
+ }
9047
+ },
9048
+ [onViewportChange, viewport?.zoom]
9049
+ );
9050
+ const handleSvgClick = useCallback9(
9051
+ (e) => {
9052
+ if (dragRef.current.dragging) return;
9022
9053
  const rect = e.currentTarget.getBoundingClientRect();
9023
9054
  const clickX = e.clientX - rect.left;
9024
9055
  const clickY = e.clientY - rect.top;
9025
- const worldX = clickX / scaleX;
9026
- const worldY = clickY / scaleY;
9027
- onViewportChange(worldX, worldY);
9056
+ let worldX = clickX / scaleX;
9057
+ let worldY = clickY / scaleY;
9058
+ if (viewportRect) {
9059
+ worldX -= viewportRect.width / 2;
9060
+ worldY -= viewportRect.height / 2;
9061
+ }
9062
+ reportViewportChange(worldX, worldY);
9063
+ },
9064
+ [scaleX, scaleY, viewportRect, reportViewportChange]
9065
+ );
9066
+ const dragRef = useRef19({
9067
+ dragging: false,
9068
+ pointerId: -1,
9069
+ startX: 0,
9070
+ startY: 0,
9071
+ startWorldX: 0,
9072
+ startWorldY: 0
9073
+ });
9074
+ const [isDragging, setIsDragging] = useState15(false);
9075
+ const onViewportPointerDown = useCallback9(
9076
+ (e) => {
9077
+ if (!viewportRect) return;
9078
+ e.stopPropagation();
9079
+ e.preventDefault();
9080
+ const svg = e.currentTarget.ownerSVGElement ?? e.currentTarget;
9081
+ svg.setPointerCapture?.(e.pointerId);
9082
+ dragRef.current = {
9083
+ dragging: true,
9084
+ pointerId: e.pointerId,
9085
+ startX: e.clientX,
9086
+ startY: e.clientY,
9087
+ startWorldX: viewportRect.x,
9088
+ startWorldY: viewportRect.y
9089
+ };
9090
+ setIsDragging(true);
9028
9091
  },
9029
- [onViewportChange, scaleX, scaleY]
9092
+ [viewportRect]
9030
9093
  );
9031
- return /* @__PURE__ */ jsx38("div", { className: cn("ods-flow-minimap", className), "data-testid": "flow-minimap", children: /* @__PURE__ */ jsxs37(
9094
+ const onSvgPointerMove = useCallback9(
9095
+ (e) => {
9096
+ const d = dragRef.current;
9097
+ if (!d.dragging || d.pointerId !== e.pointerId) return;
9098
+ const dx = (e.clientX - d.startX) / scaleX;
9099
+ const dy = (e.clientY - d.startY) / scaleY;
9100
+ reportViewportChange(d.startWorldX + dx, d.startWorldY + dy);
9101
+ },
9102
+ [scaleX, scaleY, reportViewportChange]
9103
+ );
9104
+ const onSvgPointerUp = useCallback9((e) => {
9105
+ const d = dragRef.current;
9106
+ if (d.dragging && d.pointerId === e.pointerId) {
9107
+ d.dragging = false;
9108
+ d.pointerId = -1;
9109
+ setIsDragging(false);
9110
+ e.currentTarget.releasePointerCapture?.(e.pointerId);
9111
+ }
9112
+ }, []);
9113
+ useEffect11(
9114
+ () => () => {
9115
+ dragRef.current.dragging = false;
9116
+ },
9117
+ []
9118
+ );
9119
+ return /* @__PURE__ */ jsx38(
9120
+ "div",
9121
+ {
9122
+ className: cn("ods-flow-minimap", isDragging && "ods-flow-minimap--dragging", className),
9123
+ "data-testid": "flow-minimap",
9124
+ children: /* @__PURE__ */ jsxs37(
9125
+ "svg",
9126
+ {
9127
+ width: MINIMAP_WIDTH,
9128
+ height: MINIMAP_HEIGHT,
9129
+ viewBox: `0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}`,
9130
+ onClick: handleSvgClick,
9131
+ onPointerMove: onSvgPointerMove,
9132
+ onPointerUp: onSvgPointerUp,
9133
+ onPointerCancel: onSvgPointerUp,
9134
+ "data-testid": "flow-minimap-svg",
9135
+ children: [
9136
+ scaledEdges.map((e, i) => /* @__PURE__ */ jsx38(
9137
+ "line",
9138
+ {
9139
+ x1: e.x1,
9140
+ y1: e.y1,
9141
+ x2: e.x2,
9142
+ y2: e.y2,
9143
+ className: "ods-flow-minimap__edge"
9144
+ },
9145
+ i
9146
+ )),
9147
+ scaledNodes.map((n) => /* @__PURE__ */ jsx38(
9148
+ "rect",
9149
+ {
9150
+ x: n.sx,
9151
+ y: n.sy,
9152
+ width: n.sw,
9153
+ height: n.sh,
9154
+ rx: 1,
9155
+ fill: n.color || "var(--ods-color-brand-500, #3b5bff)",
9156
+ className: "ods-flow-minimap__node",
9157
+ "data-testid": `minimap-node-${n.id}`
9158
+ },
9159
+ n.id
9160
+ )),
9161
+ scaledViewport && /* @__PURE__ */ jsx38(
9162
+ "rect",
9163
+ {
9164
+ x: scaledViewport.x,
9165
+ y: scaledViewport.y,
9166
+ width: scaledViewport.width,
9167
+ height: scaledViewport.height,
9168
+ className: "ods-flow-minimap__viewport",
9169
+ "data-testid": "minimap-viewport",
9170
+ onPointerDown: onViewportPointerDown,
9171
+ style: { cursor: viewportRect ? "grab" : "default" }
9172
+ }
9173
+ )
9174
+ ]
9175
+ }
9176
+ )
9177
+ }
9178
+ );
9179
+ }
9180
+
9181
+ // src/components/FlowToolbar/FlowToolbar.tsx
9182
+ import { useEffect as useEffect12, useRef as useRef20, useState as useState16 } from "react";
9183
+
9184
+ // src/components/Spinner/Spinner.tsx
9185
+ import { jsx as jsx39 } from "react/jsx-runtime";
9186
+ var sizeMap = {
9187
+ sm: 16,
9188
+ md: 24,
9189
+ lg: 32,
9190
+ xl: 48
9191
+ };
9192
+ function Spinner({
9193
+ size = "md",
9194
+ color = "var(--ods-color-brand-500)",
9195
+ className
9196
+ }) {
9197
+ const px = sizeMap[size];
9198
+ return /* @__PURE__ */ jsx39(
9032
9199
  "svg",
9033
9200
  {
9034
- width: MINIMAP_WIDTH,
9035
- height: MINIMAP_HEIGHT,
9036
- viewBox: `0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}`,
9037
- onClick: handleClick,
9038
- "data-testid": "flow-minimap-svg",
9039
- children: [
9040
- scaledEdges.map((e, i) => /* @__PURE__ */ jsx38(
9041
- "line",
9042
- {
9043
- x1: e.x1,
9044
- y1: e.y1,
9045
- x2: e.x2,
9046
- y2: e.y2,
9047
- className: "ods-flow-minimap__edge"
9048
- },
9049
- i
9050
- )),
9051
- scaledNodes.map((n) => /* @__PURE__ */ jsx38(
9052
- "rect",
9053
- {
9054
- x: n.sx,
9055
- y: n.sy,
9056
- width: n.sw,
9057
- height: n.sh,
9058
- rx: 1,
9059
- fill: n.color || "var(--ods-color-brand-500, #3b5bff)",
9060
- className: "ods-flow-minimap__node",
9061
- "data-testid": `minimap-node-${n.id}`
9062
- },
9063
- n.id
9064
- )),
9065
- scaledViewport && /* @__PURE__ */ jsx38(
9066
- "rect",
9067
- {
9068
- x: scaledViewport.x,
9069
- y: scaledViewport.y,
9070
- width: scaledViewport.width,
9071
- height: scaledViewport.height,
9072
- className: "ods-flow-minimap__viewport",
9073
- "data-testid": "minimap-viewport"
9074
- }
9075
- )
9076
- ]
9201
+ className: cn("ods-spinner", `ods-spinner--${size}`, className),
9202
+ width: px,
9203
+ height: px,
9204
+ viewBox: "0 0 24 24",
9205
+ fill: "none",
9206
+ role: "status",
9207
+ "aria-label": "Loading",
9208
+ style: { color },
9209
+ children: /* @__PURE__ */ jsx39(
9210
+ "circle",
9211
+ {
9212
+ cx: "12",
9213
+ cy: "12",
9214
+ r: "10",
9215
+ strokeWidth: "3",
9216
+ strokeLinecap: "round",
9217
+ strokeDasharray: "31.4 31.4",
9218
+ className: "ods-spinner__circle"
9219
+ }
9220
+ )
9077
9221
  }
9078
- ) });
9222
+ );
9079
9223
  }
9080
9224
 
9081
9225
  // src/components/FlowToolbar/FlowToolbar.tsx
9082
- import { Fragment as Fragment12, jsx as jsx39, jsxs as jsxs38 } from "react/jsx-runtime";
9226
+ import { Fragment as Fragment13, jsx as jsx40, jsxs as jsxs38 } from "react/jsx-runtime";
9083
9227
  function FlowToolbar({ children, placement = "left", className }) {
9084
- return /* @__PURE__ */ jsx39(
9228
+ return /* @__PURE__ */ jsx40(
9085
9229
  "div",
9086
9230
  {
9087
9231
  className: cn("ods-flow-toolbar", `ods-flow-toolbar--${placement}`, className),
@@ -9104,7 +9248,7 @@ function FlowToolbarButton({
9104
9248
  }) {
9105
9249
  const hoverLabel = tooltip ?? label;
9106
9250
  const title = shortcut ? `${hoverLabel} (${shortcut})` : hoverLabel;
9107
- return /* @__PURE__ */ jsx39("span", { className: "ods-flow-toolbar__btn-wrapper", "data-tooltip": title, children: /* @__PURE__ */ jsx39(
9251
+ return /* @__PURE__ */ jsx40("span", { className: "ods-flow-toolbar__btn-wrapper", "data-tooltip": title, children: /* @__PURE__ */ jsx40(
9108
9252
  "button",
9109
9253
  {
9110
9254
  type: "button",
@@ -9119,12 +9263,12 @@ function FlowToolbarButton({
9119
9263
  "aria-label": label,
9120
9264
  "aria-pressed": active,
9121
9265
  title,
9122
- children: /* @__PURE__ */ jsx39("span", { className: "ods-flow-toolbar__btn-icon", children: icon })
9266
+ children: /* @__PURE__ */ jsx40("span", { className: "ods-flow-toolbar__btn-icon", children: icon })
9123
9267
  }
9124
9268
  ) });
9125
9269
  }
9126
9270
  function FlowToolbarDivider({ className }) {
9127
- return /* @__PURE__ */ jsx39("span", { className: cn("ods-flow-toolbar__divider", className), "aria-hidden": "true" });
9271
+ return /* @__PURE__ */ jsx40("span", { className: cn("ods-flow-toolbar__divider", className), "aria-hidden": "true" });
9128
9272
  }
9129
9273
  var SVG_BASE = {
9130
9274
  xmlns: "http://www.w3.org/2000/svg",
@@ -9136,112 +9280,323 @@ var SVG_BASE = {
9136
9280
  strokeLinejoin: "round",
9137
9281
  "aria-hidden": true
9138
9282
  };
9139
- var mkIcon = (children) => /* @__PURE__ */ jsx39("svg", { ...SVG_BASE, width: "16", height: "16", children });
9283
+ var mkIcon = (children) => /* @__PURE__ */ jsx40("svg", { ...SVG_BASE, width: "16", height: "16", children });
9140
9284
  var FlowToolbarIcons = {
9141
9285
  save: mkIcon(
9142
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9143
- /* @__PURE__ */ jsx39("path", { d: "M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" }),
9144
- /* @__PURE__ */ jsx39("polyline", { points: "17 21 17 13 7 13 7 21" }),
9145
- /* @__PURE__ */ jsx39("polyline", { points: "7 3 7 8 15 8" })
9286
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9287
+ /* @__PURE__ */ jsx40("path", { d: "M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" }),
9288
+ /* @__PURE__ */ jsx40("polyline", { points: "17 21 17 13 7 13 7 21" }),
9289
+ /* @__PURE__ */ jsx40("polyline", { points: "7 3 7 8 15 8" })
9146
9290
  ] })
9147
9291
  ),
9148
- run: mkIcon(/* @__PURE__ */ jsx39("polygon", { points: "6 4 20 12 6 20 6 4", fill: "currentColor", stroke: "none" })),
9149
- stop: mkIcon(/* @__PURE__ */ jsx39("rect", { x: "6", y: "6", width: "12", height: "12", rx: "1" })),
9292
+ run: mkIcon(/* @__PURE__ */ jsx40("polygon", { points: "6 4 20 12 6 20 6 4", fill: "currentColor", stroke: "none" })),
9293
+ stop: mkIcon(/* @__PURE__ */ jsx40("rect", { x: "6", y: "6", width: "12", height: "12", rx: "1" })),
9150
9294
  lock: mkIcon(
9151
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9152
- /* @__PURE__ */ jsx39("rect", { x: "4", y: "11", width: "16", height: "10", rx: "2" }),
9153
- /* @__PURE__ */ jsx39("path", { d: "M8 11V7a4 4 0 0 1 8 0v4" })
9295
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9296
+ /* @__PURE__ */ jsx40("rect", { x: "4", y: "11", width: "16", height: "10", rx: "2" }),
9297
+ /* @__PURE__ */ jsx40("path", { d: "M8 11V7a4 4 0 0 1 8 0v4" })
9154
9298
  ] })
9155
9299
  ),
9156
9300
  unlock: mkIcon(
9157
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9158
- /* @__PURE__ */ jsx39("rect", { x: "4", y: "11", width: "16", height: "10", rx: "2" }),
9159
- /* @__PURE__ */ jsx39("path", { d: "M8 11V7a4 4 0 0 1 8 0" })
9301
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9302
+ /* @__PURE__ */ jsx40("rect", { x: "4", y: "11", width: "16", height: "10", rx: "2" }),
9303
+ /* @__PURE__ */ jsx40("path", { d: "M8 11V7a4 4 0 0 1 8 0" })
9160
9304
  ] })
9161
9305
  ),
9162
9306
  reset: mkIcon(
9163
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9164
- /* @__PURE__ */ jsx39("polyline", { points: "1 4 1 10 7 10" }),
9165
- /* @__PURE__ */ jsx39("path", { d: "M3.51 15a9 9 0 1 0 2.13-9.36L1 10" })
9307
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9308
+ /* @__PURE__ */ jsx40("polyline", { points: "1 4 1 10 7 10" }),
9309
+ /* @__PURE__ */ jsx40("path", { d: "M3.51 15a9 9 0 1 0 2.13-9.36L1 10" })
9166
9310
  ] })
9167
9311
  ),
9168
9312
  undo: mkIcon(
9169
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9170
- /* @__PURE__ */ jsx39("path", { d: "M3 7v6h6" }),
9171
- /* @__PURE__ */ jsx39("path", { d: "M21 17a9 9 0 0 0-9-9 9 9 0 0 0-7.07 3.43L3 13" })
9313
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9314
+ /* @__PURE__ */ jsx40("path", { d: "M3 7v6h6" }),
9315
+ /* @__PURE__ */ jsx40("path", { d: "M21 17a9 9 0 0 0-9-9 9 9 0 0 0-7.07 3.43L3 13" })
9172
9316
  ] })
9173
9317
  ),
9174
9318
  redo: mkIcon(
9175
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9176
- /* @__PURE__ */ jsx39("path", { d: "M21 7v6h-6" }),
9177
- /* @__PURE__ */ jsx39("path", { d: "M3 17a9 9 0 0 1 9-9 9 9 0 0 1 7.07 3.43L21 13" })
9319
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9320
+ /* @__PURE__ */ jsx40("path", { d: "M21 7v6h-6" }),
9321
+ /* @__PURE__ */ jsx40("path", { d: "M3 17a9 9 0 0 1 9-9 9 9 0 0 1 7.07 3.43L21 13" })
9178
9322
  ] })
9179
9323
  ),
9180
9324
  drawerOpen: mkIcon(
9181
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9182
- /* @__PURE__ */ jsx39("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
9183
- /* @__PURE__ */ jsx39("line", { x1: "9", y1: "3", x2: "9", y2: "21" }),
9184
- /* @__PURE__ */ jsx39("polyline", { points: "13 9 16 12 13 15" })
9325
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9326
+ /* @__PURE__ */ jsx40("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
9327
+ /* @__PURE__ */ jsx40("line", { x1: "9", y1: "3", x2: "9", y2: "21" }),
9328
+ /* @__PURE__ */ jsx40("polyline", { points: "13 9 16 12 13 15" })
9185
9329
  ] })
9186
9330
  ),
9187
9331
  drawerClose: mkIcon(
9188
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9189
- /* @__PURE__ */ jsx39("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
9190
- /* @__PURE__ */ jsx39("line", { x1: "9", y1: "3", x2: "9", y2: "21" }),
9191
- /* @__PURE__ */ jsx39("polyline", { points: "16 9 13 12 16 15" })
9332
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9333
+ /* @__PURE__ */ jsx40("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
9334
+ /* @__PURE__ */ jsx40("line", { x1: "9", y1: "3", x2: "9", y2: "21" }),
9335
+ /* @__PURE__ */ jsx40("polyline", { points: "16 9 13 12 16 15" })
9192
9336
  ] })
9193
9337
  ),
9194
9338
  settings: mkIcon(
9195
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9196
- /* @__PURE__ */ jsx39("circle", { cx: "12", cy: "12", r: "3" }),
9197
- /* @__PURE__ */ jsx39("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z" })
9339
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9340
+ /* @__PURE__ */ jsx40("circle", { cx: "12", cy: "12", r: "3" }),
9341
+ /* @__PURE__ */ jsx40("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z" })
9198
9342
  ] })
9199
9343
  ),
9200
9344
  history: mkIcon(
9201
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9202
- /* @__PURE__ */ jsx39("path", { d: "M22 12A10 10 0 1 1 12 2" }),
9203
- /* @__PURE__ */ jsx39("polyline", { points: "22 2 22 8 16 8" }),
9204
- /* @__PURE__ */ jsx39("polyline", { points: "12 7 12 12 15 15" })
9345
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9346
+ /* @__PURE__ */ jsx40("path", { d: "M22 12A10 10 0 1 1 12 2" }),
9347
+ /* @__PURE__ */ jsx40("polyline", { points: "22 2 22 8 16 8" }),
9348
+ /* @__PURE__ */ jsx40("polyline", { points: "12 7 12 12 15 15" })
9205
9349
  ] })
9206
9350
  ),
9207
9351
  debug: mkIcon(
9208
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9209
- /* @__PURE__ */ jsx39("polyline", { points: "4 17 10 11 4 5" }),
9210
- /* @__PURE__ */ jsx39("line", { x1: "12", y1: "19", x2: "20", y2: "19" })
9352
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9353
+ /* @__PURE__ */ jsx40("polyline", { points: "4 17 10 11 4 5" }),
9354
+ /* @__PURE__ */ jsx40("line", { x1: "12", y1: "19", x2: "20", y2: "19" })
9211
9355
  ] })
9212
9356
  ),
9213
9357
  zoomIn: mkIcon(
9214
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9215
- /* @__PURE__ */ jsx39("circle", { cx: "11", cy: "11", r: "7" }),
9216
- /* @__PURE__ */ jsx39("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" }),
9217
- /* @__PURE__ */ jsx39("line", { x1: "11", y1: "8", x2: "11", y2: "14" }),
9218
- /* @__PURE__ */ jsx39("line", { x1: "8", y1: "11", x2: "14", y2: "11" })
9358
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9359
+ /* @__PURE__ */ jsx40("circle", { cx: "11", cy: "11", r: "7" }),
9360
+ /* @__PURE__ */ jsx40("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" }),
9361
+ /* @__PURE__ */ jsx40("line", { x1: "11", y1: "8", x2: "11", y2: "14" }),
9362
+ /* @__PURE__ */ jsx40("line", { x1: "8", y1: "11", x2: "14", y2: "11" })
9219
9363
  ] })
9220
9364
  ),
9221
9365
  zoomOut: mkIcon(
9222
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9223
- /* @__PURE__ */ jsx39("circle", { cx: "11", cy: "11", r: "7" }),
9224
- /* @__PURE__ */ jsx39("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" }),
9225
- /* @__PURE__ */ jsx39("line", { x1: "8", y1: "11", x2: "14", y2: "11" })
9366
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9367
+ /* @__PURE__ */ jsx40("circle", { cx: "11", cy: "11", r: "7" }),
9368
+ /* @__PURE__ */ jsx40("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" }),
9369
+ /* @__PURE__ */ jsx40("line", { x1: "8", y1: "11", x2: "14", y2: "11" })
9226
9370
  ] })
9227
9371
  ),
9228
9372
  zoomReset: mkIcon(
9229
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9230
- /* @__PURE__ */ jsx39("circle", { cx: "11", cy: "11", r: "7" }),
9231
- /* @__PURE__ */ jsx39("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" }),
9232
- /* @__PURE__ */ jsx39("polyline", { points: "8 9 8 13 12 13" }),
9233
- /* @__PURE__ */ jsx39("path", { d: "M14 8a4 4 0 0 1 0 6" })
9373
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9374
+ /* @__PURE__ */ jsx40("circle", { cx: "11", cy: "11", r: "7" }),
9375
+ /* @__PURE__ */ jsx40("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" }),
9376
+ /* @__PURE__ */ jsx40("polyline", { points: "8 9 8 13 12 13" }),
9377
+ /* @__PURE__ */ jsx40("path", { d: "M14 8a4 4 0 0 1 0 6" })
9234
9378
  ] })
9235
9379
  ),
9236
9380
  fit: mkIcon(
9237
- /* @__PURE__ */ jsxs38(Fragment12, { children: [
9238
- /* @__PURE__ */ jsx39("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }),
9239
- /* @__PURE__ */ jsx39("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }),
9240
- /* @__PURE__ */ jsx39("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }),
9241
- /* @__PURE__ */ jsx39("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })
9381
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9382
+ /* @__PURE__ */ jsx40("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }),
9383
+ /* @__PURE__ */ jsx40("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }),
9384
+ /* @__PURE__ */ jsx40("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }),
9385
+ /* @__PURE__ */ jsx40("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })
9386
+ ] })
9387
+ ),
9388
+ /**
9389
+ * Auto-layout glyph — a small directed-graph diagram (three connected
9390
+ * nodes) that reads as "graph layout". Lives inside this barrel so the
9391
+ * `<FlowToolbarAutoLayout>` button doesn't need an icon-pack import.
9392
+ * If the design system later adds a canonical icon to `@octaviaflow/icons`,
9393
+ * this can be swapped without breaking consumers.
9394
+ */
9395
+ autoLayout: mkIcon(
9396
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9397
+ /* @__PURE__ */ jsx40("rect", { x: "2", y: "3", width: "6", height: "4", rx: "0.5" }),
9398
+ /* @__PURE__ */ jsx40("rect", { x: "9", y: "10", width: "6", height: "4", rx: "0.5" }),
9399
+ /* @__PURE__ */ jsx40("rect", { x: "16", y: "3", width: "6", height: "4", rx: "0.5" }),
9400
+ /* @__PURE__ */ jsx40("rect", { x: "9", y: "17", width: "6", height: "4", rx: "0.5" }),
9401
+ /* @__PURE__ */ jsx40("path", { d: "M5 7v3a2 2 0 0 0 2 2h2" }),
9402
+ /* @__PURE__ */ jsx40("path", { d: "M19 7v3a2 2 0 0 1-2 2h-2" }),
9403
+ /* @__PURE__ */ jsx40("path", { d: "M12 14v3" })
9404
+ ] })
9405
+ ),
9406
+ /** Checkmark — short-lived success indicator on the save button. */
9407
+ check: mkIcon(/* @__PURE__ */ jsx40("polyline", { points: "5 12 10 17 19 7" })),
9408
+ /** Filled exclamation — error indicator on the save button. */
9409
+ error: mkIcon(
9410
+ /* @__PURE__ */ jsxs38(Fragment13, { children: [
9411
+ /* @__PURE__ */ jsx40("circle", { cx: "12", cy: "12", r: "9" }),
9412
+ /* @__PURE__ */ jsx40("line", { x1: "12", y1: "8", x2: "12", y2: "13" }),
9413
+ /* @__PURE__ */ jsx40("circle", { cx: "12", cy: "16.5", r: "0.6", fill: "currentColor", stroke: "none" })
9242
9414
  ] })
9243
9415
  )
9244
9416
  };
9417
+ function FlowToolbarSave({
9418
+ state,
9419
+ loading,
9420
+ lastSavedAt,
9421
+ error,
9422
+ successDisplayMs = 1500,
9423
+ onSave,
9424
+ label = "Save",
9425
+ shortcut,
9426
+ showLabel = false,
9427
+ className
9428
+ }) {
9429
+ const [inferred, setInferred] = useState16("idle");
9430
+ const prevSavedAt = useRef20(lastSavedAt);
9431
+ const prevLoading = useRef20(loading);
9432
+ useEffect12(() => {
9433
+ if (state !== void 0) return;
9434
+ if (error) {
9435
+ setInferred("error");
9436
+ return;
9437
+ }
9438
+ if (loading) {
9439
+ setInferred("saving");
9440
+ prevLoading.current = true;
9441
+ return;
9442
+ }
9443
+ const becameSaved = prevLoading.current && !loading;
9444
+ const newSavedAt = lastSavedAt !== prevSavedAt.current && lastSavedAt !== void 0;
9445
+ if (becameSaved || newSavedAt) {
9446
+ setInferred("success");
9447
+ prevSavedAt.current = lastSavedAt;
9448
+ prevLoading.current = loading;
9449
+ const t = setTimeout(() => setInferred("idle"), successDisplayMs);
9450
+ return () => clearTimeout(t);
9451
+ }
9452
+ prevLoading.current = loading;
9453
+ }, [state, loading, lastSavedAt, error, successDisplayMs]);
9454
+ const resolved = state ?? inferred;
9455
+ const disabled = resolved === "saving";
9456
+ const icon = resolved === "saving" ? /* @__PURE__ */ jsx40(Spinner, { size: "sm" }) : resolved === "success" ? FlowToolbarIcons.check : resolved === "error" ? FlowToolbarIcons.error : FlowToolbarIcons.save;
9457
+ const tooltip = resolved === "saving" ? "Saving\u2026" : resolved === "success" ? "Saved" : resolved === "error" ? typeof error === "string" ? error : "Save failed" : label;
9458
+ return /* @__PURE__ */ jsx40(
9459
+ "span",
9460
+ {
9461
+ className: "ods-flow-toolbar__btn-wrapper",
9462
+ "data-tooltip": shortcut ? `${tooltip} (${shortcut})` : tooltip,
9463
+ children: /* @__PURE__ */ jsxs38(
9464
+ "button",
9465
+ {
9466
+ type: "button",
9467
+ className: cn(
9468
+ "ods-flow-toolbar__btn",
9469
+ `ods-flow-toolbar__btn--save-${resolved}`,
9470
+ resolved === "error" && "ods-flow-toolbar__btn--danger",
9471
+ className
9472
+ ),
9473
+ onClick: disabled ? void 0 : onSave,
9474
+ disabled,
9475
+ "aria-label": tooltip,
9476
+ "aria-busy": resolved === "saving",
9477
+ title: shortcut ? `${tooltip} (${shortcut})` : tooltip,
9478
+ children: [
9479
+ /* @__PURE__ */ jsx40("span", { className: "ods-flow-toolbar__btn-icon", children: icon }),
9480
+ showLabel && /* @__PURE__ */ jsx40("span", { className: "ods-flow-toolbar__btn-label", children: resolved === "saving" ? "Saving\u2026" : label })
9481
+ ]
9482
+ }
9483
+ )
9484
+ }
9485
+ );
9486
+ }
9487
+ function FlowToolbarRun({
9488
+ running = false,
9489
+ disabled = false,
9490
+ onRun,
9491
+ onStop,
9492
+ shortcut,
9493
+ className
9494
+ }) {
9495
+ return /* @__PURE__ */ jsx40(
9496
+ FlowToolbarButton,
9497
+ {
9498
+ icon: running ? FlowToolbarIcons.stop : FlowToolbarIcons.run,
9499
+ label: running ? "Stop" : "Run",
9500
+ onClick: running ? onStop : onRun,
9501
+ disabled,
9502
+ danger: running,
9503
+ shortcut,
9504
+ className
9505
+ }
9506
+ );
9507
+ }
9508
+ function FlowToolbarUndo({
9509
+ canUndo = true,
9510
+ onUndo,
9511
+ shortcut = "\u2318Z",
9512
+ className
9513
+ }) {
9514
+ return /* @__PURE__ */ jsx40(
9515
+ FlowToolbarButton,
9516
+ {
9517
+ icon: FlowToolbarIcons.undo,
9518
+ label: "Undo",
9519
+ onClick: onUndo,
9520
+ disabled: !canUndo,
9521
+ shortcut,
9522
+ className
9523
+ }
9524
+ );
9525
+ }
9526
+ function FlowToolbarRedo({
9527
+ canRedo = true,
9528
+ onRedo,
9529
+ shortcut = "\u2318\u21E7Z",
9530
+ className
9531
+ }) {
9532
+ return /* @__PURE__ */ jsx40(
9533
+ FlowToolbarButton,
9534
+ {
9535
+ icon: FlowToolbarIcons.redo,
9536
+ label: "Redo",
9537
+ onClick: onRedo,
9538
+ disabled: !canRedo,
9539
+ shortcut,
9540
+ className
9541
+ }
9542
+ );
9543
+ }
9544
+ function FlowToolbarAutoLayout({
9545
+ onAutoLayout,
9546
+ disabled = false,
9547
+ shortcut,
9548
+ className
9549
+ }) {
9550
+ return /* @__PURE__ */ jsx40(
9551
+ FlowToolbarButton,
9552
+ {
9553
+ icon: FlowToolbarIcons.autoLayout,
9554
+ label: "Auto-layout",
9555
+ tooltip: "Tidy the graph (auto-layout)",
9556
+ onClick: onAutoLayout,
9557
+ disabled,
9558
+ shortcut,
9559
+ className
9560
+ }
9561
+ );
9562
+ }
9563
+ function FlowToolbarFitView({
9564
+ onFit,
9565
+ disabled = false,
9566
+ shortcut = "\u2318.",
9567
+ className
9568
+ }) {
9569
+ return /* @__PURE__ */ jsx40(
9570
+ FlowToolbarButton,
9571
+ {
9572
+ icon: FlowToolbarIcons.fit,
9573
+ label: "Fit to view",
9574
+ onClick: onFit,
9575
+ disabled,
9576
+ shortcut,
9577
+ className
9578
+ }
9579
+ );
9580
+ }
9581
+ function FlowToolbarReset({
9582
+ onReset,
9583
+ disabled = false,
9584
+ shortcut = "\u23180",
9585
+ className
9586
+ }) {
9587
+ return /* @__PURE__ */ jsx40(
9588
+ FlowToolbarButton,
9589
+ {
9590
+ icon: FlowToolbarIcons.zoomReset,
9591
+ label: "Reset zoom",
9592
+ tooltip: "Reset zoom to 100%",
9593
+ onClick: onReset,
9594
+ disabled,
9595
+ shortcut,
9596
+ className
9597
+ }
9598
+ );
9599
+ }
9245
9600
  function FlowToolbarZoom({
9246
9601
  zoom,
9247
9602
  onZoomIn,
@@ -9251,7 +9606,7 @@ function FlowToolbarZoom({
9251
9606
  className
9252
9607
  }) {
9253
9608
  return /* @__PURE__ */ jsxs38("div", { className: cn("ods-flow-toolbar__zoom", className), children: [
9254
- /* @__PURE__ */ jsx39(
9609
+ /* @__PURE__ */ jsx40(
9255
9610
  FlowToolbarButton,
9256
9611
  {
9257
9612
  icon: FlowToolbarIcons.zoomIn,
@@ -9260,7 +9615,7 @@ function FlowToolbarZoom({
9260
9615
  shortcut: "\u2318+"
9261
9616
  }
9262
9617
  ),
9263
- /* @__PURE__ */ jsx39(
9618
+ /* @__PURE__ */ jsx40(
9264
9619
  FlowToolbarButton,
9265
9620
  {
9266
9621
  icon: FlowToolbarIcons.zoomOut,
@@ -9269,7 +9624,7 @@ function FlowToolbarZoom({
9269
9624
  shortcut: "\u2318\u2212"
9270
9625
  }
9271
9626
  ),
9272
- onReset && /* @__PURE__ */ jsx39(
9627
+ onReset && /* @__PURE__ */ jsx40(
9273
9628
  FlowToolbarButton,
9274
9629
  {
9275
9630
  icon: FlowToolbarIcons.zoomReset,
@@ -9279,7 +9634,7 @@ function FlowToolbarZoom({
9279
9634
  shortcut: "\u23180"
9280
9635
  }
9281
9636
  ),
9282
- onFit && /* @__PURE__ */ jsx39(
9637
+ onFit && /* @__PURE__ */ jsx40(
9283
9638
  FlowToolbarButton,
9284
9639
  {
9285
9640
  icon: FlowToolbarIcons.fit,
@@ -9304,7 +9659,7 @@ function FlowToolbarZoom({
9304
9659
  }
9305
9660
 
9306
9661
  // src/components/FormSection/FormSection.tsx
9307
- import { jsx as jsx40, jsxs as jsxs39 } from "react/jsx-runtime";
9662
+ import { jsx as jsx41, jsxs as jsxs39 } from "react/jsx-runtime";
9308
9663
  function FormSection({
9309
9664
  title,
9310
9665
  description,
@@ -9315,18 +9670,18 @@ function FormSection({
9315
9670
  }) {
9316
9671
  return /* @__PURE__ */ jsxs39("section", { className: cn("ods-form-section", divided && "ods-form-section--divided", className), children: [
9317
9672
  (title || description) && /* @__PURE__ */ jsxs39("header", { className: "ods-form-section__head", children: [
9318
- title && /* @__PURE__ */ jsx40("h3", { className: "ods-form-section__title", children: title }),
9319
- description && /* @__PURE__ */ jsx40("p", { className: "ods-form-section__desc", children: description })
9673
+ title && /* @__PURE__ */ jsx41("h3", { className: "ods-form-section__title", children: title }),
9674
+ description && /* @__PURE__ */ jsx41("p", { className: "ods-form-section__desc", children: description })
9320
9675
  ] }),
9321
- /* @__PURE__ */ jsx40("div", { className: "ods-form-section__body", children }),
9322
- footer && /* @__PURE__ */ jsx40("footer", { className: "ods-form-section__footer", children: footer })
9676
+ /* @__PURE__ */ jsx41("div", { className: "ods-form-section__body", children }),
9677
+ footer && /* @__PURE__ */ jsx41("footer", { className: "ods-form-section__footer", children: footer })
9323
9678
  ] });
9324
9679
  }
9325
9680
 
9326
9681
  // src/components/HoverCard/HoverCard.tsx
9327
- import { useCallback as useCallback10, useEffect as useEffect11, useLayoutEffect as useLayoutEffect2, useRef as useRef19, useState as useState15 } from "react";
9682
+ import { useCallback as useCallback10, useEffect as useEffect13, useLayoutEffect as useLayoutEffect2, useRef as useRef21, useState as useState17 } from "react";
9328
9683
  import { createPortal as createPortal5 } from "react-dom";
9329
- import { Fragment as Fragment13, jsx as jsx41, jsxs as jsxs40 } from "react/jsx-runtime";
9684
+ import { Fragment as Fragment14, jsx as jsx42, jsxs as jsxs40 } from "react/jsx-runtime";
9330
9685
  function computePosition(rect, panelRect, placement, offset) {
9331
9686
  const cx = rect.left + rect.width / 2;
9332
9687
  const cy = rect.top + rect.height / 2;
@@ -9350,12 +9705,12 @@ function HoverCard({
9350
9705
  children,
9351
9706
  className
9352
9707
  }) {
9353
- const [open, setOpen] = useState15(false);
9354
- const triggerRef = useRef19(null);
9355
- const panelRef = useRef19(null);
9356
- const openTimer = useRef19(null);
9357
- const closeTimer = useRef19(null);
9358
- const [coords, setCoords] = useState15(null);
9708
+ const [open, setOpen] = useState17(false);
9709
+ const triggerRef = useRef21(null);
9710
+ const panelRef = useRef21(null);
9711
+ const openTimer = useRef21(null);
9712
+ const closeTimer = useRef21(null);
9713
+ const [coords, setCoords] = useState17(null);
9359
9714
  const clearTimers = () => {
9360
9715
  if (openTimer.current) {
9361
9716
  clearTimeout(openTimer.current);
@@ -9366,7 +9721,7 @@ function HoverCard({
9366
9721
  closeTimer.current = null;
9367
9722
  }
9368
9723
  };
9369
- useEffect11(() => () => clearTimers(), []);
9724
+ useEffect13(() => () => clearTimers(), []);
9370
9725
  const show = () => {
9371
9726
  clearTimers();
9372
9727
  openTimer.current = setTimeout(() => setOpen(true), openDelay);
@@ -9387,7 +9742,7 @@ function HoverCard({
9387
9742
  const id = requestAnimationFrame(reposition);
9388
9743
  return () => cancelAnimationFrame(id);
9389
9744
  }, [open, reposition]);
9390
- useEffect11(() => {
9745
+ useEffect13(() => {
9391
9746
  if (!open) return;
9392
9747
  const h = () => reposition();
9393
9748
  window.addEventListener("scroll", h, true);
@@ -9397,7 +9752,7 @@ function HoverCard({
9397
9752
  window.removeEventListener("resize", h);
9398
9753
  };
9399
9754
  }, [open, reposition]);
9400
- const triggerEl = /* @__PURE__ */ jsx41(
9755
+ const triggerEl = /* @__PURE__ */ jsx42(
9401
9756
  "span",
9402
9757
  {
9403
9758
  ref: triggerRef,
@@ -9410,7 +9765,7 @@ function HoverCard({
9410
9765
  }
9411
9766
  );
9412
9767
  const portal = typeof document !== "undefined" && open ? createPortal5(
9413
- /* @__PURE__ */ jsx41(
9768
+ /* @__PURE__ */ jsx42(
9414
9769
  "div",
9415
9770
  {
9416
9771
  ref: panelRef,
@@ -9431,14 +9786,14 @@ function HoverCard({
9431
9786
  ),
9432
9787
  document.body
9433
9788
  ) : null;
9434
- return /* @__PURE__ */ jsxs40(Fragment13, { children: [
9789
+ return /* @__PURE__ */ jsxs40(Fragment14, { children: [
9435
9790
  triggerEl,
9436
9791
  portal
9437
9792
  ] });
9438
9793
  }
9439
9794
 
9440
9795
  // src/components/IconCard/IconCard.tsx
9441
- import { jsx as jsx42, jsxs as jsxs41 } from "react/jsx-runtime";
9796
+ import { jsx as jsx43, jsxs as jsxs41 } from "react/jsx-runtime";
9442
9797
  function IconCard({
9443
9798
  variant = "default",
9444
9799
  icon,
@@ -9462,12 +9817,12 @@ function IconCard({
9462
9817
  role: interactive ? "button" : void 0,
9463
9818
  tabIndex: interactive ? 0 : void 0,
9464
9819
  children: [
9465
- /* @__PURE__ */ jsx42("span", { className: "ods-icon-card__icon", "aria-hidden": "true", children: icon }),
9820
+ /* @__PURE__ */ jsx43("span", { className: "ods-icon-card__icon", "aria-hidden": "true", children: icon }),
9466
9821
  /* @__PURE__ */ jsxs41("div", { className: "ods-icon-card__body", children: [
9467
- /* @__PURE__ */ jsx42("div", { className: "ods-icon-card__title", children: title }),
9468
- description && /* @__PURE__ */ jsx42("div", { className: "ods-icon-card__description", children: description })
9822
+ /* @__PURE__ */ jsx43("div", { className: "ods-icon-card__title", children: title }),
9823
+ description && /* @__PURE__ */ jsx43("div", { className: "ods-icon-card__description", children: description })
9469
9824
  ] }),
9470
- action && /* @__PURE__ */ jsx42("div", { className: "ods-icon-card__action", children: action })
9825
+ action && /* @__PURE__ */ jsx43("div", { className: "ods-icon-card__action", children: action })
9471
9826
  ]
9472
9827
  }
9473
9828
  );
@@ -9478,10 +9833,10 @@ import {
9478
9833
  forwardRef as forwardRef2,
9479
9834
  useId as useId6,
9480
9835
  useImperativeHandle,
9481
- useRef as useRef20
9836
+ useRef as useRef22
9482
9837
  } from "react";
9483
- import { jsx as jsx43, jsxs as jsxs42 } from "react/jsx-runtime";
9484
- var CLEAR_GLYPH = /* @__PURE__ */ jsx43("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx43("path", { d: "m3 3 6 6M9 3l-6 6", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }) });
9838
+ import { jsx as jsx44, jsxs as jsxs42 } from "react/jsx-runtime";
9839
+ var CLEAR_GLYPH = /* @__PURE__ */ jsx44("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx44("path", { d: "m3 3 6 6M9 3l-6 6", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }) });
9485
9840
  var Input = forwardRef2(
9486
9841
  ({
9487
9842
  type = "text",
@@ -9503,7 +9858,7 @@ var Input = forwardRef2(
9503
9858
  onChange,
9504
9859
  ...props
9505
9860
  }, forwardedRef) => {
9506
- const innerRef = useRef20(null);
9861
+ const innerRef = useRef22(null);
9507
9862
  useImperativeHandle(forwardedRef, () => innerRef.current);
9508
9863
  const reactId = useId6();
9509
9864
  const inputId = id ?? `${reactId}-input`;
@@ -9539,10 +9894,10 @@ var Input = forwardRef2(
9539
9894
  className
9540
9895
  ),
9541
9896
  children: [
9542
- label && /* @__PURE__ */ jsx43("label", { htmlFor: inputId, className: "ods-input__label", children: label }),
9897
+ label && /* @__PURE__ */ jsx44("label", { htmlFor: inputId, className: "ods-input__label", children: label }),
9543
9898
  /* @__PURE__ */ jsxs42("div", { className: "ods-input__wrapper", children: [
9544
- leftIcon && /* @__PURE__ */ jsx43("span", { className: "ods-input__icon--left", "aria-hidden": "true", children: leftIcon }),
9545
- /* @__PURE__ */ jsx43(
9899
+ leftIcon && /* @__PURE__ */ jsx44("span", { className: "ods-input__icon--left", "aria-hidden": "true", children: leftIcon }),
9900
+ /* @__PURE__ */ jsx44(
9546
9901
  "input",
9547
9902
  {
9548
9903
  ...props,
@@ -9564,7 +9919,7 @@ var Input = forwardRef2(
9564
9919
  }
9565
9920
  ),
9566
9921
  /* @__PURE__ */ jsxs42("span", { className: "ods-input__right", children: [
9567
- showClear && /* @__PURE__ */ jsx43(
9922
+ showClear && /* @__PURE__ */ jsx44(
9568
9923
  "button",
9569
9924
  {
9570
9925
  type: "button",
@@ -9575,12 +9930,12 @@ var Input = forwardRef2(
9575
9930
  children: CLEAR_GLYPH
9576
9931
  }
9577
9932
  ),
9578
- shortcutHint && !showClear && /* @__PURE__ */ jsx43("span", { className: "ods-input__kbd", "aria-hidden": "true", children: shortcutHint }),
9579
- rightIcon && !showClear && !shortcutHint && /* @__PURE__ */ jsx43("span", { className: "ods-input__icon--right", "aria-hidden": "true", children: rightIcon })
9933
+ shortcutHint && !showClear && /* @__PURE__ */ jsx44("span", { className: "ods-input__kbd", "aria-hidden": "true", children: shortcutHint }),
9934
+ rightIcon && !showClear && !shortcutHint && /* @__PURE__ */ jsx44("span", { className: "ods-input__icon--right", "aria-hidden": "true", children: rightIcon })
9580
9935
  ] })
9581
9936
  ] }),
9582
- error && errorMessage && /* @__PURE__ */ jsx43("div", { id: errorId, className: "ods-input__error-message", role: "alert", children: errorMessage }),
9583
- !error && helperText && /* @__PURE__ */ jsx43("div", { id: helperId, className: "ods-input__helper", children: helperText })
9937
+ error && errorMessage && /* @__PURE__ */ jsx44("div", { id: errorId, className: "ods-input__error-message", role: "alert", children: errorMessage }),
9938
+ !error && helperText && /* @__PURE__ */ jsx44("div", { id: helperId, className: "ods-input__helper", children: helperText })
9584
9939
  ]
9585
9940
  }
9586
9941
  );
@@ -9589,8 +9944,8 @@ var Input = forwardRef2(
9589
9944
  Input.displayName = "Input";
9590
9945
 
9591
9946
  // src/components/JsonViewer/JsonViewer.tsx
9592
- import { useMemo as useMemo10, useState as useState16 } from "react";
9593
- import { Fragment as Fragment14, jsx as jsx44, jsxs as jsxs43 } from "react/jsx-runtime";
9947
+ import { useMemo as useMemo10, useState as useState18 } from "react";
9948
+ import { Fragment as Fragment15, jsx as jsx45, jsxs as jsxs43 } from "react/jsx-runtime";
9594
9949
  var VARIANT = {
9595
9950
  string: "string",
9596
9951
  number: "number",
@@ -9609,10 +9964,10 @@ function JsonViewer({
9609
9964
  }) {
9610
9965
  return /* @__PURE__ */ jsxs43("div", { className: cn("ods-json-viewer", className), children: [
9611
9966
  (title || status) && /* @__PURE__ */ jsxs43("div", { className: "ods-json-viewer__head", children: [
9612
- title && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__title", children: title }),
9613
- status && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__status", children: status })
9967
+ title && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__title", children: title }),
9968
+ status && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__status", children: status })
9614
9969
  ] }),
9615
- /* @__PURE__ */ jsx44("div", { className: "ods-json-viewer__body", children: /* @__PURE__ */ jsx44(
9970
+ /* @__PURE__ */ jsx45("div", { className: "ods-json-viewer__body", children: /* @__PURE__ */ jsx45(
9616
9971
  JsonNode,
9617
9972
  {
9618
9973
  value: data,
@@ -9635,24 +9990,24 @@ function JsonNode({
9635
9990
  truncateAt,
9636
9991
  isLast = true
9637
9992
  }) {
9638
- const [open, setOpen] = useState16(depth < defaultExpandDepth);
9993
+ const [open, setOpen] = useState18(depth < defaultExpandDepth);
9639
9994
  const isObject = value !== null && typeof value === "object" && !Array.isArray(value);
9640
9995
  const isArray = Array.isArray(value);
9641
9996
  const isContainer = isObject || isArray;
9642
9997
  const renderKey = useMemo10(() => {
9643
9998
  if (name === void 0) return null;
9644
9999
  if (typeof name === "number") {
9645
- return showIndexes ? /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__key ods-json-viewer__key--index", children: name }) : null;
10000
+ return showIndexes ? /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__key ods-json-viewer__key--index", children: name }) : null;
9646
10001
  }
9647
- return /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__key", children: `"${name}"` });
10002
+ return /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__key", children: `"${name}"` });
9648
10003
  }, [name, showIndexes]);
9649
10004
  if (!isContainer) {
9650
10005
  return /* @__PURE__ */ jsxs43("div", { className: "ods-json-viewer__row", style: { paddingLeft: depth * 14 }, children: [
9651
- /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__caret-spacer" }),
10006
+ /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__caret-spacer" }),
9652
10007
  renderKey,
9653
- renderKey != null && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__colon", children: ":" }),
9654
- /* @__PURE__ */ jsx44(Leaf, { value, truncateAt, copyable }),
9655
- !isLast && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__comma", children: "," })
10008
+ renderKey != null && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__colon", children: ":" }),
10009
+ /* @__PURE__ */ jsx45(Leaf, { value, truncateAt, copyable }),
10010
+ !isLast && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__comma", children: "," })
9656
10011
  ] });
9657
10012
  }
9658
10013
  const entries = isArray ? value.map((v, i) => [i, v]) : Object.entries(value);
@@ -9666,7 +10021,7 @@ function JsonNode({
9666
10021
  style: { paddingLeft: depth * 14 },
9667
10022
  onClick: () => setOpen((o) => !o),
9668
10023
  children: [
9669
- /* @__PURE__ */ jsx44(
10024
+ /* @__PURE__ */ jsx45(
9670
10025
  "button",
9671
10026
  {
9672
10027
  type: "button",
@@ -9677,7 +10032,7 @@ function JsonNode({
9677
10032
  e.stopPropagation();
9678
10033
  setOpen((o) => !o);
9679
10034
  },
9680
- children: /* @__PURE__ */ jsx44("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx44(
10035
+ children: /* @__PURE__ */ jsx45("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx45(
9681
10036
  "path",
9682
10037
  {
9683
10038
  d: "M3 2 5 4 3 6",
@@ -9690,18 +10045,18 @@ function JsonNode({
9690
10045
  }
9691
10046
  ),
9692
10047
  renderKey,
9693
- renderKey != null && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__colon", children: ":" }),
9694
- /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__bracket", children: openBracket }),
9695
- !open && /* @__PURE__ */ jsxs43(Fragment14, { children: [
9696
- /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__preview", children: isArray ? entries.length === 0 ? "" : `${entries.length} item${entries.length === 1 ? "" : "s"}` : entries.length === 0 ? "" : `${entries.length} key${entries.length === 1 ? "" : "s"}` }),
9697
- /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__bracket", children: closeBracket })
10048
+ renderKey != null && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__colon", children: ":" }),
10049
+ /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__bracket", children: openBracket }),
10050
+ !open && /* @__PURE__ */ jsxs43(Fragment15, { children: [
10051
+ /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__preview", children: isArray ? entries.length === 0 ? "" : `${entries.length} item${entries.length === 1 ? "" : "s"}` : entries.length === 0 ? "" : `${entries.length} key${entries.length === 1 ? "" : "s"}` }),
10052
+ /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__bracket", children: closeBracket })
9698
10053
  ] }),
9699
- !isLast && !open && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__comma", children: "," })
10054
+ !isLast && !open && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__comma", children: "," })
9700
10055
  ]
9701
10056
  }
9702
10057
  ),
9703
- open && /* @__PURE__ */ jsxs43(Fragment14, { children: [
9704
- entries.map(([k, v], i) => /* @__PURE__ */ jsx44(
10058
+ open && /* @__PURE__ */ jsxs43(Fragment15, { children: [
10059
+ entries.map(([k, v], i) => /* @__PURE__ */ jsx45(
9705
10060
  JsonNode,
9706
10061
  {
9707
10062
  name: isArray ? k : k,
@@ -9721,9 +10076,9 @@ function JsonNode({
9721
10076
  className: "ods-json-viewer__row ods-json-viewer__row--close",
9722
10077
  style: { paddingLeft: depth * 14 },
9723
10078
  children: [
9724
- /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__caret-spacer" }),
9725
- /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__bracket", children: closeBracket }),
9726
- !isLast && /* @__PURE__ */ jsx44("span", { className: "ods-json-viewer__comma", children: "," })
10079
+ /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__caret-spacer" }),
10080
+ /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__bracket", children: closeBracket }),
10081
+ !isLast && /* @__PURE__ */ jsx45("span", { className: "ods-json-viewer__comma", children: "," })
9727
10082
  ]
9728
10083
  }
9729
10084
  )
@@ -9762,8 +10117,8 @@ function Leaf({
9762
10117
  }
9763
10118
  };
9764
10119
  return /* @__PURE__ */ jsxs43("span", { className: cn("ods-json-viewer__value", `ods-json-viewer__value--${VARIANT[variant]}`), children: [
9765
- /* @__PURE__ */ jsx44("span", { children: display }),
9766
- copyable && /* @__PURE__ */ jsx44(
10120
+ /* @__PURE__ */ jsx45("span", { children: display }),
10121
+ copyable && /* @__PURE__ */ jsx45(
9767
10122
  "button",
9768
10123
  {
9769
10124
  type: "button",
@@ -9774,8 +10129,8 @@ function Leaf({
9774
10129
  },
9775
10130
  "aria-label": "Copy value",
9776
10131
  children: /* @__PURE__ */ jsxs43("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", "aria-hidden": "true", children: [
9777
- /* @__PURE__ */ jsx44("rect", { x: "2", y: "2", width: "6", height: "6", rx: "1", stroke: "currentColor", strokeWidth: "1.2" }),
9778
- /* @__PURE__ */ jsx44("path", { d: "M3.5 0.5h5v5", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" })
10132
+ /* @__PURE__ */ jsx45("rect", { x: "2", y: "2", width: "6", height: "6", rx: "1", stroke: "currentColor", strokeWidth: "1.2" }),
10133
+ /* @__PURE__ */ jsx45("path", { d: "M3.5 0.5h5v5", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" })
9779
10134
  ] })
9780
10135
  }
9781
10136
  )
@@ -9783,7 +10138,7 @@ function Leaf({
9783
10138
  }
9784
10139
 
9785
10140
  // src/components/KanbanCard/KanbanCard.tsx
9786
- import { jsx as jsx45, jsxs as jsxs44 } from "react/jsx-runtime";
10141
+ import { jsx as jsx46, jsxs as jsxs44 } from "react/jsx-runtime";
9787
10142
  function KanbanCard({
9788
10143
  title,
9789
10144
  tag,
@@ -9808,8 +10163,8 @@ function KanbanCard({
9808
10163
  ),
9809
10164
  children: [
9810
10165
  tag && /* @__PURE__ */ jsxs44("div", { className: "ods-kanban-card__head", children: [
9811
- /* @__PURE__ */ jsx45("span", { className: "ods-kanban-card__tag", children: tag }),
9812
- /* @__PURE__ */ jsx45(
10166
+ /* @__PURE__ */ jsx46("span", { className: "ods-kanban-card__tag", children: tag }),
10167
+ /* @__PURE__ */ jsx46(
9813
10168
  "button",
9814
10169
  {
9815
10170
  type: "button",
@@ -9817,19 +10172,19 @@ function KanbanCard({
9817
10172
  "aria-label": "More options",
9818
10173
  onClick: (e) => e.stopPropagation(),
9819
10174
  children: /* @__PURE__ */ jsxs44("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [
9820
- /* @__PURE__ */ jsx45("circle", { cx: "3", cy: "7", r: "1.2", fill: "currentColor" }),
9821
- /* @__PURE__ */ jsx45("circle", { cx: "7", cy: "7", r: "1.2", fill: "currentColor" }),
9822
- /* @__PURE__ */ jsx45("circle", { cx: "11", cy: "7", r: "1.2", fill: "currentColor" })
10175
+ /* @__PURE__ */ jsx46("circle", { cx: "3", cy: "7", r: "1.2", fill: "currentColor" }),
10176
+ /* @__PURE__ */ jsx46("circle", { cx: "7", cy: "7", r: "1.2", fill: "currentColor" }),
10177
+ /* @__PURE__ */ jsx46("circle", { cx: "11", cy: "7", r: "1.2", fill: "currentColor" })
9823
10178
  ] })
9824
10179
  }
9825
10180
  )
9826
10181
  ] }),
9827
- /* @__PURE__ */ jsx45("div", { className: "ods-kanban-card__title", children: title }),
10182
+ /* @__PURE__ */ jsx46("div", { className: "ods-kanban-card__title", children: title }),
9828
10183
  /* @__PURE__ */ jsxs44("div", { className: "ods-kanban-card__footer", children: [
9829
10184
  /* @__PURE__ */ jsxs44("div", { className: "ods-kanban-card__meta", children: [
9830
10185
  date && /* @__PURE__ */ jsxs44("span", { className: "ods-kanban-card__date", children: [
9831
10186
  /* @__PURE__ */ jsxs44("svg", { width: "11", height: "11", viewBox: "0 0 11 11", fill: "none", "aria-hidden": "true", children: [
9832
- /* @__PURE__ */ jsx45(
10187
+ /* @__PURE__ */ jsx46(
9833
10188
  "rect",
9834
10189
  {
9835
10190
  x: "1.5",
@@ -9841,7 +10196,7 @@ function KanbanCard({
9841
10196
  strokeWidth: "1.2"
9842
10197
  }
9843
10198
  ),
9844
- /* @__PURE__ */ jsx45(
10199
+ /* @__PURE__ */ jsx46(
9845
10200
  "path",
9846
10201
  {
9847
10202
  d: "M3.5 1.5v2M7.5 1.5v2M1.5 4.5h8",
@@ -9854,7 +10209,7 @@ function KanbanCard({
9854
10209
  date
9855
10210
  ] }),
9856
10211
  typeof comments === "number" && /* @__PURE__ */ jsxs44("span", { className: "ods-kanban-card__comments", children: [
9857
- /* @__PURE__ */ jsx45("svg", { width: "11", height: "11", viewBox: "0 0 11 11", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx45(
10212
+ /* @__PURE__ */ jsx46("svg", { width: "11", height: "11", viewBox: "0 0 11 11", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx46(
9858
10213
  "path",
9859
10214
  {
9860
10215
  d: "M2 3a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H6l-2 2v-2H3a1 1 0 0 1-1-1V3z",
@@ -9865,7 +10220,7 @@ function KanbanCard({
9865
10220
  comments
9866
10221
  ] })
9867
10222
  ] }),
9868
- assignee && /* @__PURE__ */ jsx45("div", { className: "ods-kanban-card__assignee", children: assignee })
10223
+ assignee && /* @__PURE__ */ jsx46("div", { className: "ods-kanban-card__assignee", children: assignee })
9869
10224
  ] })
9870
10225
  ]
9871
10226
  }
@@ -9873,19 +10228,19 @@ function KanbanCard({
9873
10228
  }
9874
10229
 
9875
10230
  // src/components/Kbd/Kbd.tsx
9876
- import { jsx as jsx46, jsxs as jsxs45 } from "react/jsx-runtime";
10231
+ import { jsx as jsx47, jsxs as jsxs45 } from "react/jsx-runtime";
9877
10232
  function Kbd({ size = "md", children, className }) {
9878
- return /* @__PURE__ */ jsx46("kbd", { className: cn("ods-kbd", `ods-kbd--${size}`, className), children });
10233
+ return /* @__PURE__ */ jsx47("kbd", { className: cn("ods-kbd", `ods-kbd--${size}`, className), children });
9879
10234
  }
9880
10235
  function KbdGroup({ size = "md", separator = "+", keys, className }) {
9881
- return /* @__PURE__ */ jsx46("span", { className: cn("ods-kbd-group", className), children: keys.map((k, i) => /* @__PURE__ */ jsxs45("span", { className: "ods-kbd-group__item", children: [
9882
- /* @__PURE__ */ jsx46(Kbd, { size, children: k }),
9883
- i < keys.length - 1 && /* @__PURE__ */ jsx46("span", { className: "ods-kbd-group__sep", "aria-hidden": "true", children: separator })
10236
+ return /* @__PURE__ */ jsx47("span", { className: cn("ods-kbd-group", className), children: keys.map((k, i) => /* @__PURE__ */ jsxs45("span", { className: "ods-kbd-group__item", children: [
10237
+ /* @__PURE__ */ jsx47(Kbd, { size, children: k }),
10238
+ i < keys.length - 1 && /* @__PURE__ */ jsx47("span", { className: "ods-kbd-group__sep", "aria-hidden": "true", children: separator })
9884
10239
  ] }, i)) });
9885
10240
  }
9886
10241
 
9887
10242
  // src/components/LineChart/LineChart.tsx
9888
- import { jsx as jsx47, jsxs as jsxs46 } from "react/jsx-runtime";
10243
+ import { jsx as jsx48, jsxs as jsxs46 } from "react/jsx-runtime";
9889
10244
  function buildPath(points, smooth) {
9890
10245
  if (points.length === 0) return "";
9891
10246
  if (!smooth) {
@@ -9931,8 +10286,8 @@ function LineChart({
9931
10286
  const areaPath = fill && pts.length ? `${path} L${pts[pts.length - 1][0]},${H - pad2} L${pts[0][0]},${H - pad2} Z` : null;
9932
10287
  return /* @__PURE__ */ jsxs46("div", { className: cn("ods-line-chart", className), children: [
9933
10288
  (title || total) && /* @__PURE__ */ jsxs46("div", { className: "ods-line-chart__head", children: [
9934
- title && /* @__PURE__ */ jsx47("div", { className: "ods-line-chart__title", children: title }),
9935
- total && /* @__PURE__ */ jsx47("div", { className: "ods-line-chart__total", children: total })
10289
+ title && /* @__PURE__ */ jsx48("div", { className: "ods-line-chart__title", children: title }),
10290
+ total && /* @__PURE__ */ jsx48("div", { className: "ods-line-chart__total", children: total })
9936
10291
  ] }),
9937
10292
  /* @__PURE__ */ jsxs46(
9938
10293
  "svg",
@@ -9942,8 +10297,8 @@ function LineChart({
9942
10297
  preserveAspectRatio: "none",
9943
10298
  style: { height },
9944
10299
  children: [
9945
- areaPath && /* @__PURE__ */ jsx47("path", { d: areaPath, fill }),
9946
- /* @__PURE__ */ jsx47(
10300
+ areaPath && /* @__PURE__ */ jsx48("path", { d: areaPath, fill }),
10301
+ /* @__PURE__ */ jsx48(
9947
10302
  "path",
9948
10303
  {
9949
10304
  d: path,
@@ -9961,7 +10316,7 @@ function LineChart({
9961
10316
  }
9962
10317
 
9963
10318
  // src/components/LinkButton/LinkButton.tsx
9964
- import { jsx as jsx48, jsxs as jsxs47 } from "react/jsx-runtime";
10319
+ import { jsx as jsx49, jsxs as jsxs47 } from "react/jsx-runtime";
9965
10320
  function LinkButton({
9966
10321
  variant = "primary",
9967
10322
  size = "md",
@@ -9984,9 +10339,9 @@ function LinkButton({
9984
10339
  className
9985
10340
  ),
9986
10341
  children: [
9987
- leftIcon && /* @__PURE__ */ jsx48("span", { className: "ods-link-btn__icon ods-link-btn__icon--left", "aria-hidden": "true", children: leftIcon }),
9988
- /* @__PURE__ */ jsx48("span", { className: "ods-link-btn__label", children }),
9989
- rightIcon && /* @__PURE__ */ jsx48("span", { className: "ods-link-btn__icon ods-link-btn__icon--right", "aria-hidden": "true", children: rightIcon })
10342
+ leftIcon && /* @__PURE__ */ jsx49("span", { className: "ods-link-btn__icon ods-link-btn__icon--left", "aria-hidden": "true", children: leftIcon }),
10343
+ /* @__PURE__ */ jsx49("span", { className: "ods-link-btn__label", children }),
10344
+ rightIcon && /* @__PURE__ */ jsx49("span", { className: "ods-link-btn__icon ods-link-btn__icon--right", "aria-hidden": "true", children: rightIcon })
9990
10345
  ]
9991
10346
  }
9992
10347
  );
@@ -9996,14 +10351,14 @@ function LinkButton({
9996
10351
  import { AnimatePresence as AnimatePresence6, motion as motion9 } from "framer-motion";
9997
10352
  import {
9998
10353
  useCallback as useCallback11,
9999
- useEffect as useEffect12,
10354
+ useEffect as useEffect14,
10000
10355
  useLayoutEffect as useLayoutEffect3,
10001
10356
  useMemo as useMemo11,
10002
- useRef as useRef21,
10003
- useState as useState17
10357
+ useRef as useRef23,
10358
+ useState as useState19
10004
10359
  } from "react";
10005
10360
  import { createPortal as createPortal6 } from "react-dom";
10006
- import { jsx as jsx49, jsxs as jsxs48 } from "react/jsx-runtime";
10361
+ import { jsx as jsx50, jsxs as jsxs48 } from "react/jsx-runtime";
10007
10362
  var RESERVED_TAIL_PX = 64;
10008
10363
  var TAGS_GAP = 6;
10009
10364
  function MultiSelect({
@@ -10023,17 +10378,17 @@ function MultiSelect({
10023
10378
  maxTags,
10024
10379
  className
10025
10380
  }) {
10026
- const [internalValue, setInternalValue] = useState17(defaultValue ?? []);
10381
+ const [internalValue, setInternalValue] = useState19(defaultValue ?? []);
10027
10382
  const selectedValues = controlledValue ?? internalValue;
10028
- const [open, setOpen] = useState17(false);
10029
- const [query, setQuery] = useState17("");
10030
- const [activeIdx, setActiveIdx] = useState17(0);
10031
- const [dropdownPos, setDropdownPos] = useState17({ top: 0, left: 0, width: 0 });
10032
- const wrapRef = useRef21(null);
10033
- const tagsRowRef = useRef21(null);
10034
- const searchRef = useRef21(null);
10035
- const dropdownRef = useRef21(null);
10036
- const chipRefs = useRef21([]);
10383
+ const [open, setOpen] = useState19(false);
10384
+ const [query, setQuery] = useState19("");
10385
+ const [activeIdx, setActiveIdx] = useState19(0);
10386
+ const [dropdownPos, setDropdownPos] = useState19({ top: 0, left: 0, width: 0 });
10387
+ const wrapRef = useRef23(null);
10388
+ const tagsRowRef = useRef23(null);
10389
+ const searchRef = useRef23(null);
10390
+ const dropdownRef = useRef23(null);
10391
+ const chipRefs = useRef23([]);
10037
10392
  const commit = useCallback11(
10038
10393
  (next) => {
10039
10394
  if (controlledValue === void 0) setInternalValue(next);
@@ -10058,7 +10413,7 @@ function MultiSelect({
10058
10413
  const rect = wrapRef.current.getBoundingClientRect();
10059
10414
  setDropdownPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });
10060
10415
  }, []);
10061
- useEffect12(() => {
10416
+ useEffect14(() => {
10062
10417
  if (!open) return;
10063
10418
  updatePosition();
10064
10419
  window.addEventListener("scroll", updatePosition, true);
@@ -10068,7 +10423,7 @@ function MultiSelect({
10068
10423
  window.removeEventListener("resize", updatePosition);
10069
10424
  };
10070
10425
  }, [open, updatePosition]);
10071
- useEffect12(() => {
10426
+ useEffect14(() => {
10072
10427
  if (!open) return;
10073
10428
  const onDoc = (e) => {
10074
10429
  const t = e.target;
@@ -10080,14 +10435,14 @@ function MultiSelect({
10080
10435
  document.addEventListener("mousedown", onDoc);
10081
10436
  return () => document.removeEventListener("mousedown", onDoc);
10082
10437
  }, [open]);
10083
- useEffect12(() => {
10438
+ useEffect14(() => {
10084
10439
  if (open && showSearch) {
10085
10440
  requestAnimationFrame(() => searchRef.current?.focus());
10086
10441
  }
10087
10442
  }, [open, showSearch]);
10088
- useEffect12(() => setActiveIdx(0), [query, open]);
10089
- const [fitCount, setFitCount] = useState17(selectedValues.length);
10090
- const [tick, setTick] = useState17(0);
10443
+ useEffect14(() => setActiveIdx(0), [query, open]);
10444
+ const [fitCount, setFitCount] = useState19(selectedValues.length);
10445
+ const [tick, setTick] = useState19(0);
10091
10446
  useLayoutEffect3(() => {
10092
10447
  if (maxVisibleTags !== void 0) {
10093
10448
  setFitCount(Math.min(selectedValues.length, maxVisibleTags));
@@ -10114,7 +10469,7 @@ function MultiSelect({
10114
10469
  if (count < selectedValues.length && count > 0) count = Math.max(1, count - 1);
10115
10470
  setFitCount(count);
10116
10471
  }, [tick, selectedValues, maxVisibleTags]);
10117
- useEffect12(() => {
10472
+ useEffect14(() => {
10118
10473
  if (typeof ResizeObserver === "undefined") return;
10119
10474
  const row = tagsRowRef.current;
10120
10475
  if (!row) return;
@@ -10186,7 +10541,7 @@ function MultiSelect({
10186
10541
  className
10187
10542
  ),
10188
10543
  children: [
10189
- label && /* @__PURE__ */ jsx49("label", { className: "ods-multiselect__label", children: label }),
10544
+ label && /* @__PURE__ */ jsx50("label", { className: "ods-multiselect__label", children: label }),
10190
10545
  /* @__PURE__ */ jsxs48(
10191
10546
  "div",
10192
10547
  {
@@ -10199,7 +10554,7 @@ function MultiSelect({
10199
10554
  onClick: () => !disabled && setOpen(true),
10200
10555
  children: [
10201
10556
  /* @__PURE__ */ jsxs48("div", { ref: tagsRowRef, className: "ods-multiselect__tags", children: [
10202
- /* @__PURE__ */ jsx49("div", { className: "ods-multiselect__measure", "aria-hidden": "true", children: selectedValues.map((val, i) => /* @__PURE__ */ jsxs48(
10557
+ /* @__PURE__ */ jsx50("div", { className: "ods-multiselect__measure", "aria-hidden": "true", children: selectedValues.map((val, i) => /* @__PURE__ */ jsxs48(
10203
10558
  "span",
10204
10559
  {
10205
10560
  ref: (el) => {
@@ -10207,17 +10562,17 @@ function MultiSelect({
10207
10562
  },
10208
10563
  className: "ods-multiselect__tag",
10209
10564
  children: [
10210
- getIcon(val) && /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__tag-icon", children: getIcon(val) }),
10211
- /* @__PURE__ */ jsx49("span", { children: getLabel(val) }),
10212
- /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__tag-remove-spacer", "aria-hidden": "true" })
10565
+ getIcon(val) && /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__tag-icon", children: getIcon(val) }),
10566
+ /* @__PURE__ */ jsx50("span", { children: getLabel(val) }),
10567
+ /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__tag-remove-spacer", "aria-hidden": "true" })
10213
10568
  ]
10214
10569
  },
10215
10570
  val
10216
10571
  )) }),
10217
10572
  visibleChips.map((val) => /* @__PURE__ */ jsxs48("span", { className: "ods-multiselect__tag", children: [
10218
- getIcon(val) && /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__tag-icon", children: getIcon(val) }),
10219
- /* @__PURE__ */ jsx49("span", { children: getLabel(val) }),
10220
- /* @__PURE__ */ jsx49(
10573
+ getIcon(val) && /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__tag-icon", children: getIcon(val) }),
10574
+ /* @__PURE__ */ jsx50("span", { children: getLabel(val) }),
10575
+ /* @__PURE__ */ jsx50(
10221
10576
  "button",
10222
10577
  {
10223
10578
  type: "button",
@@ -10228,7 +10583,7 @@ function MultiSelect({
10228
10583
  },
10229
10584
  "aria-label": `Remove ${getLabel(val)}`,
10230
10585
  tabIndex: -1,
10231
- children: /* @__PURE__ */ jsx49("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx49(
10586
+ children: /* @__PURE__ */ jsx50("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx50(
10232
10587
  "path",
10233
10588
  {
10234
10589
  d: "M3 3L9 9M9 3L3 9",
@@ -10251,9 +10606,9 @@ function MultiSelect({
10251
10606
  ]
10252
10607
  }
10253
10608
  ),
10254
- selectedValues.length === 0 && /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__placeholder", children: placeholder })
10609
+ selectedValues.length === 0 && /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__placeholder", children: placeholder })
10255
10610
  ] }),
10256
- /* @__PURE__ */ jsx49(
10611
+ /* @__PURE__ */ jsx50(
10257
10612
  "svg",
10258
10613
  {
10259
10614
  width: "16",
@@ -10262,7 +10617,7 @@ function MultiSelect({
10262
10617
  fill: "none",
10263
10618
  "aria-hidden": "true",
10264
10619
  className: cn("ods-multiselect__chevron", open && "ods-multiselect__chevron--open"),
10265
- children: /* @__PURE__ */ jsx49(
10620
+ children: /* @__PURE__ */ jsx50(
10266
10621
  "path",
10267
10622
  {
10268
10623
  d: "M4 6l4 4 4-4",
@@ -10274,7 +10629,7 @@ function MultiSelect({
10274
10629
  )
10275
10630
  }
10276
10631
  ),
10277
- selectedValues.length > 0 && !disabled && /* @__PURE__ */ jsx49(
10632
+ selectedValues.length > 0 && !disabled && /* @__PURE__ */ jsx50(
10278
10633
  "button",
10279
10634
  {
10280
10635
  type: "button",
@@ -10292,7 +10647,7 @@ function MultiSelect({
10292
10647
  }
10293
10648
  ),
10294
10649
  typeof document !== "undefined" && createPortal6(
10295
- /* @__PURE__ */ jsx49(AnimatePresence6, { children: open && /* @__PURE__ */ jsxs48(
10650
+ /* @__PURE__ */ jsx50(AnimatePresence6, { children: open && /* @__PURE__ */ jsxs48(
10296
10651
  motion9.div,
10297
10652
  {
10298
10653
  ref: dropdownRef,
@@ -10312,8 +10667,8 @@ function MultiSelect({
10312
10667
  children: [
10313
10668
  showSearch && /* @__PURE__ */ jsxs48("div", { className: "ods-multiselect__search", children: [
10314
10669
  /* @__PURE__ */ jsxs48("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [
10315
- /* @__PURE__ */ jsx49("circle", { cx: "6", cy: "6", r: "4.5", stroke: "currentColor", strokeWidth: "1.4" }),
10316
- /* @__PURE__ */ jsx49(
10670
+ /* @__PURE__ */ jsx50("circle", { cx: "6", cy: "6", r: "4.5", stroke: "currentColor", strokeWidth: "1.4" }),
10671
+ /* @__PURE__ */ jsx50(
10317
10672
  "path",
10318
10673
  {
10319
10674
  d: "m12 12-2.5-2.5",
@@ -10323,7 +10678,7 @@ function MultiSelect({
10323
10678
  }
10324
10679
  )
10325
10680
  ] }),
10326
- /* @__PURE__ */ jsx49(
10681
+ /* @__PURE__ */ jsx50(
10327
10682
  "input",
10328
10683
  {
10329
10684
  ref: searchRef,
@@ -10338,7 +10693,7 @@ function MultiSelect({
10338
10693
  }
10339
10694
  )
10340
10695
  ] }),
10341
- /* @__PURE__ */ jsx49("div", { className: "ods-multiselect__list", children: availableOptions.length > 0 ? availableOptions.map((opt, idx) => /* @__PURE__ */ jsxs48(
10696
+ /* @__PURE__ */ jsx50("div", { className: "ods-multiselect__list", children: availableOptions.length > 0 ? availableOptions.map((opt, idx) => /* @__PURE__ */ jsxs48(
10342
10697
  "div",
10343
10698
  {
10344
10699
  className: cn(
@@ -10350,21 +10705,21 @@ function MultiSelect({
10350
10705
  onClick: () => addValue(opt.value),
10351
10706
  onMouseEnter: () => setActiveIdx(idx),
10352
10707
  children: [
10353
- opt.icon && /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__option-icon", children: opt.icon }),
10708
+ opt.icon && /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__option-icon", children: opt.icon }),
10354
10709
  /* @__PURE__ */ jsxs48("span", { className: "ods-multiselect__option-text", children: [
10355
- /* @__PURE__ */ jsx49("span", { children: opt.label }),
10356
- opt.description && /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__option-desc", children: opt.description })
10710
+ /* @__PURE__ */ jsx50("span", { children: opt.label }),
10711
+ opt.description && /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__option-desc", children: opt.description })
10357
10712
  ] })
10358
10713
  ]
10359
10714
  },
10360
10715
  opt.value
10361
- )) : /* @__PURE__ */ jsx49("div", { className: "ods-multiselect__empty", children: "No results" }) })
10716
+ )) : /* @__PURE__ */ jsx50("div", { className: "ods-multiselect__empty", children: "No results" }) })
10362
10717
  ]
10363
10718
  }
10364
10719
  ) }),
10365
10720
  document.body
10366
10721
  ),
10367
- error && errorMessage && /* @__PURE__ */ jsx49("span", { className: "ods-multiselect__error", children: errorMessage })
10722
+ error && errorMessage && /* @__PURE__ */ jsx50("span", { className: "ods-multiselect__error", children: errorMessage })
10368
10723
  ]
10369
10724
  }
10370
10725
  );
@@ -10372,7 +10727,7 @@ function MultiSelect({
10372
10727
 
10373
10728
  // src/components/NumberInput/NumberInput.tsx
10374
10729
  import { useCallback as useCallback12 } from "react";
10375
- import { jsx as jsx50, jsxs as jsxs49 } from "react/jsx-runtime";
10730
+ import { jsx as jsx51, jsxs as jsxs49 } from "react/jsx-runtime";
10376
10731
  function NumberInput({
10377
10732
  label,
10378
10733
  value,
@@ -10415,9 +10770,9 @@ function NumberInput({
10415
10770
  className
10416
10771
  ),
10417
10772
  children: [
10418
- label && /* @__PURE__ */ jsx50("label", { className: "ods-num__label", children: label }),
10773
+ label && /* @__PURE__ */ jsx51("label", { className: "ods-num__label", children: label }),
10419
10774
  /* @__PURE__ */ jsxs49("div", { className: "ods-num__field", children: [
10420
- /* @__PURE__ */ jsx50(
10775
+ /* @__PURE__ */ jsx51(
10421
10776
  "button",
10422
10777
  {
10423
10778
  type: "button",
@@ -10425,11 +10780,11 @@ function NumberInput({
10425
10780
  onClick: dec,
10426
10781
  disabled: disabled || typeof min === "number" && value <= min,
10427
10782
  "aria-label": "Decrease",
10428
- children: /* @__PURE__ */ jsx50("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx50("path", { d: "M3 7h8", stroke: "currentColor", strokeWidth: "1.75", strokeLinecap: "round" }) })
10783
+ children: /* @__PURE__ */ jsx51("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx51("path", { d: "M3 7h8", stroke: "currentColor", strokeWidth: "1.75", strokeLinecap: "round" }) })
10429
10784
  }
10430
10785
  ),
10431
- prefix && /* @__PURE__ */ jsx50("span", { className: "ods-num__prefix", children: prefix }),
10432
- /* @__PURE__ */ jsx50(
10786
+ prefix && /* @__PURE__ */ jsx51("span", { className: "ods-num__prefix", children: prefix }),
10787
+ /* @__PURE__ */ jsx51(
10433
10788
  "input",
10434
10789
  {
10435
10790
  type: "number",
@@ -10444,8 +10799,8 @@ function NumberInput({
10444
10799
  "aria-label": props["aria-label"]
10445
10800
  }
10446
10801
  ),
10447
- suffix && /* @__PURE__ */ jsx50("span", { className: "ods-num__suffix", children: suffix }),
10448
- /* @__PURE__ */ jsx50(
10802
+ suffix && /* @__PURE__ */ jsx51("span", { className: "ods-num__suffix", children: suffix }),
10803
+ /* @__PURE__ */ jsx51(
10449
10804
  "button",
10450
10805
  {
10451
10806
  type: "button",
@@ -10453,11 +10808,11 @@ function NumberInput({
10453
10808
  onClick: inc,
10454
10809
  disabled: disabled || typeof max === "number" && value >= max,
10455
10810
  "aria-label": "Increase",
10456
- children: /* @__PURE__ */ jsx50("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx50("path", { d: "M7 3v8M3 7h8", stroke: "currentColor", strokeWidth: "1.75", strokeLinecap: "round" }) })
10811
+ children: /* @__PURE__ */ jsx51("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx51("path", { d: "M7 3v8M3 7h8", stroke: "currentColor", strokeWidth: "1.75", strokeLinecap: "round" }) })
10457
10812
  }
10458
10813
  )
10459
10814
  ] }),
10460
- error ? /* @__PURE__ */ jsx50("div", { className: "ods-num__hint ods-num__hint--error", children: error }) : helperText ? /* @__PURE__ */ jsx50("div", { className: "ods-num__hint", children: helperText }) : null
10815
+ error ? /* @__PURE__ */ jsx51("div", { className: "ods-num__hint ods-num__hint--error", children: error }) : helperText ? /* @__PURE__ */ jsx51("div", { className: "ods-num__hint", children: helperText }) : null
10461
10816
  ]
10462
10817
  }
10463
10818
  );
@@ -10466,9 +10821,9 @@ function NumberInput({
10466
10821
  // src/components/OTPInput/OTPInput.tsx
10467
10822
  import {
10468
10823
  useCallback as useCallback13,
10469
- useRef as useRef22
10824
+ useRef as useRef24
10470
10825
  } from "react";
10471
- import { jsx as jsx51, jsxs as jsxs50 } from "react/jsx-runtime";
10826
+ import { jsx as jsx52, jsxs as jsxs50 } from "react/jsx-runtime";
10472
10827
  function OTPInput({
10473
10828
  label,
10474
10829
  length = 6,
@@ -10482,7 +10837,7 @@ function OTPInput({
10482
10837
  autoFocus = false,
10483
10838
  className
10484
10839
  }) {
10485
- const refs = useRef22([]);
10840
+ const refs = useRef24([]);
10486
10841
  const pattern = type === "numeric" ? /[^0-9]/g : /[^a-zA-Z0-9]/g;
10487
10842
  const setCharAt = useCallback13(
10488
10843
  (idx, ch) => {
@@ -10521,8 +10876,8 @@ function OTPInput({
10521
10876
  className
10522
10877
  ),
10523
10878
  children: [
10524
- label && /* @__PURE__ */ jsx51("label", { className: "ods-otp__label", children: label }),
10525
- /* @__PURE__ */ jsx51(
10879
+ label && /* @__PURE__ */ jsx52("label", { className: "ods-otp__label", children: label }),
10880
+ /* @__PURE__ */ jsx52(
10526
10881
  "div",
10527
10882
  {
10528
10883
  className: "ods-otp__row",
@@ -10530,7 +10885,7 @@ function OTPInput({
10530
10885
  "aria-label": typeof label === "string" ? label : "One-time passcode",
10531
10886
  children: Array.from({ length }).map((_, i) => {
10532
10887
  const ch = value[i] ?? "";
10533
- return /* @__PURE__ */ jsx51(
10888
+ return /* @__PURE__ */ jsx52(
10534
10889
  "input",
10535
10890
  {
10536
10891
  ref: (el) => {
@@ -10553,14 +10908,14 @@ function OTPInput({
10553
10908
  })
10554
10909
  }
10555
10910
  ),
10556
- error && /* @__PURE__ */ jsx51("div", { className: "ods-otp__hint", children: error })
10911
+ error && /* @__PURE__ */ jsx52("div", { className: "ods-otp__hint", children: error })
10557
10912
  ]
10558
10913
  }
10559
10914
  );
10560
10915
  }
10561
10916
 
10562
10917
  // src/components/PageHeader/PageHeader.tsx
10563
- import { jsx as jsx52, jsxs as jsxs51 } from "react/jsx-runtime";
10918
+ import { jsx as jsx53, jsxs as jsxs51 } from "react/jsx-runtime";
10564
10919
  function PageHeader({
10565
10920
  title,
10566
10921
  description,
@@ -10571,9 +10926,9 @@ function PageHeader({
10571
10926
  }) {
10572
10927
  return /* @__PURE__ */ jsxs51("header", { className: cn("ods-page-header", className), children: [
10573
10928
  /* @__PURE__ */ jsxs51("div", { className: "ods-page-header__main", children: [
10574
- breadcrumbs && breadcrumbs.length > 0 && /* @__PURE__ */ jsx52("nav", { className: "ods-page-header__crumbs", "aria-label": "Breadcrumb", children: breadcrumbs.map((c, i) => /* @__PURE__ */ jsxs51("span", { className: "ods-page-header__crumb", children: [
10575
- c.href ? /* @__PURE__ */ jsx52("a", { href: c.href, onClick: c.onClick, children: c.label }) : c.onClick ? /* @__PURE__ */ jsx52("button", { type: "button", onClick: c.onClick, children: c.label }) : /* @__PURE__ */ jsx52("span", { children: c.label }),
10576
- i < breadcrumbs.length - 1 && /* @__PURE__ */ jsx52("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx52(
10929
+ breadcrumbs && breadcrumbs.length > 0 && /* @__PURE__ */ jsx53("nav", { className: "ods-page-header__crumbs", "aria-label": "Breadcrumb", children: breadcrumbs.map((c, i) => /* @__PURE__ */ jsxs51("span", { className: "ods-page-header__crumb", children: [
10930
+ c.href ? /* @__PURE__ */ jsx53("a", { href: c.href, onClick: c.onClick, children: c.label }) : c.onClick ? /* @__PURE__ */ jsx53("button", { type: "button", onClick: c.onClick, children: c.label }) : /* @__PURE__ */ jsx53("span", { children: c.label }),
10931
+ i < breadcrumbs.length - 1 && /* @__PURE__ */ jsx53("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx53(
10577
10932
  "path",
10578
10933
  {
10579
10934
  d: "m4.5 3 3 3-3 3",
@@ -10584,17 +10939,17 @@ function PageHeader({
10584
10939
  }
10585
10940
  ) })
10586
10941
  ] }, i)) }),
10587
- /* @__PURE__ */ jsx52("h1", { className: "ods-page-header__title", children: title }),
10588
- description && /* @__PURE__ */ jsx52("p", { className: "ods-page-header__description", children: description }),
10589
- meta && /* @__PURE__ */ jsx52("div", { className: "ods-page-header__meta", children: meta })
10942
+ /* @__PURE__ */ jsx53("h1", { className: "ods-page-header__title", children: title }),
10943
+ description && /* @__PURE__ */ jsx53("p", { className: "ods-page-header__description", children: description }),
10944
+ meta && /* @__PURE__ */ jsx53("div", { className: "ods-page-header__meta", children: meta })
10590
10945
  ] }),
10591
- actions && /* @__PURE__ */ jsx52("div", { className: "ods-page-header__actions", children: actions })
10946
+ actions && /* @__PURE__ */ jsx53("div", { className: "ods-page-header__actions", children: actions })
10592
10947
  ] });
10593
10948
  }
10594
10949
 
10595
10950
  // src/components/PasswordInput/PasswordInput.tsx
10596
- import { useState as useState18 } from "react";
10597
- import { jsx as jsx53, jsxs as jsxs52 } from "react/jsx-runtime";
10951
+ import { useState as useState20 } from "react";
10952
+ import { jsx as jsx54, jsxs as jsxs52 } from "react/jsx-runtime";
10598
10953
  var strengthLabels = ["Very weak", "Weak", "Fair", "Strong", "Very strong"];
10599
10954
  function PasswordInput({
10600
10955
  label,
@@ -10610,7 +10965,7 @@ function PasswordInput({
10610
10965
  className,
10611
10966
  ...rest
10612
10967
  }) {
10613
- const [shown, setShown] = useState18(false);
10968
+ const [shown, setShown] = useState20(false);
10614
10969
  const handle = (e) => onChange?.(e.target.value);
10615
10970
  return /* @__PURE__ */ jsxs52(
10616
10971
  "div",
@@ -10623,10 +10978,10 @@ function PasswordInput({
10623
10978
  className
10624
10979
  ),
10625
10980
  children: [
10626
- label && /* @__PURE__ */ jsx53("label", { className: "ods-pwd__label", children: label }),
10981
+ label && /* @__PURE__ */ jsx54("label", { className: "ods-pwd__label", children: label }),
10627
10982
  /* @__PURE__ */ jsxs52("div", { className: "ods-pwd__field", children: [
10628
- leftIcon && /* @__PURE__ */ jsx53("span", { className: "ods-pwd__icon", "aria-hidden": "true", children: leftIcon }),
10629
- /* @__PURE__ */ jsx53(
10983
+ leftIcon && /* @__PURE__ */ jsx54("span", { className: "ods-pwd__icon", "aria-hidden": "true", children: leftIcon }),
10984
+ /* @__PURE__ */ jsx54(
10630
10985
  "input",
10631
10986
  {
10632
10987
  ...rest,
@@ -10637,7 +10992,7 @@ function PasswordInput({
10637
10992
  className: "ods-pwd__input"
10638
10993
  }
10639
10994
  ),
10640
- showToggle && /* @__PURE__ */ jsx53(
10995
+ showToggle && /* @__PURE__ */ jsx54(
10641
10996
  "button",
10642
10997
  {
10643
10998
  type: "button",
@@ -10646,7 +11001,7 @@ function PasswordInput({
10646
11001
  "aria-label": shown ? "Hide password" : "Show password",
10647
11002
  disabled,
10648
11003
  children: shown ? /* @__PURE__ */ jsxs52("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
10649
- /* @__PURE__ */ jsx53(
11004
+ /* @__PURE__ */ jsx54(
10650
11005
  "path",
10651
11006
  {
10652
11007
  d: "M2 8c1.5-2.6 3.6-4 6-4s4.5 1.4 6 4c-1.5 2.6-3.6 4-6 4s-4.5-1.4-6-4z",
@@ -10654,8 +11009,8 @@ function PasswordInput({
10654
11009
  strokeWidth: "1.3"
10655
11010
  }
10656
11011
  ),
10657
- /* @__PURE__ */ jsx53("circle", { cx: "8", cy: "8", r: "1.8", stroke: "currentColor", strokeWidth: "1.3" }),
10658
- /* @__PURE__ */ jsx53(
11012
+ /* @__PURE__ */ jsx54("circle", { cx: "8", cy: "8", r: "1.8", stroke: "currentColor", strokeWidth: "1.3" }),
11013
+ /* @__PURE__ */ jsx54(
10659
11014
  "path",
10660
11015
  {
10661
11016
  d: "M2 2l12 12",
@@ -10665,7 +11020,7 @@ function PasswordInput({
10665
11020
  }
10666
11021
  )
10667
11022
  ] }) : /* @__PURE__ */ jsxs52("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
10668
- /* @__PURE__ */ jsx53(
11023
+ /* @__PURE__ */ jsx54(
10669
11024
  "path",
10670
11025
  {
10671
11026
  d: "M2 8c1.5-2.6 3.6-4 6-4s4.5 1.4 6 4c-1.5 2.6-3.6 4-6 4s-4.5-1.4-6-4z",
@@ -10673,24 +11028,24 @@ function PasswordInput({
10673
11028
  strokeWidth: "1.3"
10674
11029
  }
10675
11030
  ),
10676
- /* @__PURE__ */ jsx53("circle", { cx: "8", cy: "8", r: "2", stroke: "currentColor", strokeWidth: "1.3" })
11031
+ /* @__PURE__ */ jsx54("circle", { cx: "8", cy: "8", r: "2", stroke: "currentColor", strokeWidth: "1.3" })
10677
11032
  ] })
10678
11033
  }
10679
11034
  )
10680
11035
  ] }),
10681
11036
  typeof strength === "number" && /* @__PURE__ */ jsxs52("div", { className: "ods-pwd__strength", "data-level": strength, children: [
10682
- /* @__PURE__ */ jsx53("span", { className: "ods-pwd__meter", children: /* @__PURE__ */ jsx53("span", { className: cn("ods-pwd__bar", `ods-pwd__bar--${strength}`) }) }),
10683
- /* @__PURE__ */ jsx53("span", { className: "ods-pwd__strength-label", children: strengthLabels[strength] })
11037
+ /* @__PURE__ */ jsx54("span", { className: "ods-pwd__meter", children: /* @__PURE__ */ jsx54("span", { className: cn("ods-pwd__bar", `ods-pwd__bar--${strength}`) }) }),
11038
+ /* @__PURE__ */ jsx54("span", { className: "ods-pwd__strength-label", children: strengthLabels[strength] })
10684
11039
  ] }),
10685
- error ? /* @__PURE__ */ jsx53("div", { className: "ods-pwd__hint ods-pwd__hint--error", children: error }) : helperText ? /* @__PURE__ */ jsx53("div", { className: "ods-pwd__hint", children: helperText }) : null
11040
+ error ? /* @__PURE__ */ jsx54("div", { className: "ods-pwd__hint ods-pwd__hint--error", children: error }) : helperText ? /* @__PURE__ */ jsx54("div", { className: "ods-pwd__hint", children: helperText }) : null
10686
11041
  ]
10687
11042
  }
10688
11043
  );
10689
11044
  }
10690
11045
 
10691
11046
  // src/components/PhoneInput/PhoneInput.tsx
10692
- import { useState as useState19 } from "react";
10693
- import { jsx as jsx54, jsxs as jsxs53 } from "react/jsx-runtime";
11047
+ import { useState as useState21 } from "react";
11048
+ import { jsx as jsx55, jsxs as jsxs53 } from "react/jsx-runtime";
10694
11049
  var DEFAULT_COUNTRIES = [
10695
11050
  { code: "US", name: "United States", dialCode: "+1", flag: "\u{1F1FA}\u{1F1F8}" },
10696
11051
  { code: "GB", name: "United Kingdom", dialCode: "+44", flag: "\u{1F1EC}\u{1F1E7}" },
@@ -10715,7 +11070,7 @@ function PhoneInput({
10715
11070
  helperText,
10716
11071
  className
10717
11072
  }) {
10718
- const [open, setOpen] = useState19(false);
11073
+ const [open, setOpen] = useState21(false);
10719
11074
  const country = countries.find((c) => c.code === countryCode) ?? countries[0];
10720
11075
  const onInput = (e) => onChange?.(e.target.value);
10721
11076
  return /* @__PURE__ */ jsxs53(
@@ -10729,7 +11084,7 @@ function PhoneInput({
10729
11084
  className
10730
11085
  ),
10731
11086
  children: [
10732
- label && /* @__PURE__ */ jsx54("label", { className: "ods-phone__label", children: label }),
11087
+ label && /* @__PURE__ */ jsx55("label", { className: "ods-phone__label", children: label }),
10733
11088
  /* @__PURE__ */ jsxs53("div", { className: "ods-phone__field", children: [
10734
11089
  /* @__PURE__ */ jsxs53(
10735
11090
  "button",
@@ -10741,9 +11096,9 @@ function PhoneInput({
10741
11096
  "aria-haspopup": "listbox",
10742
11097
  "aria-expanded": open,
10743
11098
  children: [
10744
- /* @__PURE__ */ jsx54("span", { className: "ods-phone__flag", "aria-hidden": "true", children: country.flag }),
10745
- /* @__PURE__ */ jsx54("span", { className: "ods-phone__dial", children: country.dialCode }),
10746
- /* @__PURE__ */ jsx54("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx54(
11099
+ /* @__PURE__ */ jsx55("span", { className: "ods-phone__flag", "aria-hidden": "true", children: country.flag }),
11100
+ /* @__PURE__ */ jsx55("span", { className: "ods-phone__dial", children: country.dialCode }),
11101
+ /* @__PURE__ */ jsx55("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx55(
10747
11102
  "path",
10748
11103
  {
10749
11104
  d: "M3 4.5L6 7.5L9 4.5",
@@ -10756,7 +11111,7 @@ function PhoneInput({
10756
11111
  ]
10757
11112
  }
10758
11113
  ),
10759
- /* @__PURE__ */ jsx54(
11114
+ /* @__PURE__ */ jsx55(
10760
11115
  "input",
10761
11116
  {
10762
11117
  type: "tel",
@@ -10768,7 +11123,7 @@ function PhoneInput({
10768
11123
  "aria-label": typeof label === "string" ? `${label} number` : "Phone number"
10769
11124
  }
10770
11125
  ),
10771
- open && /* @__PURE__ */ jsx54("ul", { className: "ods-phone__menu", role: "listbox", "aria-label": "Country", children: countries.map((c) => /* @__PURE__ */ jsx54("li", { children: /* @__PURE__ */ jsxs53(
11126
+ open && /* @__PURE__ */ jsx55("ul", { className: "ods-phone__menu", role: "listbox", "aria-label": "Country", children: countries.map((c) => /* @__PURE__ */ jsx55("li", { children: /* @__PURE__ */ jsxs53(
10772
11127
  "button",
10773
11128
  {
10774
11129
  type: "button",
@@ -10783,23 +11138,23 @@ function PhoneInput({
10783
11138
  setOpen(false);
10784
11139
  },
10785
11140
  children: [
10786
- /* @__PURE__ */ jsx54("span", { className: "ods-phone__flag", "aria-hidden": "true", children: c.flag }),
10787
- /* @__PURE__ */ jsx54("span", { className: "ods-phone__menu-name", children: c.name }),
10788
- /* @__PURE__ */ jsx54("span", { className: "ods-phone__menu-dial", children: c.dialCode })
11141
+ /* @__PURE__ */ jsx55("span", { className: "ods-phone__flag", "aria-hidden": "true", children: c.flag }),
11142
+ /* @__PURE__ */ jsx55("span", { className: "ods-phone__menu-name", children: c.name }),
11143
+ /* @__PURE__ */ jsx55("span", { className: "ods-phone__menu-dial", children: c.dialCode })
10789
11144
  ]
10790
11145
  }
10791
11146
  ) }, c.code)) })
10792
11147
  ] }),
10793
- error ? /* @__PURE__ */ jsx54("div", { className: "ods-phone__hint ods-phone__hint--error", children: error }) : helperText ? /* @__PURE__ */ jsx54("div", { className: "ods-phone__hint", children: helperText }) : null
11148
+ error ? /* @__PURE__ */ jsx55("div", { className: "ods-phone__hint ods-phone__hint--error", children: error }) : helperText ? /* @__PURE__ */ jsx55("div", { className: "ods-phone__hint", children: helperText }) : null
10794
11149
  ]
10795
11150
  }
10796
11151
  );
10797
11152
  }
10798
11153
 
10799
11154
  // src/components/Popover/Popover.tsx
10800
- import { useCallback as useCallback14, useEffect as useEffect13, useLayoutEffect as useLayoutEffect4, useRef as useRef23, useState as useState20 } from "react";
11155
+ import { useCallback as useCallback14, useEffect as useEffect15, useLayoutEffect as useLayoutEffect4, useRef as useRef25, useState as useState22 } from "react";
10801
11156
  import { createPortal as createPortal7 } from "react-dom";
10802
- import { Fragment as Fragment15, jsx as jsx55, jsxs as jsxs54 } from "react/jsx-runtime";
11157
+ import { Fragment as Fragment16, jsx as jsx56, jsxs as jsxs54 } from "react/jsx-runtime";
10803
11158
  function computePosition2(rect, popRect, placement, offset) {
10804
11159
  const cx = rect.left + rect.width / 2;
10805
11160
  const cy = rect.top + rect.height / 2;
@@ -10828,7 +11183,7 @@ function Popover({
10828
11183
  children,
10829
11184
  className
10830
11185
  }) {
10831
- const [openState, setOpenState] = useState20(defaultOpen);
11186
+ const [openState, setOpenState] = useState22(defaultOpen);
10832
11187
  const open = openProp ?? openState;
10833
11188
  const setOpen = useCallback14(
10834
11189
  (v) => {
@@ -10837,9 +11192,9 @@ function Popover({
10837
11192
  },
10838
11193
  [openProp, onOpenChange]
10839
11194
  );
10840
- const triggerRef = useRef23(null);
10841
- const popRef = useRef23(null);
10842
- const [coords, setCoords] = useState20(null);
11195
+ const triggerRef = useRef25(null);
11196
+ const popRef = useRef25(null);
11197
+ const [coords, setCoords] = useState22(null);
10843
11198
  const reposition = useCallback14(() => {
10844
11199
  if (!triggerRef.current || !popRef.current) return;
10845
11200
  const trigRect = triggerRef.current.getBoundingClientRect();
@@ -10852,7 +11207,7 @@ function Popover({
10852
11207
  const id = requestAnimationFrame(reposition);
10853
11208
  return () => cancelAnimationFrame(id);
10854
11209
  }, [open, reposition, content]);
10855
- useEffect13(() => {
11210
+ useEffect15(() => {
10856
11211
  if (!open) return;
10857
11212
  const onScroll = () => reposition();
10858
11213
  window.addEventListener("scroll", onScroll, true);
@@ -10862,7 +11217,7 @@ function Popover({
10862
11217
  window.removeEventListener("resize", onScroll);
10863
11218
  };
10864
11219
  }, [open, reposition]);
10865
- useEffect13(() => {
11220
+ useEffect15(() => {
10866
11221
  if (!open || !closeOnClickOutside) return;
10867
11222
  const onDoc = (e) => {
10868
11223
  const t = e.target;
@@ -10873,7 +11228,7 @@ function Popover({
10873
11228
  document.addEventListener("mousedown", onDoc);
10874
11229
  return () => document.removeEventListener("mousedown", onDoc);
10875
11230
  }, [open, closeOnClickOutside, setOpen]);
10876
- useEffect13(() => {
11231
+ useEffect15(() => {
10877
11232
  if (!open || !closeOnEsc) return;
10878
11233
  const onKey = (e) => {
10879
11234
  if (e.key === "Escape") setOpen(false);
@@ -10881,7 +11236,7 @@ function Popover({
10881
11236
  document.addEventListener("keydown", onKey);
10882
11237
  return () => document.removeEventListener("keydown", onKey);
10883
11238
  }, [open, closeOnEsc, setOpen]);
10884
- const triggerEl = /* @__PURE__ */ jsx55(
11239
+ const triggerEl = /* @__PURE__ */ jsx56(
10885
11240
  "span",
10886
11241
  {
10887
11242
  ref: triggerRef,
@@ -10911,20 +11266,20 @@ function Popover({
10911
11266
  },
10912
11267
  children: [
10913
11268
  content,
10914
- arrow && /* @__PURE__ */ jsx55("span", { className: "ods-popover__arrow", "aria-hidden": "true" })
11269
+ arrow && /* @__PURE__ */ jsx56("span", { className: "ods-popover__arrow", "aria-hidden": "true" })
10915
11270
  ]
10916
11271
  }
10917
11272
  ),
10918
11273
  document.body
10919
11274
  ) : null;
10920
- return /* @__PURE__ */ jsxs54(Fragment15, { children: [
11275
+ return /* @__PURE__ */ jsxs54(Fragment16, { children: [
10921
11276
  triggerEl,
10922
11277
  portal
10923
11278
  ] });
10924
11279
  }
10925
11280
 
10926
11281
  // src/components/PricingCard/PricingCard.tsx
10927
- import { jsx as jsx56, jsxs as jsxs55 } from "react/jsx-runtime";
11282
+ import { jsx as jsx57, jsxs as jsxs55 } from "react/jsx-runtime";
10928
11283
  function PricingCard({
10929
11284
  name,
10930
11285
  description,
@@ -10938,17 +11293,17 @@ function PricingCard({
10938
11293
  }) {
10939
11294
  return /* @__PURE__ */ jsxs55("div", { className: cn("ods-pricing", highlighted && "ods-pricing--highlighted", className), children: [
10940
11295
  /* @__PURE__ */ jsxs55("div", { className: "ods-pricing__head", children: [
10941
- badge && /* @__PURE__ */ jsx56("span", { className: "ods-pricing__badge", children: badge }),
10942
- /* @__PURE__ */ jsx56("h3", { className: "ods-pricing__name", children: name }),
10943
- description && /* @__PURE__ */ jsx56("p", { className: "ods-pricing__desc", children: description })
11296
+ badge && /* @__PURE__ */ jsx57("span", { className: "ods-pricing__badge", children: badge }),
11297
+ /* @__PURE__ */ jsx57("h3", { className: "ods-pricing__name", children: name }),
11298
+ description && /* @__PURE__ */ jsx57("p", { className: "ods-pricing__desc", children: description })
10944
11299
  ] }),
10945
11300
  /* @__PURE__ */ jsxs55("div", { className: "ods-pricing__price", children: [
10946
- /* @__PURE__ */ jsx56("span", { className: "ods-pricing__amount", children: price }),
10947
- pricePeriod && /* @__PURE__ */ jsx56("span", { className: "ods-pricing__period", children: pricePeriod })
11301
+ /* @__PURE__ */ jsx57("span", { className: "ods-pricing__amount", children: price }),
11302
+ pricePeriod && /* @__PURE__ */ jsx57("span", { className: "ods-pricing__period", children: pricePeriod })
10948
11303
  ] }),
10949
- /* @__PURE__ */ jsx56("hr", { className: "ods-pricing__sep" }),
10950
- /* @__PURE__ */ jsx56("ul", { className: "ods-pricing__features", children: features.map((f, i) => /* @__PURE__ */ jsxs55("li", { className: "ods-pricing__feature", children: [
10951
- /* @__PURE__ */ jsx56("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx56(
11304
+ /* @__PURE__ */ jsx57("hr", { className: "ods-pricing__sep" }),
11305
+ /* @__PURE__ */ jsx57("ul", { className: "ods-pricing__features", children: features.map((f, i) => /* @__PURE__ */ jsxs55("li", { className: "ods-pricing__feature", children: [
11306
+ /* @__PURE__ */ jsx57("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx57(
10952
11307
  "path",
10953
11308
  {
10954
11309
  d: "m3 8.5 3 3 7-7",
@@ -10958,14 +11313,14 @@ function PricingCard({
10958
11313
  strokeLinejoin: "round"
10959
11314
  }
10960
11315
  ) }),
10961
- /* @__PURE__ */ jsx56("span", { children: f })
11316
+ /* @__PURE__ */ jsx57("span", { children: f })
10962
11317
  ] }, i)) }),
10963
- cta && /* @__PURE__ */ jsx56("div", { className: "ods-pricing__cta", children: cta })
11318
+ cta && /* @__PURE__ */ jsx57("div", { className: "ods-pricing__cta", children: cta })
10964
11319
  ] });
10965
11320
  }
10966
11321
 
10967
11322
  // src/components/ProductCard/ProductCard.tsx
10968
- import { jsx as jsx57, jsxs as jsxs56 } from "react/jsx-runtime";
11323
+ import { jsx as jsx58, jsxs as jsxs56 } from "react/jsx-runtime";
10969
11324
  function ProductCard({
10970
11325
  image,
10971
11326
  tag,
@@ -10977,22 +11332,22 @@ function ProductCard({
10977
11332
  className
10978
11333
  }) {
10979
11334
  return /* @__PURE__ */ jsxs56("div", { className: cn("ods-product-card", className), children: [
10980
- /* @__PURE__ */ jsx57("div", { className: "ods-product-card__image", children: image }),
10981
- tag && /* @__PURE__ */ jsx57("span", { className: "ods-product-card__tag", children: tag }),
10982
- /* @__PURE__ */ jsx57("div", { className: "ods-product-card__name", children: name }),
10983
- description && /* @__PURE__ */ jsx57("div", { className: "ods-product-card__desc", children: description }),
11335
+ /* @__PURE__ */ jsx58("div", { className: "ods-product-card__image", children: image }),
11336
+ tag && /* @__PURE__ */ jsx58("span", { className: "ods-product-card__tag", children: tag }),
11337
+ /* @__PURE__ */ jsx58("div", { className: "ods-product-card__name", children: name }),
11338
+ description && /* @__PURE__ */ jsx58("div", { className: "ods-product-card__desc", children: description }),
10984
11339
  /* @__PURE__ */ jsxs56("div", { className: "ods-product-card__footer", children: [
10985
11340
  /* @__PURE__ */ jsxs56("div", { className: "ods-product-card__price-group", children: [
10986
- /* @__PURE__ */ jsx57("span", { className: "ods-product-card__price", children: price }),
10987
- originalPrice && /* @__PURE__ */ jsx57("span", { className: "ods-product-card__strike", children: originalPrice })
11341
+ /* @__PURE__ */ jsx58("span", { className: "ods-product-card__price", children: price }),
11342
+ originalPrice && /* @__PURE__ */ jsx58("span", { className: "ods-product-card__strike", children: originalPrice })
10988
11343
  ] }),
10989
- action && /* @__PURE__ */ jsx57("div", { className: "ods-product-card__action", children: action })
11344
+ action && /* @__PURE__ */ jsx58("div", { className: "ods-product-card__action", children: action })
10990
11345
  ] })
10991
11346
  ] });
10992
11347
  }
10993
11348
 
10994
11349
  // src/components/ProgressRing/ProgressRing.tsx
10995
- import { jsx as jsx58, jsxs as jsxs57 } from "react/jsx-runtime";
11350
+ import { jsx as jsx59, jsxs as jsxs57 } from "react/jsx-runtime";
10996
11351
  var VARIANT_COLORS = {
10997
11352
  primary: "#6c5ce7",
10998
11353
  success: "#16a34a",
@@ -11033,7 +11388,7 @@ function ProgressRing({
11033
11388
  "aria-valuenow": indeterminate ? void 0 : value,
11034
11389
  children: [
11035
11390
  /* @__PURE__ */ jsxs57("svg", { className: "ods-progress-ring__svg", width: size, height: size, children: [
11036
- /* @__PURE__ */ jsx58(
11391
+ /* @__PURE__ */ jsx59(
11037
11392
  "circle",
11038
11393
  {
11039
11394
  className: "ods-progress-ring__track",
@@ -11045,7 +11400,7 @@ function ProgressRing({
11045
11400
  strokeWidth
11046
11401
  }
11047
11402
  ),
11048
- /* @__PURE__ */ jsx58(
11403
+ /* @__PURE__ */ jsx59(
11049
11404
  "circle",
11050
11405
  {
11051
11406
  className: "ods-progress-ring__fill",
@@ -11062,7 +11417,7 @@ function ProgressRing({
11062
11417
  }
11063
11418
  )
11064
11419
  ] }),
11065
- !indeterminate && (label || showValue) && /* @__PURE__ */ jsx58("div", { className: "ods-progress-ring__center", children: label ?? /* @__PURE__ */ jsxs57("span", { className: "ods-progress-ring__value", children: [
11420
+ !indeterminate && (label || showValue) && /* @__PURE__ */ jsx59("div", { className: "ods-progress-ring__center", children: label ?? /* @__PURE__ */ jsxs57("span", { className: "ods-progress-ring__value", children: [
11066
11421
  Math.round(pct * 100),
11067
11422
  "%"
11068
11423
  ] }) })
@@ -11074,12 +11429,12 @@ function ProgressRing({
11074
11429
  // src/components/PromptInput/PromptInput.tsx
11075
11430
  import {
11076
11431
  useCallback as useCallback15,
11077
- useEffect as useEffect14,
11078
- useRef as useRef24,
11079
- useState as useState21
11432
+ useEffect as useEffect16,
11433
+ useRef as useRef26,
11434
+ useState as useState23
11080
11435
  } from "react";
11081
- import { jsx as jsx59, jsxs as jsxs58 } from "react/jsx-runtime";
11082
- var ATTACH_GLYPH = /* @__PURE__ */ jsx59("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx59(
11436
+ import { jsx as jsx60, jsxs as jsxs58 } from "react/jsx-runtime";
11437
+ var ATTACH_GLYPH = /* @__PURE__ */ jsx60("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx60(
11083
11438
  "path",
11084
11439
  {
11085
11440
  d: "M10.5 7 6.4 11.1a2 2 0 1 1-2.8-2.8L8.3 3.6a3 3 0 0 1 4.2 4.2l-5.6 5.6",
@@ -11089,7 +11444,7 @@ var ATTACH_GLYPH = /* @__PURE__ */ jsx59("svg", { width: "14", height: "14", vie
11089
11444
  strokeLinejoin: "round"
11090
11445
  }
11091
11446
  ) });
11092
- var SEND_GLYPH = /* @__PURE__ */ jsx59("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx59(
11447
+ var SEND_GLYPH = /* @__PURE__ */ jsx60("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx60(
11093
11448
  "path",
11094
11449
  {
11095
11450
  d: "m2 7 10-5-4 10-1.5-3.5L2 7Z",
@@ -11100,7 +11455,7 @@ var SEND_GLYPH = /* @__PURE__ */ jsx59("svg", { width: "14", height: "14", viewB
11100
11455
  fillOpacity: "0.15"
11101
11456
  }
11102
11457
  ) });
11103
- var STOP_GLYPH = /* @__PURE__ */ jsx59("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsx59("rect", { x: "2", y: "2", width: "8", height: "8", rx: "1" }) });
11458
+ var STOP_GLYPH = /* @__PURE__ */ jsx60("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsx60("rect", { x: "2", y: "2", width: "8", height: "8", rx: "1" }) });
11104
11459
  function PromptInput({
11105
11460
  value,
11106
11461
  defaultValue = "",
@@ -11128,14 +11483,14 @@ function PromptInput({
11128
11483
  className,
11129
11484
  ariaLabel = "Prompt"
11130
11485
  }) {
11131
- const taRef = useRef24(null);
11132
- const [internal, setInternal] = useState21(defaultValue);
11486
+ const taRef = useRef26(null);
11487
+ const [internal, setInternal] = useState23(defaultValue);
11133
11488
  const v = value ?? internal;
11134
11489
  const isControlled = value !== void 0;
11135
- const [suggestionsOpen, setSuggestionsOpen] = useState21(false);
11136
- const [suggestionIndex, setSuggestionIndex] = useState21(0);
11137
- const [isDragOver, setIsDragOver] = useState21(false);
11138
- const [historyIdx, setHistoryIdx] = useState21(null);
11490
+ const [suggestionsOpen, setSuggestionsOpen] = useState23(false);
11491
+ const [suggestionIndex, setSuggestionIndex] = useState23(0);
11492
+ const [isDragOver, setIsDragOver] = useState23(false);
11493
+ const [historyIdx, setHistoryIdx] = useState23(null);
11139
11494
  const setValue = useCallback15(
11140
11495
  (next) => {
11141
11496
  if (!isControlled) setInternal(next);
@@ -11143,7 +11498,7 @@ function PromptInput({
11143
11498
  },
11144
11499
  [isControlled, onChange]
11145
11500
  );
11146
- useEffect14(() => {
11501
+ useEffect16(() => {
11147
11502
  const el = taRef.current;
11148
11503
  if (!el) return;
11149
11504
  const computed = window.getComputedStyle(el);
@@ -11298,7 +11653,7 @@ function PromptInput({
11298
11653
  onDrop: handleDrop,
11299
11654
  children: [
11300
11655
  isDragOver && /* @__PURE__ */ jsxs58("div", { className: "ods-prompt-input__drop-overlay", "aria-hidden": "true", children: [
11301
- /* @__PURE__ */ jsx59("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx59(
11656
+ /* @__PURE__ */ jsx60("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx60(
11302
11657
  "path",
11303
11658
  {
11304
11659
  d: "M10 3v9M6 7l4-4 4 4M3 15h14",
@@ -11308,22 +11663,22 @@ function PromptInput({
11308
11663
  strokeLinejoin: "round"
11309
11664
  }
11310
11665
  ) }),
11311
- /* @__PURE__ */ jsx59("span", { children: "Drop files to attach" })
11666
+ /* @__PURE__ */ jsx60("span", { children: "Drop files to attach" })
11312
11667
  ] }),
11313
- attachments.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ods-prompt-input__attachments", children: attachments.map((a) => {
11668
+ attachments.length > 0 && /* @__PURE__ */ jsx60("div", { className: "ods-prompt-input__attachments", children: attachments.map((a) => {
11314
11669
  const safePreview = sanitizeImageUrl(a.previewUrl);
11315
11670
  return /* @__PURE__ */ jsxs58("span", { className: "ods-prompt-input__chip", title: a.name, children: [
11316
- /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__chip-glyph", "aria-hidden": "true", children: safePreview ? /* @__PURE__ */ jsx59("img", { src: safePreview, alt: "", className: "ods-prompt-input__chip-thumb" }) : ATTACH_GLYPH }),
11317
- /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__chip-label", children: a.name }),
11318
- a.size != null && /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__chip-size", children: fmtSize2(a.size) }),
11319
- onRemoveAttachment && /* @__PURE__ */ jsx59(
11671
+ /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__chip-glyph", "aria-hidden": "true", children: safePreview ? /* @__PURE__ */ jsx60("img", { src: safePreview, alt: "", className: "ods-prompt-input__chip-thumb" }) : ATTACH_GLYPH }),
11672
+ /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__chip-label", children: a.name }),
11673
+ a.size != null && /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__chip-size", children: fmtSize2(a.size) }),
11674
+ onRemoveAttachment && /* @__PURE__ */ jsx60(
11320
11675
  "button",
11321
11676
  {
11322
11677
  type: "button",
11323
11678
  className: "ods-prompt-input__chip-remove",
11324
11679
  onClick: () => onRemoveAttachment(a.id),
11325
11680
  "aria-label": `Remove ${a.name}`,
11326
- children: /* @__PURE__ */ jsx59("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx59(
11681
+ children: /* @__PURE__ */ jsx60("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx60(
11327
11682
  "path",
11328
11683
  {
11329
11684
  d: "m2.5 2.5 5 5M7.5 2.5l-5 5",
@@ -11337,7 +11692,7 @@ function PromptInput({
11337
11692
  ] }, a.id);
11338
11693
  }) }),
11339
11694
  /* @__PURE__ */ jsxs58("div", { className: "ods-prompt-input__field", children: [
11340
- /* @__PURE__ */ jsx59(
11695
+ /* @__PURE__ */ jsx60(
11341
11696
  "textarea",
11342
11697
  {
11343
11698
  ref: taRef,
@@ -11358,7 +11713,7 @@ function PromptInput({
11358
11713
  maxLength
11359
11714
  }
11360
11715
  ),
11361
- visibleSuggestions.length > 0 && /* @__PURE__ */ jsx59("ul", { className: "ods-prompt-input__suggestions", role: "listbox", children: visibleSuggestions.map((s, i) => /* @__PURE__ */ jsxs58(
11716
+ visibleSuggestions.length > 0 && /* @__PURE__ */ jsx60("ul", { className: "ods-prompt-input__suggestions", role: "listbox", children: visibleSuggestions.map((s, i) => /* @__PURE__ */ jsxs58(
11362
11717
  "li",
11363
11718
  {
11364
11719
  role: "option",
@@ -11376,10 +11731,10 @@ function PromptInput({
11376
11731
  },
11377
11732
  onMouseEnter: () => setSuggestionIndex(i),
11378
11733
  children: [
11379
- s.icon && /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__suggestion-icon", children: s.icon }),
11734
+ s.icon && /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__suggestion-icon", children: s.icon }),
11380
11735
  /* @__PURE__ */ jsxs58("span", { className: "ods-prompt-input__suggestion-text", children: [
11381
- /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__suggestion-label", children: s.label }),
11382
- s.description && /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__suggestion-desc", children: s.description })
11736
+ /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__suggestion-label", children: s.label }),
11737
+ s.description && /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__suggestion-desc", children: s.description })
11383
11738
  ] })
11384
11739
  ]
11385
11740
  },
@@ -11387,9 +11742,9 @@ function PromptInput({
11387
11742
  )) })
11388
11743
  ] }),
11389
11744
  /* @__PURE__ */ jsxs58("div", { className: "ods-prompt-input__toolbar", children: [
11390
- /* @__PURE__ */ jsx59("div", { className: "ods-prompt-input__toolbar-left", children: leftActions }),
11745
+ /* @__PURE__ */ jsx60("div", { className: "ods-prompt-input__toolbar-left", children: leftActions }),
11391
11746
  /* @__PURE__ */ jsxs58("div", { className: "ods-prompt-input__toolbar-right", children: [
11392
- showCharCounter && /* @__PURE__ */ jsx59(
11747
+ showCharCounter && /* @__PURE__ */ jsx60(
11393
11748
  "span",
11394
11749
  {
11395
11750
  className: cn(
@@ -11409,10 +11764,10 @@ function PromptInput({
11409
11764
  "aria-label": "Stop generating",
11410
11765
  children: [
11411
11766
  STOP_GLYPH,
11412
- /* @__PURE__ */ jsx59("span", { children: "Stop" })
11767
+ /* @__PURE__ */ jsx60("span", { children: "Stop" })
11413
11768
  ]
11414
11769
  }
11415
- ) : showSend && /* @__PURE__ */ jsx59(
11770
+ ) : showSend && /* @__PURE__ */ jsx60(
11416
11771
  "button",
11417
11772
  {
11418
11773
  type: "button",
@@ -11428,7 +11783,7 @@ function PromptInput({
11428
11783
  )
11429
11784
  ] })
11430
11785
  ] }),
11431
- quickActions && quickActions.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ods-prompt-input__quick-actions", role: "toolbar", "aria-label": "Quick prompts", children: quickActions.map((q2) => /* @__PURE__ */ jsxs58(
11786
+ quickActions && quickActions.length > 0 && /* @__PURE__ */ jsx60("div", { className: "ods-prompt-input__quick-actions", role: "toolbar", "aria-label": "Quick prompts", children: quickActions.map((q2) => /* @__PURE__ */ jsxs58(
11432
11787
  "button",
11433
11788
  {
11434
11789
  type: "button",
@@ -11439,20 +11794,20 @@ function PromptInput({
11439
11794
  requestAnimationFrame(() => taRef.current?.focus());
11440
11795
  },
11441
11796
  children: [
11442
- q2.icon && /* @__PURE__ */ jsx59("span", { className: "ods-prompt-input__quick-action-icon", children: q2.icon }),
11443
- /* @__PURE__ */ jsx59("span", { children: q2.label })
11797
+ q2.icon && /* @__PURE__ */ jsx60("span", { className: "ods-prompt-input__quick-action-icon", children: q2.icon }),
11798
+ /* @__PURE__ */ jsx60("span", { children: q2.label })
11444
11799
  ]
11445
11800
  },
11446
11801
  q2.id
11447
11802
  )) }),
11448
- hint && /* @__PURE__ */ jsx59("div", { className: "ods-prompt-input__hint", children: hint })
11803
+ hint && /* @__PURE__ */ jsx60("div", { className: "ods-prompt-input__hint", children: hint })
11449
11804
  ]
11450
11805
  }
11451
11806
  );
11452
11807
  }
11453
11808
 
11454
11809
  // src/components/Quote/Quote.tsx
11455
- import { jsx as jsx60, jsxs as jsxs59 } from "react/jsx-runtime";
11810
+ import { jsx as jsx61, jsxs as jsxs59 } from "react/jsx-runtime";
11456
11811
  function Quote({
11457
11812
  variant = "default",
11458
11813
  author,
@@ -11466,11 +11821,11 @@ function Quote({
11466
11821
  {
11467
11822
  className: cn("ods-quote", `ods-quote--${variant}`, `ods-quote--${size}`, className),
11468
11823
  children: [
11469
- /* @__PURE__ */ jsx60("span", { className: "ods-quote__mark", "aria-hidden": "true", children: '"' }),
11470
- /* @__PURE__ */ jsx60("p", { className: "ods-quote__text", children }),
11824
+ /* @__PURE__ */ jsx61("span", { className: "ods-quote__mark", "aria-hidden": "true", children: '"' }),
11825
+ /* @__PURE__ */ jsx61("p", { className: "ods-quote__text", children }),
11471
11826
  (author || attribution) && /* @__PURE__ */ jsxs59("footer", { className: "ods-quote__footer", children: [
11472
- author && /* @__PURE__ */ jsx60("cite", { className: "ods-quote__author", children: author }),
11473
- attribution && /* @__PURE__ */ jsx60("span", { className: "ods-quote__attribution", children: attribution })
11827
+ author && /* @__PURE__ */ jsx61("cite", { className: "ods-quote__author", children: author }),
11828
+ attribution && /* @__PURE__ */ jsx61("span", { className: "ods-quote__attribution", children: attribution })
11474
11829
  ] })
11475
11830
  ]
11476
11831
  }
@@ -11478,13 +11833,13 @@ function Quote({
11478
11833
  }
11479
11834
 
11480
11835
  // src/components/Radio/Radio.tsx
11481
- import { useRef as useRef26 } from "react";
11836
+ import { useRef as useRef28 } from "react";
11482
11837
  import { useRadio } from "react-aria";
11483
11838
 
11484
11839
  // src/components/Radio/RadioGroup.tsx
11485
- import { createContext, useContext, useRef as useRef25 } from "react";
11840
+ import { createContext, useContext, useRef as useRef27 } from "react";
11486
11841
  import { useRadioGroup } from "react-aria";
11487
- import { jsx as jsx61, jsxs as jsxs60 } from "react/jsx-runtime";
11842
+ import { jsx as jsx62, jsxs as jsxs60 } from "react/jsx-runtime";
11488
11843
  var RadioGroupContext = createContext(null);
11489
11844
  function useRadioGroupContext() {
11490
11845
  const context = useContext(RadioGroupContext);
@@ -11523,7 +11878,7 @@ function RadioGroup({
11523
11878
  "aria-describedby": ariaDescribedBy
11524
11879
  };
11525
11880
  const state = $384704861d32dbed$export$bca9d026f8e704eb(ariaProps);
11526
- const ref = useRef25(null);
11881
+ const ref = useRef27(null);
11527
11882
  const { radioGroupProps, labelProps } = useRadioGroup(ariaProps, state);
11528
11883
  return /* @__PURE__ */ jsxs60(
11529
11884
  "div",
@@ -11538,18 +11893,18 @@ function RadioGroup({
11538
11893
  className
11539
11894
  ),
11540
11895
  children: [
11541
- label && /* @__PURE__ */ jsx61("span", { ...labelProps, className: "ods-radio-group__label", children: label }),
11542
- /* @__PURE__ */ jsx61(RadioGroupContext.Provider, { value: state, children: /* @__PURE__ */ jsx61("div", { className: "ods-radio-group__items", children }) })
11896
+ label && /* @__PURE__ */ jsx62("span", { ...labelProps, className: "ods-radio-group__label", children: label }),
11897
+ /* @__PURE__ */ jsx62(RadioGroupContext.Provider, { value: state, children: /* @__PURE__ */ jsx62("div", { className: "ods-radio-group__items", children }) })
11543
11898
  ]
11544
11899
  }
11545
11900
  );
11546
11901
  }
11547
11902
 
11548
11903
  // src/components/Radio/Radio.tsx
11549
- import { jsx as jsx62, jsxs as jsxs61 } from "react/jsx-runtime";
11904
+ import { jsx as jsx63, jsxs as jsxs61 } from "react/jsx-runtime";
11550
11905
  function Radio({ value, label, disabled = false, className, ...props }) {
11551
11906
  const state = useRadioGroupContext();
11552
- const ref = useRef26(null);
11907
+ const ref = useRef28(null);
11553
11908
  const ariaNameProps = resolveAccessibleName({
11554
11909
  label,
11555
11910
  ariaLabel: props["aria-label"],
@@ -11585,7 +11940,7 @@ function Radio({ value, label, disabled = false, className, ...props }) {
11585
11940
  className
11586
11941
  ),
11587
11942
  children: [
11588
- /* @__PURE__ */ jsx62(
11943
+ /* @__PURE__ */ jsx63(
11589
11944
  "input",
11590
11945
  {
11591
11946
  ...passthroughProps,
@@ -11594,15 +11949,15 @@ function Radio({ value, label, disabled = false, className, ...props }) {
11594
11949
  className: "ods-radio__input"
11595
11950
  }
11596
11951
  ),
11597
- /* @__PURE__ */ jsx62("div", { className: "ods-radio__circle", "aria-hidden": "true", children: /* @__PURE__ */ jsx62("div", { className: cn("ods-radio__dot", isSelected && "ods-radio__dot--visible") }) }),
11598
- label && /* @__PURE__ */ jsx62("span", { className: "ods-radio__label", children: label })
11952
+ /* @__PURE__ */ jsx63("div", { className: "ods-radio__circle", "aria-hidden": "true", children: /* @__PURE__ */ jsx63("div", { className: cn("ods-radio__dot", isSelected && "ods-radio__dot--visible") }) }),
11953
+ label && /* @__PURE__ */ jsx63("span", { className: "ods-radio__label", children: label })
11599
11954
  ]
11600
11955
  }
11601
11956
  );
11602
11957
  }
11603
11958
 
11604
11959
  // src/components/RangeSlider/RangeSlider.tsx
11605
- import { jsx as jsx63, jsxs as jsxs62 } from "react/jsx-runtime";
11960
+ import { jsx as jsx64, jsxs as jsxs62 } from "react/jsx-runtime";
11606
11961
  function RangeSlider({
11607
11962
  label,
11608
11963
  value,
@@ -11640,7 +11995,7 @@ function RangeSlider({
11640
11995
  ),
11641
11996
  children: [
11642
11997
  (label || showValue) && /* @__PURE__ */ jsxs62("div", { className: "ods-range-slider__head", children: [
11643
- label && /* @__PURE__ */ jsx63("span", { className: "ods-range-slider__label", children: label }),
11998
+ label && /* @__PURE__ */ jsx64("span", { className: "ods-range-slider__label", children: label }),
11644
11999
  showValue && /* @__PURE__ */ jsxs62("span", { className: "ods-range-slider__value", children: [
11645
12000
  fmt(lo),
11646
12001
  " \u2013 ",
@@ -11648,14 +12003,14 @@ function RangeSlider({
11648
12003
  ] })
11649
12004
  ] }),
11650
12005
  /* @__PURE__ */ jsxs62("div", { className: "ods-range-slider__track", children: [
11651
- /* @__PURE__ */ jsx63(
12006
+ /* @__PURE__ */ jsx64(
11652
12007
  "span",
11653
12008
  {
11654
12009
  className: "ods-range-slider__fill",
11655
12010
  style: { left: `${loPct}%`, right: `${100 - hiPct}%` }
11656
12011
  }
11657
12012
  ),
11658
- /* @__PURE__ */ jsx63(
12013
+ /* @__PURE__ */ jsx64(
11659
12014
  "input",
11660
12015
  {
11661
12016
  type: "range",
@@ -11669,7 +12024,7 @@ function RangeSlider({
11669
12024
  "aria-label": "Minimum"
11670
12025
  }
11671
12026
  ),
11672
- /* @__PURE__ */ jsx63(
12027
+ /* @__PURE__ */ jsx64(
11673
12028
  "input",
11674
12029
  {
11675
12030
  type: "range",
@@ -11690,16 +12045,16 @@ function RangeSlider({
11690
12045
  }
11691
12046
 
11692
12047
  // src/components/Rating/Rating.tsx
11693
- import { useState as useState22 } from "react";
11694
- import { jsx as jsx64, jsxs as jsxs63 } from "react/jsx-runtime";
12048
+ import { useState as useState24 } from "react";
12049
+ import { jsx as jsx65, jsxs as jsxs63 } from "react/jsx-runtime";
11695
12050
  function StarIcon({ fill }) {
11696
12051
  const pathId = `r-${Math.random().toString(36).slice(2)}`;
11697
12052
  return /* @__PURE__ */ jsxs63("svg", { width: "22", height: "22", viewBox: "0 0 22 22", fill: "none", "aria-hidden": "true", children: [
11698
- /* @__PURE__ */ jsx64("defs", { children: /* @__PURE__ */ jsxs63("linearGradient", { id: pathId, x1: "0", x2: "1", y1: "0", y2: "0", children: [
11699
- /* @__PURE__ */ jsx64("stop", { offset: `${fill * 100}%`, stopColor: "#f59e0b" }),
11700
- /* @__PURE__ */ jsx64("stop", { offset: `${fill * 100}%`, stopColor: "#e1e5eb" })
12053
+ /* @__PURE__ */ jsx65("defs", { children: /* @__PURE__ */ jsxs63("linearGradient", { id: pathId, x1: "0", x2: "1", y1: "0", y2: "0", children: [
12054
+ /* @__PURE__ */ jsx65("stop", { offset: `${fill * 100}%`, stopColor: "#f59e0b" }),
12055
+ /* @__PURE__ */ jsx65("stop", { offset: `${fill * 100}%`, stopColor: "#e1e5eb" })
11701
12056
  ] }) }),
11702
- /* @__PURE__ */ jsx64(
12057
+ /* @__PURE__ */ jsx65(
11703
12058
  "path",
11704
12059
  {
11705
12060
  d: "M11 2l2.6 5.4 6 .9-4.3 4.2 1 6-5.3-2.8-5.3 2.8 1-6L2 8.3l6-.9L11 2z",
@@ -11714,11 +12069,11 @@ function StarIcon({ fill }) {
11714
12069
  function HeartIcon({ fill }) {
11715
12070
  const pathId = `h-${Math.random().toString(36).slice(2)}`;
11716
12071
  return /* @__PURE__ */ jsxs63("svg", { width: "22", height: "22", viewBox: "0 0 22 22", fill: "none", "aria-hidden": "true", children: [
11717
- /* @__PURE__ */ jsx64("defs", { children: /* @__PURE__ */ jsxs63("linearGradient", { id: pathId, x1: "0", x2: "1", y1: "0", y2: "0", children: [
11718
- /* @__PURE__ */ jsx64("stop", { offset: `${fill * 100}%`, stopColor: "#ec4899" }),
11719
- /* @__PURE__ */ jsx64("stop", { offset: `${fill * 100}%`, stopColor: "#e1e5eb" })
12072
+ /* @__PURE__ */ jsx65("defs", { children: /* @__PURE__ */ jsxs63("linearGradient", { id: pathId, x1: "0", x2: "1", y1: "0", y2: "0", children: [
12073
+ /* @__PURE__ */ jsx65("stop", { offset: `${fill * 100}%`, stopColor: "#ec4899" }),
12074
+ /* @__PURE__ */ jsx65("stop", { offset: `${fill * 100}%`, stopColor: "#e1e5eb" })
11720
12075
  ] }) }),
11721
- /* @__PURE__ */ jsx64(
12076
+ /* @__PURE__ */ jsx65(
11722
12077
  "path",
11723
12078
  {
11724
12079
  d: "M11 18s-6-4-6-8.5A3.5 3.5 0 0 1 11 6a3.5 3.5 0 0 1 6 3.5c0 4.5-6 8.5-6 8.5z",
@@ -11743,7 +12098,7 @@ function Rating({
11743
12098
  icon = "star",
11744
12099
  className
11745
12100
  }) {
11746
- const [hover, setHover] = useState22(null);
12101
+ const [hover, setHover] = useState24(null);
11747
12102
  const display = hover ?? value;
11748
12103
  const interactive = !readOnly && !disabled;
11749
12104
  const Icon = icon === "heart" ? HeartIcon : StarIcon;
@@ -11777,7 +12132,7 @@ function Rating({
11777
12132
  onMouseLeave: () => setHover(null),
11778
12133
  className: "ods-rating__item",
11779
12134
  children: [
11780
- /* @__PURE__ */ jsx64(
12135
+ /* @__PURE__ */ jsx65(
11781
12136
  "span",
11782
12137
  {
11783
12138
  className: "ods-rating__half ods-rating__half--left",
@@ -11785,7 +12140,7 @@ function Rating({
11785
12140
  onClick: () => click(i, allowHalf)
11786
12141
  }
11787
12142
  ),
11788
- /* @__PURE__ */ jsx64(
12143
+ /* @__PURE__ */ jsx65(
11789
12144
  "span",
11790
12145
  {
11791
12146
  className: "ods-rating__half ods-rating__half--right",
@@ -11793,13 +12148,13 @@ function Rating({
11793
12148
  onClick: () => click(i, false)
11794
12149
  }
11795
12150
  ),
11796
- /* @__PURE__ */ jsx64(Icon, { fill })
12151
+ /* @__PURE__ */ jsx65(Icon, { fill })
11797
12152
  ]
11798
12153
  },
11799
12154
  i
11800
12155
  );
11801
12156
  }),
11802
- showLabel && /* @__PURE__ */ jsx64("span", { className: "ods-rating__label", children: typeof label === "string" || label ? label : `${value.toFixed(allowHalf ? 1 : 0)}/${max}` })
12157
+ showLabel && /* @__PURE__ */ jsx65("span", { className: "ods-rating__label", children: typeof label === "string" || label ? label : `${value.toFixed(allowHalf ? 1 : 0)}/${max}` })
11803
12158
  ]
11804
12159
  }
11805
12160
  );
@@ -11808,11 +12163,11 @@ function Rating({
11808
12163
  // src/components/Resizable/Resizable.tsx
11809
12164
  import {
11810
12165
  useCallback as useCallback16,
11811
- useEffect as useEffect15,
11812
- useRef as useRef27,
11813
- useState as useState23
12166
+ useEffect as useEffect17,
12167
+ useRef as useRef29,
12168
+ useState as useState25
11814
12169
  } from "react";
11815
- import { jsx as jsx65, jsxs as jsxs64 } from "react/jsx-runtime";
12170
+ import { jsx as jsx66, jsxs as jsxs64 } from "react/jsx-runtime";
11816
12171
  function Resizable({
11817
12172
  direction = "horizontal",
11818
12173
  children,
@@ -11826,8 +12181,8 @@ function Resizable({
11826
12181
  className,
11827
12182
  ariaLabel = "Resize panels"
11828
12183
  }) {
11829
- const wrapRef = useRef27(null);
11830
- const [internalSplit, setInternalSplit] = useState23(() => {
12184
+ const wrapRef = useRef29(null);
12185
+ const [internalSplit, setInternalSplit] = useState25(() => {
11831
12186
  if (typeof window === "undefined" || !storageKey) return null;
11832
12187
  const stored = window.localStorage.getItem(storageKey);
11833
12188
  if (stored != null) {
@@ -11836,20 +12191,20 @@ function Resizable({
11836
12191
  }
11837
12192
  return null;
11838
12193
  });
11839
- const draggingRef = useRef27(false);
11840
- const [isDragging, setDragging] = useState23(false);
12194
+ const draggingRef = useRef29(false);
12195
+ const [isDragging, setDragging] = useState25(false);
11841
12196
  const computeFromDefault = useCallback16(() => {
11842
12197
  const el = wrapRef.current;
11843
12198
  if (!el) return 240;
11844
12199
  const total = direction === "horizontal" ? el.offsetWidth : el.offsetHeight;
11845
12200
  return defaultSplit > 0 && defaultSplit < 1 ? total * defaultSplit : defaultSplit;
11846
12201
  }, [direction, defaultSplit]);
11847
- const [split, setSplit] = useState23(() => {
12202
+ const [split, setSplit] = useState25(() => {
11848
12203
  if (splitProp != null) return splitProp;
11849
12204
  if (internalSplit != null) return internalSplit;
11850
12205
  return defaultSplit > 0 && defaultSplit < 1 ? 0 : defaultSplit;
11851
12206
  });
11852
- useEffect15(() => {
12207
+ useEffect17(() => {
11853
12208
  if (splitProp != null) {
11854
12209
  setSplit(splitProp);
11855
12210
  return;
@@ -11882,7 +12237,7 @@ function Resizable({
11882
12237
  draggingRef.current = true;
11883
12238
  setDragging(true);
11884
12239
  };
11885
- useEffect15(() => {
12240
+ useEffect17(() => {
11886
12241
  const onMove = (e) => {
11887
12242
  if (!draggingRef.current) return;
11888
12243
  const el = wrapRef.current;
@@ -11941,7 +12296,7 @@ function Resizable({
11941
12296
  ),
11942
12297
  style,
11943
12298
  children: [
11944
- /* @__PURE__ */ jsx65(
12299
+ /* @__PURE__ */ jsx66(
11945
12300
  "div",
11946
12301
  {
11947
12302
  className: "ods-resizable__panel ods-resizable__panel--first",
@@ -11949,7 +12304,7 @@ function Resizable({
11949
12304
  children: children[0]
11950
12305
  }
11951
12306
  ),
11952
- /* @__PURE__ */ jsx65(
12307
+ /* @__PURE__ */ jsx66(
11953
12308
  "div",
11954
12309
  {
11955
12310
  role: "separator",
@@ -11961,10 +12316,10 @@ function Resizable({
11961
12316
  className: "ods-resizable__handle",
11962
12317
  onMouseDown,
11963
12318
  onKeyDown,
11964
- children: /* @__PURE__ */ jsx65("span", { className: "ods-resizable__grip", "aria-hidden": "true" })
12319
+ children: /* @__PURE__ */ jsx66("span", { className: "ods-resizable__grip", "aria-hidden": "true" })
11965
12320
  }
11966
12321
  ),
11967
- /* @__PURE__ */ jsx65("div", { className: "ods-resizable__panel ods-resizable__panel--second", children: children[1] })
12322
+ /* @__PURE__ */ jsx66("div", { className: "ods-resizable__panel ods-resizable__panel--second", children: children[1] })
11968
12323
  ]
11969
12324
  }
11970
12325
  );
@@ -11978,18 +12333,18 @@ function ResizablePanel({
11978
12333
  children,
11979
12334
  className
11980
12335
  }) {
11981
- const [internal, setInternal] = useState23(sizeProp ?? defaultSize);
12336
+ const [internal, setInternal] = useState25(sizeProp ?? defaultSize);
11982
12337
  const size = sizeProp ?? internal;
11983
- const draggingRef = useRef27(false);
11984
- const [isDragging, setDragging] = useState23(false);
11985
- const startRef = useRef27({ x: 0, size });
12338
+ const draggingRef = useRef29(false);
12339
+ const [isDragging, setDragging] = useState25(false);
12340
+ const startRef = useRef29({ x: 0, size });
11986
12341
  const onMouseDown = (e) => {
11987
12342
  e.preventDefault();
11988
12343
  draggingRef.current = true;
11989
12344
  setDragging(true);
11990
12345
  startRef.current = { x: e.clientX, size };
11991
12346
  };
11992
- useEffect15(() => {
12347
+ useEffect17(() => {
11993
12348
  const onMove = (e) => {
11994
12349
  if (!draggingRef.current) return;
11995
12350
  const dx = e.clientX - startRef.current.x;
@@ -12018,8 +12373,8 @@ function ResizablePanel({
12018
12373
  ),
12019
12374
  style: { width: size },
12020
12375
  children: [
12021
- /* @__PURE__ */ jsx65("div", { className: "ods-resizable-panel__content", children }),
12022
- /* @__PURE__ */ jsx65(
12376
+ /* @__PURE__ */ jsx66("div", { className: "ods-resizable-panel__content", children }),
12377
+ /* @__PURE__ */ jsx66(
12023
12378
  "div",
12024
12379
  {
12025
12380
  role: "separator",
@@ -12027,7 +12382,7 @@ function ResizablePanel({
12027
12382
  "aria-label": "Resize panel",
12028
12383
  className: "ods-resizable-panel__handle",
12029
12384
  onMouseDown,
12030
- children: /* @__PURE__ */ jsx65("span", { className: "ods-resizable-panel__grip", "aria-hidden": "true" })
12385
+ children: /* @__PURE__ */ jsx66("span", { className: "ods-resizable-panel__grip", "aria-hidden": "true" })
12031
12386
  }
12032
12387
  )
12033
12388
  ]
@@ -12036,7 +12391,7 @@ function ResizablePanel({
12036
12391
  }
12037
12392
 
12038
12393
  // src/components/Ribbon/Ribbon.tsx
12039
- import { jsx as jsx66, jsxs as jsxs65 } from "react/jsx-runtime";
12394
+ import { jsx as jsx67, jsxs as jsxs65 } from "react/jsx-runtime";
12040
12395
  function Ribbon({
12041
12396
  variant = "primary",
12042
12397
  icon,
@@ -12045,13 +12400,13 @@ function Ribbon({
12045
12400
  className
12046
12401
  }) {
12047
12402
  return /* @__PURE__ */ jsxs65("span", { className: cn("ods-ribbon", `ods-ribbon--${variant}`, `ods-ribbon--${size}`, className), children: [
12048
- icon && /* @__PURE__ */ jsx66("span", { className: "ods-ribbon__icon", "aria-hidden": "true", children: icon }),
12049
- /* @__PURE__ */ jsx66("span", { className: "ods-ribbon__label", children })
12403
+ icon && /* @__PURE__ */ jsx67("span", { className: "ods-ribbon__icon", "aria-hidden": "true", children: icon }),
12404
+ /* @__PURE__ */ jsx67("span", { className: "ods-ribbon__label", children })
12050
12405
  ] });
12051
12406
  }
12052
12407
 
12053
12408
  // src/components/SettingsRow/SettingsRow.tsx
12054
- import { jsx as jsx67, jsxs as jsxs66 } from "react/jsx-runtime";
12409
+ import { jsx as jsx68, jsxs as jsxs66 } from "react/jsx-runtime";
12055
12410
  function SettingsRow({
12056
12411
  title,
12057
12412
  description,
@@ -12061,20 +12416,20 @@ function SettingsRow({
12061
12416
  className
12062
12417
  }) {
12063
12418
  return /* @__PURE__ */ jsxs66("div", { className: cn("ods-settings-row", `ods-settings-row--${align}`, className), children: [
12064
- icon && /* @__PURE__ */ jsx67("span", { className: "ods-settings-row__icon", "aria-hidden": "true", children: icon }),
12419
+ icon && /* @__PURE__ */ jsx68("span", { className: "ods-settings-row__icon", "aria-hidden": "true", children: icon }),
12065
12420
  /* @__PURE__ */ jsxs66("div", { className: "ods-settings-row__body", children: [
12066
- /* @__PURE__ */ jsx67("div", { className: "ods-settings-row__title", children: title }),
12067
- description && /* @__PURE__ */ jsx67("div", { className: "ods-settings-row__desc", children: description })
12421
+ /* @__PURE__ */ jsx68("div", { className: "ods-settings-row__title", children: title }),
12422
+ description && /* @__PURE__ */ jsx68("div", { className: "ods-settings-row__desc", children: description })
12068
12423
  ] }),
12069
- control && /* @__PURE__ */ jsx67("div", { className: "ods-settings-row__control", children: control })
12424
+ control && /* @__PURE__ */ jsx68("div", { className: "ods-settings-row__control", children: control })
12070
12425
  ] });
12071
12426
  }
12072
12427
 
12073
12428
  // src/components/Sheet/Sheet.tsx
12074
12429
  import { AnimatePresence as AnimatePresence7, motion as motion10 } from "framer-motion";
12075
- import { useEffect as useEffect16 } from "react";
12430
+ import { useEffect as useEffect18 } from "react";
12076
12431
  import { createPortal as createPortal8 } from "react-dom";
12077
- import { Fragment as Fragment16, jsx as jsx68, jsxs as jsxs67 } from "react/jsx-runtime";
12432
+ import { Fragment as Fragment17, jsx as jsx69, jsxs as jsxs67 } from "react/jsx-runtime";
12078
12433
  var slideVariants = {
12079
12434
  top: { initial: { y: "-100%" }, animate: { y: 0 }, exit: { y: "-100%" } },
12080
12435
  bottom: { initial: { y: "100%" }, animate: { y: 0 }, exit: { y: "100%" } },
@@ -12107,7 +12462,7 @@ function Sheet({
12107
12462
  dragHandle = true,
12108
12463
  className
12109
12464
  }) {
12110
- useEffect16(() => {
12465
+ useEffect18(() => {
12111
12466
  if (!open || !closeOnEsc) return;
12112
12467
  const onKey = (e) => {
12113
12468
  if (e.key === "Escape") onClose();
@@ -12118,8 +12473,8 @@ function Sheet({
12118
12473
  const variant = slideVariants[side];
12119
12474
  const resolved = resolveSize(side, size);
12120
12475
  const isVertical = side === "left" || side === "right";
12121
- const content = /* @__PURE__ */ jsx68(AnimatePresence7, { children: open && /* @__PURE__ */ jsxs67(Fragment16, { children: [
12122
- /* @__PURE__ */ jsx68(
12476
+ const content = /* @__PURE__ */ jsx69(AnimatePresence7, { children: open && /* @__PURE__ */ jsxs67(Fragment17, { children: [
12477
+ /* @__PURE__ */ jsx69(
12123
12478
  motion10.div,
12124
12479
  {
12125
12480
  className: "ods-sheet__backdrop",
@@ -12143,13 +12498,13 @@ function Sheet({
12143
12498
  exit: variant.exit,
12144
12499
  transition: { type: "tween", ease: [0.32, 0.72, 0, 1], duration: 0.28 },
12145
12500
  children: [
12146
- (side === "bottom" || side === "top") && dragHandle && /* @__PURE__ */ jsx68("div", { className: "ods-sheet__handle", "aria-hidden": "true" }),
12501
+ (side === "bottom" || side === "top") && dragHandle && /* @__PURE__ */ jsx69("div", { className: "ods-sheet__handle", "aria-hidden": "true" }),
12147
12502
  (title || description) && /* @__PURE__ */ jsxs67("header", { className: "ods-sheet__head", children: [
12148
- title && /* @__PURE__ */ jsx68("h2", { className: "ods-sheet__title", children: title }),
12149
- description && /* @__PURE__ */ jsx68("p", { className: "ods-sheet__desc", children: description })
12503
+ title && /* @__PURE__ */ jsx69("h2", { className: "ods-sheet__title", children: title }),
12504
+ description && /* @__PURE__ */ jsx69("p", { className: "ods-sheet__desc", children: description })
12150
12505
  ] }),
12151
- /* @__PURE__ */ jsx68("div", { className: "ods-sheet__body", children }),
12152
- footer && /* @__PURE__ */ jsx68("footer", { className: "ods-sheet__footer", children: footer })
12506
+ /* @__PURE__ */ jsx69("div", { className: "ods-sheet__body", children }),
12507
+ footer && /* @__PURE__ */ jsx69("footer", { className: "ods-sheet__footer", children: footer })
12153
12508
  ]
12154
12509
  }
12155
12510
  )
@@ -12159,8 +12514,8 @@ function Sheet({
12159
12514
  }
12160
12515
 
12161
12516
  // src/components/Sidebar/Sidebar.tsx
12162
- import { useCallback as useCallback17, useEffect as useEffect17, useRef as useRef28, useState as useState24 } from "react";
12163
- import { Fragment as Fragment17, jsx as jsx69, jsxs as jsxs68 } from "react/jsx-runtime";
12517
+ import { useCallback as useCallback17, useEffect as useEffect19, useRef as useRef30, useState as useState26 } from "react";
12518
+ import { Fragment as Fragment18, jsx as jsx70, jsxs as jsxs68 } from "react/jsx-runtime";
12164
12519
  function Sidebar({
12165
12520
  variant = "expanded",
12166
12521
  brand,
@@ -12181,8 +12536,8 @@ function Sidebar({
12181
12536
  className
12182
12537
  }) {
12183
12538
  const allSections = sections ?? (items ? [{ items }] : []);
12184
- const [internalPinned, setInternalPinned] = useState24(defaultPinned);
12185
- useEffect17(() => {
12539
+ const [internalPinned, setInternalPinned] = useState26(defaultPinned);
12540
+ useEffect19(() => {
12186
12541
  if (pinnedProp !== void 0) return;
12187
12542
  try {
12188
12543
  const stored = window.localStorage.getItem(pinStorageKey);
@@ -12204,9 +12559,9 @@ function Sidebar({
12204
12559
  },
12205
12560
  [pinnedProp, pinStorageKey, onPinnedChange]
12206
12561
  );
12207
- const [hoverOpen, setHoverOpen] = useState24(false);
12208
- const openTimer = useRef28(null);
12209
- const closeTimer = useRef28(null);
12562
+ const [hoverOpen, setHoverOpen] = useState26(false);
12563
+ const openTimer = useRef30(null);
12564
+ const closeTimer = useRef30(null);
12210
12565
  const clearTimers = () => {
12211
12566
  if (openTimer.current) {
12212
12567
  clearTimeout(openTimer.current);
@@ -12217,7 +12572,7 @@ function Sidebar({
12217
12572
  closeTimer.current = null;
12218
12573
  }
12219
12574
  };
12220
- useEffect17(() => () => clearTimers(), []);
12575
+ useEffect19(() => () => clearTimers(), []);
12221
12576
  const handleEnter = () => {
12222
12577
  clearTimers();
12223
12578
  openTimer.current = setTimeout(() => setHoverOpen(true), hoverOpenDelay);
@@ -12229,7 +12584,7 @@ function Sidebar({
12229
12584
  const autoMode = variant === "auto";
12230
12585
  const showAsRail = autoMode ? !pinned : variant === "rail";
12231
12586
  const overlayOpen = autoMode && !pinned && hoverOpen;
12232
- useEffect17(() => {
12587
+ useEffect19(() => {
12233
12588
  if (!overlayOpen) return;
12234
12589
  const handler = (e) => {
12235
12590
  if (e.key === "Escape") {
@@ -12255,7 +12610,7 @@ function Sidebar({
12255
12610
  onMouseEnter: autoMode && !pinned ? handleEnter : void 0,
12256
12611
  onMouseLeave: autoMode && !pinned ? handleLeave : void 0,
12257
12612
  children: [
12258
- showAsRail ? /* @__PURE__ */ jsx69(
12613
+ showAsRail ? /* @__PURE__ */ jsx70(
12259
12614
  RailLayout,
12260
12615
  {
12261
12616
  logo,
@@ -12266,7 +12621,7 @@ function Sidebar({
12266
12621
  tooltipDelay,
12267
12622
  suppressTooltips: overlayOpen
12268
12623
  }
12269
- ) : /* @__PURE__ */ jsx69(
12624
+ ) : /* @__PURE__ */ jsx70(
12270
12625
  ExpandedLayout,
12271
12626
  {
12272
12627
  logo,
@@ -12279,7 +12634,7 @@ function Sidebar({
12279
12634
  onPinToggle: autoMode ? () => setPinned(!pinned) : void 0
12280
12635
  }
12281
12636
  ),
12282
- overlayOpen && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__overlay", onMouseEnter: handleEnter, onMouseLeave: handleLeave, children: /* @__PURE__ */ jsx69(
12637
+ overlayOpen && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__overlay", onMouseEnter: handleEnter, onMouseLeave: handleLeave, children: /* @__PURE__ */ jsx70(
12283
12638
  ExpandedLayout,
12284
12639
  {
12285
12640
  logo,
@@ -12305,16 +12660,16 @@ function RailLayout({
12305
12660
  tooltipDelay,
12306
12661
  suppressTooltips
12307
12662
  }) {
12308
- return /* @__PURE__ */ jsxs68(Fragment17, { children: [
12309
- logo && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__logo-rail", children: logo }),
12310
- onToggle && /* @__PURE__ */ jsx69(
12663
+ return /* @__PURE__ */ jsxs68(Fragment18, { children: [
12664
+ logo && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__logo-rail", children: logo }),
12665
+ onToggle && /* @__PURE__ */ jsx70(
12311
12666
  "button",
12312
12667
  {
12313
12668
  type: "button",
12314
12669
  className: "ods-sidebar__expand-rail",
12315
12670
  onClick: onToggle,
12316
12671
  "aria-label": "Expand sidebar",
12317
- children: /* @__PURE__ */ jsx69("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx69(
12672
+ children: /* @__PURE__ */ jsx70("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx70(
12318
12673
  "path",
12319
12674
  {
12320
12675
  d: "M13 3v10M5 5l3 3-3 3",
@@ -12326,7 +12681,7 @@ function RailLayout({
12326
12681
  ) })
12327
12682
  }
12328
12683
  ),
12329
- /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__nav-rail", children: sections.flatMap((s) => s.items).map((item) => /* @__PURE__ */ jsx69(
12684
+ /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__nav-rail", children: sections.flatMap((s) => s.items).map((item) => /* @__PURE__ */ jsx70(
12330
12685
  RailItem,
12331
12686
  {
12332
12687
  item,
@@ -12335,8 +12690,8 @@ function RailLayout({
12335
12690
  },
12336
12691
  item.id
12337
12692
  )) }),
12338
- /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__spacer" }),
12339
- footerItems && footerItems.length > 0 && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__footer-rail", children: footerItems.map((item) => /* @__PURE__ */ jsx69(
12693
+ /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__spacer" }),
12694
+ footerItems && footerItems.length > 0 && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__footer-rail", children: footerItems.map((item) => /* @__PURE__ */ jsx70(
12340
12695
  RailItem,
12341
12696
  {
12342
12697
  item,
@@ -12345,14 +12700,14 @@ function RailLayout({
12345
12700
  },
12346
12701
  item.id
12347
12702
  )) }),
12348
- user && /* @__PURE__ */ jsx69(SidebarUserRail, { user })
12703
+ user && /* @__PURE__ */ jsx70(SidebarUserRail, { user })
12349
12704
  ] });
12350
12705
  }
12351
12706
  function SidebarUserRail({ user }) {
12352
12707
  const labelText = typeof user.name === "string" ? user.name : "User";
12353
- const avatar = user.avatar ?? /* @__PURE__ */ jsx69("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") });
12708
+ const avatar = user.avatar ?? /* @__PURE__ */ jsx70("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") });
12354
12709
  if (user.menu && user.menu.length > 0) {
12355
- return /* @__PURE__ */ jsx69(
12710
+ return /* @__PURE__ */ jsx70(
12356
12711
  DropdownMenu,
12357
12712
  {
12358
12713
  trigger: avatar,
@@ -12363,7 +12718,7 @@ function SidebarUserRail({ user }) {
12363
12718
  }
12364
12719
  );
12365
12720
  }
12366
- return /* @__PURE__ */ jsx69(
12721
+ return /* @__PURE__ */ jsx70(
12367
12722
  "button",
12368
12723
  {
12369
12724
  type: "button",
@@ -12379,8 +12734,8 @@ function RailItem({
12379
12734
  tooltipDelay,
12380
12735
  suppressTooltip
12381
12736
  }) {
12382
- const [open, setOpen] = useState24(false);
12383
- const timerRef = useRef28(null);
12737
+ const [open, setOpen] = useState26(false);
12738
+ const timerRef = useRef30(null);
12384
12739
  const hasChildren = !!(item.children && item.children.length > 0);
12385
12740
  const clear = () => {
12386
12741
  if (timerRef.current) {
@@ -12388,7 +12743,7 @@ function RailItem({
12388
12743
  timerRef.current = null;
12389
12744
  }
12390
12745
  };
12391
- useEffect17(() => () => clear(), []);
12746
+ useEffect19(() => () => clear(), []);
12392
12747
  const show = () => {
12393
12748
  if (suppressTooltip) return;
12394
12749
  clear();
@@ -12409,7 +12764,7 @@ function RailItem({
12409
12764
  onFocus: show,
12410
12765
  onBlur: hide,
12411
12766
  children: [
12412
- /* @__PURE__ */ jsx69(
12767
+ /* @__PURE__ */ jsx70(
12413
12768
  Comp,
12414
12769
  {
12415
12770
  type: item.href ? void 0 : "button",
@@ -12424,13 +12779,13 @@ function RailItem({
12424
12779
  "aria-label": labelText,
12425
12780
  "aria-haspopup": hasChildren ? "menu" : void 0,
12426
12781
  "aria-expanded": hasChildren ? open : void 0,
12427
- children: /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-icon", children: item.icon })
12782
+ children: /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-icon", children: item.icon })
12428
12783
  }
12429
12784
  ),
12430
- open && labelText && hasChildren && /* @__PURE__ */ jsx69(RailFlyout, { title: labelText, items: item.children ?? [] }),
12785
+ open && labelText && hasChildren && /* @__PURE__ */ jsx70(RailFlyout, { title: labelText, items: item.children ?? [] }),
12431
12786
  open && labelText && !hasChildren && /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__rail-tooltip", role: "tooltip", children: [
12432
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-tooltip-label", children: labelText }),
12433
- item.shortcut && /* @__PURE__ */ jsx69("kbd", { className: "ods-sidebar__rail-kbd", children: item.shortcut })
12787
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-tooltip-label", children: labelText }),
12788
+ item.shortcut && /* @__PURE__ */ jsx70("kbd", { className: "ods-sidebar__rail-kbd", children: item.shortcut })
12434
12789
  ] })
12435
12790
  ]
12436
12791
  }
@@ -12438,10 +12793,10 @@ function RailItem({
12438
12793
  }
12439
12794
  function RailFlyout({ title, items }) {
12440
12795
  return /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__rail-flyout", role: "menu", children: [
12441
- /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__rail-flyout-header", children: /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-flyout-title", children: title }) }),
12442
- /* @__PURE__ */ jsx69("ul", { className: "ods-sidebar__rail-flyout-list", children: items.map((child) => {
12796
+ /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__rail-flyout-header", children: /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-flyout-title", children: title }) }),
12797
+ /* @__PURE__ */ jsx70("ul", { className: "ods-sidebar__rail-flyout-list", children: items.map((child) => {
12443
12798
  const ChildComp = child.href ? "a" : "button";
12444
- return /* @__PURE__ */ jsx69("li", { children: /* @__PURE__ */ jsxs68(
12799
+ return /* @__PURE__ */ jsx70("li", { children: /* @__PURE__ */ jsxs68(
12445
12800
  ChildComp,
12446
12801
  {
12447
12802
  type: child.href ? void 0 : "button",
@@ -12454,10 +12809,10 @@ function RailFlyout({ title, items }) {
12454
12809
  ),
12455
12810
  "aria-current": child.active ? "page" : void 0,
12456
12811
  children: [
12457
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-flyout-icon", children: child.icon }),
12458
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-flyout-label", children: child.label }),
12459
- child.tag && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-flyout-tag", children: child.tag }),
12460
- child.badge && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__rail-flyout-badge", children: child.badge })
12812
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-flyout-icon", children: child.icon }),
12813
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-flyout-label", children: child.label }),
12814
+ child.tag && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-flyout-tag", children: child.tag }),
12815
+ child.badge && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__rail-flyout-badge", children: child.badge })
12461
12816
  ]
12462
12817
  }
12463
12818
  ) }, child.id);
@@ -12475,21 +12830,21 @@ function ExpandedLayout({
12475
12830
  onPinToggle
12476
12831
  }) {
12477
12832
  const hasFooterControl = Boolean(onPinToggle || onToggle);
12478
- return /* @__PURE__ */ jsxs68(Fragment17, { children: [
12833
+ return /* @__PURE__ */ jsxs68(Fragment18, { children: [
12479
12834
  (logo || brand) && /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__header", children: [
12480
- logo && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__logo", children: logo }),
12835
+ logo && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__logo", children: logo }),
12481
12836
  brand && /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__brand", children: [
12482
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__brand-name", children: brand.name }),
12483
- brand.subtitle && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__brand-sub", children: brand.subtitle })
12837
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__brand-name", children: brand.name }),
12838
+ brand.subtitle && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__brand-sub", children: brand.subtitle })
12484
12839
  ] })
12485
12840
  ] }),
12486
- /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__body", children: sections.map((section, sIdx) => /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__section", children: [
12487
- section.label && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__section-label", children: section.label }),
12488
- section.items.map((item) => /* @__PURE__ */ jsx69(ExpandedItem, { item, level: 0 }, item.id))
12841
+ /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__body", children: sections.map((section, sIdx) => /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__section", children: [
12842
+ section.label && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__section-label", children: section.label }),
12843
+ section.items.map((item) => /* @__PURE__ */ jsx70(ExpandedItem, { item, level: 0 }, item.id))
12489
12844
  ] }, section.id ?? sIdx)) }),
12490
12845
  (footerItems || user || hasFooterControl) && /* @__PURE__ */ jsxs68("div", { className: "ods-sidebar__footer", children: [
12491
- footerItems && footerItems.length > 0 && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__footer-list", children: footerItems.map((item) => /* @__PURE__ */ jsx69(ExpandedItem, { item, level: 0 }, item.id)) }),
12492
- hasFooterControl && /* @__PURE__ */ jsx69("div", { className: "ods-sidebar__footer-control", children: onPinToggle ? /* @__PURE__ */ jsxs68(
12846
+ footerItems && footerItems.length > 0 && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__footer-list", children: footerItems.map((item) => /* @__PURE__ */ jsx70(ExpandedItem, { item, level: 0 }, item.id)) }),
12847
+ hasFooterControl && /* @__PURE__ */ jsx70("div", { className: "ods-sidebar__footer-control", children: onPinToggle ? /* @__PURE__ */ jsxs68(
12493
12848
  "button",
12494
12849
  {
12495
12850
  type: "button",
@@ -12498,8 +12853,8 @@ function ExpandedLayout({
12498
12853
  "aria-label": pinned ? "Unpin sidebar" : "Pin sidebar",
12499
12854
  "aria-pressed": pinned,
12500
12855
  children: [
12501
- /* @__PURE__ */ jsx69(PinIcon, { pinned: !!pinned }),
12502
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__pin-label", children: pinned ? "Unpin" : "Pin sidebar" })
12856
+ /* @__PURE__ */ jsx70(PinIcon, { pinned: !!pinned }),
12857
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__pin-label", children: pinned ? "Unpin" : "Pin sidebar" })
12503
12858
  ]
12504
12859
  }
12505
12860
  ) : /* @__PURE__ */ jsxs68(
@@ -12510,7 +12865,7 @@ function ExpandedLayout({
12510
12865
  onClick: onToggle,
12511
12866
  "aria-label": "Collapse sidebar",
12512
12867
  children: [
12513
- /* @__PURE__ */ jsx69("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx69(
12868
+ /* @__PURE__ */ jsx70("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx70(
12514
12869
  "path",
12515
12870
  {
12516
12871
  d: "M3 3v10M11 5l-3 3 3 3",
@@ -12520,11 +12875,11 @@ function ExpandedLayout({
12520
12875
  strokeLinejoin: "round"
12521
12876
  }
12522
12877
  ) }),
12523
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__pin-label", children: "Collapse" })
12878
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__pin-label", children: "Collapse" })
12524
12879
  ]
12525
12880
  }
12526
12881
  ) }),
12527
- user && /* @__PURE__ */ jsx69(SidebarUserCard, { user })
12882
+ user && /* @__PURE__ */ jsx70(SidebarUserCard, { user })
12528
12883
  ] })
12529
12884
  ] });
12530
12885
  }
@@ -12542,19 +12897,19 @@ function PinIcon({ pinned }) {
12542
12897
  strokeLinecap: "round",
12543
12898
  "aria-hidden": "true",
12544
12899
  children: [
12545
- /* @__PURE__ */ jsx69("path", { d: "M10.5 1.5 14.5 5.5 11.5 8.5 11 11 5 5 7.5 4.5z" }),
12546
- /* @__PURE__ */ jsx69("path", { d: "M5 5 1.5 14.5" })
12900
+ /* @__PURE__ */ jsx70("path", { d: "M10.5 1.5 14.5 5.5 11.5 8.5 11 11 5 5 7.5 4.5z" }),
12901
+ /* @__PURE__ */ jsx70("path", { d: "M5 5 1.5 14.5" })
12547
12902
  ]
12548
12903
  }
12549
12904
  );
12550
12905
  }
12551
12906
  function ExpandedItem({ item, level }) {
12552
12907
  const hasChildren = !!(item.children && item.children.length > 0);
12553
- const [open, setOpen] = useState24(
12908
+ const [open, setOpen] = useState26(
12554
12909
  item.defaultExpanded ?? (hasChildren && hasActiveDescendant(item))
12555
12910
  );
12556
12911
  if (hasChildren) {
12557
- return /* @__PURE__ */ jsxs68(Fragment17, { children: [
12912
+ return /* @__PURE__ */ jsxs68(Fragment18, { children: [
12558
12913
  /* @__PURE__ */ jsxs68(
12559
12914
  "button",
12560
12915
  {
@@ -12572,11 +12927,11 @@ function ExpandedItem({ item, level }) {
12572
12927
  },
12573
12928
  "aria-expanded": open,
12574
12929
  children: [
12575
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__icon", children: item.icon }),
12576
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__label", children: item.label }),
12577
- item.tag && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__tag", children: item.tag }),
12578
- item.badge && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__badge", children: item.badge }),
12579
- /* @__PURE__ */ jsx69(
12930
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__icon", children: item.icon }),
12931
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__label", children: item.label }),
12932
+ item.tag && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__tag", children: item.tag }),
12933
+ item.badge && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__badge", children: item.badge }),
12934
+ /* @__PURE__ */ jsx70(
12580
12935
  "svg",
12581
12936
  {
12582
12937
  className: cn("ods-sidebar__chevron", open && "ods-sidebar__chevron--open"),
@@ -12585,7 +12940,7 @@ function ExpandedItem({ item, level }) {
12585
12940
  viewBox: "0 0 12 12",
12586
12941
  fill: "none",
12587
12942
  "aria-hidden": "true",
12588
- children: /* @__PURE__ */ jsx69(
12943
+ children: /* @__PURE__ */ jsx70(
12589
12944
  "path",
12590
12945
  {
12591
12946
  d: "M4.5 3l3 3-3 3",
@@ -12600,14 +12955,14 @@ function ExpandedItem({ item, level }) {
12600
12955
  ]
12601
12956
  }
12602
12957
  ),
12603
- open && /* @__PURE__ */ jsx69(
12958
+ open && /* @__PURE__ */ jsx70(
12604
12959
  "div",
12605
12960
  {
12606
12961
  className: cn(
12607
12962
  "ods-sidebar__subtree",
12608
12963
  `ods-sidebar__subtree--l${Math.min(level + 1, 3)}`
12609
12964
  ),
12610
- children: item.children.map((child) => /* @__PURE__ */ jsx69(ExpandedItem, { item: child, level: level + 1 }, child.id))
12965
+ children: item.children.map((child) => /* @__PURE__ */ jsx70(ExpandedItem, { item: child, level: level + 1 }, child.id))
12611
12966
  }
12612
12967
  )
12613
12968
  ] });
@@ -12626,30 +12981,30 @@ function ExpandedItem({ item, level }) {
12626
12981
  ),
12627
12982
  "aria-current": item.active ? "page" : void 0,
12628
12983
  children: [
12629
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__icon", children: item.icon }),
12630
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__label", children: item.label }),
12631
- item.tag && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__tag", children: item.tag }),
12632
- item.badge && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__badge", children: item.badge })
12984
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__icon", children: item.icon }),
12985
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__label", children: item.label }),
12986
+ item.tag && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__tag", children: item.tag }),
12987
+ item.badge && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__badge", children: item.badge })
12633
12988
  ]
12634
12989
  }
12635
12990
  );
12636
12991
  }
12637
12992
  function SidebarUserCard({ user }) {
12638
12993
  const labelText = typeof user.name === "string" ? user.name : "User";
12639
- const body = /* @__PURE__ */ jsxs68(Fragment17, { children: [
12640
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__user-avatar", children: user.avatar ?? /* @__PURE__ */ jsx69("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") }) }),
12994
+ const body = /* @__PURE__ */ jsxs68(Fragment18, { children: [
12995
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__user-avatar", children: user.avatar ?? /* @__PURE__ */ jsx70("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") }) }),
12641
12996
  /* @__PURE__ */ jsxs68("span", { className: "ods-sidebar__user-info", children: [
12642
- /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__user-name", children: user.name }),
12643
- user.email && /* @__PURE__ */ jsx69("span", { className: "ods-sidebar__user-email", children: user.email })
12997
+ /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__user-name", children: user.name }),
12998
+ user.email && /* @__PURE__ */ jsx70("span", { className: "ods-sidebar__user-email", children: user.email })
12644
12999
  ] }),
12645
13000
  /* @__PURE__ */ jsxs68("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
12646
- /* @__PURE__ */ jsx69("circle", { cx: "8", cy: "3", r: "1.3", fill: "currentColor" }),
12647
- /* @__PURE__ */ jsx69("circle", { cx: "8", cy: "8", r: "1.3", fill: "currentColor" }),
12648
- /* @__PURE__ */ jsx69("circle", { cx: "8", cy: "13", r: "1.3", fill: "currentColor" })
13001
+ /* @__PURE__ */ jsx70("circle", { cx: "8", cy: "3", r: "1.3", fill: "currentColor" }),
13002
+ /* @__PURE__ */ jsx70("circle", { cx: "8", cy: "8", r: "1.3", fill: "currentColor" }),
13003
+ /* @__PURE__ */ jsx70("circle", { cx: "8", cy: "13", r: "1.3", fill: "currentColor" })
12649
13004
  ] })
12650
13005
  ] });
12651
13006
  if (user.menu && user.menu.length > 0) {
12652
- return /* @__PURE__ */ jsx69(
13007
+ return /* @__PURE__ */ jsx70(
12653
13008
  DropdownMenu,
12654
13009
  {
12655
13010
  trigger: body,
@@ -12660,7 +13015,7 @@ function SidebarUserCard({ user }) {
12660
13015
  }
12661
13016
  );
12662
13017
  }
12663
- return /* @__PURE__ */ jsx69("button", { type: "button", className: "ods-sidebar__user-card", onClick: user.onClick, children: body });
13018
+ return /* @__PURE__ */ jsx70("button", { type: "button", className: "ods-sidebar__user-card", onClick: user.onClick, children: body });
12664
13019
  }
12665
13020
  function hasActiveDescendant(item) {
12666
13021
  if (!item.children) return false;
@@ -12672,12 +13027,12 @@ function hasActiveDescendant(item) {
12672
13027
  }
12673
13028
 
12674
13029
  // src/components/Skeleton/Skeleton.tsx
12675
- import { jsx as jsx70 } from "react/jsx-runtime";
13030
+ import { jsx as jsx71 } from "react/jsx-runtime";
12676
13031
  function Skeleton({ variant = "text", width, height, lines = 1, className }) {
12677
13032
  const resolvedWidth = typeof width === "number" ? `${width}px` : width;
12678
13033
  const resolvedHeight = typeof height === "number" ? `${height}px` : height;
12679
13034
  if (variant === "text" && lines > 1) {
12680
- return /* @__PURE__ */ jsx70("div", { className: cn("ods-skeleton__group", className), role: "status", "aria-label": "Loading", children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx70(
13035
+ return /* @__PURE__ */ jsx71("div", { className: cn("ods-skeleton__group", className), role: "status", "aria-label": "Loading", children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx71(
12681
13036
  "div",
12682
13037
  {
12683
13038
  className: cn("ods-skeleton", "ods-skeleton--text"),
@@ -12689,7 +13044,7 @@ function Skeleton({ variant = "text", width, height, lines = 1, className }) {
12689
13044
  i
12690
13045
  )) });
12691
13046
  }
12692
- return /* @__PURE__ */ jsx70(
13047
+ return /* @__PURE__ */ jsx71(
12693
13048
  "div",
12694
13049
  {
12695
13050
  className: cn("ods-skeleton", `ods-skeleton--${variant}`, className),
@@ -12705,10 +13060,10 @@ function Skeleton({ variant = "text", width, height, lines = 1, className }) {
12705
13060
 
12706
13061
  // src/components/SlideoutPanel/SlideoutPanel.tsx
12707
13062
  import { AnimatePresence as AnimatePresence8, motion as motion11 } from "framer-motion";
12708
- import { useRef as useRef29 } from "react";
13063
+ import { useRef as useRef31 } from "react";
12709
13064
  import { FocusScope as FocusScope2, OverlayProvider as OverlayProvider2, useDialog as useDialog2, useModal as useModal2, useOverlay as useOverlay2 } from "react-aria";
12710
13065
  import { createPortal as createPortal9 } from "react-dom";
12711
- import { Fragment as Fragment18, jsx as jsx71, jsxs as jsxs69 } from "react/jsx-runtime";
13066
+ import { Fragment as Fragment19, jsx as jsx72, jsxs as jsxs69 } from "react/jsx-runtime";
12712
13067
  var slideVariants2 = {
12713
13068
  left: {
12714
13069
  initial: { x: "-100%" },
@@ -12731,8 +13086,8 @@ function SlideoutContent({
12731
13086
  footer,
12732
13087
  className
12733
13088
  }) {
12734
- const overlayRef = useRef29(null);
12735
- const panelRef = useRef29(null);
13089
+ const overlayRef = useRef31(null);
13090
+ const panelRef = useRef31(null);
12736
13091
  const { overlayProps } = useOverlay2(
12737
13092
  {
12738
13093
  isOpen: open,
@@ -12746,8 +13101,8 @@ function SlideoutContent({
12746
13101
  const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeOverlayProps } = overlayProps;
12747
13102
  const variant = slideVariants2[position];
12748
13103
  const panelWidth = typeof width === "number" ? `${width}px` : width;
12749
- return /* @__PURE__ */ jsx71(AnimatePresence8, { children: open && /* @__PURE__ */ jsxs69(Fragment18, { children: [
12750
- /* @__PURE__ */ jsx71(
13104
+ return /* @__PURE__ */ jsx72(AnimatePresence8, { children: open && /* @__PURE__ */ jsxs69(Fragment19, { children: [
13105
+ /* @__PURE__ */ jsx72(
12751
13106
  motion11.div,
12752
13107
  {
12753
13108
  className: "ods-slideout__backdrop",
@@ -12760,7 +13115,7 @@ function SlideoutContent({
12760
13115
  "aria-hidden": "true"
12761
13116
  }
12762
13117
  ),
12763
- /* @__PURE__ */ jsx71(FocusScope2, { contain: true, restoreFocus: true, autoFocus: true, children: /* @__PURE__ */ jsxs69(
13118
+ /* @__PURE__ */ jsx72(FocusScope2, { contain: true, restoreFocus: true, autoFocus: true, children: /* @__PURE__ */ jsxs69(
12764
13119
  motion11.div,
12765
13120
  {
12766
13121
  ...safeOverlayProps,
@@ -12778,20 +13133,20 @@ function SlideoutContent({
12778
13133
  transition: { type: "tween", ease: [0.32, 0.72, 0, 1], duration: 0.28 },
12779
13134
  children: [
12780
13135
  title && /* @__PURE__ */ jsxs69("div", { className: "ods-slideout__header", children: [
12781
- /* @__PURE__ */ jsx71("h2", { ...titleProps, className: "ods-slideout__title", children: title }),
12782
- /* @__PURE__ */ jsx71(
13136
+ /* @__PURE__ */ jsx72("h2", { ...titleProps, className: "ods-slideout__title", children: title }),
13137
+ /* @__PURE__ */ jsx72(
12783
13138
  "button",
12784
13139
  {
12785
13140
  className: "ods-slideout__close",
12786
13141
  onClick: onClose,
12787
13142
  "aria-label": "Close panel",
12788
13143
  type: "button",
12789
- children: /* @__PURE__ */ jsx71("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ jsx71("path", { d: "M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" }) })
13144
+ children: /* @__PURE__ */ jsx72("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ jsx72("path", { d: "M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" }) })
12790
13145
  }
12791
13146
  )
12792
13147
  ] }),
12793
- /* @__PURE__ */ jsx71("div", { className: "ods-slideout__body", children }),
12794
- footer && /* @__PURE__ */ jsx71("div", { className: "ods-slideout__footer", children: footer })
13148
+ /* @__PURE__ */ jsx72("div", { className: "ods-slideout__body", children }),
13149
+ footer && /* @__PURE__ */ jsx72("div", { className: "ods-slideout__footer", children: footer })
12795
13150
  ]
12796
13151
  }
12797
13152
  ) })
@@ -12800,13 +13155,13 @@ function SlideoutContent({
12800
13155
  function SlideoutPanel(props) {
12801
13156
  if (typeof document === "undefined") return null;
12802
13157
  return createPortal9(
12803
- /* @__PURE__ */ jsx71(OverlayProvider2, { children: /* @__PURE__ */ jsx71(SlideoutContent, { ...props }) }),
13158
+ /* @__PURE__ */ jsx72(OverlayProvider2, { children: /* @__PURE__ */ jsx72(SlideoutContent, { ...props }) }),
12804
13159
  document.body
12805
13160
  );
12806
13161
  }
12807
13162
 
12808
13163
  // src/components/Slider/Slider.tsx
12809
- import { jsx as jsx72, jsxs as jsxs70 } from "react/jsx-runtime";
13164
+ import { jsx as jsx73, jsxs as jsxs70 } from "react/jsx-runtime";
12810
13165
  function Slider({
12811
13166
  label,
12812
13167
  value,
@@ -12837,12 +13192,12 @@ function Slider({
12837
13192
  ),
12838
13193
  children: [
12839
13194
  (label || showValue) && /* @__PURE__ */ jsxs70("div", { className: "ods-slider__head", children: [
12840
- label && /* @__PURE__ */ jsx72("span", { className: "ods-slider__label", children: label }),
12841
- showValue && /* @__PURE__ */ jsx72("span", { className: "ods-slider__value", children: display })
13195
+ label && /* @__PURE__ */ jsx73("span", { className: "ods-slider__label", children: label }),
13196
+ showValue && /* @__PURE__ */ jsx73("span", { className: "ods-slider__value", children: display })
12842
13197
  ] }),
12843
13198
  /* @__PURE__ */ jsxs70("div", { className: "ods-slider__track", children: [
12844
- /* @__PURE__ */ jsx72("span", { className: "ods-slider__fill", style: { width: `${pct}%` } }),
12845
- /* @__PURE__ */ jsx72(
13199
+ /* @__PURE__ */ jsx73("span", { className: "ods-slider__fill", style: { width: `${pct}%` } }),
13200
+ /* @__PURE__ */ jsx73(
12846
13201
  "input",
12847
13202
  {
12848
13203
  type: "range",
@@ -12863,7 +13218,7 @@ function Slider({
12863
13218
  }
12864
13219
 
12865
13220
  // src/components/SocialButton/SocialButton.tsx
12866
- import { jsx as jsx73, jsxs as jsxs71 } from "react/jsx-runtime";
13221
+ import { jsx as jsx74, jsxs as jsxs71 } from "react/jsx-runtime";
12867
13222
  var DEFAULT_LABELS = {
12868
13223
  google: "Continue with Google",
12869
13224
  github: "Continue with GitHub",
@@ -12871,28 +13226,28 @@ var DEFAULT_LABELS = {
12871
13226
  twitter: "Continue with X"
12872
13227
  };
12873
13228
  var GoogleIcon = () => /* @__PURE__ */ jsxs71("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: [
12874
- /* @__PURE__ */ jsx73(
13229
+ /* @__PURE__ */ jsx74(
12875
13230
  "path",
12876
13231
  {
12877
13232
  d: "M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.79 2.72v2.26h2.9c1.69-1.56 2.69-3.85 2.69-6.62z",
12878
13233
  fill: "#4285F4"
12879
13234
  }
12880
13235
  ),
12881
- /* @__PURE__ */ jsx73(
13236
+ /* @__PURE__ */ jsx74(
12882
13237
  "path",
12883
13238
  {
12884
13239
  d: "M9 18c2.43 0 4.47-.8 5.96-2.18l-2.9-2.26c-.8.54-1.84.86-3.06.86-2.34 0-4.33-1.58-5.04-3.71H.96v2.33A9 9 0 0 0 9 18z",
12885
13240
  fill: "#34A853"
12886
13241
  }
12887
13242
  ),
12888
- /* @__PURE__ */ jsx73(
13243
+ /* @__PURE__ */ jsx74(
12889
13244
  "path",
12890
13245
  {
12891
13246
  d: "M3.96 10.71A5.38 5.38 0 0 1 3.68 9c0-.6.1-1.18.28-1.71V4.96H.96A9 9 0 0 0 0 9c0 1.45.35 2.82.96 4.04l3-2.33z",
12892
13247
  fill: "#FBBC05"
12893
13248
  }
12894
13249
  ),
12895
- /* @__PURE__ */ jsx73(
13250
+ /* @__PURE__ */ jsx74(
12896
13251
  "path",
12897
13252
  {
12898
13253
  d: "M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58A9 9 0 0 0 9 0 9 9 0 0 0 .96 4.96l3 2.33C4.67 5.16 6.66 3.58 9 3.58z",
@@ -12900,21 +13255,21 @@ var GoogleIcon = () => /* @__PURE__ */ jsxs71("svg", { width: "18", height: "18"
12900
13255
  }
12901
13256
  )
12902
13257
  ] });
12903
- var GitHubIcon = () => /* @__PURE__ */ jsx73("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx73(
13258
+ var GitHubIcon = () => /* @__PURE__ */ jsx74("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx74(
12904
13259
  "path",
12905
13260
  {
12906
13261
  d: "M9 .2a9 9 0 0 0-2.85 17.55c.45.08.62-.2.62-.43v-1.5c-2.5.54-3.04-1.2-3.04-1.2-.41-1.05-1-1.33-1-1.33-.82-.56.06-.55.06-.55.9.06 1.38.93 1.38.93.8 1.38 2.11.98 2.63.75.08-.58.31-.98.57-1.2-2-.23-4.1-1-4.1-4.44 0-.98.35-1.78.93-2.41-.1-.23-.4-1.15.09-2.4 0 0 .76-.25 2.48.92a8.6 8.6 0 0 1 4.5 0c1.72-1.17 2.48-.92 2.48-.92.49 1.25.18 2.17.09 2.4.58.63.93 1.43.93 2.4 0 3.45-2.1 4.21-4.1 4.44.32.28.6.82.6 1.67v2.47c0 .24.17.52.63.43A9 9 0 0 0 9 .2z",
12907
13262
  fill: "#ffffff"
12908
13263
  }
12909
13264
  ) });
12910
- var AppleIcon = () => /* @__PURE__ */ jsx73("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx73(
13265
+ var AppleIcon = () => /* @__PURE__ */ jsx74("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx74(
12911
13266
  "path",
12912
13267
  {
12913
13268
  d: "M13.4 9.5c0-1.7 1.4-2.5 1.5-2.6-.8-1.2-2.1-1.3-2.5-1.3-1.1-.1-2.1.6-2.6.6-.6 0-1.4-.6-2.3-.6-1.2 0-2.3.7-2.9 1.8-1.2 2.1-.3 5.3.9 7 .6.9 1.3 1.8 2.2 1.8.9 0 1.2-.6 2.3-.6s1.4.6 2.3.6 1.5-.9 2.1-1.8c.7-1 1-2 1-2.1 0 0-1.9-.7-2-2.8zM11.5 4.5c.5-.6.8-1.4.7-2.2-.7 0-1.5.5-2 1.1-.4.5-.8 1.3-.7 2.1.8.1 1.6-.4 2-1z",
12914
13269
  fill: "#ffffff"
12915
13270
  }
12916
13271
  ) });
12917
- var TwitterIcon = () => /* @__PURE__ */ jsx73("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx73(
13272
+ var TwitterIcon = () => /* @__PURE__ */ jsx74("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx74(
12918
13273
  "path",
12919
13274
  {
12920
13275
  d: "M13.8 1.3h2.6l-5.7 6.5L17.4 16h-5.2l-4.1-5.3L3.4 16H.8l6-6.9L.5 1.3h5.4l3.7 4.9 4.2-4.9z",
@@ -12952,8 +13307,8 @@ function SocialButton({
12952
13307
  className
12953
13308
  ),
12954
13309
  children: [
12955
- resolvedIcon && /* @__PURE__ */ jsx73("span", { className: "ods-social-btn__icon", "aria-hidden": "true", children: resolvedIcon }),
12956
- /* @__PURE__ */ jsx73("span", { className: "ods-social-btn__label", children: resolvedLabel })
13310
+ resolvedIcon && /* @__PURE__ */ jsx74("span", { className: "ods-social-btn__icon", "aria-hidden": "true", children: resolvedIcon }),
13311
+ /* @__PURE__ */ jsx74("span", { className: "ods-social-btn__label", children: resolvedLabel })
12957
13312
  ]
12958
13313
  }
12959
13314
  );
@@ -12962,11 +13317,11 @@ function SocialButton({
12962
13317
  // src/components/Sortable/Sortable.tsx
12963
13318
  import {
12964
13319
  useCallback as useCallback18,
12965
- useEffect as useEffect18,
12966
- useRef as useRef30,
12967
- useState as useState25
13320
+ useEffect as useEffect20,
13321
+ useRef as useRef32,
13322
+ useState as useState27
12968
13323
  } from "react";
12969
- import { jsx as jsx74, jsxs as jsxs72 } from "react/jsx-runtime";
13324
+ import { jsx as jsx75, jsxs as jsxs72 } from "react/jsx-runtime";
12970
13325
  var DT_TYPE = "application/x-ods-sortable";
12971
13326
  function Sortable({
12972
13327
  items,
@@ -12978,13 +13333,13 @@ function Sortable({
12978
13333
  autoScrollEdge = 48,
12979
13334
  className
12980
13335
  }) {
12981
- const containerRef = useRef30(null);
12982
- const itemRefs = useRef30(/* @__PURE__ */ new Map());
12983
- const originalOrderRef = useRef30(null);
12984
- const scrollTimerRef = useRef30(null);
12985
- const [draggingId, setDraggingId] = useState25(null);
12986
- const [dropPos, setDropPos] = useState25(null);
12987
- const [kbActiveId, setKbActiveId] = useState25(null);
13336
+ const containerRef = useRef32(null);
13337
+ const itemRefs = useRef32(/* @__PURE__ */ new Map());
13338
+ const originalOrderRef = useRef32(null);
13339
+ const scrollTimerRef = useRef32(null);
13340
+ const [draggingId, setDraggingId] = useState27(null);
13341
+ const [dropPos, setDropPos] = useState27(null);
13342
+ const [kbActiveId, setKbActiveId] = useState27(null);
12988
13343
  const isVertical = direction === "vertical";
12989
13344
  const onDragStart = useCallback18(
12990
13345
  (id) => (e) => {
@@ -13045,7 +13400,7 @@ function Sortable({
13045
13400
  },
13046
13401
  [items, onChange]
13047
13402
  );
13048
- useEffect18(() => {
13403
+ useEffect20(() => {
13049
13404
  if (!autoScroll || !draggingId) return;
13050
13405
  const container = containerRef.current;
13051
13406
  if (!container) return;
@@ -13095,7 +13450,7 @@ function Sortable({
13095
13450
  }
13096
13451
  };
13097
13452
  }, [autoScroll, autoScrollEdge, draggingId, isVertical]);
13098
- useEffect18(() => {
13453
+ useEffect20(() => {
13099
13454
  if (!draggingId) return;
13100
13455
  const onKey = (e) => {
13101
13456
  if (e.key === "Escape") cancelDrag();
@@ -13197,7 +13552,7 @@ function Sortable({
13197
13552
  ),
13198
13553
  onDragOver: onItemDragOver(item.id),
13199
13554
  children: [
13200
- /* @__PURE__ */ jsx74(
13555
+ /* @__PURE__ */ jsx75(
13201
13556
  "span",
13202
13557
  {
13203
13558
  className: "ods-sortable__indicator ods-sortable__indicator--before",
@@ -13205,7 +13560,7 @@ function Sortable({
13205
13560
  }
13206
13561
  ),
13207
13562
  renderItem(item, idx, dragProps),
13208
- /* @__PURE__ */ jsx74(
13563
+ /* @__PURE__ */ jsx75(
13209
13564
  "span",
13210
13565
  {
13211
13566
  className: "ods-sortable__indicator ods-sortable__indicator--after",
@@ -13217,7 +13572,7 @@ function Sortable({
13217
13572
  item.id
13218
13573
  );
13219
13574
  }),
13220
- /* @__PURE__ */ jsx74("span", { className: "ods-sortable__sr", "aria-live": "polite", "aria-atomic": "true", children: kbActiveId ? `Item picked up. Use arrow keys to reorder, Space or Enter to drop, Escape to cancel.` : "" })
13575
+ /* @__PURE__ */ jsx75("span", { className: "ods-sortable__sr", "aria-live": "polite", "aria-atomic": "true", children: kbActiveId ? `Item picked up. Use arrow keys to reorder, Space or Enter to drop, Escape to cancel.` : "" })
13221
13576
  ]
13222
13577
  }
13223
13578
  );
@@ -13228,7 +13583,7 @@ function DragHandle({
13228
13583
  ariaLabel = "Drag to reorder",
13229
13584
  dragProps
13230
13585
  }) {
13231
- return /* @__PURE__ */ jsx74(
13586
+ return /* @__PURE__ */ jsx75(
13232
13587
  "span",
13233
13588
  {
13234
13589
  "data-ods-sortable-handle": "true",
@@ -13237,19 +13592,19 @@ function DragHandle({
13237
13592
  style,
13238
13593
  ...dragProps,
13239
13594
  children: /* @__PURE__ */ jsxs72("svg", { width: "8", height: "14", viewBox: "0 0 8 14", fill: "none", "aria-hidden": "true", children: [
13240
- /* @__PURE__ */ jsx74("circle", { cx: "2", cy: "3", r: "1", fill: "currentColor" }),
13241
- /* @__PURE__ */ jsx74("circle", { cx: "6", cy: "3", r: "1", fill: "currentColor" }),
13242
- /* @__PURE__ */ jsx74("circle", { cx: "2", cy: "7", r: "1", fill: "currentColor" }),
13243
- /* @__PURE__ */ jsx74("circle", { cx: "6", cy: "7", r: "1", fill: "currentColor" }),
13244
- /* @__PURE__ */ jsx74("circle", { cx: "2", cy: "11", r: "1", fill: "currentColor" }),
13245
- /* @__PURE__ */ jsx74("circle", { cx: "6", cy: "11", r: "1", fill: "currentColor" })
13595
+ /* @__PURE__ */ jsx75("circle", { cx: "2", cy: "3", r: "1", fill: "currentColor" }),
13596
+ /* @__PURE__ */ jsx75("circle", { cx: "6", cy: "3", r: "1", fill: "currentColor" }),
13597
+ /* @__PURE__ */ jsx75("circle", { cx: "2", cy: "7", r: "1", fill: "currentColor" }),
13598
+ /* @__PURE__ */ jsx75("circle", { cx: "6", cy: "7", r: "1", fill: "currentColor" }),
13599
+ /* @__PURE__ */ jsx75("circle", { cx: "2", cy: "11", r: "1", fill: "currentColor" }),
13600
+ /* @__PURE__ */ jsx75("circle", { cx: "6", cy: "11", r: "1", fill: "currentColor" })
13246
13601
  ] })
13247
13602
  }
13248
13603
  );
13249
13604
  }
13250
13605
 
13251
13606
  // src/components/Sparkline/Sparkline.tsx
13252
- import { jsx as jsx75, jsxs as jsxs73 } from "react/jsx-runtime";
13607
+ import { jsx as jsx76, jsxs as jsxs73 } from "react/jsx-runtime";
13253
13608
  function Sparkline({
13254
13609
  data,
13255
13610
  width = 80,
@@ -13297,8 +13652,8 @@ function Sparkline({
13297
13652
  role: "img",
13298
13653
  "aria-label": ariaLabel,
13299
13654
  children: [
13300
- area && /* @__PURE__ */ jsx75("path", { d: area, fill }),
13301
- /* @__PURE__ */ jsx75(
13655
+ area && /* @__PURE__ */ jsx76("path", { d: area, fill }),
13656
+ /* @__PURE__ */ jsx76(
13302
13657
  "path",
13303
13658
  {
13304
13659
  d: path,
@@ -13314,47 +13669,6 @@ function Sparkline({
13314
13669
  );
13315
13670
  }
13316
13671
 
13317
- // src/components/Spinner/Spinner.tsx
13318
- import { jsx as jsx76 } from "react/jsx-runtime";
13319
- var sizeMap = {
13320
- sm: 16,
13321
- md: 24,
13322
- lg: 32,
13323
- xl: 48
13324
- };
13325
- function Spinner({
13326
- size = "md",
13327
- color = "var(--ods-color-brand-500)",
13328
- className
13329
- }) {
13330
- const px = sizeMap[size];
13331
- return /* @__PURE__ */ jsx76(
13332
- "svg",
13333
- {
13334
- className: cn("ods-spinner", `ods-spinner--${size}`, className),
13335
- width: px,
13336
- height: px,
13337
- viewBox: "0 0 24 24",
13338
- fill: "none",
13339
- role: "status",
13340
- "aria-label": "Loading",
13341
- style: { color },
13342
- children: /* @__PURE__ */ jsx76(
13343
- "circle",
13344
- {
13345
- cx: "12",
13346
- cy: "12",
13347
- r: "10",
13348
- strokeWidth: "3",
13349
- strokeLinecap: "round",
13350
- strokeDasharray: "31.4 31.4",
13351
- className: "ods-spinner__circle"
13352
- }
13353
- )
13354
- }
13355
- );
13356
- }
13357
-
13358
13672
  // src/components/Stat/Stat.tsx
13359
13673
  import { jsx as jsx77, jsxs as jsxs74 } from "react/jsx-runtime";
13360
13674
  function Stat({
@@ -13386,7 +13700,7 @@ function Stat({
13386
13700
  }
13387
13701
 
13388
13702
  // src/components/Switch/Switch.tsx
13389
- import { useRef as useRef31 } from "react";
13703
+ import { useRef as useRef33 } from "react";
13390
13704
  import { useSwitch } from "react-aria";
13391
13705
  import { jsx as jsx78, jsxs as jsxs75 } from "react/jsx-runtime";
13392
13706
  function Switch({
@@ -13399,7 +13713,7 @@ function Switch({
13399
13713
  className,
13400
13714
  ...props
13401
13715
  }) {
13402
- const ref = useRef31(null);
13716
+ const ref = useRef33(null);
13403
13717
  const state = $fd3c5e01e837dc20$export$8042c6c013fd5226({
13404
13718
  isSelected: checked,
13405
13719
  defaultSelected: defaultChecked,
@@ -13457,8 +13771,8 @@ function Switch({
13457
13771
  }
13458
13772
 
13459
13773
  // src/components/Table/Table.tsx
13460
- import { useCallback as useCallback19, useState as useState26 } from "react";
13461
- import { Fragment as Fragment19, jsx as jsx79, jsxs as jsxs76 } from "react/jsx-runtime";
13774
+ import { useCallback as useCallback19, useState as useState28 } from "react";
13775
+ import { Fragment as Fragment20, jsx as jsx79, jsxs as jsxs76 } from "react/jsx-runtime";
13462
13776
  function Table({
13463
13777
  columns,
13464
13778
  data,
@@ -13580,8 +13894,8 @@ function TableRow({
13580
13894
  totalCols
13581
13895
  }) {
13582
13896
  const isSelected = selectedRows?.has(rowIndex) ?? false;
13583
- const [expanded, setExpanded] = useState26(false);
13584
- return /* @__PURE__ */ jsxs76(Fragment19, { children: [
13897
+ const [expanded, setExpanded] = useState28(false);
13898
+ return /* @__PURE__ */ jsxs76(Fragment20, { children: [
13585
13899
  /* @__PURE__ */ jsxs76(
13586
13900
  "tr",
13587
13901
  {
@@ -13617,11 +13931,15 @@ function TableRow({
13617
13931
 
13618
13932
  // src/components/Tabs/Tabs.tsx
13619
13933
  import { motion as motion12 } from "framer-motion";
13620
- import { useMemo as useMemo12, useRef as useRef32, useState as useState27 } from "react";
13934
+ import { useCallback as useCallback20, useEffect as useEffect21, useId as useId7, useMemo as useMemo12, useRef as useRef34, useState as useState29 } from "react";
13621
13935
  import { useTab, useTabList, useTabPanel } from "react-aria";
13622
13936
  import { jsx as jsx80, jsxs as jsxs77 } from "react/jsx-runtime";
13623
- function TabButton({ item, state }) {
13624
- const ref = useRef32(null);
13937
+ function TabButton({
13938
+ item,
13939
+ state,
13940
+ indicatorLayoutId
13941
+ }) {
13942
+ const ref = useRef34(null);
13625
13943
  const { tabProps } = useTab({ key: item.key }, state, ref);
13626
13944
  const isSelected = state.selectedKey === item.key;
13627
13945
  const isDisabled = state.disabledKeys.has(item.key);
@@ -13642,7 +13960,7 @@ function TabButton({ item, state }) {
13642
13960
  motion12.div,
13643
13961
  {
13644
13962
  className: "ods-tabs__indicator",
13645
- layoutId: "ods-tabs-indicator",
13963
+ layoutId: indicatorLayoutId,
13646
13964
  transition: { type: "spring", damping: 30, stiffness: 400 }
13647
13965
  }
13648
13966
  )
@@ -13651,10 +13969,12 @@ function TabButton({ item, state }) {
13651
13969
  );
13652
13970
  }
13653
13971
  function TabPanelContent({ state, panelContent, ...props }) {
13654
- const ref = useRef32(null);
13972
+ const ref = useRef34(null);
13655
13973
  const { tabPanelProps } = useTabPanel(props, state, ref);
13656
13974
  return /* @__PURE__ */ jsx80("div", { ...tabPanelProps, ref, className: "ods-tabs__panel", children: panelContent });
13657
13975
  }
13976
+ var SCROLL_EDGE_EPSILON = 1;
13977
+ var SCROLL_STEP_PX = 200;
13658
13978
  function Tabs({
13659
13979
  items,
13660
13980
  value,
@@ -13663,7 +13983,9 @@ function Tabs({
13663
13983
  orientation = "horizontal",
13664
13984
  className
13665
13985
  }) {
13666
- const [internalValue, setInternalValue] = useState27(defaultValue || items[0]?.value);
13986
+ const reactId = useId7();
13987
+ const indicatorLayoutId = `ods-tabs-indicator-${reactId}`;
13988
+ const [internalValue, setInternalValue] = useState29(defaultValue || items[0]?.value);
13667
13989
  const selectedKey = value ?? internalValue;
13668
13990
  const handleSelectionChange = (key) => {
13669
13991
  const keyStr = String(key);
@@ -13687,17 +14009,103 @@ function Tabs({
13687
14009
  disabledKeys: items.filter((i) => i.disabled).map((i) => i.value)
13688
14010
  };
13689
14011
  const state = $caeb030f09a278a1$export$4ba071daf4e486(stateProps);
13690
- const ref = useRef32(null);
14012
+ const ref = useRef34(null);
13691
14013
  const { tabListProps } = useTabList({ ...stateProps, orientation }, state, ref);
14014
+ const scrollContainerRef = useRef34(null);
14015
+ const [canScrollLeft, setCanScrollLeft] = useState29(false);
14016
+ const [canScrollRight, setCanScrollRight] = useState29(false);
14017
+ const measureOverflow = useCallback20(() => {
14018
+ const el = scrollContainerRef.current;
14019
+ if (!el || orientation !== "horizontal") {
14020
+ setCanScrollLeft(false);
14021
+ setCanScrollRight(false);
14022
+ return;
14023
+ }
14024
+ const max = el.scrollWidth - el.clientWidth;
14025
+ setCanScrollLeft(el.scrollLeft > SCROLL_EDGE_EPSILON);
14026
+ setCanScrollRight(el.scrollLeft < max - SCROLL_EDGE_EPSILON);
14027
+ }, [orientation]);
14028
+ useEffect21(() => {
14029
+ measureOverflow();
14030
+ const el = scrollContainerRef.current;
14031
+ if (!el || typeof ResizeObserver === "undefined") return;
14032
+ const ro = new ResizeObserver(() => measureOverflow());
14033
+ ro.observe(el);
14034
+ return () => ro.disconnect();
14035
+ }, [items, measureOverflow]);
14036
+ const onScroll = () => measureOverflow();
14037
+ const scrollBy = (dir) => {
14038
+ const el = scrollContainerRef.current;
14039
+ if (!el) return;
14040
+ el.scrollBy({ left: dir * SCROLL_STEP_PX, behavior: "smooth" });
14041
+ };
13692
14042
  const currentPanelContent = panelContentMap.get(String(selectedKey));
13693
14043
  return /* @__PURE__ */ jsxs77("div", { className: cn("ods-tabs", `ods-tabs--${orientation}`, className), children: [
13694
- /* @__PURE__ */ jsx80("div", { ...tabListProps, ref, className: "ods-tabs__list", children: [...state.collection].map((item) => /* @__PURE__ */ jsx80(TabButton, { item, state }, item.key)) }),
14044
+ /* @__PURE__ */ jsxs77("div", { className: "ods-tabs__list-wrap", children: [
14045
+ orientation === "horizontal" && canScrollLeft && /* @__PURE__ */ jsx80(
14046
+ "button",
14047
+ {
14048
+ type: "button",
14049
+ className: "ods-tabs__scroll-btn ods-tabs__scroll-btn--left",
14050
+ onClick: () => scrollBy(-1),
14051
+ "aria-label": "Scroll tabs left",
14052
+ tabIndex: -1,
14053
+ children: /* @__PURE__ */ jsx80(ChevronSvg, { dir: "left" })
14054
+ }
14055
+ ),
14056
+ /* @__PURE__ */ jsx80(
14057
+ "div",
14058
+ {
14059
+ className: "ods-tabs__scroller",
14060
+ ref: scrollContainerRef,
14061
+ onScroll: orientation === "horizontal" ? onScroll : void 0,
14062
+ children: /* @__PURE__ */ jsx80("div", { ...tabListProps, ref, className: "ods-tabs__list", children: [...state.collection].map((item) => /* @__PURE__ */ jsx80(
14063
+ TabButton,
14064
+ {
14065
+ item,
14066
+ state,
14067
+ indicatorLayoutId
14068
+ },
14069
+ item.key
14070
+ )) })
14071
+ }
14072
+ ),
14073
+ orientation === "horizontal" && canScrollRight && /* @__PURE__ */ jsx80(
14074
+ "button",
14075
+ {
14076
+ type: "button",
14077
+ className: "ods-tabs__scroll-btn ods-tabs__scroll-btn--right",
14078
+ onClick: () => scrollBy(1),
14079
+ "aria-label": "Scroll tabs right",
14080
+ tabIndex: -1,
14081
+ children: /* @__PURE__ */ jsx80(ChevronSvg, { dir: "right" })
14082
+ }
14083
+ )
14084
+ ] }),
13695
14085
  /* @__PURE__ */ jsx80(TabPanelContent, { state, panelContent: currentPanelContent }, state.selectedKey)
13696
14086
  ] });
13697
14087
  }
14088
+ function ChevronSvg({ dir }) {
14089
+ const d = dir === "left" ? "M11 4L5 10l6 6" : "M9 4l6 6-6 6";
14090
+ return /* @__PURE__ */ jsx80(
14091
+ "svg",
14092
+ {
14093
+ width: "14",
14094
+ height: "14",
14095
+ viewBox: "0 0 20 20",
14096
+ fill: "none",
14097
+ stroke: "currentColor",
14098
+ strokeWidth: "1.8",
14099
+ strokeLinecap: "round",
14100
+ strokeLinejoin: "round",
14101
+ "aria-hidden": "true",
14102
+ children: /* @__PURE__ */ jsx80("path", { d })
14103
+ }
14104
+ );
14105
+ }
13698
14106
 
13699
14107
  // src/components/TagsInput/TagsInput.tsx
13700
- import { useState as useState28 } from "react";
14108
+ import { useState as useState30 } from "react";
13701
14109
  import { jsx as jsx81, jsxs as jsxs78 } from "react/jsx-runtime";
13702
14110
  function TagsInput({
13703
14111
  label,
@@ -13713,7 +14121,7 @@ function TagsInput({
13713
14121
  separators = ["Enter", ","],
13714
14122
  className
13715
14123
  }) {
13716
- const [draft, setDraft] = useState28("");
14124
+ const [draft, setDraft] = useState30("");
13717
14125
  const addTag = (raw) => {
13718
14126
  const tag = raw.trim();
13719
14127
  if (!tag) return;
@@ -13841,7 +14249,7 @@ function TestimonialCard({
13841
14249
  }
13842
14250
 
13843
14251
  // src/components/Textarea/Textarea.tsx
13844
- import { useId as useId7, useRef as useRef33, useState as useState29 } from "react";
14252
+ import { useId as useId8, useRef as useRef35, useState as useState31 } from "react";
13845
14253
  import { useTextField } from "react-aria";
13846
14254
  import { jsx as jsx83, jsxs as jsxs80 } from "react/jsx-runtime";
13847
14255
  function Textarea({
@@ -13859,9 +14267,9 @@ function Textarea({
13859
14267
  onChange,
13860
14268
  ...props
13861
14269
  }) {
13862
- const ref = useRef33(null);
13863
- const errorId = useId7();
13864
- const [charCount, setCharCount] = useState29(() => String(value ?? defaultValue ?? "").length);
14270
+ const ref = useRef35(null);
14271
+ const errorId = useId8();
14272
+ const [charCount, setCharCount] = useState31(() => String(value ?? defaultValue ?? "").length);
13865
14273
  const ariaNameProps = resolveAccessibleName({
13866
14274
  label,
13867
14275
  ariaLabel: props["aria-label"],
@@ -13958,13 +14366,13 @@ function Timeline({ items, size = "md", className }) {
13958
14366
 
13959
14367
  // src/components/TimePicker/TimePicker.tsx
13960
14368
  import {
13961
- Fragment as Fragment20,
13962
- useCallback as useCallback20,
13963
- useEffect as useEffect19,
13964
- useRef as useRef34,
13965
- useState as useState30
14369
+ Fragment as Fragment21,
14370
+ useCallback as useCallback21,
14371
+ useEffect as useEffect22,
14372
+ useRef as useRef36,
14373
+ useState as useState32
13966
14374
  } from "react";
13967
- import { Fragment as Fragment21, jsx as jsx85, jsxs as jsxs82 } from "react/jsx-runtime";
14375
+ import { Fragment as Fragment22, jsx as jsx85, jsxs as jsxs82 } from "react/jsx-runtime";
13968
14376
  var pad = (n) => n.toString().padStart(2, "0");
13969
14377
  function format(v, use24h, showSeconds) {
13970
14378
  const base = `${pad(v.hours)}:${pad(v.minutes)}${showSeconds ? `:${pad(v.seconds ?? 0)}` : ""}`;
@@ -13991,15 +14399,15 @@ function TimePicker({
13991
14399
  helperText,
13992
14400
  className
13993
14401
  }) {
13994
- const [open, setOpen] = useState30(false);
13995
- const [activeSeg, setActiveSeg] = useState30(null);
13996
- const draftRef = useRef34("");
13997
- const wrapRef = useRef34(null);
13998
- const hoursRef = useRef34(null);
13999
- const minutesRef = useRef34(null);
14000
- const secondsRef = useRef34(null);
14402
+ const [open, setOpen] = useState32(false);
14403
+ const [activeSeg, setActiveSeg] = useState32(null);
14404
+ const draftRef = useRef36("");
14405
+ const wrapRef = useRef36(null);
14406
+ const hoursRef = useRef36(null);
14407
+ const minutesRef = useRef36(null);
14408
+ const secondsRef = useRef36(null);
14001
14409
  const refOf = (s) => s === "hours" ? hoursRef : s === "minutes" ? minutesRef : secondsRef;
14002
- useEffect19(() => {
14410
+ useEffect22(() => {
14003
14411
  if (!open) return;
14004
14412
  const onDoc = (e) => {
14005
14413
  if (!wrapRef.current?.contains(e.target)) {
@@ -14010,7 +14418,7 @@ function TimePicker({
14010
14418
  document.addEventListener("mousedown", onDoc);
14011
14419
  return () => document.removeEventListener("mousedown", onDoc);
14012
14420
  }, [open]);
14013
- const commit = useCallback20(
14421
+ const commit = useCallback21(
14014
14422
  (seg, n) => {
14015
14423
  const next = { ...value, [seg]: clampSeg(seg, n, use24h) };
14016
14424
  if (showSeconds && next.seconds === void 0) next.seconds = 0;
@@ -14173,7 +14581,7 @@ function TimePicker({
14173
14581
  segButton("hours", value.hours),
14174
14582
  /* @__PURE__ */ jsx85("span", { className: "ods-timepicker__display-sep", children: ":" }),
14175
14583
  segButton("minutes", value.minutes),
14176
- showSeconds && /* @__PURE__ */ jsxs82(Fragment21, { children: [
14584
+ showSeconds && /* @__PURE__ */ jsxs82(Fragment22, { children: [
14177
14585
  /* @__PURE__ */ jsx85("span", { className: "ods-timepicker__display-sep", children: ":" }),
14178
14586
  segButton("seconds", value.seconds ?? 0)
14179
14587
  ] })
@@ -14205,7 +14613,7 @@ function TimePicker({
14205
14613
  )
14206
14614
  ] })
14207
14615
  ] }),
14208
- /* @__PURE__ */ jsx85("div", { className: "ods-timepicker__body", children: segOrder().map((seg, i, arr) => /* @__PURE__ */ jsxs82(Fragment20, { children: [
14616
+ /* @__PURE__ */ jsx85("div", { className: "ods-timepicker__body", children: segOrder().map((seg, i, arr) => /* @__PURE__ */ jsxs82(Fragment21, { children: [
14209
14617
  /* @__PURE__ */ jsxs82("div", { className: "ods-timepicker__col", children: [
14210
14618
  /* @__PURE__ */ jsx85("span", { className: "ods-timepicker__col-lbl", children: seg === "hours" ? "HOUR" : seg === "minutes" ? "MIN" : "SEC" }),
14211
14619
  /* @__PURE__ */ jsx85(
@@ -14260,8 +14668,8 @@ function TimePicker({
14260
14668
  }
14261
14669
 
14262
14670
  // src/components/TimezonePicker/TimezonePicker.tsx
14263
- import { useEffect as useEffect20, useMemo as useMemo13, useRef as useRef35, useState as useState31 } from "react";
14264
- import { Fragment as Fragment22, jsx as jsx86, jsxs as jsxs83 } from "react/jsx-runtime";
14671
+ import { useEffect as useEffect23, useMemo as useMemo13, useRef as useRef37, useState as useState33 } from "react";
14672
+ import { Fragment as Fragment23, jsx as jsx86, jsxs as jsxs83 } from "react/jsx-runtime";
14265
14673
  var DEFAULT_TZS = [
14266
14674
  { iana: "America/Los_Angeles", label: "Pacific Time", offset: "UTC\u22128" },
14267
14675
  { iana: "America/Denver", label: "Mountain Time", offset: "UTC\u22127" },
@@ -14288,10 +14696,10 @@ function TimezonePicker({
14288
14696
  placeholder = "Select timezone",
14289
14697
  className
14290
14698
  }) {
14291
- const [open, setOpen] = useState31(false);
14292
- const [query, setQuery] = useState31("");
14293
- const wrapRef = useRef35(null);
14294
- const inputRef = useRef35(null);
14699
+ const [open, setOpen] = useState33(false);
14700
+ const [query, setQuery] = useState33("");
14701
+ const wrapRef = useRef37(null);
14702
+ const inputRef = useRef37(null);
14295
14703
  const selected = options.find((o) => o.iana === value);
14296
14704
  const filtered = useMemo13(() => {
14297
14705
  if (!query.trim()) return options;
@@ -14300,7 +14708,7 @@ function TimezonePicker({
14300
14708
  (o) => o.iana.toLowerCase().includes(q2) || o.label.toLowerCase().includes(q2) || o.offset.toLowerCase().includes(q2) || o.region?.toLowerCase().includes(q2)
14301
14709
  );
14302
14710
  }, [options, query]);
14303
- useEffect20(() => {
14711
+ useEffect23(() => {
14304
14712
  if (!open) return;
14305
14713
  const onDoc = (e) => {
14306
14714
  if (!wrapRef.current?.contains(e.target)) {
@@ -14311,7 +14719,7 @@ function TimezonePicker({
14311
14719
  document.addEventListener("mousedown", onDoc);
14312
14720
  return () => document.removeEventListener("mousedown", onDoc);
14313
14721
  }, [open]);
14314
- useEffect20(() => {
14722
+ useEffect23(() => {
14315
14723
  if (open) requestAnimationFrame(() => inputRef.current?.focus());
14316
14724
  }, [open]);
14317
14725
  const select = (iana) => {
@@ -14354,7 +14762,7 @@ function TimezonePicker({
14354
14762
  }
14355
14763
  )
14356
14764
  ] }),
14357
- /* @__PURE__ */ jsx86("span", { className: "ods-tzpicker__info", children: selected ? /* @__PURE__ */ jsxs83(Fragment22, { children: [
14765
+ /* @__PURE__ */ jsx86("span", { className: "ods-tzpicker__info", children: selected ? /* @__PURE__ */ jsxs83(Fragment23, { children: [
14358
14766
  /* @__PURE__ */ jsx86("span", { className: "ods-tzpicker__name", children: selected.label }),
14359
14767
  /* @__PURE__ */ jsxs83("span", { className: "ods-tzpicker__meta", children: [
14360
14768
  selected.iana.split("/").pop()?.replace(/_/g, " "),
@@ -14466,14 +14874,14 @@ function TimezonePicker({
14466
14874
  import { AnimatePresence as AnimatePresence9, motion as motion13 } from "framer-motion";
14467
14875
  import {
14468
14876
  createContext as createContext2,
14469
- useCallback as useCallback21,
14877
+ useCallback as useCallback22,
14470
14878
  useContext as useContext2,
14471
14879
  useMemo as useMemo14,
14472
- useRef as useRef36,
14473
- useState as useState32
14880
+ useRef as useRef38,
14881
+ useState as useState34
14474
14882
  } from "react";
14475
14883
  import { createPortal as createPortal10 } from "react-dom";
14476
- import { Fragment as Fragment23, jsx as jsx87, jsxs as jsxs84 } from "react/jsx-runtime";
14884
+ import { Fragment as Fragment24, jsx as jsx87, jsxs as jsxs84 } from "react/jsx-runtime";
14477
14885
  var defaultIcons = {
14478
14886
  success: /* @__PURE__ */ jsxs84("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
14479
14887
  /* @__PURE__ */ jsx87(
@@ -14564,9 +14972,9 @@ var defaultIcons = {
14564
14972
  var ToastContext = createContext2(null);
14565
14973
  function ToastBody({ item, onDismiss }) {
14566
14974
  const dismiss = () => onDismiss(item.id);
14567
- if (item.render) return /* @__PURE__ */ jsx87(Fragment23, { children: item.render({ id: item.id, dismiss }) });
14975
+ if (item.render) return /* @__PURE__ */ jsx87(Fragment24, { children: item.render({ id: item.id, dismiss }) });
14568
14976
  const title = item.title ?? item.message;
14569
- return /* @__PURE__ */ jsxs84(Fragment23, { children: [
14977
+ return /* @__PURE__ */ jsxs84(Fragment24, { children: [
14570
14978
  /* @__PURE__ */ jsx87("span", { className: "ods-toast__icon", "aria-hidden": "true", children: item.icon ?? defaultIcons[item.variant] }),
14571
14979
  /* @__PURE__ */ jsxs84("div", { className: "ods-toast__body", children: [
14572
14980
  title && /* @__PURE__ */ jsx87("div", { className: "ods-toast__title", children: title }),
@@ -14597,8 +15005,8 @@ function ToastBody({ item, onDismiss }) {
14597
15005
  ] });
14598
15006
  }
14599
15007
  function PositionStack({ items, position, onDismiss, maxStack }) {
14600
- const [hovered, setHovered] = useState32(false);
14601
- const [pinned, setPinned] = useState32(false);
15008
+ const [hovered, setHovered] = useState34(false);
15009
+ const [pinned, setPinned] = useState34(false);
14602
15010
  const expanded = hovered || pinned;
14603
15011
  const ordered = useMemo14(() => [...items].reverse(), [items]);
14604
15012
  const isBottom = position.startsWith("bottom");
@@ -14698,10 +15106,10 @@ function ToastProvider({
14698
15106
  defaultPosition = "bottom-right",
14699
15107
  maxStack = 3
14700
15108
  }) {
14701
- const [toasts, setToasts] = useState32([]);
14702
- const timers = useRef36(/* @__PURE__ */ new Map());
14703
- const idCounter2 = useRef36(0);
14704
- const dismiss = useCallback21((id) => {
15109
+ const [toasts, setToasts] = useState34([]);
15110
+ const timers = useRef38(/* @__PURE__ */ new Map());
15111
+ const idCounter2 = useRef38(0);
15112
+ const dismiss = useCallback22((id) => {
14705
15113
  setToasts((prev) => prev.filter((t) => t.id !== id));
14706
15114
  const timer = timers.current.get(id);
14707
15115
  if (timer) {
@@ -14709,7 +15117,7 @@ function ToastProvider({
14709
15117
  timers.current.delete(id);
14710
15118
  }
14711
15119
  }, []);
14712
- const dismissAll = useCallback21((position) => {
15120
+ const dismissAll = useCallback22((position) => {
14713
15121
  setToasts((prev) => {
14714
15122
  const remaining = position ? prev.filter((t) => t.position !== position) : [];
14715
15123
  for (const t of prev) {
@@ -14724,7 +15132,7 @@ function ToastProvider({
14724
15132
  return remaining;
14725
15133
  });
14726
15134
  }, []);
14727
- const toast = useCallback21(
15135
+ const toast = useCallback22(
14728
15136
  (options) => {
14729
15137
  const id = `toast-${++idCounter2.current}`;
14730
15138
  const item = {
@@ -14762,7 +15170,7 @@ function ToastProvider({
14762
15170
  return out;
14763
15171
  }, [toasts]);
14764
15172
  const ctx = { toast, dismiss, dismissAll };
14765
- const containers = /* @__PURE__ */ jsx87(Fragment23, { children: POSITIONS.map((pos) => {
15173
+ const containers = /* @__PURE__ */ jsx87(Fragment24, { children: POSITIONS.map((pos) => {
14766
15174
  const list = groups[pos];
14767
15175
  if (list.length === 0) return null;
14768
15176
  return /* @__PURE__ */ jsx87(
@@ -15020,15 +15428,15 @@ function ToolCard({
15020
15428
  import { AnimatePresence as AnimatePresence10, motion as motion14 } from "framer-motion";
15021
15429
  import {
15022
15430
  cloneElement,
15023
- useCallback as useCallback22,
15024
- useEffect as useEffect21,
15431
+ useCallback as useCallback23,
15432
+ useEffect as useEffect24,
15025
15433
  useLayoutEffect as useLayoutEffect5,
15026
- useRef as useRef37,
15027
- useState as useState33
15434
+ useRef as useRef39,
15435
+ useState as useState35
15028
15436
  } from "react";
15029
15437
  import { useTooltip, useTooltipTrigger } from "react-aria";
15030
15438
  import { createPortal as createPortal11 } from "react-dom";
15031
- import { Fragment as Fragment24, jsx as jsx91, jsxs as jsxs88 } from "react/jsx-runtime";
15439
+ import { Fragment as Fragment25, jsx as jsx91, jsxs as jsxs88 } from "react/jsx-runtime";
15032
15440
  function computePosition3(rect, tipRect, position, offset) {
15033
15441
  const cx = rect.left + rect.width / 2;
15034
15442
  const cy = rect.top + rect.height / 2;
@@ -15058,9 +15466,9 @@ function TooltipContent({
15058
15466
  offset
15059
15467
  }) {
15060
15468
  const { tooltipProps } = useTooltip({ isOpen: state.isOpen }, state);
15061
- const tipRef = useRef37(null);
15062
- const [coords, setCoords] = useState33(null);
15063
- const reposition = useCallback22(() => {
15469
+ const tipRef = useRef39(null);
15470
+ const [coords, setCoords] = useState35(null);
15471
+ const reposition = useCallback23(() => {
15064
15472
  if (!triggerRef.current || !tipRef.current) return;
15065
15473
  const trigRect = triggerRef.current.getBoundingClientRect();
15066
15474
  const tipRect = tipRef.current.getBoundingClientRect();
@@ -15072,7 +15480,7 @@ function TooltipContent({
15072
15480
  const id = requestAnimationFrame(reposition);
15073
15481
  return () => cancelAnimationFrame(id);
15074
15482
  }, [state.isOpen, reposition]);
15075
- useEffect21(() => {
15483
+ useEffect24(() => {
15076
15484
  if (!state.isOpen) return;
15077
15485
  const handler = () => reposition();
15078
15486
  window.addEventListener("scroll", handler, true);
@@ -15128,10 +15536,10 @@ function Tooltip({
15128
15536
  children,
15129
15537
  className
15130
15538
  }) {
15131
- const triggerRef = useRef37(null);
15539
+ const triggerRef = useRef39(null);
15132
15540
  const state = $3834487504f4fc00$export$4d40659c25ecb50b({ delay });
15133
15541
  const { triggerProps } = useTooltipTrigger({ delay }, state, triggerRef);
15134
- return /* @__PURE__ */ jsxs88(Fragment24, { children: [
15542
+ return /* @__PURE__ */ jsxs88(Fragment25, { children: [
15135
15543
  cloneElement(children, {
15136
15544
  ...triggerProps,
15137
15545
  ref: triggerRef
@@ -15232,7 +15640,7 @@ function TopBar({
15232
15640
  }
15233
15641
 
15234
15642
  // src/components/TraceStep/TraceStep.tsx
15235
- import { useState as useState34 } from "react";
15643
+ import { useState as useState36 } from "react";
15236
15644
  import { jsx as jsx93, jsxs as jsxs90 } from "react/jsx-runtime";
15237
15645
  var KIND_GLYPH = {
15238
15646
  thought: /* @__PURE__ */ jsx93("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx93(
@@ -15293,7 +15701,7 @@ function TraceStep({
15293
15701
  isLast = false,
15294
15702
  className
15295
15703
  }) {
15296
- const [open, setOpen] = useState34(defaultOpen);
15704
+ const [open, setOpen] = useState36(defaultOpen);
15297
15705
  const canExpand = !!children;
15298
15706
  return /* @__PURE__ */ jsxs90(
15299
15707
  "div",
@@ -15412,10 +15820,10 @@ function UserCard({ name, role, avatar, initial, stats, action, className }) {
15412
15820
  }
15413
15821
 
15414
15822
  // src/components/WorkflowEditor/WorkflowEditor.tsx
15415
- import { useCallback as useCallback24, useMemo as useMemo16, useState as useState35 } from "react";
15823
+ import { useCallback as useCallback25, useMemo as useMemo16, useState as useState37 } from "react";
15416
15824
 
15417
15825
  // src/hooks/useWorkflow.ts
15418
- import { useCallback as useCallback23, useMemo as useMemo15, useReducer } from "react";
15826
+ import { useCallback as useCallback24, useMemo as useMemo15, useReducer } from "react";
15419
15827
 
15420
15828
  // src/workflow/types.ts
15421
15829
  var types_exports = {};
@@ -15929,11 +16337,11 @@ function useWorkflow(options = {}) {
15929
16337
  []
15930
16338
  );
15931
16339
  const [workflow, dispatch] = useReducer(reducer, initial);
15932
- const addNode = useCallback23(
16340
+ const addNode = useCallback24(
15933
16341
  (node) => dispatch({ type: "ADD_NODE", payload: node }),
15934
16342
  []
15935
16343
  );
15936
- const createNode = useCallback23(
16344
+ const createNode = useCallback24(
15937
16345
  (partial) => {
15938
16346
  const id = partial.id ?? genId("node");
15939
16347
  const ports = partial.ports ?? {
@@ -15982,27 +16390,27 @@ function useWorkflow(options = {}) {
15982
16390
  },
15983
16391
  []
15984
16392
  );
15985
- const updateNode = useCallback23(
16393
+ const updateNode = useCallback24(
15986
16394
  (id, updates) => dispatch({ type: "UPDATE_NODE", payload: { id, updates } }),
15987
16395
  []
15988
16396
  );
15989
- const deleteNode = useCallback23(
16397
+ const deleteNode = useCallback24(
15990
16398
  (id) => dispatch({ type: "DELETE_NODE", payload: id }),
15991
16399
  []
15992
16400
  );
15993
- const deleteNodes = useCallback23(
16401
+ const deleteNodes = useCallback24(
15994
16402
  (ids) => dispatch({ type: "DELETE_NODES", payload: ids }),
15995
16403
  []
15996
16404
  );
15997
- const replaceNodes = useCallback23(
16405
+ const replaceNodes = useCallback24(
15998
16406
  (nodes) => dispatch({ type: "REPLACE_NODES", payload: nodes }),
15999
16407
  []
16000
16408
  );
16001
- const addEdge = useCallback23(
16409
+ const addEdge = useCallback24(
16002
16410
  (edge) => dispatch({ type: "ADD_EDGE", payload: edge }),
16003
16411
  []
16004
16412
  );
16005
- const createEdge = useCallback23(
16413
+ const createEdge = useCallback24(
16006
16414
  (source, sourcePort, target, targetPort) => {
16007
16415
  const edge = {
16008
16416
  id: genId("edge"),
@@ -16020,20 +16428,20 @@ function useWorkflow(options = {}) {
16020
16428
  },
16021
16429
  []
16022
16430
  );
16023
- const deleteEdge = useCallback23(
16431
+ const deleteEdge = useCallback24(
16024
16432
  (id) => dispatch({ type: "DELETE_EDGE", payload: id }),
16025
16433
  []
16026
16434
  );
16027
- const replaceEdges = useCallback23(
16435
+ const replaceEdges = useCallback24(
16028
16436
  (edges) => dispatch({ type: "REPLACE_EDGES", payload: edges }),
16029
16437
  []
16030
16438
  );
16031
- const startConnecting = useCallback23(
16439
+ const startConnecting = useCallback24(
16032
16440
  (nodeId, portId, portType) => dispatch({ type: "START_CONNECTING", payload: { nodeId, portId, portType } }),
16033
16441
  []
16034
16442
  );
16035
- const endConnecting = useCallback23(() => dispatch({ type: "END_CONNECTING" }), []);
16036
- const selectNode = useCallback23(
16443
+ const endConnecting = useCallback24(() => dispatch({ type: "END_CONNECTING" }), []);
16444
+ const selectNode = useCallback24(
16037
16445
  (id, multi = false) => {
16038
16446
  if (multi) {
16039
16447
  const current = workflow.canvas.selectedNodes;
@@ -16045,36 +16453,36 @@ function useWorkflow(options = {}) {
16045
16453
  },
16046
16454
  [workflow.canvas.selectedNodes]
16047
16455
  );
16048
- const selectNodes = useCallback23(
16456
+ const selectNodes = useCallback24(
16049
16457
  (ids) => dispatch({ type: "SELECT_NODES", payload: ids }),
16050
16458
  []
16051
16459
  );
16052
- const selectEdge = useCallback23(
16460
+ const selectEdge = useCallback24(
16053
16461
  (id) => dispatch({ type: "SELECT_EDGE", payload: id }),
16054
16462
  []
16055
16463
  );
16056
- const deselectAll = useCallback23(() => dispatch({ type: "DESELECT_ALL" }), []);
16057
- const zoomIn = useCallback23(() => {
16464
+ const deselectAll = useCallback24(() => dispatch({ type: "DESELECT_ALL" }), []);
16465
+ const zoomIn = useCallback24(() => {
16058
16466
  const z = Math.min(workflow.canvas.viewport.zoom * 1.2, 2);
16059
16467
  dispatch({ type: "UPDATE_VIEWPORT", payload: { zoom: z } });
16060
16468
  }, [workflow.canvas.viewport.zoom]);
16061
- const zoomOut = useCallback23(() => {
16469
+ const zoomOut = useCallback24(() => {
16062
16470
  const z = Math.max(workflow.canvas.viewport.zoom / 1.2, 0.25);
16063
16471
  dispatch({ type: "UPDATE_VIEWPORT", payload: { zoom: z } });
16064
16472
  }, [workflow.canvas.viewport.zoom]);
16065
- const resetViewport = useCallback23(
16473
+ const resetViewport = useCallback24(
16066
16474
  () => dispatch({ type: "UPDATE_VIEWPORT", payload: { x: 0, y: 0, zoom: 1 } }),
16067
16475
  []
16068
16476
  );
16069
- const setViewport = useCallback23(
16477
+ const setViewport = useCallback24(
16070
16478
  (viewport) => dispatch({ type: "UPDATE_VIEWPORT", payload: viewport }),
16071
16479
  []
16072
16480
  );
16073
- const undo = useCallback23(() => dispatch({ type: "UNDO" }), []);
16074
- const redo = useCallback23(() => dispatch({ type: "REDO" }), []);
16481
+ const undo = useCallback24(() => dispatch({ type: "UNDO" }), []);
16482
+ const redo = useCallback24(() => dispatch({ type: "REDO" }), []);
16075
16483
  const canUndo = workflow.canvas.history.past.length > 0;
16076
16484
  const canRedo = workflow.canvas.history.future.length > 0;
16077
- const validate = useCallback23(() => workflow.validation, [workflow.validation]);
16485
+ const validate = useCallback24(() => workflow.validation, [workflow.validation]);
16078
16486
  return {
16079
16487
  workflow,
16080
16488
  dispatch,
@@ -16180,35 +16588,35 @@ function WorkflowEditor({
16180
16588
  }) {
16181
16589
  const wf = useWorkflow(options);
16182
16590
  const { workflow, dispatch, canUndo, canRedo, undo, redo } = wf;
16183
- const [uncontrolledLock, setUncontrolledLock] = useState35(false);
16184
- const [uncontrolledDrawer, setUncontrolledDrawer] = useState35(!!drawer);
16185
- const [uncontrolledHistory, setUncontrolledHistory] = useState35(false);
16186
- const [uncontrolledDebug, setUncontrolledDebug] = useState35(false);
16591
+ const [uncontrolledLock, setUncontrolledLock] = useState37(false);
16592
+ const [uncontrolledDrawer, setUncontrolledDrawer] = useState37(!!drawer);
16593
+ const [uncontrolledHistory, setUncontrolledHistory] = useState37(false);
16594
+ const [uncontrolledDebug, setUncontrolledDebug] = useState37(false);
16187
16595
  const isLockMode = controlledLockMode ?? uncontrolledLock;
16188
16596
  const isDrawerOpen = controlledDrawerOpen ?? uncontrolledDrawer;
16189
16597
  const isHistoryOpen = controlledHistoryOpen ?? uncontrolledHistory;
16190
16598
  const isDebugOpen = controlledDebugOpen ?? uncontrolledDebug;
16191
- const toggleLock = useCallback24(() => {
16599
+ const toggleLock = useCallback25(() => {
16192
16600
  const next = !isLockMode;
16193
16601
  if (controlledLockMode === void 0) setUncontrolledLock(next);
16194
16602
  onToggleLockMode?.(next);
16195
16603
  }, [isLockMode, controlledLockMode, onToggleLockMode]);
16196
- const toggleDrawer = useCallback24(() => {
16604
+ const toggleDrawer = useCallback25(() => {
16197
16605
  const next = !isDrawerOpen;
16198
16606
  if (controlledDrawerOpen === void 0) setUncontrolledDrawer(next);
16199
16607
  onToggleDrawer?.(next);
16200
16608
  }, [isDrawerOpen, controlledDrawerOpen, onToggleDrawer]);
16201
- const toggleHistory = useCallback24(() => {
16609
+ const toggleHistory = useCallback25(() => {
16202
16610
  const next = !isHistoryOpen;
16203
16611
  if (controlledHistoryOpen === void 0) setUncontrolledHistory(next);
16204
16612
  onToggleHistory?.(next);
16205
16613
  }, [isHistoryOpen, controlledHistoryOpen, onToggleHistory]);
16206
- const toggleDebug = useCallback24(() => {
16614
+ const toggleDebug = useCallback25(() => {
16207
16615
  const next = !isDebugOpen;
16208
16616
  if (controlledDebugOpen === void 0) setUncontrolledDebug(next);
16209
16617
  onToggleDebug?.(next);
16210
16618
  }, [isDebugOpen, controlledDebugOpen, onToggleDebug]);
16211
- const handleReset = useCallback24(() => {
16619
+ const handleReset = useCallback25(() => {
16212
16620
  if (onReset) onReset();
16213
16621
  else dispatch({ type: "RESET" });
16214
16622
  }, [onReset, dispatch]);
@@ -16217,7 +16625,7 @@ function WorkflowEditor({
16217
16625
  [workflow.canvas.nodes]
16218
16626
  );
16219
16627
  const nextEdges = useMemo16(() => workflow.canvas.edges.map(toNextEdge), [workflow.canvas.edges]);
16220
- const onNodesChange = useCallback24(
16628
+ const onNodesChange = useCallback25(
16221
16629
  (changes) => {
16222
16630
  const reduced = applyNodeChanges(
16223
16631
  nextNodes,
@@ -16258,7 +16666,7 @@ function WorkflowEditor({
16258
16666
  },
16259
16667
  [nextNodes, workflow.canvas.nodes, wf, onNodeSelect]
16260
16668
  );
16261
- const onEdgesChange = useCallback24(
16669
+ const onEdgesChange = useCallback25(
16262
16670
  (changes) => {
16263
16671
  const reduced = applyEdgeChanges(nextEdges, changes);
16264
16672
  const byId = new Map(reduced.map((e) => [e.id, e]));
@@ -16268,18 +16676,18 @@ function WorkflowEditor({
16268
16676
  },
16269
16677
  [nextEdges, workflow.canvas.edges, wf]
16270
16678
  );
16271
- const onConnect = useCallback24(
16679
+ const onConnect = useCallback25(
16272
16680
  (c) => {
16273
16681
  wf.createEdge(c.source, c.sourceHandle ?? "default", c.target, c.targetHandle ?? "default");
16274
16682
  },
16275
16683
  [wf]
16276
16684
  );
16277
- const [canvasSize, setCanvasSize] = useState35({ w: 0, h: 0 });
16278
- const handleCanvasRef = useCallback24((node) => {
16685
+ const [canvasSize, setCanvasSize] = useState37({ w: 0, h: 0 });
16686
+ const handleCanvasRef = useCallback25((node) => {
16279
16687
  if (!node) return;
16280
16688
  setCanvasSize({ w: node.clientWidth, h: node.clientHeight });
16281
16689
  }, []);
16282
- const fitToView = useCallback24(() => {
16690
+ const fitToView = useCallback25(() => {
16283
16691
  const nodes = workflow.canvas.nodes;
16284
16692
  if (nodes.length === 0) return;
16285
16693
  let minX = Infinity;
@@ -16513,8 +16921,8 @@ function DefaultEmptyState() {
16513
16921
  }
16514
16922
 
16515
16923
  // src/components/XmlViewer/XmlViewer.tsx
16516
- import { useMemo as useMemo17, useState as useState36 } from "react";
16517
- import { Fragment as Fragment25, jsx as jsx96, jsxs as jsxs93 } from "react/jsx-runtime";
16924
+ import { useMemo as useMemo17, useState as useState38 } from "react";
16925
+ import { Fragment as Fragment26, jsx as jsx96, jsxs as jsxs93 } from "react/jsx-runtime";
16518
16926
  function parseXml(src) {
16519
16927
  if (typeof window !== "undefined" && typeof window.DOMParser !== "undefined") {
16520
16928
  try {
@@ -16595,7 +17003,7 @@ function XmlNodeRow({
16595
17003
  showAttributes,
16596
17004
  truncateAt
16597
17005
  }) {
16598
- const [open, setOpen] = useState36(depth < defaultExpandDepth);
17006
+ const [open, setOpen] = useState38(depth < defaultExpandDepth);
16599
17007
  const pad2 = depth * 14;
16600
17008
  if (node.type === "text") {
16601
17009
  const t = (node.text ?? "").trim();
@@ -16664,9 +17072,9 @@ function XmlNodeRow({
16664
17072
  /* @__PURE__ */ jsx96("span", { className: "ods-xml-viewer__attr-eq", children: "=" }),
16665
17073
  /* @__PURE__ */ jsx96("span", { className: "ods-xml-viewer__attr-value", children: `"${v}"` })
16666
17074
  ] }, k)),
16667
- isSelfClosing ? /* @__PURE__ */ jsx96("span", { className: "ods-xml-viewer__bracket", children: " />" }) : /* @__PURE__ */ jsxs93(Fragment25, { children: [
17075
+ isSelfClosing ? /* @__PURE__ */ jsx96("span", { className: "ods-xml-viewer__bracket", children: " />" }) : /* @__PURE__ */ jsxs93(Fragment26, { children: [
16668
17076
  /* @__PURE__ */ jsx96("span", { className: "ods-xml-viewer__bracket", children: ">" }),
16669
- !open && /* @__PURE__ */ jsxs93(Fragment25, { children: [
17077
+ !open && /* @__PURE__ */ jsxs93(Fragment26, { children: [
16670
17078
  /* @__PURE__ */ jsxs93("span", { className: "ods-xml-viewer__preview", children: [
16671
17079
  children.length,
16672
17080
  " child",
@@ -16680,7 +17088,7 @@ function XmlNodeRow({
16680
17088
  ]
16681
17089
  }
16682
17090
  ),
16683
- !isSelfClosing && open && /* @__PURE__ */ jsxs93(Fragment25, { children: [
17091
+ !isSelfClosing && open && /* @__PURE__ */ jsxs93(Fragment26, { children: [
16684
17092
  children.map((c, i) => /* @__PURE__ */ jsx96(
16685
17093
  XmlNodeRow,
16686
17094
  {
@@ -16703,8 +17111,8 @@ function XmlNodeRow({
16703
17111
  }
16704
17112
 
16705
17113
  // src/components/YamlViewer/YamlViewer.tsx
16706
- import { useMemo as useMemo18, useState as useState37 } from "react";
16707
- import { Fragment as Fragment26, jsx as jsx97, jsxs as jsxs94 } from "react/jsx-runtime";
17114
+ import { useMemo as useMemo18, useState as useState39 } from "react";
17115
+ import { Fragment as Fragment27, jsx as jsx97, jsxs as jsxs94 } from "react/jsx-runtime";
16708
17116
  function toYaml(value, indent = 0) {
16709
17117
  const pad2 = " ".repeat(indent);
16710
17118
  if (value === null) return "null";
@@ -16849,7 +17257,7 @@ function YamlViewer({
16849
17257
  }
16850
17258
  }, [data]);
16851
17259
  const tokens = useMemo18(() => tokenizeYaml(text), [text]);
16852
- const [collapsed, setCollapsed] = useState37(() => {
17260
+ const [collapsed, setCollapsed] = useState39(() => {
16853
17261
  const s = /* @__PURE__ */ new Set();
16854
17262
  tokens.forEach((t) => {
16855
17263
  if (t.hasChildren && t.depth >= defaultExpandDepth) s.add(t.index);
@@ -16930,7 +17338,7 @@ function YamlViewer({
16930
17338
  }
16931
17339
  ) : /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__caret-spacer" }),
16932
17340
  t.kind === "comment" && /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__comment", children: t.raw.trim() }),
16933
- t.kind === "key" && /* @__PURE__ */ jsxs94(Fragment26, { children: [
17341
+ t.kind === "key" && /* @__PURE__ */ jsxs94(Fragment27, { children: [
16934
17342
  t.raw.trim().startsWith("-") && /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__dash", children: "- " }),
16935
17343
  /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__key", children: t.key }),
16936
17344
  /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__colon", children: ":" }),
@@ -16949,7 +17357,7 @@ function YamlViewer({
16949
17357
  ),
16950
17358
  isCollapsed && /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__preview", children: " \u2026" })
16951
17359
  ] }),
16952
- t.kind === "sequence" && /* @__PURE__ */ jsxs94(Fragment26, { children: [
17360
+ t.kind === "sequence" && /* @__PURE__ */ jsxs94(Fragment27, { children: [
16953
17361
  /* @__PURE__ */ jsx97("span", { className: "ods-yaml-viewer__dash", children: "- " }),
16954
17362
  /* @__PURE__ */ jsx97(
16955
17363
  "span",
@@ -16983,13 +17391,13 @@ function YamlViewer({
16983
17391
 
16984
17392
  // src/provider/OdsProvider.tsx
16985
17393
  import { generateCssVars, resolveConfig } from "@octaviaflow/config";
16986
- import { createContext as createContext3, useContext as useContext3, useEffect as useEffect22, useMemo as useMemo19 } from "react";
17394
+ import { createContext as createContext3, useContext as useContext3, useEffect as useEffect25, useMemo as useMemo19 } from "react";
16987
17395
  import { OverlayProvider as OverlayProvider3 } from "react-aria";
16988
17396
  import { jsx as jsx98 } from "react/jsx-runtime";
16989
17397
  var OdsContext = createContext3(null);
16990
17398
  function OdsProvider({ config: userConfig, children }) {
16991
17399
  const resolved = useMemo19(() => resolveConfig(userConfig), [userConfig]);
16992
- useEffect22(() => {
17400
+ useEffect25(() => {
16993
17401
  const cssVarsBlock = generateCssVars(resolved);
16994
17402
  const match = cssVarsBlock.match(/:root\s*\{([\s\S]*)\}/);
16995
17403
  if (match) {
@@ -17276,9 +17684,16 @@ export {
17276
17684
  FlowMinimap,
17277
17685
  FlowNode,
17278
17686
  FlowToolbar,
17687
+ FlowToolbarAutoLayout,
17279
17688
  FlowToolbarButton,
17280
17689
  FlowToolbarDivider,
17690
+ FlowToolbarFitView,
17281
17691
  FlowToolbarIcons,
17692
+ FlowToolbarRedo,
17693
+ FlowToolbarReset,
17694
+ FlowToolbarRun,
17695
+ FlowToolbarSave,
17696
+ FlowToolbarUndo,
17282
17697
  FlowToolbarZoom,
17283
17698
  FormSection,
17284
17699
  HoverCard,