@aceshooting/lyra-ui 7.3.0 → 7.5.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 (377) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/custom-elements.json +1747 -381
  3. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts.map +1 -1
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +1 -0
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.js.map +1 -1
  6. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts.map +1 -1
  7. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -0
  8. package/dist/components/agent-tools/approval-queue/approval-queue.class.js.map +1 -1
  9. package/dist/components/agent-tools/browser-frame/browser-frame.styles.d.ts.map +1 -1
  10. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +3 -0
  11. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js.map +1 -1
  12. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +3 -0
  13. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts.map +1 -1
  14. package/dist/components/agent-tools/commit-card/commit-card.class.js +21 -1
  15. package/dist/components/agent-tools/commit-card/commit-card.class.js.map +1 -1
  16. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts.map +1 -1
  17. package/dist/components/agent-tools/compare-panel/compare-panel.class.js +7 -1
  18. package/dist/components/agent-tools/compare-panel/compare-panel.class.js.map +1 -1
  19. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +4 -0
  20. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts.map +1 -1
  21. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +4 -0
  22. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
  23. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +2 -2
  24. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +2 -0
  25. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts.map +1 -1
  26. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +24 -9
  27. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js.map +1 -1
  28. package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.d.ts.map +1 -1
  29. package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js +23 -2
  30. package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js.map +1 -1
  31. package/dist/components/agent-tools/result-card/result-card.class.d.ts +4 -0
  32. package/dist/components/agent-tools/result-card/result-card.class.d.ts.map +1 -1
  33. package/dist/components/agent-tools/result-card/result-card.class.js +4 -0
  34. package/dist/components/agent-tools/result-card/result-card.class.js.map +1 -1
  35. package/dist/components/agent-tools/result-card/result-card.styles.d.ts.map +1 -1
  36. package/dist/components/agent-tools/result-card/result-card.styles.js +2 -0
  37. package/dist/components/agent-tools/result-card/result-card.styles.js.map +1 -1
  38. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +2 -0
  39. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts.map +1 -1
  40. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +2 -0
  41. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js.map +1 -1
  42. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.d.ts.map +1 -1
  43. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +4 -0
  44. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js.map +1 -1
  45. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts +6 -1
  46. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts.map +1 -1
  47. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +61 -3
  48. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js.map +1 -1
  49. package/dist/components/agent-tools/task-list/task-list.class.d.ts +2 -0
  50. package/dist/components/agent-tools/task-list/task-list.class.d.ts.map +1 -1
  51. package/dist/components/agent-tools/task-list/task-list.class.js +2 -0
  52. package/dist/components/agent-tools/task-list/task-list.class.js.map +1 -1
  53. package/dist/components/agent-tools/task-list/task-list.styles.d.ts.map +1 -1
  54. package/dist/components/agent-tools/task-list/task-list.styles.js +1 -0
  55. package/dist/components/agent-tools/task-list/task-list.styles.js.map +1 -1
  56. package/dist/components/agent-tools/test-results/test-results.class.d.ts.map +1 -1
  57. package/dist/components/agent-tools/test-results/test-results.class.js +15 -10
  58. package/dist/components/agent-tools/test-results/test-results.class.js.map +1 -1
  59. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +3 -0
  60. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts.map +1 -1
  61. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +5 -0
  62. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js.map +1 -1
  63. package/dist/components/charts/chart/box-plot.class.d.ts.map +1 -1
  64. package/dist/components/charts/chart/box-plot.class.js +31 -0
  65. package/dist/components/charts/chart/box-plot.class.js.map +1 -1
  66. package/dist/components/charts/chart/chart-loader.d.ts +2 -2
  67. package/dist/components/charts/chart/chart-loader.d.ts.map +1 -1
  68. package/dist/components/charts/chart/chart-loader.js +7 -1
  69. package/dist/components/charts/chart/chart-loader.js.map +1 -1
  70. package/dist/components/charts/chart/chart.class.d.ts +5 -1
  71. package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
  72. package/dist/components/charts/chart/chart.class.js +17 -2
  73. package/dist/components/charts/chart/chart.class.js.map +1 -1
  74. package/dist/components/charts/chart/chart.styles.d.ts.map +1 -1
  75. package/dist/components/charts/chart/chart.styles.js +5 -1
  76. package/dist/components/charts/chart/chart.styles.js.map +1 -1
  77. package/dist/components/charts/chart/lite-chart.class.d.ts.map +1 -1
  78. package/dist/components/charts/chart/lite-chart.class.js +2 -0
  79. package/dist/components/charts/chart/lite-chart.class.js.map +1 -1
  80. package/dist/components/conversation/code-block/code-block-core.class.d.ts +7 -8
  81. package/dist/components/conversation/code-block/code-block-core.class.d.ts.map +1 -1
  82. package/dist/components/conversation/code-block/code-block-core.class.js +75 -227
  83. package/dist/components/conversation/code-block/code-block-core.class.js.map +1 -1
  84. package/dist/components/conversation/code-block/code-block-shared.d.ts +173 -7
  85. package/dist/components/conversation/code-block/code-block-shared.d.ts.map +1 -1
  86. package/dist/components/conversation/code-block/code-block-shared.js +312 -6
  87. package/dist/components/conversation/code-block/code-block-shared.js.map +1 -1
  88. package/dist/components/conversation/code-block/code-block.class.d.ts +6 -7
  89. package/dist/components/conversation/code-block/code-block.class.d.ts.map +1 -1
  90. package/dist/components/conversation/code-block/code-block.class.js +70 -231
  91. package/dist/components/conversation/code-block/code-block.class.js.map +1 -1
  92. package/dist/components/conversation/markdown/markdown-core.class.d.ts +9 -22
  93. package/dist/components/conversation/markdown/markdown-core.class.d.ts.map +1 -1
  94. package/dist/components/conversation/markdown/markdown-core.class.js +87 -314
  95. package/dist/components/conversation/markdown/markdown-core.class.js.map +1 -1
  96. package/dist/components/conversation/markdown/markdown-shared.d.ts +213 -9
  97. package/dist/components/conversation/markdown/markdown-shared.d.ts.map +1 -1
  98. package/dist/components/conversation/markdown/markdown-shared.js +362 -8
  99. package/dist/components/conversation/markdown/markdown-shared.js.map +1 -1
  100. package/dist/components/conversation/markdown/markdown.class.d.ts +9 -22
  101. package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
  102. package/dist/components/conversation/markdown/markdown.class.js +81 -311
  103. package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
  104. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts.map +1 -1
  105. package/dist/components/conversation/message-feedback/message-feedback.class.js +4 -1
  106. package/dist/components/conversation/message-feedback/message-feedback.class.js.map +1 -1
  107. package/dist/components/conversation/prompt-input/prompt-input.styles.d.ts.map +1 -1
  108. package/dist/components/conversation/prompt-input/prompt-input.styles.js +9 -2
  109. package/dist/components/conversation/prompt-input/prompt-input.styles.js.map +1 -1
  110. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts.map +1 -1
  111. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +8 -1
  112. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js.map +1 -1
  113. package/dist/components/conversation/thread-list/thread-list.class.d.ts +11 -2
  114. package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
  115. package/dist/components/conversation/thread-list/thread-list.class.js +43 -25
  116. package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
  117. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts.map +1 -1
  118. package/dist/components/conversation/voice-picker/voice-picker.class.js +5 -1
  119. package/dist/components/conversation/voice-picker/voice-picker.class.js.map +1 -1
  120. package/dist/components/data/document-library/document-library.class.d.ts.map +1 -1
  121. package/dist/components/data/document-library/document-library.class.js +4 -1
  122. package/dist/components/data/document-library/document-library.class.js.map +1 -1
  123. package/dist/components/data/env-list/env-list.styles.d.ts.map +1 -1
  124. package/dist/components/data/env-list/env-list.styles.js +5 -0
  125. package/dist/components/data/env-list/env-list.styles.js.map +1 -1
  126. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  127. package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
  128. package/dist/components/data/flow-minimap/flow-minimap.styles.d.ts.map +1 -1
  129. package/dist/components/data/flow-minimap/flow-minimap.styles.js +6 -0
  130. package/dist/components/data/flow-minimap/flow-minimap.styles.js.map +1 -1
  131. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts.map +1 -1
  132. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +10 -1
  133. package/dist/components/data/graph-query-builder/graph-query-builder.class.js.map +1 -1
  134. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  135. package/dist/components/data/heatmap/heatmap.class.js +17 -2
  136. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  137. package/dist/components/data/pagination/pagination.class.d.ts +2 -0
  138. package/dist/components/data/pagination/pagination.class.d.ts.map +1 -1
  139. package/dist/components/data/pagination/pagination.class.js +2 -0
  140. package/dist/components/data/pagination/pagination.class.js.map +1 -1
  141. package/dist/components/data/pagination/pagination.styles.d.ts.map +1 -1
  142. package/dist/components/data/pagination/pagination.styles.js +7 -2
  143. package/dist/components/data/pagination/pagination.styles.js.map +1 -1
  144. package/dist/components/data/table/table.class.d.ts +7 -2
  145. package/dist/components/data/table/table.class.d.ts.map +1 -1
  146. package/dist/components/data/table/table.class.js +40 -6
  147. package/dist/components/data/table/table.class.js.map +1 -1
  148. package/dist/components/data/tree/tree-node.class.d.ts +2 -0
  149. package/dist/components/data/tree/tree-node.class.d.ts.map +1 -1
  150. package/dist/components/data/tree/tree-node.class.js +2 -0
  151. package/dist/components/data/tree/tree-node.class.js.map +1 -1
  152. package/dist/components/forms/color-picker/color-picker.class.d.ts.map +1 -1
  153. package/dist/components/forms/color-picker/color-picker.class.js +9 -0
  154. package/dist/components/forms/color-picker/color-picker.class.js.map +1 -1
  155. package/dist/components/forms/date-picker/date-picker.class.d.ts +2 -0
  156. package/dist/components/forms/date-picker/date-picker.class.d.ts.map +1 -1
  157. package/dist/components/forms/date-picker/date-picker.class.js +2 -0
  158. package/dist/components/forms/date-picker/date-picker.class.js.map +1 -1
  159. package/dist/components/forms/date-picker/date-picker.styles.d.ts.map +1 -1
  160. package/dist/components/forms/date-picker/date-picker.styles.js +8 -3
  161. package/dist/components/forms/date-picker/date-picker.styles.js.map +1 -1
  162. package/dist/components/forms/emoji-picker/emoji-data-loader.js +28 -2
  163. package/dist/components/forms/emoji-picker/emoji-data-loader.js.map +1 -1
  164. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +4 -0
  165. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
  166. package/dist/components/forms/emoji-picker/emoji-picker.class.js +8 -2
  167. package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
  168. package/dist/components/forms/emoji-picker/emoji-types.d.ts +9 -0
  169. package/dist/components/forms/emoji-picker/emoji-types.d.ts.map +1 -1
  170. package/dist/components/forms/input/input.styles.d.ts.map +1 -1
  171. package/dist/components/forms/input/input.styles.js +17 -4
  172. package/dist/components/forms/input/input.styles.js.map +1 -1
  173. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +1 -1
  174. package/dist/components/forms/locale-picker/locale-picker.class.d.ts.map +1 -1
  175. package/dist/components/forms/locale-picker/locale-picker.class.js +3 -1
  176. package/dist/components/forms/locale-picker/locale-picker.class.js.map +1 -1
  177. package/dist/components/forms/radio/radio.class.d.ts +5 -0
  178. package/dist/components/forms/radio/radio.class.d.ts.map +1 -1
  179. package/dist/components/forms/radio/radio.class.js +5 -0
  180. package/dist/components/forms/radio/radio.class.js.map +1 -1
  181. package/dist/components/forms/radio/radio.styles.d.ts.map +1 -1
  182. package/dist/components/forms/radio/radio.styles.js +5 -2
  183. package/dist/components/forms/radio/radio.styles.js.map +1 -1
  184. package/dist/components/forms/select/select.class.d.ts +9 -1
  185. package/dist/components/forms/select/select.class.d.ts.map +1 -1
  186. package/dist/components/forms/select/select.class.js +9 -1
  187. package/dist/components/forms/select/select.class.js.map +1 -1
  188. package/dist/components/forms/slider/slider.class.d.ts +8 -0
  189. package/dist/components/forms/slider/slider.class.d.ts.map +1 -1
  190. package/dist/components/forms/slider/slider.class.js +14 -0
  191. package/dist/components/forms/slider/slider.class.js.map +1 -1
  192. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +12 -0
  193. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts.map +1 -1
  194. package/dist/components/forms/swatch-picker/swatch-picker.class.js +22 -0
  195. package/dist/components/forms/swatch-picker/swatch-picker.class.js.map +1 -1
  196. package/dist/components/forms/textarea/textarea.class.d.ts +6 -0
  197. package/dist/components/forms/textarea/textarea.class.d.ts.map +1 -1
  198. package/dist/components/forms/textarea/textarea.class.js +16 -1
  199. package/dist/components/forms/textarea/textarea.class.js.map +1 -1
  200. package/dist/components/forms/time-range/time-range.class.d.ts +9 -0
  201. package/dist/components/forms/time-range/time-range.class.d.ts.map +1 -1
  202. package/dist/components/forms/time-range/time-range.class.js +15 -0
  203. package/dist/components/forms/time-range/time-range.class.js.map +1 -1
  204. package/dist/components/layout/button-group/button-group.styles.d.ts.map +1 -1
  205. package/dist/components/layout/button-group/button-group.styles.js +10 -1
  206. package/dist/components/layout/button-group/button-group.styles.js.map +1 -1
  207. package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts.map +1 -1
  208. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +5 -1
  209. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js.map +1 -1
  210. package/dist/components/layout/filter-bar/filter-bar.class.d.ts.map +1 -1
  211. package/dist/components/layout/filter-bar/filter-bar.class.js +4 -1
  212. package/dist/components/layout/filter-bar/filter-bar.class.js.map +1 -1
  213. package/dist/components/layout/split/split.class.d.ts +8 -0
  214. package/dist/components/layout/split/split.class.d.ts.map +1 -1
  215. package/dist/components/layout/split/split.class.js +8 -0
  216. package/dist/components/layout/split/split.class.js.map +1 -1
  217. package/dist/components/layout/split/split.styles.d.ts.map +1 -1
  218. package/dist/components/layout/split/split.styles.js +26 -10
  219. package/dist/components/layout/split/split.styles.js.map +1 -1
  220. package/dist/components/layout/virtual-list/virtual-list.styles.d.ts.map +1 -1
  221. package/dist/components/layout/virtual-list/virtual-list.styles.js +27 -7
  222. package/dist/components/layout/virtual-list/virtual-list.styles.js.map +1 -1
  223. package/dist/components/layout/widget/widget.class.d.ts +4 -0
  224. package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
  225. package/dist/components/layout/widget/widget.class.js +4 -0
  226. package/dist/components/layout/widget/widget.class.js.map +1 -1
  227. package/dist/components/layout/widget/widget.styles.d.ts.map +1 -1
  228. package/dist/components/layout/widget/widget.styles.js +9 -3
  229. package/dist/components/layout/widget/widget.styles.js.map +1 -1
  230. package/dist/components/media/flag/flag.class.d.ts +1 -1
  231. package/dist/components/media/flag/flag.class.d.ts.map +1 -1
  232. package/dist/components/media/flag/flag.class.js +2 -1
  233. package/dist/components/media/flag/flag.class.js.map +1 -1
  234. package/dist/components/media/image-viewer/image-viewer.styles.d.ts.map +1 -1
  235. package/dist/components/media/image-viewer/image-viewer.styles.js +1 -0
  236. package/dist/components/media/image-viewer/image-viewer.styles.js.map +1 -1
  237. package/dist/components/overlays/chip/chip-group.class.d.ts +4 -0
  238. package/dist/components/overlays/chip/chip-group.class.d.ts.map +1 -1
  239. package/dist/components/overlays/chip/chip-group.class.js +4 -0
  240. package/dist/components/overlays/chip/chip-group.class.js.map +1 -1
  241. package/dist/components/overlays/chip/chip-group.styles.d.ts.map +1 -1
  242. package/dist/components/overlays/chip/chip-group.styles.js +7 -2
  243. package/dist/components/overlays/chip/chip-group.styles.js.map +1 -1
  244. package/dist/components/overlays/rating/rating.styles.d.ts.map +1 -1
  245. package/dist/components/overlays/rating/rating.styles.js +11 -4
  246. package/dist/components/overlays/rating/rating.styles.js.map +1 -1
  247. package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts.map +1 -1
  248. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +4 -1
  249. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js.map +1 -1
  250. package/dist/components/retrieval/graph/graph-canvas.d.ts +25 -0
  251. package/dist/components/retrieval/graph/graph-canvas.d.ts.map +1 -1
  252. package/dist/components/retrieval/graph/graph-canvas.js +30 -1
  253. package/dist/components/retrieval/graph/graph-canvas.js.map +1 -1
  254. package/dist/components/retrieval/graph/graph.class.d.ts +2 -1
  255. package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
  256. package/dist/components/retrieval/graph/graph.class.js +12 -1
  257. package/dist/components/retrieval/graph/graph.class.js.map +1 -1
  258. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +5 -0
  259. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts.map +1 -1
  260. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +5 -0
  261. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js.map +1 -1
  262. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.d.ts.map +1 -1
  263. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +7 -3
  264. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js.map +1 -1
  265. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
  266. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +10 -1
  267. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
  268. package/dist/components/utility/diff-view/diff-view.styles.d.ts.map +1 -1
  269. package/dist/components/utility/diff-view/diff-view.styles.js +11 -0
  270. package/dist/components/utility/diff-view/diff-view.styles.js.map +1 -1
  271. package/dist/components/viewers/archive-viewer/archive-viewer-register.js +16 -3
  272. package/dist/components/viewers/archive-viewer/archive-viewer-register.js.map +1 -1
  273. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts.map +1 -1
  274. package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -0
  275. package/dist/components/viewers/document-viewer/document-viewer.class.js.map +1 -1
  276. package/dist/components/viewers/docx-viewer/docx-viewer.js +6 -1
  277. package/dist/components/viewers/docx-viewer/docx-viewer.js.map +1 -1
  278. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +10 -4
  279. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts.map +1 -1
  280. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +31 -6
  281. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js.map +1 -1
  282. package/dist/components/viewers/html-viewer/html-viewer.js +7 -0
  283. package/dist/components/viewers/html-viewer/html-viewer.js.map +1 -1
  284. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +3 -0
  285. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  286. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +7 -1
  287. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
  288. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +4 -0
  289. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
  290. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +8 -4
  291. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
  292. package/dist/components/viewers/pptx-viewer/pptx-viewer.js +11 -1
  293. package/dist/components/viewers/pptx-viewer/pptx-viewer.js.map +1 -1
  294. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +29 -17
  295. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts.map +1 -1
  296. package/dist/components/viewers/svg-viewer/svg-viewer.class.js +27 -22
  297. package/dist/components/viewers/svg-viewer/svg-viewer.class.js.map +1 -1
  298. package/dist/components/viewers/svg-viewer/svg-viewer.d.ts.map +1 -1
  299. package/dist/components/viewers/svg-viewer/svg-viewer.js +7 -6
  300. package/dist/components/viewers/svg-viewer/svg-viewer.js.map +1 -1
  301. package/dist/internal/form-associated.d.ts +21 -0
  302. package/dist/internal/form-associated.d.ts.map +1 -1
  303. package/dist/internal/form-associated.js +25 -8
  304. package/dist/internal/form-associated.js.map +1 -1
  305. package/dist/internal/localization.d.ts +1 -1
  306. package/dist/internal/localization.d.ts.map +1 -1
  307. package/dist/internal/localization.js +17 -0
  308. package/dist/internal/localization.js.map +1 -1
  309. package/llms/components/lr-agent-run.md +3 -2
  310. package/llms/components/lr-approval-queue.md +6 -1
  311. package/llms/components/lr-archive-viewer.md +6 -2
  312. package/llms/components/lr-artifact-panel.md +7 -3
  313. package/llms/components/lr-attachment-chip.md +8 -6
  314. package/llms/components/lr-avatar.md +6 -4
  315. package/llms/components/lr-bar-chart.md +4 -2
  316. package/llms/components/lr-bubble-chart.md +4 -2
  317. package/llms/components/lr-button-group.md +10 -0
  318. package/llms/components/lr-button.md +11 -6
  319. package/llms/components/lr-chart.md +8 -2
  320. package/llms/components/lr-chip-group.md +9 -2
  321. package/llms/components/lr-chip.md +8 -1
  322. package/llms/components/lr-commit-card.md +11 -3
  323. package/llms/components/lr-confirm-bar.md +9 -1
  324. package/llms/components/lr-date-input.md +4 -0
  325. package/llms/components/lr-date-picker.md +5 -1
  326. package/llms/components/lr-document-viewer.md +1 -1
  327. package/llms/components/lr-doughnut-chart.md +4 -2
  328. package/llms/components/lr-emoji-picker.md +16 -4
  329. package/llms/components/lr-export-button.md +2 -1
  330. package/llms/components/lr-flag.md +9 -5
  331. package/llms/components/lr-graph-query-builder.md +6 -5
  332. package/llms/components/lr-heatmap.md +12 -7
  333. package/llms/components/lr-histogram.md +3 -2
  334. package/llms/components/lr-html-viewer.md +4 -1
  335. package/llms/components/lr-json-viewer.md +2 -1
  336. package/llms/components/lr-knowledge-base-admin.md +10 -1
  337. package/llms/components/lr-known-date.md +8 -4
  338. package/llms/components/lr-line-chart.md +4 -2
  339. package/llms/components/lr-locale-picker.md +1 -1
  340. package/llms/components/lr-model-select.md +3 -0
  341. package/llms/components/lr-notebook-viewer.md +4 -2
  342. package/llms/components/lr-pagination.md +6 -3
  343. package/llms/components/lr-pdf-viewer.md +5 -2
  344. package/llms/components/lr-pie-chart.md +4 -2
  345. package/llms/components/lr-polar-area-chart.md +4 -2
  346. package/llms/components/lr-pptx-viewer.md +3 -1
  347. package/llms/components/lr-push-to-talk.md +4 -0
  348. package/llms/components/lr-radar-chart.md +4 -2
  349. package/llms/components/lr-radio.md +7 -1
  350. package/llms/components/lr-result-card.md +9 -3
  351. package/llms/components/lr-result-field.md +8 -2
  352. package/llms/components/lr-retrieval-results.md +12 -7
  353. package/llms/components/lr-scatter-chart.md +4 -2
  354. package/llms/components/lr-schema-viewer.md +13 -1
  355. package/llms/components/lr-sequence-strip.md +21 -16
  356. package/llms/components/lr-slider.md +4 -0
  357. package/llms/components/lr-split.md +9 -1
  358. package/llms/components/lr-stepper.md +5 -3
  359. package/llms/components/lr-svg-viewer.md +24 -8
  360. package/llms/components/lr-table.md +21 -3
  361. package/llms/components/lr-task-list.md +7 -3
  362. package/llms/components/lr-terminal.md +10 -4
  363. package/llms/components/lr-textarea.md +5 -0
  364. package/llms/components/lr-thread-list.md +16 -4
  365. package/llms/components/lr-time-range.md +6 -0
  366. package/llms/components/lr-tool-call-chip.md +4 -3
  367. package/llms/components/lr-tool-param-form.md +7 -2
  368. package/llms/components/lr-tool-result-dialog.md +2 -1
  369. package/llms/components/lr-tree-node.md +1 -1
  370. package/llms/components/lr-virtual-list.md +8 -7
  371. package/llms/components/lr-widget.md +6 -1
  372. package/llms/shared.md +1 -1
  373. package/llms-full.txt +381 -127
  374. package/package.json +7 -4
  375. package/vscode-css-data.json +169 -1
  376. package/vscode-html-data.json +38 -38
  377. package/web-types.json +138 -37
@@ -1,15 +1,28 @@
1
1
  /**
2
- * Shared parsing/cache logic for `<lr-markdown>` and `<lr-markdown-core>`. Both components render
3
- * an otherwise-identical document (GFM tables, fenced code blocks, links, blockquotes, headings,
4
- * math) and previously duplicated their entire `parseMarkdown()` implementation (and the small
5
- * `highlightCache` LRU helpers around it) verbatim across both class files -- mirroring the same
6
- * drift risk `code-block-shared.ts` was created to end for the `<lr-code-block>` /
7
- * `<lr-code-block-core>` pair. A fix or behavior change to Markdown parsing now has exactly one
8
- * place to land. `highlightPending()` (the shiki-loading strategy) is deliberately *not* here --
9
- * it's the one piece that genuinely differs between the full and lean-bundle variants.
2
+ * Everything `<lr-markdown>` and `<lr-markdown-core>` parse, render and compute identically: the
3
+ * whole `marked` renderer contract (`parseMarkdownDocument()`), the `highlightCache` LRU helpers
4
+ * around it, the optional-peer load/sanitize/fallback pipeline (`renderMarkdownDocument()`), the
5
+ * `katex` resolution state, `fragment`/`text-quote` anchor application, highlight painting and
6
+ * hit-testing, the internal-link contract, and the rendered `[part="content"]` template itself.
7
+ *
8
+ * The two components differ in exactly one axis -- *which* shiki loader highlights a fenced block
9
+ * (the full ~200-language dynamic-import table plus a per-language `loadLanguage()`, vs.
10
+ * `shiki/core` seeded from a pre-supplied `languages` map), which is why `highlightPending()` stays
11
+ * on each class. Everything else was previously duplicated verbatim across both ~890-line class
12
+ * files, mirroring the same drift risk `code-block-shared.ts` was created to end for the
13
+ * `<lr-code-block>` / `<lr-code-block-core>` pair. A fix or behavior change now has exactly one
14
+ * place to land.
15
+ *
16
+ * Nothing here may `import` a *value* from `code-loader.js`'s full-table half
17
+ * (`loadShikiHighlighter`/`loadShikiLanguage`): `<lr-markdown-core>`'s build-leanness claim rests on
18
+ * its own module graph never reaching that call, and this module is in that graph.
10
19
  */
20
+ import { type TemplateResult } from 'lit';
11
21
  import type { OptionalPeerApi } from '../../../internal/optional-peer-types.js';
12
- import type { KatexApi } from './katex-loader.js';
22
+ import { type HighlightHandle } from '../../../internal/text-highlights.js';
23
+ import type { LyraAnchor, LyraHighlight } from '../../viewers/document-viewer/anchors.js';
24
+ import { type MarkdownDeps } from './markdown-loader.js';
25
+ import { type KatexApi } from './katex-loader.js';
13
26
  export declare function escapeHtml(text: string): string;
14
27
  /**
15
28
  * Mirrors marked's own default `link()` renderer's `cleanUrl()`: a malformed
@@ -90,4 +103,195 @@ export declare function parseMarkdownDocument(options: ParseMarkdownOptions): {
90
103
  html: string;
91
104
  hadMathFallback: boolean;
92
105
  };
106
+ /**
107
+ * One variant's `katex` bookkeeping. Deliberately *per-variant* rather than one process-wide
108
+ * singleton: each of `<lr-markdown>`/`<lr-markdown-core>` creates exactly one of these at its own
109
+ * module scope, reproducing the four module-level bindings each class file used to declare for
110
+ * itself. Sharing a single instance across both would also share `loadStarted`, so a
111
+ * `<lr-markdown>` that started the load would suppress a `<lr-markdown-core>`'s own
112
+ * re-render-on-resolve on the same page (and vice versa) -- a behavior change this extraction has
113
+ * no reason to make. The underlying `getKatex()` promise is page-cached anyway, so two states cost
114
+ * one load.
115
+ */
116
+ export interface MarkdownKatexState {
117
+ /** Test-only override bypassing the real dynamic `import('katex')` and the module cache
118
+ * entirely -- `undefined` (the default) defers to the resolved module. */
119
+ setForTesting(katex: KatexApi | null | undefined): void;
120
+ /** The katex module to render this pass's math with, or `null` for the literal-TeX fallback
121
+ * (peer missing *or* still loading -- the fallback is the same either way). */
122
+ getIfLoaded(): KatexApi | null;
123
+ /** Whether the load has definitively finished with no peer available -- distinct from
124
+ * `getIfLoaded()` returning falsy, which also covers a load that's merely still in flight. Used
125
+ * only to decide whether a literal fallback should also report `lr-render-error`. */
126
+ isConfirmedMissing(): boolean;
127
+ /** Kicks off the shared page-wide `getKatex()` load the first time math needs it, at most once.
128
+ * Skipped entirely while `setForTesting()` is active -- that seam controls math-rendering
129
+ * behavior directly and must never race a real, unmocked `import('katex')` settling underneath
130
+ * it. `onResolved` runs after the module lands; the caller still guards its own liveness. */
131
+ startLoad(onResolved: () => void): void;
132
+ }
133
+ export declare function createMarkdownKatexState(): MarkdownKatexState;
134
+ /**
135
+ * Rewrites shiki's generated `<pre>`/`<code>` hast nodes so the highlighted output keeps the
136
+ * markdown viewers' own `part="code-block"` hook and a `language-${lang}` class on `<code>` --
137
+ * matching the plain-render output shape exactly, so existing consumer CSS targeting either keeps
138
+ * working whether or not a given block ended up highlighted. A separate, purpose-built function
139
+ * from `code-block-shared.ts`'s own `codeBlockLineTransformer` -- that one targets
140
+ * `<lr-code-block>`'s `part="pre"`/`part="code"`/line-numbers contract, which doesn't apply here.
141
+ */
142
+ export declare function markdownCodeTransformer(lang: string): {
143
+ name: string;
144
+ pre(node: OptionalPeerApi): void;
145
+ code(node: OptionalPeerApi): void;
146
+ };
147
+ /**
148
+ * Tokenizes one pending fenced block with an already-resolved highlighter and returns the exact
149
+ * string to cache (trailing newline included, matching the plain `code()` renderer's own output).
150
+ * `null` means "leave this key uncached" -- the caller records it in `failedHighlightKeys` so the
151
+ * block keeps its plain fallback permanently rather than being rediscovered as pending forever.
152
+ * Shared by both variants' `highlightPending()`; only the *loading* half above it differs.
153
+ */
154
+ export declare function tokenizeMarkdownHighlight(hl: OptionalPeerApi, pending: PendingHighlight): string | null;
155
+ /**
156
+ * `connectedCallback()`'s optional-peer load for both variants. `eagerLoad` only takes the
157
+ * synchronous path when the shared `marked`/`dompurify` module cache has *already* settled (see
158
+ * `getMarkdownDepsIfLoaded()`'s doc) -- otherwise it falls through to the same async path as the
159
+ * default, since a dynamic `import()` can't be made synchronous from scratch.
160
+ *
161
+ * The (module-cached, page-lifetime) `loadMarkdownDeps()` promise can resolve after the instance
162
+ * was removed from the DOM -- e.g. a markdown viewer inside a conditionally-rendered chat message
163
+ * or a virtualized list. Without the `isConnected` guard, a detached instance would still have its
164
+ * deps applied and a render scheduled that no one will ever see. Mirrors `chart.ts`'s own
165
+ * `connectedCallback()` guard for the identical race.
166
+ */
167
+ export declare function beginMarkdownDepsLoad(host: {
168
+ readonly eagerLoad: boolean;
169
+ readonly isConnected: boolean;
170
+ }, apply: (deps: MarkdownDeps) => void): void;
171
+ /** Every property whose change means the document has to be reparsed. `languagesOnly` is listed
172
+ * for `<lr-markdown>`; `<lr-markdown-core>` has no such property, so it simply never appears in
173
+ * that component's changed map. */
174
+ export declare function markdownNeedsReparse(changed: Map<PropertyKey, unknown>): boolean;
175
+ /** Whether the *highlighting* configuration changed, invalidating in-flight work and the
176
+ * permanently-failed key set. */
177
+ export declare function markdownHighlightConfigChanged(changed: Map<PropertyKey, unknown>): boolean;
178
+ /** Whether the *grammar set* changed, additionally invalidating already-highlighted output. */
179
+ export declare function markdownLanguageSetChanged(changed: Map<PropertyKey, unknown>): boolean;
180
+ /** The rendered outcome of one `renderMarkdownDocument()` pass. `headingTree` is non-`null`
181
+ * whenever the parse itself succeeded -- including the `fallback` produced by a missing
182
+ * `dompurify`, which still computed a real outline before refusing to render. */
183
+ export type MarkdownRenderOutcome = {
184
+ status: 'fallback';
185
+ error: unknown;
186
+ headingTree: MarkdownHeadingItem[] | null;
187
+ } | {
188
+ status: 'rendered';
189
+ html: string;
190
+ headingTree: MarkdownHeadingItem[];
191
+ /** A math token rendered its literal TeX fallback *and* the peer is confirmed missing --
192
+ * worth one `lr-render-error`. A fallback while the load is merely still in flight is the
193
+ * same one-microtask transient window every other optional peer here has, and reporting it
194
+ * would be a false positive. */
195
+ mathFailed: boolean;
196
+ pendingKeys: PendingHighlight[];
197
+ };
198
+ export interface RenderMarkdownOptions {
199
+ /** This variant's own tag, for the peer-failure diagnostics below. */
200
+ tag: 'lr-markdown' | 'lr-markdown-core';
201
+ deps: MarkdownDeps;
202
+ sanitize: boolean;
203
+ math: boolean;
204
+ /** The instance's own `parseMarkdown()` -- see `ParseMarkdownOptions` for what it resolves. */
205
+ parse: (marked: OptionalPeerApi, pendingKeys: PendingHighlight[], headingTreeOut: MarkdownHeadingItem[]) => {
206
+ html: string;
207
+ hadMathFallback: boolean;
208
+ };
209
+ /** Runs immediately after a successful parse, before sanitization -- where each instance kicks
210
+ * off its variant's katex load. */
211
+ onParsed: () => void;
212
+ isKatexConfirmedMissing: () => boolean;
213
+ }
214
+ /**
215
+ * The optional-peer load / parse / sanitize / fallback pipeline both variants run, returning what
216
+ * changed rather than mutating the instance -- the caller owns every `@state` assignment and every
217
+ * event, so this stays a pure function of its inputs.
218
+ *
219
+ * Rendering never ships unsanitized or broken markup silently: a missing/throwing `marked`, or a
220
+ * missing `dompurify` while `sanitize` is on, both fall back to plain text plus `lr-render-error`;
221
+ * an explicit `sanitize="false"` renders marked's raw output regardless of whether `dompurify` is
222
+ * installed, because the consumer opted out.
223
+ */
224
+ export declare function renderMarkdownDocument(options: RenderMarkdownOptions): MarkdownRenderOutcome;
225
+ /** The `lr-render-error` payload for a permanently-missing `katex` peer while `math` is set. */
226
+ export declare function markdownMathPeerError(tag: 'lr-markdown' | 'lr-markdown-core'): Error;
227
+ /** Mirrors "the document is not final" onto the host as `aria-busy`, so assistive technology knows
228
+ * the rendered output is still resolving (peers loading, or `streaming` still on). */
229
+ export declare function applyMarkdownAriaBusy(host: Element, busy: boolean): void;
230
+ /**
231
+ * Scrolls a `fragment` anchor's heading into view. `headingAnchors` may be off, so the target
232
+ * heading might carry no `id` attribute in the DOM at all -- and even with it on, DOMPurify's
233
+ * DOM-clobbering protection strips a slug colliding with a real `document` property name. Both
234
+ * cases fall back to re-deriving the same slug order `getHeadingTree()` was built in and matching
235
+ * by position instead of by attribute.
236
+ */
237
+ export declare function applyMarkdownFragmentAnchor(root: Element, anchor: Extract<LyraAnchor, {
238
+ kind: 'fragment';
239
+ }>, headingTree: readonly MarkdownHeadingItem[]): boolean;
240
+ /** Scrolls a `text-quote` anchor's resolved range into view, centered. */
241
+ export declare function applyMarkdownTextQuoteAnchor(root: Element, anchor: Extract<LyraAnchor, {
242
+ kind: 'text-quote';
243
+ }>): boolean;
244
+ /** One `text-quote` highlight resolved against the currently rendered content. */
245
+ export interface ResolvedHighlightRange {
246
+ id: string;
247
+ range: Range;
248
+ }
249
+ /**
250
+ * Re-resolves every `text-quote` highlight against the current rendered content and repaints via
251
+ * the caller's `acquireHighlightHandle()` handle -- resolution is always by quote text, never by
252
+ * node identity, so a highlight set before its quote exists in `content` yet (e.g. mid-`streaming`)
253
+ * simply paints nothing until a later render's text actually contains it. `fragment` highlights
254
+ * aren't painted (there is no literal span of text to wrap/underline for a whole section).
255
+ * Returns the resolved ranges for `hitTestHighlightRanges()` to activate against.
256
+ */
257
+ export declare function repaintMarkdownHighlights(options: {
258
+ root: Element;
259
+ handle: HighlightHandle;
260
+ highlights: readonly LyraHighlight[];
261
+ activeHighlightId: string | null;
262
+ }): ResolvedHighlightRange[];
263
+ /**
264
+ * Hit-tests a click point against every currently-resolved highlight's `getClientRects()`, topmost
265
+ * (last-resolved) first. The CSS Custom Highlight API paints ranges without creating any DOM element
266
+ * to attach a click listener to, so this is the only activation path that works identically on both
267
+ * paint paths -- mirrors `<lr-pdf-viewer>`'s own coordinate-based `onPageClick()` hit-test for the
268
+ * same reason (its own painted highlights sit under a text layer that intercepts most pointer
269
+ * events).
270
+ */
271
+ export declare function hitTestHighlightRanges(ranges: readonly ResolvedHighlightRange[], x: number, y: number): string | null;
272
+ /** The `href` of the rendered link a click landed on, when `internal-link-prefix` claims it --
273
+ * `null` for every other click, including one on an ordinary external link.
274
+ *
275
+ * Compared against the raw `href` *attribute*, not the `.href` IDL property: the property is
276
+ * always browser-resolved to an absolute URL (e.g. "https://example.com/docs") even for a
277
+ * relative/prefixed path, which would never match a relative `internal-link-prefix`. */
278
+ export declare function internalLinkHrefFrom(e: MouseEvent, prefix: string): string | null;
279
+ export interface MarkdownContentOptions {
280
+ /** The Markdown source -- also the plain-text fallback rendering when `renderedHtml` is `null`. */
281
+ content: string;
282
+ /** Sanitized (or deliberately unsanitized) HTML, or `null` for the plain-text fallback: peers
283
+ * still loading, or a render attempt just fell back after a failure. The two states look
284
+ * identical on purpose -- a consumer distinguishes them via `lr-render-error`. */
285
+ renderedHtml: string | null;
286
+ /** The host's own `aria-label`, forwarded to the element that actually owns `role="document"` --
287
+ * a host `aria-label` doesn't reach shadow internals on its own. */
288
+ hostAriaLabel: string | null;
289
+ onClick: (e: MouseEvent) => void;
290
+ /** `DocumentAnchorTarget`'s `renderAnchorLiveRegion()` output. */
291
+ liveRegion: unknown;
292
+ }
293
+ /** The rendered tree both variants produce: one `[part="content"]` wrapper plus the anchor-target
294
+ * live region. Only non-empty content is focusable -- an empty document is not a scrollable region
295
+ * worth a tab stop. */
296
+ export declare function renderMarkdownContent(options: MarkdownContentOptions): TemplateResult;
93
297
  //# sourceMappingURL=markdown-shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-shared.d.ts","sourceRoot":"","sources":["../../../../src/components/conversation/markdown/markdown-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAGhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAUlD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrD;AAED;;;gGAGgG;AAChG,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;sGACsG;AACtG,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;4CAK4C;AAC5C,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;wFACwF;AACxF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO9F;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAA4B,GAChC,IAAI,CAQN;AA4CD;;;YAGY;AACZ,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;iDAC6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B;2EACuE;IACvE,mBAAmB,EAAE,OAAO,CAAC;IAC7B;iDAC6C;IAC7C,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxD,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB;;6EAEyE;IACzE,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,cAAc,EAAE,mBAAmB,EAAE,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAoJ/G"}
1
+ {"version":3,"file":"markdown-shared.d.ts","sourceRoot":"","sources":["../../../../src/components/conversation/markdown/markdown-shared.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,32 @@
1
1
  /**
2
- * Shared parsing/cache logic for `<lr-markdown>` and `<lr-markdown-core>`. Both components render
3
- * an otherwise-identical document (GFM tables, fenced code blocks, links, blockquotes, headings,
4
- * math) and previously duplicated their entire `parseMarkdown()` implementation (and the small
5
- * `highlightCache` LRU helpers around it) verbatim across both class files -- mirroring the same
6
- * drift risk `code-block-shared.ts` was created to end for the `<lr-code-block>` /
7
- * `<lr-code-block-core>` pair. A fix or behavior change to Markdown parsing now has exactly one
8
- * place to land. `highlightPending()` (the shiki-loading strategy) is deliberately *not* here --
9
- * it's the one piece that genuinely differs between the full and lean-bundle variants.
2
+ * Everything `<lr-markdown>` and `<lr-markdown-core>` parse, render and compute identically: the
3
+ * whole `marked` renderer contract (`parseMarkdownDocument()`), the `highlightCache` LRU helpers
4
+ * around it, the optional-peer load/sanitize/fallback pipeline (`renderMarkdownDocument()`), the
5
+ * `katex` resolution state, `fragment`/`text-quote` anchor application, highlight painting and
6
+ * hit-testing, the internal-link contract, and the rendered `[part="content"]` template itself.
7
+ *
8
+ * The two components differ in exactly one axis -- *which* shiki loader highlights a fenced block
9
+ * (the full ~200-language dynamic-import table plus a per-language `loadLanguage()`, vs.
10
+ * `shiki/core` seeded from a pre-supplied `languages` map), which is why `highlightPending()` stays
11
+ * on each class. Everything else was previously duplicated verbatim across both ~890-line class
12
+ * files, mirroring the same drift risk `code-block-shared.ts` was created to end for the
13
+ * `<lr-code-block>` / `<lr-code-block-core>` pair. A fix or behavior change now has exactly one
14
+ * place to land.
15
+ *
16
+ * Nothing here may `import` a *value* from `code-loader.js`'s full-table half
17
+ * (`loadShikiHighlighter`/`loadShikiLanguage`): `<lr-markdown-core>`'s build-leanness claim rests on
18
+ * its own module graph never reaching that call, and this module is in that graph.
10
19
  */
20
+ import { html, nothing } from 'lit';
21
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
11
22
  import { Slugger } from '../../../internal/slugger.js';
12
23
  import { finiteInteger } from '../../../internal/numbers.js';
24
+ import { prefersReducedMotion } from '../../../internal/motion.js';
25
+ import { scopeFromElement, resolveTextQuote } from '../../../internal/text-quote.js';
26
+ import { supportsCustomHighlights } from '../../../internal/text-highlights.js';
27
+ import { normalizeShikiLanguage, SHIKI_THEMES } from '../code-block/code-loader.js';
28
+ import { loadMarkdownDeps, getMarkdownDepsIfLoaded } from './markdown-loader.js';
29
+ import { getKatex } from './katex-loader.js';
13
30
  const HTML_ESCAPES = {
14
31
  '&': '&amp;',
15
32
  '<': '&lt;',
@@ -250,4 +267,341 @@ export function parseMarkdownDocument(options) {
250
267
  });
251
268
  return { html: instance.parse(content, { gfm, async: false }), hadMathFallback };
252
269
  }
270
+ export function createMarkdownKatexState() {
271
+ // `undefined` means no load has been kicked off yet, `null` that one finished but the peer isn't
272
+ // installed -- kept distinguishable from `loadStarted` so "in flight" and "confirmed missing"
273
+ // never collapse into the same falsy value.
274
+ let resolved;
275
+ let loadStarted = false;
276
+ let override;
277
+ return {
278
+ setForTesting(katex) {
279
+ override = katex;
280
+ },
281
+ getIfLoaded() {
282
+ return override !== undefined ? override : (resolved ?? null);
283
+ },
284
+ isConfirmedMissing() {
285
+ return (override !== undefined ? override : resolved) === null;
286
+ },
287
+ startLoad(onResolved) {
288
+ if (loadStarted || override !== undefined)
289
+ return;
290
+ loadStarted = true;
291
+ void getKatex().then((katex) => {
292
+ resolved = katex;
293
+ onResolved();
294
+ });
295
+ },
296
+ };
297
+ }
298
+ // -- fenced-code highlighting -------------------------------------------------------------------
299
+ /**
300
+ * Rewrites shiki's generated `<pre>`/`<code>` hast nodes so the highlighted output keeps the
301
+ * markdown viewers' own `part="code-block"` hook and a `language-${lang}` class on `<code>` --
302
+ * matching the plain-render output shape exactly, so existing consumer CSS targeting either keeps
303
+ * working whether or not a given block ended up highlighted. A separate, purpose-built function
304
+ * from `code-block-shared.ts`'s own `codeBlockLineTransformer` -- that one targets
305
+ * `<lr-code-block>`'s `part="pre"`/`part="code"`/line-numbers contract, which doesn't apply here.
306
+ */
307
+ export function markdownCodeTransformer(lang) {
308
+ return {
309
+ name: 'lr-markdown-code-block',
310
+ pre(node) {
311
+ node.properties.part = ['code-block'];
312
+ node.properties.tabindex = '0';
313
+ },
314
+ code(node) {
315
+ const classes = Array.isArray(node.properties.class)
316
+ ? node.properties.class
317
+ : node.properties.class
318
+ ? [node.properties.class]
319
+ : [];
320
+ node.properties.class = [...classes, `language-${lang}`];
321
+ },
322
+ };
323
+ }
324
+ /**
325
+ * Tokenizes one pending fenced block with an already-resolved highlighter and returns the exact
326
+ * string to cache (trailing newline included, matching the plain `code()` renderer's own output).
327
+ * `null` means "leave this key uncached" -- the caller records it in `failedHighlightKeys` so the
328
+ * block keeps its plain fallback permanently rather than being rediscovered as pending forever.
329
+ * Shared by both variants' `highlightPending()`; only the *loading* half above it differs.
330
+ */
331
+ export function tokenizeMarkdownHighlight(hl, pending) {
332
+ try {
333
+ const highlighted = hl.codeToHtml(pending.code, {
334
+ lang: normalizeShikiLanguage(pending.lang),
335
+ themes: SHIKI_THEMES,
336
+ transformers: [markdownCodeTransformer(pending.lang)],
337
+ });
338
+ return `${highlighted}\n`;
339
+ }
340
+ catch {
341
+ // Tokenization failed for a reason other than an unrecognized grammar (each variant's loader
342
+ // reports that itself) -- same effect either way: permanent plain fallback for this block.
343
+ return null;
344
+ }
345
+ }
346
+ // -- the render pipeline ------------------------------------------------------------------------
347
+ /**
348
+ * `connectedCallback()`'s optional-peer load for both variants. `eagerLoad` only takes the
349
+ * synchronous path when the shared `marked`/`dompurify` module cache has *already* settled (see
350
+ * `getMarkdownDepsIfLoaded()`'s doc) -- otherwise it falls through to the same async path as the
351
+ * default, since a dynamic `import()` can't be made synchronous from scratch.
352
+ *
353
+ * The (module-cached, page-lifetime) `loadMarkdownDeps()` promise can resolve after the instance
354
+ * was removed from the DOM -- e.g. a markdown viewer inside a conditionally-rendered chat message
355
+ * or a virtualized list. Without the `isConnected` guard, a detached instance would still have its
356
+ * deps applied and a render scheduled that no one will ever see. Mirrors `chart.ts`'s own
357
+ * `connectedCallback()` guard for the identical race.
358
+ */
359
+ export function beginMarkdownDepsLoad(host, apply) {
360
+ if (host.eagerLoad) {
361
+ const alreadyLoaded = getMarkdownDepsIfLoaded();
362
+ if (alreadyLoaded) {
363
+ apply(alreadyLoaded);
364
+ return;
365
+ }
366
+ }
367
+ void loadMarkdownDeps().then((resolved) => {
368
+ if (!host.isConnected)
369
+ return;
370
+ apply(resolved);
371
+ });
372
+ }
373
+ /** Every property whose change means the document has to be reparsed. `languagesOnly` is listed
374
+ * for `<lr-markdown>`; `<lr-markdown-core>` has no such property, so it simply never appears in
375
+ * that component's changed map. */
376
+ export function markdownNeedsReparse(changed) {
377
+ return (changed.has('content') ||
378
+ changed.has('sanitize') ||
379
+ changed.has('gfm') ||
380
+ changed.has('linkTarget') ||
381
+ changed.has('headingOffset') ||
382
+ changed.has('escapeHtml') ||
383
+ changed.has('streaming') ||
384
+ changed.has('headingAnchors') ||
385
+ changed.has('math') ||
386
+ changed.has('highlightCode') ||
387
+ changed.has('languages') ||
388
+ changed.has('languagesOnly'));
389
+ }
390
+ /** Whether the *highlighting* configuration changed, invalidating in-flight work and the
391
+ * permanently-failed key set. */
392
+ export function markdownHighlightConfigChanged(changed) {
393
+ return changed.has('highlightCode') || changed.has('languages') || changed.has('languagesOnly');
394
+ }
395
+ /** Whether the *grammar set* changed, additionally invalidating already-highlighted output. */
396
+ export function markdownLanguageSetChanged(changed) {
397
+ return changed.has('languages') || changed.has('languagesOnly');
398
+ }
399
+ /**
400
+ * The optional-peer load / parse / sanitize / fallback pipeline both variants run, returning what
401
+ * changed rather than mutating the instance -- the caller owns every `@state` assignment and every
402
+ * event, so this stays a pure function of its inputs.
403
+ *
404
+ * Rendering never ships unsanitized or broken markup silently: a missing/throwing `marked`, or a
405
+ * missing `dompurify` while `sanitize` is on, both fall back to plain text plus `lr-render-error`;
406
+ * an explicit `sanitize="false"` renders marked's raw output regardless of whether `dompurify` is
407
+ * installed, because the consumer opted out.
408
+ */
409
+ export function renderMarkdownDocument(options) {
410
+ const { deps, tag } = options;
411
+ if (!deps.marked) {
412
+ // markdown-loader.ts already logged the specific import failure.
413
+ return {
414
+ status: 'fallback',
415
+ error: new Error(`<${tag}> could not render: the "marked" peer dependency failed to load.`),
416
+ headingTree: null,
417
+ };
418
+ }
419
+ const pendingKeys = [];
420
+ const headingTree = [];
421
+ let rawHtml;
422
+ let hadMathFallback;
423
+ try {
424
+ const parsed = options.parse(deps.marked, pendingKeys, headingTree);
425
+ rawHtml = parsed.html;
426
+ hadMathFallback = parsed.hadMathFallback;
427
+ }
428
+ catch (error) {
429
+ return { status: 'fallback', error, headingTree: null };
430
+ }
431
+ options.onParsed();
432
+ const mathFailed = hadMathFallback && options.isKatexConfirmedMissing();
433
+ if (!options.sanitize) {
434
+ // Consumer explicitly opted out of sanitization -- dompurify's presence or absence is
435
+ // irrelevant to this path.
436
+ return { status: 'rendered', html: rawHtml, headingTree, mathFailed, pendingKeys };
437
+ }
438
+ if (!deps.DOMPurify) {
439
+ const error = new Error(`<${tag}> could not render: sanitize is enabled (the default) but the "dompurify" peer ` +
440
+ 'dependency failed to load — refusing to render unsanitized HTML. Install it with `pnpm add ' +
441
+ 'dompurify`, or set sanitize="false" to explicitly opt out of sanitization.');
442
+ console.warn(error.message);
443
+ return { status: 'fallback', error, headingTree };
444
+ }
445
+ // `target` is not in DOMPurify's default attribute allowlist (unlike `part`/`rel`/`class`, which
446
+ // already are) -- without ADD_ATTR here, every rendered link's target="..." would be silently
447
+ // stripped even though the anchor itself survives sanitization. 'style' joins it because shiki's
448
+ // per-token output carries inline style="color:..." (theme colors), equally absent from the
449
+ // default allowlist. `semantics`/`annotation` join only when `math` is on -- the only KaTeX
450
+ // MathML output elements outside the default allowlist. `annotation-xml` is deliberately never
451
+ // added: KaTeX's own MathML output never emits it, and DOMPurify's default allowlist already
452
+ // treats it as a namespace-switching element worth keeping stripped.
453
+ const sanitized = deps.DOMPurify.sanitize(rawHtml, {
454
+ ADD_ATTR: ['target', 'style'],
455
+ ...(options.math ? { ADD_TAGS: ['semantics', 'annotation'] } : {}),
456
+ });
457
+ return { status: 'rendered', html: sanitized, headingTree, mathFailed, pendingKeys };
458
+ }
459
+ /** The `lr-render-error` payload for a permanently-missing `katex` peer while `math` is set. */
460
+ export function markdownMathPeerError(tag) {
461
+ return new Error(`<${tag}> needs the optional peer dependency \`katex\` to render math (the \`math\` property is set) — install it with \`pnpm add katex\`.`);
462
+ }
463
+ /** Mirrors "the document is not final" onto the host as `aria-busy`, so assistive technology knows
464
+ * the rendered output is still resolving (peers loading, or `streaming` still on). */
465
+ export function applyMarkdownAriaBusy(host, busy) {
466
+ if (busy)
467
+ host.setAttribute('aria-busy', 'true');
468
+ else
469
+ host.removeAttribute('aria-busy');
470
+ }
471
+ // -- anchors ------------------------------------------------------------------------------------
472
+ /**
473
+ * Scrolls a `fragment` anchor's heading into view. `headingAnchors` may be off, so the target
474
+ * heading might carry no `id` attribute in the DOM at all -- and even with it on, DOMPurify's
475
+ * DOM-clobbering protection strips a slug colliding with a real `document` property name. Both
476
+ * cases fall back to re-deriving the same slug order `getHeadingTree()` was built in and matching
477
+ * by position instead of by attribute.
478
+ */
479
+ export function applyMarkdownFragmentAnchor(root, anchor, headingTree) {
480
+ if (!anchor.id)
481
+ return false;
482
+ const index = headingTree.findIndex((h) => h.id === anchor.id);
483
+ if (index < 0)
484
+ return false;
485
+ const el = root.querySelector(`#${CSS.escape(anchor.id)}`) ?? root.querySelectorAll('h1, h2, h3, h4, h5, h6')[index];
486
+ if (!el)
487
+ return false;
488
+ el.scrollIntoView({ behavior: prefersReducedMotion() ? 'auto' : 'smooth', block: 'start' });
489
+ return true;
490
+ }
491
+ /** Scrolls a `text-quote` anchor's resolved range into view, centered. */
492
+ export function applyMarkdownTextQuoteAnchor(root, anchor) {
493
+ const range = resolveTextQuote(scopeFromElement(root), anchor);
494
+ if (!range)
495
+ return false;
496
+ const target = range.startContainer.nodeType === Node.ELEMENT_NODE
497
+ ? range.startContainer
498
+ : range.startContainer.parentElement;
499
+ (target ?? root).scrollIntoView({ behavior: prefersReducedMotion() ? 'auto' : 'smooth', block: 'center' });
500
+ return true;
501
+ }
502
+ // -- highlight painting ---------------------------------------------------------------------------
503
+ /** Every `LyraHighlightTone`, used to always call `HighlightHandle.setRanges()` once per tone on
504
+ * every repaint (with an empty array for an unused tone) -- `setRanges()` replaces a tone's ranges
505
+ * wholesale per call, so a tone this pass has nothing for still needs an explicit empty call to
506
+ * clear whatever it painted last pass. */
507
+ const HIGHLIGHT_TONES = ['accent', 'success', 'warning', 'danger', 'neutral'];
508
+ /**
509
+ * Re-resolves every `text-quote` highlight against the current rendered content and repaints via
510
+ * the caller's `acquireHighlightHandle()` handle -- resolution is always by quote text, never by
511
+ * node identity, so a highlight set before its quote exists in `content` yet (e.g. mid-`streaming`)
512
+ * simply paints nothing until a later render's text actually contains it. `fragment` highlights
513
+ * aren't painted (there is no literal span of text to wrap/underline for a whole section).
514
+ * Returns the resolved ranges for `hitTestHighlightRanges()` to activate against.
515
+ */
516
+ export function repaintMarkdownHighlights(options) {
517
+ const resolved = [];
518
+ const scope = scopeFromElement(options.root);
519
+ const rangesByTone = new Map(HIGHLIGHT_TONES.map((tone) => [tone, []]));
520
+ let activeRange = null;
521
+ for (const highlight of options.highlights) {
522
+ if (highlight.anchor.kind !== 'text-quote')
523
+ continue;
524
+ const range = resolveTextQuote(scope, highlight.anchor);
525
+ if (!range)
526
+ continue;
527
+ rangesByTone.get(highlight.tone ?? 'accent').push(range);
528
+ resolved.push({ id: highlight.id, range });
529
+ if (highlight.id === options.activeHighlightId)
530
+ activeRange = range;
531
+ }
532
+ for (const [tone, ranges] of rangesByTone)
533
+ options.handle.setRanges(tone, ranges);
534
+ options.handle.setActive(activeRange);
535
+ if (!supportsCustomHighlights()) {
536
+ // The `<mark>`-wrap fallback creates real elements but carries no `part` of its own (the module
537
+ // is shared by every adopting viewer, so it can't know this component's part naming) -- stamped
538
+ // here so a consumer can still target `::part(highlight)` in browsers lacking the CSS Custom
539
+ // Highlight API. Nothing to stamp on the API path: no DOM element is created there.
540
+ for (const mark of options.root.querySelectorAll('mark[data-lr-highlight-tone]')) {
541
+ if (!mark.hasAttribute('part'))
542
+ mark.setAttribute('part', 'highlight');
543
+ }
544
+ }
545
+ return resolved;
546
+ }
547
+ /**
548
+ * Hit-tests a click point against every currently-resolved highlight's `getClientRects()`, topmost
549
+ * (last-resolved) first. The CSS Custom Highlight API paints ranges without creating any DOM element
550
+ * to attach a click listener to, so this is the only activation path that works identically on both
551
+ * paint paths -- mirrors `<lr-pdf-viewer>`'s own coordinate-based `onPageClick()` hit-test for the
552
+ * same reason (its own painted highlights sit under a text layer that intercepts most pointer
553
+ * events).
554
+ */
555
+ export function hitTestHighlightRanges(ranges, x, y) {
556
+ for (let i = ranges.length - 1; i >= 0; i--) {
557
+ const hit = ranges[i];
558
+ if (!hit)
559
+ continue; // unreachable: counted loop, i is in [0, length - 1]
560
+ for (const rect of hit.range.getClientRects()) {
561
+ if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)
562
+ return hit.id;
563
+ }
564
+ }
565
+ return null;
566
+ }
567
+ // -- rendering ------------------------------------------------------------------------------------
568
+ /** The `href` of the rendered link a click landed on, when `internal-link-prefix` claims it --
569
+ * `null` for every other click, including one on an ordinary external link.
570
+ *
571
+ * Compared against the raw `href` *attribute*, not the `.href` IDL property: the property is
572
+ * always browser-resolved to an absolute URL (e.g. "https://example.com/docs") even for a
573
+ * relative/prefixed path, which would never match a relative `internal-link-prefix`. */
574
+ export function internalLinkHrefFrom(e, prefix) {
575
+ if (!prefix)
576
+ return null;
577
+ const anchor = e.composedPath().find((el) => el instanceof HTMLAnchorElement);
578
+ if (!anchor)
579
+ return null;
580
+ const href = anchor.getAttribute('href') ?? '';
581
+ return href.startsWith(prefix) ? href : null;
582
+ }
583
+ /** The rendered tree both variants produce: one `[part="content"]` wrapper plus the anchor-target
584
+ * live region. Only non-empty content is focusable -- an empty document is not a scrollable region
585
+ * worth a tab stop. */
586
+ export function renderMarkdownContent(options) {
587
+ const isFallback = options.renderedHtml === null;
588
+ // Indented two levels deeper than this function body on purpose. `[part='content'][data-fallback]`
589
+ // is `white-space: pre-wrap` (markdown.styles.ts), so the literal indentation around the binding
590
+ // below is *rendered* whitespace in the plain-text fallback state -- keeping the exact text both
591
+ // class files used before the extraction keeps that state pixel-identical.
592
+ // prettier-ignore
593
+ return html `
594
+ <div
595
+ part="content"
596
+ role="document"
597
+ tabindex=${options.content.trim() ? '0' : nothing}
598
+ aria-label=${options.hostAriaLabel || nothing}
599
+ ?data-fallback=${isFallback}
600
+ @click=${options.onClick}
601
+ >
602
+ ${isFallback ? options.content : unsafeHTML(options.renderedHtml)}
603
+ </div>
604
+ ${options.liveRegion}
605
+ `;
606
+ }
253
607
  //# sourceMappingURL=markdown-shared.js.map