@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/PageStudioForm.jsx","../src/RichText.jsx","../src/CustomBlocks.js","../src/HistoryPanel.jsx"],"sourcesContent":["'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":["useEffect","useState","useTransition","Form","Input","Button","Space","Tabs","Alert","AntdApp","Popconfirm","Typography","Card","Segmented","DeleteOutlined","PlusOutlined","ReloadOutlined","editor","useEffect","useMemo","useState","Button","Space","Tag","Tooltip","Typography","EditOutlined","jsx","jsxs","Text","revisions","jsx","jsxs","Text","Paragraph","Typography","notConfigured","AntdApp","Form","useTransition","useState","useEffect","Space","Button","Popconfirm","DeleteOutlined","Alert","Tabs","Input","Card","PlusOutlined","Segmented","ReloadOutlined"]}
package/package.json ADDED
@@ -0,0 +1,118 @@
1
+ {
2
+ "name": "@techrox/page-studio-form",
3
+ "version": "1.0.0",
4
+ "description": "Schema-driven structured-form page editor for React. Typed fields per page key, repeaters, TipTap rich text, live preview, revision history. Companion to @techrox/page-studio for content-shaped pages where layout is fixed.",
5
+ "license": "MIT",
6
+ "author": "techrox",
7
+ "homepage": "https://github.com/techrox/page-studio#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/techrox/page-studio.git",
11
+ "directory": "packages/form"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/techrox/page-studio/issues"
15
+ },
16
+ "type": "module",
17
+ "main": "./dist/index.cjs",
18
+ "module": "./dist/index.js",
19
+ "exports": {
20
+ ".": {
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs"
23
+ },
24
+ "./styles.css": "./src/styles.css"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "src/styles.css",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "sideEffects": [
33
+ "*.css"
34
+ ],
35
+ "peerDependencies": {
36
+ "@ant-design/icons": ">=5",
37
+ "@dnd-kit/core": ">=6",
38
+ "@dnd-kit/sortable": ">=10",
39
+ "@dnd-kit/utilities": ">=3",
40
+ "@tiptap/core": ">=2",
41
+ "@tiptap/extension-character-count": ">=2",
42
+ "@tiptap/extension-color": ">=2",
43
+ "@tiptap/extension-highlight": ">=2",
44
+ "@tiptap/extension-image": ">=2",
45
+ "@tiptap/extension-link": ">=2",
46
+ "@tiptap/extension-placeholder": ">=2",
47
+ "@tiptap/extension-table": ">=2",
48
+ "@tiptap/extension-table-row": ">=2",
49
+ "@tiptap/extension-task-item": ">=2",
50
+ "@tiptap/extension-task-list": ">=2",
51
+ "@tiptap/extension-text-align": ">=2",
52
+ "@tiptap/extension-text-style": ">=2",
53
+ "@tiptap/extension-typography": ">=2",
54
+ "@tiptap/extension-underline": ">=2",
55
+ "@tiptap/react": ">=2",
56
+ "@tiptap/starter-kit": ">=2",
57
+ "antd": ">=5",
58
+ "dayjs": ">=1",
59
+ "diff": ">=5",
60
+ "react": ">=18",
61
+ "react-dom": ">=18"
62
+ },
63
+ "devDependencies": {
64
+ "@ant-design/icons": "^5.4.0",
65
+ "@dnd-kit/core": "^6.3.1",
66
+ "@dnd-kit/sortable": "^10.0.0",
67
+ "@dnd-kit/utilities": "^3.2.2",
68
+ "@tiptap/core": "^2.27.2",
69
+ "@tiptap/extension-character-count": "^2.27.2",
70
+ "@tiptap/extension-color": "^2.27.2",
71
+ "@tiptap/extension-highlight": "^2.27.2",
72
+ "@tiptap/extension-image": "^2.27.2",
73
+ "@tiptap/extension-link": "^2.27.2",
74
+ "@tiptap/extension-placeholder": "^2.27.2",
75
+ "@tiptap/extension-table": "^2.27.2",
76
+ "@tiptap/extension-table-cell": "^2.27.2",
77
+ "@tiptap/extension-table-header": "^2.27.2",
78
+ "@tiptap/extension-table-row": "^2.27.2",
79
+ "@tiptap/extension-task-item": "^2.27.2",
80
+ "@tiptap/extension-task-list": "^2.27.2",
81
+ "@tiptap/extension-text-align": "^2.27.2",
82
+ "@tiptap/extension-text-style": "^2.27.2",
83
+ "@tiptap/extension-typography": "^2.27.2",
84
+ "@tiptap/extension-underline": "^2.27.2",
85
+ "@tiptap/react": "^2.6.6",
86
+ "@tiptap/starter-kit": "^2.6.6",
87
+ "antd": "^5.19.0",
88
+ "dayjs": "^1.11.11",
89
+ "diff": "^9.0.0",
90
+ "react": "^18.3.1",
91
+ "react-dom": "^18.3.1"
92
+ },
93
+ "publishConfig": {
94
+ "access": "public"
95
+ },
96
+ "keywords": [
97
+ "form-editor",
98
+ "page-editor",
99
+ "structured-content",
100
+ "tiptap",
101
+ "rich-text",
102
+ "wysiwyg",
103
+ "cms",
104
+ "headless-cms",
105
+ "react",
106
+ "antd",
107
+ "page-studio"
108
+ ],
109
+ "engines": {
110
+ "node": ">=18"
111
+ },
112
+ "scripts": {
113
+ "build": "tsup",
114
+ "dev": "tsup --watch",
115
+ "test": "vitest run",
116
+ "test:watch": "vitest"
117
+ }
118
+ }
package/src/styles.css ADDED
@@ -0,0 +1,20 @@
1
+ /* @techrox/page-studio-form — theme tokens with sensible defaults.
2
+ * Hosts can override any of these on a parent element (typically :root or
3
+ * the AntD App wrapper) without touching package internals.
4
+ *
5
+ * The blocks and editor packages share the same `--tps-*` tokens; keeping
6
+ * the names consistent means a single CSS override at the host level
7
+ * re-themes all three packages together.
8
+ */
9
+
10
+ :root {
11
+ --tps-primary: var(--tps-primary, #0F766E);
12
+ --tps-primary-dark: var(--tps-primary-dark, #0B5550);
13
+ --tps-accent: var(--tps-accent, #F59E0B);
14
+ --tps-accent-dark: var(--tps-accent-dark, #B45309);
15
+ --tps-ink: var(--tps-ink, #0F172A);
16
+ --tps-muted: var(--tps-muted, #64748B);
17
+ --tps-bg: var(--tps-bg, #FAFAF7);
18
+ --tps-bg-soft: var(--tps-bg-soft, #F8FAFC);
19
+ --tps-radius: var(--tps-radius, 10px);
20
+ }