@mieweb/ui 0.11.0-dev.47 → 0.11.0-dev.48

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.
Files changed (46) hide show
  1. package/agent/skills/mieweb-ui-tailwind4/SKILL.md +1 -0
  2. package/dist/{EncounterMdyEditor-XA7HLLVD.cjs → EncounterMdyEditor-KW52MD2Q.cjs} +6 -6
  3. package/dist/{EncounterMdyEditor-XA7HLLVD.cjs.map → EncounterMdyEditor-KW52MD2Q.cjs.map} +1 -1
  4. package/dist/{EncounterMdyEditor-ATNWXQ72.js → EncounterMdyEditor-OYO3H5GJ.js} +3 -3
  5. package/dist/{EncounterMdyEditor-ATNWXQ72.js.map → EncounterMdyEditor-OYO3H5GJ.js.map} +1 -1
  6. package/dist/{chunk-F6ZTKNAL.cjs → chunk-3XR7BPKD.cjs} +4 -4
  7. package/dist/{chunk-F6ZTKNAL.cjs.map → chunk-3XR7BPKD.cjs.map} +1 -1
  8. package/dist/{chunk-ULKDK6W6.js → chunk-3XVDSLDT.js} +4 -4
  9. package/dist/chunk-3XVDSLDT.js.map +1 -0
  10. package/dist/{chunk-WI35L5TR.js → chunk-DHCSY2JY.js} +3 -3
  11. package/dist/{chunk-WI35L5TR.js.map → chunk-DHCSY2JY.js.map} +1 -1
  12. package/dist/{chunk-IYXZ25E6.js → chunk-ETAYMSCW.js} +4 -4
  13. package/dist/{chunk-IYXZ25E6.js.map → chunk-ETAYMSCW.js.map} +1 -1
  14. package/dist/{chunk-LE3HZ7MM.cjs → chunk-LVUSCBG4.cjs} +11 -11
  15. package/dist/{chunk-LE3HZ7MM.cjs.map → chunk-LVUSCBG4.cjs.map} +1 -1
  16. package/dist/{chunk-BUM72SAI.cjs → chunk-LWAXTZGG.cjs} +7 -7
  17. package/dist/{chunk-BUM72SAI.cjs.map → chunk-LWAXTZGG.cjs.map} +1 -1
  18. package/dist/{chunk-QJ75ZMCG.js → chunk-R4DQRXZY.js} +3 -3
  19. package/dist/{chunk-QJ75ZMCG.js.map → chunk-R4DQRXZY.js.map} +1 -1
  20. package/dist/{chunk-5O54NWAL.cjs → chunk-TA5K5546.cjs} +4 -4
  21. package/dist/chunk-TA5K5546.cjs.map +1 -0
  22. package/dist/{chunk-2D6TFO2Y.js → chunk-XJ37SWVD.js} +3 -3
  23. package/dist/{chunk-2D6TFO2Y.js.map → chunk-XJ37SWVD.js.map} +1 -1
  24. package/dist/{chunk-6I2G26AX.cjs → chunk-YKL66TCM.cjs} +4 -4
  25. package/dist/{chunk-6I2G26AX.cjs.map → chunk-YKL66TCM.cjs.map} +1 -1
  26. package/dist/collabKit-652AGQW6.js +99 -0
  27. package/dist/collabKit-652AGQW6.js.map +1 -0
  28. package/dist/collabKit-DVSTUBN4.cjs +102 -0
  29. package/dist/collabKit-DVSTUBN4.cjs.map +1 -0
  30. package/dist/components/EmailEditor/index.cjs +13 -13
  31. package/dist/components/EmailEditor/index.js +4 -4
  32. package/dist/components/Textarea/index.cjs +6 -6
  33. package/dist/components/Textarea/index.js +3 -3
  34. package/dist/esheet.cjs +18 -18
  35. package/dist/esheet.js +5 -5
  36. package/dist/index.cjs +53 -53
  37. package/dist/index.js +7 -7
  38. package/dist/kerebron.cjs +5 -5
  39. package/dist/kerebron.js +2 -2
  40. package/package.json +1 -1
  41. package/dist/chunk-5O54NWAL.cjs.map +0 -1
  42. package/dist/chunk-ULKDK6W6.js.map +0 -1
  43. package/dist/collabKit-GCRHP25F.cjs +0 -76
  44. package/dist/collabKit-GCRHP25F.cjs.map +0 -1
  45. package/dist/collabKit-SJPDPXU4.js +0 -52
  46. package/dist/collabKit-SJPDPXU4.js.map +0 -1
@@ -117,6 +117,7 @@ Filters/selection/pagination state is yours (usually the URL); `ViewSet` owns on
117
117
  | `var()` renders transparent | Variable undefined | Fallback: `var(--token, #hex)` |
118
118
  | Peer-dep install errors | Required vs optional confusion | react/react-dom + the five @kerebron/* runtime peers are required; match optional peers to imported entries |
119
119
  | Dark variant + brand tokens missing; build warns `@import statements must precede…` | `@source` placed between the `@import`s — PostCSS silently drops the late `init.css` import (mieweb/ui#705) | Both `@import`s first and consecutive, `@source` after them |
120
+ | `vite build` fails: `MISSING_EXPORT` from `@kerebron/extension-yjs` / `y-websocket` in a `collabKit-*` chunk | Optional collab peers not installed; @mieweb/ui versions before the mieweb/ui#706 fix had static named imports in the lazy collab chunk, and Vite's optional-peer stub has no named exports | Upgrade @mieweb/ui; on older versions, externalize: `build.rollupOptions.external: [/^@kerebron\/extension-yjs/, /^y-websocket/]` (collab stays optional either way) |
120
121
  | Module shows failed action as success | `on*` promise swallowed | Return the real promise (`mutateAsync` / `callAsync`) |
121
122
  | Views regroup on every render | Unstable `accessors` | Module scope or `useMemo` |
122
123
  | `transition-*` utilities stop working after theme/brand CSS | The brand CSS's unlayered `*` transition shorthand resets `transition-property` on every element and beats layered utilities, even though it lists only color properties (mieweb/ui#460, #682) | Move the transition rule into `@layer base` (or remove/narrow it) so component transitions win; keep brand token declarations unlayered |
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  require('./chunk-K2BY7YPJ.cjs');
4
- var chunk5O54NWAL_cjs = require('./chunk-5O54NWAL.cjs');
4
+ var chunkTA5K5546_cjs = require('./chunk-TA5K5546.cjs');
5
5
  var chunkFSLI5IKP_cjs = require('./chunk-FSLI5IKP.cjs');
6
6
  require('./chunk-NMBYU7D7.cjs');
7
7
  require('./chunk-EUAMEVVI.cjs');
@@ -80,7 +80,7 @@ function refreshMdyFieldProjections(editor, fields) {
80
80
  transaction.replaceWith(span.from, span.to, replacement);
81
81
  }
82
82
  if (!transaction.docChanged) return false;
83
- transaction.setMeta(chunk5O54NWAL_cjs.MDY_PROJECTION_META, true);
83
+ transaction.setMeta(chunkTA5K5546_cjs.MDY_PROJECTION_META, true);
84
84
  transaction.setMeta("addToHistory", false);
85
85
  editor.view.dispatch(transaction);
86
86
  return true;
@@ -141,7 +141,7 @@ function createMdyFieldPlugin(options) {
141
141
  };
142
142
  return new prosemirrorState.Plugin({
143
143
  key: mdyPluginKey,
144
- filterTransaction: (transaction) => transaction.getMeta(chunk5O54NWAL_cjs.MDY_PROJECTION_META) === true || canEditMdyTransaction(transaction, options.getFieldIds()),
144
+ filterTransaction: (transaction) => transaction.getMeta(chunkTA5K5546_cjs.MDY_PROJECTION_META) === true || canEditMdyTransaction(transaction, options.getFieldIds()),
145
145
  props: {
146
146
  decorations: (state) => prosemirrorView.DecorationSet.create(
147
147
  state.doc,
@@ -260,7 +260,7 @@ var EncounterMdyEditor = react.forwardRef(function EncounterMdyEditor2({ body, f
260
260
  "The narrative editor could not load. Your original document is preserved."
261
261
  ) }),
262
262
  /* @__PURE__ */ jsxRuntime.jsx(
263
- chunk5O54NWAL_cjs.RichEditor,
263
+ chunkTA5K5546_cjs.RichEditor,
264
264
  {
265
265
  ref: richEditor,
266
266
  value: body,
@@ -284,5 +284,5 @@ var EncounterMdyEditor = react.forwardRef(function EncounterMdyEditor2({ body, f
284
284
  EncounterMdyEditor.displayName = "EncounterMdyEditor";
285
285
 
286
286
  exports.EncounterMdyEditor = EncounterMdyEditor;
287
- //# sourceMappingURL=EncounterMdyEditor-XA7HLLVD.cjs.map
288
- //# sourceMappingURL=EncounterMdyEditor-XA7HLLVD.cjs.map
287
+ //# sourceMappingURL=EncounterMdyEditor-KW52MD2Q.cjs.map
288
+ //# sourceMappingURL=EncounterMdyEditor-KW52MD2Q.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/RichEditor/mdyEditorKit.ts","../src/components/EncounterVisit/EncounterMdyEditor.tsx"],"names":["MDY_PROJECTION_META","PluginKey","Plugin","DecorationSet","Decoration","Extension","forwardRef","EncounterMdyEditor","useMessages","useState","useRef","useImperativeHandle","useMemo","useEffect","jsxs","Fragment","jsx","RichEditor"],"mappings":"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","file":"EncounterMdyEditor-XA7HLLVD.cjs","sourcesContent":["import { Extension, type CoreEditor, type EditorKit } from '@kerebron/editor';\nimport type { Node as ProseMirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, type Transaction } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { MDY_PROJECTION_META } from './mdyTransaction';\nexport { MDY_PROJECTION_META } from './mdyTransaction';\n\nexport interface MdyEditorOptions {\n /** Only links to fields in the host's data index are protected. */\n getFieldIds: () => ReadonlySet<string>;\n getFieldLabel?: (id: string) => string | undefined;\n onFieldActivate: (id: string) => void;\n isDisabled?: () => boolean;\n}\n\nexport interface MdyFieldSpan {\n id: string;\n from: number;\n to: number;\n}\n\nexport interface MdyFieldProjection {\n id: string;\n display: string;\n label?: string;\n}\n\n/** MDY links have field semantics only when their target exists in the data. */\nfunction linkedFieldId(href: unknown, fieldIds: ReadonlySet<string>) {\n if (typeof href !== 'string') return null;\n const id = href.startsWith('mdy:')\n ? href.slice(4)\n : href.startsWith('#')\n ? href.slice(1)\n : '';\n return fieldIds.has(id) ? id : null;\n}\n\n/** Merge neighboring text nodes, including differently formatted link text. */\nexport function getMdyFieldSpans(\n doc: ProseMirrorNode,\n fieldIds: ReadonlySet<string>\n): MdyFieldSpan[] {\n const spans: MdyFieldSpan[] = [];\n doc.descendants((node, pos) => {\n if (!node.isInline) return;\n const mark = node.marks.find((candidate) => candidate.type.name === 'link');\n let id = linkedFieldId(mark?.attrs.href, fieldIds);\n const previous = spans[spans.length - 1];\n // Kerebron's inline-HTML parser imports <br> without the surrounding link\n // mark. Keep those breaks inside a single protected field projection.\n if (\n !id &&\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n previous?.to === pos\n ) {\n let nextPos = pos + node.nodeSize;\n let next = doc.nodeAt(nextPos);\n while (\n next &&\n (next.type.name === 'br' || next.type.name === 'softbreak')\n ) {\n nextPos += next.nodeSize;\n next = doc.nodeAt(nextPos);\n }\n const nextMark = next?.marks.find(\n (candidate) => candidate.type.name === 'link'\n );\n if (linkedFieldId(nextMark?.attrs.href, fieldIds) === previous.id)\n id = previous.id;\n }\n if (!id) return;\n if (previous?.id === id && previous.to === pos) {\n previous.to = pos + node.nodeSize;\n } else {\n spans.push({ id, from: pos, to: pos + node.nodeSize });\n }\n });\n return spans;\n}\n\n/** Refresh only linked data in the live document, leaving authored prose intact. */\nexport function refreshMdyFieldProjections(\n editor: CoreEditor,\n fields: readonly MdyFieldProjection[]\n): boolean {\n const byId = new Map(fields.map((field) => [field.id, field.display]));\n const state = editor.view.state;\n const spans = getMdyFieldSpans(state.doc, new Set(byId.keys()));\n const transaction = state.tr;\n for (const span of spans.reverse()) {\n const display = byId.get(span.id)!;\n const current = state.doc.textBetween(span.from, span.to, '', '\\n');\n const oldMarks = state.doc.nodeAt(span.from)?.marks ?? [];\n const link = oldMarks.find((mark) => mark.type.name === 'link');\n if (!link) continue;\n // Kerebron 0.8.12's link serializer gathers text tokens and drops inline\n // breaks. Its existing mdTemplate attribute emits this safe MDY label as\n // one link, preserving multiline projections without an upstream patch.\n const label = display\n .split(/\\r?\\n/)\n .map((line) =>\n line\n .replace(/&/g, '&amp;')\n .replace(/\\$/g, '&#36;')\n .replace(/[\\\\[\\]`*_~<>]/g, '\\\\$&')\n )\n .join('<br>');\n const template = `[${label}](${link.attrs.href})`;\n let looseBreak = false;\n state.doc.nodesBetween(span.from, span.to, (node) => {\n if (\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n !node.marks.some((mark) => mark.type.name === 'link')\n )\n looseBreak = true;\n });\n if (\n current === display &&\n !looseBreak &&\n link.attrs.mdTemplate === template\n )\n continue;\n const marks = oldMarks.map((mark) =>\n mark.type.name === 'link'\n ? mark.type.create({ ...mark.attrs, mdTemplate: template })\n : mark\n );\n const breakType = state.schema.nodes.br ?? state.schema.nodes.softbreak;\n const replacement: ProseMirrorNode[] = [];\n display.split(/\\r?\\n/).forEach((line, index) => {\n if (index && breakType)\n replacement.push(breakType.create(null, null, marks));\n if (line) replacement.push(state.schema.text(line, marks));\n });\n transaction.replaceWith(span.from, span.to, replacement);\n }\n if (!transaction.docChanged) return false;\n transaction.setMeta(MDY_PROJECTION_META, true);\n transaction.setMeta('addToHistory', false);\n editor.view.dispatch(transaction);\n return true;\n}\n\n/**\n * Protect each existing field projection from text edits or link removal.\n * A writer may delete a whole projection; its underlying data stays intact.\n * Inspect every step so paste, drag/drop, IME and toolbar commands obey the\n * same rule as typing. Programmatic document loads bypass this edit guard.\n */\nexport function canEditMdyTransaction(\n transaction: Transaction,\n fieldIds: ReadonlySet<string>\n): boolean {\n if (!transaction.docChanged) return true;\n for (let index = 0; index < transaction.steps.length; index += 1) {\n const before = transaction.docs[index];\n const after = transaction.docs[index + 1] ?? transaction.doc;\n const map = transaction.steps[index].getMap();\n const spans = getMdyFieldSpans(before, fieldIds);\n const step = transaction.steps[index].toJSON();\n if (\n (step.stepType === 'addMark' || step.stepType === 'removeMark') &&\n step.mark?.type === 'link' &&\n spans.some((span) => step.from < span.to && step.to > span.from)\n ) {\n return false;\n }\n const removed = new Set<MdyFieldSpan>();\n let allowed = true;\n\n map.forEach((oldStart, oldEnd, newStart, newEnd) => {\n for (const span of spans) {\n if (oldStart === oldEnd) {\n if (oldStart > span.from && oldStart < span.to) allowed = false;\n } else if (oldStart < span.to && oldEnd > span.from) {\n if (\n oldStart <= span.from &&\n oldEnd >= span.to &&\n (newStart === newEnd || after.textBetween(newStart, newEnd) === '')\n ) {\n removed.add(span);\n } else {\n allowed = false;\n }\n }\n }\n });\n if (!allowed) return false;\n\n // Mark-only steps have empty maps. Ensure they cannot detach a protected\n // projection from its id, while allowing harmless text formatting.\n const nextSpans = getMdyFieldSpans(after, fieldIds);\n for (const span of spans) {\n if (removed.has(span)) continue;\n const from = map.map(span.from, 1);\n const to = map.map(span.to, -1);\n if (\n before.textBetween(span.from, span.to) !==\n after.textBetween(from, to) ||\n !nextSpans.some(\n (next) => next.id === span.id && next.from === from && next.to === to\n )\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\nconst mdyPluginKey = new PluginKey('mdy-field-links');\n\nexport function createMdyFieldPlugin(options: MdyEditorOptions): Plugin {\n const activate = (id: string, event: Event) => {\n event.preventDefault();\n if (!options.isDisabled?.()) options.onFieldActivate(id);\n return true;\n };\n const targetId = (event: Event) => {\n const element = event.target;\n const chip =\n element instanceof Element ? element.closest('[data-mdy-field]') : null;\n const id = chip?.getAttribute('data-mdy-field');\n return id && options.getFieldIds().has(id) ? id : null;\n };\n\n return new Plugin({\n key: mdyPluginKey,\n filterTransaction: (transaction) =>\n transaction.getMeta(MDY_PROJECTION_META) === true ||\n canEditMdyTransaction(transaction, options.getFieldIds()),\n props: {\n decorations: (state) =>\n DecorationSet.create(\n state.doc,\n getMdyFieldSpans(state.doc, options.getFieldIds()).map((span) =>\n Decoration.inline(span.from, span.to, {\n class: 'encounter-mdy-field',\n 'data-mdy-field': span.id,\n role: 'button',\n tabindex: '0',\n 'aria-label': `Linked field: ${options.getFieldLabel?.(span.id) ?? span.id}. Activate to edit in the form.`,\n 'aria-disabled': options.isDisabled?.() ? 'true' : 'false',\n style:\n 'background:rgba(59,130,246,.12);border-radius:.2em;padding:0 .15em;cursor:pointer;text-decoration:underline;text-underline-offset:.15em',\n })\n )\n ),\n handleDOMEvents: {\n click: (_view, event) => {\n const id = targetId(event);\n return id ? activate(id, event) : false;\n },\n },\n handleKeyDown: (view, event) => {\n const focusedId = targetId(event);\n if (focusedId && (event.key === 'Enter' || event.key === ' ')) {\n return activate(focusedId, event);\n }\n if (event.key !== 'Enter') return false;\n const { from, to } = view.state.selection;\n const span = getMdyFieldSpans(\n view.state.doc,\n options.getFieldIds()\n ).find((candidate) => from >= candidate.from && to <= candidate.to);\n return span ? activate(span.id, event) : false;\n },\n },\n });\n}\n\nclass MdyFieldExtension extends Extension {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {\n super();\n }\n\n override getProseMirrorPlugins() {\n return [createMdyFieldPlugin(this.options)];\n }\n}\n\nclass MdyEditorKit implements EditorKit {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {}\n\n getExtensions() {\n return [new MdyFieldExtension(this.options)];\n }\n}\n\nexport function createMdyEditorKit(options: MdyEditorOptions): EditorKit {\n return new MdyEditorKit(options);\n}\n","'use client';\n\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { CoreEditor } from '@kerebron/editor';\nimport { RichEditor, type RichEditorHandle } from '../RichEditor/RichEditor';\nimport { useEncounterMessages } from './messages';\nimport {\n createMdyEditorKit,\n refreshMdyFieldProjections,\n type MdyFieldProjection,\n} from '../RichEditor/mdyEditorKit';\n\nexport interface EncounterMdyEditorProps {\n /** MDY body only. The host retains and updates the YAML data separately. */\n body: string;\n fields?: MdyFieldProjection[];\n fieldIds?: string[];\n onChange: (body: string) => void;\n onFieldActivate: (id: string) => void;\n disabled?: boolean;\n}\n\nexport type EncounterMdyEditorHandle = RichEditorHandle;\n\n/** Free prose and headings, with form-backed MDY spans protected from typing. */\nexport const EncounterMdyEditor = forwardRef<\n EncounterMdyEditorHandle,\n EncounterMdyEditorProps\n>(function EncounterMdyEditor(\n { body, fields = [], fieldIds, onChange, onFieldActivate, disabled = false },\n ref\n) {\n const m = useEncounterMessages();\n const [editor, setEditor] = useState<CoreEditor | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const richEditor = useRef<RichEditorHandle>(null);\n const status = useRef({ editor, loadFailed, body });\n status.current = { editor, loadFailed, body };\n // The kit mounts once, while the canonical data index and activation target\n // may change as the user switches the form or updates its responses.\n const live = useRef({\n fieldIds: new Set(fieldIds),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n });\n live.current = {\n fieldIds: new Set(fieldIds ?? fields.map((field) => field.id)),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n };\n const fieldsRef = useRef(fields);\n fieldsRef.current = fields;\n useImperativeHandle(\n ref,\n () => ({\n getContent: async () => {\n // Until setup succeeds, editing is disabled and the host's exact body\n // is the only draft. An initial grammar/document-load failure can\n // therefore leave RichEdit without trying to serialize a failed load.\n // Once ready, retain read failures so unpublished prose is never lost.\n if (status.current.loadFailed && !status.current.editor)\n return status.current.body;\n return richEditor.current\n ? richEditor.current.getContent()\n : status.current.body;\n },\n focus: () => {\n if (!status.current.loadFailed) richEditor.current?.focus();\n },\n }),\n []\n );\n const editorKits = useMemo(\n () => [\n createMdyEditorKit({\n getFieldIds: () => live.current.fieldIds,\n getFieldLabel: (id) =>\n fieldsRef.current.find((field) => field.id === id)?.label,\n onFieldActivate: (id) => live.current.onFieldActivate(id),\n isDisabled: () => live.current.disabled,\n }),\n ],\n []\n );\n useEffect(() => {\n if (!editor) return;\n const refresh = () => refreshMdyFieldProjections(editor, fieldsRef.current);\n const loaded = () => refresh();\n editor.addEventListener('doc:loaded', loaded);\n refresh();\n return () => editor.removeEventListener('doc:loaded', loaded);\n }, [editor, fields]);\n\n return (\n <>\n {loadFailed && (\n <p role=\"alert\">\n {m(\n 'The narrative editor could not load. Your original document is preserved.'\n )}\n </p>\n )}\n <RichEditor\n ref={richEditor}\n value={body}\n onChange={onChange}\n onError={() => {\n status.current.loadFailed = true;\n setLoadFailed(true);\n }}\n onReady={(next) => {\n status.current.editor = next;\n setEditor(next);\n }}\n disabled={disabled || loadFailed || editor === null}\n aria-label={m('Encounter narrative')}\n editorKits={editorKits}\n className=\"encounter-mdy-editor\"\n />\n </>\n );\n});\n\nEncounterMdyEditor.displayName = 'EncounterMdyEditor';\n"]}
1
+ {"version":3,"sources":["../src/components/RichEditor/mdyEditorKit.ts","../src/components/EncounterVisit/EncounterMdyEditor.tsx"],"names":["MDY_PROJECTION_META","PluginKey","Plugin","DecorationSet","Decoration","Extension","forwardRef","EncounterMdyEditor","useMessages","useState","useRef","useImperativeHandle","useMemo","useEffect","jsxs","Fragment","jsx","RichEditor"],"mappings":"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","file":"EncounterMdyEditor-KW52MD2Q.cjs","sourcesContent":["import { Extension, type CoreEditor, type EditorKit } from '@kerebron/editor';\nimport type { Node as ProseMirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, type Transaction } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { MDY_PROJECTION_META } from './mdyTransaction';\nexport { MDY_PROJECTION_META } from './mdyTransaction';\n\nexport interface MdyEditorOptions {\n /** Only links to fields in the host's data index are protected. */\n getFieldIds: () => ReadonlySet<string>;\n getFieldLabel?: (id: string) => string | undefined;\n onFieldActivate: (id: string) => void;\n isDisabled?: () => boolean;\n}\n\nexport interface MdyFieldSpan {\n id: string;\n from: number;\n to: number;\n}\n\nexport interface MdyFieldProjection {\n id: string;\n display: string;\n label?: string;\n}\n\n/** MDY links have field semantics only when their target exists in the data. */\nfunction linkedFieldId(href: unknown, fieldIds: ReadonlySet<string>) {\n if (typeof href !== 'string') return null;\n const id = href.startsWith('mdy:')\n ? href.slice(4)\n : href.startsWith('#')\n ? href.slice(1)\n : '';\n return fieldIds.has(id) ? id : null;\n}\n\n/** Merge neighboring text nodes, including differently formatted link text. */\nexport function getMdyFieldSpans(\n doc: ProseMirrorNode,\n fieldIds: ReadonlySet<string>\n): MdyFieldSpan[] {\n const spans: MdyFieldSpan[] = [];\n doc.descendants((node, pos) => {\n if (!node.isInline) return;\n const mark = node.marks.find((candidate) => candidate.type.name === 'link');\n let id = linkedFieldId(mark?.attrs.href, fieldIds);\n const previous = spans[spans.length - 1];\n // Kerebron's inline-HTML parser imports <br> without the surrounding link\n // mark. Keep those breaks inside a single protected field projection.\n if (\n !id &&\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n previous?.to === pos\n ) {\n let nextPos = pos + node.nodeSize;\n let next = doc.nodeAt(nextPos);\n while (\n next &&\n (next.type.name === 'br' || next.type.name === 'softbreak')\n ) {\n nextPos += next.nodeSize;\n next = doc.nodeAt(nextPos);\n }\n const nextMark = next?.marks.find(\n (candidate) => candidate.type.name === 'link'\n );\n if (linkedFieldId(nextMark?.attrs.href, fieldIds) === previous.id)\n id = previous.id;\n }\n if (!id) return;\n if (previous?.id === id && previous.to === pos) {\n previous.to = pos + node.nodeSize;\n } else {\n spans.push({ id, from: pos, to: pos + node.nodeSize });\n }\n });\n return spans;\n}\n\n/** Refresh only linked data in the live document, leaving authored prose intact. */\nexport function refreshMdyFieldProjections(\n editor: CoreEditor,\n fields: readonly MdyFieldProjection[]\n): boolean {\n const byId = new Map(fields.map((field) => [field.id, field.display]));\n const state = editor.view.state;\n const spans = getMdyFieldSpans(state.doc, new Set(byId.keys()));\n const transaction = state.tr;\n for (const span of spans.reverse()) {\n const display = byId.get(span.id)!;\n const current = state.doc.textBetween(span.from, span.to, '', '\\n');\n const oldMarks = state.doc.nodeAt(span.from)?.marks ?? [];\n const link = oldMarks.find((mark) => mark.type.name === 'link');\n if (!link) continue;\n // Kerebron 0.8.12's link serializer gathers text tokens and drops inline\n // breaks. Its existing mdTemplate attribute emits this safe MDY label as\n // one link, preserving multiline projections without an upstream patch.\n const label = display\n .split(/\\r?\\n/)\n .map((line) =>\n line\n .replace(/&/g, '&amp;')\n .replace(/\\$/g, '&#36;')\n .replace(/[\\\\[\\]`*_~<>]/g, '\\\\$&')\n )\n .join('<br>');\n const template = `[${label}](${link.attrs.href})`;\n let looseBreak = false;\n state.doc.nodesBetween(span.from, span.to, (node) => {\n if (\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n !node.marks.some((mark) => mark.type.name === 'link')\n )\n looseBreak = true;\n });\n if (\n current === display &&\n !looseBreak &&\n link.attrs.mdTemplate === template\n )\n continue;\n const marks = oldMarks.map((mark) =>\n mark.type.name === 'link'\n ? mark.type.create({ ...mark.attrs, mdTemplate: template })\n : mark\n );\n const breakType = state.schema.nodes.br ?? state.schema.nodes.softbreak;\n const replacement: ProseMirrorNode[] = [];\n display.split(/\\r?\\n/).forEach((line, index) => {\n if (index && breakType)\n replacement.push(breakType.create(null, null, marks));\n if (line) replacement.push(state.schema.text(line, marks));\n });\n transaction.replaceWith(span.from, span.to, replacement);\n }\n if (!transaction.docChanged) return false;\n transaction.setMeta(MDY_PROJECTION_META, true);\n transaction.setMeta('addToHistory', false);\n editor.view.dispatch(transaction);\n return true;\n}\n\n/**\n * Protect each existing field projection from text edits or link removal.\n * A writer may delete a whole projection; its underlying data stays intact.\n * Inspect every step so paste, drag/drop, IME and toolbar commands obey the\n * same rule as typing. Programmatic document loads bypass this edit guard.\n */\nexport function canEditMdyTransaction(\n transaction: Transaction,\n fieldIds: ReadonlySet<string>\n): boolean {\n if (!transaction.docChanged) return true;\n for (let index = 0; index < transaction.steps.length; index += 1) {\n const before = transaction.docs[index];\n const after = transaction.docs[index + 1] ?? transaction.doc;\n const map = transaction.steps[index].getMap();\n const spans = getMdyFieldSpans(before, fieldIds);\n const step = transaction.steps[index].toJSON();\n if (\n (step.stepType === 'addMark' || step.stepType === 'removeMark') &&\n step.mark?.type === 'link' &&\n spans.some((span) => step.from < span.to && step.to > span.from)\n ) {\n return false;\n }\n const removed = new Set<MdyFieldSpan>();\n let allowed = true;\n\n map.forEach((oldStart, oldEnd, newStart, newEnd) => {\n for (const span of spans) {\n if (oldStart === oldEnd) {\n if (oldStart > span.from && oldStart < span.to) allowed = false;\n } else if (oldStart < span.to && oldEnd > span.from) {\n if (\n oldStart <= span.from &&\n oldEnd >= span.to &&\n (newStart === newEnd || after.textBetween(newStart, newEnd) === '')\n ) {\n removed.add(span);\n } else {\n allowed = false;\n }\n }\n }\n });\n if (!allowed) return false;\n\n // Mark-only steps have empty maps. Ensure they cannot detach a protected\n // projection from its id, while allowing harmless text formatting.\n const nextSpans = getMdyFieldSpans(after, fieldIds);\n for (const span of spans) {\n if (removed.has(span)) continue;\n const from = map.map(span.from, 1);\n const to = map.map(span.to, -1);\n if (\n before.textBetween(span.from, span.to) !==\n after.textBetween(from, to) ||\n !nextSpans.some(\n (next) => next.id === span.id && next.from === from && next.to === to\n )\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\nconst mdyPluginKey = new PluginKey('mdy-field-links');\n\nexport function createMdyFieldPlugin(options: MdyEditorOptions): Plugin {\n const activate = (id: string, event: Event) => {\n event.preventDefault();\n if (!options.isDisabled?.()) options.onFieldActivate(id);\n return true;\n };\n const targetId = (event: Event) => {\n const element = event.target;\n const chip =\n element instanceof Element ? element.closest('[data-mdy-field]') : null;\n const id = chip?.getAttribute('data-mdy-field');\n return id && options.getFieldIds().has(id) ? id : null;\n };\n\n return new Plugin({\n key: mdyPluginKey,\n filterTransaction: (transaction) =>\n transaction.getMeta(MDY_PROJECTION_META) === true ||\n canEditMdyTransaction(transaction, options.getFieldIds()),\n props: {\n decorations: (state) =>\n DecorationSet.create(\n state.doc,\n getMdyFieldSpans(state.doc, options.getFieldIds()).map((span) =>\n Decoration.inline(span.from, span.to, {\n class: 'encounter-mdy-field',\n 'data-mdy-field': span.id,\n role: 'button',\n tabindex: '0',\n 'aria-label': `Linked field: ${options.getFieldLabel?.(span.id) ?? span.id}. Activate to edit in the form.`,\n 'aria-disabled': options.isDisabled?.() ? 'true' : 'false',\n style:\n 'background:rgba(59,130,246,.12);border-radius:.2em;padding:0 .15em;cursor:pointer;text-decoration:underline;text-underline-offset:.15em',\n })\n )\n ),\n handleDOMEvents: {\n click: (_view, event) => {\n const id = targetId(event);\n return id ? activate(id, event) : false;\n },\n },\n handleKeyDown: (view, event) => {\n const focusedId = targetId(event);\n if (focusedId && (event.key === 'Enter' || event.key === ' ')) {\n return activate(focusedId, event);\n }\n if (event.key !== 'Enter') return false;\n const { from, to } = view.state.selection;\n const span = getMdyFieldSpans(\n view.state.doc,\n options.getFieldIds()\n ).find((candidate) => from >= candidate.from && to <= candidate.to);\n return span ? activate(span.id, event) : false;\n },\n },\n });\n}\n\nclass MdyFieldExtension extends Extension {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {\n super();\n }\n\n override getProseMirrorPlugins() {\n return [createMdyFieldPlugin(this.options)];\n }\n}\n\nclass MdyEditorKit implements EditorKit {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {}\n\n getExtensions() {\n return [new MdyFieldExtension(this.options)];\n }\n}\n\nexport function createMdyEditorKit(options: MdyEditorOptions): EditorKit {\n return new MdyEditorKit(options);\n}\n","'use client';\n\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { CoreEditor } from '@kerebron/editor';\nimport { RichEditor, type RichEditorHandle } from '../RichEditor/RichEditor';\nimport { useEncounterMessages } from './messages';\nimport {\n createMdyEditorKit,\n refreshMdyFieldProjections,\n type MdyFieldProjection,\n} from '../RichEditor/mdyEditorKit';\n\nexport interface EncounterMdyEditorProps {\n /** MDY body only. The host retains and updates the YAML data separately. */\n body: string;\n fields?: MdyFieldProjection[];\n fieldIds?: string[];\n onChange: (body: string) => void;\n onFieldActivate: (id: string) => void;\n disabled?: boolean;\n}\n\nexport type EncounterMdyEditorHandle = RichEditorHandle;\n\n/** Free prose and headings, with form-backed MDY spans protected from typing. */\nexport const EncounterMdyEditor = forwardRef<\n EncounterMdyEditorHandle,\n EncounterMdyEditorProps\n>(function EncounterMdyEditor(\n { body, fields = [], fieldIds, onChange, onFieldActivate, disabled = false },\n ref\n) {\n const m = useEncounterMessages();\n const [editor, setEditor] = useState<CoreEditor | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const richEditor = useRef<RichEditorHandle>(null);\n const status = useRef({ editor, loadFailed, body });\n status.current = { editor, loadFailed, body };\n // The kit mounts once, while the canonical data index and activation target\n // may change as the user switches the form or updates its responses.\n const live = useRef({\n fieldIds: new Set(fieldIds),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n });\n live.current = {\n fieldIds: new Set(fieldIds ?? fields.map((field) => field.id)),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n };\n const fieldsRef = useRef(fields);\n fieldsRef.current = fields;\n useImperativeHandle(\n ref,\n () => ({\n getContent: async () => {\n // Until setup succeeds, editing is disabled and the host's exact body\n // is the only draft. An initial grammar/document-load failure can\n // therefore leave RichEdit without trying to serialize a failed load.\n // Once ready, retain read failures so unpublished prose is never lost.\n if (status.current.loadFailed && !status.current.editor)\n return status.current.body;\n return richEditor.current\n ? richEditor.current.getContent()\n : status.current.body;\n },\n focus: () => {\n if (!status.current.loadFailed) richEditor.current?.focus();\n },\n }),\n []\n );\n const editorKits = useMemo(\n () => [\n createMdyEditorKit({\n getFieldIds: () => live.current.fieldIds,\n getFieldLabel: (id) =>\n fieldsRef.current.find((field) => field.id === id)?.label,\n onFieldActivate: (id) => live.current.onFieldActivate(id),\n isDisabled: () => live.current.disabled,\n }),\n ],\n []\n );\n useEffect(() => {\n if (!editor) return;\n const refresh = () => refreshMdyFieldProjections(editor, fieldsRef.current);\n const loaded = () => refresh();\n editor.addEventListener('doc:loaded', loaded);\n refresh();\n return () => editor.removeEventListener('doc:loaded', loaded);\n }, [editor, fields]);\n\n return (\n <>\n {loadFailed && (\n <p role=\"alert\">\n {m(\n 'The narrative editor could not load. Your original document is preserved.'\n )}\n </p>\n )}\n <RichEditor\n ref={richEditor}\n value={body}\n onChange={onChange}\n onError={() => {\n status.current.loadFailed = true;\n setLoadFailed(true);\n }}\n onReady={(next) => {\n status.current.editor = next;\n setEditor(next);\n }}\n disabled={disabled || loadFailed || editor === null}\n aria-label={m('Encounter narrative')}\n editorKits={editorKits}\n className=\"encounter-mdy-editor\"\n />\n </>\n );\n});\n\nEncounterMdyEditor.displayName = 'EncounterMdyEditor';\n"]}
@@ -1,5 +1,5 @@
1
1
  import './chunk-GADJASST.js';
2
- import { RichEditor, MDY_PROJECTION_META } from './chunk-ULKDK6W6.js';
2
+ import { RichEditor, MDY_PROJECTION_META } from './chunk-3XVDSLDT.js';
3
3
  import { useMessages } from './chunk-5YOT4DVH.js';
4
4
  import './chunk-RUGHNFQG.js';
5
5
  import './chunk-PX6F3LHL.js';
@@ -282,5 +282,5 @@ var EncounterMdyEditor = forwardRef(function EncounterMdyEditor2({ body, fields
282
282
  EncounterMdyEditor.displayName = "EncounterMdyEditor";
283
283
 
284
284
  export { EncounterMdyEditor };
285
- //# sourceMappingURL=EncounterMdyEditor-ATNWXQ72.js.map
286
- //# sourceMappingURL=EncounterMdyEditor-ATNWXQ72.js.map
285
+ //# sourceMappingURL=EncounterMdyEditor-OYO3H5GJ.js.map
286
+ //# sourceMappingURL=EncounterMdyEditor-OYO3H5GJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/RichEditor/mdyEditorKit.ts","../src/components/EncounterVisit/EncounterMdyEditor.tsx"],"names":["EncounterMdyEditor"],"mappings":"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","file":"EncounterMdyEditor-ATNWXQ72.js","sourcesContent":["import { Extension, type CoreEditor, type EditorKit } from '@kerebron/editor';\nimport type { Node as ProseMirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, type Transaction } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { MDY_PROJECTION_META } from './mdyTransaction';\nexport { MDY_PROJECTION_META } from './mdyTransaction';\n\nexport interface MdyEditorOptions {\n /** Only links to fields in the host's data index are protected. */\n getFieldIds: () => ReadonlySet<string>;\n getFieldLabel?: (id: string) => string | undefined;\n onFieldActivate: (id: string) => void;\n isDisabled?: () => boolean;\n}\n\nexport interface MdyFieldSpan {\n id: string;\n from: number;\n to: number;\n}\n\nexport interface MdyFieldProjection {\n id: string;\n display: string;\n label?: string;\n}\n\n/** MDY links have field semantics only when their target exists in the data. */\nfunction linkedFieldId(href: unknown, fieldIds: ReadonlySet<string>) {\n if (typeof href !== 'string') return null;\n const id = href.startsWith('mdy:')\n ? href.slice(4)\n : href.startsWith('#')\n ? href.slice(1)\n : '';\n return fieldIds.has(id) ? id : null;\n}\n\n/** Merge neighboring text nodes, including differently formatted link text. */\nexport function getMdyFieldSpans(\n doc: ProseMirrorNode,\n fieldIds: ReadonlySet<string>\n): MdyFieldSpan[] {\n const spans: MdyFieldSpan[] = [];\n doc.descendants((node, pos) => {\n if (!node.isInline) return;\n const mark = node.marks.find((candidate) => candidate.type.name === 'link');\n let id = linkedFieldId(mark?.attrs.href, fieldIds);\n const previous = spans[spans.length - 1];\n // Kerebron's inline-HTML parser imports <br> without the surrounding link\n // mark. Keep those breaks inside a single protected field projection.\n if (\n !id &&\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n previous?.to === pos\n ) {\n let nextPos = pos + node.nodeSize;\n let next = doc.nodeAt(nextPos);\n while (\n next &&\n (next.type.name === 'br' || next.type.name === 'softbreak')\n ) {\n nextPos += next.nodeSize;\n next = doc.nodeAt(nextPos);\n }\n const nextMark = next?.marks.find(\n (candidate) => candidate.type.name === 'link'\n );\n if (linkedFieldId(nextMark?.attrs.href, fieldIds) === previous.id)\n id = previous.id;\n }\n if (!id) return;\n if (previous?.id === id && previous.to === pos) {\n previous.to = pos + node.nodeSize;\n } else {\n spans.push({ id, from: pos, to: pos + node.nodeSize });\n }\n });\n return spans;\n}\n\n/** Refresh only linked data in the live document, leaving authored prose intact. */\nexport function refreshMdyFieldProjections(\n editor: CoreEditor,\n fields: readonly MdyFieldProjection[]\n): boolean {\n const byId = new Map(fields.map((field) => [field.id, field.display]));\n const state = editor.view.state;\n const spans = getMdyFieldSpans(state.doc, new Set(byId.keys()));\n const transaction = state.tr;\n for (const span of spans.reverse()) {\n const display = byId.get(span.id)!;\n const current = state.doc.textBetween(span.from, span.to, '', '\\n');\n const oldMarks = state.doc.nodeAt(span.from)?.marks ?? [];\n const link = oldMarks.find((mark) => mark.type.name === 'link');\n if (!link) continue;\n // Kerebron 0.8.12's link serializer gathers text tokens and drops inline\n // breaks. Its existing mdTemplate attribute emits this safe MDY label as\n // one link, preserving multiline projections without an upstream patch.\n const label = display\n .split(/\\r?\\n/)\n .map((line) =>\n line\n .replace(/&/g, '&amp;')\n .replace(/\\$/g, '&#36;')\n .replace(/[\\\\[\\]`*_~<>]/g, '\\\\$&')\n )\n .join('<br>');\n const template = `[${label}](${link.attrs.href})`;\n let looseBreak = false;\n state.doc.nodesBetween(span.from, span.to, (node) => {\n if (\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n !node.marks.some((mark) => mark.type.name === 'link')\n )\n looseBreak = true;\n });\n if (\n current === display &&\n !looseBreak &&\n link.attrs.mdTemplate === template\n )\n continue;\n const marks = oldMarks.map((mark) =>\n mark.type.name === 'link'\n ? mark.type.create({ ...mark.attrs, mdTemplate: template })\n : mark\n );\n const breakType = state.schema.nodes.br ?? state.schema.nodes.softbreak;\n const replacement: ProseMirrorNode[] = [];\n display.split(/\\r?\\n/).forEach((line, index) => {\n if (index && breakType)\n replacement.push(breakType.create(null, null, marks));\n if (line) replacement.push(state.schema.text(line, marks));\n });\n transaction.replaceWith(span.from, span.to, replacement);\n }\n if (!transaction.docChanged) return false;\n transaction.setMeta(MDY_PROJECTION_META, true);\n transaction.setMeta('addToHistory', false);\n editor.view.dispatch(transaction);\n return true;\n}\n\n/**\n * Protect each existing field projection from text edits or link removal.\n * A writer may delete a whole projection; its underlying data stays intact.\n * Inspect every step so paste, drag/drop, IME and toolbar commands obey the\n * same rule as typing. Programmatic document loads bypass this edit guard.\n */\nexport function canEditMdyTransaction(\n transaction: Transaction,\n fieldIds: ReadonlySet<string>\n): boolean {\n if (!transaction.docChanged) return true;\n for (let index = 0; index < transaction.steps.length; index += 1) {\n const before = transaction.docs[index];\n const after = transaction.docs[index + 1] ?? transaction.doc;\n const map = transaction.steps[index].getMap();\n const spans = getMdyFieldSpans(before, fieldIds);\n const step = transaction.steps[index].toJSON();\n if (\n (step.stepType === 'addMark' || step.stepType === 'removeMark') &&\n step.mark?.type === 'link' &&\n spans.some((span) => step.from < span.to && step.to > span.from)\n ) {\n return false;\n }\n const removed = new Set<MdyFieldSpan>();\n let allowed = true;\n\n map.forEach((oldStart, oldEnd, newStart, newEnd) => {\n for (const span of spans) {\n if (oldStart === oldEnd) {\n if (oldStart > span.from && oldStart < span.to) allowed = false;\n } else if (oldStart < span.to && oldEnd > span.from) {\n if (\n oldStart <= span.from &&\n oldEnd >= span.to &&\n (newStart === newEnd || after.textBetween(newStart, newEnd) === '')\n ) {\n removed.add(span);\n } else {\n allowed = false;\n }\n }\n }\n });\n if (!allowed) return false;\n\n // Mark-only steps have empty maps. Ensure they cannot detach a protected\n // projection from its id, while allowing harmless text formatting.\n const nextSpans = getMdyFieldSpans(after, fieldIds);\n for (const span of spans) {\n if (removed.has(span)) continue;\n const from = map.map(span.from, 1);\n const to = map.map(span.to, -1);\n if (\n before.textBetween(span.from, span.to) !==\n after.textBetween(from, to) ||\n !nextSpans.some(\n (next) => next.id === span.id && next.from === from && next.to === to\n )\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\nconst mdyPluginKey = new PluginKey('mdy-field-links');\n\nexport function createMdyFieldPlugin(options: MdyEditorOptions): Plugin {\n const activate = (id: string, event: Event) => {\n event.preventDefault();\n if (!options.isDisabled?.()) options.onFieldActivate(id);\n return true;\n };\n const targetId = (event: Event) => {\n const element = event.target;\n const chip =\n element instanceof Element ? element.closest('[data-mdy-field]') : null;\n const id = chip?.getAttribute('data-mdy-field');\n return id && options.getFieldIds().has(id) ? id : null;\n };\n\n return new Plugin({\n key: mdyPluginKey,\n filterTransaction: (transaction) =>\n transaction.getMeta(MDY_PROJECTION_META) === true ||\n canEditMdyTransaction(transaction, options.getFieldIds()),\n props: {\n decorations: (state) =>\n DecorationSet.create(\n state.doc,\n getMdyFieldSpans(state.doc, options.getFieldIds()).map((span) =>\n Decoration.inline(span.from, span.to, {\n class: 'encounter-mdy-field',\n 'data-mdy-field': span.id,\n role: 'button',\n tabindex: '0',\n 'aria-label': `Linked field: ${options.getFieldLabel?.(span.id) ?? span.id}. Activate to edit in the form.`,\n 'aria-disabled': options.isDisabled?.() ? 'true' : 'false',\n style:\n 'background:rgba(59,130,246,.12);border-radius:.2em;padding:0 .15em;cursor:pointer;text-decoration:underline;text-underline-offset:.15em',\n })\n )\n ),\n handleDOMEvents: {\n click: (_view, event) => {\n const id = targetId(event);\n return id ? activate(id, event) : false;\n },\n },\n handleKeyDown: (view, event) => {\n const focusedId = targetId(event);\n if (focusedId && (event.key === 'Enter' || event.key === ' ')) {\n return activate(focusedId, event);\n }\n if (event.key !== 'Enter') return false;\n const { from, to } = view.state.selection;\n const span = getMdyFieldSpans(\n view.state.doc,\n options.getFieldIds()\n ).find((candidate) => from >= candidate.from && to <= candidate.to);\n return span ? activate(span.id, event) : false;\n },\n },\n });\n}\n\nclass MdyFieldExtension extends Extension {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {\n super();\n }\n\n override getProseMirrorPlugins() {\n return [createMdyFieldPlugin(this.options)];\n }\n}\n\nclass MdyEditorKit implements EditorKit {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {}\n\n getExtensions() {\n return [new MdyFieldExtension(this.options)];\n }\n}\n\nexport function createMdyEditorKit(options: MdyEditorOptions): EditorKit {\n return new MdyEditorKit(options);\n}\n","'use client';\n\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { CoreEditor } from '@kerebron/editor';\nimport { RichEditor, type RichEditorHandle } from '../RichEditor/RichEditor';\nimport { useEncounterMessages } from './messages';\nimport {\n createMdyEditorKit,\n refreshMdyFieldProjections,\n type MdyFieldProjection,\n} from '../RichEditor/mdyEditorKit';\n\nexport interface EncounterMdyEditorProps {\n /** MDY body only. The host retains and updates the YAML data separately. */\n body: string;\n fields?: MdyFieldProjection[];\n fieldIds?: string[];\n onChange: (body: string) => void;\n onFieldActivate: (id: string) => void;\n disabled?: boolean;\n}\n\nexport type EncounterMdyEditorHandle = RichEditorHandle;\n\n/** Free prose and headings, with form-backed MDY spans protected from typing. */\nexport const EncounterMdyEditor = forwardRef<\n EncounterMdyEditorHandle,\n EncounterMdyEditorProps\n>(function EncounterMdyEditor(\n { body, fields = [], fieldIds, onChange, onFieldActivate, disabled = false },\n ref\n) {\n const m = useEncounterMessages();\n const [editor, setEditor] = useState<CoreEditor | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const richEditor = useRef<RichEditorHandle>(null);\n const status = useRef({ editor, loadFailed, body });\n status.current = { editor, loadFailed, body };\n // The kit mounts once, while the canonical data index and activation target\n // may change as the user switches the form or updates its responses.\n const live = useRef({\n fieldIds: new Set(fieldIds),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n });\n live.current = {\n fieldIds: new Set(fieldIds ?? fields.map((field) => field.id)),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n };\n const fieldsRef = useRef(fields);\n fieldsRef.current = fields;\n useImperativeHandle(\n ref,\n () => ({\n getContent: async () => {\n // Until setup succeeds, editing is disabled and the host's exact body\n // is the only draft. An initial grammar/document-load failure can\n // therefore leave RichEdit without trying to serialize a failed load.\n // Once ready, retain read failures so unpublished prose is never lost.\n if (status.current.loadFailed && !status.current.editor)\n return status.current.body;\n return richEditor.current\n ? richEditor.current.getContent()\n : status.current.body;\n },\n focus: () => {\n if (!status.current.loadFailed) richEditor.current?.focus();\n },\n }),\n []\n );\n const editorKits = useMemo(\n () => [\n createMdyEditorKit({\n getFieldIds: () => live.current.fieldIds,\n getFieldLabel: (id) =>\n fieldsRef.current.find((field) => field.id === id)?.label,\n onFieldActivate: (id) => live.current.onFieldActivate(id),\n isDisabled: () => live.current.disabled,\n }),\n ],\n []\n );\n useEffect(() => {\n if (!editor) return;\n const refresh = () => refreshMdyFieldProjections(editor, fieldsRef.current);\n const loaded = () => refresh();\n editor.addEventListener('doc:loaded', loaded);\n refresh();\n return () => editor.removeEventListener('doc:loaded', loaded);\n }, [editor, fields]);\n\n return (\n <>\n {loadFailed && (\n <p role=\"alert\">\n {m(\n 'The narrative editor could not load. Your original document is preserved.'\n )}\n </p>\n )}\n <RichEditor\n ref={richEditor}\n value={body}\n onChange={onChange}\n onError={() => {\n status.current.loadFailed = true;\n setLoadFailed(true);\n }}\n onReady={(next) => {\n status.current.editor = next;\n setEditor(next);\n }}\n disabled={disabled || loadFailed || editor === null}\n aria-label={m('Encounter narrative')}\n editorKits={editorKits}\n className=\"encounter-mdy-editor\"\n />\n </>\n );\n});\n\nEncounterMdyEditor.displayName = 'EncounterMdyEditor';\n"]}
1
+ {"version":3,"sources":["../src/components/RichEditor/mdyEditorKit.ts","../src/components/EncounterVisit/EncounterMdyEditor.tsx"],"names":["EncounterMdyEditor"],"mappings":"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","file":"EncounterMdyEditor-OYO3H5GJ.js","sourcesContent":["import { Extension, type CoreEditor, type EditorKit } from '@kerebron/editor';\nimport type { Node as ProseMirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, type Transaction } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { MDY_PROJECTION_META } from './mdyTransaction';\nexport { MDY_PROJECTION_META } from './mdyTransaction';\n\nexport interface MdyEditorOptions {\n /** Only links to fields in the host's data index are protected. */\n getFieldIds: () => ReadonlySet<string>;\n getFieldLabel?: (id: string) => string | undefined;\n onFieldActivate: (id: string) => void;\n isDisabled?: () => boolean;\n}\n\nexport interface MdyFieldSpan {\n id: string;\n from: number;\n to: number;\n}\n\nexport interface MdyFieldProjection {\n id: string;\n display: string;\n label?: string;\n}\n\n/** MDY links have field semantics only when their target exists in the data. */\nfunction linkedFieldId(href: unknown, fieldIds: ReadonlySet<string>) {\n if (typeof href !== 'string') return null;\n const id = href.startsWith('mdy:')\n ? href.slice(4)\n : href.startsWith('#')\n ? href.slice(1)\n : '';\n return fieldIds.has(id) ? id : null;\n}\n\n/** Merge neighboring text nodes, including differently formatted link text. */\nexport function getMdyFieldSpans(\n doc: ProseMirrorNode,\n fieldIds: ReadonlySet<string>\n): MdyFieldSpan[] {\n const spans: MdyFieldSpan[] = [];\n doc.descendants((node, pos) => {\n if (!node.isInline) return;\n const mark = node.marks.find((candidate) => candidate.type.name === 'link');\n let id = linkedFieldId(mark?.attrs.href, fieldIds);\n const previous = spans[spans.length - 1];\n // Kerebron's inline-HTML parser imports <br> without the surrounding link\n // mark. Keep those breaks inside a single protected field projection.\n if (\n !id &&\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n previous?.to === pos\n ) {\n let nextPos = pos + node.nodeSize;\n let next = doc.nodeAt(nextPos);\n while (\n next &&\n (next.type.name === 'br' || next.type.name === 'softbreak')\n ) {\n nextPos += next.nodeSize;\n next = doc.nodeAt(nextPos);\n }\n const nextMark = next?.marks.find(\n (candidate) => candidate.type.name === 'link'\n );\n if (linkedFieldId(nextMark?.attrs.href, fieldIds) === previous.id)\n id = previous.id;\n }\n if (!id) return;\n if (previous?.id === id && previous.to === pos) {\n previous.to = pos + node.nodeSize;\n } else {\n spans.push({ id, from: pos, to: pos + node.nodeSize });\n }\n });\n return spans;\n}\n\n/** Refresh only linked data in the live document, leaving authored prose intact. */\nexport function refreshMdyFieldProjections(\n editor: CoreEditor,\n fields: readonly MdyFieldProjection[]\n): boolean {\n const byId = new Map(fields.map((field) => [field.id, field.display]));\n const state = editor.view.state;\n const spans = getMdyFieldSpans(state.doc, new Set(byId.keys()));\n const transaction = state.tr;\n for (const span of spans.reverse()) {\n const display = byId.get(span.id)!;\n const current = state.doc.textBetween(span.from, span.to, '', '\\n');\n const oldMarks = state.doc.nodeAt(span.from)?.marks ?? [];\n const link = oldMarks.find((mark) => mark.type.name === 'link');\n if (!link) continue;\n // Kerebron 0.8.12's link serializer gathers text tokens and drops inline\n // breaks. Its existing mdTemplate attribute emits this safe MDY label as\n // one link, preserving multiline projections without an upstream patch.\n const label = display\n .split(/\\r?\\n/)\n .map((line) =>\n line\n .replace(/&/g, '&amp;')\n .replace(/\\$/g, '&#36;')\n .replace(/[\\\\[\\]`*_~<>]/g, '\\\\$&')\n )\n .join('<br>');\n const template = `[${label}](${link.attrs.href})`;\n let looseBreak = false;\n state.doc.nodesBetween(span.from, span.to, (node) => {\n if (\n (node.type.name === 'br' || node.type.name === 'softbreak') &&\n !node.marks.some((mark) => mark.type.name === 'link')\n )\n looseBreak = true;\n });\n if (\n current === display &&\n !looseBreak &&\n link.attrs.mdTemplate === template\n )\n continue;\n const marks = oldMarks.map((mark) =>\n mark.type.name === 'link'\n ? mark.type.create({ ...mark.attrs, mdTemplate: template })\n : mark\n );\n const breakType = state.schema.nodes.br ?? state.schema.nodes.softbreak;\n const replacement: ProseMirrorNode[] = [];\n display.split(/\\r?\\n/).forEach((line, index) => {\n if (index && breakType)\n replacement.push(breakType.create(null, null, marks));\n if (line) replacement.push(state.schema.text(line, marks));\n });\n transaction.replaceWith(span.from, span.to, replacement);\n }\n if (!transaction.docChanged) return false;\n transaction.setMeta(MDY_PROJECTION_META, true);\n transaction.setMeta('addToHistory', false);\n editor.view.dispatch(transaction);\n return true;\n}\n\n/**\n * Protect each existing field projection from text edits or link removal.\n * A writer may delete a whole projection; its underlying data stays intact.\n * Inspect every step so paste, drag/drop, IME and toolbar commands obey the\n * same rule as typing. Programmatic document loads bypass this edit guard.\n */\nexport function canEditMdyTransaction(\n transaction: Transaction,\n fieldIds: ReadonlySet<string>\n): boolean {\n if (!transaction.docChanged) return true;\n for (let index = 0; index < transaction.steps.length; index += 1) {\n const before = transaction.docs[index];\n const after = transaction.docs[index + 1] ?? transaction.doc;\n const map = transaction.steps[index].getMap();\n const spans = getMdyFieldSpans(before, fieldIds);\n const step = transaction.steps[index].toJSON();\n if (\n (step.stepType === 'addMark' || step.stepType === 'removeMark') &&\n step.mark?.type === 'link' &&\n spans.some((span) => step.from < span.to && step.to > span.from)\n ) {\n return false;\n }\n const removed = new Set<MdyFieldSpan>();\n let allowed = true;\n\n map.forEach((oldStart, oldEnd, newStart, newEnd) => {\n for (const span of spans) {\n if (oldStart === oldEnd) {\n if (oldStart > span.from && oldStart < span.to) allowed = false;\n } else if (oldStart < span.to && oldEnd > span.from) {\n if (\n oldStart <= span.from &&\n oldEnd >= span.to &&\n (newStart === newEnd || after.textBetween(newStart, newEnd) === '')\n ) {\n removed.add(span);\n } else {\n allowed = false;\n }\n }\n }\n });\n if (!allowed) return false;\n\n // Mark-only steps have empty maps. Ensure they cannot detach a protected\n // projection from its id, while allowing harmless text formatting.\n const nextSpans = getMdyFieldSpans(after, fieldIds);\n for (const span of spans) {\n if (removed.has(span)) continue;\n const from = map.map(span.from, 1);\n const to = map.map(span.to, -1);\n if (\n before.textBetween(span.from, span.to) !==\n after.textBetween(from, to) ||\n !nextSpans.some(\n (next) => next.id === span.id && next.from === from && next.to === to\n )\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\nconst mdyPluginKey = new PluginKey('mdy-field-links');\n\nexport function createMdyFieldPlugin(options: MdyEditorOptions): Plugin {\n const activate = (id: string, event: Event) => {\n event.preventDefault();\n if (!options.isDisabled?.()) options.onFieldActivate(id);\n return true;\n };\n const targetId = (event: Event) => {\n const element = event.target;\n const chip =\n element instanceof Element ? element.closest('[data-mdy-field]') : null;\n const id = chip?.getAttribute('data-mdy-field');\n return id && options.getFieldIds().has(id) ? id : null;\n };\n\n return new Plugin({\n key: mdyPluginKey,\n filterTransaction: (transaction) =>\n transaction.getMeta(MDY_PROJECTION_META) === true ||\n canEditMdyTransaction(transaction, options.getFieldIds()),\n props: {\n decorations: (state) =>\n DecorationSet.create(\n state.doc,\n getMdyFieldSpans(state.doc, options.getFieldIds()).map((span) =>\n Decoration.inline(span.from, span.to, {\n class: 'encounter-mdy-field',\n 'data-mdy-field': span.id,\n role: 'button',\n tabindex: '0',\n 'aria-label': `Linked field: ${options.getFieldLabel?.(span.id) ?? span.id}. Activate to edit in the form.`,\n 'aria-disabled': options.isDisabled?.() ? 'true' : 'false',\n style:\n 'background:rgba(59,130,246,.12);border-radius:.2em;padding:0 .15em;cursor:pointer;text-decoration:underline;text-underline-offset:.15em',\n })\n )\n ),\n handleDOMEvents: {\n click: (_view, event) => {\n const id = targetId(event);\n return id ? activate(id, event) : false;\n },\n },\n handleKeyDown: (view, event) => {\n const focusedId = targetId(event);\n if (focusedId && (event.key === 'Enter' || event.key === ' ')) {\n return activate(focusedId, event);\n }\n if (event.key !== 'Enter') return false;\n const { from, to } = view.state.selection;\n const span = getMdyFieldSpans(\n view.state.doc,\n options.getFieldIds()\n ).find((candidate) => from >= candidate.from && to <= candidate.to);\n return span ? activate(span.id, event) : false;\n },\n },\n });\n}\n\nclass MdyFieldExtension extends Extension {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {\n super();\n }\n\n override getProseMirrorPlugins() {\n return [createMdyFieldPlugin(this.options)];\n }\n}\n\nclass MdyEditorKit implements EditorKit {\n name = 'mdy-field-links';\n constructor(private readonly options: MdyEditorOptions) {}\n\n getExtensions() {\n return [new MdyFieldExtension(this.options)];\n }\n}\n\nexport function createMdyEditorKit(options: MdyEditorOptions): EditorKit {\n return new MdyEditorKit(options);\n}\n","'use client';\n\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { CoreEditor } from '@kerebron/editor';\nimport { RichEditor, type RichEditorHandle } from '../RichEditor/RichEditor';\nimport { useEncounterMessages } from './messages';\nimport {\n createMdyEditorKit,\n refreshMdyFieldProjections,\n type MdyFieldProjection,\n} from '../RichEditor/mdyEditorKit';\n\nexport interface EncounterMdyEditorProps {\n /** MDY body only. The host retains and updates the YAML data separately. */\n body: string;\n fields?: MdyFieldProjection[];\n fieldIds?: string[];\n onChange: (body: string) => void;\n onFieldActivate: (id: string) => void;\n disabled?: boolean;\n}\n\nexport type EncounterMdyEditorHandle = RichEditorHandle;\n\n/** Free prose and headings, with form-backed MDY spans protected from typing. */\nexport const EncounterMdyEditor = forwardRef<\n EncounterMdyEditorHandle,\n EncounterMdyEditorProps\n>(function EncounterMdyEditor(\n { body, fields = [], fieldIds, onChange, onFieldActivate, disabled = false },\n ref\n) {\n const m = useEncounterMessages();\n const [editor, setEditor] = useState<CoreEditor | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const richEditor = useRef<RichEditorHandle>(null);\n const status = useRef({ editor, loadFailed, body });\n status.current = { editor, loadFailed, body };\n // The kit mounts once, while the canonical data index and activation target\n // may change as the user switches the form or updates its responses.\n const live = useRef({\n fieldIds: new Set(fieldIds),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n });\n live.current = {\n fieldIds: new Set(fieldIds ?? fields.map((field) => field.id)),\n onFieldActivate,\n disabled: disabled || loadFailed || editor === null,\n };\n const fieldsRef = useRef(fields);\n fieldsRef.current = fields;\n useImperativeHandle(\n ref,\n () => ({\n getContent: async () => {\n // Until setup succeeds, editing is disabled and the host's exact body\n // is the only draft. An initial grammar/document-load failure can\n // therefore leave RichEdit without trying to serialize a failed load.\n // Once ready, retain read failures so unpublished prose is never lost.\n if (status.current.loadFailed && !status.current.editor)\n return status.current.body;\n return richEditor.current\n ? richEditor.current.getContent()\n : status.current.body;\n },\n focus: () => {\n if (!status.current.loadFailed) richEditor.current?.focus();\n },\n }),\n []\n );\n const editorKits = useMemo(\n () => [\n createMdyEditorKit({\n getFieldIds: () => live.current.fieldIds,\n getFieldLabel: (id) =>\n fieldsRef.current.find((field) => field.id === id)?.label,\n onFieldActivate: (id) => live.current.onFieldActivate(id),\n isDisabled: () => live.current.disabled,\n }),\n ],\n []\n );\n useEffect(() => {\n if (!editor) return;\n const refresh = () => refreshMdyFieldProjections(editor, fieldsRef.current);\n const loaded = () => refresh();\n editor.addEventListener('doc:loaded', loaded);\n refresh();\n return () => editor.removeEventListener('doc:loaded', loaded);\n }, [editor, fields]);\n\n return (\n <>\n {loadFailed && (\n <p role=\"alert\">\n {m(\n 'The narrative editor could not load. Your original document is preserved.'\n )}\n </p>\n )}\n <RichEditor\n ref={richEditor}\n value={body}\n onChange={onChange}\n onError={() => {\n status.current.loadFailed = true;\n setLoadFailed(true);\n }}\n onReady={(next) => {\n status.current.editor = next;\n setEditor(next);\n }}\n disabled={disabled || loadFailed || editor === null}\n aria-label={m('Encounter narrative')}\n editorKits={editorKits}\n className=\"encounter-mdy-editor\"\n />\n </>\n );\n});\n\nEncounterMdyEditor.displayName = 'EncounterMdyEditor';\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk6I2G26AX_cjs = require('./chunk-6I2G26AX.cjs');
3
+ var chunkYKL66TCM_cjs = require('./chunk-YKL66TCM.cjs');
4
4
  var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
5
5
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
6
6
  var React2 = require('react');
@@ -724,7 +724,7 @@ var RichTextarea = React2__namespace.forwardRef(
724
724
  onKeyDown: onKeyDown && ((event) => onKeyDown(retargetEvent(event))),
725
725
  onKeyUp: onKeyUp && ((event) => onKeyUp(retargetEvent(event))),
726
726
  children: /* @__PURE__ */ jsxRuntime.jsx(
727
- chunk6I2G26AX_cjs.TextAreaRichKerebron,
727
+ chunkYKL66TCM_cjs.TextAreaRichKerebron,
728
728
  {
729
729
  value: state.html,
730
730
  onChange: handleHtmlChange,
@@ -832,5 +832,5 @@ exports.Textarea = Textarea;
832
832
  exports.htmlToPlain = htmlToPlain;
833
833
  exports.plainToHtml = plainToHtml;
834
834
  exports.textareaVariants = textareaVariants;
835
- //# sourceMappingURL=chunk-F6ZTKNAL.cjs.map
836
- //# sourceMappingURL=chunk-F6ZTKNAL.cjs.map
835
+ //# sourceMappingURL=chunk-3XR7BPKD.cjs.map
836
+ //# sourceMappingURL=chunk-3XR7BPKD.cjs.map