@parhelia/core 0.3.12816 → 0.3.12822

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 (83) hide show
  1. package/dist/config/config.js +2 -12
  2. package/dist/config/config.js.map +1 -1
  3. package/dist/editor/ContentTree.d.ts +1 -1
  4. package/dist/editor/ContentTree.js +25 -3
  5. package/dist/editor/ContentTree.js.map +1 -1
  6. package/dist/editor/ai/terminal/components/AgentSettingsSections.js +4 -4
  7. package/dist/editor/ai/terminal/components/AgentSettingsSections.js.map +1 -1
  8. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js +1 -1
  9. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js.map +1 -1
  10. package/dist/editor/ai/terminal/components/AiResponseMessage.js +1 -1
  11. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  12. package/dist/editor/ai/terminal/useAgentStopCommand.js +16 -14
  13. package/dist/editor/ai/terminal/useAgentStopCommand.js.map +1 -1
  14. package/dist/editor/client/EditorShell.js +20 -4
  15. package/dist/editor/client/EditorShell.js.map +1 -1
  16. package/dist/editor/client/hooks/activeSessionSnapshots.js +0 -2
  17. package/dist/editor/client/hooks/activeSessionSnapshots.js.map +1 -1
  18. package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +2 -2
  19. package/dist/editor/client/hooks/useSocketMessageHandler.js +43 -29
  20. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  21. package/dist/editor/client/operations.js +12 -3
  22. package/dist/editor/client/operations.js.map +1 -1
  23. package/dist/editor/media-selector/Thumbnails.js +23 -10
  24. package/dist/editor/media-selector/Thumbnails.js.map +1 -1
  25. package/dist/editor/media-selector/mediaItemDrag.d.ts +22 -5
  26. package/dist/editor/media-selector/mediaItemDrag.js +108 -10
  27. package/dist/editor/media-selector/mediaItemDrag.js.map +1 -1
  28. package/dist/editor/page-viewer/PageViewerFrame.js +13 -0
  29. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  30. package/dist/editor/page-viewer/bridgeInsertModeExit.d.ts +22 -0
  31. package/dist/editor/page-viewer/bridgeInsertModeExit.js +20 -0
  32. package/dist/editor/page-viewer/bridgeInsertModeExit.js.map +1 -0
  33. package/dist/editor/reviews/DecisionsMatrix.js +8 -75
  34. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  35. package/dist/editor/settings/QuotaInfo.js +3 -2
  36. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  37. package/dist/editor/settings/SettingsView.js +6 -5
  38. package/dist/editor/settings/SettingsView.js.map +1 -1
  39. package/dist/editor/settings/UsageLeaderboard.js +12 -12
  40. package/dist/editor/settings/UsageLeaderboard.js.map +1 -1
  41. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +45 -1
  42. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  43. package/dist/editor/sidebar/ComponentTree.js +12 -1
  44. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  45. package/dist/editor/tree-indicators/GutterContext.js +14 -8
  46. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  47. package/dist/lib/sanitize.js +1 -1
  48. package/dist/lib/sanitize.js.map +1 -1
  49. package/dist/revision.d.ts +2 -2
  50. package/dist/revision.js +2 -2
  51. package/dist/task-board/TaskBoardWorkspace.js +186 -7
  52. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  53. package/dist/task-board/components/CreateTaskDialog.d.ts +2 -0
  54. package/dist/task-board/components/CreateTaskDialog.js +6 -3
  55. package/dist/task-board/components/CreateTaskDialog.js.map +1 -1
  56. package/dist/task-board/components/GoalCoverageBar.d.ts +4 -0
  57. package/dist/task-board/components/GoalCoverageBar.js +22 -0
  58. package/dist/task-board/components/GoalCoverageBar.js.map +1 -0
  59. package/dist/task-board/components/GoalDataView.d.ts +39 -0
  60. package/dist/task-board/components/GoalDataView.js +385 -0
  61. package/dist/task-board/components/GoalDataView.js.map +1 -0
  62. package/dist/task-board/components/GoalsMatrix.d.ts +16 -0
  63. package/dist/task-board/components/GoalsMatrix.js +129 -0
  64. package/dist/task-board/components/GoalsMatrix.js.map +1 -0
  65. package/dist/task-board/components/ProjectDashboard.d.ts +1 -1
  66. package/dist/task-board/components/ProjectGoalsPanel.d.ts +16 -0
  67. package/dist/task-board/components/ProjectGoalsPanel.js +74 -113
  68. package/dist/task-board/components/ProjectGoalsPanel.js.map +1 -1
  69. package/dist/task-board/components/SubgoalStatusIcon.d.ts +4 -0
  70. package/dist/task-board/components/SubgoalStatusIcon.js +19 -0
  71. package/dist/task-board/components/SubgoalStatusIcon.js.map +1 -0
  72. package/dist/task-board/components/goalDisplaySpec.d.ts +19 -0
  73. package/dist/task-board/components/goalDisplaySpec.js +72 -0
  74. package/dist/task-board/components/goalDisplaySpec.js.map +1 -0
  75. package/dist/task-board/goalRefreshState.d.ts +6 -0
  76. package/dist/task-board/goalRefreshState.js +11 -0
  77. package/dist/task-board/goalRefreshState.js.map +1 -0
  78. package/dist/task-board/goalTaskNavigationState.d.ts +43 -0
  79. package/dist/task-board/goalTaskNavigationState.js +65 -0
  80. package/dist/task-board/goalTaskNavigationState.js.map +1 -0
  81. package/dist/task-board/types.d.ts +6 -0
  82. package/dist/types.d.ts +0 -2
  83. package/package.json +2 -1
@@ -1,11 +1,13 @@
1
1
  import { setContentTreeItemDragImage, setMultiDragImage, } from "../ui/DragPreview";
2
2
  /**
3
- * Payload marker so a media drag can be told apart from a file drag. The real
4
- * payload travels through `editContext.dragObject` (same as the content tree);
5
- * the data transfer entry only exists because Firefox refuses to start a drag
6
- * without one.
3
+ * Payload marker so a media drag can be told apart from a file drag. The
4
+ * application mirrors the descriptor in DataTransfer as well as React state:
5
+ * native drag/drop can outlive or outrun the render that carries dragObject.
7
6
  */
8
7
  export const MEDIA_ITEM_DRAG_MIME = "application/x-parhelia-media-items";
8
+ const POINTER_DRAG_THRESHOLD_PX = 6;
9
+ let pendingPointerDrag;
10
+ let pointerDragCleanup;
9
11
  export function toMediaItemDescriptor(item, fallbackLanguage) {
10
12
  return {
11
13
  id: item.id,
@@ -14,6 +16,68 @@ export function toMediaItemDescriptor(item, fallbackLanguage) {
14
16
  name: item.name,
15
17
  };
16
18
  }
19
+ function createMediaItemDragObject(items, language) {
20
+ if (items.length === 0)
21
+ return undefined;
22
+ return {
23
+ type: "items",
24
+ typeId: items[0]?.templateId ?? "",
25
+ items: items.map((item) => toMediaItemDescriptor(item, language)),
26
+ };
27
+ }
28
+ /**
29
+ * Arms a pointer-based fallback before the browser decides whether to begin a
30
+ * native HTML drag. Native drag is still the primary path. If the browser
31
+ * never emits dragstart (seen with loaded Chromium processes, touch, and pen),
32
+ * ContentTree can consume this gesture on pointerup and perform the same move.
33
+ */
34
+ export function beginMediaItemPointerDrag({ event, items, language, }) {
35
+ if (event.button !== 0 || event.isPrimary === false)
36
+ return;
37
+ cancelMediaItemPointerDrag();
38
+ const dragObject = createMediaItemDragObject(items, language);
39
+ if (!dragObject || typeof window === "undefined")
40
+ return;
41
+ pendingPointerDrag = {
42
+ pointerId: event.pointerId,
43
+ startX: event.clientX,
44
+ startY: event.clientY,
45
+ dragObject,
46
+ };
47
+ const clearAfterPointerUp = (pointerEvent) => {
48
+ if (pointerEvent.pointerId !== pendingPointerDrag?.pointerId)
49
+ return;
50
+ // React handles the tree's pointerup while the event bubbles. Clear on the
51
+ // next task so ContentTree gets the first chance to consume the gesture.
52
+ window.setTimeout(() => cancelMediaItemPointerDrag(), 0);
53
+ };
54
+ const clearOnPointerCancel = (pointerEvent) => {
55
+ if (pointerEvent.pointerId === pendingPointerDrag?.pointerId) {
56
+ cancelMediaItemPointerDrag();
57
+ }
58
+ };
59
+ window.addEventListener("pointerup", clearAfterPointerUp);
60
+ window.addEventListener("pointercancel", clearOnPointerCancel);
61
+ pointerDragCleanup = () => {
62
+ window.removeEventListener("pointerup", clearAfterPointerUp);
63
+ window.removeEventListener("pointercancel", clearOnPointerCancel);
64
+ };
65
+ }
66
+ export function cancelMediaItemPointerDrag() {
67
+ pointerDragCleanup?.();
68
+ pointerDragCleanup = undefined;
69
+ pendingPointerDrag = undefined;
70
+ }
71
+ export function consumeMediaItemPointerDrag(event) {
72
+ const pending = pendingPointerDrag;
73
+ if (!pending || pending.pointerId !== event.pointerId)
74
+ return undefined;
75
+ const distance = Math.hypot(event.clientX - pending.startX, event.clientY - pending.startY);
76
+ if (distance < POINTER_DRAG_THRESHOLD_PX)
77
+ return undefined;
78
+ cancelMediaItemPointerDrag();
79
+ return pending.dragObject;
80
+ }
17
81
  /**
18
82
  * Starts dragging media items out of a thumbnail grid. Mirrors the content
19
83
  * tree's drag start so the tree's existing drop zones light up and can move the
@@ -22,9 +86,15 @@ export function toMediaItemDescriptor(item, fallbackLanguage) {
22
86
  export function startMediaItemDrag({ event, editContext, items, language, }) {
23
87
  if (!editContext || items.length === 0)
24
88
  return;
89
+ // Once native dragstart fires it owns the gesture; disarm the pointer
90
+ // fallback so a later pointerup cannot execute the move twice.
91
+ cancelMediaItemPointerDrag();
92
+ const dragObject = createMediaItemDragObject(items, language);
93
+ if (!dragObject)
94
+ return;
25
95
  try {
26
96
  event.dataTransfer.effectAllowed = "move";
27
- event.dataTransfer.setData(MEDIA_ITEM_DRAG_MIME, items.map((item) => item.id).join(","));
97
+ event.dataTransfer.setData(MEDIA_ITEM_DRAG_MIME, JSON.stringify(dragObject));
28
98
  }
29
99
  catch { }
30
100
  if (items.length > 1) {
@@ -33,10 +103,38 @@ export function startMediaItemDrag({ event, editContext, items, language, }) {
33
103
  else {
34
104
  setContentTreeItemDragImage(event, items[0].name);
35
105
  }
36
- editContext.dragStart({
37
- type: "items",
38
- typeId: items[0]?.templateId ?? "",
39
- items: items.map((item) => toMediaItemDescriptor(item, language)),
40
- });
106
+ editContext.dragStart(dragObject);
107
+ }
108
+ /**
109
+ * Recovers a media item drag from the browser-owned payload when the React
110
+ * drag state has not committed yet or was cleared by an intervening render.
111
+ */
112
+ export function readMediaItemDrag(dataTransfer) {
113
+ if (!dataTransfer)
114
+ return undefined;
115
+ try {
116
+ const raw = dataTransfer.getData(MEDIA_ITEM_DRAG_MIME);
117
+ if (!raw)
118
+ return undefined;
119
+ const parsed = JSON.parse(raw);
120
+ if (parsed.type !== "items" || !Array.isArray(parsed.items)) {
121
+ return undefined;
122
+ }
123
+ const items = parsed.items.filter((item) => !!item &&
124
+ typeof item.id === "string" &&
125
+ item.id.trim().length > 0 &&
126
+ typeof item.language === "string" &&
127
+ Number.isFinite(item.version));
128
+ if (items.length === 0)
129
+ return undefined;
130
+ return {
131
+ type: "items",
132
+ typeId: typeof parsed.typeId === "string" ? parsed.typeId : "",
133
+ items,
134
+ };
135
+ }
136
+ catch {
137
+ return undefined;
138
+ }
41
139
  }
42
140
  //# sourceMappingURL=mediaItemDrag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mediaItemDrag.js","sourceRoot":"","sources":["../../../src/editor/media-selector/mediaItemDrag.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,oCAAoC,CAAC;AAIzE,MAAM,UAAU,qBAAqB,CACnC,IAAsB,EACtB,gBAAwB;IAExB,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,gBAAgB;QAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,GAMT;IACC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/C,IAAI,CAAC;QACH,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;QAC1C,KAAK,CAAC,YAAY,CAAC,OAAO,CACxB,oBAAoB,EACpB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACvC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,WAAW,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE;QAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KAClE,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"mediaItemDrag.js","sourceRoot":"","sources":["../../../src/editor/media-selector/mediaItemDrag.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,7 @@ import { bridgeItemDescriptorMatchesItem, bridgeStructureTargetsChangedItem, } f
37
37
  import { buildBridgeFieldPatchPayload, buildBridgeFieldPatchSignature, buildRemoteCaretFieldPatches, getBridgeFieldPatchValue, hasRemoteCaretDraftForField, isBridgePatchableTextField, isSuggestionPreviewPatchSignature, } from "./bridgeFieldPatch";
38
38
  import { bridgeSelectionMatchesInteraction, resolveBridgeTextCompletionInput, } from "./bridgeTextCompletion";
39
39
  import { resolveBridgeInlineAiSelectionRange } from "./bridgeInlineAiSelection";
40
+ import { shouldExitInsertModeForBridgeInteraction } from "./bridgeInsertModeExit";
40
41
  import { BRIDGE_AUTHORITATIVE_REFRESH_EVENT, BRIDGE_INLINE_EDIT_COMMIT_EVENT, } from "./bridgeInlineEditCommit";
41
42
  import { logFieldValueDiagnostic, summarizeFieldDescriptor, summarizeFieldValue, } from "../fieldValueDiagnostics";
42
43
  import { createKeyboardEventFromBridgeInteraction, getBridgeFieldHistoryStepDirection, INLINE_FIELD_HISTORY_STEP_EVENT, } from "./bridgeKeyboardShortcuts";
@@ -1918,6 +1919,18 @@ function PageViewerFrameContent({ compareView, pageViewContext, editContext, cla
1918
1919
  !effectiveInteraction.ctrlKey &&
1919
1920
  !effectiveInteraction.shiftKey &&
1920
1921
  !effectiveInteraction.metaKey);
1922
+ // Clicking existing content replaces the intent to insert. Ending the
1923
+ // mode here restores the selection frame and the component form, which
1924
+ // both stay suppressed while insert mode is on; leaving it on would
1925
+ // otherwise inline-edit a component nothing on screen shows as selected.
1926
+ if (shouldExitInsertModeForBridgeInteraction({
1927
+ insertMode: editor.insertMode,
1928
+ interactionKind: effectiveInteraction.kind,
1929
+ hasComponentId: !!componentId,
1930
+ isEditableFieldClick,
1931
+ })) {
1932
+ editor.setInsertMode(false);
1933
+ }
1921
1934
  const isInlineAiUiPresent = () => !!document.querySelector(".agent-inline-dialog, .agent-inline-trigger");
1922
1935
  const closeInlineAiIfOpen = (clearSelection = true) => {
1923
1936
  if (!isInlineAiUiPresent())