@syntrologie/adapt-nav 2.4.1 → 2.5.1

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 (63) hide show
  1. package/dist/NavWidget.d.ts +3 -3
  2. package/dist/NavWidget.d.ts.map +1 -1
  3. package/dist/NavWidget.js +47 -81
  4. package/dist/cdn.d.ts.map +1 -1
  5. package/dist/editor.d.ts.map +1 -1
  6. package/dist/editor.js +50 -20
  7. package/dist/runtime.d.ts +1 -1
  8. package/dist/runtime.d.ts.map +1 -1
  9. package/dist/runtime.js +5 -4
  10. package/dist/schema.d.ts +554 -95
  11. package/dist/schema.d.ts.map +1 -1
  12. package/dist/schema.js +6 -8
  13. package/dist/summarize.d.ts +2 -2
  14. package/dist/summarize.d.ts.map +1 -1
  15. package/dist/summarize.js +5 -5
  16. package/dist/types.d.ts +7 -49
  17. package/dist/types.d.ts.map +1 -1
  18. package/dist/types.js +1 -1
  19. package/node_modules/@syntrologie/sdk-contracts/dist/index.d.ts +105 -2
  20. package/node_modules/@syntrologie/sdk-contracts/dist/index.js +5 -3
  21. package/node_modules/@syntrologie/sdk-contracts/dist/schemas.d.ts +798 -1
  22. package/node_modules/@syntrologie/sdk-contracts/dist/schemas.js +21 -1
  23. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/AnchorPicker.test.d.ts +2 -0
  24. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/AnchorPicker.test.d.ts.map +1 -0
  25. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/AnchorPicker.test.js +224 -0
  26. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/ConditionStatusLine.test.js +102 -0
  27. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/DetectionBadge.test.js +58 -6
  28. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/DismissedSection.test.js +18 -0
  29. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/EditorCard.test.js +61 -2
  30. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/EditorPanelShell.test.js +478 -7
  31. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/ElementHighlight.test.js +54 -0
  32. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/selectorGenerator.test.d.ts +2 -0
  33. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/selectorGenerator.test.d.ts.map +1 -0
  34. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/selectorGenerator.test.js +257 -0
  35. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/useTriggerWhenStatus.test.d.ts +2 -0
  36. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/useTriggerWhenStatus.test.d.ts.map +1 -0
  37. package/node_modules/@syntrologie/shared-editor-ui/dist/__tests__/useTriggerWhenStatus.test.js +1015 -0
  38. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.js +1 -1
  39. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts +4 -4
  40. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts.map +1 -1
  41. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.js +2 -2
  42. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts +2 -1
  43. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts.map +1 -1
  44. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.js +20 -3
  45. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts +10 -8
  46. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts.map +1 -1
  47. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.js +350 -87
  48. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.js +1 -1
  49. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts +3 -3
  50. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts.map +1 -1
  51. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.js +1 -1
  52. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts +1 -1
  53. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts.map +1 -1
  54. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.js +5 -2
  55. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts +24 -0
  56. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts.map +1 -0
  57. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/{useShowWhenStatus.js → useTriggerWhenStatus.js} +18 -15
  58. package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts +3 -3
  59. package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts.map +1 -1
  60. package/node_modules/@syntrologie/shared-editor-ui/dist/index.js +1 -1
  61. package/package.json +1 -1
  62. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useShowWhenStatus.d.ts +0 -24
  63. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useShowWhenStatus.d.ts.map +0 -1
@@ -99,7 +99,7 @@ export function AnchorPicker({ isActive, onPick, onCancel, excludeSelector = '[d
99
99
  position: 'fixed',
100
100
  inset: 0,
101
101
  cursor: 'crosshair',
102
- zIndex: 2147483647,
102
+ zIndex: 2147483644,
103
103
  }, children: [_jsx("div", { style: {
104
104
  position: 'absolute',
105
105
  inset: 0,
@@ -1,7 +1,7 @@
1
1
  /**
2
- * ConditionStatusLine — inline showWhen diagnostic on EditorCard.
2
+ * ConditionStatusLine — inline triggerWhen diagnostic on EditorCard.
3
3
  *
4
- * Shows a compact one-line status for items with showWhen conditions.
4
+ * Shows a compact one-line status for items with triggerWhen conditions.
5
5
  * Click to expand per-condition detail.
6
6
  */
7
7
  import type { FormattedCondition } from '../formatConditionLabel';
@@ -10,13 +10,13 @@ export interface ConditionStatus {
10
10
  passed: boolean;
11
11
  formatted: FormattedCondition;
12
12
  }
13
- export interface ShowWhenStatus {
13
+ export interface TriggerWhenStatus {
14
14
  visible: boolean;
15
15
  isFallback: boolean;
16
16
  conditions: ConditionStatus[];
17
17
  }
18
18
  interface ConditionStatusLineProps {
19
- status: ShowWhenStatus | null;
19
+ status: TriggerWhenStatus | null;
20
20
  }
21
21
  export declare function ConditionStatusLine({ status }: ConditionStatusLineProps): import("react/jsx-runtime").JSX.Element | null;
22
22
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionStatusLine.d.ts","sourceRoot":"","sources":["../../src/components/ConditionStatusLine.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AA6CD,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE,wBAAwB,kDAiEvE"}
1
+ {"version":3,"file":"ConditionStatusLine.d.ts","sourceRoot":"","sources":["../../src/components/ConditionStatusLine.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AA6CD,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE,wBAAwB,kDAiEvE"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /**
3
- * ConditionStatusLine — inline showWhen diagnostic on EditorCard.
3
+ * ConditionStatusLine — inline triggerWhen diagnostic on EditorCard.
4
4
  *
5
- * Shows a compact one-line status for items with showWhen conditions.
5
+ * Shows a compact one-line status for items with triggerWhen conditions.
6
6
  * Click to expand per-condition detail.
7
7
  */
8
8
  import { Check, Clock, X } from 'lucide-react';
@@ -1,6 +1,7 @@
1
1
  interface DetectionBadgeProps {
2
2
  found: boolean;
3
+ onClick?: (e: React.MouseEvent) => void;
3
4
  }
4
- export declare function DetectionBadge({ found }: DetectionBadgeProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function DetectionBadge({ found, onClick }: DetectionBadgeProps): import("react/jsx-runtime").JSX.Element;
5
6
  export {};
6
7
  //# sourceMappingURL=DetectionBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DetectionBadge.d.ts","sourceRoot":"","sources":["../../src/components/DetectionBadge.tsx"],"names":[],"mappings":"AAEA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,mBAAmB,2CAU5D"}
1
+ {"version":3,"file":"DetectionBadge.d.ts","sourceRoot":"","sources":["../../src/components/DetectionBadge.tsx"],"names":[],"mappings":"AAEA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,2CA6CrE"}
@@ -1,5 +1,22 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from '../cn';
3
- export function DetectionBadge({ found }) {
4
- return (_jsx("span", { className: cn('se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block', found ? 'se-bg-green-4' : 'se-bg-text-tertiary'), title: found ? 'Found on this page' : 'Not found on this page' }));
3
+ export function DetectionBadge({ found, onClick }) {
4
+ const title = onClick
5
+ ? found
6
+ ? 'Click to scroll to element'
7
+ : 'Click to navigate to page'
8
+ : found
9
+ ? 'Found on this page'
10
+ : 'Not found on this page';
11
+ const textColor = found ? 'se-text-green-4' : 'se-text-text-tertiary';
12
+ const dotColor = found ? 'se-bg-green-4' : 'se-bg-text-tertiary';
13
+ const classes = cn('se-inline-flex se-items-center se-gap-1 se-text-xs se-font-medium se-shrink-0', textColor, onClick && 'se-cursor-pointer hover:se-opacity-80');
14
+ const dot = (_jsx("span", { "data-indicator": "", className: cn('se-w-1.5 se-h-1.5 se-rounded-full', dotColor) }));
15
+ if (onClick) {
16
+ return (_jsxs("button", { type: "button", className: cn(classes, 'se-border-none se-bg-transparent se-p-0'), title: title, onClick: (e) => {
17
+ e.stopPropagation();
18
+ onClick(e);
19
+ }, children: [dot, "GoTo"] }));
20
+ }
21
+ return (_jsxs("span", { className: classes, title: title, children: [dot, "GoTo"] }));
5
22
  }
@@ -1,23 +1,25 @@
1
1
  /**
2
- * EditorPanelShell — shared wrapper for all editor sidebars (editor, audit, review).
2
+ * EditorPanelShell — moveable, resizable wrapper for editor sidebars.
3
3
  *
4
4
  * Renders:
5
- * 1. A draggable FAB (56×56 circle) portaled to document.body always visible.
6
- * Pitch black with the Syntrologie logo mark. Draggable to any screen edge.
7
- * 2. A fixed-position panel container with semi-transparent background
8
- * and backdrop blur, rendered only when `isOpen`.
5
+ * 1. A fixed FAB button (Syntrologie logo) at the panel's bottom-left corner.
6
+ * Click toggles open/minimized. Drag moves the entire panel.
7
+ * 2. A resizable panel container with semi-transparent background and backdrop blur.
8
+ * Supports docked (left/right edge, full height) and free-floating modes.
9
+ * Position, size, and dock state persist in localStorage.
9
10
  */
10
11
  import type React from 'react';
11
12
  export interface EditorPanelShellProps {
12
13
  isOpen: boolean;
13
14
  onToggle: () => void;
15
+ /** @deprecated Panel manages its own position. Kept for backwards compat. */
14
16
  position?: 'left' | 'right';
15
17
  panelId?: string;
16
- /** Panel z-index (default 2147483647). ModularEditorPanel passes 10000. */
18
+ /** Panel z-index (default 2147483647). ModularEditorPanel passes 2147483647. */
17
19
  zIndex?: number;
18
- /** Portal target for the FAB button. Defaults to document.body when omitted. */
20
+ /** @deprecated FAB no longer portals separately. Kept for backwards compat. */
19
21
  portalTarget?: HTMLElement;
20
22
  children: React.ReactNode;
21
23
  }
22
- export declare function EditorPanelShell({ isOpen, onToggle, position, panelId, zIndex, portalTarget, children, }: EditorPanelShellProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function EditorPanelShell({ isOpen, onToggle, panelId, zIndex, children, }: EditorPanelShellProps): import("react/jsx-runtime").JSX.Element;
23
25
  //# sourceMappingURL=EditorPanelShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorPanelShell.d.ts","sourceRoot":"","sources":["../../src/components/EditorPanelShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAyKD,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,QAAQ,EACR,QAAkB,EAClB,OAAO,EACP,MAAmB,EACnB,YAAY,EACZ,QAAQ,GACT,EAAE,qBAAqB,2CA0CvB"}
1
+ {"version":3,"file":"EditorPanelShell.d.ts","sourceRoot":"","sources":["../../src/components/EditorPanelShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AA8MD,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,QAAQ,EACR,OAAO,EACP,MAAmB,EACnB,QAAQ,GACT,EAAE,qBAAqB,2CAySvB"}
@@ -1,116 +1,379 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useRef, useState } from 'react';
3
- import { createPortal } from 'react-dom';
4
3
  import { cn } from '../cn';
5
4
  // =============================================================================
5
+ // Constants
6
+ // =============================================================================
7
+ const STORAGE_KEY = 'syntro:editor-panel';
8
+ const MIN_WIDTH = 480;
9
+ const MIN_HEIGHT = 400;
10
+ const FAB_SIZE = 56;
11
+ const FAB_INSET = 12;
12
+ const SNAP_THRESHOLD = 20;
13
+ const DRAG_THRESHOLD = 5;
14
+ const HANDLE_SIZE = 8;
15
+ // =============================================================================
6
16
  // Logo
7
17
  // =============================================================================
8
- /**
9
- * Syntrologie logo mark — from Figma design system.
10
- * Rendered as inline SVG to avoid CSP issues with data: URIs on injected pages.
11
- */
18
+ /** Syntrologie logo mark — inline SVG to avoid CSP issues. */
12
19
  function SyntroLogo() {
13
20
  return (_jsxs("svg", { "aria-hidden": "true", width: "28", height: "18", viewBox: "0 0 101 63", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("g", { clipPath: "url(#syntro-fab-clip)", children: _jsx("path", { d: "M51.989 0.284C52.386 0.29 52.808 0.341 53.192 0.443C53.769 0.596 54.362 0.983 54.745 1.442C55.895 2.822 56.767 4.782 57.669 6.357C59.947 10.334 62.152 14.372 64.498 18.307C64.671 18.597 65.127 19.343 65.475 19.411C66.654 19.641 79.278 11.523 81.123 10.317C80.704 8.6 80.624 7.21 81.334 5.525C82.014 3.916 83.317 2.651 84.946 2.019C86.593 1.366 88.286 1.42 89.902 2.123C91.486 2.795 92.733 4.076 93.363 5.677C95.111 10.218 91.347 15.013 86.561 14.442C85.392 14.302 84.649 13.927 83.6 13.441C76.542 18.247 69.094 22.597 61.207 25.907C60.153 26.349 59.42 26.6 58.519 27.328C60.583 27.43 87.034 24.236 87.878 23.781C87.926 23.755 88.048 23.697 88.08 23.652C88.244 23.421 88.277 23.007 88.376 22.735C88.819 21.511 89.563 20.379 90.604 19.586C91.887 18.608 93.6 18.093 95.208 18.324C96.992 18.581 98.67 19.55 99.74 21.005C100.733 22.364 101.141 24.064 100.875 25.726C100.607 27.394 99.692 28.888 98.329 29.887C96.02 31.573 92.641 31.613 90.392 29.789C89.579 29.13 89.177 28.535 88.566 27.692C86.692 28.103 83.447 28.463 81.472 28.73C76.577 29.399 71.671 29.99 66.756 30.504C65.752 30.608 59.279 31.013 58.779 31.24L58.781 31.387C59.106 31.577 66.974 33.025 68.328 33.358C72.475 34.405 76.572 35.64 80.606 37.06C82.709 37.818 84.721 38.686 86.814 39.457C88.505 38.051 89.243 36.875 91.925 36.841C93.665 36.833 95.339 37.506 96.589 38.717C97.986 40.087 98.415 41.541 98.429 43.422C98.417 44.842 98.099 45.978 97.229 47.137C96.168 48.531 94.597 49.447 92.86 49.682C91.161 49.922 89.437 49.472 88.073 48.431C86.201 47.02 85.795 45.462 85.488 43.323C85.255 43.193 85.018 43.071 84.776 42.958C83.907 42.553 78.511 40.359 77.911 40.577C77.837 41.147 78.926 42.592 79.243 43.155L84.336 52.073C85.165 53.529 86.027 54.991 86.789 56.483C87.253 57.391 87.414 58.355 87.056 59.343C86.557 60.722 85.014 61.408 83.626 61.438C81.429 61.427 79.228 61.427 77.029 61.427L62.967 61.427L35.549 61.435C33.337 61.436 20.693 61.626 19.579 61.199C18.758 60.889 18.093 60.265 17.732 59.465C17.455 58.844 17.335 57.994 17.577 57.361C18.242 55.623 19.5 53.659 20.438 52.043L28.119 39.028C28.9 37.701 31.213 33.891 31.7 32.634C25.671 32.936 18.736 32.547 12.6 32.721C11.75 34.138 10.992 35.281 9.368 35.935C7.744 36.588 5.704 36.604 4.097 35.922C2.546 35.272 1.319 34.028 0.69 32.468C0.053 30.839 0.086 29.025 0.781 27.42C2.812 22.739 9.259 22.202 12.05 26.464C12.555 27.235 12.774 27.84 13.104 28.703L26.462 28.711C28.926 28.713 31.729 28.779 34.17 28.668C35.279 26.892 36.442 24.733 37.515 22.901L45.376 9.375C46.797 6.902 48.214 4.368 49.685 1.924C50.222 1.032 50.962 0.493 51.989 0.284ZM22.119 57.31C23.512 57.503 26.045 57.431 27.526 57.429L36.661 57.42L68.412 57.422C73.113 57.421 77.994 57.351 82.68 57.438L75.664 45.098C74.562 43.171 73.093 40.773 72.104 38.827C71.245 38.351 70.291 38.109 69.335 37.848C59.189 35.076 48.669 33.421 38.172 32.796C37.642 32.764 36.994 32.766 36.469 32.794L25.855 50.865C24.634 52.935 23.364 55.302 22.119 57.31ZM52.216 5.513C49.384 10.611 46.473 15.665 43.484 20.673C42.193 22.878 40.862 25.071 39.63 27.31C39.46 27.618 39.36 27.782 39.453 28.133C40.522 28.342 45.866 26.973 47.112 26.644C49.169 26.137 60.135 22.684 61.174 21.436C61.248 21.163 61.287 21.069 61.125 20.762C60.279 19.163 59.326 17.527 58.435 15.958L53.592 7.329C53.355 6.915 52.677 5.599 52.216 5.513ZM96.18 26.494C96.963 25.713 97.12 24.502 96.563 23.547C96.005 22.592 94.872 22.133 93.807 22.432C92.972 22.666 92.324 23.327 92.108 24.167C91.892 25.007 92.14 25.899 92.758 26.507C93.396 27.134 94.327 27.361 95.182 27.096C95.558 26.98 95.901 26.773 96.18 26.494ZM87.871 10.399C89.147 10.087 89.941 8.813 89.659 7.529C89.377 6.246 88.122 5.422 86.832 5.673C85.97 5.841 85.266 6.463 84.994 7.298C84.722 8.133 84.923 9.05 85.52 9.694C86.118 10.339 87.017 10.608 87.871 10.399ZM91.505 40.879C90.185 41.122 89.31 42.388 89.55 43.709C89.791 45.03 91.055 45.907 92.377 45.669C93.22 45.517 93.921 44.933 94.223 44.131C94.525 43.329 94.383 42.428 93.85 41.758C93.29 41.055 92.389 40.717 91.505 40.879ZM9.138 29.557C9.005 28.88 8.592 28.292 8.001 27.937C7.409 27.583 6.696 27.495 6.036 27.697C5.665 27.81 5.326 28.011 5.048 28.282C4.24 29.07 4.079 30.31 4.66 31.278C5.241 32.247 6.411 32.688 7.487 32.346C8.666 31.97 9.376 30.771 9.138 29.557Z", fill: "currentColor" }) }), _jsx("defs", { children: _jsx("clipPath", { id: "syntro-fab-clip", children: _jsx("rect", { width: "101", height: "63", fill: "white" }) }) })] }));
14
21
  }
15
22
  // =============================================================================
16
- // Draggable FAB
23
+ // Geometry Helpers
17
24
  // =============================================================================
18
- const FAB_SIZE = 56;
19
- const DRAG_THRESHOLD = 5; // px movement before we consider it a drag
20
- function DraggableFab({ isOpen, onToggle, initialRight, zIndex, portalTarget }) {
21
- // Position state — bottom-right or bottom-left by default
22
- const [pos, setPos] = useState({
23
- x: initialRight ? window.innerWidth - FAB_SIZE - 40 : 40,
24
- y: window.innerHeight - FAB_SIZE - 40,
25
- });
26
- // Drag tracking refs (non-reactive for perf)
27
- const dragging = useRef(false);
25
+ function getDefaultGeometry() {
26
+ return {
27
+ x: 0,
28
+ y: 0,
29
+ width: MIN_WIDTH,
30
+ height: typeof window !== 'undefined' ? window.innerHeight : 800,
31
+ docked: 'left',
32
+ };
33
+ }
34
+ function loadGeometry(storageKey) {
35
+ if (typeof window === 'undefined')
36
+ return getDefaultGeometry();
37
+ try {
38
+ const raw = localStorage.getItem(storageKey);
39
+ if (raw) {
40
+ const parsed = JSON.parse(raw);
41
+ return {
42
+ x: typeof parsed.x === 'number' ? parsed.x : 0,
43
+ y: typeof parsed.y === 'number' ? parsed.y : 0,
44
+ width: Math.max(MIN_WIDTH, typeof parsed.width === 'number' ? parsed.width : MIN_WIDTH),
45
+ height: Math.max(MIN_HEIGHT, typeof parsed.height === 'number' ? parsed.height : window.innerHeight),
46
+ docked: parsed.docked === 'left' || parsed.docked === 'right' ? parsed.docked : null,
47
+ };
48
+ }
49
+ }
50
+ catch {
51
+ /* ignore corrupt localStorage */
52
+ }
53
+ return getDefaultGeometry();
54
+ }
55
+ function saveGeometry(storageKey, geo) {
56
+ try {
57
+ localStorage.setItem(storageKey, JSON.stringify(geo));
58
+ }
59
+ catch {
60
+ /* ignore full localStorage */
61
+ }
62
+ }
63
+ /** Compute the panel's actual pixel rect (resolving docked positions). */
64
+ function getPanelRect(geo) {
65
+ if (geo.docked === 'left') {
66
+ return { top: 0, left: 0, width: geo.width, height: window.innerHeight };
67
+ }
68
+ if (geo.docked === 'right') {
69
+ return {
70
+ top: 0,
71
+ left: window.innerWidth - geo.width,
72
+ width: geo.width,
73
+ height: window.innerHeight,
74
+ };
75
+ }
76
+ const { x: left, y: top, width, height } = geo;
77
+ return { top, left, width, height };
78
+ }
79
+ /** Compute FAB position from panel geometry (top-left of panel). */
80
+ function getFabPosition(geo) {
81
+ const rect = getPanelRect(geo);
82
+ return {
83
+ left: rect.left + FAB_INSET,
84
+ top: rect.top + FAB_INSET,
85
+ };
86
+ }
87
+ /** Clamp geometry so the FAB (top-left) remains visible. */
88
+ function clampToViewport(geo) {
89
+ if (geo.docked)
90
+ return geo;
91
+ const vw = window.innerWidth;
92
+ const vh = window.innerHeight;
93
+ return {
94
+ ...geo,
95
+ x: Math.max(-(geo.width - FAB_SIZE), Math.min(geo.x, vw - FAB_SIZE)),
96
+ y: Math.max(-FAB_INSET, Math.min(geo.y, vh - FAB_SIZE - FAB_INSET)),
97
+ };
98
+ }
99
+ /** Convert docked geometry to undocked pixel coordinates. */
100
+ function undockGeometry(geo) {
101
+ const rect = getPanelRect(geo);
102
+ return {
103
+ x: rect.left,
104
+ y: rect.top,
105
+ width: geo.width,
106
+ height: rect.height,
107
+ docked: null,
108
+ };
109
+ }
110
+ // =============================================================================
111
+ // Resize Handle Definitions
112
+ // =============================================================================
113
+ const RESIZE_HANDLES = [
114
+ {
115
+ dir: 'n',
116
+ style: { top: 0, left: HANDLE_SIZE, right: HANDLE_SIZE, height: HANDLE_SIZE },
117
+ cursor: 'ns-resize',
118
+ },
119
+ {
120
+ dir: 's',
121
+ style: { bottom: 0, left: HANDLE_SIZE, right: HANDLE_SIZE, height: HANDLE_SIZE },
122
+ cursor: 'ns-resize',
123
+ },
124
+ {
125
+ dir: 'e',
126
+ style: { right: 0, top: HANDLE_SIZE, bottom: HANDLE_SIZE, width: HANDLE_SIZE },
127
+ cursor: 'ew-resize',
128
+ },
129
+ {
130
+ dir: 'w',
131
+ style: { left: 0, top: HANDLE_SIZE, bottom: HANDLE_SIZE, width: HANDLE_SIZE },
132
+ cursor: 'ew-resize',
133
+ },
134
+ {
135
+ dir: 'ne',
136
+ style: { top: 0, right: 0, width: HANDLE_SIZE * 2, height: HANDLE_SIZE * 2 },
137
+ cursor: 'nesw-resize',
138
+ },
139
+ {
140
+ dir: 'nw',
141
+ style: { top: 0, left: 0, width: HANDLE_SIZE * 2, height: HANDLE_SIZE * 2 },
142
+ cursor: 'nwse-resize',
143
+ },
144
+ {
145
+ dir: 'se',
146
+ style: { bottom: 0, right: 0, width: HANDLE_SIZE * 2, height: HANDLE_SIZE * 2 },
147
+ cursor: 'nwse-resize',
148
+ },
149
+ {
150
+ dir: 'sw',
151
+ style: { bottom: 0, left: 0, width: HANDLE_SIZE * 2, height: HANDLE_SIZE * 2 },
152
+ cursor: 'nesw-resize',
153
+ },
154
+ ];
155
+ // =============================================================================
156
+ // Component
157
+ // =============================================================================
158
+ export function EditorPanelShell({ isOpen, onToggle, panelId, zIndex = 2147483647, children, }) {
159
+ const storageKey = panelId ? `syntro:editor-panel:${panelId}` : STORAGE_KEY;
160
+ const [geometry, setGeometry] = useState(() => loadGeometry(storageKey));
161
+ const geoRef = useRef(geometry);
162
+ geoRef.current = geometry;
163
+ const panelRef = useRef(null);
164
+ const fabRef = useRef(null);
165
+ // Drag state (refs for performance — no re-renders during drag)
166
+ const isDragging = useRef(false);
28
167
  const hasMoved = useRef(false);
29
- const offset = useRef({ x: 0, y: 0 });
30
- const posRef = useRef(pos);
31
- posRef.current = pos;
32
- // Keep FAB within viewport on resize
168
+ const dragOffset = useRef({ x: 0, y: 0 });
169
+ const startPanelPos = useRef({ x: 0, y: 0 });
170
+ const pendingGeo = useRef(null);
171
+ // Resize state
172
+ const activeResize = useRef(null);
173
+ const resizeStartMouse = useRef({ x: 0, y: 0 });
174
+ const resizeStartGeo = useRef(getDefaultGeometry());
175
+ // Persist geometry on change
33
176
  useEffect(() => {
34
- const handleResize = () => {
35
- setPos((prev) => ({
36
- x: Math.min(prev.x, window.innerWidth - FAB_SIZE),
37
- y: Math.min(prev.y, window.innerHeight - FAB_SIZE),
38
- }));
39
- };
40
- window.addEventListener('resize', handleResize);
41
- return () => window.removeEventListener('resize', handleResize);
177
+ saveGeometry(storageKey, geometry);
178
+ }, [storageKey, geometry]);
179
+ // Viewport clamping on window resize
180
+ useEffect(() => {
181
+ const handler = () => setGeometry((prev) => clampToViewport(prev));
182
+ window.addEventListener('resize', handler);
183
+ return () => window.removeEventListener('resize', handler);
42
184
  }, []);
43
- const handlePointerDown = useCallback((e) => {
44
- dragging.current = true;
185
+ // ---- FAB DRAG HANDLERS ----
186
+ const handleFabPointerDown = useCallback((e) => {
187
+ isDragging.current = true;
45
188
  hasMoved.current = false;
46
- offset.current = {
47
- x: e.clientX - posRef.current.x,
48
- y: e.clientY - posRef.current.y,
189
+ const rect = getPanelRect(geoRef.current);
190
+ startPanelPos.current = { x: rect.left, y: rect.top };
191
+ dragOffset.current = {
192
+ x: e.clientX - rect.left,
193
+ y: e.clientY - rect.top,
49
194
  };
50
195
  e.target.setPointerCapture(e.pointerId);
51
196
  e.preventDefault();
52
197
  }, []);
53
- const handlePointerMove = useCallback((e) => {
54
- if (!dragging.current)
198
+ const handleFabPointerMove = useCallback((e) => {
199
+ if (!isDragging.current)
55
200
  return;
56
- const newX = e.clientX - offset.current.x;
57
- const newY = e.clientY - offset.current.y;
58
- // Check if we've moved past the threshold
59
- const dx = Math.abs(newX - posRef.current.x);
60
- const dy = Math.abs(newY - posRef.current.y);
61
- if (!hasMoved.current && dx < DRAG_THRESHOLD && dy < DRAG_THRESHOLD)
62
- return;
63
- hasMoved.current = true;
64
- setPos({
65
- x: Math.max(0, Math.min(newX, window.innerWidth - FAB_SIZE)),
66
- y: Math.max(0, Math.min(newY, window.innerHeight - FAB_SIZE)),
67
- });
201
+ const newX = e.clientX - dragOffset.current.x;
202
+ const newY = e.clientY - dragOffset.current.y;
203
+ if (!hasMoved.current) {
204
+ const dx = Math.abs(newX - startPanelPos.current.x);
205
+ const dy = Math.abs(newY - startPanelPos.current.y);
206
+ if (dx < DRAG_THRESHOLD && dy < DRAG_THRESHOLD)
207
+ return;
208
+ hasMoved.current = true;
209
+ }
210
+ const geo = geoRef.current;
211
+ const height = geo.docked ? window.innerHeight : geo.height;
212
+ // Update panel DOM directly for performance (bypass React re-render)
213
+ if (panelRef.current) {
214
+ panelRef.current.style.left = `${newX}px`;
215
+ panelRef.current.style.top = `${newY}px`;
216
+ panelRef.current.style.right = 'auto';
217
+ panelRef.current.style.height = `${height}px`;
218
+ }
219
+ if (fabRef.current) {
220
+ fabRef.current.style.left = `${newX + FAB_INSET}px`;
221
+ fabRef.current.style.top = `${newY + FAB_INSET}px`;
222
+ }
223
+ pendingGeo.current = { x: newX, y: newY, width: geo.width, height, docked: null };
68
224
  }, []);
69
- const handlePointerUp = useCallback((e) => {
225
+ const handleFabPointerUp = useCallback((e) => {
70
226
  e.target.releasePointerCapture(e.pointerId);
71
227
  const wasDragging = hasMoved.current;
72
- dragging.current = false;
228
+ isDragging.current = false;
73
229
  hasMoved.current = false;
74
- // Only toggle if it was a click, not a drag
75
230
  if (!wasDragging) {
76
231
  onToggle();
232
+ return;
233
+ }
234
+ if (pendingGeo.current) {
235
+ const geo = pendingGeo.current;
236
+ // Edge snapping
237
+ if (geo.x <= SNAP_THRESHOLD) {
238
+ setGeometry({ ...geo, docked: 'left', x: 0, y: 0 });
239
+ }
240
+ else if (geo.x + geo.width >= window.innerWidth - SNAP_THRESHOLD) {
241
+ setGeometry({ ...geo, docked: 'right', x: 0, y: 0 });
242
+ }
243
+ else {
244
+ setGeometry(geo);
245
+ }
246
+ pendingGeo.current = null;
77
247
  }
78
248
  }, [onToggle]);
79
- return createPortal(_jsx("div", { className: "syntro-editor-scope", "data-syntro-editor-ui": "fab-wrapper", style: { display: 'contents' }, children: _jsx("button", { type: "button", "data-syntro-fab": true, "data-syntro-editor-ui": "fab", onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, style: {
80
- position: 'fixed',
81
- left: pos.x,
82
- top: pos.y,
83
- zIndex,
84
- width: FAB_SIZE,
85
- height: FAB_SIZE,
86
- borderRadius: '50%',
87
- border: '2px solid #b72e2a',
88
- cursor: dragging.current ? 'grabbing' : 'grab',
89
- display: 'flex',
90
- alignItems: 'center',
91
- justifyContent: 'center',
92
- background: '#000000',
93
- color: '#ffffff',
94
- boxShadow: isOpen
95
- ? '0 4px 24px rgba(0,0,0,0.6), 0 0 0 2px rgba(255,255,255,0.08)'
96
- : '0 4px 24px rgba(0,0,0,0.6)',
97
- transition: 'box-shadow 150ms ease',
98
- touchAction: 'none',
99
- userSelect: 'none',
100
- WebkitUserSelect: 'none',
101
- }, title: isOpen ? 'Close panel' : 'Open panel', children: _jsx(SyntroLogo, {}) }) }), portalTarget);
102
- }
103
- // =============================================================================
104
- // Component
105
- // =============================================================================
106
- export function EditorPanelShell({ isOpen, onToggle, position = 'right', panelId, zIndex = 2147483647, portalTarget, children, }) {
107
- const isRight = position === 'right';
108
- const resolvedPortalTarget = portalTarget ?? (typeof document !== 'undefined' ? document.body : null);
109
- return (_jsxs(_Fragment, { children: [resolvedPortalTarget && (_jsx(DraggableFab, { isOpen: isOpen, onToggle: onToggle, initialRight: isRight, zIndex: zIndex + 1, portalTarget: resolvedPortalTarget })), isOpen && (_jsx("div", { ...(panelId ? { id: panelId } : {}), "data-syntro-editor-panel": true, "data-syntro-editor-ui": "panel", className: cn('syntro-editor-scope se-fixed se-top-0 se-w-[390px] se-h-screen se-flex se-flex-col se-text-text-primary se-backdrop-blur-xl se-font-sans se-antialiased', isRight
110
- ? 'se-right-0 se-border-l se-border-border-primary'
111
- : 'se-left-0 se-border-r se-border-border-primary'), style: {
112
- zIndex,
113
- background: 'linear-gradient(160deg, rgba(7,8,10,0.84) 0%, rgba(14,17,20,0.88) 45%, rgba(15,19,24,0.84) 100%)',
114
- boxShadow: isRight ? '-20px 0 60px rgba(0,0,0,0.5)' : '20px 0 60px rgba(0,0,0,0.5)',
115
- }, children: children }))] }));
249
+ // ---- RESIZE HANDLERS ----
250
+ const handleResizePointerDown = useCallback((e) => {
251
+ const dir = e.currentTarget.dataset.resizeDir;
252
+ if (!dir)
253
+ return;
254
+ let geo = geoRef.current;
255
+ // Undock if currently docked
256
+ if (geo.docked) {
257
+ geo = undockGeometry(geo);
258
+ geoRef.current = geo;
259
+ setGeometry(geo);
260
+ }
261
+ activeResize.current = dir;
262
+ resizeStartMouse.current = { x: e.clientX, y: e.clientY };
263
+ resizeStartGeo.current = { ...geo };
264
+ e.target.setPointerCapture(e.pointerId);
265
+ e.preventDefault();
266
+ }, []);
267
+ const handleResizePointerMove = useCallback((e) => {
268
+ if (!activeResize.current)
269
+ return;
270
+ const dx = e.clientX - resizeStartMouse.current.x;
271
+ const dy = e.clientY - resizeStartMouse.current.y;
272
+ const dir = activeResize.current;
273
+ const start = resizeStartGeo.current;
274
+ let { x, y, width, height } = start;
275
+ if (dir.includes('e'))
276
+ width = Math.max(MIN_WIDTH, start.width + dx);
277
+ if (dir.includes('w')) {
278
+ const newW = Math.max(MIN_WIDTH, start.width - dx);
279
+ x = start.x + start.width - newW;
280
+ width = newW;
281
+ }
282
+ if (dir.includes('s'))
283
+ height = Math.max(MIN_HEIGHT, start.height + dy);
284
+ if (dir.includes('n')) {
285
+ const newH = Math.max(MIN_HEIGHT, start.height - dy);
286
+ y = start.y + start.height - newH;
287
+ height = newH;
288
+ }
289
+ // Update DOM directly for performance
290
+ if (panelRef.current) {
291
+ panelRef.current.style.left = `${x}px`;
292
+ panelRef.current.style.top = `${y}px`;
293
+ panelRef.current.style.width = `${width}px`;
294
+ panelRef.current.style.height = `${height}px`;
295
+ }
296
+ if (fabRef.current) {
297
+ fabRef.current.style.left = `${x + FAB_INSET}px`;
298
+ fabRef.current.style.top = `${y + FAB_INSET}px`;
299
+ }
300
+ pendingGeo.current = { x, y, width, height, docked: null };
301
+ }, []);
302
+ const handleResizePointerUp = useCallback((e) => {
303
+ e.target.releasePointerCapture(e.pointerId);
304
+ activeResize.current = null;
305
+ if (pendingGeo.current) {
306
+ setGeometry(pendingGeo.current);
307
+ pendingGeo.current = null;
308
+ }
309
+ }, []);
310
+ // ---- COMPUTED STYLES ----
311
+ const isDocked = geometry.docked !== null;
312
+ const fabPos = getFabPosition(geometry);
313
+ const panelStyle = {
314
+ position: 'fixed',
315
+ zIndex,
316
+ background: 'linear-gradient(160deg, rgba(7,8,10,0.84) 0%, rgba(14,17,20,0.88) 45%, rgba(15,19,24,0.84) 100%)',
317
+ boxShadow: isDocked
318
+ ? geometry.docked === 'right'
319
+ ? '-20px 0 60px rgba(0,0,0,0.5)'
320
+ : '20px 0 60px rgba(0,0,0,0.5)'
321
+ : '0 8px 60px rgba(0,0,0,0.5)',
322
+ // Prevent wheel scroll from chaining to the page behind the panel.
323
+ // overflow-y: auto makes this a scroll container so overscroll-behavior applies.
324
+ overflowY: 'auto',
325
+ overscrollBehavior: 'contain',
326
+ };
327
+ if (geometry.docked === 'left') {
328
+ panelStyle.top = 0;
329
+ panelStyle.left = 0;
330
+ panelStyle.width = geometry.width;
331
+ panelStyle.height = '100vh';
332
+ }
333
+ else if (geometry.docked === 'right') {
334
+ panelStyle.top = 0;
335
+ panelStyle.right = 0;
336
+ panelStyle.width = geometry.width;
337
+ panelStyle.height = '100vh';
338
+ }
339
+ else {
340
+ panelStyle.top = geometry.y;
341
+ panelStyle.left = geometry.x;
342
+ panelStyle.width = geometry.width;
343
+ panelStyle.height = geometry.height;
344
+ }
345
+ const fabStyle = {
346
+ position: 'fixed',
347
+ left: fabPos.left,
348
+ top: fabPos.top,
349
+ zIndex,
350
+ width: FAB_SIZE,
351
+ height: FAB_SIZE,
352
+ borderRadius: '50%',
353
+ border: '2px solid #b72e2a',
354
+ cursor: 'grab',
355
+ display: 'flex',
356
+ alignItems: 'center',
357
+ justifyContent: 'center',
358
+ background: '#000000',
359
+ color: '#ffffff',
360
+ boxShadow: isOpen
361
+ ? '0 4px 24px rgba(0,0,0,0.6), 0 0 0 2px rgba(255,255,255,0.08)'
362
+ : '0 4px 24px rgba(0,0,0,0.6)',
363
+ transition: 'box-shadow 150ms ease',
364
+ touchAction: 'none',
365
+ userSelect: 'none',
366
+ WebkitUserSelect: 'none',
367
+ };
368
+ return (_jsxs(_Fragment, { children: [isOpen && (_jsxs("div", { ref: panelRef, ...(panelId ? { id: panelId } : {}), "data-syntro-editor-panel": true, "data-syntro-editor-ui": "panel", className: cn('syntro-editor-scope se-fixed se-flex se-flex-col se-text-text-primary se-backdrop-blur-xl se-font-sans se-antialiased se-overflow-hidden', isDocked
369
+ ? geometry.docked === 'right'
370
+ ? 'se-border-l se-border-border-primary'
371
+ : 'se-border-r se-border-border-primary'
372
+ : 'se-rounded-lg se-border se-border-border-primary'), style: panelStyle, children: [RESIZE_HANDLES.map(({ dir, style, cursor }) => (_jsx("div", { "data-syntro-editor-ui": `resize-${dir}`, "data-resize-dir": dir, onPointerDown: handleResizePointerDown, onPointerMove: handleResizePointerMove, onPointerUp: handleResizePointerUp, style: {
373
+ position: 'absolute',
374
+ ...style,
375
+ cursor,
376
+ zIndex: 1,
377
+ touchAction: 'none',
378
+ } }, dir))), children] })), _jsx("div", { className: "syntro-editor-scope", "data-syntro-editor-ui": "fab-wrapper", style: { display: 'contents' }, children: _jsx("button", { ref: fabRef, type: "button", "data-syntro-fab": true, "data-syntro-editor-ui": "fab", onPointerDown: handleFabPointerDown, onPointerMove: handleFabPointerMove, onPointerUp: handleFabPointerUp, style: fabStyle, title: isOpen ? 'Minimize panel' : 'Open panel', children: _jsx(SyntroLogo, {}) }) })] }));
116
379
  }
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { createPortal } from 'react-dom';
3
3
  import { useElementRect } from '../hooks/useElementRect';
4
- export function ElementHighlight({ element, color, bgColor = 'transparent', borderStyle = 'solid', borderWidth = 2, label, labelIcon, showRemove, onRemove, onClick, zIndex = 2147483646, padding = 2, showDimensions, className, }) {
4
+ export function ElementHighlight({ element, color, bgColor = 'transparent', borderStyle = 'solid', borderWidth = 2, label, labelIcon, showRemove, onRemove, onClick, zIndex = 2147483644, padding = 2, showDimensions, className, }) {
5
5
  const rect = useElementRect(element);
6
6
  if (!rect)
7
7
  return null;
@@ -1,12 +1,12 @@
1
1
  /**
2
- * TriggerJourney — compact horizontal node graph for showWhen conditions.
2
+ * TriggerJourney — compact horizontal node graph for triggerWhen conditions.
3
3
  *
4
4
  * Displays each condition as a small circle node connected by lines.
5
5
  * Nodes light up green as conditions are met.
6
6
  */
7
- import type { ShowWhenStatus } from './ConditionStatusLine';
7
+ import type { TriggerWhenStatus } from './ConditionStatusLine';
8
8
  export interface TriggerJourneyProps {
9
- status: ShowWhenStatus | null;
9
+ status: TriggerWhenStatus | null;
10
10
  }
11
11
  export declare function TriggerJourney({ status }: TriggerJourneyProps): import("react/jsx-runtime").JSX.Element;
12
12
  //# sourceMappingURL=TriggerJourney.d.ts.map