@parhelia/core 0.1.12749 → 0.1.12755

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 (200) hide show
  1. package/dist/agents-view/AgentsView.js +3 -3
  2. package/dist/agents-view/AgentsView.js.map +1 -1
  3. package/dist/agents-view/AgentsWorkspaceView.js +28 -23
  4. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  5. package/dist/components/ui/PlaceholderInput.js +3 -3
  6. package/dist/components/ui/PlaceholderInput.js.map +1 -1
  7. package/dist/components/ui/PlaceholderInputTypes.js +2 -2
  8. package/dist/components/ui/PlaceholderInputTypes.js.map +1 -1
  9. package/dist/components/ui/PlaceholderItemSelector.js +2 -2
  10. package/dist/components/ui/PlaceholderItemSelector.js.map +1 -1
  11. package/dist/config/config.js +4 -1
  12. package/dist/config/config.js.map +1 -1
  13. package/dist/editor/LinkEditorDialog.js +2 -2
  14. package/dist/editor/LinkEditorDialog.js.map +1 -1
  15. package/dist/editor/MainLayout.d.ts +1 -0
  16. package/dist/editor/MainLayout.js +64 -1
  17. package/dist/editor/MainLayout.js.map +1 -1
  18. package/dist/editor/ai/AgentBanners.d.ts +11 -0
  19. package/dist/editor/ai/AgentBanners.js +16 -0
  20. package/dist/editor/ai/AgentBanners.js.map +1 -0
  21. package/dist/editor/ai/AgentCostDisplay.d.ts +12 -0
  22. package/dist/editor/ai/AgentCostDisplay.js +24 -1
  23. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  24. package/dist/editor/ai/AgentDocumentList.js +5 -4
  25. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  26. package/dist/editor/ai/AgentInlineDialogContent.d.ts +17 -0
  27. package/dist/editor/ai/AgentInlineDialogContent.js +32 -0
  28. package/dist/editor/ai/AgentInlineDialogContent.js.map +1 -0
  29. package/dist/editor/ai/AgentSharingSection.d.ts +6 -0
  30. package/dist/editor/ai/AgentSharingSection.js +149 -0
  31. package/dist/editor/ai/AgentSharingSection.js.map +1 -0
  32. package/dist/editor/ai/AgentTerminal.d.ts +2 -1
  33. package/dist/editor/ai/AgentTerminal.js +288 -984
  34. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  35. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +18 -0
  36. package/dist/editor/ai/AgentTerminalStatusBar.js +388 -125
  37. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  38. package/dist/editor/ai/Agents.js +10 -5
  39. package/dist/editor/ai/Agents.js.map +1 -1
  40. package/dist/editor/ai/HeartbeatMessage.d.ts +4 -0
  41. package/dist/editor/ai/HeartbeatMessage.js +7 -0
  42. package/dist/editor/ai/HeartbeatMessage.js.map +1 -0
  43. package/dist/editor/ai/InitialThinkingSplash.d.ts +3 -0
  44. package/dist/editor/ai/InitialThinkingSplash.js +9 -0
  45. package/dist/editor/ai/InitialThinkingSplash.js.map +1 -0
  46. package/dist/editor/ai/InlineAiDialog.js +49 -1
  47. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  48. package/dist/editor/ai/QueuedPromptsPanel.d.ts +4 -0
  49. package/dist/editor/ai/QueuedPromptsPanel.js +36 -0
  50. package/dist/editor/ai/QueuedPromptsPanel.js.map +1 -0
  51. package/dist/editor/ai/TodoListPanel.d.ts +5 -0
  52. package/dist/editor/ai/TodoListPanel.js +113 -0
  53. package/dist/editor/ai/TodoListPanel.js.map +1 -0
  54. package/dist/editor/ai/ToolCallDisplay.js +54 -10
  55. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  56. package/dist/editor/ai/UserMessage.d.ts +4 -0
  57. package/dist/editor/ai/UserMessage.js +42 -0
  58. package/dist/editor/ai/UserMessage.js.map +1 -0
  59. package/dist/editor/ai/agentMessageConversion.d.ts +11 -0
  60. package/dist/editor/ai/agentMessageConversion.js +134 -0
  61. package/dist/editor/ai/agentMessageConversion.js.map +1 -0
  62. package/dist/editor/ai/agentMessageGrouping.d.ts +22 -0
  63. package/dist/editor/ai/agentMessageGrouping.js +103 -0
  64. package/dist/editor/ai/agentMessageGrouping.js.map +1 -0
  65. package/dist/editor/ai/agentMessageHelpers.d.ts +23 -0
  66. package/dist/editor/ai/agentMessageHelpers.js +124 -0
  67. package/dist/editor/ai/agentMessageHelpers.js.map +1 -0
  68. package/dist/editor/ai/agentMessageMarkdown.d.ts +2 -0
  69. package/dist/editor/ai/agentMessageMarkdown.js +14 -0
  70. package/dist/editor/ai/agentMessageMarkdown.js.map +1 -0
  71. package/dist/editor/ai/agentTodoExtraction.d.ts +12 -0
  72. package/dist/editor/ai/agentTodoExtraction.js +205 -0
  73. package/dist/editor/ai/agentTodoExtraction.js.map +1 -0
  74. package/dist/editor/ai/useAgentStatus.js +2 -2
  75. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  76. package/dist/editor/client/EditorShell.js +19 -1
  77. package/dist/editor/client/EditorShell.js.map +1 -1
  78. package/dist/editor/client/editContext.d.ts +5 -0
  79. package/dist/editor/client/editContext.js.map +1 -1
  80. package/dist/editor/client/operations.d.ts +4 -1
  81. package/dist/editor/client/operations.js +57 -5
  82. package/dist/editor/client/operations.js.map +1 -1
  83. package/dist/editor/client/ui/EditorChrome.js +3 -4
  84. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  85. package/dist/editor/commands/componentCommands.js +35 -2
  86. package/dist/editor/commands/componentCommands.js.map +1 -1
  87. package/dist/editor/menubar/ItemLanguageVersion.js +22 -3
  88. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  89. package/dist/editor/menubar/PreviewDatePicker.d.ts +1 -0
  90. package/dist/editor/menubar/PreviewDatePicker.js +55 -0
  91. package/dist/editor/menubar/PreviewDatePicker.js.map +1 -0
  92. package/dist/editor/menubar/VersionPreviewCard.js +34 -3
  93. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  94. package/dist/editor/menubar/VersionSelector.d.ts +2 -1
  95. package/dist/editor/menubar/VersionSelector.js +14 -15
  96. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  97. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +2 -2
  98. package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
  99. package/dist/editor/page-editor-chrome/FrameMenu.js +2 -2
  100. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  101. package/dist/editor/page-viewer/EditorForm.js +81 -1
  102. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  103. package/dist/editor/page-viewer/PageViewer.js +22 -90
  104. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  105. package/dist/editor/page-viewer/PageViewerFrame.js +12 -2
  106. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  107. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +4 -0
  108. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  109. package/dist/editor/page-viewer/pageViewContext.d.ts +2 -0
  110. package/dist/editor/page-viewer/pageViewContext.js +8 -1
  111. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  112. package/dist/editor/pageModel.d.ts +2 -0
  113. package/dist/editor/personalization/ActionList.d.ts +7 -0
  114. package/dist/editor/personalization/ActionList.js +16 -0
  115. package/dist/editor/personalization/ActionList.js.map +1 -0
  116. package/dist/editor/personalization/ConditionTreeEditor.d.ts +7 -0
  117. package/dist/editor/personalization/ConditionTreeEditor.js +117 -0
  118. package/dist/editor/personalization/ConditionTreeEditor.js.map +1 -0
  119. package/dist/editor/personalization/PersonalizationPanel.d.ts +12 -0
  120. package/dist/editor/personalization/PersonalizationPanel.js +308 -0
  121. package/dist/editor/personalization/PersonalizationPanel.js.map +1 -0
  122. package/dist/editor/personalization/RuleElementPicker.d.ts +11 -0
  123. package/dist/editor/personalization/RuleElementPicker.js +68 -0
  124. package/dist/editor/personalization/RuleElementPicker.js.map +1 -0
  125. package/dist/editor/personalization/RuleList.d.ts +19 -0
  126. package/dist/editor/personalization/RuleList.js +132 -0
  127. package/dist/editor/personalization/RuleList.js.map +1 -0
  128. package/dist/editor/personalization/RuleParameterInput.d.ts +10 -0
  129. package/dist/editor/personalization/RuleParameterInput.js +115 -0
  130. package/dist/editor/personalization/RuleParameterInput.js.map +1 -0
  131. package/dist/editor/personalization/TreeItemPicker.d.ts +9 -0
  132. package/dist/editor/personalization/TreeItemPicker.js +115 -0
  133. package/dist/editor/personalization/TreeItemPicker.js.map +1 -0
  134. package/dist/editor/personalization/utils.d.ts +6 -0
  135. package/dist/editor/personalization/utils.js +37 -0
  136. package/dist/editor/personalization/utils.js.map +1 -0
  137. package/dist/editor/reviews/SuggestedEdit.js +65 -48
  138. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  139. package/dist/editor/reviews/SuggestionDisplayPopover.js +5 -1
  140. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  141. package/dist/editor/services/agentService.d.ts +24 -0
  142. package/dist/editor/services/agentService.js +40 -0
  143. package/dist/editor/services/agentService.js.map +1 -1
  144. package/dist/editor/services/agentStatus.d.ts +1 -0
  145. package/dist/editor/services/agentStatus.js +55 -1
  146. package/dist/editor/services/agentStatus.js.map +1 -1
  147. package/dist/editor/services/aiService.d.ts +10 -0
  148. package/dist/editor/services/aiService.js.map +1 -1
  149. package/dist/editor/services/contentService.d.ts +5 -0
  150. package/dist/editor/services/contentService.js.map +1 -1
  151. package/dist/editor/services/personalizationService.d.ts +5 -0
  152. package/dist/editor/services/personalizationService.js +32 -0
  153. package/dist/editor/services/personalizationService.js.map +1 -0
  154. package/dist/editor/services/serviceHelper.d.ts +1 -1
  155. package/dist/editor/services/serviceHelper.js +2 -1
  156. package/dist/editor/services/serviceHelper.js.map +1 -1
  157. package/dist/editor/settings/panels/AgentProfileConfigPanel.js +1 -1
  158. package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
  159. package/dist/editor/sidebar/OperationItem.js +1 -0
  160. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  161. package/dist/editor/sidebar/SidebarPanel.js +3 -3
  162. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  163. package/dist/editor/ui/PublishRestrictionsDialog.js +1 -0
  164. package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
  165. package/dist/editor/ui/SimpleTabs.d.ts +1 -0
  166. package/dist/editor/ui/SimpleTabs.js +2 -2
  167. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  168. package/dist/editor/ui/Splitter.d.ts +4 -0
  169. package/dist/editor/ui/Splitter.js +42 -17
  170. package/dist/editor/ui/Splitter.js.map +1 -1
  171. package/dist/editor/utils/sitecoreDate.d.ts +2 -0
  172. package/dist/editor/utils/sitecoreDate.js +27 -0
  173. package/dist/editor/utils/sitecoreDate.js.map +1 -0
  174. package/dist/editor/utils/versionAtDate.d.ts +2 -0
  175. package/dist/editor/utils/versionAtDate.js +23 -0
  176. package/dist/editor/utils/versionAtDate.js.map +1 -0
  177. package/dist/lib/viewTransition.d.ts +1 -0
  178. package/dist/lib/viewTransition.js +17 -0
  179. package/dist/lib/viewTransition.js.map +1 -0
  180. package/dist/revision.d.ts +2 -2
  181. package/dist/revision.js +2 -2
  182. package/dist/task-board/TaskBoardWorkspace.js +126 -87
  183. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  184. package/dist/task-board/components/ProjectAgentsPanel.js +2 -2
  185. package/dist/task-board/components/ProjectAgentsPanel.js.map +1 -1
  186. package/dist/task-board/components/ProjectDashboard.js +2 -3
  187. package/dist/task-board/components/ProjectDashboard.js.map +1 -1
  188. package/dist/task-board/components/ProjectPropertiesPanel.js +76 -24
  189. package/dist/task-board/components/ProjectPropertiesPanel.js.map +1 -1
  190. package/dist/task-board/components/TaskBoardTitlebar.js +2 -1
  191. package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -1
  192. package/dist/task-board/components/TaskDetailPanel.d.ts +10 -0
  193. package/dist/task-board/components/TaskDetailPanel.js +10 -5
  194. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  195. package/dist/types.d.ts +55 -1
  196. package/package.json +1 -1
  197. package/styles.css +11 -10
  198. package/dist/task-board/components/AssignAgentDialog.d.ts +0 -7
  199. package/dist/task-board/components/AssignAgentDialog.js +0 -104
  200. package/dist/task-board/components/AssignAgentDialog.js.map +0 -1
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { ChevronDown, ChevronUp, X } from "lucide-react";
3
+ import { Button } from "../../components/ui/button";
4
+ import { RuleElementPicker } from "./RuleElementPicker";
5
+ import { RuleParameterInput } from "./RuleParameterInput";
6
+ import { createLeafCondition } from "./utils";
7
+ function getElement(elements, id) {
8
+ return elements.find((element) => element.id === id);
9
+ }
10
+ function isNotWrapper(node) {
11
+ return (node.kind === "composite" && node.op === "not" && node.children.length === 1);
12
+ }
13
+ function unwrapNot(node) {
14
+ if (isNotWrapper(node) && node.kind === "composite" && node.children[0]) {
15
+ return { inner: node.children[0], negated: true };
16
+ }
17
+ return { inner: node, negated: false };
18
+ }
19
+ function rewrapNot(inner, negated) {
20
+ if (!negated)
21
+ return inner;
22
+ return { kind: "composite", op: "not", children: [inner] };
23
+ }
24
+ export function ConditionTreeEditor({ condition, elements, disabled, onChange, }) {
25
+ if (!condition) {
26
+ return (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "rounded border border-dashed border-gray-300 px-3 py-2 text-2xs text-gray-500", children: "Without conditions, this rule always applies. Add a condition to target a specific audience." }), _jsx(RuleElementPicker, { elements: elements, kind: "condition", label: "Add condition", disabled: disabled, fullWidth: true, onPick: (element) => onChange(createLeafCondition(element.id)) })] }));
27
+ }
28
+ // Treat the top level as a flat AND/OR list of children. A standalone NOT
29
+ // wrapping a single leaf at the very top is treated as a one-child list
30
+ // with that child negated; anything else is a single-child list.
31
+ const isFlatComposite = condition.kind === "composite" &&
32
+ (condition.op === "and" || condition.op === "or");
33
+ const children = isFlatComposite
34
+ ? condition.children
35
+ : [condition];
36
+ const op = isFlatComposite
37
+ ? (condition.op)
38
+ : "and";
39
+ const commit = (nextChildren, nextOp = op) => {
40
+ if (nextChildren.length === 0) {
41
+ onChange(null);
42
+ return;
43
+ }
44
+ if (nextChildren.length === 1) {
45
+ onChange(nextChildren[0]);
46
+ return;
47
+ }
48
+ onChange({
49
+ kind: "composite",
50
+ op: nextOp,
51
+ children: nextChildren,
52
+ });
53
+ };
54
+ return (_jsx(ConditionList, { op: op, children: children, elements: elements, disabled: disabled, onOpChange: (next) => commit(children, next), onChildrenChange: (next) => commit(next) }));
55
+ }
56
+ function ConditionList({ op, children, elements, disabled, onOpChange, onChildrenChange, }) {
57
+ const updateChild = (index, next) => {
58
+ if (next === null) {
59
+ onChildrenChange(children.filter((_, i) => i !== index));
60
+ return;
61
+ }
62
+ onChildrenChange(children.map((existing, i) => (i === index ? next : existing)));
63
+ };
64
+ const moveChild = (index, direction) => {
65
+ const target = index + direction;
66
+ if (target < 0 || target >= children.length)
67
+ return;
68
+ const next = [...children];
69
+ const [moved] = next.splice(index, 1);
70
+ if (!moved)
71
+ return;
72
+ next.splice(target, 0, moved);
73
+ onChildrenChange(next);
74
+ };
75
+ return (_jsxs("div", { className: "space-y-0.5", children: [children.map((child, index) => (_jsx(ConditionRow, { isFirst: index === 0, isLast: index === children.length - 1, op: op, child: child, elements: elements, disabled: disabled, onOpChange: onOpChange, onChange: (next) => updateChild(index, next), onMove: (direction) => moveChild(index, direction) }, index))), _jsx("div", { className: "pt-1", children: _jsx(RuleElementPicker, { elements: elements, kind: "condition", label: "Add condition", disabled: disabled, fullWidth: true, onPick: (element) => onChildrenChange([...children, createLeafCondition(element.id)]) }) })] }));
76
+ }
77
+ function ConditionRow({ isFirst, isLast, op, child, elements, disabled, onOpChange, onChange, onMove, }) {
78
+ const { inner, negated } = unwrapNot(child);
79
+ const setNegated = (n) => onChange(rewrapNot(inner, n));
80
+ const setInner = (next) => {
81
+ if (next === null) {
82
+ onChange(null);
83
+ return;
84
+ }
85
+ onChange(rewrapNot(next, negated));
86
+ };
87
+ const prefix = (_jsx(ConnectorPrefix, { isFirst: isFirst, op: op, negated: negated, disabled: disabled, onOpChange: onOpChange, onNegatedChange: setNegated }));
88
+ const trailing = (_jsx(RowActions, { isFirst: isFirst, isLast: isLast, disabled: disabled, onMove: onMove, onRemove: () => onChange(null) }));
89
+ if (inner.kind === "composite" && inner.op !== "not") {
90
+ return (_jsxs("div", { className: "group rounded px-1 py-1 hover:bg-gray-50", children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsx("div", { className: "flex-1 text-xs leading-7 text-gray-700", children: prefix }), trailing] }), _jsx("div", { className: "mt-1 ml-3 rounded border border-gray-200 bg-gray-50/60 p-2", children: _jsx(ConditionList, { op: inner.op === "or" ? "or" : "and", children: inner.children, elements: elements, disabled: disabled, onOpChange: (nextOp) => setInner({ ...inner, op: nextOp }), onChildrenChange: (nextChildren) => setInner({ ...inner, children: nextChildren }) }) })] }));
91
+ }
92
+ if (inner.kind === "unsupported") {
93
+ return (_jsxs("div", { className: "group flex items-start justify-between gap-2 rounded border border-amber-200 bg-amber-50 p-2 text-2xs text-amber-700 hover:bg-amber-100", children: [_jsxs("div", { className: "flex-1 leading-6", children: [prefix, _jsx("span", { children: "this condition cannot be edited in Parhelia yet." })] }), trailing] }));
94
+ }
95
+ if (inner.kind === "leaf") {
96
+ const leaf = inner;
97
+ const element = getElement(elements, leaf.definitionItemId);
98
+ const setLeafParameters = (parameters) => setInner({ ...leaf, parameters });
99
+ return (_jsxs("div", { className: "group flex items-start gap-2 rounded px-1 py-1 hover:bg-gray-50", children: [_jsx("div", { className: "min-w-0 flex-1", children: element ? (_jsx(RuleParameterInput, { element: element, values: leaf.parameters, disabled: disabled, onChange: setLeafParameters, prefix: prefix, stripLeadingWhere: true })) : (_jsxs("div", { className: "text-xs leading-7 text-gray-500", children: [prefix, _jsxs("span", { children: ["unknown condition (", leaf.definitionItemId, ")"] })] })) }), trailing] }));
100
+ }
101
+ // Fallback for unexpected shapes (e.g. degenerate double-NOT) — render the
102
+ // raw inner via a recursive ConditionList so it's still editable.
103
+ return (_jsxs("div", { className: "group rounded px-1 py-1 hover:bg-gray-50", children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsx("div", { className: "flex-1 text-xs leading-7 text-gray-700", children: prefix }), trailing] }), _jsx("div", { className: "mt-1 ml-3 rounded border border-gray-200 bg-gray-50/60 p-2", children: _jsx(ConditionList, { op: "and", children: [inner], elements: elements, disabled: disabled, onOpChange: () => undefined, onChildrenChange: (next) => setInner(next[0] ?? null) }) })] }));
104
+ }
105
+ function ConnectorPrefix({ isFirst, op, negated, disabled, onOpChange, onNegatedChange, }) {
106
+ return (_jsxs("span", { className: "mr-1 select-none whitespace-nowrap", children: [!isFirst && (_jsxs(_Fragment, { children: [_jsx(ConnectorLink, { disabled: disabled, onClick: () => onOpChange(op === "and" ? "or" : "and"), title: "Toggle AND / OR", children: op }), " "] })), _jsx(ConnectorLink, { disabled: disabled, onClick: () => onNegatedChange(!negated), title: negated ? "Remove negation" : "Negate condition", children: negated ? "except where" : "where" }), " "] }));
107
+ }
108
+ function ConnectorLink({ children, disabled, onClick, title, }) {
109
+ return (_jsx("button", { type: "button", disabled: disabled, onClick: onClick, title: title, className: "cursor-pointer text-blue-600 underline-offset-2 hover:underline disabled:cursor-not-allowed disabled:opacity-60", children: children }));
110
+ }
111
+ function RowActions({ isFirst, isLast, disabled, onMove, onRemove, }) {
112
+ return (_jsxs("div", { className: "flex shrink-0 items-center opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100", children: [_jsx(RowIconButton, { label: "Move up", disabled: disabled || isFirst, onClick: () => onMove(-1), children: _jsx(ChevronUp, { className: "size-3" }) }), _jsx(RowIconButton, { label: "Move down", disabled: disabled || isLast, onClick: () => onMove(1), children: _jsx(ChevronDown, { className: "size-3" }) }), _jsx(RowIconButton, { label: "Remove condition", danger: true, disabled: disabled, onClick: onRemove, children: _jsx(X, { className: "size-3" }) })] }));
113
+ }
114
+ function RowIconButton({ label, disabled, danger, onClick, children, }) {
115
+ return (_jsx(Button, { type: "button", size: "xxs", variant: "ghost", disabled: disabled, onClick: onClick, "aria-label": label, title: label, className: `size-6 rounded-md p-0 ${danger ? "hover:bg-red-50 hover:text-red-600" : ""}`, children: children }));
116
+ }
117
+ //# sourceMappingURL=ConditionTreeEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionTreeEditor.js","sourceRoot":"","sources":["../../../src/editor/personalization/ConditionTreeEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { PersonalizationRuleSet } from "../../types";
2
+ import { Component, ItemDescriptor } from "../pageModel";
3
+ export declare function PersonalizationPanel({ component, pageItem, readonly, ruleSet: ruleSetProp, ruleSetForKey, ruleSetLoadGen, onRuleSetChange, onExternalReload, }: {
4
+ component?: Component;
5
+ pageItem?: ItemDescriptor;
6
+ readonly?: boolean;
7
+ ruleSet?: PersonalizationRuleSet;
8
+ ruleSetForKey?: string;
9
+ ruleSetLoadGen?: number;
10
+ onRuleSetChange?: (update: (current: PersonalizationRuleSet) => PersonalizationRuleSet) => void;
11
+ onExternalReload?: () => void;
12
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,308 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import { CheckCircle2, CircleDashed, Loader2, Plus } from "lucide-react";
4
+ import { Button } from "../../components/ui/button";
5
+ import { useEditContext } from "../client/editContext";
6
+ import { getRuleElements, setActiveRuleForComponent, } from "../services/personalizationService";
7
+ import { ActionList } from "./ActionList";
8
+ import { ConditionTreeEditor } from "./ConditionTreeEditor";
9
+ import { RuleList } from "./RuleList";
10
+ import { createId, createRule } from "./utils";
11
+ function cloneRule(value) {
12
+ return JSON.parse(JSON.stringify(value));
13
+ }
14
+ function normalizeId(value) {
15
+ return (value || "").trim().replace(/[{}]/g, "").toLowerCase();
16
+ }
17
+ const EMPTY_RULE_SET = { rules: [] };
18
+ export function PersonalizationPanel({ component, pageItem, readonly, ruleSet: ruleSetProp, ruleSetForKey, ruleSetLoadGen, onRuleSetChange, onExternalReload, }) {
19
+ const editContext = useEditContext();
20
+ const [elements, setElements] = useState([]);
21
+ const [elementsLoaded, setElementsLoaded] = useState(false);
22
+ // selectedRuleId == the rule currently *applied* to the preview (drives the
23
+ // checkmark and the rule we POST to the backend).
24
+ // expandedRuleId == the accordion body currently shown in the editor. The
25
+ // two are decoupled so the user can collapse a rule's body without losing
26
+ // their applied selection, and can switch the applied rule independently
27
+ // via the status-icon button.
28
+ const [selectedRuleId, setSelectedRuleId] = useState();
29
+ const [expandedRuleId, setExpandedRuleId] = useState();
30
+ const [saving, setSaving] = useState(false);
31
+ const [dirty, setDirty] = useState(false);
32
+ const [replaceUnsupported, setReplaceUnsupported] = useState(false);
33
+ const dirtyRef = useRef(false);
34
+ const savingRef = useRef(false);
35
+ const ruleSet = ruleSetProp ?? EMPTY_RULE_SET;
36
+ useEffect(() => {
37
+ dirtyRef.current = dirty;
38
+ }, [dirty]);
39
+ useEffect(() => {
40
+ savingRef.current = saving;
41
+ }, [saving]);
42
+ // The page model rebuilds after every iframe refresh, so depend on stable
43
+ // scalars rather than the pageItem object reference — otherwise the effect
44
+ // refires on every refresh and the panel flickers.
45
+ const componentId = component?.id;
46
+ const pageItemId = pageItem?.id;
47
+ const pageItemLanguage = pageItem?.language;
48
+ const pageItemVersion = pageItem?.version;
49
+ const componentLoadKey = componentId && pageItemId
50
+ ? `${pageItemId}|${pageItemLanguage || ""}|${pageItemVersion || ""}|${componentId}`
51
+ : undefined;
52
+ const loaded = elementsLoaded &&
53
+ !!ruleSetProp &&
54
+ !!componentLoadKey &&
55
+ ruleSetForKey === componentLoadKey;
56
+ useEffect(() => {
57
+ if (!editContext?.addSocketMessageListener || !componentId || !pageItemId) {
58
+ return;
59
+ }
60
+ return editContext.addSocketMessageListener((message) => {
61
+ if (message.type !== "edit-operation" &&
62
+ message.type !== "operation:completed") {
63
+ return;
64
+ }
65
+ const operation = message.payload || {};
66
+ if (operation.type !== "update-rendering-rules") {
67
+ return;
68
+ }
69
+ const operationComponentId = operation.componentId || operation.ComponentId;
70
+ if (operationComponentId &&
71
+ normalizeId(operationComponentId) !== normalizeId(componentId)) {
72
+ return;
73
+ }
74
+ const mainItem = operation.mainItem || operation.MainItem;
75
+ if (mainItem?.id && normalizeId(mainItem.id) !== normalizeId(pageItemId)) {
76
+ return;
77
+ }
78
+ if (mainItem?.language &&
79
+ pageItemLanguage &&
80
+ mainItem.language !== pageItemLanguage) {
81
+ return;
82
+ }
83
+ if (mainItem?.version &&
84
+ pageItemVersion &&
85
+ Number(mainItem.version) !== Number(pageItemVersion)) {
86
+ return;
87
+ }
88
+ if (dirtyRef.current || savingRef.current) {
89
+ return;
90
+ }
91
+ onExternalReload?.();
92
+ });
93
+ }, [
94
+ editContext?.addSocketMessageListener,
95
+ componentId,
96
+ pageItemId,
97
+ pageItemLanguage,
98
+ pageItemVersion,
99
+ onExternalReload,
100
+ ]);
101
+ useEffect(() => {
102
+ let cancelled = false;
103
+ void getRuleElements()
104
+ .then((nextElements) => {
105
+ if (cancelled)
106
+ return;
107
+ setElements(nextElements);
108
+ setElementsLoaded(true);
109
+ })
110
+ .catch((error) => {
111
+ console.error("Failed to load personalization elements", error);
112
+ if (!cancelled) {
113
+ setElements([]);
114
+ setElementsLoaded(true);
115
+ }
116
+ });
117
+ return () => {
118
+ cancelled = true;
119
+ };
120
+ }, []);
121
+ // When a fresh rule set is loaded (parent fetch completes), seed selection
122
+ // from activeRuleId / first rule. Skip on local edits — those bump the
123
+ // ruleSet identity but not the load generation counter.
124
+ const initializedLoadRef = useRef(undefined);
125
+ useEffect(() => {
126
+ if (!loaded || !ruleSetProp)
127
+ return;
128
+ const initKey = `${componentLoadKey}:${ruleSetLoadGen ?? 0}`;
129
+ if (initializedLoadRef.current === initKey)
130
+ return;
131
+ initializedLoadRef.current = initKey;
132
+ const nextRules = ruleSetProp.rules || [];
133
+ setReplaceUnsupported(false);
134
+ let nextSelected;
135
+ setSelectedRuleId((current) => {
136
+ if (typeof ruleSetProp.activeRuleId === "string") {
137
+ const activeRule = nextRules.find((rule) => normalizeId(rule.uid) === normalizeId(ruleSetProp.activeRuleId));
138
+ nextSelected = activeRule?.uid;
139
+ return nextSelected;
140
+ }
141
+ if (current && nextRules.some((rule) => rule.uid === current)) {
142
+ nextSelected = current;
143
+ return current;
144
+ }
145
+ nextSelected = nextRules[0]?.uid;
146
+ return nextSelected;
147
+ });
148
+ // On a fresh load, seed expansion to mirror the applied rule so the user
149
+ // sees its conditions/actions immediately. From that point on expansion
150
+ // is driven independently by the user.
151
+ setExpandedRuleId(nextSelected);
152
+ }, [loaded, ruleSetProp, componentLoadKey, ruleSetLoadGen]);
153
+ // Tracks the last rule id we pushed to the server per component, so we can
154
+ // distinguish the initial seed (page already rendering with that rule) from
155
+ // a user-driven change that needs a preview refresh.
156
+ const lastAppliedRuleRef = useRef({});
157
+ useEffect(() => {
158
+ if (!loaded ||
159
+ !componentId ||
160
+ !pageItem ||
161
+ !editContext?.sessionId) {
162
+ return;
163
+ }
164
+ const previous = lastAppliedRuleRef.current;
165
+ const ruleChanged = previous.key === componentLoadKey && previous.ruleId !== selectedRuleId;
166
+ lastAppliedRuleRef.current = {
167
+ key: componentLoadKey,
168
+ ruleId: selectedRuleId,
169
+ };
170
+ void setActiveRuleForComponent(pageItem, componentId, selectedRuleId, editContext.sessionId)
171
+ .then(() => {
172
+ if (ruleChanged) {
173
+ editContext.requestRefresh?.("immediate");
174
+ }
175
+ })
176
+ .catch((error) => {
177
+ console.error("Failed to set active personalization rule", error);
178
+ });
179
+ // Depend on stable page/component scalars; pageItem identity changes on refresh.
180
+ // eslint-disable-next-line react-hooks/exhaustive-deps
181
+ }, [
182
+ componentId,
183
+ componentLoadKey,
184
+ editContext?.sessionId,
185
+ loaded,
186
+ pageItemId,
187
+ pageItemLanguage,
188
+ pageItemVersion,
189
+ selectedRuleId,
190
+ ]);
191
+ const selectedRule = useMemo(() => ruleSet.rules.find((rule) => rule.uid === selectedRuleId), [ruleSet.rules, selectedRuleId]);
192
+ const protectedMode = !!ruleSet.unsupported && !replaceUnsupported;
193
+ const disabled = readonly || !loaded || saving || protectedMode;
194
+ const updateRules = (rules) => {
195
+ onRuleSetChange?.((current) => ({
196
+ ...current,
197
+ rules,
198
+ unsupported: replaceUnsupported ? false : current.unsupported,
199
+ }));
200
+ setDirty(true);
201
+ };
202
+ useEffect(() => {
203
+ if (!dirty || disabled || !component?.id || !editContext?.operations)
204
+ return;
205
+ const timeout = window.setTimeout(async () => {
206
+ setSaving(true);
207
+ try {
208
+ await editContext.operations.updateRenderingRules(component.id, {
209
+ rules: ruleSet.rules,
210
+ });
211
+ setDirty(false);
212
+ }
213
+ catch {
214
+ // executeOp already surfaced the backend error toast; keep the panel dirty.
215
+ }
216
+ finally {
217
+ setSaving(false);
218
+ }
219
+ }, 800);
220
+ return () => window.clearTimeout(timeout);
221
+ }, [component?.id, dirty, disabled, editContext?.operations, ruleSet.rules]);
222
+ const addRule = () => {
223
+ const nextRule = createRule(`Rule ${ruleSet.rules.length + 1}`);
224
+ updateRules([...ruleSet.rules, nextRule]);
225
+ setSelectedRuleId(nextRule.uid);
226
+ setExpandedRuleId(nextRule.uid);
227
+ };
228
+ const replaceExistingPersonalization = () => {
229
+ const nextRule = createRule("New rule");
230
+ setReplaceUnsupported(true);
231
+ onRuleSetChange?.(() => ({
232
+ rules: [nextRule],
233
+ unsupported: false,
234
+ unsupportedReasons: [],
235
+ }));
236
+ setSelectedRuleId(nextRule.uid);
237
+ setExpandedRuleId(nextRule.uid);
238
+ setDirty(true);
239
+ };
240
+ if (!component || !pageItem) {
241
+ return (_jsx("div", { className: "p-4 text-xs text-gray-500", children: "Select a component to configure personalization." }));
242
+ }
243
+ if (!loaded) {
244
+ return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-xs text-gray-500", children: [_jsx(Loader2, { className: "size-3 animate-spin" }), "Loading personalization..."] }));
245
+ }
246
+ const renderRuleBody = (rule) => (_jsxs("div", { className: "space-y-4", children: [_jsxs("section", { className: "space-y-2", children: [_jsxs("h4", { className: "flex items-center gap-2 text-2xs font-semibold uppercase tracking-wide text-gray-500", children: [_jsx("span", { className: "inline-block size-1.5 rounded-full bg-emerald-400" }), "When"] }), _jsx(ConditionTreeEditor, { condition: rule.conditions, elements: elements, disabled: disabled, onChange: (conditions) => updateRules(ruleSet.rules.map((existing) => existing.uid === rule.uid ? { ...existing, conditions } : existing)) })] }), _jsxs("section", { className: "space-y-2", children: [_jsxs("h4", { className: "flex items-center gap-2 text-2xs font-semibold uppercase tracking-wide text-gray-500", children: [_jsx("span", { className: "inline-block size-1.5 rounded-full bg-violet-400" }), "Then"] }), _jsx(ActionList, { actions: rule.actions || [], elements: elements, disabled: disabled, onChange: (actions) => updateRules(ruleSet.rules.map((existing) => existing.uid === rule.uid ? { ...existing, actions } : existing)) })] })] }));
247
+ return (_jsxs("div", { className: "space-y-4 p-3 text-xs", "data-testid": "personalization-panel", children: [_jsxs("header", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-sm font-semibold text-gray-900", children: "Personalization" }), component.name && (_jsx("div", { className: "truncate text-2xs text-gray-500", title: component.name, children: component.name }))] }), _jsx(SaveIndicator, { saving: saving, dirty: dirty })] }), readonly && (_jsx("div", { className: "rounded border border-gray-200 bg-gray-50 p-3 text-2xs text-gray-500", children: "Personalization is read-only in the current editor mode." })), protectedMode && (_jsxs("div", { className: "space-y-2 rounded border border-amber-200 bg-amber-50 p-3 text-2xs text-amber-700", children: [_jsx("div", { className: "text-xs font-medium", children: "Existing personalization is protected" }), _jsx("div", { children: "This rendering contains rules that Parhelia cannot fully edit yet. Saving is disabled to avoid overwriting Sitecore data." }), ruleSet.unsupportedReasons?.length ? (_jsx("ul", { className: "list-disc space-y-1 pl-4", children: ruleSet.unsupportedReasons.map((reason) => (_jsx("li", { children: reason }, reason))) })) : null, _jsx(Button, { type: "button", size: "xs", variant: "outline", disabled: readonly, onClick: replaceExistingPersonalization, children: "Replace existing personalization" })] })), ruleSet.rules.length === 0 ? (_jsxs("div", { className: "space-y-3 rounded border border-dashed border-gray-300 p-4 text-center", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "text-xs font-medium text-gray-800", children: "No personalization yet" }), _jsx("div", { className: "text-2xs text-gray-500", children: "Add rules to show different content to different audiences. Each rule combines conditions with actions." })] }), _jsxs(Button, { type: "button", size: "xs", variant: "default", disabled: disabled, onClick: addRule, children: [_jsx(Plus, { className: "size-3" }), "Add first rule"] })] })) : (_jsxs(_Fragment, { children: [_jsx(RuleList, { rules: ruleSet.rules, selectedRuleId: expandedRuleId, appliedRuleId: selectedRule?.uid, disabled: disabled, onToggle: (uid) => setExpandedRuleId((current) => (current === uid ? undefined : uid)), onApply: (uid) => setSelectedRuleId(uid), onRename: (uid, name) => updateRules(ruleSet.rules.map((rule) => rule.uid === uid ? { ...rule, name } : rule)), onDelete: (uid) => {
248
+ const nextRules = ruleSet.rules.filter((rule) => rule.uid !== uid);
249
+ updateRules(nextRules);
250
+ if (selectedRuleId === uid) {
251
+ setSelectedRuleId(nextRules[0]?.uid);
252
+ }
253
+ if (expandedRuleId === uid) {
254
+ setExpandedRuleId(nextRules[0]?.uid);
255
+ }
256
+ }, onDuplicate: (uid) => {
257
+ const source = ruleSet.rules.find((rule) => rule.uid === uid);
258
+ if (!source)
259
+ return;
260
+ const duplicate = {
261
+ ...cloneRule(source),
262
+ uid: createId(),
263
+ name: `${source.name || "Rule"} copy`,
264
+ };
265
+ updateRules([...ruleSet.rules, duplicate]);
266
+ setSelectedRuleId(duplicate.uid);
267
+ setExpandedRuleId(duplicate.uid);
268
+ }, onMove: (uid, direction) => {
269
+ const index = ruleSet.rules.findIndex((rule) => rule.uid === uid);
270
+ const target = index + direction;
271
+ if (index < 0 || target < 0 || target >= ruleSet.rules.length)
272
+ return;
273
+ const nextRules = [...ruleSet.rules];
274
+ const [moved] = nextRules.splice(index, 1);
275
+ if (!moved)
276
+ return;
277
+ nextRules.splice(target, 0, moved);
278
+ updateRules(nextRules);
279
+ }, onReorder: (fromIndex, toIndex) => {
280
+ if (fromIndex < 0 ||
281
+ toIndex < 0 ||
282
+ fromIndex >= ruleSet.rules.length ||
283
+ toIndex >= ruleSet.rules.length ||
284
+ fromIndex === toIndex) {
285
+ return;
286
+ }
287
+ const nextRules = [...ruleSet.rules];
288
+ const [moved] = nextRules.splice(fromIndex, 1);
289
+ if (!moved)
290
+ return;
291
+ nextRules.splice(toIndex, 0, moved);
292
+ updateRules(nextRules);
293
+ }, renderRuleBody: renderRuleBody }), _jsxs(Button, { type: "button", size: "xs", variant: "outline", disabled: disabled, onClick: addRule, className: "w-full justify-center", children: [_jsx(Plus, { className: "size-3" }), "Add rule"] }), _jsxs("button", { type: "button", disabled: disabled, onClick: () => setSelectedRuleId(undefined), title: !selectedRule
294
+ ? "Currently applied"
295
+ : "Show the default rendering (no rule applied)", className: `flex w-full items-center gap-1 rounded border px-1.5 py-1.5 text-left text-xs transition-colors ${!selectedRule
296
+ ? "border-component-blue bg-blue-50/40"
297
+ : "border-gray-200 bg-white hover:bg-gray-50"} disabled:cursor-not-allowed disabled:opacity-60`, children: [_jsx("span", { "aria-hidden": true, className: "size-5 shrink-0" }), _jsx("span", { "aria-hidden": true, className: "size-5 shrink-0" }), _jsx("span", { "aria-hidden": true, className: "flex size-5 shrink-0 items-center justify-center", children: !selectedRule ? (_jsx(CheckCircle2, { className: "size-3.5 text-component-blue" })) : (_jsx(CircleDashed, { className: "size-3.5 text-gray-300" })) }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium text-gray-800", children: "Default rendering" }), _jsx("span", { className: "shrink-0 pr-1 text-2xs text-gray-500", children: "No personalization" })] })] }))] }));
298
+ }
299
+ function SaveIndicator({ saving, dirty, }) {
300
+ if (saving) {
301
+ return (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-2xs text-gray-500", children: [_jsx(Loader2, { className: "size-3 animate-spin" }), "Saving"] }));
302
+ }
303
+ if (dirty) {
304
+ return (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-2xs text-amber-600", children: [_jsx(CircleDashed, { className: "size-3" }), "Modified"] }));
305
+ }
306
+ return (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-2xs text-emerald-600", children: [_jsx(CheckCircle2, { className: "size-3" }), "Saved"] }));
307
+ }
308
+ //# sourceMappingURL=PersonalizationPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonalizationPanel.js","sourceRoot":"","sources":["../../../src/editor/personalization/PersonalizationPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAOpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE/C,SAAS,SAAS,CAAI,KAAQ;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,KAAqB;IACxC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,cAAc,GAA2B,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAE7D,MAAM,UAAU,oBAAoB,CAAC,EACnC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,OAAO,EAAE,WAAW,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,GAYjB;IACC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,4EAA4E;IAC5E,kDAAkD;IAClD,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,8BAA8B;IAC9B,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC/D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC/D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,WAAW,IAAI,cAAc,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAC3B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,0EAA0E;IAC1E,2EAA2E;IAC3E,mDAAmD;IACnD,MAAM,WAAW,GAAG,SAAS,EAAE,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,QAAQ,EAAE,EAAE,CAAC;IAChC,MAAM,gBAAgB,GAAG,QAAQ,EAAE,QAAQ,CAAC;IAC5C,MAAM,eAAe,GAAG,QAAQ,EAAE,OAAO,CAAC;IAC1C,MAAM,gBAAgB,GACpB,WAAW,IAAI,UAAU;QACvB,CAAC,CAAC,GAAG,UAAU,IAAI,gBAAgB,IAAI,EAAE,IAAI,eAAe,IAAI,EAAE,IAAI,WAAW,EAAE;QACnF,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,MAAM,GACV,cAAc;QACd,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,gBAAgB;QAClB,aAAa,KAAK,gBAAgB,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,EAAE,wBAAwB,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,OAAO,WAAW,CAAC,wBAAwB,CAAC,CAAC,OAAO,EAAE,EAAE;YACtD,IACE,OAAO,CAAC,IAAI,KAAK,gBAAgB;gBACjC,OAAO,CAAC,IAAI,KAAK,qBAAqB,EACtC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;YACxC,IAAI,SAAS,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,oBAAoB,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,CAAC;YAC5E,IACE,oBAAoB;gBACpB,WAAW,CAAC,oBAAoB,CAAC,KAAK,WAAW,CAAC,WAAW,CAAC,EAC9D,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC;YAC1D,IAAI,QAAQ,EAAE,EAAE,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,OAAO;YACT,CAAC;YACD,IACE,QAAQ,EAAE,QAAQ;gBAClB,gBAAgB;gBAChB,QAAQ,CAAC,QAAQ,KAAK,gBAAgB,EACtC,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IACE,QAAQ,EAAE,OAAO;gBACjB,eAAe;gBACf,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,eAAe,CAAC,EACpD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,gBAAgB,EAAE,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE;QACD,WAAW,EAAE,wBAAwB;QACrC,WAAW;QACX,UAAU;QACV,gBAAgB;QAChB,eAAe;QACf,gBAAgB;KACjB,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,eAAe,EAAE;aACnB,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;YACrB,IAAI,SAAS;gBAAE,OAAO;YACtB,WAAW,CAAC,YAAY,CAAC,CAAC;YAC1B,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,WAAW,CAAC,EAAE,CAAC,CAAC;gBAChB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,2EAA2E;IAC3E,uEAAuE;IACvE,wDAAwD;IACxD,MAAM,kBAAkB,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW;YAAE,OAAO;QACpC,MAAM,OAAO,GAAG,GAAG,gBAAgB,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QAC7D,IAAI,kBAAkB,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO;QACnD,kBAAkB,CAAC,OAAO,GAAG,OAAO,CAAC;QACrC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,YAAgC,CAAC;QACrC,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,OAAO,WAAW,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAC/B,CAAC,IAAI,EAAE,EAAE,CACP,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAClE,CAAC;gBACF,YAAY,GAAG,UAAU,EAAE,GAAG,CAAC;gBAC/B,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,IAAI,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,CAAC;gBAC9D,YAAY,GAAG,OAAO,CAAC;gBACvB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;YACjC,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,yEAAyE;QACzE,wEAAwE;QACxE,uCAAuC;QACvC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5D,2EAA2E;IAC3E,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,kBAAkB,GAAG,MAAM,CAAoC,EAAE,CAAC,CAAC;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,IACE,CAAC,MAAM;YACP,CAAC,WAAW;YACZ,CAAC,QAAQ;YACT,CAAC,WAAW,EAAE,SAAS,EACvB,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC5C,MAAM,WAAW,GACf,QAAQ,CAAC,GAAG,KAAK,gBAAgB,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc,CAAC;QAC1E,kBAAkB,CAAC,OAAO,GAAG;YAC3B,GAAG,EAAE,gBAAgB;YACrB,MAAM,EAAE,cAAc;SACvB,CAAC;QAEF,KAAK,yBAAyB,CAC5B,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,CAAC,SAAS,CACtB;aACE,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QACL,iFAAiF;QACjF,uDAAuD;IACzD,CAAC,EAAE;QACD,WAAW;QACX,gBAAgB;QAChB,WAAW,EAAE,SAAS;QACtB,MAAM;QACN,UAAU;QACV,gBAAgB;QAChB,eAAe;QACf,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,CAAC,EAC/D,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAChC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,kBAAkB,CAAC;IACnE,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,aAAa,CAAC;IAEhE,MAAM,WAAW,GAAG,CAAC,KAA4B,EAAE,EAAE;QACnD,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG,OAAO;YACV,KAAK;YACL,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW;SAC9D,CAAC,CAAC,CAAC;QACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU;YAAE,OAAO;QAE7E,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAC3C,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,EAAE;oBAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAC,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,4EAA4E;YAC9E,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7E,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;QAChE,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,8BAA8B,GAAG,GAAG,EAAE;QAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACxC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5B,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACvB,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,WAAW,EAAE,KAAK;YAClB,kBAAkB,EAAE,EAAE;SACvB,CAAC,CAAC,CAAC;QACJ,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,CACL,cAAK,SAAS,EAAC,2BAA2B,iEAEpC,CACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CACL,eAAK,SAAS,EAAC,mDAAmD,aAChE,KAAC,OAAO,IAAC,SAAS,EAAC,qBAAqB,GAAG,kCAEvC,CACP,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,IAAyB,EAAE,EAAE,CAAC,CACpD,eAAK,SAAS,EAAC,WAAW,aACxB,mBAAS,SAAS,EAAC,WAAW,aAC5B,cAAI,SAAS,EAAC,sFAAsF,aAClG,eAAM,SAAS,EAAC,mDAAmD,GAAG,YAEnE,EACL,KAAC,mBAAmB,IAClB,SAAS,EAAE,IAAI,CAAC,UAAU,EAC1B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE,CACvB,WAAW,CACT,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7B,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,CACnE,CACF,GAEH,IACM,EAEV,mBAAS,SAAS,EAAC,WAAW,aAC5B,cAAI,SAAS,EAAC,sFAAsF,aAClG,eAAM,SAAS,EAAC,kDAAkD,GAAG,YAElE,EACL,KAAC,UAAU,IACT,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAC3B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,WAAW,CACT,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7B,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAChE,CACF,GAEH,IACM,IACN,CACP,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,iBAAa,uBAAuB,aACxE,kBAAQ,SAAS,EAAC,wCAAwC,aACxD,eAAK,SAAS,EAAC,SAAS,aACtB,aAAI,SAAS,EAAC,qCAAqC,gCAAqB,EACvE,SAAS,CAAC,IAAI,IAAI,CACjB,cAAK,SAAS,EAAC,iCAAiC,EAAC,KAAK,EAAE,SAAS,CAAC,IAAI,YACnE,SAAS,CAAC,IAAI,GACX,CACP,IACG,EACN,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAI,IACxC,EAER,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,sEAAsE,yEAE/E,CACP,EAEA,aAAa,IAAI,CAChB,eAAK,SAAS,EAAC,mFAAmF,aAChG,cAAK,SAAS,EAAC,qBAAqB,sDAE9B,EACN,sJAGM,EACL,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,CACpC,aAAI,SAAS,EAAC,0BAA0B,YACrC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC1C,uBAAkB,MAAM,IAAf,MAAM,CAAe,CAC/B,CAAC,GACC,CACN,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,8BAA8B,iDAGhC,IACL,CACP,EAEA,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC5B,eAAK,SAAS,EAAC,wEAAwE,aACrF,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,mCAAmC,uCAE5C,EACN,cAAK,SAAS,EAAC,wBAAwB,wHAGjC,IACF,EACN,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,aAEhB,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,GAAG,sBAEpB,IACL,CACP,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,QAAQ,IACP,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,YAAY,EAAE,GAAG,EAChC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAChB,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAErE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,EACxC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACtB,WAAW,CACT,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C,CACF,EAEH,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;4BAChB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;4BACnE,WAAW,CAAC,SAAS,CAAC,CAAC;4BACvB,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gCAC3B,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;4BACvC,CAAC;4BACD,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gCAC3B,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;4BACvC,CAAC;wBACH,CAAC,EACD,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;4BACnB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;4BAC9D,IAAI,CAAC,MAAM;gCAAE,OAAO;4BACpB,MAAM,SAAS,GAAG;gCAChB,GAAG,SAAS,CAAC,MAAM,CAAC;gCACpB,GAAG,EAAE,QAAQ,EAAE;gCACf,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,OAAO;6BACtC,CAAC;4BACF,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;4BAC3C,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;4BACjC,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnC,CAAC,EACD,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;4BACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;4BAClE,MAAM,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;4BACjC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM;gCAAE,OAAO;4BACtE,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;4BACrC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;4BAC3C,IAAI,CAAC,KAAK;gCAAE,OAAO;4BACnB,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;4BACnC,WAAW,CAAC,SAAS,CAAC,CAAC;wBACzB,CAAC,EACD,SAAS,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;4BAChC,IACE,SAAS,GAAG,CAAC;gCACb,OAAO,GAAG,CAAC;gCACX,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM;gCACjC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM;gCAC/B,SAAS,KAAK,OAAO,EACrB,CAAC;gCACD,OAAO;4BACT,CAAC;4BACD,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;4BACrC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;4BAC/C,IAAI,CAAC,KAAK;gCAAE,OAAO;4BACnB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;4BACpC,WAAW,CAAC,SAAS,CAAC,CAAC;wBACzB,CAAC,EACD,cAAc,EAAE,cAAc,GAC9B,EAEF,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,uBAAuB,aAEjC,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,GAAG,gBAEpB,EAET,kBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAC3C,KAAK,EACH,CAAC,YAAY;4BACX,CAAC,CAAC,mBAAmB;4BACrB,CAAC,CAAC,8CAA8C,EAEpD,SAAS,EAAE,mGACT,CAAC,YAAY;4BACX,CAAC,CAAC,qCAAqC;4BACvC,CAAC,CAAC,2CACN,kDAAkD,aAGlD,oCAAkB,SAAS,EAAC,iBAAiB,GAAG,EAEhD,oCAAkB,SAAS,EAAC,iBAAiB,GAAG,EAChD,oCAEE,SAAS,EAAC,kDAAkD,YAE3D,CAAC,YAAY,CAAC,CAAC,CAAC,CACf,KAAC,YAAY,IAAC,SAAS,EAAC,8BAA8B,GAAG,CAC1D,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,SAAS,EAAC,wBAAwB,GAAG,CACpD,GACI,EACP,eAAM,SAAS,EAAC,mDAAmD,kCAE5D,EACP,eAAM,SAAS,EAAC,sCAAsC,mCAE/C,IACA,IACR,CACJ,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,MAAM,EACN,KAAK,GAIN;IACC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CACL,gBAAM,SAAS,EAAC,gEAAgE,aAC9E,KAAC,OAAO,IAAC,SAAS,EAAC,qBAAqB,GAAG,cAEtC,CACR,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,gBAAM,SAAS,EAAC,iEAAiE,aAC/E,KAAC,YAAY,IAAC,SAAS,EAAC,QAAQ,GAAG,gBAE9B,CACR,CAAC;IACJ,CAAC;IACD,OAAO,CACL,gBAAM,SAAS,EAAC,mEAAmE,aACjF,KAAC,YAAY,IAAC,SAAS,EAAC,QAAQ,GAAG,aAE9B,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { RuleElement } from "../../types";
2
+ export declare function RuleElementPicker({ elements, kind, label, onPick, disabled, triggerVariant, triggerSize, fullWidth, }: {
3
+ elements: RuleElement[];
4
+ kind: "condition" | "action";
5
+ label: string;
6
+ onPick: (element: RuleElement) => void;
7
+ disabled?: boolean;
8
+ triggerVariant?: "outline" | "ghost" | "default";
9
+ triggerSize?: "xs" | "xxs" | "sm";
10
+ fullWidth?: boolean;
11
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import { Plus, Search } from "lucide-react";
4
+ import { Button } from "../../components/ui/button";
5
+ import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover";
6
+ function formatRuleText(text) {
7
+ if (!text)
8
+ return "";
9
+ // Sitecore rule text uses [varname,Type,Source,Label] placeholders.
10
+ // Render the user-facing label in brackets so the sentence stays readable.
11
+ return text
12
+ .replace(/\[([^\]]+)\]/g, (_match, body) => {
13
+ const parts = body.split(",");
14
+ const label = (parts[3] || parts[0] || "").trim();
15
+ return label ? `[${label}]` : "[…]";
16
+ })
17
+ .replace(/\s+/g, " ")
18
+ .trim();
19
+ }
20
+ export function RuleElementPicker({ elements, kind, label, onPick, disabled, triggerVariant = "outline", triggerSize = "xs", fullWidth, }) {
21
+ const [open, setOpen] = useState(false);
22
+ const [filter, setFilter] = useState("");
23
+ const inputRef = useRef(null);
24
+ useEffect(() => {
25
+ if (!open) {
26
+ setFilter("");
27
+ return;
28
+ }
29
+ const id = window.setTimeout(() => inputRef.current?.focus(), 30);
30
+ return () => window.clearTimeout(id);
31
+ }, [open]);
32
+ const grouped = useMemo(() => {
33
+ const query = filter.trim().toLowerCase();
34
+ const matching = elements
35
+ .filter((element) => element.kind === kind)
36
+ .filter((element) => {
37
+ if (!query)
38
+ return true;
39
+ return (element.displayName.toLowerCase().includes(query) ||
40
+ element.name.toLowerCase().includes(query) ||
41
+ element.category.toLowerCase().includes(query) ||
42
+ element.text.toLowerCase().includes(query));
43
+ });
44
+ const map = new Map();
45
+ for (const element of matching) {
46
+ const key = element.category || "Other";
47
+ const list = map.get(key) ?? [];
48
+ list.push(element);
49
+ map.set(key, list);
50
+ }
51
+ return Array.from(map.entries())
52
+ .sort(([a], [b]) => a.localeCompare(b))
53
+ .map(([category, items]) => ({
54
+ category,
55
+ items: items
56
+ .slice()
57
+ .sort((a, b) => (a.displayName || a.name).localeCompare(b.displayName || b.name)),
58
+ }));
59
+ }, [elements, filter, kind]);
60
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", size: triggerSize, variant: triggerVariant, disabled: disabled, className: fullWidth ? "w-full justify-start" : undefined, children: [_jsx(Plus, { className: "size-3" }), label] }) }), _jsxs(PopoverContent, { align: "start", sideOffset: 4, className: "w-[28rem] max-w-[calc(100vw-2rem)] p-0", children: [_jsx("div", { className: "border-b border-gray-200 p-2", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3 -translate-y-1/2 text-gray-400" }), _jsx("input", { ref: inputRef, type: "text", className: "w-full rounded border border-gray-300 py-1 pl-7 pr-2 text-xs outline-none focus:border-component-blue", placeholder: `Search ${kind}s...`, value: filter, onChange: (event) => setFilter(event.target.value) })] }) }), _jsx("div", { className: "max-h-72 overflow-auto py-1", children: grouped.length === 0 ? (_jsxs("div", { className: "px-3 py-4 text-center text-2xs text-gray-500", children: ["No matching ", kind, "s"] })) : (grouped.map((group) => (_jsxs("div", { className: "py-1", children: [_jsx("div", { className: "px-3 pb-1 pt-1 text-2xs font-semibold uppercase tracking-wide text-gray-500", children: group.category }), group.items.map((element) => {
61
+ const sentence = formatRuleText(element.text);
62
+ return (_jsxs("button", { type: "button", className: "block w-full px-3 py-1.5 text-left hover:bg-blue-50", onClick: () => {
63
+ onPick(element);
64
+ setOpen(false);
65
+ }, title: element.text, children: [_jsx("div", { className: "text-xs font-medium text-gray-800", children: element.displayName || element.name }), sentence && (_jsx("div", { className: "mt-0.5 text-2xs leading-snug text-gray-500", children: sentence }))] }, element.id));
66
+ })] }, group.category)))) })] })] }));
67
+ }
68
+ //# sourceMappingURL=RuleElementPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleElementPicker.js","sourceRoot":"","sources":["../../../src/editor/personalization/RuleElementPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ReactNode } from "react";
2
+ import { PersonalizationRule } from "../../types";
3
+ export declare function RuleList({ rules, selectedRuleId, appliedRuleId, disabled, onToggle, onApply, onDuplicate, onDelete, onMove, onRename, onReorder, renderRuleBody, }: {
4
+ rules: PersonalizationRule[];
5
+ /** UID of the rule whose body is currently expanded (accordion state). */
6
+ selectedRuleId?: string;
7
+ /** UID of the rule currently applied to the preview (gets the checkmark). */
8
+ appliedRuleId?: string;
9
+ disabled?: boolean;
10
+ onToggle: (uid: string) => void;
11
+ /** Apply this rule to the preview (independent of expansion). */
12
+ onApply: (uid: string) => void;
13
+ onDuplicate: (uid: string) => void;
14
+ onDelete: (uid: string) => void;
15
+ onMove: (uid: string, direction: -1 | 1) => void;
16
+ onRename: (uid: string, name: string) => void;
17
+ onReorder: (fromIndex: number, toIndex: number) => void;
18
+ renderRuleBody: (rule: PersonalizationRule) => ReactNode;
19
+ }): import("react/jsx-runtime").JSX.Element | null;