@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
@@ -1 +0,0 @@
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/annotations.tsx","../src/react/Markdown.tsx","../src/react/render.tsx","../src/react/text-binding.ts","../src/react/selection.ts","../src/react/source-geometry.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/blocks.tsx","../src/extensions/define.ts","../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/components/ToolIcon.tsx","../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 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 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 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 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 config.annotations ?? this.localAnnotations) {\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 : 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', micromark: [syntax()], mdast: gfmFromMarkdown(), scope: 'local' }; }\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';\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', micromark: [syntax()], mdast: [mathFromMarkdown()], scope: 'local', components: { math: MathNode, inlineMath: MathNode } };\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';\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 || code.length > (options.maxLength ?? 100_000)) return;\n let disposed = false;\n let release: (() => 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 => { if (!disposed) setResult({ code, tokens }); }).catch(() => { /* Plain source is a usable fallback. */ });\n }, pending ? 180 : 0);\n return () => { disposed = true; clearTimeout(timer); release?.(); };\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', scope: 'local', components: { code: CodeNode } };\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.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 { 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') 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 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 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]);\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={justify ?? configuredJustify}>\n {document.blocks.map(block => <BlockView key={block.id} block={block} runtime={runtime} components={components} extensions={extensions} 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, 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';\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 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; 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 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 }}>{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 = 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 mapping = useMemo(() => mapLiteral(source, node), [node]);\n const value = literalValue(node);\n const marks = context.marks.get(node) ?? emptyList;\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 node.value ?? '';\n const blockElement = node === context.block.node ? context.blockElement : undefined;\n const key = `${node.type}-${node.position?.start.offset ?? index}-${index}`;\n const childContext = node.type === 'list' ? { ...context, tightList: !node.spread } : context;\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 Renderer = runtime.components[node.type === 'component' ? node.name ?? '' : node.type];\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} 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 />; 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) => after?.length || trailing ? <Fragment key={key}>{element}{after?.map(occurrence => <AnnotationMarker key={occurrence.id} occurrence={occurrence} />)}{trailing}</Fragment> : element;\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, decorations, footnoteId }: { block: Block; runtime: ReaderRuntime; decorations: BlockDecorations; footnoteId?: string } & Pick<ViewConfiguration, 'components' | 'extensions'>) {\n const element = useRef<HTMLElement | null>(null);\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), [root, runtime, components, extensions]);\n const compact = !!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, blockElement: { id: block.id, range: block.range, pending: block.pending, ref: observe } };\n if (footnoteId) return <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>;\n return renderNode(block.node, context);\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 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} 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>>): 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]) { 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 { useEffect } from 'react';\nimport { selectionFromRange, type SelectionSnapshot, type SourceRange } from '../core';\nimport type { ReaderRuntime } from './runtime';\nimport { leavesIn } 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 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 = document.createRange();\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 options = {\n text: selection.toString(), settled: !dragging,\n quality: (!start.exact || !end.exact ? 'unmapped' : start.atomic || end.atomic ? 'atomic' : 'exact') as SelectionSnapshot['quality'],\n };\n runtime.updateInteraction({ activeHighlight: null, selection: visualSelection(runtime, range, options) ?? selectionFromRange(runtime.document.getSnapshot(), { start: start.offset, end: end.offset }, options) });\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 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 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); };\n }, [runtime, enabled]);\n}\n","import type { SourceRange } from '../core';\nimport { intersects } from '../core/tree';\nimport type { ReaderRuntime, SourceBinding } from './runtime';\n\nexport interface Leaf {\n node: Text | HTMLElement;\n kind: 'text' | 'marker' | 'inline' | 'block' | 'image';\n range: SourceRange;\n flow: HTMLElement;\n binding?: SourceBinding;\n offset: number;\n}\nexport interface Viewport { top: number; bottom: number; left: number; right: number }\n\nfunction flowOf(element: HTMLElement, container: HTMLElement): HTMLElement {\n const known = element.closest<HTMLElement>('pre,p,figcaption,li,th,td,h1,h2,h3,h4,h5,h6,.limr-choice-text,.limr-definition-title,.limr-question-title,.limr-block-content');\n return known && container.contains(known) ? known : element.closest<HTMLElement>('[data-limr-block]') ?? container;\n}\n\nexport function leavesIn(block: HTMLElement, runtime: ReaderRuntime): Leaf[] {\n runtime.prepareTextBindings(block);\n const result: Leaf[] = [];\n const visit = (node: Node, inherited?: { binding: SourceBinding; offset: number }) => {\n if (node instanceof HTMLElement) {\n if (node !== block && node.hasAttribute('data-limr-document') || node.hasAttribute('inert')) return;\n const marker = node.dataset.limrMarker;\n const atomic = node.dataset.limrAtomic;\n if (marker || atomic) {\n const image = node.dataset.limrMedia === 'image';\n result.push({ node, kind: marker ? 'marker' : image ? 'image' : atomic === 'block' ? 'block' : 'inline', range: { start: Number(node.dataset.sourceStart), end: Number(node.dataset.sourceEnd) }, flow: image ? node : flowOf(node, runtime.content!), offset: 0 });\n return;\n }\n if (node.hasAttribute('data-limr-ignore')) return;\n const binding = runtime.bindings.get(node);\n if (binding) inherited = { binding, offset: 0 };\n }\n if (node.nodeType === Node.TEXT_NODE) {\n const binding = runtime.bindings.get(node) ?? inherited?.binding;\n const offset = runtime.bindings.has(node) ? 0 : inherited?.offset ?? 0;\n const length = node.textContent?.length ?? 0;\n if (binding?.resolve && length) result.push({ node: node as Text, kind: 'text', range: { start: binding.resolve(offset, 'start'), end: binding.resolve(offset + length, 'end') }, flow: flowOf(node.parentElement!, runtime.content!), binding, offset });\n if (inherited) inherited.offset += length;\n return;\n }\n node.childNodes.forEach(child => visit(child, inherited));\n };\n visit(block);\n return result;\n}\n\nexport function textRange(leaf: Leaf, source: SourceRange, viewport?: Viewport): Range | null {\n const node = leaf.node as Text, length = node.length;\n const resolve = leaf.binding!.resolve!;\n // Binary searches preserve decoded entities, surrogate pairs and source gaps.\n let lo = 0, hi = length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (resolve(leaf.offset + mid + 1, 'end') <= source.start) lo = mid + 1; else hi = mid; }\n let start = lo;\n lo = start; hi = length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (resolve(leaf.offset + mid, 'start') < source.end) lo = mid + 1; else hi = mid; }\n if (start === lo) return null;\n let end = lo;\n const range = document.createRange();\n // A single unwrapped text node can contain a book or a large code fence.\n // Bound its native Range before requesting line rectangles.\n if (viewport && end - start > 1024) {\n range.setStart(node, start); range.setEnd(node, end);\n const box = range.getBoundingClientRect();\n if (box.height > viewport.bottom - viewport.top + 80) {\n lo = start; hi = end;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n range.setStart(node, mid); range.setEnd(node, mid + 1);\n if (range.getBoundingClientRect().bottom < viewport.top) lo = mid + 1; else hi = mid;\n }\n start = lo; hi = end;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n range.setStart(node, mid); range.setEnd(node, mid + 1);\n if (range.getBoundingClientRect().top <= viewport.bottom) lo = mid + 1; else hi = mid;\n }\n end = lo;\n }\n }\n if (start === end) return null;\n range.setStart(node, start); range.setEnd(node, end); return range;\n}\n\n/** First rendered character of a source range, independent of its trailing marker. */\nexport function sourceRangeStartRect(runtime: ReaderRuntime, source: SourceRange): DOMRect | null {\n for (const block of runtime.document.getSnapshot().blocks) {\n if (!intersects(block.range, source)) continue;\n const element = runtime.blocks.get(block.id);\n if (!element) continue;\n for (const leaf of leavesIn(element, runtime)) {\n if (leaf.kind === 'marker' || !intersects(leaf.range, source)) continue;\n if (leaf.kind === 'text') {\n const range = textRange(leaf, source);\n if (!range) continue;\n const node = leaf.node as Text, end = range.endOffset;\n // Measure a character rather than the full range: book-length anchors\n // must not create thousands of line rectangles just to locate a card.\n for (let start = range.startOffset; start < end;) {\n const next = Math.min(end, start + (node.data.codePointAt(start)! > 0xffff ? 2 : 1));\n range.setStart(node, start); range.setEnd(node, next);\n const rect = range.getBoundingClientRect();\n if (rect.width && rect.height) return rect;\n start = next;\n }\n } else {\n const node = leaf.node as HTMLElement;\n const rect = (node.querySelector(leaf.kind === 'image' ? 'img' : '[data-limr-selection-surface]') ?? node).getBoundingClientRect();\n if (rect.width && rect.height) return rect;\n }\n }\n }\n return null;\n}\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, 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 = document.createRange();\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 = document.createRange(); 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 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 return [...aligned, ...bridges];\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 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 if (block.element.getBoundingClientRect().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 if (!leaves) { leaves = leavesIn(block.element, runtime); leavesCache.set(block.element, leaves); }\n for (const task of tasks) {\n const rects = 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 paint.style.top = `${viewport.top - origin.top + scrollTop}px`;\n paint.style.height = `${Math.max(0, viewport.bottom - viewport.top)}px`;\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 }>();\n for (const { rect, task } of output) if (!task.selection && !hostGeometry.has(rect.flow)) {\n const host = rect.flow, box = host.getBoundingClientRect();\n hostGeometry.set(host, { box, top: Math.max(viewport.top, box.top) - box.top - host.clientTop + host.scrollTop, positioned: getComputedStyle(host).position !== 'static' });\n }\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 - host.clientLeft + host.scrollLeft;\n top += viewport.top - geometry.box.top - host.clientTop + host.scrollTop - 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 layer of [paint, ...highlightLayers.values()]) while (layer.children.length > (counts.get(layer) ?? 0)) layer.lastChild!.remove();\n for (const [host, layer] of highlightLayers) if (!counts.has(layer)) removeLayer(host, layer);\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(); invalidate(); };\n const unsubscribers = [runtime.interaction.subscribe(() => {\n const state = runtime.interaction.get(), selection = state.selection;\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 (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(); schedule();\n }), runtime.layout.subscribe(invalidate), runtime.documentOffset.subscribe(schedule), runtime.configuration.subscribe(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); else blocks = undefined;\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 = () => { runtime.hoverHighlight(null); schedule(); };\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 { 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', 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', 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', 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 { 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}\n/** A tag/directive adapter with original source positions and streaming recovery. */\nexport function defineBlock({ name, component, tags = [name], directives = [name], selection = 'content' }: BlockExtensionOptions): RendererExtension {\n return { name, tags, directives, selection, 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 { useEffect, useState, 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 const [present, setPresent] = useState(open);\n useEffect(() => {\n if (open) { setPresent(true); return; }\n const timer = setTimeout(() => setPresent(false), 420);\n return () => clearTimeout(timer);\n }, [open]);\n return <details className=\"limr-disclosure\" open={present || 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 { 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', tags: ['video', 'md-video'], component: options.component ?? Video, selection: 'atomic' });\n}\n","import { 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', 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 { 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(), definition(), question(), extras(), video(), figures(), citation(), translations()]; }\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';\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 {['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 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","result","tokens","useMemo","useRef","useEffect","useRef","useRef","node","element","parts","part","Fragment","jsx","jsxs","definition","mapping","end","start","identifier","index","range","atomic","element","BlockView","useRef","node","useEffect","atomic","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","useMemo","useRef","useRef","useState","jsx","InlineMarker","useRef","useState","jsx","useState","useRef","Fragment","jsx","jsxs","useState","useRef","useState","useEffect","useState","jsx","jsxs","useState","useEffect","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","Fragment","jsx","jsxs","jsx","jsxs"]}