@paulpaulstudio/strapi-render 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -647,12 +647,88 @@ function StrapiRichTextField({ path, value, render, className }) {
647
647
  }
648
648
  );
649
649
  }
650
+ function StrapiLink({ path, value, target, rel, className, children }) {
651
+ const ctx = useStrapiEditMode();
652
+ const scope = useContentScope();
653
+ const [hover, setHover] = react.useState(false);
654
+ if (!ctx.enabled) {
655
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { href: value ?? "#", target, rel, className, children });
656
+ }
657
+ const handleEdit = (e) => {
658
+ e.preventDefault();
659
+ e.stopPropagation();
660
+ const next = window.prompt("Link-URL bearbeiten:", value ?? "");
661
+ if (next !== null && next !== value) {
662
+ postEditChange(scope, path, "text", next);
663
+ }
664
+ };
665
+ return /* @__PURE__ */ jsxRuntime.jsxs(
666
+ "span",
667
+ {
668
+ style: { position: "relative", display: "inline-block" },
669
+ onMouseEnter: () => setHover(true),
670
+ onMouseLeave: () => setHover(false),
671
+ children: [
672
+ /* @__PURE__ */ jsxRuntime.jsx(
673
+ "a",
674
+ {
675
+ href: value ?? "#",
676
+ target,
677
+ rel,
678
+ className,
679
+ onClick: (e) => {
680
+ e.preventDefault();
681
+ },
682
+ "data-pp-edit": path,
683
+ "data-pp-type": "text",
684
+ children
685
+ }
686
+ ),
687
+ /* @__PURE__ */ jsxRuntime.jsx(
688
+ "button",
689
+ {
690
+ type: "button",
691
+ onClick: handleEdit,
692
+ style: {
693
+ position: "absolute",
694
+ top: 8,
695
+ right: 8,
696
+ background: "#000",
697
+ color: "#EBC6DF",
698
+ border: "2px solid #000",
699
+ padding: "4px 8px",
700
+ fontSize: 10,
701
+ fontWeight: 700,
702
+ textTransform: "uppercase",
703
+ letterSpacing: "0.15em",
704
+ cursor: "pointer",
705
+ opacity: hover ? 1 : 0,
706
+ transition: "opacity 0.15s ease, background 0.15s ease",
707
+ fontFamily: "system-ui, sans-serif",
708
+ zIndex: 10
709
+ },
710
+ onMouseEnter: (e) => {
711
+ e.currentTarget.style.background = "#FA501E";
712
+ e.currentTarget.style.color = "#000";
713
+ },
714
+ onMouseLeave: (e) => {
715
+ e.currentTarget.style.background = "#000";
716
+ e.currentTarget.style.color = "#EBC6DF";
717
+ },
718
+ children: "\u{1F517} Link"
719
+ }
720
+ )
721
+ ]
722
+ }
723
+ );
724
+ }
650
725
 
651
726
  exports.StrapiBlocks = StrapiBlocks;
652
727
  exports.StrapiContent = StrapiContent;
653
728
  exports.StrapiEditModeProvider = StrapiEditModeProvider;
654
729
  exports.StrapiField = StrapiField;
655
730
  exports.StrapiImage = StrapiImage;
731
+ exports.StrapiLink = StrapiLink;
656
732
  exports.StrapiList = StrapiList;
657
733
  exports.StrapiMarkdownField = StrapiMarkdownField;
658
734
  exports.StrapiRichTextField = StrapiRichTextField;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx","../src/StrapiRichTextField.tsx"],"names":["createContext","useContext","useState","useRef","useEffect","useCallback","useMemo","jsx","Fragment","Children","isValidElement","cloneElement","createElement","HOVER_OUTLINE_COLOR","inner","HOVER_OUTLINE","TurndownService"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\nconst EDIT_SESSION_KEY = \"__pp_edit_session\";\n\n// ── Context (separat für globalen Edit-Status + Content-Scope) ──────\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n /**\n * Wert/Path-Update an Parent (mit Content-Type-Kontext aus dem nächsten StrapiContent).\n */\n publishChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\ninterface ContentScope {\n uid: string;\n kind: \"singleType\" | \"collectionType\";\n documentId?: string;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n publishChange: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nconst ContentScopeContext = createContext<ContentScope | null>(null);\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\nexport function useContentScope(): ContentScope | null {\n return useContext(ContentScopeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\n/**\n * Edit-Mode wird aktiv wenn:\n * - `?__pp_edit=1` in der URL, ODER\n * - sessionStorage `__pp_edit_session=1` gesetzt (für Navigation innerhalb der\n * Customer-Site — beim ersten Aufruf via URL wird der Flag gesetzt, danach\n * bleibt der Mode aktiv auch wenn die URL-Params bei Folge-Links fehlen).\n */\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const urlEdit = params.get(\"__pp_edit\") === \"1\";\n const sessionFlag = window.sessionStorage.getItem(EDIT_SESSION_KEY) === \"1\";\n const enabled = urlEdit || sessionFlag;\n if (urlEdit) {\n window.sessionStorage.setItem(EDIT_SESSION_KEY, \"1\");\n }\n const token = params.get(\"__pp_token\") ?? window.sessionStorage.getItem(\"__pp_edit_token\");\n if (token) window.sessionStorage.setItem(\"__pp_edit_token\", token);\n setUrlState({ enabled, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Parent → Iframe Listener (reload, media-picked)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:exit\") {\n // Parent fordert Beenden des Edit-Modus\n window.sessionStorage.removeItem(EDIT_SESSION_KEY);\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const publishChange = useCallback((_path: string, _fieldType: StrapiFieldType, _value: unknown) => {\n // Actual change-with-content-context wird im StrapiField gesendet, weil\n // ContentScope nicht hier verfügbar ist. publishChange ist legacy.\n }, []);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:open-media-picker\", path, multiple, allowedTypes, currentValue }, \"*\");\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n publishChange,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, publishChange, openMediaPicker, onMediaPicked]);\n\n return <EditModeContext.Provider value={value}>{children}</EditModeContext.Provider>;\n}\n\n// ── StrapiContent — Scope-Provider pro Seite/Section ────────────────\ninterface StrapiContentProps {\n /** Strapi-API-ID (z.B. \"impressum\", \"home\", \"event\"). */\n uid: string;\n /** \"singleType\" oder \"collectionType\". */\n kind: \"singleType\" | \"collectionType\";\n /** Bei collectionType erforderlich; bei singleType weglassen. */\n documentId?: string;\n children: React.ReactNode;\n}\n\n/**\n * Marker, der allen inneren `<StrapiField>`s die Content-Type-Identität\n * mitgibt. Ohne `<StrapiContent>` rund um Felder weiß der Parent-Editor\n * nicht, wohin er die Änderung saven soll — Felder bleiben dann inert.\n *\n * Beispiel:\n * <StrapiContent uid=\"impressum\" kind=\"singleType\">\n * <StrapiText path=\"titel\" value={data.titel} as=\"h1\" />\n * <StrapiMarkdownField path=\"content\" value={data.content} render={...} />\n * </StrapiContent>\n */\nexport function StrapiContent({ uid, kind, documentId, children }: StrapiContentProps) {\n const scope = useMemo<ContentScope>(() => ({ uid, kind, documentId }), [uid, kind, documentId]);\n return <ContentScopeContext.Provider value={scope}>{children}</ContentScopeContext.Provider>;\n}\n\n/**\n * Wird intern von StrapiField etc. genutzt um den Change ans Parent zu posten —\n * inkl. dem Content-Type aus dem nächsten `<StrapiContent>`-Wrapper.\n */\nexport function postEditChange(scope: ContentScope | null, path: string, fieldType: StrapiFieldType, value: unknown): void {\n if (typeof window === \"undefined\" || window.parent === window) return;\n if (!scope) {\n console.warn(\"[strapi-render] Feld ohne <StrapiContent>-Scope — Save wird nicht funktionieren. Wickle deine Seite mit <StrapiContent uid='...' kind='...'> ein.\");\n return;\n }\n try {\n window.parent.postMessage({\n type: \"pp:edit:change\",\n uid: scope.uid,\n kind: scope.kind,\n documentId: scope.documentId,\n path,\n fieldType,\n value,\n }, \"*\");\n } catch { /* ignore */ }\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n postEditChange(scope, path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n }\n\n return cloneElement(el, props);\n }\n\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n width?: number | string;\n height?: number | string;\n draggable?: boolean;\n priority?: boolean; // no-op, Next/Image compat\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Render-Mode: identisches HTML wie ein nativer <img>.\n *\n * Edit-Mode: derselbe <img>, aber mit Click-Handler + Hover-Outline. KEIN\n * extra Wrapper-Element — Layouts mit `position:absolute; inset:0` o.ä.\n * funktionieren exakt wie ohne SDK.\n */\nexport function StrapiImage({\n path, value, baseUrl, alt, className, style, loading = \"lazy\",\n fallback, allowedTypes, multiple = false, width, height, draggable, priority: _ignored,\n}: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n postEditChange(scope, path, \"media\", picked);\n unsubscribe();\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n cursor: \"pointer\",\n ...style,\n }}\n >\n + Bild hinzufügen\n </button>\n );\n }\n\n const editStyle: React.CSSProperties = ctx.enabled ? {\n ...style,\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n transition: \"outline-color 0.15s ease\",\n } : (style ?? {});\n\n return (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={width ?? value.width}\n height={height ?? value.height}\n loading={loading}\n className={className}\n style={editStyle}\n draggable={draggable}\n data-pp-edit={ctx.enabled ? path : undefined}\n data-pp-type={ctx.enabled ? \"media\" : undefined}\n onClick={ctx.enabled ? handleClick : undefined}\n onMouseEnter={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = HOVER_OUTLINE_COLOR;\n el.style.outlineStyle = \"solid\";\n } : undefined}\n onMouseLeave={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n } : undefined}\n />\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n postEditChange(scope, path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n postEditChange(scope, path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport TurndownService from \"turndown\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). Wird auch im Edit-Mode\n * initial gerendert — der User editiert dann direkt das ergebende HTML. */\n render: (markdown: string) => ReactNode;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * WYSIWYG-RichText.\n *\n * Read-Mode: ruft `render(value)` auf — das ist der bereits gerenderte\n * Inhalt (z.B. ReactMarkdown → HTML). Keine Modifikation.\n *\n * Edit-Mode: derselbe gerenderte HTML-Inhalt wird in einem `contentEditable`-\n * Container angezeigt. Der User editiert das HTML inline (Word-Style). Beim\n * Blur wird das HTML via Turndown wieder in Markdown zurückgewandelt und an\n * den Parent geschickt — damit die Strapi-Quelle Markdown bleibt + ohne\n * Verluste round-trippt (Headings, Listen, Links, Bold/Italic bleiben).\n */\nexport function StrapiRichTextField({ path, value, render, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const turndownRef = useRef<TurndownService | null>(null);\n const initial = useRef<string>(value ?? \"\");\n const [, force] = useState({});\n\n // Turndown initialisieren — nur client-side, nur einmal\n if (typeof window !== \"undefined\" && !turndownRef.current) {\n const td = new TurndownService({\n headingStyle: \"atx\",\n hr: \"---\",\n bulletListMarker: \"-\",\n codeBlockStyle: \"fenced\",\n emDelimiter: \"*\",\n });\n // <br> wird zu echtem Newline (statt MD-Zeilenumbruch \" \\n\")\n td.addRule(\"br\", {\n filter: \"br\",\n replacement: () => \"\\n\",\n });\n turndownRef.current = td;\n }\n\n useEffect(() => {\n initial.current = value ?? \"\";\n force({});\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"richText\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n cursor: \"text\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onBlur={(e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n if (!turndownRef.current) return;\n // HTML im Container → Markdown\n const html = el.innerHTML;\n const md = turndownRef.current.turndown(html).trim();\n if (md !== initial.current.trim()) {\n postEditChange(scope, path, \"richText\", md);\n }\n }}\n onKeyDown={(e) => {\n // Tab-Shortcuts für Bold/Italic\n if ((e.metaKey || e.ctrlKey)) {\n if (e.key === \"b\") {\n e.preventDefault();\n document.execCommand(\"bold\");\n } else if (e.key === \"i\") {\n e.preventDefault();\n document.execCommand(\"italic\");\n } else if (e.key === \"u\") {\n e.preventDefault();\n document.execCommand(\"underline\");\n } else if (e.key === \"k\") {\n e.preventDefault();\n const url = window.prompt(\"Link-URL:\");\n if (url) document.execCommand(\"createLink\", false, url);\n }\n }\n }}\n >\n {render(value ?? \"\")}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx","../src/StrapiRichTextField.tsx","../src/StrapiLink.tsx"],"names":["createContext","useContext","useState","useRef","useEffect","useCallback","useMemo","jsx","Fragment","Children","isValidElement","cloneElement","createElement","HOVER_OUTLINE_COLOR","inner","HOVER_OUTLINE","TurndownService","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\nconst EDIT_SESSION_KEY = \"__pp_edit_session\";\n\n// ── Context (separat für globalen Edit-Status + Content-Scope) ──────\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n /**\n * Wert/Path-Update an Parent (mit Content-Type-Kontext aus dem nächsten StrapiContent).\n */\n publishChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\ninterface ContentScope {\n uid: string;\n kind: \"singleType\" | \"collectionType\";\n documentId?: string;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n publishChange: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nconst ContentScopeContext = createContext<ContentScope | null>(null);\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\nexport function useContentScope(): ContentScope | null {\n return useContext(ContentScopeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\n/**\n * Edit-Mode wird aktiv wenn:\n * - `?__pp_edit=1` in der URL, ODER\n * - sessionStorage `__pp_edit_session=1` gesetzt (für Navigation innerhalb der\n * Customer-Site — beim ersten Aufruf via URL wird der Flag gesetzt, danach\n * bleibt der Mode aktiv auch wenn die URL-Params bei Folge-Links fehlen).\n */\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const urlEdit = params.get(\"__pp_edit\") === \"1\";\n const sessionFlag = window.sessionStorage.getItem(EDIT_SESSION_KEY) === \"1\";\n const enabled = urlEdit || sessionFlag;\n if (urlEdit) {\n window.sessionStorage.setItem(EDIT_SESSION_KEY, \"1\");\n }\n const token = params.get(\"__pp_token\") ?? window.sessionStorage.getItem(\"__pp_edit_token\");\n if (token) window.sessionStorage.setItem(\"__pp_edit_token\", token);\n setUrlState({ enabled, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Parent → Iframe Listener (reload, media-picked)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:exit\") {\n // Parent fordert Beenden des Edit-Modus\n window.sessionStorage.removeItem(EDIT_SESSION_KEY);\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const publishChange = useCallback((_path: string, _fieldType: StrapiFieldType, _value: unknown) => {\n // Actual change-with-content-context wird im StrapiField gesendet, weil\n // ContentScope nicht hier verfügbar ist. publishChange ist legacy.\n }, []);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:open-media-picker\", path, multiple, allowedTypes, currentValue }, \"*\");\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n publishChange,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, publishChange, openMediaPicker, onMediaPicked]);\n\n return <EditModeContext.Provider value={value}>{children}</EditModeContext.Provider>;\n}\n\n// ── StrapiContent — Scope-Provider pro Seite/Section ────────────────\ninterface StrapiContentProps {\n /** Strapi-API-ID (z.B. \"impressum\", \"home\", \"event\"). */\n uid: string;\n /** \"singleType\" oder \"collectionType\". */\n kind: \"singleType\" | \"collectionType\";\n /** Bei collectionType erforderlich; bei singleType weglassen. */\n documentId?: string;\n children: React.ReactNode;\n}\n\n/**\n * Marker, der allen inneren `<StrapiField>`s die Content-Type-Identität\n * mitgibt. Ohne `<StrapiContent>` rund um Felder weiß der Parent-Editor\n * nicht, wohin er die Änderung saven soll — Felder bleiben dann inert.\n *\n * Beispiel:\n * <StrapiContent uid=\"impressum\" kind=\"singleType\">\n * <StrapiText path=\"titel\" value={data.titel} as=\"h1\" />\n * <StrapiMarkdownField path=\"content\" value={data.content} render={...} />\n * </StrapiContent>\n */\nexport function StrapiContent({ uid, kind, documentId, children }: StrapiContentProps) {\n const scope = useMemo<ContentScope>(() => ({ uid, kind, documentId }), [uid, kind, documentId]);\n return <ContentScopeContext.Provider value={scope}>{children}</ContentScopeContext.Provider>;\n}\n\n/**\n * Wird intern von StrapiField etc. genutzt um den Change ans Parent zu posten —\n * inkl. dem Content-Type aus dem nächsten `<StrapiContent>`-Wrapper.\n */\nexport function postEditChange(scope: ContentScope | null, path: string, fieldType: StrapiFieldType, value: unknown): void {\n if (typeof window === \"undefined\" || window.parent === window) return;\n if (!scope) {\n console.warn(\"[strapi-render] Feld ohne <StrapiContent>-Scope — Save wird nicht funktionieren. Wickle deine Seite mit <StrapiContent uid='...' kind='...'> ein.\");\n return;\n }\n try {\n window.parent.postMessage({\n type: \"pp:edit:change\",\n uid: scope.uid,\n kind: scope.kind,\n documentId: scope.documentId,\n path,\n fieldType,\n value,\n }, \"*\");\n } catch { /* ignore */ }\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n postEditChange(scope, path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n }\n\n return cloneElement(el, props);\n }\n\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n width?: number | string;\n height?: number | string;\n draggable?: boolean;\n priority?: boolean; // no-op, Next/Image compat\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Render-Mode: identisches HTML wie ein nativer <img>.\n *\n * Edit-Mode: derselbe <img>, aber mit Click-Handler + Hover-Outline. KEIN\n * extra Wrapper-Element — Layouts mit `position:absolute; inset:0` o.ä.\n * funktionieren exakt wie ohne SDK.\n */\nexport function StrapiImage({\n path, value, baseUrl, alt, className, style, loading = \"lazy\",\n fallback, allowedTypes, multiple = false, width, height, draggable, priority: _ignored,\n}: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n postEditChange(scope, path, \"media\", picked);\n unsubscribe();\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n cursor: \"pointer\",\n ...style,\n }}\n >\n + Bild hinzufügen\n </button>\n );\n }\n\n const editStyle: React.CSSProperties = ctx.enabled ? {\n ...style,\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n transition: \"outline-color 0.15s ease\",\n } : (style ?? {});\n\n return (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={width ?? value.width}\n height={height ?? value.height}\n loading={loading}\n className={className}\n style={editStyle}\n draggable={draggable}\n data-pp-edit={ctx.enabled ? path : undefined}\n data-pp-type={ctx.enabled ? \"media\" : undefined}\n onClick={ctx.enabled ? handleClick : undefined}\n onMouseEnter={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = HOVER_OUTLINE_COLOR;\n el.style.outlineStyle = \"solid\";\n } : undefined}\n onMouseLeave={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n } : undefined}\n />\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n postEditChange(scope, path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n postEditChange(scope, path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport TurndownService from \"turndown\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). Wird auch im Edit-Mode\n * initial gerendert — der User editiert dann direkt das ergebende HTML. */\n render: (markdown: string) => ReactNode;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * WYSIWYG-RichText.\n *\n * Read-Mode: ruft `render(value)` auf — das ist der bereits gerenderte\n * Inhalt (z.B. ReactMarkdown → HTML). Keine Modifikation.\n *\n * Edit-Mode: derselbe gerenderte HTML-Inhalt wird in einem `contentEditable`-\n * Container angezeigt. Der User editiert das HTML inline (Word-Style). Beim\n * Blur wird das HTML via Turndown wieder in Markdown zurückgewandelt und an\n * den Parent geschickt — damit die Strapi-Quelle Markdown bleibt + ohne\n * Verluste round-trippt (Headings, Listen, Links, Bold/Italic bleiben).\n */\nexport function StrapiRichTextField({ path, value, render, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const turndownRef = useRef<TurndownService | null>(null);\n const initial = useRef<string>(value ?? \"\");\n const [, force] = useState({});\n\n // Turndown initialisieren — nur client-side, nur einmal\n if (typeof window !== \"undefined\" && !turndownRef.current) {\n const td = new TurndownService({\n headingStyle: \"atx\",\n hr: \"---\",\n bulletListMarker: \"-\",\n codeBlockStyle: \"fenced\",\n emDelimiter: \"*\",\n });\n // <br> wird zu echtem Newline (statt MD-Zeilenumbruch \" \\n\")\n td.addRule(\"br\", {\n filter: \"br\",\n replacement: () => \"\\n\",\n });\n turndownRef.current = td;\n }\n\n useEffect(() => {\n initial.current = value ?? \"\";\n force({});\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"richText\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n cursor: \"text\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onBlur={(e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n if (!turndownRef.current) return;\n // HTML im Container → Markdown\n const html = el.innerHTML;\n const md = turndownRef.current.turndown(html).trim();\n if (md !== initial.current.trim()) {\n postEditChange(scope, path, \"richText\", md);\n }\n }}\n onKeyDown={(e) => {\n // Tab-Shortcuts für Bold/Italic\n if ((e.metaKey || e.ctrlKey)) {\n if (e.key === \"b\") {\n e.preventDefault();\n document.execCommand(\"bold\");\n } else if (e.key === \"i\") {\n e.preventDefault();\n document.execCommand(\"italic\");\n } else if (e.key === \"u\") {\n e.preventDefault();\n document.execCommand(\"underline\");\n } else if (e.key === \"k\") {\n e.preventDefault();\n const url = window.prompt(\"Link-URL:\");\n if (url) document.execCommand(\"createLink\", false, url);\n }\n }\n }}\n >\n {render(value ?? \"\")}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n /** Strapi-Feld-Pfad, z.B. \"url\" oder \"facebookUrl\". */\n path: string;\n /** Aktueller URL-Wert. */\n value: string | null | undefined;\n /** HTML-Attribute für das gerenderte <a>. */\n target?: string;\n rel?: string;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Editable Link-Wrapper. Read-Mode: ganz normales `<a href>`. Edit-Mode:\n * - `<a>` ohne href (kein Wegnavigieren bei Click)\n * - Hover zeigt kleinen orange \"Link bearbeiten\"-Button oben rechts\n * - Klick auf den Button öffnet einen mini-Prompt für die URL\n */\nexport function StrapiLink({ path, value, target, rel, className, children }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const [hover, setHover] = useState(false);\n\n if (!ctx.enabled) {\n return (\n <a href={value ?? \"#\"} target={target} rel={rel} className={className}>\n {children}\n </a>\n );\n }\n\n const handleEdit = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const next = window.prompt(\"Link-URL bearbeiten:\", value ?? \"\");\n if (next !== null && next !== value) {\n postEditChange(scope, path, \"text\", next);\n }\n };\n\n return (\n <span\n style={{ position: \"relative\", display: \"inline-block\" }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n <a\n href={value ?? \"#\"}\n target={target}\n rel={rel}\n className={className}\n onClick={(e) => { e.preventDefault(); }}\n data-pp-edit={path}\n data-pp-type=\"text\"\n >\n {children}\n </a>\n <button\n type=\"button\"\n onClick={handleEdit}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"4px 8px\",\n fontSize: 10,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n cursor: \"pointer\",\n opacity: hover ? 1 : 0,\n transition: \"opacity 0.15s ease, background 0.15s ease\",\n fontFamily: \"system-ui, sans-serif\",\n zIndex: 10,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"#FA501E\"; e.currentTarget.style.color = \"#000\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"#000\"; e.currentTarget.style.color = \"#EBC6DF\"; }}\n >\n 🔗 Link\n </button>\n </span>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -175,14 +175,14 @@ interface StrapiListProps<T> {
175
175
  */
176
176
  declare function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>): react_jsx_runtime.JSX.Element;
177
177
 
178
- interface Props$2 {
178
+ interface Props$3 {
179
179
  path: string;
180
180
  value: unknown;
181
181
  className?: string;
182
182
  }
183
- declare function StrapiBlocks({ path, value, className }: Props$2): react_jsx_runtime.JSX.Element;
183
+ declare function StrapiBlocks({ path, value, className }: Props$3): react_jsx_runtime.JSX.Element;
184
184
 
185
- interface Props$1 {
185
+ interface Props$2 {
186
186
  path: string;
187
187
  /** Markdown-Quelle aus Strapi. */
188
188
  value: string | null | undefined;
@@ -211,9 +211,9 @@ interface Props$1 {
211
211
  * className="prose"
212
212
  * />
213
213
  */
214
- declare function StrapiMarkdownField({ path, value, render, className, minRows }: Props$1): react_jsx_runtime.JSX.Element;
214
+ declare function StrapiMarkdownField({ path, value, render, className, minRows }: Props$2): react_jsx_runtime.JSX.Element;
215
215
 
216
- interface Props {
216
+ interface Props$1 {
217
217
  path: string;
218
218
  /** Markdown-Quelle aus Strapi. */
219
219
  value: string | null | undefined;
@@ -234,6 +234,25 @@ interface Props {
234
234
  * den Parent geschickt — damit die Strapi-Quelle Markdown bleibt + ohne
235
235
  * Verluste round-trippt (Headings, Listen, Links, Bold/Italic bleiben).
236
236
  */
237
- declare function StrapiRichTextField({ path, value, render, className }: Props): react_jsx_runtime.JSX.Element;
237
+ declare function StrapiRichTextField({ path, value, render, className }: Props$1): react_jsx_runtime.JSX.Element;
238
+
239
+ interface Props {
240
+ /** Strapi-Feld-Pfad, z.B. "url" oder "facebookUrl". */
241
+ path: string;
242
+ /** Aktueller URL-Wert. */
243
+ value: string | null | undefined;
244
+ /** HTML-Attribute für das gerenderte <a>. */
245
+ target?: string;
246
+ rel?: string;
247
+ className?: string;
248
+ children: ReactNode;
249
+ }
250
+ /**
251
+ * Editable Link-Wrapper. Read-Mode: ganz normales `<a href>`. Edit-Mode:
252
+ * - `<a>` ohne href (kein Wegnavigieren bei Click)
253
+ * - Hover zeigt kleinen orange "Link bearbeiten"-Button oben rechts
254
+ * - Klick auf den Button öffnet einen mini-Prompt für die URL
255
+ */
256
+ declare function StrapiLink({ path, value, target, rel, className, children }: Props): react_jsx_runtime.JSX.Element;
238
257
 
239
- export { type MsgEditChange, type MsgEditCommitRequest, type MsgEditCommitResult, type MsgEditMediaPicked, type MsgEditOpenMediaPicker, type MsgEditReady, type MsgEditReload, StrapiBlocks, StrapiContent, type StrapiEditMessage, StrapiEditModeProvider, StrapiField, type StrapiFieldType, StrapiImage, StrapiList, StrapiMarkdownField, type StrapiMediaValue, StrapiRichTextField, StrapiText, useContentScope, useStrapiEditMode };
258
+ export { type MsgEditChange, type MsgEditCommitRequest, type MsgEditCommitResult, type MsgEditMediaPicked, type MsgEditOpenMediaPicker, type MsgEditReady, type MsgEditReload, StrapiBlocks, StrapiContent, type StrapiEditMessage, StrapiEditModeProvider, StrapiField, type StrapiFieldType, StrapiImage, StrapiLink, StrapiList, StrapiMarkdownField, type StrapiMediaValue, StrapiRichTextField, StrapiText, useContentScope, useStrapiEditMode };
package/dist/index.d.ts CHANGED
@@ -175,14 +175,14 @@ interface StrapiListProps<T> {
175
175
  */
176
176
  declare function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>): react_jsx_runtime.JSX.Element;
177
177
 
178
- interface Props$2 {
178
+ interface Props$3 {
179
179
  path: string;
180
180
  value: unknown;
181
181
  className?: string;
182
182
  }
183
- declare function StrapiBlocks({ path, value, className }: Props$2): react_jsx_runtime.JSX.Element;
183
+ declare function StrapiBlocks({ path, value, className }: Props$3): react_jsx_runtime.JSX.Element;
184
184
 
185
- interface Props$1 {
185
+ interface Props$2 {
186
186
  path: string;
187
187
  /** Markdown-Quelle aus Strapi. */
188
188
  value: string | null | undefined;
@@ -211,9 +211,9 @@ interface Props$1 {
211
211
  * className="prose"
212
212
  * />
213
213
  */
214
- declare function StrapiMarkdownField({ path, value, render, className, minRows }: Props$1): react_jsx_runtime.JSX.Element;
214
+ declare function StrapiMarkdownField({ path, value, render, className, minRows }: Props$2): react_jsx_runtime.JSX.Element;
215
215
 
216
- interface Props {
216
+ interface Props$1 {
217
217
  path: string;
218
218
  /** Markdown-Quelle aus Strapi. */
219
219
  value: string | null | undefined;
@@ -234,6 +234,25 @@ interface Props {
234
234
  * den Parent geschickt — damit die Strapi-Quelle Markdown bleibt + ohne
235
235
  * Verluste round-trippt (Headings, Listen, Links, Bold/Italic bleiben).
236
236
  */
237
- declare function StrapiRichTextField({ path, value, render, className }: Props): react_jsx_runtime.JSX.Element;
237
+ declare function StrapiRichTextField({ path, value, render, className }: Props$1): react_jsx_runtime.JSX.Element;
238
+
239
+ interface Props {
240
+ /** Strapi-Feld-Pfad, z.B. "url" oder "facebookUrl". */
241
+ path: string;
242
+ /** Aktueller URL-Wert. */
243
+ value: string | null | undefined;
244
+ /** HTML-Attribute für das gerenderte <a>. */
245
+ target?: string;
246
+ rel?: string;
247
+ className?: string;
248
+ children: ReactNode;
249
+ }
250
+ /**
251
+ * Editable Link-Wrapper. Read-Mode: ganz normales `<a href>`. Edit-Mode:
252
+ * - `<a>` ohne href (kein Wegnavigieren bei Click)
253
+ * - Hover zeigt kleinen orange "Link bearbeiten"-Button oben rechts
254
+ * - Klick auf den Button öffnet einen mini-Prompt für die URL
255
+ */
256
+ declare function StrapiLink({ path, value, target, rel, className, children }: Props): react_jsx_runtime.JSX.Element;
238
257
 
239
- export { type MsgEditChange, type MsgEditCommitRequest, type MsgEditCommitResult, type MsgEditMediaPicked, type MsgEditOpenMediaPicker, type MsgEditReady, type MsgEditReload, StrapiBlocks, StrapiContent, type StrapiEditMessage, StrapiEditModeProvider, StrapiField, type StrapiFieldType, StrapiImage, StrapiList, StrapiMarkdownField, type StrapiMediaValue, StrapiRichTextField, StrapiText, useContentScope, useStrapiEditMode };
258
+ export { type MsgEditChange, type MsgEditCommitRequest, type MsgEditCommitResult, type MsgEditMediaPicked, type MsgEditOpenMediaPicker, type MsgEditReady, type MsgEditReload, StrapiBlocks, StrapiContent, type StrapiEditMessage, StrapiEditModeProvider, StrapiField, type StrapiFieldType, StrapiImage, StrapiLink, StrapiList, StrapiMarkdownField, type StrapiMediaValue, StrapiRichTextField, StrapiText, useContentScope, useStrapiEditMode };
package/dist/index.js CHANGED
@@ -641,7 +641,82 @@ function StrapiRichTextField({ path, value, render, className }) {
641
641
  }
642
642
  );
643
643
  }
644
+ function StrapiLink({ path, value, target, rel, className, children }) {
645
+ const ctx = useStrapiEditMode();
646
+ const scope = useContentScope();
647
+ const [hover, setHover] = useState(false);
648
+ if (!ctx.enabled) {
649
+ return /* @__PURE__ */ jsx("a", { href: value ?? "#", target, rel, className, children });
650
+ }
651
+ const handleEdit = (e) => {
652
+ e.preventDefault();
653
+ e.stopPropagation();
654
+ const next = window.prompt("Link-URL bearbeiten:", value ?? "");
655
+ if (next !== null && next !== value) {
656
+ postEditChange(scope, path, "text", next);
657
+ }
658
+ };
659
+ return /* @__PURE__ */ jsxs(
660
+ "span",
661
+ {
662
+ style: { position: "relative", display: "inline-block" },
663
+ onMouseEnter: () => setHover(true),
664
+ onMouseLeave: () => setHover(false),
665
+ children: [
666
+ /* @__PURE__ */ jsx(
667
+ "a",
668
+ {
669
+ href: value ?? "#",
670
+ target,
671
+ rel,
672
+ className,
673
+ onClick: (e) => {
674
+ e.preventDefault();
675
+ },
676
+ "data-pp-edit": path,
677
+ "data-pp-type": "text",
678
+ children
679
+ }
680
+ ),
681
+ /* @__PURE__ */ jsx(
682
+ "button",
683
+ {
684
+ type: "button",
685
+ onClick: handleEdit,
686
+ style: {
687
+ position: "absolute",
688
+ top: 8,
689
+ right: 8,
690
+ background: "#000",
691
+ color: "#EBC6DF",
692
+ border: "2px solid #000",
693
+ padding: "4px 8px",
694
+ fontSize: 10,
695
+ fontWeight: 700,
696
+ textTransform: "uppercase",
697
+ letterSpacing: "0.15em",
698
+ cursor: "pointer",
699
+ opacity: hover ? 1 : 0,
700
+ transition: "opacity 0.15s ease, background 0.15s ease",
701
+ fontFamily: "system-ui, sans-serif",
702
+ zIndex: 10
703
+ },
704
+ onMouseEnter: (e) => {
705
+ e.currentTarget.style.background = "#FA501E";
706
+ e.currentTarget.style.color = "#000";
707
+ },
708
+ onMouseLeave: (e) => {
709
+ e.currentTarget.style.background = "#000";
710
+ e.currentTarget.style.color = "#EBC6DF";
711
+ },
712
+ children: "\u{1F517} Link"
713
+ }
714
+ )
715
+ ]
716
+ }
717
+ );
718
+ }
644
719
 
645
- export { StrapiBlocks, StrapiContent, StrapiEditModeProvider, StrapiField, StrapiImage, StrapiList, StrapiMarkdownField, StrapiRichTextField, StrapiText, useContentScope, useStrapiEditMode };
720
+ export { StrapiBlocks, StrapiContent, StrapiEditModeProvider, StrapiField, StrapiImage, StrapiLink, StrapiList, StrapiMarkdownField, StrapiRichTextField, StrapiText, useContentScope, useStrapiEditMode };
646
721
  //# sourceMappingURL=index.js.map
647
722
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx","../src/StrapiRichTextField.tsx"],"names":["useRef","useEffect","jsx","HOVER_OUTLINE_COLOR","Fragment","inner","HOVER_OUTLINE","useState"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\nconst EDIT_SESSION_KEY = \"__pp_edit_session\";\n\n// ── Context (separat für globalen Edit-Status + Content-Scope) ──────\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n /**\n * Wert/Path-Update an Parent (mit Content-Type-Kontext aus dem nächsten StrapiContent).\n */\n publishChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\ninterface ContentScope {\n uid: string;\n kind: \"singleType\" | \"collectionType\";\n documentId?: string;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n publishChange: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nconst ContentScopeContext = createContext<ContentScope | null>(null);\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\nexport function useContentScope(): ContentScope | null {\n return useContext(ContentScopeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\n/**\n * Edit-Mode wird aktiv wenn:\n * - `?__pp_edit=1` in der URL, ODER\n * - sessionStorage `__pp_edit_session=1` gesetzt (für Navigation innerhalb der\n * Customer-Site — beim ersten Aufruf via URL wird der Flag gesetzt, danach\n * bleibt der Mode aktiv auch wenn die URL-Params bei Folge-Links fehlen).\n */\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const urlEdit = params.get(\"__pp_edit\") === \"1\";\n const sessionFlag = window.sessionStorage.getItem(EDIT_SESSION_KEY) === \"1\";\n const enabled = urlEdit || sessionFlag;\n if (urlEdit) {\n window.sessionStorage.setItem(EDIT_SESSION_KEY, \"1\");\n }\n const token = params.get(\"__pp_token\") ?? window.sessionStorage.getItem(\"__pp_edit_token\");\n if (token) window.sessionStorage.setItem(\"__pp_edit_token\", token);\n setUrlState({ enabled, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Parent → Iframe Listener (reload, media-picked)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:exit\") {\n // Parent fordert Beenden des Edit-Modus\n window.sessionStorage.removeItem(EDIT_SESSION_KEY);\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const publishChange = useCallback((_path: string, _fieldType: StrapiFieldType, _value: unknown) => {\n // Actual change-with-content-context wird im StrapiField gesendet, weil\n // ContentScope nicht hier verfügbar ist. publishChange ist legacy.\n }, []);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:open-media-picker\", path, multiple, allowedTypes, currentValue }, \"*\");\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n publishChange,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, publishChange, openMediaPicker, onMediaPicked]);\n\n return <EditModeContext.Provider value={value}>{children}</EditModeContext.Provider>;\n}\n\n// ── StrapiContent — Scope-Provider pro Seite/Section ────────────────\ninterface StrapiContentProps {\n /** Strapi-API-ID (z.B. \"impressum\", \"home\", \"event\"). */\n uid: string;\n /** \"singleType\" oder \"collectionType\". */\n kind: \"singleType\" | \"collectionType\";\n /** Bei collectionType erforderlich; bei singleType weglassen. */\n documentId?: string;\n children: React.ReactNode;\n}\n\n/**\n * Marker, der allen inneren `<StrapiField>`s die Content-Type-Identität\n * mitgibt. Ohne `<StrapiContent>` rund um Felder weiß der Parent-Editor\n * nicht, wohin er die Änderung saven soll — Felder bleiben dann inert.\n *\n * Beispiel:\n * <StrapiContent uid=\"impressum\" kind=\"singleType\">\n * <StrapiText path=\"titel\" value={data.titel} as=\"h1\" />\n * <StrapiMarkdownField path=\"content\" value={data.content} render={...} />\n * </StrapiContent>\n */\nexport function StrapiContent({ uid, kind, documentId, children }: StrapiContentProps) {\n const scope = useMemo<ContentScope>(() => ({ uid, kind, documentId }), [uid, kind, documentId]);\n return <ContentScopeContext.Provider value={scope}>{children}</ContentScopeContext.Provider>;\n}\n\n/**\n * Wird intern von StrapiField etc. genutzt um den Change ans Parent zu posten —\n * inkl. dem Content-Type aus dem nächsten `<StrapiContent>`-Wrapper.\n */\nexport function postEditChange(scope: ContentScope | null, path: string, fieldType: StrapiFieldType, value: unknown): void {\n if (typeof window === \"undefined\" || window.parent === window) return;\n if (!scope) {\n console.warn(\"[strapi-render] Feld ohne <StrapiContent>-Scope — Save wird nicht funktionieren. Wickle deine Seite mit <StrapiContent uid='...' kind='...'> ein.\");\n return;\n }\n try {\n window.parent.postMessage({\n type: \"pp:edit:change\",\n uid: scope.uid,\n kind: scope.kind,\n documentId: scope.documentId,\n path,\n fieldType,\n value,\n }, \"*\");\n } catch { /* ignore */ }\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n postEditChange(scope, path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n }\n\n return cloneElement(el, props);\n }\n\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n width?: number | string;\n height?: number | string;\n draggable?: boolean;\n priority?: boolean; // no-op, Next/Image compat\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Render-Mode: identisches HTML wie ein nativer <img>.\n *\n * Edit-Mode: derselbe <img>, aber mit Click-Handler + Hover-Outline. KEIN\n * extra Wrapper-Element — Layouts mit `position:absolute; inset:0` o.ä.\n * funktionieren exakt wie ohne SDK.\n */\nexport function StrapiImage({\n path, value, baseUrl, alt, className, style, loading = \"lazy\",\n fallback, allowedTypes, multiple = false, width, height, draggable, priority: _ignored,\n}: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n postEditChange(scope, path, \"media\", picked);\n unsubscribe();\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n cursor: \"pointer\",\n ...style,\n }}\n >\n + Bild hinzufügen\n </button>\n );\n }\n\n const editStyle: React.CSSProperties = ctx.enabled ? {\n ...style,\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n transition: \"outline-color 0.15s ease\",\n } : (style ?? {});\n\n return (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={width ?? value.width}\n height={height ?? value.height}\n loading={loading}\n className={className}\n style={editStyle}\n draggable={draggable}\n data-pp-edit={ctx.enabled ? path : undefined}\n data-pp-type={ctx.enabled ? \"media\" : undefined}\n onClick={ctx.enabled ? handleClick : undefined}\n onMouseEnter={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = HOVER_OUTLINE_COLOR;\n el.style.outlineStyle = \"solid\";\n } : undefined}\n onMouseLeave={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n } : undefined}\n />\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n postEditChange(scope, path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n postEditChange(scope, path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport TurndownService from \"turndown\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). Wird auch im Edit-Mode\n * initial gerendert — der User editiert dann direkt das ergebende HTML. */\n render: (markdown: string) => ReactNode;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * WYSIWYG-RichText.\n *\n * Read-Mode: ruft `render(value)` auf — das ist der bereits gerenderte\n * Inhalt (z.B. ReactMarkdown → HTML). Keine Modifikation.\n *\n * Edit-Mode: derselbe gerenderte HTML-Inhalt wird in einem `contentEditable`-\n * Container angezeigt. Der User editiert das HTML inline (Word-Style). Beim\n * Blur wird das HTML via Turndown wieder in Markdown zurückgewandelt und an\n * den Parent geschickt — damit die Strapi-Quelle Markdown bleibt + ohne\n * Verluste round-trippt (Headings, Listen, Links, Bold/Italic bleiben).\n */\nexport function StrapiRichTextField({ path, value, render, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const turndownRef = useRef<TurndownService | null>(null);\n const initial = useRef<string>(value ?? \"\");\n const [, force] = useState({});\n\n // Turndown initialisieren — nur client-side, nur einmal\n if (typeof window !== \"undefined\" && !turndownRef.current) {\n const td = new TurndownService({\n headingStyle: \"atx\",\n hr: \"---\",\n bulletListMarker: \"-\",\n codeBlockStyle: \"fenced\",\n emDelimiter: \"*\",\n });\n // <br> wird zu echtem Newline (statt MD-Zeilenumbruch \" \\n\")\n td.addRule(\"br\", {\n filter: \"br\",\n replacement: () => \"\\n\",\n });\n turndownRef.current = td;\n }\n\n useEffect(() => {\n initial.current = value ?? \"\";\n force({});\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"richText\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n cursor: \"text\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onBlur={(e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n if (!turndownRef.current) return;\n // HTML im Container → Markdown\n const html = el.innerHTML;\n const md = turndownRef.current.turndown(html).trim();\n if (md !== initial.current.trim()) {\n postEditChange(scope, path, \"richText\", md);\n }\n }}\n onKeyDown={(e) => {\n // Tab-Shortcuts für Bold/Italic\n if ((e.metaKey || e.ctrlKey)) {\n if (e.key === \"b\") {\n e.preventDefault();\n document.execCommand(\"bold\");\n } else if (e.key === \"i\") {\n e.preventDefault();\n document.execCommand(\"italic\");\n } else if (e.key === \"u\") {\n e.preventDefault();\n document.execCommand(\"underline\");\n } else if (e.key === \"k\") {\n e.preventDefault();\n const url = window.prompt(\"Link-URL:\");\n if (url) document.execCommand(\"createLink\", false, url);\n }\n }\n }}\n >\n {render(value ?? \"\")}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx","../src/StrapiRichTextField.tsx","../src/StrapiLink.tsx"],"names":["useRef","useEffect","jsx","HOVER_OUTLINE_COLOR","Fragment","inner","HOVER_OUTLINE","useState","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\nconst EDIT_SESSION_KEY = \"__pp_edit_session\";\n\n// ── Context (separat für globalen Edit-Status + Content-Scope) ──────\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n /**\n * Wert/Path-Update an Parent (mit Content-Type-Kontext aus dem nächsten StrapiContent).\n */\n publishChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\ninterface ContentScope {\n uid: string;\n kind: \"singleType\" | \"collectionType\";\n documentId?: string;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n publishChange: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nconst ContentScopeContext = createContext<ContentScope | null>(null);\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\nexport function useContentScope(): ContentScope | null {\n return useContext(ContentScopeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\n/**\n * Edit-Mode wird aktiv wenn:\n * - `?__pp_edit=1` in der URL, ODER\n * - sessionStorage `__pp_edit_session=1` gesetzt (für Navigation innerhalb der\n * Customer-Site — beim ersten Aufruf via URL wird der Flag gesetzt, danach\n * bleibt der Mode aktiv auch wenn die URL-Params bei Folge-Links fehlen).\n */\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const urlEdit = params.get(\"__pp_edit\") === \"1\";\n const sessionFlag = window.sessionStorage.getItem(EDIT_SESSION_KEY) === \"1\";\n const enabled = urlEdit || sessionFlag;\n if (urlEdit) {\n window.sessionStorage.setItem(EDIT_SESSION_KEY, \"1\");\n }\n const token = params.get(\"__pp_token\") ?? window.sessionStorage.getItem(\"__pp_edit_token\");\n if (token) window.sessionStorage.setItem(\"__pp_edit_token\", token);\n setUrlState({ enabled, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Parent → Iframe Listener (reload, media-picked)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:exit\") {\n // Parent fordert Beenden des Edit-Modus\n window.sessionStorage.removeItem(EDIT_SESSION_KEY);\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const publishChange = useCallback((_path: string, _fieldType: StrapiFieldType, _value: unknown) => {\n // Actual change-with-content-context wird im StrapiField gesendet, weil\n // ContentScope nicht hier verfügbar ist. publishChange ist legacy.\n }, []);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:open-media-picker\", path, multiple, allowedTypes, currentValue }, \"*\");\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n publishChange,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, publishChange, openMediaPicker, onMediaPicked]);\n\n return <EditModeContext.Provider value={value}>{children}</EditModeContext.Provider>;\n}\n\n// ── StrapiContent — Scope-Provider pro Seite/Section ────────────────\ninterface StrapiContentProps {\n /** Strapi-API-ID (z.B. \"impressum\", \"home\", \"event\"). */\n uid: string;\n /** \"singleType\" oder \"collectionType\". */\n kind: \"singleType\" | \"collectionType\";\n /** Bei collectionType erforderlich; bei singleType weglassen. */\n documentId?: string;\n children: React.ReactNode;\n}\n\n/**\n * Marker, der allen inneren `<StrapiField>`s die Content-Type-Identität\n * mitgibt. Ohne `<StrapiContent>` rund um Felder weiß der Parent-Editor\n * nicht, wohin er die Änderung saven soll — Felder bleiben dann inert.\n *\n * Beispiel:\n * <StrapiContent uid=\"impressum\" kind=\"singleType\">\n * <StrapiText path=\"titel\" value={data.titel} as=\"h1\" />\n * <StrapiMarkdownField path=\"content\" value={data.content} render={...} />\n * </StrapiContent>\n */\nexport function StrapiContent({ uid, kind, documentId, children }: StrapiContentProps) {\n const scope = useMemo<ContentScope>(() => ({ uid, kind, documentId }), [uid, kind, documentId]);\n return <ContentScopeContext.Provider value={scope}>{children}</ContentScopeContext.Provider>;\n}\n\n/**\n * Wird intern von StrapiField etc. genutzt um den Change ans Parent zu posten —\n * inkl. dem Content-Type aus dem nächsten `<StrapiContent>`-Wrapper.\n */\nexport function postEditChange(scope: ContentScope | null, path: string, fieldType: StrapiFieldType, value: unknown): void {\n if (typeof window === \"undefined\" || window.parent === window) return;\n if (!scope) {\n console.warn(\"[strapi-render] Feld ohne <StrapiContent>-Scope — Save wird nicht funktionieren. Wickle deine Seite mit <StrapiContent uid='...' kind='...'> ein.\");\n return;\n }\n try {\n window.parent.postMessage({\n type: \"pp:edit:change\",\n uid: scope.uid,\n kind: scope.kind,\n documentId: scope.documentId,\n path,\n fieldType,\n value,\n }, \"*\");\n } catch { /* ignore */ }\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n postEditChange(scope, path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n }\n\n return cloneElement(el, props);\n }\n\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n width?: number | string;\n height?: number | string;\n draggable?: boolean;\n priority?: boolean; // no-op, Next/Image compat\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Render-Mode: identisches HTML wie ein nativer <img>.\n *\n * Edit-Mode: derselbe <img>, aber mit Click-Handler + Hover-Outline. KEIN\n * extra Wrapper-Element — Layouts mit `position:absolute; inset:0` o.ä.\n * funktionieren exakt wie ohne SDK.\n */\nexport function StrapiImage({\n path, value, baseUrl, alt, className, style, loading = \"lazy\",\n fallback, allowedTypes, multiple = false, width, height, draggable, priority: _ignored,\n}: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n postEditChange(scope, path, \"media\", picked);\n unsubscribe();\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n cursor: \"pointer\",\n ...style,\n }}\n >\n + Bild hinzufügen\n </button>\n );\n }\n\n const editStyle: React.CSSProperties = ctx.enabled ? {\n ...style,\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n transition: \"outline-color 0.15s ease\",\n } : (style ?? {});\n\n return (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={width ?? value.width}\n height={height ?? value.height}\n loading={loading}\n className={className}\n style={editStyle}\n draggable={draggable}\n data-pp-edit={ctx.enabled ? path : undefined}\n data-pp-type={ctx.enabled ? \"media\" : undefined}\n onClick={ctx.enabled ? handleClick : undefined}\n onMouseEnter={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = HOVER_OUTLINE_COLOR;\n el.style.outlineStyle = \"solid\";\n } : undefined}\n onMouseLeave={ctx.enabled ? (e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n } : undefined}\n />\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n postEditChange(scope, path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n postEditChange(scope, path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport TurndownService from \"turndown\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). Wird auch im Edit-Mode\n * initial gerendert — der User editiert dann direkt das ergebende HTML. */\n render: (markdown: string) => ReactNode;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * WYSIWYG-RichText.\n *\n * Read-Mode: ruft `render(value)` auf — das ist der bereits gerenderte\n * Inhalt (z.B. ReactMarkdown → HTML). Keine Modifikation.\n *\n * Edit-Mode: derselbe gerenderte HTML-Inhalt wird in einem `contentEditable`-\n * Container angezeigt. Der User editiert das HTML inline (Word-Style). Beim\n * Blur wird das HTML via Turndown wieder in Markdown zurückgewandelt und an\n * den Parent geschickt — damit die Strapi-Quelle Markdown bleibt + ohne\n * Verluste round-trippt (Headings, Listen, Links, Bold/Italic bleiben).\n */\nexport function StrapiRichTextField({ path, value, render, className }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const containerRef = useRef<HTMLDivElement>(null);\n const turndownRef = useRef<TurndownService | null>(null);\n const initial = useRef<string>(value ?? \"\");\n const [, force] = useState({});\n\n // Turndown initialisieren — nur client-side, nur einmal\n if (typeof window !== \"undefined\" && !turndownRef.current) {\n const td = new TurndownService({\n headingStyle: \"atx\",\n hr: \"---\",\n bulletListMarker: \"-\",\n codeBlockStyle: \"fenced\",\n emDelimiter: \"*\",\n });\n // <br> wird zu echtem Newline (statt MD-Zeilenumbruch \" \\n\")\n td.addRule(\"br\", {\n filter: \"br\",\n replacement: () => \"\\n\",\n });\n turndownRef.current = td;\n }\n\n useEffect(() => {\n initial.current = value ?? \"\";\n force({});\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"richText\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n cursor: \"text\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onBlur={(e) => {\n const el = e.currentTarget as HTMLElement;\n el.style.outlineColor = \"transparent\";\n el.style.outlineStyle = \"dashed\";\n if (!turndownRef.current) return;\n // HTML im Container → Markdown\n const html = el.innerHTML;\n const md = turndownRef.current.turndown(html).trim();\n if (md !== initial.current.trim()) {\n postEditChange(scope, path, \"richText\", md);\n }\n }}\n onKeyDown={(e) => {\n // Tab-Shortcuts für Bold/Italic\n if ((e.metaKey || e.ctrlKey)) {\n if (e.key === \"b\") {\n e.preventDefault();\n document.execCommand(\"bold\");\n } else if (e.key === \"i\") {\n e.preventDefault();\n document.execCommand(\"italic\");\n } else if (e.key === \"u\") {\n e.preventDefault();\n document.execCommand(\"underline\");\n } else if (e.key === \"k\") {\n e.preventDefault();\n const url = window.prompt(\"Link-URL:\");\n if (url) document.execCommand(\"createLink\", false, url);\n }\n }\n }}\n >\n {render(value ?? \"\")}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { postEditChange, useContentScope, useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n /** Strapi-Feld-Pfad, z.B. \"url\" oder \"facebookUrl\". */\n path: string;\n /** Aktueller URL-Wert. */\n value: string | null | undefined;\n /** HTML-Attribute für das gerenderte <a>. */\n target?: string;\n rel?: string;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Editable Link-Wrapper. Read-Mode: ganz normales `<a href>`. Edit-Mode:\n * - `<a>` ohne href (kein Wegnavigieren bei Click)\n * - Hover zeigt kleinen orange \"Link bearbeiten\"-Button oben rechts\n * - Klick auf den Button öffnet einen mini-Prompt für die URL\n */\nexport function StrapiLink({ path, value, target, rel, className, children }: Props) {\n const ctx = useStrapiEditMode();\n const scope = useContentScope();\n const [hover, setHover] = useState(false);\n\n if (!ctx.enabled) {\n return (\n <a href={value ?? \"#\"} target={target} rel={rel} className={className}>\n {children}\n </a>\n );\n }\n\n const handleEdit = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const next = window.prompt(\"Link-URL bearbeiten:\", value ?? \"\");\n if (next !== null && next !== value) {\n postEditChange(scope, path, \"text\", next);\n }\n };\n\n return (\n <span\n style={{ position: \"relative\", display: \"inline-block\" }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n <a\n href={value ?? \"#\"}\n target={target}\n rel={rel}\n className={className}\n onClick={(e) => { e.preventDefault(); }}\n data-pp-edit={path}\n data-pp-type=\"text\"\n >\n {children}\n </a>\n <button\n type=\"button\"\n onClick={handleEdit}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"4px 8px\",\n fontSize: 10,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n cursor: \"pointer\",\n opacity: hover ? 1 : 0,\n transition: \"opacity 0.15s ease, background 0.15s ease\",\n fontFamily: \"system-ui, sans-serif\",\n zIndex: 10,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"#FA501E\"; e.currentTarget.style.color = \"#000\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"#000\"; e.currentTarget.style.color = \"#EBC6DF\"; }}\n >\n 🔗 Link\n </button>\n </span>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paulpaulstudio/strapi-render",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "React SDK für Strapi-Frontends mit onpage-edit-Support über cms.paulpaul.studio.",
5
5
  "keywords": ["strapi", "cms", "onpage", "edit", "react"],
6
6
  "author": "Paul & Paul Studio <info@paulpaul.studio>",