@linloir/limr 1.0.0 → 1.0.1

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 (64) hide show
  1. package/README.en.md +36 -8
  2. package/README.md +36 -8
  3. package/benchmarks/results/layout.json +2593 -0
  4. package/benchmarks/results/markstream-code.json +1823 -0
  5. package/benchmarks/results/markstream-reading-repeat.json +1152 -0
  6. package/benchmarks/results/markstream.json +12486 -0
  7. package/benchmarks/results/streaming-browser.json +77 -0
  8. package/benchmarks/results/streaming.json +357 -0
  9. package/dist/base.css +83 -3
  10. package/dist/{chunk-TTISGBST.js → chunk-BG5QUQFR.js} +327 -72
  11. package/dist/chunk-BG5QUQFR.js.map +1 -0
  12. package/dist/chunk-BVHHOVMT.js +179 -0
  13. package/dist/chunk-BVHHOVMT.js.map +1 -0
  14. package/dist/chunk-FJZCQY2S.js +155 -0
  15. package/dist/chunk-FJZCQY2S.js.map +1 -0
  16. package/dist/chunk-FSI5OTBW.js +1 -0
  17. package/dist/{chunk-N77VD2YR.js → chunk-GU2RPESF.js} +145 -83
  18. package/dist/chunk-GU2RPESF.js.map +1 -0
  19. package/dist/{chunk-3ILUZKDB.js → chunk-SUAAUGAX.js} +1280 -501
  20. package/dist/chunk-SUAAUGAX.js.map +1 -0
  21. package/dist/core/index.d.ts +2 -2
  22. package/dist/core/index.js +13 -5
  23. package/dist/extensions/index.d.ts +30 -5
  24. package/dist/extensions/index.js +15 -3
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +27 -8
  27. package/dist/{engine-43u8B4yt.d.ts → knuth-plass-C8mgFm7W.d.ts} +67 -1
  28. package/dist/knuth-plass-layout-CHQCWKB5.js +449 -0
  29. package/dist/knuth-plass-layout-CHQCWKB5.js.map +1 -0
  30. package/dist/react/index.d.ts +5 -4
  31. package/dist/react/index.js +5 -3
  32. package/dist/styles.css +83 -3
  33. package/dist/{translations-DHnYMg4h.d.ts → translations-BXzSwLBJ.d.ts} +39 -2
  34. package/docs/en/README.md +8 -6
  35. package/docs/en/annotations.md +3 -1
  36. package/docs/en/api.md +9 -1
  37. package/docs/en/architecture.md +11 -3
  38. package/docs/en/extensions.md +53 -4
  39. package/docs/en/getting-started.md +2 -0
  40. package/docs/en/integration.md +26 -2
  41. package/docs/en/modules.md +9 -5
  42. package/docs/en/performance.md +42 -2
  43. package/docs/en/styles.md +21 -2
  44. package/docs/en/syntax.md +118 -15
  45. package/docs/zh-CN/README.md +8 -6
  46. package/docs/zh-CN/annotations.md +3 -1
  47. package/docs/zh-CN/api.md +9 -1
  48. package/docs/zh-CN/architecture.md +11 -3
  49. package/docs/zh-CN/extensions.md +55 -4
  50. package/docs/zh-CN/getting-started.md +2 -0
  51. package/docs/zh-CN/integration.md +26 -2
  52. package/docs/zh-CN/modules.md +9 -5
  53. package/docs/zh-CN/performance.md +42 -2
  54. package/docs/zh-CN/styles.md +21 -2
  55. package/docs/zh-CN/syntax.md +120 -15
  56. package/package.json +9 -1
  57. package/skills/limr-plugin-development/references/contract.md +9 -3
  58. package/skills/limr-use/references/integration.md +11 -3
  59. package/skills/limr-use/references/syntax.md +8 -5
  60. package/dist/chunk-3ILUZKDB.js.map +0 -1
  61. package/dist/chunk-N77VD2YR.js.map +0 -1
  62. package/dist/chunk-TTISGBST.js.map +0 -1
  63. package/dist/chunk-V2OG4Y3F.js +0 -1
  64. /package/dist/{chunk-V2OG4Y3F.js.map → chunk-FSI5OTBW.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/motion.ts","../src/react/runtime.ts","../src/extensions/gfm.ts","../src/extensions/math.tsx","../src/components/CopyButton.tsx","../src/react/context.tsx","../src/extensions/code.tsx","../src/react/literal.ts","../src/extensions/literal-directive.ts","../src/extensions/annotations.tsx","../src/react/Markdown.tsx","../src/react/render.tsx","../src/react/text-binding.ts","../src/react/stream-text.tsx","../src/react/stream-effect.tsx","../src/react/knuth-plass-boundary.tsx","../src/react/selection.ts","../src/react/selection-paint.tsx","../src/components/OverlayScrollArea.tsx","../src/components/AnnotationCard.tsx","../src/extensions/translations.tsx","../src/components/InlineMarker.tsx","../src/components/Collapse.tsx","../src/extensions/mermaid.tsx","../src/components/LoadingRing.tsx","../src/components/ToolIcon.tsx","../src/extensions/callout.tsx","../src/extensions/inline-source.ts","../src/extensions/define.ts","../src/extensions/inline-highlights.tsx","../src/extensions/footnotes.tsx","../src/extensions/blocks.tsx","../src/components/Disclosure.tsx","../src/components/DiamondCheck.tsx","../src/extensions/video.tsx","../src/extensions/figures.tsx","../src/extensions/figure-layout.ts","../src/extensions/standard.ts","../src/extensions/selection-actions.tsx"],"sourcesContent":["const flights = new WeakMap<object, () => void>();\n\n/** Interruptible, distance-limited scroll; pointer/wheel intent always wins. */\nexport function scrollWithMotion(root: HTMLElement | Window, top: number) {\n flights.get(root)?.();\n const element = root instanceof Window ? root.document.documentElement : root;\n const start = root instanceof Window ? root.scrollY : root.scrollTop;\n const target = Math.max(0, Math.min(top, element.scrollHeight - (root instanceof Window ? root.innerHeight : root.clientHeight)));\n if (matchMedia('(prefers-reduced-motion: reduce)').matches) { root.scrollTo({ top: target, behavior: 'instant' }); return; }\n const duration = Math.min(560, 220 + Math.abs(target - start) * .15);\n let frame = 0, begun = 0;\n const keyboard = (event: Event) => { if (['ArrowDown', 'ArrowUp', 'PageDown', 'PageUp', 'Home', 'End', ' '].includes((event as KeyboardEvent).key)) stop(); };\n const stop = () => { cancelAnimationFrame(frame); root.removeEventListener('wheel', stop); root.removeEventListener('touchstart', stop); root.removeEventListener('pointerdown', stop); root.removeEventListener('keydown', keyboard); flights.delete(root); };\n const step = (time: number) => {\n begun ||= time;\n const t = Math.min(1, (time - begun) / duration);\n root.scrollTo({ top: start + (target - start) * (1 - Math.pow(1 - t, 4)), behavior: 'instant' });\n if (t < 1) frame = requestAnimationFrame(step); else stop();\n };\n flights.set(root, stop);\n root.addEventListener('wheel', stop, { passive: true }); root.addEventListener('touchstart', stop, { passive: true }); root.addEventListener('pointerdown', stop, { passive: true });\n root.addEventListener('keydown', keyboard);\n frame = requestAnimationFrame(step);\n}\n","import { annotationReferenceRange, createDocument, defaultHighlight, resolveAnnotationAnchors, sameRange, ResourceCache, selectionFromRange } from '../core';\nimport { intersects } from '../core/tree';\nimport type { Annotation, AnnotationOccurrence, DocumentEngine, DocumentSnapshot, HighlightData, SelectionSnapshot, SourceRange } from '../core';\nimport type { AnnotationType, DocumentCommands, LiMRLocale, NodeRenderer, RendererExtension, ViewConfiguration } from './types';\nimport { scrollWithMotion } from './motion';\n\nexport const english: LiMRLocale = {\n language: 'en', citation: 'Citation',\n contents: 'Contents', annotations: 'Annotations', expand: 'Expand', collapse: 'Collapse', close: 'Close', copy: 'Copy', copied: 'Copied',\n copyFailed: 'Copy failed', copyImage: 'Copy image URL', copyFigures: 'Copy figures Markdown',\n loading: 'Loading…', retry: 'Retry', unavailable: 'Content unavailable', footnotes: 'Footnotes',\n definition: 'Definition', question: 'Question', note: 'Note', extra: 'Extended reading', hint: 'Hint', answer: 'Answer', submit: 'Submit',\n correct: 'Correct', incorrect: 'Try again', play: 'Play video',\n highlight: 'Highlight', addHighlight: 'Add highlight', editHighlight: 'Edit highlight', highlightColor: 'Color', highlightStyle: 'Style',\n highlightBackground: 'Background', highlightUnderline: 'Underline', highlightDotted: 'Dotted', highlightWavy: 'Wavy',\n hideHighlight: 'Hide highlight', showHighlight: 'Show highlight',\n inlineHighlightHint: 'Markdown inline highlight, editing unavailable',\n deleteAnnotations: 'Delete', deleteAnnotationsHint: 'Deletes {count} annotations on this text and any highlight.',\n};\nexport const chinese: LiMRLocale = {\n language: 'zh-CN', citation: '引用',\n contents: '目录', annotations: '注释', expand: '展开', collapse: '收起', close: '关闭', copy: '复制', copied: '已复制',\n copyFailed: '复制失败', copyImage: '复制图片 URL', copyFigures: '复制图组 Markdown',\n loading: '加载中…', retry: '重试', unavailable: '暂无内容', footnotes: '脚注',\n definition: '释义', question: '提问', note: '注释', extra: '拓展阅读', hint: '提示', answer: '答案', submit: '提交',\n correct: '回答正确', incorrect: '再试一次', play: '播放视频',\n highlight: '高亮', addHighlight: '添加高亮', editHighlight: '调整高亮', highlightColor: '颜色', highlightStyle: '样式',\n highlightBackground: '底色', highlightUnderline: '下划线', highlightDotted: '点线', highlightWavy: '波浪线',\n hideHighlight: '隐藏高亮', showHighlight: '显示高亮',\n inlineHighlightHint: 'Markdown 内嵌高亮,不支持编辑',\n deleteAnnotations: '删除', deleteAnnotationsHint: '将删除这段文字关联的 {count} 个注释及高亮。',\n};\n\nexport class Store<T> {\n private listeners = new Set<() => void>();\n constructor(private value: T) {}\n get = () => this.value;\n subscribe = (listener: () => void) => { this.listeners.add(listener); return () => this.listeners.delete(listener); };\n set(value: T) { if (Object.is(this.value, value)) return; this.value = value; for (const listener of this.listeners) listener(); }\n}\nexport interface InteractionState {\n selection: SelectionSnapshot | null;\n activeHeading: string | null;\n hovered: string | null;\n active: string | null;\n editing: string | null;\n activeHighlight: string | null;\n hoveredHighlight: string | null;\n hoverSource?: 'marker' | 'sidebar' | null;\n activeSource?: 'marker' | 'sidebar' | null;\n}\nexport interface PaintHighlight extends HighlightData {\n id: string; annotationId: string; range: SourceRange;\n /** Derived hover feedback, never persisted or edited as a user highlight. */\n occurrenceId?: string;\n}\nexport interface Decorations {\n annotations: ReadonlyMap<string, Annotation>;\n highlights: ReadonlyMap<string, PaintHighlight>;\n occurrences: readonly AnnotationOccurrence[];\n referenceRanges: ReadonlyMap<string, SourceRange>;\n byBlock: ReadonlyMap<string, BlockDecorations>;\n}\nexport interface BlockDecorations { occurrences: readonly AnnotationOccurrence[]; highlights: readonly PaintHighlight[] }\nexport interface SourceBinding {\n range: SourceRange;\n atomic: boolean;\n /** Source interval for a DOM text boundary (UTF-16). */\n resolve?: (offset: number, edge: 'start' | 'end') => number;\n exact?: boolean;\n}\n\nconst EMPTY: readonly never[] = Object.freeze([]);\nexport const emptyDecorations: BlockDecorations = Object.freeze({ occurrences: EMPTY, highlights: EMPTY });\ntype ResolvedAnnotationType = Omit<AnnotationType<any>, 'label'> & { label: string };\nexport class ReaderRuntime {\n readonly document: DocumentEngine;\n readonly interaction = new Store<InteractionState>({ selection: null, activeHeading: null, hovered: null, active: null, editing: null, activeHighlight: null, hoveredHighlight: null });\n readonly layout = new Store(0);\n readonly viewport = new Store(0);\n readonly documentOffset = new Store(0);\n readonly decorations = new Store<Decorations>({ annotations: new Map(), highlights: new Map(), occurrences: [], referenceRanges: new Map(), byBlock: new Map() });\n readonly configuration: Store<ViewConfiguration>;\n readonly resources = new ResourceCache<unknown>(128);\n readonly resourceVersions = new Store<ReadonlyMap<string, number>>(new Map());\n private resourceKeys = new Map<string, { annotation: Annotation; key: string }>();\n private nextResource = 0;\n readonly anchors = new Map<string, HTMLElement>();\n readonly blocks = new Map<string, HTMLElement>();\n readonly headings = new Map<string, HTMLElement>();\n readonly bindings = new WeakMap<Node, SourceBinding>();\n readonly textBinders = new WeakMap<HTMLElement, () => void>();\n components: Readonly<Record<string, NodeRenderer>> = {};\n rendererOverrides = new Map<string, import('./types').RendererOverride[]>();\n annotationTypes = new Map<string, ResolvedAnnotationType>();\n private resolvedTypes = new WeakMap<AnnotationType<any>, ResolvedAnnotationType>();\n locale = english;\n content: HTMLElement | null = null;\n selectionRange: Range | null = null;\n /** Live geometry supplied by the paint layer; independent of native selection. */\n highlightReference: { getBoundingClientRect: () => DOMRect; getClientRects: () => DOMRect[]; text?: string } | null = null;\n private layoutFrame = 0;\n private observer: ResizeObserver | null = null;\n private headingPositions: { id: string; top: number }[] = [];\n private localAnnotations: readonly Annotation[] = [];\n private pendingOpen: string | null = null;\n private pendingAnnotations?: { input: readonly Annotation[]; value: readonly Annotation[] };\n private taskController = new AbortController();\n get signal() { return this.taskController.signal; }\n readonly commands: DocumentCommands = {\n addAnnotation: (annotation, options = {}) => {\n this.changeAnnotations(items => {\n const next = [...items.filter(item => item.id !== annotation.id), annotation];\n if (annotation.type !== 'highlight' && options.highlight !== false && (options.highlight !== undefined || this.annotationTypes.get(annotation.type)?.highlight !== 'hover')) {\n const doc = this.document.getSnapshot();\n for (const anchor of resolveAnnotationAnchors(annotation, doc)) {\n if (anchor.range.start === anchor.range.end || next.some(item => item.type === 'highlight' && resolveAnnotationAnchors(item, doc).some(other => sameRange(other.range, anchor.range)))) continue;\n next.push({ id: `highlight-${crypto.randomUUID()}`, type: 'highlight', anchors: [{ ...anchor, id: undefined }], data: { ...defaultHighlight, ...options.highlight } });\n }\n }\n return next;\n });\n if (options.edit) this.commands.editAnnotation(annotation.id);\n },\n updateAnnotation: (id, update) => this.changeAnnotations(items => items.map(item => item.id === id ? { ...item, ...update, id } : item)),\n removeAnnotation: id => this.changeAnnotations(items => items.filter(item => item.id !== id)),\n removeAnnotationsAt: ranges => this.changeAnnotations(items => items.flatMap(item => {\n const anchors = item.anchors ?? (item.range ? [{ range: item.range }] : []);\n const keep = anchors.filter(anchor => !resolveAnnotationAnchors({ ...item, range: undefined, anchors: [anchor] }, this.document.getSnapshot()).some(resolved => ranges.some(range => sameRange(range, resolved.range))));\n if (keep.length === anchors.length) return [item];\n return keep.length ? [{ ...item, range: undefined, anchors: keep }] : [];\n })),\n editAnnotation: id => {\n this.updateInteraction({ editing: id });\n if (id) this.commands.activateAnnotation(id);\n },\n activateAnnotation: id => {\n const occurrence = this.decorations.get().occurrences.find(item => item.id === id || item.annotationIds.includes(id ?? ''));\n this.pendingOpen = id && !occurrence ? id : null;\n this.activate(occurrence?.id ?? null);\n },\n };\n private changeAnnotations(update: (items: readonly Annotation[]) => readonly Annotation[]) {\n const config = this.configuration.get();\n const current = this.pendingAnnotations && this.pendingAnnotations.input === config.annotations ? this.pendingAnnotations.value : config.annotations ?? this.localAnnotations;\n const next = update(current);\n if (config.annotations !== undefined && !config.onAnnotationsChange) throw new Error('Controlled annotations require onAnnotationsChange to accept edits.');\n if (config.annotations === undefined) { this.localAnnotations = next; this.rebuildDecorations(); }\n else this.pendingAnnotations = { input: config.annotations, value: next };\n config.onAnnotationsChange?.(next);\n }\n start() { if (this.taskController.signal.aborted) this.taskController = new AbortController(); }\n dispose() { this.taskController.abort(); this.resources.invalidate(); this.resourceKeys.clear(); }\n getResourceKey(annotation: Annotation) {\n const old = this.resourceKeys.get(annotation.id);\n if (old?.annotation === annotation) return old.key;\n if (old) this.resources.invalidate(old.key);\n const key = `${annotation.id}:${++this.nextResource}`;\n this.resourceKeys.set(annotation.id, { annotation, key });\n return key;\n }\n invalidateAnnotation(id: string) {\n const current = this.resourceKeys.get(id);\n if (current) this.resources.invalidate(current.key);\n const versions = new Map(this.resourceVersions.get());\n versions.set(id, (versions.get(id) ?? 0) + 1);\n this.resourceVersions.set(versions);\n }\n\n constructor(id: string, source: string, streaming: boolean, config: ViewConfiguration) {\n this.configuration = new Store(config);\n this.installConfiguration(config);\n this.document = createDocument(source, { id, streaming, extensions: config.extensions });\n this.rebuildDecorations();\n this.document.subscribe(() => {\n this.rebuildDecorations();\n const selection = this.interaction.get().selection;\n if (selection && selection.raw.ranges.length === 1) {\n const doc = this.document.getSnapshot(), range = selection.raw.ranges[0];\n this.updateInteraction({ selection: doc.source.slice(range.start, range.end) === selection.raw.sourceText ? selectionFromRange(doc, range, { text: selection.text, quality: selection.quality, settled: selection.settled }) : null });\n }\n this.requestLayout();\n this.configuration.get().onDocumentChange?.(this.document.getSnapshot());\n });\n }\n private installConfiguration(config: ViewConfiguration) {\n this.locale = { ...english, ...config.locale };\n this.components = Object.assign({}, ...(config.extensions ?? []).map(ext => ext.components), config.components);\n this.rendererOverrides = new Map();\n const rules = [...(config.extensions ?? []).flatMap(ext => ext.rendererOverrides ?? []),\n ...Object.entries(config.components ?? {}).map(([type, component]) => ({ type, component })), ...config.rendererOverrides ?? []];\n for (const rule of rules) this.rendererOverrides.set(rule.type, [...this.rendererOverrides.get(rule.type) ?? [], rule]);\n const annotationTypes = [...(config.extensions ?? []).flatMap(ext => [...ext.annotationTypes ?? []]), ...config.annotationTypes ?? []];\n this.annotationTypes = new Map(annotationTypes.map(type => {\n if (typeof type.label === 'string') return [type.type, type as ResolvedAnnotationType];\n const label = type.label(this.locale);\n const previous = this.resolvedTypes.get(type);\n const resolved = previous?.label === label ? previous : { ...type, label };\n this.resolvedTypes.set(type, resolved);\n return [type.type, resolved];\n }));\n }\n configure(config: ViewConfiguration) {\n const old = this.configuration.get();\n if (this.pendingAnnotations?.input !== config.annotations) this.pendingAnnotations = undefined;\n this.installConfiguration(config);\n this.configuration.set(config);\n if (old.extensions !== config.extensions) this.document.setExtensions(config.extensions ?? []);\n else if (old.annotations !== config.annotations || old.annotationTypes !== config.annotationTypes) this.rebuildDecorations();\n if (old.annotationTypes !== config.annotationTypes || old.extensions !== config.extensions) this.resources.invalidate();\n }\n updateInteraction(patch: Partial<InteractionState>) {\n const old = this.interaction.get();\n if (Object.keys(patch).every(key => Object.is(old[key as keyof InteractionState], patch[key as keyof InteractionState]))) return;\n this.interaction.set({ ...old, ...patch });\n if ('selection' in patch) this.configuration.get().onSelectionChange?.(patch.selection ?? null);\n }\n hover(id: string | null, source: 'marker' | 'sidebar' = 'marker') {\n this.updateInteraction({ hovered: id, hoverSource: id ? source : null });\n this.configuration.get().onAnnotationHover?.(this.decorations.get().occurrences.find(item => item.id === id) ?? null);\n }\n activate(id: string | null, source: 'marker' | 'sidebar' = 'marker') {\n this.updateInteraction({ active: id, activeSource: id ? source : null, hovered: null, hoverSource: null });\n const occurrence = this.decorations.get().occurrences.find(item => item.id === id);\n if (occurrence) this.configuration.get().onAnnotationClick?.(occurrence);\n }\n hoverHighlight(id: string | null) {\n if (this.interaction.get().hoveredHighlight === id) return;\n this.updateInteraction({ hoveredHighlight: id });\n this.configuration.get().onHighlightHover?.(id ? this.decorations.get().annotations.get(this.decorations.get().highlights.get(id)?.annotationId ?? '') as Annotation<HighlightData> ?? null : null);\n }\n activateHighlight(id: string | null) {\n this.updateInteraction({ activeHighlight: id, selection: null });\n const highlight = id && this.decorations.get().highlights.get(id);\n if (highlight) this.configuration.get().onHighlightClick?.(this.decorations.get().annotations.get(highlight.annotationId) as Annotation<HighlightData>);\n else this.highlightReference = null;\n }\n clearSelection() {\n this.selectionRange = null;\n const selection = typeof window === 'undefined' ? null : window.getSelection();\n if (selection?.anchorNode && this.content?.contains(selection.anchorNode)) selection.removeAllRanges();\n this.highlightReference = null;\n this.updateInteraction({ selection: null, activeHighlight: null });\n }\n prepareTextBindings(element: Element) {\n const block = element.closest<HTMLElement>('[data-limr-block]');\n const bind = block && this.textBinders.get(block);\n if (bind) { this.textBinders.delete(block!); bind(); }\n }\n private rebuildDecorations() {\n const doc = this.document.getSnapshot();\n const config = this.configuration.get();\n const previous = this.decorations.get();\n const annotations = new Map(doc.annotations.map(annotation => [annotation.id, annotation]));\n for (const annotation of config.annotations ?? this.localAnnotations) annotations.set(annotation.id, annotation);\n for (const [id, resource] of this.resourceKeys) if (!annotations.has(id)) {\n this.resources.invalidate(resource.key); this.resourceKeys.delete(id);\n }\n const versions = this.resourceVersions.get();\n if ([...versions.keys()].some(id => !annotations.has(id))) this.resourceVersions.set(new Map([...versions].filter(([id]) => annotations.has(id))));\n const occurrences: AnnotationOccurrence[] = [...doc.occurrences];\n const allHighlights: PaintHighlight[] = [];\n for (const annotation of annotations.values()) {\n resolveAnnotationAnchors(annotation, doc).forEach((anchor, index) => {\n if (annotation.type === 'highlight') {\n const id = index ? `${annotation.id}:${index}` : annotation.id;\n const value = { ...(annotation.data as HighlightData), id, annotationId: annotation.id, range: anchor.range };\n const old = previous.highlights.get(id);\n allHighlights.push(old && !old.occurrenceId && sameRange(old.range, value.range) && old.color === value.color && old.style === value.style && old.hidden === value.hidden && old.readOnly === value.readOnly ? old : value);\n } else occurrences.push({ ...anchor, id: anchor.id ?? `${doc.id}-${annotation.id}-${index}`, annotationIds: [annotation.id] });\n });\n }\n occurrences.sort((a, b) => a.range.end - b.range.end || a.id.localeCompare(b.id));\n const referenceRanges = new Map(occurrences.map(occurrence => [occurrence.id, annotationReferenceRange(doc, occurrence)]));\n for (const occurrence of occurrences) {\n const annotation = annotations.get(occurrence.annotationIds[0]);\n const definition = annotation && this.annotationTypes.get(annotation.type);\n if (!annotation || definition?.highlight !== 'hover') continue;\n const range = referenceRanges.get(occurrence.id)!;\n if (range.start === range.end) continue;\n const id = `reference-${occurrence.id}`;\n const value: PaintHighlight = { id, annotationId: annotation.id, occurrenceId: occurrence.id, range, color: definition.color ?? defaultHighlight.color, style: 'background' };\n const old = previous.highlights.get(id);\n allHighlights.push(old && old.occurrenceId === value.occurrenceId && old.annotationId === value.annotationId && sameRange(old.range, range) && old.color === value.color ? old : value);\n }\n const byBlock = new Map<string, BlockDecorations>();\n for (const block of occurrences.length || allHighlights.length ? doc.blocks : []) {\n const marks = occurrences.filter(item => !item.embedded && item.range.end > block.range.start && item.range.end <= block.range.end);\n const before = previous.byBlock.get(block.id) ?? emptyDecorations;\n const old = before.occurrences;\n const same = old && old.length === marks.length && old.every((item, index) => item.id === marks[index].id && item.range.start === marks[index].range.start && item.range.end === marks[index].range.end && item.annotationIds.join('\\0') === marks[index].annotationIds.join('\\0'));\n const highlights = allHighlights.filter(item => intersects(item.range, block.range));\n const oldHighlights = before.highlights;\n const sameHighlights = oldHighlights.length === highlights.length && oldHighlights.every((item, i) => item === highlights[i]);\n if (marks.length || highlights.length) byBlock.set(block.id, same && sameHighlights ? before : { occurrences: same ? old : marks, highlights: sameHighlights ? oldHighlights : highlights });\n }\n const sameBlocks = byBlock.size === previous.byBlock.size && [...byBlock].every(([id, value]) => previous.byBlock.get(id) === value);\n const highlights = new Map(allHighlights.map(item => [item.id, item]));\n this.decorations.set({ annotations, highlights, occurrences, referenceRanges, byBlock: sameBlocks ? previous.byBlock : byBlock });\n const state = this.interaction.get();\n if (state.editing && !annotations.has(state.editing) && this.pendingOpen !== state.editing) this.updateInteraction({ editing: null });\n if (state.activeHighlight && !highlights.has(state.activeHighlight)) this.activateHighlight(null);\n if (state.hoveredHighlight && !highlights.has(state.hoveredHighlight)) this.hoverHighlight(null);\n if (state.active && !occurrences.some(item => item.id === state.active)) this.activate(null);\n if (state.hovered && !occurrences.some(item => item.id === state.hovered)) this.hover(null);\n if (this.pendingOpen) {\n const occurrence = occurrences.find(item => item.id === this.pendingOpen || item.annotationIds.includes(this.pendingOpen!));\n if (occurrence) { this.pendingOpen = null; this.activate(occurrence.id); }\n }\n }\n registerAnchor(id: string, element: HTMLElement | null) { if (element) this.anchors.set(id, element); else this.anchors.delete(id); this.requestLayout(); }\n registerHeading(id: string, element: HTMLElement | null) { if (element) this.headings.set(id, element); else this.headings.delete(id); this.requestLayout(); }\n observeBlock(element: HTMLElement | null) { if (element) { if (element.dataset.limrBlock) this.blocks.set(element.dataset.limrBlock, element); this.observer?.observe(element); } }\n unobserveBlock(element: HTMLElement) { if (element.dataset.limrBlock) this.blocks.delete(element.dataset.limrBlock); this.observer?.unobserve(element); }\n getScrollTop() { return this.configuration.get().scrollRoot?.scrollTop ?? (typeof window !== 'undefined' ? window.scrollY : 0); }\n getViewportTop() { return this.configuration.get().scrollRoot?.getBoundingClientRect().top ?? 0; }\n getContentOffset() {\n // Read the interpolated value during motion, not the destination offset.\n const translate = this.content && getComputedStyle(this.content).translate;\n return translate ? parseFloat(translate.split(' ')[1] ?? '0') || 0 : 0;\n }\n scrollTo(top: number, behavior: ScrollBehavior = 'smooth') {\n const root = this.configuration.get().scrollRoot ?? window;\n if (behavior === 'smooth') scrollWithMotion(root, top);\n else root.scrollTo({ top: Math.max(0, top), behavior });\n }\n scrollToHeading(id: string) {\n const element = this.headings.get(id);\n if (element) this.scrollTo(element.getBoundingClientRect().top - this.getViewportTop() + this.getScrollTop() - (this.configuration.get().scrollOffset ?? 24));\n }\n scrollToOccurrence(id: string) {\n const element = this.anchors.get(id);\n if (element) this.scrollTo(element.getBoundingClientRect().top - this.getViewportTop() + this.getScrollTop() - (this.configuration.get().scrollOffset ?? 24));\n }\n private followFragment = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n const link = event.target instanceof Element ? event.target.closest<HTMLAnchorElement>('a[href]') : null;\n if (!link || link.hasAttribute('download') || link.target && link.target !== '_self' || !this.content?.contains(link)) return;\n const url = new URL(link.href, document.baseURI);\n if (!url.hash || url.origin !== location.origin || url.pathname !== location.pathname || url.search !== location.search) return;\n let id: string;\n try { id = decodeURIComponent(url.hash.slice(1)); } catch { return; }\n const target = this.content.querySelector<HTMLElement>(`[id=\"${CSS.escape(id)}\"]`);\n if (!target) return;\n event.preventDefault();\n this.scrollTo(target.getBoundingClientRect().top - this.getViewportTop() + this.getScrollTop() - (this.configuration.get().scrollOffset ?? 24));\n // Keyboard navigation retains a meaningful destination without a second jump.\n if (event.detail === 0) {\n if (!target.hasAttribute('tabindex')) { target.tabIndex = -1; target.addEventListener('blur', () => target.removeAttribute('tabindex'), { once: true }); }\n target.focus({ preventScroll: true });\n }\n };\n requestLayout = () => {\n if (typeof window === 'undefined' || !this.content || this.layoutFrame) return;\n this.layoutFrame = window.requestAnimationFrame(() => {\n this.layoutFrame = 0;\n const offset = this.getScrollTop() - this.getViewportTop();\n this.headingPositions = [...this.headings].filter(([, element]) => !element.closest('[inert]')).map(([id, element]) => ({ id, top: element.getBoundingClientRect().top + offset })).sort((a, b) => a.top - b.top);\n const state = this.interaction.get();\n if (state.active && this.anchors.get(state.active)?.closest('[inert]')) this.activate(null);\n if (state.hovered && this.anchors.get(state.hovered)?.closest('[inert]')) this.hover(null);\n this.layout.set(this.layout.get() + 1);\n this.trackHeading();\n });\n };\n private trackHeading = () => {\n const positions = this.headingPositions;\n const top = this.getScrollTop() + (this.configuration.get().scrollOffset ?? 24) + 2;\n let lo = 0, hi = positions.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (positions[mid].top <= top) lo = mid + 1; else hi = mid; }\n const root = this.configuration.get().scrollRoot;\n const maximum = (root?.scrollHeight ?? document.documentElement.scrollHeight) - (root?.clientHeight ?? window.innerHeight);\n const atEnd = maximum > 0 && this.getScrollTop() >= maximum - 2;\n this.updateInteraction({ activeHeading: positions[atEnd ? positions.length - 1 : Math.max(0, lo - 1)]?.id ?? null });\n };\n mountContent(element: HTMLElement): () => void {\n this.content = element;\n this.observer = new ResizeObserver(this.requestLayout);\n this.observer.observe(element);\n element.querySelectorAll<HTMLElement>('[data-limr-block]').forEach(block => this.observer!.observe(block));\n let frame = 0;\n const scroll = () => {\n if (frame) return;\n frame = requestAnimationFrame(() => { frame = 0; this.trackHeading(); this.viewport.set(this.viewport.get() + 1); });\n };\n const scrollRoot = this.configuration.get().scrollRoot ?? window;\n scrollRoot.addEventListener('scroll', scroll, { passive: true });\n window.addEventListener('resize', this.requestLayout);\n document.fonts?.addEventListener('loadingdone', this.requestLayout);\n element.addEventListener('load', this.requestLayout, true);\n element.addEventListener('click', this.followFragment);\n this.requestLayout();\n return () => {\n this.content = null; this.observer?.disconnect(); this.observer = null;\n cancelAnimationFrame(frame); cancelAnimationFrame(this.layoutFrame); this.layoutFrame = 0;\n scrollRoot.removeEventListener('scroll', scroll); window.removeEventListener('resize', this.requestLayout);\n document.fonts?.removeEventListener('loadingdone', this.requestLayout); element.removeEventListener('load', this.requestLayout, true);\n element.removeEventListener('click', this.followFragment);\n };\n }\n}\n\nexport const emptyList = EMPTY;\n","import { gfm as syntax } from 'micromark-extension-gfm';\nimport { gfmFromMarkdown } from 'mdast-util-gfm';\nimport type { RendererExtension } from '../react/types';\n\nexport function gfm(): RendererExtension { return { name: 'gfm', directives: ['gfm'], micromark: [syntax()], mdast: gfmFromMarkdown(), scope: 'local', components: { gfm: ({ children }) => children } }; }\n","import { lazy, Suspense, type ComponentType } from 'react';\nimport { math as syntax } from 'micromark-extension-math';\nimport { mathFromMarkdown } from 'mdast-util-math';\nimport type { KatexOptions } from 'katex';\nimport type { NodeRendererProps, RendererExtension } from '../react/types';\nimport { CopyButton } from '../components/CopyButton';\nimport { literalDirective } from './literal-directive';\n\nlet loaded: ComponentType<{ value: string; display: boolean; options: MathOptions }> | undefined;\nlet loading: Promise<typeof import('./math-renderer')> | undefined;\nconst load = () => loading ??= import('./math-renderer').then(module => { loaded = module.default; return module; });\nconst MathContent = lazy(load);\n/** Optional: await before synchronous server rendering to include formula HTML. */\nexport async function preloadMath(): Promise<void> { await load(); }\nexport interface MathOptions { macros?: Record<string, string>; strict?: KatexOptions['strict'] }\n\nexport function math(options: MathOptions = {}): RendererExtension {\n function MathNode({ node }: NodeRendererProps) {\n const display = node.type === 'math';\n const fallback = <code className=\"limr-math-source\">{node.value}</code>;\n const Renderer = loaded ?? MathContent;\n const content = <Suspense fallback={fallback}><Renderer value={node.value ?? ''} display={display} options={options} /></Suspense>;\n return display ? <div className=\"limr-math-block\">{content}<CopyButton className=\"limr-math-copy\" variant=\"glass\" label=\"Copy LaTeX\" value={`$$\\n${node.value ?? ''}\\n$$`} /></div> : content;\n }\n return { name: 'math', directives: ['math'], literal: true, micromark: [syntax()], mdast: [mathFromMarkdown()], scope: 'local', components: { math: MathNode, inlineMath: MathNode }, transform: (root, context) => literalDirective(root, context.source, 'math') };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useLocale } from '../react/context';\n\n/** Shared skin primitive; glyphs are original SVG, independent of an icon font. */\nexport function CopyButton({ value = '', onCopy, label, variant = 'plain', className = '' }: { value?: string; onCopy?: () => Promise<void>; label?: string; variant?: 'plain' | 'glass'; className?: string }) {\n const locale = useLocale();\n const [status, setStatus] = useState<'idle' | 'copied' | 'error'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const mounted = useRef(true);\n const title = status === 'copied' ? locale.copied : status === 'error' ? locale.copyFailed : label ?? locale.copy;\n useEffect(() => { mounted.current = true; return () => { mounted.current = false; clearTimeout(timer.current); }; }, []);\n const copy = async () => {\n try {\n if (onCopy) await onCopy(); else await navigator.clipboard.writeText(value);\n if (!mounted.current) return;\n setStatus('copied');\n } catch { if (!mounted.current) return; setStatus('error'); }\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setStatus('idle'), 2200);\n };\n return <button type=\"button\" className={`limr-copy-button ${className}`} data-variant={variant} data-status={status} data-limr-ignore=\"true\"\n aria-label={title} title={title} onClick={copy}>\n <svg className=\"limr-copy-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <g className=\"limr-copy-sheets\"><rect x=\"8.5\" y=\"8\" width=\"10.5\" height=\"12\" rx=\"3\" /><path d=\"M15.5 8V6.8A2.8 2.8 0 0 0 12.7 4H7A3 3 0 0 0 4 7v6a3 3 0 0 0 3 3h1.5\" /></g>\n <path className=\"limr-copy-check\" d=\"m5.5 12 4.2 4.2 8.8-9\" pathLength=\"1\" />\n </svg>\n <span className={status === 'error' ? 'limr-copy-error' : 'limr-sr-only'} role=\"status\">{status === 'copied' ? locale.copied : status === 'error' ? locale.copyFailed : ''}</span>\n </button>;\n}\n","import { createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport type { Annotation, AnnotationOccurrence, DocumentEngine, DocumentSnapshot, SelectionSnapshot } from '../core';\nimport { ReaderRuntime, type Store, type InteractionState } from './runtime';\nimport type { RendererExtension, RendererParameters, ViewConfiguration } from './types';\nimport { standard } from '../extensions/standard';\n\nlet defaults: readonly RendererExtension[] | undefined;\nexport const RuntimeContext = createContext<ReaderRuntime | null>(null);\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport interface DocumentProviderProps extends ViewConfiguration {\n source?: string;\n streaming?: boolean;\n documentId?: string;\n children: ReactNode;\n}\n\nexport function DocumentProvider({ children, source = '', streaming = false, documentId, ...options }: DocumentProviderProps) {\n const generatedId = useId();\n const extensions = useMemo(() => {\n const base = options.extensions ?? (defaults ??= standard());\n return options.plugins?.length ? [...base, ...options.plugins] : base;\n }, [options.extensions, options.plugins]);\n const config: ViewConfiguration = { ...options, extensions };\n const [runtime] = useState(() => new ReaderRuntime(documentId ?? `limr-${generatedId.replace(/[^a-z\\d_-]/gi, '')}`, source, streaming, config));\n const previous = useRef({ source, streaming, config });\n useIsomorphicLayoutEffect(() => {\n const old = previous.current;\n const changed = Object.keys({ ...old.config, ...config }).some(key => old.config[key as keyof ViewConfiguration] !== config[key as keyof ViewConfiguration]);\n if (changed) runtime.configure(config);\n if (old.source !== source || old.streaming !== streaming) runtime.document.update(source, { streaming });\n previous.current = { source, streaming, config };\n });\n useEffect(() => { runtime.start(); return () => runtime.dispose(); }, [runtime]);\n return <RuntimeContext.Provider value={runtime}>{children}</RuntimeContext.Provider>;\n}\n\nexport function useRuntime(): ReaderRuntime {\n const runtime = useContext(RuntimeContext);\n if (!runtime) throw new Error('This LiMR component needs a DocumentProvider or Reader. Markdown can also be used on its own.');\n return runtime;\n}\n\n/** Only the requested value is subscribed; changing a parameter never reparses source. */\nexport function useRendererParameter<K extends keyof RendererParameters>(name: K): RendererParameters[K] {\n const runtime = useRuntime();\n return useStoreSelector(runtime.configuration, config => {\n if (config.parameters?.[name] !== undefined) return config.parameters[name];\n for (let index = (config.extensions?.length ?? 0) - 1; index >= 0; index--) {\n const parameters = config.extensions![index].parameters;\n if (parameters && name in parameters) return parameters[name];\n }\n return undefined as RendererParameters[K];\n });\n}\n\n/** Selective subscription: unchanged values do not re-render the subscriber. */\nexport function useStoreSelector<T, R>(store: { subscribe: (listener: () => void) => () => void; get: () => T }, select: (state: T) => R): R {\n const selectRef = useRef(select);\n selectRef.current = select;\n const cache = useRef<{ state: T; select: typeof select; value: R } | undefined>(undefined);\n const get = useCallback(() => {\n const state = store.get();\n if (cache.current && cache.current.state === state && cache.current.select === selectRef.current) return cache.current.value;\n const value = selectRef.current(state);\n cache.current = { state, select: selectRef.current, value };\n return value;\n }, [store]);\n return useSyncExternalStore(store.subscribe, get, get);\n}\n\nexport function useDocument(): DocumentSnapshot {\n const runtime = useRuntime();\n return useSyncExternalStore(runtime.document.subscribe, runtime.document.getSnapshot, runtime.document.getSnapshot);\n}\nexport function useDocumentSelector<R>(select: (snapshot: DocumentSnapshot) => R): R {\n const runtime = useRuntime();\n const store = useMemo(() => ({ subscribe: runtime.document.subscribe, get: runtime.document.getSnapshot }), [runtime]);\n return useStoreSelector(store, select);\n}\nexport function useSelection(): SelectionSnapshot | null { return useStoreSelector(useRuntime().interaction, state => state.selection); }\nexport function useTheme() { return useStoreSelector(useRuntime().configuration, config => config.theme ?? 'light'); }\nexport function useAppearance() { return useStoreSelector(useRuntime().configuration, config => config.appearance ?? 'classic'); }\nexport function useLocale() {\n const runtime = useRuntime();\n useStoreSelector(runtime.configuration, config => config.locale);\n return runtime.locale;\n}\nexport function useAnnotation(id: string): Annotation | undefined { return useStoreSelector(useRuntime().decorations, state => state.annotations.get(id)); }\nexport function useAnnotations() {\n const state = useStoreSelector(useRuntime().decorations, state => state);\n return useMemo(() => ({ annotations: state.annotations, occurrences: state.occurrences }), [state.annotations, state.occurrences]);\n}\nexport function useAnnotationState() {\n const runtime = useRuntime();\n const active = useStoreSelector(runtime.interaction, state => state.active);\n const hovered = useStoreSelector(runtime.interaction, state => state.hovered);\n return { active, hovered, activate: (id: string | null) => runtime.activate(id), hover: (id: string | null) => runtime.hover(id) };\n}\nexport function useAnchor(id: string) {\n const runtime = useRuntime();\n useSyncExternalStore(runtime.layout.subscribe, runtime.layout.get, runtime.layout.get);\n useSyncExternalStore(runtime.viewport.subscribe, runtime.viewport.get, runtime.viewport.get);\n const element = runtime.anchors.get(id);\n return { element: element ?? null, rect: element?.getBoundingClientRect() ?? null, contentRect: runtime.content?.getBoundingClientRect() ?? null };\n}\nexport function useLiMR() {\n const runtime = useRuntime();\n return useMemo(() => ({\n ...runtime.commands,\n document: runtime.document,\n get signal() { return runtime.signal; },\n clearSelection: () => runtime.clearSelection(),\n scrollToHeading: (id: string) => runtime.scrollToHeading(id),\n scrollToAnnotation: (id: string) => runtime.scrollToOccurrence(id),\n invalidateAnnotation: (id: string) => runtime.invalidateAnnotation(id),\n }), [runtime]);\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { ResourceCache } from '../core/cache';\nimport type { NodeRendererProps, RendererExtension, TextToken } from '../react/types';\nimport { useRuntime } from '../react/context';\nimport { CopyButton } from '../components/CopyButton';\nimport { literalValue } from '../react/literal';\nimport { literalDirective } from './literal-directive';\n\nconst cache = new ResourceCache<readonly TextToken[]>(96);\nexport interface CodeHighlightOptions { languages?: readonly string[]; lightTheme?: string; darkTheme?: string; eager?: boolean; maxLength?: number }\nconst aliases: Record<string, string> = { js: 'javascript', ts: 'typescript', py: 'python', sh: 'bash', yml: 'yaml', md: 'markdown', rs: 'rust', 'c++': 'cpp', text: 'text', txt: 'text' };\n\nexport function codeHighlight(options: CodeHighlightOptions = {}): RendererExtension {\n function CodeNode({ node, pending, renderValue }: NodeRendererProps) {\n const runtime = useRuntime();\n const code = literalValue(node);\n const language = String(node.lang ?? 'text').toLowerCase();\n const normalized = aliases[language] ?? language;\n const [result, setResult] = useState<{ code: string; tokens: readonly TextToken[] } | null>(null);\n const [visible, setVisible] = useState(options.eager ?? false);\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (visible) return;\n if (typeof IntersectionObserver === 'undefined') { setVisible(true); return; }\n const observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) { setVisible(true); observer.disconnect(); }\n }, { root: runtime.configuration.get().scrollRoot, rootMargin: '400px' });\n if (ref.current) observer.observe(ref.current);\n return () => observer.disconnect();\n }, [visible, runtime]);\n useEffect(() => {\n if (!visible || pending || code.length > (options.maxLength ?? 100_000)) return;\n let disposed = false;\n let release: (() => void) | undefined;\n let waiting: (() => void) | undefined;\n // A growing fence stays readable without re-highlighting its entire history\n // for every token. The final tree is highlighted as soon as it settles.\n const timer = setTimeout(() => {\n if (normalized === 'text' || options.languages && !options.languages.includes(normalized)) return;\n const request = cache.acquire(JSON.stringify([code, normalized, options.lightTheme, options.darkTheme]), async () => {\n const shiki = await import('shiki');\n if (!(normalized in shiki.bundledLanguages) && !(normalized in shiki.bundledLanguagesAlias)) return [];\n const result = await shiki.codeToTokens(code, { lang: normalized as import('shiki').BundledLanguage, themes: { light: options.lightTheme ?? 'github-light', dark: options.darkTheme ?? 'github-dark' }, defaultColor: false });\n let offset = 0;\n return result.tokens.flatMap((line, index) => {\n const tokens: TextToken[] = line.map(token => { const start = offset; offset += token.content.length; return { content: token.content, offset: start, style: token.htmlStyle }; });\n if (index < result.tokens.length - 1) {\n tokens.push({ content: '\\n', offset: offset++ });\n }\n return tokens;\n });\n });\n release = request.release;\n request.promise.then(tokens => {\n const apply = () => {\n if (disposed) return;\n const selection = ref.current?.ownerDocument.getSelection();\n if (selection && !selection.isCollapsed && selection.rangeCount && ref.current && selection.getRangeAt(0).intersectsNode(ref.current)) {\n if (!waiting) { waiting = apply; document.addEventListener('selectionchange', waiting); }\n return;\n }\n if (waiting) { document.removeEventListener('selectionchange', waiting); waiting = undefined; }\n setResult({ code, tokens });\n };\n apply();\n }).catch(() => { /* Plain source is a usable fallback. */ });\n }, 0);\n return () => { disposed = true; clearTimeout(timer); release?.(); if (waiting) document.removeEventListener('selectionchange', waiting); };\n }, [code, normalized, pending, visible]);\n const tokens = result?.code === code ? result.tokens : undefined;\n return <div className=\"limr-code-block\" ref={ref}>\n <div className=\"limr-code-header\" data-limr-ignore=\"true\"><span>{language}</span><CopyButton value={code} /></div>\n <pre className={tokens?.length ? 'shiki' : undefined}><code>{renderValue(tokens)}</code></pre>\n </div>;\n }\n return { name: 'code-highlight', directives: ['code', 'code-highlight'], literal: true, scope: 'local', components: { code: CodeNode }, transform: (root, context) => literalDirective(root, context.source, 'code', ['code', 'code-highlight']) };\n}\n","import { rangeOf, type MarkdownNode, type TextMapping } from '../core';\n\nexport function literalValue(node: MarkdownNode): string { return (node.value ?? '').replace(/\\r\\n?|\\n/g, node.type === 'inlineCode' ? ' ' : '\\n'); }\n\n/** Literal code does not decode Markdown entities/escapes. Map only its visible\n * payload, including CommonMark code-span whitespace and fence indentation. */\nexport function mapLiteral(source: string, node: MarkdownNode): TextMapping {\n const range = rangeOf(node), raw = source.slice(range.start, range.end), value = literalValue(node);\n const starts: number[] = [], ends: number[] = [];\n if (node.valueRange) {\n const payload = node.valueRange as { start: number; end: number };\n for (let at = payload.start; at < payload.end && starts.length < value.length; at++) {\n const size = source[at] === '\\r' && source[at + 1] === '\\n' ? 2 : 1;\n starts.push(at); ends.push(at + size); at += size - 1;\n }\n return { starts, ends, exact: starts.length === value.length };\n }\n if (node.type === 'inlineCode') {\n const fence = /^`+/.exec(raw)?.[0].length ?? 0;\n let from = fence, until = raw.length - fence;\n const normalized = raw.slice(from, until).replace(/\\r\\n?|\\n/g, ' ');\n if (normalized.startsWith(' ') && normalized.endsWith(' ') && /[^ ]/.test(normalized)) {\n from += raw.slice(from, from + 2) === '\\r\\n' ? 2 : 1;\n until -= raw.slice(until - 2, until) === '\\r\\n' ? 2 : 1;\n }\n for (let at = from; at < until; at++) {\n const length = raw[at] === '\\r' && raw[at + 1] === '\\n' ? 2 : 1;\n starts.push(range.start + at); ends.push(range.start + at + length); at += length - 1;\n }\n return { starts, ends, exact: starts.length === value.length };\n }\n const lines = [...raw.matchAll(/[^\\r\\n]*(?:\\r\\n|\\r|\\n|$)/g)].filter(match => match[0]);\n const fenced = /^[ \\t]*(?:`{3,}|~{3,})/.test(lines[0]?.[0] ?? '');\n let index = fenced ? 1 : 0;\n let exact = true;\n const values = value.split('\\n');\n for (let line = 0; line < values.length; line++, index++) {\n const match = lines[index], text = values[line];\n const rawLine = (match?.[0] ?? '').replace(/[\\r\\n]+$/, '');\n const at = rawLine.endsWith(text) ? rawLine.length - text.length : -1;\n if (at < 0 || !match) exact = false;\n const start = range.start + (match?.index ?? raw.length) + Math.max(0, at);\n for (let unit = 0; unit < text.length; unit++) { starts.push(start + unit); ends.push(start + unit + 1); }\n if (line < values.length - 1) {\n starts.push(range.start + (match?.index ?? 0) + rawLine.length);\n ends.push(range.start + (match?.index ?? 0) + (match?.[0].length ?? rawLine.length));\n }\n }\n return { starts, ends, exact };\n}\n","import { walk, type MarkdownNode } from '../core';\n\n/** Literal component payloads retain source syntax rather than flattening their\n * Markdown children (which would lose asterisks, backslashes and indentation). */\nexport function literalDirective(root: MarkdownNode, source: string, name: 'code' | 'math' | 'mermaid', aliases: readonly string[] = [name]) {\n walk(root, node => {\n if (node.type !== 'component' || !aliases.includes(node.name ?? '') || !node.position) return;\n const start = node.position.start.offset, end = node.position.end.offset;\n const raw = source.slice(start, end);\n const header = /^[^\\r\\n]*(?:\\r\\n|\\r|\\n)/.exec(raw);\n const closing = /(?:\\r\\n|\\r|\\n)[ \\t]*:{2,}[ \\t]*$/.exec(raw);\n const from = start + (header?.[0].length ?? raw.length);\n const until = closing ? start + closing.index : end;\n node.type = name;\n node.value = source.slice(from, until).replace(/\\r\\n?/g, '\\n').replace(node.incomplete ? /\\n$/ : /$^/, '');\n node.valueRange = { start: from, end: until };\n if (name === 'code') node.lang = String(node.attributes?.lang ?? node.attributes?.language ?? 'text');\n node.children = undefined;\n });\n}\n","import { useMemo, useRef } from 'react';\nimport { fromMarkdown } from 'mdast-util-from-markdown';\nimport { safeUrl, textContent, walk } from '../core/tree';\nimport type { MarkdownNode } from '../core/types';\nimport type { AnnotationContentProps, AnnotationOverlayCardProps, AnnotationSidebarPreviewProps, AnnotationType, NodeRenderer, RendererExtension } from '../react/types';\nimport { Markdown, type MarkdownProps } from '../react/Markdown';\nimport { useLocale, useRuntime, useStoreSelector } from '../react/context';\nimport { AnnotationCard } from '../components/AnnotationCard';\n\nexport interface CitationData { title?: string; url?: string; description?: string; summary?: string }\nconst CitationParagraph: NodeRenderer = ({ children }) => <p><span className=\"limr-underline\">{children}</span></p>;\nfunction CitationIcon() {\n return <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"currentColor\"><path d=\"M2.5 4.2h4.3v4.3c0 2.1-1.2 3.3-3.5 3.8l-.5-1.4c1.4-.4 2-1 2-2H2.5V4.2Zm6.7 0h4.3v4.3c0 2.1-1.2 3.3-3.5 3.8l-.5-1.4c1.4-.4 2-1 2-2H9.2V4.2Z\" /></svg>;\n}\nexport function AnnotationMarkdown({ source, className, ...props }: MarkdownProps & { source: string }) {\n const runtime = useRuntime();\n const config = useStoreSelector(runtime.configuration, config => config);\n return <Markdown source={source} extensions={config.extensions} parameters={config.parameters} components={config.components} annotationTypes={config.annotationTypes} theme={config.theme} appearance={config.appearance} locale={config.locale} interactive={false} {...props} className={`limr-annotation-markdown ${className ?? ''}`} />;\n}\n\nexport function citation(options: Partial<AnnotationType<CitationData>> = {}): RendererExtension {\n function Preview({ annotations }: AnnotationSidebarPreviewProps<CitationData>) {\n const summary = useMemo(() => annotations.filter(annotation => annotation.type === (options.type ?? 'citation')).map(annotation => {\n const data = annotation.data as CitationData | undefined;\n const source = data?.summary?.trim() || data?.description?.trim();\n // Summaries need readable text, without mounting another interactive\n // reader or exposing Markdown punctuation in a two-line preview.\n if (source) return (fromMarkdown(source) as unknown as MarkdownNode).children?.map(textContent).join(' ').replace(/\\s+/g, ' ').trim();\n return safeUrl(data?.url) || data?.title;\n }).filter(Boolean).join(' · '), [annotations]);\n return summary ? <span title={summary}>{summary}</span> : null;\n }\n function Card(props: AnnotationOverlayCardProps<CitationData>) {\n const locale = useLocale();\n return <AnnotationCard {...props} title={locale.citation ?? locale.annotations} />;\n }\n function Content({ data }: AnnotationContentProps<CitationData>) {\n const runtime = useRuntime();\n const configured = useStoreSelector(runtime.configuration, () => runtime.components);\n const components = useMemo(() => ({ ...configured, paragraph: configured.paragraph ?? CitationParagraph }), [configured]);\n const link = useRef<HTMLAnchorElement>(null);\n const url = safeUrl(data?.url);\n return <div className=\"limr-citation-content\" data-linked={!!url || undefined} onClick={event => {\n if (url && !event.defaultPrevented && !(event.target as Element).closest('a,button,input,textarea,select,summary,[role=\"button\"],[contenteditable=\"true\"],[data-limr-card-interactive]') && window.getSelection()?.isCollapsed !== false) link.current?.click();\n }}>\n <a ref={link} className=\"limr-citation-title\" href={url} target=\"_blank\" rel=\"noopener noreferrer\"><span className=\"limr-underline\">{data?.title ?? data?.url ?? 'Citation'}</span></a>\n {(data?.description || data?.summary) && <AnnotationMarkdown source={data.description || data.summary!} components={components} />}\n </div>;\n }\n return {\n name: 'citation', tags: ['citation', 'ref'], scope: 'local',\n annotationTypes: [{ type: 'citation', label: locale => locale.citation ?? 'Citation', icon: CitationIcon, color: '#6366f1', highlight: 'hover', Content, ...options, sidebar: { Preview, collapseOnContentClick: false, ...options.sidebar }, overlay: { Card, expand: false, ...options.overlay } }],\n transform(root) {\n walk(root, node => {\n if (node.type !== 'component' || node.incomplete) return;\n if (node.name === 'citation') {\n const attributes = node.attributes ?? {};\n const id = String(attributes['cite-id'] ?? attributes.id ?? '');\n node.type = 'annotationDefinition';\n node.annotation = { id, type: 'citation', data: { title: attributes.title, url: attributes.url, description: attributes.desc ?? attributes.description, summary: attributes.summary } };\n } else if (node.name === 'ref') {\n const value = String(node.attributes?.['cite-from-ids'] ?? node.attributes?.ids ?? node.attributes?.id ?? '');\n let ids: string[];\n try { const parsed = JSON.parse(value); ids = Array.isArray(parsed) ? parsed.map(String) : [String(parsed)]; }\n catch { ids = value.split(',').map(id => id.trim()).filter(Boolean); }\n node.type = 'annotationReference'; node.annotationIds = ids;\n }\n });\n },\n };\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport { useAppearance, DocumentProvider, RuntimeContext, useDocument, useIsomorphicLayoutEffect, useRuntime, useStoreSelector, type DocumentProviderProps } from './context';\nimport { BlockView, Footnotes } from './render';\nimport { useSelectionTracking } from './selection';\nimport type { StyledProps } from './types';\nimport { emptyDecorations } from './runtime';\nimport { SelectionPaint } from './selection-paint';\n\nexport interface MarkdownProps extends Omit<DocumentProviderProps, 'children'>, StyledProps {\n interactive?: boolean;\n /** Follow generated output while the reader remains near the bottom. */\n followOutput?: boolean;\n}\nexport function Markdown({ className, style, interactive = true, followOutput = false, justify, ...props }: MarkdownProps) {\n const parent = useContext(RuntimeContext);\n if (props.source !== undefined || !parent) return <DocumentProvider {...props} justify={justify}><MarkdownBody className={className} style={style} interactive={interactive} followOutput={followOutput} /></DocumentProvider>;\n return <MarkdownBody className={className} style={style} interactive={interactive} followOutput={followOutput} justify={justify} />;\n}\n\nfunction MarkdownBody({ className, style, interactive, followOutput, justify }: StyledProps & { interactive: boolean; followOutput: boolean; justify?: boolean }) {\n const runtime = useRuntime();\n const document = useDocument();\n const appearance = useAppearance();\n const theme = useStoreSelector(runtime.configuration, config => config.theme ?? 'light');\n const configuredJustify = useStoreSelector(runtime.configuration, config => config.justify ?? false);\n const typography = useStoreSelector(runtime.configuration, config => config.typography ?? 'standard');\n const justified = justify ?? (typography === 'justify' || configuredJustify);\n const scrollRoot = useStoreSelector(runtime.configuration, config => config.scrollRoot);\n const offset = useStoreSelector(runtime.documentOffset, value => value);\n const components = useStoreSelector(runtime.configuration, config => config.components);\n const extensions = useStoreSelector(runtime.configuration, config => config.extensions);\n const rendererOverrides = useStoreSelector(runtime.configuration, config => config.rendererOverrides);\n const decorations = useStoreSelector(runtime.decorations, state => state.byBlock);\n const ref = useRef<HTMLElement>(null);\n const pinned = useRef(true);\n useIsomorphicLayoutEffect(() => ref.current ? runtime.mountContent(ref.current) : undefined, [runtime, scrollRoot]);\n useIsomorphicLayoutEffect(() => runtime.requestLayout(), [runtime, justify, configuredJustify, typography]);\n useSelectionTracking(runtime, interactive);\n useEffect(() => {\n if (!followOutput) return;\n const root = scrollRoot ?? window;\n const onScroll = () => {\n const element = scrollRoot ?? window.document.documentElement;\n const viewport = scrollRoot?.clientHeight ?? window.innerHeight;\n pinned.current = element.scrollHeight - runtime.getScrollTop() - viewport < 48;\n };\n root.addEventListener('scroll', onScroll, { passive: true });\n return () => root.removeEventListener('scroll', onScroll);\n }, [runtime, followOutput, scrollRoot]);\n useIsomorphicLayoutEffect(() => {\n if (!followOutput || !document.streaming || !pinned.current) return;\n const frame = requestAnimationFrame(() => runtime.scrollTo(scrollRoot?.scrollHeight ?? window.document.documentElement.scrollHeight, 'instant'));\n return () => cancelAnimationFrame(frame);\n }, [document, runtime, followOutput, scrollRoot]);\n return <article ref={ref} className={`limr-prose ${className ?? ''}`} style={{ ...style, translate: offset ? `0 ${offset}px` : style?.translate }} data-limr-theme={theme} data-limr-appearance={appearance} data-limr-document={document.id} data-limr-justify={justified} data-limr-typography={typography}>\n {document.blocks.map(block => <BlockView key={block.id} block={block} runtime={runtime} components={components} extensions={extensions} rendererOverrides={rendererOverrides} decorations={decorations.get(block.id) ?? emptyDecorations} />)}\n <Footnotes />\n <SelectionPaint runtime={runtime} interactive={interactive} />\n </article>;\n}\n","import type { PaintHighlight } from './runtime';\nimport { cloneElement, Component, createElement, Fragment, isValidElement, memo, useCallback, useMemo, useRef, type ComponentType, type CSSProperties, type ErrorInfo, type ReactElement, type ReactNode } from 'react';\nimport { mapText, rangeOf, safeUrl, walk, type AnnotationOccurrence, type Block, type MarkdownNode, type TextMapping } from '../core';\nimport { intersects } from '../core/tree';\nimport { useDocumentSelector, useIsomorphicLayoutEffect, useRuntime, useStoreSelector } from './context';\nimport { emptyDecorations, emptyList, type BlockDecorations, type ReaderRuntime } from './runtime';\nimport type { TextToken, ViewConfiguration } from './types';\nimport { bindCompactText, compactTextNodes } from './text-binding';\nimport { literalValue, mapLiteral } from './literal';\nimport { StreamText } from './stream-text';\nimport { StreamEntrance } from './stream-effect';\nimport { KnuthPlassBoundary } from './knuth-plass-boundary';\n\ninterface RenderContext {\n runtime: ReaderRuntime;\n block: Block;\n marks: Map<MarkdownNode, readonly AnnotationOccurrence[]>;\n afterMarks: Map<MarkdownNode, readonly AnnotationOccurrence[]>;\n highlights: readonly PaintHighlight[];\n occurrences: readonly AnnotationOccurrence[];\n tightList?: boolean;\n compact?: boolean;\n live?: boolean;\n revealFrom: number;\n ancestors?: readonly MarkdownNode[];\n blockElement?: BlockElement;\n}\ninterface BlockElement { id: string; range: Block['range']; pending: boolean; ref: (element: HTMLElement | null) => void }\nconst blockAttributes = (block?: BlockElement) => block ? { 'data-limr-block': block.id, 'data-source-start': block.range.start, 'data-source-end': block.range.end, 'data-pending': block.pending || undefined } : {};\n\nexport function AnnotationMarker({ occurrence }: { occurrence: AnnotationOccurrence }) {\n const runtime = useRuntime();\n const annotation = useStoreSelector(runtime.decorations, state => state.annotations.get(occurrence.annotationIds[0]));\n const active = useStoreSelector(runtime.interaction, state => state.active === occurrence.id);\n const hovered = useStoreSelector(runtime.interaction, state => state.hovered === occurrence.id);\n const definition = useStoreSelector(runtime.configuration, () => runtime.annotationTypes.get(annotation?.type ?? 'citation'));\n const Icon = definition?.icon;\n const Custom = definition?.Marker;\n const icon = typeof Icon === 'function' || Icon && typeof Icon === 'object' && !isValidElement(Icon) && '$$typeof' in Icon\n ? createElement(Icon as ComponentType) : Icon;\n return <span className=\"limr-mark-wrap\" data-limr-ignore=\"true\" data-limr-marker={occurrence.id} data-source-start={occurrence.range.start} data-source-end={occurrence.range.end}><button type=\"button\"\n ref={element => runtime.registerAnchor(occurrence.id, element)}\n className=\"limr-mark\" data-limr-anchor={occurrence.id} data-active={active || hovered || undefined}\n style={{ '--limr-mark-color': definition?.color } as CSSProperties}\n aria-label={definition?.label ?? annotation?.type ?? 'Annotation'} aria-expanded={active}\n onPointerEnter={event => { if (event.pointerType !== 'touch') runtime.hover(occurrence.id); }}\n onPointerLeave={event => { if (event.pointerType !== 'touch' && runtime.interaction.get().hovered === occurrence.id && runtime.interaction.get().hoverSource === 'marker') runtime.hover(null); }}\n onFocus={event => { if (event.currentTarget.matches(':focus-visible')) runtime.hover(occurrence.id); }} onBlur={event => {\n // Focus can move from a marker into its hovered sidebar card on mousedown.\n // That blur must not erase the card's hover before its click toggles it.\n if (event.relatedTarget instanceof Element && event.relatedTarget.closest('[data-occurrence]')?.getAttribute('data-occurrence') === occurrence.id) return;\n if (runtime.interaction.get().hovered === occurrence.id && runtime.interaction.get().hoverSource === 'marker') runtime.hover(null);\n }}\n onClick={() => {\n const hovering = runtime.interaction.get().hovered === occurrence.id;\n runtime.activate(active ? null : occurrence.id);\n // A click does not move the pointer. Preserve hover across both toggles.\n if (hovering) runtime.hover(occurrence.id);\n }}>\n <span className=\"limr-mark-icon\">{Custom && annotation ? <Custom annotation={annotation} active={active} /> : icon ?? '•'}</span>\n {occurrence.annotationIds.length > 1 && <span className=\"limr-mark-count\">{occurrence.annotationIds.length}</span>}\n </button></span>;\n}\n\nfunction Text({ node, context, mapping: literalMapping, marks: literalMarks, style, className }: { node: MarkdownNode; context: RenderContext; mapping?: TextMapping | (() => TextMapping); marks?: readonly AnnotationOccurrence[]; style?: CSSProperties; className?: string }) {\n const { runtime } = context;\n const value = node.value ?? '';\n const range = rangeOf(node);\n const source = runtime.document.getSnapshot().source;\n const mapped = useMemo(() => {\n let mapping: ReturnType<typeof mapText> | undefined;\n const raw = source.slice(range.start, range.end);\n return () => {\n if (literalMapping) return typeof literalMapping === 'function' ? literalMapping() : literalMapping;\n if (!mapping) {\n const relative = mapText(raw, value, { start: 0, end: raw.length }, { escapes: node.verbatimEscapes !== true });\n mapping = { starts: relative.starts.map(offset => offset + range.start), ends: relative.ends.map(offset => offset + range.start), exact: relative.exact };\n }\n return mapping;\n };\n }, [node, literalMapping]);\n const marks = literalMarks ?? context.marks.get(node) ?? emptyList;\n const highlights = context.highlights.filter(highlight => intersects(highlight.range, range));\n if (!marks.length && !highlights.length) {\n // Most text is undecorated. Build character maps only when an actual\n // selection needs decoded entity/escape positions, never during SSR.\n const direct = !literalMapping && source.slice(range.start, range.end) === value;\n return <span style={style} className={className} data-limr-text=\"\" data-source-start={range.start} data-source-end={range.end} ref={element => {\n if (element) runtime.bindings.set(element, {\n range, atomic: false,\n get exact() { return direct || mapped().exact; },\n resolve: (offset, edge) => direct ? Math.max(range.start, Math.min(range.end, range.start + offset)) : edge === 'start' ? mapped().starts[offset] ?? range.end : mapped().ends[offset - 1] ?? range.start,\n });\n }}>{context.live ? <StreamText value={value} animateInitial={range.end > context.revealFrom} /> : value}</span>;\n }\n const mapping = mapped();\n const markerAt = new Map<number, AnnotationOccurrence[]>();\n const boundaries = new Set([0, value.length]);\n for (const mark of marks) {\n let index = mapping.ends.findIndex(end => end >= mark.range.end);\n index = index < 0 ? value.length : index + 1;\n boundaries.add(index); markerAt.set(index, [...markerAt.get(index) ?? [], mark]);\n }\n for (const highlight of highlights) {\n const start = mapping.ends.findIndex(end => end > highlight.range.start);\n const end = mapping.starts.findIndex(start => start >= highlight.range.end);\n boundaries.add(Math.max(0, start)); boundaries.add(end < 0 ? value.length : end);\n }\n const points = [...boundaries].sort((a, b) => a - b);\n return <>{points.slice(1).map((end, index) => {\n const start = points[index];\n const segmentRange = { start: mapping.starts[start] ?? range.start, end: mapping.ends[end - 1] ?? range.end };\n const styles = highlights.filter(highlight => intersects(highlight.range, segmentRange));\n let text: ReactNode = context.live ? <StreamText value={value.slice(start, end)} animateInitial={segmentRange.end > context.revealFrom} /> : value.slice(start, end);\n for (const highlight of styles) text = <mark key={highlight.id} data-limr-highlight={highlight.id} data-hidden={highlight.hidden || undefined} className={`limr-highlight limr-highlight-${highlight.style ?? 'background'}`} style={{ '--limr-highlight': highlight.color ?? '#f3ce7380' } as CSSProperties}>{text}</mark>;\n return <span key={start} style={style} className={className} ref={element => {\n if (element) runtime.bindings.set(element, { range: segmentRange, atomic: false, exact: mapping.exact, resolve: (offset, edge) => {\n const at = Math.max(start, Math.min(end, start + offset));\n return edge === 'start' ? mapping.starts[at] ?? segmentRange.end : mapping.ends[at - 1] ?? segmentRange.start;\n } });\n }} data-limr-text=\"\" data-source-start={segmentRange.start} data-source-end={segmentRange.end}>\n {text}{markerAt.get(end)?.map(occurrence => <AnnotationMarker key={occurrence.id} occurrence={occurrence} />)}\n </span>;\n })}</>;\n}\n\nfunction LiteralValue({ node, context, tokens }: { node: MarkdownNode; context: RenderContext; tokens?: readonly TextToken[] }) {\n const source = context.runtime.document.getSnapshot().source;\n const mapped = useMemo(() => { let value: TextMapping | undefined; return () => value ??= mapLiteral(source, node); }, [node]);\n const value = literalValue(node);\n const marks = context.marks.get(node) ?? emptyList;\n if (!tokens?.length) return <Text key={0} node={{ ...node, type: 'text', value }} context={context} mapping={mapped} marks={marks} />;\n const mapping = mapped();\n const segments = tokens?.length ? tokens : [{ content: value, offset: 0 }];\n return <>{segments.map((token, index) => {\n const start = token.offset, end = start + token.content.length;\n const mapped = { starts: mapping.starts.slice(start, end), ends: mapping.ends.slice(start, end), exact: mapping.exact };\n const range = { start: mapped.starts[0] ?? rangeOf(node).start, end: mapped.ends.at(-1) ?? rangeOf(node).end };\n const leaf: MarkdownNode = { type: 'text', value: token.content, position: { start: { offset: range.start, line: 0, column: 0 }, end: { offset: range.end, line: 0, column: 0 } } };\n return <Text key={index} className={token.style ? 'limr-code-token' : undefined} style={token.style} node={leaf} context={context} mapping={mapped} marks={marks.filter(mark => mark.range.end > range.start && mark.range.end <= range.end)} />;\n })}</>;\n}\n\nfunction Atomic({ node, context, children, inline, blockElement }: { node: MarkdownNode; context: RenderContext; children: ReactNode; inline: boolean; blockElement?: BlockElement }) {\n const range = rangeOf(node);\n const selected = useStoreSelector(context.runtime.interaction, state => state.selection?.raw.ranges.some(selection => intersects(selection, range)) ?? false);\n const highlights = context.highlights.filter(highlight => !highlight.hidden && intersects(highlight.range, range));\n const Tag = inline ? 'span' : 'div';\n const image = ['image', 'imageReference'].includes(node.type) || node.type === 'component' && node.name === 'img';\n const corner = image || !inline;\n const marks = [...context.marks.get(node) ?? [], ...corner ? context.afterMarks.get(node) ?? [] : []];\n const markers = marks.map(occurrence => <AnnotationMarker key={occurrence.id} occurrence={occurrence} />);\n return <><Tag {...blockAttributes(blockElement)} className={`limr-atomic${image ? ' limr-atomic-image' : ''}${corner ? ' limr-atomic-corner' : ''}${highlights.length ? ' limr-atomic-highlight' : ''}`} data-selected={selected || undefined}\n data-limr-media={image ? 'image' : undefined}\n data-limr-atomic={inline ? 'inline' : 'block'} data-source-start={range.start} data-source-end={range.end}\n style={{ '--limr-highlight': highlights[0]?.color ?? '#f3ce7380' } as CSSProperties}\n ref={element => { if (element) context.runtime.bindings.set(element, { range, atomic: true }); blockElement?.ref(element); }}>\n {children}\n {corner && !!marks.length && <span className=\"limr-corner-marks\" data-limr-ignore=\"true\">{markers}</span>}\n </Tag>{!corner && markers}</>;\n}\n\nfunction HeadingNode({ node, children, runtime, blockElement }: { node: MarkdownNode; children: ReactNode; runtime: ReaderRuntime; blockElement?: BlockElement }) {\n const id = (() => {\n const doc = runtime.document.getSnapshot();\n const offset = node.position?.start.offset ?? 0;\n let lo = 0, hi = doc.headings.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (doc.headings[mid].range.start < offset) lo = mid + 1; else hi = mid; }\n return doc.headings[lo]?.range.start === offset ? doc.headings[lo].id : undefined;\n })();\n return createElement(`h${node.depth}`, { ...blockAttributes(blockElement), id, ref: (element: HTMLElement | null) => { if (id) runtime.registerHeading(id, element); blockElement?.ref(element); } }, children);\n}\nfunction Reference({ node, children, image }: { node: MarkdownNode; children: ReactNode; image: boolean }) {\n const definition = useDocumentSelector(doc => doc.definitions.get(String(node.identifier)));\n if (!definition) return <>{children || String(node.alt ?? node.label ?? '')}</>;\n return image ? <img src={safeUrl(definition.url, true)} alt={String(node.alt ?? '')} title={definition.title ? String(definition.title) : undefined} loading=\"lazy\" decoding=\"async\" /> : <a href={safeUrl(definition.url)} title={definition.title ? String(definition.title) : undefined}>{children}</a>;\n}\nfunction FootnoteReference({ node }: { node: MarkdownNode }) {\n const runtime = useRuntime();\n const identifier = String(node.identifier);\n const number = useDocumentSelector(doc => doc.footnoteOrder.indexOf(identifier) + 1);\n return <sup data-limr-ignore=\"true\"><a href={`#${runtime.document.id}-fn-${encodeURIComponent(identifier)}`} id={`${runtime.document.id}-fnref-${rangeOf(node).start}`} aria-label={`Footnote ${number}`}>{number}</a></sup>;\n}\n\nclass ExtensionBoundary extends Component<{ children: ReactNode; fallback: string }, { failed: boolean }> {\n state = { failed: false };\n static getDerivedStateFromError() { return { failed: true }; }\n componentDidCatch(_error: Error, _info: ErrorInfo) { /* Isolate a third-party rendering failure to its source block. */ }\n componentDidUpdate(previous: Readonly<{ children: ReactNode; fallback: string }>) {\n if (this.state.failed && previous.fallback !== this.props.fallback) this.setState({ failed: false });\n }\n render() { return this.state.failed ? <pre className=\"limr-extension-error\">{this.props.fallback}</pre> : this.props.children; }\n}\n\nfunction containsBlock(node: MarkdownNode): boolean {\n return (node.type === 'component' && !node.inline) || ['math', 'code', 'list', 'table', 'blockquote'].includes(node.type) || (node.children?.some(containsBlock) ?? false);\n}\n\nfunction renderNode(node: MarkdownNode, context: RenderContext, index = 0, trailing?: ReactNode): ReactNode {\n const { runtime } = context;\n if (node.type === 'text' && context.compact) return context.live ? <StreamText key={`text-${node.position?.start.offset ?? index}`} value={node.value ?? ''} animateInitial={rangeOf(node).end > context.revealFrom} /> : node.value ?? '';\n if (node.type === 'streamPending') return null;\n const blockElement = node === context.block.node ? context.blockElement : undefined;\n const key = `${node.type}-${node.position?.start.offset ?? index}-${index}`;\n let childContext = node.type === 'list' ? { ...context, tightList: !node.spread } : context;\n if (runtime.rendererOverrides.size) childContext = { ...childContext, ancestors: [...context.ancestors ?? [], node] };\n const renderChildren = (nodes: readonly MarkdownNode[], options?: { trailing?: ReactNode }) => {\n let last = -1;\n nodes.forEach((child, i) => { if (!['definition', 'footnoteDefinition', 'annotationDefinition'].includes(child.type)) last = i; });\n if (last < 0 && options?.trailing) return [<Fragment key=\"trailing\">{options.trailing}</Fragment>];\n return nodes.map((child, i) => renderNode(child, childContext, i, i === last ? options?.trailing : undefined));\n };\n const children = node.type === 'table' ? [] : node.type === 'listItem' && context.tightList\n ? (node.children ?? []).flatMap((child, index) => child.type === 'paragraph' ? renderChildren(child.children ?? []) : renderNode(child, context, index))\n : renderChildren(node.children ?? []);\n const componentName = node.type === 'component' ? node.name ?? '' : node.type;\n const rules = runtime.rendererOverrides.get(componentName);\n const override = rules?.slice().reverse().find(rule => !rule.when || rule.when(node, { pending: context.block.pending, incomplete: !!node.incomplete, ancestors: context.ancestors ?? [] }));\n const owner = node.incomplete && !override ? runtime.configuration.get().extensions?.slice().reverse().find(extension => extension.components?.[componentName]) : undefined;\n const Renderer = override?.component ?? (node.incomplete && owner?.streaming?.Loading || runtime.components[componentName]);\n let element: ReactNode;\n if (Renderer) {\n const range = rangeOf(node);\n const renderAttribute = (name: string) => {\n const attribute = node.attributeNodes?.[name];\n if (!attribute) return String(node.attributes?.[name] ?? '');\n const range = rangeOf(attribute);\n return <Text node={attribute} context={context} marks={context.occurrences.filter(item => item.range.end > range.start && item.range.end <= range.end)} />;\n };\n element = <ExtensionBoundary key={key} fallback={runtime.document.getSnapshot().source.slice(range.start, range.end)}><Renderer node={node} children={children} pending={context.block.pending} incomplete={!!node.incomplete} source={runtime.document.getSnapshot().source.slice(range.start, range.end)} renderChildren={renderChildren} renderValue={tokens => <LiteralValue node={node} context={context} tokens={tokens} />} renderAttribute={renderAttribute} /></ExtensionBoundary>;\n } else {\n switch (node.type) {\n case 'text': return <Fragment key={key}>{context.compact ? node.value ?? '' : <Text node={node} context={context} />}{trailing}</Fragment>;\n case 'paragraph': element = containsBlock(node) ? <div className=\"limr-paragraph\">{children}{trailing}</div> : <p>{children}{trailing}</p>; trailing = undefined; break;\n case 'heading': return <HeadingNode key={key} node={node} runtime={runtime} blockElement={blockElement}>{children}{trailing}</HeadingNode>;\n case 'strong': element = <strong>{children}</strong>; break;\n case 'emphasis': element = <em>{children}</em>; break;\n case 'delete': element = <del>{children}</del>; break;\n case 'inlineCode': element = <code className=\"limr-inline-code\" data-limr-inline-syntax=\"\" data-source-start={rangeOf(node).start} data-source-end={rangeOf(node).end}><LiteralValue node={node} context={context} /></code>; break;\n case 'code': element = <pre><code><LiteralValue node={node} context={context} /></code></pre>; break;\n case 'math': case 'inlineMath': element = <code>{node.value}</code>; break;\n case 'blockquote': element = <blockquote className=\"limr-note\"><div className=\"limr-card-label\" data-limr-ignore=\"true\">{runtime.locale.note}</div><div className=\"limr-block-content\">{children}</div></blockquote>; break;\n case 'list': element = node.ordered ? <ol start={Number(node.start ?? 1)}>{children}</ol> : <ul>{children}</ul>; break;\n case 'listItem': element = <li className={typeof node.checked === 'boolean' ? 'limr-task-item' : undefined}>{typeof node.checked === 'boolean' && <input type=\"checkbox\" checked={node.checked} disabled aria-label=\"Task\" />}{children}</li>; break;\n case 'link': element = <a href={safeUrl(node.url)} title={node.title ? String(node.title) : undefined}>{children}</a>; break;\n case 'image': element = <img src={safeUrl(node.url, true)} alt={String(node.alt ?? '')} title={node.title ? String(node.title) : undefined} loading=\"lazy\" decoding=\"async\" />; break;\n case 'linkReference': element = <Reference node={node} image={false}>{children}</Reference>; break;\n case 'imageReference': element = <Reference node={node} image>{children}</Reference>; break;\n case 'thematicBreak': element = <hr />; break;\n case 'break': element = <br data-limr-break=\"\" data-source-start={rangeOf(node).start} data-source-end={rangeOf(node).end} />; break;\n case 'table': {\n const rows = node.children ?? [], alignment = node.align as (string | null)[];\n element = <div className=\"limr-table-scroll\"><table><thead>{rows.slice(0, 1).map((row, i) => <tr key={i}>{row.children?.map((cell, j) => <th key={j} style={{ textAlign: alignment?.[j] as CSSProperties['textAlign'] }}>{renderChildren(cell.children ?? [])}</th>)}</tr>)}</thead><tbody>{rows.slice(1).map((row, i) => <tr key={i}>{row.children?.map((cell, j) => <td key={j} style={{ textAlign: alignment?.[j] as CSSProperties['textAlign'] }}>{renderChildren(cell.children ?? [])}</td>)}</tr>)}</tbody></table></div>; break;\n }\n case 'definition': case 'footnoteDefinition': case 'annotationDefinition': return null;\n case 'footnoteReference': return <Fragment key={key}><FootnoteReference node={node} />{trailing}</Fragment>;\n case 'annotationReference': {\n const Tag = node.inline ? 'span' : 'div';\n element = <Tag>{children}<AnnotationMarker occurrence={{ id: `${runtime.document.id}-ref-${rangeOf(node).start}`, range: rangeOf(node), annotationIds: node.annotationIds as string[], embedded: true }} /></Tag>; break;\n }\n case 'html': element = <span className=\"limr-literal\">{node.value}</span>; break;\n case 'component': element = children; break;\n default: element = children.length ? children : node.value ?? null;\n }\n }\n const atomic = node.selection === 'atomic' || ['math', 'inlineMath', 'image', 'imageReference', 'html'].includes(node.type);\n const corner = atomic && (!node.inline && !['inlineCode', 'inlineMath', 'html'].includes(node.type) || ['image', 'imageReference'].includes(node.type) || node.name === 'img');\n const after = corner ? undefined : context.afterMarks.get(node);\n const withMarkers = (element: ReactNode) => {\n const result = after?.length || trailing ? <Fragment key={key}>{element}{after?.map(occurrence => <AnnotationMarker key={occurrence.id} occurrence={occurrence} />)}{trailing}</Fragment> : element;\n return context.live && !node.inline && (node.type === 'component' || ['code', 'math', 'mermaid', 'callout', 'blockquote', 'table'].includes(node.type))\n ? <StreamEntrance key={key} state={node.type === 'component' ? !!node.incomplete : true}>{result}</StreamEntrance> : result;\n };\n if (atomic) return withMarkers(<Atomic key={key} node={node} context={context} blockElement={blockElement} inline={node.inline || ['inlineCode', 'inlineMath', 'image', 'imageReference', 'html'].includes(node.type)}>{element}</Atomic>);\n if (blockElement) {\n const attributes = { ...blockAttributes(blockElement), ref: blockElement.ref };\n // Ordinary blocks carry their own metadata; only arbitrary custom renderers\n // need an outer host element to participate in layout and selection.\n return withMarkers(isValidElement(element) && typeof element.type === 'string'\n ? cloneElement(element as ReactElement<Record<string, unknown>>, { ...attributes, key })\n : <div key={key} {...attributes}>{element}</div>);\n }\n return withMarkers(isValidElement(element) ? cloneElement(element, { key }) : <Fragment key={key}>{element}</Fragment>);\n}\n\nexport const BlockView = memo(function BlockView({ block, runtime, components, extensions, rendererOverrides, decorations, footnoteId }: { block: Block; runtime: ReaderRuntime; decorations: BlockDecorations; footnoteId?: string } & Pick<ViewConfiguration, 'components' | 'extensions' | 'rendererOverrides'>) {\n const streamed = useRef(runtime.document.getSnapshot().streaming);\n if (block.pending) streamed.current = true;\n const revealed = useRef(block.range.start);\n const revealFrom = revealed.current;\n useIsomorphicLayoutEffect(() => { revealed.current = Math.max(revealed.current, block.range.end); }, [block.range.end]);\n const element = useRef<HTMLElement | null>(null);\n const getElement = useCallback(() => element.current, []);\n const typography = useStoreSelector(runtime.configuration, config => config.typography);\n const knuthPlass = useStoreSelector(runtime.configuration, config => config.knuthPlass);\n const clearBindings = useRef<(() => void) | undefined>(undefined);\n const { occurrences } = decorations;\n // Transient reference paint belongs to the shared paint layer. It must not\n // split text, add editable <mark> elements, or appear in SSR/print output.\n const highlights = useMemo(() => decorations.highlights.filter(highlight => !highlight.occurrenceId), [decorations.highlights]);\n const root = useMemo(() => footnoteId ? { ...block.node, type: 'listItem' } : block.node, [block, footnoteId]);\n const texts = useMemo(() => compactTextNodes(root, runtime.components, runtime.rendererOverrides), [root, runtime, components, extensions, rendererOverrides]);\n const compact = typography !== 'knuth-plass' && !!texts && !occurrences.length && !highlights.length;\n const observe = useCallback((next: HTMLElement | null) => {\n clearBindings.current?.(); clearBindings.current = undefined;\n if (element.current) runtime.textBinders.delete(element.current);\n if (element.current && element.current !== next) runtime.unobserveBlock(element.current);\n element.current = next;\n runtime.observeBlock(next);\n if (next && compact && texts!.length) runtime.textBinders.set(next, () => { clearBindings.current = bindCompactText(next, texts!, runtime); });\n }, [runtime, compact, texts]);\n const { marks, afterMarks } = useMemo(() => {\n const map = new Map<MarkdownNode, AnnotationOccurrence[]>();\n const after = new Map<MarkdownNode, AnnotationOccurrence[]>();\n if (!occurrences.length) return { marks: map, afterMarks: after };\n const leaves: MarkdownNode[] = [];\n const attributes: MarkdownNode[] = [];\n const paths = new Map<MarkdownNode, readonly MarkdownNode[]>();\n const outside = new Set(['strong', 'emphasis', 'delete', 'link', 'linkReference', 'inlineCode', 'code', 'math', 'inlineMath', 'image', 'imageReference', 'html']);\n function collect(node: MarkdownNode, ancestors: readonly MarkdownNode[] = []) {\n if (node.attributeNodes) attributes.push(...Object.values(node.attributeNodes));\n const path = [...ancestors, node];\n if (node.selection === 'atomic' || ['text', 'inlineCode', 'code', 'math', 'inlineMath', 'image', 'imageReference', 'html'].includes(node.type)) { leaves.push(node); paths.set(node, path); }\n else node.children?.forEach(child => collect(child, path));\n }\n collect(block.node);\n for (const occurrence of occurrences) {\n const target = [...leaves].reverse().find(node => rangeOf(node).start < occurrence.range.end) ?? leaves[0];\n // An attribute can supply an atomic image, or text rendered separately as\n // its caption. Only the latter is handled by renderAttribute's Text node.\n const image = target && (['image', 'imageReference'].includes(target.type) || target.name === 'img') && rangeOf(target).end >= occurrence.range.end;\n if (!image && attributes.some(attribute => { const range = rangeOf(attribute); return occurrence.range.end > range.start && occurrence.range.end <= range.end; })) continue;\n if (target) {\n // An absorbed closing delimiter places the marker after its outermost\n // completed format. A partial code selection keeps its exact inner end.\n const outer = paths.get(target)?.find(node => (outside.has(node.type) || node.selection === 'atomic') && rangeOf(node).end <= occurrence.range.end);\n const destination = outer ? after : map, node = outer ?? target;\n destination.set(node, [...destination.get(node) ?? [], occurrence]);\n }\n }\n return { marks: map, afterMarks: after };\n }, [block, occurrences]);\n if (!footnoteId && ['definition', 'footnoteDefinition', 'annotationDefinition'].includes(block.node.type)) return null;\n const context: RenderContext = { runtime, block, marks, afterMarks, highlights, occurrences, compact, live: streamed.current, revealFrom, blockElement: { id: block.id, range: block.range, pending: block.pending, ref: observe } };\n const content = footnoteId ? <li id={`${runtime.document.id}-fn-${encodeURIComponent(footnoteId)}`} {...blockAttributes(context.blockElement)} ref={observe}>{block.node.children?.map((child, index) => renderNode(child, { ...context, blockElement: undefined }, index))}</li> : renderNode(block.node, context);\n return <KnuthPlassBoundary element={getElement} runtime={runtime} enabled={typography === 'knuth-plass'} pending={block.pending} options={knuthPlass}>{content}</KnuthPlassBoundary>;\n});\n\nexport function Footnotes() {\n const runtime = useRuntime();\n const doc = useDocumentSelector(snapshot => snapshot);\n const components = useStoreSelector(runtime.configuration, config => config.components);\n const extensions = useStoreSelector(runtime.configuration, config => config.extensions);\n const rendererOverrides = useStoreSelector(runtime.configuration, config => config.rendererOverrides);\n const decorations = useStoreSelector(runtime.decorations, state => state.byBlock);\n const blocks = useMemo(() => new Map(doc.blocks.filter(block => block.node.type === 'footnoteDefinition').map(block => [String(block.node.identifier), block])), [doc.blocks]);\n if (!doc.footnoteOrder.length) return null;\n return <section className=\"limr-footnotes\" aria-label={runtime.locale.footnotes}><hr /><ol>{doc.footnoteOrder.map(id => {\n const node = doc.footnotes.get(id);\n if (!node) return null;\n const block: Block = blocks.get(id) ?? { id: `${doc.id}-fn-${id}`, range: rangeOf(node), node, pending: false };\n return <BlockView key={id} block={block} runtime={runtime} components={components} extensions={extensions} rendererOverrides={rendererOverrides} footnoteId={id} decorations={decorations.get(block.id) ?? emptyDecorations} />;\n })}</ol></section>;\n}\n","import { mapText, rangeOf, type MarkdownNode } from '../core';\nimport type { NodeRenderer } from './types';\nimport type { ReaderRuntime, SourceBinding } from './runtime';\n\nconst atomic = new Set(['inlineCode', 'code', 'math', 'inlineMath', 'image', 'imageReference', 'html']);\nconst hidden = new Set(['definition', 'footnoteDefinition', 'annotationDefinition', 'footnoteReference']);\nconst ordinary = new Set(['text', 'paragraph', 'heading', 'strong', 'emphasis', 'delete', 'blockquote', 'list', 'listItem', 'link', 'linkReference', 'table', 'tableRow', 'tableCell', 'thematicBreak', 'break', 'annotationReference']);\n\n/** Native text nodes suffice for ordinary Markdown. Custom layouts keep explicit\n * wrappers so reordered/conditional children retain independent source bindings. */\nexport function compactTextNodes(node: MarkdownNode, components: Readonly<Record<string, NodeRenderer>>, overrides?: ReadonlyMap<string, unknown>): readonly MarkdownNode[] | null {\n const texts: MarkdownNode[] = [];\n let supported = true;\n const visit = (node: MarkdownNode) => {\n if (node.selection === 'atomic' || atomic.has(node.type) || hidden.has(node.type)) return;\n if (!ordinary.has(node.type) || components[node.type] || overrides?.has(node.type)) { supported = false; return; }\n if (node.type === 'text') { if (node.value) texts.push(node); return; }\n node.children?.forEach(visit);\n };\n visit(node);\n return supported ? texts : null;\n}\n\nfunction bindingFor(node: MarkdownNode, source: string): SourceBinding {\n const range = rangeOf(node), value = node.value ?? '';\n // Retain only this node's raw slice, never the history of streaming prefixes.\n const raw = source.slice(range.start, range.end);\n const direct = raw === value;\n let mapping: ReturnType<typeof mapText> | undefined;\n const mapped = () => mapping ??= mapText(raw, value, { start: 0, end: raw.length });\n return {\n range, atomic: false,\n get exact() { return direct || mapped().exact; },\n resolve(offset, edge) {\n const at = Math.max(0, Math.min(value.length, offset));\n return direct ? range.start + at : range.start + (edge === 'start' ? mapped().starts[at] ?? raw.length : mapped().ends[at - 1] ?? 0);\n },\n };\n}\n\n/** Attach metadata only: React continues to own all text and element mutations. */\nexport function bindCompactText(element: HTMLElement, nodes: readonly MarkdownNode[], runtime: ReaderRuntime): () => void {\n const bound: Node[] = [];\n const clear = () => bound.forEach(node => runtime.bindings.delete(node));\n const bindings = nodes.map(node => bindingFor(node, runtime.document.getSnapshot().source));\n const walker = element.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n return element.hasAttribute('data-limr-ignore') || element.hasAttribute('data-limr-text') || runtime.bindings.get(element)?.atomic ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_SKIP;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n let index = 0, inValue = 0;\n for (let text = walker.nextNode(); text; text = walker.nextNode()) {\n const value = text.textContent ?? '';\n if (!value) continue;\n const parts: { start: number; end: number; offset: number; binding: SourceBinding }[] = [];\n for (let at = 0; at < value.length;) {\n const expected = nodes[index]?.value ?? '';\n const size = Math.min(value.length - at, expected.length - inValue);\n if (size <= 0 || value.slice(at, at + size) !== expected.slice(inValue, inValue + size)) { clear(); return () => {}; }\n parts.push({ start: at, end: at + size, offset: inValue, binding: bindings[index] });\n at += size; inValue += size;\n if (inValue === expected.length) { index++; inValue = 0; }\n }\n const first = parts[0], last = parts[parts.length - 1];\n runtime.bindings.set(text, parts.length === 1 && first.offset === 0 && value === nodes[index - 1]?.value ? first.binding : {\n range: { start: first.binding.range.start, end: last.binding.range.end }, atomic: false,\n get exact() { return parts.every(part => part.binding.exact); },\n resolve(offset, edge) {\n const part = parts.find(part => edge === 'start' ? part.end > offset : part.end >= offset) ?? last;\n return part.binding.resolve!(part.offset + offset - part.start, edge);\n },\n });\n bound.push(text);\n }\n return clear;\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useIsomorphicLayoutEffect, useRuntime } from './context';\nimport { animateStream, streamEffect } from './stream-effect';\n\n/** React owns the host and initial SSR text. This leaf owns append-only text\n * mutations: appendData preserves native Range endpoints; textContent does not.\n * Animation wrappers are compacted only after the selection leaves the leaf. */\nexport function StreamText({ value, animateInitial = true }: { value: string; animateInitial?: boolean }) {\n const runtime = useRuntime();\n const initial = useRef(value), previous = useRef(value);\n const element = useRef<HTMLSpanElement>(null);\n const animations = useRef(new Set<Animation>());\n const waiting = useRef(false);\n const mounted = useRef(false);\n const compact = useCallback(() => {\n const host = element.current;\n if (!host) return;\n const selection = host.ownerDocument.getSelection();\n if (selection && !selection.isCollapsed && selection.rangeCount && selection.getRangeAt(0).intersectsNode(host)) {\n if (!waiting.current) { host.ownerDocument.addEventListener('selectionchange', compact); waiting.current = true; }\n return;\n }\n if (waiting.current) { host.ownerDocument.removeEventListener('selectionchange', compact); waiting.current = false; }\n for (const span of host.querySelectorAll('[data-limr-increment-done]')) span.replaceWith(...span.childNodes);\n host.normalize();\n }, []);\n useIsomorphicLayoutEffect(() => {\n const host = element.current;\n if (!host) return;\n const effect = streamEffect(runtime);\n const animate = (element: HTMLElement) => {\n const animation = animateStream(element, effect);\n if (!animation) return;\n animations.current.add(animation);\n void animation.finished.then(() => { animations.current.delete(animation); if (element.hasAttribute('data-limr-increment')) element.dataset.limrIncrementDone = ''; compact(); }, () => animations.current.delete(animation));\n };\n if (!mounted.current) { mounted.current = true; if (animateInitial && value && runtime.document.getSnapshot().streaming) animate(host); }\n if (value === previous.current) return;\n let from = previous.current.length;\n if (!value.startsWith(previous.current)) {\n for (const animation of animations.current) animation.cancel();\n animations.current.clear();\n for (const span of host.querySelectorAll<HTMLElement>('[data-limr-increment]')) span.dataset.limrIncrementDone = '';\n // A fence can lose its provisional closing punctuation. Keep the common\n // prefix's actual Text nodes and adjust only the suffix, even at finish.\n from = 0;\n while (from < Math.min(previous.current.length, value.length) && previous.current[from] === value[from]) from++;\n const walker = host.ownerDocument.createTreeWalker(host, NodeFilter.SHOW_TEXT);\n const texts: Text[] = [];\n for (let node = walker.nextNode(); node; node = walker.nextNode()) texts.push(node as Text);\n let at = 0;\n for (const text of texts) {\n const size = text.length;\n if (at >= from) text.remove();\n else if (at + size > from) text.deleteData(from - at, size);\n at += size;\n }\n for (const span of host.querySelectorAll('[data-limr-increment]')) if (!span.textContent) span.remove();\n }\n const addition = value.slice(from);\n if (addition) {\n if (effect === false || !host.animate || matchMedia('(prefers-reduced-motion: reduce)').matches) {\n const tail = host.lastChild;\n if (tail?.nodeType === Node.TEXT_NODE) (tail as Text).appendData(addition);\n else host.append(host.ownerDocument.createTextNode(addition));\n } else {\n const span = host.ownerDocument.createElement('span');\n span.dataset.limrIncrement = '';\n span.className = `limr-stream-increment ${effect.className ?? ''}`;\n span.textContent = addition;\n host.append(span);\n animate(span);\n }\n }\n previous.current = value;\n }, [value, runtime]);\n useEffect(() => {\n const document = element.current?.ownerDocument;\n return () => { document?.removeEventListener('selectionchange', compact); for (const animation of animations.current) animation.cancel(); animations.current.clear(); };\n }, []);\n return <span ref={element} data-limr-stream-text=\"\">{initial.current}</span>;\n}\n","import { useRef, type ReactNode, type RefObject } from 'react';\nimport { useIsomorphicLayoutEffect, useRuntime } from './context';\nimport type { ReaderRuntime } from './runtime';\nimport type { StreamEffect } from './types';\n\nexport const defaultStreamEffect: StreamEffect = {\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\n timing: { duration: 420, easing: 'cubic-bezier(.16,1,.3,1)' },\n};\nexport function streamEffect(runtime: ReaderRuntime): StreamEffect | false {\n const config = runtime.configuration.get();\n if (config.streamEffect !== undefined) return config.streamEffect;\n let effect: StreamEffect | false = defaultStreamEffect;\n for (const extension of config.extensions ?? []) if (extension.streaming?.effect !== undefined) effect = extension.streaming.effect;\n return effect;\n}\nexport function animateStream(element: HTMLElement, effect: StreamEffect | false): Animation | undefined {\n if (effect === false || !element.animate || matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n return element.animate(effect.keyframes ?? defaultStreamEffect.keyframes!, { ...defaultStreamEffect.timing, ...effect.timing });\n}\n/** One entrance per mounted block/state, never per appended token. */\nexport function useStreamEntrance(ref: RefObject<HTMLElement | null>, enabled: boolean, state: unknown = true, contents = false) {\n const runtime = useRuntime();\n useIsomorphicLayoutEffect(() => {\n const host = ref.current;\n const target = contents ? host?.firstElementChild as HTMLElement | null : host;\n if (!enabled || !target) return;\n const effect = streamEffect(runtime);\n const classes = effect && effect.className?.split(/\\s+/).filter(Boolean);\n if (classes) target.classList.add(...classes);\n target.dataset.limrEntrance = '';\n const animation = animateStream(target, effect);\n return () => { animation?.cancel(); if (classes) target.classList.remove(...classes); };\n }, [runtime, enabled, state]);\n}\nexport function StreamEntrance({ children, state }: { children: ReactNode; state: unknown }) {\n const ref = useRef<HTMLDivElement>(null);\n useStreamEntrance(ref, true, state, true);\n return <div ref={ref} className=\"limr-stream-block\">{children}</div>;\n}\n","import { Component, type ReactNode } from 'react';\nimport type { KnuthPlassOptions } from '../core/knuth-plass';\nimport type { ReaderRuntime } from './runtime';\n\nlet implementation: Promise<typeof import('./knuth-plass-layout')> | undefined;\ninterface Props { children: ReactNode; element: () => HTMLElement | null; runtime: ReaderRuntime; enabled: boolean; pending: boolean; options?: KnuthPlassOptions }\n/** No extra DOM. The pre-commit lifecycle restores React-owned text before\n * React changes it. Standard mode loads and observes nothing. */\nexport class KnuthPlassBoundary extends Component<Props> {\n private release?: () => void;\n private version = 0;\n private start() {\n const version = ++this.version;\n if (!this.props.enabled || this.props.pending) return;\n implementation ??= import('./knuth-plass-layout');\n void implementation.then(module => {\n if (version !== this.version) return;\n const root = this.props.element();\n if (root) this.release = module.typeset(root, this.props.runtime, this.props.options);\n });\n }\n componentDidMount() { this.start(); }\n getSnapshotBeforeUpdate() { this.version++; this.release?.(); this.release = undefined; return null; }\n componentDidUpdate() { this.start(); }\n componentWillUnmount() { this.version++; this.release?.(); }\n render() { return this.props.children; }\n}\n","import { useEffect } from 'react';\nimport { selectionFromRange, type SelectionSnapshot, type SourceRange } from '../core';\nimport type { ReaderRuntime } from './runtime';\nimport { atomicSelectionText, leavesIn, measurementRange } from './source-geometry';\n\n/** Attribute captions can occur before an image in source, while being rendered\n * after it. Project these selections in reading order without covering captions\n * the user did not select. Ordinary prose keeps its fast endpoint-only path. */\nfunction visualSelection(runtime: ReaderRuntime, native: Range, options: Parameters<typeof selectionFromRange>[2]): SelectionSnapshot | undefined {\n if (![...runtime.content!.querySelectorAll('[data-limr-selection-order=\"visual\"]')].some(element => native.intersectsNode(element))) return;\n const blocks = [...runtime.blocks.values()].filter(block => native.intersectsNode(block));\n blocks.sort((a, b) => a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1);\n const leaves = blocks.flatMap(block => leavesIn(block, runtime)).filter(leaf => leaf.kind !== 'marker');\n const selected: SourceRange[] = [];\n for (const leaf of leaves) {\n if (!native.intersectsNode(leaf.node)) continue;\n if (leaf.kind !== 'text') { selected.push(leaf.range); continue; }\n const node = leaf.node as Text;\n const start = native.startContainer === node ? native.startOffset : 0;\n const end = native.endContainer === node ? native.endOffset : node.length;\n if (start < end) selected.push({ start: leaf.binding!.resolve!(leaf.offset + start, 'start'), end: leaf.binding!.resolve!(leaf.offset + end, 'end') });\n }\n if (!selected.length) return;\n // Only bridge syntax gaps: a previously visited or unselected rendered leaf\n // in that source gap would otherwise be painted a second time.\n const sourceOrder = leaves.map(leaf => leaf.range).sort((a, b) => a.end - b.end);\n const ranges: SourceRange[] = [];\n for (const range of selected) {\n const previous = ranges.at(-1);\n let lo = 0, hi = sourceOrder.length;\n if (previous) while (lo < hi) { const mid = (lo + hi) >>> 1; if (sourceOrder[mid].end <= previous.end) lo = mid + 1; else hi = mid; }\n if (previous && range.start >= previous.end && (!sourceOrder[lo] || sourceOrder[lo].start >= range.start)) previous.end = range.end;\n else ranges.push({ ...range });\n }\n const snapshot = runtime.document.getSnapshot();\n const selections = ranges.map(range => selectionFromRange(snapshot, range, options));\n const combine = (key: 'raw' | 'syntax' | 'blocks') => {\n const seen = new Set<string>();\n const ranges = selections.flatMap(selection => selection[key].ranges).filter(range => { const key = `${range.start}:${range.end}`; if (seen.has(key)) return false; seen.add(key); return true; });\n return { ranges, sourceText: ranges.map(range => snapshot.source.slice(range.start, range.end)).join('\\n\\n') };\n };\n return { ...selections[0], raw: combine('raw'), syntax: combine('syntax'), blocks: combine('blocks') };\n}\n\nexport function useSelectionTracking(runtime: ReaderRuntime, enabled: boolean) {\n useEffect(() => {\n const container = runtime.content;\n if (!container || !enabled) return;\n let frame = 0, dragging = false;\n let previous: { startNode: Node; start: number; endNode: Node; end: number; revision: number; settled: boolean } | undefined;\n type Endpoint = { offset: number; atomic: boolean; exact: boolean } | null;\n function resolve(node: Node, offset: number, edge: 'start' | 'end'): Endpoint {\n let element = node.nodeType === Node.ELEMENT_NODE ? node as Element : node.parentElement;\n if (!element || element.closest('[data-limr-document]') !== container || element.closest('[data-limr-ignore]')) return null;\n // Plugin atoms can contain mapped children or attributes. The enclosing\n // atomic contract takes precedence over their individual text bindings.\n let atom = element.closest('[data-limr-atomic]');\n for (let outer = atom?.parentElement?.closest('[data-limr-atomic]'); outer && container?.contains(outer); outer = atom.parentElement?.closest('[data-limr-atomic]')) atom = outer;\n const atomicBinding = atom && runtime.bindings.get(atom);\n if (atomicBinding?.atomic) return { offset: edge === 'start' ? atomicBinding.range.start : atomicBinding.range.end, atomic: true, exact: true };\n runtime.prepareTextBindings(element);\n const native = node.nodeType === Node.TEXT_NODE ? runtime.bindings.get(node) : undefined;\n if (native?.resolve) return { offset: native.resolve(offset, edge), atomic: false, exact: native.exact !== false };\n while (element && element !== container) {\n const binding = runtime.bindings.get(element);\n if (binding) {\n if (binding.atomic) return { offset: edge === 'start' ? binding.range.start : binding.range.end, atomic: true, exact: true };\n const range = measurementRange(element.ownerDocument);\n range.setStart(element, 0);\n try { range.setEnd(node, offset); } catch { return null; }\n const localOffset = range.toString().length;\n return { offset: binding.resolve?.(localOffset, edge) ?? (edge === 'start' ? binding.range.start : binding.range.end), atomic: false, exact: binding.exact !== false };\n }\n element = element.parentElement;\n }\n // Native select-all and paragraph-boundary selections can have element\n // endpoints outside a text wrapper. Resolve their first/last visible leaf.\n const children = node.nodeType === Node.ELEMENT_NODE ? Array.from(node.childNodes) : [];\n const candidates = edge === 'start' ? children.slice(offset) : children.slice(0, offset).reverse();\n const descend = (candidate: Node): Endpoint => {\n if (candidate.nodeType === Node.TEXT_NODE && candidate.textContent) return resolve(candidate, edge === 'start' ? 0 : candidate.textContent.length, edge);\n if (candidate instanceof Element) {\n if (candidate.hasAttribute('data-limr-ignore') || candidate.hasAttribute('inert')) return null;\n const binding = runtime.bindings.get(candidate);\n if (binding?.atomic) return { offset: edge === 'start' ? binding.range.start : binding.range.end, atomic: true, exact: true };\n }\n const list = Array.from(candidate.childNodes);\n if (edge === 'end') list.reverse();\n for (const child of list) { const result = descend(child); if (result) return result; }\n return null;\n };\n for (const child of candidates) { const result = descend(child); if (result) return result; }\n return null;\n }\n function process() {\n frame = 0;\n // Selecting/editing text inside a plugin panel must never replace the\n // captured document selection with the form's own native selection.\n if (!dragging && document.activeElement instanceof Element && document.activeElement.closest('[data-limr-selection-ui]')) return;\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || !selection.rangeCount) {\n // A toolbar/dialog owns the captured snapshot while it has focus.\n if (!(document.activeElement instanceof Element) || !document.activeElement.closest('[data-limr-selection-ui]')) {\n previous = undefined; runtime.selectionRange = null; runtime.updateInteraction({ selection: null });\n }\n return;\n }\n const range = selection.getRangeAt(0);\n const revision = runtime.document.getSnapshot().revision;\n if (runtime.interaction.get().selection && previous?.startNode === range.startContainer && previous.start === range.startOffset && previous.endNode === range.endContainer && previous.end === range.endOffset && previous.revision === revision && previous.settled === !dragging) return;\n const start = resolve(range.startContainer, range.startOffset, 'start');\n const end = resolve(range.endContainer, range.endOffset, 'end');\n if (!start || !end) { previous = undefined; runtime.selectionRange = null; runtime.updateInteraction({ selection: null }); return; }\n previous = { startNode: range.startContainer, start: range.startOffset, endNode: range.endContainer, end: range.endOffset, revision, settled: !dragging };\n runtime.selectionRange = range.cloneRange();\n runtime.highlightReference = null;\n const text = selection.toString();\n const options = {\n // An image/diagram can prohibit internal text selection while its\n // complete source block remains selectable and copyable.\n text: text || (start.atomic && end.atomic ? runtime.document.getSnapshot().source.slice(start.offset, end.offset) : ''), settled: !dragging,\n quality: (!start.exact || !end.exact ? 'unmapped' : start.atomic || end.atomic ? 'atomic' : 'exact') as SelectionSnapshot['quality'],\n };\n let captured = visualSelection(runtime, range, options) ?? selectionFromRange(runtime.document.getSnapshot(), { start: start.offset, end: end.offset }, options);\n if (!dragging) {\n const atomicText = atomicSelectionText(runtime, captured.raw.ranges);\n if (atomicText !== undefined) captured = { ...captured, text: atomicText, quality: 'atomic' };\n }\n runtime.updateInteraction({ activeHighlight: null, selection: captured });\n }\n // Coalesce within a frame, never debounce a continuous drag. A resetting\n // timeout can starve updates for the entire gesture on a 60/120 Hz pointer.\n const schedule = () => { if (!frame) frame = requestAnimationFrame(process); };\n const down = () => { dragging = true; };\n const up = () => { dragging = false; schedule(); };\n const atomicCopyText = (event: Event) => {\n const native = window.getSelection(), captured = runtime.interaction.get().selection;\n if (event.defaultPrevented || !native?.anchorNode || native.isCollapsed || !container.contains(native.anchorNode) || captured?.quality !== 'atomic') return null;\n if (event.target instanceof Element && event.target.closest('input,textarea,[contenteditable],[data-limr-selection-ui]')) return null;\n return captured.settled ? captured.text : atomicSelectionText(runtime, captured.raw.ranges) ?? captured.text;\n };\n const copy = (event: ClipboardEvent) => {\n const text = atomicCopyText(event);\n if (!text || !event.clipboardData) return;\n event.clipboardData.setData('text/plain', text); event.preventDefault();\n };\n const copyKey = (event: KeyboardEvent) => {\n if (event.key.toLowerCase() !== 'c' || !(event.ctrlKey || event.metaKey) || event.altKey || !navigator.clipboard?.writeText) return;\n if (window.getSelection()?.toString()) return;\n const text = atomicCopyText(event); if (!text) return;\n // Chromium omits the copy event entirely for user-select:none SVGs.\n // This fallback only handles those otherwise empty atomic selections.\n event.preventDefault(); void navigator.clipboard.writeText(text).catch(() => {});\n };\n document.addEventListener('selectionchange', schedule);\n container.addEventListener('pointerdown', down);\n document.addEventListener('pointerup', up);\n document.addEventListener('pointercancel', up);\n document.addEventListener('keyup', schedule);\n document.addEventListener('copy', copy);\n document.addEventListener('keydown', copyKey);\n if (window.getSelection()?.isCollapsed === false) schedule();\n return () => { cancelAnimationFrame(frame); document.removeEventListener('selectionchange', schedule); container.removeEventListener('pointerdown', down); document.removeEventListener('pointerup', up); document.removeEventListener('pointercancel', up); document.removeEventListener('keyup', schedule); document.removeEventListener('copy', copy); document.removeEventListener('keydown', copyKey); };\n }, [runtime, enabled]);\n}\n","import type { PaintHighlight } from './runtime';\nimport { useEffect, useRef } from 'react';\nimport type { SourceRange } from '../core';\nimport { intersects } from '../core/tree';\nimport { sameRange } from '../core/annotations';\nimport type { ReaderRuntime } from './runtime';\nimport { leavesIn, measurementRange, textRange, type Leaf, type Viewport } from './source-geometry';\n\ninterface PaintRect { left: number; top: number; width: number; height: number; flow: HTMLElement; marker?: string; atomic?: boolean; image?: boolean; radius?: string }\n\n/** Separate paint from content. Every inline fragment uses its line's typography\n * instead of the (different) code, KaTeX or superscript box height. */\nfunction rectangles(leaves: readonly Leaf[], source: SourceRange, viewport: Viewport, measure: (element: HTMLElement) => { ascent: number; descent: number; height: number }): PaintRect[] {\n const raw: (PaintRect & { baseline: number; flow: HTMLElement })[] = [];\n const geometry = (leaf: Leaf, rect: DOMRect, reference?: { rect: DOMRect; element: HTMLElement }) => {\n const flowMetrics = measure(leaf.flow);\n const own = measure(reference?.element ?? (leaf.kind === 'text' ? leaf.node.parentElement! : leaf.flow));\n const baseline = reference ? reference.rect.top + own.ascent : leaf.kind === 'text' ? rect.top + own.ascent : rect.bottom - flowMetrics.descent;\n return { left: rect.left, top: baseline - flowMetrics.ascent, width: rect.width, height: flowMetrics.height, baseline, flow: leaf.flow };\n };\n const neighbor = (index: number, direction: number): Leaf | undefined => {\n for (let at = index + direction; at >= 0 && at < leaves.length; at += direction) {\n const candidate = leaves[at];\n if (candidate.flow !== leaves[index].flow) return;\n if (candidate.kind === 'text') {\n const value = candidate.node.textContent ?? '';\n if (value.trim()) return candidate;\n // Tokenizers often split the space next to an identifier into its own\n // token. Ignore spaces, but never tint a trailing marker across a line.\n if (!value.includes('\\n')) continue;\n }\n if (candidate.kind !== 'marker') return;\n }\n };\n const edgeRect = (leaf: Leaf, edge: 'first' | 'last') => {\n const node = leaf.node as Text;\n const range = measurementRange(node.ownerDocument);\n const offset = edge === 'first' ? 0 : Math.max(0, node.length - 1);\n range.setStart(node, offset); range.setEnd(node, Math.min(node.length, offset + 1));\n return range.getBoundingClientRect();\n };\n const referenceFor = (index: number, rect: DOMRect) => {\n const left = neighbor(index, -1), right = neighbor(index, 1);\n const candidates = [left && { rect: edgeRect(left, 'last'), element: left.node.parentElement! }, right && { rect: edgeRect(right, 'first'), element: right.node.parentElement! }].filter(value => !!value);\n // Wrapping can put the left neighbor on the previous line. Prefer the\n // baseline on this line, including when a formula starts a mobile line.\n candidates.sort((a, b) => Math.abs(a.rect.bottom - rect.bottom) - Math.abs(b.rect.bottom - rect.bottom));\n const nearest = candidates[0];\n return nearest && Math.abs(nearest.rect.bottom - rect.bottom) < Math.max(rect.height, nearest.rect.height) ? nearest : undefined;\n };\n let first = 0, last = leaves.length;\n // Tokenized code is in visual/source order. Skip offscreen token runs without\n // asking the browser for the geometry of every token on every pointer move.\n if (leaves.length > 80 && leaves[0].flow.tagName === 'PRE' && leaves.at(-1)?.flow === leaves[0].flow) {\n const boxAt = (index: number) => {\n const leaf = leaves[index];\n if (leaf.kind !== 'text') return (leaf.node as HTMLElement).getBoundingClientRect();\n const range = measurementRange(leaf.node.ownerDocument!); range.selectNodeContents(leaf.node); return range.getBoundingClientRect();\n };\n let lo = 0, hi = leaves.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (boxAt(mid).bottom < viewport.top) lo = mid + 1; else hi = mid; }\n first = lo; hi = leaves.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (boxAt(mid).top <= viewport.bottom) lo = mid + 1; else hi = mid; }\n last = lo;\n }\n for (let index = first; index < last; index++) {\n const leaf = leaves[index];\n if (leaf.kind === 'marker') {\n const left = neighbor(index, -1), right = neighbor(index, 1);\n // A trailing marker, or a range stopping at the marker, is never tinted.\n if (!left || !right || source.start >= left.range.end || source.end <= right.range.start) continue;\n const rect = (leaf.node as HTMLElement).getBoundingClientRect();\n if (!rect.width || !rect.height || rect.bottom < viewport.top || rect.top > viewport.bottom) continue;\n const item = geometry(leaf, rect, referenceFor(index, rect));\n raw.push({ ...item, marker: (leaf.node as HTMLElement).dataset.limrMarker });\n } else if (intersects(leaf.range, source)) {\n if (leaf.kind === 'text') {\n // KP glue keeps the original source whitespace in a zero-size text run.\n // Its inline box, rather than the glyph range, supplies the stretched\n // advance. Borrow the neighboring glyph's baseline for continuous paint.\n const glue = leaf.node.parentElement?.closest<HTMLElement>('.limr-kp-glue');\n if (glue) {\n const rect = glue.getBoundingClientRect();\n const reference = referenceFor(index, rect);\n if (rect.width && reference && rect.bottom >= viewport.top && rect.top <= viewport.bottom) raw.push(geometry(leaf, rect, reference));\n continue;\n }\n const range = textRange(leaf, source, viewport);\n const shell = leaf.node.parentElement?.closest<HTMLElement>('[data-limr-inline-syntax]');\n const edges = shell ? Array.from(shell.getClientRects()) : [];\n const css = shell && getComputedStyle(shell);\n for (const rect of range?.getClientRects() ?? []) if (rect.width && rect.height && rect.bottom >= viewport.top && rect.top <= viewport.bottom) {\n const item = geometry(leaf, rect), first = edges[0], last = edges.at(-1);\n // Include code padding only at the source edges whose backticks were\n // absorbed. Partial code selections retain their exact character box.\n if (shell && css && first && source.start <= Number(shell.dataset.sourceStart) && Math.abs(first.top - rect.top) < rect.height && Math.abs(rect.left - first.left - parseFloat(css.paddingLeft)) < 1) {\n item.width += item.left - first.left; item.left = first.left;\n }\n if (shell && css && last && source.end >= Number(shell.dataset.sourceEnd) && Math.abs(last.top - rect.top) < rect.height && Math.abs(last.right - parseFloat(css.paddingRight) - rect.right) < 1) item.width = last.right - item.left;\n raw.push(item);\n }\n } else {\n const element = leaf.node as HTMLElement;\n const surface = leaf.kind === 'image' ? element.querySelector<HTMLImageElement>('img') ?? element : leaf.kind === 'block' ? element.querySelector<HTMLElement>('[data-limr-selection-surface]') ?? element : element;\n const rect = surface.getBoundingClientRect();\n if (!rect.width || !rect.height || rect.bottom < viewport.top || rect.top > viewport.bottom) continue;\n if (leaf.kind === 'block' || leaf.kind === 'image') raw.push({ left: rect.left, top: rect.top, width: rect.width, height: rect.height, atomic: true, image: leaf.kind === 'image', baseline: rect.bottom, flow: leaf.kind === 'image' ? element : surface, radius: getComputedStyle(surface).borderRadius });\n else {\n const item = geometry(leaf, rect, referenceFor(index, rect));\n raw.push({ ...item, atomic: true });\n }\n }\n }\n }\n // All pieces of the same text line share exactly the same top and height.\n const lines = new Map<HTMLElement, Map<number, { baseline: number; top: number; height: number }>>();\n const aligned = raw.map(rect => {\n if (rect.image || rect.atomic && rect.height > measure(rect.flow).height * 1.5) return rect;\n let flow = lines.get(rect.flow);\n if (!flow) { flow = new Map(); lines.set(rect.flow, flow); }\n const key = Math.floor(rect.baseline / 3);\n let line = [flow.get(key), flow.get(key - 1), flow.get(key + 1)].find(line => line && Math.abs(line.baseline - rect.baseline) < 3);\n if (!line) { line = rect; flow.set(key, line); }\n return { ...rect, top: line.top, height: line.height };\n });\n const bridges: PaintRect[] = [];\n for (let i = 1; i < aligned.length; i++) {\n const left = aligned[i - 1], right = aligned[i];\n const gap = right.left - left.left - left.width;\n if (left.flow === right.flow && Math.abs(left.top - right.top) < .5 && gap > .1 && gap < left.height * .6) bridges.push({ left: left.left + left.width, top: left.top, width: gap, height: left.height, flow: left.flow });\n }\n const result: PaintRect[] = [], rows = new Map<HTMLElement, Map<number, PaintRect[]>>();\n for (const rect of [...aligned, ...bridges]) {\n if (!rect.flow.hasAttribute('data-limr-kp') || rect.atomic || rect.marker) { result.push(rect); continue; }\n let flow = rows.get(rect.flow);\n if (!flow) { flow = new Map(); rows.set(rect.flow, flow); }\n const row = flow.get(rect.top) ?? [];\n row.push(rect); flow.set(rect.top, row);\n }\n // Typesetting splits a sentence into many words and glue boxes. Paint their\n // union once per line, retaining separate atomic surfaces and annotation hits.\n // This also avoids hundreds of opacity transitions when a paragraph leaves\n // the viewport and its paint layer is removed.\n for (const flow of rows.values()) for (const row of flow.values()) {\n row.sort((a, b) => a.left - b.left);\n let previous: PaintRect | undefined;\n for (const rect of row) {\n if (previous && rect.left <= previous.left + previous.width + .1 && Math.abs(rect.height - previous.height) < .1) previous.width = Math.max(previous.width, rect.left + rect.width - previous.left);\n else { previous = { ...rect }; result.push(previous); }\n }\n }\n return result;\n}\n\nexport function SelectionPaint({ runtime, interactive = true }: { runtime: ReaderRuntime; interactive?: boolean }) {\n const layer = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const container = runtime.content, paint = layer.current;\n if (!container || !paint) return;\n let frame = 0, translating = false;\n let leavesCache = new WeakMap<HTMLElement, Leaf[]>();\n let geometryCache = new WeakMap<HTMLElement, { width: number; height: number; tasks: Map<string, { source: SourceRange; rects: PaintRect[] }> }>();\n type Metric = { ascent: number; descent: number; height: number };\n let metrics = new WeakMap<HTMLElement, Metric>();\n const fontMetrics = new Map<string, Metric>();\n let blocks: { element: HTMLElement; range: SourceRange; id: string }[] | undefined;\n let snapshot = runtime.document.getSnapshot();\n let lastSelection = runtime.interaction.get().selection;\n let lastDecorations = runtime.decorations.get().byBlock;\n let lastHovered = runtime.interaction.get().hoveredHighlight;\n let lastActive = runtime.interaction.get().activeHighlight;\n let lastAnnotation = runtime.interaction.get().active;\n let lastHoveredAnnotation = runtime.interaction.get().hovered;\n const highlightLayers = new Map<HTMLElement, HTMLSpanElement>();\n let hits: { id: string; rect: { left: number; top: number; width: number; height: number } }[] = [];\n const highlightRects = (id: string) => [...highlightLayers.values()].flatMap(layer => Array.from(layer.children).filter(item => (item as HTMLElement).dataset.paint === id).map(item => item.getBoundingClientRect()));\n const focusedRange = () => {\n const state = runtime.interaction.get(), decorations = runtime.decorations.get();\n return decorations.referenceRanges.get(state.hovered ?? '')\n ?? (state.activeHighlight ? decorations.highlights.get(state.activeHighlight)?.range : undefined)\n ?? decorations.referenceRanges.get(state.active ?? '');\n };\n const referenceActive = (occurrenceId: string) => {\n const state = runtime.interaction.get(), decorations = runtime.decorations.get();\n if (occurrenceId === state.hovered) return true;\n if (occurrenceId !== state.active) return false;\n // Two occurrences can quote the same paragraph. Keep it lightly painted\n // once when a pinned reference and another hovered reference coincide.\n const hovered = decorations.highlights.get(`reference-${state.hovered}`);\n return !hovered?.occurrenceId || !sameRange(hovered.range, decorations.referenceRanges.get(occurrenceId)!);\n };\n const feedback = () => {\n const state = runtime.interaction.get();\n const decorations = runtime.decorations.get();\n const focused = focusedRange();\n for (const layer of highlightLayers.values()) for (const item of layer.children as HTMLCollectionOf<HTMLElement>) {\n item.toggleAttribute('data-hovered', item.dataset.paint === state.hoveredHighlight);\n const highlight = decorations.highlights.get(item.dataset.paint ?? '');\n if (highlight?.occurrenceId) {\n const active = referenceActive(highlight.occurrenceId);\n item.toggleAttribute('data-active', active);\n item.toggleAttribute('data-muted', !active);\n continue;\n }\n item.toggleAttribute('data-active', item.dataset.paint === state.activeHighlight || !!focused && !!highlight && sameRange(focused, highlight.range));\n item.toggleAttribute('data-muted', !!highlight?.hidden || !!focused && !!highlight && !sameRange(focused, highlight.range));\n }\n };\n const removeLayer = (host: HTMLElement, layer: HTMLElement) => {\n layer.remove(); delete host.dataset.limrHighlightHost; delete host.dataset.limrHighlightPosition;\n highlightLayers.delete(host);\n };\n const canvas = document.createElement('canvas'), context = canvas.getContext('2d');\n const measure = (element: HTMLElement): Metric => {\n const saved = metrics.get(element); if (saved) return saved;\n const style = getComputedStyle(element), size = parseFloat(style.fontSize), lineHeight = parseFloat(style.lineHeight) || size * 1.5;\n const font = `${style.fontStyle} ${style.fontWeight} ${size}px ${style.fontFamily}`, key = `${font}/${lineHeight}`;\n let metric = fontMetrics.get(key);\n if (!metric) {\n if (context) context.font = font;\n const text = context?.measureText('Mg');\n const ascent = text?.fontBoundingBoxAscent ?? size * .9, descent = text?.fontBoundingBoxDescent ?? size * .25;\n const height = Math.min(ascent + descent, lineHeight - .5);\n metric = { ascent: ascent - Math.max(0, ascent + descent - height) / 2, descent, height };\n fontMetrics.set(key, metric);\n }\n metrics.set(element, metric); return metric;\n };\n const clear = () => {\n if (paint.childNodes.length) paint.replaceChildren();\n for (const [host, layer] of highlightLayers) removeLayer(host, layer);\n hits = [];\n };\n const render = () => {\n cancelAnimationFrame(frame);\n frame = 0;\n const selections = runtime.interaction.get().selection?.raw.ranges ?? [];\n const decorations = runtime.decorations.get().byBlock;\n if (!selections.length && ![...decorations.values()].some(value => value.highlights.length)) { clear(); return; }\n const doc = runtime.document.getSnapshot();\n if (doc !== snapshot) { snapshot = doc; blocks = undefined; }\n if (!blocks) {\n const notes = new Map(doc.blocks.filter(block => block.node.type === 'footnoteDefinition').map(block => [String(block.node.identifier), block]));\n const ordered = [...doc.blocks.filter(block => block.node.type !== 'footnoteDefinition'), ...doc.footnoteOrder.flatMap(id => {\n const block = notes.get(id), node = doc.footnotes.get(id);\n return block ? [block] : node ? [{ id: `${doc.id}-fn-${id}`, range: { start: node.position!.start.offset, end: node.position!.end.offset } }] : [];\n })];\n blocks = ordered.flatMap(block => {\n const element = runtime.blocks.get(block.id);\n return element ? [{ element, range: block.range, id: block.id }] : [];\n });\n }\n const vv = window.visualViewport;\n const viewport: Viewport = { top: vv?.offsetTop ?? 0, bottom: (vv?.offsetTop ?? 0) + (vv?.height ?? window.innerHeight), left: vv?.offsetLeft ?? 0, right: (vv?.offsetLeft ?? 0) + (vv?.width ?? window.innerWidth) };\n const root = runtime.configuration.get().scrollRoot;\n if (root) {\n const box = root.getBoundingClientRect();\n viewport.top = Math.max(viewport.top, box.top + root.clientTop); viewport.bottom = Math.min(viewport.bottom, box.top + root.clientTop + root.clientHeight);\n viewport.left = Math.max(viewport.left, box.left + root.clientLeft); viewport.right = Math.min(viewport.right, box.left + root.clientLeft + root.clientWidth);\n }\n // Top-level reading blocks follow document order. Search the viewport in\n // logarithmic time instead of walking an entire selected document.\n let lo = 0, hi = blocks.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (blocks[mid].element.getBoundingClientRect().bottom < viewport.top - 32) lo = mid + 1; else hi = mid; }\n const origin = container.getBoundingClientRect();\n viewport.top = Math.max(viewport.top, origin.top);\n viewport.bottom = Math.min(viewport.bottom, origin.bottom);\n const scrollLeft = container.scrollLeft, scrollTop = container.scrollTop;\n const output: { rect: PaintRect; task: { id: string; color?: string; style?: PaintHighlight['style']; occurrenceId?: string; selection?: boolean } }[] = [];\n const clips = new Map<HTMLElement, { left: number; right: number; top: number; bottom: number }>();\n const clipFor = (flow: HTMLElement) => {\n const saved = clips.get(flow); if (saved) return saved;\n const clip = { ...viewport };\n for (let element: HTMLElement | null = flow; element && element !== container; element = element.parentElement) {\n const css = getComputedStyle(element), box = element.getBoundingClientRect();\n if (/hidden|clip|auto|scroll/.test(css.overflowX)) { clip.left = Math.max(clip.left, box.left + element.clientLeft); clip.right = Math.min(clip.right, box.left + element.clientLeft + element.clientWidth); }\n if (/hidden|clip|auto|scroll/.test(css.overflowY)) { clip.top = Math.max(clip.top, box.top + element.clientTop); clip.bottom = Math.min(clip.bottom, box.top + element.clientTop + element.clientHeight); }\n }\n clips.set(flow, clip); return clip;\n };\n for (let index = lo; index < blocks.length; index++) {\n const block = blocks[index];\n const blockBox = block.element.getBoundingClientRect();\n if (blockBox.top > viewport.bottom + 32) break;\n const tasks: { id: string; range: SourceRange; color?: string; style?: PaintHighlight['style']; occurrenceId?: string; selection?: boolean }[] = [...decorations.get(block.id)?.highlights ?? []];\n for (const range of selections) if (intersects(range, block.range)) tasks.push({ id: 'selection', range, selection: true });\n if (!tasks.length) continue;\n let leaves = leavesCache.get(block.element);\n // Cache paragraph geometry in block-local coordinates. Scrolling moves\n // the block, not its shaped text. Keep exceptionally tall blocks on the\n // viewport-bounded path so selecting a book never measures it in full.\n let cached = geometryCache.get(block.element);\n if (cached?.width !== blockBox.width || cached.height !== blockBox.height) cached = undefined;\n if (!cached && blockBox.height < (viewport.bottom - viewport.top) * 3) {\n cached = { width: blockBox.width, height: blockBox.height, tasks: new Map() }; geometryCache.set(block.element, cached);\n }\n for (const task of tasks) {\n const saved = cached?.tasks.get(task.id);\n // A dormant reference has no visible ink. Materialize its geometry on\n // hover/activation; retain a previously painted one for its fade-out.\n // Long papers otherwise measure every invisible citation on scroll.\n if (task.occurrenceId && !referenceActive(task.occurrenceId) && !saved) continue;\n if (!leaves) { leaves = leavesIn(block.element, runtime); leavesCache.set(block.element, leaves); }\n let local = saved && sameRange(saved.source, task.range) ? saved.rects : undefined;\n if (!local && cached) {\n local = rectangles(leaves, task.range, { ...viewport, top: -Infinity, bottom: Infinity }, measure).map(rect => ({ ...rect, left: rect.left - blockBox.left, top: rect.top - blockBox.top }));\n cached.tasks.set(task.id, { source: task.range, rects: local });\n }\n const rects = local ? local.map(rect => ({ ...rect, left: rect.left + blockBox.left, top: rect.top + blockBox.top })) : rectangles(leaves, task.range, { ...viewport, top: viewport.top - 32, bottom: viewport.bottom + 32 }, measure);\n for (const rect of rects) {\n const clip = clipFor(rect.flow);\n const left = Math.max(rect.left, clip.left), top = Math.max(rect.top, clip.top);\n const width = Math.min(rect.left + rect.width, clip.right) - left, height = Math.min(rect.top + rect.height, clip.bottom) - top;\n if (width <= 0 || height <= 0) continue;\n output.push({ rect: { ...rect, left: left - origin.left + scrollLeft, top: top - viewport.top, width, height }, task });\n }\n }\n }\n // All reads precede writes. Reuse the small visible pool instead of\n // replacing thousands of spans and forcing layout between measurements.\n // The layer itself is viewport-sized too: a book-sized stacking layer can\n // otherwise cause expensive browser layout, hit testing and pre-paint.\n // Each text flow is its own stacking context: its paper/background is\n // below the ink, and highlight paint sits between the two. Selection\n // retains its independent foreground layer, including atomic media.\n const hostGeometry = new Map<HTMLElement, { box: DOMRect; top: number; positioned: boolean; x: number; y: number }>();\n for (const { rect, task } of output) if (!task.selection && !hostGeometry.has(rect.flow)) {\n const host = rect.flow, box = host.getBoundingClientRect();\n const x = host.scrollLeft - host.clientLeft, y = host.scrollTop - host.clientTop;\n hostGeometry.set(host, { box, x, y, top: Math.max(viewport.top, box.top) - box.top + y, positioned: getComputedStyle(host).position !== 'static' });\n }\n paint.style.top = `${viewport.top - origin.top + scrollTop}px`;\n paint.style.height = `${Math.max(0, viewport.bottom - viewport.top)}px`;\n const counts = new Map<HTMLElement, number>();\n const nextHits: typeof hits = [];\n output.forEach(({ rect, task }) => {\n let target: HTMLElement = paint, left = rect.left, top = rect.top;\n if (!task.selection) {\n const host = rect.flow, geometry = hostGeometry.get(host)!;\n let layer = highlightLayers.get(host);\n if (!layer) {\n layer = document.createElement('span'); layer.className = 'limr-highlight-layer'; layer.dataset.limrIgnore = 'true'; layer.setAttribute('aria-hidden', 'true');\n host.dataset.limrHighlightHost = 'true';\n if (!geometry.positioned) host.dataset.limrHighlightPosition = 'true';\n host.append(layer); highlightLayers.set(host, layer);\n }\n layer.style.top = `${geometry.top}px`;\n // A layer inside a scrollable formula must not enlarge its scroll area.\n layer.style.height = `${Math.max(0, Math.min(viewport.bottom, geometry.box.bottom) - Math.max(viewport.top, geometry.box.top))}px`;\n target = layer;\n left += origin.left - geometry.box.left + geometry.x;\n top += viewport.top - geometry.box.top + geometry.y - geometry.top;\n nextHits.push({ id: task.id, rect: { left: rect.left + origin.left - scrollLeft, top: rect.top + viewport.top, width: rect.width, height: rect.height } });\n }\n const index = counts.get(target) ?? 0; counts.set(target, index + 1);\n const item = target.children[index] as HTMLElement | undefined ?? document.createElement('span');\n const className = `limr-paint-rect limr-paint-${task.selection ? 'selection' : task.style ?? 'background'}`;\n if (item.className !== className) item.className = className;\n item.dataset.paint = task.id;\n item.toggleAttribute('data-reference', !!task.occurrenceId);\n if (rect.marker) item.dataset.marker = rect.marker; else delete item.dataset.marker;\n if (rect.atomic) item.dataset.atomic = 'true'; else delete item.dataset.atomic;\n if (rect.image) item.dataset.media = 'image'; else delete item.dataset.media;\n // Assign user colors as a single property, never interpolate CSS text.\n const css = `left:${left}px;top:${top}px;width:${rect.width}px;height:${rect.height}px;border-radius:${rect.radius ?? '0'};`;\n if (item.dataset.geometry !== css) { item.style.cssText = css; item.dataset.geometry = css; }\n if (!task.selection) item.style.setProperty('--limr-highlight', task.color ?? '#F2C744');\n if (task.occurrenceId) {\n const active = referenceActive(task.occurrenceId);\n item.toggleAttribute('data-active', active);\n item.toggleAttribute('data-muted', !active);\n }\n if (!item.parentNode) target.append(item);\n });\n for (const [host, layer] of highlightLayers) if (!counts.has(layer)) removeLayer(host, layer);\n for (const layer of [paint, ...highlightLayers.values()]) {\n const count = counts.get(layer) ?? 0;\n if (layer.children.length > count) layer.replaceChildren(...Array.from(layer.children).slice(0, count));\n }\n hits = nextHits;\n const active = runtime.interaction.get().activeHighlight;\n if (active && !hits.some(hit => hit.id === active)) runtime.clearSelection();\n feedback();\n // Sidebar alignment translates the prose without scroll/resize events.\n // Repaint newly visible text throughout that transition, including when\n // it reverses, rather than retaining only the starting viewport's paint.\n if (translating) {\n translating = container.getAnimations().some(animation => animation instanceof CSSTransition && animation.transitionProperty === 'translate' && animation.playState === 'running');\n if (translating) schedule();\n }\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(render); };\n const translate = (event: TransitionEvent) => {\n if (event.target !== container || event.propertyName !== 'translate') return;\n translating = true;\n schedule();\n };\n container.addEventListener('transitionrun', translate);\n container.addEventListener('transitionend', translate);\n container.addEventListener('transitioncancel', translate);\n const invalidate = () => { blocks = undefined; metrics = new WeakMap(); schedule(); };\n const fontsChanged = () => { fontMetrics.clear(); geometryCache = new WeakMap(); invalidate(); };\n const unsubscribers = [runtime.interaction.subscribe(() => {\n const state = runtime.interaction.get(), selection = state.selection;\n const referenceChanged = state.active !== lastAnnotation || state.hovered !== lastHoveredAnnotation;\n if (state.hoveredHighlight !== lastHovered || state.activeHighlight !== lastActive || state.active !== lastAnnotation || state.hovered !== lastHoveredAnnotation) {\n lastHovered = state.hoveredHighlight; lastActive = state.activeHighlight; lastAnnotation = state.active; lastHoveredAnnotation = state.hovered; feedback();\n }\n if (referenceChanged) schedule();\n if (selection === lastSelection) return;\n lastSelection = selection;\n // Selection tracking already runs in rAF: paint in that same frame.\n render();\n }), runtime.decorations.subscribe(() => {\n const decorations = runtime.decorations.get().byBlock;\n if (decorations === lastDecorations) return;\n lastDecorations = decorations; leavesCache = new WeakMap(); geometryCache = new WeakMap(); schedule();\n }), runtime.layout.subscribe(invalidate), runtime.documentOffset.subscribe(schedule), runtime.configuration.subscribe(() => { geometryCache = new WeakMap(); invalidate(); })];\n const observer = new MutationObserver(records => {\n let changed = false;\n for (const record of records) {\n const target = record.target instanceof Element ? record.target : record.target.parentElement;\n if (!target || target === paint || paint.contains(target) || target.closest('.limr-highlight-layer')) continue;\n if (record.type === 'childList' && [...record.addedNodes, ...record.removedNodes].every(node => node instanceof Element && node.classList.contains('limr-highlight-layer'))) continue;\n const block = target.closest<HTMLElement>('[data-limr-block]');\n if (block) { leavesCache.delete(block); geometryCache.delete(block); } else { blocks = undefined; geometryCache = new WeakMap(); }\n changed = true;\n }\n if (changed) { metrics = new WeakMap(); schedule(); }\n });\n observer.observe(container, { subtree: true, childList: true, characterData: true, attributes: true, attributeFilter: ['class', 'style', 'inert', 'open', 'data-limr-theme', 'data-limr-justify'] });\n const scroll = (event: Event) => {\n const target = event.target;\n if (target instanceof Element) {\n const block = target.closest<HTMLElement>('[data-limr-block]');\n if (block) geometryCache.delete(block);\n }\n runtime.hoverHighlight(null); schedule();\n };\n document.addEventListener('scroll', scroll, { capture: true, passive: true });\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', schedule);\n document.fonts?.addEventListener('loadingdone', fontsChanged);\n const hitAt = (event: MouseEvent) => {\n const element = event.target instanceof Element ? event.target : null;\n if (!element || element.closest('[data-limr-document]') !== container || element.closest('button,input,textarea,select,[contenteditable],[data-limr-ignore]')) return null;\n const focused = focusedRange(), decorations = runtime.decorations.get();\n for (let index = hits.length - 1; index >= 0; index--) {\n const { rect, id } = hits[index];\n const highlight = decorations.highlights.get(id);\n if (highlight?.occurrenceId || highlight?.hidden || focused && highlight && !sameRange(focused, highlight.range)) continue;\n if (event.clientX >= rect.left && event.clientX <= rect.left + rect.width && event.clientY >= rect.top && event.clientY <= rect.top + rect.height) return id;\n }\n return null;\n };\n const move = (event: PointerEvent) => { if (!event.buttons) runtime.hoverHighlight(hitAt(event)); };\n const leave = () => runtime.hoverHighlight(null);\n let down: { x: number; y: number } | null = null;\n const pointerDown = (event: PointerEvent) => { down = { x: event.clientX, y: event.clientY }; };\n const click = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || !down || Math.hypot(event.clientX - down.x, event.clientY - down.y) > 4 || window.getSelection()?.isCollapsed === false) return;\n const id = hitAt(event); if (!id) return;\n event.preventDefault();\n const highlight = runtime.decorations.get().highlights.get(id)!;\n const text: string[] = [];\n let atomic = false;\n // Capture rendered text from the same bindings used by selection. AST\n // fallback alone misses decoded attributes and literal code boundaries.\n for (const block of runtime.document.getSnapshot().blocks) {\n if (!intersects(block.range, highlight.range)) continue;\n const element = runtime.blocks.get(block.id); if (!element) continue;\n const parts: string[] = [];\n for (const leaf of leavesIn(element, runtime)) {\n if (!intersects(leaf.range, highlight.range) || leaf.kind === 'marker') continue;\n if (leaf.kind !== 'text') { atomic = true; continue; }\n const range = textRange(leaf, highlight.range, { top: -Infinity, bottom: Infinity, left: -Infinity, right: Infinity });\n if (range) parts.push(range.toString());\n }\n if (parts.length) text.push(parts.join(''));\n }\n runtime.highlightReference = {\n text: !atomic && text.length ? text.join('\\n\\n') : undefined,\n getClientRects: () => highlightRects(id),\n getBoundingClientRect: () => {\n const rects = highlightRects(id); if (!rects.length) return new DOMRect();\n const left = Math.min(...rects.map(rect => rect.left)), top = Math.min(...rects.map(rect => rect.top));\n return new DOMRect(left, top, Math.max(...rects.map(rect => rect.right)) - left, Math.max(...rects.map(rect => rect.bottom)) - top);\n },\n };\n runtime.activateHighlight(id);\n };\n if (interactive) {\n container.addEventListener('pointermove', move); container.addEventListener('pointerleave', leave);\n container.addEventListener('pointerdown', pointerDown); container.addEventListener('click', click);\n }\n container.dataset.limrPainted = 'true'; schedule();\n return () => { cancelAnimationFrame(frame); observer.disconnect(); unsubscribers.forEach(unsubscribe => unsubscribe()); document.removeEventListener('scroll', scroll, true); window.visualViewport?.removeEventListener('resize', schedule); window.visualViewport?.removeEventListener('scroll', schedule); document.fonts?.removeEventListener('loadingdone', fontsChanged); container.removeEventListener('transitionrun', translate); container.removeEventListener('transitionend', translate); container.removeEventListener('transitioncancel', translate); container.removeEventListener('pointermove', move); container.removeEventListener('pointerleave', leave); container.removeEventListener('pointerdown', pointerDown); container.removeEventListener('click', click); delete container.dataset.limrPainted; clear(); };\n }, [runtime, interactive]);\n return <div ref={layer} className=\"limr-paint-layer\" data-limr-ignore=\"true\" aria-hidden=\"true\" />;\n}\n","import { useRef, type PointerEvent, type ReactNode } from 'react';\nimport { useIsomorphicLayoutEffect } from '../react/context';\n\n/** Keep native wheel/touch/keyboard scrolling, with a thumb outside text flow. */\nexport function OverlayScrollArea({ children, active, resetKey, label }: { children: ReactNode; active: boolean; resetKey?: string; label: string }) {\n const area = useRef<HTMLDivElement>(null);\n const content = useRef<HTMLDivElement>(null);\n const thumb = useRef<HTMLDivElement>(null);\n const track = useRef<HTMLDivElement>(null);\n const drag = useRef<{ pointerId: number; y: number; scroll: number; scale: number } | null>(null);\n const show = useRef<() => void>(() => {});\n\n useIsomorphicLayoutEffect(() => {\n const element = area.current!, wrapper = element.parentElement!;\n delete wrapper.dataset.scrolling;\n if (!active) return;\n element.scrollTop = 0;\n let frame = 0, timeout: ReturnType<typeof setTimeout> | undefined, previous = 0;\n const update = () => {\n frame = 0;\n const height = track.current!.clientHeight;\n const overflow = element.scrollHeight - element.clientHeight;\n const size = Math.min(height, Math.max(20, height * element.clientHeight / Math.max(1, element.scrollHeight)));\n wrapper.toggleAttribute('data-overflow', overflow > 1);\n thumb.current!.style.height = `${size}px`;\n thumb.current!.style.transform = `translateY(${overflow > 0 ? Math.max(0, Math.min(1, element.scrollTop / overflow)) * (height - size) : 0}px)`;\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(update); };\n show.current = () => {\n clearTimeout(timeout);\n if (wrapper.closest('[data-motion]')) return;\n wrapper.dataset.scrolling = 'true';\n timeout = setTimeout(() => { if (!drag.current) delete wrapper.dataset.scrolling; }, 800);\n };\n const scroll = () => {\n schedule();\n if (element.scrollTop === previous) return;\n previous = element.scrollTop;\n show.current();\n };\n const observer = new ResizeObserver(schedule);\n observer.observe(element); observer.observe(content.current!);\n element.addEventListener('scroll', scroll, { passive: true });\n update();\n return () => {\n observer.disconnect(); element.removeEventListener('scroll', scroll);\n cancelAnimationFrame(frame); clearTimeout(timeout); drag.current = null;\n show.current = () => {}; delete wrapper.dataset.scrolling;\n };\n }, [active, resetKey]);\n\n const startDrag = (event: PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n const element = area.current!, bar = thumb.current!;\n const travel = track.current!.clientHeight - bar.offsetHeight;\n if (travel <= 0) return;\n event.preventDefault(); event.currentTarget.setPointerCapture(event.pointerId);\n const scale = (element.scrollHeight - element.clientHeight) / travel;\n if (event.target !== bar) element.scrollTop = (event.clientY - track.current!.getBoundingClientRect().top - bar.offsetHeight / 2) * scale;\n drag.current = { pointerId: event.pointerId, y: event.clientY, scroll: element.scrollTop, scale };\n show.current();\n };\n const move = (event: PointerEvent<HTMLDivElement>) => {\n const current = drag.current;\n if (current?.pointerId === event.pointerId) area.current!.scrollTop = current.scroll + (event.clientY - current.y) * current.scale;\n };\n const end = (event: PointerEvent<HTMLDivElement>) => {\n if (drag.current?.pointerId !== event.pointerId) return;\n drag.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n show.current();\n };\n return <div className=\"limr-overlay-scroll\">\n <div ref={area} className=\"limr-overlay-content\" data-limr-card-body=\"\" tabIndex={0} role=\"region\" aria-label={label}><div ref={content} className=\"limr-overlay-scroll-inner\">{children}</div></div>\n <div ref={track} className=\"limr-overlay-scrollbar\" aria-hidden=\"true\" onPointerDown={startDrag} onPointerMove={move} onPointerUp={end} onPointerCancel={end} onLostPointerCapture={end}>\n <div ref={thumb} className=\"limr-overlay-scroll-thumb\" />\n </div>\n </div>;\n}\n","import type { ReactNode } from 'react';\nimport { useLocale } from '../react/context';\nimport type { AnnotationOverlayCardProps } from '../react/types';\nimport { OverlayScrollArea } from './OverlayScrollArea';\n\nexport interface AnnotationCardProps extends AnnotationOverlayCardProps {\n title: ReactNode;\n /** Accessible name for the scrollable body when the title is rich content. */\n bodyLabel?: string;\n}\n\n/** Optional card layout for modules. The overlay itself renders no header or controls. */\nexport function AnnotationCard({ title, bodyLabel, occurrence, expanded, pinned, canExpand, expand, collapse, close, children }: AnnotationCardProps) {\n const locale = useLocale();\n return <>\n <div className=\"limr-overlay-header\"><span>{title}</span><div className=\"limr-overlay-controls\">\n {expanded ? <button type=\"button\" onClick={collapse}><span className=\"limr-underline\">{locale.collapse}</span></button> : canExpand && <button type=\"button\" onClick={expand}><span className=\"limr-underline\">{locale.expand}</span></button>}\n {pinned && <button type=\"button\" className=\"limr-overlay-close\" onClick={close} aria-label={locale.close}>×</button>}\n </div></div>\n <OverlayScrollArea active resetKey={occurrence.id} label={bodyLabel ?? (typeof title === 'string' ? title : locale.annotations)}>{children}</OverlayScrollArea>\n </>;\n}\n","import { useRef, useState } from 'react';\nimport type { MarkdownNode } from '../core';\nimport { InlineMarker } from '../components/InlineMarker';\nimport { Collapse } from '../components/Collapse';\nimport { useIsomorphicLayoutEffect, useRendererParameter } from '../react/context';\nimport type { NodeRendererProps, RendererExtension } from '../react/types';\n\nexport type TranslationMode = 'origin' | 'translation' | 'both';\nexport interface TranslationsOptions { defaultMode?: TranslationMode }\n\ndeclare module '@linloir/limr' {\n interface RendererParameters {\n /** Overrides every translations block. Undefined restores each block's local mode. */\n translationMode?: TranslationMode;\n /** With a global mode, markers request an update through this callback. */\n onTranslationModeChange?: (mode: TranslationMode) => void;\n }\n}\n\nconst modes: readonly TranslationMode[] = ['origin', 'translation', 'both'];\nconst names = { origin: '原文', translation: '译文', both: '对照' };\n/** Original page, translated page, and parallel pages. All share a rounded pen. */\nfunction TranslationIcon({ mode }: { mode: TranslationMode }) {\n return <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {mode === 'both' ? <><rect x=\"2.5\" y=\"4\" width=\"8\" height=\"16\" rx=\"2.5\" /><rect x=\"13.5\" y=\"4\" width=\"8\" height=\"16\" rx=\"2.5\" /><path d=\"M5 9h3M5 12h3M16 9h3M16 12h3\" /></> : <><rect x=\"4.5\" y=\"3\" width=\"15\" height=\"18\" rx=\"3\" />{mode === 'origin' ? <path d=\"M8.5 8h7M8.5 12h7M8.5 16h4\" /> : <path d=\"M8 8.5h8M12 6.5v2M14.5 8.5c-.5 4-3 6.5-6.5 8M9.5 11c1.2 2.5 3.2 4.2 6.5 5.5\" />}</>}\n </svg>;\n}\nfunction modeOf(value: unknown, fallback: TranslationMode): TranslationMode {\n return modes.includes(value as TranslationMode) ? value as TranslationMode : fallback;\n}\nfunction section(node: MarkdownNode, name: string): MarkdownNode | undefined {\n // A JSX text element can be wrapped by a Markdown paragraph.\n for (const child of node.children ?? []) {\n if (child.name === name) return child;\n if (child.type === 'paragraph') { const found = section(child, name); if (found) return found; }\n }\n}\n\nexport function translations(options: TranslationsOptions = {}): RendererExtension {\n function Translations({ node, children, renderChildren }: NodeRendererProps) {\n const origin = section(node, 'origin'), translation = section(node, 'translation');\n const [localMode, setLocalMode] = useState<TranslationMode | undefined>();\n const globalMode = useRendererParameter('translationMode');\n const onGlobalChange = useRendererParameter('onTranslationModeChange');\n const requested = modeOf(globalMode ?? localMode ?? node.attributes?.default, options.defaultMode ?? 'origin');\n // Incomplete streaming pairs still show their available content.\n const mode = !origin ? 'translation' : !translation ? 'origin' : requested;\n const next = modes[(modes.indexOf(mode) + 1) % modes.length];\n const marker = useRef<HTMLButtonElement>(null);\n const restoreFocus = useRef(false);\n const locked = globalMode !== undefined && !onGlobalChange;\n useIsomorphicLayoutEffect(() => {\n if (restoreFocus.current) { marker.current?.focus({ preventScroll: true }); restoreFocus.current = false; }\n }, [mode]);\n if (!origin && !translation) return <>{children}</>;\n const toggle = origin && translation ? <InlineMarker ref={marker} data-translation-switch=\"\" data-mode={mode}\n color=\"var(--limr-translation-accent, #6b8fb5)\" disabled={locked}\n label={locked ? `当前${names[mode]},由全局展示模式控制` : `当前${names[mode]},切换到${names[next]}`}\n onClick={() => {\n restoreFocus.current = document.activeElement === marker.current;\n if (globalMode !== undefined) onGlobalChange?.(next);\n else setLocalMode(next);\n }}><TranslationIcon mode={mode} /></InlineMarker> : undefined;\n return <div className=\"limr-translations\" data-mode={mode}>\n {translation && <Collapse open={mode !== 'origin'} keepMounted className=\"limr-translation-panel\" ><div className=\"limr-translation-text\" data-language=\"translation\">\n {renderChildren(translation.children ?? [], { trailing: mode === 'translation' ? toggle : undefined })}\n </div></Collapse>}\n {origin && <Collapse open={mode !== 'translation'} keepMounted className=\"limr-translation-panel\"><div className=\"limr-translation-text\" data-language=\"origin\">\n {renderChildren(origin.children ?? [], { trailing: mode !== 'translation' ? toggle : undefined })}\n </div></Collapse>}\n </div>;\n }\n return {\n name: 'translations', tags: ['translations', 'origin', 'translation'], directives: ['translations', 'origin', 'translation'], display: 'block', scope: 'local',\n parameters: { translationMode: undefined, onTranslationModeChange: undefined },\n components: { translations: Translations, origin: ({ children }) => <>{children}</>, translation: ({ children }) => <>{children}</> },\n };\n}\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties } from 'react';\n\nexport interface InlineMarkerProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color'> {\n label: string;\n color?: string;\n}\n\n/** An action-only marker. It does not create an annotation, sidebar card or overlay. */\nexport const InlineMarker = forwardRef<HTMLButtonElement, InlineMarkerProps>(function InlineMarker({ label, color, children, className = '', style, ...props }, ref) {\n return <span className=\"limr-mark-wrap\" data-limr-ignore=\"true\"><button {...props} ref={ref} type=\"button\" aria-label={label} title={props.title ?? label}\n className={`limr-mark limr-action-mark ${className}`} style={{ '--limr-mark-color': color, ...style } as CSSProperties}><span className=\"limr-mark-icon\">{children}</span></button></span>;\n});\n","import { useRef, useState, type ReactNode } from 'react';\nimport { useIsomorphicLayoutEffect } from '../react/context';\n\n/** Keep content mounted through exit, then release loaders and hidden controls. */\nexport function Collapse({ open, children, className = '', keepMounted = false }: { open: boolean; children: ReactNode; className?: string; keepMounted?: boolean }) {\n const [mounted, setMounted] = useState(open);\n const [visible, setVisible] = useState(open);\n const panel = useRef<HTMLDivElement>(null);\n useIsomorphicLayoutEffect(() => {\n // Always-mounted panels can reverse their CSS transition in this render,\n // without a delayed frame or an unmount timer fighting the latest intent.\n if (keepMounted) return;\n if (open) {\n if (!mounted) { setMounted(true); return; }\n // Establish the newly mounted content's collapsed geometry before opening.\n // An interrupted exit can reverse immediately from its current frame.\n panel.current?.getBoundingClientRect();\n setVisible(true);\n return;\n }\n setVisible(false);\n const timer = setTimeout(() => setMounted(false), 420);\n return () => clearTimeout(timer);\n }, [open, keepMounted, mounted]);\n return <div ref={element => { panel.current = element; element?.toggleAttribute('inert', !open); }} className={`limr-collapse ${className}`} data-open={(keepMounted ? open : visible) || undefined} aria-hidden={!open}>\n <div className=\"limr-collapse-inner\">{mounted || keepMounted ? children : null}</div>\n </div>;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { ResourceCache } from '../core/cache';\nimport { walk } from '../core/tree';\nimport { CopyButton } from '../components/CopyButton';\nimport { LoadingRing } from '../components/LoadingRing';\nimport { ToolIcon } from '../components/ToolIcon';\nimport { useLocale, useRuntime, useTheme } from '../react/context';\nimport { useStreamEntrance } from '../react/stream-effect';\nimport type { NodeRendererProps, RendererExtension } from '../react/types';\nimport { literalDirective } from './literal-directive';\n\nlet nextId = 0;\nlet queue = Promise.resolve();\nconst cache = new ResourceCache<string>(32);\n// Mermaid owns global configuration; serialize initialize + render together so\n// neighboring readers with different themes cannot change one another's output.\nasync function diagram(id: string, code: string, dark: boolean, font: string, signal: AbortSignal) {\n let result = '';\n const work = queue.then(async () => {\n if (signal.aborted) throw signal.reason;\n const { default: mermaid } = await import('mermaid');\n await document.fonts.ready;\n if (signal.aborted) throw signal.reason;\n mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', suppressErrorRendering: true, fontFamily: font,\n theme: 'base', themeVariables: dark\n ? { background: '#242321', primaryColor: '#383531', primaryTextColor: '#e2ded7', primaryBorderColor: '#7b746a', lineColor: '#a29a8e', secondaryColor: '#302e2a', tertiaryColor: '#302e2a' }\n : { background: '#f9f8f6', primaryColor: '#eeebe6', primaryTextColor: '#49443e', primaryBorderColor: '#b5aca0', lineColor: '#91877a', secondaryColor: '#f5f3ef', tertiaryColor: '#f5f3ef' },\n });\n const host = document.createElement('div');\n host.style.cssText = 'position:fixed;left:-100000px;top:0;visibility:hidden;pointer-events:none';\n host.style.fontFamily = font;\n document.body.append(host);\n try { result = (await mermaid.render(id, code, host)).svg; }\n finally { host.remove(); }\n });\n queue = work.catch(() => {});\n await work;\n return result;\n}\n\nfunction MermaidNode({ node, incomplete }: NodeRendererProps) {\n const locale = useLocale(), theme = useTheme(), runtime = useRuntime();\n const zh = locale.language?.startsWith('zh');\n const [id] = useState(() => `limr-mermaid-${++nextId}`);\n const [systemDark, setSystemDark] = useState(false);\n const [result, setResult] = useState<{ key: string; svg?: string; error?: boolean }>();\n const [sourceView, setSourceView] = useState(false), [scale, setScale] = useState(1), [attempt, setAttempt] = useState(0);\n const ref = useRef<HTMLDivElement>(null), content = useRef<HTMLDivElement>(null);\n const drag = useRef<{ id: number; x: number; y: number; left: number; top: number; moved: boolean } | null>(null);\n const suppressClick = useRef(false);\n const code = node.value ?? '';\n const dark = theme === 'dark' || theme === 'auto' && systemDark;\n const key = JSON.stringify([id, code, dark, attempt]);\n const current = result?.key === key ? result : undefined;\n useEffect(() => {\n if (theme !== 'auto') return;\n const media = matchMedia('(prefers-color-scheme: dark)');\n const update = () => setSystemDark(media.matches);\n update(); media.addEventListener('change', update);\n return () => media.removeEventListener('change', update);\n }, [theme]);\n useEffect(() => {\n if (incomplete) return;\n let disposed = false;\n const font = ref.current ? getComputedStyle(ref.current).fontFamily : 'sans-serif';\n const request = cache.acquire(`${key}:${font}`, signal => diagram(id, code, dark, font, signal));\n request.promise.then(svg => { if (!disposed) setResult({ key, svg }); }, () => { if (!disposed) setResult({ key, error: true }); });\n return () => { disposed = true; request.release(); };\n }, [key, incomplete]);\n useStreamEntrance(content, !!current?.svg, current?.svg);\n const loading = incomplete || !current;\n const source = sourceView || current?.error;\n useEffect(() => {\n const viewport = content.current;\n if (!viewport || source) return;\n // React's delegated wheel listener is passive. Only take over Shift+wheel;\n // native two-axis trackpads, touch scrolling and browser zoom keep working.\n const wheel = (event: WheelEvent) => {\n if (!event.shiftKey || event.ctrlKey || event.metaKey || !event.deltaY || viewport.scrollWidth <= viewport.clientWidth) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? viewport.clientWidth : 1;\n viewport.scrollLeft += (event.deltaX || event.deltaY) * unit;\n event.preventDefault();\n };\n viewport.addEventListener('wheel', wheel, { passive: false });\n return () => viewport.removeEventListener('wheel', wheel);\n }, [loading, source]);\n const select = () => {\n const canvas = content.current?.firstElementChild;\n if (!canvas) return;\n const range = document.createRange(); range.selectNodeContents(canvas);\n const selection = canvas.ownerDocument.getSelection();\n selection?.removeAllRanges(); selection?.addRange(range);\n };\n const label = sourceView ? zh ? '显示图像' : 'Show diagram' : zh ? '显示源代码' : 'Show source';\n return <div className=\"limr-math-block limr-mermaid-block\" ref={ref} data-mermaid-state={loading ? 'loading' : current?.error ? 'error' : 'ready'}>\n <div className=\"limr-math-display limr-mermaid-display\">\n {loading && <div className=\"limr-mermaid-loading\"><LoadingRing /></div>}\n {!loading && <>\n {current?.error && <div className=\"limr-mermaid-error\" data-limr-ignore=\"true\" role=\"status\">{zh ? '图表暂时无法绘制' : 'Unable to render diagram'} <button type=\"button\" onClick={() => setAttempt(value => value + 1)}>{locale.retry}</button></div>}\n <pre className=\"limr-mermaid-source\" hidden={!source}><code>{code}</code></pre>\n <div className=\"limr-mermaid-viewport\" hidden={!!source} ref={content} tabIndex={0} role=\"region\"\n aria-label={zh ? '图表视口' : 'Diagram viewport'}\n aria-description={zh ? '拖动平移;方向键或滚轮移动,Shift 加滚轮横向移动;单击或按 Enter 整块选择。' : 'Drag to pan; use arrow keys or the wheel to scroll, Shift+wheel to scroll horizontally; click or press Enter to select the block.'}\n onDragStart={event => event.preventDefault()}\n onPointerDown={event => {\n suppressClick.current = false;\n if (event.button !== 0 || event.pointerType === 'touch') return;\n const viewport = event.currentTarget;\n const bounds = viewport.getBoundingClientRect();\n // Leave native scrollbar thumbs and their track clicks to the UA.\n if (event.clientX >= bounds.left + viewport.clientLeft + viewport.clientWidth || event.clientY >= bounds.top + viewport.clientTop + viewport.clientHeight) return;\n // No native SVG/text drag selection, including foreignObject labels.\n event.preventDefault(); viewport.focus({ preventScroll: true });\n drag.current = { id: event.pointerId, x: event.clientX, y: event.clientY, left: viewport.scrollLeft, top: viewport.scrollTop, moved: false };\n viewport.setPointerCapture(event.pointerId);\n }}\n onPointerMove={event => {\n const gesture = drag.current;\n if (!gesture || gesture.id !== event.pointerId) return;\n const x = event.clientX - gesture.x, y = event.clientY - gesture.y;\n if (!gesture.moved && Math.hypot(x, y) <= 4) return;\n if (!gesture.moved) { gesture.moved = true; runtime.clearSelection(); event.currentTarget.dataset.dragging = 'true'; }\n event.currentTarget.scrollTo(gesture.left - x, gesture.top - y);\n }}\n onPointerUp={event => {\n if (drag.current?.id !== event.pointerId) return;\n suppressClick.current = drag.current.moved; drag.current = null;\n delete event.currentTarget.dataset.dragging;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n }}\n onLostPointerCapture={event => { drag.current = null; delete event.currentTarget.dataset.dragging; }}\n onClick={event => { if (!event.defaultPrevented && !suppressClick.current && !event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey) select(); }}\n onKeyDown={event => {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const viewport = event.currentTarget;\n const moves: Record<string, [number, number]> = { ArrowLeft: [-48, 0], ArrowRight: [48, 0], ArrowUp: [0, -48], ArrowDown: [0, 48], PageUp: [0, -viewport.clientHeight * .9], PageDown: [0, viewport.clientHeight * .9] };\n if (moves[event.key]) viewport.scrollBy(...moves[event.key]);\n else if (event.key === 'Home') viewport.scrollTo(0, 0);\n else if (event.key === 'End') viewport.scrollTo(viewport.scrollWidth, viewport.scrollHeight);\n else if (event.key === 'Enter') select();\n else return;\n event.preventDefault();\n }}>\n <div className=\"limr-mermaid-canvas\" style={{ width: `${scale * 100}%` }} role=\"img\" aria-label={zh ? 'Mermaid 图表' : 'Mermaid diagram'} dangerouslySetInnerHTML={{ __html: current?.svg ?? '' }} />\n </div>\n </>}\n </div>\n <div className=\"limr-block-tools\" data-limr-ignore=\"true\" role=\"group\" aria-label={zh ? '图表工具' : 'Diagram tools'}>\n <CopyButton value={code} label={zh ? '复制 Mermaid 源代码' : 'Copy Mermaid source'} />\n <button type=\"button\" disabled={loading || !!source || scale >= 3} title={zh ? '放大' : 'Zoom in'} aria-label={zh ? '放大' : 'Zoom in'} onClick={() => setScale(value => Math.min(3, +(value + .25).toFixed(2)))}><ToolIcon name=\"zoom-in\" /></button>\n <button type=\"button\" disabled={loading || !!source || scale <= .5} title={zh ? '缩小' : 'Zoom out'} aria-label={zh ? '缩小' : 'Zoom out'} onClick={() => setScale(value => Math.max(.5, +(value - .25).toFixed(2)))}><ToolIcon name=\"zoom-out\" /></button>\n <button type=\"button\" disabled={loading || current?.error} title={label} aria-label={label} aria-pressed={sourceView} onClick={() => setSourceView(value => !value)}><ToolIcon name={sourceView ? 'image' : 'source'} /></button>\n </div>\n </div>;\n}\n\n/** Lazy, atomic diagrams. An unclosed streaming fence never reaches Mermaid. */\nexport function mermaid(): RendererExtension {\n return { name: 'mermaid', directives: ['mermaid'], literal: true, scope: 'local', components: { mermaid: MermaidNode },\n transform(root, context) {\n literalDirective(root, context.source, 'mermaid');\n walk(root, node => {\n if (node.type === 'code' && String(node.lang).toLowerCase() === 'mermaid') node.type = 'mermaid';\n if (node.type === 'mermaid') node.selection = 'atomic';\n });\n },\n };\n}\n","import { useLocale } from '../react/context';\n\n/** Shared by default modules; plugins remain free to supply their own state. */\nexport function LoadingRing() {\n const locale = useLocale();\n return <span className=\"limr-loading\" role=\"status\" aria-label={locale.loading} data-limr-ignore=\"true\">\n <svg viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n <circle className=\"limr-loading-track\" cx=\"16\" cy=\"16\" r=\"12\" />\n <g className=\"limr-loading-orbit\"><circle className=\"limr-loading-arc\" cx=\"16\" cy=\"16\" r=\"12\" pathLength=\"100\" /></g>\n </svg>\n </span>;\n}\nexport function BlockLoading() { return <div className=\"limr-block-loading\"><LoadingRing /></div>; }\n","import type { SVGProps } from 'react';\n\nexport type ToolIconName = 'eye' | 'eye-off' | 'question' | 'highlight' | 'edit' | 'close' | 'copy' | 'background' | 'underline' | 'dotted' | 'wavy' | 'chevron' | 'check' | 'trash' | 'note' | 'footnote' | 'comment' | 'sparkles' | 'zoom-in' | 'zoom-out' | 'source' | 'image';\n\n/** A shared optical grid for the built-in tools and example plugins. */\nexport function ToolIcon({ name, ...props }: SVGProps<SVGSVGElement> & { name: ToolIconName }) {\n return <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>\n <g transform={name === 'highlight' ? 'translate(0 -1.25)' : name === 'comment' ? 'translate(0 -.5)' : undefined}>\n {(name === 'eye' || name === 'eye-off') && <><path d=\"M3 12s3.3-6 9-6 9 6 9 6-3.3 6-9 6-9-6-9-6Z\" /><circle cx=\"12\" cy=\"12\" r=\"2.7\" />{name === 'eye-off' && <path d=\"m4 4 16 16\" />}</>}\n {name === 'question' && <><circle cx=\"12\" cy=\"12\" r=\"8.5\" /><path d=\"M9.4 9a2.7 2.7 0 0 1 5.2 1c0 1.8-2.6 2-2.6 3.7M12 17h.01\" /></>}\n {name === 'highlight' && <><path d=\"m8 15 7.6-9a2 2 0 0 1 2.8-.2l.8.7a2 2 0 0 1 .2 2.8L12 18l-4-3Z\" /><path d=\"m8 15-2 3 3 1 3-1M4 21h10M14 8l4 3.5\" /></>}\n {name === 'edit' && <><path d=\"m14.5 5.5 4 4M4.5 19.5l4.5-1 11-11a2.1 2.1 0 0 0 0-3 2.1 2.1 0 0 0-3 0l-11 11-1.5 4Z\" /></>}\n {name === 'close' && <path d=\"m6 6 12 12M18 6 6 18\" />}\n {name === 'copy' && <><rect x=\"8.5\" y=\"8\" width=\"10.5\" height=\"12\" rx=\"3\" /><path d=\"M15.5 8V6.8A2.8 2.8 0 0 0 12.7 4H7A3 3 0 0 0 4 7v6a3 3 0 0 0 3 3h1.5\" /></>}\n {(name === 'zoom-in' || name === 'zoom-out') && <><circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\" /><path d=\"m15.4 15.4 4.6 4.6M7.5 10.5h6\" />{name === 'zoom-in' && <path d=\"M10.5 7.5v6\" />}</>}\n {name === 'source' && <><path d=\"m7 7-4 5 4 5m10-10 4 5-4 5m-4-13-2 16\" /></>}\n {name === 'image' && <><rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"3.5\" /><circle cx=\"15.5\" cy=\"9\" r=\"1.5\" /><path d=\"m4 16 4.4-4.4a1.5 1.5 0 0 1 2.2 0L17 19m-3-3 1.4-1.4a1.5 1.5 0 0 1 2.2 0L20 17\" /></>}\n {['background', 'underline', 'dotted', 'wavy'].includes(name) && <>\n {name === 'background' && <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\" fill=\"currentColor\" fillOpacity=\".13\" stroke=\"none\" />}\n <path d=\"m8 15 3-8a1.05 1.05 0 0 1 2 0l3 8M9.2 12h5.6\" />\n {name === 'background' && <path d=\"M7 19h10\" strokeWidth=\"2.5\" />}\n {name === 'underline' && <path d=\"M5 20h14\" />}\n {name === 'dotted' && <path d=\"M5 20h14\" strokeDasharray=\".1 3.4\" strokeWidth=\"2.4\" />}\n {name === 'wavy' && <path d=\"M4 20c1.3-2 2.7-2 4 0s2.7 2 4 0 2.7-2 4 0 2.7 2 4 0\" />}\n </>}\n {name === 'chevron' && <path d=\"m8 10 4 4 4-4\" />}\n {name === 'check' && <path d=\"m5.5 12 4.2 4.2 8.8-9\" />}\n {name === 'trash' && <><path d=\"M4.5 7h15M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M7 7l.7 12a2 2 0 0 0 2 2h4.6a2 2 0 0 0 2-2L17 7M10 11v6M14 11v6\" /></>}\n {name === 'note' && <><path d=\"M14 3H7a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9l-6-6Z\" /><path d=\"M14 3v4a2 2 0 0 0 2 2h4M8 13h8M8 17h5\" /></>}\n {name === 'comment' && <><path d=\"M8 19 4 21V7a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v9a3 3 0 0 1-3 3H8Z\" /><path d=\"M8 9h8M8 13h5\" /></>}\n {name === 'footnote' && <><path d=\"M5 7h9M5 11h12M5 15h8M5 20h14M18 4h2v5\" /><path d=\"M17.5 9h4\" /></>}\n {name === 'sparkles' && <><path d=\"m10.5 4 1.8 4.8 4.7 1.7-4.7 1.8-1.8 4.7-1.7-4.7L4 10.5l4.8-1.7L10.5 4Z\" /><path d=\"m19 15 .8 2.2L22 18l-2.2.8L19 21l-.8-2.2L16 18l2.2-.8L19 15ZM19 3v4M17 5h4\" /></>}\n </g>\n </svg>;\n}\n","import { useState, type CSSProperties } from 'react';\nimport { walk } from '../core';\nimport { sliceInline } from './inline-source';\nimport { BlockLoading } from '../components/LoadingRing';\nimport { Collapse } from '../components/Collapse';\nimport { ToolIcon, type ToolIconName } from '../components/ToolIcon';\nimport { useLocale } from '../react/context';\nimport type { NodeRenderer, NodeRendererProps, RendererExtension } from '../react/types';\nimport { defineBlock } from './define';\n\nconst types: Record<string, { color: string; icon: ToolIconName }> = {\n note: { color: '#6488b5', icon: 'edit' }, abstract: { color: '#4b9ba0', icon: 'note' }, info: { color: '#6488b5', icon: 'note' },\n todo: { color: '#6488b5', icon: 'check' }, tip: { color: '#4b9b8d', icon: 'sparkles' }, success: { color: '#659664', icon: 'check' },\n question: { color: '#b38b4e', icon: 'question' }, warning: { color: '#bc8850', icon: 'question' }, failure: { color: '#be6967', icon: 'close' },\n danger: { color: '#be6967', icon: 'close' }, bug: { color: '#be6967', icon: 'note' }, example: { color: '#9580b4', icon: 'note' }, quote: { color: '#928b80', icon: 'comment' },\n};\nconst aliases: Record<string, string> = { summary: 'abstract', tldr: 'abstract', hint: 'tip', important: 'tip', check: 'success', done: 'success', help: 'question', faq: 'question', caution: 'warning', attention: 'warning', fail: 'failure', missing: 'failure', error: 'danger', cite: 'quote' };\nexport function calloutType(value: string): string {\n const name = value.toLowerCase();\n return aliases[name] ?? (Object.hasOwn(types, name) ? name : 'note');\n}\n\nfunction Callout({ node, renderChildren, renderAttribute }: NodeRendererProps) {\n const zh = useLocale().language?.startsWith('zh');\n const name = String(node.attributes?.type ?? 'note').toLowerCase(), type = calloutType(name), style = types[type];\n const title = node.children?.find(child => child.type === 'calloutTitle');\n const body = node.children?.filter(child => child.type !== 'calloutTitle') ?? [];\n const fold = node.attributes?.fold;\n const [expanded, setExpanded] = useState(fold !== '-' && fold !== 'closed');\n const content = <div className=\"limr-block-content\">{renderChildren(body)}</div>;\n const label = <><ToolIcon name={style.icon} data-limr-ignore=\"true\" /><span>{title ? renderChildren(title.children ?? []) : node.attributes?.title ? renderAttribute('title') : <span data-limr-ignore=\"true\">{name.charAt(0).toUpperCase() + name.slice(1)}</span>}</span></>;\n return <aside className=\"limr-note limr-callout\" data-callout={name} data-callout-type={type} style={{ '--limr-callout-color': style.color } as CSSProperties}>\n <div className=\"limr-card-label limr-callout-title\">{label}{fold && <button type=\"button\" className=\"limr-callout-toggle\" aria-label={expanded ? zh ? '收起提示块' : 'Collapse callout' : zh ? '展开提示块' : 'Expand callout'} aria-expanded={expanded} onClick={() => setExpanded(value => !value)} data-limr-ignore=\"true\"><ToolIcon name=\"chevron\" /></button>}</div>\n {fold ? <Collapse open={expanded} keepMounted>{content}</Collapse> : content}\n </aside>;\n}\n\n/** Obsidian blockquotes and LiMR ::callout share the same renderer and AST. */\nexport function callout(options: { component?: NodeRenderer } = {}): RendererExtension {\n return { ...defineBlock({ name: 'callout', component: options.component ?? Callout, streaming: options.component ? undefined : { Loading: BlockLoading } }),\n transform(root, context) {\n walk(root, node => {\n if (node.type !== 'blockquote') return;\n const first = node.children?.[0];\n if (first?.type !== 'paragraph' || !first.position) return;\n const from = first.position.start.offset, end = first.position.end.offset;\n const raw = context.source.slice(from, end);\n const header = /^\\[!([\\w-]+)\\]([+-])?[ \\t]*/.exec(raw);\n if (!header) {\n if (context.streaming && /^\\[![\\w-]*$/.test(raw)) { node.type = 'callout'; node.incomplete = true; node.children = []; }\n return;\n }\n node.type = 'callout';\n node.attributes = { type: header[1].toLowerCase(), ...(header[2] ? { fold: header[2] } : {}) };\n const newline = /\\r\\n|\\r|\\n/.exec(raw), titleEnd = newline ? from + newline.index : end;\n const bodyStart = newline ? titleEnd + newline[0].length : end;\n const title = sliceInline(first, from + header[0].length, titleEnd, context.source);\n const body = sliceInline(first, bodyStart, end, context.source);\n node.children = [...title?.children?.length ? [{ ...title, type: 'calloutTitle' }] : [], ...body?.children?.length ? [body] : [], ...node.children!.slice(1)];\n });\n },\n };\n}\n","import { mapText, rangeOf, type MarkdownNode, type SourcePoint } from '../core';\n\nexport function point(source: string, offset: number, base: SourcePoint): SourcePoint {\n const between = source.slice(base.offset, offset), breaks = [...between.matchAll(/\\r\\n|\\r|\\n/g)], last = breaks.at(-1);\n return { offset, line: base.line + breaks.length, column: last ? between.length - last.index! - last[0].length + 1 : base.column + between.length };\n}\n\n/** Slice an existing inline tree without reparsing, retaining decoded UTF-16\n * mappings, formatting, CRLF coordinates and original source delimiters. */\nexport function sliceInline(node: MarkdownNode, from: number, until: number, source: string): MarkdownNode | undefined {\n if (!node.position) return;\n const range = rangeOf(node);\n if (range.end <= from || range.start >= until) return;\n if (range.start >= from && range.end <= until) return node;\n let start = Math.max(range.start, from), end = Math.min(range.end, until);\n const result = { ...node };\n if (node.type === 'text') {\n const value = (node.value ?? '').replace(/\\r\\n?/g, '\\n'), mapped = mapText(source, value, range);\n const first = mapped.ends.findIndex(offset => offset > start);\n let last = mapped.starts.findIndex(offset => offset >= end);\n if (first < 0) return;\n if (last < 0) last = mapped.starts.length;\n if (last <= first) return;\n result.value = value.slice(first, last); start = mapped.starts[first]; end = mapped.ends[last - 1];\n }\n if (node.children) result.children = sliceChildren(node.children, start, end, source);\n result.position = { start: point(source, start, node.position.start), end: point(source, end, node.position.start) };\n return result;\n}\nexport function sliceChildren(children: readonly MarkdownNode[], from: number, until: number, source: string): MarkdownNode[] {\n return children.flatMap(child => { const value = sliceInline(child, from, until, source); return value ? [value] : []; });\n}\n\n/** Only literal text punctuation can introduce a new inline construct. Escaped\n * punctuation, entities, code, URLs and component attributes cannot do so. */\nexport function textTokens(children: readonly MarkdownNode[], expression: RegExp, source: string): { start: number; end: number }[] {\n return children.flatMap(node => {\n if (node.type !== 'text' || !node.value || !node.position) return [];\n const matches = [...node.value.matchAll(expression)];\n if (!matches.length) return [];\n const map = mapText(source, node.value, rangeOf(node));\n return matches.flatMap(match => {\n const start = map.starts[match.index!], end = map.ends[match.index! + match[0].length - 1];\n return source.slice(start, end) === match[0] ? [{ start, end }] : [];\n });\n });\n}\n","import type { AnnotationType, NodeRenderer, RendererExtension } from '../react/types';\nimport type { SyntaxExtension } from '../core';\n\nexport interface BlockExtensionOptions {\n name: string;\n component: NodeRenderer;\n tags?: readonly string[];\n directives?: readonly string[];\n selection?: 'content' | 'atomic';\n streaming?: RendererExtension['streaming'];\n}\n/** A tag/directive adapter with original source positions and streaming recovery. */\nexport function defineBlock({ name, component, tags = [name], directives = [name], selection = 'content', streaming }: BlockExtensionOptions): RendererExtension {\n return { name, tags, directives, selection, streaming, display: 'block', scope: 'local', components: Object.fromEntries([...new Set([...tags, ...directives])].map(tag => [tag, component])) };\n}\nexport function defineAnnotation<T>(type: AnnotationType<T>): RendererExtension {\n return { name: `annotation:${type.type}`, annotationTypes: [type], scope: 'local' };\n}\nexport function defineExtension(extension: RendererExtension): RendererExtension { return extension; }\n","import { rangeOf, type Annotation, type HighlightData, type MarkdownNode, type SourceRange } from '../core';\nimport type { NodeRenderer, RendererExtension } from '../react/types';\nimport { point, sliceChildren, textTokens } from './inline-source';\n\nexport interface InlineHighlightOptions { color?: string; component?: NodeRenderer }\nconst Content: NodeRenderer = ({ children }) => <>{children}</>;\n\n/** Markdown-authored highlights share the normal paint/hover/copy machinery,\n * while their source remains the authority for editing. */\nexport function inlineHighlights(options: InlineHighlightOptions = {}): RendererExtension {\n const decorate = (node: MarkdownNode, range: SourceRange) => {\n node.type = 'embeddedHighlight'; node.highlightRange = range;\n node.annotation = { id: `inline-highlight:${rangeOf(node).start}`, type: 'highlight', range,\n data: { color: options.color ?? 'var(--limr-inline-highlight, #6B9BD2)', style: 'background', readOnly: true },\n } satisfies Annotation<HighlightData>;\n };\n return {\n name: 'inline-highlights', tags: ['highlight'], scope: 'local', components: { embeddedHighlight: options.component ?? Content },\n transform(root, { source, streaming }) {\n const visit = (node: MarkdownNode) => {\n if (!node.children || ['code', 'inlineCode', 'math', 'inlineMath', 'html', 'footnoteDefinition', 'annotationDefinition'].includes(node.type)) return;\n node.children.forEach(visit);\n if (node.type === 'component' && node.name === 'highlight') {\n const first = node.children[0], last = node.children.at(-1);\n if (first && last) decorate(node, { start: rangeOf(first).start, end: rangeOf(last).end });\n return;\n }\n const tokens = textTokens(node.children, /(?<!=)==(?!=)/g, source);\n if (!node.position) return;\n if (!tokens.length) {\n const last = node.children.at(-1), end = rangeOf(node).end;\n if (streaming && end === source.length && last?.type === 'text' && source.endsWith('=') && source[end - 2] !== '\\\\') node.children = sliceChildren(node.children, rangeOf(node).start, end - 1, source);\n return;\n }\n const children: MarkdownNode[] = [];\n let from = rangeOf(node).start;\n for (let index = 0; index < tokens.length; index += 2) {\n const open = tokens[index], close = tokens[index + 1];\n if (!close && (!streaming || rangeOf(node).end < source.trimEnd().length)) break;\n let end = close?.start ?? rangeOf(node).end;\n // A closing delimiter may arrive one character at a time.\n if (!close && source[end - 1] === '=' && source[end - 2] !== '=' && source[end - 2] !== '\\\\') end--;\n const body = sliceChildren(node.children, open.end, end, source);\n if (!body.length && close) continue;\n children.push(...sliceChildren(node.children, from, open.start, source));\n const highlight: MarkdownNode = { type: 'embeddedHighlight', inline: true, children: body, incomplete: close ? undefined : true,\n position: { start: point(source, open.start, node.position.start), end: point(source, close?.end ?? rangeOf(node).end, node.position.start) } };\n if (body.length) decorate(highlight, { start: open.end, end }); children.push(highlight);\n from = close?.end ?? rangeOf(node).end;\n }\n children.push(...sliceChildren(node.children, from, rangeOf(node).end, source));\n node.children = children;\n };\n visit(root);\n },\n };\n}\n","import { useMemo } from 'react';\nimport { fromMarkdown } from 'mdast-util-from-markdown';\nimport { rangeOf, textContent, type Annotation, type MarkdownNode, type SourceRange } from '../core';\nimport { useLocale } from '../react/context';\nimport type { AnnotationContentProps, AnnotationOverlayCardProps, AnnotationSidebarPreviewProps, AnnotationType, RendererExtension } from '../react/types';\nimport { AnnotationCard } from '../components/AnnotationCard';\nimport { ToolIcon } from '../components/ToolIcon';\nimport { AnnotationMarkdown } from './annotations';\nimport { point, sliceChildren, textTokens } from './inline-source';\n\nexport interface FootnoteData { body: string }\nconst idFor = (identifier: unknown) => `footnote:${String(identifier).trim().replace(/\\s+/g, ' ').toLowerCase()}`;\nfunction Icon() { return <ToolIcon name=\"comment\" />; }\nfunction Content({ data }: AnnotationContentProps<FootnoteData>) { return <AnnotationMarkdown source={data?.body ?? ''} />; }\nfunction Card(props: AnnotationOverlayCardProps<FootnoteData>) { return <AnnotationCard {...props} title={useLocale().footnotes} />; }\nfunction Preview({ data }: AnnotationSidebarPreviewProps<FootnoteData>) {\n const summary = useMemo(() => textContent(fromMarkdown(data?.body ?? '') as unknown as MarkdownNode).replace(/\\s+/g, ' ').trim(), [data?.body]);\n return summary ? <span title={summary}>{summary}</span> : null;\n}\n\n/** GFM definitions keep their AST identity for incremental parsing, but their\n * references use the same marker/sidebar/overlay contract as other modules. */\nexport function footnotes(options: Partial<AnnotationType<FootnoteData>> = {}): RendererExtension {\n const type = options.type ?? 'footnote';\n const definition = (id: string, body: string): Annotation<FootnoteData> => ({ id, type, data: { body } });\n return {\n name: 'footnotes', tags: ['footnote', 'footnote-ref'], scope: 'local',\n annotationTypes: [{ type, label: locale => locale.footnotes, icon: Icon, color: '#6B9BD2', highlight: 'hover', Content, ...options,\n sidebar: { Preview, collapseOnContentClick: false, ...options.sidebar }, overlay: { Card, expand: false, ...options.overlay } }],\n transform(root, { source, streaming }) {\n const visit = (node: MarkdownNode) => {\n if (node.type === 'footnoteDefinition') {\n const range = rangeOf(node), raw = source.slice(range.start, range.end);\n // Remove only the footnote container indentation; retain nested lists,\n // paragraphs, code, rich inline content and original line endings.\n const body = raw.replace(/^\\[\\^[^\\]]+\\]:[ \\t]*/, '').replace(/(\\r\\n|\\r|\\n)(?: {4}|\\t)/g, '$1');\n node.annotation = definition(idFor(node.identifier), body); return;\n }\n if (node.type === 'footnoteReference') {\n node.type = 'annotationReference'; node.inline = true; node.annotationIds = [idFor(node.identifier)]; return;\n }\n if (node.type === 'component' && ['footnote', 'footnote-ref'].includes(node.name ?? '')) {\n if (node.incomplete) { node.children = []; return; }\n const id = idFor(node.attributes?.id ?? '');\n if (node.name === 'footnote') {\n const first = node.children?.[0], last = node.children?.at(-1);\n node.type = 'annotationDefinition'; node.annotation = definition(id, first && last ? source.slice(rangeOf(first).start, rangeOf(last).end) : String(node.attributes?.body ?? ''));\n return;\n }\n node.type = 'annotationReference'; node.annotationIds = [id]; return;\n }\n if (!node.children || ['code', 'inlineCode', 'math', 'inlineMath', 'html', 'annotationDefinition'].includes(node.type)) return;\n node.children.forEach(visit);\n const opens = textTokens(node.children, /\\^\\[/g, source);\n if (opens.length && node.position) {\n const children: MarkdownNode[] = [], range = rangeOf(node);\n let from = range.start;\n for (const open of opens) {\n if (open.start < from) continue;\n let depth = 1, at = open.end;\n const protectedNodes = node.children.filter(child => child.type !== 'text').map(rangeOf);\n for (; at < range.end && depth; at++) {\n const protectedNode = protectedNodes.find(child => child.start <= at && child.end > at);\n if (protectedNode) { at = protectedNode.end - 1; continue; }\n if (source[at] === '\\\\') { at++; continue; }\n if (source[at] === '[') depth++; else if (source[at] === ']') depth--;\n }\n if (depth) {\n if (streaming && range.end >= source.trimEnd().length) { children.push(...sliceChildren(node.children, from, open.start, source)); from = range.end; break; }\n continue;\n }\n const id = `inline-footnote:${open.start}`;\n children.push(...sliceChildren(node.children, from, open.start, source), {\n type: 'annotationReference', inline: true, annotationIds: [id], annotation: definition(id, source.slice(open.end, at - 1)),\n position: { start: point(source, open.start, node.position.start), end: point(source, at, node.position.start) },\n });\n from = at;\n }\n children.push(...sliceChildren(node.children, from, range.end, source)); node.children = children;\n }\n node.children.forEach((child, index) => {\n const previous = node.children![index - 1];\n if (child.type === 'annotationReference' && previous?.type === 'embeddedHighlight' && rangeOf(previous).end === rangeOf(child).start) child.referenceRange = previous.highlightRange as SourceRange;\n });\n };\n visit(root);\n },\n };\n}\n","import { BlockLoading } from '../components/LoadingRing';\nimport { useState } from 'react';\nimport { defineBlock } from './define';\nimport { rangeOf, safeUrl, textContent, walk } from '../core/tree';\nimport { useRuntime } from '../react/context';\nimport type { MarkdownNode } from '../core';\nimport type { NodeRenderer, NodeRendererProps, RendererExtension } from '../react/types';\nimport { Disclosure } from '../components/Disclosure';\nimport { Collapse } from '../components/Collapse';\nimport { DiamondCheck } from '../components/DiamondCheck';\n\nfunction parts(node: MarkdownNode, name: string): MarkdownNode[] {\n const result: MarkdownNode[] = [];\n walk(node, child => { if (child !== node && child.name === name) result.push(child); });\n return result;\n}\nconst PassThrough: NodeRenderer = ({ children }) => <>{children}</>;\nexport function definition(options: { component?: NodeRenderer } = {}): RendererExtension {\n function Definition({ node, children, renderChildren, renderAttribute }: NodeRendererProps) {\n const runtime = useRuntime();\n const title = parts(node, 'title')[0];\n const content = parts(node, 'content')[0];\n return <aside className=\"limr-definition\">\n <div className=\"limr-card-label\" data-limr-ignore=\"true\">{runtime.locale.definition}</div>\n {(title || node.attributes?.title) && <div className=\"limr-definition-title\">{title ? renderChildren(title.children ?? []) : renderAttribute('title')}</div>}\n <div className=\"limr-block-content\">{content ? renderChildren(content.children ?? []) : children}</div>\n </aside>;\n }\n return { ...defineBlock({ name: 'definition', streaming: options.component ? undefined : { Loading: BlockLoading }, component: options.component ?? Definition }), tags: ['definition', 'title', 'content'], components: { definition: options.component ?? Definition, title: PassThrough, content: PassThrough } };\n}\n\nexport function question(options: { component?: NodeRenderer } = {}): RendererExtension {\n function Question({ node, children, renderChildren, renderAttribute }: NodeRendererProps) {\n const runtime = useRuntime();\n const [showHint, setHint] = useState(false), [showAnswer, setAnswer] = useState(false);\n const [selected, setSelected] = useState<number[]>([]), [checked, setChecked] = useState(false);\n const content = parts(node, 'question-content')[0];\n const hint = parts(node, 'question-hint')[0];\n const answer = parts(node, 'question-answer')[0];\n const group = parts(node, 'question-sel-grp')[0];\n const selections = parts(node, 'question-sel');\n const multi = String(group?.attributes?.multi ?? node.attributes?.multi ?? 'false') === 'true';\n let correct: number[] = [];\n try { const value = JSON.parse(String(group?.attributes?.answer ?? node.attributes?.answer ?? '[]')); correct = (Array.isArray(value) ? value : [value]).map(Number); } catch { /* Missing answers still allow a practice question. */ }\n const success = correct.length === selected.length && correct.every(index => selected.includes(index));\n return <section className=\"limr-question\">\n <div className=\"limr-card-label\" data-limr-ignore=\"true\">{runtime.locale.question}</div>\n {node.attributes?.title && <div className=\"limr-question-title\">{renderAttribute('title')}</div>}\n <div className=\"limr-block-content\">{content ? renderChildren(content.children ?? []) : !selections.length && !hint && !answer ? children : null}</div>\n {selections.length > 0 && <fieldset className=\"limr-question-options\"><legend className=\"limr-sr-only\">{String(node.attributes?.title ?? runtime.locale.question)}</legend>{selections.map((selection, index) => <label key={index} data-selected={selected.includes(index) || undefined} data-result={checked ? correct.includes(index) ? 'correct' : selected.includes(index) ? 'incorrect' : undefined : undefined}>\n <input type={multi ? 'checkbox' : 'radio'} name={`${runtime.document.id}-question-${rangeOf(node).start}`} checked={selected.includes(index)} disabled={checked} onChange={() => { setSelected(multi ? selected.includes(index) ? selected.filter(item => item !== index) : [...selected, index] : [index]); }} />\n <DiamondCheck checked={selected.includes(index) || checked && correct.includes(index)} />\n <span className=\"limr-choice-text\">{renderChildren(selection.children ?? [])}</span>\n </label>)}</fieldset>}\n {selections.length > 0 && correct.length > 0 && <div className=\"limr-question-actions\" data-limr-ignore=\"true\">\n <button type=\"button\" data-checked={checked || undefined} disabled={!checked && !selected.length} onClick={() => {\n if (checked) { setChecked(false); setSelected([]); setAnswer(false); }\n else { setChecked(true); setAnswer(true); }\n }}><span key={checked ? 'retry' : 'submit'} className=\"limr-button-label\">{checked ? runtime.locale.retry : runtime.locale.submit}</span></button>\n <Collapse open={checked}><span role=\"status\" className={`limr-question-result ${success ? 'limr-success' : 'limr-error'}`}>{success ? runtime.locale.correct : runtime.locale.incorrect}</span></Collapse>\n </div>}\n {hint && <Disclosure title={runtime.locale.hint} open={showHint} onChange={setHint}>{renderChildren(hint.children ?? [])}</Disclosure>}\n {answer && <Disclosure title={runtime.locale.answer} open={showAnswer} onChange={setAnswer}>{renderChildren(answer.children ?? [])}</Disclosure>}\n </section>;\n }\n const names = ['question-content', 'question-hint', 'question-answer', 'question-sel-grp', 'question-sel'];\n return { ...defineBlock({ name: 'question', streaming: options.component ? undefined : { Loading: BlockLoading }, component: options.component ?? Question }), tags: ['question', ...names], components: { question: options.component ?? Question, ...Object.fromEntries(names.map(name => [name, PassThrough])) } };\n}\n\nexport function extras(options: { component?: NodeRenderer } = {}): RendererExtension {\n const Extra: NodeRenderer = ({ node, children, renderAttribute }) => <div className=\"limr-extra\">\n <a className=\"limr-extra-link\" href={safeUrl(node.attributes?.url)} target=\"_blank\" rel=\"noreferrer\"><span className=\"limr-underline\">{renderAttribute(node.attributes?.title ? 'title' : 'url')}</span>\n {node.attributes?.desc && <p><span className=\"limr-underline\">{renderAttribute('desc')}</span></p>}</a>{children}\n </div>;\n const Extras: NodeRenderer = ({ children }) => { const runtime = useRuntime(); return <aside className=\"limr-extras\"><div className=\"limr-card-label\" data-limr-ignore=\"true\">{runtime.locale.extra}</div>{children}</aside>; };\n return { ...defineBlock({ name: 'extras', streaming: options.component ? undefined : { Loading: BlockLoading }, component: options.component ?? Extras }), tags: ['extras', 'extra'], components: { extras: options.component ?? Extras, extra: Extra } };\n}\n\nexport { video, type VideoOptions } from './video';\n\nexport { figures, type FiguresOptions } from './figures';\n","import { type ReactNode } from 'react';\nimport { Collapse } from './Collapse';\n\nexport function Disclosure({ title, open, onChange, children }: { title: string; open: boolean; onChange: (open: boolean) => void; children: ReactNode }) {\n // Native closed <details> skips layout of its contents. Keep the host open so\n // Collapse has a real 0fr starting state on the very first interaction too.\n // aria-expanded, aria-hidden and inert still describe the controlled state.\n return <details className=\"limr-disclosure\" open data-expanded={open || undefined}>\n <summary aria-expanded={open} onClick={event => { event.preventDefault(); onChange(!open); }} data-limr-ignore=\"true\">\n <span className=\"limr-underline\">{title}</span><svg viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><path d=\"m6 8 4 4 4-4\" /></svg>\n </summary>\n <Collapse open={open} keepMounted><div className=\"limr-question-detail\">{children}</div></Collapse>\n </details>;\n}\n","/** The original pointed diamond and center-fill transition, using skin colors. */\nexport function DiamondCheck({ checked }: { checked: boolean }) {\n return <svg className=\"limr-choice-diamond\" width=\"14\" height=\"14\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\" data-limr-ignore=\"true\" data-checked={checked || undefined}>\n <path className=\"limr-diamond-outline\" d=\"M9 1.5L16.5 9L9 16.5L1.5 9Z\" fill=\"none\" />\n <path className=\"limr-diamond-fill\" d=\"M9 5L13 9L9 13L5 9Z\" fill=\"currentColor\" />\n </svg>;\n}\n","import { BlockLoading } from '../components/LoadingRing';\nimport { useEffect, useRef, useState } from 'react';\nimport { safeUrl } from '../core/tree';\nimport { useRuntime, useStoreSelector } from '../react/context';\nimport type { NodeRenderer, NodeRendererProps, RendererExtension } from '../react/types';\nimport { CopyButton } from '../components/CopyButton';\nimport { defineBlock } from './define';\n\nexport interface VideoOptions {\n component?: NodeRenderer;\n resolveUrl?: (provider: string, url: string) => string | undefined;\n /** Load near the viewport by default; click and eager are explicit alternatives. */\n loading?: 'visible' | 'click' | 'eager';\n}\nexport function resolveVideo(source: string, provider = 'auto'): { url: string; native: boolean } | undefined {\n const safe = safeUrl(source);\n if (!safe) return;\n let parsed: URL;\n try { parsed = new URL(safe.startsWith('//') ? `https:${safe}` : safe); }\n catch { return provider === 'auto' || provider === 'native' ? { url: safe, native: true } : undefined; }\n if (!['https:', 'http:'].includes(parsed.protocol)) return;\n const youtube = /(?:^|\\.)(?:youtube\\.com|youtube-nocookie\\.com)$/.test(parsed.hostname) || parsed.hostname === 'youtu.be';\n const bilibili = /(?:^|\\.)bilibili\\.com$/.test(parsed.hostname);\n const kind = provider === 'auto' ? youtube ? 'youtube' : bilibili ? 'bilibili' : 'native' : provider;\n if (kind === 'native') return { url: safe, native: true };\n if (kind === 'youtube' && youtube) {\n const id = parsed.hostname === 'youtu.be' ? parsed.pathname.split('/')[1] : parsed.searchParams.get('v') ?? /^\\/(?:embed|shorts|live)\\/([\\w-]+)/.exec(parsed.pathname)?.[1];\n if (id && /^[\\w-]{11}$/.test(id)) {\n const embed = new URL(`https://www.youtube.com/embed/${id}`);\n const time = parsed.searchParams.get('start') ?? parsed.searchParams.get('t');\n if (time) {\n const match = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s?)?$/.exec(time);\n const seconds = match ? Number(match[1] ?? 0) * 3600 + Number(match[2] ?? 0) * 60 + Number(match[3] ?? 0) : 0;\n if (seconds > 0) embed.searchParams.set('start', String(seconds));\n }\n return { url: embed.href, native: false };\n }\n }\n if (kind === 'bilibili' && bilibili) {\n const id = /\\/video\\/(BV[\\w]+|av\\d+)(?:\\/|$)/.exec(parsed.pathname)?.[1];\n const bvid = id?.startsWith('BV') ? id : parsed.hostname === 'player.bilibili.com' ? parsed.searchParams.get('bvid') : null;\n const aid = id?.startsWith('av') ? id.slice(2) : parsed.hostname === 'player.bilibili.com' ? parsed.searchParams.get('aid') : null;\n if (bvid && /^BV[\\w]+$/.test(bvid) || aid && /^\\d+$/.test(aid)) {\n const embed = new URL('https://player.bilibili.com/player.html');\n embed.searchParams.set(bvid ? 'bvid' : 'aid', bvid || aid!);\n embed.searchParams.set('autoplay', '0'); embed.searchParams.set('high_quality', '1'); embed.searchParams.set('danmaku', '0');\n const part = parsed.searchParams.get('p') ?? parsed.searchParams.get('page');\n if (part && /^[1-9]\\d*$/.test(part)) embed.searchParams.set('page', part);\n return { url: embed.href, native: false };\n }\n }\n}\n\nexport function video(options: VideoOptions = {}): RendererExtension {\n function Video({ node, source: markdown, renderAttribute }: NodeRendererProps) {\n const runtime = useRuntime();\n const scrollRoot = useStoreSelector(runtime.configuration, config => config.scrollRoot);\n const element = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [playing, setPlaying] = useState(false);\n const [failed, setFailed] = useState(false);\n const provider = String(node.attributes?.provider ?? 'auto');\n const source = String(node.attributes?.url ?? node.attributes?.src ?? '');\n const requested = node.attributes?.loading ?? options.loading ?? 'visible';\n const loading = requested === 'click' || requested === 'eager' ? requested : 'visible';\n const resolved = options.resolveUrl?.(provider, source);\n const media = resolved && safeUrl(resolved) ? { url: safeUrl(resolved)!, native: provider === 'native' } : resolveVideo(source, provider);\n useEffect(() => { setFailed(false); setPlaying(false); }, [source, provider]);\n useEffect(() => {\n if (visible || loading !== 'visible' || !element.current) return;\n if (typeof IntersectionObserver === 'undefined') { setVisible(true); return; }\n const observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) { setVisible(true); observer.disconnect(); }\n }, { root: scrollRoot, rootMargin: '200px' });\n observer.observe(element.current);\n return () => observer.disconnect();\n }, [visible, loading, scrollRoot]);\n const enabled = loading === 'eager' || loading === 'visible' && visible || playing;\n const title = String(node.attributes?.title ?? `${provider === 'auto' ? 'Video' : provider} video`);\n const original = safeUrl(source);\n return <div ref={element} className=\"limr-video\" data-limr-selection-surface=\"\" data-loading={loading}>\n <div className=\"limr-video-frame\">\n {!media || failed ? <div className=\"limr-video-error\"><span>{runtime.locale.unavailable}</span>{original && <a href={original} target=\"_blank\" rel=\"noopener noreferrer\">{source}</a>}</div>\n : enabled ? media.native ? <video controls playsInline preload=\"metadata\" src={media.url} aria-label={title} onError={() => setFailed(true)} />\n : <iframe src={media.url} title={title} allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowFullScreen referrerPolicy=\"strict-origin-when-cross-origin\" onError={() => setFailed(true)} />\n : <button type=\"button\" className=\"limr-video-play\" onClick={() => setPlaying(true)} aria-label={runtime.locale.play}><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m8 5 11 7-11 7Z\" fill=\"currentColor\" /></svg></button>}\n </div>\n {node.attributes?.title && <div className=\"limr-video-title\">{renderAttribute('title')}</div>}\n <CopyButton className=\"limr-video-copy\" variant=\"glass\" value={markdown} />\n </div>;\n }\n return defineBlock({ name: 'video', streaming: options.component ? undefined : { Loading: BlockLoading }, tags: ['video', 'md-video'], component: options.component ?? Video, selection: 'atomic' });\n}\n","import { BlockLoading } from '../components/LoadingRing';\nimport { createContext, useContext, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport { safeUrl, type MarkdownNode } from '../core';\nimport { CopyButton } from '../components/CopyButton';\nimport type { NodeRendererProps, RendererExtension } from '../react/types';\nimport { defaultFigureLimits, dimension, figureColumns, figureLimits, figureWidths, type FigureLimits, type FigureMeasure } from './figure-layout';\nimport { useLocale } from '../react/context';\n\nexport interface FiguresOptions {\n minWidth?: number; maxWidth?: number | false;\n minHeight?: number; maxHeight?: number | false;\n columns?: number; rows?: number; responsive?: boolean; gap?: number;\n}\nconst FigureContext = createContext<FigureLimits>(defaultFigureLimits);\nconst captionNode = (node: MarkdownNode) => node.name === 'figcaption' || node.name === 'caption';\nconst flatten = (nodes: readonly MarkdownNode[]) => nodes.flatMap(node => node.type === 'paragraph' && node.children?.some(child => child.name === 'figure' || captionNode(child)) ? node.children : [node]);\nconst identifier = (node: MarkdownNode) => node.attributes?.id ? String(node.attributes.id) : undefined;\nconst ratioOf = (width: unknown, height: unknown) => { const ratio = Number(width) / Number(height); return Number.isFinite(ratio) && ratio > 0 ? ratio : 1; };\n\nexport function figures(options: FiguresOptions = {}): RendererExtension {\n const defaults = figureLimits({ 'min-width': options.minWidth, 'max-width': options.maxWidth, 'min-height': options.minHeight, 'max-height': options.maxHeight });\n function Figures({ node, renderChildren, renderAttribute, source }: NodeRendererProps) {\n const locale = useLocale();\n const nodes = flatten(node.children ?? []);\n const panels = nodes.filter(child => child.name === 'figure');\n const captions = nodes.filter(captionNode);\n const body = nodes.filter(child => !captionNode(child));\n const limits = useMemo(() => figureLimits(node.attributes, defaults), [node.attributes]);\n const grid = useRef<HTMLDivElement>(null);\n const [columns, setColumns] = useState(1);\n const gap = Math.min(100, dimension(node.attributes?.gap, options.gap ?? 16));\n const rows = dimension(node.attributes?.rows, options.rows ?? 0);\n const requested = dimension(node.attributes?.columns ?? node.attributes?.cols, options.columns ?? 0) || (rows > 0 ? Math.ceil(panels.length / rows) : undefined);\n const responsive = String(node.attributes?.responsive ?? options.responsive ?? true) !== 'false';\n useEffect(() => {\n const element = grid.current;\n if (!element) return;\n const measure = () => {\n const elements = [...element.querySelectorAll<HTMLElement>(':scope > .limr-figure')];\n const items: FigureMeasure[] = panels.map((panel, index) => {\n const image = elements[index]?.querySelector('img');\n const ratio = image?.naturalWidth && image.naturalHeight ? image.naturalWidth / image.naturalHeight : ratioOf(panel.attributes?.width, panel.attributes?.height);\n return { ratio, limits: figureLimits(panel.attributes, limits) };\n });\n setColumns(figureColumns(element.clientWidth, items, gap, requested, responsive));\n };\n const observer = new ResizeObserver(measure);\n observer.observe(element); element.addEventListener('load', measure, true); element.addEventListener('error', measure, true); measure();\n return () => { observer.disconnect(); element.removeEventListener('load', measure, true); element.removeEventListener('error', measure, true); };\n }, [node, limits, gap, requested, responsive]);\n return <figure id={identifier(node)} className=\"limr-figures\" data-limr-selection-order=\"visual\" data-columns={columns} data-responsive={responsive}>\n <CopyButton value={source} label={locale.copyFigures} variant=\"glass\" className=\"limr-figures-copy\" />\n <FigureContext.Provider value={limits}><div ref={grid} className=\"limr-figures-grid\" style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`, gridTemplateRows: rows ? `repeat(${Math.max(1, Math.min(24, Math.floor(rows)))}, auto auto)` : undefined, gap }}>\n {renderChildren(body)}\n </div></FigureContext.Provider>\n {captions.length ? renderChildren(captions) : node.attributes?.caption ? <figcaption>{renderAttribute('caption')}</figcaption> : null}\n </figure>;\n }\n function Figure({ node, renderChildren, renderAttribute }: NodeRendererProps) {\n const locale = useLocale();\n const inherited = useContext(FigureContext);\n const limits = figureLimits(node.attributes, inherited === defaultFigureLimits ? defaults : inherited);\n const media = useRef<HTMLDivElement>(null);\n const [ratio, setRatio] = useState(ratioOf(node.attributes?.width, node.attributes?.height));\n const nodes = flatten(node.children ?? []);\n const captions = nodes.filter(captionNode);\n const body = nodes.filter(child => !captionNode(child));\n useEffect(() => {\n const element = media.current;\n if (!element) return;\n const measure = () => { const image = element.querySelector('img'); if (image?.naturalWidth && image.naturalHeight) setRatio(image.naturalWidth / image.naturalHeight); };\n measure(); element.addEventListener('load', measure, true);\n return () => element.removeEventListener('load', measure, true);\n }, [node]);\n const maximum = figureWidths({ ratio, limits }).maximum;\n return <figure id={identifier(node)} className=\"limr-figure\" data-limr-selection-order=\"visual\" style={{\n '--limr-figure-width': Number.isFinite(maximum) ? `${maximum}px` : '100%',\n '--limr-figure-min-height': `${Math.min(limits.minHeight, limits.maxHeight)}px`,\n '--limr-figure-max-height': Number.isFinite(limits.maxHeight) ? `${limits.maxHeight}px` : 'none',\n } as CSSProperties}>\n <div ref={media} className=\"limr-figure-media\">\n {renderChildren(body)}\n </div>\n <CopyButton onCopy={async () => {\n const url = media.current?.querySelector('img')?.getAttribute('src');\n if (!url) throw new Error('Image URL unavailable');\n await navigator.clipboard.writeText(url);\n }} label={locale.copyImage} variant=\"glass\" className=\"limr-figure-copy\" />\n {captions.length ? renderChildren(captions) : node.attributes?.caption ? <figcaption>{renderAttribute('caption')}</figcaption> : null}\n </figure>;\n }\n const Caption = ({ children }: NodeRendererProps) => <figcaption>{children}</figcaption>;\n return {\n name: 'figures', streaming: { Loading: BlockLoading }, tags: ['figures', 'figure', 'figcaption', 'caption', 'img'], directives: ['figures', 'figure', 'figcaption'], scope: 'local', display: 'block',\n components: { figures: Figures, figure: Figure, figcaption: Caption, caption: Caption,\n img: ({ node }) => <img src={safeUrl(node.attributes?.src, true)} alt={String(node.attributes?.alt ?? '')} loading=\"lazy\" decoding=\"async\" /> },\n transform(root) {\n // Attribute images retain a source binding just like Markdown images.\n const visit = (node: MarkdownNode) => {\n if (node.type === 'component' && node.name === 'img') { node.selection = 'atomic'; node.inline = true; }\n if (node.type === 'component' && node.name === 'figure' && (node.attributes?.src || node.attributes?.url)) {\n const image = node.attributeNodes?.[node.attributes.src ? 'src' : 'url'];\n node.children = [{ type: 'image', url: node.attributes.src ?? node.attributes.url, alt: node.attributes.alt ?? '', position: image?.position ?? node.position }, ...(node.children ?? [])];\n }\n node.children?.forEach(visit);\n };\n visit(root);\n },\n };\n}\n","export interface FigureLimits {\n minWidth: number;\n maxWidth: number;\n minHeight: number;\n maxHeight: number;\n}\nexport const defaultFigureLimits: Readonly<FigureLimits> = { minWidth: 220, maxWidth: 560, minHeight: 120, maxHeight: 480 };\nexport interface FigureMeasure { ratio: number; limits: FigureLimits }\n\n/** Preserve aspect ratio. Upper limits win if an author's minima conflict. */\nexport function figureWidths({ ratio, limits }: FigureMeasure) {\n const maximum = Math.min(limits.maxWidth, limits.maxHeight * ratio);\n return { maximum, minimum: Math.min(maximum, Math.max(limits.minWidth, limits.minHeight * ratio)) };\n}\n\n/** Add a column only after the existing columns reach their upper bounds and\n * another readable image fits. Manual grids can instead shrink to fit. */\nexport function figureColumns(width: number, items: readonly FigureMeasure[], gap: number, requested?: number, responsive = true): number {\n if (!items.length || width <= 0) return 1;\n const bounds = items.map(figureWidths);\n const fits = (count: number) => {\n const slot = (width - (count - 1) * gap) / count;\n return bounds.every(item => slot >= item.minimum);\n };\n if (requested) {\n let count = Math.max(1, Math.min(24, Math.floor(requested)));\n if (responsive) while (count > 1 && !fits(count)) count--;\n return count;\n }\n const maximum = Math.max(...bounds.map(item => item.maximum));\n const minimum = Math.max(...bounds.map(item => item.minimum));\n let count = 1;\n while (count < items.length && count < 24 && width >= count * maximum + count * gap + minimum && fits(count + 1)) count++;\n return count;\n}\n\nexport function dimension(value: unknown, fallback: number, optional = false): number {\n if (optional && (value === false || value === 'false' || value === 'none')) return Infinity;\n if (typeof value !== 'number' && (typeof value !== 'string' || !/^\\d+(?:\\.\\d+)?(?:px)?$/.test(value))) return fallback;\n const number = typeof value === 'number' ? value : parseFloat(value);\n return Number.isFinite(number) && number >= 0 ? number : fallback;\n}\nexport function figureLimits(attributes: Record<string, unknown> = {}, defaults = defaultFigureLimits): FigureLimits {\n return {\n minWidth: dimension(attributes['min-width'], defaults.minWidth), maxWidth: dimension(attributes['max-width'], defaults.maxWidth, true),\n minHeight: dimension(attributes['min-height'], defaults.minHeight), maxHeight: dimension(attributes['max-height'], defaults.maxHeight, true),\n };\n}\n","import { gfm } from './gfm';\nimport { math } from './math';\nimport { codeHighlight } from './code';\nimport { citation } from './annotations';\nimport { translations } from './translations';\nimport { mermaid } from './mermaid';\nimport { callout } from './callout';\nimport { inlineHighlights } from './inline-highlights';\nimport { footnotes } from './footnotes';\nimport { definition, extras, figures, question, video } from './blocks';\nimport type { RendererExtension } from '../react/types';\n\n/** LiMR's default capabilities. Every item uses the public extension contract. */\nexport function standard(): RendererExtension[] { return [gfm(), math(), codeHighlight(), mermaid(), callout(), definition(), question(), extras(), video(), figures(), citation(), translations(), inlineHighlights(), footnotes()]; }\n","import type { CSSProperties } from 'react';\nimport { defaultHighlight, type HighlightData } from '../core';\nimport type { SelectionAction, ToolbarActionContext } from '../react/types';\nimport { ToolIcon } from '../components/ToolIcon';\n\n/** The first five colors match infilearn's reading palette. */\nexport const highlightColors = [\n { color: '#E57373', label: 'Rose', labelZh: '玫瑰' },\n { color: '#F2C744', label: 'Gold', labelZh: '暖黄' },\n { color: '#81B29A', label: 'Sage', labelZh: '鼠尾草' },\n { color: '#6B9BD2', label: 'Blue', labelZh: '雾蓝' },\n { color: '#B39DDB', label: 'Lavender', labelZh: '薰衣草' },\n { color: '#E5A06E', label: 'Apricot', labelZh: '杏橙' },\n { color: '#61AAA5', label: 'Teal', labelZh: '青瓷' },\n] as const;\n\nexport function copyText(options: { label?: string; format?: 'text' | 'raw' | 'syntax' | 'blocks' } = {}): SelectionAction {\n return {\n id: `copy-${options.format ?? 'text'}`, label: options.label ?? (context => context.locale.copy), icon: <ToolIcon name=\"copy\" />,\n successLabel: context => context.locale.copied, successIcon: <ToolIcon name=\"check\" />,\n run: async ({ selection }) => { const format = options.format ?? 'text'; await navigator.clipboard.writeText(format === 'text' ? selection.text : selection[format].sourceText); },\n };\n}\n\nexport interface HighlightOptions {\n colors?: readonly { color: string; label: string; labelZh?: string }[];\n}\nfunction HighlightSettings({ context, options }: { context: ToolbarActionContext; options: HighlightOptions }) {\n const { locale, highlight, highlightAppearance } = context;\n const color = highlightAppearance.color ?? defaultHighlight.color!;\n const style = highlightAppearance.style ?? 'background';\n const styles = [\n ['background', locale.highlightBackground], ['underline', locale.highlightUnderline],\n ['dotted', locale.highlightDotted], ['wavy', locale.highlightWavy],\n ] as const;\n const change = (nextColor: string, nextStyle: HighlightData['style']) => {\n const appearance = { ...highlightAppearance, color: nextColor, style: nextStyle };\n context.setHighlightAppearance(appearance);\n if (highlight) void context.run(current => current.updateAnnotation(highlight.id, { data: appearance }));\n };\n return <div className=\"limr-highlight-settings\">\n <fieldset disabled={context.busy}><legend>{locale.highlightStyle}</legend>\n <div className=\"limr-highlight-styles\">{styles.map(([value, label]) => <button key={value} type=\"button\" aria-pressed={style === value} onClick={() => change(color, value)}><ToolIcon name={value} /><span className=\"limr-highlight-style-label\"><span className=\"limr-underline\">{label}</span></span></button>)}</div>\n </fieldset>\n <fieldset disabled={context.busy}><legend>{locale.highlightColor}</legend>\n <div className=\"limr-highlight-colors\">{(options.colors ?? highlightColors).map(item => <button key={item.color} type=\"button\" className=\"limr-color-swatch\" aria-label={locale.highlight === '高亮' ? item.labelZh ?? item.label : item.label} title={locale.highlight === '高亮' ? item.labelZh ?? item.label : item.label} aria-pressed={color.toLowerCase() === item.color.toLowerCase()} style={{ '--swatch': item.color } as CSSProperties} onClick={() => change(item.color, style)}><ToolIcon name=\"check\" /></button>)}</div>\n </fieldset>\n </div>;\n}\n\n/** A single swatch owns all style choices; the highlight action never expands. */\nexport function highlightPalette(options: HighlightOptions = {}): SelectionAction {\n return {\n id: 'highlight-palette', label: context => context.locale.editHighlight, icon: <ToolIcon name=\"background\" />, placement: 'start',\n render: context => <button type=\"button\" className=\"limr-toolbar-swatch\" aria-label={context.locale.editHighlight} aria-expanded={context.expanded} disabled={context.busy} onClick={() => context.expanded ? context.collapse() : context.expand()} style={{ '--swatch': context.highlightAppearance.color ?? defaultHighlight.color } as CSSProperties} />,\n renderExpanded: context => <HighlightSettings context={context} options={options} />,\n };\n}\n\nexport function highlightSelection(): SelectionAction {\n return {\n id: 'highlight',\n label: context => !context.highlight ? context.locale.addHighlight : context.highlight.data?.hidden ? context.locale.showHighlight : context.locale.hideHighlight,\n icon: context => <ToolIcon name={!context.highlight ? 'highlight' : context.highlight.data?.hidden ? 'eye' : 'eye-off'} />,\n visible: context => !context.highlight || context.annotations.some(annotation => annotation.type !== 'highlight'),\n run: context => {\n if (context.highlight) context.updateAnnotation(context.highlight.id, { data: { ...context.highlight.data, hidden: !context.highlight.data?.hidden } });\n else {\n context.addAnnotation({ id: `highlight-${crypto.randomUUID()}`, type: 'highlight', data: { ...context.highlightAppearance, hidden: false }, anchors: context.selection.syntax.ranges.map(range => ({ range, documentId: context.document.id, quote: context.document.source.slice(range.start, range.end) })) });\n context.clearSelection();\n }\n },\n };\n}\n\nexport function deleteAnnotations(): SelectionAction {\n return {\n id: 'delete-annotations', label: context => context.locale.deleteAnnotations, icon: <ToolIcon name=\"trash\" />, placement: 'end', tone: 'danger',\n visible: context => context.annotations.length > 0,\n run: context => { context.removeAnnotationsAt([...context.selection.raw.ranges, ...context.selection.syntax.ranges]); context.activateAnnotation(null); context.clearSelection(); },\n };\n}\n"],"mappings":"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","names":["definition","highlights","syntax","useEffect","useRef","useState","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","aliases","result","tokens","useMemo","useRef","useEffect","useRef","Component","useCallback","useRef","node","element","parts","part","useEffect","useRef","useRef","jsx","useRef","jsx","useRef","element","useEffect","document","Fragment","jsx","jsxs","definition","Icon","mapping","end","start","value","mapped","identifier","Component","index","range","atomic","element","BlockView","useRef","useCallback","node","useEffect","ranges","key","useEffect","useEffect","useRef","jsx","first","last","line","useRef","useEffect","layer","active","atomic","parts","jsx","jsxs","document","useRef","useEffect","useRef","jsx","jsxs","useRef","Fragment","jsx","jsxs","jsx","jsxs","config","Preview","useMemo","Card","Content","useRef","useRef","useState","jsx","InlineMarker","useRef","useState","jsx","useState","useRef","Fragment","jsx","jsxs","useState","useRef","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","cache","mermaid","useState","useRef","useEffect","loading","useState","Fragment","jsx","jsxs","aliases","useState","Fragment","jsx","useMemo","fromMarkdown","jsx","identifier","Content","useMemo","fromMarkdown","definition","useState","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useRef","useState","loading","useEffect","useContext","useEffect","useMemo","useRef","useState","count","defaults","jsx","jsxs","defaults","useMemo","useRef","useState","useEffect","useContext","Fragment","jsx","jsxs","useState","names","jsx","createContext","useEffect","useMemo","useState","useRef","useContext","cache","useCallback","state","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","syntax","jsx","jsxs"]}