@aceshooting/lyra-ui 29.0.2 → 29.1.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 (521) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +19 -26
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migrate-wa.mjs +2 -0
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +5 -3
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +4 -3
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
  8. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +21 -5
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +14 -11
  10. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +34 -7
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +25 -11
  14. package/dist/components/agent-tools/eval-result/eval-result-source.js +1 -0
  15. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +31 -11
  16. package/dist/components/agent-tools/eval-result/eval-result.class.js +29 -15
  17. package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -1
  18. package/dist/components/agent-tools/eval-result/eval-run-result.d.ts +10 -0
  19. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +26 -5
  20. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -6
  21. package/dist/components/agent-tools/span-waterfall/span-waterfall.d.ts +1 -1
  22. package/dist/components/agent-tools/span-waterfall/span-waterfall.js +1 -1
  23. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
  24. package/dist/components/agent-tools/task-list/task-list.class.d.ts +29 -6
  25. package/dist/components/agent-tools/task-list/task-list.class.js +13 -7
  26. package/dist/components/agent-tools/task-list/task-list.d.ts +1 -1
  27. package/dist/components/agent-tools/task-list/task-list.js +1 -1
  28. package/dist/components/agent-tools/task-list/task-list.styles.js +1 -1
  29. package/dist/components/agent-tools/terminal/terminal.class.d.ts +9 -5
  30. package/dist/components/agent-tools/terminal/terminal.class.js +8 -8
  31. package/dist/components/agent-tools/test-results/test-results.class.d.ts +16 -4
  32. package/dist/components/agent-tools/test-results/test-results.class.js +15 -6
  33. package/dist/components/agent-tools/test-results/test-results.d.ts +1 -0
  34. package/dist/components/agent-tools/test-results/test-results.js +1 -1
  35. package/dist/components/agent-tools/test-results/test-results.styles.js +1 -1
  36. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +7 -4
  37. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -1
  38. package/dist/components/agent-tools/trace-tree/span-projection.js +1 -0
  39. package/dist/components/agent-tools/trace-tree/span-shared.d.ts +29 -0
  40. package/dist/components/agent-tools/trace-tree/span-shared.js +1 -0
  41. package/dist/components/agent-tools/trace-tree/span.d.ts +5 -35
  42. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  43. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +27 -5
  44. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +19 -9
  45. package/dist/components/agent-tools/trace-tree/trace-tree.d.ts +1 -1
  46. package/dist/components/agent-tools/trace-tree/trace-tree.js +1 -1
  47. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
  48. package/dist/components/charts/chart/bar-chart.class.d.ts +5 -1
  49. package/dist/components/charts/chart/box-plot.class.d.ts +2 -2
  50. package/dist/components/charts/chart/box-plot.class.js +3 -3
  51. package/dist/components/charts/chart/bubble-chart.class.d.ts +5 -1
  52. package/dist/components/charts/chart/chart-prepared-data.d.ts +9 -0
  53. package/dist/components/charts/chart/chart-prepared-data.js +1 -0
  54. package/dist/components/charts/chart/chart-spatial-data.js +2 -0
  55. package/dist/components/charts/chart/chart-sync.js +1 -1
  56. package/dist/components/charts/chart/chart-table-sampling.js +1 -1
  57. package/dist/components/charts/chart/chart.class.d.ts +56 -6
  58. package/dist/components/charts/chart/chart.class.js +18 -8
  59. package/dist/components/charts/chart/chart.styles.js +1 -1
  60. package/dist/components/charts/chart/doughnut-chart.class.d.ts +5 -1
  61. package/dist/components/charts/chart/histogram-buckets.d.ts +1 -1
  62. package/dist/components/charts/chart/histogram-buckets.js +1 -1
  63. package/dist/components/charts/chart/histogram.class.d.ts +19 -4
  64. package/dist/components/charts/chart/histogram.class.js +1 -1
  65. package/dist/components/charts/chart/line-chart.class.d.ts +5 -1
  66. package/dist/components/charts/chart/lite-chart.class.d.ts +51 -11
  67. package/dist/components/charts/chart/lite-chart.class.js +33 -27
  68. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  69. package/dist/components/charts/chart/pie-chart.class.d.ts +5 -1
  70. package/dist/components/charts/chart/polar-area-chart.class.d.ts +5 -1
  71. package/dist/components/charts/chart/radar-chart.class.d.ts +5 -1
  72. package/dist/components/charts/chart/scatter-chart.class.d.ts +5 -1
  73. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +6 -3
  74. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +6 -5
  75. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -1
  76. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +8 -0
  77. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  78. package/dist/components/conversation/code-block/code-block-base.class.d.ts +5 -3
  79. package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
  80. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -1
  81. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  82. package/dist/components/conversation/code-block/code-block-shared.d.ts +6 -4
  83. package/dist/components/conversation/code-block/code-block-shared.js +3 -2
  84. package/dist/components/conversation/code-block/code-block.class.d.ts +11 -4
  85. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  86. package/dist/components/conversation/code-block/code-block.d.ts +1 -1
  87. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  88. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  89. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  90. package/dist/components/conversation/markdown/markdown-base.class.d.ts +6 -4
  91. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  92. package/dist/components/conversation/markdown/markdown-code-header.d.ts +2 -2
  93. package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
  94. package/dist/components/conversation/markdown/markdown-core.class.d.ts +8 -3
  95. package/dist/components/conversation/markdown/markdown-progressive.js +2 -2
  96. package/dist/components/conversation/markdown/markdown-shared.d.ts +5 -10
  97. package/dist/components/conversation/markdown/markdown-shared.js +5 -5
  98. package/dist/components/conversation/markdown/markdown-streaming-tail.js +1 -1
  99. package/dist/components/conversation/markdown/markdown.class.d.ts +17 -10
  100. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  101. package/dist/components/conversation/markdown/markdown.styles.js +1 -1
  102. package/dist/components/conversation/model-select/model-select.class.d.ts +4 -3
  103. package/dist/components/conversation/model-select/model-select.class.js +3 -2
  104. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  105. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +2 -1
  106. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
  107. package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +1 -1
  108. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -2
  109. package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -1
  110. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  111. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +10 -2
  112. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +15 -6
  113. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
  114. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +3 -1
  115. package/dist/components/conversation/realtime-session/realtime-session.class.js +2 -1
  116. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  117. package/dist/components/conversation/streaming-text/markdown-detection.d.ts +2 -0
  118. package/dist/components/conversation/streaming-text/markdown-detection.js +4 -1
  119. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +6 -2
  120. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +3 -3
  121. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -1
  122. package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
  123. package/dist/components/conversation/thread-list/thread-list.class.d.ts +34 -4
  124. package/dist/components/conversation/thread-list/thread-list.class.js +22 -15
  125. package/dist/components/conversation/thread-list/thread-list.d.ts +1 -1
  126. package/dist/components/conversation/thread-list/thread-list.js +1 -1
  127. package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
  128. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +6 -2
  129. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +3 -2
  130. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
  131. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +3 -2
  132. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -2
  133. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  134. package/dist/components/data/calendar/calendar.class.d.ts +5 -2
  135. package/dist/components/data/calendar/calendar.class.js +1 -1
  136. package/dist/components/data/data-grid/data-grid-processing.js +2 -2
  137. package/dist/components/data/data-grid/data-grid.class.d.ts +22 -8
  138. package/dist/components/data/data-grid/data-grid.class.js +20 -19
  139. package/dist/components/data/data-grid/data-grid.styles.js +1 -1
  140. package/dist/components/data/document-library/document-library.class.d.ts +31 -4
  141. package/dist/components/data/document-library/document-library.class.js +25 -12
  142. package/dist/components/data/document-library/document-library.styles.js +1 -1
  143. package/dist/components/data/file-tree/file-tree.class.d.ts +30 -6
  144. package/dist/components/data/file-tree/file-tree.class.js +4 -3
  145. package/dist/components/data/file-tree/file-tree.d.ts +1 -0
  146. package/dist/components/data/file-tree/file-tree.js +1 -1
  147. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +31 -6
  148. package/dist/components/data/flow-canvas/flow-canvas.class.js +40 -19
  149. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  150. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  151. package/dist/components/data/flow-canvas/flow-source.js +1 -0
  152. package/dist/components/data/flow-canvas/flow-types.d.ts +4 -2
  153. package/dist/components/data/flow-canvas/flow-viewport-index.js +1 -0
  154. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +9 -3
  155. package/dist/components/data/flow-minimap/flow-minimap.class.js +11 -2
  156. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  157. package/dist/components/data/funnel/funnel.class.d.ts +7 -3
  158. package/dist/components/data/funnel/funnel.class.js +2 -2
  159. package/dist/components/data/heatmap/calendar-grid.d.ts +1 -1
  160. package/dist/components/data/heatmap/calendar-grid.js +1 -1
  161. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
  162. package/dist/components/data/heatmap/heatmap-limits.d.ts +1 -1
  163. package/dist/components/data/heatmap/heatmap-matrix-source-controller.js +1 -0
  164. package/dist/components/data/heatmap/heatmap-matrix-source.d.ts +5 -0
  165. package/dist/components/data/heatmap/heatmap-matrix-source.js +1 -0
  166. package/dist/components/data/heatmap/heatmap-scale.d.ts +0 -16
  167. package/dist/components/data/heatmap/heatmap-scale.js +1 -1
  168. package/dist/components/data/heatmap/heatmap.class.d.ts +40 -11
  169. package/dist/components/data/heatmap/heatmap.class.js +26 -6
  170. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  171. package/dist/components/data/pagination/pagination.class.js +1 -1
  172. package/dist/components/data/sequence-strip/sequence-strip-item.d.ts +17 -0
  173. package/dist/components/data/sequence-strip/sequence-strip-source-controller.js +1 -0
  174. package/dist/components/data/sequence-strip/sequence-strip-source.d.ts +5 -0
  175. package/dist/components/data/sequence-strip/sequence-strip-source.js +1 -0
  176. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +24 -19
  177. package/dist/components/data/sequence-strip/sequence-strip.class.js +23 -4
  178. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  179. package/dist/components/data/sparkline/sparkline.class.d.ts +17 -4
  180. package/dist/components/data/sparkline/sparkline.class.js +3 -3
  181. package/dist/components/data/sparkline/sparkline.styles.js +1 -1
  182. package/dist/components/data/table/table.class.d.ts +14 -10
  183. package/dist/components/data/table/table.class.js +17 -16
  184. package/dist/components/data/timeline/timeline.class.d.ts +5 -2
  185. package/dist/components/data/timeline/timeline.class.js +1 -1
  186. package/dist/components/data/tree/tree-item.class.js +1 -1
  187. package/dist/components/data/tree/tree-owner-controller.js +1 -1
  188. package/dist/components/data/tree/tree.class.d.ts +28 -6
  189. package/dist/components/data/tree/tree.class.js +3 -3
  190. package/dist/components/data/tree/tree.d.ts +1 -0
  191. package/dist/components/data/tree/tree.js +1 -1
  192. package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -7
  193. package/dist/components/data/word-cloud/word-cloud.class.js +6 -4
  194. package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
  195. package/dist/components/forms/catalog-picker-base.d.ts +1 -1
  196. package/dist/components/forms/catalog-picker-base.js +6 -6
  197. package/dist/components/forms/catalog-picker-base.styles.js +1 -1
  198. package/dist/components/forms/combobox/combobox.class.d.ts +7 -3
  199. package/dist/components/forms/combobox/combobox.class.js +1 -1
  200. package/dist/components/forms/combobox/option.class.d.ts +4 -2
  201. package/dist/components/forms/combobox/option.class.js +2 -2
  202. package/dist/components/forms/country-picker/country-picker.class.d.ts +3 -1
  203. package/dist/components/forms/country-picker/country-picker.class.js +1 -1
  204. package/dist/components/forms/currency-picker/currency-picker.class.d.ts +2 -0
  205. package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
  206. package/dist/components/forms/currency-picker/currency-presentation.js +1 -1
  207. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +6 -2
  208. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -2
  209. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
  210. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +8 -2
  211. package/dist/components/forms/locale-picker/locale-picker.class.js +5 -4
  212. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  213. package/dist/components/forms/select/select.class.d.ts +11 -3
  214. package/dist/components/forms/select/select.class.js +4 -4
  215. package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +2 -0
  216. package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
  217. package/dist/components/forms/token-input/token-input.class.d.ts +6 -1
  218. package/dist/components/forms/token-input/token-input.class.js +15 -13
  219. package/dist/components/forms/unit-picker/unit-picker.class.d.ts +2 -0
  220. package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
  221. package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
  222. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  223. package/dist/components/layout/command-palette/command-palette.class.d.ts +5 -2
  224. package/dist/components/layout/command-palette/command-palette.class.js +2 -1
  225. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  226. package/dist/components/layout/menu/menu-item.class.d.ts +2 -2
  227. package/dist/components/layout/menu/menu-item.class.js +2 -2
  228. package/dist/components/layout/menu/menu.class.d.ts +1 -1
  229. package/dist/components/layout/menu/menu.class.js +1 -1
  230. package/dist/components/layout/menubar/menubar.class.d.ts +1 -1
  231. package/dist/components/layout/menubar/menubar.class.js +1 -1
  232. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -2
  233. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
  234. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
  235. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  236. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +13 -9
  237. package/dist/components/layout/virtual-list/virtual-list.class.js +21 -17
  238. package/dist/components/media/av-player/av-cue-index.js +1 -0
  239. package/dist/components/media/av-player/av-cue-source.d.ts +13 -0
  240. package/dist/components/media/av-player/av-cue-source.js +1 -0
  241. package/dist/components/media/av-player/av-metadata.d.ts +2 -2
  242. package/dist/components/media/av-player/av-metadata.js +1 -1
  243. package/dist/components/media/av-player/av-player-cue-source-controller.js +1 -0
  244. package/dist/components/media/av-player/av-player.class.d.ts +34 -12
  245. package/dist/components/media/av-player/av-player.class.js +15 -10
  246. package/dist/components/media/flag/flag.class.js +1 -1
  247. package/dist/components/media/flag/language-map.js +1 -1
  248. package/dist/components/media/lightbox/lightbox-source.js +1 -0
  249. package/dist/components/media/lightbox/lightbox-types.d.ts +15 -0
  250. package/dist/components/media/lightbox/lightbox.class.d.ts +22 -21
  251. package/dist/components/media/lightbox/lightbox.class.js +6 -4
  252. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  253. package/dist/components/media/map/map-geojson-diff.d.ts +6 -6
  254. package/dist/components/media/map/map-geojson-diff.js +1 -1
  255. package/dist/components/media/map/map-loader.d.ts +5 -1
  256. package/dist/components/media/map/map.class.d.ts +24 -6
  257. package/dist/components/media/map/map.class.js +2 -2
  258. package/dist/components/media/map/map.styles.js +1 -1
  259. package/dist/components/media/video-playlist/video-playlist.class.d.ts +2 -1
  260. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  261. package/dist/components/overlays/chip/chip.class.d.ts +1 -1
  262. package/dist/components/overlays/chip/chip.class.js +1 -1
  263. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +30 -8
  264. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +22 -8
  265. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
  266. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  267. package/dist/components/retrieval/graph/graph-source-composition.js +1 -0
  268. package/dist/components/retrieval/graph/graph-source-controller.js +1 -0
  269. package/dist/components/retrieval/graph/graph-spatial-controller.js +2 -2
  270. package/dist/components/retrieval/graph/graph-spatial-model.js +1 -0
  271. package/dist/components/retrieval/graph/graph-spatial.js +1 -1
  272. package/dist/components/retrieval/graph/graph.class.d.ts +31 -6
  273. package/dist/components/retrieval/graph/graph.class.js +26 -5
  274. package/dist/components/retrieval/graph/graph.d.ts +1 -1
  275. package/dist/components/retrieval/graph/graph.js +1 -1
  276. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  277. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +33 -4
  278. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +27 -17
  279. package/dist/components/retrieval/ingestion-queue/ingestion-queue.d.ts +1 -1
  280. package/dist/components/retrieval/ingestion-queue/ingestion-queue.js +1 -1
  281. package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +1 -1
  282. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +27 -4
  283. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +29 -14
  284. package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
  285. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +17 -3
  286. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +15 -10
  287. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -1
  288. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -5
  289. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +17 -10
  290. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.d.ts +1 -1
  291. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.js +1 -1
  292. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  293. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  294. package/dist/components/retrieval/mind-map/mind-map-model.js +1 -0
  295. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +27 -4
  296. package/dist/components/retrieval/mind-map/mind-map.class.js +11 -7
  297. package/dist/components/retrieval/mind-map/mind-map.d.ts +1 -0
  298. package/dist/components/retrieval/mind-map/mind-map.js +1 -1
  299. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  300. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +24 -2
  301. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +17 -3
  302. package/dist/components/retrieval/neighbor-list/neighbor-list.d.ts +1 -1
  303. package/dist/components/retrieval/neighbor-list/neighbor-list.js +1 -1
  304. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
  305. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +8 -4
  306. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +11 -7
  307. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
  308. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +12 -6
  309. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +30 -17
  310. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
  311. package/dist/components/retrieval/retrieval-results/retrieval-results-model.js +1 -0
  312. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +46 -5
  313. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +31 -9
  314. package/dist/components/retrieval/retrieval-results/retrieval-results.d.ts +1 -1
  315. package/dist/components/retrieval/retrieval-results/retrieval-results.js +1 -1
  316. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +1 -1
  317. package/dist/components/utility/diff-view/diff-view.class.d.ts +16 -8
  318. package/dist/components/utility/diff-view/diff-view.class.js +3 -2
  319. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  320. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +31 -3
  321. package/dist/components/utility/json-viewer/json-viewer.class.js +13 -4
  322. package/dist/components/utility/json-viewer/json-viewer.d.ts +1 -0
  323. package/dist/components/utility/json-viewer/json-viewer.js +1 -1
  324. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  325. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +6 -4
  326. package/dist/components/utility/mention-popover/mention-popover.class.js +6 -5
  327. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +34 -7
  328. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +9 -7
  329. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +28 -4
  330. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +12 -11
  331. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -1
  332. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +17 -16
  333. package/dist/components/viewers/geojson-view/geojson-viewer.d.ts +1 -1
  334. package/dist/components/viewers/geojson-view/geojson-viewer.js +1 -1
  335. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +31 -5
  336. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +11 -8
  337. package/dist/components/viewers/table-viewer-shared.js +19 -3
  338. package/dist/components/viewers/viewer-search-limits.js +1 -1
  339. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +35 -3
  340. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +20 -5
  341. package/dist/components/viewers/xml-viewer/xml-viewer.d.ts +1 -1
  342. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  343. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  344. package/dist/countries.js +1 -1
  345. package/dist/data-sources.d.ts +34 -0
  346. package/dist/data-sources.js +1 -0
  347. package/dist/events.d.ts +51 -7
  348. package/dist/framework-types.d.ts +1 -1
  349. package/dist/internal/accessibility-visibility.d.ts +4 -2
  350. package/dist/internal/accessibility-visibility.js +1 -1
  351. package/dist/internal/accessible-text-controller.js +1 -1
  352. package/dist/internal/anchor-target.js +2 -2
  353. package/dist/internal/catalog-picker.d.ts +1 -7
  354. package/dist/internal/catalog-picker.js +1 -1
  355. package/dist/internal/collection-snapshot.js +1 -1
  356. package/dist/internal/default-strings/agent-tools.generated.js +1 -1
  357. package/dist/internal/default-strings/charts.generated.js +1 -1
  358. package/dist/internal/default-strings/conversation.generated.js +1 -1
  359. package/dist/internal/default-strings/data.generated.js +1 -1
  360. package/dist/internal/default-strings/forms.generated.js +1 -1
  361. package/dist/internal/default-strings/layout.generated.js +1 -1
  362. package/dist/internal/default-strings/media.generated.js +1 -1
  363. package/dist/internal/default-strings/retrieval.generated.js +1 -1
  364. package/dist/internal/default-strings/shared.generated.js +1 -1
  365. package/dist/internal/default-strings/utility.generated.js +1 -1
  366. package/dist/internal/delimited-data.js +1 -1
  367. package/dist/internal/fixed-containing-block.js +1 -1
  368. package/dist/internal/flow-scene-envelope.js +1 -0
  369. package/dist/internal/graph-scene-controller.js +1 -0
  370. package/dist/internal/hierarchy-source-controller.js +1 -0
  371. package/dist/internal/hierarchy-source-view.js +29 -0
  372. package/dist/internal/hierarchy-source-view.styles.js +1 -0
  373. package/dist/internal/inherited-attribute-hub.d.ts +6 -0
  374. package/dist/internal/inherited-attribute-hub.js +1 -1
  375. package/dist/internal/intl-cache.js +1 -1
  376. package/dist/internal/keyed-index.js +1 -0
  377. package/dist/internal/localization-types.d.ts +1 -1
  378. package/dist/internal/localization.js +2 -2
  379. package/dist/internal/lyra-element.d.ts +2 -2
  380. package/dist/internal/lyra-element.js +3 -2
  381. package/dist/internal/native-modal-context.js +1 -1
  382. package/dist/internal/option-selection.js +1 -1
  383. package/dist/internal/package-metadata.js +1 -1
  384. package/dist/internal/positioner.js +1 -1
  385. package/dist/internal/resource-loader.d.ts +2 -0
  386. package/dist/internal/resource-loader.js +1 -1
  387. package/dist/internal/scoped-definitions.generated.js +1 -1
  388. package/dist/internal/search-haystack.js +1 -0
  389. package/dist/internal/selection-catalog.d.ts +5 -0
  390. package/dist/internal/selection-catalog.js +1 -1
  391. package/dist/internal/shiki-language-sources.js +1 -0
  392. package/dist/internal/source-page-controller.js +1 -0
  393. package/dist/internal/source-page-scope.js +1 -0
  394. package/dist/internal/source-request-controller.js +1 -0
  395. package/dist/internal/source-window-controller.js +1 -0
  396. package/dist/internal/spatial-source-controller.js +1 -0
  397. package/dist/internal/text-quote.d.ts +2 -6
  398. package/dist/internal/text-quote.js +1 -1
  399. package/dist/internal/theme-watcher.js +1 -1
  400. package/dist/internal/virtual-list-composition.js +1 -0
  401. package/dist/lyra.d.ts +1 -1
  402. package/dist/lyra.js +1 -1
  403. package/dist/testing/interaction-drivers.js +1 -1
  404. package/dist/testing/lyra-tag-event-map.js +1 -1
  405. package/dist/units.js +1 -1
  406. package/dist/utilities/data-preparation.d.ts +56 -0
  407. package/dist/utilities/data-preparation.js +1 -0
  408. package/dist/utilities/data-spatial.d.ts +26 -0
  409. package/dist/utilities/data-spatial.js +1 -0
  410. package/dist/utilities/index.d.ts +1 -1
  411. package/dist/utilities/index.js +1 -1
  412. package/llms/components/lr-activity-feed.md +7 -2
  413. package/llms/components/lr-agent-trace.md +49 -9
  414. package/llms/components/lr-agent-workspace.md +15 -8
  415. package/llms/components/lr-av-player.md +180 -10
  416. package/llms/components/lr-bar-chart.md +1 -1
  417. package/llms/components/lr-box-plot.md +8 -0
  418. package/llms/components/lr-bubble-chart.md +1 -1
  419. package/llms/components/lr-calendar.md +26 -3
  420. package/llms/components/lr-chart.md +310 -23
  421. package/llms/components/lr-chat-viewport.md +6 -0
  422. package/llms/components/lr-code-block-core.md +12 -7
  423. package/llms/components/lr-code-block.md +23 -9
  424. package/llms/components/lr-combobox.md +27 -15
  425. package/llms/components/lr-command-palette.md +16 -3
  426. package/llms/components/lr-country-picker.md +23 -6
  427. package/llms/components/lr-csv-viewer.md +95 -12
  428. package/llms/components/lr-currency-picker.md +23 -3
  429. package/llms/components/lr-data-grid.md +24 -6
  430. package/llms/components/lr-dataset-viewer.md +92 -11
  431. package/llms/components/lr-dialog.md +1 -1
  432. package/llms/components/lr-diff-view.md +19 -6
  433. package/llms/components/lr-document-library.md +60 -5
  434. package/llms/components/lr-doughnut-chart.md +1 -1
  435. package/llms/components/lr-embedding-explorer.md +89 -9
  436. package/llms/components/lr-emoji-picker.md +7 -2
  437. package/llms/components/lr-eval-dataset.md +56 -7
  438. package/llms/components/lr-eval-result.md +89 -4
  439. package/llms/components/lr-export-button.md +1 -1
  440. package/llms/components/lr-file-tree.md +60 -6
  441. package/llms/components/lr-flag.md +5 -2
  442. package/llms/components/lr-flow-canvas.md +152 -14
  443. package/llms/components/lr-flow-minimap.md +32 -4
  444. package/llms/components/lr-funnel.md +14 -0
  445. package/llms/components/lr-geojson-viewer.md +27 -10
  446. package/llms/components/lr-graph.md +43 -7
  447. package/llms/components/lr-heatmap.md +161 -5
  448. package/llms/components/lr-histogram.md +55 -9
  449. package/llms/components/lr-ingestion-queue.md +54 -3
  450. package/llms/components/lr-json-viewer.md +87 -7
  451. package/llms/components/lr-knowledge-base-admin.md +60 -4
  452. package/llms/components/lr-knowledge-base.md +121 -9
  453. package/llms/components/lr-knowledge-graph-explorer.md +106 -11
  454. package/llms/components/lr-lightbox.md +42 -6
  455. package/llms/components/lr-line-chart.md +28 -5
  456. package/llms/components/lr-lite-chart.md +96 -31
  457. package/llms/components/lr-locale-picker.md +6 -4
  458. package/llms/components/lr-map.md +67 -8
  459. package/llms/components/lr-markdown-core.md +10 -5
  460. package/llms/components/lr-markdown.md +23 -6
  461. package/llms/components/lr-mention-popover.md +11 -6
  462. package/llms/components/lr-mind-map.md +91 -10
  463. package/llms/components/lr-model-select.md +8 -4
  464. package/llms/components/lr-model-settings-panel.md +10 -2
  465. package/llms/components/lr-navigation-menu.md +1 -1
  466. package/llms/components/lr-neighbor-list.md +69 -2
  467. package/llms/components/lr-pie-chart.md +1 -1
  468. package/llms/components/lr-polar-area-chart.md +1 -1
  469. package/llms/components/lr-prompt-input.md +9 -2
  470. package/llms/components/lr-prompt-queue.md +11 -3
  471. package/llms/components/lr-radar-chart.md +1 -1
  472. package/llms/components/lr-rag-eval-dashboard.md +9 -2
  473. package/llms/components/lr-realtime-session.md +6 -2
  474. package/llms/components/lr-reorder-list.md +4 -0
  475. package/llms/components/lr-retrieval-compare.md +9 -4
  476. package/llms/components/lr-retrieval-results.md +104 -6
  477. package/llms/components/lr-scatter-chart.md +1 -1
  478. package/llms/components/lr-select.md +20 -10
  479. package/llms/components/lr-sequence-strip.md +92 -2
  480. package/llms/components/lr-span-waterfall.md +78 -8
  481. package/llms/components/lr-sparkline.md +42 -11
  482. package/llms/components/lr-spreadsheet-viewer.md +109 -14
  483. package/llms/components/lr-streaming-text-core.md +4 -2
  484. package/llms/components/lr-streaming-text.md +5 -1
  485. package/llms/components/lr-table.md +96 -115
  486. package/llms/components/lr-task-list.md +93 -9
  487. package/llms/components/lr-terminal.md +9 -0
  488. package/llms/components/lr-test-results.md +77 -3
  489. package/llms/components/lr-thread-list.md +86 -1
  490. package/llms/components/lr-time-zone-picker.md +8 -3
  491. package/llms/components/lr-timeline.md +5 -0
  492. package/llms/components/lr-token-input.md +7 -2
  493. package/llms/components/lr-tool-timeline.md +13 -4
  494. package/llms/components/lr-trace-tree.md +96 -10
  495. package/llms/components/lr-transcript-feed.md +9 -2
  496. package/llms/components/lr-tree.md +87 -15
  497. package/llms/components/lr-unit-picker.md +8 -3
  498. package/llms/components/lr-video-playlist.md +2 -0
  499. package/llms/components/lr-virtual-list.md +17 -8
  500. package/llms/components/lr-voice-picker.md +8 -3
  501. package/llms/components/lr-word-cloud.md +128 -12
  502. package/llms/components/lr-xml-viewer.md +106 -9
  503. package/llms/index.md +1 -1
  504. package/llms/peers.md +1 -1
  505. package/llms/shared/events-and-types.md +725 -264
  506. package/llms/shared/forms-and-accessibility.md +3 -17
  507. package/llms/shared/imports-and-registration.md +3 -17
  508. package/llms/shared/localization-and-rtl.md +0 -2
  509. package/llms/shared/styles-and-tokens.md +27 -36
  510. package/llms/shared/testing-and-utilities.md +4 -5
  511. package/llms/shared.md +770 -349
  512. package/llms.txt +1 -2
  513. package/locales.json +139 -139
  514. package/package.json +13 -4
  515. package/registrations.json +1 -1
  516. package/skills/compose-lyra-interfaces/SKILL.md +6 -8
  517. package/skills/lyra-ui/SKILL.md +20 -51
  518. package/skills/lyra-ui/commands/review.md +16 -33
  519. package/skills/lyra-ui/commands/update.md +6 -5
  520. package/skills/lyra-ui/online-api.md +15 -0
  521. package/skills/lyra-ui/reporting.md +2 -1
@@ -1,2 +1,2 @@
1
1
  /** @deprecated Import @aceshooting/lyra-ui/components/lr-code-block.js to register this component. */
2
- export*from'./code-block.class.js';export type{ShikiLanguageInput}from'./shiki-types.js';import'../../overlays/skeleton/skeleton.js';import'../../forms/icon-button/icon-button-register.js';
2
+ export*from'./code-block.class.js';export type{ShikiLanguageInput,ShikiLanguageSource,ShikiLanguageLoader}from'./shiki-types.js';import'../../overlays/skeleton/skeleton.js';import'../../forms/icon-button/icon-button-register.js';
@@ -1 +1 @@
1
- import{iconHitTarget,focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { --_lr-code-block-copy-bg: transparent; --_lr-code-block-copy-bg-hover: var(--lr-color-brand-quiet); --_lr-code-block-copy-bg-active: color-mix( in oklab, var(--lr-icon-button-bg-hover, var(--lr-icon-button-background-hover, var(--lr-color-brand-quiet))), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); --_lr-code-block-copy-color: var(--lr-color-text-quiet); --_lr-code-block-copy-color-hover: var(--lr-color-brand); --_lr-code-block-copy-color-active: var(--lr-icon-button-color-hover, var(--lr-color-brand)); --_lr-code-block-copy-radius: var(--lr-radius); display: block; font-size: var(--lr-font-size-sm); } [part='base'] { display: flex; flex-direction: column; box-sizing: border-box; block-size: 100%; border: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); border-radius: var(--lr-radius); background: var(--lr-color-surface); overflow: hidden; } [part='header'] { display: flex; min-inline-size: 0; align-items: center; gap: var(--lr-space-xs); padding: var(--lr-space-xs) var(--lr-space-s); border-block-end: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); background: var(--lr-color-surface); font-family: var(--lr-font); } [part='toggle'] { font: inherit; inline-size: var(--lr-size-1-25rem); block-size: var(--lr-size-1-25rem); ${iconHitTarget} flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; padding: 0; border: none; background: none; color: var(--lr-color-text-quiet); border-radius: var(--lr-radius); cursor: pointer; } [part='toggle']:hover { background: var(--lr-color-brand-quiet); color: var(--lr-color-brand); } [part='toggle']:active { background: color-mix( in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); color: var(--lr-color-brand); } [part='toggle'] .chevron { display: inline-flex; transition: transform var(--lr-transition-fast); } :host(:not([collapsed])) [part='toggle'] .chevron { transform: rotate(90deg); } :host([collapsed]:dir(rtl)) [part='toggle'] .chevron { transform: scaleX(-1); } [part='filename'] { flex: 1 1 auto; min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--lr-code-block-font, var(--lr-font-mono)); font-size: var(--lr-font-size-xs); font-weight: var(--lr-font-weight-semibold); color: var(--lr-color-text); } [part='language'] { direction: ltr; unicode-bidi: isolate; flex: 0 1 auto; min-inline-size: 0; max-inline-size: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: var(--lr-size-0-0625rem) var(--lr-size-0-4375rem); border-radius: var(--lr-radius-pill); background: var(--lr-code-block-language-bg, var(--lr-color-brand-quiet)); color: var(--lr-code-block-language-color, var(--lr-color-brand)); font-size: var(--lr-size-0-6875rem); line-height: var(--lr-line-height-1-4); text-transform: uppercase; letter-spacing: var(--lr-size-0-02em); } [part~='copy-button'] { flex: 0 0 auto; margin-inline-start: auto; font-size: var(--lr-font-size-xs); line-height: var(--lr-line-height-none); --_lr-icon-button-background-default: var(--_lr-code-block-copy-bg); --_lr-icon-button-background-hover-default: var(--_lr-code-block-copy-bg-hover); --_lr-icon-button-background-active-default: var(--_lr-code-block-copy-bg-active); --_lr-icon-button-color-default: var(--_lr-code-block-copy-color); --_lr-icon-button-color-hover-default: var(--_lr-code-block-copy-color-hover); --_lr-icon-button-color-active-default: var(--_lr-code-block-copy-color-active); --_lr-icon-button-radius-default: var(--_lr-code-block-copy-radius); } [part~='copy-button-text']::part(button) { padding: var(--lr-size-0-1875rem) var(--lr-space-xs); } [part='toggle']:focus-visible { ${focusRing} } [part='header-actions'] { display: inline-flex; flex: 0 0 auto; align-items: center; gap: var(--lr-space-2xs); } [part='header-actions'][hidden] { display: none; } [part='body'] { direction: ltr; display: block; flex: 1 1 auto; block-size: 100%; max-block-size: var(--lr-code-block-max-height, none); overflow: auto; scrollbar-width: var(--lr-theme-scrollbar-width, auto); scrollbar-gutter: var(--lr-theme-scrollbar-gutter, auto); } [part='body'][hidden] { display: none; } [part='body']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: calc(-1 * max(var(--lr-focus-ring-width), calc(var(--lr-focus-ring-width) + var(--lr-focus-ring-offset)))); } [part='body'] lr-skeleton { display: block; padding: var(--lr-space-s) var(--lr-space-m); --lr-skeleton-w: 100%; --lr-skeleton-h: var(--lr-size-8rem); } [part='pre'] { margin: 0; padding: var(--lr-space-s) var(--lr-space-m); box-sizing: border-box; inline-size: max-content; min-inline-size: 100%; direction: ltr; unicode-bidi: isolate; background: var(--lr-color-surface); font-family: var(--lr-code-block-font, var(--lr-font-mono)); font-size: inherit; line-height: var(--lr-line-height-normal); white-space: pre; tab-size: var(--lr-code-block-tab-size, 2); } [part='code'] { display: grid; font-family: inherit; } [part='pre'] .line { display: block; } [part='pre'] .line-number { display: inline-block; min-inline-size: var(--lr-size-2-5ch); margin-inline-end: var(--lr-space-s); color: var(--lr-color-text-quiet); text-align: end; user-select: none; } [part='pre'] [data-highlighted] { background: var(--lr-code-block-highlighted-line-bg, var(--lr-color-warning-quiet)); } [part='pre'] [data-active] { outline: var(--lr-border-width-thin) solid var(--lr-code-block-active-line-outline-color, var(--lr-color-brand)); outline-offset: calc(-1 * var(--lr-border-width-thin)); } [part='pre'] button.line-gutter { display: inline-flex; align-items: center; justify-content: end; ${iconHitTarget} margin: 0; margin-inline-end: var(--lr-space-s); padding: 0; border: none; background: none; color: inherit; font: inherit; text-align: start; cursor: pointer; } [part='pre'] button.line-gutter:hover { background: var(--lr-color-brand-quiet); } [part='pre'] button.line-gutter:active { background: color-mix( in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part='pre'] button.line-gutter:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: calc(-1 * var(--lr-focus-ring-offset)); } [part='body'][data-dark-theme='true'] [part='pre'], [part='body'][data-dark-theme='true'] [part='pre'] span { color: var(--shiki-dark, inherit) !important; background-color: var(--shiki-dark-bg, transparent) !important; } [part='body'][data-dark-theme='true'] [part='pre'] .line-number, [part='body'][data-dark-theme='true'] [part='pre'] button.line-gutter { color: var(--lr-color-text-quiet) !important; } [part='body'][data-dark-theme='true'] [part='pre'] [data-highlighted] { background: var(--lr-code-block-highlighted-line-bg, var(--lr-color-warning-quiet)) !important; } @media (prefers-reduced-motion: reduce) { [part='toggle'] .chevron { transition: none !important; } } `;export{styles};
1
+ import{iconHitTarget,focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { --_lr-code-block-copy-bg: transparent; --_lr-code-block-copy-bg-hover: var(--lr-color-brand-quiet); --_lr-code-block-copy-bg-active: color-mix( in oklab, var(--lr-icon-button-bg-hover, var(--lr-icon-button-background-hover, var(--lr-color-brand-quiet))), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); --_lr-code-block-copy-color: var(--lr-color-text-quiet); --_lr-code-block-copy-color-hover: var(--lr-color-brand); --_lr-code-block-copy-color-active: var(--lr-icon-button-color-hover, var(--lr-color-brand)); --_lr-code-block-copy-radius: var(--lr-radius); display: block; font-size: var(--lr-font-size-sm); } [part='base'] { display: flex; flex-direction: column; box-sizing: border-box; block-size: 100%; border: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); border-radius: var(--lr-radius); background: var(--lr-color-surface); overflow: hidden; } [part='header'] { display: flex; min-inline-size: 0; align-items: center; gap: var(--lr-space-xs); padding: var(--lr-space-xs) var(--lr-space-s); border-block-end: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); background: var(--lr-color-surface); font-family: var(--lr-font); } [part='toggle'] { font: inherit; inline-size: var(--lr-size-1-25rem); block-size: var(--lr-size-1-25rem); ${iconHitTarget} flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; padding: 0; border: none; background: none; color: var(--lr-color-text-quiet); border-radius: var(--lr-radius); cursor: pointer; } [part='toggle']:hover { background: var(--lr-color-brand-quiet); color: var(--lr-color-brand); } [part='toggle']:active { background: color-mix( in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); color: var(--lr-color-brand); } [part='toggle'] .chevron { display: inline-flex; transition: transform var(--lr-transition-fast); } :host(:not([collapsed])) [part='toggle'] .chevron { transform: rotate(90deg); } :host([collapsed]:dir(rtl)) [part='toggle'] .chevron { transform: scaleX(-1); } [part='filename'] { flex: 1 1 auto; min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--lr-code-block-font, var(--lr-font-mono)); font-size: var(--lr-font-size-xs); font-weight: var(--lr-font-weight-semibold); color: var(--lr-color-text); } [part='language'] { direction: ltr; unicode-bidi: isolate; flex: 0 1 auto; min-inline-size: 0; max-inline-size: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: var(--lr-size-0-0625rem) var(--lr-size-0-4375rem); border-radius: var(--lr-radius-pill); background: var(--lr-code-block-language-bg, var(--lr-color-brand-quiet)); color: var(--lr-code-block-language-color, var(--lr-color-brand)); font-size: var(--lr-size-0-6875rem); line-height: var(--lr-line-height-1-4); text-transform: uppercase; letter-spacing: var(--lr-size-0-02em); } [part~='copy-button'] { flex: 0 0 auto; margin-inline-start: auto; font-size: var(--lr-font-size-xs); line-height: var(--lr-line-height-none); --_lr-icon-button-background-default: var(--_lr-code-block-copy-bg); --_lr-icon-button-background-hover-default: var(--_lr-code-block-copy-bg-hover); --_lr-icon-button-background-active-default: var(--_lr-code-block-copy-bg-active); --_lr-icon-button-color-default: var(--_lr-code-block-copy-color); --_lr-icon-button-color-hover-default: var(--_lr-code-block-copy-color-hover); --_lr-icon-button-color-active-default: var(--_lr-code-block-copy-color-active); --_lr-icon-button-radius-default: var(--_lr-code-block-copy-radius); } [part~='copy-button-text']::part(button) { padding: var(--lr-size-0-1875rem) var(--lr-space-xs); } [part='toggle']:focus-visible { ${focusRing} } [part='header-actions'] { display: inline-flex; flex: 0 0 auto; align-items: center; gap: var(--lr-space-2xs); } [part='header-actions'][hidden] { display: none; } [part='body'] { direction: ltr; display: block; flex: 1 1 auto; block-size: 100%; max-block-size: var(--lr-code-block-max-height, none); overflow: auto; scrollbar-width: var(--lr-theme-scrollbar-width, auto); scrollbar-gutter: var(--lr-theme-scrollbar-gutter, auto); } [part='body'][hidden] { display: none; } [part='body']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: calc(-1 * max(var(--lr-focus-ring-width), calc(var(--lr-focus-ring-width) + var(--lr-focus-ring-offset)))); } [part='body'] lr-skeleton { display: block; padding: var(--lr-space-s) var(--lr-space-m); --lr-skeleton-w: 100%; --lr-skeleton-h: var(--lr-size-8rem); } [part='pre'] { margin: 0; padding: var(--lr-space-s) var(--lr-space-m); box-sizing: border-box; inline-size: max-content; min-inline-size: 100%; direction: ltr; unicode-bidi: isolate; background: var(--lr-color-surface); font-family: var(--lr-code-block-font, var(--lr-font-mono)); font-size: inherit; line-height: var(--lr-line-height-normal); white-space: pre; tab-size: var(--lr-code-block-tab-size, 2); } [part='code'] { display: grid; font-family: inherit; } [part='pre'] .line { display: block; } [part='pre'] .line-number { display: inline-block; min-inline-size: var(--lr-size-2-5ch); margin-inline-end: var(--lr-space-s); color: var(--lr-color-text-quiet); text-align: end; user-select: none; } [part='pre'] [data-highlighted] { background: var(--lr-code-block-highlighted-line-bg, var(--lr-color-warning-quiet)); } [part='pre'] [data-active] { outline: var(--lr-border-width-thin) solid var(--lr-code-block-active-line-outline-color, var(--lr-color-brand)); outline-offset: calc(-1 * var(--lr-border-width-thin)); } [part='pre'] button.line-gutter { display: inline-flex; align-items: center; justify-content: end; ${iconHitTarget} margin: 0; margin-inline-end: var(--lr-space-s); padding: 0; border: none; background: none; color: inherit; font: inherit; text-align: start; cursor: pointer; } [part='pre'] button.line-gutter:hover { background: var(--lr-color-brand-quiet); } [part='pre'] button.line-gutter:active { background: color-mix( in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part='pre'] button.line-gutter:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: calc(-1 * var(--lr-focus-ring-offset)); } [part='body'][data-dark-theme='true'] [part='pre'], [part='body'][data-dark-theme='true'] [part='pre'] span { color: var(--shiki-dark, inherit) !important; background-color: var(--shiki-dark-bg, transparent) !important; } [part='body'][data-dark-theme='true'] [part='pre'] .line-number, [part='body'][data-dark-theme='true'] [part='pre'] button.line-gutter { color: var(--lr-color-text-quiet) !important; } [part='body'][data-dark-theme='true'] [part='pre'] [data-highlighted] { background: var(--lr-code-block-highlighted-line-bg, var(--lr-color-warning-quiet)) !important; } [part='limit'] { padding: var(--lr-space-s); color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); } @media (prefers-reduced-motion: reduce) { [part='toggle'] .chevron { transition: none !important; } } `;export{styles};
@@ -1,3 +1,5 @@
1
+ /** Maximum UTF-16 source code units admitted to synchronous syntax tokenization. */
2
+ export declare const SHIKI_SOURCE_MAX_CODE_UNITS=8192;
1
3
  /**
2
4
  * The peer-neutral highlighter capability used by Lyra's code-rendering components.
3
5
  *
@@ -1 +1 @@
1
- import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";function isShikiHighlighter(candidate){return(typeof candidate=="object"||typeof candidate=="function")&&candidate!==null&&typeof candidate.getLoadedLanguages=="function"&&typeof candidate.loadLanguage=="function"&&typeof candidate.codeToHtml=="function"}const SHIKI_LIGHT_THEME="github-light",SHIKI_DARK_THEME="github-dark",SHIKI_THEMES={light:SHIKI_LIGHT_THEME,dark:SHIKI_DARK_THEME};function normalizeShikiLanguage(lang){return lang.trim().toLowerCase().replace(/^\./,"")}function defaultOnigurumaEngineFactory(){return import("shiki/engine/oniguruma").then(module=>{const createEngine=(typeof module.createOnigurumaEngine=="function"?module:unwrapOptionalPeerDefault(module))?.createOnigurumaEngine;if(typeof createEngine!="function")throw new Error("Invalid optional peer shiki: an Oniguruma engine factory is required.");return createEngine(fetch(new URL("./onig.wasm",import.meta.url)))})}function javascriptEngineFactory(){return import("shiki/engine/javascript").then(({createJavaScriptRegexEngine})=>createJavaScriptRegexEngine())}let engineFactory=defaultOnigurumaEngineFactory;function setShikiCoreEngine(engine){engineFactory=engine==="oniguruma"?defaultOnigurumaEngineFactory:engine==="javascript"?javascriptEngineFactory:engine}function __resetShikiCoreEngineForTesting(){engineFactory=defaultOnigurumaEngineFactory}const highlighterCores=new WeakMap,recentHighlighterCores=[];function equalFrozenGrammars(left,right){let remaining=2e4;const leftSeen=new WeakSet,rightSeen=new WeakSet,equal=(a,b,depth)=>{if(--remaining<0||depth>32||typeof a!=typeof b||typeof a=="function"||typeof a=="symbol"||typeof a=="number"&&(!Number.isFinite(a)||!Number.isFinite(b)))return!1;if(a===null||b===null||typeof a!="object"||typeof b!="object")return Object.is(a,b);if(!Object.isFrozen(a)||!Object.isFrozen(b)||leftSeen.has(a)||rightSeen.has(b))return!1;const prototype=Object.getPrototypeOf(a);if(prototype!==Object.getPrototypeOf(b)||prototype!==Object.prototype&&prototype!==Array.prototype&&prototype!==null||Array.isArray(a)!==Array.isArray(b))return!1;leftSeen.add(a),rightSeen.add(b);const leftKeys=Reflect.ownKeys(a),rightKeys=Reflect.ownKeys(b);if(leftKeys.length!==rightKeys.length||leftKeys.length>remaining)return!1;for(let i=0;i<leftKeys.length;i+=1){const key=leftKeys[i];if(typeof key!="string"||key!==rightKeys[i])return!1;const first=Object.getOwnPropertyDescriptor(a,key),second=Object.getOwnPropertyDescriptor(b,key);if(!("value"in first)||!("value"in second)||first.enumerable!==second.enumerable||!equal(first.value,second.value,depth+1))return!1}return!0};try{return equal(left,right,0)}catch{return!1}}function shikiGrammarOwnNames(input){const known=new Set;let primaryName;const registrations=Array.isArray(input)?input:[input];for(const registration of registrations){if(!registration||typeof registration!="object")continue;const name=registration.name;typeof name=="string"&&name!==""&&(known.add(name),primaryName??=name);const aliases=registration.aliases;if(Array.isArray(aliases))for(const alias of aliases)typeof alias=="string"&&known.add(alias)}return{primaryName,known}}function buildShikiLangAlias(languages){let aliases;try{for(const key of Object.keys(languages)){const grammar=languages[key];if(grammar===void 0)continue;const{primaryName,known}=shikiGrammarOwnNames(grammar);!primaryName||known.has(key)||(aliases??={},aliases[key]=primaryName)}}catch{return aliases}return aliases}const coreLangAliases=new WeakMap;let highlighterCoreLoaderForTesting;const FINE_GRAINED_SHIKI_WARNING_KEY="lyra-fine-grained-shiki-highlighter-unavailable",FINE_GRAINED_SHIKI_WARNING="Lyra syntax highlighting failed to build a fine-grained shiki highlighter from the supplied grammars. Code is rendered as plain text.";function __setShikiHighlighterCoreLoaderForTesting(loader){highlighterCoreLoaderForTesting=loader}function loadShikiHighlighterCore(languages){if(highlighterCoreLoaderForTesting)return highlighterCoreLoaderForTesting(languages);const engine=engineFactory;let perEngine=highlighterCores.get(languages),cached=perEngine?.get(engine),frozen=!1;if(!cached)try{frozen=Object.isFrozen(languages)}catch{}if(frozen)for(let i=recentHighlighterCores.length-1;i>=0;i-=1){const entry=recentHighlighterCores[i],previous=entry.languages.deref(),promise=entry.promise.deref();if(!previous||!promise)recentHighlighterCores.splice(i,1);else if(entry.engine===engine&&equalFrozenGrammars(languages,previous)){cached=promise,recentHighlighterCores.splice(i,1),recentHighlighterCores.push({languages:new WeakRef(languages),engine,promise:entry.promise}),perEngine??=new Map,perEngine.set(engine,cached),highlighterCores.set(languages,perEngine);break}}if(!cached&&(cached=Promise.all([import("shiki/core"),Promise.resolve(engine()),import("shiki/themes/github-light.mjs"),import("shiki/themes/github-dark.mjs")]).then(async([{createHighlighterCore},resolvedEngine,light,dark])=>{const langAlias=buildShikiLangAlias(languages)??{},core=await createHighlighterCore({themes:[light.default,dark.default],langs:Object.values(languages),langAlias,engine:resolvedEngine});if(!isShikiHighlighter(core))throw new Error("Invalid optional peer `shiki`: `createHighlighterCore()` did not produce a usable highlighter capability.");return coreLangAliases.set(core,langAlias),core}).catch(()=>(devWarnOnce(FINE_GRAINED_SHIKI_WARNING_KEY,FINE_GRAINED_SHIKI_WARNING),null)),perEngine??=new Map,perEngine.set(engine,cached),highlighterCores.set(languages,perEngine),frozen)){recentHighlighterCores.push({languages:new WeakRef(languages),engine,promise:new WeakRef(cached)}),recentHighlighterCores.length>8&&recentHighlighterCores.shift();const pending=cached;pending.then(core=>{if(!core)for(let i=recentHighlighterCores.length-1;i>=0;i-=1)recentHighlighterCores[i].promise.deref()===pending&&recentHighlighterCores.splice(i,1)})}return cached}const resolvedLanguagesCache=new WeakMap;function resolvedShikiLanguages(languages){let hasLoader=!1;for(const key of Object.keys(languages))if(typeof languages[key]=="function"){hasLoader=!0;break}if(!hasLoader)return languages;let cached=resolvedLanguagesCache.get(languages);if(!cached){cached={};for(const key of Object.keys(languages)){const value=languages[key];value!==void 0&&typeof value!="function"&&(cached[key]=value)}resolvedLanguagesCache.set(languages,cached)}return cached}const loadedLanguageSources=new WeakMap,LAZY_LANGUAGE_SOURCE_WARNING_KEY="lyra-shiki-lazy-language-source-failed",LAZY_LANGUAGE_SOURCE_WARNING="Lyra syntax highlighting could not load a lazy `languages` grammar loader. That language renders as plain text.";function ensureShikiLanguageLoaded(core,key,source){if(typeof source!="function")return Promise.resolve(!0);let perCore=loadedLanguageSources.get(core);perCore||(perCore=new Map,loadedLanguageSources.set(core,perCore));let pending=perCore.get(key);return pending||(pending=Promise.resolve().then(source).then(async resolved=>{const grammar=unwrapOptionalPeerDefault(resolved);await core.loadLanguage(grammar);const{primaryName,known}=shikiGrammarOwnNames(grammar),aliases=coreLangAliases.get(core);aliases&&primaryName&&!known.has(key)&&(aliases[key]=primaryName)}).then(()=>!0).catch(()=>(devWarnOnce(LAZY_LANGUAGE_SOURCE_WARNING_KEY,LAZY_LANGUAGE_SOURCE_WARNING),!1)),perCore.set(key,pending)),pending}export{SHIKI_DARK_THEME,SHIKI_LIGHT_THEME,SHIKI_THEMES,__resetShikiCoreEngineForTesting,__setShikiHighlighterCoreLoaderForTesting,ensureShikiLanguageLoaded,isShikiHighlighter,loadShikiHighlighterCore,normalizeShikiLanguage,resolvedShikiLanguages,setShikiCoreEngine};
1
+ const SHIKI_SOURCE_MAX_CODE_UNITS=8192;import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";function isShikiHighlighter(candidate){return(typeof candidate=="object"||typeof candidate=="function")&&candidate!==null&&typeof candidate.getLoadedLanguages=="function"&&typeof candidate.loadLanguage=="function"&&typeof candidate.codeToHtml=="function"}const SHIKI_LIGHT_THEME="github-light",SHIKI_DARK_THEME="github-dark",SHIKI_THEMES={light:SHIKI_LIGHT_THEME,dark:SHIKI_DARK_THEME};function normalizeShikiLanguage(lang){return lang.trim().toLowerCase().replace(/^\./,"")}function defaultOnigurumaEngineFactory(){return import("shiki/engine/oniguruma").then(module=>{const createEngine=(typeof module.createOnigurumaEngine=="function"?module:unwrapOptionalPeerDefault(module))?.createOnigurumaEngine;if(typeof createEngine!="function")throw new Error("Invalid optional peer shiki: an Oniguruma engine factory is required.");return createEngine(fetch(new URL("./onig.wasm",import.meta.url)))})}function javascriptEngineFactory(){return import("shiki/engine/javascript").then(({createJavaScriptRegexEngine})=>createJavaScriptRegexEngine())}let engineFactory=defaultOnigurumaEngineFactory;function setShikiCoreEngine(engine){engineFactory=engine==="oniguruma"?defaultOnigurumaEngineFactory:engine==="javascript"?javascriptEngineFactory:engine}function __resetShikiCoreEngineForTesting(){engineFactory=defaultOnigurumaEngineFactory}const highlighterCores=new WeakMap,recentHighlighterCores=[];function equalFrozenGrammars(left,right){let remaining=2e4;const leftSeen=new WeakSet,rightSeen=new WeakSet,equal=(a,b,depth)=>{if(--remaining<0||depth>32||typeof a!=typeof b||typeof a=="function"||typeof a=="symbol"||typeof a=="number"&&(!Number.isFinite(a)||!Number.isFinite(b)))return!1;if(a===null||b===null||typeof a!="object"||typeof b!="object")return Object.is(a,b);if(!Object.isFrozen(a)||!Object.isFrozen(b)||leftSeen.has(a)||rightSeen.has(b))return!1;const prototype=Object.getPrototypeOf(a);if(prototype!==Object.getPrototypeOf(b)||prototype!==Object.prototype&&prototype!==Array.prototype&&prototype!==null||Array.isArray(a)!==Array.isArray(b))return!1;leftSeen.add(a),rightSeen.add(b);const leftKeys=Reflect.ownKeys(a),rightKeys=Reflect.ownKeys(b);if(leftKeys.length!==rightKeys.length||leftKeys.length>remaining)return!1;for(let i=0;i<leftKeys.length;i+=1){const key=leftKeys[i];if(typeof key!="string"||key!==rightKeys[i])return!1;const first=Object.getOwnPropertyDescriptor(a,key),second=Object.getOwnPropertyDescriptor(b,key);if(!("value"in first)||!("value"in second)||first.enumerable!==second.enumerable||!equal(first.value,second.value,depth+1))return!1}return!0};try{return equal(left,right,0)}catch{return!1}}function shikiGrammarOwnNames(input){const known=new Set;let primaryName;const registrations=Array.isArray(input)?input:[input];for(const registration of registrations){if(!registration||typeof registration!="object")continue;const name=registration.name;typeof name=="string"&&name!==""&&(known.add(name),primaryName??=name);const aliases=registration.aliases;if(Array.isArray(aliases))for(const alias of aliases)typeof alias=="string"&&known.add(alias)}return{primaryName,known}}function buildShikiLangAlias(languages){let aliases;try{for(const key of Object.keys(languages)){const grammar=languages[key];if(grammar===void 0)continue;const{primaryName,known}=shikiGrammarOwnNames(grammar);!primaryName||known.has(key)||(aliases??={},aliases[key]=primaryName)}}catch{return aliases}return aliases}const coreLangAliases=new WeakMap;let highlighterCoreLoaderForTesting;const FINE_GRAINED_SHIKI_WARNING_KEY="lyra-fine-grained-shiki-highlighter-unavailable",FINE_GRAINED_SHIKI_WARNING="Lyra syntax highlighting failed to build a fine-grained shiki highlighter from the supplied grammars. Code is rendered as plain text.";function __setShikiHighlighterCoreLoaderForTesting(loader){highlighterCoreLoaderForTesting=loader}function loadShikiHighlighterCore(languages){if(highlighterCoreLoaderForTesting)return highlighterCoreLoaderForTesting(languages);const engine=engineFactory;let perEngine=highlighterCores.get(languages),cached=perEngine?.get(engine),frozen=!1;if(!cached)try{frozen=Object.isFrozen(languages)}catch{}if(frozen)for(let i=recentHighlighterCores.length-1;i>=0;i-=1){const entry=recentHighlighterCores[i],previous=entry.languages.deref(),promise=entry.promise.deref();if(!previous||!promise)recentHighlighterCores.splice(i,1);else if(entry.engine===engine&&equalFrozenGrammars(languages,previous)){cached=promise,recentHighlighterCores.splice(i,1),recentHighlighterCores.push({languages:new WeakRef(languages),engine,promise:entry.promise}),perEngine??=new Map,perEngine.set(engine,cached),highlighterCores.set(languages,perEngine);break}}if(!cached&&(cached=Promise.all([import("shiki/core"),Promise.resolve(engine()),import("shiki/themes/github-light.mjs"),import("shiki/themes/github-dark.mjs")]).then(async([{createHighlighterCore},resolvedEngine,light,dark])=>{const langAlias=buildShikiLangAlias(languages)??{},core=await createHighlighterCore({themes:[light.default,dark.default],langs:Object.values(languages),langAlias,engine:resolvedEngine});if(!isShikiHighlighter(core))throw new Error("Invalid optional peer `shiki`: `createHighlighterCore()` did not produce a usable highlighter capability.");return coreLangAliases.set(core,langAlias),core}).catch(()=>(devWarnOnce(FINE_GRAINED_SHIKI_WARNING_KEY,FINE_GRAINED_SHIKI_WARNING),null)),perEngine??=new Map,perEngine.set(engine,cached),highlighterCores.set(languages,perEngine),frozen)){recentHighlighterCores.push({languages:new WeakRef(languages),engine,promise:new WeakRef(cached)}),recentHighlighterCores.length>8&&recentHighlighterCores.shift();const pending=cached;pending.then(core=>{if(!core)for(let i=recentHighlighterCores.length-1;i>=0;i-=1)recentHighlighterCores[i].promise.deref()===pending&&recentHighlighterCores.splice(i,1)})}return cached}const resolvedLanguagesCache=new WeakMap;function resolvedShikiLanguages(languages){let hasLoader=!1;for(const key of Object.keys(languages))if(typeof languages[key]=="function"){hasLoader=!0;break}if(!hasLoader)return languages;let cached=resolvedLanguagesCache.get(languages);if(!cached){cached={};for(const key of Object.keys(languages)){const value=languages[key];value!==void 0&&typeof value!="function"&&(cached[key]=value)}resolvedLanguagesCache.set(languages,cached)}return cached}const loadedLanguageSources=new WeakMap,LAZY_LANGUAGE_SOURCE_WARNING_KEY="lyra-shiki-lazy-language-source-failed",LAZY_LANGUAGE_SOURCE_WARNING="Lyra syntax highlighting could not load a lazy `languages` grammar loader. That language renders as plain text.";function ensureShikiLanguageLoaded(core,key,source){if(typeof source!="function")return Promise.resolve(!0);let perCore=loadedLanguageSources.get(core);perCore||(perCore=new Map,loadedLanguageSources.set(core,perCore));let pending=perCore.get(key);return pending||(pending=Promise.resolve().then(source).then(async resolved=>{const grammar=unwrapOptionalPeerDefault(resolved);await core.loadLanguage(grammar);const{primaryName,known}=shikiGrammarOwnNames(grammar),aliases=coreLangAliases.get(core);aliases&&primaryName&&!known.has(key)&&(aliases[key]=primaryName)}).then(()=>!0).catch(()=>(devWarnOnce(LAZY_LANGUAGE_SOURCE_WARNING_KEY,LAZY_LANGUAGE_SOURCE_WARNING),!1)),perCore.set(key,pending)),pending}export{SHIKI_DARK_THEME,SHIKI_LIGHT_THEME,SHIKI_SOURCE_MAX_CODE_UNITS,SHIKI_THEMES,__resetShikiCoreEngineForTesting,__setShikiHighlighterCoreLoaderForTesting,ensureShikiLanguageLoaded,isShikiHighlighter,loadShikiHighlighterCore,normalizeShikiLanguage,resolvedShikiLanguages,setShikiCoreEngine};
@@ -16,14 +16,16 @@ export type MarkdownHighlightAttempt=string|null|undefined;declare const Markdow
16
16
  export declare abstract class MarkdownRuntimeBase extends MarkdownRuntimeBase_base{abstract content:string;abstract tabSize:number;abstract htmlMode:MarkdownHtmlMode;abstract withoutGfm:boolean;abstract linkTarget:string|null;abstract internalLinkPrefix:string;abstract headingOffset:number;abstract streaming:boolean;abstract streamingRender:MarkdownStreamingRenderMode;abstract codeBlockHeader:boolean;abstract withoutSyntaxHighlighting:boolean;abstract languages?:Readonly<Record<string,ShikiLanguageSource>>;abstract headingAnchors:boolean;abstract math:boolean;abstract maxHeight:string;
17
17
  /** Anchor kinds resolved by both concrete Markdown tags. */
18
18
  readonly anchorKinds:readonly LyraAnchorKind[];protected abstract get markdownVariant():MarkdownVariantContext;
19
+ /** Effective grammar identities used to keep shared highlighted output scoped to its inputs. */
20
+ protected get highlightLanguageSources():Readonly<Record<string,ShikiLanguageSource>> |undefined;
19
21
  /** Performs only the variant-specific Shiki loading/tokenization step. */
20
- protected abstract tokenizePendingHighlight(pending:PendingHighlight,languages:Readonly<Record<string,ShikiLanguageSource>> |undefined,isCurrent:()=>boolean):Promise<MarkdownHighlightAttempt>;private renderedHtml;private renderedBlocks;private streamingTail;private progressiveRevision;private isDarkTheme;private readonly boundLocalize;private tableRegionLabel;private hasTableWrappers;private readonly fallbackCode;private deps?;private readonly parser;private headingTree;private highlightHandle?;private textQuoteIndexCache?;private textQuoteLocale?;private markdownTextScopeBuilds;private resolvedHighlightRanges;private mathFailureReported;private highlightCache;private highlightToken;private streamingRenderRaf?;private readonly streamingRenderFrames;private failedHighlightKeys;private inFlightHighlightKeys;private progressiveSession?;private progressiveAdopted;private progressiveRebuild;private progressiveInputGeneration;private rememberedFocus?;private readonly codeHeader;private codeBlocks;private readonly handleKatexResolved;constructor();
22
+ protected abstract tokenizePendingHighlight(pending:PendingHighlight,languages:Readonly<Record<string,ShikiLanguageSource>> |undefined,isCurrent:()=>boolean):Promise<MarkdownHighlightAttempt>;private renderedHtml;private renderedBlocks;private streamingTail;private progressiveRevision;private progressiveChangedFrom;private isDarkTheme;private readonly boundLocalize;private tableRegionLabel;private hasTableWrappers;private readonly fallbackCode;private deps?;private readonly parser;private headingTree;private highlightHandle?;private textQuoteIndexCache?;private textQuoteLocale?;private markdownTextScopeBuilds;private resolvedHighlightRanges;private mathFailureReported;private readonly highlightCache;private completedHighlights;private highlightToken;private streamingRenderRaf?;private readonly streamingRenderFrames;private failedHighlightKeys;private inFlightHighlightKeys;private progressiveSession?;private progressiveAdopted;private progressiveRebuild;private progressiveInputGeneration;private rememberedFocus?;private readonly codeHeader;private codeBlocks;private readonly handleKatexResolved;constructor();
21
23
  /** This instance's configurable parser, once the optional parser peer is available. */
22
24
  get marked():LyraMarkedParser|undefined;
23
25
  /** Recomputes Shiki palette selection after an imperative theme change. */
24
- refreshTheme():void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected firstUpdated(changed:PropertyValues):void;protected willUpdate(changed:PropertyValues):void;private cancelStreamingRender;private scheduleStreamingRender;private runStreamingFrame;protected getUpdateComplete():Promise<boolean>;protected updated(changed:PropertyValues):void;
26
+ refreshTheme():void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected firstUpdated(changed:PropertyValues):void;protected willUpdate(changed:PropertyValues):void;private cancelStreamingRender;private scheduleStreamingRender;private runStreamingFrame;protected getUpdateComplete():Promise<boolean>;private domSnapshot?;private changedMarkdownRoots;protected updated(changed:PropertyValues):void;
25
27
  /** Immediately refreshes source, preserving unchanged settled groups during progressive rendering. */
26
- renderMarkdown():void;private resetProgressiveMarkdown;private createProgressiveSession;private renderProgressiveMarkdown;private syncProgressiveMarkdown;private maybeLoadKatex;private reportMathFailure;private getCachedHighlight;private setCachedHighlight;private highlightPending;private parseMarkdown;private markdownParseOptions;
28
+ renderMarkdown():void;private resetProgressiveMarkdown;private createProgressiveSession;private renderProgressiveMarkdown;private syncProgressiveMarkdown;private maybeLoadKatex;private reportMathFailure;private grammarCacheKey;private getCachedHighlight;private setCachedHighlight;private highlightPending;private parseMarkdown;private markdownParseOptions;
27
29
  /** Returns a defensive copy of the latest document-ordered heading outline. During a progressive
28
30
  * stream it returns the headings of settled blocks. */
29
- getHeadingTree():MarkdownHeadingItem[];private contentRoot;protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;protected computeSelectionAnchor(range:Range):LyraAnchor|null;private ensureHighlightHandle;private markdownTextIndex;private repaintHighlights;private readonly onContentClick;render():TemplateResult;}export{};
31
+ getHeadingTree():MarkdownHeadingItem[];private contentRoot;protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;protected computeSelectionAnchor(range:Range):LyraAnchor|null;private ensureHighlightHandle;private quoteScope?;private highlightRepaintTimer?;private cancelHighlightRepaint;private scheduleHighlightRepaint;private markdownTextIndex;private repaintHighlights;private readonly onContentClick;render():TemplateResult;}export{};
@@ -1 +1 @@
1
- import{__decorate}from"tslib";import{state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteInteger}from"../../../internal/numbers.js";import{DocumentAnchorTarget}from"../../../internal/anchor-target.js";import{buildQuoteAnchor,createTextQuoteIndex,scopeFromElement,TEXT_QUOTE_LIMITS}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{MarkdownCodeHeaderController,renderMarkdownCodeHeader}from"./markdown-code-header.js";import{MarkdownFallbackCodeScanner}from"./markdown-fallback-code.js";import{MarkdownProgressiveSession,markdownProgressiveEligible}from"./markdown-progressive.js";import{addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,getCachedHighlight,hitTestHighlightRanges,HIGHLIGHT_CACHE_MAX,internalLinkHrefFrom,markdownAnchorFromTarget,markdownTableRegionLabel,markdownHasTableWrappers,labelMarkdownTableWrappers,markdownHighlightConfigChanged,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,MarkdownOwnedAnimationFrameController,MarkdownParserController,normalizeMarkdownHtmlMode,normalizeMarkdownStreamingRender,createMarkdownRenderContext,finishMarkdownHtml,markdownSanitizerPolicy,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight}from"./markdown-shared.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_markdownTableRegion}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";function createMarkdownVariantContext(tag,katexState){return{tag,connectedInstances:new Set,sharedParser:new MarkdownParserController,katexState}}const HIGHLIGHT_FAILURE_WARNING_KEY="lyra-markdown-highlight-failed",HIGHLIGHT_FAILURE_WARNING="<lr-markdown>/<lr-markdown-core>: Syntax highlighting could not complete. Code is rendered as plain text.";function keyboardHighlightIdFrom(ranges,event){const coordinateLess=event.clientX===0&&event.clientY===0&&event.screenX===0&&event.screenY===0;if(event.detail!==0&&!coordinateLess)return null;const anchor=event.composedPath().find(target=>markdownAnchorFromTarget(target)!==void 0);if(!anchor)return null;for(let index=ranges.length-1;index>=0;index--){const range=ranges[index];if(range)try{if(range.range.intersectsNode(anchor))return range.id}catch{}}return null}class LyraMarkdownRuntimeElement extends LyraElement{static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,markdownTableRegion:LYRA_DEFAULT_markdownTableRegion}}}class MarkdownRuntimeBase extends DocumentAnchorTarget(LyraMarkdownRuntimeElement){constructor(){super(),this.anchorKinds=["fragment","text-quote"],this.renderedHtml=null,this.renderedBlocks=[],this.streamingTail=null,this.progressiveRevision=0,this.isDarkTheme=!1,this.boundLocalize=this.localize.bind(this),this.hasTableWrappers=!1,this.fallbackCode=new MarkdownFallbackCodeScanner,this.parser=new MarkdownParserController,this.headingTree=[],this.markdownTextScopeBuilds=0,this.resolvedHighlightRanges=[],this.mathFailureReported=!1,this.highlightCache=new Map,this.highlightToken=0,this.streamingRenderFrames=new MarkdownOwnedAnimationFrameController,this.failedHighlightKeys=new Set,this.inFlightHighlightKeys=new Map,this.progressiveAdopted=!1,this.progressiveRebuild=!1,this.progressiveInputGeneration=0,this.codeBlocks=[],this.handleKatexResolved=()=>{this.isConnected&&(this.progressiveSession&&this.streaming?(this.progressiveSession.invalidateMath(),this.scheduleStreamingRender()):this.renderMarkdown())},this.onContentClick=event=>{if(this.codeHeader.handleClick(event))return;const href=internalLinkHrefFrom(event,this.internalLinkPrefix);href!==null&&event.preventDefault();const highlightId=hitTestHighlightRanges(this.resolvedHighlightRanges,event.clientX,event.clientY)??keyboardHighlightIdFrom(this.resolvedHighlightRanges,event);highlightId&&this.emit("lr-highlight-activate",{highlightId}),href!==null&&this.emit("lr-link-activate",{href})},new ThemeWatcher(this,()=>this.refreshTheme()),this.codeHeader=new MarkdownCodeHeaderController(this,{isEnabled:()=>this.codeBlockHeader,contentVersion:()=>this.progressiveSession?this.renderedBlocks:this.renderedHtml,getContentRoot:()=>this.contentRoot(),localize:this.boundLocalize,buildHeader:(frame,language)=>renderMarkdownCodeHeader(frame,language),emitCopy:outcome=>this.emit("lr-copy",outcome),emitCopyError:outcome=>this.emit("lr-copy-error",outcome)})}get marked(){return this.parser.get(this.deps?.marked)}refreshTheme(){this.isDarkTheme=resolveMarkdownDarkTheme(this)}connectedCallback(){super.connectedCallback(),this.markdownVariant.connectedInstances.add(this),this.hasUpdated&&this.refreshTheme(),beginMarkdownDepsLoad(this,resolved=>{this.deps=resolved,this.renderMarkdown(),this.requestUpdate()})}disconnectedCallback(){this.markdownVariant.connectedInstances.delete(this),super.disconnectedCallback(),this.highlightToken++,this.cancelStreamingRender(),this.highlightHandle?.release(),this.highlightHandle=void 0,this.textQuoteIndexCache=void 0,this.fallbackCode.reset()}adoptedCallback(){super.adoptedCallback(),this.codeHeader.hostAdopted(),this.cancelStreamingRender(),this.streaming&&this.progressiveSession&&this.scheduleStreamingRender()}firstUpdated(changed){super.firstUpdated(changed);const contentRoot=this.renderRoot.querySelector('[part="content"]');contentRoot&&this.bindTextSelection(contentRoot)}willUpdate(changed){super.willUpdate(changed),this.seedFirstRenderState(()=>this.refreshTheme());const active=shadowFocusTarget(this),selector='[part~="code-block"], [part~="code-block-copy"], [part~="table-wrapper"]';if(active?.matches(selector)&&(this.rememberedFocus={node:active,index:[...this.renderRoot.querySelectorAll(selector)].indexOf(active),selector}),changed.has("math")&&(this.mathFailureReported=!1),!this.deps||!markdownNeedsReparse(changed))return;const progressive=normalizeMarkdownStreamingRender(this.streamingRender)==="progressive",configurationChanged=[...changed.keys()].some(key=>key!=="content"&&key!=="streaming"&&markdownNeedsReparse(new Map([[key,void 0]])));(markdownHighlightConfigChanged(changed)||!progressive&&(changed.has("content")||changed.has("streaming")))&&this.highlightToken++,markdownHighlightConfigChanged(changed)&&(this.failedHighlightKeys.clear(),markdownLanguageSetChanged(changed)&&(this.highlightCache=new Map)),progressive?configurationChanged&&(this.progressiveRebuild=!0):this.resetProgressiveMarkdown(),changed.has("content")&&this.progressiveInputGeneration++,this.streaming?(this.progressiveAdopted&&(this.progressiveSession?.resume(),this.progressiveAdopted=!1),this.progressiveSession?.update(this.content??""),this.progressiveSession&&this.syncProgressiveMarkdown(),this.scheduleStreamingRender()):(this.cancelStreamingRender(),(changed.has("content")&&!changed.has("streaming")||configurationChanged)&&this.resetProgressiveMarkdown(),this.renderMarkdown())}cancelStreamingRender(){const handle=this.streamingRenderRaf;this.streamingRenderRaf=void 0,!this.streamingRenderFrames.cancel()&&handle!==void 0&&this.ownerDocument.defaultView?.cancelAnimationFrame(handle)}scheduleStreamingRender(){if(this.streamingRenderRaf!==void 0)return;const view=this.ownerDocument.defaultView;if(!view){this.isConnected&&this.runStreamingFrame();return}const handle=this.streamingRenderFrames.request(view,()=>{this.streamingRenderRaf=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.runStreamingFrame()});handle===void 0?this.isConnected&&this.runStreamingFrame():this.streamingRenderFrames.handle===handle&&(this.streamingRenderRaf=handle)}runStreamingFrame(){normalizeMarkdownStreamingRender(this.streamingRender)==="progressive"?this.renderProgressiveMarkdown():this.renderMarkdown()}async getUpdateComplete(){await super.getUpdateComplete();const generation=this.progressiveInputGeneration,remaining=(this.content?.length??0)-(this.progressiveSession?.end??0),cap=Math.ceil(Math.max(0,remaining)/65536)+2;for(let frames=0;frames<cap&&this.streamingRenderRaf!==void 0&&(await this.streamingRenderFrames.settled,await super.getUpdateComplete(),generation===this.progressiveInputGeneration);frames++);return super.getUpdateComplete()}updated(changed){super.updated(changed),applyMarkdownAriaBusy(this,!this.deps||this.streaming);const renderedChanged=changed.has("renderedHtml")||changed.has("renderedBlocks");if(renderedChanged&&(this.hasTableWrappers=markdownHasTableWrappers(this.contentRoot())),!this.hasTableWrappers)this.tableRegionLabel=void 0;else{const tableLabel=markdownTableRegionLabel(this.boundLocalize);(renderedChanged||tableLabel!==this.tableRegionLabel)&&(this.tableRegionLabel=tableLabel,labelMarkdownTableWrappers(this.contentRoot(),tableLabel))}const remembered=this.rememberedFocus;if(this.rememberedFocus=void 0,remembered&&!remembered.node.isConnected){let active=this.ownerDocument.activeElement;for(;active?.shadowRoot?.activeElement;)active=active.shadowRoot.activeElement;if(!active||active===this.ownerDocument.body||active===this.ownerDocument.documentElement){const target=this.renderRoot.querySelectorAll(remembered.selector)[remembered.index];target?target.focus({preventScroll:!0}):this.streaming&&(this.rememberedFocus=remembered)}}const locale=this.effectiveLocale,localeChanged=this.textQuoteLocale!==void 0&&this.textQuoteLocale!==locale;this.textQuoteLocale=locale;const renderedContentChanged=changed.has("renderedHtml")||changed.has("renderedBlocks")||changed.has("streamingTail")||changed.has("progressiveRevision");(localeChanged||renderedContentChanged||changed.has("content"))&&(this.textQuoteIndexCache=void 0),(renderedContentChanged||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights(),(changed.has("content")&&!(this.streaming&&this.streamingRender==="progressive"&&this.renderedHtml!==null)||renderedContentChanged)&&this.isConnected&&this.emit("lr-content-settled",null)}renderMarkdown(){if(this.streaming){if(normalizeMarkdownStreamingRender(this.streamingRender)==="progressive"){this.progressiveRebuild=!!this.progressiveSession,this.scheduleStreamingRender();return}this.renderedHtml=null,this.resetProgressiveMarkdown(),this.headingTree=[],this.codeHeader.setBlocks([]);return}const deps=this.deps;if(!deps)return;const session=this.progressiveSession;session?.update(this.content??""),session?.step(!0,!0),this.codeBlocks=[];const outcome=renderMarkdownDocument({tag:this.markdownVariant.tag,deps,htmlMode:normalizeMarkdownHtmlMode(this.htmlMode),math:this.math,codeBlockHeader:this.codeBlockHeader,parse:(marked,pendingKeys,headingTreeOut)=>this.parseMarkdown(marked,pendingKeys,headingTreeOut),onParsed:()=>this.maybeLoadKatex(),isKatexConfirmedMissing:()=>this.markdownVariant.katexState.isConfirmedMissing()});if(outcome.headingTree&&(this.headingTree=outcome.headingTree),outcome.status==="fallback"){this.renderedHtml=null,this.resetProgressiveMarkdown(),this.codeHeader.setBlocks([]),this.emit("lr-render-error",{error:outcome.error});return}const mode=normalizeMarkdownHtmlMode(this.htmlMode);session&&!session.failed&&session.blocks.map(block=>block.html).join("")===outcome.html&&(mode!=="trusted"||!session.blocks.some(block=>block.hasRawHtml))&&(mode==="sanitize"||session.blocks.slice(0,-1).every(block=>block.balanced))?(this.progressiveAdopted=!0,this.syncProgressiveMarkdown()):this.resetProgressiveMarkdown(),this.renderedHtml=outcome.html,this.codeHeader.setBlocks(this.codeBlocks),outcome.mathFailed&&this.reportMathFailure(),outcome.pendingKeys.length>0&&!this.withoutSyntaxHighlighting&&this.highlightPending(outcome.pendingKeys)}resetProgressiveMarkdown(){this.progressiveSession=void 0,this.progressiveAdopted=!1,this.progressiveRebuild=!1,this.renderedBlocks.length&&(this.renderedBlocks=[]),this.streamingTail=null}createProgressiveSession(previous){const deps=this.deps,mode=normalizeMarkdownHtmlMode(this.htmlMode);if(!deps?.marked||mode==="sanitize"&&!deps.DOMPurify)return;const context=createMarkdownRenderContext(this.markdownParseOptions(deps.marked,"",[],[],void 0,[]));if(!markdownProgressiveEligible(context.instance,!this.withoutGfm)){devWarnOnce("lyra-markdown-progressive-unavailable","<lr-markdown>: this parser configuration uses plain streaming.");return}const policy=markdownSanitizerPolicy({htmlMode:mode,math:this.math,codeBlockHeader:this.codeBlockHeader}),activeHighlightKeys=new Set,session=new MarkdownProgressiveSession({parser:context.instance,gfm:!this.withoutGfm,tabSize:finiteInteger(this.tabSize,4,1,32),render:(source,rawSource,links,state2,slugger,prefix)=>{const pendingKeys=[],headings=[],records=[],options=this.markdownParseOptions(deps.marked,source,pendingKeys,headings,slugger,records,rawSource);options.codeBlockIndexOffset=prefix.length,options.activeHighlightKeys=activeHighlightKeys,options.highlightCodeOption=!this.withoutSyntaxHighlighting;const result=createMarkdownRenderContext(options).render(source,{links,state:state2});return this.maybeLoadKatex(),{...result,rawHtml:result.html,html:finishMarkdownHtml(deps,policy,result.html),headings,codeBlocks:records,pendingKeys}}},previous?.blocks);return session.update(this.content??""),previous&&session.step(!1,!0,previous.end),session}renderProgressiveMarkdown(){const previous=this.progressiveSession;(!previous||this.progressiveRebuild)&&(this.progressiveSession=this.createProgressiveSession(previous),this.progressiveRebuild=!1);const session=this.progressiveSession;if(!session){this.renderedHtml=null,this.renderedBlocks=[],this.streamingTail=null,this.headingTree=[],this.codeHeader.setBlocks([]);return}session.update(this.content??""),session.step(),this.renderedHtml="",this.syncProgressiveMarkdown();const pending=session.nextHighlight();pending&&!this.withoutSyntaxHighlighting&&this.highlightPending([pending]),session.pending&&this.scheduleStreamingRender()}syncProgressiveMarkdown(){const session=this.progressiveSession;if(!session)return;(session.blocks.length!==this.renderedBlocks.length||session.blocks.some((block,index)=>block.html!==this.renderedBlocks[index]?.html))&&(this.renderedBlocks=session.blocks.map((block,index)=>({id:`stream-${index}`,html:block.html})),this.progressiveRevision++);const tail=session.tail;(tail?.kind!==this.streamingTail?.kind||tail?.text!==this.streamingTail?.text)&&(this.streamingTail=tail),this.headingTree=session.headings,this.codeHeader.setBlocks(session.records)}progressiveStats(){return this.progressiveSession?.stats}maybeLoadKatex(){this.math&&this.markdownVariant.katexState.startLoad(this.handleKatexResolved)}reportMathFailure(){this.mathFailureReported||(this.mathFailureReported=!0,this.emit("lr-render-error",{error:markdownMathPeerError(this.markdownVariant.tag)}))}getCachedHighlight(key){return getCachedHighlight(this.highlightCache,key)}setCachedHighlight(key,html){return setCachedHighlight(this.highlightCache,key,html,HIGHLIGHT_CACHE_MAX)}async highlightPending(pendingKeys){const work=pendingKeys.filter(({key})=>this.inFlightHighlightKeys.get(key)!==this.highlightToken);if(work.length===0)return;const token=this.highlightToken;for(const{key}of work)this.inFlightHighlightKeys.set(key,token);const languages=this.languages,isCurrent=()=>token===this.highlightToken&&this.isConnected,tokenizeOne=async pending=>{const html=await this.tokenizePendingHighlight(pending,languages,isCurrent);!isCurrent()||html===void 0||(html===null||!this.setCachedHighlight(pending.key,html))&&addFailedHighlightKey(this.failedHighlightKeys,pending.key)};try{await processPendingHighlights(work,tokenizeOne)}catch{for(const{key}of work)addFailedHighlightKey(this.failedHighlightKeys,key);devWarnOnce(HIGHLIGHT_FAILURE_WARNING_KEY,HIGHLIGHT_FAILURE_WARNING)}finally{for(const{key}of work)this.inFlightHighlightKeys.get(key)===token&&this.inFlightHighlightKeys.delete(key)}this.isConnected&&(this.progressiveSession?(this.progressiveSession.invalidateHighlights(work.map(({key})=>key)),this.streaming?this.scheduleStreamingRender():this.renderMarkdown()):this.renderMarkdown())}parseMarkdown(marked,pendingKeys,headingTreeOut){const source=this.content??"";return parseMarkdownDocument(this.markdownParseOptions(marked,normalizeMarkdownLeadingTabs(source,finiteInteger(this.tabSize,4,1,32)),pendingKeys,headingTreeOut,void 0,this.codeBlocks,source))}markdownParseOptions(marked,content,pendingKeys,headingTreeOut,slugger,codeBlocksOut=[],rawContent=content){const variant=this.markdownVariant;return{marked,slugger,content,pendingKeys,headingTreeOut,codeBlocksOut,rawContent,markedConfigurations:[variant.sharedParser.get(marked)?.defaults,this.marked?.defaults],gfm:!this.withoutGfm,linkTarget:this.linkTarget,headingOffset:finiteInteger(this.headingOffset,0,0,6),escapeHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="escape",trustedHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="trusted",codeBlockHeaderOption:this.codeBlockHeader,codeFrameNonce:this.codeBlockHeader?this.codeHeader.nonce:void 0,tabSize:finiteInteger(this.tabSize,4,1,32),highlightCodeOption:!this.withoutSyntaxHighlighting&&!this.streaming,getCachedHighlight:key=>this.getCachedHighlight(key),failedHighlightKeys:this.failedHighlightKeys,headingAnchorsOption:this.headingAnchors,mathOption:this.math,cachedKatex:this.math?variant.katexState.getIfLoaded():null}}getHeadingTree(){return[...this.headingTree]}contentRoot(){return this.renderRoot.querySelector('[part="content"]')}async applyAnchor(anchor){const root=this.contentRoot();if(!root)return!1;if(anchor.kind==="fragment")return applyMarkdownFragmentAnchor(root,anchor,this.headingTree);if(anchor.kind==="text-quote"){const index=this.markdownTextIndex(root),found=applyMarkdownTextQuoteAnchor(root,anchor,this.effectiveLocale,index);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.repaintHighlights(),found}return!1}computeSelectionAnchor(range){const root=this.contentRoot();if(!root)return null;const anchor=buildQuoteAnchor(range,this.markdownTextIndex(root).scope);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.scheduleAfterUpdate(()=>this.repaintHighlights()),anchor}ensureHighlightHandle(){return this.highlightHandle??=acquireHighlightHandle(this,this.ownerDocument),this.highlightHandle}markdownTextIndex(root){const locale=this.effectiveLocale,cached=this.textQuoteIndexCache;if(cached?.root===root&&cached.locale===locale&&!cached.mappingDirty)return cached.index;if(cached?.mappingDirty){const handle=this.ensureHighlightHandle();for(const tone of["accent","success","warning","danger","neutral"])handle.setRanges(tone,[]);handle.setActive(null)}const markers=this.progressiveSession?this.renderedBlocks.length*2+8:0,scope=scopeFromElement(root,{maxTraversalNodes:TEXT_QUOTE_LIMITS.maxTraversalNodes+markers});if(this.markdownTextScopeBuilds++,cached?.root===root&&cached.locale===locale&&cached.index.rebindScope(scope))return cached.mappingDirty=!1,cached.index;const index=createTextQuoteIndex(scope,locale);return this.textQuoteIndexCache={root,locale,index,mappingDirty:!1},index}markdownTextScopeBuildCount(){return this.markdownTextScopeBuilds}markdownTextQuoteScanCount(){return this.textQuoteIndexCache?.index.scanCount??0}repaintHighlights(){this.resolvedHighlightRanges=[];const root=this.contentRoot();if(!root)return;if(this.highlights.length===0){this.highlightHandle?.release(),this.highlightHandle=void 0;return}if(this.streaming&&this.progressiveSession&&!supportsCustomHighlights(this.ownerDocument)){this.highlightHandle?.release(),this.highlightHandle=void 0;return}const index=this.markdownTextIndex(root);this.resolvedHighlightRanges=repaintMarkdownHighlights({locale:this.effectiveLocale,root,handle:this.ensureHighlightHandle(),highlights:this.highlights,activeHighlightId:this.activeHighlightId,index}),!supportsCustomHighlights(this.ownerDocument)&&this.textQuoteIndexCache&&(this.textQuoteIndexCache.mappingDirty=!0)}render(){const progressiveRendering=!!(this.progressiveSession&&(this.streaming||this.progressiveAdopted));return renderMarkdownContent({content:this.content??"",sanitized:normalizeMarkdownHtmlMode(this.htmlMode)==="sanitize",renderedHtml:this.renderedHtml,fallbackSegments:!progressiveRendering&&this.renderedHtml===null?this.fallbackCode.segments(this.content??""):null,progressive:progressiveRendering?{blocks:this.renderedBlocks,tail:this.streamingTail}:null,hostAriaLabel:this.getAttribute("aria-label"),isDarkTheme:this.isDarkTheme,onClick:this.onContentClick,liveRegion:this.renderAnchorLiveRegion(),maxHeight:this.maxHeight})}}__decorate([state()],MarkdownRuntimeBase.prototype,"renderedHtml",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"renderedBlocks",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"streamingTail",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"progressiveRevision",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"isDarkTheme",void 0);export{MarkdownRuntimeBase,createMarkdownVariantContext};
1
+ import{__decorate}from"tslib";import{normalizeShikiLanguage}from"../code-block/shiki-types.js";import{state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteInteger}from"../../../internal/numbers.js";import{DocumentAnchorTarget}from"../../../internal/anchor-target.js";import{buildQuoteAnchor,createTextQuoteIndex,scopeFromElement,IncrementalTextQuoteScope,TEXT_QUOTE_LIMITS}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{MarkdownCodeHeaderController,renderMarkdownCodeHeader}from"./markdown-code-header.js";import{MarkdownFallbackCodeScanner}from"./markdown-fallback-code.js";import{MarkdownProgressiveSession,markdownProgressiveEligible}from"./markdown-progressive.js";import{addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,getCachedHighlight,hitTestHighlightRanges,HIGHLIGHT_CACHE_MAX,internalLinkHrefFrom,markdownAnchorFromTarget,markdownTableRegionLabel,markdownHasTableWrappers,labelMarkdownTableWrappers,markdownHighlightConfigChanged,markdownMathPeerError,markdownNeedsReparse,MarkdownOwnedAnimationFrameController,MarkdownParserController,normalizeMarkdownHtmlMode,normalizeMarkdownStreamingRender,createMarkdownRenderContext,finishMarkdownHtml,markdownSanitizerPolicy,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight}from"./markdown-shared.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_markdownTableRegion}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";function createMarkdownVariantContext(tag,katexState){return{tag,connectedInstances:new Set,sharedParser:new MarkdownParserController,katexState}}const HIGHLIGHT_FAILURE_WARNING_KEY="lyra-markdown-highlight-failed",HIGHLIGHT_FAILURE_WARNING="<lr-markdown>/<lr-markdown-core>: Syntax highlighting could not complete. Code is rendered as plain text.";function keyboardHighlightIdFrom(ranges,event){const coordinateLess=event.clientX===0&&event.clientY===0&&event.screenX===0&&event.screenY===0;if(event.detail!==0&&!coordinateLess)return null;const anchor=event.composedPath().find(target=>markdownAnchorFromTarget(target)!==void 0);if(!anchor)return null;for(let index=ranges.length-1;index>=0;index--){const range=ranges[index];if(range)try{if(range.range.intersectsNode(anchor))return range.id}catch{}}return null}class LyraMarkdownRuntimeElement extends LyraElement{static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,markdownTableRegion:LYRA_DEFAULT_markdownTableRegion}}}const sharedHighlightCache=new Map,highlightGrammarIds=new WeakMap;let nextHighlightGrammarId=1;function highlightGrammarKey(languages,key){if(!languages)return`default:${key}`;let id=highlightGrammarIds.get(languages);return id===void 0&&(id=nextHighlightGrammarId++,highlightGrammarIds.set(languages,id)),`${id}:${key}`}class MarkdownRuntimeBase extends DocumentAnchorTarget(LyraMarkdownRuntimeElement){get highlightLanguageSources(){return this.languages}constructor(){super(),this.anchorKinds=["fragment","text-quote"],this.renderedHtml=null,this.renderedBlocks=[],this.streamingTail=null,this.progressiveRevision=0,this.progressiveChangedFrom=0,this.isDarkTheme=!1,this.boundLocalize=this.localize.bind(this),this.hasTableWrappers=!1,this.fallbackCode=new MarkdownFallbackCodeScanner,this.parser=new MarkdownParserController,this.headingTree=[],this.markdownTextScopeBuilds=0,this.resolvedHighlightRanges=[],this.mathFailureReported=!1,this.highlightCache=sharedHighlightCache,this.completedHighlights=new Map,this.highlightToken=0,this.streamingRenderFrames=new MarkdownOwnedAnimationFrameController,this.failedHighlightKeys=new Set,this.inFlightHighlightKeys=new Map,this.progressiveAdopted=!1,this.progressiveRebuild=!1,this.progressiveInputGeneration=0,this.codeBlocks=[],this.handleKatexResolved=()=>{this.isConnected&&(this.progressiveSession&&this.streaming?(this.progressiveSession.invalidateMath(),this.scheduleStreamingRender()):this.renderMarkdown())},this.onContentClick=event=>{if(this.codeHeader.handleClick(event))return;const href=internalLinkHrefFrom(event,this.internalLinkPrefix);href!==null&&event.preventDefault();const highlightId=hitTestHighlightRanges(this.resolvedHighlightRanges,event.clientX,event.clientY)??keyboardHighlightIdFrom(this.resolvedHighlightRanges,event);highlightId&&this.emit("lr-highlight-activate",{highlightId}),href!==null&&this.emit("lr-link-activate",{href})},new ThemeWatcher(this,()=>this.refreshTheme()),this.codeHeader=new MarkdownCodeHeaderController(this,{isEnabled:()=>this.codeBlockHeader,getChangedRoots:()=>this.changedMarkdownRoots(),contentVersion:()=>this.progressiveSession?this.progressiveRevision:this.renderedHtml,getContentRoot:()=>this.contentRoot(),localize:this.boundLocalize,buildHeader:(frame,language)=>renderMarkdownCodeHeader(frame,language),emitCopy:outcome=>this.emit("lr-copy",outcome),emitCopyError:outcome=>this.emit("lr-copy-error",outcome)})}get marked(){return this.parser.get(this.deps?.marked)}refreshTheme(){this.isDarkTheme=resolveMarkdownDarkTheme(this)}connectedCallback(){super.connectedCallback(),this.markdownVariant.connectedInstances.add(this),this.hasUpdated&&this.refreshTheme(),beginMarkdownDepsLoad(this,resolved=>{this.deps=resolved,this.renderMarkdown(),this.requestUpdate()})}disconnectedCallback(){this.markdownVariant.connectedInstances.delete(this),super.disconnectedCallback(),this.highlightToken++,this.completedHighlights=new Map,this.cancelStreamingRender(),this.highlightHandle?.release(),this.highlightHandle=void 0,this.textQuoteIndexCache=void 0,this.quoteScope?.builder.disconnect(),this.quoteScope=void 0,this.cancelHighlightRepaint(),this.domSnapshot?.observer.disconnect(),this.domSnapshot=void 0,this.fallbackCode.reset()}adoptedCallback(){super.adoptedCallback(),this.codeHeader.hostAdopted(),this.quoteScope?.builder.disconnect(),this.quoteScope=void 0,this.cancelHighlightRepaint(),this.cancelStreamingRender(),this.streaming&&this.progressiveSession&&this.scheduleStreamingRender()}firstUpdated(changed){super.firstUpdated(changed);const contentRoot=this.renderRoot.querySelector('[part="content"]');contentRoot&&this.bindTextSelection(contentRoot)}willUpdate(changed){super.willUpdate(changed),this.seedFirstRenderState(()=>this.refreshTheme());const active=shadowFocusTarget(this),selector='[part~="code-block"], [part~="code-block-copy"], [part~="table-wrapper"]';if(active?.matches(selector)&&(this.rememberedFocus={node:active,index:[...this.renderRoot.querySelectorAll(selector)].indexOf(active),selector}),changed.has("math")&&(this.mathFailureReported=!1),!this.deps||!markdownNeedsReparse(changed))return;const progressive=normalizeMarkdownStreamingRender(this.streamingRender)==="progressive",configurationChanged=[...changed.keys()].some(key=>key!=="content"&&key!=="streaming"&&markdownNeedsReparse(new Map([[key,void 0]])));(markdownHighlightConfigChanged(changed)||!progressive&&(changed.has("content")||changed.has("streaming")))&&this.highlightToken++,markdownHighlightConfigChanged(changed)&&(this.failedHighlightKeys.clear(),this.completedHighlights=new Map),progressive?configurationChanged&&(this.progressiveRebuild=!0):this.resetProgressiveMarkdown(),changed.has("content")&&this.progressiveInputGeneration++,this.streaming?(this.progressiveAdopted&&(this.progressiveSession?.resume(),this.progressiveAdopted=!1),this.progressiveSession?.update(this.content??""),this.progressiveSession&&this.syncProgressiveMarkdown(),this.scheduleStreamingRender()):(this.cancelStreamingRender(),(changed.has("content")&&!changed.has("streaming")||configurationChanged)&&this.resetProgressiveMarkdown(),this.renderMarkdown())}cancelStreamingRender(){const handle=this.streamingRenderRaf;this.streamingRenderRaf=void 0,!this.streamingRenderFrames.cancel()&&handle!==void 0&&this.ownerDocument.defaultView?.cancelAnimationFrame(handle)}scheduleStreamingRender(){if(this.streamingRenderRaf!==void 0)return;const view=this.ownerDocument.defaultView;if(!view){this.isConnected&&this.runStreamingFrame();return}const handle=this.streamingRenderFrames.request(view,()=>{this.streamingRenderRaf=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.runStreamingFrame()});handle===void 0?this.isConnected&&this.runStreamingFrame():this.streamingRenderFrames.handle===handle&&(this.streamingRenderRaf=handle)}runStreamingFrame(){normalizeMarkdownStreamingRender(this.streamingRender)==="progressive"?this.renderProgressiveMarkdown():this.renderMarkdown()}async getUpdateComplete(){await super.getUpdateComplete();const generation=this.progressiveInputGeneration,remaining=(this.content?.length??0)-(this.progressiveSession?.end??0),cap=Math.ceil(Math.max(0,remaining)/65536)+2;for(let frames=0;frames<cap&&this.streamingRenderRaf!==void 0&&(await this.streamingRenderFrames.settled,await super.getUpdateComplete(),generation===this.progressiveInputGeneration);frames++);return super.getUpdateComplete()}changedMarkdownRoots(){const root=this.contentRoot();if(!root)return[];let snapshot=this.domSnapshot;if(snapshot?.root!==root){snapshot?.observer.disconnect();const records2=[],Observer=this.ownerDocument.defaultView?.MutationObserver??MutationObserver,observer=new Observer(changes=>records2.push(...changes));return observer.observe(root,{childList:!0}),this.domSnapshot={root,revision:this.progressiveRevision,html:this.renderedHtml,observer,records:records2,tail:this.streamingTail?root.lastElementChild:null,changed:[root]},[root]}if(snapshot.revision===this.progressiveRevision&&snapshot.html===this.renderedHtml)return snapshot.changed;const records=snapshot.records.splice(0);records.push(...snapshot.observer.takeRecords());const roots=[];let reset=!this.progressiveSession;for(const record of records){for(const node of record.removedNodes)node.nodeType===1&&node!==snapshot.tail&&(reset=!0);for(const node of record.addedNodes)node.nodeType===1&&node.parentNode===root&&roots.push(node)}return snapshot.revision=this.progressiveRevision,snapshot.html=this.renderedHtml,snapshot.tail=this.streamingTail?root.lastElementChild:null,snapshot.changed=reset?[root]:roots,snapshot.changed}updated(changed){super.updated(changed),applyMarkdownAriaBusy(this,!this.deps||this.streaming);const renderedChanged=changed.has("renderedHtml")||changed.has("renderedBlocks")||changed.has("progressiveRevision"),changedRoots=renderedChanged?this.changedMarkdownRoots():[];if(renderedChanged&&(this.hasTableWrappers=changedRoots.includes(this.contentRoot())?markdownHasTableWrappers(this.contentRoot()):this.hasTableWrappers||changedRoots.some(root=>markdownHasTableWrappers(root))),!this.hasTableWrappers)this.tableRegionLabel=void 0;else{const tableLabel=markdownTableRegionLabel(this.boundLocalize);if(renderedChanged||tableLabel!==this.tableRegionLabel){const roots=tableLabel!==this.tableRegionLabel?[this.contentRoot()]:changedRoots;this.tableRegionLabel=tableLabel;for(const root of roots)labelMarkdownTableWrappers(root,tableLabel)}}const remembered=this.rememberedFocus;if(this.rememberedFocus=void 0,remembered&&!remembered.node.isConnected){let active=this.ownerDocument.activeElement;for(;active?.shadowRoot?.activeElement;)active=active.shadowRoot.activeElement;if(!active||active===this.ownerDocument.body||active===this.ownerDocument.documentElement){const target=this.renderRoot.querySelectorAll(remembered.selector)[remembered.index];target?target.focus({preventScroll:!0}):this.streaming&&(this.rememberedFocus=remembered)}}const locale=this.effectiveLocale,localeChanged=this.textQuoteLocale!==void 0&&this.textQuoteLocale!==locale;this.textQuoteLocale=locale;const renderedContentChanged=changed.has("renderedHtml")||changed.has("renderedBlocks")||changed.has("streamingTail")||changed.has("progressiveRevision");(localeChanged||renderedContentChanged||changed.has("content"))&&(this.progressiveSession&&!localeChanged&&this.textQuoteIndexCache?this.textQuoteIndexCache.mappingDirty=!0:this.textQuoteIndexCache=void 0),(renderedContentChanged||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&(this.streaming&&this.progressiveSession&&renderedContentChanged&&!changed.has("highlights")&&!changed.has("activeHighlightId")&&!localeChanged?this.scheduleHighlightRepaint():(this.cancelHighlightRepaint(),this.repaintHighlights())),changed.has("streaming")&&!this.streaming&&(this.cancelHighlightRepaint(),this.repaintHighlights()),(changed.has("content")&&!(this.streaming&&this.streamingRender==="progressive"&&this.renderedHtml!==null)||renderedContentChanged)&&this.isConnected&&this.emit("lr-content-settled",null)}renderMarkdown(){if(this.streaming){if(normalizeMarkdownStreamingRender(this.streamingRender)==="progressive"){this.progressiveRebuild=!!this.progressiveSession,this.scheduleStreamingRender();return}this.renderedHtml=null,this.resetProgressiveMarkdown(),this.headingTree=[],this.codeHeader.setBlocks([]);return}const deps=this.deps;if(!deps)return;const session=this.progressiveSession;session?.update(this.content??""),session?.step(!0,!0),this.codeBlocks=[];const outcome=renderMarkdownDocument({tag:this.markdownVariant.tag,deps,htmlMode:normalizeMarkdownHtmlMode(this.htmlMode),math:this.math,codeBlockHeader:this.codeBlockHeader,parse:(marked,pendingKeys,headingTreeOut)=>this.parseMarkdown(marked,pendingKeys,headingTreeOut),onParsed:()=>this.maybeLoadKatex(),isKatexConfirmedMissing:()=>this.markdownVariant.katexState.isConfirmedMissing()});if(outcome.headingTree&&(this.headingTree=outcome.headingTree),outcome.status==="fallback"){this.renderedHtml=null,this.resetProgressiveMarkdown(),this.codeHeader.setBlocks([]),this.emit("lr-render-error",{error:outcome.error});return}const mode=normalizeMarkdownHtmlMode(this.htmlMode),adopt=session&&!session.failed&&session.blocks.map(block=>block.html).join("")===outcome.html&&(mode!=="trusted"||!session.blocks.some(block=>block.hasRawHtml))&&(mode==="sanitize"||session.blocks.slice(0,-1).every(block=>block.balanced));adopt?(this.progressiveAdopted=!0,this.syncProgressiveMarkdown()):this.resetProgressiveMarkdown(),this.renderedHtml=outcome.html,this.completedHighlights=new Map,this.codeHeader.setBlocks(this.codeBlocks),adopt&&session.suspend(),outcome.mathFailed&&this.reportMathFailure(),outcome.pendingKeys.length>0&&!this.withoutSyntaxHighlighting&&this.highlightPending(outcome.pendingKeys)}resetProgressiveMarkdown(){this.progressiveSession=void 0,this.progressiveAdopted=!1,this.progressiveRebuild=!1,this.progressiveChangedFrom=0,this.renderedBlocks.length&&(this.renderedBlocks=[]),this.streamingTail=null}createProgressiveSession(previous){const deps=this.deps,mode=normalizeMarkdownHtmlMode(this.htmlMode);if(!deps?.marked||mode==="sanitize"&&!deps.DOMPurify)return;const context=createMarkdownRenderContext(this.markdownParseOptions(deps.marked,"",[],[],void 0,[]));if(!markdownProgressiveEligible(context.instance,!this.withoutGfm)){devWarnOnce("lyra-markdown-progressive-unavailable","<lr-markdown>: this parser configuration uses plain streaming.");return}const policy=markdownSanitizerPolicy({htmlMode:mode,math:this.math,codeBlockHeader:this.codeBlockHeader}),activeHighlightKeys=new Set,session=new MarkdownProgressiveSession({parser:context.instance,gfm:!this.withoutGfm,tabSize:finiteInteger(this.tabSize,4,1,32),render:(source,rawSource,links,state2,slugger,prefix)=>{const pendingKeys=[],headings=[],records=[],options=this.markdownParseOptions(deps.marked,source,pendingKeys,headings,slugger,records,rawSource);options.codeBlockIndexOffset=prefix,options.activeHighlightKeys=activeHighlightKeys,options.highlightCodeOption=!this.withoutSyntaxHighlighting;const result=createMarkdownRenderContext(options).render(source,{links,state:state2});return this.maybeLoadKatex(),{...result,rawHtml:result.html,html:finishMarkdownHtml(deps,policy,result.html,result.hasRawHtml),headings,codeBlocks:records,pendingKeys}}},previous?.blocks);return session.update(this.content??""),previous&&session.step(!1,!0,previous.end),session}renderProgressiveMarkdown(){const previous=this.progressiveSession;(!previous||this.progressiveRebuild)&&(this.progressiveSession=this.createProgressiveSession(previous),this.progressiveRebuild=!1);const session=this.progressiveSession;if(!session){this.renderedHtml=null,this.renderedBlocks=[],this.streamingTail=null,this.headingTree=[],this.codeHeader.setBlocks([]);return}session.update(this.content??""),session.step(),this.renderedHtml="",this.syncProgressiveMarkdown(),session.pending||(this.completedHighlights=new Map);const pending=session.nextHighlight();pending&&!this.withoutSyntaxHighlighting&&this.highlightPending([pending]),session.pending&&this.scheduleStreamingRender()}syncProgressiveMarkdown(){const session=this.progressiveSession;if(!session)return;const start=session.takeChangedFrom();if(start!==void 0){this.progressiveChangedFrom=Math.min(this.progressiveChangedFrom,start);for(let index=start;index<session.blocks.length;index++)this.renderedBlocks[index]={id:`stream-${index}`,html:session.blocks[index].html};this.renderedBlocks.length=session.blocks.length,this.progressiveRevision++,this.headingTree=session.headings,this.codeHeader.setBlocks(session.records,session.recordOffset(start))}const tail=session.tail;(tail?.kind!==this.streamingTail?.kind||tail?.text!==this.streamingTail?.text)&&(this.streamingTail=tail)}progressiveStats(){return this.progressiveSession?.stats}maybeLoadKatex(){this.math&&this.markdownVariant.katexState.startLoad(this.handleKatexResolved)}reportMathFailure(){this.mathFailureReported||(this.mathFailureReported=!0,this.emit("lr-render-error",{error:markdownMathPeerError(this.markdownVariant.tag)}))}grammarCacheKey(key){const language=key.slice(0,key.indexOf(":")),languages=this.highlightLanguageSources,authored=languages?.[language]??languages?.[normalizeShikiLanguage(language)];return highlightGrammarKey(languages,`${authored?"authored":this.markdownVariant.tag}:${key}`)}getCachedHighlight(key){return this.completedHighlights.get(key)??getCachedHighlight(this.highlightCache,this.grammarCacheKey(key))}setCachedHighlight(key,html){return setCachedHighlight(this.highlightCache,this.grammarCacheKey(key),html,HIGHLIGHT_CACHE_MAX)}async highlightPending(pendingKeys){const work=pendingKeys.filter(({key})=>this.inFlightHighlightKeys.get(key)!==this.highlightToken);if(work.length===0)return;const token=this.highlightToken;for(const{key}of work)this.inFlightHighlightKeys.set(key,token);const languages=this.languages,completed=new Map,isCurrent=()=>token===this.highlightToken&&this.isConnected,tokenizeOne=async pending=>{const html=await this.tokenizePendingHighlight(pending,languages,isCurrent);!isCurrent()||html===void 0||(html!==null&&(setCachedHighlight(completed,pending.key,html),this.setCachedHighlight(pending.key,html)),addFailedHighlightKey(this.failedHighlightKeys,pending.key))};try{await processPendingHighlights(work,tokenizeOne)}catch{for(const{key}of work)addFailedHighlightKey(this.failedHighlightKeys,key);devWarnOnce(HIGHLIGHT_FAILURE_WARNING_KEY,HIGHLIGHT_FAILURE_WARNING)}finally{for(const{key}of work)this.inFlightHighlightKeys.get(key)===token&&this.inFlightHighlightKeys.delete(key)}if(isCurrent()){for(const[key,html]of completed)setCachedHighlight(this.completedHighlights,key,html);this.progressiveSession?(this.progressiveSession.invalidateHighlights(work.map(({key})=>key)),this.streaming?this.scheduleStreamingRender():this.renderMarkdown()):this.renderMarkdown()}}parseMarkdown(marked,pendingKeys,headingTreeOut){const source=this.content??"";return parseMarkdownDocument(this.markdownParseOptions(marked,normalizeMarkdownLeadingTabs(source,finiteInteger(this.tabSize,4,1,32)),pendingKeys,headingTreeOut,void 0,this.codeBlocks,source))}markdownParseOptions(marked,content,pendingKeys,headingTreeOut,slugger,codeBlocksOut=[],rawContent=content){const variant=this.markdownVariant;return{marked,slugger,content,pendingKeys,headingTreeOut,codeBlocksOut,rawContent,markedConfigurations:[variant.sharedParser.get(marked)?.defaults,this.marked?.defaults],gfm:!this.withoutGfm,linkTarget:this.linkTarget,headingOffset:finiteInteger(this.headingOffset,0,0,6),escapeHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="escape",trustedHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="trusted",codeBlockHeaderOption:this.codeBlockHeader,codeFrameNonce:this.codeBlockHeader?this.codeHeader.nonce:void 0,tabSize:finiteInteger(this.tabSize,4,1,32),highlightCodeOption:!this.withoutSyntaxHighlighting&&!this.streaming,getCachedHighlight:key=>this.getCachedHighlight(key),failedHighlightKeys:this.failedHighlightKeys,headingAnchorsOption:this.headingAnchors,mathOption:this.math,cachedKatex:this.math?variant.katexState.getIfLoaded():null}}getHeadingTree(){return[...this.headingTree]}contentRoot(){return this.renderRoot.querySelector('[part="content"]')}async applyAnchor(anchor){const root=this.contentRoot();if(!root)return!1;if(anchor.kind==="fragment")return applyMarkdownFragmentAnchor(root,anchor,this.headingTree);if(anchor.kind==="text-quote"){const index=this.markdownTextIndex(root),found=applyMarkdownTextQuoteAnchor(root,anchor,this.effectiveLocale,index);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.repaintHighlights(),found}return!1}computeSelectionAnchor(range){const root=this.contentRoot();if(!root)return null;const anchor=buildQuoteAnchor(range,this.markdownTextIndex(root).scope);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.scheduleAfterUpdate(()=>this.repaintHighlights()),anchor}ensureHighlightHandle(){return this.highlightHandle??=acquireHighlightHandle(this,this.ownerDocument),this.highlightHandle}cancelHighlightRepaint(){const timer=this.highlightRepaintTimer;this.highlightRepaintTimer=void 0,timer&&timer.view.clearTimeout(timer.id)}scheduleHighlightRepaint(){if(this.highlights.length===0||this.highlightRepaintTimer)return;const view=this.ownerDocument.defaultView;if(!view){this.repaintHighlights();return}const timer={view,id:0};timer.id=view.setTimeout(()=>{this.highlightRepaintTimer===timer&&(this.highlightRepaintTimer=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.repaintHighlights())},100),this.highlightRepaintTimer=timer}markdownTextIndex(root){const locale=this.effectiveLocale,cached=this.textQuoteIndexCache;if(cached?.root===root&&cached.locale===locale&&!cached.mappingDirty)return cached.index;if(cached?.mappingDirty){const handle=this.ensureHighlightHandle();for(const tone of["accent","success","warning","danger","neutral"])handle.setRanges(tone,[]);handle.setActive(null)}let scope;if(this.progressiveSession?(this.quoteScope?.root!==root&&(this.quoteScope?.builder.disconnect(),this.quoteScope={root,builder:new IncrementalTextQuoteScope(root,{maxTraversalNodes:TEXT_QUOTE_LIMITS.maxTraversalNodes+4008})}),scope=this.quoteScope.builder.update(this.streamingTail?root.lastElementChild:null)):(this.quoteScope?.builder.disconnect(),this.quoteScope=void 0,scope=scopeFromElement(root)),this.markdownTextScopeBuilds++,cached?.root===root&&cached.locale===locale&&cached.index.rebindScope(scope))return cached.mappingDirty=!1,cached.index;const index=createTextQuoteIndex(scope,locale);return this.textQuoteIndexCache={root,locale,index,mappingDirty:!1},index}markdownTextScopeBuildCount(){return this.markdownTextScopeBuilds}markdownTextQuoteScanCount(){return this.textQuoteIndexCache?.index.scanCount??0}repaintHighlights(){this.resolvedHighlightRanges=[];const root=this.contentRoot();if(!root)return;if(this.highlights.length===0){this.highlightHandle?.release(),this.highlightHandle=void 0;return}if(this.streaming&&this.progressiveSession&&!supportsCustomHighlights(this.ownerDocument)){this.highlightHandle?.release(),this.highlightHandle=void 0;return}const index=this.markdownTextIndex(root);this.resolvedHighlightRanges=repaintMarkdownHighlights({locale:this.effectiveLocale,root,handle:this.ensureHighlightHandle(),highlights:this.highlights,activeHighlightId:this.activeHighlightId,index}),!supportsCustomHighlights(this.ownerDocument)&&this.textQuoteIndexCache&&(this.textQuoteIndexCache.mappingDirty=!0)}render(){const progressiveRendering=!!(this.progressiveSession&&(this.streaming||this.progressiveAdopted)),changedFrom=this.progressiveChangedFrom;return this.progressiveChangedFrom=1/0,renderMarkdownContent({content:this.content??"",sanitized:normalizeMarkdownHtmlMode(this.htmlMode)==="sanitize",renderedHtml:this.renderedHtml,fallbackSegments:!progressiveRendering&&this.renderedHtml===null?this.fallbackCode.segments(this.content??""):null,progressive:progressiveRendering?{blocks:this.renderedBlocks,tail:this.streamingTail,revision:this.progressiveRevision,changedFrom}:null,hostAriaLabel:this.getAttribute("aria-label"),isDarkTheme:this.isDarkTheme,onClick:this.onContentClick,liveRegion:this.renderAnchorLiveRegion(),maxHeight:this.maxHeight})}}__decorate([state()],MarkdownRuntimeBase.prototype,"renderedHtml",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"renderedBlocks",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"streamingTail",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"progressiveRevision",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"isDarkTheme",void 0);export{MarkdownRuntimeBase,createMarkdownVariantContext};
@@ -1,5 +1,5 @@
1
- import type{ReactiveController,ReactiveControllerHost}from'lit';import{type LyraClipboardWriteSuccess,type LyraClipboardWriteFailure}from'../../../internal/clipboard.js';export declare const MARKDOWN_CODE_HEADER_MAX=200;export interface MarkdownCodeBlockRecord{language:string;source:string;ordinal:number;}type HeaderHost=HTMLElement&ReactiveControllerHost;interface HeaderOptions{isEnabled():boolean;contentVersion():unknown;getContentRoot():ParentNode|null;localize(key:string,fallback?:string,values?:Record<string,string>):string;buildHeader(frame:HTMLElement,language:string):HTMLButtonElement;emitCopy(outcome:LyraClipboardWriteSuccess):void;emitCopyError(outcome:LyraClipboardWriteFailure):void;}export declare function sanitizeCodeLanguageLabel(language:string):string;
1
+ import type{ReactiveController,ReactiveControllerHost}from'lit';import{type LyraClipboardWriteSuccess,type LyraClipboardWriteFailure}from'../../../internal/clipboard.js';export declare const MARKDOWN_CODE_HEADER_MAX=200;export interface MarkdownCodeBlockRecord{language:string;source:string;ordinal:number;}type HeaderHost=HTMLElement&ReactiveControllerHost;interface HeaderOptions{isEnabled():boolean;contentVersion():unknown;getContentRoot():ParentNode|null;getChangedRoots?():readonly ParentNode[];localize(key:string,fallback?:string,values?:Record<string,string>):string;buildHeader(frame:HTMLElement,language:string):HTMLButtonElement;emitCopy(outcome:LyraClipboardWriteSuccess):void;emitCopyError(outcome:LyraClipboardWriteFailure):void;}export declare function sanitizeCodeLanguageLabel(language:string):string;
2
2
  /** Builds only elements and attributes: header decoration never enters the document text corpus. */
3
3
  export declare function renderMarkdownCodeHeader(frame:HTMLElement,language:string):HTMLButtonElement;
4
4
  /** Instance-owned copy controls with generation-safe clipboard writes and owner-window timers. */
5
- export declare class MarkdownCodeHeaderController implements ReactiveController{private readonly host;private readonly options;private nonceValue?;private records;private generation;private tokens;private statuses;private readonly timers;private readonly buttons;private readonly frames;private readonly painted;private liveButtons;private liveFrames;private contentVersion;private contentRoot;private remembered?;private sink?;constructor(host:HeaderHost,options:HeaderOptions);get nonce():string;setBlocks(next:readonly MarkdownCodeBlockRecord[]):void;private resetIndex;private release;hostConnected():void;hostDisconnected():void;hostAdopted():void;hostUpdate():void;hostUpdated():void;handleClick(event:MouseEvent):boolean;private copy;}export{};
5
+ export declare class MarkdownCodeHeaderController implements ReactiveController{private readonly host;private readonly options;private nonceValue?;private records;private generation;private tokens;private statuses;private readonly timers;private readonly buttons;private readonly frames;private readonly painted;private liveButtons;private liveFrames;private contentVersion;private contentRoot;private remembered?;private sink?;constructor(host:HeaderHost,options:HeaderOptions);get nonce():string;setBlocks(next:readonly MarkdownCodeBlockRecord[],start?:number):void;private resetIndex;private release;hostConnected():void;hostDisconnected():void;hostAdopted():void;hostUpdate():void;hostUpdated():void;handleClick(event:MouseEvent):boolean;private copy;}export{};
@@ -1 +1 @@
1
- import{COPY_FEEDBACK_MS}from"../../../internal/copy-feedback.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";const MARKDOWN_CODE_HEADER_MAX=200,MARKDOWN_CODE_COPY_CONFIRM_MS=COPY_FEEDBACK_MS;function sanitizeCodeLanguageLabel(language){return Array.from(language.replace(/[\p{Cc}\p{Cf}]/gu,"")).slice(0,32).join("")}function partNode(document,name,part){const element=document.createElement(name);return element.setAttribute("part",part),element.setAttribute("data-lr-code-chrome",""),element}function glyph(button,status){const document=button.ownerDocument,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("fill","none"),svg.setAttribute("stroke","currentColor"),svg.setAttribute("stroke-width","2"),svg.setAttribute("stroke-linecap","round"),svg.setAttribute("stroke-linejoin","round"),svg.setAttribute("aria-hidden","true"),svg.setAttribute("focusable","false");const shapes=status==="success"?["M5 12l4 4L19 6"]:status==="error"?["M12 3 2 21h20L12 3Z","M12 9v5","M12 17h.01"]:["M9 9h11v11H9z","M5 15H4V4h11v1"];for(const d of shapes){const path=document.createElementNS("http://www.w3.org/2000/svg","path");path.setAttribute("d",d),svg.append(path)}button.replaceChildren(svg)}function renderMarkdownCodeHeader(frame,language){const document=frame.ownerDocument,header=partNode(document,"div","code-block-header");if(language){const label=partNode(document,"span","code-block-language");label.setAttribute("data-language",language),label.setAttribute("aria-hidden","true"),header.append(label)}const button=partNode(document,"button","code-block-copy");return button.type="button",glyph(button,"rest"),header.append(button),frame.firstChild!==header&&frame.insertBefore(header,frame.firstChild),button}function deepActive(document){let active=document.activeElement;for(;active?.shadowRoot?.activeElement;)active=active.shadowRoot.activeElement;return active}class MarkdownCodeHeaderController{constructor(host,options){this.host=host,this.options=options,this.records=[],this.generation=0,this.tokens=[],this.statuses=[],this.timers=new Map,this.buttons=new WeakMap,this.frames=new WeakMap,this.painted=new WeakMap,this.liveButtons=new Map,this.liveFrames=new Map,this.contentRoot=null,host.addController(this)}get nonce(){if(!this.nonceValue){const values=new Uint32Array(4);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(values);else for(let i=0;i<values.length;i++)values[i]=Math.floor(Math.random()*4294967296);this.nonceValue=Array.from(values,value=>value.toString(16).padStart(8,"0")).join("")}return this.nonceValue}setBlocks(next){for(let i=0;i<Math.max(this.records.length,next.length);i++){const previous=this.records[i],current=next[i];(previous?.language!==current?.language||previous?.source!==current?.source)&&this.resetIndex(i)}this.records=next.map(record=>({...record}))}resetIndex(index){this.tokens[index]=(this.tokens[index]??0)+1,this.statuses[index]="rest";const timer=this.timers.get(index);timer&&timer.owner.clearTimeout(timer.handle),this.timers.delete(index)}release(){this.generation++;for(let i=0;i<this.records.length;i++)this.resetIndex(i);this.sink?.release(),this.sink=void 0,this.remembered=void 0,this.contentRoot=null}hostConnected(){this.options.isEnabled()&&!this.sink&&(this.sink=acquireAnnouncementSink("polite",{document:this.host.ownerDocument,source:this.host}))}hostDisconnected(){this.release()}hostAdopted(){this.release()}hostUpdate(){const active=deepActive(this.host.ownerDocument),index=active?this.buttons.get(active):void 0;active&&index!==void 0&&(this.remembered={button:active,index})}hostUpdated(){if(!this.options.isEnabled()){this.sink?.release(),this.sink=void 0,this.contentRoot=null;return}if(!this.host.isConnected)return;this.hostConnected();const root=this.options.getContentRoot();if(!root)return;const version=this.options.contentVersion();if(root!==this.contentRoot||version!==this.contentVersion){this.contentRoot=root,this.contentVersion=version,this.liveButtons=new Map,this.liveFrames=new Map;const frames=root.querySelectorAll(`[data-lr-code-frame^="${this.nonce}:"]`);let visited=0;for(const frame of frames){if(visited++>=this.records.length)break;const index=Number(frame.getAttribute("data-lr-code-frame")?.slice(this.nonce.length+1)),record=this.records[index];if(!record||frame.getAttribute("data-lr-code-frame")!==`${this.nonce}:${index}`)continue;let button=this.frames.get(frame);button||(frame.setAttribute("role","group"),frame.setAttribute("data-lr-code-chrome",""),button=this.options.buildHeader(frame,record.language),this.frames.set(frame,button),this.buttons.set(button,index)),this.liveButtons.set(index,button),this.liveFrames.set(index,frame)}}for(const[index,button]of this.liveButtons){const record=this.records[index],frame=this.liveFrames.get(index);if(!record||!frame)continue;const{localize}=this.options,group=record.language?localize("codeRegionWithLanguage",void 0,{language:record.language}):localize("codeRegion");frame.getAttribute("aria-label")!==group&&frame.setAttribute("aria-label",group);const status=this.statuses[index]??"rest",label=localize(status==="success"?"copiedToClipboard":status==="error"?"copyFailed":"copyCode");for(const name of["aria-label","title"])button.getAttribute(name)!==label&&button.setAttribute(name,label);const part=status==="success"?"code-block-copy code-block-copy-success":status==="error"?"code-block-copy code-block-copy-error":"code-block-copy";button.getAttribute("part")!==part&&button.setAttribute("part",part),this.painted.get(button)!==status&&(glyph(button,status),this.painted.set(button,status))}const remembered=this.remembered;if(this.remembered=void 0,remembered&&!remembered.button.isConnected){const document=this.host.ownerDocument,active=deepActive(document);(!active||active===document.body||active===document.documentElement)&&this.liveButtons.get(remembered.index)?.focus({preventScroll:!0})}}handleClick(event){for(const target of event.composedPath()){const index=this.buttons.get(target);if(index!==void 0)return this.copy(index),!0}return!1}async copy(index){const record=this.records[index];if(!record||!this.host.isConnected||!this.options.isEnabled())return;this.resetIndex(index);const token=this.tokens[index],generation=this.generation,owner=this.host.ownerDocument.defaultView,outcome=await writeClipboardText(owner,record.source);!this.host.isConnected||owner!==this.host.ownerDocument.defaultView||generation!==this.generation||token!==this.tokens[index]||(this.statuses[index]=outcome.ok?"success":"error",outcome.ok?this.options.emitCopy(outcome):this.options.emitCopyError(outcome),this.sink?.announce(outcome.ok?this.options.localize("copiedToClipboard"):this.options.localize("copyFailed")),this.host.requestUpdate(),owner&&this.timers.set(index,{owner,handle:owner.setTimeout(()=>{generation!==this.generation||token!==this.tokens[index]||(this.timers.delete(index),this.statuses[index]="rest",this.host.requestUpdate())},MARKDOWN_CODE_COPY_CONFIRM_MS)}))}}export{MARKDOWN_CODE_HEADER_MAX,MarkdownCodeHeaderController,renderMarkdownCodeHeader,sanitizeCodeLanguageLabel};
1
+ import{COPY_FEEDBACK_MS}from"../../../internal/copy-feedback.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";const MARKDOWN_CODE_HEADER_MAX=200,MARKDOWN_CODE_COPY_CONFIRM_MS=COPY_FEEDBACK_MS;function sanitizeCodeLanguageLabel(language){return Array.from(language.replace(/[\p{Cc}\p{Cf}]/gu,"")).slice(0,32).join("")}function partNode(document,name,part){const element=document.createElement(name);return element.setAttribute("part",part),element.setAttribute("data-lr-code-chrome",""),element}function glyph(button,status){const document=button.ownerDocument,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("fill","none"),svg.setAttribute("stroke","currentColor"),svg.setAttribute("stroke-width","2"),svg.setAttribute("stroke-linecap","round"),svg.setAttribute("stroke-linejoin","round"),svg.setAttribute("aria-hidden","true"),svg.setAttribute("focusable","false");const shapes=status==="success"?["M5 12l4 4L19 6"]:status==="error"?["M12 3 2 21h20L12 3Z","M12 9v5","M12 17h.01"]:["M9 9h11v11H9z","M5 15H4V4h11v1"];for(const d of shapes){const path=document.createElementNS("http://www.w3.org/2000/svg","path");path.setAttribute("d",d),svg.append(path)}button.replaceChildren(svg)}function renderMarkdownCodeHeader(frame,language){const document=frame.ownerDocument,header=partNode(document,"div","code-block-header");if(language){const label=partNode(document,"span","code-block-language");label.setAttribute("data-language",language),label.setAttribute("aria-hidden","true"),header.append(label)}const button=partNode(document,"button","code-block-copy");return button.type="button",glyph(button,"rest"),header.append(button),frame.firstChild!==header&&frame.insertBefore(header,frame.firstChild),button}function deepActive(document){let active=document.activeElement;for(;active?.shadowRoot?.activeElement;)active=active.shadowRoot.activeElement;return active}class MarkdownCodeHeaderController{constructor(host,options){this.host=host,this.options=options,this.records=[],this.generation=0,this.tokens=[],this.statuses=[],this.timers=new Map,this.buttons=new WeakMap,this.frames=new WeakMap,this.painted=new WeakMap,this.liveButtons=new Map,this.liveFrames=new Map,this.contentRoot=null,host.addController(this)}get nonce(){if(!this.nonceValue){const values=new Uint32Array(4);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(values);else for(let i=0;i<values.length;i++)values[i]=Math.floor(Math.random()*4294967296);this.nonceValue=Array.from(values,value=>value.toString(16).padStart(8,"0")).join("")}return this.nonceValue}setBlocks(next,start=0){for(let i=start;i<Math.max(this.records.length,next.length);i++){const previous=this.records[i],current=next[i];(previous?.language!==current?.language||previous?.source!==current?.source)&&this.resetIndex(i)}for(let index=start;index<next.length;index++)this.records[index]={...next[index]};this.records.length=next.length}resetIndex(index){this.tokens[index]=(this.tokens[index]??0)+1,this.statuses[index]="rest";const timer=this.timers.get(index);timer&&timer.owner.clearTimeout(timer.handle),this.timers.delete(index)}release(){this.generation++;for(let i=0;i<this.records.length;i++)this.resetIndex(i);this.sink?.release(),this.sink=void 0,this.remembered=void 0,this.contentRoot=null}hostConnected(){this.options.isEnabled()&&!this.sink&&(this.sink=acquireAnnouncementSink("polite",{document:this.host.ownerDocument,source:this.host}))}hostDisconnected(){this.release()}hostAdopted(){this.release()}hostUpdate(){const active=deepActive(this.host.ownerDocument),index=active?this.buttons.get(active):void 0;active&&index!==void 0&&(this.remembered={button:active,index})}hostUpdated(){if(!this.options.isEnabled()){this.sink?.release(),this.sink=void 0,this.contentRoot=null;return}if(!this.host.isConnected)return;this.hostConnected();const root=this.options.getContentRoot();if(!root)return;const version=this.options.contentVersion();if(root!==this.contentRoot||version!==this.contentVersion){this.contentRoot=root,this.contentVersion=version;const roots=this.options.getChangedRoots?.()??[root];if(roots.includes(root))this.liveButtons.clear(),this.liveFrames.clear();else for(const[index,frame]of this.liveFrames)frame.isConnected||(this.liveFrames.delete(index),this.liveButtons.delete(index));const selector=`[data-lr-code-frame^="${this.nonce}:"]`,frames=roots.flatMap(candidate=>[...candidate.nodeType===1&&candidate.matches(selector)?[candidate]:[],...candidate.querySelectorAll(selector)]);let visited=0;for(const frame of frames){if(visited++>=this.records.length)break;const index=Number(frame.getAttribute("data-lr-code-frame")?.slice(this.nonce.length+1)),record=this.records[index];if(!record||frame.getAttribute("data-lr-code-frame")!==`${this.nonce}:${index}`)continue;let button=this.frames.get(frame);button||(frame.setAttribute("role","group"),frame.setAttribute("data-lr-code-chrome",""),button=this.options.buildHeader(frame,record.language),this.frames.set(frame,button),this.buttons.set(button,index)),this.liveButtons.set(index,button),this.liveFrames.set(index,frame)}}for(const[index,button]of this.liveButtons){const record=this.records[index],frame=this.liveFrames.get(index);if(!record||!frame)continue;const{localize}=this.options,group=record.language?localize("codeRegionWithLanguage",void 0,{language:record.language}):localize("codeRegion");frame.getAttribute("aria-label")!==group&&frame.setAttribute("aria-label",group);const status=this.statuses[index]??"rest",label=localize(status==="success"?"copiedToClipboard":status==="error"?"copyFailed":"copyCode");for(const name of["aria-label","title"])button.getAttribute(name)!==label&&button.setAttribute(name,label);const part=status==="success"?"code-block-copy code-block-copy-success":status==="error"?"code-block-copy code-block-copy-error":"code-block-copy";button.getAttribute("part")!==part&&button.setAttribute("part",part),this.painted.get(button)!==status&&(glyph(button,status),this.painted.set(button,status))}const remembered=this.remembered;if(this.remembered=void 0,remembered&&!remembered.button.isConnected){const document=this.host.ownerDocument,active=deepActive(document);(!active||active===document.body||active===document.documentElement)&&this.liveButtons.get(remembered.index)?.focus({preventScroll:!0})}}handleClick(event){for(const target of event.composedPath()){const index=this.buttons.get(target);if(index!==void 0)return this.copy(index),!0}return!1}async copy(index){const record=this.records[index];if(!record||!this.host.isConnected||!this.options.isEnabled())return;this.resetIndex(index);const token=this.tokens[index],generation=this.generation,owner=this.host.ownerDocument.defaultView,outcome=await writeClipboardText(owner,record.source);!this.host.isConnected||owner!==this.host.ownerDocument.defaultView||generation!==this.generation||token!==this.tokens[index]||(this.statuses[index]=outcome.ok?"success":"error",outcome.ok?this.options.emitCopy(outcome):this.options.emitCopyError(outcome),this.sink?.announce(outcome.ok?this.options.localize("copiedToClipboard"):this.options.localize("copyFailed")),this.host.requestUpdate(),owner&&this.timers.set(index,{owner,handle:owner.setTimeout(()=>{generation!==this.generation||token!==this.tokens[index]||(this.timers.delete(index),this.statuses[index]="rest",this.host.requestUpdate())},MARKDOWN_CODE_COPY_CONFIRM_MS)}))}}export{MARKDOWN_CODE_HEADER_MAX,MarkdownCodeHeaderController,renderMarkdownCodeHeader,sanitizeCodeLanguageLabel};
@@ -236,14 +236,19 @@ streaming:boolean;
236
236
  /** How content is displayed while `streaming` is true. `plain` (the default) keeps the current
237
237
  * accumulated source as plain text. `progressive` parses complete top-level Markdown blocks as
238
238
  * they settle, keeps only the mutable trailing block as text, and renders an open fenced block
239
- * as unhighlighted code. Once `streaming` becomes false the component performs its regular full
240
- * document parse, including cross-block reference links. */
239
+ * as unhighlighted code. The offscreen plain-text tail reserves an estimated height until
240
+ * revealed, while its complete text remains in the DOM. Once `streaming` becomes false the
241
+ * component performs its regular full document parse, including cross-block reference links. */
241
242
  streamingRender:MarkdownStreamingRender;
242
243
  /** Adds a language label and source-copy button to the first 200 non-empty built-in code blocks.
243
244
  * Custom code renderers and pre-escaped code bypass the header. In sanitize mode this also strips
244
245
  * authored style elements; trusted mode has no guarantee against authored visual copy deception. */
245
246
  codeBlockHeader:boolean;
246
- /** Turns off syntax highlighting of fenced code blocks, keeping plain output even when grammars
247
+ /** Syntax highlighting admits the first 100 distinct language/code pairs per document and
248
+ * blocks of at most 8,192 UTF-16 code units (including their terminal newline). Later or larger
249
+ * blocks remain readable plain code. The shared page cache holds at most 100 entries / 2 MiB.
250
+ * Output evicted by the byte budget stays plain until the highlighting configuration changes.
251
+ * Turns off syntax highlighting of fenced code blocks, keeping plain output even when grammars
247
252
  * are supplied. Unset (the default), fenced blocks are highlighted through the fine-grained Shiki
248
253
  * core loader when `languages` supplies the matching grammar; the empty default language map
249
254
  * means no fenced block is highlighted. Plain streaming defers highlighting until completion; progressive mode highlights settled blocks. */
@@ -2,7 +2,7 @@ import{Slugger}from"../../../internal/slugger.js";const MARKDOWN_PROGRESSIVE_GRO
2
2
  `)character==="\r"&&raw[i+1]===`
3
3
  `&&i++,appended+=`
4
4
  `,this.completeEnd=this.text.length+appended.length,this.lineHasText&&(this.displayEnd=this.completeEnd),this.lineHasText=!1,this.column=0,this.leading=!0,this.starts.push([this.completeEnd,i+1]);else{if(this.leading&&(character===" "||character===" ")){const count=character===" "?this.tabSize-this.column%this.tabSize:1;appended+=" ".repeat(count),this.column+=count}else appended+=character,this.leading=character==="\u2028"||character==="\u2029",this.leading&&(this.column=0);/\s/.test(character)||(this.lineHasText=!0),this.lineHasText&&(this.displayEnd=this.text.length+appended.length)}this.processed=i+1}this.text+=appended}rawOffset(offset){let low=0,high=this.starts.length;for(;low+1<high;){const middle=low+high>>>1;this.starts[middle][0]<=offset?low=middle:high=middle}const[normalized,raw]=this.starts[low];return offset===normalized?raw:offset===this.text.length?this.raw.length:raw+offset-normalized}}function decisive(line){const match=/^( *)(\S)/.exec(line);return!!(match&&(match[1].length>=4||!/[#>*+\-=_`~<|["'(\d]/.test(match[2])))}function fence(source){const match=/^( {0,3})(`{3,}|~{3,})([^\n]*)\n/.exec(source);return!match||match[2][0]==="`"&&match[3].includes("`")?null:{run:match[2],indent:match[1].length,end:match[0].length,backtick:match[2][0]==="`"}}function hasFenceClose(source,completeEnd=source.length){const opening=fence(source);return opening?new RegExp(`^ {0,3}${opening.run}[~\`]* *$`,"m").test(source.slice(opening.end,completeEnd).replace(/[^\n]*$/,"")):!1}function markdownHtmlBalanced(html){const stack=[],voids=/^(?:area|base|br|col|embed|hr|img|input|link|meta|source|track|wbr|basefont|bgsound|frame|keygen|param)$/;let cursor=0;for(;cursor<html.length;){const raw=stack.at(-1);if(raw&&/^(?:script|style|textarea|title|xmp|iframe|noembed|noframes|noscript|plaintext)$/.test(raw)){if(raw==="plaintext")return!1;const closing=new RegExp(`</${raw}(?=[\\s>])`,"ig");closing.lastIndex=cursor;const match=closing.exec(html);if(!match)return!1;cursor=match.index}else if(cursor=html.indexOf("<",cursor),cursor<0)break;if(html.startsWith("<!--",cursor)){const end2=html.indexOf("-->",cursor+4);if(end2<0)return!1;cursor=end2+3;continue}if(/^[!?]/.test(html[cursor+1]??"")){const end2=html.indexOf(">",cursor+2);if(end2<0)return!1;cursor=end2+1;continue}const tag=/^<\/?([a-z][\w:-]*)/i.exec(html.slice(cursor));if(!tag){cursor++;continue}const name=tag[1].toLowerCase();let quote="",end=cursor+tag[0].length;for(;end<html.length;end++){const character=html[end];if(quote)character===quote&&(quote="");else if(character==='"'||character==="'")quote=character;else if(character===">")break}if(end===html.length)return!1;if(html[cursor+1]==="/"){const index=stack.lastIndexOf(name);index>=0&&stack.splice(index,1)}else!voids.test(name)&&!(html[end-1]==="/"&&(stack.includes("svg")||stack.includes("math")||name==="svg"||name==="math"))&&stack.push(name);cursor=end+1}return stack.length===0}function definitionHeld(source,tokenize){const opener=/^ {0,3}\[(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+\]: *(?:\n[ \t]*)?(?:[^<\s][^\s]*|<.*?>)(?: +(?:\n[ \t]*)?| *\n[ \t]*)(["'(])/.exec(source);if(!opener)return!1;const token=tokenize?.(source);if(token&&token.title!=null)return!1;const complete=source.slice(opener[0].length,source.lastIndexOf(`
5
- `)+1);return opener[1]==='"'?!/(^|[^\\])"/.test(complete):opener[1]==="("?!/[()]/.test(complete):!/'|\n\n/.test(complete)}class MarkdownProgressiveSession{constructor(options,replay){this.options=options,this.blocks=[],this.stats={frames:0,lexedUnits:0,committedUnits:0,groupRenders:0,recomputes:0,stalls:0,highlightDispatches:0},this.committedEnd=0,this.definitions=Object.create(null),this.committedDefinitions=Object.create(null),this.definitionChanges=0,this.deferredDefinitions=!1,this.plan=[],this.planIndex=0,this.lastLexEnd=-1,this.lastLexStart=-1,this.lastLexSize=0,this.lastCompleteEnd=-1,this.lastDecisive=!1,this.hintsEnabled=!0,this.waitForInput=!1,this.frozen=!1,this.eof=!1,this.slugger=new Slugger,this.sluggerDirty=!1,this.invalidated=new Set,this.highlightQueue=new Map,this.memo=new Map,this.normalized=new NormalizedSource(options.tabSize),this.replayEnds=replay?.map(block=>block.end)??[]}get source(){return this.normalized.raw}get end(){return this.committedEnd}get failed(){return this.frozen}get records(){return this.blocks.flatMap(block=>block.codeBlocks)}get headings(){return this.blocks.flatMap(block=>block.headings)}get pending(){return!this.frozen&&(!this.waitForInput&&this.planIndex<this.plan.length||this.recomputeFrom!==void 0||this.highlightQueue.size>0)}update(source){if(source!==this.source){if(source.startsWith(this.source))this.normalized.append(source);else{const previousDefinitions=JSON.stringify(this.definitions);let low=0,high=Math.min(source.length,this.source.length)+1;for(;low+1<high;){const middle=low+high>>>1;source.startsWith(this.source.slice(0,middle))?low=middle:high=middle}const keep=this.blocks.findIndex(block=>block.evidenceEnd>low);if(keep>=0&&(this.blocks.length=keep),this.committedEnd=this.blocks.at(-1)?.end??0,this.sluggerDirty=!0,this.normalized=new NormalizedSource(this.options.tabSize),this.definitions=Object.create(null),this.committedDefinitions=Object.create(null),this.definitionChanges=0,this.deferredDefinitions=!1,this.memo.clear(),this.frozen=!1,this.lastLexEnd=this.lastCompleteEnd=-1,this.normalized.append(source),this.committedEnd){const lexer=this.lexer();lexer.blockTokens(this.normalized.text.slice(0,this.committedEnd),lexer.tokens),Object.assign(this.definitions,lexer.tokens.links),Object.assign(this.committedDefinitions,lexer.tokens.links)}previousDefinitions!==JSON.stringify(this.definitions)&&this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)}),this.plan=[],this.planIndex=0}this.waitForInput&&(this.plan=[],this.planIndex=0),this.waitForInput=!1}}resume(){const eofIndex=this.blocks.findIndex(block=>block.eofOnly);if(eofIndex>=0&&(this.blocks.length=eofIndex),this.committedEnd=this.blocks.at(-1)?.end??0,eofIndex>=0){const previousDefinitions=JSON.stringify(this.definitions),lexer=this.lexer();lexer.blockTokens(this.normalized.text.slice(0,this.committedEnd),lexer.tokens),this.committedDefinitions={...lexer.tokens.links},this.definitions={...this.committedDefinitions},previousDefinitions!==JSON.stringify(this.definitions)&&this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)})}this.sluggerDirty=!0,this.eof=!1,this.plan=[],this.planIndex=0,this.lastLexEnd=this.lastCompleteEnd=-1,this.waitForInput=!1}invalidateHighlights(keys){const wanted=new Set(keys);this.blocks.forEach((block,index)=>{block.pendingKeys.some(({key})=>wanted.has(key))&&this.invalidate(index)}),this.memo.clear()}invalidateMath(){this.blocks.forEach((block,index)=>{block.hadMathFallback&&this.invalidate(index)}),this.memo.clear()}invalidate(index){this.invalidated.add(index),this.recomputeFrom=Math.min(this.recomputeFrom??index,index),this.sluggerDirty=!0}nextHighlight(){const entry=this.highlightQueue.entries().next().value;if(entry)return this.highlightQueue.delete(entry[0]),this.stats.highlightDispatches++,entry[1]}lexer(){return new this.options.parser.Lexer({...this.options.parser.defaults,gfm:this.options.gfm,async:!1})}preparePlan(eof){const source=this.normalized.text,start=this.committedEnd;start!==this.lastLexStart&&(this.lastLexStart=start,this.lastLexEnd=start,this.lastLexSize=0,this.lastCompleteEnd=-1,this.fenceScan=void 0);const completeEnd=this.normalized.completeEnd,partial=source.slice(completeEnd),isDecisive=decisive(partial),end=eof||isDecisive?source.length:completeEnd,size=end-start;if(!eof&&completeEnd===this.lastCompleteEnd&&isDecisive===this.lastDecisive)return;const delta=source.slice(Math.max(start,this.lastLexEnd)),hint=this.hintsEnabled&&/\n[ \t]*\n(?![*+-](?:\s|$)|\d{1,9}[.)](?:\s|$))[^\s]/.test(delta),tail=source.slice(start,end),opening=fence(tail);let justClosed=!1;if(opening){this.fenceScan?.start!==start&&(this.fenceScan={start,end:start+opening.end,closed:!1});const scan=this.fenceScan,pattern=new RegExp(`^ {0,3}${opening.run}[~\`]* *$`,"m");if(!scan.closed&&completeEnd>scan.end&&(scan.closed=pattern.test(source.slice(scan.end,completeEnd).replace(/[^\n]*$/,"")),justClosed=scan.closed,scan.end=completeEnd),!eof&&this.lastLexEnd>=start+opening.end&&!scan.closed){this.lastCompleteEnd=completeEnd,this.lastDecisive=isDecisive;return}}if(!eof&&!justClosed&&size>16384&&size<this.lastLexSize*1.25&&size-this.lastLexSize<16384&&!hint)return;this.lastCompleteEnd=completeEnd,this.lastDecisive=isDecisive,this.lastLexEnd=end,this.lastLexSize=size,this.stats.lexedUnits+=tail.length;const lexer=this.lexer();lexer.blockTokens(tail,lexer.tokens);const tokens=lexer.tokens,tokenEnds=[];let offset=0;for(const token of tokens){for(;!tail.startsWith(token.raw,offset);){const duplicate=lexer.options.tokenizer?.def?.(tail.slice(offset));if(duplicate?.raw&&typeof duplicate.tag=="string"&&lexer.tokens.links[duplicate.tag])offset+=duplicate.raw.length;else{this.stats.stalls++;return}}offset+=token.raw.length,tokenEnds.push(offset)}let last=tokens.length-1;for(;last>=0&&tokens[last].type==="space";)last--;const plan=[];let groupStart=start,definitionBoundary;for(let index=0;index<=last;index++){const token=tokens[index];if(token.type==="space")continue;const tokenEnd=tokenEnds[index];let after=index+1;for(;after<tokens.length&&tokens[after].type==="space";)after++;const followed=after<tokens.length,rawStart=tokenEnd-token.raw.length;let closed=start+tokenEnd<=completeEnd&&(token.type==="heading"||token.type==="hr"||token.type==="code"&&hasFenceClose(token.raw));if(!closed&&/^(?:paragraph|table|blockquote|def|html)$/.test(token.type)){const htmlOpen=token.type==="html"&&/^ {0,3}(?:<(?:script|pre|style|textarea)[\s>]|<!--|<\?|<![A-Z]|<!\[CDATA\[)/i.test(token.raw),nextStart=tail[tokenEnd-1]===`
5
+ `)+1);return opener[1]==='"'?!/(^|[^\\])"/.test(complete):opener[1]==="("?!/[()]/.test(complete):!/'|\n\n/.test(complete)}class MarkdownProgressiveSession{changed(index){this.changedFrom=Math.min(this.changedFrom??index,index),this.projectionFrom=Math.min(this.projectionFrom,index)}takeChangedFrom(){const index=this.changedFrom;return this.changedFrom=void 0,index}project(){if(this.projectionFrom===1/0)return;const start=this.projectionFrom;this.projectedRecords.length=this.recordEnds[start-1]??0,this.projectedHeadings.length=this.headingEnds[start-1]??0;for(let index=start;index<this.blocks.length;index++){const block=this.blocks[index];this.projectedRecords.push(...block.codeBlocks),this.projectedHeadings.push(...block.headings),this.recordEnds[index]=this.projectedRecords.length,this.headingEnds[index]=this.projectedHeadings.length}this.recordEnds.length=this.headingEnds.length=this.blocks.length,this.projectionFrom=1/0}recordOffset(index){return this.project(),this.recordEnds[index-1]??0}constructor(options,replay){this.options=options,this.blocks=[],this.stats={frames:0,lexedUnits:0,committedUnits:0,groupRenders:0,recomputes:0,stalls:0,highlightDispatches:0},this.projectionFrom=0,this.projectedRecords=[],this.projectedHeadings=[],this.recordEnds=[],this.headingEnds=[],this.committedEnd=0,this.definitions=Object.create(null),this.committedDefinitions=Object.create(null),this.definitionChanges=0,this.deferredDefinitions=!1,this.plan=[],this.planIndex=0,this.lastLexEnd=-1,this.lastLexStart=-1,this.lastLexSize=0,this.lastCompleteEnd=-1,this.lastDecisive=!1,this.hintsEnabled=!0,this.waitForInput=!1,this.frozen=!1,this.eof=!1,this.slugger=new Slugger,this.sluggerDirty=!1,this.invalidated=new Set,this.highlightQueue=new Map,this.memo=new Map,this.normalized=new NormalizedSource(options.tabSize),this.replayEnds=replay?.map(block=>block.end)??[]}suspend(){this.suspendedSource=this.source,this.normalized=new NormalizedSource(this.options.tabSize),this.plan=[],this.planIndex=0,this.memo.clear(),this.highlightQueue.clear(),this.fenceScan=void 0,this.lastLexEnd=this.lastCompleteEnd=-1}restoreSource(){if(this.suspendedSource===void 0)return;const source=this.suspendedSource;this.suspendedSource=void 0,this.normalized.append(source,this.eof)}get source(){return this.suspendedSource??this.normalized.raw}get end(){return this.committedEnd}get failed(){return this.frozen}get records(){return this.project(),this.projectedRecords}get headings(){return this.project(),this.projectedHeadings}get pending(){return!this.frozen&&(!this.waitForInput&&this.planIndex<this.plan.length||this.recomputeFrom!==void 0||this.highlightQueue.size>0)}update(source){if(this.restoreSource(),source!==this.source){if(source.startsWith(this.source))this.normalized.append(source);else{const previousDefinitions=JSON.stringify(this.definitions);let low=0,high=Math.min(source.length,this.source.length)+1;for(;low+1<high;){const middle=low+high>>>1;source.startsWith(this.source.slice(0,middle))?low=middle:high=middle}const keep=this.blocks.findIndex(block=>block.evidenceEnd>low);keep>=0&&(this.blocks.length=keep,this.changed(keep)),this.committedEnd=this.blocks.at(-1)?.end??0,this.sluggerDirty=!0,this.normalized=new NormalizedSource(this.options.tabSize),this.definitions=Object.create(null),this.committedDefinitions=Object.create(null),this.definitionChanges=0,this.deferredDefinitions=!1,this.memo.clear(),this.frozen=!1,this.lastLexEnd=this.lastCompleteEnd=-1,this.normalized.append(source);for(const block of this.blocks)for(const[label,value]of Object.entries(block.definitions))label in this.definitions||(this.definitions[label]=value);Object.assign(this.committedDefinitions,this.definitions),previousDefinitions!==JSON.stringify(this.definitions)&&this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)}),this.plan=[],this.planIndex=0}this.waitForInput&&(this.plan=[],this.planIndex=0),this.waitForInput=!1}}resume(){this.restoreSource();const eofIndex=this.blocks.findIndex(block=>block.eofOnly);if(eofIndex>=0&&(this.blocks.length=eofIndex,this.changed(eofIndex)),this.committedEnd=this.blocks.at(-1)?.end??0,eofIndex>=0){const previousDefinitions=JSON.stringify(this.definitions),lexer=this.lexer();lexer.blockTokens(this.normalized.text.slice(0,this.committedEnd),lexer.tokens),this.committedDefinitions={...lexer.tokens.links},this.definitions={...this.committedDefinitions},previousDefinitions!==JSON.stringify(this.definitions)&&this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)})}this.sluggerDirty=!0,this.eof=!1,this.plan=[],this.planIndex=0,this.lastLexEnd=this.lastCompleteEnd=-1,this.waitForInput=!1}invalidateHighlights(keys){const wanted=new Set(keys);this.blocks.forEach((block,index)=>{block.pendingKeys.some(({key})=>wanted.has(key))&&this.invalidate(index)}),this.memo.clear()}invalidateMath(){this.blocks.forEach((block,index)=>{block.hadMathFallback&&this.invalidate(index)}),this.memo.clear()}invalidate(index){this.invalidated.add(index),this.recomputeFrom=Math.min(this.recomputeFrom??index,index),this.sluggerDirty=!0}nextHighlight(){const entry=this.highlightQueue.entries().next().value;if(entry)return this.highlightQueue.delete(entry[0]),this.stats.highlightDispatches++,entry[1]}lexer(){return new this.options.parser.Lexer({...this.options.parser.defaults,gfm:this.options.gfm,async:!1})}preparePlan(eof){const source=this.normalized.text,start=this.committedEnd;start!==this.lastLexStart&&(this.lastLexStart=start,this.lastLexEnd=start,this.lastLexSize=0,this.lastCompleteEnd=-1,this.fenceScan=void 0);const completeEnd=this.normalized.completeEnd,partial=source.slice(completeEnd),isDecisive=decisive(partial),end=eof||isDecisive?source.length:completeEnd,size=end-start;if(!eof&&completeEnd===this.lastCompleteEnd&&isDecisive===this.lastDecisive)return;const delta=source.slice(Math.max(start,this.lastLexEnd)),hint=this.hintsEnabled&&/\n[ \t]*\n(?![*+-](?:\s|$)|\d{1,9}[.)](?:\s|$))[^\s]/.test(delta),tail=source.slice(start,end),opening=fence(tail);let justClosed=!1;if(opening){this.fenceScan?.start!==start&&(this.fenceScan={start,end:start+opening.end,closed:!1});const scan=this.fenceScan,pattern=new RegExp(`^ {0,3}${opening.run}[~\`]* *$`,"m");if(!scan.closed&&completeEnd>scan.end&&(scan.closed=pattern.test(source.slice(scan.end,completeEnd).replace(/[^\n]*$/,"")),justClosed=scan.closed,scan.end=completeEnd),!eof&&this.lastLexEnd>=start+opening.end&&!scan.closed){this.lastCompleteEnd=completeEnd,this.lastDecisive=isDecisive;return}}if(!eof&&!justClosed&&size>16384&&size<this.lastLexSize*1.25&&size-this.lastLexSize<16384&&!hint)return;this.lastCompleteEnd=completeEnd,this.lastDecisive=isDecisive,this.lastLexEnd=end,this.lastLexSize=size,this.stats.lexedUnits+=tail.length;const lexer=this.lexer();lexer.blockTokens(tail,lexer.tokens);const tokens=lexer.tokens,tokenEnds=[];let offset=0;for(const token of tokens){for(;!tail.startsWith(token.raw,offset);){const duplicate=lexer.options.tokenizer?.def?.(tail.slice(offset));if(duplicate?.raw&&typeof duplicate.tag=="string"&&lexer.tokens.links[duplicate.tag])offset+=duplicate.raw.length;else{this.stats.stalls++;return}}offset+=token.raw.length,tokenEnds.push(offset)}let last=tokens.length-1;for(;last>=0&&tokens[last].type==="space";)last--;const plan=[];let groupStart=start,definitionBoundary;for(let index=0;index<=last;index++){const token=tokens[index];if(token.type==="space")continue;const tokenEnd=tokenEnds[index];let after=index+1;for(;after<tokens.length&&tokens[after].type==="space";)after++;const followed=after<tokens.length,rawStart=tokenEnd-token.raw.length;let closed=start+tokenEnd<=completeEnd&&(token.type==="heading"||token.type==="hr"||token.type==="code"&&hasFenceClose(token.raw));if(!closed&&/^(?:paragraph|table|blockquote|def|html)$/.test(token.type)){const htmlOpen=token.type==="html"&&/^ {0,3}(?:<(?:script|pre|style|textarea)[\s>]|<!--|<\?|<![A-Z]|<!\[CDATA\[)/i.test(token.raw),nextStart=tail[tokenEnd-1]===`
6
6
  `?tokenEnd:tail.indexOf(`
7
7
  `,tokenEnd)+1,nextEnd=nextStart>0?tail.indexOf(`
8
- `,nextStart):-1;closed=!htmlOpen&&nextEnd>=0&&/^[\t ]*$/.test(tail.slice(nextStart,nextEnd))}if(!eof&&tail.length-rawStart<MARKDOWN_PROGRESSIVE_HOLD_MAX&&definitionHeld(tail.slice(rawStart),lexer.options.tokenizer?.def?.bind(lexer.options.tokenizer))){definitionBoundary=rawStart;break}if(!eof&&!followed&&!closed)break;const groupEnd=start+(after>index+1?tokenEnds[after-1]:tokenEnd);plan.push({start:groupStart,end:groupEnd,eofOnly:!followed&&!closed}),groupStart=groupEnd}eof&&groupStart<source.length&&plan.push({start:groupStart,end:source.length,eofOnly:!0});const nextLinks={...this.committedDefinitions};let links=tokens.links;if(definitionBoundary!==void 0&&!eof){const prefixLexer=this.lexer();prefixLexer.blockTokens(tail.slice(0,definitionBoundary),prefixLexer.tokens),links=prefixLexer.tokens.links}for(const[label,value]of Object.entries(links))label in nextLinks||(nextLinks[label]=value);JSON.stringify(nextLinks)!==JSON.stringify(this.definitions)&&(this.definitions=nextLinks,this.memo.clear(),this.definitionChanges++,eof||this.definitionChanges<=MARKDOWN_PROGRESSIVE_REF_RECOMPUTE_MAX?this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)}):this.deferredDefinitions=!0),this.plan=plan,this.planIndex=0,this.hintsEnabled=!hint||plan.length>0}step(eof=!1,unlimited=!1,untilEnd=1/0){if(this.frozen)return;this.stats.frames++,eof&&(this.eof=!0,this.normalized.append(this.source,!0),this.plan=[],this.planIndex=0,this.lastCompleteEnd=-1,this.deferredDefinitions&&this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)}));const limit=eof||unlimited?1/0:MARKDOWN_PROGRESSIVE_GROUP_RENDERS_PER_FRAME;let rendered=0,committed=0;try{if(this.planIndex>=this.plan.length&&this.preparePlan(eof),this.sluggerDirty){this.slugger=new Slugger;const end=this.recomputeFrom??this.blocks.length;for(let index=0;index<end;index++)for(const heading of this.blocks[index].headings)this.slugger.slug(heading.label);this.sluggerDirty=!1}for(;this.recomputeFrom!==void 0&&rendered<limit;){const index=this.recomputeFrom;this.recomputeFrom=index+1<this.blocks.length?index+1:void 0;const old=this.blocks[index];if(!old)continue;const state=this.blocks[index-1]?.state??{inLink:!1,inRawBlock:!1},slugger=this.slugger;let changedSlug=!1;const replay=slugger.clone();for(const heading of old.headings)replay.slug(heading.label)!==heading.id&&(changedSlug=!0);const changedState=old.seedState.inLink!==state.inLink||old.seedState.inRawBlock!==state.inRawBlock;if(!this.invalidated.delete(index)&&!changedSlug&&!changedState){this.slugger=replay;continue}const prefix=this.blocks.slice(0,index).flatMap(block=>block.codeBlocks),result=this.options.render(old.source,this.rawSlice(old.start,old.end),this.definitions,state,slugger,prefix);this.blocks[index]={...old,...result,seedState:{...state}},rendered++,this.stats.groupRenders++,this.stats.recomputes++}for(;this.planIndex<this.plan.length&&rendered<limit&&this.committedEnd<untilEnd;){if(this.blocks.length>=MARKDOWN_PROGRESSIVE_BLOCK_MAX){this.frozen=!0;break}const first=this.plan[this.planIndex];let lastIndex=this.planIndex;const replayEnd=this.replayEnds[this.blocks.length];for(;lastIndex+1<this.plan.length;){const next=this.plan[lastIndex+1];if(replayEnd!==void 0?next.end>replayEnd:next.end-first.start>MARKDOWN_PROGRESSIVE_GROUP_TARGET)break;lastIndex++}let finished=!1;for(;lastIndex<this.plan.length&&rendered<limit;){const last=this.plan[lastIndex],source=this.normalized.text.slice(first.start,last.end);if(!eof&&!unlimited&&committed>0&&committed+source.length>MARKDOWN_PROGRESSIVE_COMMIT_MAX)return;const state=this.blocks.at(-1)?.state??{inLink:!1,inRawBlock:!1},sluggerBefore=this.slugger,key=`${first.start}:${last.end}`;let cached=this.memo.get(key);if(!cached){const slugger=sluggerBefore.clone();cached={result:this.options.render(source,this.rawSlice(first.start,last.end),this.definitions,state,slugger,this.records),slugger},this.memo.set(key,cached),rendered++,this.stats.groupRenders++}const balanced=markdownHtmlBalanced(cached.result.rawHtml);if(!eof&&!balanced&&source.length<MARKDOWN_PROGRESSIVE_HOLD_MAX){lastIndex++;continue}const block={...cached.result,source,start:first.start,end:last.end,evidenceEnd:this.source.length,eofOnly:this.plan.slice(this.planIndex,lastIndex+1).some(candidate=>candidate.eofOnly),balanced,seedState:{...state}};this.blocks.push(block),this.slugger=cached.slugger,this.memo.clear();const definitionLexer=this.lexer();definitionLexer.blockTokens(source,definitionLexer.tokens),this.stats.lexedUnits+=source.length;for(const[label,value]of Object.entries(definitionLexer.tokens.links))label in this.committedDefinitions||(this.committedDefinitions[label]=value);this.committedEnd=last.end,committed+=source.length,this.stats.committedUnits+=source.length;for(const pending of block.pendingKeys)pending.code.length<=MARKDOWN_PROGRESSIVE_HIGHLIGHT_MAX&&this.highlightQueue.set(pending.key,pending);this.planIndex=lastIndex+1,this.planIndex===this.plan.length&&(this.lastCompleteEnd=-1),this.waitForInput=!1,finished=!0;break}if(!finished){this.waitForInput=lastIndex>=this.plan.length;break}}}catch{this.frozen=!0}}rawSlice(start,end){return this.source.slice(this.normalized.rawOffset(start),this.normalized.rawOffset(end))}get tail(){const tail=this.normalized.text.slice(this.committedEnd);if(!tail||this.eof)return null;const opening=!this.frozen&&fence(tail),closed=this.fenceScan?.start===this.committedEnd?this.fenceScan.closed:hasFenceClose(tail);if(opening&&!closed){let text2=tail.slice(opening.end);return opening.backtick&&opening.indent&&(text2=text2.replace(new RegExp(`^ {0,${opening.indent}}`,"gm"),"")),{kind:"open-fence",text:text2}}const text=this.normalized.text.slice(this.committedEnd,Math.max(this.committedEnd,this.normalized.displayEnd));return text?{kind:"text",text}:null}}export{MarkdownProgressiveSession,markdownHtmlBalanced,markdownProgressiveEligible};
8
+ `,nextStart):-1;closed=!htmlOpen&&nextEnd>=0&&/^[\t ]*$/.test(tail.slice(nextStart,nextEnd))}if(!eof&&tail.length-rawStart<MARKDOWN_PROGRESSIVE_HOLD_MAX&&definitionHeld(tail.slice(rawStart),lexer.options.tokenizer?.def?.bind(lexer.options.tokenizer))){definitionBoundary=rawStart;break}if(!eof&&!followed&&!closed)break;const groupEnd=start+(after>index+1?tokenEnds[after-1]:tokenEnd);plan.push({start:groupStart,end:groupEnd,evidenceEnd:closed?groupEnd:start+(tokenEnds[after]??tail.length),eofOnly:!followed&&!closed}),groupStart=groupEnd}eof&&groupStart<source.length&&plan.push({start:groupStart,end:source.length,evidenceEnd:source.length,eofOnly:!0});const nextLinks={...this.committedDefinitions};let links=tokens.links;if(definitionBoundary!==void 0&&!eof){const prefixLexer=this.lexer();prefixLexer.blockTokens(tail.slice(0,definitionBoundary),prefixLexer.tokens),links=prefixLexer.tokens.links}for(const[label,value]of Object.entries(links))label in nextLinks||(nextLinks[label]=value);JSON.stringify(nextLinks)!==JSON.stringify(this.definitions)&&(this.definitions=nextLinks,this.memo.clear(),this.definitionChanges++,eof||this.definitionChanges<=MARKDOWN_PROGRESSIVE_REF_RECOMPUTE_MAX?this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)}):this.deferredDefinitions=!0),this.plan=plan,this.planIndex=0,this.hintsEnabled=!hint||plan.length>0}step(eof=!1,unlimited=!1,untilEnd=1/0){if(this.restoreSource(),this.frozen)return;this.stats.frames++,eof&&(this.eof=!0,this.normalized.append(this.source,!0),this.plan=[],this.planIndex=0,this.lastCompleteEnd=-1,this.deferredDefinitions&&this.blocks.forEach((block,index)=>{block.source.includes("[")&&this.invalidate(index)}));const limit=eof||unlimited?1/0:MARKDOWN_PROGRESSIVE_GROUP_RENDERS_PER_FRAME;let rendered=0,committed=0;try{if(this.planIndex>=this.plan.length&&this.preparePlan(eof),this.sluggerDirty){this.slugger=new Slugger;const end=this.recomputeFrom??this.blocks.length;for(let index=0;index<end;index++)for(const heading of this.blocks[index].headings)this.slugger.slug(heading.label);this.sluggerDirty=!1}for(;this.recomputeFrom!==void 0&&rendered<limit;){const index=this.recomputeFrom;this.recomputeFrom=index+1<this.blocks.length?index+1:void 0;const old=this.blocks[index];if(!old)continue;const state=this.blocks[index-1]?.state??{inLink:!1,inRawBlock:!1},slugger=this.slugger;let changedSlug=!1;const replay=slugger.clone();for(const heading of old.headings)replay.slug(heading.label)!==heading.id&&(changedSlug=!0);const changedState=old.seedState.inLink!==state.inLink||old.seedState.inRawBlock!==state.inRawBlock;if(!this.invalidated.delete(index)&&!changedSlug&&!changedState){this.slugger=replay;continue}const prefix=this.recordOffset(index),result=this.options.render(old.source,this.rawSlice(old.start,old.end),this.definitions,state,slugger,prefix),{rawHtml:_rawHtml,pendingKeys,...retained}=result;this.blocks[index]={...old,...retained,pendingKeys:pendingKeys.map(({key})=>({key})),seedState:{...state}},this.changed(index),rendered++,this.stats.groupRenders++,this.stats.recomputes++}for(;this.planIndex<this.plan.length&&rendered<limit&&this.committedEnd<untilEnd;){if(this.blocks.length>=MARKDOWN_PROGRESSIVE_BLOCK_MAX){this.frozen=!0;break}const first=this.plan[this.planIndex];let lastIndex=this.planIndex;const replayEnd=this.replayEnds[this.blocks.length];for(;lastIndex+1<this.plan.length;){const next=this.plan[lastIndex+1];if(replayEnd!==void 0?next.end>replayEnd:next.end-first.start>MARKDOWN_PROGRESSIVE_GROUP_TARGET)break;lastIndex++}let finished=!1;for(;lastIndex<this.plan.length&&rendered<limit;){const last=this.plan[lastIndex],source=this.normalized.text.slice(first.start,last.end);if(!eof&&!unlimited&&committed>0&&committed+source.length>MARKDOWN_PROGRESSIVE_COMMIT_MAX)return;const state=this.blocks.at(-1)?.state??{inLink:!1,inRawBlock:!1},sluggerBefore=this.slugger,key=`${first.start}:${last.end}`;let cached=this.memo.get(key);if(!cached){const slugger=sluggerBefore.clone();cached={result:this.options.render(source,this.rawSlice(first.start,last.end),this.definitions,state,slugger,this.records.length),slugger},this.memo.set(key,cached),rendered++,this.stats.groupRenders++}const balanced=markdownHtmlBalanced(cached.result.rawHtml);if(!eof&&!balanced&&source.length<MARKDOWN_PROGRESSIVE_HOLD_MAX){lastIndex++;continue}const{rawHtml:_rawHtml,pendingKeys,...retained}=cached.result,block={...retained,pendingKeys:pendingKeys.map(({key:key2})=>({key:key2})),definitions:Object.create(null),source,start:first.start,end:last.end,evidenceEnd:this.normalized.rawOffset(Math.max(...this.plan.slice(this.planIndex,lastIndex+1).map(candidate=>candidate.evidenceEnd))),eofOnly:this.plan.slice(this.planIndex,lastIndex+1).some(candidate=>candidate.eofOnly),balanced,seedState:{...state}};this.changed(this.blocks.length),this.blocks.push(block),this.slugger=cached.slugger,this.memo.clear();const definitionLexer=this.lexer();definitionLexer.blockTokens(source,definitionLexer.tokens),this.stats.lexedUnits+=source.length,block.definitions={...definitionLexer.tokens.links};for(const[label,value]of Object.entries(definitionLexer.tokens.links))label in this.committedDefinitions||(this.committedDefinitions[label]=value);this.committedEnd=last.end,committed+=source.length,this.stats.committedUnits+=source.length;for(const pending of pendingKeys)pending.code.length<=MARKDOWN_PROGRESSIVE_HIGHLIGHT_MAX&&this.highlightQueue.set(pending.key,pending);this.planIndex=lastIndex+1,this.planIndex===this.plan.length&&(this.lastCompleteEnd=-1),this.waitForInput=!1,finished=!0;break}if(!finished){this.waitForInput=lastIndex>=this.plan.length;break}}}catch{this.frozen=!0}}rawSlice(start,end){return this.source.slice(this.normalized.rawOffset(start),this.normalized.rawOffset(end))}get tail(){const tail=this.normalized.text.slice(this.committedEnd);if(!tail||this.eof)return null;const opening=!this.frozen&&fence(tail),closed=this.fenceScan?.start===this.committedEnd?this.fenceScan.closed:hasFenceClose(tail);if(opening&&!closed){let text2=tail.slice(opening.end);return opening.backtick&&opening.indent&&(text2=text2.replace(new RegExp(`^ {0,${opening.indent}}`,"gm"),"")),{kind:"open-fence",text:text2}}const text=this.normalized.text.slice(this.committedEnd,Math.max(this.committedEnd,this.normalized.displayEnd));return text?{kind:"text",text}:null}}export{MarkdownProgressiveSession,markdownHtmlBalanced,markdownProgressiveEligible};
@@ -43,13 +43,8 @@ export interface PendingHighlight{key:string;lang:string;code:string;}
43
43
  /** One entry of `getHeadingTree()`'s document-ordered outline. `level` already reflects
44
44
  * `heading-offset` -- it always matches the rendered `<h${level}>` tag, not the source `#` count. */
45
45
  export interface MarkdownHeadingItem{id:string;label:string;level:number;}
46
- /** Upper bound on a per-instance highlight cache's entries. Each entry holds a fully-highlighted
47
- * HTML string (potentially large for a long code block), and the cache is content-addressed --
48
- * on a long-lived instance whose `content` keeps changing (a chat transcript, live docs), an
49
- * unbounded map would retain the highlighted HTML of every code block ever rendered. 100 far
50
- * exceeds the fenced-block count of any one document, so eviction only trims blocks that
51
- * scrolled out of the content long ago. */
52
- export declare const HIGHLIGHT_CACHE_MAX=100;export declare const HIGHLIGHT_CACHE_MAX_BYTES:number;export declare const HIGHLIGHT_CACHE_ENTRY_MAX_BYTES:number;export declare const FAILED_HIGHLIGHT_MAX=256;
46
+ /** Page-wide LRU entry bound, also the per-document distinct highlight admission ceiling. */
47
+ export declare const HIGHLIGHT_CACHE_MAX=100;export declare const MARKDOWN_HIGHLIGHT_SOURCE_MAX=8192;export declare const HIGHLIGHT_CACHE_MAX_BYTES:number;export declare const HIGHLIGHT_CACHE_ENTRY_MAX_BYTES:number;export declare const FAILED_HIGHLIGHT_MAX=256;
53
48
  /** Bounded content key: raw source never remains retained merely because it was used as a cache
54
49
  * key. Two 32-bit FNV streams plus source length make accidental collisions vanishingly unlikely. */
55
50
  export declare function markdownHighlightKey(language:string,code:string):string;export declare function addFailedHighlightKey(failed:Set<string>,key:string):void;
@@ -173,7 +168,7 @@ mathFailed:boolean;pendingKeys:PendingHighlight[];};export type MarkdownHtmlMode
173
168
  /** This variant's own tag, for the peer-failure diagnostics below. */
174
169
  tag:'lr-markdown'|'lr-markdown-core';deps:MarkdownDeps;htmlMode:MarkdownHtmlMode;math:boolean;codeBlockHeader?:boolean;
175
170
  /** The instance's own `parseMarkdown()` -- see `ParseMarkdownOptions` for what it resolves. */
176
- parse:(marked:MarkedModule,pendingKeys:PendingHighlight[],headingTreeOut:MarkdownHeadingItem[])=>{html:string;hadMathFallback:boolean;};
171
+ parse:(marked:MarkedModule,pendingKeys:PendingHighlight[],headingTreeOut:MarkdownHeadingItem[])=>{html:string;hadMathFallback:boolean;hasRawHtml?:boolean;};
177
172
  /** Runs immediately after a successful parse, before sanitization -- where each instance kicks
178
173
  * off its variant's katex load. */
179
174
  onParsed:()=>void;isKatexConfirmedMissing:()=>boolean;}
@@ -189,7 +184,7 @@ onParsed:()=>void;isKatexConfirmedMissing:()=>boolean;}
189
184
  export declare function markdownSanitizerPolicy(options:{htmlMode:MarkdownHtmlMode;math:boolean;codeBlockHeader:boolean;}):Record<string,unknown> |null;export declare function renderMarkdownDocument(options:RenderMarkdownOptions):MarkdownRenderOutcome;
190
185
  /** The `lr-render-error` payload for a permanently-missing `katex` peer while `math` is set. */
191
186
  /** Applies the same sanitizer, Shiki palette restoration, and link guard to every render path. */
192
- export declare function finishMarkdownHtml(deps:MarkdownDeps,policy:Record<string,unknown> |null,rawHtml:string):string;export declare function markdownMathPeerError(tag:'lr-markdown'|'lr-markdown-core'):Error;
187
+ export declare function finishMarkdownHtml(deps:MarkdownDeps,policy:Record<string,unknown> |null,rawHtml:string,hasRawHtml?:boolean):string;export declare function markdownMathPeerError(tag:'lr-markdown'|'lr-markdown-core'):Error;
193
188
  /** Mirrors "the document is not final" onto the host as `aria-busy`, so assistive technology knows
194
189
  * the rendered output is still resolving (peers loading, or `streaming` still on). */
195
190
  export declare function applyMarkdownAriaBusy(host:Element,busy:boolean):void;
@@ -255,7 +250,7 @@ sanitized:boolean;
255
250
  * identical on purpose -- a consumer distinguishes them via `lr-render-error`. */
256
251
  renderedHtml:string|null;
257
252
  /** Independently sanitized settled groups and one append-only text tail. */
258
- progressive?:{blocks:readonly{html:string;}[];tail:{kind:'text'|'open-fence';text:string;}|null;}|null;
253
+ progressive?:{blocks:readonly{html:string;}[];revision?:number;changedFrom?:number;tail:{kind:'text'|'open-fence';text:string;}|null;}|null;
259
254
  /** The host's own `aria-label`, forwarded to the element that actually owns `role="document"` --
260
255
  * a host `aria-label` doesn't reach shadow internals on its own. */
261
256
  hostAriaLabel:string|null;