@jbpark/live-editor 1.15.2 → 1.15.3

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.
@@ -729,12 +729,13 @@ const validateBindingValue = (binding, value) => {
729
729
  };
730
730
  return VALID;
731
731
  }
732
- if (typeof value === "number") {
733
- if (binding.min !== void 0 && value < binding.min) return {
732
+ const numericValue = typeof value === "number" ? value : typeof value === "string" && value.trim() !== "" && !Number.isNaN(Number(value)) ? Number(value) : void 0;
733
+ if (numericValue !== void 0) {
734
+ if (binding.min !== void 0 && numericValue < binding.min) return {
734
735
  valid: false,
735
736
  message: `Must be at least ${binding.min}.`
736
737
  };
737
- if (binding.max !== void 0 && value > binding.max) return {
738
+ if (binding.max !== void 0 && numericValue > binding.max) return {
738
739
  valid: false,
739
740
  message: `Must be at most ${binding.max}.`
740
741
  };
@@ -770,4 +771,4 @@ const validateBindingValue = (binding, value) => {
770
771
  //#endregion
771
772
  export { parseArrayExpression as _, bulkUpdate as a, extract as c, getCurrentValue as d, parseBinding as f, extractObjectProperties as g, extractNodeValue as h, replaceIds as i, nanoid as l, createNodeFromValue as m, clone as n, update as o, arrayExpressionToCode as p, fillIds as r, clearExtractCache as s, validateBindingValue as t, findEditableChildren as u, parseValue as v, generateCode as y };
772
773
 
773
- //# sourceMappingURL=ast-Dq1EfxA5.js.map
774
+ //# sourceMappingURL=ast-CPJB8A2R.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ast-Dq1EfxA5.js","names":["_generate","t","parseExpression","t","parseExpression","parseExpression","t","t","parse","t","parse","t","parseExpression"],"sources":["../src/utils/ast/types.ts","../src/utils/ast/helpers.ts","../src/utils/ast/value.ts","../src/utils/ast/binding.ts","../node_modules/.pnpm/nanoid@3.3.18/node_modules/nanoid/index.browser.js","../src/utils/ast/extract.ts","../src/utils/ast/update.ts","../src/utils/ast/tree.ts","../src/utils/ast/validate.ts"],"sourcesContent":["export interface Attribute {\n name: string;\n value: string | null;\n isStringLiteral?: boolean;\n}\n\nexport interface DataAttrNode {\n id?: string;\n tagName: string;\n attributes: Attribute[];\n dataAttributes: Attribute[];\n textContent: string;\n rawChildren?: string;\n loc?: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n children?: DataAttrNode[];\n isFragment?: boolean;\n bindings?: BindingItem[];\n}\n\nexport interface BindingOption {\n label: string;\n value: string;\n}\n\nexport const BINDING_TYPES = [\n 'array',\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'color',\n 'jsx',\n 'richtext',\n 'date',\n 'url',\n 'icon-picker',\n 'asset-picker',\n] as const;\n\nexport type BindingType = (typeof BINDING_TYPES)[number];\n\nexport interface BindingRenderLeaf {\n type: BindingType;\n property?: string;\n render?: BindingRenderMap;\n}\n\nexport interface BindingRenderMap {\n [key: string]: BindingRenderLeaf | BindingRenderMap;\n}\n\nexport interface BindingItem {\n label: string;\n property: string;\n type?: BindingType;\n options?: BindingOption[];\n render?: BindingRenderMap;\n min?: number;\n max?: number;\n pattern?: string;\n required?: boolean;\n}\n\nexport type NodeValueType =\n | 'boolean'\n | 'number'\n | 'string'\n | 'null'\n | 'array'\n | 'object'\n | 'unknown';\n\nexport type EditableNodeValueType = 'boolean' | 'number' | 'string' | 'null';\n\nexport interface ExtractedNodeValue {\n type: NodeValueType;\n value: string | number | boolean | null;\n}\n","import _generate from '@babel/generator';\nimport { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\n\nimport { REGEX } from '../../constants';\nimport type { Attribute } from './types';\n\n// Same @babel/* CJS/ESM interop issue as document.ts's traverse import:\n// @babel/generator's CJS build re-exports itself as `{ default: generate,\n// generate, CodeGenerator }`, and Vite's browser dependency pre-bundling\n// doesn't unwrap that inner `.default` again — `generate` resolved to the\n// whole exports object, not the function. Every generateCode() call threw,\n// which extract.ts's extractAttributes() silently swallows into a `null`\n// attribute value, and update.ts's callers surface as \"Failed to parse/\n// update this section\" toasts.\nconst generate =\n typeof _generate === 'function'\n ? _generate\n : (_generate as unknown as { default: typeof _generate }).default;\n\nexport const wrap = (code: string) => {\n return `<>${code}</>`;\n};\n\nexport const unwrap = (generated: string) => {\n return generated\n .replace(/^<>\\s*/g, '')\n .replace(/\\s*<\\/>\\s*;?\\s*$/g, '')\n .trim();\n};\n\nexport const attrValue = ({\n value,\n isStringLiteral,\n}: Attribute): t.JSXAttribute['value'] => {\n if (value === null) {\n return null;\n }\n\n if (isStringLiteral) {\n return t.stringLiteral(value);\n }\n\n const trimmed = value.trim();\n\n if (REGEX.NUMBER.test(trimmed)) {\n return t.jsxExpressionContainer(t.numericLiteral(parseFloat(trimmed)));\n }\n\n if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {\n const expr = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n return t.jsxExpressionContainer(expr);\n }\n\n try {\n const expr = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n return t.jsxExpressionContainer(expr);\n } catch {\n return t.stringLiteral(trimmed);\n }\n};\n\nexport const generateCode = (node: t.Node): string => {\n return generate(node, { jsescOption: { minimal: true } }).code;\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\n\nimport { REGEX } from '../../constants';\nimport { generateCode } from './helpers';\nimport type { ExtractedNodeValue, NodeValueType } from './types';\n\nconst dedent = (str: string): string => {\n const lines = str\n .replace(/^\\n/, '')\n .replace(/\\n\\s*$/, '')\n .split('\\n');\n\n const indent = lines.reduce((min, line) => {\n if (!line.trim()) {\n return min;\n }\n const match = line.match(/^(\\s*)/);\n return Math.min(min, match?.[1]?.length ?? 0);\n }, Infinity);\n\n return indent === Infinity\n ? str.trim()\n : lines.map(line => line.slice(indent)).join('\\n');\n};\n\n// AST 노드를 코드 실행(new Function/eval) 없이 순수 리터럴 구조만 재귀적으로\n// 실제 JS 값으로 변환한다. 함수 호출, 변수 참조 등 리터럴이 아닌 표현식은\n// 평가하지 않고 undefined를 반환한다 — 사용자 코드는 iframe 안에서만 실행한다는\n// 이 저장소의 원칙(AGENTS.md)을 이 패널 UI(메인 문서에서 렌더링됨)에서도 지키기 위함.\nexport const evaluateLiteral = (node: t.Node): unknown => {\n if (t.isStringLiteral(node)) {\n return node.value;\n }\n\n if (t.isNumericLiteral(node)) {\n return node.value;\n }\n\n if (t.isBooleanLiteral(node)) {\n return node.value;\n }\n\n if (t.isNullLiteral(node)) {\n return null;\n }\n\n if (t.isIdentifier(node) && node.name === 'undefined') {\n return undefined;\n }\n\n if (\n t.isUnaryExpression(node) &&\n node.operator === '-' &&\n t.isNumericLiteral(node.argument)\n ) {\n return -node.argument.value;\n }\n\n if (t.isTemplateLiteral(node) && node.expressions.length === 0) {\n return node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw ?? '';\n }\n\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n return generateCode(node);\n }\n\n if (t.isArrayExpression(node)) {\n return node.elements.map(element =>\n element ? evaluateLiteral(element) : null,\n );\n }\n\n if (t.isObjectExpression(node)) {\n const result: Record<string, unknown> = {};\n\n for (const prop of node.properties) {\n if (!t.isObjectProperty(prop)) {\n continue;\n }\n\n let key: string | null = null;\n\n if (t.isIdentifier(prop.key)) {\n key = prop.key.name;\n } else if (t.isStringLiteral(prop.key)) {\n key = prop.key.value;\n } else if (t.isNumericLiteral(prop.key)) {\n key = String(prop.key.value);\n }\n\n if (key === null) {\n continue;\n }\n\n result[key] = evaluateLiteral(prop.value);\n }\n\n return result;\n }\n\n return undefined;\n};\n\nexport const parseValue = (value: unknown): unknown => {\n if (typeof value !== 'string') {\n return value;\n }\n\n const trimmed = value.trim();\n\n if (!trimmed) {\n return value;\n }\n\n if (REGEX.NUMBER.test(trimmed)) {\n return parseFloat(trimmed);\n }\n\n if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {\n if (trimmed === 'true') {\n return true;\n }\n if (trimmed === 'false') {\n return false;\n }\n if (trimmed === 'null') {\n return null;\n }\n if (trimmed === 'undefined') {\n return undefined;\n }\n }\n\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n const ast = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n\n if (t.isObjectExpression(ast) || t.isArrayExpression(ast)) {\n return evaluateLiteral(ast);\n }\n } catch {\n /* ignore */\n }\n\n return value;\n }\n\n return value;\n};\n\nexport const extractNodeValue = (node: t.Node): ExtractedNodeValue => {\n if (t.isBooleanLiteral(node)) {\n return { type: 'boolean', value: node.value };\n }\n\n if (t.isNumericLiteral(node)) {\n return { type: 'number', value: node.value };\n }\n\n if (\n t.isUnaryExpression(node) &&\n node.operator === '-' &&\n t.isNumericLiteral(node.argument)\n ) {\n return { type: 'number', value: -node.argument.value };\n }\n\n if (t.isStringLiteral(node)) {\n return { type: 'string', value: node.value };\n }\n\n if (t.isTemplateLiteral(node)) {\n if (node.expressions.length === 0 && node.quasis.length === 1) {\n return {\n type: 'string',\n value: dedent(\n node.quasis[0]!.value.cooked ?? node.quasis[0]!.value.raw,\n ),\n };\n }\n return { type: 'string', value: generateCode(node) };\n }\n\n if (t.isNullLiteral(node)) {\n return { type: 'null', value: null };\n }\n\n if (t.isArrayExpression(node)) {\n return { type: 'array', value: generateCode(node) };\n }\n\n if (t.isObjectExpression(node)) {\n return { type: 'object', value: generateCode(node) };\n }\n\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n return { type: 'string', value: generateCode(node) };\n }\n\n return { type: 'unknown', value: null };\n};\n\nexport const createNodeFromValue = (\n type: NodeValueType,\n value: unknown,\n): t.Expression | null => {\n switch (type) {\n case 'boolean': {\n return t.booleanLiteral(value === true);\n }\n case 'number': {\n return t.numericLiteral(Number(value));\n }\n case 'string': {\n return t.stringLiteral(String(value));\n }\n case 'null': {\n return t.nullLiteral();\n }\n case 'array':\n case 'object':\n case 'unknown': {\n return null;\n }\n default: {\n return null;\n }\n }\n};\n\nexport const parseArrayExpression = (value: string) => {\n try {\n const ast = parseExpression(value, {\n plugins: ['jsx', 'typescript'],\n });\n\n if (!t.isArrayExpression(ast)) {\n return null;\n }\n\n return ast;\n } catch (error) {\n console.error('❌ Array parsing error:', error);\n return null;\n }\n};\n\nexport const extractObjectProperties = (\n element: t.ObjectExpression,\n): Record<string, ExtractedNodeValue & { astNode: t.Node }> => {\n const properties: Record<string, ExtractedNodeValue & { astNode: t.Node }> =\n {};\n\n element.properties.forEach(prop => {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n const key = prop.key.name;\n\n if (key === 'children') {\n return;\n }\n\n const extracted = extractNodeValue(prop.value);\n\n properties[key] = {\n ...extracted,\n astNode: prop.value,\n };\n }\n });\n\n return properties;\n};\n\nexport const arrayExpressionToCode = (\n elements: t.ObjectExpression[],\n): string => {\n const nextAst = t.arrayExpression(elements);\n return generateCode(nextAst);\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { z } from 'zod';\n\nimport { BINDING_PROP, DATA_ATTR } from '../../constants';\nimport {\n BINDING_TYPES,\n type BindingItem,\n type BindingOption,\n type BindingRenderMap,\n type DataAttrNode,\n} from './types';\nimport { evaluateLiteral, parseArrayExpression } from './value';\n\nconst bindingTypeSchema = z.enum(BINDING_TYPES);\n\nconst bindingOptionSchema = z.object({\n label: z.string(),\n value: z.string(),\n});\n\nconst bindingRenderLeafSchema = z.object({\n type: bindingTypeSchema,\n property: z.string().optional(),\n});\n\nconst rawBindingItemSchema = z.object({\n label: z.string(),\n property: z.string().optional(),\n type: bindingTypeSchema.optional(),\n options: z.array(bindingOptionSchema).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n pattern: z.string().optional(),\n required: z.boolean().optional(),\n});\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\n// A render map entry is either a \"leaf\" (has its own `type`) or a nested\n// map of further entries — recurse into whichever it looks like, and drop\n// anything that matches neither instead of failing the whole map.\nconst sanitizeRenderMap = (value: unknown): BindingRenderMap | undefined => {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const map: BindingRenderMap = {};\n\n for (const [key, raw] of Object.entries(value)) {\n if (!isPlainObject(raw)) {\n continue;\n }\n\n if ('type' in raw) {\n const leaf = bindingRenderLeafSchema.safeParse(raw);\n\n if (leaf.success) {\n const render = sanitizeRenderMap(raw.render);\n map[key] = render ? { ...leaf.data, render } : leaf.data;\n }\n continue;\n }\n\n const nested = sanitizeRenderMap(raw);\n\n if (nested) {\n map[key] = nested;\n }\n }\n\n return Object.keys(map).length > 0 ? map : undefined;\n};\n\nexport const parseBinding = (bindingValue: string | null): BindingItem[] => {\n if (!bindingValue) {\n return [];\n }\n\n const ast = parseArrayExpression(bindingValue);\n\n if (!ast) {\n return [];\n }\n\n const raw = evaluateLiteral(ast);\n\n if (!Array.isArray(raw)) {\n return [];\n }\n\n const items: BindingItem[] = [];\n\n for (const rawItem of raw) {\n if (!isPlainObject(rawItem)) {\n continue;\n }\n\n // Drop an unrecognized `type` instead of rejecting the whole item — an\n // authored binding with a typo'd/future type string still works as an\n // untyped field rather than disappearing entirely.\n const sanitizedType = bindingTypeSchema.safeParse(rawItem.type);\n\n // Drop individually malformed options instead of rejecting the whole\n // item — a select field with 3 valid options and 1 malformed one should\n // still work with the 3 valid ones.\n const sanitizedOptions = Array.isArray(rawItem.options)\n ? rawItem.options\n .map(option => {\n const parsed = bindingOptionSchema.safeParse(option);\n return parsed.success ? parsed.data : null;\n })\n .filter((option): option is BindingOption => option !== null)\n : undefined;\n\n const parsed = rawBindingItemSchema.safeParse({\n ...rawItem,\n type: sanitizedType.success ? sanitizedType.data : undefined,\n options: sanitizedOptions?.length ? sanitizedOptions : undefined,\n });\n\n if (!parsed.success) {\n continue;\n }\n\n const { label, property, type, options, min, max, pattern, required } =\n parsed.data;\n\n if (property === undefined && type !== 'richtext') {\n continue;\n }\n\n const render = sanitizeRenderMap(rawItem.render);\n\n items.push({\n label,\n property: property ?? BINDING_PROP.INNER_HTML,\n ...(type !== undefined && { type }),\n ...(options?.length && { options }),\n ...(render && { render }),\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...(pattern !== undefined && { pattern }),\n ...(required !== undefined && { required }),\n });\n }\n\n return items;\n};\n\nexport const getCurrentValue = (\n node: DataAttrNode,\n property: string,\n): string => {\n switch (property) {\n case BINDING_PROP.INNER_TEXT: {\n return node.textContent || '';\n }\n\n case BINDING_PROP.INNER_HTML: {\n // richtext 타입: dangerouslySetInnerHTML={{ __html }} 에서 읽기\n const dsiAttr = node.attributes.find(\n a => a.name === 'dangerouslySetInnerHTML',\n );\n if (dsiAttr?.value) {\n try {\n const expr = parseExpression(dsiAttr.value, {\n plugins: ['jsx', 'typescript'],\n });\n if (t.isObjectExpression(expr)) {\n const htmlProp = expr.properties.find(\n p =>\n t.isObjectProperty(p) &&\n t.isIdentifier(p.key) &&\n p.key.name === '__html',\n ) as t.ObjectProperty | undefined;\n if (htmlProp) {\n if (t.isStringLiteral(htmlProp.value)) {\n return htmlProp.value.value;\n }\n if (\n t.isTemplateLiteral(htmlProp.value) &&\n htmlProp.value.expressions.length === 0\n ) {\n return (\n htmlProp.value.quasis[0]?.value.cooked ??\n htmlProp.value.quasis[0]?.value.raw ??\n ''\n );\n }\n }\n }\n } catch {\n // ignore\n }\n }\n return node.rawChildren || node.textContent || '';\n }\n\n case BINDING_PROP.CHILDREN: {\n return JSON.stringify(node?.children || []);\n }\n\n default: {\n const customAttr = node.attributes.find(attr => attr.name === property);\n const value = customAttr?.value || '';\n\n return value;\n }\n }\n};\n\nconst hasEditableBindings = (node: DataAttrNode): boolean => {\n const bindingAttr = node.dataAttributes.find(\n attr => attr.name === DATA_ATTR.BINDING,\n );\n\n if (!bindingAttr?.value) {\n return false;\n }\n\n const bindings = node.bindings || parseBinding(bindingAttr.value);\n\n return bindings.length > 0;\n};\n\nexport const findEditableChildren = (node: DataAttrNode): DataAttrNode[] => {\n const editableChildren: DataAttrNode[] = [];\n\n const traverse = (children: DataAttrNode[] | undefined) => {\n if (!children) {\n return;\n }\n\n for (const child of children) {\n if (hasEditableBindings(child)) {\n editableChildren.push(child);\n }\n traverse(child.children);\n }\n };\n\n traverse(node.children);\n\n return editableChildren;\n};\n","\nimport { urlAlphabet } from './url-alphabet/index.js'\n\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\n\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n\n\n\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n if (size <= 0) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\n\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP, CONFIG, DATA_ATTR } from '../../constants';\nimport { createBoundedCache } from '../cache';\nimport { parseBinding } from './binding';\nimport { traverse } from './document';\nimport { attrValue, generateCode, wrap } from './helpers';\nimport type { Attribute, BindingItem, DataAttrNode } from './types';\n\nconst collectText = (\n children: (\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXElement\n | t.JSXFragment\n | t.JSXSpreadChild\n )[],\n) => {\n return children\n .filter(c => t.isJSXText(c))\n .map(c => (c as t.JSXText).value.trim())\n .filter(v => v.length)\n .join(' ');\n};\n\nconst getTagName = (opening: t.JSXOpeningElement): string => {\n if (t.isJSXIdentifier(opening.name)) {\n return opening.name.name;\n }\n\n if (t.isJSXMemberExpression(opening.name)) {\n return resolveMemberName(opening.name);\n }\n\n return '';\n};\n\nconst resolveMemberName = (expr: t.JSXMemberExpression): string => {\n const parts: string[] = [];\n\n const collectMemberParts = (\n node: t.JSXMemberExpression['object'] | t.JSXMemberExpression['property'],\n ): void => {\n if (t.isJSXIdentifier(node)) {\n parts.push(node.name);\n } else if (t.isJSXMemberExpression(node)) {\n collectMemberParts(node.object);\n\n if (t.isJSXIdentifier(node.property)) {\n parts.push(node.property.name);\n }\n }\n };\n\n collectMemberParts(expr.object);\n\n if (t.isJSXIdentifier(expr.property)) {\n parts.push(expr.property.name);\n }\n\n return parts.join('.');\n};\n\nconst parseJSXName = (\n tagName: string,\n): t.JSXIdentifier | t.JSXMemberExpression => {\n const parts = tagName.split('.');\n\n if (parts.length === 1) {\n return t.jsxIdentifier(parts[0]!);\n }\n\n let expr: t.JSXIdentifier | t.JSXMemberExpression = t.jsxIdentifier(\n parts[0]!,\n );\n\n for (let i = 1; i < parts.length; i++) {\n expr = t.jsxMemberExpression(expr, t.jsxIdentifier(parts[i]!));\n }\n\n return expr;\n};\n\nconst extractCache = createBoundedCache<string, DataAttrNode[]>(\n CONFIG.CACHE_LIMIT,\n);\n\nconst extractAttributes = (\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[],\n): { allAttrs: Attribute[]; dataAttrs: Attribute[] } => {\n const allAttrs: Attribute[] = [];\n const dataAttrs: Attribute[] = [];\n\n for (const attr of attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) {\n continue;\n }\n\n const name = attr.name.name;\n let value: string | null = null;\n let isStringLiteral = false;\n\n if (attr.value) {\n if (t.isStringLiteral(attr.value)) {\n value = attr.value.value;\n isStringLiteral = true;\n } else if (t.isJSXExpressionContainer(attr.value)) {\n try {\n value = generateCode(attr.value.expression);\n isStringLiteral = false;\n } catch {\n value = null;\n }\n }\n }\n\n const entry = { name, value, isStringLiteral };\n\n allAttrs.push(entry);\n\n if (name.startsWith('data-')) {\n dataAttrs.push(entry);\n }\n }\n\n return { allAttrs, dataAttrs };\n};\n\nconst buildChildElements = (\n node: DataAttrNode,\n): (t.JSXText | t.JSXElement | t.JSXFragment)[] => {\n const childElements: (t.JSXText | t.JSXElement | t.JSXFragment)[] = [];\n\n if (node.textContent) {\n childElements.push(t.jsxText(node.textContent));\n }\n\n node.children?.forEach(child => {\n const childJSX = nodeToJSX(child);\n if (childJSX) {\n childElements.push(childJSX);\n }\n });\n\n return childElements;\n};\n\nexport const nodeToJSX = (\n node: DataAttrNode,\n): t.JSXElement | t.JSXFragment | null => {\n try {\n if (node.isFragment) {\n const childElements = buildChildElements(node);\n\n return t.jsxFragment(\n t.jsxOpeningFragment(),\n t.jsxClosingFragment(),\n childElements,\n );\n }\n\n if (\n node.tagName === 'div' &&\n node.dataAttributes.some(attr => attr.name === 'data-item')\n ) {\n if (node.children) {\n return nodeToJSX(node.children[0]!);\n }\n return null;\n }\n\n const attributes = node.attributes.map(attr => {\n const attrName = t.jsxIdentifier(attr.name);\n\n if (!attr.value) {\n return t.jsxAttribute(attrName, null);\n }\n\n return t.jsxAttribute(attrName, attrValue(attr));\n });\n\n const elementName = parseJSXName(node.tagName);\n\n const openingElement = t.jsxOpeningElement(elementName, attributes);\n\n const closingElement = t.jsxClosingElement(elementName);\n const children = buildChildElements(node);\n\n return t.jsxElement(openingElement, closingElement, children, false);\n } catch (error) {\n console.error('❌ DataAttrNode to JSX conversion error:', error);\n return null;\n }\n};\n\nconst createWrapperNode = (\n textContent: string,\n children: DataAttrNode[],\n): DataAttrNode => ({\n tagName: 'div',\n id: nanoid(6),\n attributes: [{ name: DATA_ATTR.ITEM, value: 'true' }],\n dataAttributes: [{ name: DATA_ATTR.ITEM, value: 'true' }],\n textContent,\n children,\n});\n\nconst createFragmentNode = (\n textContent: string,\n children: DataAttrNode[],\n): DataAttrNode => ({\n tagName: '',\n id: nanoid(6),\n attributes: [],\n dataAttributes: [],\n textContent,\n children,\n isFragment: true,\n});\n\nconst processChildrenBinding = (\n jsxElement: t.JSXElement,\n processedNodes?: WeakSet<t.JSXElement | t.JSXFragment>,\n shouldWrap: boolean = true,\n): DataAttrNode[] | undefined => {\n const jsxChildren = jsxElement.children.filter(\n child => t.isJSXElement(child) || t.isJSXFragment(child),\n );\n\n if (!jsxChildren.length) {\n return undefined;\n }\n\n const childrenNodes: DataAttrNode[] = [];\n\n jsxChildren.forEach(child => {\n if (t.isJSXElement(child)) {\n const childResults = extractFromNode(child, processedNodes);\n\n if (shouldWrap) {\n const wrapperNode = createWrapperNode(\n collectText(child.children),\n childResults,\n );\n childrenNodes.push(wrapperNode);\n } else {\n childrenNodes.push(...childResults);\n }\n } else if (t.isJSXFragment(child)) {\n processedNodes?.add(child);\n\n const fragmentChildren: DataAttrNode[] = [];\n\n child.children.forEach(fragmentChild => {\n if (t.isJSXElement(fragmentChild)) {\n const childResults = extractFromNode(fragmentChild, processedNodes);\n fragmentChildren.push(...childResults);\n }\n });\n\n if (fragmentChildren.length) {\n const fragmentNode = createFragmentNode(\n collectText(child.children),\n fragmentChildren,\n );\n childrenNodes.push(fragmentNode);\n }\n }\n });\n\n return childrenNodes.length ? childrenNodes : undefined;\n};\n\nconst skipItemsChildren = (\n jsxElement: t.JSXElement,\n processedNodes: WeakSet<t.JSXElement | t.JSXFragment>,\n propertyName: string = 'items',\n): void => {\n const opening = jsxElement.openingElement;\n\n const itemsAttr = opening.attributes.find(\n attr =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === propertyName,\n );\n\n if (!itemsAttr || !t.isJSXAttribute(itemsAttr)) {\n return;\n }\n\n if (\n itemsAttr.value &&\n t.isJSXExpressionContainer(itemsAttr.value) &&\n t.isArrayExpression(itemsAttr.value.expression)\n ) {\n const arrayExpr = itemsAttr.value.expression;\n\n arrayExpr.elements.forEach(element => {\n if (t.isObjectExpression(element)) {\n element.properties.forEach(prop => {\n if (\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n t.isJSXElement(prop.value)\n ) {\n markProcessedJSX(prop.value, processedNodes);\n }\n });\n }\n });\n }\n};\n\nconst markProcessedJSX = (\n node: t.Node,\n processedNodes: WeakSet<t.JSXElement | t.JSXFragment>,\n): void => {\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n processedNodes.add(node as t.JSXElement | t.JSXFragment);\n node.children.forEach(child => markProcessedJSX(child, processedNodes));\n return;\n }\n\n const expression =\n t.isJSXExpressionContainer(node) || t.isParenthesizedExpression(node);\n\n if (expression) {\n markProcessedJSX(node.expression, processedNodes);\n }\n};\n\ninterface NodeBindingInfo {\n tagName: string;\n allAttrs: Attribute[];\n dataAttrs: Attribute[];\n bindings: BindingItem[];\n childrenBinding: BindingItem | undefined;\n arrayBindings: BindingItem[];\n rawChildren: string | undefined;\n}\n\n// Shared prefix for the top-level traverse() visitor below and the manual\n// recursive descent in extractFromNode: read the tag name, attributes, and\n// parsed bindings off one JSXElement. What differs between the two callers\n// is how childrenNodes gets computed and whether the result is pushed at\n// all — traverse() only records elements with data-* attributes, while\n// extractFromNode always records the children it's asked to (see each call\n// site for details).\nconst readNodeBindingInfo = (node: t.JSXElement): NodeBindingInfo => {\n const opening = node.openingElement;\n const tagName = getTagName(opening);\n const { allAttrs, dataAttrs } = extractAttributes(opening.attributes);\n\n const bindingAttr = dataAttrs.find(attr => attr.name === DATA_ATTR.BINDING);\n const bindings = bindingAttr?.value ? parseBinding(bindingAttr.value) : [];\n\n const childrenBinding = bindings.find(\n b => b.property === BINDING_PROP.CHILDREN,\n );\n const arrayBindings = bindings.filter(\n b => b.property === BINDING_PROP.ITEMS || b.type === 'array',\n );\n\n const innerHtmlBinding = bindings.find(\n b => b.property === BINDING_PROP.INNER_HTML,\n );\n\n let rawChildren: string | undefined;\n if (innerHtmlBinding && node.children.length > 0) {\n rawChildren = node.children\n .map(child => generateCode(child))\n .join('')\n .trim();\n }\n\n return {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n arrayBindings,\n rawChildren,\n };\n};\n\nconst parseToNodes = (raw: string): DataAttrNode[] => {\n const wrapped = wrap(raw);\n const ast = parse(wrapped, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n errorRecovery: true,\n });\n\n const results: DataAttrNode[] = [];\n\n // babel's traverse() below visits every JSXElement in the tree, top to\n // bottom, regardless of structure. But some elements are meant to be\n // recorded as *structural* children of another result — e.g. a node\n // wrapped by processChildrenBinding()/extractFromNode() into a parent's\n // `children` array, or an element sitting inside an `items` binding's\n // array literal (skipped via skipItemsChildren()/markProcessedJSX()) —\n // not as their own top-level entry in `results`. Without this WeakSet,\n // traverse() would independently re-visit those same elements once it\n // reaches them in the tree and add a second, duplicate entry for them.\n // Each helper below adds a node here the moment it pulls that node out\n // of the normal top-level flow, and the JSXElement() visitor skips\n // anything already marked.\n const processedNodes = new WeakSet<t.JSXElement | t.JSXFragment>();\n\n traverse(ast, {\n JSXElement(path) {\n if (processedNodes.has(path.node)) {\n return;\n }\n\n const {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n arrayBindings,\n rawChildren,\n } = readNodeBindingInfo(path.node);\n\n if (!tagName || !dataAttrs.length) {\n return;\n }\n\n let childrenNodes: DataAttrNode[] | undefined;\n\n if (childrenBinding) {\n childrenNodes = processChildrenBinding(path.node, processedNodes);\n }\n\n for (const arrayBinding of arrayBindings) {\n skipItemsChildren(path.node, processedNodes, arrayBinding.property);\n }\n\n results.push({\n tagName,\n attributes: allAttrs,\n dataAttributes: dataAttrs,\n textContent: collectText(path.node.children),\n rawChildren,\n children: childrenNodes,\n bindings,\n loc: path.node.loc\n ? {\n start: {\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n end: {\n line: path.node.loc.end.line,\n column: path.node.loc.end.column,\n },\n }\n : undefined,\n });\n },\n });\n\n return results;\n};\n\nexport function extract(raw: string): DataAttrNode[] {\n if (extractCache.has(raw)) {\n return extractCache.get(raw)!;\n }\n\n const results = parseToNodes(raw);\n\n extractCache.set(raw, results);\n\n return results;\n}\n\nfunction extractFromNode(\n node: t.JSXElement,\n processedNodes?: WeakSet<t.JSXElement | t.JSXFragment>,\n): DataAttrNode[] {\n processedNodes?.add(node);\n\n const {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n rawChildren,\n } = readNodeBindingInfo(node);\n\n let childrenNodes: DataAttrNode[] | undefined;\n\n if (childrenBinding) {\n childrenNodes = processChildrenBinding(node, processedNodes);\n }\n\n if (!childrenNodes) {\n childrenNodes = processChildrenBinding(node, processedNodes, false);\n }\n\n return [\n {\n tagName,\n attributes: allAttrs,\n dataAttributes: dataAttrs,\n textContent: collectText(node.children),\n rawChildren,\n children: childrenNodes,\n bindings,\n },\n ];\n}\n\nexport function clearExtractCache() {\n extractCache.clear();\n}\n","import { parse } from '@babel/parser';\nimport type { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP, DATA_ATTR, REGEX } from '../../constants';\nimport { parseBinding } from './binding';\nimport { traverse } from './document';\nimport { nodeToJSX } from './extract';\nimport { attrValue, generateCode, unwrap, wrap } from './helpers';\nimport type { DataAttrNode } from './types';\n\nconst updateInnerText = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n const jsxChildren = path.node.children;\n\n for (let i = jsxChildren.length - 1; i >= 0; i--) {\n if (t.isJSXText(jsxChildren[i])) {\n jsxChildren.splice(i, 1);\n }\n }\n\n jsxChildren.push(t.jsxText(value));\n return true;\n};\n\n// Injects a `{__PREFIX_<id>__}` JSX expression container as a placeholder,\n// then records how the placeholder's *generated source text* should be\n// string-replaced with the real value once generateCode() has run — used\n// for values (raw HTML, arbitrary JSX/expressions) that can't be\n// represented as AST literals, so we can't just build the real node here.\n//\n// `asRawContent: true` replaces the placeholder *including* its enclosing\n// braces, so the raw value lands as literal children content instead of a\n// JS expression (used for innerHTML). Leaving it false replaces only the\n// identifier inside the braces, so the value is inserted as the expression\n// itself (used for a `type: 'jsx'` attribute value).\nconst injectPlaceholder = (\n prefix: string,\n value: string,\n placeholders: Map<string, string>,\n { asRawContent = false }: { asRawContent?: boolean } = {},\n): t.JSXExpressionContainer => {\n const name = `__${prefix}_${nanoid(6)}__`;\n const container = t.jsxExpressionContainer(t.identifier(name));\n\n placeholders.set(asRawContent ? `{${name}}` : name, value);\n\n return container;\n};\n\nconst updateInnerHTML = (\n path: NodePath<t.JSXElement>,\n value: string,\n placeholders: Map<string, string>,\n): boolean => {\n path.node.children = [\n injectPlaceholder('HTML', value, placeholders, { asRawContent: true }),\n ];\n\n return true;\n};\n\nconst updateChildren = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n try {\n const childrenData = JSON.parse(value) as DataAttrNode[];\n\n path.node.children.length = 0;\n\n childrenData.forEach(childData => {\n const jsxElement = nodeToJSX(childData);\n if (jsxElement) {\n path.node.children.push(jsxElement);\n }\n });\n\n return true;\n } catch (error) {\n console.error('❌ Children update error:', error);\n return false;\n }\n};\n\nconst updateRichtext = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n path.node.children = [];\n\n const opening = path.node.openingElement;\n const htmlObject = t.objectExpression([\n t.objectProperty(t.identifier('__html'), t.stringLiteral(value)),\n ]);\n\n const existingAttr = opening.attributes.find(\n a =>\n t.isJSXAttribute(a) &&\n t.isJSXIdentifier(a.name) &&\n a.name.name === 'dangerouslySetInnerHTML',\n );\n\n if (existingAttr && t.isJSXAttribute(existingAttr)) {\n existingAttr.value = t.jsxExpressionContainer(htmlObject);\n } else {\n opening.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier('dangerouslySetInnerHTML'),\n t.jsxExpressionContainer(htmlObject),\n ),\n );\n }\n\n return true;\n};\n\nconst updateAttribute = (\n opening: t.JSXOpeningElement,\n propertyName: string,\n value: string,\n): boolean => {\n const customAttr = opening.attributes.find(\n attr =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === propertyName,\n );\n\n if (customAttr && t.isJSXAttribute(customAttr)) {\n const trimmed = value.trim();\n const isExpression =\n trimmed.startsWith('[') ||\n trimmed.startsWith('{') ||\n REGEX.NUMBER.test(trimmed) ||\n REGEX.BOOLEAN_OR_NULL.test(trimmed);\n\n customAttr.value = attrValue({\n name: propertyName,\n value,\n isStringLiteral: !isExpression,\n });\n\n return true;\n }\n\n return false;\n};\n\nexport interface UpdateResult {\n code: string;\n success: boolean;\n}\n\nexport const update = (\n code: string,\n dataId: string,\n label: string,\n value: string,\n): UpdateResult => {\n try {\n const wrapped = wrap(code);\n const ast = parse(wrapped, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n let changed = false;\n const jsxPlaceholders = new Map<string, string>();\n\n traverse(ast, {\n JSXElement(path) {\n const opening = path.node.openingElement;\n\n const idAttr = opening.attributes.find(attr => {\n return (\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === DATA_ATTR.ID &&\n attr.value &&\n t.isStringLiteral(attr.value) &&\n attr.value.value === dataId\n );\n });\n\n if (!idAttr) {\n return;\n }\n\n const bindingAttr = opening.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === DATA_ATTR.BINDING,\n );\n\n if (!bindingAttr?.value) {\n return;\n }\n\n let bindingValue = '';\n\n if (t.isStringLiteral(bindingAttr.value)) {\n bindingValue = bindingAttr.value.value;\n } else if (t.isJSXExpressionContainer(bindingAttr.value)) {\n try {\n bindingValue = generateCode(bindingAttr.value.expression);\n } catch {\n return;\n }\n }\n\n const bindings = parseBinding(bindingValue);\n\n const propertyBinding = bindings.find(\n binding => binding.label === label,\n );\n\n if (!propertyBinding) {\n return;\n }\n\n switch (propertyBinding.property) {\n case BINDING_PROP.INNER_TEXT: {\n changed = updateInnerText(path, value);\n break;\n }\n\n case BINDING_PROP.INNER_HTML: {\n if (propertyBinding.type === 'richtext') {\n changed = updateRichtext(path, value);\n } else {\n changed = updateInnerHTML(path, value, jsxPlaceholders);\n }\n break;\n }\n\n case BINDING_PROP.CHILDREN: {\n changed = updateChildren(path, value);\n break;\n }\n\n default: {\n if (propertyBinding.type === 'jsx') {\n const attr = opening.attributes.find(\n a =>\n t.isJSXAttribute(a) &&\n t.isJSXIdentifier(a.name) &&\n a.name.name === propertyBinding.property,\n );\n\n if (attr && t.isJSXAttribute(attr)) {\n attr.value = injectPlaceholder(\n 'JSX',\n value.trim(),\n jsxPlaceholders,\n );\n changed = true;\n }\n } else {\n changed = updateAttribute(\n opening,\n propertyBinding.property,\n value,\n );\n }\n\n break;\n }\n }\n },\n });\n\n if (!changed) {\n return { code, success: false };\n }\n\n let result = unwrap(generateCode(ast));\n\n for (const [placeholder, original] of jsxPlaceholders) {\n // 두 번째 인자가 문자열이면 $&, $$ 같은 특수 치환 패턴으로 해석되어\n // original 안에 그런 문자가 있으면 결과가 깨진다 — 함수형 치환자로 방지.\n result = result.replace(placeholder, () => original);\n }\n\n return { code: result, success: true };\n } catch (error) {\n console.error('❌ Code update error:', error);\n return { code, success: false };\n }\n};\n\nexport const bulkUpdate = (\n raw: string,\n entries: { dataId: string; label: string; value: string }[],\n): UpdateResult => {\n let current = raw;\n let allSucceeded = true;\n\n for (const entry of entries) {\n const result = update(current, entry.dataId, entry.label, entry.value);\n current = result.code;\n allSucceeded = allSucceeded && result.success;\n }\n\n return { code: current, success: allSucceeded };\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { DATA_ATTR } from '../../constants';\nimport { generateCode } from './helpers';\n\nexport const replaceIds = (\n code: string,\n generateId: () => string = () => nanoid(6),\n): string => {\n return code.replace(new RegExp(`${DATA_ATTR.ID}=\"[^\"]*\"`, 'g'), () => {\n return `${DATA_ATTR.ID}=\"${generateId()}\"`;\n });\n};\n\nexport const fillIds = (\n code: string,\n generateId: () => string = () => nanoid(6),\n): string => {\n return code.replace(new RegExp(`${DATA_ATTR.ID}=\"\"`, 'g'), () => {\n return `${DATA_ATTR.ID}=\"${generateId()}\"`;\n });\n};\n\nexport const clone = (\n element: t.Node,\n generateId: () => string = () => nanoid(6),\n) => {\n const cloned = t.cloneNode(element, true);\n const generatedCode = generateCode(cloned);\n const code = replaceIds(generatedCode, generateId);\n\n return parseExpression(code, {\n plugins: ['jsx', 'typescript'],\n });\n};\n","import type { BindingItem } from './types';\n\nexport interface ValidationResult {\n valid: boolean;\n message?: string;\n}\n\nconst VALID: ValidationResult = { valid: true };\n\nexport const validateBindingValue = (\n binding: BindingItem,\n value: unknown,\n): ValidationResult => {\n const isEmpty = value === '' || value === null || value === undefined;\n\n if (isEmpty) {\n if (binding.required) {\n return { valid: false, message: 'This field is required.' };\n }\n return VALID;\n }\n\n if (typeof value === 'number') {\n if (binding.min !== undefined && value < binding.min) {\n return { valid: false, message: `Must be at least ${binding.min}.` };\n }\n if (binding.max !== undefined && value > binding.max) {\n return { valid: false, message: `Must be at most ${binding.max}.` };\n }\n }\n\n if (typeof value === 'string' && binding.pattern) {\n let regex: RegExp;\n\n try {\n regex = new RegExp(binding.pattern);\n } catch {\n // Malformed pattern authored on the binding itself — don't block the\n // user's input for an authoring mistake that isn't theirs to fix.\n return VALID;\n }\n\n if (!regex.test(value)) {\n return {\n valid: false,\n message: 'Value does not match the required format.',\n };\n }\n }\n\n if (typeof value === 'string' && binding.type === 'url') {\n try {\n new URL(value);\n } catch {\n return { valid: false, message: 'Must be a valid URL.' };\n }\n }\n\n if (typeof value === 'string' && binding.type === 'date') {\n if (Number.isNaN(Date.parse(value))) {\n return { valid: false, message: 'Must be a valid date.' };\n }\n }\n\n return VALID;\n};\n"],"x_google_ignoreList":[4],"mappings":"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"}
1
+ {"version":3,"file":"ast-CPJB8A2R.js","names":["_generate","t","parseExpression","t","parseExpression","parseExpression","t","t","parse","t","parse","t","parseExpression"],"sources":["../src/utils/ast/types.ts","../src/utils/ast/helpers.ts","../src/utils/ast/value.ts","../src/utils/ast/binding.ts","../node_modules/.pnpm/nanoid@3.3.18/node_modules/nanoid/index.browser.js","../src/utils/ast/extract.ts","../src/utils/ast/update.ts","../src/utils/ast/tree.ts","../src/utils/ast/validate.ts"],"sourcesContent":["export interface Attribute {\n name: string;\n value: string | null;\n isStringLiteral?: boolean;\n}\n\nexport interface DataAttrNode {\n id?: string;\n tagName: string;\n attributes: Attribute[];\n dataAttributes: Attribute[];\n textContent: string;\n rawChildren?: string;\n loc?: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n children?: DataAttrNode[];\n isFragment?: boolean;\n bindings?: BindingItem[];\n}\n\nexport interface BindingOption {\n label: string;\n value: string;\n}\n\nexport const BINDING_TYPES = [\n 'array',\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'color',\n 'jsx',\n 'richtext',\n 'date',\n 'url',\n 'icon-picker',\n 'asset-picker',\n] as const;\n\nexport type BindingType = (typeof BINDING_TYPES)[number];\n\nexport interface BindingRenderLeaf {\n type: BindingType;\n property?: string;\n render?: BindingRenderMap;\n}\n\nexport interface BindingRenderMap {\n [key: string]: BindingRenderLeaf | BindingRenderMap;\n}\n\nexport interface BindingItem {\n label: string;\n property: string;\n type?: BindingType;\n options?: BindingOption[];\n render?: BindingRenderMap;\n min?: number;\n max?: number;\n pattern?: string;\n required?: boolean;\n}\n\nexport type NodeValueType =\n | 'boolean'\n | 'number'\n | 'string'\n | 'null'\n | 'array'\n | 'object'\n | 'unknown';\n\nexport type EditableNodeValueType = 'boolean' | 'number' | 'string' | 'null';\n\nexport interface ExtractedNodeValue {\n type: NodeValueType;\n value: string | number | boolean | null;\n}\n","import _generate from '@babel/generator';\nimport { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\n\nimport { REGEX } from '../../constants';\nimport type { Attribute } from './types';\n\n// Same @babel/* CJS/ESM interop issue as document.ts's traverse import:\n// @babel/generator's CJS build re-exports itself as `{ default: generate,\n// generate, CodeGenerator }`, and Vite's browser dependency pre-bundling\n// doesn't unwrap that inner `.default` again — `generate` resolved to the\n// whole exports object, not the function. Every generateCode() call threw,\n// which extract.ts's extractAttributes() silently swallows into a `null`\n// attribute value, and update.ts's callers surface as \"Failed to parse/\n// update this section\" toasts.\nconst generate =\n typeof _generate === 'function'\n ? _generate\n : (_generate as unknown as { default: typeof _generate }).default;\n\nexport const wrap = (code: string) => {\n return `<>${code}</>`;\n};\n\nexport const unwrap = (generated: string) => {\n return generated\n .replace(/^<>\\s*/g, '')\n .replace(/\\s*<\\/>\\s*;?\\s*$/g, '')\n .trim();\n};\n\nexport const attrValue = ({\n value,\n isStringLiteral,\n}: Attribute): t.JSXAttribute['value'] => {\n if (value === null) {\n return null;\n }\n\n if (isStringLiteral) {\n return t.stringLiteral(value);\n }\n\n const trimmed = value.trim();\n\n if (REGEX.NUMBER.test(trimmed)) {\n return t.jsxExpressionContainer(t.numericLiteral(parseFloat(trimmed)));\n }\n\n if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {\n const expr = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n return t.jsxExpressionContainer(expr);\n }\n\n try {\n const expr = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n return t.jsxExpressionContainer(expr);\n } catch {\n return t.stringLiteral(trimmed);\n }\n};\n\nexport const generateCode = (node: t.Node): string => {\n return generate(node, { jsescOption: { minimal: true } }).code;\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\n\nimport { REGEX } from '../../constants';\nimport { generateCode } from './helpers';\nimport type { ExtractedNodeValue, NodeValueType } from './types';\n\nconst dedent = (str: string): string => {\n const lines = str\n .replace(/^\\n/, '')\n .replace(/\\n\\s*$/, '')\n .split('\\n');\n\n const indent = lines.reduce((min, line) => {\n if (!line.trim()) {\n return min;\n }\n const match = line.match(/^(\\s*)/);\n return Math.min(min, match?.[1]?.length ?? 0);\n }, Infinity);\n\n return indent === Infinity\n ? str.trim()\n : lines.map(line => line.slice(indent)).join('\\n');\n};\n\n// AST 노드를 코드 실행(new Function/eval) 없이 순수 리터럴 구조만 재귀적으로\n// 실제 JS 값으로 변환한다. 함수 호출, 변수 참조 등 리터럴이 아닌 표현식은\n// 평가하지 않고 undefined를 반환한다 — 사용자 코드는 iframe 안에서만 실행한다는\n// 이 저장소의 원칙(AGENTS.md)을 이 패널 UI(메인 문서에서 렌더링됨)에서도 지키기 위함.\nexport const evaluateLiteral = (node: t.Node): unknown => {\n if (t.isStringLiteral(node)) {\n return node.value;\n }\n\n if (t.isNumericLiteral(node)) {\n return node.value;\n }\n\n if (t.isBooleanLiteral(node)) {\n return node.value;\n }\n\n if (t.isNullLiteral(node)) {\n return null;\n }\n\n if (t.isIdentifier(node) && node.name === 'undefined') {\n return undefined;\n }\n\n if (\n t.isUnaryExpression(node) &&\n node.operator === '-' &&\n t.isNumericLiteral(node.argument)\n ) {\n return -node.argument.value;\n }\n\n if (t.isTemplateLiteral(node) && node.expressions.length === 0) {\n return node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw ?? '';\n }\n\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n return generateCode(node);\n }\n\n if (t.isArrayExpression(node)) {\n return node.elements.map(element =>\n element ? evaluateLiteral(element) : null,\n );\n }\n\n if (t.isObjectExpression(node)) {\n const result: Record<string, unknown> = {};\n\n for (const prop of node.properties) {\n if (!t.isObjectProperty(prop)) {\n continue;\n }\n\n let key: string | null = null;\n\n if (t.isIdentifier(prop.key)) {\n key = prop.key.name;\n } else if (t.isStringLiteral(prop.key)) {\n key = prop.key.value;\n } else if (t.isNumericLiteral(prop.key)) {\n key = String(prop.key.value);\n }\n\n if (key === null) {\n continue;\n }\n\n result[key] = evaluateLiteral(prop.value);\n }\n\n return result;\n }\n\n return undefined;\n};\n\nexport const parseValue = (value: unknown): unknown => {\n if (typeof value !== 'string') {\n return value;\n }\n\n const trimmed = value.trim();\n\n if (!trimmed) {\n return value;\n }\n\n if (REGEX.NUMBER.test(trimmed)) {\n return parseFloat(trimmed);\n }\n\n if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {\n if (trimmed === 'true') {\n return true;\n }\n if (trimmed === 'false') {\n return false;\n }\n if (trimmed === 'null') {\n return null;\n }\n if (trimmed === 'undefined') {\n return undefined;\n }\n }\n\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n const ast = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n\n if (t.isObjectExpression(ast) || t.isArrayExpression(ast)) {\n return evaluateLiteral(ast);\n }\n } catch {\n /* ignore */\n }\n\n return value;\n }\n\n return value;\n};\n\nexport const extractNodeValue = (node: t.Node): ExtractedNodeValue => {\n if (t.isBooleanLiteral(node)) {\n return { type: 'boolean', value: node.value };\n }\n\n if (t.isNumericLiteral(node)) {\n return { type: 'number', value: node.value };\n }\n\n if (\n t.isUnaryExpression(node) &&\n node.operator === '-' &&\n t.isNumericLiteral(node.argument)\n ) {\n return { type: 'number', value: -node.argument.value };\n }\n\n if (t.isStringLiteral(node)) {\n return { type: 'string', value: node.value };\n }\n\n if (t.isTemplateLiteral(node)) {\n if (node.expressions.length === 0 && node.quasis.length === 1) {\n return {\n type: 'string',\n value: dedent(\n node.quasis[0]!.value.cooked ?? node.quasis[0]!.value.raw,\n ),\n };\n }\n return { type: 'string', value: generateCode(node) };\n }\n\n if (t.isNullLiteral(node)) {\n return { type: 'null', value: null };\n }\n\n if (t.isArrayExpression(node)) {\n return { type: 'array', value: generateCode(node) };\n }\n\n if (t.isObjectExpression(node)) {\n return { type: 'object', value: generateCode(node) };\n }\n\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n return { type: 'string', value: generateCode(node) };\n }\n\n return { type: 'unknown', value: null };\n};\n\nexport const createNodeFromValue = (\n type: NodeValueType,\n value: unknown,\n): t.Expression | null => {\n switch (type) {\n case 'boolean': {\n return t.booleanLiteral(value === true);\n }\n case 'number': {\n return t.numericLiteral(Number(value));\n }\n case 'string': {\n return t.stringLiteral(String(value));\n }\n case 'null': {\n return t.nullLiteral();\n }\n case 'array':\n case 'object':\n case 'unknown': {\n return null;\n }\n default: {\n return null;\n }\n }\n};\n\nexport const parseArrayExpression = (value: string) => {\n try {\n const ast = parseExpression(value, {\n plugins: ['jsx', 'typescript'],\n });\n\n if (!t.isArrayExpression(ast)) {\n return null;\n }\n\n return ast;\n } catch (error) {\n console.error('❌ Array parsing error:', error);\n return null;\n }\n};\n\nexport const extractObjectProperties = (\n element: t.ObjectExpression,\n): Record<string, ExtractedNodeValue & { astNode: t.Node }> => {\n const properties: Record<string, ExtractedNodeValue & { astNode: t.Node }> =\n {};\n\n element.properties.forEach(prop => {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n const key = prop.key.name;\n\n if (key === 'children') {\n return;\n }\n\n const extracted = extractNodeValue(prop.value);\n\n properties[key] = {\n ...extracted,\n astNode: prop.value,\n };\n }\n });\n\n return properties;\n};\n\nexport const arrayExpressionToCode = (\n elements: t.ObjectExpression[],\n): string => {\n const nextAst = t.arrayExpression(elements);\n return generateCode(nextAst);\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { z } from 'zod';\n\nimport { BINDING_PROP, DATA_ATTR } from '../../constants';\nimport {\n BINDING_TYPES,\n type BindingItem,\n type BindingOption,\n type BindingRenderMap,\n type DataAttrNode,\n} from './types';\nimport { evaluateLiteral, parseArrayExpression } from './value';\n\nconst bindingTypeSchema = z.enum(BINDING_TYPES);\n\nconst bindingOptionSchema = z.object({\n label: z.string(),\n value: z.string(),\n});\n\nconst bindingRenderLeafSchema = z.object({\n type: bindingTypeSchema,\n property: z.string().optional(),\n});\n\nconst rawBindingItemSchema = z.object({\n label: z.string(),\n property: z.string().optional(),\n type: bindingTypeSchema.optional(),\n options: z.array(bindingOptionSchema).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n pattern: z.string().optional(),\n required: z.boolean().optional(),\n});\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\n// A render map entry is either a \"leaf\" (has its own `type`) or a nested\n// map of further entries — recurse into whichever it looks like, and drop\n// anything that matches neither instead of failing the whole map.\nconst sanitizeRenderMap = (value: unknown): BindingRenderMap | undefined => {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const map: BindingRenderMap = {};\n\n for (const [key, raw] of Object.entries(value)) {\n if (!isPlainObject(raw)) {\n continue;\n }\n\n if ('type' in raw) {\n const leaf = bindingRenderLeafSchema.safeParse(raw);\n\n if (leaf.success) {\n const render = sanitizeRenderMap(raw.render);\n map[key] = render ? { ...leaf.data, render } : leaf.data;\n }\n continue;\n }\n\n const nested = sanitizeRenderMap(raw);\n\n if (nested) {\n map[key] = nested;\n }\n }\n\n return Object.keys(map).length > 0 ? map : undefined;\n};\n\nexport const parseBinding = (bindingValue: string | null): BindingItem[] => {\n if (!bindingValue) {\n return [];\n }\n\n const ast = parseArrayExpression(bindingValue);\n\n if (!ast) {\n return [];\n }\n\n const raw = evaluateLiteral(ast);\n\n if (!Array.isArray(raw)) {\n return [];\n }\n\n const items: BindingItem[] = [];\n\n for (const rawItem of raw) {\n if (!isPlainObject(rawItem)) {\n continue;\n }\n\n // Drop an unrecognized `type` instead of rejecting the whole item — an\n // authored binding with a typo'd/future type string still works as an\n // untyped field rather than disappearing entirely.\n const sanitizedType = bindingTypeSchema.safeParse(rawItem.type);\n\n // Drop individually malformed options instead of rejecting the whole\n // item — a select field with 3 valid options and 1 malformed one should\n // still work with the 3 valid ones.\n const sanitizedOptions = Array.isArray(rawItem.options)\n ? rawItem.options\n .map(option => {\n const parsed = bindingOptionSchema.safeParse(option);\n return parsed.success ? parsed.data : null;\n })\n .filter((option): option is BindingOption => option !== null)\n : undefined;\n\n const parsed = rawBindingItemSchema.safeParse({\n ...rawItem,\n type: sanitizedType.success ? sanitizedType.data : undefined,\n options: sanitizedOptions?.length ? sanitizedOptions : undefined,\n });\n\n if (!parsed.success) {\n continue;\n }\n\n const { label, property, type, options, min, max, pattern, required } =\n parsed.data;\n\n if (property === undefined && type !== 'richtext') {\n continue;\n }\n\n const render = sanitizeRenderMap(rawItem.render);\n\n items.push({\n label,\n property: property ?? BINDING_PROP.INNER_HTML,\n ...(type !== undefined && { type }),\n ...(options?.length && { options }),\n ...(render && { render }),\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...(pattern !== undefined && { pattern }),\n ...(required !== undefined && { required }),\n });\n }\n\n return items;\n};\n\nexport const getCurrentValue = (\n node: DataAttrNode,\n property: string,\n): string => {\n switch (property) {\n case BINDING_PROP.INNER_TEXT: {\n return node.textContent || '';\n }\n\n case BINDING_PROP.INNER_HTML: {\n // richtext 타입: dangerouslySetInnerHTML={{ __html }} 에서 읽기\n const dsiAttr = node.attributes.find(\n a => a.name === 'dangerouslySetInnerHTML',\n );\n if (dsiAttr?.value) {\n try {\n const expr = parseExpression(dsiAttr.value, {\n plugins: ['jsx', 'typescript'],\n });\n if (t.isObjectExpression(expr)) {\n const htmlProp = expr.properties.find(\n p =>\n t.isObjectProperty(p) &&\n t.isIdentifier(p.key) &&\n p.key.name === '__html',\n ) as t.ObjectProperty | undefined;\n if (htmlProp) {\n if (t.isStringLiteral(htmlProp.value)) {\n return htmlProp.value.value;\n }\n if (\n t.isTemplateLiteral(htmlProp.value) &&\n htmlProp.value.expressions.length === 0\n ) {\n return (\n htmlProp.value.quasis[0]?.value.cooked ??\n htmlProp.value.quasis[0]?.value.raw ??\n ''\n );\n }\n }\n }\n } catch {\n // ignore\n }\n }\n return node.rawChildren || node.textContent || '';\n }\n\n case BINDING_PROP.CHILDREN: {\n return JSON.stringify(node?.children || []);\n }\n\n default: {\n const customAttr = node.attributes.find(attr => attr.name === property);\n const value = customAttr?.value || '';\n\n return value;\n }\n }\n};\n\nconst hasEditableBindings = (node: DataAttrNode): boolean => {\n const bindingAttr = node.dataAttributes.find(\n attr => attr.name === DATA_ATTR.BINDING,\n );\n\n if (!bindingAttr?.value) {\n return false;\n }\n\n const bindings = node.bindings || parseBinding(bindingAttr.value);\n\n return bindings.length > 0;\n};\n\nexport const findEditableChildren = (node: DataAttrNode): DataAttrNode[] => {\n const editableChildren: DataAttrNode[] = [];\n\n const traverse = (children: DataAttrNode[] | undefined) => {\n if (!children) {\n return;\n }\n\n for (const child of children) {\n if (hasEditableBindings(child)) {\n editableChildren.push(child);\n }\n traverse(child.children);\n }\n };\n\n traverse(node.children);\n\n return editableChildren;\n};\n","\nimport { urlAlphabet } from './url-alphabet/index.js'\n\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\n\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n\n\n\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n if (size <= 0) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\n\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP, CONFIG, DATA_ATTR } from '../../constants';\nimport { createBoundedCache } from '../cache';\nimport { parseBinding } from './binding';\nimport { traverse } from './document';\nimport { attrValue, generateCode, wrap } from './helpers';\nimport type { Attribute, BindingItem, DataAttrNode } from './types';\n\nconst collectText = (\n children: (\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXElement\n | t.JSXFragment\n | t.JSXSpreadChild\n )[],\n) => {\n return children\n .filter(c => t.isJSXText(c))\n .map(c => (c as t.JSXText).value.trim())\n .filter(v => v.length)\n .join(' ');\n};\n\nconst getTagName = (opening: t.JSXOpeningElement): string => {\n if (t.isJSXIdentifier(opening.name)) {\n return opening.name.name;\n }\n\n if (t.isJSXMemberExpression(opening.name)) {\n return resolveMemberName(opening.name);\n }\n\n return '';\n};\n\nconst resolveMemberName = (expr: t.JSXMemberExpression): string => {\n const parts: string[] = [];\n\n const collectMemberParts = (\n node: t.JSXMemberExpression['object'] | t.JSXMemberExpression['property'],\n ): void => {\n if (t.isJSXIdentifier(node)) {\n parts.push(node.name);\n } else if (t.isJSXMemberExpression(node)) {\n collectMemberParts(node.object);\n\n if (t.isJSXIdentifier(node.property)) {\n parts.push(node.property.name);\n }\n }\n };\n\n collectMemberParts(expr.object);\n\n if (t.isJSXIdentifier(expr.property)) {\n parts.push(expr.property.name);\n }\n\n return parts.join('.');\n};\n\nconst parseJSXName = (\n tagName: string,\n): t.JSXIdentifier | t.JSXMemberExpression => {\n const parts = tagName.split('.');\n\n if (parts.length === 1) {\n return t.jsxIdentifier(parts[0]!);\n }\n\n let expr: t.JSXIdentifier | t.JSXMemberExpression = t.jsxIdentifier(\n parts[0]!,\n );\n\n for (let i = 1; i < parts.length; i++) {\n expr = t.jsxMemberExpression(expr, t.jsxIdentifier(parts[i]!));\n }\n\n return expr;\n};\n\nconst extractCache = createBoundedCache<string, DataAttrNode[]>(\n CONFIG.CACHE_LIMIT,\n);\n\nconst extractAttributes = (\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[],\n): { allAttrs: Attribute[]; dataAttrs: Attribute[] } => {\n const allAttrs: Attribute[] = [];\n const dataAttrs: Attribute[] = [];\n\n for (const attr of attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) {\n continue;\n }\n\n const name = attr.name.name;\n let value: string | null = null;\n let isStringLiteral = false;\n\n if (attr.value) {\n if (t.isStringLiteral(attr.value)) {\n value = attr.value.value;\n isStringLiteral = true;\n } else if (t.isJSXExpressionContainer(attr.value)) {\n try {\n value = generateCode(attr.value.expression);\n isStringLiteral = false;\n } catch {\n value = null;\n }\n }\n }\n\n const entry = { name, value, isStringLiteral };\n\n allAttrs.push(entry);\n\n if (name.startsWith('data-')) {\n dataAttrs.push(entry);\n }\n }\n\n return { allAttrs, dataAttrs };\n};\n\nconst buildChildElements = (\n node: DataAttrNode,\n): (t.JSXText | t.JSXElement | t.JSXFragment)[] => {\n const childElements: (t.JSXText | t.JSXElement | t.JSXFragment)[] = [];\n\n if (node.textContent) {\n childElements.push(t.jsxText(node.textContent));\n }\n\n node.children?.forEach(child => {\n const childJSX = nodeToJSX(child);\n if (childJSX) {\n childElements.push(childJSX);\n }\n });\n\n return childElements;\n};\n\nexport const nodeToJSX = (\n node: DataAttrNode,\n): t.JSXElement | t.JSXFragment | null => {\n try {\n if (node.isFragment) {\n const childElements = buildChildElements(node);\n\n return t.jsxFragment(\n t.jsxOpeningFragment(),\n t.jsxClosingFragment(),\n childElements,\n );\n }\n\n if (\n node.tagName === 'div' &&\n node.dataAttributes.some(attr => attr.name === 'data-item')\n ) {\n if (node.children) {\n return nodeToJSX(node.children[0]!);\n }\n return null;\n }\n\n const attributes = node.attributes.map(attr => {\n const attrName = t.jsxIdentifier(attr.name);\n\n if (!attr.value) {\n return t.jsxAttribute(attrName, null);\n }\n\n return t.jsxAttribute(attrName, attrValue(attr));\n });\n\n const elementName = parseJSXName(node.tagName);\n\n const openingElement = t.jsxOpeningElement(elementName, attributes);\n\n const closingElement = t.jsxClosingElement(elementName);\n const children = buildChildElements(node);\n\n return t.jsxElement(openingElement, closingElement, children, false);\n } catch (error) {\n console.error('❌ DataAttrNode to JSX conversion error:', error);\n return null;\n }\n};\n\nconst createWrapperNode = (\n textContent: string,\n children: DataAttrNode[],\n): DataAttrNode => ({\n tagName: 'div',\n id: nanoid(6),\n attributes: [{ name: DATA_ATTR.ITEM, value: 'true' }],\n dataAttributes: [{ name: DATA_ATTR.ITEM, value: 'true' }],\n textContent,\n children,\n});\n\nconst createFragmentNode = (\n textContent: string,\n children: DataAttrNode[],\n): DataAttrNode => ({\n tagName: '',\n id: nanoid(6),\n attributes: [],\n dataAttributes: [],\n textContent,\n children,\n isFragment: true,\n});\n\nconst processChildrenBinding = (\n jsxElement: t.JSXElement,\n processedNodes?: WeakSet<t.JSXElement | t.JSXFragment>,\n shouldWrap: boolean = true,\n): DataAttrNode[] | undefined => {\n const jsxChildren = jsxElement.children.filter(\n child => t.isJSXElement(child) || t.isJSXFragment(child),\n );\n\n if (!jsxChildren.length) {\n return undefined;\n }\n\n const childrenNodes: DataAttrNode[] = [];\n\n jsxChildren.forEach(child => {\n if (t.isJSXElement(child)) {\n const childResults = extractFromNode(child, processedNodes);\n\n if (shouldWrap) {\n const wrapperNode = createWrapperNode(\n collectText(child.children),\n childResults,\n );\n childrenNodes.push(wrapperNode);\n } else {\n childrenNodes.push(...childResults);\n }\n } else if (t.isJSXFragment(child)) {\n processedNodes?.add(child);\n\n const fragmentChildren: DataAttrNode[] = [];\n\n child.children.forEach(fragmentChild => {\n if (t.isJSXElement(fragmentChild)) {\n const childResults = extractFromNode(fragmentChild, processedNodes);\n fragmentChildren.push(...childResults);\n }\n });\n\n if (fragmentChildren.length) {\n const fragmentNode = createFragmentNode(\n collectText(child.children),\n fragmentChildren,\n );\n childrenNodes.push(fragmentNode);\n }\n }\n });\n\n return childrenNodes.length ? childrenNodes : undefined;\n};\n\nconst skipItemsChildren = (\n jsxElement: t.JSXElement,\n processedNodes: WeakSet<t.JSXElement | t.JSXFragment>,\n propertyName: string = 'items',\n): void => {\n const opening = jsxElement.openingElement;\n\n const itemsAttr = opening.attributes.find(\n attr =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === propertyName,\n );\n\n if (!itemsAttr || !t.isJSXAttribute(itemsAttr)) {\n return;\n }\n\n if (\n itemsAttr.value &&\n t.isJSXExpressionContainer(itemsAttr.value) &&\n t.isArrayExpression(itemsAttr.value.expression)\n ) {\n const arrayExpr = itemsAttr.value.expression;\n\n arrayExpr.elements.forEach(element => {\n if (t.isObjectExpression(element)) {\n element.properties.forEach(prop => {\n if (\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n t.isJSXElement(prop.value)\n ) {\n markProcessedJSX(prop.value, processedNodes);\n }\n });\n }\n });\n }\n};\n\nconst markProcessedJSX = (\n node: t.Node,\n processedNodes: WeakSet<t.JSXElement | t.JSXFragment>,\n): void => {\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n processedNodes.add(node as t.JSXElement | t.JSXFragment);\n node.children.forEach(child => markProcessedJSX(child, processedNodes));\n return;\n }\n\n const expression =\n t.isJSXExpressionContainer(node) || t.isParenthesizedExpression(node);\n\n if (expression) {\n markProcessedJSX(node.expression, processedNodes);\n }\n};\n\ninterface NodeBindingInfo {\n tagName: string;\n allAttrs: Attribute[];\n dataAttrs: Attribute[];\n bindings: BindingItem[];\n childrenBinding: BindingItem | undefined;\n arrayBindings: BindingItem[];\n rawChildren: string | undefined;\n}\n\n// Shared prefix for the top-level traverse() visitor below and the manual\n// recursive descent in extractFromNode: read the tag name, attributes, and\n// parsed bindings off one JSXElement. What differs between the two callers\n// is how childrenNodes gets computed and whether the result is pushed at\n// all — traverse() only records elements with data-* attributes, while\n// extractFromNode always records the children it's asked to (see each call\n// site for details).\nconst readNodeBindingInfo = (node: t.JSXElement): NodeBindingInfo => {\n const opening = node.openingElement;\n const tagName = getTagName(opening);\n const { allAttrs, dataAttrs } = extractAttributes(opening.attributes);\n\n const bindingAttr = dataAttrs.find(attr => attr.name === DATA_ATTR.BINDING);\n const bindings = bindingAttr?.value ? parseBinding(bindingAttr.value) : [];\n\n const childrenBinding = bindings.find(\n b => b.property === BINDING_PROP.CHILDREN,\n );\n const arrayBindings = bindings.filter(\n b => b.property === BINDING_PROP.ITEMS || b.type === 'array',\n );\n\n const innerHtmlBinding = bindings.find(\n b => b.property === BINDING_PROP.INNER_HTML,\n );\n\n let rawChildren: string | undefined;\n if (innerHtmlBinding && node.children.length > 0) {\n rawChildren = node.children\n .map(child => generateCode(child))\n .join('')\n .trim();\n }\n\n return {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n arrayBindings,\n rawChildren,\n };\n};\n\nconst parseToNodes = (raw: string): DataAttrNode[] => {\n const wrapped = wrap(raw);\n const ast = parse(wrapped, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n errorRecovery: true,\n });\n\n const results: DataAttrNode[] = [];\n\n // babel's traverse() below visits every JSXElement in the tree, top to\n // bottom, regardless of structure. But some elements are meant to be\n // recorded as *structural* children of another result — e.g. a node\n // wrapped by processChildrenBinding()/extractFromNode() into a parent's\n // `children` array, or an element sitting inside an `items` binding's\n // array literal (skipped via skipItemsChildren()/markProcessedJSX()) —\n // not as their own top-level entry in `results`. Without this WeakSet,\n // traverse() would independently re-visit those same elements once it\n // reaches them in the tree and add a second, duplicate entry for them.\n // Each helper below adds a node here the moment it pulls that node out\n // of the normal top-level flow, and the JSXElement() visitor skips\n // anything already marked.\n const processedNodes = new WeakSet<t.JSXElement | t.JSXFragment>();\n\n traverse(ast, {\n JSXElement(path) {\n if (processedNodes.has(path.node)) {\n return;\n }\n\n const {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n arrayBindings,\n rawChildren,\n } = readNodeBindingInfo(path.node);\n\n if (!tagName || !dataAttrs.length) {\n return;\n }\n\n let childrenNodes: DataAttrNode[] | undefined;\n\n if (childrenBinding) {\n childrenNodes = processChildrenBinding(path.node, processedNodes);\n }\n\n for (const arrayBinding of arrayBindings) {\n skipItemsChildren(path.node, processedNodes, arrayBinding.property);\n }\n\n results.push({\n tagName,\n attributes: allAttrs,\n dataAttributes: dataAttrs,\n textContent: collectText(path.node.children),\n rawChildren,\n children: childrenNodes,\n bindings,\n loc: path.node.loc\n ? {\n start: {\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n end: {\n line: path.node.loc.end.line,\n column: path.node.loc.end.column,\n },\n }\n : undefined,\n });\n },\n });\n\n return results;\n};\n\nexport function extract(raw: string): DataAttrNode[] {\n if (extractCache.has(raw)) {\n return extractCache.get(raw)!;\n }\n\n const results = parseToNodes(raw);\n\n extractCache.set(raw, results);\n\n return results;\n}\n\nfunction extractFromNode(\n node: t.JSXElement,\n processedNodes?: WeakSet<t.JSXElement | t.JSXFragment>,\n): DataAttrNode[] {\n processedNodes?.add(node);\n\n const {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n rawChildren,\n } = readNodeBindingInfo(node);\n\n let childrenNodes: DataAttrNode[] | undefined;\n\n if (childrenBinding) {\n childrenNodes = processChildrenBinding(node, processedNodes);\n }\n\n if (!childrenNodes) {\n childrenNodes = processChildrenBinding(node, processedNodes, false);\n }\n\n return [\n {\n tagName,\n attributes: allAttrs,\n dataAttributes: dataAttrs,\n textContent: collectText(node.children),\n rawChildren,\n children: childrenNodes,\n bindings,\n },\n ];\n}\n\nexport function clearExtractCache() {\n extractCache.clear();\n}\n","import { parse } from '@babel/parser';\nimport type { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP, DATA_ATTR, REGEX } from '../../constants';\nimport { parseBinding } from './binding';\nimport { traverse } from './document';\nimport { nodeToJSX } from './extract';\nimport { attrValue, generateCode, unwrap, wrap } from './helpers';\nimport type { DataAttrNode } from './types';\n\nconst updateInnerText = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n const jsxChildren = path.node.children;\n\n for (let i = jsxChildren.length - 1; i >= 0; i--) {\n if (t.isJSXText(jsxChildren[i])) {\n jsxChildren.splice(i, 1);\n }\n }\n\n jsxChildren.push(t.jsxText(value));\n return true;\n};\n\n// Injects a `{__PREFIX_<id>__}` JSX expression container as a placeholder,\n// then records how the placeholder's *generated source text* should be\n// string-replaced with the real value once generateCode() has run — used\n// for values (raw HTML, arbitrary JSX/expressions) that can't be\n// represented as AST literals, so we can't just build the real node here.\n//\n// `asRawContent: true` replaces the placeholder *including* its enclosing\n// braces, so the raw value lands as literal children content instead of a\n// JS expression (used for innerHTML). Leaving it false replaces only the\n// identifier inside the braces, so the value is inserted as the expression\n// itself (used for a `type: 'jsx'` attribute value).\nconst injectPlaceholder = (\n prefix: string,\n value: string,\n placeholders: Map<string, string>,\n { asRawContent = false }: { asRawContent?: boolean } = {},\n): t.JSXExpressionContainer => {\n const name = `__${prefix}_${nanoid(6)}__`;\n const container = t.jsxExpressionContainer(t.identifier(name));\n\n placeholders.set(asRawContent ? `{${name}}` : name, value);\n\n return container;\n};\n\nconst updateInnerHTML = (\n path: NodePath<t.JSXElement>,\n value: string,\n placeholders: Map<string, string>,\n): boolean => {\n path.node.children = [\n injectPlaceholder('HTML', value, placeholders, { asRawContent: true }),\n ];\n\n return true;\n};\n\nconst updateChildren = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n try {\n const childrenData = JSON.parse(value) as DataAttrNode[];\n\n path.node.children.length = 0;\n\n childrenData.forEach(childData => {\n const jsxElement = nodeToJSX(childData);\n if (jsxElement) {\n path.node.children.push(jsxElement);\n }\n });\n\n return true;\n } catch (error) {\n console.error('❌ Children update error:', error);\n return false;\n }\n};\n\nconst updateRichtext = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n path.node.children = [];\n\n const opening = path.node.openingElement;\n const htmlObject = t.objectExpression([\n t.objectProperty(t.identifier('__html'), t.stringLiteral(value)),\n ]);\n\n const existingAttr = opening.attributes.find(\n a =>\n t.isJSXAttribute(a) &&\n t.isJSXIdentifier(a.name) &&\n a.name.name === 'dangerouslySetInnerHTML',\n );\n\n if (existingAttr && t.isJSXAttribute(existingAttr)) {\n existingAttr.value = t.jsxExpressionContainer(htmlObject);\n } else {\n opening.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier('dangerouslySetInnerHTML'),\n t.jsxExpressionContainer(htmlObject),\n ),\n );\n }\n\n return true;\n};\n\nconst updateAttribute = (\n opening: t.JSXOpeningElement,\n propertyName: string,\n value: string,\n): boolean => {\n const customAttr = opening.attributes.find(\n attr =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === propertyName,\n );\n\n if (customAttr && t.isJSXAttribute(customAttr)) {\n const trimmed = value.trim();\n const isExpression =\n trimmed.startsWith('[') ||\n trimmed.startsWith('{') ||\n REGEX.NUMBER.test(trimmed) ||\n REGEX.BOOLEAN_OR_NULL.test(trimmed);\n\n customAttr.value = attrValue({\n name: propertyName,\n value,\n isStringLiteral: !isExpression,\n });\n\n return true;\n }\n\n return false;\n};\n\nexport interface UpdateResult {\n code: string;\n success: boolean;\n}\n\nexport const update = (\n code: string,\n dataId: string,\n label: string,\n value: string,\n): UpdateResult => {\n try {\n const wrapped = wrap(code);\n const ast = parse(wrapped, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n let changed = false;\n const jsxPlaceholders = new Map<string, string>();\n\n traverse(ast, {\n JSXElement(path) {\n const opening = path.node.openingElement;\n\n const idAttr = opening.attributes.find(attr => {\n return (\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === DATA_ATTR.ID &&\n attr.value &&\n t.isStringLiteral(attr.value) &&\n attr.value.value === dataId\n );\n });\n\n if (!idAttr) {\n return;\n }\n\n const bindingAttr = opening.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === DATA_ATTR.BINDING,\n );\n\n if (!bindingAttr?.value) {\n return;\n }\n\n let bindingValue = '';\n\n if (t.isStringLiteral(bindingAttr.value)) {\n bindingValue = bindingAttr.value.value;\n } else if (t.isJSXExpressionContainer(bindingAttr.value)) {\n try {\n bindingValue = generateCode(bindingAttr.value.expression);\n } catch {\n return;\n }\n }\n\n const bindings = parseBinding(bindingValue);\n\n const propertyBinding = bindings.find(\n binding => binding.label === label,\n );\n\n if (!propertyBinding) {\n return;\n }\n\n switch (propertyBinding.property) {\n case BINDING_PROP.INNER_TEXT: {\n changed = updateInnerText(path, value);\n break;\n }\n\n case BINDING_PROP.INNER_HTML: {\n if (propertyBinding.type === 'richtext') {\n changed = updateRichtext(path, value);\n } else {\n changed = updateInnerHTML(path, value, jsxPlaceholders);\n }\n break;\n }\n\n case BINDING_PROP.CHILDREN: {\n changed = updateChildren(path, value);\n break;\n }\n\n default: {\n if (propertyBinding.type === 'jsx') {\n const attr = opening.attributes.find(\n a =>\n t.isJSXAttribute(a) &&\n t.isJSXIdentifier(a.name) &&\n a.name.name === propertyBinding.property,\n );\n\n if (attr && t.isJSXAttribute(attr)) {\n attr.value = injectPlaceholder(\n 'JSX',\n value.trim(),\n jsxPlaceholders,\n );\n changed = true;\n }\n } else {\n changed = updateAttribute(\n opening,\n propertyBinding.property,\n value,\n );\n }\n\n break;\n }\n }\n },\n });\n\n if (!changed) {\n return { code, success: false };\n }\n\n let result = unwrap(generateCode(ast));\n\n for (const [placeholder, original] of jsxPlaceholders) {\n // 두 번째 인자가 문자열이면 $&, $$ 같은 특수 치환 패턴으로 해석되어\n // original 안에 그런 문자가 있으면 결과가 깨진다 — 함수형 치환자로 방지.\n result = result.replace(placeholder, () => original);\n }\n\n return { code: result, success: true };\n } catch (error) {\n console.error('❌ Code update error:', error);\n return { code, success: false };\n }\n};\n\nexport const bulkUpdate = (\n raw: string,\n entries: { dataId: string; label: string; value: string }[],\n): UpdateResult => {\n let current = raw;\n let allSucceeded = true;\n\n for (const entry of entries) {\n const result = update(current, entry.dataId, entry.label, entry.value);\n current = result.code;\n allSucceeded = allSucceeded && result.success;\n }\n\n return { code: current, success: allSucceeded };\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { DATA_ATTR } from '../../constants';\nimport { generateCode } from './helpers';\n\nexport const replaceIds = (\n code: string,\n generateId: () => string = () => nanoid(6),\n): string => {\n return code.replace(new RegExp(`${DATA_ATTR.ID}=\"[^\"]*\"`, 'g'), () => {\n return `${DATA_ATTR.ID}=\"${generateId()}\"`;\n });\n};\n\nexport const fillIds = (\n code: string,\n generateId: () => string = () => nanoid(6),\n): string => {\n return code.replace(new RegExp(`${DATA_ATTR.ID}=\"\"`, 'g'), () => {\n return `${DATA_ATTR.ID}=\"${generateId()}\"`;\n });\n};\n\nexport const clone = (\n element: t.Node,\n generateId: () => string = () => nanoid(6),\n) => {\n const cloned = t.cloneNode(element, true);\n const generatedCode = generateCode(cloned);\n const code = replaceIds(generatedCode, generateId);\n\n return parseExpression(code, {\n plugins: ['jsx', 'typescript'],\n });\n};\n","import type { BindingItem } from './types';\n\nexport interface ValidationResult {\n valid: boolean;\n message?: string;\n}\n\nconst VALID: ValidationResult = { valid: true };\n\nexport const validateBindingValue = (\n binding: BindingItem,\n value: unknown,\n): ValidationResult => {\n const isEmpty = value === '' || value === null || value === undefined;\n\n if (isEmpty) {\n if (binding.required) {\n return { valid: false, message: 'This field is required.' };\n }\n return VALID;\n }\n\n // `PanelBinding.value` (the value a custom renderPanel gets) is always a\n // string, even for `type: 'number'` bindings — coerce a numeric string\n // the same way the built-in field does today (see field.tsx's ad-hoc\n // `Number(next)`), so min/max apply to both callers instead of silently\n // no-op'ing on the string form. A non-numeric string (`NaN`) or\n // whitespace-only string is left alone; `isEmpty` above already handles\n // the plain empty-string case.\n const numericValue =\n typeof value === 'number'\n ? value\n : typeof value === 'string' &&\n value.trim() !== '' &&\n !Number.isNaN(Number(value))\n ? Number(value)\n : undefined;\n\n if (numericValue !== undefined) {\n if (binding.min !== undefined && numericValue < binding.min) {\n return { valid: false, message: `Must be at least ${binding.min}.` };\n }\n if (binding.max !== undefined && numericValue > binding.max) {\n return { valid: false, message: `Must be at most ${binding.max}.` };\n }\n }\n\n if (typeof value === 'string' && binding.pattern) {\n let regex: RegExp;\n\n try {\n regex = new RegExp(binding.pattern);\n } catch {\n // Malformed pattern authored on the binding itself — don't block the\n // user's input for an authoring mistake that isn't theirs to fix.\n return VALID;\n }\n\n if (!regex.test(value)) {\n return {\n valid: false,\n message: 'Value does not match the required format.',\n };\n }\n }\n\n if (typeof value === 'string' && binding.type === 'url') {\n try {\n new URL(value);\n } catch {\n return { valid: false, message: 'Must be a valid URL.' };\n }\n }\n\n if (typeof value === 'string' && binding.type === 'date') {\n if (Number.isNaN(Date.parse(value))) {\n return { valid: false, message: 'Must be a valid date.' };\n }\n }\n\n return VALID;\n};\n"],"x_google_ignoreList":[4],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as Props, c as DraggableItemProps, i as PanelRenderData, n as PaletteRenderData, o as DraggableItem, r as PanelBinding, s as DraggableItemDragState, t as Dnd } from "../index-BnncHZTt.js";
1
+ import { a as Props, c as DraggableItemProps, i as PanelRenderData, n as PaletteRenderData, o as DraggableItem, r as PanelBinding, s as DraggableItemDragState, t as Dnd } from "../index-BVM2RLWN.js";
2
2
  export { DraggableItem, type DraggableItemDragState, type DraggableItemProps, type PaletteRenderData, type PanelBinding, type PanelRenderData, type Props, Dnd as default };
package/dist/dnd/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as DraggableItem, t as Dnd } from "../dnd-BNFFJ9uv.js";
1
+ import { n as DraggableItem, t as Dnd } from "../dnd-CZ7VF9u8.js";
2
2
  export { DraggableItem, Dnd as default };
@@ -1,7 +1,7 @@
1
1
  import { _ as DEFAULT_TEMPLATE, f as require_lib$1, m as BINDING_PROP, n as createSectionPreviewCache, p as require_lib, v as DRAGGABLE_ITEMS, x as __toESM } from "./document-CSIscFpL.js";
2
2
  import { d as replaceSections, i as compile, o as extractSections, r as cn, s as generateSection, t as baseModules, u as preloadScripts } from "./utils-BzfDKU6y.js";
3
3
  import { i as usePreview } from "./states-Ci1AvoQ9.js";
4
- import { _ as parseArrayExpression, c as extract, d as getCurrentValue, f as parseBinding, g as extractObjectProperties, h as extractNodeValue, i as replaceIds, l as nanoid, m as createNodeFromValue, n as clone, o as update, p as arrayExpressionToCode, r as fillIds, t as validateBindingValue, u as findEditableChildren, v as parseValue, y as generateCode } from "./ast-Dq1EfxA5.js";
4
+ import { _ as parseArrayExpression, c as extract, d as getCurrentValue, f as parseBinding, g as extractObjectProperties, h as extractNodeValue, i as replaceIds, l as nanoid, m as createNodeFromValue, n as clone, o as update, p as arrayExpressionToCode, r as fillIds, t as validateBindingValue, u as findEditableChildren, v as parseValue, y as generateCode } from "./ast-CPJB8A2R.js";
5
5
  import { t as Frame } from "./frame-DQ_9RdeP.js";
6
6
  import { t as generateTailwindCSSFromDOM } from "./tailwind-CbjdLyVX.js";
7
7
  import { t as Core } from "./core-B7igZRDs.js";
@@ -1254,7 +1254,7 @@ const Field = ({ binding, id, value, onChange }) => {
1254
1254
  placeholder: "Enter a numeric value",
1255
1255
  onBlur: (e) => {
1256
1256
  const next = e.target.value.trim();
1257
- const result = validateBindingValue(binding, next ? Number(next) : "");
1257
+ const result = validateBindingValue(binding, next);
1258
1258
  if (!result.valid) {
1259
1259
  setValidationError(result.message ?? "Invalid value.");
1260
1260
  return;
@@ -1551,6 +1551,11 @@ const Dnd$1 = ({ value: _value, props, modules = {}, onChange: _onChange, classN
1551
1551
  property: binding.property,
1552
1552
  type: binding.type,
1553
1553
  options: binding.options,
1554
+ render: binding.render,
1555
+ min: binding.min,
1556
+ max: binding.max,
1557
+ pattern: binding.pattern,
1558
+ required: binding.required,
1554
1559
  value: getCurrentValue(node, binding.property),
1555
1560
  onChange: (value) => onFieldChange({
1556
1561
  id: dataId,
@@ -1714,4 +1719,4 @@ Dnd.DraggableItem = DraggableItem;
1714
1719
  //#endregion
1715
1720
  export { DraggableItem as n, Dnd as t };
1716
1721
 
1717
- //# sourceMappingURL=dnd-BNFFJ9uv.js.map
1722
+ //# sourceMappingURL=dnd-CZ7VF9u8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dnd-BNFFJ9uv.js","names":["Renderer","t","parseExpression","TiptapEditor","CoreEditor","Dnd","uuidv4","Renderer","DndImpl"],"sources":["../src/components/dnd/draggable.tsx","../src/components/dnd/droppable.tsx","../src/components/dnd/renderer.tsx","../src/components/dnd/sortable.tsx","../src/components/dnd/overlay.tsx","../src/components/editor/tiptap.tsx","../src/components/dnd/panel/selection.ts","../src/components/dnd/panel/items.tsx","../src/components/dnd/panel/children.tsx","../src/components/dnd/panel/icon-map.ts","../src/components/dnd/panel/field.tsx","../src/components/dnd/panel/node.tsx","../src/components/dnd/panel/panel.tsx","../src/components/dnd/dnd.tsx","../src/components/dnd/index.ts"],"sourcesContent":["import { useDraggable } from '@dnd-kit/core';\nimport { Card } from '@jbpark/ui-kit';\n\nimport type { Section } from '~/types';\nimport { cn } from '~/utils';\n\nexport interface DraggableItemDragState {\n ref: (node: HTMLElement | null) => void;\n dragProps: React.HTMLAttributes<HTMLElement>;\n isDragging: boolean;\n}\n\nexport interface DraggableItemProps {\n item: Section;\n children: (drag: DraggableItemDragState) => React.ReactNode;\n}\n\n// Owns the dnd-kit wiring (useDraggable + the `type: 'new-item'` data shape\n// Dnd's onDragEnd expects) so a custom renderPalette only has to decide how\n// an item *looks*, not how dragging itself works. Exported as\n// Dnd.DraggableItem for that purpose; also used internally for the default\n// palette rendering, so both paths share the exact same drag wiring.\nconst DraggableItem = ({ item, children }: DraggableItemProps) => {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: item.id,\n data: { type: 'new-item', item },\n });\n\n return children({\n ref: setNodeRef,\n dragProps: { ...listeners, ...attributes },\n isDragging,\n });\n};\n\n// The built-in card look, shared by the default (non-custom) palette\n// rendering and the drag overlay's floating preview — both rendered a plain\n// `<Draggable>` before this became a children-render-prop component.\nexport interface DefaultDraggableItemProps {\n item: Section;\n onAdd?: (item: Section) => void;\n // Double-click is the desktop convenience shortcut alongside drag — a\n // single click there would fire on every aborted/failed drag attempt.\n // On mobile there's nowhere to drag *to* (the palette lives in a Drawer\n // stacked over the canvas), so a tap can't be a failed drag, and\n // double-tap-to-dblclick synthesis from touch is unreliable anyway\n // (iOS Safari inconsistently fires it, and it can compete with the\n // browser's native double-tap-to-zoom gesture). Tapping just adds there.\n tapToAdd?: boolean;\n}\n\nexport const DefaultDraggableItem = ({\n item,\n onAdd,\n tapToAdd = false,\n}: DefaultDraggableItemProps) => (\n <DraggableItem item={item}>\n {({ ref, dragProps, isDragging }) => (\n <Card\n ref={ref}\n style={{ opacity: isDragging ? 0.5 : 1 }}\n {...dragProps}\n className={cn(\n 'cursor-grab',\n 'outline-none',\n 'hover:border-blue-300 hover:shadow-md',\n isDragging && 'opacity-50',\n )}\n onClick={tapToAdd && onAdd ? () => onAdd(item) : undefined}\n onDoubleClick={onAdd ? () => onAdd(item) : undefined}\n >\n {item.name}\n </Card>\n )}\n </DraggableItem>\n);\n\nexport default DraggableItem;\n","import { useDroppable } from '@dnd-kit/core';\nimport { Typography } from '@jbpark/ui-kit';\n\nimport { cn } from '~/utils';\n\nconst Droppable = ({\n children,\n className,\n}: React.ComponentPropsWithRef<'div'>) => {\n const { setNodeRef, isOver, active } = useDroppable({\n id: 'sortable-area',\n });\n\n const { setNodeRef: setBottomRef, isOver: isBottomOver } = useDroppable({\n id: 'sortable-area-bottom',\n });\n\n const isNewItemDragging = active?.data.current?.type === 'new-item';\n const shouldHighlight = isOver && isNewItemDragging;\n const shouldHighlightBottom = isBottomOver && isNewItemDragging;\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'min-h-full',\n 'border-2 border-dashed p-1',\n shouldHighlight ? 'border-blue-300 bg-blue-50' : 'border-gray-200',\n className,\n )}\n >\n {children}\n {isNewItemDragging && (\n <div\n ref={setBottomRef}\n className={cn(\n 'mt-2 min-h-24',\n 'rounded-lg border-2 border-dashed',\n 'transition-all duration-200',\n 'flex items-center justify-center',\n shouldHighlightBottom\n ? 'border-blue-400 bg-blue-100'\n : 'border-gray-300 bg-gray-50',\n )}\n >\n <Typography.Text className=\"text-sm text-gray-500\">\n {shouldHighlightBottom ? 'Drop here' : 'Drag here to add at bottom'}\n </Typography.Text>\n </div>\n )}\n </div>\n );\n};\n\nexport default Droppable;\n","import { memo, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport Frame, { type FrameProps } from '~/components/frame';\nimport { baseModules, compile } from '~/utils';\nimport { generateTailwindCSSFromDOM } from '~/utils/tailwind';\n\ninterface Props {\n preview: string;\n modules?: Record<string, unknown>;\n headers?: Record<string, boolean>;\n frame?: FrameProps;\n dynamicTailwind?: boolean;\n provider?: (children: React.ReactNode) => React.ReactNode;\n}\n\n// Wrapped in memo() because `preview` is a plain string: for a section that\n// didn't change, the parent hands back the same content it computed last\n// render (see generateSections()/dnd.tsx), so a shallow prop comparison\n// lets React skip both the recompile below and reconciling this section's\n// iframe tree at all — see #97.\nconst Renderer = ({\n preview,\n headers,\n modules,\n frame,\n dynamicTailwind = false,\n provider,\n}: Props) => {\n const memoizedModules = useMemo(\n () => ({\n ...baseModules,\n ...modules,\n }),\n [modules],\n );\n\n const module = useMemo(() => {\n try {\n return compile(preview, memoizedModules);\n } catch (e) {\n return {\n exports: {},\n error: e instanceof Error ? e.message : 'Module transformation error',\n };\n }\n }, [preview, memoizedModules]);\n\n // In `shadow` mode there's no separate document to load a stylesheet into\n // — the shadow root only gets whatever CSS naturally inherits across the\n // boundary (see `frame/shadow.tsx`), not utility classes. Mirrors\n // `preview/client.tsx`'s `dynamicTailwind` handling: compile this\n // section's own Tailwind classes and portal them in as a `<style>` tag\n // alongside the rendered content, which crosses the shadow boundary fine\n // since it lives inside the same portal target.\n //\n // Scans the actual rendered DOM (below) rather than the `preview` source\n // text, so classes contributed by an imported component (e.g. ui-kit's\n // `Button`) are picked up too — those never appear as literal text in\n // `preview`, only in the component's own compiled output.\n //\n // The wrapper below is tracked via a callback ref (`wrapperEl` state)\n // rather than a plain `useRef`, because in shadow mode it isn't mounted\n // on this component's first commit at all — `Shadow` creates its portal\n // target in its own effect and only re-renders with it afterwards, one\n // commit later. A plain ref read in a `[preview, dynamicTailwind]`-keyed\n // effect would see `null` on that first pass and never retry; making the\n // element itself a dependency re-runs the scan once it actually exists.\n const [dynamicCSS, setDynamicCSS] = useState('');\n const [wrapperEl, setWrapperEl] = useState<HTMLDivElement | null>(null);\n const wrapperRef = useCallback((el: HTMLDivElement | null) => {\n setWrapperEl(el);\n }, []);\n\n useEffect(() => {\n if (!preview || !dynamicTailwind || !wrapperEl) {\n return;\n }\n\n let cancelled = false;\n\n generateTailwindCSSFromDOM(wrapperEl).then(css => {\n if (!cancelled) {\n setDynamicCSS(css);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [preview, dynamicTailwind, wrapperEl]);\n\n const renderProvider = (component: React.ReactNode) => {\n return provider ? provider(component) : component;\n };\n\n const Component = module.exports.default;\n\n if (!Component) {\n return null;\n }\n\n return (\n <Frame {...frame} autoHeight>\n {container => (\n <div\n ref={wrapperRef}\n className=\"w-full overflow-x-hidden\"\n data-editor-mode\n >\n {renderProvider(\n <>\n <Component\n headers={headers}\n container={container}\n //\n />\n {dynamicTailwind && dynamicCSS && <style>{dynamicCSS}</style>}\n </>,\n )}\n </div>\n )}\n </Frame>\n );\n};\n\nexport default memo(Renderer);\n","import { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { Button, Space } from '@jbpark/ui-kit';\nimport { Copy, Trash } from 'lucide-react';\n\nimport { cn } from '~/utils';\n\ninterface Props {\n id: string;\n name?: string;\n children: React.ReactNode;\n selected?: boolean;\n onClick?: () => void;\n onDelete?: (id: string) => void;\n onCopy?: (id: string) => void;\n}\n\nconst Sortable = ({\n id,\n children,\n selected,\n onClick,\n onDelete: _onDelete,\n onCopy: _onCopy,\n}: Props) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n isOver,\n active,\n } = useSortable({ id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n cursor: 'grab',\n };\n\n const isNewItemOver = isOver && active?.data.current?.type === 'new-item';\n\n const onDelete = (e: React.MouseEvent) => {\n e.stopPropagation();\n _onDelete?.(id);\n };\n\n const onCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n _onCopy?.(id);\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n onClick={onClick}\n className={cn(\n 'relative',\n selected && 'z-10 outline-2 outline-offset-2 outline-blue-500',\n isNewItemOver && 'border-t-4 border-t-green-500',\n //\n )}\n >\n <div\n className={cn(\n 'absolute inset-0 z-50',\n //\n )}\n />\n {children}\n {selected && (\n <Space\n className={cn(\n 'absolute top-1 right-1 z-60',\n //\n )}\n >\n <Button icon={<Copy />} onClick={onCopy} />\n <Button danger icon={<Trash />} onClick={onDelete} />\n </Space>\n )}\n </div>\n );\n};\n\nexport default Sortable;\n","import { useDndContext } from '@dnd-kit/core';\n\nimport type { FrameProps } from '~/components/frame';\nimport type { Section } from '~/types';\nimport { generateSection } from '~/utils';\n\nimport { DefaultDraggableItem } from './draggable';\nimport Renderer from './renderer';\nimport Sortable from './sortable';\n\ninterface Props {\n sections: Section[];\n renderProps: {\n fullCode: string;\n modules: Record<string, unknown>;\n frame?: FrameProps;\n dynamicTailwind?: boolean;\n };\n}\n\nconst Overlay = ({ sections, renderProps }: Props) => {\n const { active } = useDndContext();\n\n if (!active) {\n return null;\n }\n\n if (active.data.current?.type === 'new-item') {\n const item = active.data.current.item;\n\n return <DefaultDraggableItem item={item} />;\n }\n\n const section = sections.find(s => s.id === active.id);\n\n if (section) {\n const preview = generateSection(section.code, renderProps.fullCode);\n\n return (\n <Sortable id={section.id} name={section.name}>\n <Renderer\n preview={preview}\n modules={renderProps.modules}\n frame={renderProps.frame}\n dynamicTailwind={renderProps.dynamicTailwind}\n />\n </Sortable>\n );\n }\n\n return null;\n};\n\nexport default Overlay;\n","import { useEffect } from 'react';\n\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\n\nimport { cn } from '~/utils';\n\nexport interface Props {\n value?: string;\n placeholder?: string;\n className?: string;\n onChange?: (value: string) => void;\n}\n\nconst Tiptap = ({\n value = '',\n placeholder = 'Enter text...',\n className,\n onChange,\n}: Props) => {\n const editor = useEditor({\n extensions: [StarterKit, Placeholder.configure({ placeholder })],\n content: value,\n onBlur: ({ editor: e }) => {\n onChange?.(e.getHTML());\n },\n });\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const current = editor.getHTML();\n\n if (current !== value) {\n editor.commands.setContent(value, { emitUpdate: false });\n }\n }, [value, editor]);\n\n return (\n <EditorContent\n editor={editor}\n className={cn(\n `tiptap-editor min-h-20 rounded border border-gray-200 bg-white px-3\n py-2`,\n 'prose prose-sm max-w-none text-sm text-gray-800',\n '[&_.tiptap]:outline-none',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:float-left',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:h-0',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:text-gray-400',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n className,\n )}\n />\n );\n};\n\nexport default Tiptap;\n","export const removeIndices = <T>(items: T[], indices: Set<number>): T[] => {\n return items.filter((_, index) => !indices.has(index));\n};\n\n/**\n * Shifts every selected index up/down by one step as a block, preserving\n * relative order — scattered selections stop moving individually once they\n * hit an unselected neighbor, so the whole group slides together instead of\n * items passing through each other.\n */\nexport const moveSelectedIndices = <T>(\n items: T[],\n indices: Set<number>,\n direction: 'up' | 'down',\n): { items: T[]; indices: Set<number> } => {\n const next = [...items];\n const nextIndices = new Set(indices);\n\n const ordered = [...indices].sort((a, b) =>\n direction === 'up' ? a - b : b - a,\n );\n\n for (const index of ordered) {\n const target = direction === 'up' ? index - 1 : index + 1;\n\n if (target < 0 || target >= next.length || nextIndices.has(target)) {\n continue;\n }\n\n [next[index], next[target]] = [next[target]!, next[index]!];\n nextIndices.delete(index);\n nextIndices.add(target);\n }\n\n return { items: next, indices: nextIndices };\n};\n","import { useEffect, useMemo } from 'react';\n\nimport { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { Button, Checkbox, Toast } from '@jbpark/ui-kit';\nimport { useMultiSelect } from '@jbpark/use-hooks';\nimport { ArrowDown, ArrowUp, Copy, Plus, X } from 'lucide-react';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP } from '~/constants';\nimport {\n type BindingRenderLeaf,\n type BindingRenderMap,\n type DataAttrNode,\n type ExtractedNodeValue,\n type NodeValueType,\n arrayExpressionToCode,\n clone,\n createNodeFromValue,\n extract,\n extractNodeValue,\n extractObjectProperties,\n findEditableChildren,\n generateCode,\n parseArrayExpression,\n parseValue,\n} from '~/utils/ast';\n\nimport Field from './field';\nimport Node from './node';\nimport { moveSelectedIndices, removeIndices } from './selection';\n\ninterface ItemProperty extends ExtractedNodeValue {\n astNode: t.Node;\n}\n\ninterface ItemData {\n id: string;\n index: number;\n editableProperties: Record<string, ItemProperty>;\n originalElement: t.ObjectExpression;\n jsxBindings: Record<string, DataAttrNode[]>;\n}\n\ninterface PrimitiveItem {\n id: string;\n index: number;\n value: string | number | boolean | null;\n type: NodeValueType;\n astNode: t.Expression;\n}\n\ninterface Props {\n value: string;\n render?: BindingRenderMap;\n onChange?: (value: string) => void;\n onChildChange?: (params: {\n id: string;\n label: string;\n value: string;\n }) => void;\n}\n\ninterface BulkActionsBarProps {\n count: number;\n onDuplicate: () => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onDelete: () => void;\n onClear: () => void;\n}\n\nconst BulkActionsBar = ({\n count,\n onDuplicate,\n onMoveUp,\n onMoveDown,\n onDelete,\n onClear,\n}: BulkActionsBarProps) => {\n if (count === 0) {\n return null;\n }\n\n return (\n <div\n className=\"flex items-center justify-between rounded border\n border-blue-200 bg-blue-50 p-2\"\n >\n <div className=\"text-xs font-medium text-blue-700\">{count} selected</div>\n <div className=\"flex items-center space-x-1\">\n <Button\n size=\"small\"\n icon={<Copy />}\n title=\"Duplicate selected\"\n onClick={onDuplicate}\n />\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n title=\"Move selected up\"\n onClick={onMoveUp}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n title=\"Move selected down\"\n onClick={onMoveDown}\n />\n <Button\n danger\n size=\"small\"\n icon={<X />}\n title=\"Delete selected\"\n onClick={onDelete}\n />\n <Button size=\"small\" onClick={onClear}>\n Clear\n </Button>\n </div>\n </div>\n );\n};\n\nconst Items = ({ value, render, onChange, onChildChange }: Props) => {\n const { objectItems, primitiveItems, allElements, parseError } =\n useMemo(() => {\n const ast = parseArrayExpression(value);\n\n if (!ast) {\n return {\n objectItems: [],\n primitiveItems: [],\n allElements: [],\n parseError: true,\n };\n }\n\n const objectItems: ItemData[] = [];\n const primitiveItems: PrimitiveItem[] = [];\n const allElements = ast.elements.filter(Boolean) as t.Expression[];\n\n ast.elements.forEach(element => {\n if (!element) {\n return;\n }\n\n if (!t.isObjectExpression(element)) {\n const extracted = extractNodeValue(element);\n primitiveItems.push({\n id: nanoid(6),\n index: primitiveItems.length,\n value: extracted.value,\n type: extracted.type,\n astNode: element as t.Expression,\n });\n return;\n }\n\n const jsxBindings: Record<string, DataAttrNode[]> = {};\n\n element.properties.forEach(prop => {\n if (\n !t.isObjectProperty(prop) ||\n !t.isIdentifier(prop.key) ||\n !t.isJSXElement(prop.value)\n ) {\n return;\n }\n\n const propertyName = prop.key.name;\n\n try {\n const jsxCode = generateCode(prop.value);\n const nodes = extract(jsxCode);\n const bindings: DataAttrNode[] = [];\n\n const bindingContainer = nodes.find(node =>\n node.bindings?.some(b => b.property === 'children'),\n );\n\n if (bindingContainer) {\n bindings.push(bindingContainer);\n } else {\n nodes.forEach(node => {\n if (\n node.bindings &&\n node.bindings.length > 0 &&\n node.dataAttributes.some(a => a.name === 'data-id')\n ) {\n bindings.push(node);\n }\n const editableChildren = findEditableChildren(node);\n bindings.push(...editableChildren);\n });\n }\n\n if (bindings.length > 0) {\n jsxBindings[propertyName] = bindings;\n }\n } catch (error) {\n console.error(\n `Failed to parse JSX in property '${propertyName}':`,\n error,\n );\n }\n });\n\n objectItems.push({\n id: nanoid(6),\n index: objectItems.length,\n editableProperties: extractObjectProperties(element),\n originalElement: element,\n jsxBindings,\n });\n });\n\n return { objectItems, primitiveItems, allElements, parseError: false };\n }, [value]);\n\n useEffect(() => {\n if (parseError) {\n Toast.error('Failed to parse items', {\n description: 'Check the console for details.',\n });\n }\n }, [parseError]);\n\n const isPrimitive = primitiveItems.length > 0 && objectItems.length === 0;\n\n const selection = useMultiSelect(\n isPrimitive ? primitiveItems.length : objectItems.length,\n );\n\n const updatePrimitive = (index: number, next: string) => {\n const ast = parseArrayExpression(value);\n\n if (!ast) {\n Toast.error('Failed to update this item', {\n description: 'Check the console for details.',\n });\n return;\n }\n\n const elements = ast.elements.filter(Boolean) as t.Expression[];\n const item = primitiveItems.find(p => p.index === index);\n\n if (!item) {\n return;\n }\n\n const newNode = createNodeFromValue(item.type, parseValue(next));\n\n if (!newNode) {\n return;\n }\n\n elements[index] = newNode;\n\n onChange?.(generateCode(t.arrayExpression(elements)));\n };\n\n const movePrimitive = (fromIndex: number, toIndex: number) => {\n const nextElements = [...allElements];\n const [moved] = nextElements.splice(fromIndex, 1);\n\n nextElements.splice(toIndex, 0, moved!);\n onChange?.(generateCode(t.arrayExpression(nextElements)));\n };\n\n const deleteSelectedPrimitives = (indices: Set<number>) => {\n if (allElements.length - indices.size < 1) {\n return;\n }\n\n const nextElements = removeIndices(allElements, indices);\n\n onChange?.(generateCode(t.arrayExpression(nextElements)));\n };\n\n const deletePrimitive = (index: number) =>\n deleteSelectedPrimitives(new Set([index]));\n\n const addPrimitive = () => {\n const first = primitiveItems[0];\n\n if (!first) {\n return;\n }\n\n const newNode = createNodeFromValue(first.type, first.value);\n\n if (!newNode) {\n return;\n }\n\n onChange?.(generateCode(t.arrayExpression([...allElements, newNode])));\n };\n\n const duplicateSelectedPrimitives = (indices: Set<number>) => {\n const clones = [...indices]\n .sort((a, b) => a - b)\n .map(index => allElements[index])\n .filter((node): node is t.Expression => Boolean(node))\n .map(node => clone(node) as t.Expression);\n\n if (clones.length === 0) {\n return;\n }\n\n onChange?.(generateCode(t.arrayExpression([...allElements, ...clones])));\n };\n\n const moveSelectedPrimitives = (\n indices: Set<number>,\n direction: 'up' | 'down',\n ) => {\n const { items: nextElements, indices: nextIndices } = moveSelectedIndices(\n allElements,\n indices,\n direction,\n );\n\n selection.replace(nextIndices);\n onChange?.(generateCode(t.arrayExpression(nextElements)));\n };\n\n const moveItem = (fromIndex: number, toIndex: number) => {\n const nextItems = [...objectItems];\n const [movedItem] = nextItems.splice(fromIndex, 1);\n nextItems.splice(toIndex, 0, movedItem!);\n\n const nextValue = arrayExpressionToCode(\n nextItems.map(item => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n const updateProperty = (\n itemIndex: number,\n propertyKey: string,\n value: unknown,\n ) => {\n const item = objectItems[itemIndex]!;\n const property = item.editableProperties[propertyKey]!;\n\n const renderLeaf =\n render?.[propertyKey] && 'type' in render[propertyKey]\n ? (render[propertyKey] as BindingRenderLeaf)\n : null;\n\n const isJsx = renderLeaf?.type === 'jsx';\n const isInnerHTML = renderLeaf?.property === BINDING_PROP.INNER_HTML;\n let nextAstValue: t.Expression | null = null;\n\n if (isInnerHTML) {\n const str = String(value);\n nextAstValue = t.templateLiteral(\n [t.templateElement({ raw: str, cooked: str }, true)],\n [],\n );\n } else if (property.type === 'array' || property.type === 'object') {\n try {\n nextAstValue = parseExpression(String(value), {\n plugins: ['jsx', 'typescript'],\n });\n } catch {\n return;\n }\n } else if (!isJsx) {\n nextAstValue = createNodeFromValue(property.type, value);\n }\n\n if (!isJsx && !nextAstValue) {\n return;\n }\n\n const objectExpression = item.originalElement;\n const targetProperty = objectExpression.properties.find(\n (prop: t.ObjectProperty | t.ObjectMethod | t.SpreadElement) =>\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n prop.key.name === propertyKey,\n ) as t.ObjectProperty;\n\n const jsxPlaceholders = new Map<string, string>();\n const originalValues = new Map<t.ObjectProperty, t.Expression>();\n\n if (isJsx && targetProperty) {\n const trimmed = String(value).trim();\n if (trimmed.startsWith('<')) {\n const placeholder = `__JSX_${nanoid(6)}__`;\n jsxPlaceholders.set(placeholder, trimmed);\n targetProperty.value = t.identifier(placeholder);\n } else {\n targetProperty.value = t.stringLiteral(trimmed);\n }\n } else if (targetProperty && nextAstValue) {\n targetProperty.value = nextAstValue;\n }\n\n objectItems.forEach(obj => {\n obj.originalElement.properties.forEach(prop => {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) {\n return;\n }\n\n if (t.isJSXElement(prop.value) || t.isJSXFragment(prop.value)) {\n const placeholder = `__JSX_${nanoid(6)}__`;\n jsxPlaceholders.set(placeholder, generateCode(prop.value));\n originalValues.set(prop, prop.value);\n prop.value = t.identifier(placeholder);\n }\n });\n });\n\n let nextValue = arrayExpressionToCode(\n objectItems.map(item => item.originalElement),\n );\n\n for (const [prop, original] of originalValues) {\n prop.value = original;\n }\n\n for (const [placeholder, code] of jsxPlaceholders) {\n // 두 번째 인자가 문자열이면 $&, $$ 같은 특수 치환 패턴으로 해석되어\n // code 안에 그런 문자가 있으면 결과가 깨진다 — 함수형 치환자로 방지.\n nextValue = nextValue.replace(placeholder, () => code);\n }\n\n onChange?.(nextValue);\n };\n\n const deleteSelectedItems = (indices: Set<number>) => {\n if (objectItems.length - indices.size < 1) {\n return;\n }\n\n const nextItems = removeIndices(objectItems, indices);\n const nextValue = arrayExpressionToCode(\n nextItems.map((item: ItemData) => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n const deleteItem = (index: number) => deleteSelectedItems(new Set([index]));\n\n const cloneObjectItemElement = (source: ItemData): t.ObjectExpression => {\n const clonedElement = clone(source.originalElement) as t.ObjectExpression;\n\n clonedElement.properties.forEach(prop => {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n const key = prop.key.name;\n const editableProp = source.editableProperties[key];\n\n if (key === 'key' && t.isStringLiteral(prop.value)) {\n const originalKey = prop.value.value;\n const uniqueKey = `${originalKey}-${nanoid(6)}`;\n prop.value = t.stringLiteral(uniqueKey);\n return;\n }\n\n if (editableProp) {\n const nextValue = createNodeFromValue(\n editableProp.type,\n editableProp.value,\n );\n\n if (nextValue) {\n prop.value = nextValue;\n }\n }\n }\n });\n\n return clonedElement;\n };\n\n const addItem = () => {\n const firstItem = objectItems[0];\n\n if (!firstItem) {\n return;\n }\n\n const clonedElement = cloneObjectItemElement(firstItem);\n const editableProperties = extractObjectProperties(clonedElement);\n\n const nextItems = [...objectItems];\n const newItemData: ItemData = {\n id: nanoid(6),\n index: nextItems.length,\n editableProperties,\n originalElement: clonedElement,\n jsxBindings: {},\n };\n\n nextItems.push(newItemData);\n\n const nextValue = arrayExpressionToCode(\n nextItems.map(item => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n const duplicateSelectedItems = (indices: Set<number>) => {\n const sources = [...indices]\n .sort((a, b) => a - b)\n .map(index => objectItems[index])\n .filter((item): item is ItemData => Boolean(item));\n\n if (sources.length === 0) {\n return;\n }\n\n const clonedElements = sources.map(cloneObjectItemElement);\n const nextValue = arrayExpressionToCode([\n ...objectItems.map(item => item.originalElement),\n ...clonedElements,\n ]);\n\n onChange?.(nextValue);\n };\n\n const moveSelectedItems = (\n indices: Set<number>,\n direction: 'up' | 'down',\n ) => {\n const { items: nextItems, indices: nextIndices } = moveSelectedIndices(\n objectItems,\n indices,\n direction,\n );\n\n selection.replace(nextIndices);\n\n const nextValue = arrayExpressionToCode(\n nextItems.map(item => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n if (isPrimitive) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold\">\n Items ({primitiveItems.length})\n </div>\n <Button\n size=\"small\"\n icon={<Plus />}\n variant=\"solid\"\n color=\"green\"\n onClick={addPrimitive}\n >\n Add Item\n </Button>\n </div>\n\n <BulkActionsBar\n count={selection.selected.size}\n onDuplicate={() => duplicateSelectedPrimitives(selection.selected)}\n onMoveUp={() => moveSelectedPrimitives(selection.selected, 'up')}\n onMoveDown={() => moveSelectedPrimitives(selection.selected, 'down')}\n onDelete={() => {\n deleteSelectedPrimitives(selection.selected);\n selection.clear();\n }}\n onClear={selection.clear}\n />\n\n {primitiveItems.map((item, i) => (\n <div\n key={item.id}\n className=\"space-y-2 rounded border border-gray-100 bg-gray-50 p-2\"\n >\n <div className=\"flex items-center justify-between space-x-1\">\n <div\n onClick={e => selection.toggle(item.index, e.shiftKey)}\n className=\"inline-flex\"\n >\n <Checkbox\n checked={selection.isSelected(item.index)}\n onChange={() => {}}\n />\n </div>\n <div className=\"flex space-x-1\">\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n disabled={i === 0}\n onClick={() => movePrimitive(item.index, item.index - 1)}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n disabled={i === primitiveItems.length - 1}\n onClick={() => movePrimitive(item.index, item.index + 1)}\n />\n <Button\n danger\n size=\"small\"\n icon={<X />}\n disabled={primitiveItems.length <= 1}\n onClick={() => deletePrimitive(item.index)}\n />\n </div>\n </div>\n <Field\n binding={{\n label: `item-${i}`,\n property: item.type,\n }}\n id={`primitive-${item.id}`}\n value={String(item.value ?? '')}\n onChange={({ value: next }) => updatePrimitive(item.index, next)}\n />\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold\">\n Items ({objectItems.length})\n </div>\n <Button\n size=\"small\"\n icon={<Plus />}\n variant=\"solid\"\n color=\"green\"\n disabled={objectItems.length === 0}\n onClick={addItem}\n >\n Add Item\n </Button>\n </div>\n\n <BulkActionsBar\n count={selection.selected.size}\n onDuplicate={() => duplicateSelectedItems(selection.selected)}\n onMoveUp={() => moveSelectedItems(selection.selected, 'up')}\n onMoveDown={() => moveSelectedItems(selection.selected, 'down')}\n onDelete={() => {\n deleteSelectedItems(selection.selected);\n selection.clear();\n }}\n onClear={selection.clear}\n />\n\n {objectItems.map(item => (\n <div key={item.id} className=\"space-y-3 rounded border bg-gray-50 p-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <div\n onClick={e => selection.toggle(item.index, e.shiftKey)}\n className=\"inline-flex\"\n >\n <Checkbox\n checked={selection.isSelected(item.index)}\n onChange={() => {}}\n />\n </div>\n <div className=\"text-xs font-medium\">Item {item.index + 1}</div>\n </div>\n <div className=\"flex space-x-1\">\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n disabled={item.index === 0}\n onClick={() => moveItem(item.index, item.index - 1)}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n disabled={item.index === objectItems.length - 1}\n onClick={() => moveItem(item.index, item.index + 1)}\n />\n <Button\n danger\n size=\"small\"\n icon={<X />}\n disabled={objectItems.length <= 1}\n onClick={() => deleteItem(item.index)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n {Object.entries(item.editableProperties).map(([key, prop]) => (\n <div key={`${item.id}-${key}`}>\n <div className=\"flex flex-col space-y-2\">\n <label className=\"w-20 shrink-0 text-xs font-medium\">\n {key}\n </label>\n <Field\n binding={{\n label: key,\n property:\n render?.[key] && 'type' in render[key]\n ? ((render[key] as BindingRenderLeaf).property ??\n (render[key].type as string))\n : key,\n type:\n render?.[key] && 'type' in render[key]\n ? (render[key] as BindingRenderLeaf).type\n : undefined,\n render:\n render?.[key] && 'type' in render[key]\n ? (render[key] as BindingRenderLeaf).render\n : render?.[key] && !('type' in render[key])\n ? (render[key] as BindingRenderMap)\n : undefined,\n }}\n id={`item-${item.id}-${key}`}\n value={String(prop.value)}\n onChange={({ value: next }) =>\n updateProperty(item.index, key, parseValue(next))\n }\n />\n </div>\n <span className=\"text-right text-xs text-gray-500\">\n ({prop.type})\n </span>\n </div>\n ))}\n </div>\n <div className=\"space-y-3 border-t pt-2\">\n {Object.entries(item.jsxBindings).length > 0 ? (\n Object.entries(item.jsxBindings).map(\n ([propertyName, bindings]) => (\n <div key={propertyName} className=\"space-y-2\">\n <div className=\"text-xs font-medium text-blue-700\">\n {propertyName} Bindings ({bindings.length}):\n </div>\n {bindings.map((bindingNode, idx) => {\n const nodeId = bindingNode.dataAttributes.find(\n a => a.name === 'data-id',\n )?.value;\n\n return (\n <div\n key={`binding-${item.id}-${propertyName}-${nodeId || idx}`}\n className=\"rounded border border-blue-100 bg-blue-50\n p-2\"\n >\n <div className=\"mb-1 text-xs text-blue-600\">\n &lt;{bindingNode.tagName || 'element'}&gt;\n </div>\n <Node data={bindingNode} onChange={onChildChange} />\n </div>\n );\n })}\n </div>\n ),\n )\n ) : (\n <div className=\"text-xs text-gray-500\">\n ✓ No JSX bindings found\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nexport default Items;\nexport { BulkActionsBar };\n","import { useMemo } from 'react';\n\nimport { Button, Checkbox } from '@jbpark/ui-kit';\nimport { useMultiSelect } from '@jbpark/use-hooks';\nimport { ArrowDown, ArrowUp, Plus, X } from 'lucide-react';\nimport { nanoid } from 'nanoid';\n\nimport { type DataAttrNode, findEditableChildren } from '~/utils/ast';\n\nimport { BulkActionsBar } from './items';\nimport Node from './node';\nimport { moveSelectedIndices, removeIndices } from './selection';\n\ninterface Props {\n value: DataAttrNode[];\n onChange?: (value: string) => void;\n onNodeChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst Children = ({ value, onChange, onNodeChange }: Props) => {\n const items = useMemo(() => (Array.isArray(value) ? value : []), [value]);\n\n const selection = useMultiSelect(items.length);\n\n const editableChildrenMap = useMemo(() => {\n const map = new Map<number, DataAttrNode[]>();\n items.forEach((item, index) => {\n const editableNodes = findEditableChildren(item);\n if (editableNodes.length > 0) {\n map.set(index, editableNodes);\n }\n });\n return map;\n }, [items]);\n\n const moveItem = (fromIndex: number, toIndex: number) => {\n const nextItems = [...items];\n const [movedItem] = nextItems.splice(fromIndex, 1);\n nextItems.splice(toIndex, 0, movedItem!);\n\n onChange?.(JSON.stringify(nextItems));\n };\n\n const moveSelectedItems = (\n indices: Set<number>,\n direction: 'up' | 'down',\n ) => {\n const { items: nextItems, indices: nextIndices } = moveSelectedIndices(\n items,\n indices,\n direction,\n );\n\n selection.replace(nextIndices);\n onChange?.(JSON.stringify(nextItems));\n };\n\n const deleteSelectedItems = (indices: Set<number>) => {\n if (items.length - indices.size < 1) {\n return;\n }\n\n const nextItems = removeIndices(items, indices);\n onChange?.(JSON.stringify(nextItems));\n };\n\n const deleteItem = (index: number) => deleteSelectedItems(new Set([index]));\n\n const addItem = () => {\n const template = items[0] || createDefaultItem();\n const newItem = cloneDataAttrNode(template);\n\n const nextItems = [...items, newItem];\n onChange?.(JSON.stringify(nextItems));\n };\n\n const duplicateSelectedItems = (indices: Set<number>) => {\n const sources = [...indices]\n .sort((a, b) => a - b)\n .map(index => items[index])\n .filter((item): item is DataAttrNode => Boolean(item));\n\n if (sources.length === 0) {\n return;\n }\n\n const clones = sources.map(cloneDataAttrNode);\n onChange?.(JSON.stringify([...items, ...clones]));\n };\n\n const createDefaultItem = (): DataAttrNode => ({\n id: nanoid(6),\n tagName: 'div',\n attributes: [\n { name: 'data-id', value: nanoid(6) },\n { name: 'data-item', value: 'true' },\n ],\n dataAttributes: [\n { name: 'data-id', value: nanoid(6) },\n { name: 'data-item', value: 'true' },\n ],\n textContent: '',\n children: [],\n });\n\n const cloneDataAttrNode = (node: DataAttrNode): DataAttrNode => ({\n ...node,\n id: nanoid(6),\n attributes: node.attributes.map(attr => ({\n ...attr,\n value: attr.name === 'data-id' ? nanoid(6) : attr.value,\n })),\n dataAttributes: node.dataAttributes.map(attr => ({\n ...attr,\n value: attr.name === 'data-id' ? nanoid(6) : attr.value,\n })),\n children: node.children?.map(cloneDataAttrNode),\n });\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold text-green-700\">\n Children Items ({items.length})\n </div>\n <Button size=\"small\" color=\"green\" icon={<Plus />} onClick={addItem}>\n Add Child\n </Button>\n </div>\n\n <BulkActionsBar\n count={selection.selected.size}\n onDuplicate={() => duplicateSelectedItems(selection.selected)}\n onMoveUp={() => moveSelectedItems(selection.selected, 'up')}\n onMoveDown={() => moveSelectedItems(selection.selected, 'down')}\n onDelete={() => {\n deleteSelectedItems(selection.selected);\n selection.clear();\n }}\n onClear={selection.clear}\n />\n\n {items.map((item, itemIndex) => (\n <div\n key={item.id || itemIndex}\n className=\"space-y-2 rounded border border-green-200 bg-green-50 p-3\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <div\n onClick={e => selection.toggle(itemIndex, e.shiftKey)}\n className=\"inline-flex\"\n >\n <Checkbox\n checked={selection.isSelected(itemIndex)}\n onChange={() => {}}\n />\n </div>\n <div className=\"text-xs font-medium text-green-800\">\n Child {itemIndex + 1} ({item.tagName || 'fragment'})\n </div>\n </div>\n\n <div className=\"flex space-x-1\">\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n disabled={itemIndex === 0}\n onClick={() => moveItem(itemIndex, itemIndex - 1)}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n disabled={itemIndex === items.length - 1}\n onClick={() => moveItem(itemIndex, itemIndex + 1)}\n />\n <Button\n title={\n items.length <= 1\n ? 'At least 1 item is required'\n : 'Delete item'\n }\n danger\n size=\"small\"\n icon={<X />}\n disabled={items.length <= 1}\n onClick={() => deleteItem(itemIndex)}\n />\n </div>\n </div>\n\n {editableChildrenMap.has(itemIndex) && (\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-green-700\">\n Editable Bindings:\n </div>\n {editableChildrenMap.get(itemIndex)!.map((editableNode, idx) => {\n const nodeId = editableNode.dataAttributes.find(\n a => a.name === 'data-id',\n )?.value;\n\n return (\n <div\n key={`editable-${itemIndex}-${nodeId || idx}`}\n className=\"rounded border border-green-100 bg-white p-2\"\n >\n <div className=\"mb-1 text-xs text-green-600\">\n {editableNode.tagName}\n </div>\n <Node data={editableNode} onChange={onNodeChange} />\n </div>\n );\n })}\n </div>\n )}\n\n {!!item.children && !editableChildrenMap.has(itemIndex) && (\n <div className=\"space-y-1\">\n <div className=\"text-xs font-medium text-green-700\">\n Child Nodes:\n </div>\n {item.children.map((node, nodeIndex) => (\n <div\n key={`node-${itemIndex}-${nodeIndex}`}\n className=\"ml-2 rounded border border-green-100 bg-white p-2\"\n >\n <Node data={node} onChange={onNodeChange} />\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n};\n\nexport default Children;\n","import type { LucideIcon } from 'lucide-react';\nimport {\n AlertCircle,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n Bell,\n Bookmark,\n Calendar,\n Camera,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n Download,\n Edit,\n Eye,\n Filter,\n Heart,\n Home,\n Image,\n Info,\n Link,\n Mail,\n Map,\n Menu,\n MessageCircle,\n Phone,\n Plus,\n Search,\n Settings,\n Share,\n ShoppingCart,\n Star,\n Trash,\n Upload,\n User,\n X,\n} from 'lucide-react';\n\nexport const ICON_MAP: Record<string, LucideIcon> = {\n AlertCircle,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n Bell,\n Bookmark,\n Calendar,\n Camera,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n Download,\n Edit,\n Eye,\n Filter,\n Heart,\n Home,\n Image,\n Info,\n Link,\n Mail,\n Map,\n Menu,\n MessageCircle,\n Phone,\n Plus,\n Search,\n Settings,\n Share,\n ShoppingCart,\n Star,\n Trash,\n Upload,\n User,\n X,\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n Checkbox,\n ColorPicker,\n DatePicker,\n Input,\n Select,\n Upload,\n type UploadFile,\n} from '@jbpark/ui-kit';\nimport { useDebounce } from '@jbpark/use-hooks';\n\nimport CoreEditor from '~/components/editor/core';\nimport TiptapEditor from '~/components/editor/tiptap';\nimport { BINDING_PROP } from '~/constants';\nimport {\n type BindingItem,\n parseValue,\n validateBindingValue,\n} from '~/utils/ast';\n\nimport Children from './children';\nimport { ICON_MAP } from './icon-map';\nimport Items from './items';\n\ninterface Props {\n binding: BindingItem;\n id: string;\n value: string;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\ninterface Props {\n binding: BindingItem;\n id: string;\n value: string;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst isColorProperty = (propertyName: string): boolean => {\n const name = propertyName.toLowerCase();\n return name.includes('color');\n};\n\nconst normalizeToHex = (value: string): string => {\n const trimmed = value.trim();\n\n if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(trimmed)) {\n return trimmed;\n }\n return '#000000';\n};\n\nconst parseDateValue = (value: string): Date | undefined => {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value.trim());\n\n if (!match) {\n return undefined;\n }\n\n const [, year, month, day] = match;\n const date = new Date(Number(year), Number(month) - 1, Number(day));\n\n return Number.isNaN(date.getTime()) ? undefined : date;\n};\n\nconst formatDateValue = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n};\n\n// ColorPicker's onChange fires on every drag frame — committing straight\n// to `onChange` (which drives the AST parse/mutate/re-serialize +\n// generateSections + compile pipeline, see #130) makes a single drag cost\n// upward of 15-25ms per frame. Debouncing the *commit* keeps that pipeline\n// to roughly one run per pause instead of one per frame, while a local\n// `liveValue` state keeps the swatch/hex text updating every frame for\n// responsiveness — ColorPicker is fully controlled (`useControllableState`\n// with `value` always set here), so without this it would visually snap\n// back to the last committed color between debounced commits.\nconst COLOR_COMMIT_DELAY = 75;\n\ninterface ColorPickerFieldProps {\n id: string;\n label: string;\n value: string;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst ColorPickerField = ({\n id,\n label,\n value,\n onChange,\n}: ColorPickerFieldProps) => {\n const [liveValue, setLiveValue] = useState(value);\n // Tracks `value` purely to detect an external change during render (see\n // below) — refs can't be read/written during render, so this has to be\n // state even though nothing here reads `prevValue` itself afterward.\n const [prevValue, setPrevValue] = useState(value);\n const lastCommittedRef = useRef(value);\n\n // The committed `value` can also change from outside (undo/redo, another\n // field touching the same binding) — stay in sync with it rather than\n // only ever tracking our own commits. Adjusted during render (React's\n // recommended \"reset state when a prop changes\" pattern) rather than in\n // an effect, so the mismatched frame never actually paints.\n if (value !== prevValue) {\n setPrevValue(value);\n setLiveValue(value);\n }\n\n // `lastCommittedRef` only needs to be current by the time `commit` next\n // runs (always from an event handler / debounce timer, never render), so\n // syncing it in an effect — instead of alongside the state adjustment\n // above — keeps the ref access out of the render phase entirely.\n useEffect(() => {\n lastCommittedRef.current = value;\n }, [value]);\n\n const commit = (next: string) => {\n if (next === lastCommittedRef.current) {\n return;\n }\n lastCommittedRef.current = next;\n onChange?.({ id, label, value: next });\n };\n\n const debouncedCommit = useDebounce(() => commit(liveValue), {\n delay: COLOR_COMMIT_DELAY,\n autoInvoke: false,\n });\n\n return (\n <ColorPicker\n showText\n value={liveValue}\n onChange={next => {\n setLiveValue(next);\n debouncedCommit();\n }}\n onOpenChange={open => {\n // Flush immediately on close (picker dismissed / selection\n // finished) instead of waiting out the debounce window, so the\n // last color is never at risk of being dropped by an unmount\n // racing the pending timeout.\n if (!open) {\n commit(liveValue);\n }\n }}\n />\n );\n};\n\nconst ICON_OPTIONS = Object.entries(ICON_MAP).map(([name, Icon]) => ({\n label: (\n <span className=\"flex items-center gap-2\">\n <Icon size={14} />\n {name}\n </span>\n ),\n value: name,\n}));\n\nconst Field = ({ binding, id, value, onChange }: Props) => {\n const parsedValue = useMemo(() => {\n return parseValue(value);\n }, [value]);\n\n const [validationError, setValidationError] = useState<string | null>(null);\n\n if (\n binding.property === 'items' ||\n binding.property === 'data' ||\n binding.type === 'array'\n ) {\n return (\n <Items\n value={value}\n render={binding.render}\n onChange={next => {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }}\n onChildChange={onChange}\n />\n );\n }\n\n if (binding.type === 'richtext') {\n return (\n <TiptapEditor\n value={value}\n onChange={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n );\n }\n\n if (binding.property === BINDING_PROP.INNER_HTML || binding.type === 'jsx') {\n const isHTML = binding.property === BINDING_PROP.INNER_HTML;\n\n return (\n <CoreEditor\n value={value}\n height=\"150px\"\n fragment={!isHTML}\n raw={isHTML}\n onSave={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n );\n }\n\n if (binding.property === 'children' && Array.isArray(parsedValue)) {\n return (\n <Children\n value={parsedValue}\n onChange={next => {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }}\n onNodeChange={onChange}\n />\n );\n }\n\n if (\n typeof parsedValue === 'object' &&\n parsedValue !== null &&\n !Array.isArray(parsedValue)\n ) {\n return (\n <div className=\"space-y-2 rounded border border-gray-200 bg-gray-50 p-2\">\n {Object.entries(parsedValue).map(([key, val]) => (\n <div key={key} className=\"space-y-1\">\n <label className=\"block text-xs font-medium text-gray-600\">\n {key}\n </label>\n <Field\n binding={{\n label: key,\n property:\n binding.render?.[key] && 'type' in binding.render[key]\n ? (binding.render[key].type as string)\n : key,\n type:\n binding.render?.[key] && 'type' in binding.render[key]\n ? (binding.render[key] as { type: BindingItem['type'] })\n .type\n : undefined,\n render:\n binding.render?.[key] && !('type' in binding.render[key])\n ? (binding.render[key] as BindingItem['render'])\n : undefined,\n }}\n id={id}\n value={\n typeof val === 'object' ? JSON.stringify(val) : String(val)\n }\n onChange={({ value: next }) => {\n const convertedValue = parseValue(next);\n\n const updated = {\n ...parsedValue,\n [key]: convertedValue,\n };\n\n onChange?.({\n id,\n label: binding.label,\n value: JSON.stringify(updated),\n });\n }}\n />\n </div>\n ))}\n </div>\n );\n }\n\n if (binding.type === 'boolean' || typeof parsedValue === 'boolean') {\n return (\n <Checkbox\n checked={parsedValue === true || parsedValue === 'true'}\n onChange={checked => {\n onChange?.({\n id,\n label: binding.label,\n value: checked.toString(),\n });\n }}\n />\n );\n }\n\n const stringValue = String(value);\n\n if (binding.options && Array.isArray(binding.options)) {\n return (\n <Select\n value={stringValue}\n options={binding.options}\n onChange={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n );\n }\n\n if (binding.type === 'color' || isColorProperty(binding.property)) {\n return (\n <ColorPickerField\n id={id}\n label={binding.label}\n value={normalizeToHex(stringValue)}\n onChange={onChange}\n />\n );\n }\n\n if (binding.type === 'date') {\n return (\n <div>\n <DatePicker\n defaultValue={parseDateValue(stringValue)}\n onChange={date => {\n const next = date ? formatDateValue(date) : '';\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n if (binding.type === 'url') {\n return (\n <div>\n <Input\n type=\"url\"\n defaultValue={stringValue}\n placeholder=\"https://example.com\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n if (binding.type === 'icon-picker') {\n const SelectedIcon = ICON_MAP[stringValue];\n\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={stringValue}\n options={ICON_OPTIONS}\n onChange={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {SelectedIcon && <SelectedIcon size={18} className=\"shrink-0\" />}\n </div>\n );\n }\n\n if (binding.type === 'asset-picker') {\n const defaultUploadValue: UploadFile[] = stringValue\n ? [\n {\n uid: 'current',\n name: stringValue.split('/').pop() || 'asset',\n url: stringValue,\n },\n ]\n : [];\n\n return (\n <div className=\"space-y-2\">\n <Input\n defaultValue={stringValue}\n placeholder=\"Enter an image URL\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n <Upload\n multiple={false}\n maxCount={1}\n accept=\"image/*\"\n defaultValue={defaultUploadValue}\n onChange={files => {\n const next = files[0]?.url ?? '';\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n if (typeof parsedValue === 'number') {\n return (\n <div>\n <Input\n type=\"number\"\n defaultValue={stringValue}\n placeholder=\"Enter a numeric value\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(\n binding,\n next ? Number(next) : '',\n );\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n return (\n <div>\n <Input.TextArea\n defaultValue={value}\n placeholder=\"Enter a value\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n};\n\nexport default Field;\n","import { type DataAttrNode, getCurrentValue, parseBinding } from '~/utils/ast';\n\nimport Field from './field';\n\nexport interface FieldEditorProps {\n data: DataAttrNode;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst Node = ({ data, onChange }: FieldEditorProps) => {\n const idAttr = data.dataAttributes.find(a => a.name === 'data-id');\n const bindingAttr = data.dataAttributes.find(a => a.name === 'data-binding');\n\n if (!idAttr?.value || !bindingAttr?.value) {\n return null;\n }\n\n const dataId = idAttr.value;\n const bindings = data.bindings || parseBinding(bindingAttr.value);\n\n if (!bindings.length) {\n return null;\n }\n\n return (\n <div className=\"space-y-2 rounded\">\n <div className=\"space-y-1\">\n {bindings.map(binding => {\n const currentValue = getCurrentValue(data, binding.property);\n\n return (\n <div key={binding.label} className=\"space-y-1\">\n <label className=\"block text-xs font-semibold text-gray-700\">\n {binding.label}\n <span className=\"ml-1 text-gray-400\">({binding.property})</span>\n </label>\n <Field\n id={dataId}\n binding={binding}\n value={currentValue}\n onChange={onChange}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default Node;\n","import { Button, Typography } from '@jbpark/ui-kit';\nimport { ChevronDown, ChevronUp, Trash } from 'lucide-react';\n\nimport type { Section } from '~/types';\nimport { cn } from '~/utils';\nimport type { DataAttrNode } from '~/utils/ast';\n\nimport Node from './node';\n\ninterface Props {\n item?: Section;\n onDelete?: (id: string) => void;\n // Reordering by dragging a section on the canvas doesn't work from\n // inside this panel on mobile — the canvas sits behind the Drawer this\n // panel renders in, so there's nothing visible to drag onto. These give\n // an explicit alternative that works regardless of layout.\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n canMoveUp?: boolean;\n canMoveDown?: boolean;\n // `item`'s editable data-binding fields — extraction (and the AST\n // update + error-toast handling behind onFieldChange) lives in Dnd, so\n // it's shared with a custom renderPanel instead of computed here too.\n fields: DataAttrNode[];\n onFieldChange: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst Panel = ({\n item,\n onDelete,\n onMoveUp,\n onMoveDown,\n canMoveUp = false,\n canMoveDown = false,\n fields,\n onFieldChange,\n}: Props) => {\n if (!item) {\n return (\n <Typography.Paragraph\n className={cn(\n 'p-4 text-sm text-gray-500',\n //\n )}\n >\n Please select a section.\n </Typography.Paragraph>\n );\n }\n\n return (\n <div\n className={cn(\n 'h-full space-y-4 p-4',\n 'overflow-x-hidden overflow-y-auto',\n //\n )}\n >\n <div className=\"flex items-center justify-between\">\n <Typography.Title className=\"text-lg font-semibold\">\n {item.name}\n </Typography.Title>\n <div className=\"flex items-center gap-1\">\n {onMoveUp && (\n <Button\n icon={<ChevronUp />}\n disabled={!canMoveUp}\n onClick={onMoveUp}\n aria-label=\"Move section up\"\n />\n )}\n {onMoveDown && (\n <Button\n icon={<ChevronDown />}\n disabled={!canMoveDown}\n onClick={onMoveDown}\n aria-label=\"Move section down\"\n />\n )}\n {onDelete && (\n <Button\n danger\n icon={<Trash />}\n onClick={() => onDelete(item.id)}\n aria-label=\"Delete section\"\n />\n )}\n </div>\n </div>\n {!fields.length && (\n <Typography.Text className=\"text-xs text-gray-400\">\n No editable elements.\n </Typography.Text>\n )}\n {fields.map((node, index) => (\n <Node\n key={`${item.id}-${index}`}\n data={node}\n onChange={onFieldChange}\n />\n ))}\n </div>\n );\n};\n\nexport default Panel;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport {\n DndContext,\n type DragEndEvent,\n type DragOverEvent,\n DragOverlay,\n type DragStartEvent,\n type Modifier,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { restrictToVerticalAxis } from '@dnd-kit/modifiers';\nimport {\n SortableContext,\n arrayMove,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { Button, Drawer, Space, Toast, Typography } from '@jbpark/ui-kit';\nimport { useResponsiveSize } from '@jbpark/use-hooks';\nimport { LayoutGrid } from 'lucide-react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { DRAGGABLE_ITEMS } from '~/constants';\nimport type { Section } from '~/types';\nimport {\n type BindingOption,\n type BindingType,\n type DataAttrNode,\n extract,\n fillIds,\n getCurrentValue,\n parseBinding,\n replaceIds,\n update,\n} from '~/utils/ast';\n\nimport { DEFAULT_TEMPLATE } from '../../constants';\nimport {\n cn,\n createSectionPreviewCache,\n extractSections,\n preloadScripts,\n replaceSections,\n} from '../../utils';\nimport { usePreview } from '../context/states';\nimport { type FrameProps } from '../frame';\nimport DraggableItem, { DefaultDraggableItem } from './draggable';\nimport Droppable from './droppable';\nimport Overlay from './overlay';\nimport Panel from './panel';\nimport Renderer from './renderer';\nimport Sortable from './sortable';\n\nexport interface PaletteRenderData {\n items: Section[];\n onAdd: (item: Section) => void;\n DraggableItem: typeof DraggableItem;\n // True when the palette is rendering inside the mobile Drawer, where a\n // tap can't be a failed drag attempt (there's nothing to drag onto —\n // the canvas is stacked behind the Drawer) and native dblclick synthesis\n // from double-tap is unreliable on touch. Custom renderPalette\n // implementations should treat a single click/tap as \"add\" here instead\n // of relying on onDoubleClick.\n isMobile: boolean;\n}\n\nexport interface PanelRenderData {\n item?: Section;\n onChange: (next: Partial<Section>) => void;\n onDelete: (id: string) => void;\n // Alternative to dragging a section to reorder it — needed since the\n // canvas sits behind the mobile Drawer this panel renders in, so\n // there's nothing visible to drag onto there.\n onMoveUp: () => void;\n onMoveDown: () => void;\n canMoveUp: boolean;\n canMoveDown: boolean;\n // `item`'s editable data-binding fields, already flattened to one entry\n // per bound property (across every non-<section> descendant carrying a\n // `data-binding` attribute). Each entry carries the binding's `type` and\n // current `value` plus an `onChange` wired straight into the same\n // AST-update pipeline the built-in panel uses — including the error Toast\n // on a bad edit. Switch on `type` to render your own control (an\n // `<input>`, `<textarea>`, `<select>`, ...) instead of the built-in one.\n bindings: PanelBinding[];\n}\n\n// One editable data-binding, flattened out of the selected section for a\n// custom renderPanel. Exposes just what a consumer needs to render its own\n// control — the declared `type`, the current `value`, and an `onChange`\n// that commits through Dnd's AST-update pipeline — so it never has to touch\n// DataAttrNode/parseBinding/getCurrentValue itself.\nexport interface PanelBinding {\n // `data-id` of the owning element — stable across edits.\n id: string;\n // Human-readable label from the binding definition.\n label: string;\n // The bound prop/attribute name (e.g. `children`, `src`, `color`).\n property: string;\n // The declared data-binding type — switch on this to pick a control\n // (`string`/`url` -> <input>, `jsx`/`richtext` -> <textarea>, `boolean`\n // -> checkbox, ...). `undefined` means a plain string binding.\n type?: BindingType;\n // Present when the binding defines a fixed option set (render a <select>).\n options?: BindingOption[];\n // Current serialized value — the same string the built-in field receives.\n value: string;\n // Commit a new value through the same AST-update pipeline the built-in\n // panel uses (including the error Toast on a bad edit).\n onChange: (value: string) => void;\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithRef<'div'>,\n 'onChange'\n> {\n value?: string;\n props?: Record<string, unknown>;\n modules?: Record<string, unknown>;\n items?: Section[];\n frame?: FrameProps;\n dynamicTailwind?: boolean;\n provider?: (children: React.ReactNode) => React.ReactNode;\n onChange?: (value: string) => void;\n // Full replacements for the built-in left palette / right panel — receive\n // the same data/callbacks Dnd itself uses, so drag-and-drop and field\n // editing keep working exactly as before, just with custom markup. Used\n // for both the desktop layout and the mobile drawer, since those already\n // render identical content today.\n renderPalette?: (data: PaletteRenderData) => React.ReactNode;\n renderPanel?: (data: PanelRenderData) => React.ReactNode;\n}\n\nconst conditionalModifiers: Modifier = args => {\n const { active } = args;\n\n if (active?.data.current?.type === 'new-item') {\n return args.transform;\n }\n\n return restrictToVerticalAxis(args);\n};\n\nconst Dnd = ({\n value: _value,\n props,\n modules = {},\n onChange: _onChange,\n className,\n items = [],\n frame,\n dynamicTailwind = false,\n provider,\n renderPalette,\n renderPanel,\n ...restProps\n}: Props) => {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [mobilePaletteOpen, setMobilePaletteOpen] = useState(false);\n\n const { breakpoint } = useResponsiveSize();\n const isMobile = breakpoint.current === 'xs' || breakpoint.current === 'sm';\n\n const { setCode } = usePreview();\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 10,\n },\n }),\n );\n\n const value = _value || DEFAULT_TEMPLATE;\n const sections = useMemo(() => extractSections(value), [value]);\n const selectedItem = useMemo(\n () => sections.find(s => s.id === selectedId),\n [sections, selectedId],\n );\n\n // One cache per Dnd instance (lazy `useState` initializer, never\n // replaced) — see createSectionPreviewCache (#131). It's stateful by\n // design (remembers the previous render's previews to reuse the ones\n // that didn't change), which a `useMemo`/`useRef` can't do without\n // touching a ref during render; a cache object stored via `useState`\n // and only ever mutated through its own method isn't subject to that\n // restriction the way `ref.current` is.\n const [previewCache] = useState(() => createSectionPreviewCache());\n const previews = useMemo(\n () => previewCache.compute(value, sections),\n [previewCache, sections, value],\n );\n\n const onDragStart = (_: DragStartEvent) => {};\n\n const onDragOver = (_e: DragOverEvent) => {};\n\n const onDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over) {\n return;\n }\n\n if (active.data.current?.type === 'new-item') {\n const newItem = active.data.current.item;\n const newSection = {\n id: uuidv4(),\n name: newItem.name,\n code: newItem.code,\n };\n\n let nextSections: typeof sections;\n\n if (over.id === 'sortable-area' || over.id === 'sortable-area-bottom') {\n nextSections = [...sections, newSection];\n } else {\n const overIndex = sections.findIndex(s => s.id === over.id);\n if (overIndex >= 0) {\n nextSections = [\n ...sections.slice(0, overIndex),\n newSection,\n ...sections.slice(overIndex),\n ];\n } else {\n nextSections = [...sections, newSection];\n }\n }\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n return;\n }\n\n if (active.id !== over.id && sections.some(s => s.id === active.id)) {\n const prevIndex = sections.findIndex(s => s.id === active.id);\n const nextIndex = sections.findIndex(s => s.id === over.id);\n\n if (prevIndex >= 0 && nextIndex >= 0) {\n const nextSections = arrayMove(sections, prevIndex, nextIndex);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n }\n }\n };\n\n const addItem = (item: (typeof DRAGGABLE_ITEMS)[0]) => {\n const newSection = {\n id: uuidv4(),\n name: item.name,\n code: item.code,\n };\n\n const nextSections = [...sections, newSection];\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n };\n\n const onDelete = (id: string) => {\n const nextSections = sections.filter(s => s.id !== id);\n\n setSelectedId(null);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n };\n\n const moveSection = (id: string | null, direction: 'up' | 'down') => {\n const index = sections.findIndex(s => s.id === id);\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n\n if (index < 0 || targetIndex < 0 || targetIndex >= sections.length) {\n return;\n }\n\n const nextSections = arrayMove(sections, index, targetIndex);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n // Section ids are just the section's positional index, re-derived from\n // scratch on every parse (getSections) rather than a stable identity —\n // so once `sections` recomputes after this reorder, `selectedId`\n // (unchanged) would silently point at whatever content now sits at its\n // old position instead of following the section that actually moved.\n setSelectedId(String(targetIndex));\n };\n\n const onCopy = (id: string) => {\n const sectionIndex = sections.findIndex(s => s.id === id);\n const sectionToCopy = sections[sectionIndex];\n\n if (sectionToCopy) {\n const nextId = uuidv4();\n const nextSection = {\n id: nextId,\n code: replaceIds(sectionToCopy.code),\n name: sectionToCopy.name,\n };\n\n const nextSections = [\n ...sections.slice(0, sectionIndex + 1),\n nextSection,\n ...sections.slice(sectionIndex + 1),\n ];\n\n setSelectedId(nextId);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n }\n };\n\n const onSelect = (id: string) => {\n setSelectedId(prev => (prev === id ? null : id));\n };\n\n const onChange = (next: Partial<Section>) => {\n const nextSections = sections.map(s =>\n s.id === next.id ? { ...s, ...next } : s,\n );\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n };\n\n // Reads only the extracted `code` local, not `selectedItem`, so the\n // compiler can verify this dependency array actually matches what the\n // body reads — matches Panel's own former version of this same logic,\n // now shared here so both the built-in Panel and a custom renderPanel\n // get the same extraction/update pipeline instead of each needing it.\n const selectedCode = selectedItem?.code;\n const { fields, updatedCode, parseError } = useMemo(() => {\n if (!selectedCode) {\n return {\n fields: [] as DataAttrNode[],\n updatedCode: '',\n parseError: false,\n };\n }\n\n try {\n const updated = fillIds(selectedCode);\n const allNodes = extract(updated);\n const filtered = allNodes.filter(node => node.tagName !== 'section');\n\n return {\n fields: filtered,\n updatedCode: updated !== selectedCode ? updated : selectedCode,\n parseError: false,\n };\n } catch (e) {\n console.warn('⚠️ Parsing error', e);\n return {\n fields: [] as DataAttrNode[],\n updatedCode: '',\n parseError: true,\n };\n }\n }, [selectedCode]);\n\n useEffect(() => {\n if (parseError) {\n Toast.error('Failed to parse this section', {\n description: 'Check the console for details.',\n });\n }\n }, [parseError]);\n\n const onFieldChange = ({\n id,\n label,\n value: fieldValue,\n }: {\n id: string;\n label: string;\n value: string;\n }) => {\n const result = update(updatedCode, id, label, fieldValue);\n\n if (!result.success) {\n Toast.error('Failed to update this field', {\n description: 'Check the console for details.',\n });\n return;\n }\n\n if (selectedItem) {\n onChange({ ...selectedItem, code: result.code });\n }\n };\n\n // Flattens the extracted `fields` (one DataAttrNode per element) down to\n // one PanelBinding per bound property — the same walk the built-in\n // FieldEditor/Node does internally (data-id + parsed data-binding +\n // current value), but handed to a custom renderPanel as plain data so it\n // can render its own controls. Kept in a useMemo keyed on `fields` alone;\n // `onFieldChange` closes over `updatedCode`/`selectedItem` but is stable\n // enough per render, and rebuilding on every render would defeat the memo\n // guarding renderPanel's children.\n const bindings = useMemo<PanelBinding[]>(() => {\n return fields.flatMap(node => {\n const dataId = node.dataAttributes.find(a => a.name === 'data-id')?.value;\n const bindingAttr = node.dataAttributes.find(\n a => a.name === 'data-binding',\n )?.value;\n\n if (!dataId || !bindingAttr) {\n return [];\n }\n\n const parsed = node.bindings ?? parseBinding(bindingAttr);\n\n return parsed.map(binding => ({\n id: dataId,\n label: binding.label,\n property: binding.property,\n type: binding.type,\n options: binding.options,\n value: getCurrentValue(node, binding.property),\n onChange: (value: string) =>\n onFieldChange({ id: dataId, label: binding.label, value }),\n }));\n });\n // onFieldChange is intentionally omitted — it's recreated every render\n // but only ever called from a user event, so closing over the latest\n // one via the render that produced these bindings is fine.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fields]);\n\n useEffect(() => {\n if (frame?.scripts?.length) {\n preloadScripts(frame.scripts);\n }\n }, [frame?.scripts]);\n\n const renderPaletteItems = (\n onAdd: (item: Section) => void,\n forMobileDrawer = false,\n ) => {\n const paletteItems = items?.length ? items : DRAGGABLE_ITEMS;\n\n if (renderPalette) {\n return renderPalette({\n items: paletteItems,\n onAdd,\n DraggableItem,\n isMobile: forMobileDrawer,\n });\n }\n\n return (\n <Space orientation=\"vertical\" align=\"start\">\n {paletteItems.map(item => (\n <DefaultDraggableItem\n key={item.id}\n item={item}\n onAdd={onAdd}\n tapToAdd={forMobileDrawer}\n />\n ))}\n </Space>\n );\n };\n\n const renderPanelContent = () => {\n const selectedIndex = sections.findIndex(s => s.id === selectedId);\n const canMoveUp = selectedIndex > 0;\n const canMoveDown =\n selectedIndex >= 0 && selectedIndex < sections.length - 1;\n\n if (renderPanel) {\n return renderPanel({\n item: selectedItem,\n onChange,\n onDelete,\n onMoveUp: () => moveSection(selectedId, 'up'),\n onMoveDown: () => moveSection(selectedId, 'down'),\n canMoveUp,\n canMoveDown,\n bindings,\n });\n }\n\n return (\n <Panel\n item={selectedItem}\n onDelete={onDelete}\n onMoveUp={() => moveSection(selectedId, 'up')}\n onMoveDown={() => moveSection(selectedId, 'down')}\n canMoveUp={canMoveUp}\n canMoveDown={canMoveDown}\n fields={fields}\n onFieldChange={onFieldChange}\n />\n );\n };\n\n return (\n <>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[\n conditionalModifiers,\n //\n ]}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n >\n <div\n className={cn(\n 'relative flex w-full',\n className,\n //\n )}\n {...restProps}\n >\n <div className=\"hidden w-1/5 overflow-y-auto md:block\">\n <div className=\"h-full bg-gray-50 p-4\">\n {renderPaletteItems(addItem)}\n </div>\n </div>\n <div\n className={cn(\n 'relative',\n 'h-full w-full md:w-3/5',\n 'overflow-y-auto',\n //\n )}\n data-frame-container\n style={{\n isolation: 'isolate',\n contain: 'layout style',\n transform: 'translateZ(0)',\n }}\n >\n <Droppable\n className={cn(\n !sections.length && 'h-full',\n //\n )}\n >\n {!sections.length ? (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'h-full',\n 'text-gray-500',\n )}\n >\n <Space orientation=\"vertical\" align=\"center\">\n <Typography.Paragraph>\n No sections available\n </Typography.Paragraph>\n <Typography.Text>\n {isMobile\n ? 'Tap a component to add it'\n : 'Drag a component from the left to add it'}\n </Typography.Text>\n </Space>\n </div>\n ) : (\n <SortableContext\n items={sections.map(s => s.id)}\n strategy={verticalListSortingStrategy}\n >\n {sections.map((section, index) => (\n <Sortable\n key={section.id}\n id={section.id}\n name={section.name}\n selected={selectedId === section.id}\n onClick={() => onSelect(section.id)}\n onDelete={onDelete}\n onCopy={onCopy}\n >\n <Renderer\n preview={previews[index]!}\n modules={modules}\n frame={frame}\n dynamicTailwind={dynamicTailwind}\n provider={provider}\n {...props}\n />\n </Sortable>\n ))}\n </SortableContext>\n )}\n </Droppable>\n </div>\n <div className=\"hidden w-1/5 md:block\">{renderPanelContent()}</div>\n <Button\n type=\"primary\"\n shape=\"circle\"\n icon={<LayoutGrid />}\n aria-label=\"Components\"\n className=\"fixed right-4 bottom-4 z-20 md:hidden\"\n onClick={() => setMobilePaletteOpen(true)}\n />\n <Drawer\n open={isMobile && mobilePaletteOpen}\n onClose={() => setMobilePaletteOpen(false)}\n direction=\"bottom\"\n size=\"large\"\n title=\"Components\"\n >\n {renderPaletteItems(item => {\n addItem(item);\n setMobilePaletteOpen(false);\n }, true)}\n </Drawer>\n <Drawer\n open={isMobile && Boolean(selectedId)}\n onClose={() => setSelectedId(null)}\n direction=\"bottom\"\n size=\"large\"\n title=\"Properties\"\n >\n {renderPanelContent()}\n </Drawer>\n </div>\n <DragOverlay>\n <Overlay\n sections={sections}\n renderProps={{\n fullCode: value,\n modules,\n frame,\n dynamicTailwind,\n ...props,\n }}\n />\n </DragOverlay>\n </DndContext>\n </>\n );\n};\n\nexport default Dnd;\n","import DndImpl, {\n type PaletteRenderData,\n type PanelBinding,\n type PanelRenderData,\n type Props,\n} from './dnd';\nimport DraggableItem, {\n type DraggableItemDragState,\n type DraggableItemProps,\n} from './draggable';\n\ntype DndComponent = typeof DndImpl & {\n DraggableItem: typeof DraggableItem;\n};\n\nconst Dnd = DndImpl as DndComponent;\n\nDnd.DraggableItem = DraggableItem;\n\nexport { DraggableItem };\nexport type {\n Props,\n PaletteRenderData,\n PanelRenderData,\n PanelBinding,\n DraggableItemProps,\n DraggableItemDragState,\n};\nexport default Dnd;\n"],"mappings":"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"}
1
+ {"version":3,"file":"dnd-CZ7VF9u8.js","names":["Renderer","t","parseExpression","TiptapEditor","CoreEditor","Dnd","uuidv4","Renderer","DndImpl"],"sources":["../src/components/dnd/draggable.tsx","../src/components/dnd/droppable.tsx","../src/components/dnd/renderer.tsx","../src/components/dnd/sortable.tsx","../src/components/dnd/overlay.tsx","../src/components/editor/tiptap.tsx","../src/components/dnd/panel/selection.ts","../src/components/dnd/panel/items.tsx","../src/components/dnd/panel/children.tsx","../src/components/dnd/panel/icon-map.ts","../src/components/dnd/panel/field.tsx","../src/components/dnd/panel/node.tsx","../src/components/dnd/panel/panel.tsx","../src/components/dnd/dnd.tsx","../src/components/dnd/index.ts"],"sourcesContent":["import { useDraggable } from '@dnd-kit/core';\nimport { Card } from '@jbpark/ui-kit';\n\nimport type { Section } from '~/types';\nimport { cn } from '~/utils';\n\nexport interface DraggableItemDragState {\n ref: (node: HTMLElement | null) => void;\n dragProps: React.HTMLAttributes<HTMLElement>;\n isDragging: boolean;\n}\n\nexport interface DraggableItemProps {\n item: Section;\n children: (drag: DraggableItemDragState) => React.ReactNode;\n}\n\n// Owns the dnd-kit wiring (useDraggable + the `type: 'new-item'` data shape\n// Dnd's onDragEnd expects) so a custom renderPalette only has to decide how\n// an item *looks*, not how dragging itself works. Exported as\n// Dnd.DraggableItem for that purpose; also used internally for the default\n// palette rendering, so both paths share the exact same drag wiring.\nconst DraggableItem = ({ item, children }: DraggableItemProps) => {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: item.id,\n data: { type: 'new-item', item },\n });\n\n return children({\n ref: setNodeRef,\n dragProps: { ...listeners, ...attributes },\n isDragging,\n });\n};\n\n// The built-in card look, shared by the default (non-custom) palette\n// rendering and the drag overlay's floating preview — both rendered a plain\n// `<Draggable>` before this became a children-render-prop component.\nexport interface DefaultDraggableItemProps {\n item: Section;\n onAdd?: (item: Section) => void;\n // Double-click is the desktop convenience shortcut alongside drag — a\n // single click there would fire on every aborted/failed drag attempt.\n // On mobile there's nowhere to drag *to* (the palette lives in a Drawer\n // stacked over the canvas), so a tap can't be a failed drag, and\n // double-tap-to-dblclick synthesis from touch is unreliable anyway\n // (iOS Safari inconsistently fires it, and it can compete with the\n // browser's native double-tap-to-zoom gesture). Tapping just adds there.\n tapToAdd?: boolean;\n}\n\nexport const DefaultDraggableItem = ({\n item,\n onAdd,\n tapToAdd = false,\n}: DefaultDraggableItemProps) => (\n <DraggableItem item={item}>\n {({ ref, dragProps, isDragging }) => (\n <Card\n ref={ref}\n style={{ opacity: isDragging ? 0.5 : 1 }}\n {...dragProps}\n className={cn(\n 'cursor-grab',\n 'outline-none',\n 'hover:border-blue-300 hover:shadow-md',\n isDragging && 'opacity-50',\n )}\n onClick={tapToAdd && onAdd ? () => onAdd(item) : undefined}\n onDoubleClick={onAdd ? () => onAdd(item) : undefined}\n >\n {item.name}\n </Card>\n )}\n </DraggableItem>\n);\n\nexport default DraggableItem;\n","import { useDroppable } from '@dnd-kit/core';\nimport { Typography } from '@jbpark/ui-kit';\n\nimport { cn } from '~/utils';\n\nconst Droppable = ({\n children,\n className,\n}: React.ComponentPropsWithRef<'div'>) => {\n const { setNodeRef, isOver, active } = useDroppable({\n id: 'sortable-area',\n });\n\n const { setNodeRef: setBottomRef, isOver: isBottomOver } = useDroppable({\n id: 'sortable-area-bottom',\n });\n\n const isNewItemDragging = active?.data.current?.type === 'new-item';\n const shouldHighlight = isOver && isNewItemDragging;\n const shouldHighlightBottom = isBottomOver && isNewItemDragging;\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'min-h-full',\n 'border-2 border-dashed p-1',\n shouldHighlight ? 'border-blue-300 bg-blue-50' : 'border-gray-200',\n className,\n )}\n >\n {children}\n {isNewItemDragging && (\n <div\n ref={setBottomRef}\n className={cn(\n 'mt-2 min-h-24',\n 'rounded-lg border-2 border-dashed',\n 'transition-all duration-200',\n 'flex items-center justify-center',\n shouldHighlightBottom\n ? 'border-blue-400 bg-blue-100'\n : 'border-gray-300 bg-gray-50',\n )}\n >\n <Typography.Text className=\"text-sm text-gray-500\">\n {shouldHighlightBottom ? 'Drop here' : 'Drag here to add at bottom'}\n </Typography.Text>\n </div>\n )}\n </div>\n );\n};\n\nexport default Droppable;\n","import { memo, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport Frame, { type FrameProps } from '~/components/frame';\nimport { baseModules, compile } from '~/utils';\nimport { generateTailwindCSSFromDOM } from '~/utils/tailwind';\n\ninterface Props {\n preview: string;\n modules?: Record<string, unknown>;\n headers?: Record<string, boolean>;\n frame?: FrameProps;\n dynamicTailwind?: boolean;\n provider?: (children: React.ReactNode) => React.ReactNode;\n}\n\n// Wrapped in memo() because `preview` is a plain string: for a section that\n// didn't change, the parent hands back the same content it computed last\n// render (see generateSections()/dnd.tsx), so a shallow prop comparison\n// lets React skip both the recompile below and reconciling this section's\n// iframe tree at all — see #97.\nconst Renderer = ({\n preview,\n headers,\n modules,\n frame,\n dynamicTailwind = false,\n provider,\n}: Props) => {\n const memoizedModules = useMemo(\n () => ({\n ...baseModules,\n ...modules,\n }),\n [modules],\n );\n\n const module = useMemo(() => {\n try {\n return compile(preview, memoizedModules);\n } catch (e) {\n return {\n exports: {},\n error: e instanceof Error ? e.message : 'Module transformation error',\n };\n }\n }, [preview, memoizedModules]);\n\n // In `shadow` mode there's no separate document to load a stylesheet into\n // — the shadow root only gets whatever CSS naturally inherits across the\n // boundary (see `frame/shadow.tsx`), not utility classes. Mirrors\n // `preview/client.tsx`'s `dynamicTailwind` handling: compile this\n // section's own Tailwind classes and portal them in as a `<style>` tag\n // alongside the rendered content, which crosses the shadow boundary fine\n // since it lives inside the same portal target.\n //\n // Scans the actual rendered DOM (below) rather than the `preview` source\n // text, so classes contributed by an imported component (e.g. ui-kit's\n // `Button`) are picked up too — those never appear as literal text in\n // `preview`, only in the component's own compiled output.\n //\n // The wrapper below is tracked via a callback ref (`wrapperEl` state)\n // rather than a plain `useRef`, because in shadow mode it isn't mounted\n // on this component's first commit at all — `Shadow` creates its portal\n // target in its own effect and only re-renders with it afterwards, one\n // commit later. A plain ref read in a `[preview, dynamicTailwind]`-keyed\n // effect would see `null` on that first pass and never retry; making the\n // element itself a dependency re-runs the scan once it actually exists.\n const [dynamicCSS, setDynamicCSS] = useState('');\n const [wrapperEl, setWrapperEl] = useState<HTMLDivElement | null>(null);\n const wrapperRef = useCallback((el: HTMLDivElement | null) => {\n setWrapperEl(el);\n }, []);\n\n useEffect(() => {\n if (!preview || !dynamicTailwind || !wrapperEl) {\n return;\n }\n\n let cancelled = false;\n\n generateTailwindCSSFromDOM(wrapperEl).then(css => {\n if (!cancelled) {\n setDynamicCSS(css);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [preview, dynamicTailwind, wrapperEl]);\n\n const renderProvider = (component: React.ReactNode) => {\n return provider ? provider(component) : component;\n };\n\n const Component = module.exports.default;\n\n if (!Component) {\n return null;\n }\n\n return (\n <Frame {...frame} autoHeight>\n {container => (\n <div\n ref={wrapperRef}\n className=\"w-full overflow-x-hidden\"\n data-editor-mode\n >\n {renderProvider(\n <>\n <Component\n headers={headers}\n container={container}\n //\n />\n {dynamicTailwind && dynamicCSS && <style>{dynamicCSS}</style>}\n </>,\n )}\n </div>\n )}\n </Frame>\n );\n};\n\nexport default memo(Renderer);\n","import { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { Button, Space } from '@jbpark/ui-kit';\nimport { Copy, Trash } from 'lucide-react';\n\nimport { cn } from '~/utils';\n\ninterface Props {\n id: string;\n name?: string;\n children: React.ReactNode;\n selected?: boolean;\n onClick?: () => void;\n onDelete?: (id: string) => void;\n onCopy?: (id: string) => void;\n}\n\nconst Sortable = ({\n id,\n children,\n selected,\n onClick,\n onDelete: _onDelete,\n onCopy: _onCopy,\n}: Props) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n isOver,\n active,\n } = useSortable({ id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n cursor: 'grab',\n };\n\n const isNewItemOver = isOver && active?.data.current?.type === 'new-item';\n\n const onDelete = (e: React.MouseEvent) => {\n e.stopPropagation();\n _onDelete?.(id);\n };\n\n const onCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n _onCopy?.(id);\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n onClick={onClick}\n className={cn(\n 'relative',\n selected && 'z-10 outline-2 outline-offset-2 outline-blue-500',\n isNewItemOver && 'border-t-4 border-t-green-500',\n //\n )}\n >\n <div\n className={cn(\n 'absolute inset-0 z-50',\n //\n )}\n />\n {children}\n {selected && (\n <Space\n className={cn(\n 'absolute top-1 right-1 z-60',\n //\n )}\n >\n <Button icon={<Copy />} onClick={onCopy} />\n <Button danger icon={<Trash />} onClick={onDelete} />\n </Space>\n )}\n </div>\n );\n};\n\nexport default Sortable;\n","import { useDndContext } from '@dnd-kit/core';\n\nimport type { FrameProps } from '~/components/frame';\nimport type { Section } from '~/types';\nimport { generateSection } from '~/utils';\n\nimport { DefaultDraggableItem } from './draggable';\nimport Renderer from './renderer';\nimport Sortable from './sortable';\n\ninterface Props {\n sections: Section[];\n renderProps: {\n fullCode: string;\n modules: Record<string, unknown>;\n frame?: FrameProps;\n dynamicTailwind?: boolean;\n };\n}\n\nconst Overlay = ({ sections, renderProps }: Props) => {\n const { active } = useDndContext();\n\n if (!active) {\n return null;\n }\n\n if (active.data.current?.type === 'new-item') {\n const item = active.data.current.item;\n\n return <DefaultDraggableItem item={item} />;\n }\n\n const section = sections.find(s => s.id === active.id);\n\n if (section) {\n const preview = generateSection(section.code, renderProps.fullCode);\n\n return (\n <Sortable id={section.id} name={section.name}>\n <Renderer\n preview={preview}\n modules={renderProps.modules}\n frame={renderProps.frame}\n dynamicTailwind={renderProps.dynamicTailwind}\n />\n </Sortable>\n );\n }\n\n return null;\n};\n\nexport default Overlay;\n","import { useEffect } from 'react';\n\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\n\nimport { cn } from '~/utils';\n\nexport interface Props {\n value?: string;\n placeholder?: string;\n className?: string;\n onChange?: (value: string) => void;\n}\n\nconst Tiptap = ({\n value = '',\n placeholder = 'Enter text...',\n className,\n onChange,\n}: Props) => {\n const editor = useEditor({\n extensions: [StarterKit, Placeholder.configure({ placeholder })],\n content: value,\n onBlur: ({ editor: e }) => {\n onChange?.(e.getHTML());\n },\n });\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const current = editor.getHTML();\n\n if (current !== value) {\n editor.commands.setContent(value, { emitUpdate: false });\n }\n }, [value, editor]);\n\n return (\n <EditorContent\n editor={editor}\n className={cn(\n `tiptap-editor min-h-20 rounded border border-gray-200 bg-white px-3\n py-2`,\n 'prose prose-sm max-w-none text-sm text-gray-800',\n '[&_.tiptap]:outline-none',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:float-left',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:h-0',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:text-gray-400',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n className,\n )}\n />\n );\n};\n\nexport default Tiptap;\n","export const removeIndices = <T>(items: T[], indices: Set<number>): T[] => {\n return items.filter((_, index) => !indices.has(index));\n};\n\n/**\n * Shifts every selected index up/down by one step as a block, preserving\n * relative order — scattered selections stop moving individually once they\n * hit an unselected neighbor, so the whole group slides together instead of\n * items passing through each other.\n */\nexport const moveSelectedIndices = <T>(\n items: T[],\n indices: Set<number>,\n direction: 'up' | 'down',\n): { items: T[]; indices: Set<number> } => {\n const next = [...items];\n const nextIndices = new Set(indices);\n\n const ordered = [...indices].sort((a, b) =>\n direction === 'up' ? a - b : b - a,\n );\n\n for (const index of ordered) {\n const target = direction === 'up' ? index - 1 : index + 1;\n\n if (target < 0 || target >= next.length || nextIndices.has(target)) {\n continue;\n }\n\n [next[index], next[target]] = [next[target]!, next[index]!];\n nextIndices.delete(index);\n nextIndices.add(target);\n }\n\n return { items: next, indices: nextIndices };\n};\n","import { useEffect, useMemo } from 'react';\n\nimport { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { Button, Checkbox, Toast } from '@jbpark/ui-kit';\nimport { useMultiSelect } from '@jbpark/use-hooks';\nimport { ArrowDown, ArrowUp, Copy, Plus, X } from 'lucide-react';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP } from '~/constants';\nimport {\n type BindingRenderLeaf,\n type BindingRenderMap,\n type DataAttrNode,\n type ExtractedNodeValue,\n type NodeValueType,\n arrayExpressionToCode,\n clone,\n createNodeFromValue,\n extract,\n extractNodeValue,\n extractObjectProperties,\n findEditableChildren,\n generateCode,\n parseArrayExpression,\n parseValue,\n} from '~/utils/ast';\n\nimport Field from './field';\nimport Node from './node';\nimport { moveSelectedIndices, removeIndices } from './selection';\n\ninterface ItemProperty extends ExtractedNodeValue {\n astNode: t.Node;\n}\n\ninterface ItemData {\n id: string;\n index: number;\n editableProperties: Record<string, ItemProperty>;\n originalElement: t.ObjectExpression;\n jsxBindings: Record<string, DataAttrNode[]>;\n}\n\ninterface PrimitiveItem {\n id: string;\n index: number;\n value: string | number | boolean | null;\n type: NodeValueType;\n astNode: t.Expression;\n}\n\ninterface Props {\n value: string;\n render?: BindingRenderMap;\n onChange?: (value: string) => void;\n onChildChange?: (params: {\n id: string;\n label: string;\n value: string;\n }) => void;\n}\n\ninterface BulkActionsBarProps {\n count: number;\n onDuplicate: () => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onDelete: () => void;\n onClear: () => void;\n}\n\nconst BulkActionsBar = ({\n count,\n onDuplicate,\n onMoveUp,\n onMoveDown,\n onDelete,\n onClear,\n}: BulkActionsBarProps) => {\n if (count === 0) {\n return null;\n }\n\n return (\n <div\n className=\"flex items-center justify-between rounded border\n border-blue-200 bg-blue-50 p-2\"\n >\n <div className=\"text-xs font-medium text-blue-700\">{count} selected</div>\n <div className=\"flex items-center space-x-1\">\n <Button\n size=\"small\"\n icon={<Copy />}\n title=\"Duplicate selected\"\n onClick={onDuplicate}\n />\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n title=\"Move selected up\"\n onClick={onMoveUp}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n title=\"Move selected down\"\n onClick={onMoveDown}\n />\n <Button\n danger\n size=\"small\"\n icon={<X />}\n title=\"Delete selected\"\n onClick={onDelete}\n />\n <Button size=\"small\" onClick={onClear}>\n Clear\n </Button>\n </div>\n </div>\n );\n};\n\nconst Items = ({ value, render, onChange, onChildChange }: Props) => {\n const { objectItems, primitiveItems, allElements, parseError } =\n useMemo(() => {\n const ast = parseArrayExpression(value);\n\n if (!ast) {\n return {\n objectItems: [],\n primitiveItems: [],\n allElements: [],\n parseError: true,\n };\n }\n\n const objectItems: ItemData[] = [];\n const primitiveItems: PrimitiveItem[] = [];\n const allElements = ast.elements.filter(Boolean) as t.Expression[];\n\n ast.elements.forEach(element => {\n if (!element) {\n return;\n }\n\n if (!t.isObjectExpression(element)) {\n const extracted = extractNodeValue(element);\n primitiveItems.push({\n id: nanoid(6),\n index: primitiveItems.length,\n value: extracted.value,\n type: extracted.type,\n astNode: element as t.Expression,\n });\n return;\n }\n\n const jsxBindings: Record<string, DataAttrNode[]> = {};\n\n element.properties.forEach(prop => {\n if (\n !t.isObjectProperty(prop) ||\n !t.isIdentifier(prop.key) ||\n !t.isJSXElement(prop.value)\n ) {\n return;\n }\n\n const propertyName = prop.key.name;\n\n try {\n const jsxCode = generateCode(prop.value);\n const nodes = extract(jsxCode);\n const bindings: DataAttrNode[] = [];\n\n const bindingContainer = nodes.find(node =>\n node.bindings?.some(b => b.property === 'children'),\n );\n\n if (bindingContainer) {\n bindings.push(bindingContainer);\n } else {\n nodes.forEach(node => {\n if (\n node.bindings &&\n node.bindings.length > 0 &&\n node.dataAttributes.some(a => a.name === 'data-id')\n ) {\n bindings.push(node);\n }\n const editableChildren = findEditableChildren(node);\n bindings.push(...editableChildren);\n });\n }\n\n if (bindings.length > 0) {\n jsxBindings[propertyName] = bindings;\n }\n } catch (error) {\n console.error(\n `Failed to parse JSX in property '${propertyName}':`,\n error,\n );\n }\n });\n\n objectItems.push({\n id: nanoid(6),\n index: objectItems.length,\n editableProperties: extractObjectProperties(element),\n originalElement: element,\n jsxBindings,\n });\n });\n\n return { objectItems, primitiveItems, allElements, parseError: false };\n }, [value]);\n\n useEffect(() => {\n if (parseError) {\n Toast.error('Failed to parse items', {\n description: 'Check the console for details.',\n });\n }\n }, [parseError]);\n\n const isPrimitive = primitiveItems.length > 0 && objectItems.length === 0;\n\n const selection = useMultiSelect(\n isPrimitive ? primitiveItems.length : objectItems.length,\n );\n\n const updatePrimitive = (index: number, next: string) => {\n const ast = parseArrayExpression(value);\n\n if (!ast) {\n Toast.error('Failed to update this item', {\n description: 'Check the console for details.',\n });\n return;\n }\n\n const elements = ast.elements.filter(Boolean) as t.Expression[];\n const item = primitiveItems.find(p => p.index === index);\n\n if (!item) {\n return;\n }\n\n const newNode = createNodeFromValue(item.type, parseValue(next));\n\n if (!newNode) {\n return;\n }\n\n elements[index] = newNode;\n\n onChange?.(generateCode(t.arrayExpression(elements)));\n };\n\n const movePrimitive = (fromIndex: number, toIndex: number) => {\n const nextElements = [...allElements];\n const [moved] = nextElements.splice(fromIndex, 1);\n\n nextElements.splice(toIndex, 0, moved!);\n onChange?.(generateCode(t.arrayExpression(nextElements)));\n };\n\n const deleteSelectedPrimitives = (indices: Set<number>) => {\n if (allElements.length - indices.size < 1) {\n return;\n }\n\n const nextElements = removeIndices(allElements, indices);\n\n onChange?.(generateCode(t.arrayExpression(nextElements)));\n };\n\n const deletePrimitive = (index: number) =>\n deleteSelectedPrimitives(new Set([index]));\n\n const addPrimitive = () => {\n const first = primitiveItems[0];\n\n if (!first) {\n return;\n }\n\n const newNode = createNodeFromValue(first.type, first.value);\n\n if (!newNode) {\n return;\n }\n\n onChange?.(generateCode(t.arrayExpression([...allElements, newNode])));\n };\n\n const duplicateSelectedPrimitives = (indices: Set<number>) => {\n const clones = [...indices]\n .sort((a, b) => a - b)\n .map(index => allElements[index])\n .filter((node): node is t.Expression => Boolean(node))\n .map(node => clone(node) as t.Expression);\n\n if (clones.length === 0) {\n return;\n }\n\n onChange?.(generateCode(t.arrayExpression([...allElements, ...clones])));\n };\n\n const moveSelectedPrimitives = (\n indices: Set<number>,\n direction: 'up' | 'down',\n ) => {\n const { items: nextElements, indices: nextIndices } = moveSelectedIndices(\n allElements,\n indices,\n direction,\n );\n\n selection.replace(nextIndices);\n onChange?.(generateCode(t.arrayExpression(nextElements)));\n };\n\n const moveItem = (fromIndex: number, toIndex: number) => {\n const nextItems = [...objectItems];\n const [movedItem] = nextItems.splice(fromIndex, 1);\n nextItems.splice(toIndex, 0, movedItem!);\n\n const nextValue = arrayExpressionToCode(\n nextItems.map(item => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n const updateProperty = (\n itemIndex: number,\n propertyKey: string,\n value: unknown,\n ) => {\n const item = objectItems[itemIndex]!;\n const property = item.editableProperties[propertyKey]!;\n\n const renderLeaf =\n render?.[propertyKey] && 'type' in render[propertyKey]\n ? (render[propertyKey] as BindingRenderLeaf)\n : null;\n\n const isJsx = renderLeaf?.type === 'jsx';\n const isInnerHTML = renderLeaf?.property === BINDING_PROP.INNER_HTML;\n let nextAstValue: t.Expression | null = null;\n\n if (isInnerHTML) {\n const str = String(value);\n nextAstValue = t.templateLiteral(\n [t.templateElement({ raw: str, cooked: str }, true)],\n [],\n );\n } else if (property.type === 'array' || property.type === 'object') {\n try {\n nextAstValue = parseExpression(String(value), {\n plugins: ['jsx', 'typescript'],\n });\n } catch {\n return;\n }\n } else if (!isJsx) {\n nextAstValue = createNodeFromValue(property.type, value);\n }\n\n if (!isJsx && !nextAstValue) {\n return;\n }\n\n const objectExpression = item.originalElement;\n const targetProperty = objectExpression.properties.find(\n (prop: t.ObjectProperty | t.ObjectMethod | t.SpreadElement) =>\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n prop.key.name === propertyKey,\n ) as t.ObjectProperty;\n\n const jsxPlaceholders = new Map<string, string>();\n const originalValues = new Map<t.ObjectProperty, t.Expression>();\n\n if (isJsx && targetProperty) {\n const trimmed = String(value).trim();\n if (trimmed.startsWith('<')) {\n const placeholder = `__JSX_${nanoid(6)}__`;\n jsxPlaceholders.set(placeholder, trimmed);\n targetProperty.value = t.identifier(placeholder);\n } else {\n targetProperty.value = t.stringLiteral(trimmed);\n }\n } else if (targetProperty && nextAstValue) {\n targetProperty.value = nextAstValue;\n }\n\n objectItems.forEach(obj => {\n obj.originalElement.properties.forEach(prop => {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) {\n return;\n }\n\n if (t.isJSXElement(prop.value) || t.isJSXFragment(prop.value)) {\n const placeholder = `__JSX_${nanoid(6)}__`;\n jsxPlaceholders.set(placeholder, generateCode(prop.value));\n originalValues.set(prop, prop.value);\n prop.value = t.identifier(placeholder);\n }\n });\n });\n\n let nextValue = arrayExpressionToCode(\n objectItems.map(item => item.originalElement),\n );\n\n for (const [prop, original] of originalValues) {\n prop.value = original;\n }\n\n for (const [placeholder, code] of jsxPlaceholders) {\n // 두 번째 인자가 문자열이면 $&, $$ 같은 특수 치환 패턴으로 해석되어\n // code 안에 그런 문자가 있으면 결과가 깨진다 — 함수형 치환자로 방지.\n nextValue = nextValue.replace(placeholder, () => code);\n }\n\n onChange?.(nextValue);\n };\n\n const deleteSelectedItems = (indices: Set<number>) => {\n if (objectItems.length - indices.size < 1) {\n return;\n }\n\n const nextItems = removeIndices(objectItems, indices);\n const nextValue = arrayExpressionToCode(\n nextItems.map((item: ItemData) => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n const deleteItem = (index: number) => deleteSelectedItems(new Set([index]));\n\n const cloneObjectItemElement = (source: ItemData): t.ObjectExpression => {\n const clonedElement = clone(source.originalElement) as t.ObjectExpression;\n\n clonedElement.properties.forEach(prop => {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n const key = prop.key.name;\n const editableProp = source.editableProperties[key];\n\n if (key === 'key' && t.isStringLiteral(prop.value)) {\n const originalKey = prop.value.value;\n const uniqueKey = `${originalKey}-${nanoid(6)}`;\n prop.value = t.stringLiteral(uniqueKey);\n return;\n }\n\n if (editableProp) {\n const nextValue = createNodeFromValue(\n editableProp.type,\n editableProp.value,\n );\n\n if (nextValue) {\n prop.value = nextValue;\n }\n }\n }\n });\n\n return clonedElement;\n };\n\n const addItem = () => {\n const firstItem = objectItems[0];\n\n if (!firstItem) {\n return;\n }\n\n const clonedElement = cloneObjectItemElement(firstItem);\n const editableProperties = extractObjectProperties(clonedElement);\n\n const nextItems = [...objectItems];\n const newItemData: ItemData = {\n id: nanoid(6),\n index: nextItems.length,\n editableProperties,\n originalElement: clonedElement,\n jsxBindings: {},\n };\n\n nextItems.push(newItemData);\n\n const nextValue = arrayExpressionToCode(\n nextItems.map(item => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n const duplicateSelectedItems = (indices: Set<number>) => {\n const sources = [...indices]\n .sort((a, b) => a - b)\n .map(index => objectItems[index])\n .filter((item): item is ItemData => Boolean(item));\n\n if (sources.length === 0) {\n return;\n }\n\n const clonedElements = sources.map(cloneObjectItemElement);\n const nextValue = arrayExpressionToCode([\n ...objectItems.map(item => item.originalElement),\n ...clonedElements,\n ]);\n\n onChange?.(nextValue);\n };\n\n const moveSelectedItems = (\n indices: Set<number>,\n direction: 'up' | 'down',\n ) => {\n const { items: nextItems, indices: nextIndices } = moveSelectedIndices(\n objectItems,\n indices,\n direction,\n );\n\n selection.replace(nextIndices);\n\n const nextValue = arrayExpressionToCode(\n nextItems.map(item => item.originalElement),\n );\n\n onChange?.(nextValue);\n };\n\n if (isPrimitive) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold\">\n Items ({primitiveItems.length})\n </div>\n <Button\n size=\"small\"\n icon={<Plus />}\n variant=\"solid\"\n color=\"green\"\n onClick={addPrimitive}\n >\n Add Item\n </Button>\n </div>\n\n <BulkActionsBar\n count={selection.selected.size}\n onDuplicate={() => duplicateSelectedPrimitives(selection.selected)}\n onMoveUp={() => moveSelectedPrimitives(selection.selected, 'up')}\n onMoveDown={() => moveSelectedPrimitives(selection.selected, 'down')}\n onDelete={() => {\n deleteSelectedPrimitives(selection.selected);\n selection.clear();\n }}\n onClear={selection.clear}\n />\n\n {primitiveItems.map((item, i) => (\n <div\n key={item.id}\n className=\"space-y-2 rounded border border-gray-100 bg-gray-50 p-2\"\n >\n <div className=\"flex items-center justify-between space-x-1\">\n <div\n onClick={e => selection.toggle(item.index, e.shiftKey)}\n className=\"inline-flex\"\n >\n <Checkbox\n checked={selection.isSelected(item.index)}\n onChange={() => {}}\n />\n </div>\n <div className=\"flex space-x-1\">\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n disabled={i === 0}\n onClick={() => movePrimitive(item.index, item.index - 1)}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n disabled={i === primitiveItems.length - 1}\n onClick={() => movePrimitive(item.index, item.index + 1)}\n />\n <Button\n danger\n size=\"small\"\n icon={<X />}\n disabled={primitiveItems.length <= 1}\n onClick={() => deletePrimitive(item.index)}\n />\n </div>\n </div>\n <Field\n binding={{\n label: `item-${i}`,\n property: item.type,\n }}\n id={`primitive-${item.id}`}\n value={String(item.value ?? '')}\n onChange={({ value: next }) => updatePrimitive(item.index, next)}\n />\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold\">\n Items ({objectItems.length})\n </div>\n <Button\n size=\"small\"\n icon={<Plus />}\n variant=\"solid\"\n color=\"green\"\n disabled={objectItems.length === 0}\n onClick={addItem}\n >\n Add Item\n </Button>\n </div>\n\n <BulkActionsBar\n count={selection.selected.size}\n onDuplicate={() => duplicateSelectedItems(selection.selected)}\n onMoveUp={() => moveSelectedItems(selection.selected, 'up')}\n onMoveDown={() => moveSelectedItems(selection.selected, 'down')}\n onDelete={() => {\n deleteSelectedItems(selection.selected);\n selection.clear();\n }}\n onClear={selection.clear}\n />\n\n {objectItems.map(item => (\n <div key={item.id} className=\"space-y-3 rounded border bg-gray-50 p-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <div\n onClick={e => selection.toggle(item.index, e.shiftKey)}\n className=\"inline-flex\"\n >\n <Checkbox\n checked={selection.isSelected(item.index)}\n onChange={() => {}}\n />\n </div>\n <div className=\"text-xs font-medium\">Item {item.index + 1}</div>\n </div>\n <div className=\"flex space-x-1\">\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n disabled={item.index === 0}\n onClick={() => moveItem(item.index, item.index - 1)}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n disabled={item.index === objectItems.length - 1}\n onClick={() => moveItem(item.index, item.index + 1)}\n />\n <Button\n danger\n size=\"small\"\n icon={<X />}\n disabled={objectItems.length <= 1}\n onClick={() => deleteItem(item.index)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n {Object.entries(item.editableProperties).map(([key, prop]) => (\n <div key={`${item.id}-${key}`}>\n <div className=\"flex flex-col space-y-2\">\n <label className=\"w-20 shrink-0 text-xs font-medium\">\n {key}\n </label>\n <Field\n binding={{\n label: key,\n property:\n render?.[key] && 'type' in render[key]\n ? ((render[key] as BindingRenderLeaf).property ??\n (render[key].type as string))\n : key,\n type:\n render?.[key] && 'type' in render[key]\n ? (render[key] as BindingRenderLeaf).type\n : undefined,\n render:\n render?.[key] && 'type' in render[key]\n ? (render[key] as BindingRenderLeaf).render\n : render?.[key] && !('type' in render[key])\n ? (render[key] as BindingRenderMap)\n : undefined,\n }}\n id={`item-${item.id}-${key}`}\n value={String(prop.value)}\n onChange={({ value: next }) =>\n updateProperty(item.index, key, parseValue(next))\n }\n />\n </div>\n <span className=\"text-right text-xs text-gray-500\">\n ({prop.type})\n </span>\n </div>\n ))}\n </div>\n <div className=\"space-y-3 border-t pt-2\">\n {Object.entries(item.jsxBindings).length > 0 ? (\n Object.entries(item.jsxBindings).map(\n ([propertyName, bindings]) => (\n <div key={propertyName} className=\"space-y-2\">\n <div className=\"text-xs font-medium text-blue-700\">\n {propertyName} Bindings ({bindings.length}):\n </div>\n {bindings.map((bindingNode, idx) => {\n const nodeId = bindingNode.dataAttributes.find(\n a => a.name === 'data-id',\n )?.value;\n\n return (\n <div\n key={`binding-${item.id}-${propertyName}-${nodeId || idx}`}\n className=\"rounded border border-blue-100 bg-blue-50\n p-2\"\n >\n <div className=\"mb-1 text-xs text-blue-600\">\n &lt;{bindingNode.tagName || 'element'}&gt;\n </div>\n <Node data={bindingNode} onChange={onChildChange} />\n </div>\n );\n })}\n </div>\n ),\n )\n ) : (\n <div className=\"text-xs text-gray-500\">\n ✓ No JSX bindings found\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nexport default Items;\nexport { BulkActionsBar };\n","import { useMemo } from 'react';\n\nimport { Button, Checkbox } from '@jbpark/ui-kit';\nimport { useMultiSelect } from '@jbpark/use-hooks';\nimport { ArrowDown, ArrowUp, Plus, X } from 'lucide-react';\nimport { nanoid } from 'nanoid';\n\nimport { type DataAttrNode, findEditableChildren } from '~/utils/ast';\n\nimport { BulkActionsBar } from './items';\nimport Node from './node';\nimport { moveSelectedIndices, removeIndices } from './selection';\n\ninterface Props {\n value: DataAttrNode[];\n onChange?: (value: string) => void;\n onNodeChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst Children = ({ value, onChange, onNodeChange }: Props) => {\n const items = useMemo(() => (Array.isArray(value) ? value : []), [value]);\n\n const selection = useMultiSelect(items.length);\n\n const editableChildrenMap = useMemo(() => {\n const map = new Map<number, DataAttrNode[]>();\n items.forEach((item, index) => {\n const editableNodes = findEditableChildren(item);\n if (editableNodes.length > 0) {\n map.set(index, editableNodes);\n }\n });\n return map;\n }, [items]);\n\n const moveItem = (fromIndex: number, toIndex: number) => {\n const nextItems = [...items];\n const [movedItem] = nextItems.splice(fromIndex, 1);\n nextItems.splice(toIndex, 0, movedItem!);\n\n onChange?.(JSON.stringify(nextItems));\n };\n\n const moveSelectedItems = (\n indices: Set<number>,\n direction: 'up' | 'down',\n ) => {\n const { items: nextItems, indices: nextIndices } = moveSelectedIndices(\n items,\n indices,\n direction,\n );\n\n selection.replace(nextIndices);\n onChange?.(JSON.stringify(nextItems));\n };\n\n const deleteSelectedItems = (indices: Set<number>) => {\n if (items.length - indices.size < 1) {\n return;\n }\n\n const nextItems = removeIndices(items, indices);\n onChange?.(JSON.stringify(nextItems));\n };\n\n const deleteItem = (index: number) => deleteSelectedItems(new Set([index]));\n\n const addItem = () => {\n const template = items[0] || createDefaultItem();\n const newItem = cloneDataAttrNode(template);\n\n const nextItems = [...items, newItem];\n onChange?.(JSON.stringify(nextItems));\n };\n\n const duplicateSelectedItems = (indices: Set<number>) => {\n const sources = [...indices]\n .sort((a, b) => a - b)\n .map(index => items[index])\n .filter((item): item is DataAttrNode => Boolean(item));\n\n if (sources.length === 0) {\n return;\n }\n\n const clones = sources.map(cloneDataAttrNode);\n onChange?.(JSON.stringify([...items, ...clones]));\n };\n\n const createDefaultItem = (): DataAttrNode => ({\n id: nanoid(6),\n tagName: 'div',\n attributes: [\n { name: 'data-id', value: nanoid(6) },\n { name: 'data-item', value: 'true' },\n ],\n dataAttributes: [\n { name: 'data-id', value: nanoid(6) },\n { name: 'data-item', value: 'true' },\n ],\n textContent: '',\n children: [],\n });\n\n const cloneDataAttrNode = (node: DataAttrNode): DataAttrNode => ({\n ...node,\n id: nanoid(6),\n attributes: node.attributes.map(attr => ({\n ...attr,\n value: attr.name === 'data-id' ? nanoid(6) : attr.value,\n })),\n dataAttributes: node.dataAttributes.map(attr => ({\n ...attr,\n value: attr.name === 'data-id' ? nanoid(6) : attr.value,\n })),\n children: node.children?.map(cloneDataAttrNode),\n });\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold text-green-700\">\n Children Items ({items.length})\n </div>\n <Button size=\"small\" color=\"green\" icon={<Plus />} onClick={addItem}>\n Add Child\n </Button>\n </div>\n\n <BulkActionsBar\n count={selection.selected.size}\n onDuplicate={() => duplicateSelectedItems(selection.selected)}\n onMoveUp={() => moveSelectedItems(selection.selected, 'up')}\n onMoveDown={() => moveSelectedItems(selection.selected, 'down')}\n onDelete={() => {\n deleteSelectedItems(selection.selected);\n selection.clear();\n }}\n onClear={selection.clear}\n />\n\n {items.map((item, itemIndex) => (\n <div\n key={item.id || itemIndex}\n className=\"space-y-2 rounded border border-green-200 bg-green-50 p-3\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <div\n onClick={e => selection.toggle(itemIndex, e.shiftKey)}\n className=\"inline-flex\"\n >\n <Checkbox\n checked={selection.isSelected(itemIndex)}\n onChange={() => {}}\n />\n </div>\n <div className=\"text-xs font-medium text-green-800\">\n Child {itemIndex + 1} ({item.tagName || 'fragment'})\n </div>\n </div>\n\n <div className=\"flex space-x-1\">\n <Button\n size=\"small\"\n icon={<ArrowUp />}\n disabled={itemIndex === 0}\n onClick={() => moveItem(itemIndex, itemIndex - 1)}\n />\n <Button\n size=\"small\"\n icon={<ArrowDown />}\n disabled={itemIndex === items.length - 1}\n onClick={() => moveItem(itemIndex, itemIndex + 1)}\n />\n <Button\n title={\n items.length <= 1\n ? 'At least 1 item is required'\n : 'Delete item'\n }\n danger\n size=\"small\"\n icon={<X />}\n disabled={items.length <= 1}\n onClick={() => deleteItem(itemIndex)}\n />\n </div>\n </div>\n\n {editableChildrenMap.has(itemIndex) && (\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-green-700\">\n Editable Bindings:\n </div>\n {editableChildrenMap.get(itemIndex)!.map((editableNode, idx) => {\n const nodeId = editableNode.dataAttributes.find(\n a => a.name === 'data-id',\n )?.value;\n\n return (\n <div\n key={`editable-${itemIndex}-${nodeId || idx}`}\n className=\"rounded border border-green-100 bg-white p-2\"\n >\n <div className=\"mb-1 text-xs text-green-600\">\n {editableNode.tagName}\n </div>\n <Node data={editableNode} onChange={onNodeChange} />\n </div>\n );\n })}\n </div>\n )}\n\n {!!item.children && !editableChildrenMap.has(itemIndex) && (\n <div className=\"space-y-1\">\n <div className=\"text-xs font-medium text-green-700\">\n Child Nodes:\n </div>\n {item.children.map((node, nodeIndex) => (\n <div\n key={`node-${itemIndex}-${nodeIndex}`}\n className=\"ml-2 rounded border border-green-100 bg-white p-2\"\n >\n <Node data={node} onChange={onNodeChange} />\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n};\n\nexport default Children;\n","import type { LucideIcon } from 'lucide-react';\nimport {\n AlertCircle,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n Bell,\n Bookmark,\n Calendar,\n Camera,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n Download,\n Edit,\n Eye,\n Filter,\n Heart,\n Home,\n Image,\n Info,\n Link,\n Mail,\n Map,\n Menu,\n MessageCircle,\n Phone,\n Plus,\n Search,\n Settings,\n Share,\n ShoppingCart,\n Star,\n Trash,\n Upload,\n User,\n X,\n} from 'lucide-react';\n\nexport const ICON_MAP: Record<string, LucideIcon> = {\n AlertCircle,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n Bell,\n Bookmark,\n Calendar,\n Camera,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n Download,\n Edit,\n Eye,\n Filter,\n Heart,\n Home,\n Image,\n Info,\n Link,\n Mail,\n Map,\n Menu,\n MessageCircle,\n Phone,\n Plus,\n Search,\n Settings,\n Share,\n ShoppingCart,\n Star,\n Trash,\n Upload,\n User,\n X,\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n Checkbox,\n ColorPicker,\n DatePicker,\n Input,\n Select,\n Upload,\n type UploadFile,\n} from '@jbpark/ui-kit';\nimport { useDebounce } from '@jbpark/use-hooks';\n\nimport CoreEditor from '~/components/editor/core';\nimport TiptapEditor from '~/components/editor/tiptap';\nimport { BINDING_PROP } from '~/constants';\nimport {\n type BindingItem,\n parseValue,\n validateBindingValue,\n} from '~/utils/ast';\n\nimport Children from './children';\nimport { ICON_MAP } from './icon-map';\nimport Items from './items';\n\ninterface Props {\n binding: BindingItem;\n id: string;\n value: string;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\ninterface Props {\n binding: BindingItem;\n id: string;\n value: string;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst isColorProperty = (propertyName: string): boolean => {\n const name = propertyName.toLowerCase();\n return name.includes('color');\n};\n\nconst normalizeToHex = (value: string): string => {\n const trimmed = value.trim();\n\n if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(trimmed)) {\n return trimmed;\n }\n return '#000000';\n};\n\nconst parseDateValue = (value: string): Date | undefined => {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value.trim());\n\n if (!match) {\n return undefined;\n }\n\n const [, year, month, day] = match;\n const date = new Date(Number(year), Number(month) - 1, Number(day));\n\n return Number.isNaN(date.getTime()) ? undefined : date;\n};\n\nconst formatDateValue = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n};\n\n// ColorPicker's onChange fires on every drag frame — committing straight\n// to `onChange` (which drives the AST parse/mutate/re-serialize +\n// generateSections + compile pipeline, see #130) makes a single drag cost\n// upward of 15-25ms per frame. Debouncing the *commit* keeps that pipeline\n// to roughly one run per pause instead of one per frame, while a local\n// `liveValue` state keeps the swatch/hex text updating every frame for\n// responsiveness — ColorPicker is fully controlled (`useControllableState`\n// with `value` always set here), so without this it would visually snap\n// back to the last committed color between debounced commits.\nconst COLOR_COMMIT_DELAY = 75;\n\ninterface ColorPickerFieldProps {\n id: string;\n label: string;\n value: string;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst ColorPickerField = ({\n id,\n label,\n value,\n onChange,\n}: ColorPickerFieldProps) => {\n const [liveValue, setLiveValue] = useState(value);\n // Tracks `value` purely to detect an external change during render (see\n // below) — refs can't be read/written during render, so this has to be\n // state even though nothing here reads `prevValue` itself afterward.\n const [prevValue, setPrevValue] = useState(value);\n const lastCommittedRef = useRef(value);\n\n // The committed `value` can also change from outside (undo/redo, another\n // field touching the same binding) — stay in sync with it rather than\n // only ever tracking our own commits. Adjusted during render (React's\n // recommended \"reset state when a prop changes\" pattern) rather than in\n // an effect, so the mismatched frame never actually paints.\n if (value !== prevValue) {\n setPrevValue(value);\n setLiveValue(value);\n }\n\n // `lastCommittedRef` only needs to be current by the time `commit` next\n // runs (always from an event handler / debounce timer, never render), so\n // syncing it in an effect — instead of alongside the state adjustment\n // above — keeps the ref access out of the render phase entirely.\n useEffect(() => {\n lastCommittedRef.current = value;\n }, [value]);\n\n const commit = (next: string) => {\n if (next === lastCommittedRef.current) {\n return;\n }\n lastCommittedRef.current = next;\n onChange?.({ id, label, value: next });\n };\n\n const debouncedCommit = useDebounce(() => commit(liveValue), {\n delay: COLOR_COMMIT_DELAY,\n autoInvoke: false,\n });\n\n return (\n <ColorPicker\n showText\n value={liveValue}\n onChange={next => {\n setLiveValue(next);\n debouncedCommit();\n }}\n onOpenChange={open => {\n // Flush immediately on close (picker dismissed / selection\n // finished) instead of waiting out the debounce window, so the\n // last color is never at risk of being dropped by an unmount\n // racing the pending timeout.\n if (!open) {\n commit(liveValue);\n }\n }}\n />\n );\n};\n\nconst ICON_OPTIONS = Object.entries(ICON_MAP).map(([name, Icon]) => ({\n label: (\n <span className=\"flex items-center gap-2\">\n <Icon size={14} />\n {name}\n </span>\n ),\n value: name,\n}));\n\nconst Field = ({ binding, id, value, onChange }: Props) => {\n const parsedValue = useMemo(() => {\n return parseValue(value);\n }, [value]);\n\n const [validationError, setValidationError] = useState<string | null>(null);\n\n if (\n binding.property === 'items' ||\n binding.property === 'data' ||\n binding.type === 'array'\n ) {\n return (\n <Items\n value={value}\n render={binding.render}\n onChange={next => {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }}\n onChildChange={onChange}\n />\n );\n }\n\n if (binding.type === 'richtext') {\n return (\n <TiptapEditor\n value={value}\n onChange={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n );\n }\n\n if (binding.property === BINDING_PROP.INNER_HTML || binding.type === 'jsx') {\n const isHTML = binding.property === BINDING_PROP.INNER_HTML;\n\n return (\n <CoreEditor\n value={value}\n height=\"150px\"\n fragment={!isHTML}\n raw={isHTML}\n onSave={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n );\n }\n\n if (binding.property === 'children' && Array.isArray(parsedValue)) {\n return (\n <Children\n value={parsedValue}\n onChange={next => {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }}\n onNodeChange={onChange}\n />\n );\n }\n\n if (\n typeof parsedValue === 'object' &&\n parsedValue !== null &&\n !Array.isArray(parsedValue)\n ) {\n return (\n <div className=\"space-y-2 rounded border border-gray-200 bg-gray-50 p-2\">\n {Object.entries(parsedValue).map(([key, val]) => (\n <div key={key} className=\"space-y-1\">\n <label className=\"block text-xs font-medium text-gray-600\">\n {key}\n </label>\n <Field\n binding={{\n label: key,\n property:\n binding.render?.[key] && 'type' in binding.render[key]\n ? (binding.render[key].type as string)\n : key,\n type:\n binding.render?.[key] && 'type' in binding.render[key]\n ? (binding.render[key] as { type: BindingItem['type'] })\n .type\n : undefined,\n render:\n binding.render?.[key] && !('type' in binding.render[key])\n ? (binding.render[key] as BindingItem['render'])\n : undefined,\n }}\n id={id}\n value={\n typeof val === 'object' ? JSON.stringify(val) : String(val)\n }\n onChange={({ value: next }) => {\n const convertedValue = parseValue(next);\n\n const updated = {\n ...parsedValue,\n [key]: convertedValue,\n };\n\n onChange?.({\n id,\n label: binding.label,\n value: JSON.stringify(updated),\n });\n }}\n />\n </div>\n ))}\n </div>\n );\n }\n\n if (binding.type === 'boolean' || typeof parsedValue === 'boolean') {\n return (\n <Checkbox\n checked={parsedValue === true || parsedValue === 'true'}\n onChange={checked => {\n onChange?.({\n id,\n label: binding.label,\n value: checked.toString(),\n });\n }}\n />\n );\n }\n\n const stringValue = String(value);\n\n if (binding.options && Array.isArray(binding.options)) {\n return (\n <Select\n value={stringValue}\n options={binding.options}\n onChange={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n );\n }\n\n if (binding.type === 'color' || isColorProperty(binding.property)) {\n return (\n <ColorPickerField\n id={id}\n label={binding.label}\n value={normalizeToHex(stringValue)}\n onChange={onChange}\n />\n );\n }\n\n if (binding.type === 'date') {\n return (\n <div>\n <DatePicker\n defaultValue={parseDateValue(stringValue)}\n onChange={date => {\n const next = date ? formatDateValue(date) : '';\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n if (binding.type === 'url') {\n return (\n <div>\n <Input\n type=\"url\"\n defaultValue={stringValue}\n placeholder=\"https://example.com\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n if (binding.type === 'icon-picker') {\n const SelectedIcon = ICON_MAP[stringValue];\n\n return (\n <div className=\"flex items-center gap-2\">\n <Select\n value={stringValue}\n options={ICON_OPTIONS}\n onChange={next => {\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {SelectedIcon && <SelectedIcon size={18} className=\"shrink-0\" />}\n </div>\n );\n }\n\n if (binding.type === 'asset-picker') {\n const defaultUploadValue: UploadFile[] = stringValue\n ? [\n {\n uid: 'current',\n name: stringValue.split('/').pop() || 'asset',\n url: stringValue,\n },\n ]\n : [];\n\n return (\n <div className=\"space-y-2\">\n <Input\n defaultValue={stringValue}\n placeholder=\"Enter an image URL\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n <Upload\n multiple={false}\n maxCount={1}\n accept=\"image/*\"\n defaultValue={defaultUploadValue}\n onChange={files => {\n const next = files[0]?.url ?? '';\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n if (typeof parsedValue === 'number') {\n return (\n <div>\n <Input\n type=\"number\"\n defaultValue={stringValue}\n placeholder=\"Enter a numeric value\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n }\n\n return (\n <div>\n <Input.TextArea\n defaultValue={value}\n placeholder=\"Enter a value\"\n onBlur={e => {\n const next = e.target.value.trim();\n const result = validateBindingValue(binding, next);\n\n if (!result.valid) {\n setValidationError(result.message ?? 'Invalid value.');\n return;\n }\n\n setValidationError(null);\n\n if (next !== value) {\n onChange?.({\n id,\n label: binding.label,\n value: next,\n });\n }\n }}\n />\n {validationError && (\n <p className=\"mt-1 text-xs text-red-500\">{validationError}</p>\n )}\n </div>\n );\n};\n\nexport default Field;\n","import { type DataAttrNode, getCurrentValue, parseBinding } from '~/utils/ast';\n\nimport Field from './field';\n\nexport interface FieldEditorProps {\n data: DataAttrNode;\n onChange?: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst Node = ({ data, onChange }: FieldEditorProps) => {\n const idAttr = data.dataAttributes.find(a => a.name === 'data-id');\n const bindingAttr = data.dataAttributes.find(a => a.name === 'data-binding');\n\n if (!idAttr?.value || !bindingAttr?.value) {\n return null;\n }\n\n const dataId = idAttr.value;\n const bindings = data.bindings || parseBinding(bindingAttr.value);\n\n if (!bindings.length) {\n return null;\n }\n\n return (\n <div className=\"space-y-2 rounded\">\n <div className=\"space-y-1\">\n {bindings.map(binding => {\n const currentValue = getCurrentValue(data, binding.property);\n\n return (\n <div key={binding.label} className=\"space-y-1\">\n <label className=\"block text-xs font-semibold text-gray-700\">\n {binding.label}\n <span className=\"ml-1 text-gray-400\">({binding.property})</span>\n </label>\n <Field\n id={dataId}\n binding={binding}\n value={currentValue}\n onChange={onChange}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default Node;\n","import { Button, Typography } from '@jbpark/ui-kit';\nimport { ChevronDown, ChevronUp, Trash } from 'lucide-react';\n\nimport type { Section } from '~/types';\nimport { cn } from '~/utils';\nimport type { DataAttrNode } from '~/utils/ast';\n\nimport Node from './node';\n\ninterface Props {\n item?: Section;\n onDelete?: (id: string) => void;\n // Reordering by dragging a section on the canvas doesn't work from\n // inside this panel on mobile — the canvas sits behind the Drawer this\n // panel renders in, so there's nothing visible to drag onto. These give\n // an explicit alternative that works regardless of layout.\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n canMoveUp?: boolean;\n canMoveDown?: boolean;\n // `item`'s editable data-binding fields — extraction (and the AST\n // update + error-toast handling behind onFieldChange) lives in Dnd, so\n // it's shared with a custom renderPanel instead of computed here too.\n fields: DataAttrNode[];\n onFieldChange: (params: { id: string; label: string; value: string }) => void;\n}\n\nconst Panel = ({\n item,\n onDelete,\n onMoveUp,\n onMoveDown,\n canMoveUp = false,\n canMoveDown = false,\n fields,\n onFieldChange,\n}: Props) => {\n if (!item) {\n return (\n <Typography.Paragraph\n className={cn(\n 'p-4 text-sm text-gray-500',\n //\n )}\n >\n Please select a section.\n </Typography.Paragraph>\n );\n }\n\n return (\n <div\n className={cn(\n 'h-full space-y-4 p-4',\n 'overflow-x-hidden overflow-y-auto',\n //\n )}\n >\n <div className=\"flex items-center justify-between\">\n <Typography.Title className=\"text-lg font-semibold\">\n {item.name}\n </Typography.Title>\n <div className=\"flex items-center gap-1\">\n {onMoveUp && (\n <Button\n icon={<ChevronUp />}\n disabled={!canMoveUp}\n onClick={onMoveUp}\n aria-label=\"Move section up\"\n />\n )}\n {onMoveDown && (\n <Button\n icon={<ChevronDown />}\n disabled={!canMoveDown}\n onClick={onMoveDown}\n aria-label=\"Move section down\"\n />\n )}\n {onDelete && (\n <Button\n danger\n icon={<Trash />}\n onClick={() => onDelete(item.id)}\n aria-label=\"Delete section\"\n />\n )}\n </div>\n </div>\n {!fields.length && (\n <Typography.Text className=\"text-xs text-gray-400\">\n No editable elements.\n </Typography.Text>\n )}\n {fields.map((node, index) => (\n <Node\n key={`${item.id}-${index}`}\n data={node}\n onChange={onFieldChange}\n />\n ))}\n </div>\n );\n};\n\nexport default Panel;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport {\n DndContext,\n type DragEndEvent,\n type DragOverEvent,\n DragOverlay,\n type DragStartEvent,\n type Modifier,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { restrictToVerticalAxis } from '@dnd-kit/modifiers';\nimport {\n SortableContext,\n arrayMove,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { Button, Drawer, Space, Toast, Typography } from '@jbpark/ui-kit';\nimport { useResponsiveSize } from '@jbpark/use-hooks';\nimport { LayoutGrid } from 'lucide-react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { DRAGGABLE_ITEMS } from '~/constants';\nimport type { Section } from '~/types';\nimport {\n type BindingOption,\n type BindingRenderMap,\n type BindingType,\n type DataAttrNode,\n extract,\n fillIds,\n getCurrentValue,\n parseBinding,\n replaceIds,\n update,\n} from '~/utils/ast';\n\nimport { DEFAULT_TEMPLATE } from '../../constants';\nimport {\n cn,\n createSectionPreviewCache,\n extractSections,\n preloadScripts,\n replaceSections,\n} from '../../utils';\nimport { usePreview } from '../context/states';\nimport { type FrameProps } from '../frame';\nimport DraggableItem, { DefaultDraggableItem } from './draggable';\nimport Droppable from './droppable';\nimport Overlay from './overlay';\nimport Panel from './panel';\nimport Renderer from './renderer';\nimport Sortable from './sortable';\n\nexport interface PaletteRenderData {\n items: Section[];\n onAdd: (item: Section) => void;\n DraggableItem: typeof DraggableItem;\n // True when the palette is rendering inside the mobile Drawer, where a\n // tap can't be a failed drag attempt (there's nothing to drag onto —\n // the canvas is stacked behind the Drawer) and native dblclick synthesis\n // from double-tap is unreliable on touch. Custom renderPalette\n // implementations should treat a single click/tap as \"add\" here instead\n // of relying on onDoubleClick.\n isMobile: boolean;\n}\n\nexport interface PanelRenderData {\n item?: Section;\n onChange: (next: Partial<Section>) => void;\n onDelete: (id: string) => void;\n // Alternative to dragging a section to reorder it — needed since the\n // canvas sits behind the mobile Drawer this panel renders in, so\n // there's nothing visible to drag onto there.\n onMoveUp: () => void;\n onMoveDown: () => void;\n canMoveUp: boolean;\n canMoveDown: boolean;\n // `item`'s editable data-binding fields, already flattened to one entry\n // per bound property (across every non-<section> descendant carrying a\n // `data-binding` attribute). Each entry carries the binding's `type` and\n // current `value` plus an `onChange` wired straight into the same\n // AST-update pipeline the built-in panel uses — including the error Toast\n // on a bad edit. Switch on `type` to render your own control (an\n // `<input>`, `<textarea>`, `<select>`, ...) instead of the built-in one.\n bindings: PanelBinding[];\n}\n\n// One editable data-binding, flattened out of the selected section for a\n// custom renderPanel. Exposes just what a consumer needs to render its own\n// control — the declared `type`, the current `value`, and an `onChange`\n// that commits through Dnd's AST-update pipeline — so it never has to touch\n// DataAttrNode/parseBinding/getCurrentValue itself.\nexport interface PanelBinding {\n // `data-id` of the owning element — stable across edits.\n id: string;\n // Human-readable label from the binding definition.\n label: string;\n // The bound prop/attribute name (e.g. `children`, `src`, `color`).\n property: string;\n // The declared data-binding type — switch on this to pick a control\n // (`string`/`url` -> <input>, `jsx`/`richtext` -> <textarea>, `boolean`\n // -> checkbox, ...). `undefined` means a plain string binding.\n type?: BindingType;\n // Present when the binding defines a fixed option set (render a <select>).\n options?: BindingOption[];\n // Present for `object`/`array` bindings whose nested keys/items declare\n // their own types — the same map the built-in panel uses to type each\n // nested field instead of falling back to a plain string input.\n render?: BindingRenderMap;\n // Constraints declared on the binding. `min`/`max` apply even though\n // `value` below is a string (see `validateBindingValue`, which coerces\n // numeric strings before comparing).\n min?: number;\n max?: number;\n pattern?: string;\n required?: boolean;\n // Current serialized value — the same string the built-in field receives.\n value: string;\n // Commit a new value through the same AST-update pipeline the built-in\n // panel uses (including the error Toast on a bad edit).\n onChange: (value: string) => void;\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithRef<'div'>,\n 'onChange'\n> {\n value?: string;\n props?: Record<string, unknown>;\n modules?: Record<string, unknown>;\n items?: Section[];\n frame?: FrameProps;\n dynamicTailwind?: boolean;\n provider?: (children: React.ReactNode) => React.ReactNode;\n onChange?: (value: string) => void;\n // Full replacements for the built-in left palette / right panel — receive\n // the same data/callbacks Dnd itself uses, so drag-and-drop and field\n // editing keep working exactly as before, just with custom markup. Used\n // for both the desktop layout and the mobile drawer, since those already\n // render identical content today.\n renderPalette?: (data: PaletteRenderData) => React.ReactNode;\n renderPanel?: (data: PanelRenderData) => React.ReactNode;\n}\n\nconst conditionalModifiers: Modifier = args => {\n const { active } = args;\n\n if (active?.data.current?.type === 'new-item') {\n return args.transform;\n }\n\n return restrictToVerticalAxis(args);\n};\n\nconst Dnd = ({\n value: _value,\n props,\n modules = {},\n onChange: _onChange,\n className,\n items = [],\n frame,\n dynamicTailwind = false,\n provider,\n renderPalette,\n renderPanel,\n ...restProps\n}: Props) => {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [mobilePaletteOpen, setMobilePaletteOpen] = useState(false);\n\n const { breakpoint } = useResponsiveSize();\n const isMobile = breakpoint.current === 'xs' || breakpoint.current === 'sm';\n\n const { setCode } = usePreview();\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 10,\n },\n }),\n );\n\n const value = _value || DEFAULT_TEMPLATE;\n const sections = useMemo(() => extractSections(value), [value]);\n const selectedItem = useMemo(\n () => sections.find(s => s.id === selectedId),\n [sections, selectedId],\n );\n\n // One cache per Dnd instance (lazy `useState` initializer, never\n // replaced) — see createSectionPreviewCache (#131). It's stateful by\n // design (remembers the previous render's previews to reuse the ones\n // that didn't change), which a `useMemo`/`useRef` can't do without\n // touching a ref during render; a cache object stored via `useState`\n // and only ever mutated through its own method isn't subject to that\n // restriction the way `ref.current` is.\n const [previewCache] = useState(() => createSectionPreviewCache());\n const previews = useMemo(\n () => previewCache.compute(value, sections),\n [previewCache, sections, value],\n );\n\n const onDragStart = (_: DragStartEvent) => {};\n\n const onDragOver = (_e: DragOverEvent) => {};\n\n const onDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over) {\n return;\n }\n\n if (active.data.current?.type === 'new-item') {\n const newItem = active.data.current.item;\n const newSection = {\n id: uuidv4(),\n name: newItem.name,\n code: newItem.code,\n };\n\n let nextSections: typeof sections;\n\n if (over.id === 'sortable-area' || over.id === 'sortable-area-bottom') {\n nextSections = [...sections, newSection];\n } else {\n const overIndex = sections.findIndex(s => s.id === over.id);\n if (overIndex >= 0) {\n nextSections = [\n ...sections.slice(0, overIndex),\n newSection,\n ...sections.slice(overIndex),\n ];\n } else {\n nextSections = [...sections, newSection];\n }\n }\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n return;\n }\n\n if (active.id !== over.id && sections.some(s => s.id === active.id)) {\n const prevIndex = sections.findIndex(s => s.id === active.id);\n const nextIndex = sections.findIndex(s => s.id === over.id);\n\n if (prevIndex >= 0 && nextIndex >= 0) {\n const nextSections = arrayMove(sections, prevIndex, nextIndex);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n }\n }\n };\n\n const addItem = (item: (typeof DRAGGABLE_ITEMS)[0]) => {\n const newSection = {\n id: uuidv4(),\n name: item.name,\n code: item.code,\n };\n\n const nextSections = [...sections, newSection];\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n };\n\n const onDelete = (id: string) => {\n const nextSections = sections.filter(s => s.id !== id);\n\n setSelectedId(null);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n };\n\n const moveSection = (id: string | null, direction: 'up' | 'down') => {\n const index = sections.findIndex(s => s.id === id);\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n\n if (index < 0 || targetIndex < 0 || targetIndex >= sections.length) {\n return;\n }\n\n const nextSections = arrayMove(sections, index, targetIndex);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n // Section ids are just the section's positional index, re-derived from\n // scratch on every parse (getSections) rather than a stable identity —\n // so once `sections` recomputes after this reorder, `selectedId`\n // (unchanged) would silently point at whatever content now sits at its\n // old position instead of following the section that actually moved.\n setSelectedId(String(targetIndex));\n };\n\n const onCopy = (id: string) => {\n const sectionIndex = sections.findIndex(s => s.id === id);\n const sectionToCopy = sections[sectionIndex];\n\n if (sectionToCopy) {\n const nextId = uuidv4();\n const nextSection = {\n id: nextId,\n code: replaceIds(sectionToCopy.code),\n name: sectionToCopy.name,\n };\n\n const nextSections = [\n ...sections.slice(0, sectionIndex + 1),\n nextSection,\n ...sections.slice(sectionIndex + 1),\n ];\n\n setSelectedId(nextId);\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n }\n };\n\n const onSelect = (id: string) => {\n setSelectedId(prev => (prev === id ? null : id));\n };\n\n const onChange = (next: Partial<Section>) => {\n const nextSections = sections.map(s =>\n s.id === next.id ? { ...s, ...next } : s,\n );\n\n const nextCode = replaceSections(\n value,\n nextSections.map(s => s.code),\n );\n\n _onChange?.(nextCode);\n setCode(nextCode);\n };\n\n // Reads only the extracted `code` local, not `selectedItem`, so the\n // compiler can verify this dependency array actually matches what the\n // body reads — matches Panel's own former version of this same logic,\n // now shared here so both the built-in Panel and a custom renderPanel\n // get the same extraction/update pipeline instead of each needing it.\n const selectedCode = selectedItem?.code;\n const { fields, updatedCode, parseError } = useMemo(() => {\n if (!selectedCode) {\n return {\n fields: [] as DataAttrNode[],\n updatedCode: '',\n parseError: false,\n };\n }\n\n try {\n const updated = fillIds(selectedCode);\n const allNodes = extract(updated);\n const filtered = allNodes.filter(node => node.tagName !== 'section');\n\n return {\n fields: filtered,\n updatedCode: updated !== selectedCode ? updated : selectedCode,\n parseError: false,\n };\n } catch (e) {\n console.warn('⚠️ Parsing error', e);\n return {\n fields: [] as DataAttrNode[],\n updatedCode: '',\n parseError: true,\n };\n }\n }, [selectedCode]);\n\n useEffect(() => {\n if (parseError) {\n Toast.error('Failed to parse this section', {\n description: 'Check the console for details.',\n });\n }\n }, [parseError]);\n\n const onFieldChange = ({\n id,\n label,\n value: fieldValue,\n }: {\n id: string;\n label: string;\n value: string;\n }) => {\n const result = update(updatedCode, id, label, fieldValue);\n\n if (!result.success) {\n Toast.error('Failed to update this field', {\n description: 'Check the console for details.',\n });\n return;\n }\n\n if (selectedItem) {\n onChange({ ...selectedItem, code: result.code });\n }\n };\n\n // Flattens the extracted `fields` (one DataAttrNode per element) down to\n // one PanelBinding per bound property — the same walk the built-in\n // FieldEditor/Node does internally (data-id + parsed data-binding +\n // current value), but handed to a custom renderPanel as plain data so it\n // can render its own controls. Kept in a useMemo keyed on `fields` alone;\n // `onFieldChange` closes over `updatedCode`/`selectedItem` but is stable\n // enough per render, and rebuilding on every render would defeat the memo\n // guarding renderPanel's children.\n const bindings = useMemo<PanelBinding[]>(() => {\n return fields.flatMap(node => {\n const dataId = node.dataAttributes.find(a => a.name === 'data-id')?.value;\n const bindingAttr = node.dataAttributes.find(\n a => a.name === 'data-binding',\n )?.value;\n\n if (!dataId || !bindingAttr) {\n return [];\n }\n\n const parsed = node.bindings ?? parseBinding(bindingAttr);\n\n return parsed.map(binding => ({\n id: dataId,\n label: binding.label,\n property: binding.property,\n type: binding.type,\n options: binding.options,\n render: binding.render,\n min: binding.min,\n max: binding.max,\n pattern: binding.pattern,\n required: binding.required,\n value: getCurrentValue(node, binding.property),\n onChange: (value: string) =>\n onFieldChange({ id: dataId, label: binding.label, value }),\n }));\n });\n // onFieldChange is intentionally omitted — it's recreated every render\n // but only ever called from a user event, so closing over the latest\n // one via the render that produced these bindings is fine.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fields]);\n\n useEffect(() => {\n if (frame?.scripts?.length) {\n preloadScripts(frame.scripts);\n }\n }, [frame?.scripts]);\n\n const renderPaletteItems = (\n onAdd: (item: Section) => void,\n forMobileDrawer = false,\n ) => {\n const paletteItems = items?.length ? items : DRAGGABLE_ITEMS;\n\n if (renderPalette) {\n return renderPalette({\n items: paletteItems,\n onAdd,\n DraggableItem,\n isMobile: forMobileDrawer,\n });\n }\n\n return (\n <Space orientation=\"vertical\" align=\"start\">\n {paletteItems.map(item => (\n <DefaultDraggableItem\n key={item.id}\n item={item}\n onAdd={onAdd}\n tapToAdd={forMobileDrawer}\n />\n ))}\n </Space>\n );\n };\n\n const renderPanelContent = () => {\n const selectedIndex = sections.findIndex(s => s.id === selectedId);\n const canMoveUp = selectedIndex > 0;\n const canMoveDown =\n selectedIndex >= 0 && selectedIndex < sections.length - 1;\n\n if (renderPanel) {\n return renderPanel({\n item: selectedItem,\n onChange,\n onDelete,\n onMoveUp: () => moveSection(selectedId, 'up'),\n onMoveDown: () => moveSection(selectedId, 'down'),\n canMoveUp,\n canMoveDown,\n bindings,\n });\n }\n\n return (\n <Panel\n item={selectedItem}\n onDelete={onDelete}\n onMoveUp={() => moveSection(selectedId, 'up')}\n onMoveDown={() => moveSection(selectedId, 'down')}\n canMoveUp={canMoveUp}\n canMoveDown={canMoveDown}\n fields={fields}\n onFieldChange={onFieldChange}\n />\n );\n };\n\n return (\n <>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[\n conditionalModifiers,\n //\n ]}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n >\n <div\n className={cn(\n 'relative flex w-full',\n className,\n //\n )}\n {...restProps}\n >\n <div className=\"hidden w-1/5 overflow-y-auto md:block\">\n <div className=\"h-full bg-gray-50 p-4\">\n {renderPaletteItems(addItem)}\n </div>\n </div>\n <div\n className={cn(\n 'relative',\n 'h-full w-full md:w-3/5',\n 'overflow-y-auto',\n //\n )}\n data-frame-container\n style={{\n isolation: 'isolate',\n contain: 'layout style',\n transform: 'translateZ(0)',\n }}\n >\n <Droppable\n className={cn(\n !sections.length && 'h-full',\n //\n )}\n >\n {!sections.length ? (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'h-full',\n 'text-gray-500',\n )}\n >\n <Space orientation=\"vertical\" align=\"center\">\n <Typography.Paragraph>\n No sections available\n </Typography.Paragraph>\n <Typography.Text>\n {isMobile\n ? 'Tap a component to add it'\n : 'Drag a component from the left to add it'}\n </Typography.Text>\n </Space>\n </div>\n ) : (\n <SortableContext\n items={sections.map(s => s.id)}\n strategy={verticalListSortingStrategy}\n >\n {sections.map((section, index) => (\n <Sortable\n key={section.id}\n id={section.id}\n name={section.name}\n selected={selectedId === section.id}\n onClick={() => onSelect(section.id)}\n onDelete={onDelete}\n onCopy={onCopy}\n >\n <Renderer\n preview={previews[index]!}\n modules={modules}\n frame={frame}\n dynamicTailwind={dynamicTailwind}\n provider={provider}\n {...props}\n />\n </Sortable>\n ))}\n </SortableContext>\n )}\n </Droppable>\n </div>\n <div className=\"hidden w-1/5 md:block\">{renderPanelContent()}</div>\n <Button\n type=\"primary\"\n shape=\"circle\"\n icon={<LayoutGrid />}\n aria-label=\"Components\"\n className=\"fixed right-4 bottom-4 z-20 md:hidden\"\n onClick={() => setMobilePaletteOpen(true)}\n />\n <Drawer\n open={isMobile && mobilePaletteOpen}\n onClose={() => setMobilePaletteOpen(false)}\n direction=\"bottom\"\n size=\"large\"\n title=\"Components\"\n >\n {renderPaletteItems(item => {\n addItem(item);\n setMobilePaletteOpen(false);\n }, true)}\n </Drawer>\n <Drawer\n open={isMobile && Boolean(selectedId)}\n onClose={() => setSelectedId(null)}\n direction=\"bottom\"\n size=\"large\"\n title=\"Properties\"\n >\n {renderPanelContent()}\n </Drawer>\n </div>\n <DragOverlay>\n <Overlay\n sections={sections}\n renderProps={{\n fullCode: value,\n modules,\n frame,\n dynamicTailwind,\n ...props,\n }}\n />\n </DragOverlay>\n </DndContext>\n </>\n );\n};\n\nexport default Dnd;\n","import DndImpl, {\n type PaletteRenderData,\n type PanelBinding,\n type PanelRenderData,\n type Props,\n} from './dnd';\nimport DraggableItem, {\n type DraggableItemDragState,\n type DraggableItemProps,\n} from './draggable';\n\ntype DndComponent = typeof DndImpl & {\n DraggableItem: typeof DraggableItem;\n};\n\nconst Dnd = DndImpl as DndComponent;\n\nDnd.DraggableItem = DraggableItem;\n\nexport { DraggableItem };\nexport type {\n Props,\n PaletteRenderData,\n PanelRenderData,\n PanelBinding,\n DraggableItemProps,\n DraggableItemDragState,\n};\nexport default Dnd;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { _ as Section } from "./document-DXOwpvWM.js";
2
- import { w as BindingType, x as BindingOption } from "./index-BVjSMVya.js";
2
+ import { C as BindingRenderMap, w as BindingType, x as BindingOption } from "./index-BVjSMVya.js";
3
3
  import { t as FrameProps } from "./index-DpDU1IAw.js";
4
4
  //#region src/components/dnd/draggable.d.ts
5
5
  interface DraggableItemDragState {
@@ -36,6 +36,11 @@ interface PanelBinding {
36
36
  property: string;
37
37
  type?: BindingType;
38
38
  options?: BindingOption[];
39
+ render?: BindingRenderMap;
40
+ min?: number;
41
+ max?: number;
42
+ pattern?: string;
43
+ required?: boolean;
39
44
  value: string;
40
45
  onChange: (value: string) => void;
41
46
  }
@@ -60,4 +65,4 @@ type DndComponent = typeof Dnd$1 & {
60
65
  declare const Dnd: DndComponent;
61
66
  //#endregion
62
67
  export { Props as a, DraggableItemProps as c, PanelRenderData as i, PaletteRenderData as n, DraggableItem as o, PanelBinding as r, DraggableItemDragState as s, Dnd as t };
63
- //# sourceMappingURL=index-BnncHZTt.d.ts.map
68
+ //# sourceMappingURL=index-BVM2RLWN.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { _ as Section } from "./document-DXOwpvWM.js";
2
2
  import { t as FrameProps } from "./index-DpDU1IAw.js";
3
- import { a as Props, c as DraggableItemProps, i as PanelRenderData, n as PaletteRenderData, r as PanelBinding, t as Dnd } from "./index-BnncHZTt.js";
3
+ import { a as Props, c as DraggableItemProps, i as PanelRenderData, n as PaletteRenderData, r as PanelBinding, t as Dnd } from "./index-BVM2RLWN.js";
4
4
  import { a as Props$2, n as EditorRenderData, r as Props$1, t as Editor } from "./index-C4TBkJBG.js";
5
5
  import { a as Props$5, n as Props$4, o as Props$3, s as ErrorBoundary, t as Error } from "./index-CCynrS6c.js";
6
6
  import { n as Props$6, t as Preview } from "./index-lgHdCda5.js";
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as ContextProvider } from "./context-DrqO0VVu.js";
2
- import { t as Dnd } from "./dnd-BNFFJ9uv.js";
2
+ import { t as Dnd } from "./dnd-CZ7VF9u8.js";
3
3
  import { t as Editor } from "./editor-DmgTeTcG.js";
4
4
  import { t as Error } from "./error-DRMGumEj.js";
5
5
  import { t as Preview } from "./preview-CgJE-pwO.js";
@@ -1,3 +1,3 @@
1
1
  import { a as generateSectionPreviews, c as replaceDocumentSections, i as generateSectionPreview, n as createSectionPreviewCache, o as getSections, r as generateDocumentCode, s as parseDocument, t as clearDocumentParseCache } from "../../document-CSIscFpL.js";
2
- import { _ as parseArrayExpression, a as bulkUpdate, c as extract, d as getCurrentValue, f as parseBinding, g as extractObjectProperties, h as extractNodeValue, i as replaceIds, m as createNodeFromValue, n as clone, o as update, p as arrayExpressionToCode, r as fillIds, s as clearExtractCache, t as validateBindingValue, u as findEditableChildren, v as parseValue, y as generateCode } from "../../ast-Dq1EfxA5.js";
2
+ import { _ as parseArrayExpression, a as bulkUpdate, c as extract, d as getCurrentValue, f as parseBinding, g as extractObjectProperties, h as extractNodeValue, i as replaceIds, m as createNodeFromValue, n as clone, o as update, p as arrayExpressionToCode, r as fillIds, s as clearExtractCache, t as validateBindingValue, u as findEditableChildren, v as parseValue, y as generateCode } from "../../ast-CPJB8A2R.js";
3
3
  export { arrayExpressionToCode, bulkUpdate, clearDocumentParseCache, clearExtractCache, clone, createNodeFromValue, createSectionPreviewCache, extract, extractNodeValue, extractObjectProperties, fillIds, findEditableChildren, generateCode, generateDocumentCode, generateSectionPreview, generateSectionPreviews, getCurrentValue, getSections, parseArrayExpression, parseBinding, parseDocument, parseValue, replaceDocumentSections, replaceIds, update, validateBindingValue };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "1.15.2",
7
+ "version": "1.15.3",
8
8
  "type": "module",
9
9
  "module": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",