lynkow 3.8.70 → 3.8.71
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.
- package/README.md +1 -1
- package/dist/visual-editor/index.js +4 -4
- package/dist/visual-editor/index.js.map +1 -1
- package/dist/visual-editor/index.mjs +4 -4
- package/dist/visual-editor/index.mjs.map +1 -1
- package/dist/visual-editor/react/index.js +6 -6
- package/dist/visual-editor/react/index.js.map +1 -1
- package/dist/visual-editor/react/index.mjs +6 -6
- package/dist/visual-editor/react/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Official TypeScript SDK for [Lynkow](https://lynkow.com) Headless CMS.
|
|
4
4
|
|
|
5
|
-
> **FOR LLMs:** Full documentation
|
|
5
|
+
> **FOR LLMs:** Full documentation at [lynkow.com/docs](https://lynkow.com/docs). **Start with the [Complete Integration Checklist](https://lynkow.com/docs/getting-started/integration-checklist)** — it lists every feature to implement with links to detailed guides. Machine-readable: [`/llms.txt`](https://lynkow.com/docs/llms.txt) (index), [`/llms-full.txt`](https://lynkow.com/docs/llms-full.txt) (complete content). Append `.md` to any page URL for Markdown. Search: `GET https://lynkow.com/docs/api/search?q={query}`
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function T(n){let a=new Map;function l(e){if(e.origin!==n)return;let o=e.data;if(!o||typeof o.type!="string"||!o.type.startsWith("lynkow:"))return;let i=a.get(o.type);i&&i.forEach(u=>u(o));}return window.addEventListener("message",l),{send(e){window.parent.postMessage(e,n);},on(e,o){a.has(e)||a.set(e,new Set),a.get(e).add(o);},off(e,o){a.get(e)?.delete(o);},destroy(){window.removeEventListener("message",l),a.clear();}}}function F(n){let a=[],l=/([^.\[\]]+)|\[(\d+)\]/g,e;for(;(e=l.exec(n))!==null;)e[1]!==void 0?a.push(e[1]):e[2]!==void 0&&a.push(parseInt(e[2],10));return a}function R(n,a,l){let e=F(a),o=n;for(let i=0;i<e.length-1;i++){let u=e[i];o[u]===void 0&&(o[u]=typeof e[i+1]=="number"?[]:{}),o=o[u];}o[e[e.length-1]]=l;}function L(n,a){let l=F(a),e=n;for(let o of l){if(e==null)return;e=e[o];}return e}function _(){let n=new Map,a=new Map,l=new Map,e=new Set;return {setBlockData(o,i){n.set(o,structuredClone(i));},getBlockData(o){let i=n.get(o);return i?structuredClone(i):null},setSchema(o,i){a.set(o,i);},getSchema(o){return a.get(o)||null},setEditableFields(o,i){l.set(o,i);},getEditableFields(o){return l.get(o)||[]},updateField(o,i,u){let r=n.get(o);r&&R(r,i,u);},subscribe(o){return e.add(o),()=>e.delete(o)},notifyChange(o,i,u,r){let p=n.get(o);p&&e.forEach(k=>k(o,i,u,r,structuredClone(p)));},destroy(){n.clear(),a.clear(),l.clear(),e.clear();}}}function O(){let n=null;return {show(){n||(n=document.createElement("div"),n.id="lynkow-loader",n.style.cssText=`
|
|
2
2
|
position: fixed;
|
|
3
3
|
top: 0;
|
|
4
4
|
left: 0;
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
to { transform: rotate(360deg); }
|
|
29
29
|
}
|
|
30
30
|
</style>
|
|
31
|
-
`,document.body.appendChild(n));},hide(){n&&(n.style.opacity="0",n.style.transition="opacity 0.3s ease",setTimeout(()=>{n?.remove(),n=null;},300));},destroy(){n?.remove(),n=null;}}}function
|
|
31
|
+
`,document.body.appendChild(n));},hide(){n&&(n.style.opacity="0",n.style.transition="opacity 0.3s ease",setTimeout(()=>{n?.remove(),n=null;},300));},destroy(){n?.remove(),n=null;}}}function N(n){let a={text:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7V4h16v3M9 20h6M12 4v16"/></svg>',richtext:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 6h16M4 12h10M4 18h14"/></svg>',image:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><path d="m21 15-5-5L5 21"/></svg>',url:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>',select:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m6 9 6 6 6-6"/></svg>',boolean:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="1" y="5" width="22" height="14" rx="7"/><circle cx="16" cy="12" r="3"/></svg>',number:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 17 10 3M14 3l6 14M7.5 11h9"/></svg>',array:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>',object:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z"/></svg>',date:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>',color:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="3"/></svg>',file:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/></svg>'};return a[n]||a.text}function I(n){let a=false,l=null,e=null,o=null,i=null;function u(){l=document.createElement("div"),l.id="lynkow-overlay-container",l.style.cssText="position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999999;",document.body.appendChild(l);}function r(){if(l&&(l.innerHTML=""),e){e.style.outline="",e.style.outlineOffset="",e.style.cursor="";let t=e;t.__lynkowInlineHandler&&(e.removeEventListener("mousedown",t.__lynkowInlineHandler),delete t.__lynkowInlineHandler),t.__lynkowMoveHandler&&(e.removeEventListener("mousemove",t.__lynkowMoveHandler),delete t.__lynkowMoveHandler),t.__lynkowClickHandler&&(e.removeEventListener("mousedown",t.__lynkowClickHandler),delete t.__lynkowClickHandler);}}function p(){r(),e=null;}function k(t,d,s){r();let y=t.getBoundingClientRect(),c=t.getAttribute("data-lynkow-type")||"text",g=t.getAttribute("data-lynkow-label")||s;t.style.outline="2px solid #2563eb",t.style.outlineOffset="2px";let w=document.createElement("div");w.className="lynkow-overlay-badge",w.style.cssText=`
|
|
32
32
|
position: fixed;
|
|
33
33
|
top: ${y.top}px;
|
|
34
34
|
left: ${y.left}px;
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
cursor: pointer;
|
|
47
47
|
white-space: nowrap;
|
|
48
48
|
z-index: 1000000;
|
|
49
|
-
`;let C=
|
|
49
|
+
`;let C=N(c),b=document.createElement("span");b.style.cssText="display:flex;align-items:center;",b.innerHTML=C;let E=document.createElement("span");E.textContent=g,w.appendChild(b),w.appendChild(E);let f=["text","string"].includes(c);if(w.addEventListener("mousedown",h=>{if(h.preventDefault(),h.stopPropagation(),f)x(t,d,s,c,n);else {let m=L(i?.getBlockData(d)||{},s);n.send({type:"lynkow:edit-field",payload:{blockSlug:d,fieldKey:s,fieldPath:s,fieldType:c,fieldLabel:g,currentValue:m}});}}),l?.appendChild(w),f){t.style.cursor="text";let h=m=>{v!==t&&(m.preventDefault(),m.stopPropagation(),x(t,d,s,c,n));};t.addEventListener("mousedown",h,{once:true}),t.__lynkowInlineHandler=h;}else {t.style.cursor="pointer";let h=document.createElement("div");h.className="lynkow-cursor-tooltip",h.textContent="Cliquer pour \xE9diter",h.style.cssText=`
|
|
50
50
|
position: fixed;
|
|
51
51
|
display: none;
|
|
52
52
|
padding: 4px 10px;
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
white-space: nowrap;
|
|
61
61
|
z-index: 1000001;
|
|
62
62
|
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
63
|
-
`,l?.appendChild(h);let
|
|
63
|
+
`,l?.appendChild(h);let m=M=>{h.style.display="block",h.style.left=`${M.clientX+14}px`,h.style.top=`${M.clientY+14}px`;};t.addEventListener("mousemove",m),t.__lynkowMoveHandler=m;let B=M=>{M.preventDefault(),M.stopPropagation();let j=L(i?.getBlockData(d)||{},s);n.send({type:"lynkow:edit-field",payload:{blockSlug:d,fieldKey:s,fieldPath:s,fieldType:c,fieldLabel:g,currentValue:j}});};t.addEventListener("mousedown",B),t.__lynkowClickHandler=B;}}let v=null;function x(t,d,s,y,c){r(),v=t;let g=t.textContent||"";t.contentEditable="true",t.style.outline="2px solid #2563eb",t.style.outlineOffset="2px",t.style.cursor="text",t.focus();let w=document.createRange();w.selectNodeContents(t);let C=window.getSelection();C?.removeAllRanges(),C?.addRange(w);function b(){t.contentEditable="false",t.style.outline="",t.style.outlineOffset="",t.style.cursor="",v=null;let f=t.textContent||"";f!==g&&(i?.updateField(d,s,f),i?.notifyChange(d,s,s,f),c.send({type:"lynkow:edit-field",payload:{blockSlug:d,fieldKey:s,fieldPath:s,fieldType:y,fieldLabel:t.getAttribute("data-lynkow-label")||s,currentValue:f}}),c.send({type:"lynkow:field-update",payload:{blockSlug:d,fieldKey:s,fieldPath:s,value:f}})),t.removeEventListener("blur",b),t.removeEventListener("keydown",E);}function E(f){f.key==="Enter"&&!f.shiftKey&&(f.preventDefault(),t.blur()),f.key==="Escape"&&(t.textContent=g,t.blur());}t.addEventListener("blur",b),t.addEventListener("keydown",E);}function S(t){if(!a||!i)return;let d=t.target;if(l?.contains(d)||v)return;let s=d.closest("[data-lynkow-field]");if(!s){p();return}let y=s.closest("[data-lynkow-block]");if(!y){p();return}let c=y.getAttribute("data-lynkow-block"),g=s.getAttribute("data-lynkow-field");if(!i.getEditableFields(c).includes(g)){p();return}e!==s&&(e=s,k(s,c,g),n.send({type:"lynkow:hover-field",payload:{blockSlug:c,fieldKey:g,fieldPath:g,isHovering:true}}));}function D(t){if(!a)return;let d=t.relatedTarget;if(d?.closest("[data-lynkow-field]")!==e&&!(d&&l?.contains(d))){if(e){let y=e.closest("[data-lynkow-block]")?.getAttribute("data-lynkow-block"),c=e.getAttribute("data-lynkow-field");y&&c&&n.send({type:"lynkow:hover-field",payload:{blockSlug:y,fieldKey:c,fieldPath:c,isHovering:false}});}p();}}function V(){let t=false;o=new MutationObserver(d=>{d.every(y=>l?.contains(y.target))||t||(t=true,requestAnimationFrame(()=>{if(t=false,e&&l?.children.length){let c=e.closest("[data-lynkow-block]")?.getAttribute("data-lynkow-block"),g=e.getAttribute("data-lynkow-field");c&&g&&k(e,c,g);}}));}),o.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["style","class"]});}function A(t,d){let s=document.querySelector(`[data-lynkow-block="${t}"]`);if(!s)return;let y=s.querySelector(`[data-lynkow-field="${d}"]`);y&&(y.scrollIntoView({behavior:"smooth",block:"center"}),y.classList.add("lynkow-highlight"),setTimeout(()=>{y.classList.remove("lynkow-highlight");},1500));}return {activate(t){i=t,a=true,u(),V(),document.addEventListener("mouseover",S,true),document.addEventListener("mouseout",D,true);},deactivate(){a=false,p(),r();},highlightField:A,destroy(){a=false,i=null,document.removeEventListener("mouseover",S,true),document.removeEventListener("mouseout",D,true),o?.disconnect(),l?.remove(),l=null;}}}function P(){let n={blockSlugs:[],fields:{}};return document.querySelectorAll("[data-lynkow-block]").forEach(l=>{let e=l.getAttribute("data-lynkow-block");n.blockSlugs.includes(e)||(n.blockSlugs.push(e),n.fields[e]=[]),l.querySelectorAll("[data-lynkow-field]").forEach(i=>{let u=i.getAttribute("data-lynkow-field"),r=i.getAttribute("data-lynkow-type")||"text",p=i.getAttribute("data-lynkow-label")||u;n.fields[e].find(v=>v.key===u)||n.fields[e].push({key:u,type:r,label:p});});}),n}var z="3.9.0";function H(){return {destroy:()=>{},isPreviewMode:()=>false,getBlockData:()=>null,onDataChange:()=>()=>{}}}function q(){document.addEventListener("click",n=>{let a=n.target.closest("a");a&&a.href&&(n.preventDefault(),n.stopPropagation());},true);}function U(n){if(window===window.parent||!new URLSearchParams(window.location.search).has("lynkow-preview"))return H();if(!n.cmsOrigin)return console.error("[Lynkow] cmsOrigin is required"),H();let l=_(),e=T(n.cmsOrigin),o=O(),i=I(e);o.show();let u=P();return e.send({type:"lynkow:handshake",payload:{sdkVersion:z,blocks:u.blockSlugs,fields:u.fields}}),e.on("lynkow:init",r=>{if(l.setBlockData(r.payload.blockSlug,r.payload.data),l.setSchema(r.payload.blockSlug,r.payload.schema),l.setEditableFields(r.payload.blockSlug,r.payload.editableFields),r.payload.allBlocksData)for(let[p,k]of Object.entries(r.payload.allBlocksData))l.setBlockData(p,k.data),l.setSchema(p,k.schema),l.setEditableFields(p,k.editableFields);o.hide(),i.activate(l),e.send({type:"lynkow:ready",payload:{}});}),e.on("lynkow:field-update",r=>{let{blockSlug:p,fieldKey:k,fieldPath:v,value:x}=r.payload;l.updateField(p,v,x),l.notifyChange(p,k,v,x);}),e.on("lynkow:locale-change",r=>{window.location.href=r.payload.previewUrl;}),e.on("lynkow:mode-change",r=>{r.payload.mode==="edit"?i.activate(l):i.deactivate();}),e.on("lynkow:highlight-field",r=>{i.highlightField(r.payload.blockSlug,r.payload.fieldKey);}),q(),document.addEventListener("keydown",r=>{(r.metaKey||r.ctrlKey)&&r.key==="s"&&(r.preventDefault(),e.send({type:"lynkow:save",payload:{}}));}),{destroy:()=>{e.destroy(),i.destroy(),o.destroy(),l.destroy();},isPreviewMode:()=>true,getBlockData:r=>l.getBlockData(r),onDataChange:r=>l.subscribe(r)}}exports.initVisualEditor=U;//# sourceMappingURL=index.js.map
|
|
64
64
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/visual-editor/messenger.ts","../../src/visual-editor/state.ts","../../src/visual-editor/loader.ts","../../src/visual-editor/overlay.ts","../../src/visual-editor/utils.ts","../../src/visual-editor/core.ts"],"names":["createMessenger","cmsOrigin","handlers","handleMessage","event","data","typeHandlers","handler","message","type","parsePath","path","result","regex","match","setNestedValue","obj","value","parts","current","part","createState","blockData","schemas","editableFields","subscribers","blockSlug","schema","fields","fieldPath","callback","fieldKey","allData","cb","createLoader","element","getFieldTypeIcon","icons","createOverlay","messenger","isActive","overlayContainer","currentHoveredElement","mutationObserver","stateRef","createContainer","clearOverlayElements","el","clearOverlay","showOverlay","rect","fieldType","fieldLabel","badge","icon","iconSpan","labelSpan","isInlineEditable","e","startInlineEdit","currentValue","inlineClickHandler","currentInlineElement","tooltip","moveHandler","clickHandler","msngr","originalText","range","sel","finishEdit","newText","handleKeydown","handleMouseOver","target","fieldElement","blockElement","handleMouseOut","relatedTarget","setupMutationObserver","mutationPending","mutations","m","highlightField","blockEl","fieldEl","state","scanPage","key","label","f","SDK_VERSION","createNoopInstance","interceptNavigation","link","initVisualEditor","config","loader","overlay","detectedBlocks","slug","blockInfo"],"mappings":"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","file":"index.js","sourcesContent":["import type { Messenger, MessageHandler } from './types.js'\n\nexport function createMessenger(cmsOrigin: string): Messenger {\n const handlers = new Map<string, Set<MessageHandler>>()\n\n function handleMessage(event: MessageEvent) {\n if (event.origin !== cmsOrigin) {\n return\n }\n\n const data = event.data\n if (!data || typeof data.type !== 'string' || !data.type.startsWith('lynkow:')) {\n return\n }\n\n const typeHandlers = handlers.get(data.type)\n if (typeHandlers) {\n typeHandlers.forEach((handler) => handler(data))\n }\n }\n\n window.addEventListener('message', handleMessage)\n\n return {\n send(message) {\n window.parent.postMessage(message, cmsOrigin)\n },\n\n on(type, handler) {\n if (!handlers.has(type)) {\n handlers.set(type, new Set())\n }\n handlers.get(type)!.add(handler)\n },\n\n off(type, handler) {\n handlers.get(type)?.delete(handler)\n },\n\n destroy() {\n window.removeEventListener('message', handleMessage)\n handlers.clear()\n },\n }\n}\n","import type { SchemaField } from './messages.js'\nimport type { State, DataChangeCallback } from './types.js'\n\n// Parse \"items[0].title\" → [\"items\", 0, \"title\"]\nfunction parsePath(path: string): (string | number)[] {\n const result: (string | number)[] = []\n const regex = /([^.\\[\\]]+)|\\[(\\d+)\\]/g\n let match\n\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n result.push(match[1])\n } else if (match[2] !== undefined) {\n result.push(parseInt(match[2], 10))\n }\n }\n\n return result\n}\n\nfunction setNestedValue(obj: Record<string, any>, path: string, value: unknown): void {\n const parts = parsePath(path)\n\n let current: any = obj\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (current[part] === undefined) {\n current[part] = typeof parts[i + 1] === 'number' ? [] : {}\n }\n current = current[part]\n }\n\n current[parts[parts.length - 1]] = value\n}\n\nexport function createState(): State {\n const blockData = new Map<string, Record<string, any>>()\n const schemas = new Map<string, { fields: SchemaField[] }>()\n const editableFields = new Map<string, string[]>()\n const subscribers = new Set<DataChangeCallback>()\n\n return {\n setBlockData(blockSlug, data) {\n blockData.set(blockSlug, structuredClone(data))\n },\n\n getBlockData(blockSlug) {\n const data = blockData.get(blockSlug)\n return data ? structuredClone(data) : null\n },\n\n setSchema(blockSlug, schema) {\n schemas.set(blockSlug, schema)\n },\n\n getSchema(blockSlug) {\n return schemas.get(blockSlug) || null\n },\n\n setEditableFields(blockSlug, fields) {\n editableFields.set(blockSlug, fields)\n },\n\n getEditableFields(blockSlug) {\n return editableFields.get(blockSlug) || []\n },\n\n updateField(blockSlug, fieldPath, value) {\n const data = blockData.get(blockSlug)\n if (!data) return\n setNestedValue(data, fieldPath, value)\n },\n\n subscribe(callback) {\n subscribers.add(callback)\n return () => subscribers.delete(callback)\n },\n\n notifyChange(blockSlug, fieldKey, fieldPath, value) {\n const allData = blockData.get(blockSlug)\n if (!allData) return\n subscribers.forEach((cb) => cb(blockSlug, fieldKey, fieldPath, value, structuredClone(allData)))\n },\n\n destroy() {\n blockData.clear()\n schemas.clear()\n editableFields.clear()\n subscribers.clear()\n },\n }\n}\n","import type { Loader } from './types.js'\n\nexport function createLoader(): Loader {\n let element: HTMLDivElement | null = null\n\n return {\n show() {\n if (element) return\n element = document.createElement('div')\n element.id = 'lynkow-loader'\n element.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 9999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n `\n element.innerHTML = `\n <div style=\"\n width: 40px;\n height: 40px;\n border: 3px solid #e5e7eb;\n border-top-color: #2563eb;\n border-radius: 50%;\n animation: lynkow-spin 0.8s linear infinite;\n \"></div>\n <p style=\"margin-top: 16px; color: #6b7280; font-size: 14px;\">\n Connecting to Visual Editor...\n </p>\n <style>\n @keyframes lynkow-spin {\n to { transform: rotate(360deg); }\n }\n </style>\n `\n document.body.appendChild(element)\n },\n\n hide() {\n if (element) {\n element.style.opacity = '0'\n element.style.transition = 'opacity 0.3s ease'\n setTimeout(() => {\n element?.remove()\n element = null\n }, 300)\n }\n },\n\n destroy() {\n element?.remove()\n element = null\n },\n }\n}\n","import type { Overlay, Messenger, State } from './types.js'\n\nfunction getFieldTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n text: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 7V4h16v3M9 20h6M12 4v16\"/></svg>',\n richtext:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 6h16M4 12h10M4 18h14\"/></svg>',\n image:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><path d=\"m21 15-5-5L5 21\"/></svg>',\n url: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>',\n select:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"m6 9 6 6 6-6\"/></svg>',\n boolean:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"1\" y=\"5\" width=\"22\" height=\"14\" rx=\"7\"/><circle cx=\"16\" cy=\"12\" r=\"3\"/></svg>',\n number:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 17 10 3M14 3l6 14M7.5 11h9\"/></svg>',\n array:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/></svg>',\n object:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z\"/></svg>',\n date: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>',\n color:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n file: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6\"/></svg>',\n }\n return icons[type] || icons.text\n}\n\nexport function createOverlay(messenger: Messenger): Overlay {\n let isActive = false\n let overlayContainer: HTMLDivElement | null = null\n let currentHoveredElement: HTMLElement | null = null\n let mutationObserver: MutationObserver | null = null\n let stateRef: State | null = null\n\n function createContainer() {\n overlayContainer = document.createElement('div')\n overlayContainer.id = 'lynkow-overlay-container'\n overlayContainer.style.cssText =\n 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999999;'\n document.body.appendChild(overlayContainer)\n }\n\n function clearOverlayElements() {\n if (overlayContainer) {\n overlayContainer.innerHTML = ''\n }\n if (currentHoveredElement) {\n currentHoveredElement.style.outline = ''\n currentHoveredElement.style.outlineOffset = ''\n currentHoveredElement.style.cursor = ''\n const el = currentHoveredElement as any\n if (el.__lynkowInlineHandler) {\n currentHoveredElement.removeEventListener('mousedown', el.__lynkowInlineHandler)\n delete el.__lynkowInlineHandler\n }\n if (el.__lynkowMoveHandler) {\n currentHoveredElement.removeEventListener('mousemove', el.__lynkowMoveHandler)\n delete el.__lynkowMoveHandler\n }\n if (el.__lynkowClickHandler) {\n currentHoveredElement.removeEventListener('mousedown', el.__lynkowClickHandler)\n delete el.__lynkowClickHandler\n }\n }\n }\n\n function clearOverlay() {\n clearOverlayElements()\n currentHoveredElement = null\n }\n\n function showOverlay(element: HTMLElement, blockSlug: string, fieldKey: string) {\n clearOverlayElements()\n\n const rect = element.getBoundingClientRect()\n const fieldType = element.getAttribute('data-lynkow-type') || 'text'\n const fieldLabel = element.getAttribute('data-lynkow-label') || fieldKey\n\n // Outline on the element itself\n element.style.outline = '2px solid #2563eb'\n element.style.outlineOffset = '2px'\n\n const badge = document.createElement('div')\n badge.className = 'lynkow-overlay-badge'\n badge.style.cssText = `\n position: fixed;\n top: ${rect.top}px;\n left: ${rect.left}px;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: #2563eb;\n color: white;\n font-size: 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-weight: 500;\n border-radius: 0 0 4px 0;\n pointer-events: all;\n cursor: pointer;\n white-space: nowrap;\n z-index: 1000000;\n `\n\n const icon = getFieldTypeIcon(fieldType)\n\n const iconSpan = document.createElement('span')\n iconSpan.style.cssText = 'display:flex;align-items:center;'\n iconSpan.innerHTML = icon // SVG icons are safe (hardcoded)\n\n const labelSpan = document.createElement('span')\n labelSpan.textContent = fieldLabel // textContent prevents XSS\n\n badge.appendChild(iconSpan)\n badge.appendChild(labelSpan)\n\n const isInlineEditable = ['text', 'string'].includes(fieldType)\n\n badge.addEventListener('mousedown', (e) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (isInlineEditable) {\n // Inline editing: make the element contentEditable\n startInlineEdit(element, blockSlug, fieldKey, fieldType, messenger)\n } else {\n // Complex types: open drawer via postMessage\n const currentValue = stateRef?.getBlockData(blockSlug)?.[fieldKey]\n messenger.send({\n type: 'lynkow:edit-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n fieldType,\n fieldLabel,\n currentValue,\n },\n })\n }\n })\n\n overlayContainer?.appendChild(badge)\n\n if (isInlineEditable) {\n // Inline: click anywhere on the element to edit\n element.style.cursor = 'text'\n const inlineClickHandler = (e: MouseEvent) => {\n if (currentInlineElement === element) return\n e.preventDefault()\n e.stopPropagation()\n startInlineEdit(element, blockSlug, fieldKey, fieldType, messenger)\n }\n element.addEventListener('mousedown', inlineClickHandler, { once: true })\n ;(element as any).__lynkowInlineHandler = inlineClickHandler\n } else {\n // Complex: floating \"Click to edit\" tooltip + click anywhere to open drawer\n element.style.cursor = 'pointer'\n\n const tooltip = document.createElement('div')\n tooltip.className = 'lynkow-cursor-tooltip'\n tooltip.textContent = 'Cliquer pour éditer'\n tooltip.style.cssText = `\n position: fixed;\n display: none;\n padding: 4px 10px;\n background: #2563eb;\n color: white;\n font-size: 11px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-weight: 500;\n border-radius: 4px;\n pointer-events: none;\n white-space: nowrap;\n z-index: 1000001;\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n `\n overlayContainer?.appendChild(tooltip)\n\n const moveHandler = (e: MouseEvent) => {\n tooltip.style.display = 'block'\n tooltip.style.left = `${e.clientX + 14}px`\n tooltip.style.top = `${e.clientY + 14}px`\n }\n element.addEventListener('mousemove', moveHandler)\n ;(element as any).__lynkowMoveHandler = moveHandler\n\n const clickHandler = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const currentValue = stateRef?.getBlockData(blockSlug)?.[fieldKey]\n messenger.send({\n type: 'lynkow:edit-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n fieldType,\n fieldLabel,\n currentValue,\n },\n })\n }\n element.addEventListener('mousedown', clickHandler)\n ;(element as any).__lynkowClickHandler = clickHandler\n }\n }\n\n let currentInlineElement: HTMLElement | null = null\n\n function startInlineEdit(\n element: HTMLElement,\n blockSlug: string,\n fieldKey: string,\n fieldType: string,\n msngr: Messenger\n ) {\n // Clear overlay so it doesn't interfere\n clearOverlayElements()\n currentInlineElement = element\n\n const originalText = element.textContent || ''\n element.contentEditable = 'true'\n element.style.outline = '2px solid #2563eb'\n element.style.outlineOffset = '2px'\n element.style.cursor = 'text'\n element.focus()\n\n // Select all text\n const range = document.createRange()\n range.selectNodeContents(element)\n const sel = window.getSelection()\n sel?.removeAllRanges()\n sel?.addRange(range)\n\n function finishEdit() {\n element.contentEditable = 'false'\n element.style.outline = ''\n element.style.outlineOffset = ''\n element.style.cursor = ''\n currentInlineElement = null\n\n const newText = element.textContent || ''\n if (newText !== originalText) {\n // Update state\n stateRef?.updateField(blockSlug, fieldKey, newText)\n stateRef?.notifyChange(blockSlug, fieldKey, fieldKey, newText)\n\n // Notify CMS parent that the field was updated\n msngr.send({\n type: 'lynkow:edit-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n fieldType,\n fieldLabel: element.getAttribute('data-lynkow-label') || fieldKey,\n currentValue: newText,\n },\n })\n\n // Also send field-update so CMS can auto-save\n msngr.send({\n type: 'lynkow:field-update' as any,\n payload: { blockSlug, fieldKey, fieldPath: fieldKey, value: newText },\n })\n }\n\n element.removeEventListener('blur', finishEdit)\n element.removeEventListener('keydown', handleKeydown)\n }\n\n function handleKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n element.blur()\n }\n if (e.key === 'Escape') {\n element.textContent = originalText\n element.blur()\n }\n }\n\n element.addEventListener('blur', finishEdit)\n element.addEventListener('keydown', handleKeydown)\n }\n\n function handleMouseOver(event: MouseEvent) {\n if (!isActive || !stateRef) return\n\n const target = event.target as HTMLElement\n\n // Ignore events from our own overlay\n if (overlayContainer?.contains(target)) return\n\n // Don't interfere with inline editing\n if (currentInlineElement) return\n\n const fieldElement = target.closest('[data-lynkow-field]') as HTMLElement | null\n\n if (!fieldElement) {\n clearOverlay()\n return\n }\n\n const blockElement = fieldElement.closest('[data-lynkow-block]') as HTMLElement | null\n if (!blockElement) {\n clearOverlay()\n return\n }\n\n const blockSlug = blockElement.getAttribute('data-lynkow-block')!\n const fieldKey = fieldElement.getAttribute('data-lynkow-field')!\n\n const editable = stateRef.getEditableFields(blockSlug)\n if (!editable.includes(fieldKey)) {\n clearOverlay()\n return\n }\n\n if (currentHoveredElement === fieldElement) return\n currentHoveredElement = fieldElement\n\n showOverlay(fieldElement, blockSlug, fieldKey)\n\n messenger.send({\n type: 'lynkow:hover-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n isHovering: true,\n },\n })\n }\n\n function handleMouseOut(event: MouseEvent) {\n if (!isActive) return\n\n const relatedTarget = event.relatedTarget as HTMLElement | null\n\n // Don't clear if moving to the same field element\n if (relatedTarget?.closest('[data-lynkow-field]') === currentHoveredElement) {\n return\n }\n\n // Don't clear if moving to our overlay (badge, border)\n if (relatedTarget && overlayContainer?.contains(relatedTarget)) {\n return\n }\n\n if (currentHoveredElement) {\n const blockElement = currentHoveredElement.closest('[data-lynkow-block]')\n const blockSlug = blockElement?.getAttribute('data-lynkow-block')\n const fieldKey = currentHoveredElement.getAttribute('data-lynkow-field')\n\n if (blockSlug && fieldKey) {\n messenger.send({\n type: 'lynkow:hover-field',\n payload: { blockSlug, fieldKey, fieldPath: fieldKey, isHovering: false },\n })\n }\n }\n\n clearOverlay()\n }\n\n function setupMutationObserver() {\n let mutationPending = false\n\n mutationObserver = new MutationObserver((mutations) => {\n // Ignore mutations from our own overlay container\n const isOwnMutation = mutations.every(\n (m) => overlayContainer?.contains(m.target as Node)\n )\n if (isOwnMutation) return\n\n if (mutationPending) return\n mutationPending = true\n\n requestAnimationFrame(() => {\n mutationPending = false\n if (currentHoveredElement && overlayContainer?.children.length) {\n const blockElement = currentHoveredElement.closest('[data-lynkow-block]')\n const blockSlug = blockElement?.getAttribute('data-lynkow-block')\n const fieldKey = currentHoveredElement.getAttribute('data-lynkow-field')\n if (blockSlug && fieldKey) {\n showOverlay(currentHoveredElement, blockSlug, fieldKey)\n }\n }\n })\n })\n\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class'],\n })\n }\n\n function highlightField(blockSlug: string, fieldKey: string) {\n const blockEl = document.querySelector(`[data-lynkow-block=\"${blockSlug}\"]`)\n if (!blockEl) return\n\n const fieldEl = blockEl.querySelector(`[data-lynkow-field=\"${fieldKey}\"]`) as HTMLElement | null\n if (!fieldEl) return\n\n fieldEl.scrollIntoView({ behavior: 'smooth', block: 'center' })\n\n fieldEl.classList.add('lynkow-highlight')\n setTimeout(() => {\n fieldEl.classList.remove('lynkow-highlight')\n }, 1500)\n }\n\n return {\n activate(state: State) {\n stateRef = state\n isActive = true\n createContainer()\n setupMutationObserver()\n document.addEventListener('mouseover', handleMouseOver, true)\n document.addEventListener('mouseout', handleMouseOut, true)\n },\n\n deactivate() {\n isActive = false\n clearOverlay()\n clearOverlayElements()\n },\n\n highlightField,\n\n destroy() {\n isActive = false\n stateRef = null\n document.removeEventListener('mouseover', handleMouseOver, true)\n document.removeEventListener('mouseout', handleMouseOut, true)\n mutationObserver?.disconnect()\n overlayContainer?.remove()\n overlayContainer = null\n },\n }\n}\n","import type { DetectedBlocks } from './types.js'\n\nexport function scanPage(): DetectedBlocks {\n const result: DetectedBlocks = { blockSlugs: [], fields: {} }\n\n const blockElements = document.querySelectorAll('[data-lynkow-block]')\n\n blockElements.forEach((blockEl) => {\n const blockSlug = blockEl.getAttribute('data-lynkow-block')!\n if (!result.blockSlugs.includes(blockSlug)) {\n result.blockSlugs.push(blockSlug)\n result.fields[blockSlug] = []\n }\n\n const fieldElements = blockEl.querySelectorAll('[data-lynkow-field]')\n\n fieldElements.forEach((fieldEl) => {\n const key = fieldEl.getAttribute('data-lynkow-field')!\n const type = fieldEl.getAttribute('data-lynkow-type') || 'text'\n const label = fieldEl.getAttribute('data-lynkow-label') || key\n\n const existing = result.fields[blockSlug].find((f) => f.key === key)\n if (!existing) {\n result.fields[blockSlug].push({ key, type, label })\n }\n })\n })\n\n return result\n}\n","import { createMessenger } from './messenger.js'\nimport { createState } from './state.js'\nimport { createLoader } from './loader.js'\nimport { createOverlay } from './overlay.js'\nimport { scanPage } from './utils.js'\nimport type { DataChangeCallback } from './types.js'\nimport type { InitMessage, FieldUpdateMessage, LocaleChangeMessage, ModeChangeMessage, HighlightFieldMessage } from './messages.js'\n\nconst SDK_VERSION = '3.9.0'\n\nexport interface VisualEditorConfig {\n cmsOrigin: string\n}\n\nexport interface VisualEditorInstance {\n destroy: () => void\n isPreviewMode: () => boolean\n getBlockData: (blockSlug: string) => Record<string, any> | null\n onDataChange: (callback: DataChangeCallback) => () => void\n}\n\nfunction createNoopInstance(): VisualEditorInstance {\n return {\n destroy: () => {},\n isPreviewMode: () => false,\n getBlockData: () => null,\n onDataChange: () => () => {},\n }\n}\n\nfunction interceptNavigation() {\n document.addEventListener(\n 'click',\n (event) => {\n const link = (event.target as HTMLElement).closest('a')\n if (link && link.href) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n true\n )\n}\n\nexport function initVisualEditor(config: VisualEditorConfig): VisualEditorInstance {\n // 1. Must be in an iframe\n if (window === window.parent) {\n return createNoopInstance()\n }\n\n // 2. Must have preview query param\n const urlParams = new URLSearchParams(window.location.search)\n if (!urlParams.has('lynkow-preview')) {\n return createNoopInstance()\n }\n\n // 3. Must have cmsOrigin\n if (!config.cmsOrigin) {\n console.error('[Lynkow] cmsOrigin is required')\n return createNoopInstance()\n }\n\n // 4. Initialize modules\n const state = createState()\n const messenger = createMessenger(config.cmsOrigin)\n const loader = createLoader()\n const overlay = createOverlay(messenger)\n\n // 5. Show loader\n loader.show()\n\n // 6. Scan page for data-lynkow-* attributes\n const detectedBlocks = scanPage()\n\n // 7. Send handshake\n messenger.send({\n type: 'lynkow:handshake',\n payload: {\n sdkVersion: SDK_VERSION,\n blocks: detectedBlocks.blockSlugs,\n fields: detectedBlocks.fields,\n },\n })\n\n // 8. Listen for CMS messages\n messenger.on('lynkow:init', (message: InitMessage) => {\n state.setBlockData(message.payload.blockSlug, message.payload.data)\n state.setSchema(message.payload.blockSlug, message.payload.schema)\n state.setEditableFields(message.payload.blockSlug, message.payload.editableFields)\n\n if (message.payload.allBlocksData) {\n for (const [slug, blockInfo] of Object.entries(message.payload.allBlocksData)) {\n state.setBlockData(slug, blockInfo.data)\n state.setSchema(slug, blockInfo.schema)\n state.setEditableFields(slug, blockInfo.editableFields)\n }\n }\n\n loader.hide()\n overlay.activate(state)\n\n messenger.send({ type: 'lynkow:ready', payload: {} })\n })\n\n messenger.on('lynkow:field-update', (message: FieldUpdateMessage) => {\n const { blockSlug, fieldKey, fieldPath, value } = message.payload\n state.updateField(blockSlug, fieldPath, value)\n state.notifyChange(blockSlug, fieldKey, fieldPath, value)\n })\n\n messenger.on('lynkow:locale-change', (message: LocaleChangeMessage) => {\n window.location.href = message.payload.previewUrl\n })\n\n messenger.on('lynkow:mode-change', (message: ModeChangeMessage) => {\n if (message.payload.mode === 'edit') {\n overlay.activate(state)\n } else {\n overlay.deactivate()\n }\n })\n\n messenger.on('lynkow:highlight-field', (message: HighlightFieldMessage) => {\n overlay.highlightField(message.payload.blockSlug, message.payload.fieldKey)\n })\n\n // 9. Intercept navigation\n interceptNavigation()\n\n // 10. Forward Cmd+S / Ctrl+S to parent so it can save\n document.addEventListener('keydown', (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 's') {\n e.preventDefault()\n messenger.send({ type: 'lynkow:save' as any, payload: {} })\n }\n })\n\n // 10. Return instance\n return {\n destroy: () => {\n messenger.destroy()\n overlay.destroy()\n loader.destroy()\n state.destroy()\n },\n isPreviewMode: () => true,\n getBlockData: (blockSlug) => state.getBlockData(blockSlug),\n onDataChange: (callback) => state.subscribe(callback),\n }\n}\n\nexport type { DataChangeCallback } from './types.js'\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/visual-editor/messenger.ts","../../src/visual-editor/state.ts","../../src/visual-editor/loader.ts","../../src/visual-editor/overlay.ts","../../src/visual-editor/utils.ts","../../src/visual-editor/core.ts"],"names":["createMessenger","cmsOrigin","handlers","handleMessage","event","data","typeHandlers","handler","message","type","parsePath","path","result","regex","match","setNestedValue","obj","value","parts","current","part","getNestedValue","createState","blockData","schemas","editableFields","subscribers","blockSlug","schema","fields","fieldPath","callback","fieldKey","allData","cb","createLoader","element","getFieldTypeIcon","icons","createOverlay","messenger","isActive","overlayContainer","currentHoveredElement","mutationObserver","stateRef","createContainer","clearOverlayElements","el","clearOverlay","showOverlay","rect","fieldType","fieldLabel","badge","icon","iconSpan","labelSpan","isInlineEditable","e","startInlineEdit","currentValue","inlineClickHandler","currentInlineElement","tooltip","moveHandler","clickHandler","msngr","originalText","range","sel","finishEdit","newText","handleKeydown","handleMouseOver","target","fieldElement","blockElement","handleMouseOut","relatedTarget","setupMutationObserver","mutationPending","mutations","m","highlightField","blockEl","fieldEl","state","scanPage","key","label","f","SDK_VERSION","createNoopInstance","interceptNavigation","link","initVisualEditor","config","loader","overlay","detectedBlocks","slug","blockInfo"],"mappings":"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","file":"index.js","sourcesContent":["import type { Messenger, MessageHandler } from './types.js'\n\nexport function createMessenger(cmsOrigin: string): Messenger {\n const handlers = new Map<string, Set<MessageHandler>>()\n\n function handleMessage(event: MessageEvent) {\n if (event.origin !== cmsOrigin) {\n return\n }\n\n const data = event.data\n if (!data || typeof data.type !== 'string' || !data.type.startsWith('lynkow:')) {\n return\n }\n\n const typeHandlers = handlers.get(data.type)\n if (typeHandlers) {\n typeHandlers.forEach((handler) => handler(data))\n }\n }\n\n window.addEventListener('message', handleMessage)\n\n return {\n send(message) {\n window.parent.postMessage(message, cmsOrigin)\n },\n\n on(type, handler) {\n if (!handlers.has(type)) {\n handlers.set(type, new Set())\n }\n handlers.get(type)!.add(handler)\n },\n\n off(type, handler) {\n handlers.get(type)?.delete(handler)\n },\n\n destroy() {\n window.removeEventListener('message', handleMessage)\n handlers.clear()\n },\n }\n}\n","import type { SchemaField } from './messages.js'\nimport type { State, DataChangeCallback } from './types.js'\n\n// Parse \"items[0].title\" → [\"items\", 0, \"title\"]\nfunction parsePath(path: string): (string | number)[] {\n const result: (string | number)[] = []\n const regex = /([^.\\[\\]]+)|\\[(\\d+)\\]/g\n let match\n\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n result.push(match[1])\n } else if (match[2] !== undefined) {\n result.push(parseInt(match[2], 10))\n }\n }\n\n return result\n}\n\nfunction setNestedValue(obj: Record<string, any>, path: string, value: unknown): void {\n const parts = parsePath(path)\n\n let current: any = obj\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (current[part] === undefined) {\n current[part] = typeof parts[i + 1] === 'number' ? [] : {}\n }\n current = current[part]\n }\n\n current[parts[parts.length - 1]] = value\n}\n\nexport function getNestedValue(obj: Record<string, any>, path: string): unknown {\n const parts = parsePath(path)\n let current: any = obj\n for (const part of parts) {\n if (current == null) return undefined\n current = current[part]\n }\n return current\n}\n\nexport function createState(): State {\n const blockData = new Map<string, Record<string, any>>()\n const schemas = new Map<string, { fields: SchemaField[] }>()\n const editableFields = new Map<string, string[]>()\n const subscribers = new Set<DataChangeCallback>()\n\n return {\n setBlockData(blockSlug, data) {\n blockData.set(blockSlug, structuredClone(data))\n },\n\n getBlockData(blockSlug) {\n const data = blockData.get(blockSlug)\n return data ? structuredClone(data) : null\n },\n\n setSchema(blockSlug, schema) {\n schemas.set(blockSlug, schema)\n },\n\n getSchema(blockSlug) {\n return schemas.get(blockSlug) || null\n },\n\n setEditableFields(blockSlug, fields) {\n editableFields.set(blockSlug, fields)\n },\n\n getEditableFields(blockSlug) {\n return editableFields.get(blockSlug) || []\n },\n\n updateField(blockSlug, fieldPath, value) {\n const data = blockData.get(blockSlug)\n if (!data) return\n setNestedValue(data, fieldPath, value)\n },\n\n subscribe(callback) {\n subscribers.add(callback)\n return () => subscribers.delete(callback)\n },\n\n notifyChange(blockSlug, fieldKey, fieldPath, value) {\n const allData = blockData.get(blockSlug)\n if (!allData) return\n subscribers.forEach((cb) => cb(blockSlug, fieldKey, fieldPath, value, structuredClone(allData)))\n },\n\n destroy() {\n blockData.clear()\n schemas.clear()\n editableFields.clear()\n subscribers.clear()\n },\n }\n}\n","import type { Loader } from './types.js'\n\nexport function createLoader(): Loader {\n let element: HTMLDivElement | null = null\n\n return {\n show() {\n if (element) return\n element = document.createElement('div')\n element.id = 'lynkow-loader'\n element.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 9999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n `\n element.innerHTML = `\n <div style=\"\n width: 40px;\n height: 40px;\n border: 3px solid #e5e7eb;\n border-top-color: #2563eb;\n border-radius: 50%;\n animation: lynkow-spin 0.8s linear infinite;\n \"></div>\n <p style=\"margin-top: 16px; color: #6b7280; font-size: 14px;\">\n Connecting to Visual Editor...\n </p>\n <style>\n @keyframes lynkow-spin {\n to { transform: rotate(360deg); }\n }\n </style>\n `\n document.body.appendChild(element)\n },\n\n hide() {\n if (element) {\n element.style.opacity = '0'\n element.style.transition = 'opacity 0.3s ease'\n setTimeout(() => {\n element?.remove()\n element = null\n }, 300)\n }\n },\n\n destroy() {\n element?.remove()\n element = null\n },\n }\n}\n","import type { Overlay, Messenger, State } from './types.js'\nimport { getNestedValue } from './state.js'\n\nfunction getFieldTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n text: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 7V4h16v3M9 20h6M12 4v16\"/></svg>',\n richtext:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 6h16M4 12h10M4 18h14\"/></svg>',\n image:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><path d=\"m21 15-5-5L5 21\"/></svg>',\n url: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>',\n select:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"m6 9 6 6 6-6\"/></svg>',\n boolean:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"1\" y=\"5\" width=\"22\" height=\"14\" rx=\"7\"/><circle cx=\"16\" cy=\"12\" r=\"3\"/></svg>',\n number:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 17 10 3M14 3l6 14M7.5 11h9\"/></svg>',\n array:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/></svg>',\n object:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z\"/></svg>',\n date: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>',\n color:\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n file: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6\"/></svg>',\n }\n return icons[type] || icons.text\n}\n\nexport function createOverlay(messenger: Messenger): Overlay {\n let isActive = false\n let overlayContainer: HTMLDivElement | null = null\n let currentHoveredElement: HTMLElement | null = null\n let mutationObserver: MutationObserver | null = null\n let stateRef: State | null = null\n\n function createContainer() {\n overlayContainer = document.createElement('div')\n overlayContainer.id = 'lynkow-overlay-container'\n overlayContainer.style.cssText =\n 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999999;'\n document.body.appendChild(overlayContainer)\n }\n\n function clearOverlayElements() {\n if (overlayContainer) {\n overlayContainer.innerHTML = ''\n }\n if (currentHoveredElement) {\n currentHoveredElement.style.outline = ''\n currentHoveredElement.style.outlineOffset = ''\n currentHoveredElement.style.cursor = ''\n const el = currentHoveredElement as any\n if (el.__lynkowInlineHandler) {\n currentHoveredElement.removeEventListener('mousedown', el.__lynkowInlineHandler)\n delete el.__lynkowInlineHandler\n }\n if (el.__lynkowMoveHandler) {\n currentHoveredElement.removeEventListener('mousemove', el.__lynkowMoveHandler)\n delete el.__lynkowMoveHandler\n }\n if (el.__lynkowClickHandler) {\n currentHoveredElement.removeEventListener('mousedown', el.__lynkowClickHandler)\n delete el.__lynkowClickHandler\n }\n }\n }\n\n function clearOverlay() {\n clearOverlayElements()\n currentHoveredElement = null\n }\n\n function showOverlay(element: HTMLElement, blockSlug: string, fieldKey: string) {\n clearOverlayElements()\n\n const rect = element.getBoundingClientRect()\n const fieldType = element.getAttribute('data-lynkow-type') || 'text'\n const fieldLabel = element.getAttribute('data-lynkow-label') || fieldKey\n\n // Outline on the element itself\n element.style.outline = '2px solid #2563eb'\n element.style.outlineOffset = '2px'\n\n const badge = document.createElement('div')\n badge.className = 'lynkow-overlay-badge'\n badge.style.cssText = `\n position: fixed;\n top: ${rect.top}px;\n left: ${rect.left}px;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: #2563eb;\n color: white;\n font-size: 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-weight: 500;\n border-radius: 0 0 4px 0;\n pointer-events: all;\n cursor: pointer;\n white-space: nowrap;\n z-index: 1000000;\n `\n\n const icon = getFieldTypeIcon(fieldType)\n\n const iconSpan = document.createElement('span')\n iconSpan.style.cssText = 'display:flex;align-items:center;'\n iconSpan.innerHTML = icon // SVG icons are safe (hardcoded)\n\n const labelSpan = document.createElement('span')\n labelSpan.textContent = fieldLabel // textContent prevents XSS\n\n badge.appendChild(iconSpan)\n badge.appendChild(labelSpan)\n\n const isInlineEditable = ['text', 'string'].includes(fieldType)\n\n badge.addEventListener('mousedown', (e) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (isInlineEditable) {\n // Inline editing: make the element contentEditable\n startInlineEdit(element, blockSlug, fieldKey, fieldType, messenger)\n } else {\n // Complex types: open drawer via postMessage\n const currentValue = getNestedValue(stateRef?.getBlockData(blockSlug) || {}, fieldKey)\n messenger.send({\n type: 'lynkow:edit-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n fieldType,\n fieldLabel,\n currentValue,\n },\n })\n }\n })\n\n overlayContainer?.appendChild(badge)\n\n if (isInlineEditable) {\n // Inline: click anywhere on the element to edit\n element.style.cursor = 'text'\n const inlineClickHandler = (e: MouseEvent) => {\n if (currentInlineElement === element) return\n e.preventDefault()\n e.stopPropagation()\n startInlineEdit(element, blockSlug, fieldKey, fieldType, messenger)\n }\n element.addEventListener('mousedown', inlineClickHandler, { once: true })\n ;(element as any).__lynkowInlineHandler = inlineClickHandler\n } else {\n // Complex: floating \"Click to edit\" tooltip + click anywhere to open drawer\n element.style.cursor = 'pointer'\n\n const tooltip = document.createElement('div')\n tooltip.className = 'lynkow-cursor-tooltip'\n tooltip.textContent = 'Cliquer pour éditer'\n tooltip.style.cssText = `\n position: fixed;\n display: none;\n padding: 4px 10px;\n background: #2563eb;\n color: white;\n font-size: 11px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-weight: 500;\n border-radius: 4px;\n pointer-events: none;\n white-space: nowrap;\n z-index: 1000001;\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n `\n overlayContainer?.appendChild(tooltip)\n\n const moveHandler = (e: MouseEvent) => {\n tooltip.style.display = 'block'\n tooltip.style.left = `${e.clientX + 14}px`\n tooltip.style.top = `${e.clientY + 14}px`\n }\n element.addEventListener('mousemove', moveHandler)\n ;(element as any).__lynkowMoveHandler = moveHandler\n\n const clickHandler = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const currentValue = getNestedValue(stateRef?.getBlockData(blockSlug) || {}, fieldKey)\n messenger.send({\n type: 'lynkow:edit-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n fieldType,\n fieldLabel,\n currentValue,\n },\n })\n }\n element.addEventListener('mousedown', clickHandler)\n ;(element as any).__lynkowClickHandler = clickHandler\n }\n }\n\n let currentInlineElement: HTMLElement | null = null\n\n function startInlineEdit(\n element: HTMLElement,\n blockSlug: string,\n fieldKey: string,\n fieldType: string,\n msngr: Messenger\n ) {\n // Clear overlay so it doesn't interfere\n clearOverlayElements()\n currentInlineElement = element\n\n const originalText = element.textContent || ''\n element.contentEditable = 'true'\n element.style.outline = '2px solid #2563eb'\n element.style.outlineOffset = '2px'\n element.style.cursor = 'text'\n element.focus()\n\n // Select all text\n const range = document.createRange()\n range.selectNodeContents(element)\n const sel = window.getSelection()\n sel?.removeAllRanges()\n sel?.addRange(range)\n\n function finishEdit() {\n element.contentEditable = 'false'\n element.style.outline = ''\n element.style.outlineOffset = ''\n element.style.cursor = ''\n currentInlineElement = null\n\n const newText = element.textContent || ''\n if (newText !== originalText) {\n // Update state\n stateRef?.updateField(blockSlug, fieldKey, newText)\n stateRef?.notifyChange(blockSlug, fieldKey, fieldKey, newText)\n\n // Notify CMS parent that the field was updated\n msngr.send({\n type: 'lynkow:edit-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n fieldType,\n fieldLabel: element.getAttribute('data-lynkow-label') || fieldKey,\n currentValue: newText,\n },\n })\n\n // Also send field-update so CMS can auto-save\n msngr.send({\n type: 'lynkow:field-update' as any,\n payload: { blockSlug, fieldKey, fieldPath: fieldKey, value: newText },\n })\n }\n\n element.removeEventListener('blur', finishEdit)\n element.removeEventListener('keydown', handleKeydown)\n }\n\n function handleKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n element.blur()\n }\n if (e.key === 'Escape') {\n element.textContent = originalText\n element.blur()\n }\n }\n\n element.addEventListener('blur', finishEdit)\n element.addEventListener('keydown', handleKeydown)\n }\n\n function handleMouseOver(event: MouseEvent) {\n if (!isActive || !stateRef) return\n\n const target = event.target as HTMLElement\n\n // Ignore events from our own overlay\n if (overlayContainer?.contains(target)) return\n\n // Don't interfere with inline editing\n if (currentInlineElement) return\n\n const fieldElement = target.closest('[data-lynkow-field]') as HTMLElement | null\n\n if (!fieldElement) {\n clearOverlay()\n return\n }\n\n const blockElement = fieldElement.closest('[data-lynkow-block]') as HTMLElement | null\n if (!blockElement) {\n clearOverlay()\n return\n }\n\n const blockSlug = blockElement.getAttribute('data-lynkow-block')!\n const fieldKey = fieldElement.getAttribute('data-lynkow-field')!\n\n const editable = stateRef.getEditableFields(blockSlug)\n if (!editable.includes(fieldKey)) {\n clearOverlay()\n return\n }\n\n if (currentHoveredElement === fieldElement) return\n currentHoveredElement = fieldElement\n\n showOverlay(fieldElement, blockSlug, fieldKey)\n\n messenger.send({\n type: 'lynkow:hover-field',\n payload: {\n blockSlug,\n fieldKey,\n fieldPath: fieldKey,\n isHovering: true,\n },\n })\n }\n\n function handleMouseOut(event: MouseEvent) {\n if (!isActive) return\n\n const relatedTarget = event.relatedTarget as HTMLElement | null\n\n // Don't clear if moving to the same field element\n if (relatedTarget?.closest('[data-lynkow-field]') === currentHoveredElement) {\n return\n }\n\n // Don't clear if moving to our overlay (badge, border)\n if (relatedTarget && overlayContainer?.contains(relatedTarget)) {\n return\n }\n\n if (currentHoveredElement) {\n const blockElement = currentHoveredElement.closest('[data-lynkow-block]')\n const blockSlug = blockElement?.getAttribute('data-lynkow-block')\n const fieldKey = currentHoveredElement.getAttribute('data-lynkow-field')\n\n if (blockSlug && fieldKey) {\n messenger.send({\n type: 'lynkow:hover-field',\n payload: { blockSlug, fieldKey, fieldPath: fieldKey, isHovering: false },\n })\n }\n }\n\n clearOverlay()\n }\n\n function setupMutationObserver() {\n let mutationPending = false\n\n mutationObserver = new MutationObserver((mutations) => {\n // Ignore mutations from our own overlay container\n const isOwnMutation = mutations.every(\n (m) => overlayContainer?.contains(m.target as Node)\n )\n if (isOwnMutation) return\n\n if (mutationPending) return\n mutationPending = true\n\n requestAnimationFrame(() => {\n mutationPending = false\n if (currentHoveredElement && overlayContainer?.children.length) {\n const blockElement = currentHoveredElement.closest('[data-lynkow-block]')\n const blockSlug = blockElement?.getAttribute('data-lynkow-block')\n const fieldKey = currentHoveredElement.getAttribute('data-lynkow-field')\n if (blockSlug && fieldKey) {\n showOverlay(currentHoveredElement, blockSlug, fieldKey)\n }\n }\n })\n })\n\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class'],\n })\n }\n\n function highlightField(blockSlug: string, fieldKey: string) {\n const blockEl = document.querySelector(`[data-lynkow-block=\"${blockSlug}\"]`)\n if (!blockEl) return\n\n const fieldEl = blockEl.querySelector(`[data-lynkow-field=\"${fieldKey}\"]`) as HTMLElement | null\n if (!fieldEl) return\n\n fieldEl.scrollIntoView({ behavior: 'smooth', block: 'center' })\n\n fieldEl.classList.add('lynkow-highlight')\n setTimeout(() => {\n fieldEl.classList.remove('lynkow-highlight')\n }, 1500)\n }\n\n return {\n activate(state: State) {\n stateRef = state\n isActive = true\n createContainer()\n setupMutationObserver()\n document.addEventListener('mouseover', handleMouseOver, true)\n document.addEventListener('mouseout', handleMouseOut, true)\n },\n\n deactivate() {\n isActive = false\n clearOverlay()\n clearOverlayElements()\n },\n\n highlightField,\n\n destroy() {\n isActive = false\n stateRef = null\n document.removeEventListener('mouseover', handleMouseOver, true)\n document.removeEventListener('mouseout', handleMouseOut, true)\n mutationObserver?.disconnect()\n overlayContainer?.remove()\n overlayContainer = null\n },\n }\n}\n","import type { DetectedBlocks } from './types.js'\n\nexport function scanPage(): DetectedBlocks {\n const result: DetectedBlocks = { blockSlugs: [], fields: {} }\n\n const blockElements = document.querySelectorAll('[data-lynkow-block]')\n\n blockElements.forEach((blockEl) => {\n const blockSlug = blockEl.getAttribute('data-lynkow-block')!\n if (!result.blockSlugs.includes(blockSlug)) {\n result.blockSlugs.push(blockSlug)\n result.fields[blockSlug] = []\n }\n\n const fieldElements = blockEl.querySelectorAll('[data-lynkow-field]')\n\n fieldElements.forEach((fieldEl) => {\n const key = fieldEl.getAttribute('data-lynkow-field')!\n const type = fieldEl.getAttribute('data-lynkow-type') || 'text'\n const label = fieldEl.getAttribute('data-lynkow-label') || key\n\n const existing = result.fields[blockSlug].find((f) => f.key === key)\n if (!existing) {\n result.fields[blockSlug].push({ key, type, label })\n }\n })\n })\n\n return result\n}\n","import { createMessenger } from './messenger.js'\nimport { createState } from './state.js'\nimport { createLoader } from './loader.js'\nimport { createOverlay } from './overlay.js'\nimport { scanPage } from './utils.js'\nimport type { DataChangeCallback } from './types.js'\nimport type { InitMessage, FieldUpdateMessage, LocaleChangeMessage, ModeChangeMessage, HighlightFieldMessage } from './messages.js'\n\nconst SDK_VERSION = '3.9.0'\n\nexport interface VisualEditorConfig {\n cmsOrigin: string\n}\n\nexport interface VisualEditorInstance {\n destroy: () => void\n isPreviewMode: () => boolean\n getBlockData: (blockSlug: string) => Record<string, any> | null\n onDataChange: (callback: DataChangeCallback) => () => void\n}\n\nfunction createNoopInstance(): VisualEditorInstance {\n return {\n destroy: () => {},\n isPreviewMode: () => false,\n getBlockData: () => null,\n onDataChange: () => () => {},\n }\n}\n\nfunction interceptNavigation() {\n document.addEventListener(\n 'click',\n (event) => {\n const link = (event.target as HTMLElement).closest('a')\n if (link && link.href) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n true\n )\n}\n\nexport function initVisualEditor(config: VisualEditorConfig): VisualEditorInstance {\n // 1. Must be in an iframe\n if (window === window.parent) {\n return createNoopInstance()\n }\n\n // 2. Must have preview query param\n const urlParams = new URLSearchParams(window.location.search)\n if (!urlParams.has('lynkow-preview')) {\n return createNoopInstance()\n }\n\n // 3. Must have cmsOrigin\n if (!config.cmsOrigin) {\n console.error('[Lynkow] cmsOrigin is required')\n return createNoopInstance()\n }\n\n // 4. Initialize modules\n const state = createState()\n const messenger = createMessenger(config.cmsOrigin)\n const loader = createLoader()\n const overlay = createOverlay(messenger)\n\n // 5. Show loader\n loader.show()\n\n // 6. Scan page for data-lynkow-* attributes\n const detectedBlocks = scanPage()\n\n // 7. Send handshake\n messenger.send({\n type: 'lynkow:handshake',\n payload: {\n sdkVersion: SDK_VERSION,\n blocks: detectedBlocks.blockSlugs,\n fields: detectedBlocks.fields,\n },\n })\n\n // 8. Listen for CMS messages\n messenger.on('lynkow:init', (message: InitMessage) => {\n state.setBlockData(message.payload.blockSlug, message.payload.data)\n state.setSchema(message.payload.blockSlug, message.payload.schema)\n state.setEditableFields(message.payload.blockSlug, message.payload.editableFields)\n\n if (message.payload.allBlocksData) {\n for (const [slug, blockInfo] of Object.entries(message.payload.allBlocksData)) {\n state.setBlockData(slug, blockInfo.data)\n state.setSchema(slug, blockInfo.schema)\n state.setEditableFields(slug, blockInfo.editableFields)\n }\n }\n\n loader.hide()\n overlay.activate(state)\n\n messenger.send({ type: 'lynkow:ready', payload: {} })\n })\n\n messenger.on('lynkow:field-update', (message: FieldUpdateMessage) => {\n const { blockSlug, fieldKey, fieldPath, value } = message.payload\n state.updateField(blockSlug, fieldPath, value)\n state.notifyChange(blockSlug, fieldKey, fieldPath, value)\n })\n\n messenger.on('lynkow:locale-change', (message: LocaleChangeMessage) => {\n window.location.href = message.payload.previewUrl\n })\n\n messenger.on('lynkow:mode-change', (message: ModeChangeMessage) => {\n if (message.payload.mode === 'edit') {\n overlay.activate(state)\n } else {\n overlay.deactivate()\n }\n })\n\n messenger.on('lynkow:highlight-field', (message: HighlightFieldMessage) => {\n overlay.highlightField(message.payload.blockSlug, message.payload.fieldKey)\n })\n\n // 9. Intercept navigation\n interceptNavigation()\n\n // 10. Forward Cmd+S / Ctrl+S to parent so it can save\n document.addEventListener('keydown', (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 's') {\n e.preventDefault()\n messenger.send({ type: 'lynkow:save' as any, payload: {} })\n }\n })\n\n // 10. Return instance\n return {\n destroy: () => {\n messenger.destroy()\n overlay.destroy()\n loader.destroy()\n state.destroy()\n },\n isPreviewMode: () => true,\n getBlockData: (blockSlug) => state.getBlockData(blockSlug),\n onDataChange: (callback) => state.subscribe(callback),\n }\n}\n\nexport type { DataChangeCallback } from './types.js'\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function
|
|
1
|
+
function T(n){let a=new Map;function l(e){if(e.origin!==n)return;let o=e.data;if(!o||typeof o.type!="string"||!o.type.startsWith("lynkow:"))return;let i=a.get(o.type);i&&i.forEach(u=>u(o));}return window.addEventListener("message",l),{send(e){window.parent.postMessage(e,n);},on(e,o){a.has(e)||a.set(e,new Set),a.get(e).add(o);},off(e,o){a.get(e)?.delete(o);},destroy(){window.removeEventListener("message",l),a.clear();}}}function F(n){let a=[],l=/([^.\[\]]+)|\[(\d+)\]/g,e;for(;(e=l.exec(n))!==null;)e[1]!==void 0?a.push(e[1]):e[2]!==void 0&&a.push(parseInt(e[2],10));return a}function R(n,a,l){let e=F(a),o=n;for(let i=0;i<e.length-1;i++){let u=e[i];o[u]===void 0&&(o[u]=typeof e[i+1]=="number"?[]:{}),o=o[u];}o[e[e.length-1]]=l;}function L(n,a){let l=F(a),e=n;for(let o of l){if(e==null)return;e=e[o];}return e}function _(){let n=new Map,a=new Map,l=new Map,e=new Set;return {setBlockData(o,i){n.set(o,structuredClone(i));},getBlockData(o){let i=n.get(o);return i?structuredClone(i):null},setSchema(o,i){a.set(o,i);},getSchema(o){return a.get(o)||null},setEditableFields(o,i){l.set(o,i);},getEditableFields(o){return l.get(o)||[]},updateField(o,i,u){let r=n.get(o);r&&R(r,i,u);},subscribe(o){return e.add(o),()=>e.delete(o)},notifyChange(o,i,u,r){let p=n.get(o);p&&e.forEach(k=>k(o,i,u,r,structuredClone(p)));},destroy(){n.clear(),a.clear(),l.clear(),e.clear();}}}function O(){let n=null;return {show(){n||(n=document.createElement("div"),n.id="lynkow-loader",n.style.cssText=`
|
|
2
2
|
position: fixed;
|
|
3
3
|
top: 0;
|
|
4
4
|
left: 0;
|
|
@@ -28,7 +28,7 @@ function B(n){let r=new Map;function l(e){if(e.origin!==n)return;let o=e.data;if
|
|
|
28
28
|
to { transform: rotate(360deg); }
|
|
29
29
|
}
|
|
30
30
|
</style>
|
|
31
|
-
`,document.body.appendChild(n));},hide(){n&&(n.style.opacity="0",n.style.transition="opacity 0.3s ease",setTimeout(()=>{n?.remove(),n=null;},300));},destroy(){n?.remove(),n=null;}}}function
|
|
31
|
+
`,document.body.appendChild(n));},hide(){n&&(n.style.opacity="0",n.style.transition="opacity 0.3s ease",setTimeout(()=>{n?.remove(),n=null;},300));},destroy(){n?.remove(),n=null;}}}function N(n){let a={text:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7V4h16v3M9 20h6M12 4v16"/></svg>',richtext:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 6h16M4 12h10M4 18h14"/></svg>',image:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><path d="m21 15-5-5L5 21"/></svg>',url:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>',select:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m6 9 6 6 6-6"/></svg>',boolean:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="1" y="5" width="22" height="14" rx="7"/><circle cx="16" cy="12" r="3"/></svg>',number:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 17 10 3M14 3l6 14M7.5 11h9"/></svg>',array:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>',object:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z"/></svg>',date:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>',color:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="3"/></svg>',file:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/></svg>'};return a[n]||a.text}function I(n){let a=false,l=null,e=null,o=null,i=null;function u(){l=document.createElement("div"),l.id="lynkow-overlay-container",l.style.cssText="position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999999;",document.body.appendChild(l);}function r(){if(l&&(l.innerHTML=""),e){e.style.outline="",e.style.outlineOffset="",e.style.cursor="";let t=e;t.__lynkowInlineHandler&&(e.removeEventListener("mousedown",t.__lynkowInlineHandler),delete t.__lynkowInlineHandler),t.__lynkowMoveHandler&&(e.removeEventListener("mousemove",t.__lynkowMoveHandler),delete t.__lynkowMoveHandler),t.__lynkowClickHandler&&(e.removeEventListener("mousedown",t.__lynkowClickHandler),delete t.__lynkowClickHandler);}}function p(){r(),e=null;}function k(t,d,s){r();let y=t.getBoundingClientRect(),c=t.getAttribute("data-lynkow-type")||"text",g=t.getAttribute("data-lynkow-label")||s;t.style.outline="2px solid #2563eb",t.style.outlineOffset="2px";let w=document.createElement("div");w.className="lynkow-overlay-badge",w.style.cssText=`
|
|
32
32
|
position: fixed;
|
|
33
33
|
top: ${y.top}px;
|
|
34
34
|
left: ${y.left}px;
|
|
@@ -46,7 +46,7 @@ function B(n){let r=new Map;function l(e){if(e.origin!==n)return;let o=e.data;if
|
|
|
46
46
|
cursor: pointer;
|
|
47
47
|
white-space: nowrap;
|
|
48
48
|
z-index: 1000000;
|
|
49
|
-
`;let C=
|
|
49
|
+
`;let C=N(c),b=document.createElement("span");b.style.cssText="display:flex;align-items:center;",b.innerHTML=C;let E=document.createElement("span");E.textContent=g,w.appendChild(b),w.appendChild(E);let f=["text","string"].includes(c);if(w.addEventListener("mousedown",h=>{if(h.preventDefault(),h.stopPropagation(),f)x(t,d,s,c,n);else {let m=L(i?.getBlockData(d)||{},s);n.send({type:"lynkow:edit-field",payload:{blockSlug:d,fieldKey:s,fieldPath:s,fieldType:c,fieldLabel:g,currentValue:m}});}}),l?.appendChild(w),f){t.style.cursor="text";let h=m=>{v!==t&&(m.preventDefault(),m.stopPropagation(),x(t,d,s,c,n));};t.addEventListener("mousedown",h,{once:true}),t.__lynkowInlineHandler=h;}else {t.style.cursor="pointer";let h=document.createElement("div");h.className="lynkow-cursor-tooltip",h.textContent="Cliquer pour \xE9diter",h.style.cssText=`
|
|
50
50
|
position: fixed;
|
|
51
51
|
display: none;
|
|
52
52
|
padding: 4px 10px;
|
|
@@ -60,5 +60,5 @@ function B(n){let r=new Map;function l(e){if(e.origin!==n)return;let o=e.data;if
|
|
|
60
60
|
white-space: nowrap;
|
|
61
61
|
z-index: 1000001;
|
|
62
62
|
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
63
|
-
`,l?.appendChild(h);let
|
|
63
|
+
`,l?.appendChild(h);let m=M=>{h.style.display="block",h.style.left=`${M.clientX+14}px`,h.style.top=`${M.clientY+14}px`;};t.addEventListener("mousemove",m),t.__lynkowMoveHandler=m;let B=M=>{M.preventDefault(),M.stopPropagation();let j=L(i?.getBlockData(d)||{},s);n.send({type:"lynkow:edit-field",payload:{blockSlug:d,fieldKey:s,fieldPath:s,fieldType:c,fieldLabel:g,currentValue:j}});};t.addEventListener("mousedown",B),t.__lynkowClickHandler=B;}}let v=null;function x(t,d,s,y,c){r(),v=t;let g=t.textContent||"";t.contentEditable="true",t.style.outline="2px solid #2563eb",t.style.outlineOffset="2px",t.style.cursor="text",t.focus();let w=document.createRange();w.selectNodeContents(t);let C=window.getSelection();C?.removeAllRanges(),C?.addRange(w);function b(){t.contentEditable="false",t.style.outline="",t.style.outlineOffset="",t.style.cursor="",v=null;let f=t.textContent||"";f!==g&&(i?.updateField(d,s,f),i?.notifyChange(d,s,s,f),c.send({type:"lynkow:edit-field",payload:{blockSlug:d,fieldKey:s,fieldPath:s,fieldType:y,fieldLabel:t.getAttribute("data-lynkow-label")||s,currentValue:f}}),c.send({type:"lynkow:field-update",payload:{blockSlug:d,fieldKey:s,fieldPath:s,value:f}})),t.removeEventListener("blur",b),t.removeEventListener("keydown",E);}function E(f){f.key==="Enter"&&!f.shiftKey&&(f.preventDefault(),t.blur()),f.key==="Escape"&&(t.textContent=g,t.blur());}t.addEventListener("blur",b),t.addEventListener("keydown",E);}function S(t){if(!a||!i)return;let d=t.target;if(l?.contains(d)||v)return;let s=d.closest("[data-lynkow-field]");if(!s){p();return}let y=s.closest("[data-lynkow-block]");if(!y){p();return}let c=y.getAttribute("data-lynkow-block"),g=s.getAttribute("data-lynkow-field");if(!i.getEditableFields(c).includes(g)){p();return}e!==s&&(e=s,k(s,c,g),n.send({type:"lynkow:hover-field",payload:{blockSlug:c,fieldKey:g,fieldPath:g,isHovering:true}}));}function D(t){if(!a)return;let d=t.relatedTarget;if(d?.closest("[data-lynkow-field]")!==e&&!(d&&l?.contains(d))){if(e){let y=e.closest("[data-lynkow-block]")?.getAttribute("data-lynkow-block"),c=e.getAttribute("data-lynkow-field");y&&c&&n.send({type:"lynkow:hover-field",payload:{blockSlug:y,fieldKey:c,fieldPath:c,isHovering:false}});}p();}}function V(){let t=false;o=new MutationObserver(d=>{d.every(y=>l?.contains(y.target))||t||(t=true,requestAnimationFrame(()=>{if(t=false,e&&l?.children.length){let c=e.closest("[data-lynkow-block]")?.getAttribute("data-lynkow-block"),g=e.getAttribute("data-lynkow-field");c&&g&&k(e,c,g);}}));}),o.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["style","class"]});}function A(t,d){let s=document.querySelector(`[data-lynkow-block="${t}"]`);if(!s)return;let y=s.querySelector(`[data-lynkow-field="${d}"]`);y&&(y.scrollIntoView({behavior:"smooth",block:"center"}),y.classList.add("lynkow-highlight"),setTimeout(()=>{y.classList.remove("lynkow-highlight");},1500));}return {activate(t){i=t,a=true,u(),V(),document.addEventListener("mouseover",S,true),document.addEventListener("mouseout",D,true);},deactivate(){a=false,p(),r();},highlightField:A,destroy(){a=false,i=null,document.removeEventListener("mouseover",S,true),document.removeEventListener("mouseout",D,true),o?.disconnect(),l?.remove(),l=null;}}}function P(){let n={blockSlugs:[],fields:{}};return document.querySelectorAll("[data-lynkow-block]").forEach(l=>{let e=l.getAttribute("data-lynkow-block");n.blockSlugs.includes(e)||(n.blockSlugs.push(e),n.fields[e]=[]),l.querySelectorAll("[data-lynkow-field]").forEach(i=>{let u=i.getAttribute("data-lynkow-field"),r=i.getAttribute("data-lynkow-type")||"text",p=i.getAttribute("data-lynkow-label")||u;n.fields[e].find(v=>v.key===u)||n.fields[e].push({key:u,type:r,label:p});});}),n}var z="3.9.0";function H(){return {destroy:()=>{},isPreviewMode:()=>false,getBlockData:()=>null,onDataChange:()=>()=>{}}}function q(){document.addEventListener("click",n=>{let a=n.target.closest("a");a&&a.href&&(n.preventDefault(),n.stopPropagation());},true);}function U(n){if(window===window.parent||!new URLSearchParams(window.location.search).has("lynkow-preview"))return H();if(!n.cmsOrigin)return console.error("[Lynkow] cmsOrigin is required"),H();let l=_(),e=T(n.cmsOrigin),o=O(),i=I(e);o.show();let u=P();return e.send({type:"lynkow:handshake",payload:{sdkVersion:z,blocks:u.blockSlugs,fields:u.fields}}),e.on("lynkow:init",r=>{if(l.setBlockData(r.payload.blockSlug,r.payload.data),l.setSchema(r.payload.blockSlug,r.payload.schema),l.setEditableFields(r.payload.blockSlug,r.payload.editableFields),r.payload.allBlocksData)for(let[p,k]of Object.entries(r.payload.allBlocksData))l.setBlockData(p,k.data),l.setSchema(p,k.schema),l.setEditableFields(p,k.editableFields);o.hide(),i.activate(l),e.send({type:"lynkow:ready",payload:{}});}),e.on("lynkow:field-update",r=>{let{blockSlug:p,fieldKey:k,fieldPath:v,value:x}=r.payload;l.updateField(p,v,x),l.notifyChange(p,k,v,x);}),e.on("lynkow:locale-change",r=>{window.location.href=r.payload.previewUrl;}),e.on("lynkow:mode-change",r=>{r.payload.mode==="edit"?i.activate(l):i.deactivate();}),e.on("lynkow:highlight-field",r=>{i.highlightField(r.payload.blockSlug,r.payload.fieldKey);}),q(),document.addEventListener("keydown",r=>{(r.metaKey||r.ctrlKey)&&r.key==="s"&&(r.preventDefault(),e.send({type:"lynkow:save",payload:{}}));}),{destroy:()=>{e.destroy(),i.destroy(),o.destroy(),l.destroy();},isPreviewMode:()=>true,getBlockData:r=>l.getBlockData(r),onDataChange:r=>l.subscribe(r)}}export{U as initVisualEditor};//# sourceMappingURL=index.mjs.map
|
|
64
64
|
//# sourceMappingURL=index.mjs.map
|