@craftware/crafty-sdk 0.2.2 → 0.3.0

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 (84) hide show
  1. package/README.md +64 -0
  2. package/dist/attrs.d.ts +33 -0
  3. package/dist/attrs.d.ts.map +1 -0
  4. package/dist/attrs.js +52 -0
  5. package/dist/attrs.js.map +1 -0
  6. package/dist/cdn.d.ts +5 -0
  7. package/dist/cdn.d.ts.map +1 -0
  8. package/dist/cdn.js +5 -0
  9. package/dist/cdn.js.map +1 -0
  10. package/dist/client.d.ts +12 -7
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +13 -8
  13. package/dist/client.js.map +1 -1
  14. package/dist/crafty-visual-editing.global.js +4 -0
  15. package/dist/crafty-visual-editing.global.js.map +7 -0
  16. package/dist/http.d.ts +7 -1
  17. package/dist/http.d.ts.map +1 -1
  18. package/dist/http.js +32 -2
  19. package/dist/http.js.map +1 -1
  20. package/dist/index.d.ts +10 -6
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +4 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/preview.d.ts +56 -0
  25. package/dist/preview.d.ts.map +1 -0
  26. package/dist/preview.js +174 -0
  27. package/dist/preview.js.map +1 -0
  28. package/dist/resources/collections.d.ts +2 -2
  29. package/dist/resources/collections.d.ts.map +1 -1
  30. package/dist/resources/entries.d.ts +3 -2
  31. package/dist/resources/entries.d.ts.map +1 -1
  32. package/dist/resources/entries.js +20 -4
  33. package/dist/resources/entries.js.map +1 -1
  34. package/dist/resources/forms.d.ts +2 -2
  35. package/dist/resources/forms.d.ts.map +1 -1
  36. package/dist/resources/forms.js +1 -1
  37. package/dist/resources/forms.js.map +1 -1
  38. package/dist/resources/mediaCollections.d.ts +2 -2
  39. package/dist/resources/mediaCollections.d.ts.map +1 -1
  40. package/dist/resources/mediaFiles.d.ts +2 -2
  41. package/dist/resources/mediaFiles.d.ts.map +1 -1
  42. package/dist/resources/pages.d.ts +2 -2
  43. package/dist/resources/pages.d.ts.map +1 -1
  44. package/dist/resources/pages.js +4 -0
  45. package/dist/resources/pages.js.map +1 -1
  46. package/dist/types/public.d.ts +11 -2
  47. package/dist/types/public.d.ts.map +1 -1
  48. package/dist/version.d.ts +2 -0
  49. package/dist/version.d.ts.map +1 -0
  50. package/dist/version.js +3 -0
  51. package/dist/version.js.map +1 -0
  52. package/dist/visual-editing/bridge.d.ts +35 -0
  53. package/dist/visual-editing/bridge.d.ts.map +1 -0
  54. package/dist/visual-editing/bridge.js +385 -0
  55. package/dist/visual-editing/bridge.js.map +1 -0
  56. package/dist/visual-editing/index.d.ts +10 -0
  57. package/dist/visual-editing/index.d.ts.map +1 -0
  58. package/dist/visual-editing/index.js +10 -0
  59. package/dist/visual-editing/index.js.map +1 -0
  60. package/dist/visual-editing/live-preview.d.ts +15 -0
  61. package/dist/visual-editing/live-preview.d.ts.map +1 -0
  62. package/dist/visual-editing/live-preview.js +63 -0
  63. package/dist/visual-editing/live-preview.js.map +1 -0
  64. package/dist/visual-editing/markers.d.ts +11 -0
  65. package/dist/visual-editing/markers.d.ts.map +1 -0
  66. package/dist/visual-editing/markers.js +43 -0
  67. package/dist/visual-editing/markers.js.map +1 -0
  68. package/dist/visual-editing/origin.d.ts +10 -0
  69. package/dist/visual-editing/origin.d.ts.map +1 -0
  70. package/dist/visual-editing/origin.js +37 -0
  71. package/dist/visual-editing/origin.js.map +1 -0
  72. package/dist/visual-editing/overlay.d.ts +13 -0
  73. package/dist/visual-editing/overlay.d.ts.map +1 -0
  74. package/dist/visual-editing/overlay.js +107 -0
  75. package/dist/visual-editing/overlay.js.map +1 -0
  76. package/dist/visual-editing/protocol.d.ts +79 -0
  77. package/dist/visual-editing/protocol.d.ts.map +1 -0
  78. package/dist/visual-editing/protocol.js +150 -0
  79. package/dist/visual-editing/protocol.js.map +1 -0
  80. package/package.json +13 -4
  81. package/skills/crafty-cms/SKILL.md +14 -1
  82. package/skills/crafty-cms/references/mcp-configuration.md +7 -0
  83. package/skills/crafty-cms/references/sdk-development.md +13 -1
  84. package/skills/crafty-cms/references/visual-editor.md +218 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/visual-editing/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAgBjD,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAGrB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,oBAAoB,GAAG;IACjC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,mFAAmF;IACnF,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,kDAAkD;IAClD,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAUF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CAgC3F"}
@@ -0,0 +1,385 @@
1
+ import { PREVIEW_ACTIVE_EVENT, PREVIEW_CONTENT_EVENT, PREVIEW_INVALID_EVENT, PREVIEW_QUERY_PARAM, getPreviewContent, getPreviewStatus, readPreviewToken, storePreviewToken } from "../preview.js";
2
+ import { SDK_VERSION } from "../version.js";
3
+ import { createLivePreview } from "./live-preview.js";
4
+ import { MARKED_SELECTOR, readMarkedField, refKey, scanMarked, uniqueFields } from "./markers.js";
5
+ import { DEFAULT_ADMIN_ORIGINS, isAllowedAdminOrigin, resolveParentOrigin } from "./origin.js";
6
+ import { createOverlay } from "./overlay.js";
7
+ import { PROTOCOL_VERSION, parseInboundMessage } from "./protocol.js";
8
+ const SCROLL_STORAGE_KEY = "crafty:scroll-y";
9
+ const RESCAN_DELAY_MS = 50;
10
+ const DEFAULT_TOUCH_HIGHLIGHT_MS = 1500;
11
+ const WATCHED_ATTRIBUTES = ["data-crafty-field", "data-crafty-block", "data-crafty-entry", "data-crafty-label"];
12
+ const inactiveHandle = { active: false, disable: () => undefined };
13
+ let activeHandle = null;
14
+ /**
15
+ * Connects the page to the Crafty visual editor. No-op unless the page runs in
16
+ * an iframe, carries a preview token, and its parent is an allowed admin origin.
17
+ *
18
+ * The default allowlist (`*.crafty.do`) also covers sites hosted by Crafty, so
19
+ * the bridge stays inert (no overlay, no listeners, no messages) until the API
20
+ * answers a preview request with `X-Crafty-Preview-Status: active`. On `invalid`
21
+ * it only tells the admin `crafty:preview-invalid` and stays inert.
22
+ */
23
+ export function enableVisualEditing(options = {}) {
24
+ if (typeof window === "undefined" || typeof document === "undefined") {
25
+ return inactiveHandle;
26
+ }
27
+ if (activeHandle !== null) {
28
+ return activeHandle;
29
+ }
30
+ const win = window;
31
+ if (win.parent === null || win.parent === win || readPreviewToken() === null) {
32
+ return inactiveHandle;
33
+ }
34
+ const parentOrigin = resolveParentOrigin(win);
35
+ if (parentOrigin === null || !isAllowedAdminOrigin(parentOrigin, options.adminOrigins ?? DEFAULT_ADMIN_ORIGINS)) {
36
+ return inactiveHandle;
37
+ }
38
+ const status = getPreviewStatus();
39
+ if (status === "invalid") {
40
+ postPreviewInvalid(win, parentOrigin);
41
+ return inactiveHandle;
42
+ }
43
+ activeHandle = status === "active" ? startBridge(win, parentOrigin, options) : awaitConfirmation(win, parentOrigin, options);
44
+ return activeHandle;
45
+ }
46
+ function postPreviewInvalid(win, parentOrigin) {
47
+ const message = { v: PROTOCOL_VERSION, type: "crafty:preview-invalid", payload: {} };
48
+ win.parent.postMessage(message, parentOrigin);
49
+ }
50
+ /**
51
+ * Pending handle: waits for the API to confirm the token before starting the
52
+ * bridge, verifying it through `options.client` when one is given.
53
+ */
54
+ function awaitConfirmation(win, parentOrigin, options) {
55
+ let bridge = null;
56
+ let settled = false;
57
+ const stopWaiting = () => {
58
+ settled = true;
59
+ win.removeEventListener(PREVIEW_ACTIVE_EVENT, onActive);
60
+ win.removeEventListener(PREVIEW_INVALID_EVENT, onInvalid);
61
+ };
62
+ const release = () => {
63
+ if (activeHandle === handle) {
64
+ activeHandle = null;
65
+ }
66
+ };
67
+ const onActive = () => {
68
+ if (settled) {
69
+ return;
70
+ }
71
+ stopWaiting();
72
+ bridge = startBridge(win, parentOrigin, options, release);
73
+ };
74
+ const onInvalid = () => {
75
+ if (settled) {
76
+ return;
77
+ }
78
+ stopWaiting();
79
+ release();
80
+ postPreviewInvalid(win, parentOrigin);
81
+ };
82
+ const handle = {
83
+ get active() {
84
+ return bridge?.active ?? false;
85
+ },
86
+ disable() {
87
+ stopWaiting();
88
+ bridge?.disable();
89
+ release();
90
+ }
91
+ };
92
+ win.addEventListener(PREVIEW_ACTIVE_EVENT, onActive);
93
+ win.addEventListener(PREVIEW_INVALID_EVENT, onInvalid);
94
+ // The status handlers above settle the outcome; request errors leave the bridge waiting.
95
+ options.client?.pages.list({ per_page: 1 }).catch(() => undefined);
96
+ return handle;
97
+ }
98
+ function startBridge(win, parentOrigin, options, onDisable) {
99
+ const doc = win.document;
100
+ const overlay = createOverlay(doc);
101
+ const livePreview = createLivePreview(doc);
102
+ const pendingScrollY = takeStoredScroll(win);
103
+ let marked = [];
104
+ let sentSignature = null;
105
+ let rescanTimer;
106
+ let forceReady = false;
107
+ let active = true;
108
+ const post = (message) => {
109
+ win.parent.postMessage(message, parentOrigin);
110
+ };
111
+ const sendReady = () => {
112
+ const fields = uniqueFields(marked);
113
+ const content = getPreviewContent();
114
+ sentSignature = signatureOf(fields);
115
+ post({
116
+ v: PROTOCOL_VERSION,
117
+ type: "crafty:ready",
118
+ payload: {
119
+ sdkVersion: SDK_VERSION,
120
+ path: currentPath(win),
121
+ fields,
122
+ page: content.page ?? options.page ?? null,
123
+ entries: mergeEntries(content.entries, options.entries ?? [])
124
+ }
125
+ });
126
+ };
127
+ const rescan = () => {
128
+ rescanTimer = undefined;
129
+ if (!active) {
130
+ return;
131
+ }
132
+ overlay.ensureAttached();
133
+ marked = scanMarked(doc);
134
+ livePreview.reapply();
135
+ if (forceReady || signatureOf(uniqueFields(marked)) !== sentSignature) {
136
+ forceReady = false;
137
+ sendReady();
138
+ }
139
+ };
140
+ const scheduleRescan = () => {
141
+ if (active && rescanTimer === undefined) {
142
+ rescanTimer = win.setTimeout(rescan, RESCAN_DELAY_MS);
143
+ }
144
+ };
145
+ const observer = new MutationObserver((records) => {
146
+ if (records.some((record) => !overlay.contains(record.target))) {
147
+ scheduleRescan();
148
+ }
149
+ });
150
+ const hitFrom = (target) => {
151
+ const element = asElement(target)?.closest(MARKED_SELECTOR) ?? null;
152
+ const field = element !== null ? readMarkedField(element) : null;
153
+ return element !== null && field !== null ? { element, field } : null;
154
+ };
155
+ const labelOf = (field) => field.label ?? field.field;
156
+ const onPointerOver = (event) => {
157
+ if (event.pointerType === "touch") {
158
+ return;
159
+ }
160
+ const hit = hitFrom(event.target);
161
+ if (hit !== null) {
162
+ overlay.show(hit.element, labelOf(hit.field));
163
+ }
164
+ else {
165
+ overlay.hide();
166
+ }
167
+ };
168
+ const onClick = (event) => {
169
+ const hit = hitFrom(event.target);
170
+ if (hit !== null) {
171
+ event.preventDefault();
172
+ event.stopPropagation();
173
+ overlay.show(hit.element, labelOf(hit.field));
174
+ post({ v: PROTOCOL_VERSION, type: "crafty:select", payload: hit.field });
175
+ return;
176
+ }
177
+ const path = internalLinkPath(event, win);
178
+ if (path !== null) {
179
+ event.preventDefault();
180
+ event.stopPropagation();
181
+ post({ v: PROTOCOL_VERSION, type: "crafty:navigate", payload: { path } });
182
+ }
183
+ };
184
+ const highlight = (ref) => {
185
+ const key = refKey(ref);
186
+ const match = scanMarked(doc).find((item) => refKey(item.field) === key);
187
+ if (match === undefined) {
188
+ return;
189
+ }
190
+ const element = match.element;
191
+ element.scrollIntoView?.({ block: "center", behavior: "smooth" });
192
+ overlay.show(match.element, labelOf(match.field));
193
+ };
194
+ const refresh = async () => {
195
+ if (options.onRefresh) {
196
+ try {
197
+ await options.onRefresh();
198
+ }
199
+ finally {
200
+ scheduleRescan();
201
+ }
202
+ return;
203
+ }
204
+ try {
205
+ win.sessionStorage.setItem(SCROLL_STORAGE_KEY, String(win.scrollY));
206
+ }
207
+ catch {
208
+ // Storage blocked: reload without restoring the scroll position.
209
+ }
210
+ win.location.reload();
211
+ };
212
+ const handleInbound = (message) => {
213
+ switch (message.type) {
214
+ case "crafty:token":
215
+ storePreviewToken(message.payload.token);
216
+ return;
217
+ case "crafty:refresh":
218
+ refresh().catch((error) => console.error("[crafty] onRefresh failed", error));
219
+ return;
220
+ case "crafty:highlight":
221
+ highlight(message.payload);
222
+ return;
223
+ case "crafty:preview-field":
224
+ livePreview.set(message.payload, message.payload.value);
225
+ overlay.reposition();
226
+ return;
227
+ case "crafty:preview-reset":
228
+ livePreview.reset(message.payload);
229
+ overlay.reposition();
230
+ return;
231
+ }
232
+ };
233
+ const onMessage = (event) => {
234
+ if (event.source !== win.parent || event.origin !== parentOrigin) {
235
+ return;
236
+ }
237
+ const message = parseInboundMessage(event.data);
238
+ if (message !== null) {
239
+ handleInbound(message);
240
+ }
241
+ };
242
+ const onPreviewInvalid = () => {
243
+ post({ v: PROTOCOL_VERSION, type: "crafty:preview-invalid", payload: {} });
244
+ };
245
+ const onPreviewContent = () => {
246
+ forceReady = true;
247
+ scheduleRescan();
248
+ };
249
+ const start = () => {
250
+ if (!active) {
251
+ return;
252
+ }
253
+ marked = scanMarked(doc);
254
+ sendReady();
255
+ if (isTouchDevice(win)) {
256
+ overlay.flash(marked.map((item) => item.element), options.touchHighlightMs ?? DEFAULT_TOUCH_HIGHLIGHT_MS);
257
+ }
258
+ restoreScroll(win, pendingScrollY);
259
+ };
260
+ win.addEventListener("message", onMessage);
261
+ doc.addEventListener("click", onClick, true);
262
+ doc.addEventListener("pointerover", onPointerOver, true);
263
+ win.addEventListener(PREVIEW_INVALID_EVENT, onPreviewInvalid);
264
+ win.addEventListener(PREVIEW_CONTENT_EVENT, onPreviewContent);
265
+ observer.observe(doc.documentElement, {
266
+ childList: true,
267
+ subtree: true,
268
+ attributes: true,
269
+ attributeFilter: WATCHED_ATTRIBUTES
270
+ });
271
+ if (doc.readyState === "loading") {
272
+ doc.addEventListener("DOMContentLoaded", start, { once: true });
273
+ }
274
+ else {
275
+ start();
276
+ }
277
+ const handle = {
278
+ get active() {
279
+ return active;
280
+ },
281
+ disable() {
282
+ if (!active) {
283
+ return;
284
+ }
285
+ active = false;
286
+ win.removeEventListener("message", onMessage);
287
+ doc.removeEventListener("click", onClick, true);
288
+ doc.removeEventListener("pointerover", onPointerOver, true);
289
+ doc.removeEventListener("DOMContentLoaded", start);
290
+ win.removeEventListener(PREVIEW_INVALID_EVENT, onPreviewInvalid);
291
+ win.removeEventListener(PREVIEW_CONTENT_EVENT, onPreviewContent);
292
+ observer.disconnect();
293
+ if (rescanTimer !== undefined) {
294
+ win.clearTimeout(rescanTimer);
295
+ rescanTimer = undefined;
296
+ }
297
+ livePreview.resetAll();
298
+ overlay.destroy();
299
+ if (activeHandle === handle) {
300
+ activeHandle = null;
301
+ }
302
+ onDisable?.();
303
+ }
304
+ };
305
+ return handle;
306
+ }
307
+ function asElement(target) {
308
+ return target !== null && typeof target.closest === "function" ? target : null;
309
+ }
310
+ function signatureOf(fields) {
311
+ return fields.map((field) => `${refKey(field)}|${field.label ?? ""}`).join("\n");
312
+ }
313
+ function mergeEntries(fetched, declared) {
314
+ const seen = new Set();
315
+ return [...fetched, ...declared].filter((entry) => {
316
+ const key = `${entry.collection}:${entry.id}`;
317
+ if (seen.has(key)) {
318
+ return false;
319
+ }
320
+ seen.add(key);
321
+ return true;
322
+ });
323
+ }
324
+ function stripPreviewParam(url) {
325
+ url.searchParams.delete(PREVIEW_QUERY_PARAM);
326
+ return `${url.pathname}${url.search}`;
327
+ }
328
+ function currentPath(win) {
329
+ return stripPreviewParam(new URL(win.location.href));
330
+ }
331
+ function internalLinkPath(event, win) {
332
+ if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
333
+ return null;
334
+ }
335
+ const anchor = asElement(event.target)?.closest("a[href]") ?? null;
336
+ if (anchor === null || anchor.hasAttribute("download")) {
337
+ return null;
338
+ }
339
+ const target = anchor.getAttribute("target");
340
+ if (target !== null && target !== "" && target !== "_self") {
341
+ return null;
342
+ }
343
+ let url;
344
+ try {
345
+ url = new URL(anchor.getAttribute("href") ?? "", win.location.href);
346
+ }
347
+ catch {
348
+ return null;
349
+ }
350
+ if (url.origin !== win.location.origin) {
351
+ return null;
352
+ }
353
+ const path = stripPreviewParam(url);
354
+ if (url.hash !== "" && path === currentPath(win)) {
355
+ return null;
356
+ }
357
+ return path;
358
+ }
359
+ function isTouchDevice(win) {
360
+ return typeof win.matchMedia === "function" && win.matchMedia("(hover: none)").matches;
361
+ }
362
+ function takeStoredScroll(win) {
363
+ try {
364
+ const raw = win.sessionStorage.getItem(SCROLL_STORAGE_KEY);
365
+ win.sessionStorage.removeItem(SCROLL_STORAGE_KEY);
366
+ const scrollY = raw === null ? Number.NaN : Number(raw);
367
+ return Number.isFinite(scrollY) ? scrollY : null;
368
+ }
369
+ catch {
370
+ return null;
371
+ }
372
+ }
373
+ function restoreScroll(win, scrollY) {
374
+ if (scrollY === null) {
375
+ return;
376
+ }
377
+ const apply = () => win.scrollTo(0, scrollY);
378
+ if (win.document.readyState === "complete") {
379
+ apply();
380
+ }
381
+ else {
382
+ win.addEventListener("load", apply, { once: true });
383
+ }
384
+ }
385
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/visual-editing/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { enableVisualEditing } from "./bridge.js";
2
+ export type { VisualEditingHandle, VisualEditingOptions } from "./bridge.js";
3
+ export { DEFAULT_ADMIN_ORIGINS, isAllowedAdminOrigin } from "./origin.js";
4
+ export { PROTOCOL_VERSION, parseInboundMessage, parseOutboundMessage } from "./protocol.js";
5
+ export type { CraftyFieldRef, CraftyMarkedField, CraftyShownEntry, CraftyShownPage, CraftyTargetType, InboundMessage, OutboundMessage, ReadyPayload } from "./protocol.js";
6
+ export { PREVIEW_ACTIVE_EVENT, PREVIEW_INVALID_EVENT, getPreviewStatus, notifyPreviewActive, notifyPreviewInvalid } from "../preview.js";
7
+ export type { PreviewStatus } from "../preview.js";
8
+ export { attrs, attrsHtml } from "../attrs.js";
9
+ export type { CraftyAttrsOptions, CraftyEditAttributes, CraftyEditTarget, CraftyEditTargetType } from "../attrs.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/visual-editing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5F,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACb,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACzI,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { enableVisualEditing } from "./bridge.js";
2
+ export { DEFAULT_ADMIN_ORIGINS, isAllowedAdminOrigin } from "./origin.js";
3
+ export { PROTOCOL_VERSION, parseInboundMessage, parseOutboundMessage } from "./protocol.js";
4
+ // Preview-status helpers: needed by sites whose only Crafty requests happen
5
+ // server-side (SSR), so the browser never sees `X-Crafty-Preview-Status`
6
+ // itself. They can confirm or invalidate the token manually, or check its
7
+ // current state, without importing SDK internals.
8
+ export { PREVIEW_ACTIVE_EVENT, PREVIEW_INVALID_EVENT, getPreviewStatus, notifyPreviewActive, notifyPreviewInvalid } from "../preview.js";
9
+ export { attrs, attrsHtml } from "../attrs.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visual-editing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAY5F,4EAA4E;AAC5E,yEAAyE;AACzE,0EAA0E;AAC1E,kDAAkD;AAClD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGzI,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { CraftyFieldRef } from "./protocol.js";
2
+ export type LivePreview = {
3
+ set(ref: CraftyFieldRef, value: string): void;
4
+ reset(ref: CraftyFieldRef): void;
5
+ reapply(): void;
6
+ resetAll(): void;
7
+ readonly size: number;
8
+ };
9
+ /**
10
+ * Plain-text live preview. Values are written with `textContent` (never HTML),
11
+ * and each element's own original text is kept so a reset restores exactly what
12
+ * the site rendered, even for elements rendered after the value was set.
13
+ */
14
+ export declare function createLivePreview(root: ParentNode): LivePreview;
15
+ //# sourceMappingURL=live-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-preview.d.ts","sourceRoot":"","sources":["../../src/visual-editing/live-preview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI,IAAI,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAiE/D"}
@@ -0,0 +1,63 @@
1
+ import { MARKED_SELECTOR, readMarkedField, refKey } from "./markers.js";
2
+ /**
3
+ * Plain-text live preview. Values are written with `textContent` (never HTML),
4
+ * and each element's own original text is kept so a reset restores exactly what
5
+ * the site rendered, even for elements rendered after the value was set.
6
+ */
7
+ export function createLivePreview(root) {
8
+ const values = new Map();
9
+ const originals = new Map();
10
+ const matching = (key) => Array.from(root.querySelectorAll(MARKED_SELECTOR)).filter((element) => {
11
+ const field = readMarkedField(element);
12
+ return field !== null && refKey(field) === key;
13
+ });
14
+ const write = (element, value) => {
15
+ if (!originals.has(element)) {
16
+ originals.set(element, element.textContent ?? "");
17
+ }
18
+ if (element.textContent !== value) {
19
+ element.textContent = value;
20
+ }
21
+ };
22
+ const restore = (key) => {
23
+ for (const [element, original] of originals) {
24
+ const field = readMarkedField(element);
25
+ if (key === null || (field !== null && refKey(field) === key)) {
26
+ if (element.textContent !== original) {
27
+ element.textContent = original;
28
+ }
29
+ originals.delete(element);
30
+ }
31
+ }
32
+ };
33
+ return {
34
+ set(ref, value) {
35
+ const key = refKey(ref);
36
+ values.set(key, value);
37
+ matching(key).forEach((element) => write(element, value));
38
+ },
39
+ reset(ref) {
40
+ const key = refKey(ref);
41
+ values.delete(key);
42
+ restore(key);
43
+ },
44
+ reapply() {
45
+ for (const element of [...originals.keys()]) {
46
+ if (!element.isConnected) {
47
+ originals.delete(element);
48
+ }
49
+ }
50
+ for (const [key, value] of values) {
51
+ matching(key).forEach((element) => write(element, value));
52
+ }
53
+ },
54
+ resetAll() {
55
+ values.clear();
56
+ restore(null);
57
+ },
58
+ get size() {
59
+ return values.size;
60
+ }
61
+ };
62
+ }
63
+ //# sourceMappingURL=live-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-preview.js","sourceRoot":"","sources":["../../src/visual-editing/live-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type CraftyFieldRef, type CraftyMarkedField } from "./protocol.js";
2
+ export declare const MARKED_SELECTOR = "[data-crafty-field]";
3
+ export type MarkedElement = {
4
+ element: Element;
5
+ field: CraftyMarkedField;
6
+ };
7
+ export declare function readMarkedField(element: Element): CraftyMarkedField | null;
8
+ export declare function refKey(ref: CraftyFieldRef): string;
9
+ export declare function scanMarked(root: ParentNode): MarkedElement[];
10
+ export declare function uniqueFields(marked: MarkedElement[]): CraftyMarkedField[];
11
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../src/visual-editing/markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE9F,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAE3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAiB1E;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAElD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,EAAE,CAY5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,iBAAiB,EAAE,CAczE"}
@@ -0,0 +1,43 @@
1
+ import { parseMarkedField } from "./protocol.js";
2
+ export const MARKED_SELECTOR = "[data-crafty-field]";
3
+ export function readMarkedField(element) {
4
+ const blockId = element.getAttribute("data-crafty-block");
5
+ const entryId = element.getAttribute("data-crafty-entry");
6
+ const rawId = blockId ?? entryId;
7
+ if (rawId === null) {
8
+ return null;
9
+ }
10
+ const label = element.getAttribute("data-crafty-label");
11
+ return parseMarkedField({
12
+ type: blockId !== null ? "block" : "entry",
13
+ id: rawId.trim() === "" ? Number.NaN : Number(rawId),
14
+ field: element.getAttribute("data-crafty-field") ?? "",
15
+ ...(label !== null ? { label } : {})
16
+ });
17
+ }
18
+ export function refKey(ref) {
19
+ return `${ref.type}:${ref.id}:${ref.field}`;
20
+ }
21
+ export function scanMarked(root) {
22
+ const marked = [];
23
+ root.querySelectorAll(MARKED_SELECTOR).forEach((element) => {
24
+ const field = readMarkedField(element);
25
+ if (field !== null) {
26
+ marked.push({ element, field });
27
+ }
28
+ });
29
+ return marked;
30
+ }
31
+ export function uniqueFields(marked) {
32
+ const seen = new Set();
33
+ const fields = [];
34
+ for (const { field } of marked) {
35
+ const key = refKey(field);
36
+ if (!seen.has(key)) {
37
+ seen.add(key);
38
+ fields.push(field);
39
+ }
40
+ }
41
+ return fields;
42
+ }
43
+ //# sourceMappingURL=markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.js","sourceRoot":"","sources":["../../src/visual-editing/markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+C,MAAM,eAAe,CAAC;AAE9F,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAIrD,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,CAAC;IAEjC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAExD,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QAC1C,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,EAAE;QACtD,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAmB;IACxC,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACzD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Crafty admin panels: https://crafty.do and https://<tenant>.crafty.do. */
2
+ export declare const DEFAULT_ADMIN_ORIGINS: ReadonlyArray<string | RegExp>;
3
+ export declare function isAllowedAdminOrigin(origin: string, allowlist: ReadonlyArray<string | RegExp>): boolean;
4
+ /**
5
+ * Origin of the embedding admin. `ancestorOrigins` (Chromium, WebKit) cannot be
6
+ * spoofed by the framed page; Firefox falls back to the referrer the admin sent
7
+ * when it set the iframe `src`.
8
+ */
9
+ export declare function resolveParentOrigin(win: Window): string | null;
10
+ //# sourceMappingURL=origin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/visual-editing/origin.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAA6C,CAAC;AAU/G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAcvG;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW9D"}
@@ -0,0 +1,37 @@
1
+ /** Crafty admin panels: https://crafty.do and https://<tenant>.crafty.do. */
2
+ export const DEFAULT_ADMIN_ORIGINS = [/^https:\/\/([a-z0-9-]+\.)*crafty\.do$/];
3
+ function originOf(value) {
4
+ try {
5
+ return new URL(value).origin;
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ }
11
+ export function isAllowedAdminOrigin(origin, allowlist) {
12
+ if (origin === "" || origin === "null") {
13
+ return false;
14
+ }
15
+ return allowlist.some((allowed) => {
16
+ if (typeof allowed === "string") {
17
+ return originOf(allowed) === origin;
18
+ }
19
+ allowed.lastIndex = 0;
20
+ return allowed.test(origin);
21
+ });
22
+ }
23
+ /**
24
+ * Origin of the embedding admin. `ancestorOrigins` (Chromium, WebKit) cannot be
25
+ * spoofed by the framed page; Firefox falls back to the referrer the admin sent
26
+ * when it set the iframe `src`.
27
+ */
28
+ export function resolveParentOrigin(win) {
29
+ const ancestors = win.location.ancestorOrigins;
30
+ const first = ancestors && ancestors.length > 0 ? ancestors[0] : undefined;
31
+ if (typeof first === "string" && first !== "") {
32
+ return first;
33
+ }
34
+ const referrer = win.document.referrer;
35
+ return referrer ? originOf(referrer) : null;
36
+ }
37
+ //# sourceMappingURL=origin.js.map