diff --git a/.gitignore b/.gitignore index c09dd7e..7050ee9 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ examples/**/yarn.lock # Dev dev/** +CLAUDE.md diff --git a/src/defaults/FieldList.tsx b/src/defaults/FieldList.tsx index 3d015ba..d5b691a 100644 --- a/src/defaults/FieldList.tsx +++ b/src/defaults/FieldList.tsx @@ -118,16 +118,33 @@ export const FieldList: React.FC = ({ > {field.id} - {field.alias && field.alias !== field.id && ( -
- {field.alias} -
- )} +
+ {field.alias && field.alias !== field.id && ( + {field.alias} + )} + {field.mode && ( + + {field.mode} + + )} +
))} diff --git a/src/defaults/FieldMenu.tsx b/src/defaults/FieldMenu.tsx index 10931da..a3a3871 100644 --- a/src/defaults/FieldMenu.tsx +++ b/src/defaults/FieldMenu.tsx @@ -14,11 +14,13 @@ export const FieldMenu: React.FC = ({ }) => { const [isCreating, setIsCreating] = useState(false); const [newFieldName, setNewFieldName] = useState(""); + const [fieldMode, setFieldMode] = useState<"inline" | "block">("inline"); useEffect(() => { if (!isVisible) { setIsCreating(false); setNewFieldName(""); + setFieldMode("inline"); } }, [isVisible]); @@ -103,6 +105,7 @@ export const FieldMenu: React.FC = ({ id: `custom_${Date.now()}`, label: trimmedName, category: "Custom", + metadata: { mode: fieldMode }, }; try { @@ -115,6 +118,7 @@ export const FieldMenu: React.FC = ({ } finally { setIsCreating(false); setNewFieldName(""); + setFieldMode("inline"); } }; @@ -166,6 +170,7 @@ export const FieldMenu: React.FC = ({ if (event.key === "Escape") { setIsCreating(false); setNewFieldName(""); + setFieldMode("inline"); } }} autoFocus @@ -176,6 +181,33 @@ export const FieldMenu: React.FC = ({ borderRadius: "3px", }} /> +
+ + +
= ({ onClick={() => { setIsCreating(false); setNewFieldName(""); + setFieldMode("inline"); }} style={{ padding: "4px 12px", diff --git a/src/index.tsx b/src/index.tsx index 2e56540..7b4bbf2 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -29,11 +29,14 @@ const getTemplateFieldsFromEditor = (editor: Editor): Types.TemplateField[] => { return tags.map((entry: any) => { const node = entry?.node ?? entry; const attrs = node?.attrs ?? {}; + const nodeType = node?.type?.name || ""; + const mode = nodeType.includes("Block") ? "block" : "inline"; return { id: attrs.id, alias: attrs.alias || attrs.label || "", tag: attrs.tag, + mode, } as Types.TemplateField; }); }; @@ -55,7 +58,8 @@ const areTemplateFieldsEqual = ( left.id !== right.id || left.alias !== right.alias || left.tag !== right.tag || - left.position !== right.position + left.position !== right.position || + left.mode !== right.mode ) { return false; } @@ -522,12 +526,15 @@ const SuperDocTemplateBuilder = forwardRef< menuTriggerFromRef.current = null; resetMenuFilter(); + const mode = (field.metadata?.mode as "inline" | "block") || "inline"; + if (field.id.startsWith("custom_") && onFieldCreate) { try { const createdField = await onFieldCreate(field); if (createdField) { - insertFieldInternal("inline", { + const createdMode = (createdField.metadata?.mode as "inline" | "block") || mode; + insertFieldInternal(createdMode, { alias: createdField.label, category: createdField.category, metadata: createdField.metadata, @@ -541,7 +548,7 @@ const SuperDocTemplateBuilder = forwardRef< } } - insertFieldInternal("inline", { + insertFieldInternal(mode, { alias: field.label, category: field.category, metadata: field.metadata, diff --git a/src/types.ts b/src/types.ts index 0450008..19d35a7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,6 +13,7 @@ export interface TemplateField { alias: string; tag?: string; position?: number; + mode?: "inline" | "block"; } export interface TriggerEvent {