lynkow 3.8.69 → 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 +2 -0
- package/dist/index.d.mts +147 -10
- package/dist/index.d.ts +147 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +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
|
@@ -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","../../../src/visual-editor/react/context.ts","../../../src/visual-editor/react/provider.tsx","../../../src/visual-editor/react/hooks.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","LynkowVisualEditorContext","createContext","LynkowVisualEditor","children","blocksData","setBlocksData","useState","isPreviewMode","setIsPreviewMode","instanceRef","useRef","useEffect","instance","unsubscribe","_fieldKey","_fieldPath","_value","prev","contextValue","jsx","useBlockData","initialData","useContext","useMemo","previewData","useLynkowField","initialValue","useIsPreviewMode"],"mappings":"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","file":"index.mjs","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","import { createContext } from 'react'\nimport type { VisualEditorInstance } from '../core.js'\n\nexport interface LynkowVisualEditorContextValue {\n instance: VisualEditorInstance | null\n isPreviewMode: boolean\n blocksData: Record<string, Record<string, any>>\n}\n\nexport const LynkowVisualEditorContext = createContext<LynkowVisualEditorContextValue>({\n instance: null,\n isPreviewMode: false,\n blocksData: {},\n})\n","import React, { useState, useEffect, useRef } from 'react'\nimport { initVisualEditor, type VisualEditorInstance } from '../core.js'\nimport { LynkowVisualEditorContext } from './context.js'\n\ninterface LynkowVisualEditorProps {\n cmsOrigin: string\n children: React.ReactNode\n}\n\nexport function LynkowVisualEditor({ cmsOrigin, children }: LynkowVisualEditorProps) {\n const [blocksData, setBlocksData] = useState<Record<string, Record<string, any>>>({})\n const [isPreviewMode, setIsPreviewMode] = useState(false)\n const instanceRef = useRef<VisualEditorInstance | null>(null)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const instance = initVisualEditor({ cmsOrigin })\n instanceRef.current = instance\n\n if (instance.isPreviewMode()) {\n setIsPreviewMode(true)\n\n const unsubscribe = instance.onDataChange(\n (blockSlug, _fieldKey, _fieldPath, _value, allData) => {\n setBlocksData((prev) => ({\n ...prev,\n [blockSlug]: allData,\n }))\n }\n )\n\n return () => {\n unsubscribe()\n instance.destroy()\n instanceRef.current = null\n }\n }\n\n return () => {\n instance.destroy()\n instanceRef.current = null\n }\n }, [cmsOrigin])\n\n const contextValue = {\n instance: instanceRef.current,\n isPreviewMode,\n blocksData,\n }\n\n return (\n <LynkowVisualEditorContext.Provider value={contextValue}>\n {children}\n </LynkowVisualEditorContext.Provider>\n )\n}\n","import { useContext, useMemo } from 'react'\nimport { LynkowVisualEditorContext } from './context.js'\n\nexport function useBlockData<T extends Record<string, any>>(\n blockSlug: string,\n initialData: T\n): T {\n const { isPreviewMode, blocksData } = useContext(LynkowVisualEditorContext)\n\n return useMemo(() => {\n if (!isPreviewMode) {\n return initialData\n }\n\n const previewData = blocksData[blockSlug]\n if (!previewData) {\n return initialData\n }\n\n return { ...initialData, ...previewData } as T\n }, [isPreviewMode, blocksData, blockSlug, initialData])\n}\n\nexport function useLynkowField<T>(blockSlug: string, fieldKey: string, initialValue: T): T {\n const { isPreviewMode, blocksData } = useContext(LynkowVisualEditorContext)\n\n return useMemo(() => {\n if (!isPreviewMode) {\n return initialValue\n }\n\n const blockData = blocksData[blockSlug]\n if (!blockData || !(fieldKey in blockData)) {\n return initialValue\n }\n\n return blockData[fieldKey] as T\n }, [isPreviewMode, blocksData, blockSlug, fieldKey, initialValue])\n}\n\nexport function useIsPreviewMode(): boolean {\n const { isPreviewMode } = useContext(LynkowVisualEditorContext)\n return isPreviewMode\n}\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","../../../src/visual-editor/react/context.ts","../../../src/visual-editor/react/provider.tsx","../../../src/visual-editor/react/hooks.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","LynkowVisualEditorContext","createContext","LynkowVisualEditor","children","blocksData","setBlocksData","useState","isPreviewMode","setIsPreviewMode","instanceRef","useRef","useEffect","instance","unsubscribe","_fieldKey","_fieldPath","_value","prev","contextValue","jsx","useBlockData","initialData","useContext","useMemo","previewData","useLynkowField","initialValue","useIsPreviewMode"],"mappings":"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","file":"index.mjs","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","import { createContext } from 'react'\nimport type { VisualEditorInstance } from '../core.js'\n\nexport interface LynkowVisualEditorContextValue {\n instance: VisualEditorInstance | null\n isPreviewMode: boolean\n blocksData: Record<string, Record<string, any>>\n}\n\nexport const LynkowVisualEditorContext = createContext<LynkowVisualEditorContextValue>({\n instance: null,\n isPreviewMode: false,\n blocksData: {},\n})\n","import React, { useState, useEffect, useRef } from 'react'\nimport { initVisualEditor, type VisualEditorInstance } from '../core.js'\nimport { LynkowVisualEditorContext } from './context.js'\n\ninterface LynkowVisualEditorProps {\n cmsOrigin: string\n children: React.ReactNode\n}\n\nexport function LynkowVisualEditor({ cmsOrigin, children }: LynkowVisualEditorProps) {\n const [blocksData, setBlocksData] = useState<Record<string, Record<string, any>>>({})\n const [isPreviewMode, setIsPreviewMode] = useState(false)\n const instanceRef = useRef<VisualEditorInstance | null>(null)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const instance = initVisualEditor({ cmsOrigin })\n instanceRef.current = instance\n\n if (instance.isPreviewMode()) {\n setIsPreviewMode(true)\n\n const unsubscribe = instance.onDataChange(\n (blockSlug, _fieldKey, _fieldPath, _value, allData) => {\n setBlocksData((prev) => ({\n ...prev,\n [blockSlug]: allData,\n }))\n }\n )\n\n return () => {\n unsubscribe()\n instance.destroy()\n instanceRef.current = null\n }\n }\n\n return () => {\n instance.destroy()\n instanceRef.current = null\n }\n }, [cmsOrigin])\n\n const contextValue = {\n instance: instanceRef.current,\n isPreviewMode,\n blocksData,\n }\n\n return (\n <LynkowVisualEditorContext.Provider value={contextValue}>\n {children}\n </LynkowVisualEditorContext.Provider>\n )\n}\n","import { useContext, useMemo } from 'react'\nimport { LynkowVisualEditorContext } from './context.js'\n\nexport function useBlockData<T extends Record<string, any>>(\n blockSlug: string,\n initialData: T\n): T {\n const { isPreviewMode, blocksData } = useContext(LynkowVisualEditorContext)\n\n return useMemo(() => {\n if (!isPreviewMode) {\n return initialData\n }\n\n const previewData = blocksData[blockSlug]\n if (!previewData) {\n return initialData\n }\n\n return { ...initialData, ...previewData } as T\n }, [isPreviewMode, blocksData, blockSlug, initialData])\n}\n\nexport function useLynkowField<T>(blockSlug: string, fieldKey: string, initialValue: T): T {\n const { isPreviewMode, blocksData } = useContext(LynkowVisualEditorContext)\n\n return useMemo(() => {\n if (!isPreviewMode) {\n return initialValue\n }\n\n const blockData = blocksData[blockSlug]\n if (!blockData || !(fieldKey in blockData)) {\n return initialValue\n }\n\n return blockData[fieldKey] as T\n }, [isPreviewMode, blocksData, blockSlug, fieldKey, initialValue])\n}\n\nexport function useIsPreviewMode(): boolean {\n const { isPreviewMode } = useContext(LynkowVisualEditorContext)\n return isPreviewMode\n}\n"]}
|