@syntrologie/adapt-nav 2.8.0-canary.31 → 2.8.0-canary.310

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 (144) hide show
  1. package/dist/NavWidgetLit.d.ts +56 -0
  2. package/dist/NavWidgetLit.d.ts.map +1 -0
  3. package/dist/NavWidgetLit.editable.d.ts +151 -0
  4. package/dist/NavWidgetLit.editable.d.ts.map +1 -0
  5. package/dist/NavWidgetLit.test.d.ts +8 -0
  6. package/dist/NavWidgetLit.test.d.ts.map +1 -0
  7. package/dist/chunk-SX36IHRC.js +640 -0
  8. package/dist/chunk-SX36IHRC.js.map +7 -0
  9. package/dist/editor.d.ts +66 -21
  10. package/dist/editor.d.ts.map +1 -1
  11. package/dist/editor.js +5627 -307
  12. package/dist/editor.js.map +7 -0
  13. package/dist/nav-item-editor.d.ts +43 -0
  14. package/dist/nav-item-editor.d.ts.map +1 -0
  15. package/dist/resolveNavTarget.d.ts +61 -0
  16. package/dist/resolveNavTarget.d.ts.map +1 -0
  17. package/dist/resolveNavTarget.test.d.ts +2 -0
  18. package/dist/resolveNavTarget.test.d.ts.map +1 -0
  19. package/dist/runtime.d.ts +22 -6
  20. package/dist/runtime.d.ts.map +1 -1
  21. package/dist/runtime.js +643 -142
  22. package/dist/runtime.js.map +7 -0
  23. package/dist/schema.d.ts +316 -174
  24. package/dist/schema.d.ts.map +1 -1
  25. package/dist/schema.js +155 -125
  26. package/dist/schema.js.map +7 -0
  27. package/dist/types.d.ts +7 -0
  28. package/dist/types.d.ts.map +1 -1
  29. package/package.json +12 -16
  30. package/dist/NavWidget.d.ts +0 -31
  31. package/dist/NavWidget.d.ts.map +0 -1
  32. package/dist/NavWidget.js +0 -491
  33. package/dist/cdn.d.ts +0 -62
  34. package/dist/cdn.d.ts.map +0 -1
  35. package/dist/cdn.js +0 -48
  36. package/dist/summarize.js +0 -51
  37. package/dist/types.js +0 -18
  38. package/node_modules/@syntro/design-system/README.md +0 -335
  39. package/node_modules/@syntro/design-system/dist/assets/syntrologie-logo.svg +0 -21
  40. package/node_modules/@syntro/design-system/dist/assets/syntrologie-logomark.svg +0 -10
  41. package/node_modules/@syntro/design-system/dist/index.d.ts +0 -8
  42. package/node_modules/@syntro/design-system/dist/index.d.ts.map +0 -1
  43. package/node_modules/@syntro/design-system/dist/index.js +0 -7
  44. package/node_modules/@syntro/design-system/dist/tailwind-preset.d.ts +0 -19
  45. package/node_modules/@syntro/design-system/dist/tailwind-preset.d.ts.map +0 -1
  46. package/node_modules/@syntro/design-system/dist/tailwind-preset.js +0 -453
  47. package/node_modules/@syntro/design-system/dist/tokens/colors.css +0 -464
  48. package/node_modules/@syntro/design-system/dist/tokens/colors.d.ts +0 -874
  49. package/node_modules/@syntro/design-system/dist/tokens/colors.d.ts.map +0 -1
  50. package/node_modules/@syntro/design-system/dist/tokens/colors.js +0 -564
  51. package/node_modules/@syntro/design-system/dist/tokens/effects.css +0 -43
  52. package/node_modules/@syntro/design-system/dist/tokens/effects.d.ts +0 -85
  53. package/node_modules/@syntro/design-system/dist/tokens/effects.d.ts.map +0 -1
  54. package/node_modules/@syntro/design-system/dist/tokens/effects.js +0 -77
  55. package/node_modules/@syntro/design-system/dist/tokens/index.d.ts +0 -10
  56. package/node_modules/@syntro/design-system/dist/tokens/index.d.ts.map +0 -1
  57. package/node_modules/@syntro/design-system/dist/tokens/index.js +0 -9
  58. package/node_modules/@syntro/design-system/package.json +0 -55
  59. package/node_modules/@syntro/design-system/src/assets/syntrologie-logo.svg +0 -21
  60. package/node_modules/@syntro/design-system/src/assets/syntrologie-logomark.svg +0 -10
  61. package/node_modules/@syntrologie/sdk-contracts/dist/index.d.ts +0 -129
  62. package/node_modules/@syntrologie/sdk-contracts/dist/index.js +0 -15
  63. package/node_modules/@syntrologie/sdk-contracts/dist/schemas.d.ts +0 -2225
  64. package/node_modules/@syntrologie/sdk-contracts/dist/schemas.js +0 -162
  65. package/node_modules/@syntrologie/sdk-contracts/package.json +0 -33
  66. package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts +0 -2
  67. package/node_modules/@syntrologie/shared-editor-ui/dist/cn.d.ts.map +0 -1
  68. package/node_modules/@syntrologie/shared-editor-ui/dist/cn.js +0 -3
  69. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts +0 -34
  70. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.d.ts.map +0 -1
  71. package/node_modules/@syntrologie/shared-editor-ui/dist/components/AnchorPicker.js +0 -158
  72. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts +0 -7
  73. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.d.ts.map +0 -1
  74. package/node_modules/@syntrologie/shared-editor-ui/dist/components/BeforeAfterToggle.js +0 -9
  75. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts +0 -23
  76. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.d.ts.map +0 -1
  77. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ConditionStatusLine.js +0 -40
  78. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts +0 -7
  79. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.d.ts.map +0 -1
  80. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DetectionBadge.js +0 -22
  81. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts +0 -8
  82. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.d.ts.map +0 -1
  83. package/node_modules/@syntrologie/shared-editor-ui/dist/components/DismissedSection.js +0 -9
  84. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts +0 -7
  85. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.d.ts.map +0 -1
  86. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditBackButton.js +0 -4
  87. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts +0 -7
  88. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.d.ts.map +0 -1
  89. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorBody.js +0 -4
  90. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts +0 -13
  91. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.d.ts.map +0 -1
  92. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorCard.js +0 -15
  93. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts +0 -7
  94. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.d.ts.map +0 -1
  95. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorFooter.js +0 -4
  96. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts +0 -9
  97. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.d.ts.map +0 -1
  98. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorHeader.js +0 -4
  99. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts +0 -8
  100. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.d.ts.map +0 -1
  101. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorInput.js +0 -8
  102. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts +0 -7
  103. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.d.ts.map +0 -1
  104. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorLayout.js +0 -4
  105. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts +0 -25
  106. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.d.ts.map +0 -1
  107. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorPanelShell.js +0 -379
  108. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts +0 -8
  109. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.d.ts.map +0 -1
  110. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorSelect.js +0 -8
  111. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts +0 -8
  112. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.d.ts.map +0 -1
  113. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EditorTextarea.js +0 -17
  114. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts +0 -32
  115. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.d.ts.map +0 -1
  116. package/node_modules/@syntrologie/shared-editor-ui/dist/components/ElementHighlight.js +0 -85
  117. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts +0 -6
  118. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.d.ts.map +0 -1
  119. package/node_modules/@syntrologie/shared-editor-ui/dist/components/EmptyState.js +0 -4
  120. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts +0 -8
  121. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.d.ts.map +0 -1
  122. package/node_modules/@syntrologie/shared-editor-ui/dist/components/GroupHeader.js +0 -5
  123. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts +0 -12
  124. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.d.ts.map +0 -1
  125. package/node_modules/@syntrologie/shared-editor-ui/dist/components/TriggerJourney.js +0 -40
  126. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts +0 -26
  127. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.d.ts.map +0 -1
  128. package/node_modules/@syntrologie/shared-editor-ui/dist/formatConditionLabel.js +0 -202
  129. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts +0 -8
  130. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.d.ts.map +0 -1
  131. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useElementRect.js +0 -46
  132. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts +0 -24
  133. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.d.ts.map +0 -1
  134. package/node_modules/@syntrologie/shared-editor-ui/dist/hooks/useTriggerWhenStatus.js +0 -86
  135. package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts +0 -34
  136. package/node_modules/@syntrologie/shared-editor-ui/dist/index.d.ts.map +0 -1
  137. package/node_modules/@syntrologie/shared-editor-ui/dist/index.js +0 -25
  138. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts +0 -37
  139. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.d.ts.map +0 -1
  140. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/elementChainRecommender.js +0 -52
  141. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts +0 -22
  142. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.d.ts.map +0 -1
  143. package/node_modules/@syntrologie/shared-editor-ui/dist/utils/selectorGenerator.js +0 -143
  144. package/node_modules/@syntrologie/shared-editor-ui/package.json +0 -45
@@ -1,85 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { createPortal } from 'react-dom';
3
- import { useElementRect } from '../hooks/useElementRect';
4
- export function ElementHighlight({ element, color, bgColor = 'transparent', borderStyle = 'solid', borderWidth = 2, label, labelIcon, showRemove, onRemove, onClick, zIndex = 2147483644, padding = 2, showDimensions, className, }) {
5
- const rect = useElementRect(element);
6
- if (!rect)
7
- return null;
8
- // Build dimensions label from element metadata
9
- const dimensionsLabel = showDimensions
10
- ? (() => {
11
- const tag = element.tagName.toLowerCase();
12
- const id = element.id ? `#${element.id}` : '';
13
- const cls = element.className && typeof element.className === 'string'
14
- ? `.${element.className.split(' ').filter(Boolean).slice(0, 2).join('.')}`
15
- : '';
16
- return `${tag}${id}${cls} \u2014 ${Math.round(rect.width)}\u00d7${Math.round(rect.height)}`;
17
- })()
18
- : null;
19
- const displayLabel = label || dimensionsLabel;
20
- return createPortal(
21
- // biome-ignore lint/a11y/noStaticElementInteractions: overlay highlight element is conditionally interactive based on onClick prop
22
- _jsx("div", { "data-syntro-highlight": true, "data-syntro-editor-ui": "highlight", className: className, role: onClick ? 'button' : undefined, tabIndex: onClick ? 0 : undefined, onClick: onClick
23
- ? (e) => {
24
- e.stopPropagation();
25
- e.preventDefault();
26
- onClick();
27
- }
28
- : undefined, onKeyDown: onClick
29
- ? (e) => {
30
- if (e.key === 'Enter' || e.key === ' ') {
31
- e.stopPropagation();
32
- e.preventDefault();
33
- onClick();
34
- }
35
- }
36
- : undefined, style: {
37
- position: 'fixed',
38
- top: rect.top - padding,
39
- left: rect.left - padding,
40
- width: rect.width + padding * 2,
41
- height: rect.height + padding * 2,
42
- border: `${borderWidth}px ${borderStyle} ${color}`,
43
- backgroundColor: bgColor,
44
- borderRadius: '4px',
45
- zIndex,
46
- pointerEvents: onClick || onRemove ? 'auto' : 'none',
47
- cursor: onClick ? 'pointer' : 'default',
48
- transition: 'all 0.05s ease-out',
49
- boxSizing: 'border-box',
50
- }, children: displayLabel && (_jsxs("div", { "data-syntro-highlight-label": true, "data-syntro-editor-ui": "highlight-label", className: "se-text-xs", style: {
51
- position: 'absolute',
52
- top: '-22px',
53
- left: 0,
54
- background: showDimensions
55
- ? `${color.replace(')', ',0.85)').replace('rgb(', 'rgba(')}`
56
- : color,
57
- color: '#fff',
58
- fontWeight: 600,
59
- fontFamily: showDimensions ? 'monospace' : 'inherit',
60
- padding: '1px 6px',
61
- borderRadius: '4px',
62
- whiteSpace: 'nowrap',
63
- display: 'flex',
64
- alignItems: 'center',
65
- gap: '6px',
66
- pointerEvents: 'auto',
67
- }, children: [labelIcon, displayLabel, showRemove && onRemove && (_jsx("button", { type: "button", className: "se-text-xs", "data-syntro-highlight-remove": true, "data-syntro-editor-ui": "highlight-remove", onClick: (e) => {
68
- e.stopPropagation();
69
- e.preventDefault();
70
- onRemove();
71
- }, style: {
72
- background: 'rgba(0,0,0,0.4)',
73
- border: 'none',
74
- color: '#fff',
75
- borderRadius: '50%',
76
- width: '16px',
77
- height: '16px',
78
- cursor: 'pointer',
79
- display: 'flex',
80
- alignItems: 'center',
81
- justifyContent: 'center',
82
- padding: 0,
83
- lineHeight: 1,
84
- }, children: "\u00D7" }))] })) }), document.body);
85
- }
@@ -1,6 +0,0 @@
1
- interface EmptyStateProps {
2
- message: string;
3
- }
4
- export declare function EmptyState({ message }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
5
- export {};
6
- //# sourceMappingURL=EmptyState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAAA,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,2CAMtD"}
@@ -1,4 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- export function EmptyState({ message }) {
3
- return (_jsx("div", { className: "se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm", children: message }));
4
- }
@@ -1,8 +0,0 @@
1
- interface GroupHeaderProps {
2
- label: string;
3
- count: number;
4
- className?: string;
5
- }
6
- export declare function GroupHeader({ label, count, className }: GroupHeaderProps): import("react/jsx-runtime").JSX.Element;
7
- export {};
8
- //# sourceMappingURL=GroupHeader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GroupHeader.d.ts","sourceRoot":"","sources":["../../src/components/GroupHeader.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAcxE"}
@@ -1,5 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from '../cn';
3
- export function GroupHeader({ label, count, className }) {
4
- return (_jsxs("div", { className: cn('se-text-xs se-font-bold se-text-text-primary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between', className), children: [_jsx("span", { children: label }), _jsx("span", { className: "se-text-xs se-text-text-secondary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg", children: count })] }));
5
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * TriggerJourney — compact horizontal node graph for triggerWhen conditions.
3
- *
4
- * Displays each condition as a small circle node connected by lines.
5
- * Nodes light up green as conditions are met.
6
- */
7
- import type { TriggerWhenStatus } from './ConditionStatusLine';
8
- export interface TriggerJourneyProps {
9
- status: TriggerWhenStatus | null;
10
- }
11
- export declare function TriggerJourney({ status }: TriggerJourneyProps): import("react/jsx-runtime").JSX.Element;
12
- //# sourceMappingURL=TriggerJourney.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TriggerJourney.d.ts","sourceRoot":"","sources":["../../src/components/TriggerJourney.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AA4FD,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CA+B7D"}
@@ -1,40 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * TriggerJourney — compact horizontal node graph for triggerWhen conditions.
4
- *
5
- * Displays each condition as a small circle node connected by lines.
6
- * Nodes light up green as conditions are met.
7
- */
8
- import { Check } from 'lucide-react';
9
- import { cn } from '../cn';
10
- /* ------------------------------------------------------------------ */
11
- /* Internal: small progress bar for event_count nodes */
12
- /* ------------------------------------------------------------------ */
13
- function ProgressBar({ current, target }) {
14
- const pct = Math.min(100, Math.round((current / Math.max(target, 1)) * 100));
15
- return (_jsxs("div", { className: "se-flex se-items-center se-gap-0.5", children: [_jsx("span", { className: "se-inline-block se-w-8 se-h-1 se-rounded-full se-bg-white/20", title: `${current}/${target} (${pct}%)`, children: _jsx("span", { className: cn('se-block se-h-full se-rounded-full se-transition-all', pct >= 100 ? 'se-bg-green-4' : 'se-bg-blue-4'), style: { width: `${pct}%` } }) }), _jsxs("span", { className: "se-text-[11px] se-font-medium se-text-text-secondary", children: [current, "/", target] })] }));
16
- }
17
- /* ------------------------------------------------------------------ */
18
- /* Internal: single journey node with label + optional connection */
19
- /* ------------------------------------------------------------------ */
20
- function JourneyNode({ cs, isLast }) {
21
- const hasProgress = !!cs.formatted.progress;
22
- const inProgress = !cs.passed && hasProgress && cs.formatted.progress.current > 0;
23
- return (_jsxs("div", { className: "se-flex se-items-center se-gap-0", children: [_jsxs("div", { className: "se-flex se-flex-col se-items-center se-min-w-0", children: [_jsx("div", { "data-journey-node": true, "data-passed": cs.passed ? 'true' : 'false', className: cn('se-w-4 se-h-4 se-rounded-full se-border-2 se-flex se-items-center se-justify-center se-shrink-0', cs.passed
24
- ? 'se-bg-green-4 se-border-green-4'
25
- : inProgress
26
- ? 'se-bg-blue-4 se-border-blue-4'
27
- : 'se-bg-transparent se-border-white/30'), children: cs.passed && _jsx(Check, { className: "se-w-2.5 se-h-2.5 se-text-white" }) }), _jsx("span", { className: "se-text-[11px] se-font-medium se-text-text-secondary se-truncate se-max-w-[60px] se-text-center se-mt-0.5", title: cs.formatted.instruction, children: cs.formatted.shortLabel }), hasProgress && (_jsx(ProgressBar, { current: cs.formatted.progress.current, target: cs.formatted.progress.target }))] }), !isLast && (_jsx("div", { "data-journey-line": true, className: cn('se-h-0.5 se-w-4 se-self-start se-mt-2 se-shrink-0', cs.passed ? 'se-bg-green-4' : 'se-bg-white/20') }))] }));
28
- }
29
- /* ------------------------------------------------------------------ */
30
- /* Main component */
31
- /* ------------------------------------------------------------------ */
32
- export function TriggerJourney({ status }) {
33
- if (!status || status.conditions.length === 0) {
34
- return (_jsx("div", { className: "se-mt-1 se-text-[12px] se-font-medium se-text-text-secondary se-italic", children: "Always Present" }));
35
- }
36
- const { conditions } = status;
37
- const allPassed = conditions.every((c) => c.passed);
38
- const isMulti = conditions.length > 1;
39
- return (_jsxs("div", { className: "se-mt-1", children: [_jsx("div", { className: "se-flex se-items-start", children: conditions.map((cs, i) => (_jsx(JourneyNode, { cs: cs, isLast: i === conditions.length - 1 }, i))) }), allPassed && isMulti && (_jsxs("div", { className: "se-flex se-items-center se-gap-1 se-mt-1 se-text-[12px] se-text-green-4", children: [_jsx(Check, { className: "se-w-3 se-h-3" }), _jsx("span", { children: "All conditions met" })] }))] }));
40
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * Format a triggerWhen condition into a human-readable label.
3
- * Pure function — no runtime dependency.
4
- */
5
- interface ConditionLike {
6
- type: string;
7
- [key: string]: unknown;
8
- }
9
- export interface ConditionProgress {
10
- current: number;
11
- target: number;
12
- operator: string;
13
- }
14
- export interface FormattedCondition {
15
- label: string;
16
- instruction: string;
17
- shortLabel: string;
18
- progress?: ConditionProgress;
19
- }
20
- /**
21
- * Convert a Condition object into a human-readable label.
22
- * For event_count conditions, also returns progress data.
23
- */
24
- export declare function formatConditionLabel(condition: ConditionLike, accumulatorCount?: number): FormattedCondition;
25
- export {};
26
- //# sourceMappingURL=formatConditionLabel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatConditionLabel.d.ts","sourceRoot":"","sources":["../src/formatConditionLabel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAgDD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EACxB,gBAAgB,CAAC,EAAE,MAAM,GACxB,kBAAkB,CAoKpB"}
@@ -1,202 +0,0 @@
1
- /**
2
- * Format a triggerWhen condition into a human-readable label.
3
- * Pure function — no runtime dependency.
4
- */
5
- /**
6
- * Format match criteria as a parenthetical string.
7
- * { tagName: 'a' } → '(tagName: a)'
8
- */
9
- function _formatMatch(match) {
10
- if (!match || Object.keys(match).length === 0)
11
- return '';
12
- const parts = Object.entries(match).map(([k, v]) => `${k}: ${v}`);
13
- return ` (${parts.join(', ')})`;
14
- }
15
- /**
16
- * Format an operator for display.
17
- */
18
- function formatOperator(op) {
19
- switch (op) {
20
- case 'gte':
21
- return '\u2265'; // ≥
22
- case 'lte':
23
- return '\u2264'; // ≤
24
- case 'gt':
25
- return '>';
26
- case 'lt':
27
- return '<';
28
- case 'eq':
29
- return '=';
30
- default:
31
- return op;
32
- }
33
- }
34
- /**
35
- * Convert a hyphenated or underscored key into human-readable lowercase text.
36
- * e.g. "fine-arts-page-views" → "fine arts page views"
37
- */
38
- function humanizeKey(key) {
39
- return key.replace(/[-_]/g, ' ').toLowerCase();
40
- }
41
- /**
42
- * Strip trailing wildcard segments from a URL path.
43
- * e.g. "/fine-arts/**" → "/fine-arts/"
44
- */
45
- function cleanUrl(url) {
46
- return url.replace(/\/?\*+$/, '/').replace(/\/\/$/, '/');
47
- }
48
- // Pre-compiled regexes for event_count classification
49
- const PAGE_VIEW_RE = /page.?view/i;
50
- const CLICK_RE = /click/i;
51
- /**
52
- * Convert a Condition object into a human-readable label.
53
- * For event_count conditions, also returns progress data.
54
- */
55
- export function formatConditionLabel(condition, accumulatorCount) {
56
- switch (condition.type) {
57
- case 'event_count': {
58
- const key = condition.key;
59
- const op = condition.operator;
60
- const target = condition.count;
61
- const current = accumulatorCount ?? 0;
62
- const humanized = humanizeKey(key);
63
- let instruction;
64
- let shortLabel;
65
- if (PAGE_VIEW_RE.test(humanized)) {
66
- // Extract the topic by removing "page view(s)" from the humanized key
67
- const topic = humanized.replace(/\s*page\s*views?\s*/i, '').trim();
68
- instruction = topic
69
- ? `View ${topic} pages ${target}+ times`
70
- : `View pages ${target}+ times`;
71
- shortLabel = `View ${target}+ times`;
72
- }
73
- else if (CLICK_RE.test(humanized)) {
74
- const topic = humanized.replace(/\s*clicks?\s*/i, '').trim();
75
- instruction = topic ? `Click ${topic} ${target}+ times` : `Click ${target}+ times`;
76
- shortLabel = `${target}+ clicks`;
77
- }
78
- else {
79
- // Generic event
80
- const lastWord = humanized
81
- .trim()
82
- .split(' ')
83
- .filter((w) => w)
84
- .pop() || 'events';
85
- instruction = `Reach ${target}+ ${humanized} events`;
86
- shortLabel = `${target}+ ${lastWord}s`;
87
- }
88
- return {
89
- label: `${key} ${formatOperator(op)} ${target}`,
90
- instruction,
91
- shortLabel,
92
- progress: { current, target, operator: op },
93
- };
94
- }
95
- case 'page_url': {
96
- const url = condition.url;
97
- const cleaned = cleanUrl(url);
98
- const hasWildcard = url !== cleaned;
99
- const instruction = hasWildcard ? `Visit a ${cleaned} page` : `Visit ${cleaned}`;
100
- return {
101
- label: `${url}`,
102
- instruction,
103
- shortLabel: cleaned,
104
- };
105
- }
106
- case 'anchor_visible': {
107
- const rawAnchor = condition.anchorId;
108
- const anchorId = typeof rawAnchor === 'string'
109
- ? rawAnchor
110
- : (rawAnchor?.selector ?? '');
111
- const state = condition.state;
112
- return {
113
- label: `${anchorId} (${state})`,
114
- instruction: `Scroll until ${anchorId} is ${state}`,
115
- shortLabel: `${anchorId}`,
116
- };
117
- }
118
- case 'event_occurred': {
119
- const eventName = condition.eventName;
120
- return {
121
- label: `${eventName}`,
122
- instruction: `Trigger a ${eventName} event`,
123
- shortLabel: `${eventName}`,
124
- };
125
- }
126
- case 'state_equals': {
127
- const key = condition.key;
128
- const val = condition.value === undefined ? 'undefined' : JSON.stringify(condition.value);
129
- return {
130
- label: `${key} = ${val}`,
131
- instruction: `${key} equals ${val}`,
132
- shortLabel: `${key}`,
133
- };
134
- }
135
- case 'viewport': {
136
- const parts = [];
137
- if (condition.minWidth !== undefined)
138
- parts.push(`w ${formatOperator('gte')} ${condition.minWidth}px`);
139
- if (condition.maxWidth !== undefined)
140
- parts.push(`w ${formatOperator('lte')} ${condition.maxWidth}px`);
141
- if (condition.minHeight !== undefined)
142
- parts.push(`h ${formatOperator('gte')} ${condition.minHeight}px`);
143
- if (condition.maxHeight !== undefined)
144
- parts.push(`h ${formatOperator('lte')} ${condition.maxHeight}px`);
145
- const label = parts.join(', ') || 'any viewport';
146
- const instruction = parts.length > 0 ? `Use a viewport ${parts.join(' and ')}` : 'Use a viewport of any size';
147
- const shortLabel = parts.length > 0 ? parts[0] : 'Any size';
148
- return { label, instruction, shortLabel };
149
- }
150
- case 'session_metric': {
151
- const key = condition.key;
152
- const op = condition.operator;
153
- const threshold = condition.threshold;
154
- return {
155
- label: `${key} ${formatOperator(op)} ${threshold}`,
156
- instruction: `${key} reaches ${threshold}+`,
157
- shortLabel: `${key} ${threshold}+`,
158
- };
159
- }
160
- case 'dismissed': {
161
- const inverted = condition.inverted;
162
- const key = condition.key;
163
- const target = key || 'this';
164
- return {
165
- label: inverted ? 'not dismissed' : 'dismissed',
166
- instruction: inverted ? `Do not dismiss ${target}` : `Dismiss ${target}`,
167
- shortLabel: inverted ? 'Not dismissed' : 'Dismissed',
168
- };
169
- }
170
- case 'cooldown_active': {
171
- const inverted = condition.inverted;
172
- return {
173
- label: inverted ? 'cooldown inactive' : 'cooldown active',
174
- instruction: inverted ? 'Wait for cooldown to expire' : 'Cooldown is active',
175
- shortLabel: inverted ? 'Cooldown done' : 'Cooldown active',
176
- };
177
- }
178
- case 'frequency_limit': {
179
- const inverted = condition.inverted;
180
- const limit = condition.limit;
181
- return {
182
- label: `shown ${formatOperator(inverted ? 'lt' : 'gte')} ${limit} times`,
183
- instruction: inverted ? `Shown fewer than ${limit} times` : `Shown ${limit}+ times`,
184
- shortLabel: inverted ? `< ${limit} views` : `${limit}+ views`,
185
- };
186
- }
187
- case 'route': {
188
- const routeId = condition.routeId;
189
- return {
190
- label: `${routeId}`,
191
- instruction: `Navigate to ${routeId} route`,
192
- shortLabel: `${routeId}`,
193
- };
194
- }
195
- default:
196
- return {
197
- label: `${condition.type}`,
198
- instruction: `${condition.type}`,
199
- shortLabel: `${condition.type}`,
200
- };
201
- }
202
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Returns a live DOMRect for an element, updating on scroll, resize,
3
- * and element size changes.
4
- *
5
- * Uses requestAnimationFrame to batch updates and avoid layout thrashing.
6
- */
7
- export declare function useElementRect(element: HTMLElement | null): DOMRect | null;
8
- //# sourceMappingURL=useElementRect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useElementRect.d.ts","sourceRoot":"","sources":["../../src/hooks/useElementRect.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CA6C1E"}
@@ -1,46 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react';
2
- /**
3
- * Returns a live DOMRect for an element, updating on scroll, resize,
4
- * and element size changes.
5
- *
6
- * Uses requestAnimationFrame to batch updates and avoid layout thrashing.
7
- */
8
- export function useElementRect(element) {
9
- const [rect, setRect] = useState(null);
10
- const update = useCallback(() => {
11
- if (element) {
12
- setRect(element.getBoundingClientRect());
13
- }
14
- }, [element]);
15
- useEffect(() => {
16
- if (!element) {
17
- setRect(null);
18
- return;
19
- }
20
- // Initial measurement
21
- setRect(element.getBoundingClientRect());
22
- let rafId = null;
23
- const scheduleUpdate = () => {
24
- if (rafId != null)
25
- return;
26
- rafId = requestAnimationFrame(() => {
27
- rafId = null;
28
- update();
29
- });
30
- };
31
- // Scroll (capture phase catches nested scroll containers)
32
- window.addEventListener('scroll', scheduleUpdate, true);
33
- window.addEventListener('resize', scheduleUpdate);
34
- // Observe element size changes
35
- const ro = new ResizeObserver(scheduleUpdate);
36
- ro.observe(element);
37
- return () => {
38
- window.removeEventListener('scroll', scheduleUpdate, true);
39
- window.removeEventListener('resize', scheduleUpdate);
40
- ro.disconnect();
41
- if (rafId != null)
42
- cancelAnimationFrame(rafId);
43
- };
44
- }, [element, update]);
45
- return rect;
46
- }
@@ -1,24 +0,0 @@
1
- import type { TriggerWhenStatus } from '../components/ConditionStatusLine';
2
- /**
3
- * Minimal type for a triggerWhen action item.
4
- * Works with both FAQQuestionAction and NavTipAction.
5
- */
6
- export interface TriggerWhenItem {
7
- id: string;
8
- triggerWhen?: {
9
- type: string;
10
- rules?: Array<{
11
- conditions: Array<Record<string, unknown>>;
12
- value: unknown;
13
- }>;
14
- default?: unknown;
15
- } | null;
16
- }
17
- /**
18
- * Hook: live triggerWhen evaluation for a list of action items.
19
- *
20
- * @param items Array of items with id + optional triggerWhen
21
- * @returns Map from item id → TriggerWhenStatus (null for items without triggerWhen)
22
- */
23
- export declare function useTriggerWhenStatus(items: TriggerWhenItem[]): Map<string, TriggerWhenStatus | null>;
24
- //# sourceMappingURL=useTriggerWhenStatus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTriggerWhenStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useTriggerWhenStatus.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAG5F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,KAAK,CAAC;YACZ,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3C,KAAK,EAAE,OAAO,CAAC;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,IAAI,CAAC;CACV;AAqED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EAAE,GACvB,GAAG,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC,CA0CvC"}
@@ -1,86 +0,0 @@
1
- /**
2
- * useTriggerWhenStatus — live triggerWhen evaluation for editor diagnostics.
3
- *
4
- * Delegates condition evaluation to the runtime's evaluateSync() method,
5
- * eliminating duplicated logic. Subscribes to the EventAccumulator for
6
- * reactive updates.
7
- *
8
- * NOTE: This hook accesses `window.SynOS.handle.runtime` directly
9
- * because EditorPanelProps doesn't expose runtime. This is safe —
10
- * the editor only runs after runtime bootstrap.
11
- */
12
- import { useCallback, useEffect, useRef, useState } from 'react';
13
- import { formatConditionLabel } from '../formatConditionLabel';
14
- /**
15
- * Build a RuntimeLike from the real SynOS.handle.runtime.
16
- */
17
- function getRuntime() {
18
- const rt = window.SynOS?.handle?.runtime;
19
- if (!rt?.evaluateSync)
20
- return null;
21
- return {
22
- evaluateSync: rt.evaluateSync.bind(rt),
23
- accumulator: rt.accumulator,
24
- };
25
- }
26
- /**
27
- * Evaluate all conditions in a triggerWhen RuleStrategy via the runtime engine.
28
- */
29
- function evaluateTriggerWhen(triggerWhen, runtime) {
30
- if (triggerWhen.type !== 'rules' || !triggerWhen.rules?.length) {
31
- return { visible: !!triggerWhen.default, isFallback: true, conditions: [] };
32
- }
33
- const result = runtime.evaluateSync(triggerWhen);
34
- const conditions = (result.matchInfo?.evaluatedConditions ?? []).map(({ condition, result: passed }) => {
35
- // Get live accumulator count for event_count progress display
36
- const accCount = condition.type === 'event_count' && runtime.accumulator
37
- ? runtime.accumulator.getCount(condition.key, condition.withinMs)
38
- : undefined;
39
- const formatted = formatConditionLabel(condition, accCount);
40
- return { type: condition.type, passed, formatted };
41
- });
42
- return { visible: result.value, isFallback: result.isFallback, conditions };
43
- }
44
- /**
45
- * Hook: live triggerWhen evaluation for a list of action items.
46
- *
47
- * @param items Array of items with id + optional triggerWhen
48
- * @returns Map from item id → TriggerWhenStatus (null for items without triggerWhen)
49
- */
50
- export function useTriggerWhenStatus(items) {
51
- const [statuses, setStatuses] = useState(new Map());
52
- const itemsRef = useRef(items);
53
- itemsRef.current = items;
54
- const evaluate = useCallback(() => {
55
- const runtime = getRuntime();
56
- if (!runtime)
57
- return;
58
- const map = new Map();
59
- for (const item of itemsRef.current) {
60
- if (!item.triggerWhen) {
61
- map.set(item.id, null);
62
- }
63
- else {
64
- map.set(item.id, evaluateTriggerWhen(item.triggerWhen, runtime));
65
- }
66
- }
67
- setStatuses(map);
68
- }, []);
69
- useEffect(() => {
70
- // Initial evaluation
71
- evaluate();
72
- // Subscribe to accumulator changes for reactive event_count updates
73
- const runtime = getRuntime();
74
- const unsubs = [];
75
- if (runtime?.accumulator) {
76
- unsubs.push(runtime.accumulator.subscribe(evaluate));
77
- }
78
- // Poll every 2s for non-accumulator conditions (page_url, viewport, etc.)
79
- const interval = setInterval(evaluate, 2000);
80
- return () => {
81
- unsubs.forEach((u) => u());
82
- clearInterval(interval);
83
- };
84
- }, [evaluate]);
85
- return statuses;
86
- }
@@ -1,34 +0,0 @@
1
- export { cn } from './cn';
2
- export type { AnchorPickerProps, PickedElement } from './components/AnchorPicker';
3
- export { AnchorPicker } from './components/AnchorPicker';
4
- export { BeforeAfterToggle } from './components/BeforeAfterToggle';
5
- export type { ConditionStatus, TriggerWhenStatus } from './components/ConditionStatusLine';
6
- export { ConditionStatusLine } from './components/ConditionStatusLine';
7
- export { DetectionBadge } from './components/DetectionBadge';
8
- export { DismissedSection } from './components/DismissedSection';
9
- export { EditBackButton } from './components/EditBackButton';
10
- export { EditorBody } from './components/EditorBody';
11
- export { EditorCard } from './components/EditorCard';
12
- export { EditorFooter } from './components/EditorFooter';
13
- export { EditorHeader } from './components/EditorHeader';
14
- export { EditorInput } from './components/EditorInput';
15
- export { EditorLayout } from './components/EditorLayout';
16
- export type { EditorPanelShellProps } from './components/EditorPanelShell';
17
- export { EditorPanelShell } from './components/EditorPanelShell';
18
- export { EditorSelect } from './components/EditorSelect';
19
- export { EditorTextarea } from './components/EditorTextarea';
20
- export type { ElementHighlightProps } from './components/ElementHighlight';
21
- export { ElementHighlight } from './components/ElementHighlight';
22
- export { EmptyState } from './components/EmptyState';
23
- export { GroupHeader } from './components/GroupHeader';
24
- export type { TriggerJourneyProps } from './components/TriggerJourney';
25
- export { TriggerJourney } from './components/TriggerJourney';
26
- export type { ConditionProgress, FormattedCondition } from './formatConditionLabel';
27
- export { formatConditionLabel } from './formatConditionLabel';
28
- export { useElementRect } from './hooks/useElementRect';
29
- export type { TriggerWhenItem } from './hooks/useTriggerWhenStatus';
30
- export { useTriggerWhenStatus } from './hooks/useTriggerWhenStatus';
31
- export { type ActionStep, buildActionStepFromElement, findRecommendedIndex, type PostHogElement, } from './utils/elementChainRecommender';
32
- export type { SelectorOptions } from './utils/selectorGenerator';
33
- export { generateSelector, getElementDescription, validateSelector, } from './utils/selectorGenerator';
34
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EACL,KAAK,UAAU,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}