@linloir/limr 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.en.md +123 -0
  2. package/README.md +63 -138
  3. package/dist/base.css +10 -7
  4. package/dist/{chunk-65V5OZ4G.js → chunk-3ILUZKDB.js} +77 -17
  5. package/dist/chunk-3ILUZKDB.js.map +1 -0
  6. package/dist/{chunk-ETHLPBKQ.js → chunk-N77VD2YR.js} +96 -51
  7. package/dist/chunk-N77VD2YR.js.map +1 -0
  8. package/dist/{chunk-7JF5HHVF.js → chunk-TTISGBST.js} +14 -1
  9. package/dist/{chunk-7JF5HHVF.js.map → chunk-TTISGBST.js.map} +1 -1
  10. package/dist/core/index.d.ts +6 -3
  11. package/dist/core/index.js +3 -1
  12. package/dist/extensions/index.d.ts +2 -2
  13. package/dist/extensions/index.js +2 -2
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.js +7 -3
  16. package/dist/react/index.d.ts +4 -3
  17. package/dist/react/index.js +5 -3
  18. package/dist/styles.css +10 -7
  19. package/dist/{translations-BliabrPd.d.ts → translations-DHnYMg4h.d.ts} +11 -3
  20. package/docs/README.md +13 -0
  21. package/docs/api.md +5 -158
  22. package/docs/assets/rendered.svg +9 -0
  23. package/docs/assets/source.svg +9 -0
  24. package/docs/en/README.md +26 -0
  25. package/docs/en/ai-skills.md +57 -0
  26. package/docs/en/annotations.md +84 -0
  27. package/docs/en/api.md +107 -0
  28. package/docs/en/architecture.md +33 -0
  29. package/docs/en/extensions.md +159 -0
  30. package/docs/en/getting-started.md +67 -0
  31. package/docs/en/integration.md +130 -0
  32. package/docs/en/modules.md +80 -0
  33. package/docs/en/performance.md +53 -0
  34. package/docs/en/plugin-packages.md +68 -0
  35. package/docs/en/styles.md +80 -0
  36. package/docs/en/syntax.md +352 -0
  37. package/docs/extensions.md +5 -306
  38. package/docs/implementation.md +5 -76
  39. package/docs/performance.md +5 -81
  40. package/docs/screenshots/blocks.png +0 -0
  41. package/docs/screenshots/dark.png +0 -0
  42. package/docs/screenshots/desktop.png +0 -0
  43. package/docs/screenshots/plugin-mobile.png +0 -0
  44. package/docs/styles.md +5 -100
  45. package/docs/visual-upgrade.md +5 -145
  46. package/docs/zh-CN/README.md +26 -0
  47. package/docs/zh-CN/ai-skills.md +57 -0
  48. package/docs/zh-CN/annotations.md +84 -0
  49. package/docs/zh-CN/api.md +107 -0
  50. package/docs/zh-CN/architecture.md +33 -0
  51. package/docs/zh-CN/extensions.md +159 -0
  52. package/docs/zh-CN/getting-started.md +67 -0
  53. package/docs/zh-CN/integration.md +130 -0
  54. package/docs/zh-CN/modules.md +80 -0
  55. package/docs/zh-CN/performance.md +53 -0
  56. package/docs/zh-CN/plugin-packages.md +68 -0
  57. package/docs/zh-CN/styles.md +80 -0
  58. package/docs/zh-CN/syntax.md +352 -0
  59. package/examples/notes.tsx +18 -11
  60. package/examples/packages/paper-theme/index.css +25 -0
  61. package/examples/packages/paper-theme/package.json +7 -0
  62. package/examples/packages/reading-tools/index.d.ts +2 -0
  63. package/examples/packages/reading-tools/index.js +25 -0
  64. package/examples/packages/reading-tools/package.json +16 -0
  65. package/package.json +9 -5
  66. package/skills/limr-plugin-development/SKILL.md +22 -0
  67. package/skills/limr-plugin-development/agents/openai.yaml +4 -0
  68. package/skills/limr-plugin-development/assets/plugin-template/README.md +30 -0
  69. package/skills/limr-plugin-development/assets/plugin-template/package.json +36 -0
  70. package/skills/limr-plugin-development/assets/plugin-template/src/index.tsx +50 -0
  71. package/skills/limr-plugin-development/assets/plugin-template/src/styles.css +9 -0
  72. package/skills/limr-plugin-development/assets/plugin-template/tsconfig.json +20 -0
  73. package/skills/limr-plugin-development/assets/plugin-template/tsup.config.ts +8 -0
  74. package/skills/limr-plugin-development/references/contract.md +45 -0
  75. package/skills/limr-use/SKILL.md +23 -0
  76. package/skills/limr-use/agents/openai.yaml +4 -0
  77. package/skills/limr-use/references/integration.md +41 -0
  78. package/skills/limr-use/references/syntax.md +17 -0
  79. package/dist/chunk-65V5OZ4G.js.map +0 -1
  80. package/dist/chunk-ETHLPBKQ.js.map +0 -1
@@ -19,17 +19,17 @@ import {
19
19
  useSelection,
20
20
  useStoreSelector,
21
21
  useTheme
22
- } from "./chunk-65V5OZ4G.js";
22
+ } from "./chunk-3ILUZKDB.js";
23
23
  import {
24
+ annotationReferenceRange,
24
25
  defaultHighlight,
25
26
  intersects,
26
27
  mapText,
27
28
  rangeOf,
28
29
  resolveAnnotationAnchors,
29
30
  sameRange,
30
- selectionFromRange,
31
- textContent
32
- } from "./chunk-7JF5HHVF.js";
31
+ selectionFromRange
32
+ } from "./chunk-TTISGBST.js";
33
33
 
34
34
  // src/components/Reader.tsx
35
35
  import { useEffect as useEffect7, useId as useId2, useRef as useRef5, useState as useState5 } from "react";
@@ -236,39 +236,29 @@ function AnnotationGroup({ occurrence, presentation, expanded = true, enabled =
236
236
 
237
237
  // src/components/annotation-reference.ts
238
238
  function annotationReferenceText(document2, occurrence) {
239
- const blocks = document2.blocks.filter((block) => intersects(block.range, occurrence.range));
239
+ const referenceRange = annotationReferenceRange(document2, occurrence);
240
+ const blocks = document2.blocks.filter((block) => intersects(block.range, referenceRange));
240
241
  let reference = "";
241
- if (occurrence.embedded) {
242
- let context;
243
- const visit = (node) => {
244
- if (!intersects(rangeOf(node), occurrence.range)) return;
245
- if (["paragraph", "heading", "listItem"].includes(node.type)) context = node;
246
- node.children?.forEach(visit);
247
- };
248
- blocks.forEach((block) => visit(block.node));
249
- reference = context ? textContent(context) : "";
250
- } else {
251
- const visit = (node) => {
252
- const range = rangeOf(node);
253
- if (!intersects(range, occurrence.range) || ["annotationReference", "footnoteReference", "annotationDefinition", "definition"].includes(node.type)) return;
254
- if (node.value !== void 0) {
255
- const mapping = mapText(document2.source, node.value, range);
256
- reference += node.value.split("").filter((_, index) => mapping.ends[index] > occurrence.range.start && mapping.starts[index] < occurrence.range.end).join("");
257
- } else if (node.type === "image") reference += String(node.alt ?? "");
258
- else node.children?.forEach(visit);
259
- };
260
- blocks.forEach((block, index) => {
261
- if (index) reference += " ";
262
- visit(block.node);
263
- });
264
- reference ||= occurrence.quote ?? document2.source.slice(occurrence.range.start, occurrence.range.end);
265
- }
242
+ const visit = (node) => {
243
+ const range = rangeOf(node);
244
+ if (!intersects(range, referenceRange) || ["annotationReference", "footnoteReference", "annotationDefinition", "definition"].includes(node.type)) return;
245
+ if (node.value !== void 0) {
246
+ const mapping = mapText(document2.source, node.value, range);
247
+ reference += node.value.split("").filter((_, index) => mapping.ends[index] > referenceRange.start && mapping.starts[index] < referenceRange.end).join("");
248
+ } else if (node.type === "image") reference += String(node.alt ?? "");
249
+ else node.children?.forEach(visit);
250
+ };
251
+ blocks.forEach((block, index) => {
252
+ if (index) reference += " ";
253
+ visit(block.node);
254
+ });
255
+ if (!occurrence.embedded) reference ||= occurrence.quote ?? document2.source.slice(referenceRange.start, referenceRange.end);
266
256
  return reference.replace(/\s+/g, " ").trim();
267
257
  }
268
258
 
269
259
  // src/components/AnnotationSidebar.tsx
270
260
  import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
271
- var alignSidebar = (items, { activeId, gap, height }) => {
261
+ var alignSidebar = (items, { activeId, gap, height, prioritizeActive }) => {
272
262
  const positions = items.map((item) => item.anchorTop);
273
263
  const activeIndex = items.findIndex((item) => item.id === activeId);
274
264
  const pivot = activeIndex < 0 ? 0 : activeIndex;
@@ -277,8 +267,9 @@ var alignSidebar = (items, { activeId, gap, height }) => {
277
267
  for (let i = pivot - 1; i >= 0; i--) positions[i] = Math.min(items[i].anchorTop, positions[i + 1] - items[i].height - gap);
278
268
  for (let i = pivot + 1; i < items.length; i++) positions[i] = Math.max(items[i].anchorTop, positions[i - 1] + items[i - 1].height + gap);
279
269
  if (height !== void 0 && items.reduce((sum, item) => sum + item.height, gap * (items.length - 1)) <= height) {
280
- for (let i = items.length - 1; i >= 0; i--) positions[i] = Math.min(positions[i], (i === items.length - 1 ? height : positions[i + 1] - gap) - items[i].height);
281
- for (let i = 0; i < items.length; i++) positions[i] = Math.max(positions[i], i === 0 ? 0 : positions[i - 1] + items[i - 1].height + gap);
270
+ const start = prioritizeActive && activeIndex >= 0 ? pivot + 1 : 0;
271
+ for (let i = items.length - 1; i >= start; i--) positions[i] = Math.min(positions[i], (i === items.length - 1 ? height : positions[i + 1] - gap) - items[i].height);
272
+ if (start || activeIndex < 0 || positions[0] >= 0) for (let i = start; i < items.length; i++) positions[i] = Math.max(positions[i], i === 0 ? 0 : positions[i - 1] + items[i - 1].height + gap);
282
273
  }
283
274
  return new Map(items.map((item, index) => [item.id, positions[index]]));
284
275
  };
@@ -298,12 +289,16 @@ function AnnotationSidebar({ sync = "document", gap = 14, positioner = alignSide
298
289
  const rail = useRef2(null);
299
290
  const cards = useRef2(/* @__PURE__ */ new Map());
300
291
  const [sizes, setSizes] = useState2(/* @__PURE__ */ new Map());
292
+ const [minimumSizes, setMinimumSizes] = useState2(/* @__PURE__ */ new Map());
301
293
  const [anchorTops, setAnchorTops] = useState2(/* @__PURE__ */ new Map());
302
294
  const [railHeight, setRailHeight] = useState2(0);
303
- const measured = useRef2({ sizes: /* @__PURE__ */ new Map(), height: 0 });
295
+ const measured = useRef2({ sizes: /* @__PURE__ */ new Map(), minimum: /* @__PURE__ */ new Map(), height: 0 });
304
296
  const resizeFrame = useRef2(0);
305
297
  const [viewportTop, setViewportTop] = useState2(0);
298
+ const [viewportHeight, setViewportHeight] = useState2(0);
306
299
  const [cardLock, setCardLock] = useState2(null);
300
+ const lastFocus = useRef2(null);
301
+ const [release, setRelease] = useState2(null);
307
302
  const occurrences = useMemo(() => {
308
303
  const values = [...decorations.occurrences].sort((a, b) => a.range.start - b.range.start || a.range.end - b.range.end || a.id.localeCompare(b.id));
309
304
  if (sync === "none") {
@@ -318,13 +313,20 @@ function AnnotationSidebar({ sync = "document", gap = 14, positioner = alignSide
318
313
  })])), [decorations, occurrences]);
319
314
  const measure = useCallback((beforePaint = false) => {
320
315
  const next = /* @__PURE__ */ new Map();
321
- cards.current.forEach((element2, id) => next.set(id, element2.getBoundingClientRect().height));
316
+ const minimum = /* @__PURE__ */ new Map();
317
+ cards.current.forEach((element2, id) => {
318
+ const height2 = element2.getBoundingClientRect().height;
319
+ next.set(id, height2);
320
+ const panels = [...element2.querySelectorAll(":scope > .limr-sidebar-card-body > .limr-collapse")];
321
+ minimum.set(id, height2 - panels.reduce((sum, panel) => sum + panel.getBoundingClientRect().height, 0));
322
+ });
322
323
  const height = rail.current?.getBoundingClientRect().height ?? 0;
323
324
  const old = measured.current;
324
- if (old.height === height && old.sizes.size === next.size && [...next].every(([id, size2]) => size2 === old.sizes.get(id))) return;
325
- measured.current = { sizes: next, height };
325
+ if (old.height === height && old.sizes.size === next.size && [...next].every(([id, size2]) => size2 === old.sizes.get(id) && Math.abs(minimum.get(id) - (old.minimum.get(id) ?? 0)) < 0.5)) return;
326
+ measured.current = { sizes: next, minimum, height };
326
327
  const update = () => {
327
328
  setSizes(next);
329
+ setMinimumSizes(minimum);
328
330
  setRailHeight(height);
329
331
  };
330
332
  if (!beforePaint) {
@@ -357,13 +359,19 @@ function AnnotationSidebar({ sync = "document", gap = 14, positioner = alignSide
357
359
  for (const occurrence of occurrences) {
358
360
  const marker = runtime.anchors.get(occurrence.id);
359
361
  if (!marker || marker.closest("[inert]")) continue;
360
- const rect = !occurrence.embedded && sourceRangeStartRect(runtime, occurrence.range);
362
+ const rect = sourceRangeStartRect(runtime, decorations.referenceRanges.get(occurrence.id) ?? occurrence.range);
361
363
  values.set(occurrence.id, (rect || marker.getBoundingClientRect()).top - top - displacement2);
362
364
  }
363
365
  setAnchorTops((old) => old.size === values.size && [...values].every(([id, value]) => Math.abs(value - (old.get(id) ?? -Infinity)) < 0.5) ? old : values);
364
- }, [runtime, occurrences, layout, sync]);
366
+ }, [runtime, decorations.referenceRanges, occurrences, layout, sync]);
365
367
  useIsomorphicLayoutEffect(() => {
366
- if (sync === "document" && rail.current) setViewportTop(Math.max(0, runtime.getViewportTop() - rail.current.getBoundingClientRect().top + (runtime.configuration.get().scrollOffset ?? 24)));
368
+ if (sync !== "document" || !rail.current) return;
369
+ const root = runtime.configuration.get().scrollRoot;
370
+ const bounds = rail.current.getBoundingClientRect();
371
+ const top = Math.max(bounds.top, runtime.getViewportTop() + (root?.clientTop ?? 0), window.visualViewport?.offsetTop ?? 0);
372
+ const bottom = Math.min(bounds.bottom, root ? runtime.getViewportTop() + root.clientTop + root.clientHeight : Infinity, (window.visualViewport?.offsetTop ?? 0) + (window.visualViewport?.height ?? innerHeight));
373
+ setViewportTop(Math.max(0, top - bounds.top + (runtime.configuration.get().scrollOffset ?? 24)));
374
+ setViewportHeight(Math.max(0, bottom - top));
367
375
  }, [runtime, layout, viewport, sync]);
368
376
  useEffect4(() => {
369
377
  const dismiss = (event) => {
@@ -395,15 +403,52 @@ function AnnotationSidebar({ sync = "document", gap = 14, positioner = alignSide
395
403
  if (sync !== "none") items.sort((a, b) => (anchorTops.get(a.id) ?? 0) - (anchorTops.get(b.id) ?? 0));
396
404
  const readingId = items.find((item) => (anchorTops.get(item.id) ?? 0) >= viewportTop)?.id ?? items.at(-1)?.id ?? null;
397
405
  const alignmentId = hovered ?? active ?? readingId;
406
+ const focusedId = hovered ?? active;
398
407
  const source = hovered ? hoverSource : active ? activeSource : null;
399
408
  const locked = source === "sidebar" && cardLock?.id === alignmentId ? cardLock : null;
409
+ const lockedTop = locked?.top;
410
+ useIsomorphicLayoutEffect(() => {
411
+ const previous = lastFocus.current;
412
+ lastFocus.current = focusedId ? { id: focusedId, top: lockedTop } : null;
413
+ if (focusedId || sync !== "document" || !rail.current || matchMedia("(prefers-reduced-motion: reduce)").matches) {
414
+ setRelease(null);
415
+ return;
416
+ }
417
+ if (!previous) return;
418
+ const style2 = getComputedStyle(rail.current), value = style2.getPropertyValue("--limr-motion-slow").trim();
419
+ const milliseconds = parseFloat(value) * (value.endsWith("ms") ? 1 : 1e3);
420
+ const duration = Number.isFinite(milliseconds) ? Math.max(0, milliseconds) : 460;
421
+ if (!duration) {
422
+ setRelease(null);
423
+ return;
424
+ }
425
+ const motion = rail.current.animate([{}, {}], { duration, easing: style2.getPropertyValue("--limr-ease").trim() || "ease-out" });
426
+ setRelease({ ...previous, progress: 0 });
427
+ let frame = 0;
428
+ const step = () => {
429
+ if (motion.playState === "finished") {
430
+ setRelease(null);
431
+ return;
432
+ }
433
+ setRelease({ ...previous, progress: motion.effect?.getComputedTiming().progress ?? 0 });
434
+ frame = requestAnimationFrame(step);
435
+ };
436
+ frame = requestAnimationFrame(step);
437
+ return () => {
438
+ cancelAnimationFrame(frame);
439
+ motion.cancel();
440
+ };
441
+ }, [focusedId, lockedTop, sync]);
400
442
  const sidebarItems = items.map((item) => ({ id: item.id, anchorTop: anchorTops.get(item.id) ?? 0, height: sizes.get(item.id) ?? 80 }));
401
- const positionContext = { activeId: alignmentId, gap, height: sync === "document" && railHeight > 0 ? railHeight : void 0 };
402
- const positions = positioner(locked ? sidebarItems.map((item) => item.id === locked.id ? { ...item, anchorTop: locked.top } : item) : sidebarItems, positionContext);
443
+ const positionContext = { activeId: alignmentId, gap, height: sync === "document" && railHeight > 0 ? railHeight : void 0, prioritizeActive: !!(hovered || active) };
444
+ const positions = new Map(positioner(locked ? sidebarItems.map((item) => item.id === locked.id ? { ...item, anchorTop: locked.top } : item) : sidebarItems, positionContext));
445
+ const releasing = !focusedId && release;
446
+ if (releasing) {
447
+ const origin = positioner(sidebarItems.map((item) => item.id === releasing.id && releasing.top !== void 0 ? { ...item, anchorTop: releasing.top } : item), { ...positionContext, activeId: releasing.id, prioritizeActive: true });
448
+ for (const [id, top] of positions) positions.set(id, top + ((origin.get(id) ?? top) - top) * (1 - releasing.progress));
449
+ }
403
450
  const lockedAnchor = locked ? anchorTops.get(locked.id) ?? locked.top : 0;
404
- const anchorFits = lockedAnchor >= 0 && lockedAnchor + (sizes.get(locked?.id ?? "") ?? 80) <= railHeight;
405
- const lockFits = locked && (positions.get(locked.id) ?? locked.top) >= locked.top - 0.5;
406
- const displacement = sync === "document" && locked && anchorFits && lockFits ? (positions.get(locked.id) ?? locked.top) - lockedAnchor : 0;
451
+ const displacement = sync === "document" && locked ? (positions.get(locked.id) ?? locked.top) - lockedAnchor : 0;
407
452
  useIsomorphicLayoutEffect(() => {
408
453
  if (sync === "document") runtime.documentOffset.set(displacement);
409
454
  }, [runtime, displacement, sync]);
@@ -413,17 +458,17 @@ function AnnotationSidebar({ sync = "document", gap = 14, positioner = alignSide
413
458
  if (card && rail.current) {
414
459
  const origin = rail.current.getBoundingClientRect().top;
415
460
  const top = card.getBoundingClientRect().top - origin;
416
- const anchorTop = anchorTops.get(id) ?? top;
417
- const boundedTop = positioner(sidebarItems, { ...positionContext, activeId: id }).get(id) ?? anchorTop;
418
- setCardLock({ id, top: boundedTop < anchorTop - 0.5 ? anchorTop : top });
461
+ setCardLock({ id, top });
419
462
  }
420
463
  };
421
- return /* @__PURE__ */ jsx3("aside", { ref: rail, "aria-label": locale.annotations, className: `limr-sidebar ${className ?? ""}`, "data-sync": sync, "data-limr-theme": theme, "data-limr-appearance": appearance, style, children: items.map((occurrence) => {
464
+ return /* @__PURE__ */ jsx3("aside", { ref: rail, "aria-label": locale.annotations, className: `limr-sidebar ${className ?? ""}`, "data-sync": sync, "data-releasing": releasing ? "" : void 0, "data-limr-theme": theme, "data-limr-appearance": appearance, style, children: items.map((occurrence) => {
422
465
  const annotation = decorations.annotations.get(occurrence.annotationIds[0]);
423
466
  const definition = runtime.annotationTypes.get(annotation?.type ?? "citation");
424
467
  const isActive = active === occurrence.id;
425
468
  const palette = definition?.sidebar;
426
469
  const Preview = palette?.Preview;
470
+ const available = source === "marker" && alignmentId === occurrence.id && !isActive ? Math.max(minimumSizes.get(occurrence.id) ?? 80, railHeight - (anchorTops.get(occurrence.id) ?? 0)) : railHeight;
471
+ const cardHeight = isActive ? Math.min(available, Math.max(minimumSizes.get(occurrence.id) ?? 80, viewportHeight || railHeight)) : available;
427
472
  const cardStyle = {
428
473
  "--limr-annotation-color": palette?.color ?? definition?.color,
429
474
  "--limr-annotation-border": palette?.borderColor,
@@ -436,7 +481,7 @@ function AnnotationSidebar({ sync = "document", gap = 14, positioner = alignSide
436
481
  position: "absolute",
437
482
  top: positions.get(occurrence.id) ?? 0,
438
483
  insetInline: 0,
439
- "--limr-sidebar-card-height": `${railHeight}px`
484
+ "--limr-sidebar-card-height": `${cardHeight}px`
440
485
  } : { marginBlockEnd: gap }
441
486
  };
442
487
  const collapseOnContentClick = occurrence.annotationIds.every((id) => runtime.annotationTypes.get(decorations.annotations.get(id)?.type ?? "")?.sidebar?.collapseOnContentClick);
@@ -1190,4 +1235,4 @@ export {
1190
1235
  SelectionToolbar,
1191
1236
  Reader
1192
1237
  };
1193
- //# sourceMappingURL=chunk-ETHLPBKQ.js.map
1238
+ //# sourceMappingURL=chunk-N77VD2YR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Reader.tsx","../src/components/TableOfContents.tsx","../src/react/overflow-fade.ts","../src/components/AnnotationSidebar.tsx","../src/components/AnnotationContent.tsx","../src/components/annotation-reference.ts","../src/components/AnnotationOverlay.tsx","../src/components/card-motion.ts","../src/components/SelectionToolbar.tsx"],"sourcesContent":["import { useEffect, useId, useRef, useState, type CSSProperties } from 'react';\nimport { useAppearance, DocumentProvider, useIsomorphicLayoutEffect, useLocale, useRuntime, useStoreSelector, useTheme, type DocumentProviderProps } from '../react/context';\nimport { Markdown } from '../react/Markdown';\nimport type { SelectionAction, StyledProps } from '../react/types';\nimport { TableOfContents } from './TableOfContents';\nimport { AnnotationSidebar } from './AnnotationSidebar';\nimport { AnnotationOverlay } from './AnnotationOverlay';\nimport { SelectionToolbar } from './SelectionToolbar';\nimport { Collapse } from './Collapse';\nimport { useOverflowFade } from '../react/overflow-fade';\n\nexport interface ReaderProps extends Omit<DocumentProviderProps, 'children'>, StyledProps {\n actions?: readonly SelectionAction[];\n toc?: boolean;\n sidebar?: boolean;\n followOutput?: boolean;\n sidebarBreakpoint?: number;\n /** Fill unused viewport height without deriving the layout from annotations. */\n fillHeight?: boolean;\n}\nexport function Reader({ actions, toc = true, sidebar = true, followOutput = false, sidebarBreakpoint = 1120, fillHeight = true, className, style, ...provider }: ReaderProps) {\n return <DocumentProvider {...provider}><ReaderLayout actions={actions} toc={toc} sidebar={sidebar} followOutput={followOutput} sidebarBreakpoint={sidebarBreakpoint} fillHeight={fillHeight} className={className} style={style} /></DocumentProvider>;\n}\nfunction ReaderLayout({ actions, toc, sidebar, followOutput, sidebarBreakpoint, fillHeight, className, style }: Pick<ReaderProps, 'actions' | 'toc' | 'sidebar' | 'followOutput' | 'className' | 'style' | 'fillHeight'> & { sidebarBreakpoint: number }) {\n const runtime = useRuntime();\n const scrollRoot = useStoreSelector(runtime.configuration, config => config.scrollRoot);\n const layout = useStoreSelector(runtime.layout, value => value);\n const appearance = useAppearance();\n const theme = useTheme();\n const ref = useRef<HTMLDivElement>(null);\n const tocRail = useRef<HTMLDivElement>(null);\n const content = useRef<HTMLElement>(null);\n useOverflowFade(content, runtime, ':scope > .limr-prose');\n const [width, setWidth] = useState(0);\n const [availableHeight, setAvailableHeight] = useState(0);\n useIsomorphicLayoutEffect(() => {\n if (!fillHeight || !ref.current) return;\n // Use the origin in scroll coordinates. Scrolling must not grow/shrink the\n // reading canvas and feed back into the page's scroll range.\n const origin = ref.current.getBoundingClientRect().top - runtime.getViewportTop() - (scrollRoot?.clientTop ?? 0) + runtime.getScrollTop();\n setAvailableHeight(Math.max(0, (scrollRoot?.clientHeight ?? window.innerHeight) - origin));\n }, [runtime, scrollRoot, fillHeight, layout, width]);\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n const observer = new ResizeObserver(() => { setWidth(element.clientWidth); runtime.requestLayout(); });\n observer.observe(element);\n if (scrollRoot) observer.observe(scrollRoot);\n if (element.parentElement) observer.observe(element.parentElement);\n setWidth(element.clientWidth);\n return () => observer.disconnect();\n }, [runtime, scrollRoot, sidebarBreakpoint]);\n useIsomorphicLayoutEffect(() => {\n const rail = tocRail.current;\n if (!rail) return;\n let frame = 0;\n const measure = () => {\n frame = 0;\n if (!rail.clientWidth) return;\n const viewport = window.visualViewport;\n let top = viewport?.offsetTop ?? 0, bottom = top + (viewport?.height ?? window.innerHeight);\n if (scrollRoot) {\n const origin = scrollRoot.getBoundingClientRect().top + scrollRoot.clientTop;\n top = Math.max(top, origin); bottom = Math.min(bottom, origin + scrollRoot.clientHeight);\n }\n const reader = ref.current!.getBoundingClientRect();\n // A reader that has left the viewport must not cover the next reader.\n rail.toggleAttribute('inert', reader.bottom <= top || reader.top >= bottom);\n const height = `${Math.max(0, bottom - Math.max(top, rail.getBoundingClientRect().top)).toFixed(2)}px`;\n if (rail.style.getPropertyValue('--limr-toc-available-height') !== height) rail.style.setProperty('--limr-toc-available-height', height);\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(measure); };\n const unsubscribe = [runtime.layout.subscribe(schedule), runtime.viewport.subscribe(schedule)];\n window.addEventListener('scroll', schedule, { passive: true });\n window.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', schedule);\n measure();\n return () => {\n cancelAnimationFrame(frame); unsubscribe.forEach(fn => fn());\n window.removeEventListener('scroll', schedule); window.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('resize', schedule); window.visualViewport?.removeEventListener('scroll', schedule);\n rail.removeAttribute('inert'); rail.style.removeProperty('--limr-toc-available-height');\n };\n }, [runtime, scrollRoot, toc]);\n const sidebarVisible = !!sidebar && width >= sidebarBreakpoint;\n return <div ref={ref} className={`limr-reader ${className ?? ''}`} style={{ '--limr-reader-available-height': fillHeight ? `${availableHeight}px` : undefined, ...style } as CSSProperties} data-fill-height={fillHeight || undefined} data-sidebar={sidebarVisible || undefined} data-toc={toc && width >= 800 || undefined} data-limr-theme={theme} data-limr-appearance={appearance}>\n {toc && <><div ref={tocRail} className=\"limr-reader-toc\"><TableOfContents /></div><MobileContents /></>}\n <main ref={content} className=\"limr-reader-content\"><Markdown followOutput={followOutput} /></main>\n {sidebarVisible && <AnnotationSidebar />}\n <AnnotationOverlay disabled={sidebarVisible} />\n <SelectionToolbar actions={actions} />\n </div>;\n}\n\nfunction MobileContents() {\n const locale = useLocale();\n const [open, setOpen] = useState(false);\n const id = useId();\n return <div className=\"limr-reader-mobile-toc\">\n <button type=\"button\" className=\"limr-mobile-toc-toggle\" aria-expanded={open} aria-controls={id} onClick={() => setOpen(value => !value)}>\n <span>{locale.contents}</span><svg viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><path d=\"m6 8 4 4 4-4\" /></svg>\n </button>\n <div id={id}><Collapse open={open} keepMounted><TableOfContents /></Collapse></div>\n </div>;\n}\n","import { useEffect, useRef } from 'react';\nimport { useAppearance, useDocumentSelector, useLocale, useRuntime, useStoreSelector, useTheme } from '../react/context';\nimport type { StyledProps } from '../react/types';\nimport { scrollWithMotion } from '../react/motion';\nimport { useOverflowFade } from '../react/overflow-fade';\n\nexport interface TableOfContentsProps extends StyledProps { title?: string; maxDepth?: number; followActive?: boolean; topInset?: number; updateHash?: boolean }\nexport function TableOfContents({ title, maxDepth = 6, followActive = true, topInset = 24, updateHash = false, className, style }: TableOfContentsProps) {\n const runtime = useRuntime();\n const appearance = useAppearance();\n const theme = useTheme(), locale = useLocale();\n const headings = useDocumentSelector(doc => doc.headings);\n useStoreSelector(runtime.layout, value => value);\n const active = useStoreSelector(runtime.interaction, state => state.activeHeading);\n const list = useRef<HTMLDivElement>(null);\n useOverflowFade(list, runtime, ':scope > ol');\n const manualUntil = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const visible = headings.filter(heading => heading.level <= maxDepth && !runtime.headings.get(heading.id)?.closest('[inert]'));\n visible.sort((a, b) => {\n const left = runtime.headings.get(a.id), right = runtime.headings.get(b.id);\n return left && right && left !== right ? left.compareDocumentPosition(right) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1 : 0;\n });\n const minimum = Math.min(...visible.map(heading => heading.level), 6);\n useEffect(() => {\n if (!followActive || !active) return;\n const follow = () => {\n const container = list.current;\n if (!container || container.clientHeight === 0) return;\n const element = Array.from(container.querySelectorAll<HTMLElement>('[data-heading]')).find(item => item.dataset.heading === active);\n if (!element) return;\n const top = element.getBoundingClientRect().top - container.getBoundingClientRect().top + container.scrollTop - topInset;\n const target = Math.max(0, Math.min(top, container.scrollHeight - container.clientHeight));\n if (Math.abs(target - container.scrollTop) > 1) scrollWithMotion(container, target);\n };\n const delay = Math.max(0, manualUntil.current - Date.now());\n timer.current = setTimeout(follow, delay);\n return () => clearTimeout(timer.current);\n }, [active, headings, followActive, topInset]);\n const manual = () => { manualUntil.current = Date.now() + 1200; clearTimeout(timer.current); };\n return <nav className={`limr-toc ${className ?? ''}`} style={style} data-limr-theme={theme} data-limr-appearance={appearance} aria-label={title ?? locale.contents}>\n <div className=\"limr-toc-title\">{title ?? locale.contents}</div>\n <div className=\"limr-toc-scroll\" ref={list} onWheel={manual} onTouchStart={manual} onKeyDown={manual} tabIndex={0}>\n <ol>{visible.map(heading => <li key={heading.id}><a data-heading={heading.id} href={`#${heading.id}`} aria-current={heading.id === active ? 'location' : undefined}\n style={{ paddingInlineStart: 12 + Math.min(heading.level - minimum, 4) * 14 }}\n onClick={event => { event.preventDefault(); runtime.scrollToHeading(heading.id); if (updateHash) history.replaceState(history.state, '', `#${heading.id}`); }}><span className=\"limr-underline\">{heading.text}</span></a></li>)}</ol>\n </div>\n </nav>;\n}\n","import { useEffect, type RefObject } from 'react';\nimport type { ReaderRuntime } from './runtime';\n\n/** Follow actual clipping edges, including a nested viewport and in-flight\n * document/card motion. Masks never reserve space or change scroll geometry. */\nexport function useOverflowFade(ref: RefObject<HTMLElement | null>, runtime: ReaderRuntime, contentSelector: string, beforeMeasure?: () => void) {\n useEffect(() => {\n const host = ref.current;\n if (!host) return;\n let frame = 0, transitions = 0;\n const measure = () => {\n frame = 0;\n // Constraint-driven cards must finish positioning with this frame's\n // heights before clipping is tested. Even a transient mask toggle can\n // invalidate the composited layer while a footer card grows upward.\n beforeMeasure?.();\n const box = host.getBoundingClientRect();\n const viewport = window.visualViewport;\n let top = Math.max(box.top, viewport?.offsetTop ?? 0);\n let bottom = Math.min(box.bottom, (viewport?.offsetTop ?? 0) + (viewport?.height ?? innerHeight));\n const root = runtime.configuration.get().scrollRoot;\n if (root) { const bounds = root.getBoundingClientRect(); top = Math.max(top, bounds.top + root.clientTop); bottom = Math.min(bottom, bounds.top + root.clientTop + root.clientHeight); }\n const contents = [...host.querySelectorAll<HTMLElement>(contentSelector)].map(element => element.getBoundingClientRect());\n const clipsTop = bottom > top && contents.some(rect => rect.top < top - .5);\n const clipsBottom = bottom > top && contents.some(rect => rect.bottom > bottom + .5);\n host.toggleAttribute('data-overflow-top', clipsTop);\n host.toggleAttribute('data-overflow-bottom', clipsBottom);\n const set = (name: string, value: number) => { const css = `${Math.max(0, value).toFixed(2)}px`; if (host.style.getPropertyValue(name) !== css) host.style.setProperty(name, css); };\n set('--limr-fade-start', top - box.top);\n set('--limr-fade-end', bottom - box.top);\n if (transitions && host.getAnimations({ subtree: true }).some(animation => animation.playState === 'running')) schedule();\n else transitions = 0;\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(measure); };\n const refresh = () => { cancelAnimationFrame(frame); measure(); };\n const start = () => { transitions++; schedule(); };\n const end = () => { transitions = Math.max(0, transitions - 1); schedule(); };\n host.addEventListener('transitionrun', start);\n host.addEventListener('transitionend', end);\n host.addEventListener('transitioncancel', end);\n const resize = new ResizeObserver(refresh); resize.observe(host);\n const mutation = new MutationObserver(records => {\n // ResizeObserver can synchronously reposition growing sidebar cards.\n // Read that committed geometry before paint, not on the next frame after\n // their CSS heights have advanced again and outrun the stored positions.\n if (records.some(record => {\n const element = record.target instanceof Element ? record.target : record.target.parentElement;\n return element && element !== host && !element.closest('.limr-highlight-layer,.limr-paint-layer');\n })) refresh();\n });\n mutation.observe(host, { subtree: true, childList: true, characterData: true, attributes: true, attributeFilter: ['style', 'class'] });\n const unsubscribe = [runtime.layout.subscribe(schedule), runtime.viewport.subscribe(refresh), runtime.documentOffset.subscribe(schedule), runtime.configuration.subscribe(schedule)];\n const scroll = (event: Event) => {\n const target = event.target;\n if (target === window.document || target === window || target instanceof Element && target.contains(host)) refresh();\n };\n // Capture nested scrolling directly; routing it through the runtime's frame\n // notification and then another rAF makes a viewport-fixed fade trail text.\n window.addEventListener('scroll', scroll, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', refresh);\n schedule();\n return () => {\n cancelAnimationFrame(frame); resize.disconnect(); mutation.disconnect(); unsubscribe.forEach(fn => fn());\n host.removeEventListener('transitionrun', start); host.removeEventListener('transitionend', end); host.removeEventListener('transitioncancel', end);\n window.removeEventListener('scroll', scroll, true); window.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('resize', schedule); window.visualViewport?.removeEventListener('scroll', refresh);\n host.removeAttribute('data-overflow-top'); host.removeAttribute('data-overflow-bottom');\n host.style.removeProperty('--limr-fade-start'); host.style.removeProperty('--limr-fade-end');\n };\n }, [ref, runtime, contentSelector, beforeMeasure]);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties, type ReactNode } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useAppearance, useDocument, useIsomorphicLayoutEffect, useLocale, useRuntime, useStoreSelector, useTheme } from '../react/context';\nimport type { AnnotationOccurrence } from '../core';\nimport type { StyledProps } from '../react/types';\nimport { AnnotationGroup } from './AnnotationContent';\nimport { Collapse } from './Collapse';\nimport { annotationReferenceText } from './annotation-reference';\nimport { sourceRangeStartRect } from '../react/source-geometry';\nimport { useOverflowFade } from '../react/overflow-fade';\n\n/** anchorTop is the first referenced text line, falling back to the marker. */\nexport interface SidebarItem { id: string; anchorTop: number; height: number }\nexport type SidebarPositioner = (items: readonly SidebarItem[], context: { activeId: string | null; gap: number; height?: number; prioritizeActive?: boolean }) => ReadonlyMap<string, number>;\nexport const alignSidebar: SidebarPositioner = (items, { activeId, gap, height, prioritizeActive }) => {\n const positions = items.map(item => item.anchorTop);\n const activeIndex = items.findIndex(item => item.id === activeId);\n const pivot = activeIndex < 0 ? 0 : activeIndex;\n if (!items.length) return new Map();\n positions[pivot] = height === undefined ? items[pivot].anchorTop : Math.max(0, Math.min(items[pivot].anchorTop, height - items[pivot].height));\n for (let i = pivot - 1; i >= 0; i--) positions[i] = Math.min(items[i].anchorTop, positions[i + 1] - items[i].height - gap);\n // Earlier cards may move above the clipped rail. Keeping them above zero\n // would push a late active card away from its anchor in a short document.\n for (let i = pivot + 1; i < items.length; i++) positions[i] = Math.max(items[i].anchorTop, positions[i - 1] + items[i - 1].height + gap);\n if (height !== undefined && items.reduce((sum, item) => sum + item.height, gap * (items.length - 1)) <= height) {\n // With enough total room, borrow unused space above the final cards.\n // Earlier cards intentionally clipped by the focused pivot must stay there:\n // restoring the top boundary would push that card away from its reference.\n const start = prioritizeActive && activeIndex >= 0 ? pivot + 1 : 0;\n for (let i = items.length - 1; i >= start; i--) positions[i] = Math.min(positions[i], (i === items.length - 1 ? height : positions[i + 1] - gap) - items[i].height);\n if (start || activeIndex < 0 || positions[0] >= 0) for (let i = start; i < items.length; i++) positions[i] = Math.max(positions[i], i === 0 ? 0 : positions[i - 1] + items[i - 1].height + gap);\n }\n return new Map(items.map((item, index) => [item.id, positions[index]]));\n};\n\nexport interface AnnotationSidebarProps extends StyledProps {\n sync?: 'document' | 'none';\n gap?: number;\n positioner?: SidebarPositioner;\n renderCard?: (props: { occurrence: AnnotationOccurrence; active: boolean; activate: () => void }) => ReactNode;\n}\nexport function AnnotationSidebar({ sync = 'document', gap = 14, positioner = alignSidebar, renderCard, className, style }: AnnotationSidebarProps) {\n const runtime = useRuntime();\n const document = useDocument();\n const appearance = useAppearance();\n const theme = useTheme(), locale = useLocale();\n const decorations = useStoreSelector(runtime.decorations, value => value);\n const active = useStoreSelector(runtime.interaction, state => state.active);\n const hovered = useStoreSelector(runtime.interaction, state => state.hovered);\n const hoverSource = useStoreSelector(runtime.interaction, state => state.hoverSource);\n const activeSource = useStoreSelector(runtime.interaction, state => state.activeSource);\n useSyncExternalStore(runtime.configuration.subscribe, runtime.configuration.get, runtime.configuration.get);\n const layout = useSyncExternalStore(runtime.layout.subscribe, runtime.layout.get, runtime.layout.get);\n const viewport = useSyncExternalStore(runtime.viewport.subscribe, runtime.viewport.get, runtime.viewport.get);\n const rail = useRef<HTMLElement>(null);\n const cards = useRef(new Map<string, HTMLDivElement>());\n const [sizes, setSizes] = useState<Map<string, number>>(new Map());\n const [minimumSizes, setMinimumSizes] = useState<Map<string, number>>(new Map());\n const [anchorTops, setAnchorTops] = useState<Map<string, number>>(new Map());\n const [railHeight, setRailHeight] = useState(0);\n const measured = useRef({ sizes: new Map<string, number>(), minimum: new Map<string, number>(), height: 0 });\n const resizeFrame = useRef(0);\n const [viewportTop, setViewportTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(0);\n const [cardLock, setCardLock] = useState<{ id: string; top: number } | null>(null);\n const lastFocus = useRef<{ id: string; top?: number } | null>(null);\n const [release, setRelease] = useState<{ id: string; top?: number; progress: number } | null>(null);\n const occurrences = useMemo(() => {\n const values = [...decorations.occurrences].sort((a, b) => a.range.start - b.range.start || a.range.end - b.range.end || a.id.localeCompare(b.id));\n if (sync === 'none') for (const annotation of decorations.annotations.values()) if (annotation.type !== 'highlight' && !values.some(item => item.annotationIds.includes(annotation.id))) values.push({ id: `unanchored-${annotation.id}`, range: { start: 0, end: 0 }, annotationIds: [annotation.id] });\n return values;\n }, [decorations, sync]);\n const references = useMemo(() => new Map(occurrences.map(occurrence => [occurrence.id, annotationReferenceText(document, occurrence)])), [document, occurrences]);\n const annotationGroups = useMemo(() => new Map(occurrences.map(occurrence => [occurrence.id, occurrence.annotationIds.flatMap(id => { const annotation = decorations.annotations.get(id); return annotation ? [annotation] : []; })])), [decorations, occurrences]);\n const measure = useCallback((beforePaint = false) => {\n const next = new Map<string, number>();\n const minimum = new Map<string, number>();\n cards.current.forEach((element, id) => {\n const height = element.getBoundingClientRect().height;\n next.set(id, height);\n const panels = [...element.querySelectorAll<HTMLElement>(':scope > .limr-sidebar-card-body > .limr-collapse')];\n minimum.set(id, height - panels.reduce((sum, panel) => sum + panel.getBoundingClientRect().height, 0));\n });\n // Keep the rail and card bounds in the same subpixel coordinate system.\n // Rounded clientHeight can put a bottom-aligned card outside the mask.\n const height = rail.current?.getBoundingClientRect().height ?? 0;\n const old = measured.current;\n if (old.height === height && old.sizes.size === next.size && [...next].every(([id, size]) => size === old.sizes.get(id) && Math.abs(minimum.get(id)! - (old.minimum.get(id) ?? 0)) < .5)) return;\n measured.current = { sizes: next, minimum, height };\n const update = () => { setSizes(next); setMinimumSizes(minimum); setRailHeight(height); };\n if (!beforePaint) { update(); return; }\n // The heights already contain the collapse animation's easing. Applying a\n // second top transition makes neighbors chase them and overlap the card.\n const element = rail.current;\n element?.setAttribute('data-resizing', '');\n flushSync(update);\n cancelAnimationFrame(resizeFrame.current);\n resizeFrame.current = requestAnimationFrame(() => {\n resizeFrame.current = requestAnimationFrame(() => element?.removeAttribute('data-resizing'));\n });\n }, []);\n const prepareFade = useCallback(() => measure(true), [measure]);\n useOverflowFade(rail, runtime, ':scope > .limr-sidebar-card', prepareFade);\n useEffect(() => {\n const observer = new ResizeObserver(() => measure(true));\n if (rail.current) observer.observe(rail.current);\n cards.current.forEach(element => observer.observe(element));\n measure();\n return () => observer.disconnect();\n }, [occurrences, measure, anchorTops]);\n useEffect(() => () => cancelAnimationFrame(resizeFrame.current), []);\n useIsomorphicLayoutEffect(() => {\n if (sync === 'none' || !rail.current) return;\n const top = rail.current.getBoundingClientRect().top;\n const values = new Map<string, number>();\n const displacement = runtime.getContentOffset();\n for (const occurrence of occurrences) {\n const marker = runtime.anchors.get(occurrence.id);\n if (!marker || marker.closest('[inert]')) continue;\n const rect = sourceRangeStartRect(runtime, decorations.referenceRanges.get(occurrence.id) ?? occurrence.range);\n values.set(occurrence.id, (rect || marker.getBoundingClientRect()).top - top - displacement);\n }\n setAnchorTops(old => old.size === values.size && [...values].every(([id, value]) => Math.abs(value - (old.get(id) ?? -Infinity)) < .5) ? old : values);\n }, [runtime, decorations.referenceRanges, occurrences, layout, sync]);\n useIsomorphicLayoutEffect(() => {\n if (sync !== 'document' || !rail.current) return;\n const root = runtime.configuration.get().scrollRoot;\n const bounds = rail.current.getBoundingClientRect();\n const top = Math.max(bounds.top, runtime.getViewportTop() + (root?.clientTop ?? 0), window.visualViewport?.offsetTop ?? 0);\n const bottom = Math.min(bounds.bottom, root ? runtime.getViewportTop() + root.clientTop + root.clientHeight : Infinity, (window.visualViewport?.offsetTop ?? 0) + (window.visualViewport?.height ?? innerHeight));\n setViewportTop(Math.max(0, top - bounds.top + (runtime.configuration.get().scrollOffset ?? 24)));\n setViewportHeight(Math.max(0, bottom - top));\n }, [runtime, layout, viewport, sync]);\n useEffect(() => {\n const dismiss = (event: PointerEvent) => {\n if (event.button !== 0) return;\n const target = event.target;\n if (!(target instanceof Element)) return;\n const card = target.closest('.limr-sidebar-card');\n const marker = target.closest<HTMLElement>('[data-limr-anchor]');\n if ((card && rail.current?.contains(card)) || (marker && runtime.anchors.get(marker.dataset.limrAnchor!) === marker)) return;\n // Floating module UI and selection actions keep their own dismissal rules.\n if (target.closest('.limr-overlay-positioner,.limr-selection-toolbar')) return;\n const { active, hovered } = runtime.interaction.get();\n if (active || hovered) runtime.activate(null);\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented || !runtime.interaction.get().active) return;\n const anchor = runtime.anchors.get(runtime.interaction.get().active!);\n anchor?.focus({ preventScroll: true });\n runtime.activate(null);\n };\n window.document.addEventListener('pointerdown', dismiss);\n window.document.addEventListener('keydown', escape);\n return () => { window.document.removeEventListener('pointerdown', dismiss); window.document.removeEventListener('keydown', escape); if (sync === 'document') runtime.documentOffset.set(0); };\n }, [runtime, sync]);\n const items = occurrences.filter(item => sync === 'none' || anchorTops.has(item.id));\n // Extensions may present source subtrees in another order (e.g. translation\n // before original). Aligned cards follow their rendered anchors.\n if (sync !== 'none') items.sort((a, b) => (anchorTops.get(a.id) ?? 0) - (anchorTops.get(b.id) ?? 0));\n const readingId = items.find(item => (anchorTops.get(item.id) ?? 0) >= viewportTop)?.id ?? items.at(-1)?.id ?? null;\n const alignmentId = hovered ?? active ?? readingId;\n const focusedId = hovered ?? active;\n const source = hovered ? hoverSource : active ? activeSource : null;\n const locked = source === 'sidebar' && cardLock?.id === alignmentId ? cardLock : null;\n const lockedTop = locked?.top;\n useIsomorphicLayoutEffect(() => {\n const previous = lastFocus.current;\n lastFocus.current = focusedId ? { id: focusedId, top: lockedTop } : null;\n if (focusedId || sync !== 'document' || !rail.current || matchMedia('(prefers-reduced-motion: reduce)').matches) { setRelease(null); return; }\n if (!previous) return;\n const style = getComputedStyle(rail.current), value = style.getPropertyValue('--limr-motion-slow').trim();\n const milliseconds = parseFloat(value) * (value.endsWith('ms') ? 1 : 1000);\n const duration = Number.isFinite(milliseconds) ? Math.max(0, milliseconds) : 460;\n if (!duration) { setRelease(null); return; }\n // Use the skin's timing as a clock. Interpolate two layouts computed with\n // the SAME current card heights, so collapse and repacking share an easing\n // without a second CSS top transition making neighbors collide.\n const motion = rail.current.animate([{}, {}], { duration, easing: style.getPropertyValue('--limr-ease').trim() || 'ease-out' });\n setRelease({ ...previous, progress: 0 });\n let frame = 0;\n const step = () => {\n if (motion.playState === 'finished') { setRelease(null); return; }\n setRelease({ ...previous, progress: motion.effect?.getComputedTiming().progress ?? 0 });\n frame = requestAnimationFrame(step);\n };\n frame = requestAnimationFrame(step);\n return () => { cancelAnimationFrame(frame); motion.cancel(); };\n }, [focusedId, lockedTop, sync]);\n const sidebarItems = items.map(item => ({ id: item.id, anchorTop: anchorTops.get(item.id) ?? 0, height: sizes.get(item.id) ?? 80 }));\n const positionContext = { activeId: alignmentId, gap, height: sync === 'document' && railHeight > 0 ? railHeight : undefined, prioritizeActive: !!(hovered || active) };\n const positions = new Map(positioner(locked ? sidebarItems.map(item => item.id === locked.id ? { ...item, anchorTop: locked.top } : item) : sidebarItems, positionContext));\n const releasing = !focusedId && release;\n if (releasing) {\n const origin = positioner(sidebarItems.map(item => item.id === releasing.id && releasing.top !== undefined ? { ...item, anchorTop: releasing.top } : item), { ...positionContext, activeId: releasing.id, prioritizeActive: true });\n for (const [id, top] of positions) positions.set(id, top + ((origin.get(id) ?? top) - top) * (1 - releasing.progress));\n }\n const lockedAnchor = locked ? anchorTops.get(locked.id) ?? locked.top : 0;\n // Footer packing must not disable reverse alignment. Keep the hovered card\n // under the pointer and move its referenced text, even at the rail boundary.\n const displacement = sync === 'document' && locked ? (positions.get(locked.id) ?? locked.top) - lockedAnchor : 0;\n useIsomorphicLayoutEffect(() => { if (sync === 'document') runtime.documentOffset.set(displacement); }, [runtime, displacement, sync]);\n const lockCard = (id: string) => {\n // Keep the original resting position while this card is hovered or active.\n // Relocking its boundary-raised top would prevent a collapse from moving\n // back down, then jump when pointer leave releases the new lock.\n if (locked?.id === id) return;\n const card = cards.current.get(id);\n if (card && rail.current) {\n const origin = rail.current.getBoundingClientRect().top;\n const top = card.getBoundingClientRect().top - origin;\n setCardLock({ id, top });\n }\n };\n return <aside ref={rail} aria-label={locale.annotations} className={`limr-sidebar ${className ?? ''}`} data-sync={sync} data-releasing={releasing ? '' : undefined} data-limr-theme={theme} data-limr-appearance={appearance} style={style}>\n {items.map(occurrence => {\n const annotation = decorations.annotations.get(occurrence.annotationIds[0]);\n const definition = runtime.annotationTypes.get(annotation?.type ?? 'citation');\n const isActive = active === occurrence.id;\n const palette = definition?.sidebar;\n const Preview = palette?.Preview;\n // A marker at the end of the article can align its collapsed card by\n // giving the reference/title priority over the optional summary. Expanded\n // content is bounded by the viewport and scrolls inside the card.\n const available = source === 'marker' && alignmentId === occurrence.id && !isActive\n ? Math.max(minimumSizes.get(occurrence.id) ?? 80, railHeight - (anchorTops.get(occurrence.id) ?? 0)) : railHeight;\n const cardHeight = isActive ? Math.min(available, Math.max(minimumSizes.get(occurrence.id) ?? 80, viewportHeight || railHeight)) : available;\n const cardStyle = {\n '--limr-annotation-color': palette?.color ?? definition?.color,\n '--limr-annotation-border': palette?.borderColor,\n '--limr-annotation-title': palette?.titleColor,\n '--limr-annotation-text': palette?.textColor,\n '--limr-annotation-excerpt': palette?.excerptColor,\n '--limr-annotation-preview': palette?.previewColor,\n '--limr-sidebar-preview-lines': String(Math.max(1, Math.floor(palette?.previewLines ?? 2))),\n ...(sync === 'document' ? {\n position: 'absolute', top: positions.get(occurrence.id) ?? 0, insetInline: 0,\n '--limr-sidebar-card-height': `${cardHeight}px`,\n } : { marginBlockEnd: gap }),\n } as CSSProperties & { [token: `--${string}`]: string | undefined };\n // A mixed card must not dismiss a conversation because a citation opted in.\n const collapseOnContentClick = occurrence.annotationIds.every(id => runtime.annotationTypes.get(decorations.annotations.get(id)?.type ?? '')?.sidebar?.collapseOnContentClick);\n const activate = () => {\n const hovering = runtime.interaction.get().hovered === occurrence.id || cards.current.get(occurrence.id)?.matches(':hover');\n lockCard(occurrence.id);\n runtime.activate(isActive ? null : occurrence.id, 'sidebar');\n // Activation clears marker hover; the pointer is still inside this card.\n if (hovering) runtime.hover(occurrence.id, 'sidebar');\n };\n return <div key={occurrence.id} ref={element => { if (element) cards.current.set(occurrence.id, element); else cards.current.delete(occurrence.id); }}\n className=\"limr-sidebar-card\" data-type={annotation?.type} data-locked={locked?.id === occurrence.id || undefined} data-active={isActive || hovered === occurrence.id || undefined} data-expanded={isActive || undefined} data-default-card={!renderCard || undefined} data-content-toggle={collapseOnContentClick || undefined} data-citations={occurrence.annotationIds.every(id => decorations.annotations.get(id)?.type === 'citation') || undefined} data-occurrence={occurrence.id}\n style={cardStyle}\n onPointerEnter={event => { if (event.pointerType !== 'touch') { lockCard(occurrence.id); runtime.hover(occurrence.id, 'sidebar'); } }} onPointerLeave={() => { if (runtime.interaction.get().hovered === occurrence.id && runtime.interaction.get().hoverSource === 'sidebar') runtime.hover(null); }}\n onClick={event => {\n if ((!isActive || collapseOnContentClick) && !renderCard && !event.defaultPrevented && !(event.target as Element).closest('button,a,input,select,textarea,summary,[role=\"button\"],[role=\"link\"],[contenteditable=\"true\"],[data-limr-card-interactive]') && window.getSelection()?.isCollapsed !== false) activate();\n }}>\n {renderCard ? renderCard({ occurrence, active: isActive, activate }) : <>\n {references.get(occurrence.id) && <div className=\"limr-sidebar-reference\" title={references.get(occurrence.id)}><p className=\"limr-sidebar-excerpt\">{references.get(occurrence.id)}</p></div>}\n <div className=\"limr-sidebar-card-body\">\n <button type=\"button\" className=\"limr-sidebar-card-heading\" onClick={activate} aria-expanded={isActive}>{definition?.label ?? annotation?.type ?? 'Reference'}<span className=\"limr-sidebar-toggle\"><span key={String(isActive)} className=\"limr-button-label limr-underline\">{isActive ? locale.collapse : locale.expand}</span></span></button>\n {Preview && annotation && <Collapse open={!isActive} keepMounted className=\"limr-sidebar-preview-panel\"><div className=\"limr-sidebar-preview\"><Preview annotation={annotation} data={annotation.data} occurrence={occurrence} annotations={annotationGroups.get(occurrence.id)!} referenceText={references.get(occurrence.id) ?? ''} /></div></Collapse>}\n <Collapse open={isActive} className=\"limr-sidebar-expansion\"><div className=\"limr-sidebar-card-content\"><AnnotationGroup occurrence={occurrence} presentation=\"sidebar\" enabled={isActive} /></div></Collapse>\n </div>\n </>}\n </div>;\n })}\n </aside>;\n}\n","import { useEffect, useState } from 'react';\nimport { useRuntime, useStoreSelector } from '../react/context';\nimport type { Annotation, AnnotationOccurrence } from '../core';\nimport type { AnnotationPresentation } from '../react/types';\n\nexport function AnnotationContent({ annotationId, presentation, expanded = true, enabled = true }: { annotationId: string; presentation: AnnotationPresentation; expanded?: boolean; enabled?: boolean }) {\n const runtime = useRuntime();\n const annotation = useStoreSelector(runtime.decorations, state => state.annotations.get(annotationId));\n const editing = useStoreSelector(runtime.interaction, state => state.editing === annotationId);\n const definition = useStoreSelector(runtime.configuration, () => runtime.annotationTypes.get(annotation?.type ?? 'citation'));\n const version = useStoreSelector(runtime.resourceVersions, versions => versions.get(annotationId) ?? 0);\n const [loaded, setLoaded] = useState<{ id: string; data?: unknown; loading: boolean; error: Error | null }>({ id: annotationId, loading: !!definition?.load, error: null });\n useEffect(() => {\n if (!definition?.load || !annotation || !enabled) return;\n let disposed = false;\n setLoaded({ id: annotationId, loading: true, error: null });\n const request = runtime.resources.acquire(runtime.getResourceKey(annotation), signal => definition.load!(annotation, { signal }));\n request.promise.then(data => { if (!disposed) setLoaded({ id: annotationId, data, loading: false, error: null }); }).catch(error => { if (!disposed) setLoaded({ id: annotationId, loading: false, error: error instanceof Error ? error : new Error(String(error)) }); });\n return () => { disposed = true; request.release(); };\n }, [runtime, annotation, annotationId, definition, version, enabled]);\n const retry = () => runtime.invalidateAnnotation(annotationId);\n const Content = definition?.Content;\n const current = loaded.id === annotationId ? loaded : { loading: !!definition?.load, error: null, data: undefined };\n if (!annotation) return <span className=\"limr-muted\">{runtime.locale.unavailable} · {annotationId}</span>;\n if (!Content) return <span className=\"limr-muted\">{runtime.locale.unavailable} · {annotation.type}</span>;\n return <Content editing={editing} annotation={annotation} data={definition?.load ? current.data ?? annotation.data : annotation.data} loading={definition?.load ? current.loading : false} error={current.error} retry={retry} presentation={presentation} expanded={expanded} />;\n}\n\nexport function AnnotationGroup({ occurrence, presentation, expanded = true, enabled = true }: { occurrence: AnnotationOccurrence; presentation: AnnotationPresentation; expanded?: boolean; enabled?: boolean }) {\n return <>{occurrence.annotationIds.map(id => <div key={id} className=\"limr-annotation-entry\"><AnnotationContent annotationId={id} presentation={presentation} expanded={expanded} enabled={enabled} /></div>)}</>;\n}\n","import { annotationReferenceRange, mapText, type AnnotationOccurrence, type DocumentSnapshot, type MarkdownNode } from '../core';\nimport { intersects, rangeOf } from '../core/tree';\n\n/** Render the anchored text, without exposing Markdown syntax or <ref> tags. */\nexport function annotationReferenceText(document: DocumentSnapshot, occurrence: AnnotationOccurrence): string {\n const referenceRange = annotationReferenceRange(document, occurrence);\n const blocks = document.blocks.filter(block => intersects(block.range, referenceRange));\n let reference = '';\n const visit = (node: MarkdownNode) => {\n const range = rangeOf(node);\n if (!intersects(range, referenceRange) || ['annotationReference', 'footnoteReference', 'annotationDefinition', 'definition'].includes(node.type)) return;\n if (node.value !== undefined) {\n const mapping = mapText(document.source, node.value, range);\n reference += node.value.split('').filter((_, index) => mapping.ends[index] > referenceRange.start && mapping.starts[index] < referenceRange.end).join('');\n } else if (node.type === 'image') reference += String(node.alt ?? '');\n else node.children?.forEach(visit);\n };\n blocks.forEach((block, index) => { if (index) reference += ' '; visit(block.node); });\n if (!occurrence.embedded) reference ||= occurrence.quote ?? document.source.slice(referenceRange.start, referenceRange.end);\n return reference.replace(/\\s+/g, ' ').trim();\n}\n","import { useEffect, useState, useSyncExternalStore, type CSSProperties } from 'react';\nimport { autoUpdate, flip, FloatingFocusManager, FloatingOverlay, FloatingPortal, offset, shift, size, useDismiss, useFloating, useInteractions, useRole } from '@floating-ui/react';\nimport { useAppearance, useIsomorphicLayoutEffect, useLocale, useRuntime, useStoreSelector, useTheme } from '../react/context';\nimport { AnnotationGroup } from './AnnotationContent';\nimport { useCardMotion } from './card-motion';\nimport { AnnotationCard } from './AnnotationCard';\nimport type { AnnotationOccurrence } from '../core';\nimport type { AnnotationOverlayCardProps } from '../react/types';\n\nexport interface AnnotationOverlayProps { disabled?: boolean; portalRoot?: HTMLElement | null; previewWidth?: number; maxHeight?: string }\nconst length = (value: number | string) => typeof value === 'number' ? `${value}px` : value;\nconst idleSubscribe = () => () => {};\nexport function AnnotationOverlay({ disabled = false, portalRoot, previewWidth = 340, maxHeight = '80dvh' }: AnnotationOverlayProps) {\n const runtime = useRuntime();\n const appearance = useAppearance();\n const theme = useTheme(), locale = useLocale();\n const editing = useStoreSelector(runtime.interaction, state => state.editing);\n const active = useStoreSelector(runtime.interaction, state => state.active);\n const hovered = useStoreSelector(runtime.interaction, state => state.hovered);\n const occurrences = useStoreSelector(runtime.decorations, state => state.occurrences);\n useSyncExternalStore(runtime.layout.subscribe, runtime.layout.get, runtime.layout.get);\n const [preview, setPreview] = useState<string | null>(null);\n const [collapsedId, setCollapsedId] = useState<string | null>(null);\n const [, setViewportTick] = useState(0);\n useEffect(() => {\n if (active || disabled) { setPreview(null); return; }\n if (hovered) { setPreview(hovered); return; }\n const timer = setTimeout(() => setPreview(null), 90);\n return () => clearTimeout(timer);\n }, [hovered, active, disabled]);\n useEffect(() => {\n const update = () => setViewportTick(value => value + 1);\n window.visualViewport?.addEventListener('resize', update);\n window.visualViewport?.addEventListener('scroll', update);\n window.addEventListener('resize', update);\n return () => { window.visualViewport?.removeEventListener('resize', update); window.visualViewport?.removeEventListener('scroll', update); window.removeEventListener('resize', update); };\n }, []);\n const wantedId = active ?? preview;\n const wanted = occurrences.find(item => item.id === wantedId);\n const [retained, setRetained] = useState<AnnotationOccurrence | null>(null);\n const occurrence = wanted ?? retained;\n const id = occurrence?.id;\n const annotation = useStoreSelector(runtime.decorations, state => state.annotations.get(occurrence?.annotationIds[0] ?? ''));\n const definition = useStoreSelector(runtime.configuration, () => runtime.annotationTypes.get(annotation?.type ?? 'citation'));\n const policy = definition?.overlay?.expand;\n const expansion = typeof policy === 'function' ? annotation && policy(annotation) : policy;\n const pinned = active === id;\n const expanded = pinned && !!expansion && collapsedId !== id;\n const [lastExpanded, setLastExpanded] = useState(false);\n const [lastPinned, setLastPinned] = useState(false);\n const open = !!wanted && !disabled;\n useSyncExternalStore(open ? runtime.viewport.subscribe : idleSubscribe, runtime.viewport.get, runtime.viewport.get);\n useEffect(() => {\n if (open) { setRetained(wanted!); setLastExpanded(expanded); setLastPinned(pinned); }\n }, [wanted, open, expanded, pinned]);\n const close = () => {\n const anchor = id ? runtime.anchors.get(id) : null;\n anchor?.focus({ preventScroll: true });\n runtime.activate(null); runtime.hover(null); setPreview(null);\n };\n const anchor = id ? runtime.anchors.get(id) : undefined;\n const [previewGeometry, setPreviewGeometry] = useState<{ id?: string; rect: DOMRect; placement: string } | null>(null);\n const fromPreview = previewGeometry?.id === id ? previewGeometry : null;\n const requestedExpanded = open ? expanded : lastExpanded;\n // Even a toolbar/touch opening first measures the real module preview at\n // its anchor. It stays hidden for this layout pass, and is never duplicated.\n const measuringPreview = open && requestedExpanded && !fromPreview;\n const shownExpanded = requestedExpanded && !measuringPreview;\n const shownPinned = open ? pinned : lastPinned;\n const centered = shownExpanded && expansion && expansion.placement === 'center';\n const anchoredExpansion = shownExpanded && !centered && fromPreview;\n const { refs, update, floatingStyles, context, isPositioned, placement, middlewareData } = useFloating({ open, elements: { reference: anchor ?? null }, onOpenChange: next => { if (!next) close(); }, strategy: 'fixed', transform: false, placement: 'bottom-start', whileElementsMounted: autoUpdate, middleware: [offset(8), flip({ padding: 12 }), shift({ padding: 12 }), size({ padding: 12, apply: ({ availableHeight, elements }) => {\n if (!shownExpanded) elements.floating.style.maxHeight = `${Math.max(0, Math.floor(Math.min(360, availableHeight)))}px`;\n else if (!centered && !fromPreview) elements.floating.style.maxHeight = `min(${length(expansion && expansion.maxHeight || maxHeight)}, ${Math.max(0, Math.floor(availableHeight))}px)`;\n } }, [shownExpanded, !!centered, !!fromPreview, expansion && expansion.maxHeight, maxHeight]), {\n name: 'limrAnchor',\n options: shownExpanded,\n fn: ({ elements }) => ({ data: { id: (elements.reference as HTMLElement).dataset?.limrAnchor, expanded: shownExpanded } }),\n }] });\n useIsomorphicLayoutEffect(() => {\n // A retained surface never remounts when an exit is reversed. Floating UI\n // resets isPositioned on close, so explicitly remeasure that same surface.\n if (open && anchor) update();\n }, [anchor, update, open, shownExpanded]);\n const dismiss = useDismiss(context, { escapeKey: true, outsidePress: true });\n const role = useRole(context, { role: 'dialog' });\n const { getFloatingProps } = useInteractions([dismiss, role]);\n const ready = !!centered || !!anchoredExpansion || !open || isPositioned && middlewareData.limrAnchor?.id === id && middlewareData.limrAnchor?.expanded === shownExpanded;\n const [surface, setSurface] = useState<HTMLDivElement | null>(null);\n const edge = (shownExpanded ? fromPreview?.placement ?? 'bottom' : placement).startsWith('top') ? 'bottom' : 'top';\n useCardMotion(surface, refs.floating.current, anchor, open, shownExpanded, ready && !measuringPreview, id, edge, fromPreview?.rect, () => { setRetained(null); setCollapsedId(null); setPreviewGeometry(null); });\n useIsomorphicLayoutEffect(() => {\n if (!shownExpanded && open && ready && refs.floating.current) {\n const rect = refs.floating.current.getBoundingClientRect();\n if (!fromPreview || fromPreview.placement !== placement || (['x', 'y', 'width', 'height'] as const).some(key => Math.abs(rect[key] - fromPreview.rect[key]) > .5)) setPreviewGeometry({ id, rect, placement });\n }\n });\n if (!occurrence || disabled) return null;\n const visual = window.visualViewport;\n const viewLeft = visual?.offsetLeft ?? 0, viewTop = visual?.offsetTop ?? 0;\n const availableWidth = visual?.width ?? window.innerWidth, availableHeight = visual?.height ?? window.innerHeight;\n // Portalled dialogs belong to the whole visible page, including when the\n // reader lives in an offset column or a nested scroll container.\n const top = viewTop + 12;\n const bottom = viewTop + availableHeight - 12;\n const heightLimit = Math.max(0, bottom - top);\n const settings = shownExpanded && expansion ? expansion : undefined;\n const width = `min(${length(settings?.width ?? (centered ? 640 : definition?.overlay?.previewWidth ?? previewWidth))}, ${Math.max(0, availableWidth - 24)}px)`;\n let style: CSSProperties = { ...floatingStyles, width, maxHeight: Math.min(360, availableHeight - 24) };\n if (settings) {\n style = { ...style, height: settings.height === undefined ? undefined : `min(${length(settings.height)}, ${heightLimit}px)`, maxHeight: `min(${length(settings.maxHeight ?? maxHeight)}, ${heightLimit}px)` };\n if (centered) style = { ...style, left: viewLeft + availableWidth / 2, top: viewTop + availableHeight / 2, transform: 'translate(-50%, -50%)' };\n else if (fromPreview) {\n const upward = fromPreview.placement.startsWith('top');\n const room = Math.max(0, upward ? fromPreview.rect.bottom - top : bottom - fromPreview.rect.top);\n style = { ...style, left: fromPreview.rect.left, top: upward ? fromPreview.rect.bottom : fromPreview.rect.top, transform: upward ? 'translateY(-100%)' : 'none', maxWidth: viewLeft + availableWidth - 12 - fromPreview.rect.left, maxHeight: `min(${length(settings.maxHeight ?? maxHeight)}, ${room}px)` };\n }\n }\n const Card = definition?.overlay?.Card;\n const cardProps: AnnotationOverlayCardProps = {\n annotation: annotation ?? { id: occurrence.annotationIds[0], type: 'unknown' }, occurrence,\n presentation: shownExpanded ? 'expanded' : 'preview', expanded: shownExpanded, pinned: shownPinned,\n canExpand: !!expansion,\n expand: () => { setCollapsedId(null); runtime.activate(occurrence.id); },\n collapse: () => { setCollapsedId(occurrence.id); runtime.activate(occurrence.id); },\n close,\n children: <AnnotationGroup occurrence={occurrence} presentation={shownExpanded ? 'expanded' : 'preview'} expanded={shownExpanded} />,\n };\n const modal = open && !!centered;\n const card = <FloatingFocusManager context={context} modal={modal} disabled={!open || !pinned || measuringPreview} initialFocus={editing ? -1 : refs.floating} returnFocus={false}>\n <div ref={refs.setFloating} {...getFloatingProps()} tabIndex={-1} aria-label={definition?.label ?? locale.annotations} className=\"limr-overlay-positioner\" style={{ ...style, pointerEvents: open ? 'auto' : 'none', visibility: ready && !measuringPreview ? 'visible' : 'hidden' }}>\n <div ref={setSurface} className={`limr-annotation-overlay ${shownExpanded ? 'limr-annotation-expanded' : 'limr-annotation-preview'}`} style={{ '--limr-annotation-color': definition?.color } as CSSProperties} data-type={annotation?.type} data-state={open ? 'open' : 'closing'} data-pinned={shownPinned || undefined} data-placement={centered ? 'center' : anchoredExpansion ? fromPreview.placement : placement} data-limr-theme={theme} data-limr-appearance={appearance}\n onPointerEnter={event => { if (!pinned && event.pointerType !== 'touch') runtime.hover(occurrence.id); }} onPointerLeave={() => { if (!pinned) runtime.hover(null); }}>\n <div className=\"limr-overlay-surface\" aria-hidden=\"true\" />\n <div className=\"limr-overlay-card\">{Card && annotation ? <Card {...cardProps} /> : <AnnotationCard {...cardProps} title={definition?.label ?? annotation?.type ?? locale.annotations} />}</div>\n </div>\n </div>\n </FloatingFocusManager>;\n return <FloatingPortal root={portalRoot}><FloatingOverlay className=\"limr-backdrop\" data-expanded={modal || undefined} lockScroll={modal} style={{ pointerEvents: modal ? 'auto' : 'none' }}>{card}</FloatingOverlay></FloatingPortal>;\n}\n","import { useRef } from 'react';\nimport { useIsomorphicLayoutEffect } from '../react/context';\n\nconst moving = (animation: Animation | null) => animation?.playState === 'running' || animation?.playState === 'paused';\nconst durationOf = (value: string, fallback: number) => {\n const duration = parseFloat(value) * (value.endsWith('ms') ? 1 : 1000);\n return Number.isFinite(duration) && duration > 0 ? duration : fallback;\n};\n/** Measure a stationary host, and animate its surface from the live frame.\n * Each direction starts a fresh easing curve: reversing an ease-out entrance would\n * otherwise leave the card apparently motionless at the start of its exit. */\nexport function useCardMotion(element: HTMLElement | null, host: HTMLElement | null, anchor: HTMLElement | undefined, open: boolean, expanded: boolean, ready: boolean, id: string | undefined, edge: 'top' | 'bottom', previewRect: DOMRect | undefined, onExit: () => void) {\n const previous = useRef<DOMRect | null>(null);\n const reveal = useRef<Animation | null>(null);\n const content = useRef<Animation | null>(null);\n const hero = useRef<Animation | null>(null);\n const shape = useRef<Animation | null>(null);\n const state = useRef<{ id?: string; expanded: boolean; open: boolean } | null>(null);\n const latest = useRef({ open, onExit });\n latest.current = { open, onExit };\n useIsomorphicLayoutEffect(() => {\n if (!element || !host || !ready) return;\n const sameCard = state.current?.id === id;\n const presentationChanged = sameCard && state.current?.expanded !== expanded;\n const intentChanged = !sameCard || state.current?.open !== open || presentationChanged;\n const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (!intentChanged && !reduced) return;\n const computed = getComputedStyle(element);\n const shell = element.querySelector<HTMLElement>('.limr-overlay-surface');\n const card = element.querySelector<HTMLElement>('.limr-overlay-card');\n const previousBody = sameCard ? (content.current?.effect as KeyframeEffect | null)?.target as HTMLElement | null : null;\n const body = presentationChanged || expanded ? card : previousBody?.isConnected ? previousBody : element.querySelector<HTMLElement>('[data-limr-card-body], .limr-overlay-content');\n const bodyStyle = body ? getComputedStyle(body) : null;\n // Snapshot before cancelling any effects; interruption never jumps to an\n // endpoint, even during a preview-to-dialog morph or an unfinished exit.\n const liveSurface = { opacity: computed.opacity, clipPath: computed.clipPath };\n const liveTransform = computed.transform;\n const liveBody = { opacity: bodyStyle?.opacity ?? '1', transform: bodyStyle?.transform ?? 'none', clipPath: bodyStyle?.clipPath ?? 'none' };\n let before = sameCard ? previous.current : expanded ? previewRect ?? null : null;\n // React has moved the host; apply the live transform to its OLD rectangle.\n if (before && sameCard && hero.current && computed.transform !== 'none') {\n const matrix = new DOMMatrixReadOnly(computed.transform);\n before = new DOMRect(before.x + matrix.m41, before.y + matrix.m42, before.width, before.height);\n }\n if (before && sameCard && shell && shape.current) {\n const matrix = new DOMMatrixReadOnly(getComputedStyle(shell).transform);\n before = new DOMRect(before.x, before.y, before.width * matrix.a, before.height * matrix.d);\n }\n const target = host.getBoundingClientRect();\n const anchorRect = anchor?.getBoundingClientRect() ?? target;\n const originX = Math.max(0, Math.min(100, ((anchorRect.left + anchorRect.right) / 2 - target.left) / Math.max(1, target.width) * 100));\n const radius = computed.borderRadius || '8px';\n const collapsed = `inset(${edge === 'bottom' ? 100 : 0}% ${100 - originX}% ${edge === 'bottom' ? 0 : 100}% ${originX}% round ${radius})`;\n // Leave room for the old, larger shell while it shrinks to a preview.\n const overflow = Math.max(48, (before?.width ?? 0) - target.width + 48, (before?.height ?? 0) - target.height + 48);\n const revealed = `inset(-${overflow}px -${overflow}px -${overflow}px -${overflow}px round ${radius})`;\n const cancel = () => {\n reveal.current?.cancel(); content.current?.cancel(); hero.current?.cancel(); shape.current?.cancel();\n reveal.current = content.current = hero.current = shape.current = null;\n };\n cancel();\n state.current = { id, expanded, open };\n previous.current = target;\n if (reduced || !open && !sameCard) {\n delete element.dataset.motion;\n if (!open) latest.current.onExit();\n return;\n }\n const previewDuration = durationOf((computed.getPropertyValue('--limr-overlay-duration') || computed.getPropertyValue('--limr-overlay-enter-duration')).trim(), 560);\n const morphDuration = durationOf(computed.getPropertyValue('--limr-overlay-morph-duration').trim(), 480);\n const morph = open && !!before && (presentationChanged || !sameCard && expanded);\n const returning = !open && expanded && !!previewRect;\n const destination = returning ? previewRect : target;\n const duration = morph || expanded ? morphDuration : previewDuration;\n const easing = computed.getPropertyValue('--limr-overlay-ease').trim() || 'cubic-bezier(.22,1,.36,1)';\n element.dataset.motion = !open ? 'closing' : morph ? 'morphing' : 'opening';\n reveal.current = element.animate([\n sameCard ? { ...liveSurface, ...(morph ? { clipPath: revealed } : {}) } : { opacity: 0, clipPath: morph ? revealed : collapsed },\n { opacity: open ? 1 : 0, clipPath: open || returning ? revealed : collapsed },\n ], { duration, easing, fill: 'both' });\n if (before && (morph || liveTransform !== 'none' || returning)) {\n const x = before.left - target.left, y = before.top - target.top;\n const sx = before.width / Math.max(1, target.width), sy = before.height / Math.max(1, target.height);\n hero.current = element.animate([\n { transform: `translate(${x}px, ${y}px)` },\n { transform: `translate(${destination.left - target.left}px, ${destination.top - target.top}px)` },\n ], { duration, easing, fill: 'both' });\n // Only the painted background changes scale. The entire module UI,\n // including titles, inputs and controls, retains its natural text metrics.\n shape.current = shell?.animate([\n { transform: `scale(${sx}, ${sy})` },\n { transform: `scale(${destination.width / Math.max(1, target.width)}, ${destination.height / Math.max(1, target.height)})` },\n ], { duration, easing, fill: 'both' }) ?? null;\n }\n const delay = open ? morph ? 50 : !sameCard ? 35 : 0 : 0;\n content.current = body?.animate([\n sameCard && !morph ? liveBody : { opacity: 0, transform: 'translateY(6px)', clipPath: morph ? `inset(0px ${Math.max(0, target.width - before!.width)}px ${Math.max(0, target.height - before!.height)}px 0px)` : 'inset(0px)' },\n { opacity: open ? 1 : 0, transform: open ? 'translateY(0px)' : 'translateY(-4px)', clipPath: returning ? `inset(0px ${Math.max(0, target.width - destination.width)}px ${Math.max(0, target.height - destination.height)}px 0px)` : 'inset(0px)' },\n ], {\n // Content and surface settle together in either direction.\n duration: duration - delay, delay, easing, fill: 'both',\n }) ?? null;\n const current = reveal.current;\n const finish = () => {\n if (reveal.current !== current) return;\n if (![reveal.current, content.current, hero.current, shape.current].some(moving)) {\n delete element.dataset.motion;\n if (!latest.current.open) latest.current.onExit();\n else previous.current = host.getBoundingClientRect();\n }\n };\n for (const animation of [reveal.current, content.current, hero.current, shape.current]) if (animation) animation.onfinish = finish;\n finish();\n }, [element, host, anchor, open, expanded, ready, id, edge, previewRect]);\n useIsomorphicLayoutEffect(() => {\n if (host && open && ready && !moving(hero.current)) previous.current = host.getBoundingClientRect();\n });\n useIsomorphicLayoutEffect(() => {\n if (!host || !open) return;\n const observer = new ResizeObserver(() => { if (!moving(hero.current)) previous.current = host.getBoundingClientRect(); });\n observer.observe(host);\n return () => observer.disconnect();\n }, [host, open, id]);\n useIsomorphicLayoutEffect(() => () => {\n reveal.current?.cancel(); content.current?.cancel(); hero.current?.cancel(); shape.current?.cancel();\n reveal.current = content.current = hero.current = shape.current = null;\n state.current = null; previous.current = null;\n if (element) delete element.dataset.motion;\n }, [element]);\n}\n","import { useEffect, useId, useMemo, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { autoUpdate, FloatingPortal, offset, shift, useFloating } from '@floating-ui/react';\nimport { defaultHighlight, resolveAnnotationAnchors, sameRange, selectionFromRange, type Annotation, type HighlightData } from '../core';\nimport { copyText, deleteAnnotations, highlightPalette, highlightSelection } from '../extensions/actions';\nimport { useAppearance, useRuntime, useSelection, useStoreSelector, useTheme } from '../react/context';\nimport type { ActionContext, SelectionAction, StyledProps, ToolbarActionContext } from '../react/types';\nimport { annotationReferenceText } from './annotation-reference';\nimport { OverlayScrollArea } from './OverlayScrollArea';\nimport { Collapse } from './Collapse';\n\nexport interface SelectionToolbarProps extends StyledProps {\n /** Replaces the built-in actions. Extension actions are added. */\n actions?: readonly SelectionAction[];\n portalRoot?: HTMLElement | null;\n /** Maximum panel body height in pixels; plugins inherit the available space. */\n maxPanelHeight?: number;\n render?: (props: { context: ActionContext; actions: readonly SelectionAction[]; run: (action: SelectionAction) => Promise<void> }) => ReactNode;\n}\nconst defaults = [highlightPalette(), highlightSelection(), copyText(), deleteAnnotations()];\n\nexport function SelectionToolbar({ actions, portalRoot, maxPanelHeight = 260, className = '', style, render }: SelectionToolbarProps) {\n const runtime = useRuntime();\n const appearance = useAppearance(), theme = useTheme();\n const selection = useSelection();\n const interaction = useStoreSelector(runtime.interaction, value => value);\n const decorations = useStoreSelector(runtime.decorations, value => value);\n const config = useStoreSelector(runtime.configuration, value => value);\n const paint = interaction.activeHighlight ? decorations.highlights.get(interaction.activeHighlight) : null;\n const active = decorations.occurrences.find(item => item.id === interaction.active);\n const hiddenActive = active && [...decorations.highlights.values()].some(item => item.hidden && sameRange(item.range, active.range));\n const combined = useMemo(() => {\n const map = new Map((actions ?? defaults).map(action => [action.id, action]));\n config.extensions?.forEach(extension => extension.actions?.forEach(action => map.set(action.id, action)));\n actions?.forEach(action => map.set(action.id, action));\n const order = (action: SelectionAction) => action.placement === 'start' ? -1 : action.placement === 'end' ? 1 : 0;\n return [...map.values()].sort((a, b) => order(a) - order(b));\n }, [config.extensions, actions]);\n const [busy, setBusy] = useState<string | null>(null);\n const busyRef = useRef(false);\n const [error, setError] = useState<string | null>(null);\n const [expanded, setExpanded] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n const [deleteHintOpen, setDeleteHintOpen] = useState(false);\n const [preferredHighlight, setPreferredHighlight] = useState<HighlightData>(defaultHighlight);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const successTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const panelId = useId();\n const documentSnapshot = runtime.document.getSnapshot();\n const effectiveSelection = useMemo(() => {\n if (selection) return selection;\n // Dismissed annotations can retain their edit state for later resumption.\n // Only the active annotation's editor suppresses highlight actions.\n if (interaction.editing && active?.annotationIds.includes(interaction.editing)) return null;\n const range = paint?.range ?? (hiddenActive ? active?.range : undefined);\n return range ? selectionFromRange(documentSnapshot, range, {\n text: paint ? runtime.highlightReference?.text ?? annotationReferenceText(documentSnapshot, { id: paint.id, annotationIds: [], range }) : annotationReferenceText(documentSnapshot, active!),\n }) : null;\n }, [documentSnapshot, paint, active, selection, interaction.editing, hiddenActive]);\n const annotations = useMemo(() => effectiveSelection ? [...decorations.annotations.values()].filter(annotation =>\n resolveAnnotationAnchors(annotation, documentSnapshot).some(anchor => [...effectiveSelection.raw.ranges, ...effectiveSelection.syntax.ranges].some(range => sameRange(anchor.range, range)))) : [], [decorations, effectiveSelection, documentSnapshot]);\n const highlight = (paint ? decorations.annotations.get(paint.annotationId) : annotations.find(annotation => annotation.type === 'highlight')) as Annotation<HighlightData> | undefined;\n const highlightAppearance = highlight?.data ?? preferredHighlight;\n const context: ActionContext | null = effectiveSelection ? {\n ...runtime.commands, selection: effectiveSelection, annotations, highlight: highlight ?? null, locale: runtime.locale,\n addAnnotation: (annotation, options) => runtime.commands.addAnnotation(annotation, { highlight: highlightAppearance, ...options }),\n document: documentSnapshot, signal: runtime.signal, clearSelection: () => runtime.clearSelection(),\n } : null;\n const available = context ? combined.filter(action => action.visible?.(context) ?? true) : [];\n const expandedAction = available.find(action => action.id === expanded && action.renderExpanded);\n const hasPanels = available.some(action => action.renderExpanded);\n const open = !!context && effectiveSelection!.settled && available.length > 0;\n const { refs, floatingStyles, placement, isPositioned } = useFloating({\n open, strategy: 'fixed', placement: 'bottom',\n middleware: [offset(10), { name: 'toolbarSpace', options: { hasPanels, maxPanelHeight }, fn({ rects, placement, elements }) {\n const viewport = window.visualViewport;\n const root = runtime.configuration.get().scrollRoot?.getBoundingClientRect();\n const top = Math.max(viewport?.offsetTop ?? 0, root?.top ?? 0);\n const bottom = Math.min((viewport?.offsetTop ?? 0) + (viewport?.height ?? window.innerHeight), root?.bottom ?? Infinity);\n const above = Math.max(0, rects.reference.y - top - 20), below = Math.max(0, bottom - rects.reference.y - rects.reference.height - 20);\n const row = (elements.floating.querySelector('.limr-toolbar-actions')?.getBoundingClientRect().height ?? 34) + (elements.floating.querySelector('.limr-toolbar-delete-hint')?.getBoundingClientRect().height ?? 0);\n const limit = Math.max(0, parseFloat(getComputedStyle(elements.floating).getPropertyValue('--limr-toolbar-panel-max-height')) || maxPanelHeight);\n const needed = row + (hasPanels ? limit : 0) + 24;\n // Reserve the same budget while closed or expanded, so hover never moves the action row.\n const next = below >= needed || below >= above ? 'bottom' : 'top';\n const room = next === 'bottom' ? below : above;\n elements.floating.style.setProperty('--limr-toolbar-panel-height', `${Math.max(0, Math.min(limit, room - row - 24))}px`);\n elements.floating.style.setProperty('--limr-toolbar-available-height', `${room}px`);\n return placement !== next ? { reset: { placement: next } } : {};\n } }, shift({ padding: 10 })], whileElementsMounted: autoUpdate,\n });\n useEffect(() => {\n const reference = selection ? runtime.selectionRange : paint ? runtime.highlightReference : active ? runtime.anchors.get(active.id) : null;\n if (reference) refs.setPositionReference({ getBoundingClientRect: () => reference.getBoundingClientRect(), getClientRects: () => reference.getClientRects(), contextElement: runtime.content ?? undefined });\n }, [runtime, refs, selection, paint, active]);\n const selectionKey = effectiveSelection?.raw.ranges.map(range => `${range.start}-${range.end}`).join(',') ?? '';\n useEffect(() => { setError(null); setExpanded(null); setSuccess(null); setDeleteHintOpen(false); clearTimeout(closeTimer.current); clearTimeout(successTimer.current); }, [selectionKey, open]);\n useEffect(() => () => { clearTimeout(closeTimer.current); clearTimeout(successTimer.current); }, []);\n const dismiss = () => { runtime.clearSelection(); runtime.activate(null); };\n useEffect(() => {\n if (!open) return;\n const down = (event: PointerEvent) => {\n if (event.target instanceof Element && event.target.closest('[data-limr-selection-ui],.limr-sidebar-card,.limr-overlay-positioner,[data-limr-anchor]')) return;\n if (runtime.interaction.get().activeHighlight) runtime.clearSelection();\n };\n const key = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n if (expanded) {\n setExpanded(null);\n refs.floating.current?.querySelector<HTMLButtonElement>(`[data-action-id=\"${CSS.escape(expanded)}\"] button`)?.focus();\n } else dismiss();\n event.preventDefault();\n };\n document.addEventListener('pointerdown', down); document.addEventListener('keydown', key);\n return () => { document.removeEventListener('pointerdown', down); document.removeEventListener('keydown', key); };\n }, [open, expanded, runtime, refs]);\n const expand = (id: string) => { clearTimeout(closeTimer.current); setExpanded(id); };\n const execute = async (action: SelectionAction, operation: () => void | Promise<void>) => {\n if (!context || busyRef.current || action.disabled?.(context)) return;\n busyRef.current = true; setBusy(action.id); setError(null);\n try { await operation(); }\n catch (cause) { if (!runtime.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause)); }\n finally { busyRef.current = false; if (!runtime.signal.aborted) setBusy(null); }\n };\n const actionContext = (action: SelectionAction): ToolbarActionContext => ({\n ...context!, busy: !!busy, expanded: expanded === action.id, highlightAppearance, setHighlightAppearance: setPreferredHighlight,\n expand: () => expand(action.id), collapse: () => setExpanded(null),\n run: operation => execute(action, () => operation(context!)),\n });\n const run = (action: SelectionAction) => execute(action, async () => {\n if (action.run) await action.run(actionContext(action));\n else if (action.renderExpanded) expanded === action.id ? setExpanded(null) : expand(action.id);\n if (action.successLabel && !runtime.signal.aborted) {\n setSuccess(action.id); clearTimeout(successTimer.current);\n successTimer.current = setTimeout(() => setSuccess(null), 2400);\n }\n });\n if (!open || !context) return null;\n const label = (action: SelectionAction) => {\n const value = success === action.id && action.successLabel ? action.successLabel : action.label;\n return typeof value === 'function' ? value(context) : value;\n };\n const annotationCount = annotations.filter(annotation => annotation.type !== 'highlight').length;\n const hint = available.some(action => action.id === 'delete-annotations') && annotationCount > 1 ? context.locale.deleteAnnotationsHint.replace('{count}', String(annotationCount)) : null;\n return <FloatingPortal root={portalRoot}><div ref={refs.setFloating} className={`limr-selection-toolbar ${className}`} style={{ ...style, ...floatingStyles, visibility: isPositioned ? undefined : 'hidden' }} role=\"toolbar\" aria-label=\"Text actions\" data-limr-selection-ui=\"true\" data-limr-theme={theme} data-limr-appearance={appearance} data-placement={placement} data-highlight={highlight?.id} data-expanded={expandedAction?.id}\n onMouseDown={event => { if (!(event.target instanceof Element) || !event.target.closest('input,textarea,select,[contenteditable]')) event.preventDefault(); }}\n onPointerEnter={() => clearTimeout(closeTimer.current)}\n onPointerLeave={event => {\n if (event.pointerType !== 'mouse' || event.currentTarget.contains(document.activeElement)) return;\n closeTimer.current = setTimeout(() => setExpanded(null), 200);\n }}\n onBlur={event => { if (!event.currentTarget.contains(event.relatedTarget) && !event.currentTarget.matches(':hover')) setExpanded(null); }}\n onKeyDown={event => {\n if (event.target instanceof Element && event.target.closest('.limr-toolbar-panel')) return;\n if (!['ArrowRight', 'ArrowLeft', 'Home', 'End', 'ArrowDown', 'ArrowUp'].includes(event.key)) return;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n const id = (event.target as Element).closest<HTMLElement>('[data-action-id]')?.dataset.actionId;\n const action = available.find(item => item.id === id);\n if (action?.renderExpanded) { expand(action.id); requestAnimationFrame(() => refs.floating.current?.querySelector<HTMLElement>('.limr-toolbar-panel button,.limr-toolbar-panel input,.limr-toolbar-panel textarea')?.focus()); }\n } else {\n const buttons = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>('.limr-toolbar-actions button:not(:disabled)'));\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const index = event.key === 'Home' ? 0 : event.key === 'End' ? buttons.length - 1 : (current + (event.key === 'ArrowRight' ? 1 : buttons.length - 1)) % buttons.length;\n buttons[index]?.focus();\n }\n event.preventDefault();\n }}>\n <div className=\"limr-toolbar-surface\" key={selectionKey} data-ready={isPositioned || undefined}>\n <div className=\"limr-toolbar-actions\">{render ? render({ context, actions: available, run }) : available.map((action, index) => <div className=\"limr-toolbar-item\" key={action.id} data-action-id={action.id} data-active={expanded === action.id || undefined} data-tone={action.tone} data-status={success === action.id ? 'success' : undefined} style={{ '--limr-tool-index': index } as CSSProperties}\n onPointerEnter={event => {\n if (event.pointerType !== 'mouse' || busy || action.disabled?.(context)) return;\n if (expandedAction && expandedAction.id !== action.id && refs.floating.current?.querySelector('.limr-toolbar-panel')?.contains(document.activeElement)) return;\n clearTimeout(closeTimer.current);\n if (action.renderExpanded) expand(action.id); else setExpanded(null);\n try { action.onHover?.(actionContext(action)); }\n catch (cause) { setError(cause instanceof Error ? cause.message : String(cause)); }\n }}>\n {action.render ? action.render(actionContext(action)) : <button className=\"limr-toolbar-action\" type=\"button\" disabled={!!busy || action.disabled?.(context)} onClick={() => void run(action)} aria-label={label(action)} aria-busy={busy === action.id} aria-expanded={action.renderExpanded ? expanded === action.id : undefined} aria-controls={action.renderExpanded && expanded === action.id ? panelId : undefined}\n aria-describedby={action.id === 'delete-annotations' && hint && deleteHintOpen ? `${panelId}-delete` : undefined}\n onPointerEnter={event => { if (action.id === 'delete-annotations' && event.pointerType !== 'touch') setDeleteHintOpen(true); }}\n onPointerLeave={event => { if (action.id === 'delete-annotations') setDeleteHintOpen(event.currentTarget.matches(':focus-visible')); }}\n onFocus={event => { if (action.id === 'delete-annotations' && event.currentTarget.matches(':focus-visible')) setDeleteHintOpen(true); }}\n onBlur={event => { if (action.id === 'delete-annotations' && !event.currentTarget.matches(':hover')) setDeleteHintOpen(false); }}>\n <span className=\"limr-tool-face\" data-visible={success !== action.id || undefined} aria-hidden=\"true\">\n <span className=\"limr-tool-icon\" key={typeof action.label === 'function' ? action.label(context) : action.label}>{typeof action.icon === 'function' ? action.icon(context) : action.icon}</span><span className=\"limr-tool-label limr-underline\">{typeof action.label === 'function' ? action.label(context) : action.label}</span>\n </span>\n {action.successLabel && <span className=\"limr-tool-face\" data-visible={success === action.id || undefined} aria-hidden=\"true\">\n <span className=\"limr-tool-icon\">{action.successIcon ?? (typeof action.icon === 'function' ? action.icon(context) : action.icon)}</span><span className=\"limr-tool-label limr-underline\">{typeof action.successLabel === 'function' ? action.successLabel(context) : action.successLabel}</span>\n </span>}\n </button>}\n </div>)}</div>\n {expandedAction && <div id={panelId} className=\"limr-toolbar-panel\" key={expandedAction.id} role=\"group\" aria-label={label(expandedAction)}><OverlayScrollArea active label={label(expandedAction)}>{expandedAction.renderExpanded!(actionContext(expandedAction))}</OverlayScrollArea></div>}\n {hint && <Collapse open={deleteHintOpen} keepMounted className=\"limr-toolbar-delete-warning\"><p id={`${panelId}-delete`} className=\"limr-toolbar-delete-hint\">{hint}</p></Collapse>}\n {error && <span role=\"alert\" className=\"limr-action-error\">{error}</span>}\n </div>\n </div></FloatingPortal>;\n}\n"],"mappings":"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","names":["useEffect","useId","useRef","useState","useEffect","useEffect","useEffect","useRef","useState","useEffect","jsx","jsxs","useEffect","document","Fragment","jsx","jsxs","document","useRef","useState","element","height","size","useEffect","displacement","active","hovered","style","useEffect","useState","useSyncExternalStore","useRef","useRef","jsx","jsxs","useSyncExternalStore","useState","useEffect","update","anchor","availableHeight","useEffect","useMemo","useRef","useState","autoUpdate","FloatingPortal","offset","shift","useFloating","jsx","jsxs","useMemo","useState","useRef","useFloating","offset","placement","shift","autoUpdate","useEffect","FloatingPortal","Fragment","jsx","jsxs","useRef","useState","useEffect","useId"]}
@@ -434,6 +434,18 @@ function selectionFromRange(document, raw, options = {}) {
434
434
  // src/core/annotations.ts
435
435
  var defaultHighlight = { color: "#F2C744", style: "background" };
436
436
  var sameRange = (a, b) => a.start === b.start && a.end === b.end;
437
+ function annotationReferenceRange(document, occurrence) {
438
+ if (!occurrence.embedded) return occurrence.range;
439
+ let reference = occurrence.range;
440
+ const visit = (node) => {
441
+ const range = rangeOf(node);
442
+ if (!intersects(range, occurrence.range)) return;
443
+ if (["paragraph", "heading", "listItem", "tableCell"].includes(node.type)) reference = range;
444
+ node.children?.forEach(visit);
445
+ };
446
+ for (const block of document.blocks) if (intersects(block.range, occurrence.range)) visit(block.node);
447
+ return reference;
448
+ }
437
449
  function resolveAnnotationAnchors(annotation, document) {
438
450
  return (annotation.anchors ?? (annotation.range ? [{ range: annotation.range }] : [])).flatMap((anchor) => {
439
451
  if (anchor.documentId && anchor.documentId !== document.id) return [];
@@ -460,6 +472,7 @@ export {
460
472
  selectionFromRange,
461
473
  defaultHighlight,
462
474
  sameRange,
475
+ annotationReferenceRange,
463
476
  resolveAnnotationAnchors
464
477
  };
465
- //# sourceMappingURL=chunk-7JF5HHVF.js.map
478
+ //# sourceMappingURL=chunk-TTISGBST.js.map