astro-tractstack 2.2.2 → 2.2.4

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 (68) hide show
  1. package/package.json +1 -1
  2. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +0 -1
  3. package/templates/src/components/codehooks/FeaturedArticleSetup.tsx +0 -1
  4. package/templates/src/components/codehooks/ListContentSetup.tsx +0 -1
  5. package/templates/src/components/codehooks/ProductCardSetup.tsx +0 -1
  6. package/templates/src/components/codehooks/ProductGridSetup.tsx +0 -1
  7. package/templates/src/components/compositor/Compositor.tsx +0 -1
  8. package/templates/src/components/compositor/Node.tsx +157 -134
  9. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +2 -4
  10. package/templates/src/components/edit/Header.tsx +1 -2
  11. package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +1 -1
  12. package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +0 -1
  13. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +1 -0
  14. package/templates/src/components/edit/pane/AddPanePanel_new.tsx +8 -12
  15. package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +9 -6
  16. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +2 -2
  17. package/templates/src/components/edit/pane/PanePanel_impression.tsx +0 -4
  18. package/templates/src/components/edit/pane/PanePanel_path.tsx +0 -1
  19. package/templates/src/components/edit/pane/PanePanel_title.tsx +1 -2
  20. package/templates/src/components/edit/pane/RestylePaneModal.tsx +1 -4
  21. package/templates/src/components/edit/pane/steps/AiCreativeDesignStep.tsx +0 -3
  22. package/templates/src/components/edit/pane/steps/AiRefineDesignStep.tsx +2 -2
  23. package/templates/src/components/edit/pane/steps/AiStandardDesignStep.tsx +173 -80
  24. package/templates/src/components/edit/pane/steps/CreativeInjectStep.tsx +0 -5
  25. package/templates/src/components/edit/pane/steps/DesignLibraryStep.tsx +2 -1
  26. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +1 -4
  27. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +0 -1
  28. package/templates/src/components/edit/panels/StyleElementPanel.tsx +1 -1
  29. package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +1 -4
  30. package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +3 -3
  31. package/templates/src/components/edit/panels/StyleImagePanel.tsx +3 -3
  32. package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +1 -4
  33. package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +3 -4
  34. package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +1 -4
  35. package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +3 -3
  36. package/templates/src/components/edit/panels/StyleLinkPanel.tsx +1 -1
  37. package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +1 -1
  38. package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +1 -1
  39. package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +1 -1
  40. package/templates/src/components/edit/panels/StyleParentPanel.tsx +0 -7
  41. package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +0 -2
  42. package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +0 -2
  43. package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +0 -2
  44. package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +0 -3
  45. package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +1 -4
  46. package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +3 -4
  47. package/templates/src/components/edit/panels/StyleWordCarouselPanel.tsx +0 -2
  48. package/templates/src/components/edit/state/StylesMemory.tsx +3 -9
  49. package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +0 -1
  50. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +0 -2
  51. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +0 -2
  52. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +0 -1
  53. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +0 -1
  54. package/templates/src/components/fields/ArtpackImage.tsx +0 -7
  55. package/templates/src/components/fields/BackgroundImage.tsx +0 -14
  56. package/templates/src/components/fields/BackgroundImageWrapper.tsx +0 -5
  57. package/templates/src/components/fields/ImageUpload.tsx +0 -3
  58. package/templates/src/pages/[...slug]/edit.astro +0 -1
  59. package/templates/src/pages/api/auth/logout.ts +9 -20
  60. package/templates/src/pages/sandbox.astro +0 -1
  61. package/templates/src/stores/nodes.ts +278 -312
  62. package/templates/src/stores/nodesHistory.ts +59 -24
  63. package/templates/src/utils/api/setupHelpers.ts +1 -1
  64. package/templates/src/utils/compositor/aiPaneParser.ts +57 -0
  65. package/templates/src/utils/compositor/designLibraryHelper.ts +1 -3
  66. package/templates/src/utils/compositor/htmlAst.ts +109 -2
  67. package/templates/src/utils/compositor/nodesHelper.ts +1 -9
  68. package/templates/src/utils/compositor/savePipeline.ts +1 -4
@@ -161,7 +161,6 @@ const StyleParentPanel = ({
161
161
  {
162
162
  ...targetNode,
163
163
  parentClasses: newParentClasses,
164
- isChanged: true,
165
164
  } as StyleableNode,
166
165
  ]);
167
166
 
@@ -195,9 +194,7 @@ const StyleParentPanel = ({
195
194
 
196
195
  const updatedNode = cloneDeep(selectedTargetNode);
197
196
  updatedNode.gridColumns[viewport] = count;
198
- updatedNode.isChanged = true;
199
197
  ctx.modifyNodes([updatedNode]);
200
- ctx.notifyNode('root');
201
198
  };
202
199
 
203
200
  const handleClickDeleteLayer = () => {
@@ -226,9 +223,7 @@ const StyleParentPanel = ({
226
223
  } else if (typeof updatedPaneNode.bgColour === 'string' && !color) {
227
224
  delete updatedPaneNode.bgColour;
228
225
  }
229
- updatedPaneNode.isChanged = true;
230
226
  ctx.modifyNodes([updatedPaneNode]);
231
- ctx.notifyNode('root');
232
227
  };
233
228
 
234
229
  const handleVisibilityChange = (
@@ -239,9 +234,7 @@ const StyleParentPanel = ({
239
234
  viewport.charAt(0).toUpperCase() + viewport.slice(1)
240
235
  }` as VisibilityKey;
241
236
  updatedNode[key] = !updatedNode[key];
242
- updatedNode.isChanged = true;
243
237
  ctx.modifyNodes([updatedNode]);
244
- ctx.notifyNode('root');
245
238
  };
246
239
 
247
240
  const setView = (newView: PanelView) => {
@@ -67,7 +67,6 @@ const StyleParentDeleteLayerPanel = ({ node, layer }: ParentBasePanelProps) => {
67
67
  const updatedNode = {
68
68
  ...nodeToUpdate,
69
69
  parentClasses: [emptyLayer],
70
- isChanged: true,
71
70
  };
72
71
 
73
72
  ctx.modifyNodes([updatedNode]);
@@ -84,7 +83,6 @@ const StyleParentDeleteLayerPanel = ({ node, layer }: ParentBasePanelProps) => {
84
83
  const updatedNode = {
85
84
  ...nodeToUpdate,
86
85
  parentClasses: newParentClasses,
87
- isChanged: true,
88
86
  };
89
87
 
90
88
  ctx.modifyNodes([updatedNode]);
@@ -121,9 +121,7 @@ const StyleParentPanelRemove = ({
121
121
  }
122
122
 
123
123
  if (wasModified) {
124
- updatedNode.isChanged = true;
125
124
  ctx.modifyNodes([updatedNode]);
126
- ctx.notifyNode('root');
127
125
  }
128
126
 
129
127
  settingsPanelStore.set({
@@ -152,9 +152,7 @@ const StyleParentPanelUpdate = ({
152
152
 
153
153
  classesTarget[viewport][className] = value;
154
154
 
155
- updatedNode.isChanged = true;
156
155
  ctx.modifyNodes([updatedNode]);
157
- ctx.notifyNode('root');
158
156
  }
159
157
  },
160
158
  [styleableNode, layer, className, targetProperty, values, ctx]
@@ -77,9 +77,6 @@ function StyleWidgetConfigPanel({ node }: StyleWidgetConfigPanelProps) {
77
77
  const paramsForCopy = stringParams.slice(0, widgetInfo.parameters.length);
78
78
  newNode.copy = `${widgetType}(${paramsForCopy.join('|')})`;
79
79
 
80
- // Mark the node as changed
81
- newNode.isChanged = true;
82
-
83
80
  // Update the node in the store
84
81
  getCtx().modifyNodes([newNode]);
85
82
  };
@@ -108,10 +108,7 @@ const StyleWidgetRemovePanel = ({
108
108
  delete targetNode.overrideClasses;
109
109
  }
110
110
  }
111
- ctx.modifyNodes([
112
- { ...targetNode, isChanged: true },
113
- { ...deepParentClone, isChanged: true },
114
- ]);
111
+ ctx.modifyNodes([{ ...targetNode }, { ...deepParentClone }]);
115
112
  resetStore();
116
113
  };
117
114
 
@@ -12,7 +12,6 @@ import type {
12
12
  BasePanelProps,
13
13
  FlatNode,
14
14
  MarkdownPaneFragmentNode,
15
- GridLayoutNode,
16
15
  } from '@/types/compositorTypes';
17
16
 
18
17
  const StyleWidgetUpdatePanel = ({
@@ -119,7 +118,7 @@ const StyleWidgetUpdatePanel = ({
119
118
  break;
120
119
  }
121
120
 
122
- ctx.modifyNodes([{ ...targetNode, isChanged: true }]);
121
+ ctx.modifyNodes([{ ...targetNode }]);
123
122
  } else {
124
123
  const markdownNode = cloneDeep(
125
124
  allNodes.get(parentNode.id)
@@ -154,7 +153,7 @@ const StyleWidgetUpdatePanel = ({
154
153
  break;
155
154
  }
156
155
 
157
- ctx.modifyNodes([{ ...markdownNode, isChanged: true }]);
156
+ ctx.modifyNodes([{ ...markdownNode }]);
158
157
  }
159
158
 
160
159
  setPendingUpdate(null);
@@ -236,7 +235,7 @@ const StyleWidgetUpdatePanel = ({
236
235
  }
237
236
  }
238
237
 
239
- ctx.modifyNodes([{ ...targetNode, isChanged: true }]);
238
+ ctx.modifyNodes([{ ...targetNode }]);
240
239
  setIsOverridden(checked);
241
240
  },
242
241
  [node, className, parentNode]
@@ -70,7 +70,6 @@ const StyleWordCarouselPanel = ({ node }: StyleWordCarouselPanelProps) => {
70
70
  words: wordsArray,
71
71
  speed: currentSpeed,
72
72
  },
73
- isChanged: true,
74
73
  } as FlatNode,
75
74
  ]);
76
75
  };
@@ -117,7 +116,6 @@ const StyleWordCarouselPanel = ({ node }: StyleWordCarouselPanelProps) => {
117
116
  {
118
117
  ...currentNode,
119
118
  wordCarouselPayload: undefined,
120
- isChanged: true,
121
119
  } as FlatNode,
122
120
  ]);
123
121
  }
@@ -179,10 +179,7 @@ export const StylesMemory = ({ node, parentNode }: StylesMemoryProps) => {
179
179
  if (typeof memoryState.bgColour === 'string') {
180
180
  updatedParent.bgColour = memoryState.bgColour;
181
181
  }
182
- ctx.modifyNodes([
183
- { ...updatedNode, isChanged: true },
184
- { ...updatedParent, isChanged: true },
185
- ]);
182
+ ctx.modifyNodes([{ ...updatedNode }, { ...updatedParent }]);
186
183
  break;
187
184
  }
188
185
  case 'button': {
@@ -198,7 +195,7 @@ export const StylesMemory = ({ node, parentNode }: StylesMemoryProps) => {
198
195
  buttonHoverClasses: cloneDeep(buttonStyles.buttonHoverClasses),
199
196
  };
200
197
 
201
- ctx.modifyNodes([{ ...updatedNode, isChanged: true }]);
198
+ ctx.modifyNodes([{ ...updatedNode }]);
202
199
  const currentSignal = settingsPanelStore.get();
203
200
  if (currentSignal) {
204
201
  settingsPanelStore.set({ ...currentSignal });
@@ -224,10 +221,7 @@ export const StylesMemory = ({ node, parentNode }: StylesMemoryProps) => {
224
221
  updatedParent.defaultClasses[node.tagName] = cloneDeep(memoryStyles);
225
222
  delete updatedNode.overrideClasses;
226
223
 
227
- ctx.modifyNodes([
228
- { ...updatedParent, isChanged: true },
229
- { ...updatedNode, isChanged: true },
230
- ]);
224
+ ctx.modifyNodes([{ ...updatedParent }, { ...updatedNode }]);
231
225
  const currentSignal = settingsPanelStore.get();
232
226
  if (currentSignal) {
233
227
  settingsPanelStore.set({ ...currentSignal });
@@ -150,7 +150,6 @@ const StoryFragmentConfigPanel = ({
150
150
  const ctx = getCtx();
151
151
  const updatedNode: StoryFragmentNode = {
152
152
  ...cloneDeep(storyfragmentNode),
153
- isChanged: true,
154
153
  };
155
154
 
156
155
  if (!tempBgColor) {
@@ -125,7 +125,6 @@ const StoryFragmentMenuPanel = ({
125
125
  const updatedNode = {
126
126
  ...cloneDeep(storyfragmentNode),
127
127
  menuId: menuId,
128
- isChanged: true,
129
128
  };
130
129
  ctx.modifyNodes([updatedNode]);
131
130
  };
@@ -134,7 +133,6 @@ const StoryFragmentMenuPanel = ({
134
133
  const updatedNode = {
135
134
  ...cloneDeep(storyfragmentNode),
136
135
  menuId: null,
137
- isChanged: true,
138
136
  };
139
137
  ctx.modifyNodes([updatedNode]);
140
138
  setSelectedMenuId(null);
@@ -453,7 +453,6 @@ const StoryFragmentOpenGraphPanel = ({
453
453
  ...storyfragmentNode,
454
454
  title: draftTitle,
455
455
  ...(newSlug ? { slug: newSlug } : {}),
456
- isChanged: true,
457
456
  });
458
457
  ctx.modifyNodes([updatedNode]);
459
458
 
@@ -482,7 +481,6 @@ const StoryFragmentOpenGraphPanel = ({
482
481
  const updatedNode = cloneDeep({
483
482
  ...currentNode,
484
483
  changed: new Date(),
485
- isChanged: true,
486
484
  });
487
485
  ctx.modifyNodes([updatedNode]);
488
486
  }
@@ -127,7 +127,6 @@ const StoryFragmentSlugPanel = ({
127
127
  const updatedNode = cloneDeep({
128
128
  ...storyfragmentNode,
129
129
  slug,
130
- isChanged: true,
131
130
  });
132
131
  ctx.modifyNodes([updatedNode]);
133
132
  }
@@ -60,7 +60,6 @@ const StoryFragmentOpenGraphPanel = ({
60
60
  ...storyfragmentNode,
61
61
  title,
62
62
  ...(newSlug ? { slug: newSlug } : {}),
63
- isChanged: true,
64
63
  });
65
64
  ctx.modifyNodes([updatedNode]);
66
65
  }
@@ -149,11 +149,9 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
149
149
  objectFit,
150
150
  position: artpackNode?.position || 'background',
151
151
  size: artpackNode?.size || 'equal',
152
- isChanged: true,
153
152
  };
154
153
  ctx.addNode(updatedArtNode);
155
154
  const updatedPaneNode = cloneDeep(paneNode);
156
- updatedPaneNode.isChanged = true;
157
155
  ctx.modifyNodes([updatedPaneNode]);
158
156
  setArtpackNode(updatedArtNode);
159
157
  setIsModalOpen(false);
@@ -172,7 +170,6 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
172
170
  if (!artpackNode) return;
173
171
  ctx.deleteNode(artpackNode.id);
174
172
  const updatedPaneNode = cloneDeep(paneNode);
175
- updatedPaneNode.isChanged = true;
176
173
  ctx.modifyNodes([updatedPaneNode]);
177
174
  setArtpackNode(null);
178
175
  setSelectedCollection('');
@@ -188,9 +185,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
188
185
  if (artpackNode) {
189
186
  const updatedArtNode = cloneDeep(artpackNode);
190
187
  updatedArtNode.objectFit = newObjectFit;
191
- updatedArtNode.isChanged = true;
192
188
  const updatedPaneNode = cloneDeep(paneNode);
193
- updatedPaneNode.isChanged = true;
194
189
  ctx.modifyNodes([updatedArtNode, updatedPaneNode]);
195
190
  }
196
191
  };
@@ -205,9 +200,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
205
200
  if (viewport === 'mobile') updatedArtNode.hiddenViewportMobile = hidden;
206
201
  if (viewport === 'tablet') updatedArtNode.hiddenViewportTablet = hidden;
207
202
  if (viewport === 'desktop') updatedArtNode.hiddenViewportDesktop = hidden;
208
- updatedArtNode.isChanged = true;
209
203
  const updatedPaneNode = cloneDeep(paneNode);
210
- updatedPaneNode.isChanged = true;
211
204
  ctx.modifyNodes([updatedArtNode, updatedPaneNode]);
212
205
  }
213
206
  };
@@ -159,11 +159,9 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
159
159
  objectFit,
160
160
  position: bgImageNode?.position || 'background',
161
161
  size: bgImageNode?.size || 'equal',
162
- isChanged: true,
163
162
  };
164
163
  ctx.addNode(updatedBgNode);
165
164
  const updatedPaneNode = cloneDeep(paneNode);
166
- updatedPaneNode.isChanged = true;
167
165
  ctx.modifyNodes([updatedPaneNode]);
168
166
  setBgImageNode(updatedBgNode);
169
167
  setLocalAltDescription(updatedBgNode.alt || '');
@@ -175,7 +173,6 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
175
173
  });
176
174
  }
177
175
  onUpdate();
178
- ctx.notifyNode('root');
179
176
  };
180
177
 
181
178
  const handleFileChange = async (event: ChangeEvent<HTMLInputElement>) => {
@@ -217,16 +214,13 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
217
214
  objectFit,
218
215
  position: bgImageNode?.position || 'background',
219
216
  size: bgImageNode?.size || 'equal',
220
- isChanged: true,
221
217
  };
222
218
  ctx.addNode(updatedBgNode);
223
219
  const updatedPaneNode = cloneDeep(paneNode);
224
- updatedPaneNode.isChanged = true;
225
220
  ctx.modifyNodes([updatedPaneNode]);
226
221
  setBgImageNode(updatedBgNode);
227
222
  setLocalAltDescription(defaultAlt);
228
223
  onUpdate();
229
- ctx.notifyNode('root');
230
224
  } catch (err) {
231
225
  setImageError('Failed to process image');
232
226
  console.error('[BackgroundImage] Error:', err);
@@ -239,21 +233,17 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
239
233
  if (!bgImageNode) return;
240
234
  ctx.deleteNode(bgImageNode.id);
241
235
  const updatedPaneNode = cloneDeep(paneNode);
242
- updatedPaneNode.isChanged = true;
243
236
  ctx.modifyNodes([updatedPaneNode]);
244
237
  setBgImageNode(null);
245
238
  setLocalAltDescription('');
246
239
  onUpdate();
247
- ctx.notifyNode('root');
248
240
  };
249
241
 
250
242
  const handleAltDescriptionBlur = () => {
251
243
  if (bgImageNode && localAltDescription !== bgImageNode.alt) {
252
244
  const updatedBgNode = cloneDeep(bgImageNode);
253
245
  updatedBgNode.alt = localAltDescription;
254
- updatedBgNode.isChanged = true;
255
246
  const updatedPaneNode = cloneDeep(paneNode);
256
- updatedPaneNode.isChanged = true;
257
247
  ctx.modifyNodes([updatedBgNode, updatedPaneNode]);
258
248
  }
259
249
  };
@@ -265,9 +255,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
265
255
  if (bgImageNode) {
266
256
  const updatedBgNode = cloneDeep(bgImageNode);
267
257
  updatedBgNode.objectFit = newObjectFit;
268
- updatedBgNode.isChanged = true;
269
258
  const updatedPaneNode = cloneDeep(paneNode);
270
- updatedPaneNode.isChanged = true;
271
259
  ctx.modifyNodes([updatedBgNode, updatedPaneNode]);
272
260
  }
273
261
  };
@@ -282,9 +270,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
282
270
  if (viewport === 'mobile') updatedBgNode.hiddenViewportMobile = hidden;
283
271
  if (viewport === 'tablet') updatedBgNode.hiddenViewportTablet = hidden;
284
272
  if (viewport === 'desktop') updatedBgNode.hiddenViewportDesktop = hidden;
285
- updatedBgNode.isChanged = true;
286
273
  const updatedPaneNode = cloneDeep(paneNode);
287
- updatedPaneNode.isChanged = true;
288
274
  ctx.modifyNodes([updatedBgNode, updatedPaneNode]);
289
275
  }
290
276
  };
@@ -86,7 +86,6 @@ const BackgroundImageWrapper = ({
86
86
  if (color) updatedPaneNode.bgColour = color;
87
87
  else if (typeof updatedPaneNode.bgColour === `string` && !color)
88
88
  delete updatedPaneNode.bgColour;
89
- updatedPaneNode.isChanged = true;
90
89
  ctx.modifyNodes([updatedPaneNode]);
91
90
  };
92
91
 
@@ -96,9 +95,7 @@ const BackgroundImageWrapper = ({
96
95
  if (!bgNode) return;
97
96
  const updatedBgNode = cloneDeep(bgNode);
98
97
  updatedBgNode.position = newPosition;
99
- updatedBgNode.isChanged = true;
100
98
  const updatedPaneNode = cloneDeep(allNodes.get(paneId) as PaneNode);
101
- updatedPaneNode.isChanged = true;
102
99
  ctx.modifyNodes([updatedBgNode, updatedPaneNode]);
103
100
  onUpdate();
104
101
  };
@@ -107,9 +104,7 @@ const BackgroundImageWrapper = ({
107
104
  if (!bgNode) return;
108
105
  const updatedBgNode = cloneDeep(bgNode);
109
106
  updatedBgNode.size = newSize;
110
- updatedBgNode.isChanged = true;
111
107
  const updatedPaneNode = cloneDeep(allNodes.get(paneId) as PaneNode);
112
- updatedPaneNode.isChanged = true;
113
108
  ctx.modifyNodes([updatedBgNode, updatedPaneNode]);
114
109
  onUpdate();
115
110
  };
@@ -158,7 +158,6 @@ export const ImageUpload = ({
158
158
  if (selected.srcSet) updatedNode.srcSet = selected.srcSet;
159
159
  updatedNode.alt = selected.altDescription || missingAlt;
160
160
  delete updatedNode.base64Data; // Remove base64Data for existing files
161
- updatedNode.isChanged = true;
162
161
  ctx.modifyNodes([updatedNode]);
163
162
  }
164
163
  }
@@ -206,7 +205,6 @@ export const ImageUpload = ({
206
205
  ((updatedNode.fileId = ulid()), (updatedNode.src = base64)); // Set src to base64 for immediate display
207
206
  updatedNode.base64Data = base64;
208
207
  updatedNode.alt = defaultAlt;
209
- updatedNode.isChanged = true;
210
208
  ctx.modifyNodes([updatedNode]);
211
209
  }
212
210
  } catch (err) {
@@ -226,7 +224,6 @@ export const ImageUpload = ({
226
224
  updatedNode.src = '/static.jpg';
227
225
  updatedNode.alt =
228
226
  "This is a placeholder for an image that hasn't yet been uploaded";
229
- updatedNode.isChanged = true;
230
227
  ctx.modifyNodes([updatedNode]);
231
228
  }
232
229
  setCurrentImage('/static.jpg');
@@ -54,7 +54,6 @@ if (slug === 'create') {
54
54
  title: '',
55
55
  slug: '',
56
56
  paneIds: [],
57
- isChanged: false,
58
57
  created: new Date(),
59
58
  changed: new Date(),
60
59
  };
@@ -1,28 +1,17 @@
1
1
  import type { APIRoute } from '@/types/astro';
2
2
 
3
- export const POST: APIRoute = async ({ cookies }) => {
3
+ export const POST: APIRoute = async ({ cookies, url }) => {
4
4
  try {
5
- const goBackend =
6
- import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
7
- let rootDomain: string | undefined;
5
+ const isLocalhost =
6
+ url.hostname === 'localhost' || url.hostname === '127.0.0.1';
8
7
 
9
- try {
10
- const url = new URL(goBackend);
11
- // Only set domain for non-localhost to preserve local dev behavior
12
- if (url.hostname !== 'localhost' && url.hostname !== '127.0.0.1') {
13
- rootDomain = url.hostname;
14
- }
15
- } catch (e) {
16
- console.warn('Logout: Failed to parse backend URL for cookie domain', e);
17
- }
18
-
19
- // Determine the options ONCE to prevent overwriting
20
- const cookieOptions: any = { path: '/' };
21
- if (rootDomain) {
22
- cookieOptions.domain = rootDomain;
23
- }
8
+ const cookieOptions: any = {
9
+ path: '/',
10
+ secure: !isLocalhost,
11
+ httpOnly: true,
12
+ sameSite: 'lax',
13
+ };
24
14
 
25
- // Execute deletion with the single, correct configuration
26
15
  cookies.delete('admin_auth', cookieOptions);
27
16
  cookies.delete('editor_auth', cookieOptions);
28
17
 
@@ -35,7 +35,6 @@ const emptyStoryFragment = {
35
35
  title: 'Sandbox Page',
36
36
  slug: 'sandbox-page',
37
37
  paneIds: [],
38
- isChanged: false,
39
38
  created: new Date(),
40
39
  changed: new Date(),
41
40
  };