import { useState, useEffect, useRef, useCallback, useMemo } from "react"; import { NodeViewWrapper } from "@tiptap/react"; import type { NodeViewProps } from "@tiptap/react"; import type { ComponentDef, ComponentField } from "../components/registry"; const DEFAULT_IFRAME_HEIGHT = 600; const SAFETY_MIN_HEIGHT = 80; function FieldRow({ field, value, onChange, }: { field: ComponentField; value: unknown; onChange: (val: unknown) => void; }) { if (field.type === "boolean") { return ( ); } return (
{field.label} onChange(e.target.value)} className="embed-field-input" />
); } function parseStoredHeight(raw: unknown): number { if (typeof raw === "number" && raw > 0) return Math.round(raw); const n = parseInt(String(raw ?? ""), 10); return Number.isFinite(n) && n > 0 ? n : DEFAULT_IFRAME_HEIGHT; } /** * NodeView for `
`. * * Renders a live preview of the remote URL inside an `