@refinex-md/model 0.1.0-canary.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.
- package/LICENSE +21 -0
- package/README.md +28 -0
- package/dist/index.d.ts +162 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1046 -0
- package/dist/index.js.map +1 -0
- package/dist/rich-blocks.d.ts +20 -0
- package/dist/rich-blocks.d.ts.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/rich-blocks.ts","../src/index.ts"],"sourcesContent":["import { tableNodes } from 'prosemirror-tables';\nimport type { NodeSpec } from 'prosemirror-model';\n\nimport type { RefinexNodeExtension, RefinexSchemaExtension } from './index';\n\nconst richBlockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n};\n\nconst richCapabilities = ['doc:read', 'doc:write'];\n\nfunction defineNode(\n name: string,\n spec: NodeSpec,\n options: {\n readonly blockId?: 'required' | 'forbidden';\n readonly fallback?: RefinexNodeExtension['fallback'];\n readonly markdown?: string;\n } = {},\n): RefinexNodeExtension {\n const blockId = options.blockId ?? 'forbidden';\n return {\n kind: 'node',\n name,\n version: '1.0.0',\n spec: { ...spec, refinexBlockId: blockId },\n blockId,\n capabilities: richCapabilities,\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown ? { format: options.markdown } : undefined,\n };\n}\n\nexport type ImageBlockAlign = 'left' | 'center' | 'right';\nexport type ImageBlockStatus = 'empty' | 'ready' | 'uploading' | 'error';\nexport type CalloutKind = 'note' | 'tip' | 'important' | 'warning' | 'caution';\nexport type EmbedType = 'bookmark' | 'iframe' | 'oembed';\nexport type EmbedStatus = 'unresolved' | 'loading' | 'ready' | 'error';\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted';\nexport type TableLayout = 'auto' | 'fixed';\nexport type MathBlockAlign = 'center' | 'left';\nexport interface ToggleItemAttrs {\n readonly collapsed: boolean;\n readonly blockId: string | null;\n readonly metadata: Record<string, unknown> | null;\n readonly permissions: Record<string, unknown> | null;\n}\n\nexport const richBlockExtensionNames = [\n 'image_block',\n 'callout',\n 'task_list',\n 'task_item',\n 'toggle_list',\n 'toggle_item',\n 'embed_block',\n 'divider',\n 'table',\n 'table_row',\n 'table_cell',\n 'table_header',\n 'math_inline',\n 'math_block',\n] as const;\n\nexport type RichBlockExtensionName = (typeof richBlockExtensionNames)[number];\n\nexport function createRichBlockSchemaExtensions(): RefinexSchemaExtension[] {\n const specs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom) {\n const align = dom.getAttribute('data-align') ?? dom.style.textAlign;\n return align === 'left' || align === 'center' || align === 'right' ? align : null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-align'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} text-align: ${String(value)};`.trim();\n }\n },\n },\n background: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-background') ?? dom.style.backgroundColor ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-background'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} background-color: ${String(value)};`.trim();\n }\n },\n },\n metadata: {\n default: null,\n getFromDOM() {\n return null;\n },\n setDOMAttr() {\n return undefined;\n },\n },\n colwidth: {\n default: null,\n getFromDOM(dom) {\n const value = dom.getAttribute('data-colwidth');\n const width = value ? Number.parseInt(value, 10) : Number.NaN;\n return Number.isFinite(width) && width > 0 ? [width] : null;\n },\n setDOMAttr(value, attrs) {\n if (!Array.isArray(value)) return;\n const width = Number(value[0]);\n if (!Number.isFinite(width) || width <= 0) return;\n attrs['data-colwidth'] = String(width);\n attrs.style =\n `${String(attrs.style ?? '')} width: ${String(width)}px; min-width: ${String(width)}px;`.trim();\n },\n },\n },\n }) as Record<'table' | 'table_row' | 'table_cell' | 'table_header', NodeSpec>;\n\n return [\n defineNode(\n 'image_block',\n {\n group: 'block',\n content: 'inline*',\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n align: { default: 'center' satisfies ImageBlockAlign },\n widthPercent: { default: 100 },\n aspectRatio: { default: null },\n status: { default: 'ready' satisfies ImageBlockStatus },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n isolating: true,\n parseDOM: [\n {\n tag: 'figure[data-rmd-image-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const image = el.querySelector('img');\n return {\n src: image?.getAttribute('src') ?? '',\n alt: image?.getAttribute('alt'),\n title: image?.getAttribute('title'),\n align: normalizeAlign(el.getAttribute('data-align')),\n widthPercent: normalizePercent(el.getAttribute('data-width')),\n aspectRatio: el.getAttribute('data-aspect-ratio'),\n status: normalizeImageStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n const width = normalizePercent(node.attrs.widthPercent);\n return [\n 'figure',\n {\n 'data-rmd-image-block': 'true',\n 'data-align': normalizeAlign(node.attrs.align),\n 'data-width': String(width),\n 'data-status': normalizeImageStatus(node.attrs.status),\n class: 'rmd-image-block',\n },\n [\n 'img',\n {\n src: node.attrs.src as string,\n alt: (node.attrs.alt as string | null) ?? '',\n title: node.attrs.title as string | null,\n style: `width: ${String(width)}%;`,\n },\n ],\n ['figcaption', 0],\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'rich-image-block' },\n ),\n\n defineNode(\n 'callout',\n {\n group: 'block',\n content: 'block+',\n attrs: {\n kind: { default: 'note' satisfies CalloutKind },\n title: { default: null },\n icon: { default: null },\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'aside[data-rmd-callout]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n kind: normalizeCalloutKind(el.getAttribute('data-kind')),\n title: el.getAttribute('data-title'),\n icon: el.getAttribute('data-icon'),\n collapsed: el.getAttribute('data-collapsed') === 'true',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'aside',\n {\n 'data-rmd-callout': 'true',\n 'data-kind': normalizeCalloutKind(node.attrs.kind),\n 'data-title': node.attrs.title as string | null,\n 'data-icon': node.attrs.icon as string | null,\n 'data-collapsed': String(Boolean(node.attrs.collapsed)),\n class: `rmd-callout rmd-callout-${normalizeCalloutKind(node.attrs.kind)}`,\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-alert' },\n ),\n\n defineNode(\n 'task_list',\n {\n group: 'block',\n content: 'task_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-task-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-task-list': 'true', class: 'rmd-task-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'task_item',\n {\n content: 'paragraph block*',\n attrs: {\n checked: { default: false },\n ...richBlockAttrs,\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-task-item]',\n getAttrs(dom) {\n return { checked: (dom as HTMLElement).getAttribute('data-checked') === 'true' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-rmd-task-item': 'true',\n 'data-checked': String(Boolean(node.attrs.checked)),\n class: 'rmd-task-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'toggle_list',\n {\n group: 'block',\n content: 'toggle_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-toggle-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-toggle-list': 'true', class: 'rmd-toggle-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'toggle_item',\n {\n content: 'paragraph block*',\n attrs: {\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-toggle-item]',\n getAttrs(dom) {\n return {\n collapsed: normalizeToggleCollapsed(\n (dom as HTMLElement).getAttribute('data-collapsed'),\n ),\n };\n },\n },\n ],\n toDOM(node) {\n const collapsed = normalizeToggleCollapsed(node.attrs.collapsed);\n return [\n 'li',\n {\n 'data-rmd-toggle-item': 'true',\n 'data-collapsed': String(collapsed),\n class: 'rmd-toggle-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'embed_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n url: {},\n provider: { default: null },\n embedType: { default: 'bookmark' satisfies EmbedType },\n title: { default: null },\n description: { default: null },\n thumbnail: { default: null },\n html: { default: null },\n aspectRatio: { default: null },\n status: { default: 'unresolved' satisfies EmbedStatus },\n error: { default: null },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'a[data-rmd-embed-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n url: el.getAttribute('href') ?? '',\n title: el.getAttribute('data-title') ?? el.textContent,\n provider: el.getAttribute('data-provider'),\n embedType: normalizeEmbedType(el.getAttribute('data-embed-type')),\n status: normalizeEmbedStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'a',\n {\n 'data-rmd-embed-block': 'true',\n href: node.attrs.url as string,\n 'data-provider': node.attrs.provider as string | null,\n 'data-embed-type': normalizeEmbedType(node.attrs.embedType),\n 'data-status': normalizeEmbedStatus(node.attrs.status),\n class: 'rmd-embed-block',\n },\n (node.attrs.title as string | null) ?? (node.attrs.url as string),\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-block' },\n ),\n\n defineNode(\n 'divider',\n {\n group: 'block',\n attrs: {\n variant: { default: 'solid' satisfies DividerVariant },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'hr[data-rmd-divider]',\n getAttrs(dom) {\n return {\n variant: normalizeDividerVariant((dom as HTMLElement).getAttribute('data-variant')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'hr',\n {\n 'data-rmd-divider': 'true',\n 'data-variant': normalizeDividerVariant(node.attrs.variant),\n class: `rmd-divider rmd-divider-${normalizeDividerVariant(node.attrs.variant)}`,\n },\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'thematic-break' },\n ),\n\n defineNode(\n 'table',\n {\n ...specs.table,\n attrs: {\n ...(specs.table.attrs ?? {}),\n columnWidths: { default: null },\n layout: { default: 'auto' satisfies TableLayout },\n caption: { default: null },\n ...richBlockAttrs,\n },\n isolating: true,\n selectable: true,\n draggable: true,\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'gfm-table' },\n ),\n defineNode('table_row', specs.table_row, { fallback: 'drop', markdown: 'gfm-table' }),\n defineNode('table_cell', specs.table_cell, { fallback: 'paragraph', markdown: 'gfm-table' }),\n defineNode('table_header', specs.table_header, {\n fallback: 'paragraph',\n markdown: 'gfm-table',\n }),\n\n defineNode(\n 'math_inline',\n {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n tex: {},\n metadata: { default: null },\n },\n parseDOM: [\n {\n tag: 'span[data-rmd-math-inline]',\n getAttrs(dom) {\n return { tex: (dom as HTMLElement).getAttribute('data-tex') ?? '' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-rmd-math-inline': 'true',\n 'data-tex': node.attrs.tex as string,\n class: 'rmd-math-inline',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { fallback: 'paragraph', markdown: 'remark-math' },\n ),\n\n defineNode(\n 'math_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n tex: {},\n numbered: { default: false },\n label: { default: null },\n align: { default: 'center' satisfies MathBlockAlign },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'div[data-rmd-math-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n tex: el.getAttribute('data-tex') ?? el.textContent ?? '',\n numbered: el.getAttribute('data-numbered') === 'true',\n label: el.getAttribute('data-label'),\n align: el.getAttribute('data-align') === 'left' ? 'left' : 'center',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'div',\n {\n 'data-rmd-math-block': 'true',\n 'data-tex': node.attrs.tex as string,\n 'data-numbered': String(Boolean(node.attrs.numbered)),\n 'data-label': node.attrs.label as string | null,\n 'data-align': node.attrs.align === 'left' ? 'left' : 'center',\n class: 'rmd-math-block',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'remark-math' },\n ),\n ];\n}\n\nexport const richBlockSchemaExtensions = createRichBlockSchemaExtensions();\n\nfunction normalizeAlign(value: unknown): ImageBlockAlign {\n return value === 'left' || value === 'right' ? value : 'center';\n}\n\nfunction normalizePercent(value: unknown): number {\n const numeric = Number(value ?? 100);\n if (!Number.isFinite(numeric)) return 100;\n return Math.max(10, Math.min(100, Math.round(numeric)));\n}\n\nfunction normalizeImageStatus(value: unknown): ImageBlockStatus {\n return value === 'empty' || value === 'uploading' || value === 'error' ? value : 'ready';\n}\n\nfunction normalizeCalloutKind(value: unknown): CalloutKind {\n if (value === 'tip' || value === 'important' || value === 'warning' || value === 'caution')\n return value;\n if (value === 'error') return 'caution';\n return 'note';\n}\n\nfunction normalizeEmbedType(value: unknown): EmbedType {\n return value === 'iframe' || value === 'oembed' ? value : 'bookmark';\n}\n\nfunction normalizeEmbedStatus(value: unknown): EmbedStatus {\n return value === 'loading' || value === 'ready' || value === 'error' ? value : 'unresolved';\n}\n\nfunction normalizeDividerVariant(value: unknown): DividerVariant {\n return value === 'dashed' || value === 'dotted' ? value : 'solid';\n}\n\nfunction normalizeToggleCollapsed(value: unknown): boolean {\n return value === true || value === 'true';\n}\n","import { Fragment, Node as ProseMirrorNode, Schema } from 'prosemirror-model'\nimport type { MarkSpec, NodeSpec, NodeType } from 'prosemirror-model'\nimport { Plugin, PluginKey } from 'prosemirror-state'\n\nexport const REFINEX_DOC_VERSION = '1.0.0'\nexport const REFINEX_SCHEMA_ID = '@refinex-md/base'\nexport const REFINEX_SCHEMA_VERSION = '1.0.0'\n\nexport type BlockIdMode = 'required' | 'forbidden' | 'optional'\nexport type RefinexCapabilityToken = 'doc:read' | 'doc:write' | 'network:none' | string\nexport type RefinexSchemaPlacement = 'append' | 'prepend'\nexport type RefinexNodeFallback = 'unwrap' | 'paragraph' | 'code_block' | 'drop'\nexport type RefinexMarkFallback = 'drop' | 'code' | 'link'\n\nexport interface RefinexMarkdownDeclaration {\n readonly format: string\n}\n\nexport interface RefinexMigrationDeclaration {\n readonly from: string\n readonly to: string\n}\n\ntype RefinexNodeSpec = NodeSpec & { refinexBlockId?: BlockIdMode }\n\nexport interface RefinexNodeExtension {\n readonly kind: 'node'\n readonly name: string\n readonly version: string\n readonly spec: RefinexNodeSpec\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RefinexMarkExtension {\n readonly kind: 'mark'\n readonly name: string\n readonly version: string\n readonly spec: MarkSpec\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport type RefinexSchemaExtension = RefinexNodeExtension | RefinexMarkExtension\n\nexport interface CreateRefinexSchemaOptions {\n readonly extensions?: readonly RefinexSchemaExtension[]\n}\n\nexport interface RegisterNodeSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RegisterMarkSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface ProseMirrorMarkJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n}\n\nexport interface ProseMirrorNodeJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n readonly content?: ProseMirrorNodeJSON[]\n readonly text?: string\n readonly marks?: ProseMirrorMarkJSON[]\n}\n\nexport type ProseMirrorDocJSON = ProseMirrorNodeJSON & { readonly type: 'doc' }\n\nexport interface RefinexExtensionRef {\n readonly name: string\n readonly version: string\n}\n\nexport interface RefinexSchemaRef {\n readonly id: typeof REFINEX_SCHEMA_ID\n readonly version: string\n readonly extensions: RefinexExtensionRef[]\n}\n\nexport interface RefinexBlockPermission {\n readonly access: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly reason?: string\n}\n\nexport interface RefinexDocMetadata {\n readonly docId?: string\n readonly title?: string\n readonly createdAt?: string\n readonly updatedAt?: string\n readonly createdBy?: string\n readonly updatedBy?: string\n readonly source?: 'api' | 'markdown-import' | 'html-import' | 'collab' | 'unknown'\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDocPermissions {\n readonly policyVersion: '1.0'\n readonly defaultAccess: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly blockOverrides?: Record<string, RefinexBlockPermission>\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDoc {\n readonly refinexDocVersion: string\n readonly schema: RefinexSchemaRef\n readonly metadata: RefinexDocMetadata\n readonly permissions: RefinexDocPermissions\n readonly content: ProseMirrorDocJSON\n}\n\nexport type RefinexIssueCode =\n | 'DOC_VERSION_UNSUPPORTED'\n | 'SCHEMA_VERSION_UNSUPPORTED'\n | 'EXTENSION_MISSING'\n | 'NODE_UNKNOWN'\n | 'MARK_UNKNOWN'\n | 'CONTENT_INVALID'\n | 'ATTR_INVALID'\n | 'BLOCK_ID_MISSING'\n | 'BLOCK_ID_INVALID'\n | 'BLOCK_ID_DUPLICATE'\n | 'BLOCK_ID_FORBIDDEN'\n | 'FALLBACK_APPLIED'\n\nexport type RefinexIssueSeverity = 'error' | 'warn' | 'info'\n\nexport interface RefinexDocIssue {\n readonly code: RefinexIssueCode\n readonly severity: RefinexIssueSeverity\n readonly path: string\n readonly message: string\n}\n\nexport interface NormalizeDocIdsOptions {\n readonly createId?: () => string\n}\n\nexport interface NormalizeDocIdsResult {\n readonly doc: ProseMirrorNode\n readonly changed: boolean\n readonly issues: RefinexDocIssue[]\n}\n\nexport interface CreateRefinexDocOptions {\n readonly schema?: Partial<RefinexSchemaRef>\n readonly metadata?: RefinexDocMetadata\n readonly permissions?: Partial<RefinexDocPermissions>\n}\n\nexport interface ValidateDocOptions extends NormalizeDocIdsOptions {\n readonly mode: 'strict' | 'repair'\n readonly extensions?: readonly RefinexSchemaExtension[]\n readonly allowUnknownExtensions?: boolean\n readonly preserveTrustedBlockIds?: boolean\n}\n\nexport interface ValidateDocResult {\n readonly ok: boolean\n readonly doc?: RefinexDoc\n readonly normalized?: RefinexDoc\n readonly issues: RefinexDocIssue[]\n}\n\nconst blockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n}\n\nconst baseBlockIdNodeNames = new Set([\n 'paragraph',\n 'heading',\n 'blockquote',\n 'list_item',\n 'code_block',\n 'horizontal_rule',\n])\n\nexport const baseNodes: Record<string, RefinexNodeSpec> = {\n doc: { content: 'block+' },\n\n paragraph: {\n attrs: blockAttrs,\n content: 'inline*',\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n },\n\n heading: {\n attrs: { level: { default: 1 }, ...blockAttrs },\n content: 'inline*',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${String(node.attrs.level)}`, 0]\n },\n },\n\n blockquote: {\n attrs: blockAttrs,\n content: 'block+',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0]\n },\n },\n\n bullet_list: {\n attrs: { metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul' }],\n toDOM() {\n return ['ul', 0]\n },\n },\n\n ordered_list: {\n attrs: { order: { default: 1 }, metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return { order: el.hasAttribute('start') ? Number(el.getAttribute('start')) : 1 }\n },\n }],\n toDOM(node) {\n return node.attrs.order === 1 ? ['ol', 0] : ['ol', { start: node.attrs.order as number }, 0]\n },\n },\n\n list_item: {\n attrs: blockAttrs,\n content: 'paragraph block*',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'li' }],\n toDOM() {\n return ['li', 0]\n },\n },\n\n code_block: {\n attrs: {\n language: { default: null },\n lineNumbers: { default: false },\n startLine: { default: 1 },\n highlightLines: { default: null },\n displayMode: { default: 'source' },\n wrap: { default: false },\n ...blockAttrs,\n },\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],\n toDOM() {\n return ['pre', ['code', 0]]\n },\n },\n\n horizontal_rule: {\n attrs: blockAttrs,\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr']\n },\n },\n\n image: {\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n },\n inline: true,\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n src: el.getAttribute('src'),\n alt: el.getAttribute('alt'),\n title: el.getAttribute('title'),\n }\n },\n }],\n toDOM(node) {\n return ['img', node.attrs]\n },\n },\n\n upload_placeholder: {\n attrs: {\n uploadId: {},\n fileName: { default: null },\n mimeType: { default: null },\n previewSrc: { default: null },\n progress: { default: 0 },\n status: { default: 'uploading' },\n error: { default: null },\n },\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n parseDOM: [{\n tag: 'span[data-rmd-upload-placeholder]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n uploadId: el.getAttribute('data-upload-id'),\n fileName: el.getAttribute('data-file-name'),\n mimeType: el.getAttribute('data-mime-type'),\n previewSrc: el.getAttribute('data-preview-src'),\n progress: Number(el.getAttribute('data-progress') ?? '0'),\n status: el.getAttribute('data-status') ?? 'uploading',\n error: el.getAttribute('data-error'),\n }\n },\n }],\n toDOM(node) {\n const attrs = node.attrs\n const progress = Math.max(0, Math.min(100, Number(attrs.progress ?? 0)))\n const previewSrc = typeof attrs.previewSrc === 'string' && attrs.previewSrc ? attrs.previewSrc : null\n const fileName = typeof attrs.fileName === 'string' && attrs.fileName ? attrs.fileName : '文件'\n const status = typeof attrs.status === 'string' ? attrs.status : 'uploading'\n const error = typeof attrs.error === 'string' && attrs.error ? attrs.error : '上传失败'\n return [\n 'span',\n {\n 'data-rmd-upload-placeholder': 'true',\n 'data-upload-id': attrs.uploadId as string,\n 'data-file-name': fileName,\n 'data-mime-type': attrs.mimeType as string | null,\n 'data-preview-src': previewSrc,\n 'data-progress': String(progress),\n 'data-status': status,\n 'data-error': status === 'error' ? error : null,\n class: 'rmd-upload-placeholder',\n },\n ['span', { class: 'rmd-upload-preview' }, previewSrc ? ['img', { src: previewSrc, alt: fileName }] : ''],\n ['span', { class: 'rmd-upload-body' },\n ['span', { class: 'rmd-upload-name' }, fileName],\n ['span', { class: 'rmd-upload-progress', role: 'progressbar', 'aria-valuemin': '0', 'aria-valuemax': '100', 'aria-valuenow': String(progress) },\n ['span', { class: 'rmd-upload-progress-fill', style: `width: ${String(progress)}%;` }],\n ],\n ['span', { class: 'rmd-upload-error' }, error],\n ],\n ['button', { type: 'button', 'data-upload-action': 'retry', class: 'rmd-upload-action' }, '重试'],\n ['button', { type: 'button', 'data-upload-action': 'remove', class: 'rmd-upload-action' }, '移除'],\n ]\n },\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n },\n\n text: {\n group: 'inline',\n },\n}\n\nexport const baseMarks: Record<string, MarkSpec> = {\n bold: {\n parseDOM: [{ tag: 'strong' }, { tag: 'b' }, { style: 'font-weight=bold' }],\n toDOM() {\n return ['strong', 0]\n },\n },\n\n italic: {\n parseDOM: [{ tag: 'em' }, { tag: 'i' }, { style: 'font-style=italic' }],\n toDOM() {\n return ['em', 0]\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', 0]\n },\n },\n\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n rel: { default: 'noopener noreferrer' },\n },\n inclusive: false,\n parseDOM: [{\n tag: 'a[href]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n target: el.getAttribute('target'),\n rel: el.getAttribute('rel') || 'noopener noreferrer',\n }\n },\n }],\n toDOM(mark) {\n return ['a', mark.attrs, 0]\n },\n },\n\n strikethrough: {\n parseDOM: [{ tag: 's' }, { tag: 'del' }],\n toDOM() {\n return ['s', 0]\n },\n },\n\n underline: {\n parseDOM: [{ tag: 'u' }, { style: 'text-decoration=underline' }],\n toDOM() {\n return ['u', 0]\n },\n },\n\n text_color: {\n attrs: {\n color: { default: null },\n },\n parseDOM: [{\n style: 'color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { color: value.trim() }\n },\n }],\n toDOM(mark) {\n const color = mark.attrs.color\n if (typeof color !== 'string' || !color.trim()) return ['span', 0]\n return ['span', { style: `color: ${color}` }, 0]\n },\n },\n\n text_background_color: {\n attrs: {\n backgroundColor: { default: null },\n },\n parseDOM: [{\n style: 'background-color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { backgroundColor: value.trim() }\n },\n }],\n toDOM(mark) {\n const backgroundColor = mark.attrs.backgroundColor\n if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) return ['span', 0]\n return ['span', { style: `background-color: ${backgroundColor}` }, 0]\n },\n },\n}\n\nexport function registerNodeSpec(\n name: string,\n spec: NodeSpec,\n options: RegisterNodeSpecOptions = {},\n): RefinexNodeExtension {\n return {\n kind: 'node',\n name,\n version: options.version ?? '1.0.0',\n spec: { ...spec, refinexBlockId: options.blockId },\n placement: options.placement,\n blockId: options.blockId ?? 'forbidden',\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function registerMarkSpec(\n name: string,\n spec: MarkSpec,\n options: RegisterMarkSpecOptions = {},\n): RefinexMarkExtension {\n return {\n kind: 'mark',\n name,\n version: options.version ?? '1.0.0',\n spec,\n placement: options.placement,\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'drop',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function createRefinexSchema(options: CreateRefinexSchemaOptions = {}): Schema {\n const nodes: Record<string, RefinexNodeSpec> = { ...baseNodes }\n const marks: Record<string, MarkSpec> = { ...baseMarks }\n const names = new Set([...Object.keys(nodes), ...Object.keys(marks)])\n\n for (const extension of options.extensions ?? []) {\n assertExtensionName(extension.name)\n if (names.has(extension.name)) {\n throw new Error(`Extension name \"${extension.name}\" is reserved or already registered.`)\n }\n names.add(extension.name)\n\n if (extension.kind === 'node') {\n validateNodeExtension(extension)\n nodes[extension.name] = { ...extension.spec, refinexBlockId: extension.blockId }\n } else {\n marks[extension.name] = extension.spec\n }\n }\n\n return new Schema({ nodes, marks })\n}\n\nexport const defaultSchema = createRefinexSchema()\nexport const schema = defaultSchema\n\nexport function createBlockId(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto?.getRandomValues(bytes)\n const suffix = Array.from(bytes, (byte) => byte.toString(36).padStart(2, '0')).join('').slice(0, 24)\n return `blk_${suffix}`\n}\n\nexport function isBlockIdNode(node: NodeType | ProseMirrorNodeJSON): boolean {\n if ('spec' in node) {\n return (node.spec as RefinexNodeSpec).refinexBlockId === 'required' || baseBlockIdNodeNames.has(node.name)\n }\n return baseBlockIdNodeNames.has(node.type)\n}\n\nexport function normalizeDocIds(\n doc: ProseMirrorNode,\n _schema: Schema,\n options: NormalizeDocIdsOptions = {},\n): NormalizeDocIdsResult {\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n function normalizeNode(node: ProseMirrorNode, path: string): ProseMirrorNode {\n if (node.isText) return node\n\n let attrs = node.attrs\n if (isBlockIdNode(node.type)) {\n const blockId = attrs.blockId\n if (typeof blockId !== 'string' || blockId.length === 0) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_MISSING', 'warn', `${path}.attrs.blockId`, 'Missing blockId was generated.'))\n } else if (!isValidBlockId(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_INVALID', 'warn', `${path}.attrs.blockId`, 'Invalid blockId was replaced.'))\n } else if (seen.has(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_DUPLICATE', 'warn', `${path}.attrs.blockId`, 'Duplicate blockId was replaced.'))\n }\n seen.add(attrs.blockId as string)\n } else if ('blockId' in attrs) {\n const { blockId: _blockId, ...rest } = attrs\n attrs = rest\n changed = true\n issues.push(issue('BLOCK_ID_FORBIDDEN', 'warn', `${path}.attrs.blockId`, 'Forbidden blockId was removed.'))\n }\n\n const children: ProseMirrorNode[] = []\n node.forEach((child, _offset, index) => {\n children.push(normalizeNode(child, `${path}.content[${index}]`))\n })\n\n const content = children.length > 0 ? Fragment.fromArray(children) : Fragment.empty\n const sameContent = children.length === node.childCount && children.every((child, index) => child.eq(node.child(index)))\n return attrs === node.attrs && sameContent ? node : node.type.create(attrs, content, node.marks)\n }\n\n return { doc: normalizeNode(doc, '$'), changed, issues }\n}\n\nconst blockIdPluginKey = new PluginKey('refinexBlockId')\n\nexport function createBlockIdPlugin(options: NormalizeDocIdsOptions = {}): Plugin {\n return new Plugin({\n key: blockIdPluginKey,\n appendTransaction(transactions, _oldState, newState) {\n if (transactions.some((transaction) => transaction.getMeta(blockIdPluginKey))) return null\n if (!transactions.some((transaction) => transaction.docChanged)) return null\n\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const updates: Array<{ pos: number; attrs: Record<string, unknown> }> = []\n\n newState.doc.descendants((node, pos) => {\n if (!isBlockIdNode(node.type)) return true\n const blockId = node.attrs.blockId\n if (typeof blockId !== 'string' || !isValidBlockId(blockId) || seen.has(blockId)) {\n updates.push({ pos, attrs: { ...node.attrs, blockId: createId() } })\n return true\n }\n seen.add(blockId)\n return true\n })\n\n if (updates.length === 0) return null\n const tr = newState.tr\n for (const update of updates) {\n tr.setNodeMarkup(update.pos, undefined, update.attrs)\n }\n tr.setMeta(blockIdPluginKey, true)\n return tr\n },\n })\n}\n\nexport function createRefinexDoc(\n content: ProseMirrorNode | ProseMirrorDocJSON,\n options: CreateRefinexDocOptions = {},\n): RefinexDoc {\n const contentJSON = content instanceof ProseMirrorNode ? content.toJSON() as ProseMirrorDocJSON : content\n return {\n refinexDocVersion: REFINEX_DOC_VERSION,\n schema: {\n id: REFINEX_SCHEMA_ID,\n version: options.schema?.version ?? REFINEX_SCHEMA_VERSION,\n extensions: options.schema?.extensions ?? [],\n },\n metadata: options.metadata ?? {},\n permissions: {\n policyVersion: '1.0',\n defaultAccess: options.permissions?.defaultAccess ?? 'read-write',\n blockOverrides: options.permissions?.blockOverrides,\n custom: options.permissions?.custom,\n },\n content: contentJSON,\n }\n}\n\nexport function validateDoc(input: unknown, options: ValidateDocOptions): ValidateDocResult {\n const issues: RefinexDocIssue[] = []\n if (!isRecord(input)) {\n return {\n ok: false,\n issues: [issue('CONTENT_INVALID', 'error', '$', 'RefinexDoc must be an object.')],\n }\n }\n\n const refinexDoc = input as unknown as RefinexDoc\n if (refinexDoc.refinexDocVersion !== REFINEX_DOC_VERSION) {\n issues.push(issue('DOC_VERSION_UNSUPPORTED', 'error', '$.refinexDocVersion', 'Unsupported RefinexDoc version.'))\n }\n if (!isRecord(refinexDoc.schema) || refinexDoc.schema.version !== REFINEX_SCHEMA_VERSION) {\n issues.push(issue('SCHEMA_VERSION_UNSUPPORTED', 'error', '$.schema.version', 'Unsupported schema version.'))\n }\n if (!isRecord(refinexDoc.content) || refinexDoc.content.type !== 'doc') {\n issues.push(issue('CONTENT_INVALID', 'error', '$.content', 'Content must be a ProseMirror doc JSON object.'))\n }\n if (issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n const schema = createRefinexSchema({ extensions: options.extensions })\n const extensionIssues = findMissingExtensions(refinexDoc, options.extensions ?? [])\n issues.push(...extensionIssues)\n\n const preflight = preflightNode(refinexDoc.content, schema, '$.content', options.mode)\n issues.push(...preflight.issues)\n if (options.mode === 'strict' && issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n let parsed: ProseMirrorNode\n try {\n parsed = schema.nodeFromJSON(preflight.node)\n parsed.check()\n } catch (error) {\n return {\n ok: false,\n issues: [\n ...issues,\n issue('CONTENT_INVALID', 'error', '$.content', error instanceof Error ? error.message : 'Invalid content.'),\n ],\n }\n }\n\n const normalized = normalizeDocIds(parsed, schema, { createId: options.createId })\n issues.push(...normalized.issues)\n\n if (options.mode === 'strict' && normalized.issues.length > 0) {\n return { ok: false, issues }\n }\n\n const nextDoc = createRefinexDoc(normalized.doc, {\n schema: refinexDoc.schema,\n metadata: refinexDoc.metadata,\n permissions: refinexDoc.permissions,\n })\n\n return options.mode === 'repair' && (preflight.changed || normalized.changed)\n ? { ok: true, normalized: nextDoc, issues }\n : { ok: issues.every((entry) => entry.severity !== 'error'), doc: nextDoc, issues }\n}\n\nfunction assertExtensionName(name: string): void {\n if (!/^[a-z][a-z0-9_]*$/.test(name)) {\n throw new Error(`Extension name \"${name}\" must use snake_case.`)\n }\n}\n\nfunction validateNodeExtension(extension: RefinexNodeExtension): void {\n const inline = extension.spec.inline === true || extension.spec.group === 'inline'\n if (inline && extension.blockId === 'required') {\n throw new Error(`Inline node \"${extension.name}\" cannot require blockId.`)\n }\n if (extension.blockId !== 'required' && extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" declares blockId attr but does not require blockId.`)\n }\n if (extension.blockId === 'required' && !extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" requires a blockId attr.`)\n }\n}\n\nfunction isValidBlockId(value: string): boolean {\n return /^blk_[A-Za-z0-9_-]{8,36}$/.test(value)\n}\n\nfunction issue(\n code: RefinexIssueCode,\n severity: RefinexIssueSeverity,\n path: string,\n message: string,\n): RefinexDocIssue {\n return { code, severity, path, message }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction findMissingExtensions(\n refinexDoc: RefinexDoc,\n extensions: readonly RefinexSchemaExtension[],\n): RefinexDocIssue[] {\n const registered = new Set(extensions.map((extension) => extension.name))\n return refinexDoc.schema.extensions\n .filter((extension) => !registered.has(extension.name))\n .map((extension, index) => issue(\n 'EXTENSION_MISSING',\n 'error',\n `$.schema.extensions[${index}]`,\n `Missing schema extension \"${extension.name}\".`,\n ))\n}\n\ninterface PreflightResult {\n readonly node: ProseMirrorNodeJSON\n readonly issues: RefinexDocIssue[]\n readonly changed: boolean\n}\n\nfunction preflightNode(\n node: ProseMirrorNodeJSON,\n schema: Schema,\n path: string,\n mode: 'strict' | 'repair',\n): PreflightResult {\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n if (!schema.nodes[node.type]) {\n issues.push(issue('NODE_UNKNOWN', mode === 'repair' ? 'warn' : 'error', path, `Unknown node \"${node.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', path, `Unknown node \"${node.type}\" converted to paragraph.`))\n return {\n node: {\n type: 'paragraph',\n attrs: { blockId: null },\n content: textContentOf(node).length > 0 ? [{ type: 'text', text: textContentOf(node) }] : undefined,\n },\n issues,\n changed: true,\n }\n }\n return { node, issues, changed: false }\n }\n\n const attrs = { ...(node.attrs ?? {}) }\n if (node.type === 'heading' && !isValidHeadingLevel(attrs.level)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.attrs.level`, 'Heading level must be 1-6.'))\n if (mode === 'repair') {\n attrs.level = 1\n changed = true\n }\n }\n\n const content = node.content?.map((child, index) => {\n const result = preflightNode(child, schema, `${path}.content[${index}]`, mode)\n issues.push(...result.issues)\n if (result.changed) changed = true\n return result.node\n })\n\n const marks = node.marks?.flatMap((mark, index) => {\n if (!schema.marks[mark.type]) {\n issues.push(issue('MARK_UNKNOWN', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\" dropped.`))\n changed = true\n return []\n }\n }\n if (mark.type === 'link' && !isSafeHref(mark.attrs?.href)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}].attrs.href`, 'Unsafe link href.'))\n if (mode === 'repair') {\n changed = true\n return []\n }\n }\n return [mark]\n })\n\n const nextNode: ProseMirrorNodeJSON = {\n ...node,\n attrs: Object.keys(attrs).length > 0 ? attrs : undefined,\n content,\n marks: marks && marks.length > 0 ? marks : undefined,\n }\n return { node: nextNode, issues, changed }\n}\n\nfunction isValidHeadingLevel(value: unknown): boolean {\n return Number.isInteger(value) && typeof value === 'number' && value >= 1 && value <= 6\n}\n\nfunction isSafeHref(value: unknown): boolean {\n if (typeof value !== 'string') return false\n try {\n const url = new URL(value, 'https://refinex.local')\n return ['http:', 'https:', 'mailto:'].includes(url.protocol)\n } catch {\n return false\n }\n}\n\nfunction textContentOf(node: ProseMirrorNodeJSON): string {\n if (typeof node.text === 'string') return node.text\n return node.content?.map((child) => textContentOf(child)).join('') ?? ''\n}\n\nexport * from './rich-blocks'\n"],"names":["richBlockAttrs","richCapabilities","defineNode","name","spec","options","blockId","richBlockExtensionNames","createRichBlockSchemaExtensions","specs","tableNodes","dom","align","value","attrs","width","el","image","normalizeAlign","normalizePercent","normalizeImageStatus","node","normalizeCalloutKind","normalizeToggleCollapsed","collapsed","normalizeEmbedType","normalizeEmbedStatus","normalizeDividerVariant","richBlockSchemaExtensions","numeric","REFINEX_DOC_VERSION","REFINEX_SCHEMA_ID","REFINEX_SCHEMA_VERSION","blockAttrs","baseBlockIdNodeNames","baseNodes","progress","previewSrc","fileName","status","error","baseMarks","mark","color","backgroundColor","registerNodeSpec","registerMarkSpec","createRefinexSchema","nodes","marks","names","extension","assertExtensionName","validateNodeExtension","Schema","defaultSchema","schema","createBlockId","bytes","_a","byte","isBlockIdNode","normalizeDocIds","doc","_schema","createId","seen","issues","changed","normalizeNode","path","issue","isValidBlockId","_blockId","rest","children","child","_offset","index","content","Fragment","sameContent","blockIdPluginKey","PluginKey","createBlockIdPlugin","Plugin","transactions","_oldState","newState","transaction","updates","pos","tr","update","createRefinexDoc","contentJSON","ProseMirrorNode","_b","_c","_d","_e","validateDoc","input","isRecord","refinexDoc","entry","extensionIssues","findMissingExtensions","preflight","preflightNode","parsed","normalized","nextDoc","code","severity","message","extensions","registered","mode","textContentOf","isValidHeadingLevel","result","isSafeHref","url"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RefinexSchemaExtension } from './index';
|
|
2
|
+
export type ImageBlockAlign = 'left' | 'center' | 'right';
|
|
3
|
+
export type ImageBlockStatus = 'empty' | 'ready' | 'uploading' | 'error';
|
|
4
|
+
export type CalloutKind = 'note' | 'tip' | 'important' | 'warning' | 'caution';
|
|
5
|
+
export type EmbedType = 'bookmark' | 'iframe' | 'oembed';
|
|
6
|
+
export type EmbedStatus = 'unresolved' | 'loading' | 'ready' | 'error';
|
|
7
|
+
export type DividerVariant = 'solid' | 'dashed' | 'dotted';
|
|
8
|
+
export type TableLayout = 'auto' | 'fixed';
|
|
9
|
+
export type MathBlockAlign = 'center' | 'left';
|
|
10
|
+
export interface ToggleItemAttrs {
|
|
11
|
+
readonly collapsed: boolean;
|
|
12
|
+
readonly blockId: string | null;
|
|
13
|
+
readonly metadata: Record<string, unknown> | null;
|
|
14
|
+
readonly permissions: Record<string, unknown> | null;
|
|
15
|
+
}
|
|
16
|
+
export declare const richBlockExtensionNames: readonly ["image_block", "callout", "task_list", "task_item", "toggle_list", "toggle_item", "embed_block", "divider", "table", "table_row", "table_cell", "table_header", "math_inline", "math_block"];
|
|
17
|
+
export type RichBlockExtensionName = (typeof richBlockExtensionNames)[number];
|
|
18
|
+
export declare function createRichBlockSchemaExtensions(): RefinexSchemaExtension[];
|
|
19
|
+
export declare const richBlockSchemaExtensions: RefinexSchemaExtension[];
|
|
20
|
+
//# sourceMappingURL=rich-blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-blocks.d.ts","sourceRoot":"","sources":["../src/rich-blocks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwB,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAgC5E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtD;AAED,eAAO,MAAM,uBAAuB,wMAe1B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,+BAA+B,IAAI,sBAAsB,EAAE,CA8c1E;AAED,eAAO,MAAM,yBAAyB,0BAAoC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@refinex-md/model",
|
|
3
|
+
"version": "0.1.0-canary.0",
|
|
4
|
+
"description": "Structured RefinexDoc model, schema, block IDs, and validation.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@vitest/coverage-v8": "^3.0.0",
|
|
22
|
+
"typescript": "^5.7.0",
|
|
23
|
+
"vite": "^6.0.0",
|
|
24
|
+
"vitest": "^3.0.0"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"prosemirror-model": "^1.25.4",
|
|
28
|
+
"prosemirror-state": "^1.4.4",
|
|
29
|
+
"prosemirror-tables": "^1.8.5"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/Refinex-Space/Refinex-Md-Editor.git",
|
|
34
|
+
"directory": "packages/model"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/Refinex-Space/Refinex-Md-Editor#readme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/Refinex-Space/Refinex-Md-Editor/issues"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public",
|
|
42
|
+
"provenance": true
|
|
43
|
+
},
|
|
44
|
+
"sideEffects": false,
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "vite build",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:watch": "vitest"
|
|
49
|
+
}
|
|
50
|
+
}
|