@parhelia/core 0.1.12752 → 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 (122) hide show
  1. package/dist/agents-view/AgentsView.js +2 -2
  2. package/dist/agents-view/AgentsView.js.map +1 -1
  3. package/dist/agents-view/AgentsWorkspaceView.js +5 -20
  4. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  5. package/dist/config/config.js +4 -1
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/editor/MainLayout.d.ts +1 -0
  8. package/dist/editor/MainLayout.js +64 -1
  9. package/dist/editor/MainLayout.js.map +1 -1
  10. package/dist/editor/ai/AgentTerminal.js +11 -16
  11. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  12. package/dist/editor/ai/AgentTerminalStatusBar.js +45 -87
  13. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  14. package/dist/editor/ai/Agents.js +10 -5
  15. package/dist/editor/ai/Agents.js.map +1 -1
  16. package/dist/editor/ai/useAgentStatus.js +2 -2
  17. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  18. package/dist/editor/client/EditorShell.js +19 -1
  19. package/dist/editor/client/EditorShell.js.map +1 -1
  20. package/dist/editor/client/editContext.d.ts +4 -0
  21. package/dist/editor/client/editContext.js.map +1 -1
  22. package/dist/editor/client/operations.d.ts +1 -0
  23. package/dist/editor/client/operations.js +37 -3
  24. package/dist/editor/client/operations.js.map +1 -1
  25. package/dist/editor/client/ui/EditorChrome.js +3 -4
  26. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  27. package/dist/editor/commands/componentCommands.js +35 -2
  28. package/dist/editor/commands/componentCommands.js.map +1 -1
  29. package/dist/editor/menubar/ItemLanguageVersion.js +22 -3
  30. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  31. package/dist/editor/menubar/PreviewDatePicker.d.ts +1 -0
  32. package/dist/editor/menubar/PreviewDatePicker.js +55 -0
  33. package/dist/editor/menubar/PreviewDatePicker.js.map +1 -0
  34. package/dist/editor/menubar/VersionSelector.d.ts +2 -1
  35. package/dist/editor/menubar/VersionSelector.js +14 -15
  36. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  37. package/dist/editor/page-editor-chrome/FrameMenu.js +2 -2
  38. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  39. package/dist/editor/page-viewer/EditorForm.js +81 -1
  40. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  41. package/dist/editor/page-viewer/PageViewer.js +22 -90
  42. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  43. package/dist/editor/page-viewer/PageViewerFrame.js +12 -2
  44. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  45. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +4 -0
  46. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  47. package/dist/editor/page-viewer/pageViewContext.d.ts +2 -0
  48. package/dist/editor/page-viewer/pageViewContext.js +8 -1
  49. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  50. package/dist/editor/pageModel.d.ts +2 -0
  51. package/dist/editor/personalization/ActionList.d.ts +7 -0
  52. package/dist/editor/personalization/ActionList.js +16 -0
  53. package/dist/editor/personalization/ActionList.js.map +1 -0
  54. package/dist/editor/personalization/ConditionTreeEditor.d.ts +7 -0
  55. package/dist/editor/personalization/ConditionTreeEditor.js +117 -0
  56. package/dist/editor/personalization/ConditionTreeEditor.js.map +1 -0
  57. package/dist/editor/personalization/PersonalizationPanel.d.ts +12 -0
  58. package/dist/editor/personalization/PersonalizationPanel.js +308 -0
  59. package/dist/editor/personalization/PersonalizationPanel.js.map +1 -0
  60. package/dist/editor/personalization/RuleElementPicker.d.ts +11 -0
  61. package/dist/editor/personalization/RuleElementPicker.js +68 -0
  62. package/dist/editor/personalization/RuleElementPicker.js.map +1 -0
  63. package/dist/editor/personalization/RuleList.d.ts +19 -0
  64. package/dist/editor/personalization/RuleList.js +132 -0
  65. package/dist/editor/personalization/RuleList.js.map +1 -0
  66. package/dist/editor/personalization/RuleParameterInput.d.ts +10 -0
  67. package/dist/editor/personalization/RuleParameterInput.js +115 -0
  68. package/dist/editor/personalization/RuleParameterInput.js.map +1 -0
  69. package/dist/editor/personalization/TreeItemPicker.d.ts +9 -0
  70. package/dist/editor/personalization/TreeItemPicker.js +115 -0
  71. package/dist/editor/personalization/TreeItemPicker.js.map +1 -0
  72. package/dist/editor/personalization/utils.d.ts +6 -0
  73. package/dist/editor/personalization/utils.js +37 -0
  74. package/dist/editor/personalization/utils.js.map +1 -0
  75. package/dist/editor/services/agentStatus.d.ts +1 -0
  76. package/dist/editor/services/agentStatus.js +55 -1
  77. package/dist/editor/services/agentStatus.js.map +1 -1
  78. package/dist/editor/services/contentService.d.ts +5 -0
  79. package/dist/editor/services/contentService.js.map +1 -1
  80. package/dist/editor/services/personalizationService.d.ts +5 -0
  81. package/dist/editor/services/personalizationService.js +32 -0
  82. package/dist/editor/services/personalizationService.js.map +1 -0
  83. package/dist/editor/services/serviceHelper.d.ts +1 -1
  84. package/dist/editor/services/serviceHelper.js +2 -1
  85. package/dist/editor/services/serviceHelper.js.map +1 -1
  86. package/dist/editor/sidebar/OperationItem.js +1 -0
  87. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  88. package/dist/editor/sidebar/SidebarPanel.js +3 -3
  89. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  90. package/dist/editor/ui/PublishRestrictionsDialog.js +1 -0
  91. package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
  92. package/dist/editor/ui/SimpleTabs.d.ts +1 -0
  93. package/dist/editor/ui/SimpleTabs.js +2 -2
  94. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  95. package/dist/editor/ui/Splitter.d.ts +4 -0
  96. package/dist/editor/ui/Splitter.js +42 -17
  97. package/dist/editor/ui/Splitter.js.map +1 -1
  98. package/dist/editor/utils/sitecoreDate.d.ts +2 -0
  99. package/dist/editor/utils/sitecoreDate.js +27 -0
  100. package/dist/editor/utils/sitecoreDate.js.map +1 -0
  101. package/dist/editor/utils/versionAtDate.d.ts +2 -0
  102. package/dist/editor/utils/versionAtDate.js +23 -0
  103. package/dist/editor/utils/versionAtDate.js.map +1 -0
  104. package/dist/lib/viewTransition.d.ts +1 -0
  105. package/dist/lib/viewTransition.js +17 -0
  106. package/dist/lib/viewTransition.js.map +1 -0
  107. package/dist/revision.d.ts +2 -2
  108. package/dist/revision.js +2 -2
  109. package/dist/task-board/TaskBoardWorkspace.js +85 -77
  110. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  111. package/dist/task-board/components/ProjectAgentsPanel.js +2 -2
  112. package/dist/task-board/components/ProjectAgentsPanel.js.map +1 -1
  113. package/dist/task-board/components/ProjectPropertiesPanel.js +76 -24
  114. package/dist/task-board/components/ProjectPropertiesPanel.js.map +1 -1
  115. package/dist/task-board/components/TaskDetailPanel.d.ts +3 -1
  116. package/dist/task-board/components/TaskDetailPanel.js +8 -5
  117. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  118. package/dist/types.d.ts +55 -1
  119. package/package.json +1 -1
  120. package/dist/task-board/components/AssignAgentDialog.d.ts +0 -7
  121. package/dist/task-board/components/AssignAgentDialog.js +0 -104
  122. package/dist/task-board/components/AssignAgentDialog.js.map +0 -1
@@ -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;
@@ -0,0 +1,132 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState, } from "react";
3
+ import { CheckCircle2, ChevronDown, ChevronRight, ChevronUp, CircleDashed, Copy, GripVertical, Pencil, Trash2, } from "lucide-react";
4
+ import { Button } from "../../components/ui/button";
5
+ const DRAG_MIME = "application/x-personalization-rule-uid";
6
+ export function RuleList({ rules, selectedRuleId, appliedRuleId, disabled, onToggle, onApply, onDuplicate, onDelete, onMove, onRename, onReorder, renderRuleBody, }) {
7
+ const [draggingUid, setDraggingUid] = useState(null);
8
+ const [dropIndex, setDropIndex] = useState(null);
9
+ if (rules.length === 0)
10
+ return null;
11
+ const sourceIndex = draggingUid
12
+ ? rules.findIndex((rule) => rule.uid === draggingUid)
13
+ : -1;
14
+ const handleDragStart = (uid) => setDraggingUid(uid);
15
+ const handleDragEnd = () => {
16
+ setDraggingUid(null);
17
+ setDropIndex(null);
18
+ };
19
+ const handleZoneDrop = (index) => {
20
+ if (sourceIndex < 0) {
21
+ handleDragEnd();
22
+ return;
23
+ }
24
+ let toIndex = index;
25
+ if (toIndex > sourceIndex)
26
+ toIndex -= 1;
27
+ if (toIndex !== sourceIndex) {
28
+ onReorder(sourceIndex, toIndex);
29
+ }
30
+ handleDragEnd();
31
+ };
32
+ return (_jsxs("div", { className: "space-y-0", children: [rules.map((rule, index) => {
33
+ const expanded = rule.uid === selectedRuleId;
34
+ const isDragSource = draggingUid === rule.uid;
35
+ return (_jsxs("div", { children: [_jsx(DropZone, { index: index, active: draggingUid !== null, hovered: dropIndex === index, isNoOp: sourceIndex >= 0 &&
36
+ (index === sourceIndex || index === sourceIndex + 1), onEnter: () => setDropIndex(index), onLeave: () => setDropIndex((n) => (n === index ? null : n)), onDrop: () => handleZoneDrop(index) }), _jsx(RuleAccordionItem, { rule: rule, expanded: expanded, applied: rule.uid === appliedRuleId, disabled: disabled, isFirst: index === 0, isLast: index === rules.length - 1, isDragSource: isDragSource, onToggle: () => onToggle(rule.uid), onApply: () => onApply(rule.uid), onRename: (name) => onRename(rule.uid, name), onMove: (direction) => onMove(rule.uid, direction), onDuplicate: () => onDuplicate(rule.uid), onDelete: () => onDelete(rule.uid), onDragStart: (event) => {
37
+ event.dataTransfer.effectAllowed = "move";
38
+ event.dataTransfer.setData(DRAG_MIME, rule.uid);
39
+ event.dataTransfer.setData("text/plain", rule.uid);
40
+ handleDragStart(rule.uid);
41
+ }, onDragEnd: handleDragEnd, children: expanded ? renderRuleBody(rule) : null })] }, rule.uid));
42
+ }), _jsx(DropZone, { index: rules.length, active: draggingUid !== null, hovered: dropIndex === rules.length, isNoOp: sourceIndex === rules.length - 1, onEnter: () => setDropIndex(rules.length), onLeave: () => setDropIndex((n) => (n === rules.length ? null : n)), onDrop: () => handleZoneDrop(rules.length) })] }));
43
+ }
44
+ function DropZone({ active, hovered, isNoOp, onEnter, onLeave, onDrop, }) {
45
+ const showHighlight = active && hovered && !isNoOp;
46
+ return (_jsx("div", { onDragEnter: (event) => {
47
+ if (!active)
48
+ return;
49
+ event.preventDefault();
50
+ onEnter();
51
+ }, onDragOver: (event) => {
52
+ if (!active)
53
+ return;
54
+ event.preventDefault();
55
+ event.dataTransfer.dropEffect = isNoOp ? "none" : "move";
56
+ onEnter();
57
+ }, onDragLeave: onLeave, onDrop: (event) => {
58
+ if (!active)
59
+ return;
60
+ event.preventDefault();
61
+ onDrop();
62
+ }, className: `relative transition-[height,margin] duration-150 ${active ? "h-3 my-0.5" : "h-1.5"}`, children: active && (_jsx("div", { className: `pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 rounded transition-all ${showHighlight
63
+ ? "h-1 bg-component-blue shadow-[0_0_0_3px_rgba(59,130,246,0.15)]"
64
+ : isNoOp
65
+ ? "h-px bg-transparent"
66
+ : "h-0.5 bg-gray-200"}` })) }));
67
+ }
68
+ function RuleAccordionItem({ rule, expanded, applied, disabled, isFirst, isLast, isDragSource, onToggle, onApply, onRename, onMove, onDuplicate, onDelete, onDragStart, onDragEnd, children, }) {
69
+ const [editing, setEditing] = useState(false);
70
+ const [draftName, setDraftName] = useState(rule.name || "");
71
+ const inputRef = useRef(null);
72
+ useEffect(() => {
73
+ setDraftName(rule.name || "");
74
+ }, [rule.name]);
75
+ useEffect(() => {
76
+ if (!editing)
77
+ return;
78
+ const id = window.setTimeout(() => {
79
+ inputRef.current?.focus();
80
+ inputRef.current?.select();
81
+ }, 0);
82
+ return () => window.clearTimeout(id);
83
+ }, [editing]);
84
+ const commitRename = () => {
85
+ const next = draftName.trim();
86
+ if (next && next !== rule.name) {
87
+ onRename(next);
88
+ }
89
+ else {
90
+ setDraftName(rule.name || "");
91
+ }
92
+ setEditing(false);
93
+ };
94
+ const cancelRename = () => {
95
+ setDraftName(rule.name || "");
96
+ setEditing(false);
97
+ };
98
+ const headerDraggable = !disabled && !editing;
99
+ const handleHeaderDragStart = (event) => {
100
+ if (!headerDraggable) {
101
+ event.preventDefault();
102
+ return;
103
+ }
104
+ // Don't drag when the gesture starts on a button or other exempt area
105
+ // (action cluster, name edit input). Letting the user click these without
106
+ // accidentally initiating a drag.
107
+ const target = event.target;
108
+ if (target?.closest("[data-drag-exempt]")) {
109
+ event.preventDefault();
110
+ return;
111
+ }
112
+ onDragStart(event);
113
+ };
114
+ return (_jsxs("div", { className: `overflow-hidden rounded border transition-colors ${expanded
115
+ ? "border-component-blue bg-blue-50/40"
116
+ : "border-gray-200 bg-white"} ${isDragSource ? "opacity-40" : ""}`, children: [_jsxs("div", { draggable: headerDraggable, onDragStart: handleHeaderDragStart, onDragEnd: onDragEnd, className: `flex items-center gap-1 px-1.5 py-1.5 ${headerDraggable ? "cursor-grab active:cursor-grabbing" : ""}`, children: [_jsx("span", { "aria-hidden": true, className: "flex size-5 shrink-0 items-center justify-center text-gray-400", children: _jsx(GripVertical, { className: "size-3.5" }) }), _jsx("button", { type: "button", onClick: onToggle, "aria-label": expanded ? "Collapse rule" : "Expand rule", "data-drag-exempt": true, className: "flex size-5 shrink-0 cursor-pointer items-center justify-center rounded text-gray-500 hover:bg-gray-100 hover:text-gray-800", children: expanded ? (_jsx(ChevronDown, { className: "size-3.5" })) : (_jsx(ChevronRight, { className: "size-3.5" })) }), _jsx("button", { type: "button", onClick: onApply, disabled: disabled || applied, "data-drag-exempt": true, "aria-label": applied ? "Currently applied" : "Apply this rule", "aria-pressed": applied, title: applied ? "Currently applied" : "Apply this rule", className: `flex size-5 shrink-0 items-center justify-center rounded ${applied
117
+ ? "cursor-default"
118
+ : "cursor-pointer hover:bg-gray-100 disabled:cursor-not-allowed"}`, children: applied ? (_jsx(CheckCircle2, { className: "size-3.5 text-component-blue" })) : (_jsx(CircleDashed, { className: "size-3.5 text-gray-300 hover:text-gray-500" })) }), editing ? (_jsx("input", { ref: inputRef, type: "text", "data-drag-exempt": true, className: "min-w-0 flex-1 rounded border border-gray-300 px-2 py-0.5 text-xs outline-none focus:border-component-blue", value: draftName, disabled: disabled, onChange: (event) => setDraftName(event.target.value), onBlur: commitRename, onKeyDown: (event) => {
119
+ if (event.key === "Enter") {
120
+ event.preventDefault();
121
+ commitRename();
122
+ }
123
+ else if (event.key === "Escape") {
124
+ event.preventDefault();
125
+ cancelRename();
126
+ }
127
+ } })) : (_jsxs("button", { type: "button", "data-drag-exempt": true, className: "flex min-w-0 flex-1 items-center gap-2 truncate text-left text-xs font-medium text-gray-800", onClick: onToggle, onDoubleClick: () => !disabled && setEditing(true), title: rule.name || "Unnamed rule", children: [_jsx("span", { className: "truncate", children: rule.name || "Unnamed rule" }), rule.unsupported && (_jsx("span", { className: "shrink-0 rounded bg-amber-100 px-1.5 py-0.5 text-2xs text-amber-700", children: "limited" }))] })), _jsxs("div", { "data-drag-exempt": true, className: "flex shrink-0 items-center", children: [_jsx(IconActionButton, { label: "Rename", disabled: disabled || editing, onClick: () => setEditing(true), children: _jsx(Pencil, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Move up", disabled: disabled || isFirst, onClick: () => onMove(-1), children: _jsx(ChevronUp, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Move down", disabled: disabled || isLast, onClick: () => onMove(1), children: _jsx(ChevronDown, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Duplicate", disabled: disabled, onClick: onDuplicate, children: _jsx(Copy, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Delete", disabled: disabled, danger: true, onClick: onDelete, children: _jsx(Trash2, { className: "size-3" }) })] })] }), expanded && children ? (_jsx("div", { className: "border-t border-gray-200 bg-white p-3", children: children })) : null] }));
128
+ }
129
+ function IconActionButton({ label, disabled, danger, onClick, children, }) {
130
+ 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 }));
131
+ }
132
+ //# sourceMappingURL=RuleList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleList.js","sourceRoot":"","sources":["../../../src/editor/personalization/RuleList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from "react";
2
+ import { RuleElement } from "../../types";
3
+ export declare function RuleParameterInput({ element, values, disabled, onChange, prefix, stripLeadingWhere, }: {
4
+ element?: RuleElement;
5
+ values: Record<string, string>;
6
+ disabled?: boolean;
7
+ onChange: (values: Record<string, string>) => void;
8
+ prefix?: ReactNode;
9
+ stripLeadingWhere?: boolean;
10
+ }): import("react/jsx-runtime").JSX.Element | null;