@namroodinc/liquid-editorial 0.1.7 → 0.1.9
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/AGENTS.md +2 -0
- package/README.md +1 -1
- package/UPGRADING.md +50 -0
- package/dist/chunks/Board-BLhB5_xx.cjs +2 -0
- package/dist/chunks/Board-BLhB5_xx.cjs.map +1 -0
- package/dist/chunks/Board-BTFSzn6c.js +239 -0
- package/dist/chunks/Board-BTFSzn6c.js.map +1 -0
- package/dist/chunks/EntryEditor-CcyYtH74.js +191 -0
- package/dist/chunks/EntryEditor-CcyYtH74.js.map +1 -0
- package/dist/chunks/EntryEditor-DIpc1iPF.cjs +2 -0
- package/dist/chunks/EntryEditor-DIpc1iPF.cjs.map +1 -0
- package/dist/chunks/{RichTextEditor-DC_0oN1s.cjs → RichTextEditor-BxtlbjXj.cjs} +2 -2
- package/dist/chunks/RichTextEditor-BxtlbjXj.cjs.map +1 -0
- package/dist/chunks/{RichTextEditor-CSpjsL1z.js → RichTextEditor-Dnx4i7bQ.js} +104 -93
- package/dist/chunks/RichTextEditor-Dnx4i7bQ.js.map +1 -0
- package/dist/chunks/mergeRefs-Bc3qS0Tt.cjs +2 -0
- package/dist/chunks/mergeRefs-Bc3qS0Tt.cjs.map +1 -0
- package/dist/chunks/mergeRefs-DGM402mE.js +10 -0
- package/dist/chunks/mergeRefs-DGM402mE.js.map +1 -0
- package/dist/components/AssetCard/index.cjs +2 -0
- package/dist/components/AssetCard/index.cjs.map +1 -0
- package/dist/components/AssetCard/index.d.cts +41 -0
- package/dist/components/AssetCard/index.d.cts.map +1 -0
- package/dist/components/AssetCard/index.d.ts +41 -0
- package/dist/components/AssetCard/index.d.ts.map +1 -0
- package/dist/components/AssetCard/index.js +159 -0
- package/dist/components/AssetCard/index.js.map +1 -0
- package/dist/components/AssetCard/style.css +204 -0
- package/dist/components/AssetGrid/index.cjs +1 -1
- package/dist/components/AssetGrid/index.cjs.map +1 -1
- package/dist/components/AssetGrid/index.d.cts +5 -30
- package/dist/components/AssetGrid/index.d.cts.map +1 -1
- package/dist/components/AssetGrid/index.d.ts +5 -30
- package/dist/components/AssetGrid/index.d.ts.map +1 -1
- package/dist/components/AssetGrid/index.js +20 -107
- package/dist/components/AssetGrid/index.js.map +1 -1
- package/dist/components/AssetGrid/style.css +0 -161
- package/dist/components/Board/index.cjs +1 -2
- package/dist/components/Board/index.d.cts.map +1 -1
- package/dist/components/Board/index.d.ts.map +1 -1
- package/dist/components/Board/index.js +1 -231
- package/dist/components/Board/keyboard.d.cts +7 -0
- package/dist/components/Board/keyboard.d.cts.map +1 -0
- package/dist/components/Board/keyboard.d.ts +7 -0
- package/dist/components/Board/keyboard.d.ts.map +1 -0
- package/dist/components/Board/keyboard.test.d.cts +2 -0
- package/dist/components/Board/keyboard.test.d.cts.map +1 -0
- package/dist/components/Board/keyboard.test.d.ts +2 -0
- package/dist/components/Board/keyboard.test.d.ts.map +1 -0
- package/dist/components/Board/moves.d.cts +5 -0
- package/dist/components/Board/moves.d.cts.map +1 -0
- package/dist/components/Board/moves.d.ts +5 -0
- package/dist/components/Board/moves.d.ts.map +1 -0
- package/dist/components/Board/moves.test.d.cts +2 -0
- package/dist/components/Board/moves.test.d.cts.map +1 -0
- package/dist/components/Board/moves.test.d.ts +2 -0
- package/dist/components/Board/moves.test.d.ts.map +1 -0
- package/dist/components/Button/index.cjs +1 -1
- package/dist/components/Button/index.cjs.map +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Button/style.css +0 -16
- package/dist/components/DatePicker/index.cjs +1 -1
- package/dist/components/DatePicker/index.cjs.map +1 -1
- package/dist/components/DatePicker/index.d.cts.map +1 -1
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/DatePicker/index.js +39 -36
- package/dist/components/DatePicker/index.js.map +1 -1
- package/dist/components/Drawer/index.cjs +1 -1
- package/dist/components/Drawer/index.cjs.map +1 -1
- package/dist/components/Drawer/index.d.cts.map +1 -1
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +69 -62
- package/dist/components/Drawer/index.js.map +1 -1
- package/dist/components/EntryEditor/index.cjs +1 -1
- package/dist/components/EntryEditor/index.d.cts.map +1 -1
- package/dist/components/EntryEditor/index.d.ts.map +1 -1
- package/dist/components/EntryEditor/index.js +1 -1
- package/dist/components/EntryEditor/model.d.cts.map +1 -1
- package/dist/components/EntryEditor/model.d.ts.map +1 -1
- package/dist/components/Icon/style.css +18 -0
- package/dist/components/ImageCropper/index.cjs +1 -1
- package/dist/components/ImageCropper/index.cjs.map +1 -1
- package/dist/components/ImageCropper/index.d.cts +16 -1
- package/dist/components/ImageCropper/index.d.cts.map +1 -1
- package/dist/components/ImageCropper/index.d.ts +16 -1
- package/dist/components/ImageCropper/index.d.ts.map +1 -1
- package/dist/components/ImageCropper/index.js +143 -107
- package/dist/components/ImageCropper/index.js.map +1 -1
- package/dist/components/Pagination/index.cjs +1 -1
- package/dist/components/Pagination/index.cjs.map +1 -1
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/Pagination/index.js.map +1 -1
- package/dist/components/Pagination/style.css +0 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.d.cts.map +1 -1
- package/dist/components/RichTextEditor/index.d.ts.map +1 -1
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/Select/index.cjs +1 -1
- package/dist/components/Select/index.cjs.map +1 -1
- package/dist/components/Select/index.d.cts.map +1 -1
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +32 -18
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SortableList/index.cjs +1 -1
- package/dist/components/SortableList/index.cjs.map +1 -1
- package/dist/components/SortableList/index.d.cts.map +1 -1
- package/dist/components/SortableList/index.d.ts.map +1 -1
- package/dist/components/SortableList/index.js +49 -50
- package/dist/components/SortableList/index.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -33
- package/dist/internal/mergeRefs.d.cts +4 -0
- package/dist/internal/mergeRefs.d.cts.map +1 -0
- package/dist/internal/mergeRefs.d.ts +4 -0
- package/dist/internal/mergeRefs.d.ts.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/test/dragEvent.d.cts +3 -0
- package/dist/test/dragEvent.d.cts.map +1 -0
- package/dist/test/dragEvent.d.ts +3 -0
- package/dist/test/dragEvent.d.ts.map +1 -0
- package/package.json +2 -2
- package/dist/chunks/EntryEditor-C32lKKnV.cjs +0 -2
- package/dist/chunks/EntryEditor-C32lKKnV.cjs.map +0 -1
- package/dist/chunks/EntryEditor-xVuiqtFo.js +0 -181
- package/dist/chunks/EntryEditor-xVuiqtFo.js.map +0 -1
- package/dist/chunks/RichTextEditor-CSpjsL1z.js.map +0 -1
- package/dist/chunks/RichTextEditor-DC_0oN1s.cjs.map +0 -1
- package/dist/components/Board/index.cjs.map +0 -1
- package/dist/components/Board/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryEditor-CcyYtH74.js","names":["documentError","emptyDocument","RichTextEditor","fieldTypes","assertModel","ids","field","model","parseUtcDateTime","value","match","canonical","date","isLink","key","hasRichText","node","requiredError","textError","richTextError","error","linkError","item","validators","validateEntryValues","values","selectedIds","link","id","pickerValue","links","EntryControl","accessibility","Control","TextField","TextArea","isDisabled","stored","onChange","event","NumberField","next","Switch","required","EntryPicker","EntryEditor","rest","internal","setInternal","useState","defaultValue","changed","setChanged","current","validation","commit","previous","onValueChange","className","isPicker","label","errors","showAllErrors","Field","pickerItems"],"sources":["../../src/components/EntryEditor/model.ts","../../src/components/EntryEditor/index.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/react\";\nimport { documentError } from \"../RichTextEditor/document\";\nimport type { RichTextDocument } from \"../RichTextEditor\";\n\ninterface ContentFieldBase {\n id: string;\n label: string;\n hint?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport type ContentField = ContentFieldBase & (\n | { type: \"shortText\" | \"longText\" | \"richText\" | \"number\" | \"boolean\" | \"dateTime\"; multiple?: never }\n | { type: \"asset\" | \"reference\"; multiple?: boolean }\n);\n\nexport interface ContentModel {\n fields: readonly ContentField[];\n}\n\nexport interface AssetValue { assetId: string }\nexport interface ReferenceValue { entryId: string }\nexport type EntryFieldValue = string | number | boolean | RichTextDocument | AssetValue | ReferenceValue | AssetValue[] | ReferenceValue[];\nexport type EntryValues = Record<string, EntryFieldValue | undefined>;\nexport type EntryErrors = Partial<Record<string, string>>;\n\nconst fieldTypes = new Set([\"shortText\", \"longText\", \"richText\", \"number\", \"boolean\", \"dateTime\", \"asset\", \"reference\"]);\n\nfunction assertModel(model: ContentModel) {\n const ids = new Set<string>();\n for (const field of model.fields) {\n if (!field.id?.trim() || ids.has(field.id)) throw new Error(\"Content model field IDs must be nonempty and unique.\");\n if (!fieldTypes.has(field.type)) throw new Error(`Unsupported content field type: ${field.type}`);\n ids.add(field.id);\n }\n}\n\n/** Accept UTC ISO strings without rolling invalid dates into the next month. */\nexport function parseUtcDateTime(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const match = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?(?:Z|\\+00:00)$/.exec(value);\n if (!match) return;\n const canonical = `${match[1]}:${match[2] ?? \"00\"}.${(match[3] ?? \"\").padEnd(3, \"0\")}Z`;\n const date = new Date(canonical);\n if (Number.isFinite(date.getTime()) && date.toISOString() === canonical) return canonical;\n}\n\nfunction isLink(value: unknown, key: \"assetId\" | \"entryId\"): boolean {\n return !!value && typeof value === \"object\" && key in value &&\n typeof (value as Record<string, unknown>)[key] === \"string\" &&\n ((value as Record<string, string>)[key]).trim().length > 0;\n}\n\nfunction hasRichText(node: JSONContent): boolean {\n return !!node.text?.trim() || node.type === \"horizontalRule\" || !!node.content?.some(hasRichText);\n}\n\nfunction requiredError(field: ContentField): string {\n return `${field.label} is required.`;\n}\n\nfunction textError(field: ContentField, value: unknown): string | undefined {\n if (typeof value !== \"string\") return \"Enter text.\";\n if (field.required && !value.trim()) return requiredError(field);\n}\n\nfunction richTextError(field: ContentField, value: unknown): string | undefined {\n const error = documentError(value);\n if (error) return error;\n if (field.required && !hasRichText(value as RichTextDocument)) return requiredError(field);\n}\n\nfunction linkError(field: ContentField, value: unknown): string | undefined {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n const valid = field.multiple\n ? Array.isArray(value) && value.every((item) => isLink(item, key))\n : isLink(value, key);\n if (!valid) {\n return field.multiple\n ? `Choose a list of ${field.type === \"asset\" ? \"assets\" : \"entries\"}.`\n : `Choose an ${field.type === \"asset\" ? \"asset\" : \"entry\"}.`;\n }\n if (field.required && Array.isArray(value) && value.length === 0) return requiredError(field);\n}\n\nconst validators: Record<ContentField[\"type\"], (field: ContentField, value: unknown) => string | undefined> = {\n shortText: textError,\n longText: textError,\n richText: richTextError,\n number: (_field, value) => typeof value === \"number\" && Number.isFinite(value) ? undefined : \"Enter a finite number.\",\n boolean: (_field, value) => typeof value === \"boolean\" ? undefined : \"Choose a boolean value.\",\n dateTime: (_field, value) => parseUtcDateTime(value) ? undefined : \"Enter a valid UTC date and time.\",\n asset: linkError,\n reference: linkError,\n};\n\n/** Validate data loaded from JSON as well as values emitted by EntryEditor. */\nexport function validateEntryValues(model: ContentModel, values: Record<string, unknown>): EntryErrors {\n assertModel(model);\n return Object.fromEntries(model.fields.flatMap((field): [string, string][] => {\n const value = Object.hasOwn(values, field.id) ? values[field.id] : undefined;\n const error = value === undefined\n ? field.required ? requiredError(field) : undefined\n : validators[field.type](field, value);\n return error ? [[field.id, error]] : [];\n }));\n}\n","import { useState, type HTMLAttributes } from \"react\";\nimport { EntryPicker, type EntryItem } from \"../EntryPicker\";\nimport { Field, type FieldProps } from \"../Field\";\nimport { NumberField } from \"../NumberField\";\nimport { RichTextEditor, type RichTextDocument } from \"../RichTextEditor\";\nimport { emptyDocument } from \"../RichTextEditor/document\";\nimport { Switch } from \"../Switch\";\nimport { TextArea, TextField } from \"../TextField\";\nimport { parseUtcDateTime, validateEntryValues, type ContentField, type ContentModel, type EntryErrors, type EntryFieldValue, type EntryValues } from \"./model\";\nimport \"./style.css\";\n\nexport { validateEntryValues } from \"./model\";\nexport type { AssetValue, ContentField, ContentModel, EntryErrors, EntryFieldValue, EntryValues, ReferenceValue } from \"./model\";\n\nexport interface EntryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n model: ContentModel;\n value?: EntryValues;\n defaultValue?: EntryValues;\n onValueChange?: (values: EntryValues) => void;\n /** Available assets or entries, keyed by content field ID. */\n pickerItems?: Record<string, EntryItem[]>;\n /** App-provided messages take precedence over built-in validation. */\n errors?: EntryErrors;\n isDisabled?: boolean;\n /** Reveal validation for untouched fields, for example after a submit attempt. */\n showAllErrors?: boolean;\n}\n\nfunction selectedIds(field: ContentField, value: EntryFieldValue | undefined): string[] {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n const links = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return links.flatMap((link) => {\n if (!link || typeof link !== \"object\" || !(key in link)) return [];\n const id = (link as unknown as Record<string, unknown>)[key];\n return typeof id === \"string\" ? [id] : [];\n });\n}\n\nfunction pickerValue(field: ContentField, ids: string[]): EntryFieldValue | undefined {\n if (field.type === \"asset\") {\n const links = ids.map((assetId) => ({ assetId }));\n return field.multiple ? links : links[0];\n }\n const links = ids.map((entryId) => ({ entryId }));\n return field.multiple ? links : links[0];\n}\n\nfunction EntryControl({ field, stored, items, isDisabled, accessibility: { required, ...accessibility }, onChange }: {\n field: ContentField;\n stored: EntryFieldValue | undefined;\n items: EntryItem[];\n isDisabled: boolean;\n accessibility: Parameters<FieldProps[\"children\"]>[0];\n onChange: (value: EntryFieldValue | undefined) => void;\n}) {\n switch (field.type) {\n case \"shortText\":\n case \"longText\": {\n const Control = field.type === \"shortText\" ? TextField : TextArea;\n return <Control {...accessibility} required={required} disabled={isDisabled} placeholder={field.placeholder}\n value={typeof stored === \"string\" ? stored : \"\"} onChange={(event) => onChange(event.target.value)} />;\n }\n case \"number\":\n return <NumberField {...accessibility} required={required} isDisabled={isDisabled} placeholder={field.placeholder} step=\"any\"\n hasSteppers={false} value={typeof stored === \"number\" && Number.isFinite(stored) ? stored : \"\"}\n onValueChange={(next) => { if (next === \"\" || Number.isFinite(next)) onChange(next === \"\" ? undefined : next); }} />;\n case \"boolean\":\n return <Switch {...accessibility} isDisabled={isDisabled} isSelected={stored === true} onSelectedChange={onChange} />;\n case \"dateTime\":\n return <TextField {...accessibility} required={required} disabled={isDisabled} type=\"datetime-local\" step=\"0.001\"\n value={parseUtcDateTime(stored)?.slice(0, -1) ?? \"\"}\n onChange={(event) => onChange(parseUtcDateTime(`${event.target.value}Z`))} />;\n case \"richText\":\n return <RichTextEditor {...accessibility} label={field.label} isRequired={required} isDisabled={isDisabled}\n placeholder={field.placeholder} format=\"json\" value={stored === undefined ? emptyDocument : stored as RichTextDocument}\n onChange={onChange} />;\n case \"asset\":\n case \"reference\":\n return <div {...accessibility} role=\"group\">\n <EntryPicker items={items} value={selectedIds(field, stored)}\n label={field.type === \"asset\" ? \"Assets\" : \"Entries\"} addLabel={`Choose ${field.label}`}\n mode={field.multiple ? \"multiple\" : \"single\"} isDisabled={isDisabled}\n onValueChange={(ids) => onChange(pickerValue(field, ids))} />\n </div>;\n }\n}\n\n/** An ordered set of content inputs; submission and persistence belong to the app. */\nexport function EntryEditor({\n model,\n value,\n defaultValue = {},\n onValueChange,\n pickerItems = {},\n errors = {},\n isDisabled = false,\n showAllErrors = false,\n className,\n ...rest\n}: EntryEditorProps) {\n const [internal, setInternal] = useState<EntryValues>(defaultValue);\n const [changed, setChanged] = useState<Set<string>>(() => new Set());\n const current = value ?? internal;\n const validation = validateEntryValues(model, current);\n\n const commit = (id: string, next: EntryFieldValue | undefined) => {\n if (isDisabled) return;\n const values = { ...current };\n if (next === undefined) delete values[id];\n else values[id] = next;\n if (value === undefined) setInternal(values);\n setChanged((previous) => new Set(previous).add(id));\n onValueChange?.(values);\n };\n\n return (\n <div className={[\"ds-entry-editor\", className].filter(Boolean).join(\" \")} {...rest}>\n {model.fields.map((field) => {\n const stored = Object.hasOwn(current, field.id) ? current[field.id] : undefined;\n const isPicker = field.type === \"asset\" || field.type === \"reference\";\n const label = field.type === \"dateTime\" ? `${field.label} (UTC)` : field.label;\n const error = errors[field.id] ?? (showAllErrors || changed.has(field.id) ? validation[field.id] : undefined);\n return (\n <Field key={field.id} label={label} hint={field.hint} error={error} isRequired={field.required} isGroup={isPicker}>\n {(accessibility) => <EntryControl field={field} stored={stored} items={pickerItems[field.id] ?? []}\n isDisabled={isDisabled} accessibility={accessibility} onChange={(next) => commit(field.id, next)} />}\n </Field>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../components/Field/index.cjs"),t=require("../components/TextField/index.cjs"),n=require("./RichTextEditor-BxtlbjXj.cjs"),r=require("../components/EntryPicker/index.cjs"),i=require("../components/NumberField/index.cjs"),a=require("../components/Switch/index.cjs");let o=require("react"),s=require("react/jsx-runtime");var c=new Set([`shortText`,`longText`,`richText`,`number`,`boolean`,`dateTime`,`asset`,`reference`]);function l(e){let t=new Set;for(let n of e.fields){if(!n.id?.trim()||t.has(n.id))throw Error(`Content model field IDs must be nonempty and unique.`);if(!c.has(n.type))throw Error(`Unsupported content field type: ${n.type}`);t.add(n.id)}}function u(e){if(typeof e!=`string`)return;let t=/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2})(?::(\d{2})(?:\.(\d{1,3}))?)?(?:Z|\+00:00)$/.exec(e);if(!t)return;let n=`${t[1]}:${t[2]??`00`}.${(t[3]??``).padEnd(3,`0`)}Z`,r=new Date(n);if(Number.isFinite(r.getTime())&&r.toISOString()===n)return n}function d(e,t){return!!e&&typeof e==`object`&&t in e&&typeof e[t]==`string`&&e[t].trim().length>0}function f(e){return!!e.text?.trim()||e.type===`horizontalRule`||!!e.content?.some(f)}function p(e){return`${e.label} is required.`}function m(e,t){if(typeof t!=`string`)return`Enter text.`;if(e.required&&!t.trim())return p(e)}function h(e,t){let r=n.n(t);if(r)return r;if(e.required&&!f(t))return p(e)}function g(e,t){let n=e.type===`asset`?`assetId`:`entryId`;if(!(e.multiple?Array.isArray(t)&&t.every(e=>d(e,n)):d(t,n)))return e.multiple?`Choose a list of ${e.type===`asset`?`assets`:`entries`}.`:`Choose an ${e.type===`asset`?`asset`:`entry`}.`;if(e.required&&Array.isArray(t)&&t.length===0)return p(e)}var _={shortText:m,longText:m,richText:h,number:(e,t)=>typeof t==`number`&&Number.isFinite(t)?void 0:`Enter a finite number.`,boolean:(e,t)=>typeof t==`boolean`?void 0:`Choose a boolean value.`,dateTime:(e,t)=>u(t)?void 0:`Enter a valid UTC date and time.`,asset:g,reference:g};function v(e,t){return l(e),Object.fromEntries(e.fields.flatMap(e=>{let n=Object.hasOwn(t,e.id)?t[e.id]:void 0,r=n===void 0?e.required?p(e):void 0:_[e.type](e,n);return r?[[e.id,r]]:[]}))}function y(e,t){let n=e.type===`asset`?`assetId`:`entryId`;return(Array.isArray(t)?t:t===void 0?[]:[t]).flatMap(e=>{if(!e||typeof e!=`object`||!(n in e))return[];let t=e[n];return typeof t==`string`?[t]:[]})}function b(e,t){if(e.type===`asset`){let n=t.map(e=>({assetId:e}));return e.multiple?n:n[0]}let n=t.map(e=>({entryId:e}));return e.multiple?n:n[0]}function x({field:e,stored:o,items:c,isDisabled:l,accessibility:{required:d,...f},onChange:p}){switch(e.type){case`shortText`:case`longText`:{let n=e.type===`shortText`?t.TextField:t.TextArea;return(0,s.jsx)(n,{...f,required:d,disabled:l,placeholder:e.placeholder,value:typeof o==`string`?o:``,onChange:e=>p(e.target.value)})}case`number`:return(0,s.jsx)(i.NumberField,{...f,required:d,isDisabled:l,placeholder:e.placeholder,step:`any`,hasSteppers:!1,value:typeof o==`number`&&Number.isFinite(o)?o:``,onValueChange:e=>{(e===``||Number.isFinite(e))&&p(e===``?void 0:e)}});case`boolean`:return(0,s.jsx)(a.Switch,{...f,isDisabled:l,isSelected:o===!0,onSelectedChange:p});case`dateTime`:return(0,s.jsx)(t.TextField,{...f,required:d,disabled:l,type:`datetime-local`,step:`0.001`,value:u(o)?.slice(0,-1)??``,onChange:e=>p(u(`${e.target.value}Z`))});case`richText`:return(0,s.jsx)(n.t,{...f,label:e.label,isRequired:d,isDisabled:l,placeholder:e.placeholder,format:`json`,value:o===void 0?n.r:o,onChange:p});case`asset`:case`reference`:return(0,s.jsx)(`div`,{...f,role:`group`,children:(0,s.jsx)(r.EntryPicker,{items:c,value:y(e,o),label:e.type===`asset`?`Assets`:`Entries`,addLabel:`Choose ${e.label}`,mode:e.multiple?`multiple`:`single`,isDisabled:l,onValueChange:t=>p(b(e,t))})})}}function S({model:t,value:n,defaultValue:r={},onValueChange:i,pickerItems:a={},errors:c={},isDisabled:l=!1,showAllErrors:u=!1,className:d,...f}){let[p,m]=(0,o.useState)(r),[h,g]=(0,o.useState)(()=>new Set),_=n??p,y=v(t,_),b=(e,t)=>{if(l)return;let r={..._};t===void 0?delete r[e]:r[e]=t,n===void 0&&m(r),g(t=>new Set(t).add(e)),i?.(r)};return(0,s.jsx)(`div`,{className:[`ds-entry-editor`,d].filter(Boolean).join(` `),...f,children:t.fields.map(t=>{let n=Object.hasOwn(_,t.id)?_[t.id]:void 0,r=t.type===`asset`||t.type===`reference`,i=t.type===`dateTime`?`${t.label} (UTC)`:t.label,o=c[t.id]??(u||h.has(t.id)?y[t.id]:void 0);return(0,s.jsx)(e.Field,{label:i,hint:t.hint,error:o,isRequired:t.required,isGroup:r,children:e=>(0,s.jsx)(x,{field:t,stored:n,items:a[t.id]??[],isDisabled:l,accessibility:e,onChange:e=>b(t.id,e)})},t.id)})})}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return S}});
|
|
2
|
+
//# sourceMappingURL=EntryEditor-DIpc1iPF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryEditor-DIpc1iPF.cjs","names":["documentError","TextField","TextArea","NumberField","Switch","RichTextEditor","emptyDocument","EntryPicker","useState","Field","require_components_Field_index","require_components_TextField_index","require_RichTextEditor","require_components_EntryPicker_index","require_components_NumberField_index","require_components_Switch_index","react","react_jsx_runtime","fieldTypes","assertModel","ids","field","model","parseUtcDateTime","value","match","canonical","date","isLink","key","hasRichText","node","requiredError","textError","richTextError","error","linkError","item","validators","validateEntryValues","values","selectedIds","link","id","pickerValue","links","EntryControl","accessibility","Control","isDisabled","stored","onChange","event","next","required","EntryEditor","rest","internal","setInternal","defaultValue","changed","setChanged","current","validation","commit","previous","onValueChange","className","isPicker","label","errors","showAllErrors","pickerItems"],"sources":["../../src/components/EntryEditor/model.ts","../../src/components/EntryEditor/index.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/react\";\nimport { documentError } from \"../RichTextEditor/document\";\nimport type { RichTextDocument } from \"../RichTextEditor\";\n\ninterface ContentFieldBase {\n id: string;\n label: string;\n hint?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport type ContentField = ContentFieldBase & (\n | { type: \"shortText\" | \"longText\" | \"richText\" | \"number\" | \"boolean\" | \"dateTime\"; multiple?: never }\n | { type: \"asset\" | \"reference\"; multiple?: boolean }\n);\n\nexport interface ContentModel {\n fields: readonly ContentField[];\n}\n\nexport interface AssetValue { assetId: string }\nexport interface ReferenceValue { entryId: string }\nexport type EntryFieldValue = string | number | boolean | RichTextDocument | AssetValue | ReferenceValue | AssetValue[] | ReferenceValue[];\nexport type EntryValues = Record<string, EntryFieldValue | undefined>;\nexport type EntryErrors = Partial<Record<string, string>>;\n\nconst fieldTypes = new Set([\"shortText\", \"longText\", \"richText\", \"number\", \"boolean\", \"dateTime\", \"asset\", \"reference\"]);\n\nfunction assertModel(model: ContentModel) {\n const ids = new Set<string>();\n for (const field of model.fields) {\n if (!field.id?.trim() || ids.has(field.id)) throw new Error(\"Content model field IDs must be nonempty and unique.\");\n if (!fieldTypes.has(field.type)) throw new Error(`Unsupported content field type: ${field.type}`);\n ids.add(field.id);\n }\n}\n\n/** Accept UTC ISO strings without rolling invalid dates into the next month. */\nexport function parseUtcDateTime(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const match = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?(?:Z|\\+00:00)$/.exec(value);\n if (!match) return;\n const canonical = `${match[1]}:${match[2] ?? \"00\"}.${(match[3] ?? \"\").padEnd(3, \"0\")}Z`;\n const date = new Date(canonical);\n if (Number.isFinite(date.getTime()) && date.toISOString() === canonical) return canonical;\n}\n\nfunction isLink(value: unknown, key: \"assetId\" | \"entryId\"): boolean {\n return !!value && typeof value === \"object\" && key in value &&\n typeof (value as Record<string, unknown>)[key] === \"string\" &&\n ((value as Record<string, string>)[key]).trim().length > 0;\n}\n\nfunction hasRichText(node: JSONContent): boolean {\n return !!node.text?.trim() || node.type === \"horizontalRule\" || !!node.content?.some(hasRichText);\n}\n\nfunction requiredError(field: ContentField): string {\n return `${field.label} is required.`;\n}\n\nfunction textError(field: ContentField, value: unknown): string | undefined {\n if (typeof value !== \"string\") return \"Enter text.\";\n if (field.required && !value.trim()) return requiredError(field);\n}\n\nfunction richTextError(field: ContentField, value: unknown): string | undefined {\n const error = documentError(value);\n if (error) return error;\n if (field.required && !hasRichText(value as RichTextDocument)) return requiredError(field);\n}\n\nfunction linkError(field: ContentField, value: unknown): string | undefined {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n const valid = field.multiple\n ? Array.isArray(value) && value.every((item) => isLink(item, key))\n : isLink(value, key);\n if (!valid) {\n return field.multiple\n ? `Choose a list of ${field.type === \"asset\" ? \"assets\" : \"entries\"}.`\n : `Choose an ${field.type === \"asset\" ? \"asset\" : \"entry\"}.`;\n }\n if (field.required && Array.isArray(value) && value.length === 0) return requiredError(field);\n}\n\nconst validators: Record<ContentField[\"type\"], (field: ContentField, value: unknown) => string | undefined> = {\n shortText: textError,\n longText: textError,\n richText: richTextError,\n number: (_field, value) => typeof value === \"number\" && Number.isFinite(value) ? undefined : \"Enter a finite number.\",\n boolean: (_field, value) => typeof value === \"boolean\" ? undefined : \"Choose a boolean value.\",\n dateTime: (_field, value) => parseUtcDateTime(value) ? undefined : \"Enter a valid UTC date and time.\",\n asset: linkError,\n reference: linkError,\n};\n\n/** Validate data loaded from JSON as well as values emitted by EntryEditor. */\nexport function validateEntryValues(model: ContentModel, values: Record<string, unknown>): EntryErrors {\n assertModel(model);\n return Object.fromEntries(model.fields.flatMap((field): [string, string][] => {\n const value = Object.hasOwn(values, field.id) ? values[field.id] : undefined;\n const error = value === undefined\n ? field.required ? requiredError(field) : undefined\n : validators[field.type](field, value);\n return error ? [[field.id, error]] : [];\n }));\n}\n","import { useState, type HTMLAttributes } from \"react\";\nimport { EntryPicker, type EntryItem } from \"../EntryPicker\";\nimport { Field, type FieldProps } from \"../Field\";\nimport { NumberField } from \"../NumberField\";\nimport { RichTextEditor, type RichTextDocument } from \"../RichTextEditor\";\nimport { emptyDocument } from \"../RichTextEditor/document\";\nimport { Switch } from \"../Switch\";\nimport { TextArea, TextField } from \"../TextField\";\nimport { parseUtcDateTime, validateEntryValues, type ContentField, type ContentModel, type EntryErrors, type EntryFieldValue, type EntryValues } from \"./model\";\nimport \"./style.css\";\n\nexport { validateEntryValues } from \"./model\";\nexport type { AssetValue, ContentField, ContentModel, EntryErrors, EntryFieldValue, EntryValues, ReferenceValue } from \"./model\";\n\nexport interface EntryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n model: ContentModel;\n value?: EntryValues;\n defaultValue?: EntryValues;\n onValueChange?: (values: EntryValues) => void;\n /** Available assets or entries, keyed by content field ID. */\n pickerItems?: Record<string, EntryItem[]>;\n /** App-provided messages take precedence over built-in validation. */\n errors?: EntryErrors;\n isDisabled?: boolean;\n /** Reveal validation for untouched fields, for example after a submit attempt. */\n showAllErrors?: boolean;\n}\n\nfunction selectedIds(field: ContentField, value: EntryFieldValue | undefined): string[] {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n const links = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return links.flatMap((link) => {\n if (!link || typeof link !== \"object\" || !(key in link)) return [];\n const id = (link as unknown as Record<string, unknown>)[key];\n return typeof id === \"string\" ? [id] : [];\n });\n}\n\nfunction pickerValue(field: ContentField, ids: string[]): EntryFieldValue | undefined {\n if (field.type === \"asset\") {\n const links = ids.map((assetId) => ({ assetId }));\n return field.multiple ? links : links[0];\n }\n const links = ids.map((entryId) => ({ entryId }));\n return field.multiple ? links : links[0];\n}\n\nfunction EntryControl({ field, stored, items, isDisabled, accessibility: { required, ...accessibility }, onChange }: {\n field: ContentField;\n stored: EntryFieldValue | undefined;\n items: EntryItem[];\n isDisabled: boolean;\n accessibility: Parameters<FieldProps[\"children\"]>[0];\n onChange: (value: EntryFieldValue | undefined) => void;\n}) {\n switch (field.type) {\n case \"shortText\":\n case \"longText\": {\n const Control = field.type === \"shortText\" ? TextField : TextArea;\n return <Control {...accessibility} required={required} disabled={isDisabled} placeholder={field.placeholder}\n value={typeof stored === \"string\" ? stored : \"\"} onChange={(event) => onChange(event.target.value)} />;\n }\n case \"number\":\n return <NumberField {...accessibility} required={required} isDisabled={isDisabled} placeholder={field.placeholder} step=\"any\"\n hasSteppers={false} value={typeof stored === \"number\" && Number.isFinite(stored) ? stored : \"\"}\n onValueChange={(next) => { if (next === \"\" || Number.isFinite(next)) onChange(next === \"\" ? undefined : next); }} />;\n case \"boolean\":\n return <Switch {...accessibility} isDisabled={isDisabled} isSelected={stored === true} onSelectedChange={onChange} />;\n case \"dateTime\":\n return <TextField {...accessibility} required={required} disabled={isDisabled} type=\"datetime-local\" step=\"0.001\"\n value={parseUtcDateTime(stored)?.slice(0, -1) ?? \"\"}\n onChange={(event) => onChange(parseUtcDateTime(`${event.target.value}Z`))} />;\n case \"richText\":\n return <RichTextEditor {...accessibility} label={field.label} isRequired={required} isDisabled={isDisabled}\n placeholder={field.placeholder} format=\"json\" value={stored === undefined ? emptyDocument : stored as RichTextDocument}\n onChange={onChange} />;\n case \"asset\":\n case \"reference\":\n return <div {...accessibility} role=\"group\">\n <EntryPicker items={items} value={selectedIds(field, stored)}\n label={field.type === \"asset\" ? \"Assets\" : \"Entries\"} addLabel={`Choose ${field.label}`}\n mode={field.multiple ? \"multiple\" : \"single\"} isDisabled={isDisabled}\n onValueChange={(ids) => onChange(pickerValue(field, ids))} />\n </div>;\n }\n}\n\n/** An ordered set of content inputs; submission and persistence belong to the app. */\nexport function EntryEditor({\n model,\n value,\n defaultValue = {},\n onValueChange,\n pickerItems = {},\n errors = {},\n isDisabled = false,\n showAllErrors = false,\n className,\n ...rest\n}: EntryEditorProps) {\n const [internal, setInternal] = useState<EntryValues>(defaultValue);\n const [changed, setChanged] = useState<Set<string>>(() => new Set());\n const current = value ?? internal;\n const validation = validateEntryValues(model, current);\n\n const commit = (id: string, next: EntryFieldValue | undefined) => {\n if (isDisabled) return;\n const values = { ...current };\n if (next === undefined) delete values[id];\n else values[id] = next;\n if (value === undefined) setInternal(values);\n setChanged((previous) => new Set(previous).add(id));\n onValueChange?.(values);\n };\n\n return (\n <div className={[\"ds-entry-editor\", className].filter(Boolean).join(\" \")} {...rest}>\n {model.fields.map((field) => {\n const stored = Object.hasOwn(current, field.id) ? current[field.id] : undefined;\n const isPicker = field.type === \"asset\" || field.type === \"reference\";\n const label = field.type === \"dateTime\" ? `${field.label} (UTC)` : field.label;\n const error = errors[field.id] ?? (showAllErrors || changed.has(field.id) ? validation[field.id] : undefined);\n return (\n <Field key={field.id} label={label} hint={field.hint} error={error} isRequired={field.required} isGroup={isPicker}>\n {(accessibility) => <EntryControl field={field} stored={stored} items={pickerItems[field.id] ?? []}\n isDisabled={isDisabled} accessibility={accessibility} onChange={(next) => commit(field.id, next)} />}\n </Field>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../components/Button/index.cjs"),t=require("../components/ButtonGroup/index.cjs");;/* empty css */const n=require("../components/Field/index.cjs"),r=require("../components/Modal/index.cjs"),i=require("../components/TextField/index.cjs");let a=require("react"),o=require("react/jsx-runtime"),s=require("@tiptap/react"),c=require("@tiptap/extension-placeholder"),l=require("@tiptap/starter-kit"),u=require("@tiptap/extension-link");var d={type:`doc`,content:[{type:`paragraph`}]};function f(){return[l.StarterKit.configure({link:!1}),u.Link.configure({openOnClick:!1,autolink:!0})]}var p=(0,s.getSchema)(f());function m(e){return e.content?.length?e:{...e,content:d.content}}function h(e){try{if(!e||typeof e!=`object`||!(`type`in e)||e.type!==`doc`)throw Error();let t=e=>{let n=p.nodes[e.type??``];if(!n||Object.keys(e).some(e=>![`type`,`attrs`,`content`,`marks`,`text`].includes(e))||e.text!==void 0&&e.type!==`text`||e.attrs&&Object.keys(e.attrs).some(e=>!Object.hasOwn(n.spec.attrs??{},e)))throw Error();for(let t of e.marks??[]){let e=p.marks[t.type];if(!e||Object.keys(t).some(e=>![`type`,`attrs`].includes(e))||Object.keys(t.attrs??{}).some(t=>!Object.hasOwn(e.spec.attrs??{},t)))throw Error()}e.content?.forEach(t)},n=e;t(n),p.nodeFromJSON(m(n)).check()}catch{return`Unsupported or invalid rich-text document.`}}function g({editor:t,selection:s,onClose:c}){let[l,u]=(0,a.useState)(s.href),[d,f]=(0,a.useState)(),p=(0,a.useId)();(0,a.useEffect)(()=>{let e=()=>{t.state.doc.eq(s.document)||c()};return t.on(`transaction`,e),()=>{t.off(`transaction`,e)}},[t,s,c]);let m=()=>!t.isDestroyed&&t.isEditable&&t.state.doc.eq(s.document),h=()=>{if(!m()){c();return}let e=l.trim();if(!e||!t.can().setLink({href:e})){f(e?`Enter a valid link URL.`:`Enter a link URL.`);return}let n=t.chain().focus().setTextSelection({from:s.from,to:s.to});s.from===s.to&&!s.isEditing?n.setLink({href:e}).insertContent({type:`text`,text:e,marks:[{type:`link`,attrs:{href:e}}]}).run():n.setLink({href:e}).run(),c()};return(0,o.jsx)(r.Modal,{isOpen:!0,title:s.isEditing?`Edit link`:`Add link`,size:`dialog`,onClose:c,footer:(0,o.jsxs)(o.Fragment,{children:[s.isEditing&&(0,o.jsx)(e.Button,{variant:`danger`,onClick:()=>{m()&&t.chain().focus().setTextSelection({from:s.from,to:s.to}).unsetLink().run(),c()},children:`Remove link`}),(0,o.jsx)(e.Button,{onClick:c,children:`Cancel`}),(0,o.jsx)(e.Button,{variant:`primary`,type:`submit`,form:p,children:`Save`})]}),children:(0,o.jsx)(`form`,{id:p,noValidate:!0,onSubmit:e=>{e.preventDefault(),e.stopPropagation(),h()},children:(0,o.jsx)(n.Field,{label:`URL`,isRequired:!0,error:d,children:e=>(0,o.jsx)(i.TextField,{...e,value:l,inputMode:`url`,autoComplete:`url`,placeholder:`https://example.com`,onChange:e=>{u(e.target.value),f(void 0)}})})})})}var _=[[{id:`bold`,icon:`bold`,label:`Bold`,run:e=>e.chain().focus().toggleBold().run(),active:e=>e.isActive(`bold`)},{id:`italic`,icon:`italic`,label:`Italic`,run:e=>e.chain().focus().toggleItalic().run(),active:e=>e.isActive(`italic`)},{id:`strike`,icon:`strikethrough`,label:`Strikethrough`,run:e=>e.chain().focus().toggleStrike().run(),active:e=>e.isActive(`strike`)},{id:`code`,icon:`code`,label:`Inline code`,run:e=>e.chain().focus().toggleCode().run(),active:e=>e.isActive(`code`)}],[{id:`h2`,icon:`heading-2`,label:`Heading`,run:e=>e.chain().focus().toggleHeading({level:2}).run(),active:e=>e.isActive(`heading`,{level:2})},{id:`h3`,icon:`heading-3`,label:`Subheading`,run:e=>e.chain().focus().toggleHeading({level:3}).run(),active:e=>e.isActive(`heading`,{level:3})},{id:`quote`,icon:`quote`,label:`Quote`,run:e=>e.chain().focus().toggleBlockquote().run(),active:e=>e.isActive(`blockquote`)}],[{id:`ul`,icon:`list`,label:`Bulleted list`,run:e=>e.chain().focus().toggleBulletList().run(),active:e=>e.isActive(`bulletList`)},{id:`ol`,icon:`list-ordered`,label:`Numbered list`,run:e=>e.chain().focus().toggleOrderedList().run(),active:e=>e.isActive(`orderedList`)}],[{id:`undo`,icon:`undo`,label:`Undo`,run:e=>e.chain().focus().undo().run()},{id:`redo`,icon:`redo`,label:`Redo`,run:e=>e.chain().focus().redo().run()}]],
|
|
2
|
-
//# sourceMappingURL=RichTextEditor-
|
|
1
|
+
const e=require("../components/Button/index.cjs"),t=require("../components/ButtonGroup/index.cjs");;/* empty css */const n=require("../components/Field/index.cjs"),r=require("../components/Modal/index.cjs"),i=require("../components/TextField/index.cjs");let a=require("react"),o=require("react/jsx-runtime"),s=require("@tiptap/react"),c=require("@tiptap/extension-placeholder"),l=require("@tiptap/starter-kit"),u=require("@tiptap/extension-link");var d={type:`doc`,content:[{type:`paragraph`}]};function f(){return[l.StarterKit.configure({link:!1}),u.Link.configure({openOnClick:!1,autolink:!0})]}var p=(0,s.getSchema)(f());function m(e){return e.content?.length?e:{...e,content:d.content}}function h(e){try{if(!e||typeof e!=`object`||!(`type`in e)||e.type!==`doc`)throw Error();let t=e=>{let n=p.nodes[e.type??``];if(!n||Object.keys(e).some(e=>![`type`,`attrs`,`content`,`marks`,`text`].includes(e))||e.text!==void 0&&e.type!==`text`||e.attrs&&Object.keys(e.attrs).some(e=>!Object.hasOwn(n.spec.attrs??{},e)))throw Error();for(let t of e.marks??[]){let e=p.marks[t.type];if(!e||Object.keys(t).some(e=>![`type`,`attrs`].includes(e))||Object.keys(t.attrs??{}).some(t=>!Object.hasOwn(e.spec.attrs??{},t)))throw Error()}e.content?.forEach(t)},n=e;t(n),p.nodeFromJSON(m(n)).check()}catch{return`Unsupported or invalid rich-text document.`}}function g({editor:t,selection:s,onClose:c}){let[l,u]=(0,a.useState)(s.href),[d,f]=(0,a.useState)(),p=(0,a.useId)();(0,a.useEffect)(()=>{let e=()=>{t.state.doc.eq(s.document)||c()};return t.on(`transaction`,e),()=>{t.off(`transaction`,e)}},[t,s,c]);let m=()=>!t.isDestroyed&&t.isEditable&&t.state.doc.eq(s.document),h=()=>{if(!m()){c();return}let e=l.trim();if(!e||!t.can().setLink({href:e})){f(e?`Enter a valid link URL.`:`Enter a link URL.`);return}let n=t.chain().focus().setTextSelection({from:s.from,to:s.to});s.from===s.to&&!s.isEditing?n.setLink({href:e}).insertContent({type:`text`,text:e,marks:[{type:`link`,attrs:{href:e}}]}).run():n.setLink({href:e}).run(),c()};return(0,o.jsx)(r.Modal,{isOpen:!0,title:s.isEditing?`Edit link`:`Add link`,size:`dialog`,onClose:c,footer:(0,o.jsxs)(o.Fragment,{children:[s.isEditing&&(0,o.jsx)(e.Button,{variant:`danger`,onClick:()=>{m()&&t.chain().focus().setTextSelection({from:s.from,to:s.to}).unsetLink().run(),c()},children:`Remove link`}),(0,o.jsx)(e.Button,{onClick:c,children:`Cancel`}),(0,o.jsx)(e.Button,{variant:`primary`,type:`submit`,form:p,children:`Save`})]}),children:(0,o.jsx)(`form`,{id:p,noValidate:!0,onSubmit:e=>{e.preventDefault(),e.stopPropagation(),h()},children:(0,o.jsx)(n.Field,{label:`URL`,isRequired:!0,error:d,children:e=>(0,o.jsx)(i.TextField,{...e,value:l,inputMode:`url`,autoComplete:`url`,placeholder:`https://example.com`,onChange:e=>{u(e.target.value),f(void 0)}})})})})}var _=[[{id:`bold`,icon:`bold`,label:`Bold`,run:e=>e.chain().focus().toggleBold().run(),active:e=>e.isActive(`bold`)},{id:`italic`,icon:`italic`,label:`Italic`,run:e=>e.chain().focus().toggleItalic().run(),active:e=>e.isActive(`italic`)},{id:`strike`,icon:`strikethrough`,label:`Strikethrough`,run:e=>e.chain().focus().toggleStrike().run(),active:e=>e.isActive(`strike`)},{id:`code`,icon:`code`,label:`Inline code`,run:e=>e.chain().focus().toggleCode().run(),active:e=>e.isActive(`code`)}],[{id:`h2`,icon:`heading-2`,label:`Heading`,run:e=>e.chain().focus().toggleHeading({level:2}).run(),active:e=>e.isActive(`heading`,{level:2})},{id:`h3`,icon:`heading-3`,label:`Subheading`,run:e=>e.chain().focus().toggleHeading({level:3}).run(),active:e=>e.isActive(`heading`,{level:3})},{id:`quote`,icon:`quote`,label:`Quote`,run:e=>e.chain().focus().toggleBlockquote().run(),active:e=>e.isActive(`blockquote`)}],[{id:`ul`,icon:`list`,label:`Bulleted list`,run:e=>e.chain().focus().toggleBulletList().run(),active:e=>e.isActive(`bulletList`)},{id:`ol`,icon:`list-ordered`,label:`Numbered list`,run:e=>e.chain().focus().toggleOrderedList().run(),active:e=>e.isActive(`orderedList`)}],[{id:`undo`,icon:`undo`,label:`Undo`,run:e=>e.chain().focus().undo().run()},{id:`redo`,icon:`redo`,label:`Redo`,run:e=>e.chain().focus().redo().run()}]];function v({editor:n,state:r,disabled:i,label:a,toolbarExtra:s,openLink:c}){return(0,o.jsxs)(`div`,{className:`ds-rte__toolbar`,role:`toolbar`,"aria-label":`${a} formatting`,children:[_.map((a,s)=>(0,o.jsx)(t.ButtonGroup,{"aria-label":`Formatting ${s+1}`,children:a.map(t=>(0,o.jsx)(e.Button,{size:`sm`,isIconOnly:!0,iconStart:t.icon,"aria-label":t.label,title:t.label,"aria-pressed":t.active?r?.active[t.id]:void 0,variant:r?.active[t.id]?`active`:`neutral`,isDisabled:i||!n,onClick:()=>n&&t.run(n)},t.id))},s)),(0,o.jsx)(t.ButtonGroup,{"aria-label":`Link`,children:(0,o.jsx)(e.Button,{size:`sm`,isIconOnly:!0,iconStart:`link`,"aria-label":r?.linkActive?`Edit link`:`Add link`,title:r?.linkActive?`Edit link`:`Add link`,variant:r?.linkActive?`active`:`neutral`,isDisabled:i||!n,onClick:()=>n&&c(n.state,n.isActive(`link`)?n.state.selection.from:void 0)})}),s]})}var y=(0,a.forwardRef)(function(e,t){let{placeholder:n=`Write something…`,size:r=`md`,isDisabled:i=!1,isInvalid:l=!1,label:u=`Rich text editor`,className:p,toolbarExtra:y,id:b,isRequired:x,"aria-labelledby":S,"aria-describedby":C,"aria-invalid":w}=e,[T,E]=(0,a.useState)(!1),[D,O]=(0,a.useState)(null),k=(0,a.useCallback)(()=>O(null),[]),[A]=(0,a.useState)(()=>e.defaultValue??(e.format===`json`?d:``)),j=e.value===void 0?A:e.value,M=(0,a.useMemo)(()=>e.format===`json`?h(j):void 0,[e.format,j]),N=(0,a.useId)(),P=l||!!M||w,F=i||!!M;F&&D&&O(null);let I=(0,a.useCallback)((e,t)=>{if(F)return;let n=t===void 0?void 0:(0,s.getMarkRange)(e.doc.resolve(t),e.schema.marks.link),r=n&&e.doc.nodeAt(n.from)?.marks.find(t=>t.type===e.schema.marks.link);O({from:n?.from??e.selection.from,to:n?.to??e.selection.to,href:r?.attrs.href??``,isEditing:!!r,document:e.doc})},[F]),L=(0,a.useMemo)(()=>({role:`textbox`,"aria-label":u,"aria-multiline":`true`,...b?{id:b}:{},...S?{"aria-labelledby":S}:{},...C?{"aria-describedby":C}:{},...P?{"aria-invalid":String(P)}:{},...x?{"aria-required":`true`}:{}}),[u,b,S,C,P,x]),R=(0,a.useMemo)(()=>({attributes:L,handleDOMEvents:{click:(e,t)=>{let n=t.target instanceof Element?t.target.closest(`a`):null;return!n||!e.dom.contains(n)?!1:(t.preventDefault(),e.editable&&I(e.state,e.posAtDOM(n,0)),!0)}}}),[L,I]),z=(0,s.useEditor)({immediatelyRender:!1,editable:!F,content:M?d:typeof j==`string`?j:m(j),extensions:[...f(),c.Placeholder.configure({placeholder:n})],editorProps:R,onFocus:()=>E(!0),onBlur:()=>E(!1),onUpdate:({editor:t})=>{F||(e.format===`json`?e.onChange?.(t.getJSON()):e.onChange?.(t.getHTML()))}});(0,a.useEffect)(()=>{z&&(z.setEditable(!F,!1),z.setOptions({editorProps:R}))},[z,F,R]),(0,a.useEffect)(()=>{if(!z||e.value===void 0||M)return;let t=typeof e.value==`string`?(0,s.createDocument)(e.value,z.schema):z.schema.nodeFromJSON(m(e.value));t.eq(z.state.doc)||z.commands.setContent(t,{emitUpdate:!1})},[z,e.value,M]);let B=(0,s.useEditorState)({editor:z,selector:({editor:e})=>e?{active:Object.fromEntries(_.flat().map(t=>[t.id,t.active?.(e)??!1])),linkActive:e.isActive(`link`)}:null});return(0,o.jsxs)(`div`,{ref:t,className:[`ds-rte`,p].filter(Boolean).join(` `),"data-focused":T||void 0,"data-disabled":F||void 0,"aria-invalid":P||void 0,children:[M&&(0,o.jsx)(`p`,{id:N,role:`alert`,className:`ds-field__error`,children:M}),(0,o.jsxs)(`div`,{hidden:!!M,children:[(0,o.jsx)(v,{editor:z,state:B,disabled:F,label:u,toolbarExtra:y,openLink:I}),(0,o.jsx)(`div`,{className:`ds-rte__content`,"data-size":r,children:(0,o.jsx)(s.EditorContent,{editor:z})})]}),z&&D&&!F&&(0,o.jsx)(g,{editor:z,selection:D,onClose:k})]})});Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return y}});
|
|
2
|
+
//# sourceMappingURL=RichTextEditor-BxtlbjXj.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextEditor-BxtlbjXj.cjs","names":["StarterKit","Link","getSchema","useState","useId","Modal","_Fragment","Button","Field","TextField","ButtonGroup","forwardRef","useCallback","useMemo","getMarkRange","useEditor","Placeholder","createDocument","useEditorState","EditorContent","require_components_Button_index","require_components_ButtonGroup_index","require_components_Field_index","require_components_Modal_index","require_components_TextField_index","react","react_jsx_runtime","_tiptap_react","_tiptap_extension_placeholder","_tiptap_starter_kit","_tiptap_extension_link","emptyDocument","richTextExtensions","schema","normalizeDocument","document","documentError","value","check","type","node","key","mark","markType","LinkDialog","href","setHref","selection","error","setError","formId","onTransaction","editor","onClose","canEdit","save","url","chain","event","field","GROUPS","EditorToolbar","label","i","group","tool","state","disabled","openLink","toolbarExtra","RichTextEditor","labelledBy","describedBy","ariaInvalid","props","isFocused","setIsFocused","linkSelection","setLinkSelection","closeLink","initialValue","content","contentError","errorId","invalid","isInvalid","isDisabled","range","position","link","attributes","id","isRequired","editorProps","anchor","view","e","next","className","size"],"sources":["../../src/components/RichTextEditor/document.ts","../../src/components/RichTextEditor/index.tsx"],"sourcesContent":["import { getSchema, type JSONContent } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport { Link } from \"@tiptap/extension-link\";\n\nexport type RichTextDocument = JSONContent & { type: \"doc\" };\n\nexport const emptyDocument: RichTextDocument = { type: \"doc\", content: [{ type: \"paragraph\" }] };\n\nexport function richTextExtensions() {\n return [StarterKit.configure({ link: false }), Link.configure({ openOnClick: false, autolink: true })];\n}\n\nconst schema = getSchema(richTextExtensions());\n\n/** ProseMirror represents an empty writing surface with one empty paragraph. */\nexport function normalizeDocument(document: RichTextDocument): RichTextDocument {\n return !document.content?.length ? { ...document, content: emptyDocument.content } : document;\n}\n\nexport function documentError(value: unknown): string | undefined {\n try {\n if (!value || typeof value !== \"object\" || !(\"type\" in value) || value.type !== \"doc\") throw new Error();\n const check = (node: JSONContent) => {\n const type = schema.nodes[node.type ?? \"\"];\n if (!type || Object.keys(node).some((key) => ![\"type\", \"attrs\", \"content\", \"marks\", \"text\"].includes(key)) ||\n (node.text !== undefined && node.type !== \"text\") ||\n (node.attrs && Object.keys(node.attrs).some((key) => !Object.hasOwn(type.spec.attrs ?? {}, key)))) {\n throw new Error();\n }\n for (const mark of node.marks ?? []) {\n const markType = schema.marks[mark.type];\n if (!markType || Object.keys(mark).some((key) => ![\"type\", \"attrs\"].includes(key)) ||\n Object.keys(mark.attrs ?? {}).some((key) => !Object.hasOwn(markType.spec.attrs ?? {}, key))) {\n throw new Error();\n }\n }\n node.content?.forEach(check);\n };\n const document = value as RichTextDocument;\n check(document);\n schema.nodeFromJSON(normalizeDocument(document)).check();\n } catch {\n return \"Unsupported or invalid rich-text document.\";\n }\n}\n","import { forwardRef, useCallback, useEffect, useId, useMemo, useState, type AriaAttributes, type ReactNode } from \"react\";\nimport { createDocument, EditorContent, getMarkRange, useEditor, useEditorState, type Editor, type EditorOptions } from \"@tiptap/react\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { Button } from \"../Button\";\nimport { ButtonGroup } from \"../ButtonGroup\";\nimport { Field } from \"../Field\";\nimport { Modal } from \"../Modal\";\nimport { TextField } from \"../TextField\";\nimport type { IconName } from \"../Icon/icons\";\nimport { documentError, emptyDocument, normalizeDocument, richTextExtensions, type RichTextDocument } from \"./document\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport type RichTextEditorSize = \"sm\" | \"md\" | \"lg\";\n\nexport type { RichTextDocument } from \"./document\";\n\ninterface RichTextEditorCommonProps {\n placeholder?: string;\n size?: RichTextEditorSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Accessible name for the editing surface. */\n label?: string;\n className?: string;\n /** Extra controls appended to the toolbar, e.g. a word count. */\n toolbarExtra?: ReactNode;\n /** Applied to the editable surface. */\n id?: string;\n isRequired?: boolean;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: AriaAttributes[\"aria-invalid\"];\n}\n\nexport type RichTextEditorProps = RichTextEditorCommonProps & (\n | { format?: \"html\"; value?: string; defaultValue?: string; onChange?: (html: string) => void }\n | { format: \"json\"; value?: RichTextDocument; defaultValue?: RichTextDocument; onChange?: (document: RichTextDocument) => void }\n);\n\ninterface ToolItem {\n id: string;\n icon: IconName;\n label: string;\n run: (editor: Editor) => void;\n active?: (editor: Editor) => boolean;\n}\n\ninterface LinkSelection {\n from: number;\n to: number;\n href: string;\n isEditing: boolean;\n document: Editor[\"state\"][\"doc\"];\n}\n\nfunction LinkDialog({ editor, selection, onClose }: {\n editor: Editor;\n selection: LinkSelection;\n onClose: () => void;\n}) {\n const [href, setHref] = useState(selection.href);\n const [error, setError] = useState<string>();\n const formId = useId();\n\n useEffect(() => {\n const onTransaction = () => {\n if (!editor.state.doc.eq(selection.document)) onClose();\n };\n editor.on(\"transaction\", onTransaction);\n return () => { editor.off(\"transaction\", onTransaction); };\n }, [editor, selection, onClose]);\n\n const canEdit = () => !editor.isDestroyed && editor.isEditable && editor.state.doc.eq(selection.document);\n const save = () => {\n if (!canEdit()) { onClose(); return; }\n const url = href.trim();\n if (!url || !editor.can().setLink({ href: url })) {\n setError(url ? \"Enter a valid link URL.\" : \"Enter a link URL.\");\n return;\n }\n const chain = editor.chain().focus().setTextSelection({ from: selection.from, to: selection.to });\n if (selection.from === selection.to && !selection.isEditing) {\n chain.setLink({ href: url }).insertContent({ type: \"text\", text: url, marks: [{ type: \"link\", attrs: { href: url } }] }).run();\n } else {\n chain.setLink({ href: url }).run();\n }\n onClose();\n };\n\n return (\n <Modal isOpen title={selection.isEditing ? \"Edit link\" : \"Add link\"} size=\"dialog\" onClose={onClose}\n footer={<>\n {selection.isEditing && <Button variant=\"danger\" onClick={() => {\n if (canEdit()) editor.chain().focus().setTextSelection({ from: selection.from, to: selection.to }).unsetLink().run();\n onClose();\n }}>Remove link</Button>}\n <Button onClick={onClose}>Cancel</Button>\n <Button variant=\"primary\" type=\"submit\" form={formId}>Save</Button>\n </>}>\n <form id={formId} noValidate onSubmit={(event) => { event.preventDefault(); event.stopPropagation(); save(); }}>\n <Field label=\"URL\" isRequired error={error}>\n {(field) => <TextField {...field} value={href} inputMode=\"url\" autoComplete=\"url\"\n placeholder=\"https://example.com\" onChange={(event) => { setHref(event.target.value); setError(undefined); }} />}\n </Field>\n </form>\n </Modal>\n );\n}\n\nconst GROUPS: ToolItem[][] = [\n [\n {\n id: \"bold\",\n icon: \"bold\",\n label: \"Bold\",\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive(\"bold\"),\n },\n {\n id: \"italic\",\n icon: \"italic\",\n label: \"Italic\",\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive(\"italic\"),\n },\n {\n id: \"strike\",\n icon: \"strikethrough\",\n label: \"Strikethrough\",\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive(\"strike\"),\n },\n {\n id: \"code\",\n icon: \"code\",\n label: \"Inline code\",\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive(\"code\"),\n },\n ],\n [\n {\n id: \"h2\",\n icon: \"heading-2\",\n label: \"Heading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n {\n id: \"h3\",\n icon: \"heading-3\",\n label: \"Subheading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n {\n id: \"quote\",\n icon: \"quote\",\n label: \"Quote\",\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive(\"blockquote\"),\n },\n ],\n [\n {\n id: \"ul\",\n icon: \"list\",\n label: \"Bulleted list\",\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive(\"bulletList\"),\n },\n {\n id: \"ol\",\n icon: \"list-ordered\",\n label: \"Numbered list\",\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive(\"orderedList\"),\n },\n ],\n [\n {\n id: \"undo\",\n icon: \"undo\",\n label: \"Undo\",\n run: (e) => e.chain().focus().undo().run(),\n },\n {\n id: \"redo\",\n icon: \"redo\",\n label: \"Redo\",\n run: (e) => e.chain().focus().redo().run(),\n },\n ],\n];\n\ninterface ToolbarState {\n active: Record<string, boolean>;\n linkActive: boolean;\n}\n\nfunction EditorToolbar({ editor, state, disabled, label, toolbarExtra, openLink }: {\n editor: Editor | null;\n state: ToolbarState | null;\n disabled: boolean;\n label: string;\n toolbarExtra: ReactNode;\n openLink: (state: Editor[\"state\"], position?: number) => void;\n}) {\n return (\n <div className=\"ds-rte__toolbar\" role=\"toolbar\" aria-label={`${label} formatting`}>\n {GROUPS.map((group, i) => (\n <ButtonGroup key={i} aria-label={`Formatting ${i + 1}`}>\n {group.map((tool) => (\n <Button\n key={tool.id}\n size=\"sm\"\n isIconOnly\n iconStart={tool.icon}\n aria-label={tool.label}\n title={tool.label}\n aria-pressed={tool.active ? state?.active[tool.id] : undefined}\n variant={state?.active[tool.id] ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={() => editor && tool.run(editor)}\n />\n ))}\n </ButtonGroup>\n ))}\n <ButtonGroup aria-label=\"Link\">\n <Button\n size=\"sm\"\n isIconOnly\n iconStart=\"link\"\n aria-label={state?.linkActive ? \"Edit link\" : \"Add link\"}\n title={state?.linkActive ? \"Edit link\" : \"Add link\"}\n variant={state?.linkActive ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={() => editor && openLink(editor.state, editor.isActive(\"link\") ? editor.state.selection.from : undefined)}\n />\n </ButtonGroup>\n {toolbarExtra}\n </div>\n );\n}\n\n/**\n * The editorial writing surface. Rich text plus links — the same field skin,\n * radius and states as `TextField`, with the toolbar inside the frame.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n props,\n ref,\n ) {\n const {\n placeholder = \"Write something…\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n label = \"Rich text editor\",\n className,\n toolbarExtra,\n id,\n isRequired,\n \"aria-labelledby\": labelledBy,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": ariaInvalid,\n } = props;\n const [isFocused, setIsFocused] = useState(false);\n const [linkSelection, setLinkSelection] = useState<LinkSelection | null>(null);\n const closeLink = useCallback(() => setLinkSelection(null), []);\n const [initialValue] = useState(() => props.defaultValue ?? (props.format === \"json\" ? emptyDocument : \"\"));\n const content = props.value !== undefined ? props.value : initialValue;\n const contentError = useMemo(() => props.format === \"json\" ? documentError(content) : undefined, [props.format, content]);\n const errorId = useId();\n const invalid = isInvalid || !!contentError || ariaInvalid;\n const disabled = isDisabled || !!contentError;\n if (disabled && linkSelection) setLinkSelection(null);\n const openLink = useCallback((state: Editor[\"state\"], position?: number) => {\n if (disabled) return;\n const range = position === undefined ? undefined : getMarkRange(state.doc.resolve(position), state.schema.marks.link);\n const link = range && state.doc.nodeAt(range.from)?.marks.find((mark) => mark.type === state.schema.marks.link);\n setLinkSelection({\n from: range?.from ?? state.selection.from,\n to: range?.to ?? state.selection.to,\n href: link?.attrs.href ?? \"\",\n isEditing: !!link,\n document: state.doc,\n });\n }, [disabled]);\n const attributes = useMemo(() => ({\n role: \"textbox\",\n \"aria-label\": label,\n \"aria-multiline\": \"true\",\n ...(id ? { id } : {}),\n ...(labelledBy ? { \"aria-labelledby\": labelledBy } : {}),\n ...(describedBy ? { \"aria-describedby\": describedBy } : {}),\n ...(invalid ? { \"aria-invalid\": String(invalid) } : {}),\n ...(isRequired ? { \"aria-required\": \"true\" } : {}),\n }), [label, id, labelledBy, describedBy, invalid, isRequired]);\n const editorProps = useMemo<EditorOptions[\"editorProps\"]>(() => ({\n attributes,\n handleDOMEvents: { click: (view, event) => {\n const anchor = event.target instanceof Element ? event.target.closest(\"a\") : null;\n if (!anchor || !view.dom.contains(anchor)) return false;\n event.preventDefault();\n if (view.editable) openLink(view.state, view.posAtDOM(anchor, 0));\n return true;\n } },\n }), [attributes, openLink]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n content: contentError ? emptyDocument : typeof content === \"string\" ? content : normalizeDocument(content),\n extensions: [\n ...richTextExtensions(),\n Placeholder.configure({ placeholder }),\n ],\n editorProps,\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onUpdate: ({ editor: e }) => {\n if (disabled) return;\n if (props.format === \"json\") props.onChange?.(e.getJSON() as RichTextDocument);\n else props.onChange?.(e.getHTML());\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!disabled, false);\n editor.setOptions({ editorProps });\n }, [editor, disabled, editorProps]);\n\n useEffect(() => {\n if (!editor || props.value === undefined || contentError) return;\n const next = typeof props.value === \"string\"\n ? createDocument(props.value, editor.schema)\n : editor.schema.nodeFromJSON(normalizeDocument(props.value));\n // Parent echoes should preserve the current selection and undo history.\n if (!next.eq(editor.state.doc)) {\n editor.commands.setContent(next, { emitUpdate: false });\n }\n }, [editor, props.value, contentError]);\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n e\n ? {\n active: Object.fromEntries(\n GROUPS.flat().map((t) => [t.id, t.active?.(e) ?? false]),\n ),\n linkActive: e.isActive(\"link\"),\n }\n : null,\n });\n\n return (\n <div\n ref={ref}\n className={[\"ds-rte\", className].filter(Boolean).join(\" \")}\n data-focused={isFocused || undefined}\n data-disabled={disabled || undefined}\n aria-invalid={invalid || undefined}\n >\n {contentError && <p id={errorId} role=\"alert\" className=\"ds-field__error\">{contentError}</p>}\n <div hidden={!!contentError}>\n <EditorToolbar editor={editor} state={state} disabled={disabled} label={label}\n toolbarExtra={toolbarExtra} openLink={openLink} />\n <div className=\"ds-rte__content\" data-size={size}>\n <EditorContent editor={editor} />\n </div>\n </div>\n {editor && linkSelection && !disabled && <LinkDialog editor={editor} selection={linkSelection} onClose={closeLink} />}\n </div>\n );\n },\n);\n"],"mappings":"A,+cAMA,IAAa+B,EAAkC,CAAE,KAAM,MAAO,QAAS,CAAC,CAAE,KAAM,WAAY,CAAC,CAAE,EAE/F,SAAgBC,GAAqB,CACnC,MAAO,CAAChC,EAAAA,WAAW,UAAU,CAAE,KAAM,EAAM,CAAC,EAAGC,EAAAA,KAAK,UAAU,CAAE,YAAa,GAAO,SAAU,EAAK,CAAC,CAAC,CACvG,CAEA,IAAMgC,GAAA,EAAS/B,EAAAA,UAAAA,CAAU8B,EAAmB,CAAC,EAG7C,SAAgBE,EAAkB,EAA8C,CAC9E,OAAQC,EAAS,SAAS,OAA2DA,EAAlD,CAAE,GAAGA,EAAU,QAASJ,EAAc,OAAQ,CACnF,CAEA,SAAgBK,EAAc,EAAoC,CAChE,GAAI,CACF,GAAI,CAACC,GAAS,OAAOA,GAAU,UAAY,EAAE,SAAUA,IAAUA,EAAM,OAAS,MAAO,MAAU,MAAM,EACvG,IAAMC,EAAS,GAAsB,CACnC,IAAMC,EAAON,EAAO,MAAMO,EAAK,MAAQ,IACvC,GAAI,CAACD,GAAQ,OAAO,KAAKC,CAAI,CAAC,CAAC,KAAM,GAAQ,CAAC,CAAC,OAAQ,QAAS,UAAW,QAAS,MAAM,CAAC,CAAC,SAASC,CAAG,CAAC,GACtGD,EAAK,OAAS,IAAA,IAAaA,EAAK,OAAS,QACzCA,EAAK,OAAS,OAAO,KAAKA,EAAK,KAAK,CAAC,CAAC,KAAM,GAAQ,CAAC,OAAO,OAAOD,EAAK,KAAK,OAAS,CAAC,EAAGE,CAAG,CAAC,EAC/F,MAAU,MAAM,EAElB,IAAK,IAAMC,KAAQF,EAAK,OAAS,CAAC,EAAG,CACnC,IAAMG,EAAWV,EAAO,MAAMS,EAAK,MACnC,GAAI,CAACC,GAAY,OAAO,KAAKD,CAAI,CAAC,CAAC,KAAM,GAAQ,CAAC,CAAC,OAAQ,OAAO,CAAC,CAAC,SAASD,CAAG,CAAC,GAC/E,OAAO,KAAKC,EAAK,OAAS,CAAC,CAAC,CAAC,CAAC,KAAM,GAAQ,CAAC,OAAO,OAAOC,EAAS,KAAK,OAAS,CAAC,EAAGF,CAAG,CAAC,EAC1F,MAAU,MAAM,CAEpB,CACAD,EAAK,SAAS,QAAQF,CAAK,CAC7B,EACMH,EAAWE,EACjBC,EAAMH,CAAQ,EACdF,EAAO,aAAaC,EAAkBC,CAAQ,CAAC,CAAC,CAAC,MAAM,CACzD,MAAQ,CACN,MAAO,4CACT,CACF,CCYA,SAASS,EAAW,CAAE,SAAQ,YAAW,WAItC,CACD,GAAM,CAACC,EAAMC,IAAA,EAAW3C,EAAAA,SAAAA,CAAS4C,EAAU,IAAI,EACzC,CAACC,EAAOC,IAAA,EAAY9C,EAAAA,SAAAA,CAAiB,EACrC+C,GAAA,EAAS9C,EAAAA,MAAAA,CAAM,GAErB,EAAAqB,EAAA,UAAA,KAAgB,CACd,IAAM0B,MAAsB,CACrBC,EAAO,MAAM,IAAI,GAAGL,EAAU,QAAQ,GAAGM,EAAQ,CACxD,EAEA,OADAD,EAAO,GAAG,cAAeD,CAAa,MACzB,CAAEC,EAAO,IAAI,cAAeD,CAAa,CAAG,CAC3D,EAAG,CAACC,EAAQL,EAAWM,CAAO,CAAC,EAE/B,IAAMC,MAAgB,CAACF,EAAO,aAAeA,EAAO,YAAcA,EAAO,MAAM,IAAI,GAAGL,EAAU,QAAQ,EAClGQ,MAAa,CACjB,GAAI,CAACD,EAAQ,EAAG,CAAED,EAAQ,EAAG,MAAQ,CACrC,IAAMG,EAAMX,EAAK,KAAK,EACtB,GAAI,CAACW,GAAO,CAACJ,EAAO,IAAI,CAAC,CAAC,QAAQ,CAAE,KAAMI,CAAI,CAAC,EAAG,CAChDP,EAASO,EAAM,0BAA4B,mBAAmB,EAC9D,MACF,CACA,IAAMC,EAAQL,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAE,KAAML,EAAU,KAAM,GAAIA,EAAU,EAAG,CAAC,EAC5FA,EAAU,OAASA,EAAU,IAAM,CAACA,EAAU,UAChDU,EAAM,QAAQ,CAAE,KAAMD,CAAI,CAAC,CAAC,CAAC,cAAc,CAAE,KAAM,OAAQ,KAAMA,EAAK,MAAO,CAAC,CAAE,KAAM,OAAQ,MAAO,CAAE,KAAMA,CAAI,CAAE,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,EAE7HC,EAAM,QAAQ,CAAE,KAAMD,CAAI,CAAC,CAAC,CAAC,IAAI,EAEnCH,EAAQ,CACV,EAEA,OACE,EAAA3B,EAAA,IAAA,CAACrB,EAAAA,MAAD,CAAO,OAAA,GAAO,MAAO0C,EAAU,UAAY,YAAc,WAAY,KAAK,SAAkB,UAC1F,QAAQ,EAAArB,EAAA,KAAA,CAAApB,EAAAA,SAAA,CAAA,SAAA,CACLyC,EAAU,YAAa,EAAArB,EAAA,IAAA,CAACnB,EAAAA,OAAD,CAAQ,QAAQ,SAAS,YAAe,CAC1D+C,EAAQ,GAAGF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAE,KAAML,EAAU,KAAM,GAAIA,EAAU,EAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,EACnHM,EAAQ,CACV,EAAG,SAAA,aAAmB,CAAA,GACtB,EAAA3B,EAAA,IAAA,CAACnB,EAAAA,OAAD,CAAQ,QAAS8C,EAAS,SAAA,QAAc,CAAA,GACxC,EAAA3B,EAAA,IAAA,CAACnB,EAAAA,OAAD,CAAQ,QAAQ,UAAU,KAAK,SAAS,KAAM2C,EAAQ,SAAA,MAAY,CAAA,CAClE,CAAA,CAAA,EACF,UAAA,EAAAxB,EAAA,IAAA,CAAC,OAAD,CAAM,GAAIwB,EAAQ,WAAA,GAAW,SAAW,GAAU,CAAEQ,EAAM,eAAe,EAAGA,EAAM,gBAAgB,EAAGH,EAAK,CAAG,EAC3G,UAAA,EAAA7B,EAAA,IAAA,CAAClB,EAAAA,MAAD,CAAO,MAAM,MAAM,WAAA,GAAkB,QACjC,SAAA,IAAU,EAAAkB,EAAA,IAAA,CAACjB,EAAAA,UAAD,CAAW,GAAIkD,EAAO,MAAOd,EAAM,UAAU,MAAM,aAAa,MAC1E,YAAY,sBAAsB,SAAW,GAAU,CAAEC,EAAQY,EAAM,OAAO,KAAK,EAAGT,EAAS,IAAA,EAAS,CAAG,CAAI,CAAA,CAC5G,CAAA,CACH,CAAA,CACD,CAAA,CAEX,CAEA,IAAMW,EAAuB,CAC3B,CACE,CACE,GAAI,OACJ,KAAM,OACN,MAAO,OACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAC/C,OAAS,GAAM,EAAE,SAAS,MAAM,CAClC,EACA,CACE,GAAI,SACJ,KAAM,SACN,MAAO,SACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,EACjD,OAAS,GAAM,EAAE,SAAS,QAAQ,CACpC,EACA,CACE,GAAI,SACJ,KAAM,gBACN,MAAO,gBACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,EACjD,OAAS,GAAM,EAAE,SAAS,QAAQ,CACpC,EACA,CACE,GAAI,OACJ,KAAM,OACN,MAAO,cACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAC/C,OAAS,GAAM,EAAE,SAAS,MAAM,CAClC,CACF,EACA,CACE,CACE,GAAI,KACJ,KAAM,YACN,MAAO,UACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAE,MAAO,CAAE,CAAC,CAAC,CAAC,IAAI,EAC9D,OAAS,GAAM,EAAE,SAAS,UAAW,CAAE,MAAO,CAAE,CAAC,CACnD,EACA,CACE,GAAI,KACJ,KAAM,YACN,MAAO,aACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAE,MAAO,CAAE,CAAC,CAAC,CAAC,IAAI,EAC9D,OAAS,GAAM,EAAE,SAAS,UAAW,CAAE,MAAO,CAAE,CAAC,CACnD,EACA,CACE,GAAI,QACJ,KAAM,QACN,MAAO,QACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,EACrD,OAAS,GAAM,EAAE,SAAS,YAAY,CACxC,CACF,EACA,CACE,CACE,GAAI,KACJ,KAAM,OACN,MAAO,gBACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,EACrD,OAAS,GAAM,EAAE,SAAS,YAAY,CACxC,EACA,CACE,GAAI,KACJ,KAAM,eACN,MAAO,gBACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EACtD,OAAS,GAAM,EAAE,SAAS,aAAa,CACzC,CACF,EACA,CACE,CACE,GAAI,OACJ,KAAM,OACN,MAAO,OACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAC3C,EACA,CACE,GAAI,OACJ,KAAM,OACN,MAAO,OACP,IAAM,GAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAC3C,CACF,CACF,EAOA,SAASC,EAAc,CAAE,SAAQ,QAAO,WAAU,QAAO,eAAc,YAOpE,CACD,OACE,EAAAnC,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kBAAkB,KAAK,UAAU,aAAY,GAAGoC,EAAM,aAArE,SAAA,CACGF,EAAO,KAAK,EAAO,KAClB,EAAAlC,EAAA,IAAA,CAAChB,EAAAA,YAAD,CAAqB,aAAY,cAAcqD,EAAI,IAChD,SAAAC,EAAM,IAAK,IACV,EAAAtC,EAAA,IAAA,CAACnB,EAAAA,OAAD,CAEE,KAAK,KACL,WAAA,GACA,UAAW0D,EAAK,KAChB,aAAYA,EAAK,MACjB,MAAOA,EAAK,MACZ,eAAcA,EAAK,OAASC,GAAO,OAAOD,EAAK,IAAM,IAAA,GACrD,QAASC,GAAO,OAAOD,EAAK,IAAM,SAAW,UAC7C,WAAYE,GAAY,CAACf,EACzB,YAAeA,GAAUa,EAAK,IAAIb,CAAM,CACzC,EAVMa,EAAK,EAUX,CACF,CACU,EAfKF,CAeL,CACd,GACD,EAAArC,EAAA,IAAA,CAAChB,EAAAA,YAAD,CAAa,aAAW,OACtB,UAAA,EAAAgB,EAAA,IAAA,CAACnB,EAAAA,OAAD,CACE,KAAK,KACL,WAAA,GACA,UAAU,OACV,aAAY2D,GAAO,WAAa,YAAc,WAC9C,MAAOA,GAAO,WAAa,YAAc,WACzC,QAASA,GAAO,WAAa,SAAW,UACxC,WAAYC,GAAY,CAACf,EACzB,YAAeA,GAAUgB,EAAShB,EAAO,MAAOA,EAAO,SAAS,MAAM,EAAIA,EAAO,MAAM,UAAU,KAAO,IAAA,EAAS,CAClH,CAAA,CACU,CAAA,EACZiB,CACE,C,EAET,CAMA,IAAaC,GAAA,EAAiB3D,EAAAA,WAAAA,CAC5B,SACE,EACA,EACA,CACA,GAAM,CACJ,cAAc,mBACd,OAAO,KACP,aAAa,GACb,YAAY,GACZ,QAAQ,mBACR,YACA,eACA,KACA,aACA,kBAAmB4D,EACnB,mBAAoBC,EACpB,eAAgBC,GACdC,EACE,CAACC,EAAWC,IAAA,EAAgBzE,EAAAA,SAAAA,CAAS,EAAK,EAC1C,CAAC0E,EAAeC,IAAA,EAAoB3E,EAAAA,SAAAA,CAA+B,IAAI,EACvE4E,GAAA,EAAYnE,EAAAA,YAAAA,KAAkBkE,EAAiB,IAAI,EAAG,CAAC,CAAC,EACxD,CAACE,IAAA,EAAgB7E,EAAAA,SAAAA,KAAeuE,EAAM,eAAiBA,EAAM,SAAW,OAAS3C,EAAgB,GAAG,EACpGkD,EAAUP,EAAM,QAAU,IAAA,GAA0BM,EAAdN,EAAM,MAC5CQ,GAAA,EAAerE,EAAAA,QAAAA,KAAc6D,EAAM,SAAW,OAAStC,EAAc6C,CAAO,EAAI,IAAA,GAAW,CAACP,EAAM,OAAQO,CAAO,CAAC,EAClHE,GAAA,EAAU/E,EAAAA,MAAAA,CAAM,EAChBgF,EAAUC,GAAa,CAAC,CAACH,GAAgBT,EACzCN,EAAWmB,GAAc,CAAC,CAACJ,EAC7Bf,GAAYU,GAAeC,EAAiB,IAAI,EACpD,IAAMV,GAAA,EAAWxD,EAAAA,YAAAA,EAAa,EAAwB,IAAsB,CAC1E,GAAIuD,EAAU,OACd,IAAMoB,EAAQC,IAAa,IAAA,GAAY,IAAA,IAAA,EAAY1E,EAAAA,aAAAA,CAAaoD,EAAM,IAAI,QAAQsB,CAAQ,EAAGtB,EAAM,OAAO,MAAM,IAAI,EAC9GuB,EAAOF,GAASrB,EAAM,IAAI,OAAOqB,EAAM,IAAI,CAAC,EAAE,MAAM,KAAM,GAAS7C,EAAK,OAASwB,EAAM,OAAO,MAAM,IAAI,EAC9GY,EAAiB,CACf,KAAMS,GAAO,MAAQrB,EAAM,UAAU,KACrC,GAAIqB,GAAO,IAAMrB,EAAM,UAAU,GACjC,KAAMuB,GAAM,MAAM,MAAQ,GAC1B,UAAW,CAAC,CAACA,EACb,SAAUvB,EAAM,GAClB,CAAC,CACH,EAAG,CAACC,CAAQ,CAAC,EACPuB,GAAA,EAAa7E,EAAAA,QAAAA,MAAe,CAChC,KAAM,UACN,aAAciD,EACd,iBAAkB,OAClB,GAAI6B,EAAK,CAAE,IAAG,EAAI,CAAC,EACnB,GAAIpB,EAAa,CAAE,kBAAmBA,CAAW,EAAI,CAAC,EACtD,GAAIC,EAAc,CAAE,mBAAoBA,CAAY,EAAI,CAAC,EACzD,GAAIY,EAAU,CAAE,eAAgB,OAAOA,CAAO,CAAE,EAAI,CAAC,EACrD,GAAIQ,EAAa,CAAE,gBAAiB,MAAO,EAAI,CAAC,CAClD,GAAI,CAAC9B,EAAO6B,EAAIpB,EAAYC,EAAaY,EAASQ,CAAU,CAAC,EACvDC,GAAA,EAAchF,EAAAA,QAAAA,MAA6C,CAC/D,aACA,gBAAiB,CAAE,OAAQ,EAAM,IAAU,CACzC,IAAMiF,EAASpC,EAAM,kBAAkB,QAAUA,EAAM,OAAO,QAAQ,GAAG,EAAI,KAI7E,MAHI,CAACoC,GAAU,CAACC,EAAK,IAAI,SAASD,CAAM,EAAU,IAClDpC,EAAM,eAAe,EACjBqC,EAAK,UAAU3B,EAAS2B,EAAK,MAAOA,EAAK,SAASD,EAAQ,CAAC,CAAC,EACzD,GACT,CAAE,CACJ,GAAI,CAACJ,EAAYtB,CAAQ,CAAC,EAEpBhB,GAAA,EAASrC,EAAAA,UAAAA,CAAU,CACvB,kBAAmB,GACnB,SAAU,CAACoD,EACX,QAASe,EAAenD,EAAgB,OAAOkD,GAAY,SAAWA,EAAU/C,EAAkB+C,CAAO,EACzG,WAAY,CACV,GAAGjD,EAAmB,EACtBhB,EAAAA,YAAY,UAAU,CAAE,aAAY,CAAC,CACvC,EACA,cACA,YAAe4D,EAAa,EAAI,EAChC,WAAcA,EAAa,EAAK,EAChC,UAAW,CAAE,OAAQoB,KAAQ,CACvB7B,IACAO,EAAM,SAAW,OAAQA,EAAM,WAAWsB,EAAE,QAAQ,CAAqB,EACxEtB,EAAM,WAAWsB,EAAE,QAAQ,CAAC,EACnC,CACF,CAAC,GAED,EAAAvE,EAAA,UAAA,KAAgB,CACT2B,IACLA,EAAO,YAAY,CAACe,EAAU,EAAK,EACnCf,EAAO,WAAW,CAAE,aAAY,CAAC,EACnC,EAAG,CAACA,EAAQe,EAAU0B,CAAW,CAAC,GAElC,EAAApE,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC2B,GAAUsB,EAAM,QAAU,IAAA,IAAaQ,EAAc,OAC1D,IAAMe,EAAO,OAAOvB,EAAM,OAAU,UAAA,EAChCzD,EAAAA,eAAAA,CAAeyD,EAAM,MAAOtB,EAAO,MAAM,EACzCA,EAAO,OAAO,aAAalB,EAAkBwC,EAAM,KAAK,CAAC,EAExDuB,EAAK,GAAG7C,EAAO,MAAM,GAAG,GAC3BA,EAAO,SAAS,WAAW6C,EAAM,CAAE,WAAY,EAAM,CAAC,CAE1D,EAAG,CAAC7C,EAAQsB,EAAM,MAAOQ,CAAY,CAAC,EAEtC,IAAMhB,GAAA,EAAQhD,EAAAA,eAAAA,CAAe,CAC3B,SACA,UAAW,CAAE,OAAQ,KACnB,EACI,CACE,OAAQ,OAAO,YACb0C,EAAO,KAAK,CAAC,CAAC,IAAK,GAAM,CAAC,EAAE,GAAI,EAAE,SAAS,CAAC,GAAK,EAAK,CAAC,CACzD,EACA,WAAY,EAAE,SAAS,MAAM,CAC/B,EACA,IACR,CAAC,EAED,OACE,EAAAlC,EAAA,KAAA,CAAC,MAAD,CACO,MACL,UAAW,CAAC,SAAUwE,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EACzD,eAAcvB,GAAa,IAAA,GAC3B,gBAAeR,GAAY,IAAA,GAC3B,eAAciB,GAAW,IAAA,GAL3B,SAAA,CAOGF,IAAgB,EAAAxD,EAAA,IAAA,CAAC,IAAD,CAAG,GAAIyD,EAAS,KAAK,QAAQ,UAAU,kBAAmB,SAAAD,CAAgB,CAAA,GAC3F,EAAAxD,EAAA,KAAA,CAAC,MAAD,CAAK,OAAQ,CAAC,CAACwD,EAAf,SAAA,EACE,EAAAxD,EAAA,IAAA,CAACmC,EAAD,CAAuB,SAAe,QAAiB,WAAiB,QACxD,eAAwB,UAAW,CAAA,GACnD,EAAAnC,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kBAAkB,YAAWyE,EAC1C,UAAA,EAAAzE,EAAA,IAAA,CAACP,EAAAA,cAAD,CAAuB,QAAS,CAAA,CAC7B,CAAA,CACF,C,GACJiC,GAAUyB,GAAiB,CAACV,IAAY,EAAAzC,EAAA,IAAA,CAACkB,EAAD,CAAoB,SAAQ,UAAWiC,EAAe,QAASE,CAAY,CAAA,CACjH,C,EAET,CACF,E"}
|
|
@@ -219,139 +219,150 @@ var k = [
|
|
|
219
219
|
label: "Redo",
|
|
220
220
|
run: (e) => e.chain().focus().redo().run()
|
|
221
221
|
}]
|
|
222
|
-
]
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
222
|
+
];
|
|
223
|
+
function A({ editor: n, state: r, disabled: i, label: a, toolbarExtra: o, openLink: s }) {
|
|
224
|
+
return /* @__PURE__ */ p("div", {
|
|
225
|
+
className: "ds-rte__toolbar",
|
|
226
|
+
role: "toolbar",
|
|
227
|
+
"aria-label": `${a} formatting`,
|
|
228
|
+
children: [
|
|
229
|
+
k.map((a, o) => /* @__PURE__ */ f(t, {
|
|
230
|
+
"aria-label": `Formatting ${o + 1}`,
|
|
231
|
+
children: a.map((t) => /* @__PURE__ */ f(e, {
|
|
232
|
+
size: "sm",
|
|
233
|
+
isIconOnly: !0,
|
|
234
|
+
iconStart: t.icon,
|
|
235
|
+
"aria-label": t.label,
|
|
236
|
+
title: t.label,
|
|
237
|
+
"aria-pressed": t.active ? r?.active[t.id] : void 0,
|
|
238
|
+
variant: r?.active[t.id] ? "active" : "neutral",
|
|
239
|
+
isDisabled: i || !n,
|
|
240
|
+
onClick: () => n && t.run(n)
|
|
241
|
+
}, t.id))
|
|
242
|
+
}, o)),
|
|
243
|
+
/* @__PURE__ */ f(t, {
|
|
244
|
+
"aria-label": "Link",
|
|
245
|
+
children: /* @__PURE__ */ f(e, {
|
|
246
|
+
size: "sm",
|
|
247
|
+
isIconOnly: !0,
|
|
248
|
+
iconStart: "link",
|
|
249
|
+
"aria-label": r?.linkActive ? "Edit link" : "Add link",
|
|
250
|
+
title: r?.linkActive ? "Edit link" : "Add link",
|
|
251
|
+
variant: r?.linkActive ? "active" : "neutral",
|
|
252
|
+
isDisabled: i || !n,
|
|
253
|
+
onClick: () => n && s(n.state, n.isActive("link") ? n.state.selection.from : void 0)
|
|
254
|
+
})
|
|
255
|
+
}),
|
|
256
|
+
o
|
|
257
|
+
]
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
var j = a(function(e, t) {
|
|
261
|
+
let { placeholder: n = "Write something…", size: r = "md", isDisabled: i = !1, isInvalid: a = !1, label: d = "Rich text editor", className: _, toolbarExtra: x, id: S, isRequired: T, "aria-labelledby": j, "aria-describedby": M, "aria-invalid": N } = e, [P, F] = u(!1), [I, L] = u(null), R = o(() => L(null), []), [z] = u(() => e.defaultValue ?? (e.format === "json" ? C : "")), B = e.value === void 0 ? z : e.value, V = l(() => e.format === "json" ? D(B) : void 0, [e.format, B]), H = c(), U = a || !!V || N, W = i || !!V;
|
|
262
|
+
W && I && L(null);
|
|
263
|
+
let G = o((e, t) => {
|
|
264
|
+
if (W) return;
|
|
227
265
|
let n = t === void 0 ? void 0 : g(e.doc.resolve(t), e.schema.marks.link), r = n && e.doc.nodeAt(n.from)?.marks.find((t) => t.type === e.schema.marks.link);
|
|
228
|
-
|
|
266
|
+
L({
|
|
229
267
|
from: n?.from ?? e.selection.from,
|
|
230
268
|
to: n?.to ?? e.selection.to,
|
|
231
269
|
href: r?.attrs.href ?? "",
|
|
232
270
|
isEditing: !!r,
|
|
233
271
|
document: e.doc
|
|
234
272
|
});
|
|
235
|
-
}, [
|
|
273
|
+
}, [W]), K = l(() => ({
|
|
236
274
|
role: "textbox",
|
|
237
|
-
"aria-label":
|
|
275
|
+
"aria-label": d,
|
|
238
276
|
"aria-multiline": "true",
|
|
239
|
-
...
|
|
240
|
-
...
|
|
241
|
-
...
|
|
242
|
-
...
|
|
243
|
-
...
|
|
277
|
+
...S ? { id: S } : {},
|
|
278
|
+
...j ? { "aria-labelledby": j } : {},
|
|
279
|
+
...M ? { "aria-describedby": M } : {},
|
|
280
|
+
...U ? { "aria-invalid": String(U) } : {},
|
|
281
|
+
...T ? { "aria-required": "true" } : {}
|
|
244
282
|
}), [
|
|
245
|
-
|
|
246
|
-
|
|
283
|
+
d,
|
|
284
|
+
S,
|
|
285
|
+
j,
|
|
247
286
|
M,
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
attributes: q,
|
|
287
|
+
U,
|
|
288
|
+
T
|
|
289
|
+
]), q = l(() => ({
|
|
290
|
+
attributes: K,
|
|
253
291
|
handleDOMEvents: { click: (e, t) => {
|
|
254
292
|
let n = t.target instanceof Element ? t.target.closest("a") : null;
|
|
255
|
-
return !n || !e.dom.contains(n) ? !1 : (t.preventDefault(), e.editable &&
|
|
293
|
+
return !n || !e.dom.contains(n) ? !1 : (t.preventDefault(), e.editable && G(e.state, e.posAtDOM(n, 0)), !0);
|
|
256
294
|
} }
|
|
257
|
-
}), [
|
|
295
|
+
}), [K, G]), J = v({
|
|
258
296
|
immediatelyRender: !1,
|
|
259
|
-
editable: !
|
|
260
|
-
content:
|
|
261
|
-
extensions: [...w(), b.configure({ placeholder:
|
|
262
|
-
editorProps:
|
|
263
|
-
onFocus: () =>
|
|
264
|
-
onBlur: () =>
|
|
265
|
-
onUpdate: ({ editor:
|
|
266
|
-
|
|
297
|
+
editable: !W,
|
|
298
|
+
content: V ? C : typeof B == "string" ? B : E(B),
|
|
299
|
+
extensions: [...w(), b.configure({ placeholder: n })],
|
|
300
|
+
editorProps: q,
|
|
301
|
+
onFocus: () => F(!0),
|
|
302
|
+
onBlur: () => F(!1),
|
|
303
|
+
onUpdate: ({ editor: t }) => {
|
|
304
|
+
W || (e.format === "json" ? e.onChange?.(t.getJSON()) : e.onChange?.(t.getHTML()));
|
|
267
305
|
}
|
|
268
306
|
});
|
|
269
307
|
s(() => {
|
|
270
|
-
|
|
308
|
+
J && (J.setEditable(!W, !1), J.setOptions({ editorProps: q }));
|
|
271
309
|
}, [
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
310
|
+
J,
|
|
311
|
+
W,
|
|
312
|
+
q
|
|
275
313
|
]), s(() => {
|
|
276
|
-
if (!
|
|
277
|
-
let
|
|
278
|
-
|
|
314
|
+
if (!J || e.value === void 0 || V) return;
|
|
315
|
+
let t = typeof e.value == "string" ? h(e.value, J.schema) : J.schema.nodeFromJSON(E(e.value));
|
|
316
|
+
t.eq(J.state.doc) || J.commands.setContent(t, { emitUpdate: !1 });
|
|
279
317
|
}, [
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
318
|
+
J,
|
|
319
|
+
e.value,
|
|
320
|
+
V
|
|
283
321
|
]);
|
|
284
|
-
let
|
|
285
|
-
editor:
|
|
322
|
+
let Y = y({
|
|
323
|
+
editor: J,
|
|
286
324
|
selector: ({ editor: e }) => e ? {
|
|
287
325
|
active: Object.fromEntries(k.flat().map((t) => [t.id, t.active?.(e) ?? !1])),
|
|
288
326
|
linkActive: e.isActive("link")
|
|
289
327
|
} : null
|
|
290
328
|
});
|
|
291
329
|
return /* @__PURE__ */ p("div", {
|
|
292
|
-
ref:
|
|
293
|
-
className: ["ds-rte",
|
|
294
|
-
"data-focused":
|
|
295
|
-
"data-disabled":
|
|
296
|
-
"aria-invalid":
|
|
330
|
+
ref: t,
|
|
331
|
+
className: ["ds-rte", _].filter(Boolean).join(" "),
|
|
332
|
+
"data-focused": P || void 0,
|
|
333
|
+
"data-disabled": W || void 0,
|
|
334
|
+
"aria-invalid": U || void 0,
|
|
297
335
|
children: [
|
|
298
|
-
|
|
299
|
-
id:
|
|
336
|
+
V && /* @__PURE__ */ f("p", {
|
|
337
|
+
id: H,
|
|
300
338
|
role: "alert",
|
|
301
339
|
className: "ds-field__error",
|
|
302
|
-
children:
|
|
340
|
+
children: V
|
|
303
341
|
}),
|
|
304
342
|
/* @__PURE__ */ p("div", {
|
|
305
|
-
hidden: !!
|
|
306
|
-
children: [/* @__PURE__ */
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
children: n.map((t) => /* @__PURE__ */ f(e, {
|
|
314
|
-
size: "sm",
|
|
315
|
-
isIconOnly: !0,
|
|
316
|
-
iconStart: t.icon,
|
|
317
|
-
"aria-label": t.label,
|
|
318
|
-
title: t.label,
|
|
319
|
-
"aria-pressed": t.active ? X?.active[t.id] : void 0,
|
|
320
|
-
variant: X?.active[t.id] ? "active" : "neutral",
|
|
321
|
-
isDisabled: G || !Y,
|
|
322
|
-
onClick: () => Y && t.run(Y)
|
|
323
|
-
}, t.id))
|
|
324
|
-
}, r)),
|
|
325
|
-
/* @__PURE__ */ f(t, {
|
|
326
|
-
"aria-label": "Link",
|
|
327
|
-
children: /* @__PURE__ */ f(e, {
|
|
328
|
-
size: "sm",
|
|
329
|
-
isIconOnly: !0,
|
|
330
|
-
iconStart: "link",
|
|
331
|
-
"aria-label": X?.linkActive ? "Edit link" : "Add link",
|
|
332
|
-
title: X?.linkActive ? "Edit link" : "Add link",
|
|
333
|
-
variant: X?.linkActive ? "active" : "neutral",
|
|
334
|
-
isDisabled: G || !Y,
|
|
335
|
-
onClick: () => Y && K(Y.state, Y.isActive("link") ? Y.state.selection.from : void 0)
|
|
336
|
-
})
|
|
337
|
-
}),
|
|
338
|
-
T
|
|
339
|
-
]
|
|
343
|
+
hidden: !!V,
|
|
344
|
+
children: [/* @__PURE__ */ f(A, {
|
|
345
|
+
editor: J,
|
|
346
|
+
state: Y,
|
|
347
|
+
disabled: W,
|
|
348
|
+
label: d,
|
|
349
|
+
toolbarExtra: x,
|
|
350
|
+
openLink: G
|
|
340
351
|
}), /* @__PURE__ */ f("div", {
|
|
341
352
|
className: "ds-rte__content",
|
|
342
|
-
"data-size":
|
|
343
|
-
children: /* @__PURE__ */ f(m, { editor:
|
|
353
|
+
"data-size": r,
|
|
354
|
+
children: /* @__PURE__ */ f(m, { editor: J })
|
|
344
355
|
})]
|
|
345
356
|
}),
|
|
346
|
-
|
|
347
|
-
editor:
|
|
348
|
-
selection:
|
|
349
|
-
onClose:
|
|
357
|
+
J && I && !W && /* @__PURE__ */ f(O, {
|
|
358
|
+
editor: J,
|
|
359
|
+
selection: I,
|
|
360
|
+
onClose: R
|
|
350
361
|
})
|
|
351
362
|
]
|
|
352
363
|
});
|
|
353
364
|
});
|
|
354
365
|
//#endregion
|
|
355
|
-
export { D as n, C as r,
|
|
366
|
+
export { D as n, C as r, j as t };
|
|
356
367
|
|
|
357
|
-
//# sourceMappingURL=RichTextEditor-
|
|
368
|
+
//# sourceMappingURL=RichTextEditor-Dnx4i7bQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextEditor-Dnx4i7bQ.js","names":["_Fragment","Fragment$1","emptyDocument","richTextExtensions","StarterKit","Link","schema","getSchema","normalizeDocument","document","documentError","value","check","type","node","key","mark","markType","LinkDialog","href","setHref","useState","selection","error","setError","formId","useId","onTransaction","editor","onClose","canEdit","save","url","chain","Modal","Button","event","Field","TextField","field","GROUPS","EditorToolbar","label","ButtonGroup","i","group","tool","state","disabled","openLink","toolbarExtra","RichTextEditor","forwardRef","labelledBy","describedBy","ariaInvalid","props","isFocused","setIsFocused","linkSelection","setLinkSelection","closeLink","useCallback","initialValue","content","contentError","useMemo","errorId","invalid","isInvalid","isDisabled","range","position","getMarkRange","link","attributes","id","isRequired","editorProps","anchor","view","useEditor","Placeholder","e","useEffect","next","createDocument","useEditorState","className","size","EditorContent"],"sources":["../../src/components/RichTextEditor/document.ts","../../src/components/RichTextEditor/index.tsx"],"sourcesContent":["import { getSchema, type JSONContent } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport { Link } from \"@tiptap/extension-link\";\n\nexport type RichTextDocument = JSONContent & { type: \"doc\" };\n\nexport const emptyDocument: RichTextDocument = { type: \"doc\", content: [{ type: \"paragraph\" }] };\n\nexport function richTextExtensions() {\n return [StarterKit.configure({ link: false }), Link.configure({ openOnClick: false, autolink: true })];\n}\n\nconst schema = getSchema(richTextExtensions());\n\n/** ProseMirror represents an empty writing surface with one empty paragraph. */\nexport function normalizeDocument(document: RichTextDocument): RichTextDocument {\n return !document.content?.length ? { ...document, content: emptyDocument.content } : document;\n}\n\nexport function documentError(value: unknown): string | undefined {\n try {\n if (!value || typeof value !== \"object\" || !(\"type\" in value) || value.type !== \"doc\") throw new Error();\n const check = (node: JSONContent) => {\n const type = schema.nodes[node.type ?? \"\"];\n if (!type || Object.keys(node).some((key) => ![\"type\", \"attrs\", \"content\", \"marks\", \"text\"].includes(key)) ||\n (node.text !== undefined && node.type !== \"text\") ||\n (node.attrs && Object.keys(node.attrs).some((key) => !Object.hasOwn(type.spec.attrs ?? {}, key)))) {\n throw new Error();\n }\n for (const mark of node.marks ?? []) {\n const markType = schema.marks[mark.type];\n if (!markType || Object.keys(mark).some((key) => ![\"type\", \"attrs\"].includes(key)) ||\n Object.keys(mark.attrs ?? {}).some((key) => !Object.hasOwn(markType.spec.attrs ?? {}, key))) {\n throw new Error();\n }\n }\n node.content?.forEach(check);\n };\n const document = value as RichTextDocument;\n check(document);\n schema.nodeFromJSON(normalizeDocument(document)).check();\n } catch {\n return \"Unsupported or invalid rich-text document.\";\n }\n}\n","import { forwardRef, useCallback, useEffect, useId, useMemo, useState, type AriaAttributes, type ReactNode } from \"react\";\nimport { createDocument, EditorContent, getMarkRange, useEditor, useEditorState, type Editor, type EditorOptions } from \"@tiptap/react\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { Button } from \"../Button\";\nimport { ButtonGroup } from \"../ButtonGroup\";\nimport { Field } from \"../Field\";\nimport { Modal } from \"../Modal\";\nimport { TextField } from \"../TextField\";\nimport type { IconName } from \"../Icon/icons\";\nimport { documentError, emptyDocument, normalizeDocument, richTextExtensions, type RichTextDocument } from \"./document\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport type RichTextEditorSize = \"sm\" | \"md\" | \"lg\";\n\nexport type { RichTextDocument } from \"./document\";\n\ninterface RichTextEditorCommonProps {\n placeholder?: string;\n size?: RichTextEditorSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Accessible name for the editing surface. */\n label?: string;\n className?: string;\n /** Extra controls appended to the toolbar, e.g. a word count. */\n toolbarExtra?: ReactNode;\n /** Applied to the editable surface. */\n id?: string;\n isRequired?: boolean;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: AriaAttributes[\"aria-invalid\"];\n}\n\nexport type RichTextEditorProps = RichTextEditorCommonProps & (\n | { format?: \"html\"; value?: string; defaultValue?: string; onChange?: (html: string) => void }\n | { format: \"json\"; value?: RichTextDocument; defaultValue?: RichTextDocument; onChange?: (document: RichTextDocument) => void }\n);\n\ninterface ToolItem {\n id: string;\n icon: IconName;\n label: string;\n run: (editor: Editor) => void;\n active?: (editor: Editor) => boolean;\n}\n\ninterface LinkSelection {\n from: number;\n to: number;\n href: string;\n isEditing: boolean;\n document: Editor[\"state\"][\"doc\"];\n}\n\nfunction LinkDialog({ editor, selection, onClose }: {\n editor: Editor;\n selection: LinkSelection;\n onClose: () => void;\n}) {\n const [href, setHref] = useState(selection.href);\n const [error, setError] = useState<string>();\n const formId = useId();\n\n useEffect(() => {\n const onTransaction = () => {\n if (!editor.state.doc.eq(selection.document)) onClose();\n };\n editor.on(\"transaction\", onTransaction);\n return () => { editor.off(\"transaction\", onTransaction); };\n }, [editor, selection, onClose]);\n\n const canEdit = () => !editor.isDestroyed && editor.isEditable && editor.state.doc.eq(selection.document);\n const save = () => {\n if (!canEdit()) { onClose(); return; }\n const url = href.trim();\n if (!url || !editor.can().setLink({ href: url })) {\n setError(url ? \"Enter a valid link URL.\" : \"Enter a link URL.\");\n return;\n }\n const chain = editor.chain().focus().setTextSelection({ from: selection.from, to: selection.to });\n if (selection.from === selection.to && !selection.isEditing) {\n chain.setLink({ href: url }).insertContent({ type: \"text\", text: url, marks: [{ type: \"link\", attrs: { href: url } }] }).run();\n } else {\n chain.setLink({ href: url }).run();\n }\n onClose();\n };\n\n return (\n <Modal isOpen title={selection.isEditing ? \"Edit link\" : \"Add link\"} size=\"dialog\" onClose={onClose}\n footer={<>\n {selection.isEditing && <Button variant=\"danger\" onClick={() => {\n if (canEdit()) editor.chain().focus().setTextSelection({ from: selection.from, to: selection.to }).unsetLink().run();\n onClose();\n }}>Remove link</Button>}\n <Button onClick={onClose}>Cancel</Button>\n <Button variant=\"primary\" type=\"submit\" form={formId}>Save</Button>\n </>}>\n <form id={formId} noValidate onSubmit={(event) => { event.preventDefault(); event.stopPropagation(); save(); }}>\n <Field label=\"URL\" isRequired error={error}>\n {(field) => <TextField {...field} value={href} inputMode=\"url\" autoComplete=\"url\"\n placeholder=\"https://example.com\" onChange={(event) => { setHref(event.target.value); setError(undefined); }} />}\n </Field>\n </form>\n </Modal>\n );\n}\n\nconst GROUPS: ToolItem[][] = [\n [\n {\n id: \"bold\",\n icon: \"bold\",\n label: \"Bold\",\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive(\"bold\"),\n },\n {\n id: \"italic\",\n icon: \"italic\",\n label: \"Italic\",\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive(\"italic\"),\n },\n {\n id: \"strike\",\n icon: \"strikethrough\",\n label: \"Strikethrough\",\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive(\"strike\"),\n },\n {\n id: \"code\",\n icon: \"code\",\n label: \"Inline code\",\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive(\"code\"),\n },\n ],\n [\n {\n id: \"h2\",\n icon: \"heading-2\",\n label: \"Heading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n {\n id: \"h3\",\n icon: \"heading-3\",\n label: \"Subheading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n {\n id: \"quote\",\n icon: \"quote\",\n label: \"Quote\",\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive(\"blockquote\"),\n },\n ],\n [\n {\n id: \"ul\",\n icon: \"list\",\n label: \"Bulleted list\",\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive(\"bulletList\"),\n },\n {\n id: \"ol\",\n icon: \"list-ordered\",\n label: \"Numbered list\",\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive(\"orderedList\"),\n },\n ],\n [\n {\n id: \"undo\",\n icon: \"undo\",\n label: \"Undo\",\n run: (e) => e.chain().focus().undo().run(),\n },\n {\n id: \"redo\",\n icon: \"redo\",\n label: \"Redo\",\n run: (e) => e.chain().focus().redo().run(),\n },\n ],\n];\n\ninterface ToolbarState {\n active: Record<string, boolean>;\n linkActive: boolean;\n}\n\nfunction EditorToolbar({ editor, state, disabled, label, toolbarExtra, openLink }: {\n editor: Editor | null;\n state: ToolbarState | null;\n disabled: boolean;\n label: string;\n toolbarExtra: ReactNode;\n openLink: (state: Editor[\"state\"], position?: number) => void;\n}) {\n return (\n <div className=\"ds-rte__toolbar\" role=\"toolbar\" aria-label={`${label} formatting`}>\n {GROUPS.map((group, i) => (\n <ButtonGroup key={i} aria-label={`Formatting ${i + 1}`}>\n {group.map((tool) => (\n <Button\n key={tool.id}\n size=\"sm\"\n isIconOnly\n iconStart={tool.icon}\n aria-label={tool.label}\n title={tool.label}\n aria-pressed={tool.active ? state?.active[tool.id] : undefined}\n variant={state?.active[tool.id] ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={() => editor && tool.run(editor)}\n />\n ))}\n </ButtonGroup>\n ))}\n <ButtonGroup aria-label=\"Link\">\n <Button\n size=\"sm\"\n isIconOnly\n iconStart=\"link\"\n aria-label={state?.linkActive ? \"Edit link\" : \"Add link\"}\n title={state?.linkActive ? \"Edit link\" : \"Add link\"}\n variant={state?.linkActive ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={() => editor && openLink(editor.state, editor.isActive(\"link\") ? editor.state.selection.from : undefined)}\n />\n </ButtonGroup>\n {toolbarExtra}\n </div>\n );\n}\n\n/**\n * The editorial writing surface. Rich text plus links — the same field skin,\n * radius and states as `TextField`, with the toolbar inside the frame.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n props,\n ref,\n ) {\n const {\n placeholder = \"Write something…\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n label = \"Rich text editor\",\n className,\n toolbarExtra,\n id,\n isRequired,\n \"aria-labelledby\": labelledBy,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": ariaInvalid,\n } = props;\n const [isFocused, setIsFocused] = useState(false);\n const [linkSelection, setLinkSelection] = useState<LinkSelection | null>(null);\n const closeLink = useCallback(() => setLinkSelection(null), []);\n const [initialValue] = useState(() => props.defaultValue ?? (props.format === \"json\" ? emptyDocument : \"\"));\n const content = props.value !== undefined ? props.value : initialValue;\n const contentError = useMemo(() => props.format === \"json\" ? documentError(content) : undefined, [props.format, content]);\n const errorId = useId();\n const invalid = isInvalid || !!contentError || ariaInvalid;\n const disabled = isDisabled || !!contentError;\n if (disabled && linkSelection) setLinkSelection(null);\n const openLink = useCallback((state: Editor[\"state\"], position?: number) => {\n if (disabled) return;\n const range = position === undefined ? undefined : getMarkRange(state.doc.resolve(position), state.schema.marks.link);\n const link = range && state.doc.nodeAt(range.from)?.marks.find((mark) => mark.type === state.schema.marks.link);\n setLinkSelection({\n from: range?.from ?? state.selection.from,\n to: range?.to ?? state.selection.to,\n href: link?.attrs.href ?? \"\",\n isEditing: !!link,\n document: state.doc,\n });\n }, [disabled]);\n const attributes = useMemo(() => ({\n role: \"textbox\",\n \"aria-label\": label,\n \"aria-multiline\": \"true\",\n ...(id ? { id } : {}),\n ...(labelledBy ? { \"aria-labelledby\": labelledBy } : {}),\n ...(describedBy ? { \"aria-describedby\": describedBy } : {}),\n ...(invalid ? { \"aria-invalid\": String(invalid) } : {}),\n ...(isRequired ? { \"aria-required\": \"true\" } : {}),\n }), [label, id, labelledBy, describedBy, invalid, isRequired]);\n const editorProps = useMemo<EditorOptions[\"editorProps\"]>(() => ({\n attributes,\n handleDOMEvents: { click: (view, event) => {\n const anchor = event.target instanceof Element ? event.target.closest(\"a\") : null;\n if (!anchor || !view.dom.contains(anchor)) return false;\n event.preventDefault();\n if (view.editable) openLink(view.state, view.posAtDOM(anchor, 0));\n return true;\n } },\n }), [attributes, openLink]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n content: contentError ? emptyDocument : typeof content === \"string\" ? content : normalizeDocument(content),\n extensions: [\n ...richTextExtensions(),\n Placeholder.configure({ placeholder }),\n ],\n editorProps,\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onUpdate: ({ editor: e }) => {\n if (disabled) return;\n if (props.format === \"json\") props.onChange?.(e.getJSON() as RichTextDocument);\n else props.onChange?.(e.getHTML());\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!disabled, false);\n editor.setOptions({ editorProps });\n }, [editor, disabled, editorProps]);\n\n useEffect(() => {\n if (!editor || props.value === undefined || contentError) return;\n const next = typeof props.value === \"string\"\n ? createDocument(props.value, editor.schema)\n : editor.schema.nodeFromJSON(normalizeDocument(props.value));\n // Parent echoes should preserve the current selection and undo history.\n if (!next.eq(editor.state.doc)) {\n editor.commands.setContent(next, { emitUpdate: false });\n }\n }, [editor, props.value, contentError]);\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n e\n ? {\n active: Object.fromEntries(\n GROUPS.flat().map((t) => [t.id, t.active?.(e) ?? false]),\n ),\n linkActive: e.isActive(\"link\"),\n }\n : null,\n });\n\n return (\n <div\n ref={ref}\n className={[\"ds-rte\", className].filter(Boolean).join(\" \")}\n data-focused={isFocused || undefined}\n data-disabled={disabled || undefined}\n aria-invalid={invalid || undefined}\n >\n {contentError && <p id={errorId} role=\"alert\" className=\"ds-field__error\">{contentError}</p>}\n <div hidden={!!contentError}>\n <EditorToolbar editor={editor} state={state} disabled={disabled} label={label}\n toolbarExtra={toolbarExtra} openLink={openLink} />\n <div className=\"ds-rte__content\" data-size={size}>\n <EditorContent editor={editor} />\n </div>\n </div>\n {editor && linkSelection && !disabled && <LinkDialog editor={editor} selection={linkSelection} onClose={closeLink} />}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;AAMA,IAAaE,IAAkC;CAAE,MAAM;CAAO,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;AAAE;AAE/F,SAAgBC,IAAqB;CACnC,OAAO,CAACC,EAAW,UAAU,EAAE,MAAM,GAAM,CAAC,GAAGC,EAAK,UAAU;EAAE,aAAa;EAAO,UAAU;CAAK,CAAC,CAAC;AACvG;AAEA,IAAMC,IAASC,EAAUJ,EAAmB,CAAC;AAG7C,SAAgBK,EAAkB,GAA8C;CAC9E,OAAQC,EAAS,SAAS,SAA2DA,IAAlD;EAAE,GAAGA;EAAU,SAASP,EAAc;CAAQ;AACnF;AAEA,SAAgBQ,EAAc,GAAoC;CAChE,IAAI;EACF,IAAI,CAACC,KAAS,OAAOA,KAAU,YAAY,EAAE,UAAUA,MAAUA,EAAM,SAAS,OAAO,MAAU,MAAM;EACvG,IAAMC,KAAS,MAAsB;GACnC,IAAMC,IAAOP,EAAO,MAAMQ,EAAK,QAAQ;GACvC,IAAI,CAACD,KAAQ,OAAO,KAAKC,CAAI,CAAC,CAAC,MAAM,MAAQ,CAAC;IAAC;IAAQ;IAAS;IAAW;IAAS;GAAM,CAAC,CAAC,SAASC,CAAG,CAAC,KACtGD,EAAK,SAAS,KAAA,KAAaA,EAAK,SAAS,UACzCA,EAAK,SAAS,OAAO,KAAKA,EAAK,KAAK,CAAC,CAAC,MAAM,MAAQ,CAAC,OAAO,OAAOD,EAAK,KAAK,SAAS,CAAC,GAAGE,CAAG,CAAC,GAC/F,MAAU,MAAM;GAElB,KAAK,IAAMC,KAAQF,EAAK,SAAS,CAAC,GAAG;IACnC,IAAMG,IAAWX,EAAO,MAAMU,EAAK;IACnC,IAAI,CAACC,KAAY,OAAO,KAAKD,CAAI,CAAC,CAAC,MAAM,MAAQ,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,SAASD,CAAG,CAAC,KAC/E,OAAO,KAAKC,EAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,MAAQ,CAAC,OAAO,OAAOC,EAAS,KAAK,SAAS,CAAC,GAAGF,CAAG,CAAC,GAC1F,MAAU,MAAM;GAEpB;GACA,EAAK,SAAS,QAAQH,CAAK;EAC7B,GACMH,IAAWE;EAEjB,AADAC,EAAMH,CAAQ,GACdH,EAAO,aAAaE,EAAkBC,CAAQ,CAAC,CAAC,CAAC,MAAM;CACzD,QAAQ;EACN,OAAO;CACT;AACF;;;ACYA,SAASS,EAAW,EAAE,WAAQ,cAAW,cAItC;CACD,IAAM,CAACC,GAAMC,KAAWC,EAASC,EAAU,IAAI,GACzC,CAACC,GAAOC,KAAYH,EAAiB,GACrCI,IAASC,EAAM;CAErB,QAAgB;EACd,IAAMC,UAAsB;GAC1B,AAAKC,EAAO,MAAM,IAAI,GAAGN,EAAU,QAAQ,KAAGO,EAAQ;EACxD;EAEA,OADAD,EAAO,GAAG,eAAeD,CAAa,SACzB;GAAE,EAAO,IAAI,eAAeA,CAAa;EAAG;CAC3D,GAAG;EAACC;EAAQN;EAAWO;CAAO,CAAC;CAE/B,IAAMC,UAAgB,CAACF,EAAO,eAAeA,EAAO,cAAcA,EAAO,MAAM,IAAI,GAAGN,EAAU,QAAQ,GAClGS,UAAa;EACjB,IAAI,CAACD,EAAQ,GAAG;GAAE,EAAQ;GAAG;EAAQ;EACrC,IAAME,IAAMb,EAAK,KAAK;EACtB,IAAI,CAACa,KAAO,CAACJ,EAAO,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAMI,EAAI,CAAC,GAAG;GAChD,EAASA,IAAM,4BAA4B,mBAAmB;GAC9D;EACF;EACA,IAAMC,IAAQL,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB;GAAE,MAAMN,EAAU;GAAM,IAAIA,EAAU;EAAG,CAAC;EAMhG,AALIA,EAAU,SAASA,EAAU,MAAM,CAACA,EAAU,YAChDW,EAAM,QAAQ,EAAE,MAAMD,EAAI,CAAC,CAAC,CAAC,cAAc;GAAE,MAAM;GAAQ,MAAMA;GAAK,OAAO,CAAC;IAAE,MAAM;IAAQ,OAAO,EAAE,MAAMA,EAAI;GAAE,CAAC;EAAE,CAAC,CAAC,CAAC,IAAI,IAE7HC,EAAM,QAAQ,EAAE,MAAMD,EAAI,CAAC,CAAC,CAAC,IAAI,GAEnCH,EAAQ;CACV;CAEA,OACE,kBAACK,GAAD;EAAO,QAAA;EAAO,OAAOZ,EAAU,YAAY,cAAc;EAAY,MAAK;EAAkB;EAC1F,QAAQ,kBAAAtB,GAAA,EAAA,UAAA;GACLsB,EAAU,aAAa,kBAACa,GAAD;IAAQ,SAAQ;IAAS,eAAe;KAE9D,AADIL,EAAQ,KAAGF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB;MAAE,MAAMN,EAAU;MAAM,IAAIA,EAAU;KAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,GACnHO,EAAQ;IACV;IAAG,UAAA;GAAmB,CAAA;GACtB,kBAACM,GAAD;IAAQ,SAASN;IAAS,UAAA;GAAc,CAAA;GACxC,kBAACM,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAS,MAAMV;IAAQ,UAAA;GAAY,CAAA;EAClE,EAAA,CAAA;EACF,UAAA,kBAAC,QAAD;GAAM,IAAIA;GAAQ,YAAA;GAAW,WAAW,MAAU;IAAmD,AAAjDW,EAAM,eAAe,GAAGA,EAAM,gBAAgB,GAAGL,EAAK;GAAG;GAC3G,UAAA,kBAACM,GAAD;IAAO,OAAM;IAAM,YAAA;IAAkB;IACjC,WAAA,MAAU,kBAACC,GAAD;KAAW,GAAIC;KAAO,OAAOpB;KAAM,WAAU;KAAM,cAAa;KAC1E,aAAY;KAAsB,WAAW,MAAU;MAA+B,AAA7BC,EAAQgB,EAAM,OAAO,KAAK,GAAGZ,EAAS,KAAA,CAAS;KAAG;IAAI,CAAA;GAC5G,CAAA;EACH,CAAA;CACD,CAAA;AAEX;AAEA,IAAMgB,IAAuB;CAC3B;EACE;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;GAC/C,SAAS,MAAM,EAAE,SAAS,MAAM;EAClC;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;GACjD,SAAS,MAAM,EAAE,SAAS,QAAQ;EACpC;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;GACjD,SAAS,MAAM,EAAE,SAAS,QAAQ;EACpC;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;GAC/C,SAAS,MAAM,EAAE,SAAS,MAAM;EAClC;CACF;CACA;EACE;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;GAC9D,SAAS,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;EACnD;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;GAC9D,SAAS,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;EACnD;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;GACrD,SAAS,MAAM,EAAE,SAAS,YAAY;EACxC;CACF;CACA,CACE;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;EACrD,SAAS,MAAM,EAAE,SAAS,YAAY;CACxC,GACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;EACtD,SAAS,MAAM,EAAE,SAAS,aAAa;CACzC,CACF;CACA,CACE;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;CAC3C,GACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;CAC3C,CACF;AACF;AAOA,SAASC,EAAc,EAAE,WAAQ,UAAO,aAAU,UAAO,iBAAc,eAOpE;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;EAAkB,MAAK;EAAU,cAAY,GAAGC,EAAM;EAArE,UAAA;GACGF,EAAO,KAAK,GAAO,MAClB,kBAACG,GAAD;IAAqB,cAAY,cAAcC,IAAI;IAChD,UAAAC,EAAM,KAAK,MACV,kBAACV,GAAD;KAEE,MAAK;KACL,YAAA;KACA,WAAWW,EAAK;KAChB,cAAYA,EAAK;KACjB,OAAOA,EAAK;KACZ,gBAAcA,EAAK,SAASC,GAAO,OAAOD,EAAK,MAAM,KAAA;KACrD,SAASC,GAAO,OAAOD,EAAK,MAAM,WAAW;KAC7C,YAAYE,KAAY,CAACpB;KACzB,eAAeA,KAAUkB,EAAK,IAAIlB,CAAM;IACzC,GAVMkB,EAAK,EAUX,CACF;GACU,GAfKF,CAeL,CACd;GACD,kBAACD,GAAD;IAAa,cAAW;IACtB,UAAA,kBAACR,GAAD;KACE,MAAK;KACL,YAAA;KACA,WAAU;KACV,cAAYY,GAAO,aAAa,cAAc;KAC9C,OAAOA,GAAO,aAAa,cAAc;KACzC,SAASA,GAAO,aAAa,WAAW;KACxC,YAAYC,KAAY,CAACpB;KACzB,eAAeA,KAAUqB,EAASrB,EAAO,OAAOA,EAAO,SAAS,MAAM,IAAIA,EAAO,MAAM,UAAU,OAAO,KAAA,CAAS;IAClH,CAAA;GACU,CAAA;GACZsB;EACE;;AAET;AAMA,IAAaC,IAAiBC,EAC5B,SACE,GACA,GACA;CACA,IAAM,EACJ,iBAAc,oBACd,UAAO,MACP,gBAAa,IACb,eAAY,IACZ,WAAQ,oBACR,cACA,iBACA,OACA,eACA,mBAAmBC,GACnB,oBAAoBC,GACpB,gBAAgBC,MACdC,GACE,CAACC,GAAWC,KAAgBrC,EAAS,EAAK,GAC1C,CAACsC,GAAeC,KAAoBvC,EAA+B,IAAI,GACvEwC,IAAYC,QAAkBF,EAAiB,IAAI,GAAG,CAAC,CAAC,GACxD,CAACG,KAAgB1C,QAAemC,EAAM,iBAAiBA,EAAM,WAAW,SAAStD,IAAgB,GAAG,GACpG8D,IAAUR,EAAM,UAAU,KAAA,IAA0BO,IAAdP,EAAM,OAC5CS,IAAeC,QAAcV,EAAM,WAAW,SAAS9C,EAAcsD,CAAO,IAAI,KAAA,GAAW,CAACR,EAAM,QAAQQ,CAAO,CAAC,GAClHG,IAAUzC,EAAM,GAChB0C,IAAUC,KAAa,CAAC,CAACJ,KAAgBV,GACzCP,IAAWsB,KAAc,CAAC,CAACL;CACjC,AAAIjB,KAAYW,KAAeC,EAAiB,IAAI;CACpD,IAAMX,IAAWa,GAAa,GAAwB,MAAsB;EAC1E,IAAId,GAAU;EACd,IAAMuB,IAAQC,MAAa,KAAA,IAAY,KAAA,IAAYC,EAAa1B,EAAM,IAAI,QAAQyB,CAAQ,GAAGzB,EAAM,OAAO,MAAM,IAAI,GAC9G2B,IAAOH,KAASxB,EAAM,IAAI,OAAOwB,EAAM,IAAI,CAAC,EAAE,MAAM,MAAM,MAASvD,EAAK,SAAS+B,EAAM,OAAO,MAAM,IAAI;EAC9G,EAAiB;GACf,MAAMwB,GAAO,QAAQxB,EAAM,UAAU;GACrC,IAAIwB,GAAO,MAAMxB,EAAM,UAAU;GACjC,MAAM2B,GAAM,MAAM,QAAQ;GAC1B,WAAW,CAAC,CAACA;GACb,UAAU3B,EAAM;EAClB,CAAC;CACH,GAAG,CAACC,CAAQ,CAAC,GACP2B,IAAaT,SAAe;EAChC,MAAM;EACN,cAAcxB;EACd,kBAAkB;EAClB,GAAIkC,IAAK,EAAE,MAAG,IAAI,CAAC;EACnB,GAAIvB,IAAa,EAAE,mBAAmBA,EAAW,IAAI,CAAC;EACtD,GAAIC,IAAc,EAAE,oBAAoBA,EAAY,IAAI,CAAC;EACzD,GAAIc,IAAU,EAAE,gBAAgB,OAAOA,CAAO,EAAE,IAAI,CAAC;EACrD,GAAIS,IAAa,EAAE,iBAAiB,OAAO,IAAI,CAAC;CAClD,IAAI;EAACnC;EAAOkC;EAAIvB;EAAYC;EAAac;EAASS;CAAU,CAAC,GACvDC,IAAcZ,SAA6C;EAC/D;EACA,iBAAiB,EAAE,QAAQ,GAAM,MAAU;GACzC,IAAMa,IAAS3C,EAAM,kBAAkB,UAAUA,EAAM,OAAO,QAAQ,GAAG,IAAI;GAI7E,OAHI,CAAC2C,KAAU,CAACC,EAAK,IAAI,SAASD,CAAM,IAAU,MAClD3C,EAAM,eAAe,GACjB4C,EAAK,YAAU/B,EAAS+B,EAAK,OAAOA,EAAK,SAASD,GAAQ,CAAC,CAAC,GACzD;EACT,EAAE;CACJ,IAAI,CAACJ,GAAY1B,CAAQ,CAAC,GAEpBrB,IAASqD,EAAU;EACvB,mBAAmB;EACnB,UAAU,CAACjC;EACX,SAASiB,IAAe/D,IAAgB,OAAO8D,KAAY,WAAWA,IAAUxD,EAAkBwD,CAAO;EACzG,YAAY,CACV,GAAG7D,EAAmB,GACtB+E,EAAY,UAAU,EAAE,eAAY,CAAC,CACvC;EACA;EACA,eAAexB,EAAa,EAAI;EAChC,cAAcA,EAAa,EAAK;EAChC,WAAW,EAAE,QAAQyB,QAAQ;GAC3B,AAAInC,MACAQ,EAAM,WAAW,SAAQA,EAAM,WAAW2B,EAAE,QAAQ,CAAqB,IACxE3B,EAAM,WAAW2B,EAAE,QAAQ,CAAC;EACnC;CACF,CAAC;CAQD,AANAC,QAAgB;EACd,AAAKxD,MACLA,EAAO,YAAY,CAACoB,GAAU,EAAK,GACnCpB,EAAO,WAAW,EAAE,eAAY,CAAC;CACnC,GAAG;EAACA;EAAQoB;EAAU8B;CAAW,CAAC,GAElCM,QAAgB;EACd,IAAI,CAACxD,KAAU4B,EAAM,UAAU,KAAA,KAAaS,GAAc;EAC1D,IAAMoB,IAAO,OAAO7B,EAAM,SAAU,WAChC8B,EAAe9B,EAAM,OAAO5B,EAAO,MAAM,IACzCA,EAAO,OAAO,aAAapB,EAAkBgD,EAAM,KAAK,CAAC;EAE7D,AAAK6B,EAAK,GAAGzD,EAAO,MAAM,GAAG,KAC3BA,EAAO,SAAS,WAAWyD,GAAM,EAAE,YAAY,GAAM,CAAC;CAE1D,GAAG;EAACzD;EAAQ4B,EAAM;EAAOS;CAAY,CAAC;CAEtC,IAAMlB,IAAQwC,EAAe;EAC3B;EACA,WAAW,EAAE,QAAQ,QACnB,IACI;GACE,QAAQ,OAAO,YACb/C,EAAO,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAK,CAAC,CACzD;GACA,YAAY,EAAE,SAAS,MAAM;EAC/B,IACA;CACR,CAAC;CAED,OACE,kBAAC,OAAD;EACO;EACL,WAAW,CAAC,UAAUgD,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACzD,gBAAc/B,KAAa,KAAA;EAC3B,iBAAeT,KAAY,KAAA;EAC3B,gBAAcoB,KAAW,KAAA;EAL3B,UAAA;GAOGH,KAAgB,kBAAC,KAAD;IAAG,IAAIE;IAAS,MAAK;IAAQ,WAAU;IAAmB,UAAAF;GAAgB,CAAA;GAC3F,kBAAC,OAAD;IAAK,QAAQ,CAAC,CAACA;IAAf,UAAA,CACE,kBAACxB,GAAD;KAAuB;KAAe;KAAiB;KAAiB;KACxD;KAAwB;IAAW,CAAA,GACnD,kBAAC,OAAD;KAAK,WAAU;KAAkB,aAAWgD;KAC1C,UAAA,kBAACC,GAAD,EAAuB,UAAS,CAAA;IAC7B,CAAA,CACF;;GACJ9D,KAAU+B,KAAiB,CAACX,KAAY,kBAAC9B,GAAD;IAAoB;IAAQ,WAAWyC;IAAe,SAASE;GAAY,CAAA;EACjH;;AAET,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeRefs-Bc3qS0Tt.cjs","names":["mergeRefs","refs","ref","node"],"sources":["../../src/internal/mergeRefs.ts"],"sourcesContent":["import type { Ref, RefCallback } from \"react\";\n\n/** Send the same node (and unmount notification) to internal and forwarded refs. */\nexport function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): RefCallback<T> {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }\n };\n}\n"],"mappings":"AAGA,SAAgBA,EAAa,GAAGC,EAA8C,CAC5E,MAAQ,IAAS,CACf,IAAK,IAAMC,KAAOD,EACZ,OAAOC,GAAQ,WAAYA,EAAIC,CAAI,EAC9BD,IAAK,EAAI,QAAUC,EAEhC,CACF,C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeRefs-DGM402mE.js","names":["mergeRefs","refs","ref","node"],"sources":["../../src/internal/mergeRefs.ts"],"sourcesContent":["import type { Ref, RefCallback } from \"react\";\n\n/** Send the same node (and unmount notification) to internal and forwarded refs. */\nexport function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): RefCallback<T> {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }\n };\n}\n"],"mappings":";AAGA,SAAgBA,EAAa,GAAGC,GAA8C;CAC5E,QAAQ,MAAS;EACf,KAAK,IAAMC,KAAOD,GAChB,AAAI,OAAOC,KAAQ,aAAYA,EAAIC,CAAI,IAC9BD,MAAK,EAAI,UAAUC;CAEhC;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/Icon-CWsA1W83.cjs"),t=require("../Button/index.cjs"),n=require("../Skeleton/index.cjs");let r=require("react"),i=require("react/jsx-runtime");function a({icon:t,label:n}){return(0,i.jsx)(`span`,{className:`ds-asset-card__placeholder ds-asset-tile__placeholder`,children:(0,i.jsx)(e.t,{name:t,size:24,"aria-label":n})})}function o({src:e,alt:t}){let[o,s]=(0,r.useState)(`loading`),[c,l]=(0,r.useState)(),u=(0,r.useCallback)(e=>{s(`loaded`),e.naturalWidth&&e.naturalHeight&&l(e.naturalWidth/e.naturalHeight)},[]),d=(0,r.useCallback)(e=>{e?.complete&&(e.naturalWidth>0?u(e):e.decode().then(()=>u(e),()=>{}))},[u]);return o===`failed`?(0,i.jsx)(a,{icon:`alert-triangle`,label:t?`${t} (preview unavailable)`:`Preview unavailable`}):(0,i.jsxs)(i.Fragment,{children:[o===`loading`&&(0,i.jsx)(n.Skeleton,{shape:`block`,className:`ds-asset-card__thumb-skeleton ds-asset-tile__thumb-skeleton`}),(0,i.jsx)(`img`,{ref:d,src:e,alt:t,loading:`lazy`,"data-loaded":o===`loaded`||void 0,style:c?{"--asset-ratio":c}:void 0,onLoad:e=>u(e.currentTarget),onError:()=>s(`failed`)})]})}var s=(0,r.forwardRef)(function({name:n,src:r,alt:s=``,icon:c=`image`,fit:l=`cover`,meta:u,description:d,isSelected:f=!1,isPending:p=!1,onSelect:m,actions:h,footer:g,className:_,...v},y){return(0,i.jsxs)(`div`,{ref:y,className:[`ds-asset-card`,`ds-asset-tile`,_].filter(Boolean).join(` `),"data-fit":l,"data-selected":f||void 0,"data-pending":p||void 0,...v,children:[(0,i.jsxs)(`div`,{className:`ds-asset-card__thumb ds-asset-tile__thumb`,children:[r?(0,i.jsx)(o,{src:r,alt:s},r):(0,i.jsx)(a,{icon:c}),p&&(0,i.jsxs)(`span`,{className:`ds-asset-card__pending ds-asset-tile__pending`,role:`status`,children:[(0,i.jsx)(e.t,{name:`spinner`,size:20,className:`ds-asset-card__spinner ds-asset-tile__spinner ds-icon--spin`}),(0,i.jsx)(`span`,{className:`ds-asset-card__pending-label ds-asset-tile__pending-label`,children:`Uploading`})]}),h?(0,i.jsx)(`div`,{className:`ds-asset-card__actions ds-asset-tile__actions`,children:h}):null,m&&(0,i.jsx)(t.Button,{variant:`simple`,className:`ds-asset-card__hit ds-asset-tile__hit`,"aria-pressed":f,"aria-label":n,isDisabled:p,onClick:m})]}),(0,i.jsxs)(`div`,{className:`ds-asset-card__text ds-asset-tile__text`,children:[(0,i.jsx)(`span`,{className:`ds-asset-card__name ds-asset-tile__name`,children:n}),u?(0,i.jsx)(`div`,{className:`ds-asset-card__meta ds-asset-tile__meta`,children:u}):null,d?(0,i.jsx)(`div`,{className:`ds-asset-card__description`,children:d}):null]}),g?(0,i.jsx)(`div`,{className:`ds-asset-card__footer`,children:g}):null]})});function c({index:e=0,description:t=!1,footer:r=!1}){let a={animationDelay:`calc(var(--skeleton-stagger) * ${e})`};return(0,i.jsxs)(`div`,{className:`ds-asset-card ds-asset-tile`,"data-loading":`true`,"aria-hidden":`true`,children:[(0,i.jsx)(n.Skeleton,{shape:`block`,className:`ds-asset-card__thumb ds-asset-tile__thumb`,style:a}),(0,i.jsxs)(`div`,{className:`ds-asset-card__text ds-asset-tile__text`,children:[(0,i.jsx)(n.Skeleton,{shape:`text`,width:`80%`,style:a}),(0,i.jsx)(n.Skeleton,{shape:`text`,width:`45%`,style:a}),t&&(0,i.jsx)(n.Skeleton,{shape:`text`,width:`65%`,style:a})]}),r&&(0,i.jsx)(`div`,{className:`ds-asset-card__footer`,children:(0,i.jsx)(n.Skeleton,{shape:`block`,width:`45%`,style:{...a,blockSize:`var(--field-height-sm)`}})})]})}exports.AssetCard=s,exports.AssetCardSkeleton=c;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|