@tecof/theme-editor 0.0.2 → 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.d.mts CHANGED
@@ -89,10 +89,8 @@ interface TecofEditorProps {
89
89
  config: any;
90
90
  /** Access token for save operations (sent as Authorization header) */
91
91
  accessToken?: string;
92
- /** Called after successful save */
92
+ /** Called after successful draft save */
93
93
  onSave?: (data: PuckPageData) => void;
94
- /** Called after successful publish */
95
- onPublish?: (data: PuckPageData) => void;
96
94
  /** Called on every editor change */
97
95
  onChange?: (data: PuckPageData) => void;
98
96
  /** Puck UI overrides */
@@ -150,12 +148,20 @@ declare function useTecof(): TecofContextValue;
150
148
  * TecofEditor — Puck CMS page editor.
151
149
  *
152
150
  * - Fetches page by ID via secretKey auth
153
- * - Saves on publish
154
- * - Supports iframe postMessage (undo/redo/publish/viewport)
151
+ * - Saves draft via API (taslak kaydet)
152
+ * - Supports iframe postMessage:
153
+ * - puck:save → triggers draft save
154
+ * - puck:undo → undo
155
+ * - puck:redo → redo
156
+ * - puck:viewport → resize preview
157
+ * - Sends to parent:
158
+ * - puck:saved → draft saved successfully
159
+ * - puck:changed → data changed
160
+ * - puck:itemSelected → item selected { item, id }
155
161
  *
156
162
  * Requires `<TecofProvider>` ancestor for API client.
157
163
  */
158
- declare const TecofEditor: ({ pageId, config, accessToken, onSave, onPublish, onChange, overrides, plugins: extraPlugins, className, }: TecofEditorProps) => react_jsx_runtime.JSX.Element;
164
+ declare const TecofEditor: ({ pageId, config, accessToken, onSave, onChange, overrides, plugins: extraPlugins, className, }: TecofEditorProps) => react_jsx_runtime.JSX.Element;
159
165
 
160
166
  /**
161
167
  * TecofRender — Puck page renderer.
package/dist/index.d.ts CHANGED
@@ -89,10 +89,8 @@ interface TecofEditorProps {
89
89
  config: any;
90
90
  /** Access token for save operations (sent as Authorization header) */
91
91
  accessToken?: string;
92
- /** Called after successful save */
92
+ /** Called after successful draft save */
93
93
  onSave?: (data: PuckPageData) => void;
94
- /** Called after successful publish */
95
- onPublish?: (data: PuckPageData) => void;
96
94
  /** Called on every editor change */
97
95
  onChange?: (data: PuckPageData) => void;
98
96
  /** Puck UI overrides */
@@ -150,12 +148,20 @@ declare function useTecof(): TecofContextValue;
150
148
  * TecofEditor — Puck CMS page editor.
151
149
  *
152
150
  * - Fetches page by ID via secretKey auth
153
- * - Saves on publish
154
- * - Supports iframe postMessage (undo/redo/publish/viewport)
151
+ * - Saves draft via API (taslak kaydet)
152
+ * - Supports iframe postMessage:
153
+ * - puck:save → triggers draft save
154
+ * - puck:undo → undo
155
+ * - puck:redo → redo
156
+ * - puck:viewport → resize preview
157
+ * - Sends to parent:
158
+ * - puck:saved → draft saved successfully
159
+ * - puck:changed → data changed
160
+ * - puck:itemSelected → item selected { item, id }
155
161
  *
156
162
  * Requires `<TecofProvider>` ancestor for API client.
157
163
  */
158
- declare const TecofEditor: ({ pageId, config, accessToken, onSave, onPublish, onChange, overrides, plugins: extraPlugins, className, }: TecofEditorProps) => react_jsx_runtime.JSX.Element;
164
+ declare const TecofEditor: ({ pageId, config, accessToken, onSave, onChange, overrides, plugins: extraPlugins, className, }: TecofEditorProps) => react_jsx_runtime.JSX.Element;
159
165
 
160
166
  /**
161
167
  * TecofRender — Puck page renderer.
package/dist/index.js CHANGED
@@ -156,7 +156,6 @@ var TecofEditor = ({
156
156
  config,
157
157
  accessToken,
158
158
  onSave,
159
- onPublish,
160
159
  onChange,
161
160
  overrides,
162
161
  plugins: extraPlugins,
@@ -178,7 +177,9 @@ var TecofEditor = ({
178
177
  setLoading(true);
179
178
  const res = await apiClient.getPage(pageId);
180
179
  if (cancelled) return;
181
- setInitialData(res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE);
180
+ const data = res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE;
181
+ setInitialData(data);
182
+ puckDataRef.current = data;
182
183
  setLoading(false);
183
184
  };
184
185
  load();
@@ -186,9 +187,11 @@ var TecofEditor = ({
186
187
  cancelled = true;
187
188
  };
188
189
  }, [pageId, apiClient]);
189
- const handlePublish = react.useCallback(
190
+ const handleSaveDraft = react.useCallback(
190
191
  async (data) => {
191
- const puckData = data;
192
+ const currentData = data || puckDataRef.current;
193
+ if (!currentData) return;
194
+ const puckData = currentData;
192
195
  setSaving(true);
193
196
  setSaveStatus("idle");
194
197
  const res = await apiClient.savePage(pageId, puckData, void 0, accessToken);
@@ -196,31 +199,36 @@ var TecofEditor = ({
196
199
  setSaveStatus("success");
197
200
  setTimeout(() => setSaveStatus("idle"), 3e3);
198
201
  onSave?.(puckData);
199
- onPublish?.(puckData);
200
202
  if (isEmbedded) window.parent.postMessage({ type: "puck:saved" }, "*");
201
203
  } else {
202
204
  setSaveStatus("error");
205
+ if (isEmbedded) window.parent.postMessage({ type: "puck:saveError", message: res.message }, "*");
203
206
  }
204
207
  setSaving(false);
205
208
  },
206
- [pageId, apiClient, isEmbedded, onSave, onPublish, accessToken]
209
+ [pageId, apiClient, isEmbedded, onSave, accessToken]
207
210
  );
208
211
  const handleChange = react.useCallback(
209
212
  (data) => {
213
+ puckDataRef.current = data;
210
214
  const puckData = data;
211
- puckDataRef.current = puckData;
212
215
  onChange?.(puckData);
213
- if (isEmbedded) window.parent.postMessage({ type: "puck:save" }, "*");
216
+ if (isEmbedded) window.parent.postMessage({ type: "puck:changed" }, "*");
214
217
  },
215
218
  [onChange, isEmbedded]
216
219
  );
220
+ const handlePuckPublish = react.useCallback(
221
+ (data) => {
222
+ handleSaveDraft(data);
223
+ },
224
+ [handleSaveDraft]
225
+ );
217
226
  react.useEffect(() => {
218
227
  if (!isEmbedded) return;
219
228
  const onMessage = (e) => {
220
229
  switch (e.data?.type) {
221
- case "puck:publish": {
222
- const btn = document.querySelector('[data-testid="puck-publish"]');
223
- btn ? btn.click() : puckDataRef.current && handlePublish(puckDataRef.current);
230
+ case "puck:save": {
231
+ handleSaveDraft();
224
232
  break;
225
233
  }
226
234
  case "puck:undo":
@@ -243,7 +251,37 @@ var TecofEditor = ({
243
251
  };
244
252
  window.addEventListener("message", onMessage);
245
253
  return () => window.removeEventListener("message", onMessage);
246
- }, [isEmbedded, handlePublish]);
254
+ }, [isEmbedded, handleSaveDraft]);
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
268
+ }
269
+ }, "*");
270
+ }
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]);
247
285
  if (loading || !initialData) {
248
286
  return /* @__PURE__ */ jsxRuntime.jsx("div", { style: editorStyles.loading, className, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: editorStyles.loadingInner, children: [
249
287
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: editorStyles.spinner }),
@@ -262,7 +300,7 @@ var TecofEditor = ({
262
300
  plugins,
263
301
  config,
264
302
  data: initialData,
265
- onPublish: handlePublish,
303
+ onPublish: handlePuckPublish,
266
304
  onChange: handleChange,
267
305
  overrides: mergedOverrides
268
306
  }
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 on publish\n * - Supports iframe postMessage (undo/redo/publish/viewport)\n *\n * Requires `<TecofProvider>` ancestor for API client.\n */\nexport const TecofEditor = ({\n pageId,\n config,\n accessToken,\n onSave,\n onPublish,\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<PuckPageData | 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 setInitialData(res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE);\n setLoading(false);\n };\n load();\n return () => { cancelled = true; };\n }, [pageId, apiClient]);\n\n /* ── Save / Publish ── */\n const handlePublish = useCallback(\n async (data: Data) => {\n const puckData = data 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 onPublish?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saved' }, '*');\n } else {\n setSaveStatus('error');\n }\n\n setSaving(false);\n },\n [pageId, apiClient, isEmbedded, onSave, onPublish, accessToken]\n );\n\n /* ── Change ── */\n const handleChange = useCallback(\n (data: Data) => {\n const puckData = data as unknown as PuckPageData;\n puckDataRef.current = puckData;\n onChange?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:save' }, '*');\n },\n [onChange, isEmbedded]\n );\n\n /* ── iframe postMessage ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const onMessage = (e: MessageEvent) => {\n switch (e.data?.type) {\n case 'puck:publish': {\n const btn = document.querySelector('[data-testid=\"puck-publish\"]') as HTMLButtonElement;\n btn ? btn.click() : puckDataRef.current && handlePublish(puckDataRef.current);\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, handlePublish]);\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={handlePublish}\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"]}
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
@@ -154,7 +154,6 @@ var TecofEditor = ({
154
154
  config,
155
155
  accessToken,
156
156
  onSave,
157
- onPublish,
158
157
  onChange,
159
158
  overrides,
160
159
  plugins: extraPlugins,
@@ -176,7 +175,9 @@ var TecofEditor = ({
176
175
  setLoading(true);
177
176
  const res = await apiClient.getPage(pageId);
178
177
  if (cancelled) return;
179
- setInitialData(res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE);
178
+ const data = res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE;
179
+ setInitialData(data);
180
+ puckDataRef.current = data;
180
181
  setLoading(false);
181
182
  };
182
183
  load();
@@ -184,9 +185,11 @@ var TecofEditor = ({
184
185
  cancelled = true;
185
186
  };
186
187
  }, [pageId, apiClient]);
187
- const handlePublish = useCallback(
188
+ const handleSaveDraft = useCallback(
188
189
  async (data) => {
189
- const puckData = data;
190
+ const currentData = data || puckDataRef.current;
191
+ if (!currentData) return;
192
+ const puckData = currentData;
190
193
  setSaving(true);
191
194
  setSaveStatus("idle");
192
195
  const res = await apiClient.savePage(pageId, puckData, void 0, accessToken);
@@ -194,31 +197,36 @@ var TecofEditor = ({
194
197
  setSaveStatus("success");
195
198
  setTimeout(() => setSaveStatus("idle"), 3e3);
196
199
  onSave?.(puckData);
197
- onPublish?.(puckData);
198
200
  if (isEmbedded) window.parent.postMessage({ type: "puck:saved" }, "*");
199
201
  } else {
200
202
  setSaveStatus("error");
203
+ if (isEmbedded) window.parent.postMessage({ type: "puck:saveError", message: res.message }, "*");
201
204
  }
202
205
  setSaving(false);
203
206
  },
204
- [pageId, apiClient, isEmbedded, onSave, onPublish, accessToken]
207
+ [pageId, apiClient, isEmbedded, onSave, accessToken]
205
208
  );
206
209
  const handleChange = useCallback(
207
210
  (data) => {
211
+ puckDataRef.current = data;
208
212
  const puckData = data;
209
- puckDataRef.current = puckData;
210
213
  onChange?.(puckData);
211
- if (isEmbedded) window.parent.postMessage({ type: "puck:save" }, "*");
214
+ if (isEmbedded) window.parent.postMessage({ type: "puck:changed" }, "*");
212
215
  },
213
216
  [onChange, isEmbedded]
214
217
  );
218
+ const handlePuckPublish = useCallback(
219
+ (data) => {
220
+ handleSaveDraft(data);
221
+ },
222
+ [handleSaveDraft]
223
+ );
215
224
  useEffect(() => {
216
225
  if (!isEmbedded) return;
217
226
  const onMessage = (e) => {
218
227
  switch (e.data?.type) {
219
- case "puck:publish": {
220
- const btn = document.querySelector('[data-testid="puck-publish"]');
221
- btn ? btn.click() : puckDataRef.current && handlePublish(puckDataRef.current);
228
+ case "puck:save": {
229
+ handleSaveDraft();
222
230
  break;
223
231
  }
224
232
  case "puck:undo":
@@ -241,7 +249,37 @@ var TecofEditor = ({
241
249
  };
242
250
  window.addEventListener("message", onMessage);
243
251
  return () => window.removeEventListener("message", onMessage);
244
- }, [isEmbedded, handlePublish]);
252
+ }, [isEmbedded, handleSaveDraft]);
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
266
+ }
267
+ }, "*");
268
+ }
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]);
245
283
  if (loading || !initialData) {
246
284
  return /* @__PURE__ */ jsx("div", { style: editorStyles.loading, className, children: /* @__PURE__ */ jsxs("div", { style: editorStyles.loadingInner, children: [
247
285
  /* @__PURE__ */ jsx("div", { style: editorStyles.spinner }),
@@ -260,7 +298,7 @@ var TecofEditor = ({
260
298
  plugins,
261
299
  config,
262
300
  data: initialData,
263
- onPublish: handlePublish,
301
+ onPublish: handlePuckPublish,
264
302
  onChange: handleChange,
265
303
  overrides: mergedOverrides
266
304
  }
@@ -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 on publish\n * - Supports iframe postMessage (undo/redo/publish/viewport)\n *\n * Requires `<TecofProvider>` ancestor for API client.\n */\nexport const TecofEditor = ({\n pageId,\n config,\n accessToken,\n onSave,\n onPublish,\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<PuckPageData | 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 setInitialData(res.success && res.data?.puckData ? res.data.puckData : EMPTY_PAGE);\n setLoading(false);\n };\n load();\n return () => { cancelled = true; };\n }, [pageId, apiClient]);\n\n /* ── Save / Publish ── */\n const handlePublish = useCallback(\n async (data: Data) => {\n const puckData = data 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 onPublish?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:saved' }, '*');\n } else {\n setSaveStatus('error');\n }\n\n setSaving(false);\n },\n [pageId, apiClient, isEmbedded, onSave, onPublish, accessToken]\n );\n\n /* ── Change ── */\n const handleChange = useCallback(\n (data: Data) => {\n const puckData = data as unknown as PuckPageData;\n puckDataRef.current = puckData;\n onChange?.(puckData);\n if (isEmbedded) window.parent.postMessage({ type: 'puck:save' }, '*');\n },\n [onChange, isEmbedded]\n );\n\n /* ── iframe postMessage ── */\n useEffect(() => {\n if (!isEmbedded) return;\n\n const onMessage = (e: MessageEvent) => {\n switch (e.data?.type) {\n case 'puck:publish': {\n const btn = document.querySelector('[data-testid=\"puck-publish\"]') as HTMLButtonElement;\n btn ? btn.click() : puckDataRef.current && handlePublish(puckDataRef.current);\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, handlePublish]);\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={handlePublish}\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"]}
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":";;;;;;;AAUO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,WAAA,CAAY,QAAgB,SAAA,EAAmB;AAE7C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,IAAY,OAAA,GAAkC;AAC5C,IAAA,OAAO;AAAA,MACL,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,MAAA,EAAQ,kBAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAAmD;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,EAAI;AAAA,QACnE,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AACD,MAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACpD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,MAAA,EACA,QAAA,EACA,OACA,WAAA,EACmC;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,EAAI;AAAA,QACnE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,GAAG,IAAA,CAAK,OAAA;AAAA,UACR,GAAI,WAAA,IAAe,EAAE,aAAA,EAAe,WAAA;AAAY,SAClD;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM,EAAI;AAAA,OAC3D,CAAA;AACD,MAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACpD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,IAAA,EACA,MAAA,EACmC;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,iBAAA,CAAA,EAAqB;AAAA,QACzD,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,GAAI,MAAA,IAAU,EAAE,MAAA,EAAO,EAAI;AAAA,OACzD,CAAA;AACD,MAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACpD;AAAA,IACF;AAAA,EACF;AACF;AClFA,IAAM,YAAA,GAAe,cAAwC,IAAI,CAAA;AAI1D,IAAM,gBAAgB,CAAC,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAS,KAA0B;AACpF,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,SAAA,EAAW,IAAI,cAAA,CAAe,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC/C,SAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,GACpB;AAEA,EAAA,uBAAO,GAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAIO,SAAS,QAAA,GAA8B;AAC5C,EAAA,MAAM,GAAA,GAAM,WAAW,YAAY,CAAA;AACnC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,GAAA;AACT;;;ACjCO,IAAM,YAAA,GAAe;AAAA,EAC1B,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,OAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd;AAAA,EAWA,aAAA,EAAe;AAAA,IACb,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,SAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW,6BAAA;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,mBAAA;AAAA,IACR,cAAA,EAAgB,SAAA;AAAA,IAChB,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW;AAAA;AAEf,CAAA;AAGA,IAAI,iBAAA,GAAoB,KAAA;AACjB,IAAM,kBAAkB,MAAM;AACnC,EAAA,IAAI,iBAAA,IAAqB,OAAO,QAAA,KAAa,WAAA,EAAa;AAC1D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,CAAA,2DAAA,CAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,EAAA,iBAAA,GAAoB,IAAA;AACtB,CAAA;AC9DA,IAAM,UAAA,GAA2B,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAE,KAAA,EAAO,EAAC,EAAE,EAAG,KAAA,EAAO,EAAC,EAAE;AAmBxE,IAAM,cAAc,CAAC;AAAA,EAC1B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,EAAS,YAAA;AAAA,EACT;AACF,CAAA,KAAwB;AACtB,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,QAAA,EAAS;AAE/B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA8B,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAuC,MAAM,CAAA;AAEjF,EAAA,MAAM,WAAA,GAAc,OAAoB,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,KAAW,MAAA;AAGtE,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,eAAA,EAAgB;AAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAG1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,YAAY;AACvB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAA;AAC1C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,IAAA,GAAO,IAAI,OAAA,IAAW,GAAA,CAAI,MAAM,QAAA,GAAW,GAAA,CAAI,KAAK,QAAA,GAAW,UAAA;AACrE,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AACA,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAGtB,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,OAAO,IAAA,KAAgB;AACrB,MAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,CAAY,OAAA;AACxC,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,QAAA,GAAW,WAAA;AACjB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,aAAA,CAAc,MAAM,CAAA;AAEpB,MAAA,MAAM,MAAM,MAAM,SAAA,CAAU,SAAS,MAAA,EAAQ,QAAA,EAAU,QAAW,WAAW,CAAA;AAE7E,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,aAAA,CAAc,SAAS,CAAA;AACvB,QAAA,UAAA,CAAW,MAAM,aAAA,CAAc,MAAM,CAAA,EAAG,GAAI,CAAA;AAC5C,QAAA,MAAA,GAAS,QAAQ,CAAA;AACjB,QAAA,IAAI,UAAA,SAAmB,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,IAAgB,GAAG,CAAA;AAAA,MACvE,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,IAAI,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,GAAA,CAAI,OAAA,EAAQ,EAAG,GAAG,CAAA;AAAA,MACjG;AAEA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,QAAQ,WAAW;AAAA,GACrD;AAGA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,IAAA,KAAe;AACd,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,MAAM,QAAA,GAAW,IAAA;AACjB,MAAA,QAAA,GAAW,QAAQ,CAAA;AACnB,MAAA,IAAI,UAAA,SAAmB,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,cAAA,IAAkB,GAAG,CAAA;AAAA,IACzE,CAAA;AAAA,IACA,CAAC,UAAU,UAAU;AAAA,GACvB;AAGA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,IAAA,KAAe;AACd,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,eAAe;AAAA,GAClB;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAoB;AACrC,MAAA,QAAQ,CAAA,CAAE,MAAM,IAAA;AAAM,QACpB,KAAK,WAAA,EAAa;AAChB,UAAA,eAAA,EAAgB;AAChB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA;AACH,UAAA,QAAA,CAAS,aAAA,CAAc,IAAI,aAAA,CAAc,SAAA,EAAW,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC7G,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,QAAA,CAAS,cAAc,IAAI,aAAA,CAAc,SAAA,EAAW,EAAE,KAAK,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC7H,UAAA;AAAA,QACF,KAAK,eAAA,EAAiB;AACpB,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,4BAA4B,CAAA;AACjE,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,KAAA,IAAS,MAAA;AAC1B,YAAA,KAAA,CAAM,MAAM,QAAA,GAAW,CAAA;AACvB,YAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,KAAM,MAAA,GAAS,GAAA,GAAM,QAAA;AAC1C,YAAA,KAAA,CAAM,MAAM,UAAA,GAAa,qBAAA;AAAA,UAC3B;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,UAAA,EAAY,eAAe,CAAC,CAAA;AAGhC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAEjB,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,uBAAuB,CAAA;AAE5D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,YAAA,CAAa,qBAAqB,CAAA;AACtE,QAAA,MAAM,cAAc,aAAA,CAAc,OAAA,CAAQ,yBAAyB,CAAA,EAAG,aAAa,uBAAuB,CAAA;AAE1G,QAAA,MAAA,CAAO,OAAO,WAAA,CAAY;AAAA,UACxB,IAAA,EAAM,mBAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,aAAA;AAAA,YACN,IAAI,WAAA,IAAe;AAAA;AACrB,WACC,GAAG,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAkB;AACxC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,uBAAuB,CAAA,EAAG;AAC5C,QAAA,MAAA,CAAO,OAAO,WAAA,CAAY,EAAE,IAAA,EAAM,qBAAA,IAAyB,GAAG,CAAA;AAAA,MAChE;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AACpD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,KAAK,CAAA;AAExD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AACvD,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,cAAA,EAAgB,KAAK,CAAA;AAAA,IAC7D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,IAAI,OAAA,IAAW,CAAC,WAAA,EAAa;AAC3B,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,CAAa,OAAA,EAAS,SAAA,EAChC,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,CAAa,YAAA,EACvB,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,CAAa,OAAA,EAAS,CAAA;AAAA,sBAClCA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAA,CAAa,aAAa,QAAA,EAAA,mBAAA,EAAiB;AAAA,KAAA,EACvD,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAI,YAAA,GAAe,CAAC,YAAA,CAAa,EAAE,gBAAgB,MAAA,EAAQ,CAAC,CAAA,GAAI,EAAC;AAAA,IACjE,GAAI,gBAAgB;AAAC,GACvB;AAEA,EAAA,MAAM,eAAA,GAAkB,EAAE,MAAA,EAAQ,sBAAMA,GAAAA,CAAA,QAAA,EAAA,EAAE,CAAA,EAAK,GAAI,SAAA,IAAa,EAAC,EAAG;AAEpE,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,CAAa,SAAS,SAAA,EAChC,QAAA,EAAA;AAAA,oBAAAA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,iBAAA;AAAA,QACX,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,IACC,MAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAa,aAAA,EACtB,QAAA,EAAA,UAAA,KAAe,OAAA,GAAU,aAAA,GAAgB,WAAA,EAC5C;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACnNO,IAAM,cAAc,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAU,KAAwB;AAC5E,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EACH,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,MAAA,EAA0B,IAAA,EAAY,CAAA,EAChD,CAAA;AAEJ;;;ACbO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,MAAM,MAAA,GAAS,2CAAA,CAA4C,IAAA,CAAK,GAAG,CAAA;AACnE,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAEvC,EAAA,IAAI,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAClC,EAAA,IAAI,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAClC,EAAA,IAAI,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAElC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,CAAA;AAExB,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,KAAK,GAAA,GAAM,GAAA,CAAA;AAC/C,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,CAAA;AACH,QAAA,CAAA,GAAA,CAAA,CAAM,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,CAAA,IAAM,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AACxB,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AACxB,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAAA,IACrB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAAA,IACrB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG;AAAA,GACvB;AACF;AAEO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAChE,EAAA,MAAM,QAAQ,CAAA,GAAI,GAAA;AAClB,EAAA,MAAM,QAAQ,CAAA,GAAI,GAAA;AAClB,EAAA,MAAM,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAE3C,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAc;AACvB,IAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,GAAI,EAAA,IAAM,EAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAK,CAAA,CAC1B,SAAS,EAAE,CAAA,CACX,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAC/B;AAIO,SAAS,OAAA,CAAQ,KAAa,MAAA,EAAwB;AAC3D,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,SAAS,GAAG,CAAA;AAChC,EAAA,OAAO,QAAA,CAAS,GAAG,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,CAAA,GAAI,MAAM,CAAC,CAAA;AACjD;AAEO,SAAS,MAAA,CAAO,KAAa,MAAA,EAAwB;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,SAAS,GAAG,CAAA;AAChC,EAAA,OAAO,QAAA,CAAS,GAAG,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,CAAC,CAAA;AAC/C;AAIO,SAAS,qBAAqB,KAAA,EAA4B;AAC/D,EAAA,MAAM,KAAA,GAAkB,CAAC,SAAS,CAAA;AAGlC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG;AACvD,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,EAAE,WAAA,EAAY;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACnD;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,EAA0B,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAAA;AACnE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,+BAAA,EAAkC,KAAA,CAAM,UAAA,CAAW,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAClF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0BAAA,EAA6B,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA,GAAA,CAAK,CAAA;AAC1E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,EAA0B,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAAA;AACnE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,8BAAA,EAAiC,KAAA,CAAM,UAAA,CAAW,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,8BAAA,EAAiC,KAAA,CAAM,UAAA,CAAW,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAA+B,KAAA,CAAM,UAAA,CAAW,cAAc,CAAA,CAAA,CAAG,CAAA;AAE5E,EAAA,KAAA,MAAW,CAAC,OAAO,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA,EAAG;AAC1E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,+BAAA,EAAkC,KAAA,CAAM,OAAA,CAAQ,iBAAiB,CAAA,GAAA,CAAK,CAAA;AACjF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GAAA,CAAK,CAAA;AAC7E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GAAA,CAAK,CAAA;AAC7E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAA,CAAK,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAA,CAAK,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAA+B,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,GAAA,CAAK,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAA+B,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,GAAA,CAAK,CAAA;AAG3E,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAC7D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAIO,SAAS,eAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB,SAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,cAAA,EAAgB,SAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,UAAA,EAAY,+CAAA;AAAA,MACZ,iBAAA,EAAmB,+CAAA;AAAA,MACnB,YAAA,EAAc,EAAA;AAAA,MACd,UAAA,EAAY,GAAA;AAAA,MACZ,YAAA,EAAc;AAAA,QACZ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,IAAA;AAAA,QACJ,EAAA,EAAI,KAAA;AAAA,QACJ,EAAA,EAAI,GAAA;AAAA,QACJ,EAAA,EAAI,IAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,gBAAA,EAAkB,GAAA;AAAA,MAClB,gBAAA,EAAkB,GAAA;AAAA,MAClB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,iBAAA,EAAmB,IAAA;AAAA,MACnB,eAAA,EAAiB,EAAA;AAAA,MACjB,eAAA,EAAiB,EAAA;AAAA,MACjB,YAAA,EAAc,EAAA;AAAA,MACd,YAAA,EAAc,CAAA;AAAA,MACd,cAAA,EAAgB,EAAA;AAAA,MAChB,cAAA,EAAgB;AAAA;AAClB,GACF;AACF;AAQO,SAAS,UAAA,CAAW,MAAmB,SAAA,EAA8C;AAC1F,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,QAAQ,GAAI,SAAA,CAAU,MAAA,IAAU,EAAC,EAAG;AAAA,IACtD,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,YAAY,GAAI,SAAA,CAAU,UAAA,IAAc,EAAC,EAAG;AAAA,IAClE,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAI,SAAA,CAAU,OAAA,IAAW,EAAC,EAAG;AAAA,IACzD,YAAA,EAAc,EAAE,GAAI,IAAA,CAAK,YAAA,IAAgB,EAAC,EAAI,GAAI,SAAA,CAAU,YAAA,IAAgB,EAAC;AAAG,GAClF;AAGA,EAAA,IAAI,SAAA,CAAU,YAAY,YAAA,EAAc;AACtC,IAAA,MAAA,CAAO,WAAW,YAAA,GAAe;AAAA,MAC/B,GAAG,KAAK,UAAA,CAAW,YAAA;AAAA,MACnB,GAAG,UAAU,UAAA,CAAW;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tecof/theme-editor",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "React theme editor library for Tecof projects",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",