@techrox/page-studio-form 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js","../src/PageStudioForm.jsx","../src/RichText.jsx","../src/CustomBlocks.js","../src/HistoryPanel.jsx"],"sourcesContent":["// @techrox/page-studio-form — public surface.\n//\n// PageStudioForm is the high-level admin component (schema-driven page\n// editor with tabs for content / SEO / preview / history). RichText and\n// HistoryPanel are also exported standalone for hosts that only need one\n// piece.\n\nexport { default as PageStudioForm } from './PageStudioForm.jsx';\nexport { default as RichText } from './RichText.jsx';\nexport { default as HistoryPanel } from './HistoryPanel.jsx';\n\nexport {\n CiqImage,\n CiqTableCell,\n CiqTableHeader,\n Columns,\n Column,\n Callout,\n ShareBlock,\n SubscribeBlock,\n} from './CustomBlocks.js';\n","'use client';\n\n// Schema-driven page editor. Uses raw AntD `Form` + `Form.List` (rather than\n// ProForm) because the editor renders heterogeneous field types from a\n// per-key schema registry — that doesn't compose cleanly with ProFormList's\n// typed item components.\n//\n// Host-agnostic: the consumer supplies the schema, default content, the Link\n// component, and an adapter for save / delete / history / image upload.\n\nimport { createContext, useContext, useEffect, useRef, useState, useTransition } from 'react';\nimport {\n Form,\n Input,\n Switch,\n Button,\n Space,\n Tabs,\n Alert,\n App as AntdApp,\n Popconfirm,\n Typography,\n Card,\n Segmented,\n} from 'antd';\nimport {\n ArrowLeftOutlined,\n SaveOutlined,\n DeleteOutlined,\n PlusOutlined,\n MinusCircleOutlined,\n EyeOutlined,\n HolderOutlined,\n ReloadOutlined,\n DesktopOutlined,\n MobileOutlined,\n TabletOutlined,\n} from '@ant-design/icons';\nimport {\n DndContext,\n PointerSensor,\n KeyboardSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport RichText from './RichText';\nimport HistoryPanel from './HistoryPanel';\n\nconst { Text, Paragraph } = Typography;\n\nfunction DefaultLink({ href, target, children, ...rest }) {\n return (\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n {...rest}\n >\n {children}\n </a>\n );\n}\n\nfunction notConfigured(name) {\n return () => {\n throw new Error(\n `@techrox/page-studio-form: missing required adapter method \\`${name}\\`.`,\n );\n };\n}\n\nconst FormCtx = createContext({ LinkComponent: DefaultLink, uploadMedia: undefined });\nconst useFormCtx = () => useContext(FormCtx);\n\nexport default function PageStudioForm({\n pageKey,\n initialPage,\n loadError,\n schema,\n contentDefaults = {},\n livePath,\n homeHref = '/admin/pages',\n homeLabel = 'All pages',\n LinkComponent = DefaultLink,\n adapter = {},\n onSaved,\n onDeleted,\n onRestored,\n}) {\n const {\n savePage = notConfigured('savePage'),\n deletePage = notConfigured('deletePage'),\n loadHistory,\n restoreRevision,\n uploadMedia,\n } = adapter;\n const { message } = AntdApp.useApp();\n const [form] = Form.useForm();\n const [pending, startTransition] = useTransition();\n const [savedAt, setSavedAt] = useState(initialPage?.updated_at || null);\n const [previewKey, setPreviewKey] = useState(0);\n const defaults = contentDefaults;\n\n const initialValues = {\n title: initialPage?.title || '',\n published: initialPage?.published ?? true,\n seo_title: initialPage?.seo?.title || '',\n seo_description: initialPage?.seo?.description || '',\n seo_og_image: initialPage?.seo?.og_image || '',\n seo_noindex: initialPage?.seo?.noindex || false,\n content: { ...defaults, ...(initialPage?.content || {}) },\n };\n\n // Re-sync the form when the underlying page record changes (e.g. after the\n // host re-fetches following onSaved). Without this, AntD Form keeps the\n // stale initialValues from first mount and the editor \"doesn't update\".\n useEffect(() => {\n form.setFieldsValue(initialValues);\n setSavedAt(initialPage?.updated_at || null);\n setPreviewKey((k) => k + 1);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialPage?.updated_at]);\n\n const onFinish = (values) => {\n // Fall back to the saved value when a field's tab was never opened, so\n // submitting from the Content tab doesn't accidentally clobber SEO or\n // flip published off (Form.Items in unmounted tabs are absent from values).\n const fallback = (v, prev) => (v === undefined ? prev : v);\n const payload = {\n title: (fallback(values.title, initialPage?.title) || '').trim(),\n seo: {\n title: fallback(values.seo_title, initialPage?.seo?.title) || '',\n description:\n fallback(values.seo_description, initialPage?.seo?.description) || '',\n og_image: fallback(values.seo_og_image, initialPage?.seo?.og_image) || '',\n noindex: !!fallback(values.seo_noindex, initialPage?.seo?.noindex),\n },\n content: pruneContent(values.content || {}),\n published: !!fallback(values.published, initialPage?.published ?? true),\n };\n startTransition(async () => {\n try {\n const result = await savePage(pageKey, payload);\n const page = result?.page;\n message.success('Saved. Public page is being revalidated.');\n if (page?.updated_at) setSavedAt(page.updated_at);\n onSaved?.(page);\n } catch (err) {\n message.error(err.message || 'Failed to save.');\n }\n });\n };\n\n const onDelete = () => {\n startTransition(async () => {\n try {\n await deletePage(pageKey);\n message.success('Override removed. Public page now uses the static defaults.');\n onDeleted?.();\n } catch (err) {\n message.error(err.message || 'Failed to delete.');\n }\n });\n };\n\n return (\n <FormCtx.Provider value={{ LinkComponent, uploadMedia }}>\n <div style={{ padding: 24, maxWidth: 1280 }}>\n <LinkComponent\n href={homeHref}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n color: 'var(--tps-muted)',\n marginBottom: 16,\n }}\n >\n <ArrowLeftOutlined /> {homeLabel}\n </LinkComponent>\n\n <Form\n form={form}\n layout=\"vertical\"\n onFinish={onFinish}\n initialValues={initialValues}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: 16,\n flexWrap: 'wrap',\n }}\n >\n <div>\n <h1 className=\"tps-h3\" style={{ marginBottom: 4 }}>\n {initialPage?.title || pageKey}\n </h1>\n <Space size={8} wrap>\n <Text type=\"secondary\">\n <Text code>{pageKey}</Text>\n </Text>\n {savedAt && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Last saved {new Date(savedAt).toLocaleString()}\n </Text>\n )}\n </Space>\n </div>\n <Space wrap align=\"center\">\n <Form.Item\n name=\"published\"\n valuePropName=\"checked\"\n style={{ marginBottom: 0 }}\n >\n <PublishToggle />\n </Form.Item>\n {livePath && (\n <LinkComponent href={livePath} target=\"_blank\">\n <Button icon={<EyeOutlined />}>View live</Button>\n </LinkComponent>\n )}\n <Popconfirm\n title=\"Remove this override?\"\n description=\"The public page will fall back to the static defaults.\"\n onConfirm={onDelete}\n okText=\"Remove\"\n cancelText=\"Cancel\"\n >\n <Button danger icon={<DeleteOutlined />} disabled={pending}>\n Remove override\n </Button>\n </Popconfirm>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n loading={pending}\n onClick={() => form.submit()}\n >\n Save\n </Button>\n </Space>\n </div>\n\n {loadError && (\n <Alert\n type=\"error\"\n showIcon\n message=\"Could not load page\"\n description={loadError}\n style={{ margin: '16px 0' }}\n />\n )}\n\n <Tabs\n defaultActiveKey=\"content\"\n style={{ marginTop: 24 }}\n items={[\n {\n key: 'content',\n label: 'Content',\n forceRender: true,\n children: schema ? (\n <SchemaEditor schema={schema} defaults={defaults} />\n ) : (\n <Alert\n type=\"info\"\n showIcon\n message=\"No structured content for this page key.\"\n description=\"SEO can still be edited on the SEO tab.\"\n />\n ),\n },\n {\n key: 'preview',\n label: 'Live preview',\n children: livePath ? (\n <LivePreview path={livePath} previewKey={previewKey} />\n ) : (\n <Alert type=\"info\" message=\"No public path mapped for this key.\" />\n ),\n },\n {\n key: 'history',\n label: 'History',\n children: (\n <HistoryPanel\n pageKey={pageKey}\n currentPage={initialPage}\n loadHistory={loadHistory}\n restoreRevision={restoreRevision}\n onRestored={onRestored}\n />\n ),\n },\n {\n key: 'seo',\n label: 'SEO',\n forceRender: true,\n children: <SeoFields />,\n },\n ]}\n />\n\n <Form.Item name=\"title\" hidden>\n <Input />\n </Form.Item>\n </Form>\n </div>\n </FormCtx.Provider>\n );\n}\n\n// Toolbar publish switch. Wrapped so the label updates with the form value\n// (Form.Item passes value/onChange via cloneElement). Lives in the always-\n// visible toolbar so it can never end up unmounted in a hidden tab.\nfunction PublishToggle({ value, onChange }) {\n return (\n <Space size={6}>\n <Switch checked={!!value} onChange={onChange} />\n <Text style={{ fontSize: 12, color: 'var(--tps-muted)' }}>\n {value ? 'Published' : 'Draft'}\n </Text>\n </Space>\n );\n}\n\nfunction pruneContent(content) {\n const out = {};\n for (const [k, v] of Object.entries(content)) {\n if (v === undefined || v === null) continue;\n if (typeof v === 'string' && v.trim() === '') continue;\n if (Array.isArray(v) && v.length === 0) continue;\n out[k] = v;\n }\n return out;\n}\n\nfunction SeoFields() {\n return (\n <Card size=\"small\">\n <Form.Item\n label=\"SEO title\"\n name=\"seo_title\"\n extra=\"Used in <title> and Open Graph. Leave blank to use the static default.\"\n >\n <Input maxLength={70} showCount />\n </Form.Item>\n <Form.Item\n label=\"Meta description\"\n name=\"seo_description\"\n extra=\"Recommended 140–160 characters.\"\n >\n <Input.TextArea rows={3} maxLength={170} showCount />\n </Form.Item>\n <Form.Item label=\"Open Graph image URL\" name=\"seo_og_image\">\n <Input placeholder=\"https://pagestudio.dev/og-image.png\" />\n </Form.Item>\n <Form.Item label=\"Hide from search engines\" name=\"seo_noindex\" valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n </Card>\n );\n}\n\nfunction SchemaEditor({ schema, defaults }) {\n return (\n <Space direction=\"vertical\" size={20} style={{ width: '100%' }}>\n {schema.map((section) => (\n <SectionBlock key={section.title} section={section} defaults={defaults} />\n ))}\n </Space>\n );\n}\n\nfunction SectionBlock({ section, defaults }) {\n return (\n <Card\n size=\"small\"\n title={\n <span\n style={{\n fontSize: 11,\n fontWeight: 700,\n letterSpacing: 1.5,\n color: 'var(--tps-accent-dark)',\n }}\n >\n {section.title.toUpperCase()}\n </span>\n }\n >\n {section.help && (\n <Paragraph type=\"secondary\" style={{ fontSize: 13, marginTop: 0 }}>\n {section.help}\n </Paragraph>\n )}\n {section.fields.map((f) => (\n <FieldRenderer key={f.name} field={f} parent={['content']} defaults={defaults} />\n ))}\n </Card>\n );\n}\n\nfunction FieldRenderer({ field, parent, defaults }) {\n const namePath = [...parent, field.name];\n const placeholder = placeholderFor(field, defaults?.[field.name]);\n\n if (field.type === 'text') {\n return (\n <Form.Item label={field.label} name={namePath} extra={field.help}>\n <Input placeholder={placeholder} />\n </Form.Item>\n );\n }\n if (field.type === 'textarea' || field.type === 'html-text') {\n return (\n <Form.Item label={field.label} name={namePath} extra={field.help}>\n <Input.TextArea rows={field.rows || 3} placeholder={placeholder} />\n </Form.Item>\n );\n }\n if (field.type === 'richtext') {\n return (\n <Form.Item\n label={field.label || undefined}\n name={namePath}\n extra={field.help}\n valuePropName=\"value\"\n trigger=\"onChange\"\n >\n <RichTextField placeholder={placeholder} />\n </Form.Item>\n );\n }\n if (field.type === 'list') {\n return (\n <Form.Item\n label={field.label}\n name={namePath}\n extra={field.help}\n getValueFromEvent={(e) =>\n e.target.value.split('\\n').map((s) => s.trim()).filter(Boolean)\n }\n getValueProps={(v) => ({ value: Array.isArray(v) ? v.join('\\n') : v || '' })}\n >\n <Input.TextArea rows={field.rows || 4} placeholder={placeholder} />\n </Form.Item>\n );\n }\n if (field.type === 'list-csv') {\n return (\n <Form.Item\n label={field.label}\n name={namePath}\n extra={field.help}\n getValueFromEvent={(e) =>\n e.target.value.split(',').map((s) => s.trim()).filter(Boolean)\n }\n getValueProps={(v) => ({ value: Array.isArray(v) ? v.join(', ') : v || '' })}\n >\n <Input placeholder={placeholder} />\n </Form.Item>\n );\n }\n if (field.type === 'repeater') {\n return <Repeater field={field} namePath={namePath} defaults={defaults?.[field.name]} />;\n }\n return (\n <Alert\n type=\"warning\"\n showIcon\n message={`Unknown field type \"${field.type}\" for ${field.name}`}\n style={{ marginBottom: 12 }}\n />\n );\n}\n\nfunction Repeater({ field, namePath, defaults }) {\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n return (\n <Form.List name={namePath}>\n {(fields, { add, remove, move }) => {\n const ids = fields.map((f) => f.key);\n const onDragEnd = (e) => {\n const { active, over } = e;\n if (!over || active.id === over.id) return;\n const from = ids.indexOf(active.id);\n const to = ids.indexOf(over.id);\n if (from < 0 || to < 0) return;\n // arrayMove + Form.List move are equivalent here — Form.List takes\n // care of re-indexing the underlying values.\n move(from, to);\n };\n return (\n <div>\n {field.label && (\n <Text strong style={{ display: 'block', marginBottom: 8 }}>\n {field.label}\n </Text>\n )}\n {field.help && (\n <Paragraph type=\"secondary\" style={{ fontSize: 13, marginTop: 0 }}>\n {field.help}\n </Paragraph>\n )}\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={onDragEnd}\n >\n <SortableContext items={ids} strategy={verticalListSortingStrategy}>\n <Space direction=\"vertical\" size={12} style={{ width: '100%' }}>\n {fields.map((row, idx) => (\n <SortableRow\n key={row.key}\n id={row.key}\n field={field}\n row={row}\n idx={idx}\n namePath={namePath}\n defaults={defaults?.[idx] || null}\n onRemove={() => remove(idx)}\n />\n ))}\n </Space>\n </SortableContext>\n </DndContext>\n\n <Button\n type=\"dashed\"\n icon={<PlusOutlined />}\n onClick={() => add(buildEmptyItem(field))}\n block\n style={{ marginTop: 12 }}\n >\n Add {field.itemLabel ? singular(field.itemLabel(fields.length)) : 'item'}\n </Button>\n </div>\n );\n }}\n </Form.List>\n );\n}\n\nfunction SortableRow({ id, field, row, idx, namePath, defaults, onRemove }) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id });\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n zIndex: isDragging ? 5 : 'auto',\n };\n return (\n <div ref={setNodeRef} style={style}>\n <Card\n size=\"small\"\n style={{\n background: 'var(--tps-bg-soft)',\n boxShadow: isDragging ? '0 8px 24px rgba(0,0,0,0.12)' : undefined,\n }}\n title={\n <Space>\n <Button\n size=\"small\"\n type=\"text\"\n icon={<HolderOutlined />}\n style={{ cursor: 'grab', touchAction: 'none' }}\n {...attributes}\n {...listeners}\n />\n <Text strong style={{ fontSize: 13 }}>\n <RepeaterItemLabel field={field} index={idx} listPath={namePath} />\n </Text>\n </Space>\n }\n extra={\n <Button\n size=\"small\"\n type=\"text\"\n danger\n icon={<MinusCircleOutlined />}\n onClick={onRemove}\n >\n Remove\n </Button>\n }\n >\n {field.itemFields.map((sub) => (\n <FieldRenderer\n key={sub.name}\n field={sub}\n parent={[...namePath, row.name]}\n defaults={defaults}\n />\n ))}\n </Card>\n </div>\n );\n}\n\nfunction RepeaterItemLabel({ field, index, listPath }) {\n const item = Form.useWatch([...listPath, index]);\n const text = field.itemLabel ? field.itemLabel(index, item) : `Item ${index + 1}`;\n return <span>{text}</span>;\n}\n\nfunction buildEmptyItem(field) {\n const empty = {};\n for (const sub of field.itemFields) {\n if (sub.type === 'list' || sub.type === 'list-csv') empty[sub.name] = [];\n else empty[sub.name] = '';\n }\n return empty;\n}\n\nfunction singular(label) {\n return String(label).replace(/\\s+\\d+$/, '').toLowerCase() || 'item';\n}\n\nfunction placeholderFor(field, defaultValue) {\n if (defaultValue == null) return undefined;\n if (Array.isArray(defaultValue)) {\n if (field.type === 'list-csv') return defaultValue.join(', ');\n return defaultValue.join('\\n');\n }\n if (typeof defaultValue === 'string') {\n return defaultValue.length > 100 ? defaultValue.slice(0, 100) + '…' : defaultValue;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Live preview\n// ---------------------------------------------------------------------------\n\nconst VIEWPORTS = {\n desktop: { width: '100%', label: 'Desktop' },\n tablet: { width: 820, label: 'Tablet' },\n mobile: { width: 390, label: 'Mobile' },\n};\n\nfunction LivePreview({ path, previewKey }) {\n const [device, setDevice] = useState('desktop');\n const [version, setVersion] = useState(0);\n const iframeRef = useRef(null);\n\n // Bump the iframe key whenever the page re-syncs after a save so we render\n // the freshly revalidated copy.\n useEffect(() => {\n setVersion((v) => v + 1);\n }, [previewKey]);\n\n const reload = () => setVersion((v) => v + 1);\n\n return (\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12, gap: 12 }}>\n <Segmented\n value={device}\n onChange={setDevice}\n options={[\n { value: 'desktop', icon: <DesktopOutlined />, label: 'Desktop' },\n { value: 'tablet', icon: <TabletOutlined />, label: 'Tablet' },\n { value: 'mobile', icon: <MobileOutlined />, label: 'Mobile' },\n ]}\n />\n <Space>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Showing <Text code>{path}</Text>\n </Text>\n <Button size=\"small\" icon={<ReloadOutlined />} onClick={reload}>\n Reload\n </Button>\n <PreviewLink href={path} />\n </Space>\n </div>\n <div\n style={{\n background: '#0F172A',\n borderRadius: 'var(--tps-radius)',\n padding: 12,\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n <div\n style={{\n width: VIEWPORTS[device].width,\n maxWidth: '100%',\n transition: 'width 200ms ease',\n background: '#fff',\n borderRadius: 8,\n overflow: 'hidden',\n boxShadow: '0 12px 36px -8px rgba(0,0,0,0.45)',\n }}\n >\n <iframe\n ref={iframeRef}\n key={version}\n src={`${path}?_preview=${version}`}\n title=\"Live preview\"\n style={{\n width: '100%',\n height: '70vh',\n border: 0,\n display: 'block',\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\n// Pulls uploadMedia from form context so the deeply-nested RichText doesn't\n// require prop-drilling through SchemaEditor → SectionBlock → FieldRenderer.\nfunction RichTextField({ value, onChange, placeholder }) {\n const { uploadMedia } = useFormCtx();\n return (\n <RichText\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n uploadMedia={uploadMedia}\n />\n );\n}\n\nfunction PreviewLink({ href }) {\n const { LinkComponent } = useFormCtx();\n return (\n <LinkComponent href={href} target=\"_blank\">\n <Button size=\"small\" icon={<EyeOutlined />}>\n Open in new tab\n </Button>\n </LinkComponent>\n );\n}\n","'use client';\n\n// Full WYSIWYG rich-text editor — Medium / Notion / CKEditor 5 in feel.\n// Persistent toolbar + selection bubble menu + Notion-style \"+\" on empty\n// paragraphs. Custom blocks (columns, callout, share, subscribe), image\n// alignment & width, table merge/align controls.\n//\n// Output is HTML. The host site renders it inside a `.tps-rich-body` element\n// (or whichever container class it themes) so editor canvas and public render\n// share styles. Image uploads are driven by the consumer via the `uploadMedia`\n// prop — it receives a FormData with a single `file` field and must return\n// `{ url }`.\n\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n useEditor,\n EditorContent,\n BubbleMenu,\n FloatingMenu,\n} from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TextStyle from '@tiptap/extension-text-style';\nimport { Color } from '@tiptap/extension-color';\nimport Highlight from '@tiptap/extension-highlight';\nimport Table from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TaskList from '@tiptap/extension-task-list';\nimport TaskItem from '@tiptap/extension-task-item';\nimport CharacterCount from '@tiptap/extension-character-count';\nimport Typography from '@tiptap/extension-typography';\n\nimport {\n Button,\n Divider,\n Dropdown,\n Form,\n Input,\n Modal,\n Popover,\n Space,\n Tabs,\n Tag,\n Tooltip,\n Typography as AntTypography,\n Upload,\n message as antdMessage,\n} from 'antd';\nimport {\n BoldOutlined,\n ItalicOutlined,\n UnderlineOutlined,\n StrikethroughOutlined,\n UnorderedListOutlined,\n OrderedListOutlined,\n CheckSquareOutlined,\n LinkOutlined,\n PictureOutlined,\n TableOutlined,\n ClearOutlined,\n UndoOutlined,\n RedoOutlined,\n AlignLeftOutlined,\n AlignCenterOutlined,\n AlignRightOutlined,\n CodeOutlined,\n BgColorsOutlined,\n HighlightOutlined,\n MinusOutlined,\n BlockOutlined,\n DownOutlined,\n PlusOutlined,\n UploadOutlined,\n LoadingOutlined,\n AppstoreOutlined,\n ColumnWidthOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignMiddleOutlined,\n VerticalAlignBottomOutlined,\n EditOutlined,\n DeleteOutlined,\n ShareAltOutlined,\n MailOutlined,\n ExclamationCircleOutlined,\n} from '@ant-design/icons';\n\nimport {\n CiqImage,\n CiqTableCell,\n CiqTableHeader,\n Columns,\n Column,\n Callout,\n ShareBlock,\n SubscribeBlock,\n} from './CustomBlocks';\n\nfunction defaultUploadMedia() {\n throw new Error(\n '@techrox/page-studio-form: RichText was used without an `uploadMedia` prop. ' +\n 'Pass a function `(FormData) => Promise<{ url }>` to enable image uploads.',\n );\n}\n\nconst { Text } = AntTypography;\n\nconst HEADING_OPTIONS = [\n { key: 'p', label: 'Paragraph' },\n { key: 'h1', label: 'Heading 1' },\n { key: 'h2', label: 'Heading 2' },\n { key: 'h3', label: 'Heading 3' },\n { key: 'h4', label: 'Heading 4' },\n];\n\nconst TEXT_COLORS = [\n '#0F172A', '#475569', '#0F766E', '#0B5550', '#F59E0B',\n '#D97706', '#DC2626', '#2563EB', '#7C3AED', '#059669',\n];\n\nconst HIGHLIGHT_COLORS = [\n '#FEF08A', '#FECACA', '#FED7AA', '#A7F3D0', '#BFDBFE',\n '#E9D5FF', '#FBCFE8', '#FDE68A',\n];\n\nconst IMAGE_WIDTHS = [\n { value: 'small', label: 'Small (40%)' },\n { value: 'medium', label: 'Medium (60%)' },\n { value: 'large', label: 'Large (80%)' },\n { value: 'full', label: 'Full width' },\n];\n\nexport default function RichText({\n value = '',\n onChange,\n placeholder = \"Type '/' for blocks, or just start writing…\",\n minHeight = 280,\n uploadMedia = defaultUploadMedia,\n}) {\n const [imageOpen, setImageOpen] = useState(false);\n const [linkOpen, setLinkOpen] = useState(false);\n const [editBlock, setEditBlock] = useState(null); // 'share' | 'subscribe' | null\n\n const editor = useEditor({\n extensions: useMemo(\n () => [\n StarterKit.configure({\n heading: { levels: [1, 2, 3, 4] },\n codeBlock: { HTMLAttributes: { class: 'tiptap-code' } },\n }),\n Underline,\n Link.configure({\n openOnClick: false,\n autolink: true,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n CiqImage.configure({ inline: false, allowBase64: false }),\n Placeholder.configure({\n placeholder: ({ node, editor }) => {\n if (node.type.name === 'paragraph' && editor.isEmpty) return placeholder;\n return '';\n },\n showOnlyWhenEditable: true,\n }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Table.configure({ resizable: true, HTMLAttributes: { class: 'tps-rich-table' } }),\n TableRow,\n CiqTableHeader,\n CiqTableCell,\n TaskList,\n TaskItem.configure({ nested: true }),\n CharacterCount,\n Typography,\n Columns,\n Column,\n Callout,\n ShareBlock,\n SubscribeBlock,\n ],\n [placeholder],\n ),\n content: value || '',\n onUpdate: ({ editor }) => onChange?.(editor.getHTML()),\n immediatelyRender: false,\n editorProps: {\n attributes: { class: 'tiptap', spellcheck: 'true' },\n handleDrop: (view, event) => {\n const files = Array.from(event.dataTransfer?.files || []).filter((f) =>\n f.type.startsWith('image/'),\n );\n if (!files.length) return false;\n event.preventDefault();\n files.forEach((f) => uploadAndInsert(f, view, event, uploadMedia));\n return true;\n },\n handlePaste: (view, event) => {\n const files = Array.from(event.clipboardData?.files || []).filter((f) =>\n f.type.startsWith('image/'),\n );\n if (!files.length) return false;\n event.preventDefault();\n files.forEach((f) => uploadAndInsert(f, view, null, uploadMedia));\n return true;\n },\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n const current = editor.getHTML();\n const next = value || '';\n if (current === next) return;\n if (current === '<p></p>' && next === '') return;\n editor.commands.setContent(next, false);\n }, [editor, value]);\n\n if (!editor) {\n return (\n <div\n style={{\n border: '1px solid var(--tps-line)',\n borderRadius: 'var(--tps-radius)',\n minHeight,\n background: '#fff',\n }}\n />\n );\n }\n\n return (\n <div\n style={{\n border: '1px solid var(--tps-line)',\n borderRadius: 'var(--tps-radius)',\n background: '#fff',\n overflow: 'hidden',\n }}\n >\n <Toolbar\n editor={editor}\n onOpenLink={() => setLinkOpen(true)}\n onOpenImage={() => setImageOpen(true)}\n />\n\n {/* Selection-based formatting bar (Medium-style). */}\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor, from, to }) => {\n if (from === to) return false;\n if (\n editor.isActive('ciqImage') ||\n editor.isActive('table') ||\n editor.isActive('codeBlock') ||\n editor.isActive('shareBlock') ||\n editor.isActive('subscribeBlock')\n ) return false;\n return true;\n }}\n tippyOptions={{ duration: 100, placement: 'top' }}\n pluginKey=\"selectionBubble\"\n >\n <SelectionFormatBar editor={editor} onLink={() => setLinkOpen(true)} />\n </BubbleMenu>\n\n {/* Image controls when an image is selected. */}\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor }) => editor.isActive('ciqImage')}\n tippyOptions={{ duration: 100, placement: 'top' }}\n pluginKey=\"imageBubble\"\n >\n <ImageBubble editor={editor} />\n </BubbleMenu>\n\n {/* Table ops bubble. */}\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor }) => editor.isActive('table')}\n tippyOptions={{ duration: 100, placement: 'top' }}\n pluginKey=\"tableBubble\"\n >\n <TableBubble editor={editor} />\n </BubbleMenu>\n\n {/* Share / Subscribe block: edit + delete. */}\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor }) =>\n editor.isActive('shareBlock') || editor.isActive('subscribeBlock')\n }\n tippyOptions={{ duration: 100, placement: 'top' }}\n pluginKey=\"atomBlockBubble\"\n >\n <AtomBlockBubble\n editor={editor}\n onEdit={(kind) => setEditBlock(kind)}\n />\n </BubbleMenu>\n\n {/* Notion-style \"+\" on empty paragraphs. */}\n <FloatingMenu\n editor={editor}\n shouldShow={({ editor, state }) => {\n const { $from } = state.selection;\n const isEmptyParagraph =\n $from.parent.type.name === 'paragraph' && $from.parent.content.size === 0;\n return editor.isFocused && isEmptyParagraph && !editor.isActive('table');\n }}\n tippyOptions={{ duration: 100, placement: 'left-start', offset: [0, 8] }}\n >\n <BlockInsertMenu editor={editor} onImage={() => setImageOpen(true)} />\n </FloatingMenu>\n\n <div style={{ padding: 16, minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <div\n style={{\n padding: '6px 14px',\n borderTop: '1px solid var(--tps-line)',\n background: 'var(--tps-bg-soft)',\n fontSize: 12,\n color: 'var(--tps-muted)',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <span>\n {editor.storage.characterCount.words()} words ·{' '}\n {editor.storage.characterCount.characters()} characters\n </span>\n <span>HTML output · drop or paste images to upload</span>\n </div>\n\n <LinkModal open={linkOpen} onClose={() => setLinkOpen(false)} editor={editor} />\n <ImageModal\n open={imageOpen}\n onClose={() => setImageOpen(false)}\n editor={editor}\n uploadMedia={uploadMedia}\n />\n <BlockAttributeModal\n kind={editBlock}\n open={!!editBlock}\n onClose={() => setEditBlock(null)}\n editor={editor}\n />\n <EditorStyles />\n </div>\n );\n}\n\nasync function uploadAndInsert(file, view, dropEvent, uploadMedia) {\n try {\n const fd = new FormData();\n fd.append('file', file);\n const { url } = await uploadMedia(fd);\n if (!url) throw new Error('No URL returned');\n const node = view.state.schema.nodes.ciqImage.create({\n src: url,\n alt: file.name,\n align: 'center',\n width: 'medium',\n });\n let pos;\n if (dropEvent) {\n const coords = view.posAtCoords({ left: dropEvent.clientX, top: dropEvent.clientY });\n pos = coords?.pos ?? view.state.selection.from;\n } else {\n pos = view.state.selection.from;\n }\n const tr = view.state.tr.insert(pos, node);\n view.dispatch(tr);\n } catch (err) {\n antdMessage.error(err.message || 'Upload failed');\n }\n}\n\nfunction Toolbar({ editor, onOpenLink, onOpenImage }) {\n const headingValue = (() => {\n if (editor.isActive('heading', { level: 1 })) return 'h1';\n if (editor.isActive('heading', { level: 2 })) return 'h2';\n if (editor.isActive('heading', { level: 3 })) return 'h3';\n if (editor.isActive('heading', { level: 4 })) return 'h4';\n return 'p';\n })();\n const setHeading = (key) => {\n if (key === 'p') editor.chain().focus().setParagraph().run();\n else editor.chain().focus().toggleHeading({ level: Number(key.slice(1)) }).run();\n };\n\n const insertBlockItems = [\n { key: 'image', label: 'Image', icon: <PictureOutlined />, run: onOpenImage },\n {\n key: 'table',\n label: 'Table (3×3)',\n icon: <TableOutlined />,\n run: () =>\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),\n },\n {\n key: 'cols2',\n label: '2 columns',\n icon: <AppstoreOutlined />,\n run: () => editor.chain().focus().insertColumns(2).run(),\n },\n {\n key: 'cols3',\n label: '3 columns',\n icon: <AppstoreOutlined />,\n run: () => editor.chain().focus().insertColumns(3).run(),\n },\n {\n key: 'cols4',\n label: '4 columns',\n icon: <AppstoreOutlined />,\n run: () => editor.chain().focus().insertColumns(4).run(),\n },\n {\n key: 'callout-info',\n label: 'Callout (info)',\n icon: <ExclamationCircleOutlined />,\n run: () => editor.chain().focus().insertCallout('info').run(),\n },\n {\n key: 'callout-success',\n label: 'Callout (success)',\n icon: <ExclamationCircleOutlined style={{ color: '#059669' }} />,\n run: () => editor.chain().focus().insertCallout('success').run(),\n },\n {\n key: 'callout-warning',\n label: 'Callout (warning)',\n icon: <ExclamationCircleOutlined style={{ color: '#D97706' }} />,\n run: () => editor.chain().focus().insertCallout('warning').run(),\n },\n {\n key: 'share',\n label: 'Share buttons',\n icon: <ShareAltOutlined />,\n run: () => editor.chain().focus().insertShareBlock().run(),\n },\n {\n key: 'subscribe',\n label: 'Subscribe form',\n icon: <MailOutlined />,\n run: () => editor.chain().focus().insertSubscribeBlock().run(),\n },\n ];\n\n return (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n padding: 8,\n background: 'var(--tps-bg-soft)',\n borderBottom: '1px solid var(--tps-line)',\n alignItems: 'center',\n position: 'sticky',\n top: 0,\n zIndex: 5,\n }}\n >\n <ToolButton title=\"Undo (⌘Z)\" icon={<UndoOutlined />}\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()} />\n <ToolButton title=\"Redo (⌘⇧Z)\" icon={<RedoOutlined />}\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()} />\n <ToolbarDivider />\n\n <Dropdown\n trigger={['click']}\n menu={{\n items: HEADING_OPTIONS.map((o) => ({ key: o.key, label: o.label })),\n selectedKeys: [headingValue],\n onClick: ({ key }) => setHeading(key),\n }}\n >\n <Button size=\"small\" type=\"text\" style={{ minWidth: 110 }}>\n {HEADING_OPTIONS.find((o) => o.key === headingValue)?.label}\n <DownOutlined style={{ fontSize: 10, marginLeft: 4 }} />\n </Button>\n </Dropdown>\n <ToolbarDivider />\n\n <ToolButton title=\"Bold (⌘B)\" icon={<BoldOutlined />}\n active={editor.isActive('bold')}\n onClick={() => editor.chain().focus().toggleBold().run()} />\n <ToolButton title=\"Italic (⌘I)\" icon={<ItalicOutlined />}\n active={editor.isActive('italic')}\n onClick={() => editor.chain().focus().toggleItalic().run()} />\n <ToolButton title=\"Underline (⌘U)\" icon={<UnderlineOutlined />}\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()} />\n <ToolButton title=\"Strikethrough\" icon={<StrikethroughOutlined />}\n active={editor.isActive('strike')}\n onClick={() => editor.chain().focus().toggleStrike().run()} />\n <ToolbarDivider />\n\n <ColorSwatch title=\"Text color\" icon={<BgColorsOutlined />}\n colors={TEXT_COLORS}\n onPick={(c) => editor.chain().focus().setColor(c).run()}\n onClear={() => editor.chain().focus().unsetColor().run()} />\n <ColorSwatch title=\"Highlight\" icon={<HighlightOutlined />}\n colors={HIGHLIGHT_COLORS}\n onPick={(c) => editor.chain().focus().toggleHighlight({ color: c }).run()}\n onClear={() => editor.chain().focus().unsetHighlight().run()} />\n <ToolbarDivider />\n\n <ToolButton title=\"Align left\" icon={<AlignLeftOutlined />}\n active={editor.isActive({ textAlign: 'left' })}\n onClick={() => editor.chain().focus().setTextAlign('left').run()} />\n <ToolButton title=\"Align center\" icon={<AlignCenterOutlined />}\n active={editor.isActive({ textAlign: 'center' })}\n onClick={() => editor.chain().focus().setTextAlign('center').run()} />\n <ToolButton title=\"Align right\" icon={<AlignRightOutlined />}\n active={editor.isActive({ textAlign: 'right' })}\n onClick={() => editor.chain().focus().setTextAlign('right').run()} />\n <ToolbarDivider />\n\n <ToolButton title=\"Bulleted list\" icon={<UnorderedListOutlined />}\n active={editor.isActive('bulletList')}\n onClick={() => editor.chain().focus().toggleBulletList().run()} />\n <ToolButton title=\"Numbered list\" icon={<OrderedListOutlined />}\n active={editor.isActive('orderedList')}\n onClick={() => editor.chain().focus().toggleOrderedList().run()} />\n <ToolButton title=\"Task list\" icon={<CheckSquareOutlined />}\n active={editor.isActive('taskList')}\n onClick={() => editor.chain().focus().toggleTaskList().run()} />\n <ToolbarDivider />\n\n <ToolButton title=\"Quote\" icon={<BlockOutlined />}\n active={editor.isActive('blockquote')}\n onClick={() => editor.chain().focus().toggleBlockquote().run()} />\n <ToolButton title=\"Code block\" icon={<CodeOutlined />}\n active={editor.isActive('codeBlock')}\n onClick={() => editor.chain().focus().toggleCodeBlock().run()} />\n <ToolButton title=\"Horizontal rule\" icon={<MinusOutlined />}\n onClick={() => editor.chain().focus().setHorizontalRule().run()} />\n <ToolbarDivider />\n\n <ToolButton title=\"Insert / edit link\" icon={<LinkOutlined />}\n active={editor.isActive('link')} onClick={onOpenLink} />\n\n <Dropdown\n trigger={['click']}\n placement=\"bottomLeft\"\n menu={{\n items: insertBlockItems.map((i) => ({ key: i.key, label: i.label, icon: i.icon })),\n onClick: ({ key }) => insertBlockItems.find((i) => i.key === key)?.run(),\n }}\n >\n <Button size=\"small\" type=\"text\" icon={<PlusOutlined />} style={{ paddingInline: 8 }}>\n Insert <DownOutlined style={{ fontSize: 10 }} />\n </Button>\n </Dropdown>\n <ToolbarDivider />\n\n <Tooltip title=\"Clear formatting\">\n <Button size=\"small\" type=\"text\" icon={<ClearOutlined />}\n onClick={() => editor.chain().focus().clearNodes().unsetAllMarks().run()} />\n </Tooltip>\n </div>\n );\n}\n\nfunction ToolButton({ title, icon, active, onClick, disabled }) {\n return (\n <Tooltip title={title}>\n <Button\n size=\"small\"\n type={active ? 'primary' : 'text'}\n icon={icon}\n disabled={disabled}\n onClick={onClick}\n />\n </Tooltip>\n );\n}\n\nfunction ToolbarDivider() {\n return (\n <Divider type=\"vertical\" style={{ height: 22, margin: '0 2px', borderColor: 'var(--tps-line)' }} />\n );\n}\n\nfunction SelectionFormatBar({ editor, onLink }) {\n return (\n <Space\n size={2}\n style={{\n background: '#0F172A',\n padding: 4,\n borderRadius: 6,\n boxShadow: '0 8px 24px rgba(0,0,0,0.25)',\n }}\n >\n <BubbleBtn title=\"Bold\" icon={<BoldOutlined />}\n active={editor.isActive('bold')}\n onClick={() => editor.chain().focus().toggleBold().run()} />\n <BubbleBtn title=\"Italic\" icon={<ItalicOutlined />}\n active={editor.isActive('italic')}\n onClick={() => editor.chain().focus().toggleItalic().run()} />\n <BubbleBtn title=\"Underline\" icon={<UnderlineOutlined />}\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()} />\n <BubbleBtn title=\"Strike\" icon={<StrikethroughOutlined />}\n active={editor.isActive('strike')}\n onClick={() => editor.chain().focus().toggleStrike().run()} />\n <Divider type=\"vertical\" style={{ background: 'rgba(255,255,255,0.18)', height: 18, margin: '0 2px' }} />\n <BubbleBtn title=\"Inline code\" icon={<CodeOutlined />}\n active={editor.isActive('code')}\n onClick={() => editor.chain().focus().toggleCode().run()} />\n <BubbleBtn title=\"Link\" icon={<LinkOutlined />}\n active={editor.isActive('link')} onClick={onLink} />\n </Space>\n );\n}\n\nfunction BubbleBtn({ title, icon, active, onClick }) {\n return (\n <Tooltip title={title}>\n <Button\n size=\"small\"\n type=\"text\"\n icon={icon}\n onClick={onClick}\n style={{ color: active ? '#F59E0B' : '#fff' }}\n />\n </Tooltip>\n );\n}\n\nfunction ImageBubble({ editor }) {\n const attrs = editor.getAttributes('ciqImage');\n const setAlign = (align) =>\n editor.chain().focus().updateAttributes('ciqImage', { align }).run();\n const setWidth = (width) =>\n editor.chain().focus().updateAttributes('ciqImage', { width }).run();\n const remove = () => editor.chain().focus().deleteSelection().run();\n\n return (\n <Space\n size={2}\n style={{\n background: '#fff',\n padding: 4,\n border: '1px solid var(--tps-line)',\n borderRadius: 6,\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}\n >\n <Tooltip title=\"Align left\">\n <Button size=\"small\" type={attrs.align === 'left' ? 'primary' : 'text'}\n icon={<AlignLeftOutlined />} onClick={() => setAlign('left')} />\n </Tooltip>\n <Tooltip title=\"Align center\">\n <Button size=\"small\" type={attrs.align === 'center' ? 'primary' : 'text'}\n icon={<AlignCenterOutlined />} onClick={() => setAlign('center')} />\n </Tooltip>\n <Tooltip title=\"Align right\">\n <Button size=\"small\" type={attrs.align === 'right' ? 'primary' : 'text'}\n icon={<AlignRightOutlined />} onClick={() => setAlign('right')} />\n </Tooltip>\n <Divider type=\"vertical\" />\n <Dropdown\n trigger={['click']}\n menu={{\n items: IMAGE_WIDTHS.map((w) => ({ key: w.value, label: w.label })),\n selectedKeys: [attrs.width || 'medium'],\n onClick: ({ key }) => setWidth(key),\n }}\n >\n <Button size=\"small\" type=\"text\" icon={<ColumnWidthOutlined />}>\n {IMAGE_WIDTHS.find((w) => w.value === (attrs.width || 'medium'))?.label}\n <DownOutlined style={{ fontSize: 10, marginLeft: 4 }} />\n </Button>\n </Dropdown>\n <Divider type=\"vertical\" />\n <Tooltip title=\"Edit alt text\">\n <Button\n size=\"small\"\n type=\"text\"\n icon={<EditOutlined />}\n onClick={() => {\n const alt = window.prompt('Alt text', attrs.alt || '');\n if (alt !== null) {\n editor.chain().focus().updateAttributes('ciqImage', { alt }).run();\n }\n }}\n />\n </Tooltip>\n <Tooltip title=\"Delete image\">\n <Button size=\"small\" type=\"text\" danger icon={<DeleteOutlined />} onClick={remove} />\n </Tooltip>\n </Space>\n );\n}\n\nfunction TableBubble({ editor }) {\n const cellAttrs = editor.getAttributes('tableCell');\n const setVAlign = (verticalAlign) => {\n // Apply to both header and body cells.\n editor.chain().focus().updateAttributes('tableCell', { verticalAlign }).run();\n editor.chain().focus().updateAttributes('tableHeader', { verticalAlign }).run();\n };\n\n return (\n <Space\n size={4}\n wrap\n style={{\n background: '#fff',\n padding: 4,\n border: '1px solid var(--tps-line)',\n borderRadius: 6,\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n maxWidth: 720,\n }}\n >\n <Button size=\"small\" onClick={() => editor.chain().focus().addColumnBefore().run()}>+ col ←</Button>\n <Button size=\"small\" onClick={() => editor.chain().focus().addColumnAfter().run()}>+ col →</Button>\n <Button size=\"small\" onClick={() => editor.chain().focus().deleteColumn().run()}>− col</Button>\n <Divider type=\"vertical\" />\n <Button size=\"small\" onClick={() => editor.chain().focus().addRowBefore().run()}>+ row ↑</Button>\n <Button size=\"small\" onClick={() => editor.chain().focus().addRowAfter().run()}>+ row ↓</Button>\n <Button size=\"small\" onClick={() => editor.chain().focus().deleteRow().run()}>− row</Button>\n <Divider type=\"vertical\" />\n <Button size=\"small\" onClick={() => editor.chain().focus().mergeCells().run()}>Merge</Button>\n <Button size=\"small\" onClick={() => editor.chain().focus().splitCell().run()}>Split</Button>\n <Divider type=\"vertical\" />\n <Tooltip title=\"Top\">\n <Button size=\"small\"\n type={cellAttrs.verticalAlign === 'top' ? 'primary' : 'default'}\n icon={<VerticalAlignTopOutlined />} onClick={() => setVAlign('top')} />\n </Tooltip>\n <Tooltip title=\"Middle\">\n <Button size=\"small\"\n type={cellAttrs.verticalAlign === 'middle' ? 'primary' : 'default'}\n icon={<VerticalAlignMiddleOutlined />} onClick={() => setVAlign('middle')} />\n </Tooltip>\n <Tooltip title=\"Bottom\">\n <Button size=\"small\"\n type={cellAttrs.verticalAlign === 'bottom' ? 'primary' : 'default'}\n icon={<VerticalAlignBottomOutlined />} onClick={() => setVAlign('bottom')} />\n </Tooltip>\n <Divider type=\"vertical\" />\n <Button size=\"small\" onClick={() => editor.chain().focus().toggleHeaderRow().run()}>Header row</Button>\n <Button size=\"small\" onClick={() => editor.chain().focus().toggleHeaderColumn().run()}>Header col</Button>\n <Divider type=\"vertical\" />\n <Button size=\"small\" danger onClick={() => editor.chain().focus().deleteTable().run()}>Delete</Button>\n </Space>\n );\n}\n\nfunction AtomBlockBubble({ editor, onEdit }) {\n const kind = editor.isActive('shareBlock')\n ? 'share'\n : editor.isActive('subscribeBlock')\n ? 'subscribe'\n : null;\n if (!kind) return null;\n return (\n <Space\n size={4}\n style={{\n background: '#fff',\n padding: 4,\n border: '1px solid var(--tps-line)',\n borderRadius: 6,\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}\n >\n <Tag color={kind === 'share' ? 'cyan' : 'gold'} style={{ margin: 0 }}>\n {kind === 'share' ? 'Share block' : 'Subscribe block'}\n </Tag>\n <Button size=\"small\" icon={<EditOutlined />} onClick={() => onEdit(kind)}>\n Edit\n </Button>\n <Button size=\"small\" type=\"text\" danger icon={<DeleteOutlined />}\n onClick={() => editor.chain().focus().deleteSelection().run()} />\n </Space>\n );\n}\n\nfunction BlockInsertMenu({ editor, onImage }) {\n const items = [\n { key: 'h1', label: 'Heading 1', run: () => editor.chain().focus().toggleHeading({ level: 1 }).run() },\n { key: 'h2', label: 'Heading 2', run: () => editor.chain().focus().toggleHeading({ level: 2 }).run() },\n { key: 'h3', label: 'Heading 3', run: () => editor.chain().focus().toggleHeading({ level: 3 }).run() },\n { key: 'ul', label: 'Bulleted list', run: () => editor.chain().focus().toggleBulletList().run() },\n { key: 'ol', label: 'Numbered list', run: () => editor.chain().focus().toggleOrderedList().run() },\n { key: 'task', label: 'Task list', run: () => editor.chain().focus().toggleTaskList().run() },\n { key: 'quote', label: 'Quote', run: () => editor.chain().focus().toggleBlockquote().run() },\n { key: 'code', label: 'Code block', run: () => editor.chain().focus().toggleCodeBlock().run() },\n { key: 'hr', label: 'Divider', run: () => editor.chain().focus().setHorizontalRule().run() },\n { type: 'divider' },\n { key: 'image', label: 'Image', run: () => onImage() },\n { key: 'table', label: 'Table', run: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run() },\n { key: 'cols2', label: '2 columns', run: () => editor.chain().focus().insertColumns(2).run() },\n { key: 'cols3', label: '3 columns', run: () => editor.chain().focus().insertColumns(3).run() },\n { key: 'callout', label: 'Callout', run: () => editor.chain().focus().insertCallout('info').run() },\n { key: 'share', label: 'Share buttons', run: () => editor.chain().focus().insertShareBlock().run() },\n { key: 'subscribe', label: 'Subscribe form', run: () => editor.chain().focus().insertSubscribeBlock().run() },\n ];\n return (\n <Dropdown\n trigger={['click']}\n placement=\"bottomLeft\"\n menu={{\n items: items.map((i, idx) =>\n i.type === 'divider' ? { type: 'divider', key: `d${idx}` } : { key: i.key, label: i.label },\n ),\n onClick: ({ key }) => items.find((i) => i.key === key)?.run(),\n }}\n >\n <Tooltip title=\"Insert block\">\n <Button\n size=\"small\"\n shape=\"circle\"\n icon={<PlusOutlined />}\n style={{\n background: '#fff',\n borderColor: 'var(--tps-line)',\n boxShadow: '0 4px 12px rgba(0,0,0,0.08)',\n }}\n />\n </Tooltip>\n </Dropdown>\n );\n}\n\nfunction ColorSwatch({ title, icon, colors, onPick, onClear }) {\n const [open, setOpen] = useState(false);\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n trigger=\"click\"\n placement=\"bottomLeft\"\n content={\n <Space direction=\"vertical\" size={8} style={{ width: 200 }}>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 1fr)', gap: 6 }}>\n {colors.map((c) => (\n <button\n key={c}\n onClick={() => {\n onPick(c);\n setOpen(false);\n }}\n style={{\n width: 28,\n height: 28,\n background: c,\n border: '1px solid var(--tps-line)',\n borderRadius: 4,\n cursor: 'pointer',\n }}\n title={c}\n />\n ))}\n </div>\n <Button size=\"small\" block onClick={() => { onClear(); setOpen(false); }}>\n Clear\n </Button>\n </Space>\n }\n >\n <Tooltip title={title}>\n <Button size=\"small\" type=\"text\" icon={icon} />\n </Tooltip>\n </Popover>\n );\n}\n\nfunction LinkModal({ open, onClose, editor }) {\n const [href, setHref] = useState('');\n useEffect(() => {\n if (open) setHref(editor.getAttributes('link').href || '');\n }, [open, editor]);\n const apply = () => {\n if (!href) editor.chain().focus().unsetLink().run();\n else editor.chain().focus().extendMarkRange('link').setLink({ href }).run();\n onClose();\n };\n return (\n <Modal title=\"Link\" open={open} onCancel={onClose} onOk={apply} okText=\"Apply\"\n okButtonProps={{ disabled: !href && !editor.isActive('link') }} destroyOnClose>\n <Input placeholder=\"https://example.com\" value={href}\n onChange={(e) => setHref(e.target.value)} onPressEnter={apply} autoFocus />\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Leave blank and Apply to remove the link.\n </Text>\n </Modal>\n );\n}\n\nfunction ImageModal({ open, onClose, editor, uploadMedia }) {\n const [tab, setTab] = useState('upload');\n const [src, setSrc] = useState('');\n const [alt, setAlt] = useState('');\n const [uploading, setUploading] = useState(false);\n\n useEffect(() => {\n if (open) { setTab('upload'); setSrc(''); setAlt(''); }\n }, [open]);\n\n const apply = () => {\n if (!src) return;\n editor.chain().focus().insertContent({\n type: 'ciqImage',\n attrs: { src, alt, align: 'center', width: 'medium' },\n }).run();\n onClose();\n };\n\n const beforeUpload = async (file) => {\n if (!file.type.startsWith('image/')) {\n antdMessage.error('Only image files are supported.');\n return Upload.LIST_IGNORE;\n }\n setUploading(true);\n try {\n const fd = new FormData();\n fd.append('file', file);\n const { url } = await uploadMedia(fd);\n setSrc(url);\n if (!alt) setAlt(file.name.replace(/\\.[^.]+$/, ''));\n } catch (err) {\n antdMessage.error(err.message || 'Upload failed');\n } finally {\n setUploading(false);\n }\n return Upload.LIST_IGNORE;\n };\n\n return (\n <Modal title=\"Insert image\" open={open} onCancel={onClose} onOk={apply} okText=\"Insert\"\n okButtonProps={{ disabled: !src }} destroyOnClose width={560}>\n <Tabs activeKey={tab} onChange={setTab}\n items={[\n {\n key: 'upload',\n label: 'Upload',\n children: (\n <Space direction=\"vertical\" size={12} style={{ width: '100%' }}>\n <Upload.Dragger multiple={false} beforeUpload={beforeUpload}\n showUploadList={false} disabled={uploading} accept=\"image/*\">\n <p style={{ fontSize: 28, margin: 0 }}>\n {uploading ? <LoadingOutlined /> : <UploadOutlined />}\n </p>\n <p style={{ marginTop: 4 }}>\n {uploading ? 'Uploading…' : 'Click or drag an image'}\n </p>\n <p style={{ color: 'var(--tps-muted)', fontSize: 12 }}>\n JPG / PNG / WEBP / GIF / SVG · max 10MB\n </p>\n </Upload.Dragger>\n <Input placeholder=\"Alt text (for accessibility & SEO)\"\n value={alt} onChange={(e) => setAlt(e.target.value)} />\n {src && <Tag color=\"green\" style={{ width: 'fit-content' }}>Uploaded</Tag>}\n </Space>\n ),\n },\n {\n key: 'url',\n label: 'From URL',\n children: (\n <Space direction=\"vertical\" size={12} style={{ width: '100%' }}>\n <Input placeholder=\"https://…\" value={src}\n onChange={(e) => setSrc(e.target.value)} autoFocus />\n <Input placeholder=\"Alt text (for accessibility & SEO)\"\n value={alt} onChange={(e) => setAlt(e.target.value)} />\n </Space>\n ),\n },\n ]} />\n {src && (\n <div style={{ marginTop: 12, border: '1px solid var(--tps-line)', padding: 8, borderRadius: 6 }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img src={src} alt={alt} style={{ maxWidth: '100%', display: 'block' }} />\n </div>\n )}\n </Modal>\n );\n}\n\n// Edit attributes for atom blocks (share, subscribe).\nfunction BlockAttributeModal({ kind, open, onClose, editor }) {\n const [form] = Form.useForm();\n const isShare = kind === 'share';\n const nodeName = isShare ? 'shareBlock' : 'subscribeBlock';\n\n useEffect(() => {\n if (!open) return;\n const attrs = editor.getAttributes(nodeName);\n form.setFieldsValue(attrs);\n }, [open, editor, nodeName, form]);\n\n const apply = async () => {\n const values = await form.validateFields();\n editor.chain().focus().updateAttributes(nodeName, values).run();\n onClose();\n };\n\n if (!kind) return null;\n return (\n <Modal\n title={isShare ? 'Share block' : 'Subscribe block'}\n open={open}\n onCancel={onClose}\n onOk={apply}\n okText=\"Apply\"\n destroyOnClose\n >\n <Form form={form} layout=\"vertical\" preserve={false}>\n {isShare ? (\n <Form.Item label=\"Label\" name=\"label\">\n <Input placeholder=\"Share this page\" />\n </Form.Item>\n ) : (\n <>\n <Form.Item label=\"Heading\" name=\"heading\">\n <Input placeholder=\"Stay in the loop\" />\n </Form.Item>\n <Form.Item label=\"Body\" name=\"body\">\n <Input.TextArea rows={2} placeholder=\"One short email when we publish — never more.\" />\n </Form.Item>\n <Form.Item label=\"Button label\" name=\"button\">\n <Input placeholder=\"Subscribe\" />\n </Form.Item>\n </>\n )}\n </Form>\n </Modal>\n );\n}\n\nfunction EditorStyles() {\n return (\n <style jsx global>{`\n .tiptap {\n outline: none;\n font-size: 15px;\n line-height: 1.65;\n color: var(--tps-ink);\n min-height: 100%;\n }\n .tiptap > * + * { margin-top: 0.75em; }\n .tiptap p.is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: var(--tps-muted);\n pointer-events: none;\n height: 0;\n }\n .tiptap h1 { font-size: 28px; font-weight: 800; line-height: 1.2; margin: 1em 0 0.5em; }\n .tiptap h2 { font-size: 22px; font-weight: 700; line-height: 1.25; margin: 1em 0 0.5em; }\n .tiptap h3 { font-size: 18px; font-weight: 700; line-height: 1.3; margin: 1em 0 0.4em; }\n .tiptap h4 { font-size: 16px; font-weight: 700; line-height: 1.35; margin: 1em 0 0.4em; }\n .tiptap p { margin: 0; }\n .tiptap ul, .tiptap ol { padding-left: 22px; }\n .tiptap ul[data-type='taskList'] { list-style: none; padding-left: 0; }\n .tiptap ul[data-type='taskList'] li { display: flex; gap: 8px; align-items: flex-start; }\n .tiptap a { color: var(--tps-primary); text-decoration: underline; }\n .tiptap blockquote {\n border-left: 3px solid var(--tps-primary);\n padding-left: 14px;\n color: var(--tps-muted);\n font-style: italic;\n }\n .tiptap pre.tiptap-code, .tiptap pre {\n background: #0f172a; color: #e2e8f0; padding: 12px 14px; border-radius: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px;\n overflow-x: auto;\n }\n .tiptap code {\n background: var(--tps-bg-soft); padding: 2px 6px; border-radius: 4px; font-size: 0.9em;\n }\n .tiptap hr { border: none; border-top: 1px solid var(--tps-line); margin: 1.5em 0; }\n .tiptap mark { padding: 0 2px; border-radius: 3px; }\n\n /* Image block with align + width. */\n .tiptap .tps-block-image { margin: 1em 0; display: flex; }\n .tiptap .tps-block-image[data-align='left'] { justify-content: flex-start; }\n .tiptap .tps-block-image[data-align='center'] { justify-content: center; }\n .tiptap .tps-block-image[data-align='right'] { justify-content: flex-end; }\n .tiptap .tps-block-image img { max-width: 100%; height: auto; border-radius: 8px; display: block; }\n .tiptap .tps-block-image.tps-img-small img { width: 40%; }\n .tiptap .tps-block-image.tps-img-medium img { width: 60%; }\n .tiptap .tps-block-image.tps-img-large img { width: 80%; }\n .tiptap .tps-block-image.tps-img-full img { width: 100%; }\n .tiptap .tps-block-image.ProseMirror-selectednode img,\n .tiptap .tps-block-image:has(img.ProseMirror-selectednode) img {\n outline: 2px solid var(--tps-primary); outline-offset: 2px;\n }\n\n /* Tables — alternating rows + resize handles. */\n .tiptap table.tps-rich-table, .tiptap table {\n border-collapse: collapse; width: 100%; margin: 1em 0; table-layout: fixed;\n }\n .tiptap table td, .tiptap table th {\n border: 1px solid var(--tps-line); padding: 8px 10px; vertical-align: top;\n position: relative; min-width: 40px;\n }\n .tiptap table th { background: var(--tps-bg-soft); font-weight: 700; text-align: left; }\n .tiptap table tbody tr:nth-child(even) td { background: rgba(15, 118, 110, 0.025); }\n .tiptap table .selectedCell::after {\n content: ''; position: absolute; inset: 0;\n background: rgba(15, 118, 110, 0.12); pointer-events: none;\n }\n .tiptap table .column-resize-handle {\n position: absolute; right: -2px; top: 0; bottom: -2px; width: 4px;\n background-color: var(--tps-primary); pointer-events: none;\n }\n .tiptap table p { margin: 0; }\n\n /* Columns. */\n .tiptap .tps-block-columns {\n display: grid; gap: 16px; margin: 1em 0;\n border: 1px dashed var(--tps-line); padding: 12px; border-radius: 8px;\n }\n .tiptap .tps-block-columns.tps-cols-2 { grid-template-columns: 1fr 1fr; }\n .tiptap .tps-block-columns.tps-cols-3 { grid-template-columns: repeat(3, 1fr); }\n .tiptap .tps-block-columns.tps-cols-4 { grid-template-columns: repeat(4, 1fr); }\n .tiptap .tps-block-column { padding: 8px; min-height: 40px; border-radius: 6px; }\n .tiptap .tps-block-column:hover { background: var(--tps-bg-soft); }\n\n /* Callout. */\n .tiptap .tps-block-callout {\n border-left: 4px solid var(--tps-primary);\n background: rgba(15, 118, 110, 0.05);\n padding: 12px 16px; border-radius: 6px; margin: 1em 0;\n }\n .tiptap .tps-block-callout.tps-callout-success {\n border-color: #059669; background: rgba(5, 150, 105, 0.06);\n }\n .tiptap .tps-block-callout.tps-callout-warning {\n border-color: #D97706; background: rgba(217, 119, 6, 0.07);\n }\n .tiptap .tps-block-callout.tps-callout-danger {\n border-color: #DC2626; background: rgba(220, 38, 38, 0.06);\n }\n\n /* Atom blocks (share, subscribe) — show as cards in the canvas. */\n .tiptap .tps-block-share, .tiptap .tps-block-subscribe {\n border: 1px solid var(--tps-line); border-radius: 8px;\n padding: 16px; margin: 1em 0; background: var(--tps-bg-soft);\n }\n .tiptap .tps-block-share-label, .tiptap .tps-block-subscribe-heading {\n font-weight: 700; margin-bottom: 8px; color: var(--tps-ink);\n }\n .tiptap .tps-block-share-row { display: flex; gap: 8px; flex-wrap: wrap; }\n .tiptap .tps-block-share-btn {\n padding: 6px 12px; background: #fff; border: 1px solid var(--tps-line);\n border-radius: 6px; text-decoration: none; color: var(--tps-ink);\n font-size: 13px; font-weight: 600;\n }\n .tiptap .tps-block-share-btn:hover { border-color: var(--tps-primary); color: var(--tps-primary); }\n .tiptap .tps-block-subscribe-form { display: flex; gap: 8px; margin-top: 8px; flex-wrap: wrap; }\n .tiptap .tps-block-subscribe-input {\n flex: 1; min-width: 200px; padding: 8px 12px;\n border: 1px solid var(--tps-line); border-radius: 6px; font-size: 14px;\n }\n .tiptap .tps-block-subscribe-button {\n padding: 8px 16px; background: var(--tps-primary); color: #fff;\n border: 0; border-radius: 6px; font-weight: 600; cursor: pointer;\n }\n .tiptap .tps-block-subscribe-button:hover { background: var(--tps-primary-dark); }\n .tiptap .tps-block-subscribe-body { color: var(--tps-muted); margin: 4px 0 8px; }\n\n /* Selected atom block highlight. */\n .tiptap .ProseMirror-selectednode.tps-block-share,\n .tiptap .ProseMirror-selectednode.tps-block-subscribe {\n outline: 2px solid var(--tps-primary); outline-offset: 2px;\n }\n `}</style>\n );\n}\n","// Custom TipTap node extensions for the Page Studio admin editor:\n// • CiqImage — image with width + align attributes (overrides @tiptap/extension-image\n// with extra attrs and richer renderHTML).\n// • Columns — a container of N columns (N is configurable: 2 or 3).\n// • Column — the per-column slot (only used as a child of Columns).\n// • Callout — a tone-colored info / warning / success card with editable body.\n// • ShareBlock — leaf node, renders as social share buttons on the public site.\n// • SubscribeBlock — leaf node, renders as a newsletter form.\n//\n// All blocks emit semantic HTML with stable `tps-block-*` classes. The same\n// classes are styled both inside the editor canvas and on the public site\n// (globals.css) so the WYSIWYG experience matches.\n\nimport { Node, mergeAttributes } from '@tiptap/core';\nimport Image from '@tiptap/extension-image';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\n\n// ---------------------------------------------------------------------------\n// Table cells with vertical alignment + alternating-row support\n// ---------------------------------------------------------------------------\nconst vAlignAttrs = {\n verticalAlign: {\n default: 'top',\n parseHTML: (el) =>\n el.style?.verticalAlign || el.getAttribute('data-valign') || 'top',\n renderHTML: (attrs) => ({\n 'data-valign': attrs.verticalAlign,\n style: `vertical-align: ${attrs.verticalAlign};`,\n }),\n },\n};\n\nexport const CiqTableCell = TableCell.extend({\n addAttributes() {\n return { ...this.parent?.(), ...vAlignAttrs };\n },\n});\n\nexport const CiqTableHeader = TableHeader.extend({\n addAttributes() {\n return { ...this.parent?.(), ...vAlignAttrs };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Image with alignment + width\n// ---------------------------------------------------------------------------\nexport const CiqImage = Image.extend({\n name: 'ciqImage',\n // Inline images don't get alignment — we use block images so we can wrap\n // them in a container div and apply text-align.\n inline: false,\n group: 'block',\n draggable: true,\n\n addAttributes() {\n return {\n ...this.parent?.(),\n align: {\n default: 'center',\n parseHTML: (el) => el.getAttribute('data-align') || 'center',\n renderHTML: (attrs) => ({ 'data-align': attrs.align }),\n },\n width: {\n default: 'medium', // 'small' | 'medium' | 'large' | 'full'\n parseHTML: (el) => el.getAttribute('data-width') || 'medium',\n renderHTML: (attrs) => ({ 'data-width': attrs.width }),\n },\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const { align, width, ...rest } = HTMLAttributes;\n return [\n 'div',\n {\n class: `tps-block-image tps-img-${width || 'medium'}`,\n 'data-align': align || 'center',\n },\n ['img', mergeAttributes(this.options.HTMLAttributes, rest)],\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div.tps-block-image > img',\n getAttrs: (img) => {\n const wrapper = img.closest('.tps-block-image');\n return {\n src: img.getAttribute('src'),\n alt: img.getAttribute('alt'),\n title: img.getAttribute('title'),\n align: wrapper?.getAttribute('data-align') || 'center',\n width:\n wrapper?.className.match(/tps-img-(small|medium|large|full)/)?.[1] ||\n 'medium',\n };\n },\n },\n // Fallback: legacy plain <img> tags\n { tag: 'img[src]:not([src^=\"data:\"])' },\n ];\n },\n});\n\n// ---------------------------------------------------------------------------\n// Column slot — a wrapper for content. Lives only inside Columns.\n// ---------------------------------------------------------------------------\nexport const Column = Node.create({\n name: 'column',\n group: 'column',\n // Allow any block content inside — paragraphs, headings, lists, images.\n content: 'block+',\n isolating: true,\n defining: true,\n\n parseHTML() {\n return [{ tag: 'div.tps-block-column' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, { class: 'tps-block-column' }),\n 0,\n ];\n },\n});\n\n// ---------------------------------------------------------------------------\n// Columns container\n// ---------------------------------------------------------------------------\nexport const Columns = Node.create({\n name: 'columns',\n group: 'block',\n content: 'column{2,4}', // 2–4 columns\n defining: true,\n\n addAttributes() {\n return {\n cols: {\n default: 2,\n parseHTML: (el) => Number(el.getAttribute('data-cols')) || 2,\n renderHTML: (attrs) => ({ 'data-cols': attrs.cols }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div.tps-block-columns' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const cols = HTMLAttributes['data-cols'] || HTMLAttributes.cols || 2;\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: `tps-block-columns tps-cols-${cols}`,\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n insertColumns:\n (cols = 2) =>\n ({ commands }) => {\n const n = Math.max(2, Math.min(4, Number(cols) || 2));\n return commands.insertContent({\n type: this.name,\n attrs: { cols: n },\n content: Array.from({ length: n }, () => ({\n type: 'column',\n content: [\n { type: 'paragraph' },\n ],\n })),\n });\n },\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Callout — info / warning / success card\n// ---------------------------------------------------------------------------\nexport const Callout = Node.create({\n name: 'callout',\n group: 'block',\n content: 'block+',\n defining: true,\n\n addAttributes() {\n return {\n tone: {\n default: 'info', // 'info' | 'success' | 'warning' | 'danger'\n parseHTML: (el) => el.getAttribute('data-tone') || 'info',\n renderHTML: (attrs) => ({ 'data-tone': attrs.tone }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div.tps-block-callout' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const tone = HTMLAttributes['data-tone'] || 'info';\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: `tps-block-callout tps-callout-${tone}`,\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n insertCallout:\n (tone = 'info') =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: { tone },\n content: [\n {\n type: 'paragraph',\n content: [{ type: 'text', text: 'Highlight something important here.' }],\n },\n ],\n });\n },\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Share block — leaf, renders as social share buttons (rendered statically\n// on the public site, no JS needed).\n// ---------------------------------------------------------------------------\nexport const ShareBlock = Node.create({\n name: 'shareBlock',\n group: 'block',\n atom: true,\n selectable: true,\n draggable: true,\n\n addAttributes() {\n return {\n label: {\n default: 'Share this page',\n parseHTML: (el) => el.getAttribute('data-label') || 'Share this page',\n renderHTML: (attrs) => ({ 'data-label': attrs.label }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div.tps-block-share' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const label = HTMLAttributes['data-label'] || 'Share this page';\n // Static markup; client-side share URLs use the canonical page URL via\n // window.location at render time (in the public-side hydration script,\n // future work) — for now, links use a generic share intent.\n return [\n 'div',\n mergeAttributes(HTMLAttributes, { class: 'tps-block-share' }),\n ['div', { class: 'tps-block-share-label' }, label],\n [\n 'div',\n { class: 'tps-block-share-row' },\n [\n 'a',\n {\n class: 'tps-block-share-btn',\n href: 'https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fpagestudio.dev',\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n 'LinkedIn',\n ],\n [\n 'a',\n {\n class: 'tps-block-share-btn',\n href: 'mailto:?subject=Page%20Studio&body=Thought%20you%27d%20find%20this%20interesting%3A%20https%3A%2F%2Fpagestudio.dev',\n },\n 'Email',\n ],\n [\n 'a',\n {\n class: 'tps-block-share-btn',\n href: 'https://twitter.com/intent/tweet?url=https%3A%2F%2Fpagestudio.dev',\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n 'X / Twitter',\n ],\n ],\n ];\n },\n\n addCommands() {\n return {\n insertShareBlock:\n () =>\n ({ commands }) =>\n commands.insertContent({ type: this.name }),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Subscribe block — newsletter signup. Posts to /api/leads with\n// source=newsletter; the existing leads endpoint accepts that.\n// ---------------------------------------------------------------------------\nexport const SubscribeBlock = Node.create({\n name: 'subscribeBlock',\n group: 'block',\n atom: true,\n selectable: true,\n draggable: true,\n\n addAttributes() {\n return {\n heading: {\n default: 'Stay in the loop',\n parseHTML: (el) => el.getAttribute('data-heading') || 'Stay in the loop',\n renderHTML: (attrs) => ({ 'data-heading': attrs.heading }),\n },\n body: {\n default: 'One short email when we publish — never more.',\n parseHTML: (el) => el.getAttribute('data-body') || '',\n renderHTML: (attrs) => ({ 'data-body': attrs.body }),\n },\n button: {\n default: 'Subscribe',\n parseHTML: (el) => el.getAttribute('data-button') || 'Subscribe',\n renderHTML: (attrs) => ({ 'data-button': attrs.button }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div.tps-block-subscribe' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const heading = HTMLAttributes['data-heading'] || 'Stay in the loop';\n const body = HTMLAttributes['data-body'] || '';\n const button = HTMLAttributes['data-button'] || 'Subscribe';\n return [\n 'div',\n mergeAttributes(HTMLAttributes, { class: 'tps-block-subscribe' }),\n ['h3', { class: 'tps-block-subscribe-heading' }, heading],\n body ? ['p', { class: 'tps-block-subscribe-body' }, body] : '',\n [\n 'form',\n { class: 'tps-block-subscribe-form', action: '/api/leads', method: 'post' },\n ['input', { type: 'hidden', name: 'source', value: 'newsletter' }],\n [\n 'input',\n {\n type: 'email',\n name: 'email',\n required: 'true',\n placeholder: 'you@company.com',\n class: 'tps-block-subscribe-input',\n },\n ],\n ['button', { type: 'submit', class: 'tps-block-subscribe-button' }, button],\n ],\n ];\n },\n\n addCommands() {\n return {\n insertSubscribeBlock:\n () =>\n ({ commands }) =>\n commands.insertContent({ type: this.name }),\n };\n },\n});\n","'use client';\n\n// Edit-history viewer for a single page key. Pulls the revision list from\n// the backend on mount, lets the admin select two snapshots to compare\n// (current page vs. a revision, by default), shows a JSON-level side-by-side\n// diff plus a per-field summary, and supports one-click restore.\n\nimport { useEffect, useMemo, useState, useTransition } from 'react';\nimport {\n Alert,\n Button,\n Card,\n Empty,\n List,\n Popconfirm,\n Segmented,\n Space,\n Spin,\n Tag,\n Tooltip,\n Typography,\n App as AntdApp,\n} from 'antd';\nimport {\n ReloadOutlined,\n HistoryOutlined,\n RollbackOutlined,\n UserOutlined,\n ClockCircleOutlined,\n EditOutlined,\n} from '@ant-design/icons';\nimport { diffLines } from 'diff';\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\n\ndayjs.extend(relativeTime);\n\nconst { Text, Paragraph } = Typography;\n\nfunction notConfigured(name) {\n return () => {\n throw new Error(\n `@techrox/page-studio-form: HistoryPanel was used without a \\`${name}\\` adapter. ` +\n 'Pass loadHistory + restoreRevision callbacks.',\n );\n };\n}\n\nexport default function HistoryPanel({\n pageKey,\n currentPage,\n onRestored,\n loadHistory = notConfigured('loadHistory'),\n restoreRevision = notConfigured('restoreRevision'),\n}) {\n const { message, modal } = AntdApp.useApp();\n const [pending, startTransition] = useTransition();\n const [loading, setLoading] = useState(false);\n const [revisions, setRevisions] = useState([]);\n const [error, setError] = useState(null);\n const [selectedId, setSelectedId] = useState(null);\n const [view, setView] = useState('summary'); // 'summary' | 'json'\n\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const { revisions } = await loadHistory(pageKey);\n setRevisions(revisions || []);\n if (revisions?.length && !selectedId) {\n setSelectedId(revisions[0]._id);\n }\n } catch (e) {\n setError(e.message);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageKey]);\n\n const selected = useMemo(\n () => revisions.find((r) => r._id === selectedId) || null,\n [revisions, selectedId],\n );\n\n const onRestore = (rev) => {\n modal.confirm({\n title: `Restore version ${rev.version}?`,\n content: (\n <span>\n The current page will be replaced with this snapshot from{' '}\n <Text strong>{dayjs(rev.created_at).format('YYYY-MM-DD HH:mm')}</Text>.\n A new revision is logged so you can undo this restore.\n </span>\n ),\n okText: 'Restore',\n okButtonProps: { danger: true },\n onOk: () =>\n new Promise((resolve, reject) => {\n startTransition(async () => {\n try {\n await restoreRevision(pageKey, rev._id);\n message.success(`Restored version ${rev.version}.`);\n onRestored?.();\n await load();\n resolve();\n } catch (e) {\n message.error(e.message || 'Restore failed.');\n reject(e);\n }\n });\n }),\n });\n };\n\n if (loading) {\n return (\n <Card size=\"small\">\n <div style={{ textAlign: 'center', padding: 40 }}>\n <Spin />\n <div style={{ marginTop: 12, color: 'var(--tps-muted)', fontSize: 13 }}>\n Loading history…\n </div>\n </div>\n </Card>\n );\n }\n\n if (error) {\n return <Alert type=\"error\" showIcon message=\"Could not load history\" description={error} />;\n }\n\n if (!revisions.length) {\n return (\n <Card size=\"small\">\n <Empty\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n description={\n <Space direction=\"vertical\" size={4}>\n <Text strong>No history yet</Text>\n <Text type=\"secondary\" style={{ fontSize: 13 }}>\n Every save creates a revision. They&rsquo;ll appear here once you save changes.\n </Text>\n </Space>\n }\n />\n </Card>\n );\n }\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(260px, 320px) minmax(0, 1fr)',\n gap: 16,\n }}\n >\n <Card\n size=\"small\"\n title={\n <Space>\n <HistoryOutlined />\n <span>{revisions.length} revision{revisions.length === 1 ? '' : 's'}</span>\n </Space>\n }\n extra={\n <Tooltip title=\"Refresh\">\n <Button size=\"small\" type=\"text\" icon={<ReloadOutlined />} onClick={load} />\n </Tooltip>\n }\n styles={{ body: { padding: 0, maxHeight: '70vh', overflowY: 'auto' } }}\n >\n <List\n dataSource={revisions}\n renderItem={(r, i) => {\n const isSelected = r._id === selectedId;\n return (\n <List.Item\n onClick={() => setSelectedId(r._id)}\n style={{\n padding: '12px 16px',\n cursor: 'pointer',\n background: isSelected ? 'rgba(15, 118, 110, 0.08)' : 'transparent',\n borderLeft: isSelected\n ? '3px solid var(--tps-primary)'\n : '3px solid transparent',\n }}\n >\n <div style={{ width: '100%' }}>\n <Space size={6} wrap>\n <Tag color={r.action === 'restore' ? 'orange' : 'geekblue'}>\n v{r.version}\n </Tag>\n {i === 0 && <Tag color=\"green\">latest</Tag>}\n {r.action === 'restore' && (\n <Tag icon={<RollbackOutlined />} color=\"orange\">\n restore\n </Tag>\n )}\n {r.snapshot?.published === false && <Tag>draft</Tag>}\n </Space>\n <div style={{ fontSize: 13, marginTop: 6, fontWeight: 500 }}>\n {r.snapshot?.title || <Text type=\"secondary\">(no title)</Text>}\n </div>\n <Space size={10} style={{ fontSize: 12, color: 'var(--tps-muted)', marginTop: 4 }} wrap>\n <Tooltip title={dayjs(r.created_at).format('YYYY-MM-DD HH:mm:ss')}>\n <span>\n <ClockCircleOutlined /> {dayjs(r.created_at).fromNow()}\n </span>\n </Tooltip>\n {r.created_by_email && (\n <Tooltip title={r.created_by_email}>\n <span>\n <UserOutlined /> {abbreviateEmail(r.created_by_email)}\n </span>\n </Tooltip>\n )}\n </Space>\n </div>\n </List.Item>\n );\n }}\n />\n </Card>\n\n <div>\n {selected ? (\n <RevisionDetail\n revision={selected}\n currentPage={currentPage}\n view={view}\n setView={setView}\n onRestore={() => onRestore(selected)}\n restoring={pending}\n />\n ) : (\n <Card size=\"small\">\n <Text type=\"secondary\">Select a revision on the left to see its diff.</Text>\n </Card>\n )}\n </div>\n </div>\n );\n}\n\nfunction RevisionDetail({ revision, currentPage, view, setView, onRestore, restoring }) {\n const left = currentPage || {};\n const right = revision.snapshot || {};\n\n const summary = useMemo(() => fieldChangeSummary(left, right), [left, right]);\n const jsonDiff = useMemo(() => makeJsonDiff(left, right), [left, right]);\n\n return (\n <Card\n size=\"small\"\n title={\n <Space>\n <Tag color={revision.action === 'restore' ? 'orange' : 'geekblue'}>\n Version {revision.version}\n </Tag>\n <Text type=\"secondary\" style={{ fontSize: 13 }}>\n {dayjs(revision.created_at).format('YYYY-MM-DD HH:mm:ss')}\n </Text>\n {revision.created_by_email && (\n <Text type=\"secondary\" style={{ fontSize: 13 }}>\n by {revision.created_by_email}\n </Text>\n )}\n </Space>\n }\n extra={\n <Space>\n <Segmented\n size=\"small\"\n value={view}\n onChange={setView}\n options={[\n { label: 'Summary', value: 'summary' },\n { label: 'JSON diff', value: 'json' },\n ]}\n />\n <Popconfirm\n title=\"Restore this version?\"\n description=\"A new revision will be logged so you can undo.\"\n onConfirm={onRestore}\n okText=\"Restore\"\n okButtonProps={{ danger: true }}\n >\n <Button danger icon={<RollbackOutlined />} loading={restoring}>\n Restore\n </Button>\n </Popconfirm>\n </Space>\n }\n >\n <Paragraph type=\"secondary\" style={{ fontSize: 12, marginBottom: 12 }}>\n Comparing <Text strong>current</Text> (left) → <Text strong>this revision</Text> (right).\n Restore replaces the current page with the right side.\n </Paragraph>\n\n {view === 'summary' ? (\n <SummaryView summary={summary} />\n ) : (\n <JsonDiffView diff={jsonDiff} />\n )}\n </Card>\n );\n}\n\nfunction SummaryView({ summary }) {\n if (!summary.length) {\n return <Alert type=\"info\" showIcon message=\"No differences — this revision matches the current page.\" />;\n }\n return (\n <Space direction=\"vertical\" size={10} style={{ width: '100%' }}>\n {summary.map((row) => (\n <Card key={row.path} size=\"small\" styles={{ body: { padding: 12 } }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6 }}>\n <Space>\n <EditOutlined style={{ color: 'var(--tps-primary)' }} />\n <Text code style={{ fontSize: 12 }}>{row.path}</Text>\n </Space>\n <Tag color={row.kind === 'changed' ? 'gold' : row.kind === 'added' ? 'green' : 'red'}>\n {row.kind}\n </Tag>\n </div>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',\n gap: 10,\n }}\n >\n <DiffCell label=\"Current\" value={row.current} kind=\"current\" />\n <DiffCell label=\"This revision\" value={row.next} kind=\"next\" />\n </div>\n </Card>\n ))}\n </Space>\n );\n}\n\nfunction DiffCell({ label, value, kind }) {\n return (\n <div\n style={{\n background: kind === 'current' ? 'rgba(220,38,38,0.06)' : 'rgba(5,150,105,0.06)',\n border: '1px solid var(--tps-line)',\n borderRadius: 6,\n padding: 8,\n }}\n >\n <div style={{ fontSize: 11, color: 'var(--tps-muted)', marginBottom: 4 }}>{label}</div>\n <pre\n style={{\n margin: 0,\n fontSize: 12,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: 'var(--tps-ink)',\n }}\n >\n {formatScalar(value)}\n </pre>\n </div>\n );\n}\n\nfunction JsonDiffView({ diff }) {\n return (\n <div\n style={{\n background: '#0F172A',\n borderRadius: 6,\n fontSize: 12,\n lineHeight: 1.6,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n maxHeight: '60vh',\n overflow: 'auto',\n padding: 14,\n // Constrain to parent so long lines wrap instead of forcing the\n // History tab horizontally (prior bug: the diff blew past the card).\n maxWidth: '100%',\n }}\n >\n {diff.map((part, i) => {\n const bg = part.added\n ? 'rgba(16,185,129,0.18)'\n : part.removed\n ? 'rgba(239,68,68,0.20)'\n : 'transparent';\n const color = part.added ? '#86efac' : part.removed ? '#fca5a5' : '#cbd5e1';\n const prefix = part.added ? '+ ' : part.removed ? '- ' : ' ';\n return (\n <div key={i} style={{ background: bg, color }}>\n {part.value\n .split('\\n')\n .filter((l, idx, arr) => !(l === '' && idx === arr.length - 1))\n .map((line, j) => (\n <div\n key={j}\n style={{\n padding: '0 6px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'anywhere',\n }}\n >\n {prefix}\n {line}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Diff helpers\n// ---------------------------------------------------------------------------\n\nfunction makeJsonDiff(left, right) {\n const a = JSON.stringify(snapshot(left), null, 2);\n const b = JSON.stringify(snapshot(right), null, 2);\n return diffLines(a, b);\n}\n\nfunction snapshot(p) {\n return {\n title: p?.title || '',\n published: p?.published !== false,\n seo: p?.seo || {},\n content: p?.content || {},\n };\n}\n\n// Compute a flat list of field-level differences between left and right\n// snapshots. We walk seo + content keys and report adds/removes/changes.\nfunction fieldChangeSummary(left, right) {\n const out = [];\n const a = snapshot(left);\n const b = snapshot(right);\n\n if (a.title !== b.title) {\n out.push({ path: 'title', kind: classify(a.title, b.title), current: a.title, next: b.title });\n }\n if (a.published !== b.published) {\n out.push({\n path: 'published',\n kind: 'changed',\n current: a.published,\n next: b.published,\n });\n }\n for (const k of unionKeys(a.seo, b.seo)) {\n const av = a.seo[k];\n const bv = b.seo[k];\n if (!equal(av, bv)) {\n out.push({ path: `seo.${k}`, kind: classify(av, bv), current: av, next: bv });\n }\n }\n for (const k of unionKeys(a.content, b.content)) {\n const av = a.content[k];\n const bv = b.content[k];\n if (!equal(av, bv)) {\n out.push({ path: `content.${k}`, kind: classify(av, bv), current: av, next: bv });\n }\n }\n return out;\n}\n\nfunction unionKeys(a, b) {\n const s = new Set([...Object.keys(a || {}), ...Object.keys(b || {})]);\n return Array.from(s).sort();\n}\n\nfunction classify(a, b) {\n const aEmpty = isEmpty(a);\n const bEmpty = isEmpty(b);\n if (aEmpty && !bEmpty) return 'added';\n if (!aEmpty && bEmpty) return 'removed';\n return 'changed';\n}\n\nfunction isEmpty(v) {\n if (v == null) return true;\n if (typeof v === 'string') return v.trim() === '';\n if (Array.isArray(v)) return v.length === 0;\n if (typeof v === 'object') return Object.keys(v).length === 0;\n return false;\n}\n\nfunction equal(a, b) {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== typeof b) return false;\n if (Array.isArray(a) || Array.isArray(b) || typeof a === 'object') {\n return JSON.stringify(a) === JSON.stringify(b);\n }\n return false;\n}\n\nfunction formatScalar(v) {\n if (v === undefined || v === null) return '—';\n if (typeof v === 'string') return v || '—';\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n return v.length ? v.join('\\n') : '—';\n }\n return JSON.stringify(v, null, 2);\n}\n\nfunction abbreviateEmail(email) {\n if (!email) return '';\n const [name, domain] = email.split('@');\n if (!domain) return email;\n return `${name}@${domain.split('.')[0]}`;\n}\n"],"mappings":"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","names":["import_react","import_antd","import_icons","import_core","import_react","TableCell","TableHeader","Image","AntTypography","StarterKit","Underline","Link","Placeholder","editor","TextAlign","TextStyle","Highlight","Table","TableRow","TaskList","TaskItem","CharacterCount","Typography","antdMessage","import_react","import_antd","import_icons","import_jsx_runtime","dayjs","relativeTime","Text","AntdApp","revisions","import_jsx_runtime","Text","Paragraph","notConfigured","AntdApp"]}