@tecof/theme-editor 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +29 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -37
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -252,35 +252,36 @@ var TecofEditor = ({
|
|
|
252
252
|
window.addEventListener("message", onMessage);
|
|
253
253
|
return () => window.removeEventListener("message", onMessage);
|
|
254
254
|
}, [isEmbedded, handleSaveDraft]);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
(
|
|
258
|
-
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
item = appState?.data?.content?.[index];
|
|
269
|
-
} else {
|
|
270
|
-
item = appState?.data?.zones?.[zone]?.[index];
|
|
255
|
+
react.useEffect(() => {
|
|
256
|
+
if (!isEmbedded) return;
|
|
257
|
+
const handleClick = (e) => {
|
|
258
|
+
const target = e.target;
|
|
259
|
+
const puckComponent = target.closest("[data-puck-component]");
|
|
260
|
+
if (puckComponent) {
|
|
261
|
+
const componentType = puckComponent.getAttribute("data-puck-component");
|
|
262
|
+
const draggableId = puckComponent.closest("[data-rfd-draggable-id]")?.getAttribute("data-rfd-draggable-id");
|
|
263
|
+
window.parent.postMessage({
|
|
264
|
+
type: "puck:itemSelected",
|
|
265
|
+
item: {
|
|
266
|
+
type: componentType,
|
|
267
|
+
id: draggableId || null
|
|
271
268
|
}
|
|
272
|
-
|
|
273
|
-
type: "puck:itemSelected",
|
|
274
|
-
selector,
|
|
275
|
-
item: item ? { type: item.type, id: item.props?.id } : null
|
|
276
|
-
}, "*");
|
|
277
|
-
} else {
|
|
278
|
-
window.parent.postMessage({ type: "puck:itemDeselected" }, "*");
|
|
279
|
-
}
|
|
269
|
+
}, "*");
|
|
280
270
|
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
|
|
271
|
+
};
|
|
272
|
+
const handleDeselect = (e) => {
|
|
273
|
+
const target = e.target;
|
|
274
|
+
if (!target.closest("[data-puck-component]")) {
|
|
275
|
+
window.parent.postMessage({ type: "puck:itemDeselected" }, "*");
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
document.addEventListener("click", handleClick, true);
|
|
279
|
+
document.addEventListener("click", handleDeselect, false);
|
|
280
|
+
return () => {
|
|
281
|
+
document.removeEventListener("click", handleClick, true);
|
|
282
|
+
document.removeEventListener("click", handleDeselect, false);
|
|
283
|
+
};
|
|
284
|
+
}, [isEmbedded]);
|
|
284
285
|
if (loading || !initialData) {
|
|
285
286
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: editorStyles.loading, className, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: editorStyles.loadingInner, children: [
|
|
286
287
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: editorStyles.spinner }),
|
|
@@ -300,16 +301,7 @@ var TecofEditor = ({
|
|
|
300
301
|
config,
|
|
301
302
|
data: initialData,
|
|
302
303
|
onPublish: handlePuckPublish,
|
|
303
|
-
onChange:
|
|
304
|
-
handleChange(data);
|
|
305
|
-
setTimeout(() => {
|
|
306
|
-
try {
|
|
307
|
-
const puckState = document.querySelector("[data-puck-component]")?.__puckAppState;
|
|
308
|
-
if (puckState) handleItemSelect(puckState);
|
|
309
|
-
} catch {
|
|
310
|
-
}
|
|
311
|
-
}, 50);
|
|
312
|
-
},
|
|
304
|
+
onChange: handleChange,
|
|
313
305
|
overrides: mergedOverrides
|
|
314
306
|
}
|
|
315
307
|
),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts","../src/components/TecofProvider.tsx","../src/components/styles.ts","../src/components/TecofEditor.tsx","../src/components/TecofRender.tsx","../src/utils/index.ts"],"names":["createContext","useMemo","jsx","useContext","useState","useRef","useEffect","useCallback","jsxs","fieldsPlugin","Fragment","Puck","Render"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiResponse, PuckPageData, PageApiData } from './types';\n\n/**\n * Tecof API Client — handles communication with the Tecof backend\n * for page CRUD operations using merchant secret key.\n *\n * Endpoints:\n * - GET /api/store/editor/:id → get page by ID\n * - PUT /api/store/editor/:id → save page by ID\n */\nexport class TecofApiClient {\n private apiUrl: string;\n private secretKey: string;\n\n constructor(apiUrl: string, secretKey: string) {\n // Remove trailing slash\n this.apiUrl = apiUrl.replace(/\\/+$/, '');\n this.secretKey = secretKey;\n }\n\n private get headers(): Record<string, string> {\n return {\n 'x-secret-key': this.secretKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Fetch a page by ID (for the editor)\n */\n async getPage(pageId: string): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'GET',\n headers: this.headers,\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch page',\n };\n }\n }\n\n /**\n * Save a page by ID\n */\n async savePage(\n pageId: string,\n puckData: PuckPageData,\n title?: string,\n accessToken?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'PUT',\n headers: {\n ...this.headers,\n ...(accessToken && { Authorization: accessToken }),\n },\n body: JSON.stringify({ puckData, ...(title && { title }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to save page',\n };\n }\n }\n\n /**\n * Fetch a published page by slug + locale (for rendering)\n */\n async getPublishedPage(\n slug: string,\n locale?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/render`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify({ slug, ...(locale && { locale }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch published page',\n };\n }\n }\n}\n\nexport default TecofApiClient;","import { createContext, useContext, useMemo } from 'react';\nimport { TecofApiClient } from '../api';\nimport type { TecofProviderProps } from '../types';\n\n/* ─── Context ─── */\n\ninterface TecofContextValue {\n apiClient: TecofApiClient;\n secretKey: string;\n apiUrl: string;\n}\n\nconst TecofContext = createContext<TecofContextValue | null>(null);\n\n/* ─── Provider ─── */\n\nexport const TecofProvider = ({ apiUrl, secretKey, children }: TecofProviderProps) => {\n const value = useMemo<TecofContextValue>(\n () => ({\n apiClient: new TecofApiClient(apiUrl, secretKey),\n secretKey,\n apiUrl,\n }),\n [apiUrl, secretKey]\n );\n\n return <TecofContext.Provider value={value}>{children}</TecofContext.Provider>;\n};\n\n/* ─── Hook ─── */\n\nexport function useTecof(): TecofContextValue {\n const ctx = useContext(TecofContext);\n if (!ctx) {\n throw new Error('useTecof must be used within a <TecofProvider>');\n }\n return ctx;\n}\n\nexport default TecofProvider;\n","/**\n * Scoped styles for TecofEditor — inlined to avoid CSS module build issues.\n * These are internal styles, not exposed to consumers.\n */\nexport const editorStyles = {\n wrapper: {\n position: 'relative' as const,\n width: '100%',\n height: '100%',\n },\n loading: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n background: '#fafafa',\n },\n loadingInner: {\n textAlign: 'center' as const,\n },\n loadingText: {\n fontSize: '14px',\n color: '#71717a',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n error: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '200px',\n padding: '24px',\n fontSize: '14px',\n color: '#ef4444',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n saveIndicator: {\n position: 'fixed' as const,\n bottom: '20px',\n right: '20px',\n padding: '8px 16px',\n background: '#18181b',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 500,\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n zIndex: 9999,\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n spinner: {\n width: '40px',\n height: '40px',\n border: '3px solid #e4e4e7',\n borderTopColor: '#18181b',\n borderRadius: '50%',\n margin: '0 auto 12px',\n animation: 'tecof-spin 0.7s linear infinite',\n },\n} as const;\n\n/** Spinner keyframes — injected once into the document */\nlet keyframesInjected = false;\nexport const injectKeyframes = () => {\n if (keyframesInjected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = `@keyframes tecof-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n keyframesInjected = true;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Puck, fieldsPlugin, type Data, type Config } from '@puckeditor/core';\nimport { useTecof } from './TecofProvider';\nimport { editorStyles, injectKeyframes } from './styles';\nimport type { TecofEditorProps, PuckPageData } from '../types';\n\nconst EMPTY_PAGE: PuckPageData = { content: [], root: { props: {} }, zones: {} };\n\n/**\n * TecofEditor — Puck CMS page editor.\n *\n * - Fetches page by ID via secretKey auth\n * - Saves draft via API (taslak kaydet)\n * - Supports iframe postMessage:\n * - puck:save → triggers draft save\n * - puck:undo → undo\n * - puck:redo → redo\n * - puck:viewport → resize preview\n * - Sends to parent:\n * - puck:saved → draft saved successfully\n * - puck:changed → data changed\n * - puck:itemSelected → item selected { item, id }\n *\n * Requires `<TecofProvider>` ancestor for API client.\n */\nexport const TecofEditor = ({\n pageId,\n config,\n accessToken,\n onSave,\n onChange,\n overrides,\n plugins: extraPlugins,\n className,\n}: TecofEditorProps) => {\n const { apiClient } = useTecof();\n\n const [initialData, setInitialData] = useState<PuckPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const puckDataRef = useRef<Data | null>(null);\n const isEmbedded = typeof window !== 'undefined' && window.parent !== window;\n\n // Inject spinner keyframes once\n useEffect(() => { injectKeyframes(); }, []);\n\n /* ── Fetch page ── */\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n const res = await apiClient.getPage(pageId);\n if (cancelled) return;\n const data = res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE;\n setInitialData(data);\n puckDataRef.current = data as unknown as Data;\n setLoading(false);\n };\n load();\n return () => { cancelled = true; };\n }, [pageId, apiClient]);\n\n /* ── Save Draft (Taslak Kaydet) ── */\n const handleSaveDraft = useCallback(\n async (data?: Data) => {\n const currentData = data || puckDataRef.current;\n if (!currentData) return;\n\n const puckData = currentData as unknown as PuckPageData;\n setSaving(true);\n setSaveStatus('idle');\n\n const res = await apiClient.savePage(pageId, puckData, undefined, accessToken);\n\n if (res.success) {\n setSaveStatus('success');\n setTimeout(() => setSaveStatus('idle'), 3000);\n onSave?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saved' }, '*');\n } else {\n setSaveStatus('error');\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saveError', message: res.message }, '*');\n }\n\n setSaving(false);\n },\n [pageId, apiClient, isEmbedded, onSave, accessToken]\n );\n\n /* ── Change ── */\n const handleChange = useCallback(\n (data: Data) => {\n puckDataRef.current = data;\n const puckData = data as unknown as PuckPageData;\n onChange?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:changed' }, '*');\n },\n [onChange, isEmbedded]\n );\n\n /* ── Puck onPublish — used as save trigger ── */\n const handlePuckPublish = useCallback(\n (data: Data) => {\n handleSaveDraft(data);\n },\n [handleSaveDraft]\n );\n\n /* ── iframe postMessage listener ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const onMessage = (e: MessageEvent) => {\n switch (e.data?.type) {\n case 'puck:save': {\n handleSaveDraft();\n break;\n }\n case 'puck:undo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, bubbles: true }));\n break;\n case 'puck:redo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, shiftKey: true, bubbles: true }));\n break;\n case 'puck:viewport': {\n const frame = document.querySelector('[data-testid=\"puck-frame\"]') as HTMLElement;\n if (frame) {\n const w = e.data.width || '100%';\n frame.style.maxWidth = w;\n frame.style.margin = w === '100%' ? '0' : '0 auto';\n frame.style.transition = 'max-width 0.3s ease';\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, [isEmbedded, handleSaveDraft]);\n\n /* ── Track item selection and notify parent ── */\n const lastSelectedRef = useRef<string | null>(null);\n const handleItemSelect = useCallback(\n (appState: any) => {\n if (!isEmbedded) return;\n const selector = appState?.ui?.itemSelector;\n const selectorKey = selector ? JSON.stringify(selector) : null;\n\n if (selectorKey !== lastSelectedRef.current) {\n lastSelectedRef.current = selectorKey;\n\n if (selector) {\n // Find the selected item from content\n const zone = selector.zone || 'default-zone';\n const index = selector.index;\n let item = null;\n\n if (zone === 'default-zone' || !zone) {\n item = appState?.data?.content?.[index];\n } else {\n item = appState?.data?.zones?.[zone]?.[index];\n }\n\n window.parent.postMessage({\n type: 'puck:itemSelected',\n selector,\n item: item ? { type: item.type, id: item.props?.id } : null\n }, '*');\n } else {\n window.parent.postMessage({ type: 'puck:itemDeselected' }, '*');\n }\n }\n },\n [isEmbedded]\n );\n\n /* ── Loading ── */\n if (loading || !initialData) {\n return (\n <div style={editorStyles.loading} className={className}>\n <div style={editorStyles.loadingInner}>\n <div style={editorStyles.spinner} />\n <p style={editorStyles.loadingText}>Loading editor...</p>\n </div>\n </div>\n );\n }\n\n /* ── Plugins & Overrides ── */\n const plugins = [\n ...(fieldsPlugin ? [fieldsPlugin({ desktopSideBar: 'left' })] : []),\n ...(extraPlugins || []),\n ];\n\n const mergedOverrides = { header: () => <></>, ...(overrides || {}) };\n\n return (\n <div style={editorStyles.wrapper} className={className}>\n <Puck\n plugins={plugins}\n config={config as Config}\n data={initialData}\n onPublish={handlePuckPublish}\n onChange={(data: Data) => {\n handleChange(data);\n // Puck appState extraction via internal state\n // We use a setTimeout to let Puck update its state first\n setTimeout(() => {\n try {\n const puckState = (document.querySelector('[data-puck-component]') as any)?.__puckAppState;\n if (puckState) handleItemSelect(puckState);\n } catch { /* ignore */ }\n }, 50);\n }}\n overrides={mergedOverrides}\n />\n {saving && (\n <div style={editorStyles.saveIndicator}>\n {saveStatus === 'error' ? 'Save failed' : 'Saving...'}\n </div>\n )}\n </div>\n );\n};\n\nexport default TecofEditor;","import { Render, type Config } from '@puckeditor/core';\nimport type { TecofRenderProps } from '../types';\n\n/**\n * TecofRender — Puck page renderer.\n *\n * Pass `data` (PuckPageData) and `config` (Puck Config) directly.\n * No API fetch, no provider required.\n */\nexport const TecofRender = ({ data, config, className }: TecofRenderProps) => {\n if (!data) return null;\n\n return (\n <div className={className}>\n <Render config={config as Config} data={data} />\n </div>\n );\n};\n\nexport default TecofRender;\n","import type { ThemeConfig, HSL } from '../types';\n\n/* ─── Color Converters ─── */\n\nexport function hexToHsl(hex: string): HSL {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return { h: 0, s: 0, l: 0 };\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sNorm = s / 100;\n const lNorm = l / 100;\n const a = sNorm * Math.min(lNorm, 1 - lNorm);\n\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = lNorm - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n/* ─── Color Manipulation ─── */\n\nexport function lighten(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.min(100, l + amount));\n}\n\nexport function darken(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.max(0, l - amount));\n}\n\n/* ─── CSS Variable Generation ─── */\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const lines: string[] = [':root {'];\n\n // Colors\n for (const [key, value] of Object.entries(theme.colors)) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n lines.push(` --theme-color-${cssKey}: ${value};`);\n }\n\n // Typography\n lines.push(` --theme-font-family: ${theme.typography.fontFamily};`);\n lines.push(` --theme-heading-font-family: ${theme.typography.headingFontFamily};`);\n lines.push(` --theme-font-size-base: ${theme.typography.baseFontSize}px;`);\n lines.push(` --theme-line-height: ${theme.typography.lineHeight};`);\n lines.push(` --theme-font-weight-normal: ${theme.typography.fontWeightNormal};`);\n lines.push(` --theme-font-weight-medium: ${theme.typography.fontWeightMedium};`);\n lines.push(` --theme-font-weight-bold: ${theme.typography.fontWeightBold};`);\n\n for (const [level, scale] of Object.entries(theme.typography.headingScale)) {\n lines.push(` --theme-heading-${level}: ${scale}rem;`);\n }\n\n // Spacing\n lines.push(` --theme-container-max-width: ${theme.spacing.containerMaxWidth}px;`);\n lines.push(` --theme-section-padding-y: ${theme.spacing.sectionPaddingY}px;`);\n lines.push(` --theme-section-padding-x: ${theme.spacing.sectionPaddingX}px;`);\n lines.push(` --theme-component-gap: ${theme.spacing.componentGap}px;`);\n lines.push(` --theme-border-radius: ${theme.spacing.borderRadius}px;`);\n lines.push(` --theme-border-radius-lg: ${theme.spacing.borderRadiusLg}px;`);\n lines.push(` --theme-border-radius-sm: ${theme.spacing.borderRadiusSm}px;`);\n\n // Custom tokens\n if (theme.customTokens) {\n for (const [key, value] of Object.entries(theme.customTokens)) {\n lines.push(` --theme-${key}: ${value};`);\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/* ─── Default Theme ─── */\n\nexport function getDefaultTheme(): ThemeConfig {\n return {\n colors: {\n primary: '#18181b',\n secondary: '#f4f4f5',\n accent: '#3b82f6',\n background: '#ffffff',\n foreground: '#09090b',\n muted: '#f4f4f5',\n mutedForeground: '#71717a',\n border: '#e4e4e7',\n card: '#ffffff',\n cardForeground: '#09090b',\n destructive: '#ef4444',\n },\n typography: {\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n headingFontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n baseFontSize: 16,\n lineHeight: 1.6,\n headingScale: {\n h1: 3,\n h2: 2.25,\n h3: 1.875,\n h4: 1.5,\n h5: 1.25,\n h6: 1,\n },\n fontWeightNormal: 400,\n fontWeightMedium: 500,\n fontWeightBold: 700,\n },\n spacing: {\n containerMaxWidth: 1280,\n sectionPaddingY: 80,\n sectionPaddingX: 24,\n componentGap: 24,\n borderRadius: 8,\n borderRadiusLg: 12,\n borderRadiusSm: 4,\n },\n };\n}\n\n/* ─── Deep Merge ─── */\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n return Boolean(item && typeof item === 'object' && !Array.isArray(item));\n}\n\nexport function mergeTheme(base: ThemeConfig, overrides: Partial<ThemeConfig>): ThemeConfig {\n const result: ThemeConfig = {\n colors: { ...base.colors, ...(overrides.colors ?? {}) },\n typography: { ...base.typography, ...(overrides.typography ?? {}) },\n spacing: { ...base.spacing, ...(overrides.spacing ?? {}) },\n customTokens: { ...(base.customTokens ?? {}), ...(overrides.customTokens ?? {}) },\n };\n\n // Deep-merge headingScale if provided\n if (overrides.typography?.headingScale) {\n result.typography.headingScale = {\n ...base.typography.headingScale,\n ...overrides.typography.headingScale,\n };\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api.ts","../src/components/TecofProvider.tsx","../src/components/styles.ts","../src/components/TecofEditor.tsx","../src/components/TecofRender.tsx","../src/utils/index.ts"],"names":["createContext","useMemo","jsx","useContext","useState","useRef","useEffect","useCallback","jsxs","fieldsPlugin","Fragment","Puck","Render"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiResponse, PuckPageData, PageApiData } from './types';\n\n/**\n * Tecof API Client — handles communication with the Tecof backend\n * for page CRUD operations using merchant secret key.\n *\n * Endpoints:\n * - GET /api/store/editor/:id → get page by ID\n * - PUT /api/store/editor/:id → save page by ID\n */\nexport class TecofApiClient {\n private apiUrl: string;\n private secretKey: string;\n\n constructor(apiUrl: string, secretKey: string) {\n // Remove trailing slash\n this.apiUrl = apiUrl.replace(/\\/+$/, '');\n this.secretKey = secretKey;\n }\n\n private get headers(): Record<string, string> {\n return {\n 'x-secret-key': this.secretKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Fetch a page by ID (for the editor)\n */\n async getPage(pageId: string): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'GET',\n headers: this.headers,\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch page',\n };\n }\n }\n\n /**\n * Save a page by ID\n */\n async savePage(\n pageId: string,\n puckData: PuckPageData,\n title?: string,\n accessToken?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'PUT',\n headers: {\n ...this.headers,\n ...(accessToken && { Authorization: accessToken }),\n },\n body: JSON.stringify({ puckData, ...(title && { title }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to save page',\n };\n }\n }\n\n /**\n * Fetch a published page by slug + locale (for rendering)\n */\n async getPublishedPage(\n slug: string,\n locale?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/render`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify({ slug, ...(locale && { locale }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch published page',\n };\n }\n }\n}\n\nexport default TecofApiClient;","import { createContext, useContext, useMemo } from 'react';\nimport { TecofApiClient } from '../api';\nimport type { TecofProviderProps } from '../types';\n\n/* ─── Context ─── */\n\ninterface TecofContextValue {\n apiClient: TecofApiClient;\n secretKey: string;\n apiUrl: string;\n}\n\nconst TecofContext = createContext<TecofContextValue | null>(null);\n\n/* ─── Provider ─── */\n\nexport const TecofProvider = ({ apiUrl, secretKey, children }: TecofProviderProps) => {\n const value = useMemo<TecofContextValue>(\n () => ({\n apiClient: new TecofApiClient(apiUrl, secretKey),\n secretKey,\n apiUrl,\n }),\n [apiUrl, secretKey]\n );\n\n return <TecofContext.Provider value={value}>{children}</TecofContext.Provider>;\n};\n\n/* ─── Hook ─── */\n\nexport function useTecof(): TecofContextValue {\n const ctx = useContext(TecofContext);\n if (!ctx) {\n throw new Error('useTecof must be used within a <TecofProvider>');\n }\n return ctx;\n}\n\nexport default TecofProvider;\n","/**\n * Scoped styles for TecofEditor — inlined to avoid CSS module build issues.\n * These are internal styles, not exposed to consumers.\n */\nexport const editorStyles = {\n wrapper: {\n position: 'relative' as const,\n width: '100%',\n height: '100%',\n },\n loading: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n background: '#fafafa',\n },\n loadingInner: {\n textAlign: 'center' as const,\n },\n loadingText: {\n fontSize: '14px',\n color: '#71717a',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n error: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '200px',\n padding: '24px',\n fontSize: '14px',\n color: '#ef4444',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n saveIndicator: {\n position: 'fixed' as const,\n bottom: '20px',\n right: '20px',\n padding: '8px 16px',\n background: '#18181b',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 500,\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n zIndex: 9999,\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n spinner: {\n width: '40px',\n height: '40px',\n border: '3px solid #e4e4e7',\n borderTopColor: '#18181b',\n borderRadius: '50%',\n margin: '0 auto 12px',\n animation: 'tecof-spin 0.7s linear infinite',\n },\n} as const;\n\n/** Spinner keyframes — injected once into the document */\nlet keyframesInjected = false;\nexport const injectKeyframes = () => {\n if (keyframesInjected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = `@keyframes tecof-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n keyframesInjected = true;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Puck, fieldsPlugin, type Data, type Config } from '@puckeditor/core';\nimport { useTecof } from './TecofProvider';\nimport { editorStyles, injectKeyframes } from './styles';\nimport type { TecofEditorProps, PuckPageData } from '../types';\n\nconst EMPTY_PAGE: PuckPageData = { content: [], root: { props: {} }, zones: {} };\n\n/**\n * TecofEditor — Puck CMS page editor.\n *\n * - Fetches page by ID via secretKey auth\n * - Saves draft via API (taslak kaydet)\n * - Supports iframe postMessage:\n * - puck:save → triggers draft save\n * - puck:undo → undo\n * - puck:redo → redo\n * - puck:viewport → resize preview\n * - Sends to parent:\n * - puck:saved → draft saved successfully\n * - puck:changed → data changed\n * - puck:itemSelected → item selected { item, id }\n *\n * Requires `<TecofProvider>` ancestor for API client.\n */\nexport const TecofEditor = ({\n pageId,\n config,\n accessToken,\n onSave,\n onChange,\n overrides,\n plugins: extraPlugins,\n className,\n}: TecofEditorProps) => {\n const { apiClient } = useTecof();\n\n const [initialData, setInitialData] = useState<PuckPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const puckDataRef = useRef<Data | null>(null);\n const isEmbedded = typeof window !== 'undefined' && window.parent !== window;\n\n // Inject spinner keyframes once\n useEffect(() => { injectKeyframes(); }, []);\n\n /* ── Fetch page ── */\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n const res = await apiClient.getPage(pageId);\n if (cancelled) return;\n const data = res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE;\n setInitialData(data);\n puckDataRef.current = data as unknown as Data;\n setLoading(false);\n };\n load();\n return () => { cancelled = true; };\n }, [pageId, apiClient]);\n\n /* ── Save Draft (Taslak Kaydet) ── */\n const handleSaveDraft = useCallback(\n async (data?: Data) => {\n const currentData = data || puckDataRef.current;\n if (!currentData) return;\n\n const puckData = currentData as unknown as PuckPageData;\n setSaving(true);\n setSaveStatus('idle');\n\n const res = await apiClient.savePage(pageId, puckData, undefined, accessToken);\n\n if (res.success) {\n setSaveStatus('success');\n setTimeout(() => setSaveStatus('idle'), 3000);\n onSave?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saved' }, '*');\n } else {\n setSaveStatus('error');\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saveError', message: res.message }, '*');\n }\n\n setSaving(false);\n },\n [pageId, apiClient, isEmbedded, onSave, accessToken]\n );\n\n /* ── Change ── */\n const handleChange = useCallback(\n (data: Data) => {\n puckDataRef.current = data;\n const puckData = data as unknown as PuckPageData;\n onChange?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:changed' }, '*');\n },\n [onChange, isEmbedded]\n );\n\n /* ── Puck onPublish — used as save trigger ── */\n const handlePuckPublish = useCallback(\n (data: Data) => {\n handleSaveDraft(data);\n },\n [handleSaveDraft]\n );\n\n /* ── iframe postMessage listener ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const onMessage = (e: MessageEvent) => {\n switch (e.data?.type) {\n case 'puck:save': {\n handleSaveDraft();\n break;\n }\n case 'puck:undo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, bubbles: true }));\n break;\n case 'puck:redo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, shiftKey: true, bubbles: true }));\n break;\n case 'puck:viewport': {\n const frame = document.querySelector('[data-testid=\"puck-frame\"]') as HTMLElement;\n if (frame) {\n const w = e.data.width || '100%';\n frame.style.maxWidth = w;\n frame.style.margin = w === '100%' ? '0' : '0 auto';\n frame.style.transition = 'max-width 0.3s ease';\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, [isEmbedded, handleSaveDraft]);\n\n /* ── Track item selection via click delegation ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Walk up to find closest puck component\n const puckComponent = target.closest('[data-puck-component]') as HTMLElement;\n\n if (puckComponent) {\n const componentType = puckComponent.getAttribute('data-puck-component');\n const draggableId = puckComponent.closest('[data-rfd-draggable-id]')?.getAttribute('data-rfd-draggable-id');\n\n window.parent.postMessage({\n type: 'puck:itemSelected',\n item: {\n type: componentType,\n id: draggableId || null\n }\n }, '*');\n }\n };\n\n // Detect deselection: click on empty area\n const handleDeselect = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target.closest('[data-puck-component]')) {\n window.parent.postMessage({ type: 'puck:itemDeselected' }, '*');\n }\n };\n\n document.addEventListener('click', handleClick, true);\n document.addEventListener('click', handleDeselect, false);\n\n return () => {\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('click', handleDeselect, false);\n };\n }, [isEmbedded]);\n\n /* ── Loading ── */\n if (loading || !initialData) {\n return (\n <div style={editorStyles.loading} className={className}>\n <div style={editorStyles.loadingInner}>\n <div style={editorStyles.spinner} />\n <p style={editorStyles.loadingText}>Loading editor...</p>\n </div>\n </div>\n );\n }\n\n /* ── Plugins & Overrides ── */\n const plugins = [\n ...(fieldsPlugin ? [fieldsPlugin({ desktopSideBar: 'left' })] : []),\n ...(extraPlugins || []),\n ];\n\n const mergedOverrides = { header: () => <></>, ...(overrides || {}) };\n\n return (\n <div style={editorStyles.wrapper} className={className}>\n <Puck\n plugins={plugins}\n config={config as Config}\n data={initialData}\n onPublish={handlePuckPublish}\n onChange={handleChange}\n overrides={mergedOverrides}\n />\n {saving && (\n <div style={editorStyles.saveIndicator}>\n {saveStatus === 'error' ? 'Save failed' : 'Saving...'}\n </div>\n )}\n </div>\n );\n};\n\nexport default TecofEditor;","import { Render, type Config } from '@puckeditor/core';\nimport type { TecofRenderProps } from '../types';\n\n/**\n * TecofRender — Puck page renderer.\n *\n * Pass `data` (PuckPageData) and `config` (Puck Config) directly.\n * No API fetch, no provider required.\n */\nexport const TecofRender = ({ data, config, className }: TecofRenderProps) => {\n if (!data) return null;\n\n return (\n <div className={className}>\n <Render config={config as Config} data={data} />\n </div>\n );\n};\n\nexport default TecofRender;\n","import type { ThemeConfig, HSL } from '../types';\n\n/* ─── Color Converters ─── */\n\nexport function hexToHsl(hex: string): HSL {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return { h: 0, s: 0, l: 0 };\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sNorm = s / 100;\n const lNorm = l / 100;\n const a = sNorm * Math.min(lNorm, 1 - lNorm);\n\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = lNorm - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n/* ─── Color Manipulation ─── */\n\nexport function lighten(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.min(100, l + amount));\n}\n\nexport function darken(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.max(0, l - amount));\n}\n\n/* ─── CSS Variable Generation ─── */\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const lines: string[] = [':root {'];\n\n // Colors\n for (const [key, value] of Object.entries(theme.colors)) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n lines.push(` --theme-color-${cssKey}: ${value};`);\n }\n\n // Typography\n lines.push(` --theme-font-family: ${theme.typography.fontFamily};`);\n lines.push(` --theme-heading-font-family: ${theme.typography.headingFontFamily};`);\n lines.push(` --theme-font-size-base: ${theme.typography.baseFontSize}px;`);\n lines.push(` --theme-line-height: ${theme.typography.lineHeight};`);\n lines.push(` --theme-font-weight-normal: ${theme.typography.fontWeightNormal};`);\n lines.push(` --theme-font-weight-medium: ${theme.typography.fontWeightMedium};`);\n lines.push(` --theme-font-weight-bold: ${theme.typography.fontWeightBold};`);\n\n for (const [level, scale] of Object.entries(theme.typography.headingScale)) {\n lines.push(` --theme-heading-${level}: ${scale}rem;`);\n }\n\n // Spacing\n lines.push(` --theme-container-max-width: ${theme.spacing.containerMaxWidth}px;`);\n lines.push(` --theme-section-padding-y: ${theme.spacing.sectionPaddingY}px;`);\n lines.push(` --theme-section-padding-x: ${theme.spacing.sectionPaddingX}px;`);\n lines.push(` --theme-component-gap: ${theme.spacing.componentGap}px;`);\n lines.push(` --theme-border-radius: ${theme.spacing.borderRadius}px;`);\n lines.push(` --theme-border-radius-lg: ${theme.spacing.borderRadiusLg}px;`);\n lines.push(` --theme-border-radius-sm: ${theme.spacing.borderRadiusSm}px;`);\n\n // Custom tokens\n if (theme.customTokens) {\n for (const [key, value] of Object.entries(theme.customTokens)) {\n lines.push(` --theme-${key}: ${value};`);\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/* ─── Default Theme ─── */\n\nexport function getDefaultTheme(): ThemeConfig {\n return {\n colors: {\n primary: '#18181b',\n secondary: '#f4f4f5',\n accent: '#3b82f6',\n background: '#ffffff',\n foreground: '#09090b',\n muted: '#f4f4f5',\n mutedForeground: '#71717a',\n border: '#e4e4e7',\n card: '#ffffff',\n cardForeground: '#09090b',\n destructive: '#ef4444',\n },\n typography: {\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n headingFontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n baseFontSize: 16,\n lineHeight: 1.6,\n headingScale: {\n h1: 3,\n h2: 2.25,\n h3: 1.875,\n h4: 1.5,\n h5: 1.25,\n h6: 1,\n },\n fontWeightNormal: 400,\n fontWeightMedium: 500,\n fontWeightBold: 700,\n },\n spacing: {\n containerMaxWidth: 1280,\n sectionPaddingY: 80,\n sectionPaddingX: 24,\n componentGap: 24,\n borderRadius: 8,\n borderRadiusLg: 12,\n borderRadiusSm: 4,\n },\n };\n}\n\n/* ─── Deep Merge ─── */\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n return Boolean(item && typeof item === 'object' && !Array.isArray(item));\n}\n\nexport function mergeTheme(base: ThemeConfig, overrides: Partial<ThemeConfig>): ThemeConfig {\n const result: ThemeConfig = {\n colors: { ...base.colors, ...(overrides.colors ?? {}) },\n typography: { ...base.typography, ...(overrides.typography ?? {}) },\n spacing: { ...base.spacing, ...(overrides.spacing ?? {}) },\n customTokens: { ...(base.customTokens ?? {}), ...(overrides.customTokens ?? {}) },\n };\n\n // Deep-merge headingScale if provided\n if (overrides.typography?.headingScale) {\n result.typography.headingScale = {\n ...base.typography.headingScale,\n ...overrides.typography.headingScale,\n };\n }\n\n return result;\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -250,35 +250,36 @@ var TecofEditor = ({
|
|
|
250
250
|
window.addEventListener("message", onMessage);
|
|
251
251
|
return () => window.removeEventListener("message", onMessage);
|
|
252
252
|
}, [isEmbedded, handleSaveDraft]);
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
(
|
|
256
|
-
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
item = appState?.data?.content?.[index];
|
|
267
|
-
} else {
|
|
268
|
-
item = appState?.data?.zones?.[zone]?.[index];
|
|
253
|
+
useEffect(() => {
|
|
254
|
+
if (!isEmbedded) return;
|
|
255
|
+
const handleClick = (e) => {
|
|
256
|
+
const target = e.target;
|
|
257
|
+
const puckComponent = target.closest("[data-puck-component]");
|
|
258
|
+
if (puckComponent) {
|
|
259
|
+
const componentType = puckComponent.getAttribute("data-puck-component");
|
|
260
|
+
const draggableId = puckComponent.closest("[data-rfd-draggable-id]")?.getAttribute("data-rfd-draggable-id");
|
|
261
|
+
window.parent.postMessage({
|
|
262
|
+
type: "puck:itemSelected",
|
|
263
|
+
item: {
|
|
264
|
+
type: componentType,
|
|
265
|
+
id: draggableId || null
|
|
269
266
|
}
|
|
270
|
-
|
|
271
|
-
type: "puck:itemSelected",
|
|
272
|
-
selector,
|
|
273
|
-
item: item ? { type: item.type, id: item.props?.id } : null
|
|
274
|
-
}, "*");
|
|
275
|
-
} else {
|
|
276
|
-
window.parent.postMessage({ type: "puck:itemDeselected" }, "*");
|
|
277
|
-
}
|
|
267
|
+
}, "*");
|
|
278
268
|
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
|
|
269
|
+
};
|
|
270
|
+
const handleDeselect = (e) => {
|
|
271
|
+
const target = e.target;
|
|
272
|
+
if (!target.closest("[data-puck-component]")) {
|
|
273
|
+
window.parent.postMessage({ type: "puck:itemDeselected" }, "*");
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
document.addEventListener("click", handleClick, true);
|
|
277
|
+
document.addEventListener("click", handleDeselect, false);
|
|
278
|
+
return () => {
|
|
279
|
+
document.removeEventListener("click", handleClick, true);
|
|
280
|
+
document.removeEventListener("click", handleDeselect, false);
|
|
281
|
+
};
|
|
282
|
+
}, [isEmbedded]);
|
|
282
283
|
if (loading || !initialData) {
|
|
283
284
|
return /* @__PURE__ */ jsx("div", { style: editorStyles.loading, className, children: /* @__PURE__ */ jsxs("div", { style: editorStyles.loadingInner, children: [
|
|
284
285
|
/* @__PURE__ */ jsx("div", { style: editorStyles.spinner }),
|
|
@@ -298,16 +299,7 @@ var TecofEditor = ({
|
|
|
298
299
|
config,
|
|
299
300
|
data: initialData,
|
|
300
301
|
onPublish: handlePuckPublish,
|
|
301
|
-
onChange:
|
|
302
|
-
handleChange(data);
|
|
303
|
-
setTimeout(() => {
|
|
304
|
-
try {
|
|
305
|
-
const puckState = document.querySelector("[data-puck-component]")?.__puckAppState;
|
|
306
|
-
if (puckState) handleItemSelect(puckState);
|
|
307
|
-
} catch {
|
|
308
|
-
}
|
|
309
|
-
}, 50);
|
|
310
|
-
},
|
|
302
|
+
onChange: handleChange,
|
|
311
303
|
overrides: mergedOverrides
|
|
312
304
|
}
|
|
313
305
|
),
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts","../src/components/TecofProvider.tsx","../src/components/styles.ts","../src/components/TecofEditor.tsx","../src/components/TecofRender.tsx","../src/utils/index.ts"],"names":["jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiResponse, PuckPageData, PageApiData } from './types';\n\n/**\n * Tecof API Client — handles communication with the Tecof backend\n * for page CRUD operations using merchant secret key.\n *\n * Endpoints:\n * - GET /api/store/editor/:id → get page by ID\n * - PUT /api/store/editor/:id → save page by ID\n */\nexport class TecofApiClient {\n private apiUrl: string;\n private secretKey: string;\n\n constructor(apiUrl: string, secretKey: string) {\n // Remove trailing slash\n this.apiUrl = apiUrl.replace(/\\/+$/, '');\n this.secretKey = secretKey;\n }\n\n private get headers(): Record<string, string> {\n return {\n 'x-secret-key': this.secretKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Fetch a page by ID (for the editor)\n */\n async getPage(pageId: string): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'GET',\n headers: this.headers,\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch page',\n };\n }\n }\n\n /**\n * Save a page by ID\n */\n async savePage(\n pageId: string,\n puckData: PuckPageData,\n title?: string,\n accessToken?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'PUT',\n headers: {\n ...this.headers,\n ...(accessToken && { Authorization: accessToken }),\n },\n body: JSON.stringify({ puckData, ...(title && { title }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to save page',\n };\n }\n }\n\n /**\n * Fetch a published page by slug + locale (for rendering)\n */\n async getPublishedPage(\n slug: string,\n locale?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/render`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify({ slug, ...(locale && { locale }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch published page',\n };\n }\n }\n}\n\nexport default TecofApiClient;","import { createContext, useContext, useMemo } from 'react';\nimport { TecofApiClient } from '../api';\nimport type { TecofProviderProps } from '../types';\n\n/* ─── Context ─── */\n\ninterface TecofContextValue {\n apiClient: TecofApiClient;\n secretKey: string;\n apiUrl: string;\n}\n\nconst TecofContext = createContext<TecofContextValue | null>(null);\n\n/* ─── Provider ─── */\n\nexport const TecofProvider = ({ apiUrl, secretKey, children }: TecofProviderProps) => {\n const value = useMemo<TecofContextValue>(\n () => ({\n apiClient: new TecofApiClient(apiUrl, secretKey),\n secretKey,\n apiUrl,\n }),\n [apiUrl, secretKey]\n );\n\n return <TecofContext.Provider value={value}>{children}</TecofContext.Provider>;\n};\n\n/* ─── Hook ─── */\n\nexport function useTecof(): TecofContextValue {\n const ctx = useContext(TecofContext);\n if (!ctx) {\n throw new Error('useTecof must be used within a <TecofProvider>');\n }\n return ctx;\n}\n\nexport default TecofProvider;\n","/**\n * Scoped styles for TecofEditor — inlined to avoid CSS module build issues.\n * These are internal styles, not exposed to consumers.\n */\nexport const editorStyles = {\n wrapper: {\n position: 'relative' as const,\n width: '100%',\n height: '100%',\n },\n loading: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n background: '#fafafa',\n },\n loadingInner: {\n textAlign: 'center' as const,\n },\n loadingText: {\n fontSize: '14px',\n color: '#71717a',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n error: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '200px',\n padding: '24px',\n fontSize: '14px',\n color: '#ef4444',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n saveIndicator: {\n position: 'fixed' as const,\n bottom: '20px',\n right: '20px',\n padding: '8px 16px',\n background: '#18181b',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 500,\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n zIndex: 9999,\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n spinner: {\n width: '40px',\n height: '40px',\n border: '3px solid #e4e4e7',\n borderTopColor: '#18181b',\n borderRadius: '50%',\n margin: '0 auto 12px',\n animation: 'tecof-spin 0.7s linear infinite',\n },\n} as const;\n\n/** Spinner keyframes — injected once into the document */\nlet keyframesInjected = false;\nexport const injectKeyframes = () => {\n if (keyframesInjected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = `@keyframes tecof-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n keyframesInjected = true;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Puck, fieldsPlugin, type Data, type Config } from '@puckeditor/core';\nimport { useTecof } from './TecofProvider';\nimport { editorStyles, injectKeyframes } from './styles';\nimport type { TecofEditorProps, PuckPageData } from '../types';\n\nconst EMPTY_PAGE: PuckPageData = { content: [], root: { props: {} }, zones: {} };\n\n/**\n * TecofEditor — Puck CMS page editor.\n *\n * - Fetches page by ID via secretKey auth\n * - Saves draft via API (taslak kaydet)\n * - Supports iframe postMessage:\n * - puck:save → triggers draft save\n * - puck:undo → undo\n * - puck:redo → redo\n * - puck:viewport → resize preview\n * - Sends to parent:\n * - puck:saved → draft saved successfully\n * - puck:changed → data changed\n * - puck:itemSelected → item selected { item, id }\n *\n * Requires `<TecofProvider>` ancestor for API client.\n */\nexport const TecofEditor = ({\n pageId,\n config,\n accessToken,\n onSave,\n onChange,\n overrides,\n plugins: extraPlugins,\n className,\n}: TecofEditorProps) => {\n const { apiClient } = useTecof();\n\n const [initialData, setInitialData] = useState<PuckPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const puckDataRef = useRef<Data | null>(null);\n const isEmbedded = typeof window !== 'undefined' && window.parent !== window;\n\n // Inject spinner keyframes once\n useEffect(() => { injectKeyframes(); }, []);\n\n /* ── Fetch page ── */\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n const res = await apiClient.getPage(pageId);\n if (cancelled) return;\n const data = res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE;\n setInitialData(data);\n puckDataRef.current = data as unknown as Data;\n setLoading(false);\n };\n load();\n return () => { cancelled = true; };\n }, [pageId, apiClient]);\n\n /* ── Save Draft (Taslak Kaydet) ── */\n const handleSaveDraft = useCallback(\n async (data?: Data) => {\n const currentData = data || puckDataRef.current;\n if (!currentData) return;\n\n const puckData = currentData as unknown as PuckPageData;\n setSaving(true);\n setSaveStatus('idle');\n\n const res = await apiClient.savePage(pageId, puckData, undefined, accessToken);\n\n if (res.success) {\n setSaveStatus('success');\n setTimeout(() => setSaveStatus('idle'), 3000);\n onSave?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saved' }, '*');\n } else {\n setSaveStatus('error');\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saveError', message: res.message }, '*');\n }\n\n setSaving(false);\n },\n [pageId, apiClient, isEmbedded, onSave, accessToken]\n );\n\n /* ── Change ── */\n const handleChange = useCallback(\n (data: Data) => {\n puckDataRef.current = data;\n const puckData = data as unknown as PuckPageData;\n onChange?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:changed' }, '*');\n },\n [onChange, isEmbedded]\n );\n\n /* ── Puck onPublish — used as save trigger ── */\n const handlePuckPublish = useCallback(\n (data: Data) => {\n handleSaveDraft(data);\n },\n [handleSaveDraft]\n );\n\n /* ── iframe postMessage listener ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const onMessage = (e: MessageEvent) => {\n switch (e.data?.type) {\n case 'puck:save': {\n handleSaveDraft();\n break;\n }\n case 'puck:undo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, bubbles: true }));\n break;\n case 'puck:redo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, shiftKey: true, bubbles: true }));\n break;\n case 'puck:viewport': {\n const frame = document.querySelector('[data-testid=\"puck-frame\"]') as HTMLElement;\n if (frame) {\n const w = e.data.width || '100%';\n frame.style.maxWidth = w;\n frame.style.margin = w === '100%' ? '0' : '0 auto';\n frame.style.transition = 'max-width 0.3s ease';\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, [isEmbedded, handleSaveDraft]);\n\n /* ── Track item selection and notify parent ── */\n const lastSelectedRef = useRef<string | null>(null);\n const handleItemSelect = useCallback(\n (appState: any) => {\n if (!isEmbedded) return;\n const selector = appState?.ui?.itemSelector;\n const selectorKey = selector ? JSON.stringify(selector) : null;\n\n if (selectorKey !== lastSelectedRef.current) {\n lastSelectedRef.current = selectorKey;\n\n if (selector) {\n // Find the selected item from content\n const zone = selector.zone || 'default-zone';\n const index = selector.index;\n let item = null;\n\n if (zone === 'default-zone' || !zone) {\n item = appState?.data?.content?.[index];\n } else {\n item = appState?.data?.zones?.[zone]?.[index];\n }\n\n window.parent.postMessage({\n type: 'puck:itemSelected',\n selector,\n item: item ? { type: item.type, id: item.props?.id } : null\n }, '*');\n } else {\n window.parent.postMessage({ type: 'puck:itemDeselected' }, '*');\n }\n }\n },\n [isEmbedded]\n );\n\n /* ── Loading ── */\n if (loading || !initialData) {\n return (\n <div style={editorStyles.loading} className={className}>\n <div style={editorStyles.loadingInner}>\n <div style={editorStyles.spinner} />\n <p style={editorStyles.loadingText}>Loading editor...</p>\n </div>\n </div>\n );\n }\n\n /* ── Plugins & Overrides ── */\n const plugins = [\n ...(fieldsPlugin ? [fieldsPlugin({ desktopSideBar: 'left' })] : []),\n ...(extraPlugins || []),\n ];\n\n const mergedOverrides = { header: () => <></>, ...(overrides || {}) };\n\n return (\n <div style={editorStyles.wrapper} className={className}>\n <Puck\n plugins={plugins}\n config={config as Config}\n data={initialData}\n onPublish={handlePuckPublish}\n onChange={(data: Data) => {\n handleChange(data);\n // Puck appState extraction via internal state\n // We use a setTimeout to let Puck update its state first\n setTimeout(() => {\n try {\n const puckState = (document.querySelector('[data-puck-component]') as any)?.__puckAppState;\n if (puckState) handleItemSelect(puckState);\n } catch { /* ignore */ }\n }, 50);\n }}\n overrides={mergedOverrides}\n />\n {saving && (\n <div style={editorStyles.saveIndicator}>\n {saveStatus === 'error' ? 'Save failed' : 'Saving...'}\n </div>\n )}\n </div>\n );\n};\n\nexport default TecofEditor;","import { Render, type Config } from '@puckeditor/core';\nimport type { TecofRenderProps } from '../types';\n\n/**\n * TecofRender — Puck page renderer.\n *\n * Pass `data` (PuckPageData) and `config` (Puck Config) directly.\n * No API fetch, no provider required.\n */\nexport const TecofRender = ({ data, config, className }: TecofRenderProps) => {\n if (!data) return null;\n\n return (\n <div className={className}>\n <Render config={config as Config} data={data} />\n </div>\n );\n};\n\nexport default TecofRender;\n","import type { ThemeConfig, HSL } from '../types';\n\n/* ─── Color Converters ─── */\n\nexport function hexToHsl(hex: string): HSL {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return { h: 0, s: 0, l: 0 };\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sNorm = s / 100;\n const lNorm = l / 100;\n const a = sNorm * Math.min(lNorm, 1 - lNorm);\n\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = lNorm - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n/* ─── Color Manipulation ─── */\n\nexport function lighten(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.min(100, l + amount));\n}\n\nexport function darken(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.max(0, l - amount));\n}\n\n/* ─── CSS Variable Generation ─── */\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const lines: string[] = [':root {'];\n\n // Colors\n for (const [key, value] of Object.entries(theme.colors)) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n lines.push(` --theme-color-${cssKey}: ${value};`);\n }\n\n // Typography\n lines.push(` --theme-font-family: ${theme.typography.fontFamily};`);\n lines.push(` --theme-heading-font-family: ${theme.typography.headingFontFamily};`);\n lines.push(` --theme-font-size-base: ${theme.typography.baseFontSize}px;`);\n lines.push(` --theme-line-height: ${theme.typography.lineHeight};`);\n lines.push(` --theme-font-weight-normal: ${theme.typography.fontWeightNormal};`);\n lines.push(` --theme-font-weight-medium: ${theme.typography.fontWeightMedium};`);\n lines.push(` --theme-font-weight-bold: ${theme.typography.fontWeightBold};`);\n\n for (const [level, scale] of Object.entries(theme.typography.headingScale)) {\n lines.push(` --theme-heading-${level}: ${scale}rem;`);\n }\n\n // Spacing\n lines.push(` --theme-container-max-width: ${theme.spacing.containerMaxWidth}px;`);\n lines.push(` --theme-section-padding-y: ${theme.spacing.sectionPaddingY}px;`);\n lines.push(` --theme-section-padding-x: ${theme.spacing.sectionPaddingX}px;`);\n lines.push(` --theme-component-gap: ${theme.spacing.componentGap}px;`);\n lines.push(` --theme-border-radius: ${theme.spacing.borderRadius}px;`);\n lines.push(` --theme-border-radius-lg: ${theme.spacing.borderRadiusLg}px;`);\n lines.push(` --theme-border-radius-sm: ${theme.spacing.borderRadiusSm}px;`);\n\n // Custom tokens\n if (theme.customTokens) {\n for (const [key, value] of Object.entries(theme.customTokens)) {\n lines.push(` --theme-${key}: ${value};`);\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/* ─── Default Theme ─── */\n\nexport function getDefaultTheme(): ThemeConfig {\n return {\n colors: {\n primary: '#18181b',\n secondary: '#f4f4f5',\n accent: '#3b82f6',\n background: '#ffffff',\n foreground: '#09090b',\n muted: '#f4f4f5',\n mutedForeground: '#71717a',\n border: '#e4e4e7',\n card: '#ffffff',\n cardForeground: '#09090b',\n destructive: '#ef4444',\n },\n typography: {\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n headingFontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n baseFontSize: 16,\n lineHeight: 1.6,\n headingScale: {\n h1: 3,\n h2: 2.25,\n h3: 1.875,\n h4: 1.5,\n h5: 1.25,\n h6: 1,\n },\n fontWeightNormal: 400,\n fontWeightMedium: 500,\n fontWeightBold: 700,\n },\n spacing: {\n containerMaxWidth: 1280,\n sectionPaddingY: 80,\n sectionPaddingX: 24,\n componentGap: 24,\n borderRadius: 8,\n borderRadiusLg: 12,\n borderRadiusSm: 4,\n },\n };\n}\n\n/* ─── Deep Merge ─── */\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n return Boolean(item && typeof item === 'object' && !Array.isArray(item));\n}\n\nexport function mergeTheme(base: ThemeConfig, overrides: Partial<ThemeConfig>): ThemeConfig {\n const result: ThemeConfig = {\n colors: { ...base.colors, ...(overrides.colors ?? {}) },\n typography: { ...base.typography, ...(overrides.typography ?? {}) },\n spacing: { ...base.spacing, ...(overrides.spacing ?? {}) },\n customTokens: { ...(base.customTokens ?? {}), ...(overrides.customTokens ?? {}) },\n };\n\n // Deep-merge headingScale if provided\n if (overrides.typography?.headingScale) {\n result.typography.headingScale = {\n ...base.typography.headingScale,\n ...overrides.typography.headingScale,\n };\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api.ts","../src/components/TecofProvider.tsx","../src/components/styles.ts","../src/components/TecofEditor.tsx","../src/components/TecofRender.tsx","../src/utils/index.ts"],"names":["jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiResponse, PuckPageData, PageApiData } from './types';\n\n/**\n * Tecof API Client — handles communication with the Tecof backend\n * for page CRUD operations using merchant secret key.\n *\n * Endpoints:\n * - GET /api/store/editor/:id → get page by ID\n * - PUT /api/store/editor/:id → save page by ID\n */\nexport class TecofApiClient {\n private apiUrl: string;\n private secretKey: string;\n\n constructor(apiUrl: string, secretKey: string) {\n // Remove trailing slash\n this.apiUrl = apiUrl.replace(/\\/+$/, '');\n this.secretKey = secretKey;\n }\n\n private get headers(): Record<string, string> {\n return {\n 'x-secret-key': this.secretKey,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Fetch a page by ID (for the editor)\n */\n async getPage(pageId: string): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'GET',\n headers: this.headers,\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch page',\n };\n }\n }\n\n /**\n * Save a page by ID\n */\n async savePage(\n pageId: string,\n puckData: PuckPageData,\n title?: string,\n accessToken?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/editor/${pageId}`, {\n method: 'PUT',\n headers: {\n ...this.headers,\n ...(accessToken && { Authorization: accessToken }),\n },\n body: JSON.stringify({ puckData, ...(title && { title }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to save page',\n };\n }\n }\n\n /**\n * Fetch a published page by slug + locale (for rendering)\n */\n async getPublishedPage(\n slug: string,\n locale?: string\n ): Promise<ApiResponse<PageApiData>> {\n try {\n const res = await fetch(`${this.apiUrl}/api/store/render`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify({ slug, ...(locale && { locale }) }),\n });\n return await res.json();\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to fetch published page',\n };\n }\n }\n}\n\nexport default TecofApiClient;","import { createContext, useContext, useMemo } from 'react';\nimport { TecofApiClient } from '../api';\nimport type { TecofProviderProps } from '../types';\n\n/* ─── Context ─── */\n\ninterface TecofContextValue {\n apiClient: TecofApiClient;\n secretKey: string;\n apiUrl: string;\n}\n\nconst TecofContext = createContext<TecofContextValue | null>(null);\n\n/* ─── Provider ─── */\n\nexport const TecofProvider = ({ apiUrl, secretKey, children }: TecofProviderProps) => {\n const value = useMemo<TecofContextValue>(\n () => ({\n apiClient: new TecofApiClient(apiUrl, secretKey),\n secretKey,\n apiUrl,\n }),\n [apiUrl, secretKey]\n );\n\n return <TecofContext.Provider value={value}>{children}</TecofContext.Provider>;\n};\n\n/* ─── Hook ─── */\n\nexport function useTecof(): TecofContextValue {\n const ctx = useContext(TecofContext);\n if (!ctx) {\n throw new Error('useTecof must be used within a <TecofProvider>');\n }\n return ctx;\n}\n\nexport default TecofProvider;\n","/**\n * Scoped styles for TecofEditor — inlined to avoid CSS module build issues.\n * These are internal styles, not exposed to consumers.\n */\nexport const editorStyles = {\n wrapper: {\n position: 'relative' as const,\n width: '100%',\n height: '100%',\n },\n loading: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n background: '#fafafa',\n },\n loadingInner: {\n textAlign: 'center' as const,\n },\n loadingText: {\n fontSize: '14px',\n color: '#71717a',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n error: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '200px',\n padding: '24px',\n fontSize: '14px',\n color: '#ef4444',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n saveIndicator: {\n position: 'fixed' as const,\n bottom: '20px',\n right: '20px',\n padding: '8px 16px',\n background: '#18181b',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 500,\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n zIndex: 9999,\n fontFamily: \"'Inter', system-ui, sans-serif\",\n },\n spinner: {\n width: '40px',\n height: '40px',\n border: '3px solid #e4e4e7',\n borderTopColor: '#18181b',\n borderRadius: '50%',\n margin: '0 auto 12px',\n animation: 'tecof-spin 0.7s linear infinite',\n },\n} as const;\n\n/** Spinner keyframes — injected once into the document */\nlet keyframesInjected = false;\nexport const injectKeyframes = () => {\n if (keyframesInjected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = `@keyframes tecof-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n keyframesInjected = true;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Puck, fieldsPlugin, type Data, type Config } from '@puckeditor/core';\nimport { useTecof } from './TecofProvider';\nimport { editorStyles, injectKeyframes } from './styles';\nimport type { TecofEditorProps, PuckPageData } from '../types';\n\nconst EMPTY_PAGE: PuckPageData = { content: [], root: { props: {} }, zones: {} };\n\n/**\n * TecofEditor — Puck CMS page editor.\n *\n * - Fetches page by ID via secretKey auth\n * - Saves draft via API (taslak kaydet)\n * - Supports iframe postMessage:\n * - puck:save → triggers draft save\n * - puck:undo → undo\n * - puck:redo → redo\n * - puck:viewport → resize preview\n * - Sends to parent:\n * - puck:saved → draft saved successfully\n * - puck:changed → data changed\n * - puck:itemSelected → item selected { item, id }\n *\n * Requires `<TecofProvider>` ancestor for API client.\n */\nexport const TecofEditor = ({\n pageId,\n config,\n accessToken,\n onSave,\n onChange,\n overrides,\n plugins: extraPlugins,\n className,\n}: TecofEditorProps) => {\n const { apiClient } = useTecof();\n\n const [initialData, setInitialData] = useState<PuckPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const puckDataRef = useRef<Data | null>(null);\n const isEmbedded = typeof window !== 'undefined' && window.parent !== window;\n\n // Inject spinner keyframes once\n useEffect(() => { injectKeyframes(); }, []);\n\n /* ── Fetch page ── */\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n const res = await apiClient.getPage(pageId);\n if (cancelled) return;\n const data = res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE;\n setInitialData(data);\n puckDataRef.current = data as unknown as Data;\n setLoading(false);\n };\n load();\n return () => { cancelled = true; };\n }, [pageId, apiClient]);\n\n /* ── Save Draft (Taslak Kaydet) ── */\n const handleSaveDraft = useCallback(\n async (data?: Data) => {\n const currentData = data || puckDataRef.current;\n if (!currentData) return;\n\n const puckData = currentData as unknown as PuckPageData;\n setSaving(true);\n setSaveStatus('idle');\n\n const res = await apiClient.savePage(pageId, puckData, undefined, accessToken);\n\n if (res.success) {\n setSaveStatus('success');\n setTimeout(() => setSaveStatus('idle'), 3000);\n onSave?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saved' }, '*');\n } else {\n setSaveStatus('error');\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saveError', message: res.message }, '*');\n }\n\n setSaving(false);\n },\n [pageId, apiClient, isEmbedded, onSave, accessToken]\n );\n\n /* ── Change ── */\n const handleChange = useCallback(\n (data: Data) => {\n puckDataRef.current = data;\n const puckData = data as unknown as PuckPageData;\n onChange?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:changed' }, '*');\n },\n [onChange, isEmbedded]\n );\n\n /* ── Puck onPublish — used as save trigger ── */\n const handlePuckPublish = useCallback(\n (data: Data) => {\n handleSaveDraft(data);\n },\n [handleSaveDraft]\n );\n\n /* ── iframe postMessage listener ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const onMessage = (e: MessageEvent) => {\n switch (e.data?.type) {\n case 'puck:save': {\n handleSaveDraft();\n break;\n }\n case 'puck:undo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, bubbles: true }));\n break;\n case 'puck:redo':\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', code: 'KeyZ', ctrlKey: true, shiftKey: true, bubbles: true }));\n break;\n case 'puck:viewport': {\n const frame = document.querySelector('[data-testid=\"puck-frame\"]') as HTMLElement;\n if (frame) {\n const w = e.data.width || '100%';\n frame.style.maxWidth = w;\n frame.style.margin = w === '100%' ? '0' : '0 auto';\n frame.style.transition = 'max-width 0.3s ease';\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, [isEmbedded, handleSaveDraft]);\n\n /* ── Track item selection via click delegation ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Walk up to find closest puck component\n const puckComponent = target.closest('[data-puck-component]') as HTMLElement;\n\n if (puckComponent) {\n const componentType = puckComponent.getAttribute('data-puck-component');\n const draggableId = puckComponent.closest('[data-rfd-draggable-id]')?.getAttribute('data-rfd-draggable-id');\n\n window.parent.postMessage({\n type: 'puck:itemSelected',\n item: {\n type: componentType,\n id: draggableId || null\n }\n }, '*');\n }\n };\n\n // Detect deselection: click on empty area\n const handleDeselect = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target.closest('[data-puck-component]')) {\n window.parent.postMessage({ type: 'puck:itemDeselected' }, '*');\n }\n };\n\n document.addEventListener('click', handleClick, true);\n document.addEventListener('click', handleDeselect, false);\n\n return () => {\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('click', handleDeselect, false);\n };\n }, [isEmbedded]);\n\n /* ── Loading ── */\n if (loading || !initialData) {\n return (\n <div style={editorStyles.loading} className={className}>\n <div style={editorStyles.loadingInner}>\n <div style={editorStyles.spinner} />\n <p style={editorStyles.loadingText}>Loading editor...</p>\n </div>\n </div>\n );\n }\n\n /* ── Plugins & Overrides ── */\n const plugins = [\n ...(fieldsPlugin ? [fieldsPlugin({ desktopSideBar: 'left' })] : []),\n ...(extraPlugins || []),\n ];\n\n const mergedOverrides = { header: () => <></>, ...(overrides || {}) };\n\n return (\n <div style={editorStyles.wrapper} className={className}>\n <Puck\n plugins={plugins}\n config={config as Config}\n data={initialData}\n onPublish={handlePuckPublish}\n onChange={handleChange}\n overrides={mergedOverrides}\n />\n {saving && (\n <div style={editorStyles.saveIndicator}>\n {saveStatus === 'error' ? 'Save failed' : 'Saving...'}\n </div>\n )}\n </div>\n );\n};\n\nexport default TecofEditor;","import { Render, type Config } from '@puckeditor/core';\nimport type { TecofRenderProps } from '../types';\n\n/**\n * TecofRender — Puck page renderer.\n *\n * Pass `data` (PuckPageData) and `config` (Puck Config) directly.\n * No API fetch, no provider required.\n */\nexport const TecofRender = ({ data, config, className }: TecofRenderProps) => {\n if (!data) return null;\n\n return (\n <div className={className}>\n <Render config={config as Config} data={data} />\n </div>\n );\n};\n\nexport default TecofRender;\n","import type { ThemeConfig, HSL } from '../types';\n\n/* ─── Color Converters ─── */\n\nexport function hexToHsl(hex: string): HSL {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return { h: 0, s: 0, l: 0 };\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sNorm = s / 100;\n const lNorm = l / 100;\n const a = sNorm * Math.min(lNorm, 1 - lNorm);\n\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = lNorm - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n/* ─── Color Manipulation ─── */\n\nexport function lighten(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.min(100, l + amount));\n}\n\nexport function darken(hex: string, amount: number): string {\n const { h, s, l } = hexToHsl(hex);\n return hslToHex(h, s, Math.max(0, l - amount));\n}\n\n/* ─── CSS Variable Generation ─── */\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const lines: string[] = [':root {'];\n\n // Colors\n for (const [key, value] of Object.entries(theme.colors)) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n lines.push(` --theme-color-${cssKey}: ${value};`);\n }\n\n // Typography\n lines.push(` --theme-font-family: ${theme.typography.fontFamily};`);\n lines.push(` --theme-heading-font-family: ${theme.typography.headingFontFamily};`);\n lines.push(` --theme-font-size-base: ${theme.typography.baseFontSize}px;`);\n lines.push(` --theme-line-height: ${theme.typography.lineHeight};`);\n lines.push(` --theme-font-weight-normal: ${theme.typography.fontWeightNormal};`);\n lines.push(` --theme-font-weight-medium: ${theme.typography.fontWeightMedium};`);\n lines.push(` --theme-font-weight-bold: ${theme.typography.fontWeightBold};`);\n\n for (const [level, scale] of Object.entries(theme.typography.headingScale)) {\n lines.push(` --theme-heading-${level}: ${scale}rem;`);\n }\n\n // Spacing\n lines.push(` --theme-container-max-width: ${theme.spacing.containerMaxWidth}px;`);\n lines.push(` --theme-section-padding-y: ${theme.spacing.sectionPaddingY}px;`);\n lines.push(` --theme-section-padding-x: ${theme.spacing.sectionPaddingX}px;`);\n lines.push(` --theme-component-gap: ${theme.spacing.componentGap}px;`);\n lines.push(` --theme-border-radius: ${theme.spacing.borderRadius}px;`);\n lines.push(` --theme-border-radius-lg: ${theme.spacing.borderRadiusLg}px;`);\n lines.push(` --theme-border-radius-sm: ${theme.spacing.borderRadiusSm}px;`);\n\n // Custom tokens\n if (theme.customTokens) {\n for (const [key, value] of Object.entries(theme.customTokens)) {\n lines.push(` --theme-${key}: ${value};`);\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/* ─── Default Theme ─── */\n\nexport function getDefaultTheme(): ThemeConfig {\n return {\n colors: {\n primary: '#18181b',\n secondary: '#f4f4f5',\n accent: '#3b82f6',\n background: '#ffffff',\n foreground: '#09090b',\n muted: '#f4f4f5',\n mutedForeground: '#71717a',\n border: '#e4e4e7',\n card: '#ffffff',\n cardForeground: '#09090b',\n destructive: '#ef4444',\n },\n typography: {\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n headingFontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n baseFontSize: 16,\n lineHeight: 1.6,\n headingScale: {\n h1: 3,\n h2: 2.25,\n h3: 1.875,\n h4: 1.5,\n h5: 1.25,\n h6: 1,\n },\n fontWeightNormal: 400,\n fontWeightMedium: 500,\n fontWeightBold: 700,\n },\n spacing: {\n containerMaxWidth: 1280,\n sectionPaddingY: 80,\n sectionPaddingX: 24,\n componentGap: 24,\n borderRadius: 8,\n borderRadiusLg: 12,\n borderRadiusSm: 4,\n },\n };\n}\n\n/* ─── Deep Merge ─── */\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n return Boolean(item && typeof item === 'object' && !Array.isArray(item));\n}\n\nexport function mergeTheme(base: ThemeConfig, overrides: Partial<ThemeConfig>): ThemeConfig {\n const result: ThemeConfig = {\n colors: { ...base.colors, ...(overrides.colors ?? {}) },\n typography: { ...base.typography, ...(overrides.typography ?? {}) },\n spacing: { ...base.spacing, ...(overrides.spacing ?? {}) },\n customTokens: { ...(base.customTokens ?? {}), ...(overrides.customTokens ?? {}) },\n };\n\n // Deep-merge headingScale if provided\n if (overrides.typography?.headingScale) {\n result.typography.headingScale = {\n ...base.typography.headingScale,\n ...overrides.typography.headingScale,\n };\n }\n\n return result;\n}\n"]}
|