@aceshooting/lyra-ui 13.0.1 → 14.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 (723) hide show
  1. package/CHANGELOG.md +329 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migration-contract.json +1 -1
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +23 -15
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +9 -6
  6. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +12 -3
  7. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +2 -1
  8. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +4 -2
  9. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -1
  10. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +1 -1
  11. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +3 -1
  12. package/dist/components/agent-tools/commit-card/commit-card.class.js +2 -2
  13. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -1
  14. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -1
  15. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +6 -2
  16. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +8 -8
  17. package/dist/components/agent-tools/result-card/result-card.class.d.ts +1 -1
  18. package/dist/components/agent-tools/result-card/result-card.class.js +1 -1
  19. package/dist/components/agent-tools/result-card/result-field.class.d.ts +1 -1
  20. package/dist/components/agent-tools/result-card/result-field.class.js +1 -1
  21. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +5 -5
  22. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +23 -10
  23. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +13 -6
  24. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +3 -3
  25. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
  26. package/dist/components/agent-tools/stack-trace/stack-trace-parse.js +3 -3
  27. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts +1 -1
  28. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
  29. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +1 -1
  30. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  31. package/dist/components/agent-tools/task-list/task-list.class.d.ts +1 -2
  32. package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
  33. package/dist/components/agent-tools/terminal/terminal.class.d.ts +11 -2
  34. package/dist/components/agent-tools/terminal/terminal.class.js +5 -5
  35. package/dist/components/agent-tools/terminal/terminal.styles.js +1 -1
  36. package/dist/components/agent-tools/test-results/test-results.class.d.ts +4 -2
  37. package/dist/components/agent-tools/test-results/test-results.class.js +2 -2
  38. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +2 -0
  39. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +1 -1
  40. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
  41. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +2 -2
  42. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  43. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +3 -2
  44. package/dist/components/agent-tools/tool-param-form/tool-param-form.d.ts +1 -1
  45. package/dist/components/agent-tools/tool-param-form/tool-param-form.js +1 -1
  46. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  47. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +1 -1
  48. package/dist/components/agent-tools/tool-result-view/registry.d.ts +2 -1
  49. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +1 -1
  50. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +1 -1
  51. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +18 -12
  52. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +7 -7
  53. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +9 -3
  54. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
  55. package/dist/components/agent-tools/trace-tree/span.d.ts +3 -1
  56. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  57. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
  58. package/dist/components/charts/chart/box-plot.class.d.ts +12 -3
  59. package/dist/components/charts/chart/box-plot.class.js +9 -9
  60. package/dist/components/charts/chart/box-plot.styles.js +1 -1
  61. package/dist/components/charts/chart/chart-core-loader.js +1 -1
  62. package/dist/components/charts/chart/chart-feature-loader.js +1 -1
  63. package/dist/components/charts/chart/chart-preload.d.ts +1 -1
  64. package/dist/components/charts/chart/chart-preload.js +1 -1
  65. package/dist/components/charts/chart/chart.class.d.ts +33 -10
  66. package/dist/components/charts/chart/chart.class.js +23 -14
  67. package/dist/components/charts/chart/chart.styles.js +1 -1
  68. package/dist/components/charts/chart/histogram-bin.js +1 -1
  69. package/dist/components/charts/chart/lite-chart.class.d.ts +20 -11
  70. package/dist/components/charts/chart/lite-chart.class.js +17 -11
  71. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  72. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +1 -1
  73. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +2 -2
  74. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +10 -5
  75. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +1 -1
  76. package/dist/components/conversation/branch-picker/branch-picker.class.d.ts +4 -2
  77. package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -1
  78. package/dist/components/conversation/branch-picker/branch-picker.styles.js +1 -1
  79. package/dist/components/conversation/chat-composer/chat-composer.class.d.ts +6 -2
  80. package/dist/components/conversation/chat-composer/chat-composer.class.js +3 -3
  81. package/dist/components/conversation/chat-composer/chat-composer.styles.js +1 -1
  82. package/dist/components/conversation/chat-message/chat-message.class.d.ts +4 -3
  83. package/dist/components/conversation/chat-message/chat-message.class.js +2 -2
  84. package/dist/components/conversation/chat-message/chat-message.styles.js +1 -1
  85. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +1 -1
  86. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -3
  87. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  88. package/dist/components/conversation/code-block/code-block-shared.d.ts +3 -3
  89. package/dist/components/conversation/code-block/code-block-shared.js +2 -2
  90. package/dist/components/conversation/code-block/code-block.class.d.ts +4 -3
  91. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  92. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  93. package/dist/components/conversation/code-block/code-loader.d.ts +1 -1
  94. package/dist/components/conversation/code-block/code-loader.js +1 -1
  95. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  96. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  97. package/dist/components/conversation/conversation-item/conversation-item.class.js +1 -1
  98. package/dist/components/conversation/conversation-item/conversation-item.styles.js +1 -1
  99. package/dist/components/conversation/generation-metrics/generation-metrics.styles.js +1 -1
  100. package/dist/components/conversation/markdown/katex-loader.d.ts +4 -4
  101. package/dist/components/conversation/markdown/katex-loader.js +1 -1
  102. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  103. package/dist/components/conversation/markdown/markdown-core.class.d.ts +1 -1
  104. package/dist/components/conversation/markdown/markdown-loader.d.ts +1 -1
  105. package/dist/components/conversation/markdown/markdown-loader.js +1 -1
  106. package/dist/components/conversation/markdown/markdown-shared.d.ts +6 -1
  107. package/dist/components/conversation/markdown/markdown-shared.js +5 -4
  108. package/dist/components/conversation/markdown/markdown.class.d.ts +1 -1
  109. package/dist/components/conversation/message-actions/message-actions.class.d.ts +18 -3
  110. package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
  111. package/dist/components/conversation/message-actions/message-actions.styles.js +1 -1
  112. package/dist/components/conversation/message-actions/toolbar-actions.d.ts +3 -1
  113. package/dist/components/conversation/message-actions/toolbar-actions.js +1 -1
  114. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +40 -15
  115. package/dist/components/conversation/message-feedback/message-feedback.class.js +7 -3
  116. package/dist/components/conversation/message-feedback/message-feedback.styles.js +1 -1
  117. package/dist/components/conversation/message-parts/message-parts.class.d.ts +10 -4
  118. package/dist/components/conversation/message-parts/message-parts.class.js +2 -2
  119. package/dist/components/conversation/message-parts/message-parts.styles.js +1 -1
  120. package/dist/components/conversation/model-select/model-select.class.d.ts +5 -2
  121. package/dist/components/conversation/model-select/model-select.class.js +8 -5
  122. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +3 -5
  123. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
  124. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +9 -2
  125. package/dist/components/conversation/prompt-input/prompt-input.class.js +3 -3
  126. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  127. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +20 -4
  128. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +1 -1
  129. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
  130. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +17 -8
  131. package/dist/components/conversation/push-to-talk/push-to-talk.class.js +1 -1
  132. package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +1 -1
  133. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +6 -3
  134. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  135. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +1 -1
  136. package/dist/components/conversation/thread-list/thread-list.class.d.ts +14 -4
  137. package/dist/components/conversation/thread-list/thread-list.class.js +11 -11
  138. package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
  139. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +2 -0
  140. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  141. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
  142. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts +2 -1
  143. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +1 -1
  144. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.d.ts +3 -0
  145. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.js +1 -0
  146. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -2
  147. package/dist/components/conversation/usage-badge/usage-badge.class.js +1 -1
  148. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +12 -4
  149. package/dist/components/conversation/voice-picker/voice-picker.class.js +8 -5
  150. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  151. package/dist/components/conversation/widget-renderer/resolve.d.ts +4 -6
  152. package/dist/components/conversation/widget-renderer/resolve.js +1 -1
  153. package/dist/components/data/calendar/calendar.class.d.ts +16 -5
  154. package/dist/components/data/calendar/calendar.class.js +2 -2
  155. package/dist/components/data/calendar/calendar.styles.js +1 -1
  156. package/dist/components/data/condition-builder/condition-builder.class.d.ts +3 -1
  157. package/dist/components/data/condition-builder/condition-builder.class.js +15 -1
  158. package/dist/components/data/context-meter/context-meter.class.d.ts +3 -1
  159. package/dist/components/data/context-meter/context-meter.class.js +4 -4
  160. package/dist/components/data/data-grid/data-grid.class.d.ts +51 -6
  161. package/dist/components/data/data-grid/data-grid.class.js +25 -11
  162. package/dist/components/data/data-grid/data-grid.styles.js +1 -1
  163. package/dist/components/data/document-library/document-library.class.d.ts +5 -2
  164. package/dist/components/data/document-library/document-library.class.js +1 -1
  165. package/dist/components/data/env-list/env-list.class.js +1 -1
  166. package/dist/components/data/file-tree/file-tree.class.d.ts +2 -1
  167. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  168. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +24 -14
  169. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -2
  170. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  171. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  172. package/dist/components/data/flow-canvas/flow-types.d.ts +2 -1
  173. package/dist/components/data/flow-controls/flow-controls.styles.js +1 -1
  174. package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
  175. package/dist/components/data/funnel/funnel.class.d.ts +1 -0
  176. package/dist/components/data/funnel/funnel.class.js +1 -1
  177. package/dist/components/data/gauge/gauge.class.d.ts +4 -1
  178. package/dist/components/data/gauge/gauge.class.js +6 -6
  179. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +5 -2
  180. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +15 -1
  181. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +1 -1
  182. package/dist/components/data/heatmap/heatmap.class.d.ts +7 -4
  183. package/dist/components/data/heatmap/heatmap.class.js +1 -1
  184. package/dist/components/data/sequence-strip/sequence-strip.class.js +1 -1
  185. package/dist/components/data/sparkline/sparkline.class.d.ts +2 -1
  186. package/dist/components/data/sparkline/sparkline.class.js +1 -1
  187. package/dist/components/data/stat/stat.class.d.ts +6 -2
  188. package/dist/components/data/stat/stat.class.js +1 -1
  189. package/dist/components/data/table/table.class.d.ts +15 -16
  190. package/dist/components/data/table/table.class.js +5 -4
  191. package/dist/components/data/table/table.styles.js +1 -1
  192. package/dist/components/data/timeline/timeline.class.d.ts +7 -2
  193. package/dist/components/data/timeline/timeline.class.js +1 -1
  194. package/dist/components/data/timeline/timeline.styles.js +1 -1
  195. package/dist/components/data/tree/tree-item.class.d.ts +3 -1
  196. package/dist/components/data/tree/tree-item.class.js +1 -1
  197. package/dist/components/data/tree/tree-item.styles.js +1 -1
  198. package/dist/components/data/tree/tree.class.d.ts +4 -1
  199. package/dist/components/data/tree/tree.class.js +1 -1
  200. package/dist/components/data/word-cloud/word-cloud-layout.d.ts +2 -1
  201. package/dist/components/data/word-cloud/word-cloud-layout.js +1 -1
  202. package/dist/components/data/word-cloud/word-cloud.class.d.ts +2 -1
  203. package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
  204. package/dist/components/forms/button/button.class.d.ts +5 -3
  205. package/dist/components/forms/button/button.class.js +1 -1
  206. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  207. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  208. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +7 -2
  209. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  210. package/dist/components/forms/code-editor/code-editor.class.d.ts +16 -4
  211. package/dist/components/forms/code-editor/code-editor.class.js +19 -9
  212. package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
  213. package/dist/components/forms/color-picker/color-picker.class.d.ts +6 -2
  214. package/dist/components/forms/color-picker/color-picker.class.js +4 -4
  215. package/dist/components/forms/combobox/combobox.class.d.ts +19 -8
  216. package/dist/components/forms/combobox/combobox.class.js +3 -3
  217. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  218. package/dist/components/forms/combobox/option.class.d.ts +4 -0
  219. package/dist/components/forms/combobox/option.class.js +2 -2
  220. package/dist/components/forms/date-picker/calendar-core.d.ts +1 -1
  221. package/dist/components/forms/date-picker/calendar-core.js +1 -1
  222. package/dist/components/forms/date-picker/date-input.class.d.ts +20 -10
  223. package/dist/components/forms/date-picker/date-input.class.js +4 -4
  224. package/dist/components/forms/date-picker/date-picker.class.d.ts +33 -15
  225. package/dist/components/forms/date-picker/date-picker.class.js +8 -8
  226. package/dist/components/forms/date-picker/date-picker.styles.js +1 -1
  227. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  228. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +11 -3
  229. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -3
  230. package/dist/components/forms/emoji-picker/emoji-types.d.ts +2 -2
  231. package/dist/components/forms/icon-button/icon-button.class.d.ts +4 -2
  232. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  233. package/dist/components/forms/input/input.class.d.ts +16 -5
  234. package/dist/components/forms/input/input.class.js +7 -1
  235. package/dist/components/forms/input/native-time-input.class.d.ts +3 -0
  236. package/dist/components/forms/input/number-input.class.d.ts +3 -0
  237. package/dist/components/forms/input/time-input.class.d.ts +11 -2
  238. package/dist/components/forms/input/time-input.class.js +2 -2
  239. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +22 -4
  240. package/dist/components/forms/locale-picker/locale-picker.class.js +2 -2
  241. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  242. package/dist/components/forms/otp-input/otp-input.class.d.ts +5 -1
  243. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  244. package/dist/components/forms/phone-input/phone-input.class.d.ts +21 -8
  245. package/dist/components/forms/phone-input/phone-input.class.js +1 -1
  246. package/dist/components/forms/radio/radio-button.class.d.ts +4 -0
  247. package/dist/components/forms/radio/radio-group.class.d.ts +4 -1
  248. package/dist/components/forms/radio/radio-group.class.js +1 -1
  249. package/dist/components/forms/radio/radio.class.d.ts +6 -2
  250. package/dist/components/forms/radio/radio.class.js +1 -1
  251. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +7 -1
  252. package/dist/components/forms/rubric-form/rubric-form.class.js +3 -3
  253. package/dist/components/forms/select/select.class.d.ts +8 -2
  254. package/dist/components/forms/select/select.class.js +2 -2
  255. package/dist/components/forms/select/select.styles.js +1 -1
  256. package/dist/components/forms/slider/slider.class.d.ts +12 -6
  257. package/dist/components/forms/slider/slider.class.js +2 -2
  258. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +4 -0
  259. package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
  260. package/dist/components/forms/switch/switch.class.d.ts +5 -1
  261. package/dist/components/forms/switch/switch.class.js +1 -1
  262. package/dist/components/forms/textarea/textarea.class.d.ts +3 -0
  263. package/dist/components/forms/textarea/textarea.class.js +1 -1
  264. package/dist/components/forms/time-range/time-range.class.d.ts +3 -0
  265. package/dist/components/forms/time-range/time-range.class.js +1 -1
  266. package/dist/components/forms/token-input/token-input.class.d.ts +8 -2
  267. package/dist/components/forms/token-input/token-input.class.js +2 -2
  268. package/dist/components/forms/token-input/token-input.styles.js +1 -1
  269. package/dist/components/layout/app-rail/app-rail.class.d.ts +9 -5
  270. package/dist/components/layout/app-rail/app-rail.class.js +4 -3
  271. package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
  272. package/dist/components/layout/carousel/carousel.class.d.ts +3 -2
  273. package/dist/components/layout/carousel/carousel.class.js +1 -1
  274. package/dist/components/layout/command-palette/command-palette.class.d.ts +2 -2
  275. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  276. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  277. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +2 -0
  278. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  279. package/dist/components/layout/details/details.class.d.ts +16 -15
  280. package/dist/components/layout/details/details.class.js +43 -34
  281. package/dist/components/layout/details/details.styles.js +1 -1
  282. package/dist/components/layout/dock-panel/dock-panel.class.d.ts +4 -3
  283. package/dist/components/layout/dock-panel/dock-panel.class.js +2 -1
  284. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +3 -1
  285. package/dist/components/layout/filter-bar/filter-bar.class.js +2 -2
  286. package/dist/components/layout/menu/menu-item.class.js +2 -2
  287. package/dist/components/layout/menu/menu-label.class.d.ts +3 -3
  288. package/dist/components/layout/menu/menu.class.d.ts +4 -1
  289. package/dist/components/layout/menu/menu.class.js +1 -1
  290. package/dist/components/layout/multi-split/multi-split.class.d.ts +19 -8
  291. package/dist/components/layout/multi-split/multi-split.class.js +2 -1
  292. package/dist/components/layout/multi-split/multi-split.styles.js +1 -1
  293. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -1
  294. package/dist/components/layout/reorder-list/reorder-item.class.js +1 -1
  295. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  296. package/dist/components/layout/reorder-list/reorder-owner.js +1 -1
  297. package/dist/components/layout/scroller/scroller.class.d.ts +4 -4
  298. package/dist/components/layout/scroller/scroller.styles.js +1 -1
  299. package/dist/components/layout/split-panel/split-panel.class.d.ts +5 -3
  300. package/dist/components/layout/split-panel/split-panel.class.js +3 -2
  301. package/dist/components/layout/tab-group/tab-group.class.d.ts +3 -1
  302. package/dist/components/layout/tab-group/tab-group.class.js +1 -1
  303. package/dist/components/layout/tab-group/tab-group.styles.js +1 -1
  304. package/dist/components/layout/virtual-list/virtual-list.class.js +2 -2
  305. package/dist/components/layout/widget/widget.class.d.ts +6 -2
  306. package/dist/components/layout/widget/widget.class.js +1 -1
  307. package/dist/components/layout/widget/widget.styles.js +1 -1
  308. package/dist/components/media/animation/animation.class.d.ts +3 -2
  309. package/dist/components/media/animation/animation.class.js +1 -1
  310. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +4 -3
  311. package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
  312. package/dist/components/media/av-player/av-metadata.d.ts +3 -2
  313. package/dist/components/media/av-player/av-player.class.d.ts +4 -3
  314. package/dist/components/media/av-player/av-player.class.js +3 -3
  315. package/dist/components/media/av-player/av-player.styles.js +1 -1
  316. package/dist/components/media/avatar/avatar.class.d.ts +2 -1
  317. package/dist/components/media/avatar/avatar.class.js +1 -1
  318. package/dist/components/media/file-input/file-input.class.d.ts +4 -2
  319. package/dist/components/media/file-input/file-input.class.js +1 -1
  320. package/dist/components/media/file-input/file-input.styles.js +1 -1
  321. package/dist/components/media/flag/flag.class.js +1 -1
  322. package/dist/components/media/image-viewer/image-viewer.class.d.ts +2 -1
  323. package/dist/components/media/image-viewer/image-viewer.class.js +1 -1
  324. package/dist/components/media/image-viewer/image-viewer.styles.js +1 -1
  325. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  326. package/dist/components/media/map/map-loader.js +1 -1
  327. package/dist/components/media/map/map.class.d.ts +22 -34
  328. package/dist/components/media/map/map.class.js +1 -1
  329. package/dist/components/media/map/map.styles.js +1 -1
  330. package/dist/components/media/media-card/media-card.class.d.ts +1 -1
  331. package/dist/components/media/media-card/media-card.class.js +1 -1
  332. package/dist/components/media/pan-zoom/pan-zoom.class.js +1 -1
  333. package/dist/components/media/qr-code/qr-code-loader.js +1 -1
  334. package/dist/components/media/qr-code/qr-code.class.d.ts +5 -2
  335. package/dist/components/media/qr-code/qr-code.class.js +2 -2
  336. package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +3 -3
  337. package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
  338. package/dist/components/media/sequence-playback/sequence-playback.styles.js +1 -1
  339. package/dist/components/media/video/video.class.d.ts +2 -1
  340. package/dist/components/media/video/video.styles.js +1 -1
  341. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -2
  342. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
  343. package/dist/components/overlays/alert/alert.styles.js +1 -1
  344. package/dist/components/overlays/callout/callout.styles.js +1 -1
  345. package/dist/components/overlays/chip/chip-group.class.d.ts +2 -0
  346. package/dist/components/overlays/chip/chip-group.class.js +1 -1
  347. package/dist/components/overlays/dialog/dialog.class.d.ts +2 -0
  348. package/dist/components/overlays/dialog/dialog.class.js +1 -1
  349. package/dist/components/overlays/dialog/dialog.styles.js +1 -1
  350. package/dist/components/overlays/empty/empty.class.d.ts +2 -0
  351. package/dist/components/overlays/empty/empty.class.js +1 -1
  352. package/dist/components/overlays/kbd/kbd.class.d.ts +2 -0
  353. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  354. package/dist/components/overlays/overlay/popover.class.d.ts +3 -1
  355. package/dist/components/overlays/overlay/popover.class.js +1 -1
  356. package/dist/components/overlays/overlay/tooltip.class.d.ts +3 -1
  357. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  358. package/dist/components/overlays/rating/rating.class.d.ts +2 -0
  359. package/dist/components/overlays/rating/rating.class.js +1 -1
  360. package/dist/components/overlays/toast/toast-item.class.js +1 -1
  361. package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts +11 -5
  362. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +3 -3
  363. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +2 -2
  364. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +5 -2
  365. package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
  366. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +4 -2
  367. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  368. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  369. package/dist/components/retrieval/graph/graph-loader.js +1 -1
  370. package/dist/components/retrieval/graph/graph.class.d.ts +10 -8
  371. package/dist/components/retrieval/graph/graph.class.js +10 -10
  372. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +4 -2
  373. package/dist/components/retrieval/graph-legend/graph-legend.class.js +1 -1
  374. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +15 -9
  375. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +7 -5
  376. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +2 -0
  377. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +1 -1
  378. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +3 -2
  379. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +4 -3
  380. package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
  381. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +7 -3
  382. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +8 -3
  383. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  384. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +15 -6
  385. package/dist/components/retrieval/memory-panel/memory-panel.class.js +1 -1
  386. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
  387. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
  388. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +17 -12
  389. package/dist/components/retrieval/node-palette/node-palette.class.js +2 -2
  390. package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
  391. package/dist/components/retrieval/path-strip/path-strip.class.js +1 -1
  392. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +2 -1
  393. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js +1 -1
  394. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +1 -1
  395. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +5 -5
  396. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  397. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +2 -1
  398. package/dist/components/retrieval/source-picker/source-picker.class.js +2 -2
  399. package/dist/components/utility/copy-button/copy-button.class.d.ts +2 -1
  400. package/dist/components/utility/copy-button/copy-button.class.js +1 -1
  401. package/dist/components/utility/diff-view/diff-view.class.d.ts +4 -1
  402. package/dist/components/utility/diff-view/diff-view.class.js +1 -1
  403. package/dist/components/utility/export-button/export-button.class.d.ts +2 -2
  404. package/dist/components/utility/export-button/export-button.class.js +1 -1
  405. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  406. package/dist/components/utility/format/format-date.class.js +1 -1
  407. package/dist/components/utility/format/format-number.class.d.ts +3 -1
  408. package/dist/components/utility/format/format-options.js +1 -1
  409. package/dist/components/utility/format/relative-time.class.js +1 -1
  410. package/dist/components/utility/icon/dompurify-loader.js +1 -1
  411. package/dist/components/utility/icon/icon-library.js +1 -1
  412. package/dist/components/utility/intersection-observer/intersection-observer.class.js +1 -1
  413. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +6 -3
  414. package/dist/components/utility/json-viewer/json-viewer.class.js +5 -5
  415. package/dist/components/utility/known-date/known-date.class.d.ts +9 -5
  416. package/dist/components/utility/known-date/known-date.class.js +2 -2
  417. package/dist/components/utility/known-date/known-date.styles.js +1 -1
  418. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +32 -45
  419. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  420. package/dist/components/utility/mutation-observer/mutation-observer.class.js +1 -1
  421. package/dist/components/utility/poll-status/poll-status.class.d.ts +3 -0
  422. package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
  423. package/dist/components/viewers/calendar-viewer/calendar-loader.js +1 -1
  424. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +1 -0
  425. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +1 -1
  426. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +2 -1
  427. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +1 -1
  428. package/dist/components/viewers/document-compare/document-compare.class.d.ts +11 -8
  429. package/dist/components/viewers/document-compare/document-compare.class.js +2 -2
  430. package/dist/components/viewers/document-preview/document-preview.class.d.ts +8 -4
  431. package/dist/components/viewers/document-preview/document-preview.class.js +4 -4
  432. package/dist/components/viewers/document-preview/document-preview.styles.js +1 -1
  433. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +5 -2
  434. package/dist/components/viewers/document-viewer/document-viewer.class.js +2 -2
  435. package/dist/components/viewers/document-viewer/document-viewer.styles.js +1 -1
  436. package/dist/components/viewers/document-viewer/registry-ownership.d.ts +1 -0
  437. package/dist/components/viewers/document-viewer/registry-ownership.js +1 -0
  438. package/dist/components/viewers/document-viewer/registry.js +1 -1
  439. package/dist/components/viewers/docx-viewer/docx-loader.js +1 -1
  440. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +1 -1
  441. package/dist/components/viewers/ebook-viewer/ebook-loader.d.ts +1 -1
  442. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +8 -2
  443. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  444. package/dist/components/viewers/email-viewer/email-loader.js +1 -1
  445. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +3 -2
  446. package/dist/components/viewers/email-viewer/email-viewer.class.js +2 -2
  447. package/dist/components/viewers/html-viewer/dompurify-loader.js +1 -1
  448. package/dist/components/viewers/include/include-resource.js +1 -1
  449. package/dist/components/viewers/include/include.class.d.ts +3 -1
  450. package/dist/components/viewers/notebook-viewer/dompurify-loader.js +1 -1
  451. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +4 -2
  452. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +4 -4
  453. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +1 -1
  454. package/dist/components/viewers/passive-markup.js +1 -1
  455. package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
  456. package/dist/components/viewers/pptx-viewer/pptx-loader.js +1 -1
  457. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-loader.js +1 -1
  458. package/dist/components/viewers/svg-viewer/dompurify-loader.js +1 -1
  459. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +2 -1
  460. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +1 -1
  461. package/dist/components/viewers/viewer-loading.js +1 -1
  462. package/dist/components/viewers/viewer-search-limits.d.ts +2 -0
  463. package/dist/components/viewers/viewer-search-limits.js +1 -1
  464. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +2 -1
  465. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +1 -1
  466. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  467. package/dist/custom-elements-jsx.d.ts +1 -1
  468. package/dist/events.d.ts +13 -6
  469. package/dist/internal/aria-controls.d.ts +16 -13
  470. package/dist/internal/aria-controls.js +1 -1
  471. package/dist/internal/aria-reflection.js +1 -1
  472. package/dist/internal/catalog-picker.d.ts +2 -2
  473. package/dist/internal/catalog-picker.js +1 -1
  474. package/dist/internal/chart-annotation-registration.d.ts +1 -0
  475. package/dist/internal/chart-annotation-registration.js +1 -0
  476. package/dist/internal/data-descriptors.d.ts +13 -0
  477. package/dist/internal/data-descriptors.js +1 -0
  478. package/dist/internal/default-strings.generated.d.ts +1 -1
  479. package/dist/internal/default-strings.generated.js +2 -2
  480. package/dist/internal/dev-mode-attribute-warning.d.ts +3 -0
  481. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  482. package/dist/internal/element-internals.d.ts +4 -3
  483. package/dist/internal/element-internals.js +1 -1
  484. package/dist/internal/form-associated.js +1 -1
  485. package/dist/internal/highlight-collection.d.ts +2 -0
  486. package/dist/internal/highlight-collection.js +1 -1
  487. package/dist/internal/localization-types.d.ts +1 -1
  488. package/dist/internal/localization.js +2 -2
  489. package/dist/internal/lyra-element.d.ts +10 -1
  490. package/dist/internal/lyra-element.js +2 -1
  491. package/dist/internal/native-control-description.d.ts +7 -0
  492. package/dist/internal/native-control-description.js +1 -0
  493. package/dist/internal/option-selection.js +1 -1
  494. package/dist/internal/overlay-order.d.ts +6 -0
  495. package/dist/internal/overlay-order.js +1 -0
  496. package/dist/internal/overlay-stack.d.ts +1 -1
  497. package/dist/internal/overlay-stack.js +1 -1
  498. package/dist/internal/package-metadata.d.ts +1 -1
  499. package/dist/internal/package-metadata.js +1 -1
  500. package/dist/internal/papaparse-loader.js +1 -1
  501. package/dist/internal/positioner.d.ts +5 -4
  502. package/dist/internal/pseudo-localization.js +1 -1
  503. package/dist/internal/reactive-property-writes.d.ts +1 -0
  504. package/dist/internal/reactive-property-writes.js +1 -0
  505. package/dist/internal/safe-css.js +1 -1
  506. package/dist/internal/step-value.d.ts +6 -0
  507. package/dist/internal/step-value.js +1 -0
  508. package/dist/internal/svg-title.d.ts +3 -0
  509. package/dist/internal/svg-title.js +1 -0
  510. package/dist/internal/text-quote.js +1 -1
  511. package/dist/lyra.d.ts +1 -1
  512. package/dist/svelte.d.ts +1 -1
  513. package/dist/translations/ar.js +2 -2
  514. package/dist/translations/de.js +2 -2
  515. package/dist/translations/es.js +2 -2
  516. package/dist/translations/fa.js +2 -2
  517. package/dist/translations/fr.js +2 -2
  518. package/dist/translations/he.js +2 -2
  519. package/dist/translations/ja.js +2 -2
  520. package/dist/translations/pseudo/ar-XB.js +1 -1
  521. package/dist/translations/pt-BR.js +2 -2
  522. package/dist/translations/ru.js +2 -2
  523. package/dist/translations/zh-CN.js +2 -2
  524. package/dist/vue.d.ts +1 -1
  525. package/llms/components/lr-accordion-item.md +10 -5
  526. package/llms/components/lr-accordion.md +10 -5
  527. package/llms/components/lr-activity-feed.md +6 -5
  528. package/llms/components/lr-agent-run.md +1 -1
  529. package/llms/components/lr-agent-trace.md +3 -0
  530. package/llms/components/lr-agent-workspace.md +3 -2
  531. package/llms/components/lr-animation.md +4 -0
  532. package/llms/components/lr-app-rail-item.md +4 -2
  533. package/llms/components/lr-app-rail.md +4 -2
  534. package/llms/components/lr-attachment-chip.md +8 -3
  535. package/llms/components/lr-audio-visualizer.md +9 -6
  536. package/llms/components/lr-av-player.md +14 -0
  537. package/llms/components/lr-avatar.md +4 -0
  538. package/llms/components/lr-bar-chart.md +2 -2
  539. package/llms/components/lr-box-plot.md +15 -6
  540. package/llms/components/lr-bubble-chart.md +2 -2
  541. package/llms/components/lr-button.md +11 -3
  542. package/llms/components/lr-calendar-viewer.md +4 -0
  543. package/llms/components/lr-calendar.md +15 -4
  544. package/llms/components/lr-carousel.md +5 -0
  545. package/llms/components/lr-chart.md +24 -9
  546. package/llms/components/lr-chat-composer.md +2 -1
  547. package/llms/components/lr-chat-message.md +4 -0
  548. package/llms/components/lr-checkbox.md +3 -0
  549. package/llms/components/lr-chip-group.md +3 -0
  550. package/llms/components/lr-chip.md +3 -0
  551. package/llms/components/lr-chunk-inspector.md +2 -2
  552. package/llms/components/lr-code-block-core.md +20 -8
  553. package/llms/components/lr-code-block.md +17 -14
  554. package/llms/components/lr-code-editor.md +20 -5
  555. package/llms/components/lr-color-picker.md +9 -0
  556. package/llms/components/lr-combobox.md +35 -4
  557. package/llms/components/lr-command-palette.md +4 -0
  558. package/llms/components/lr-commit-card.md +3 -0
  559. package/llms/components/lr-compare-panel.md +7 -0
  560. package/llms/components/lr-condition-builder.md +5 -0
  561. package/llms/components/lr-conversation-item.md +3 -0
  562. package/llms/components/lr-copy-button.md +10 -1
  563. package/llms/components/lr-dashboard-grid.md +5 -0
  564. package/llms/components/lr-data-grid.md +22 -3
  565. package/llms/components/lr-dataset-viewer.md +3 -2
  566. package/llms/components/lr-date-input.md +50 -6
  567. package/llms/components/lr-date-picker.md +51 -7
  568. package/llms/components/lr-details.md +10 -5
  569. package/llms/components/lr-dialog.md +4 -0
  570. package/llms/components/lr-diff-view.md +6 -0
  571. package/llms/components/lr-document-compare.md +6 -2
  572. package/llms/components/lr-document-library.md +4 -0
  573. package/llms/components/lr-document-preview.md +18 -4
  574. package/llms/components/lr-document-viewer.md +14 -4
  575. package/llms/components/lr-docx-viewer.md +6 -0
  576. package/llms/components/lr-doughnut-chart.md +2 -2
  577. package/llms/components/lr-dropdown-item.md +4 -0
  578. package/llms/components/lr-dropdown.md +3 -0
  579. package/llms/components/lr-ebook-viewer.md +12 -3
  580. package/llms/components/lr-email-viewer.md +10 -0
  581. package/llms/components/lr-emoji-picker.md +17 -3
  582. package/llms/components/lr-empty.md +3 -0
  583. package/llms/components/lr-entity-card.md +3 -0
  584. package/llms/components/lr-entity-chip.md +4 -0
  585. package/llms/components/lr-eval-dataset.md +2 -2
  586. package/llms/components/lr-export-button.md +9 -0
  587. package/llms/components/lr-file-input.md +12 -8
  588. package/llms/components/lr-file-tree.md +5 -1
  589. package/llms/components/lr-filter-bar.md +5 -0
  590. package/llms/components/lr-flow-canvas.md +8 -1
  591. package/llms/components/lr-flow-node.md +2 -1
  592. package/llms/components/lr-flow-run-status.md +1 -1
  593. package/llms/components/lr-format-date.md +3 -1
  594. package/llms/components/lr-format-number.md +4 -0
  595. package/llms/components/lr-funnel.md +4 -0
  596. package/llms/components/lr-gauge.md +4 -0
  597. package/llms/components/lr-generation-metrics.md +5 -0
  598. package/llms/components/lr-graph-legend.md +4 -2
  599. package/llms/components/lr-graph-query-builder.md +6 -0
  600. package/llms/components/lr-graph.md +8 -2
  601. package/llms/components/lr-grounding-summary.md +8 -8
  602. package/llms/components/lr-heatmap.md +13 -0
  603. package/llms/components/lr-histogram.md +2 -2
  604. package/llms/components/lr-icon-button.md +7 -0
  605. package/llms/components/lr-image-viewer.md +9 -0
  606. package/llms/components/lr-include.md +5 -0
  607. package/llms/components/lr-ingestion-queue.md +5 -1
  608. package/llms/components/lr-input.md +22 -8
  609. package/llms/components/lr-intersection-observer.md +9 -0
  610. package/llms/components/lr-json-viewer.md +10 -1
  611. package/llms/components/lr-kbd.md +3 -0
  612. package/llms/components/lr-knowledge-base.md +10 -1
  613. package/llms/components/lr-knowledge-graph-explorer.md +7 -0
  614. package/llms/components/lr-known-date.md +7 -0
  615. package/llms/components/lr-line-chart.md +2 -2
  616. package/llms/components/lr-lite-chart.md +29 -9
  617. package/llms/components/lr-live-region.md +3 -0
  618. package/llms/components/lr-locale-picker.md +12 -0
  619. package/llms/components/lr-map.md +23 -5
  620. package/llms/components/lr-markdown-core.md +4 -0
  621. package/llms/components/lr-markdown.md +15 -8
  622. package/llms/components/lr-media-card.md +5 -8
  623. package/llms/components/lr-mention-popover.md +17 -10
  624. package/llms/components/lr-menu-item.md +4 -0
  625. package/llms/components/lr-menu-label.md +4 -3
  626. package/llms/components/lr-menu.md +4 -0
  627. package/llms/components/lr-message-actions.md +13 -3
  628. package/llms/components/lr-message-feedback.md +24 -7
  629. package/llms/components/lr-message-parts.md +6 -3
  630. package/llms/components/lr-model-select.md +13 -2
  631. package/llms/components/lr-multi-split.md +20 -7
  632. package/llms/components/lr-mutation-observer.md +8 -0
  633. package/llms/components/lr-native-time-input.md +10 -0
  634. package/llms/components/lr-node-palette.md +8 -2
  635. package/llms/components/lr-notebook-viewer.md +4 -1
  636. package/llms/components/lr-number-input.md +12 -1
  637. package/llms/components/lr-option.md +35 -4
  638. package/llms/components/lr-otp-input.md +10 -0
  639. package/llms/components/lr-pan-zoom.md +1 -2
  640. package/llms/components/lr-phone-input.md +20 -5
  641. package/llms/components/lr-pie-chart.md +2 -2
  642. package/llms/components/lr-polar-area-chart.md +2 -2
  643. package/llms/components/lr-poll-status.md +4 -0
  644. package/llms/components/lr-popover.md +3 -0
  645. package/llms/components/lr-popup.md +3 -2
  646. package/llms/components/lr-prompt-input.md +7 -3
  647. package/llms/components/lr-prompt-queue.md +6 -0
  648. package/llms/components/lr-prompt-studio.md +7 -0
  649. package/llms/components/lr-provenance-panel.md +3 -0
  650. package/llms/components/lr-push-to-talk.md +8 -0
  651. package/llms/components/lr-qr-code.md +6 -0
  652. package/llms/components/lr-radar-chart.md +2 -2
  653. package/llms/components/lr-radio-button.md +13 -4
  654. package/llms/components/lr-radio-group.md +5 -0
  655. package/llms/components/lr-radio.md +9 -0
  656. package/llms/components/lr-rating.md +8 -0
  657. package/llms/components/lr-relative-time.md +2 -0
  658. package/llms/components/lr-reorder-item.md +6 -0
  659. package/llms/components/lr-reorder-list.md +6 -0
  660. package/llms/components/lr-result-card.md +6 -3
  661. package/llms/components/lr-result-field.md +6 -3
  662. package/llms/components/lr-retrieval-results.md +1 -1
  663. package/llms/components/lr-rubric-form.md +12 -0
  664. package/llms/components/lr-scatter-chart.md +2 -2
  665. package/llms/components/lr-scroller.md +5 -5
  666. package/llms/components/lr-select.md +9 -0
  667. package/llms/components/lr-sequence-playback.md +5 -2
  668. package/llms/components/lr-slider.md +19 -5
  669. package/llms/components/lr-source-picker.md +4 -0
  670. package/llms/components/lr-span-waterfall.md +3 -0
  671. package/llms/components/lr-sparkline.md +4 -0
  672. package/llms/components/lr-split-panel.md +4 -0
  673. package/llms/components/lr-stack-trace.md +3 -0
  674. package/llms/components/lr-stat.md +10 -0
  675. package/llms/components/lr-streaming-text.md +2 -3
  676. package/llms/components/lr-subagent-panel.md +3 -2
  677. package/llms/components/lr-svg-viewer.md +3 -0
  678. package/llms/components/lr-swatch-picker.md +4 -0
  679. package/llms/components/lr-switch.md +6 -0
  680. package/llms/components/lr-tab-group.md +4 -0
  681. package/llms/components/lr-table.md +10 -2
  682. package/llms/components/lr-terminal.md +17 -5
  683. package/llms/components/lr-textarea.md +9 -0
  684. package/llms/components/lr-thinking-panel.md +3 -1
  685. package/llms/components/lr-thread-list.md +26 -4
  686. package/llms/components/lr-time-input.md +3 -0
  687. package/llms/components/lr-time-range.md +5 -0
  688. package/llms/components/lr-timeline-item.md +6 -0
  689. package/llms/components/lr-timeline.md +6 -0
  690. package/llms/components/lr-token-input.md +14 -0
  691. package/llms/components/lr-tool-call-chip.md +7 -5
  692. package/llms/components/lr-tool-param-form.md +6 -2
  693. package/llms/components/lr-tool-result-dialog.md +4 -0
  694. package/llms/components/lr-tool-result-view.md +2 -3
  695. package/llms/components/lr-tool-select-dialog.md +6 -2
  696. package/llms/components/lr-tooltip.md +6 -0
  697. package/llms/components/lr-trace-tree.md +3 -0
  698. package/llms/components/lr-transcript-feed.md +3 -0
  699. package/llms/components/lr-tree-item.md +12 -5
  700. package/llms/components/lr-tree.md +12 -5
  701. package/llms/components/lr-typing-indicator.md +3 -0
  702. package/llms/components/lr-usage-badge.md +4 -0
  703. package/llms/components/lr-video.md +8 -2
  704. package/llms/components/lr-virtual-list.md +5 -3
  705. package/llms/components/lr-voice-picker.md +15 -2
  706. package/llms/components/lr-widget-renderer.md +21 -13
  707. package/llms/components/lr-widget.md +4 -2
  708. package/llms/components/lr-word-cloud.md +4 -0
  709. package/llms/components/lr-xml-viewer.md +9 -2
  710. package/llms/components/lr-zoomable-frame.md +6 -3
  711. package/llms/peers.md +5 -5
  712. package/llms/shared.md +74 -63
  713. package/llms-full.txt +4705 -2954
  714. package/package.json +19 -14
  715. package/vscode-css-data.json +1 -1
  716. package/vscode-html-data.json +1 -1
  717. package/web-types.json +1 -1
  718. package/dist/components/viewers/docx-viewer/fixtures/minimal-docx-fixture.d.ts +0 -1
  719. package/dist/components/viewers/docx-viewer/fixtures/minimal-docx-fixture.js +0 -1
  720. package/dist/components/viewers/ebook-viewer/fixtures/minimal-epub-fixture.d.ts +0 -1
  721. package/dist/components/viewers/ebook-viewer/fixtures/minimal-epub-fixture.js +0 -1
  722. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.d.ts +0 -1
  723. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.js +0 -1
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{font-size:var(--lr-font-size-md-sm);line-height:var(--lr-line-height-1-4);display:block}[part=base]{align-items:flex-start;gap:var(--lr-space-xs);padding:var(--lr-space-s) var(--lr-space-m);border-radius:var(--lr-radius);transition:background-color var(--lr-transition-fast);display:flex;position:relative}[part=active-indicator]{inset-block:0;inset-inline:var(--lr-conversation-item-active-indicator-inset-inline,0 auto);inline-size:var(--lr-conversation-item-active-indicator-width,var(--lr-size-2px));box-sizing:border-box;border-radius:var(--lr-radius-xs);background:var(--lr-conversation-item-active-indicator-color,var(--lr-color-brand));pointer-events:none;z-index:var(--lr-layer-content);position:absolute}:host([compact]) [part=base]{padding:var(--lr-conversation-item-compact-padding,var(--lr-space-xs) var(--lr-space-s));gap:var(--lr-conversation-item-compact-gap,var(--lr-space-2xs))}:host(:hover) [part=base]{background:color-mix(in srgb, var(--lr-color-text) 6%, transparent)}:host(:active) [part=base]{background:color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))}:host([active]) [part=base]{background:var(--lr-conversation-item-active-bg,var(--lr-color-brand-quiet))}:host([active]:active) [part=base]{background:color-mix(in oklab, var(--lr-conversation-item-active-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))}:host([active]) [part=excerpt],:host([active]) [part=timestamp]{color:var(--lr-conversation-item-active-color,var(--lr-color-text))}[part=select-button]{align-items:flex-start;gap:var(--lr-space-s);cursor:pointer;-webkit-tap-highlight-color:transparent;outline:none;flex:auto;min-inline-size:0;display:flex}[part=start]{min-inline-size:var(--lr-size-1-5rem);min-block-size:var(--lr-size-1-5rem);flex:none;justify-content:center;align-items:center;display:inline-flex}[part=start][hidden]{display:none}[part=select-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=content]{gap:var(--lr-size-0-125rem);flex-direction:column;flex:auto;min-inline-size:0;display:flex}:host([compact]) [part=content]{gap:0}[part=label]{text-overflow:ellipsis;white-space:nowrap;font-weight:var(--lr-font-weight-semibold);color:var(--lr-color-text);display:block;overflow:hidden}[part=label-input]{box-sizing:border-box;inline-size:100%;padding:var(--lr-size-0-125rem) var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-brand);border-radius:calc(var(--lr-radius) * .6);background:var(--lr-color-surface);color:var(--lr-color-text);font:inherit;font-weight:var(--lr-font-weight-semibold);display:block}[part=label-input]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=excerpt]{text-overflow:ellipsis;white-space:nowrap;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);display:block;overflow:hidden}[part=excerpt][hidden]{display:none}[part=timestamp]{white-space:nowrap;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-xs);font-variant-numeric:tabular-nums;flex:none;align-self:flex-start}[part=rename-button]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border-radius:calc(var(--lr-radius) * .6);color:var(--lr-color-text-quiet);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background-color var(--lr-transition-fast);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}[part=rename-button]:hover{background:color-mix(in srgb, var(--lr-color-text) 8%, transparent);color:var(--lr-color-text)}[part=rename-button]:active{background:color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active));color:var(--lr-color-text)}[part=rename-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=rename-button] svg{display:block}[part=actions]{align-items:center;gap:var(--lr-space-xs);flex:none;display:flex}[part=actions][hidden]{display:none}@media (prefers-reduced-motion:reduce){[part=base],[part=rename-button]{transition:none!important}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{font-size:var(--lr-font-size-md-sm);line-height:var(--lr-line-height-1-4);display:block}[part=base]{align-items:flex-start;gap:var(--lr-space-xs);padding:var(--lr-space-s) var(--lr-space-m);border-radius:var(--lr-radius);transition:background-color var(--lr-transition-fast);display:flex;position:relative}[part=active-indicator]{inset-block:0;inset-inline:var(--lr-conversation-item-active-indicator-inset-inline,0 auto);inline-size:var(--lr-conversation-item-active-indicator-width,var(--lr-size-2px));box-sizing:border-box;border-radius:var(--lr-radius-xs);background:var(--lr-conversation-item-active-indicator-color,var(--lr-color-brand));pointer-events:none;z-index:var(--lr-layer-content);position:absolute}:host([compact]) [part=base]{padding:var(--lr-conversation-item-compact-padding,var(--lr-space-xs) var(--lr-space-s));gap:var(--lr-conversation-item-compact-gap,var(--lr-space-2xs))}:host(:hover) [part=base]{background:color-mix(in srgb, var(--lr-color-text) 6%, transparent)}:host(:active) [part=base]{background:color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))}:host([active]) [part=base]{background:var(--lr-conversation-item-active-bg,var(--lr-color-brand-quiet))}:host([active]:active) [part=base]{background:color-mix(in oklab, var(--lr-conversation-item-active-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))}:host([active]) [part=excerpt],:host([active]) [part=timestamp]{color:var(--lr-conversation-item-active-color,var(--lr-color-text))}[part=select-button]{align-items:flex-start;gap:var(--lr-space-s);cursor:pointer;-webkit-tap-highlight-color:transparent;outline:none;flex:auto;min-inline-size:0;display:flex}[part=start]{min-inline-size:var(--lr-size-1-5rem);min-block-size:var(--lr-size-1-5rem);flex:none;justify-content:center;align-items:center;display:inline-flex}[part=start][hidden]{display:none}[part=select-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=content]{gap:var(--lr-size-0-125rem);flex-direction:column;flex:auto;min-inline-size:0;display:flex}:host([compact]) [part=content]{gap:0}[part=label]{text-overflow:ellipsis;white-space:nowrap;font-weight:var(--lr-font-weight-semibold);color:var(--lr-color-text);display:block;overflow:hidden}[part=label-input]{box-sizing:border-box;inline-size:100%;padding:var(--lr-size-0-125rem) var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-brand);border-radius:calc(var(--lr-radius) * .6);background:var(--lr-color-surface);color:var(--lr-color-text);font:inherit;font-weight:var(--lr-font-weight-semibold);display:block}[part=label-input]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=excerpt]{text-overflow:ellipsis;white-space:nowrap;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);display:block;overflow:hidden}[part=excerpt][hidden]{display:none}[part=timestamp]{white-space:nowrap;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-xs);font-variant-numeric:tabular-nums;flex:none;align-self:flex-start}[part=rename-button]{font:inherit;min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border-radius:calc(var(--lr-radius) * .6);color:var(--lr-color-text-quiet);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background-color var(--lr-transition-fast);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}[part=rename-button]:hover{background:color-mix(in srgb, var(--lr-color-text) 8%, transparent);color:var(--lr-color-text)}[part=rename-button]:active{background:color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active));color:var(--lr-color-text)}[part=rename-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=rename-button] svg{display:block}[part=actions]{align-items:center;gap:var(--lr-space-xs);flex:none;display:flex}[part=actions][hidden]{display:none}@media (prefers-reduced-motion:reduce){[part=base],[part=rename-button]{transition:none!important}}`;export{styles};
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{vertical-align:middle;min-inline-size:0;max-inline-size:100%;display:inline-flex}[part=base]{max-inline-size:100%;font-size:var(--lr-font-size-sm);line-height:var(--lr-line-height-snug);color:var(--lr-color-text-quiet);flex-wrap:wrap;align-items:center;display:inline-flex}[part=elapsed]{color:var(--lr-color-text);font-variant-numeric:tabular-nums;white-space:nowrap}[part=tokens],[part=throughput]{font-variant-numeric:tabular-nums;overflow-wrap:anywhere;min-inline-size:0}[part=tokens]:before,[part=throughput]:before{content:"·";margin-inline:var(--lr-size-0-4em);opacity:.6}[part=stop-button]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background-color var(--lr-transition-fast), border-color var(--lr-transition-fast), color var(--lr-transition-fast);border-radius:50%;flex:none;justify-content:center;align-items:center;margin-inline-start:var(--lr-space-s);padding:0;display:inline-flex}[part=stop-button]:hover{border-color:var(--lr-color-brand);color:var(--lr-color-brand)}[part=stop-button]:active{border-color:var(--lr-color-brand);color:var(--lr-color-brand);background:color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=stop-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=stop-button] svg{display:block}@media (prefers-reduced-motion:reduce){[part=stop-button]{transition:none!important}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{vertical-align:middle;min-inline-size:0;max-inline-size:100%;font-size:var(--lr-font-size-sm);display:inline-flex}[part=base]{max-inline-size:100%;font:inherit;line-height:var(--lr-line-height-snug);color:var(--lr-color-text-quiet);flex-wrap:wrap;align-items:center;display:inline-flex}[part=elapsed]{color:var(--lr-color-text);font-variant-numeric:tabular-nums;white-space:nowrap}[part=tokens],[part=throughput]{font-variant-numeric:tabular-nums;overflow-wrap:anywhere;min-inline-size:0}[part=tokens]:before,[part=throughput]:before{content:"·";margin-inline:var(--lr-size-0-4em);opacity:.6}[part=stop-button]{font:inherit;min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background-color var(--lr-transition-fast), border-color var(--lr-transition-fast), color var(--lr-transition-fast);border-radius:50%;flex:none;justify-content:center;align-items:center;margin-inline-start:var(--lr-space-s);padding:0;display:inline-flex}[part=stop-button]:hover{border-color:var(--lr-color-brand);color:var(--lr-color-brand)}[part=stop-button]:active{border-color:var(--lr-color-brand);color:var(--lr-color-brand);background:color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=stop-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=stop-button] svg{display:block}@media (prefers-reduced-motion:reduce){[part=stop-button]{transition:none!important}}`;export{styles};
@@ -3,10 +3,10 @@
3
3
  export interface KatexApi{renderToString(tex:string,options?:Record<string,unknown>):string;}
4
4
  /**
5
5
  * Loads the optional peer dependency `katex`, used by `<lr-markdown>`'s `math` property to
6
- * render `$...$`/`$$...$$` TeX as MathML. Resolves `null` (with a one-time `console.warn`) if the
7
- * peer isn't installed -- rendering falls back to the literal, unparsed TeX source in that case,
8
- * a fully supported default rather than a degraded mode. Mirrors `dompurify-loader.ts`'s single-
9
- * optional-peer shape.
6
+ * render `$...$`/`$$...$$` TeX as MathML. Resolves `null` with a one-time development diagnostic
7
+ * if the peer isn't installed -- rendering falls back to the literal, unparsed TeX source in that
8
+ * case, a fully supported default rather than a degraded mode. Mirrors `dompurify-loader.ts`'s
9
+ * single-optional-peer shape.
10
10
  */
11
11
  export declare function loadKatex(importKatex?:()=>Promise<unknown>):Promise<KatexApi|null>;
12
12
  /**
@@ -1 +1 @@
1
- import{resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";function isKatexApi(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&"renderToString"in value&&typeof value.renderToString=="function"}let cached,cacheGeneration;const KATEX_CACHE_GENERATION=Symbol.for("@aceshooting/lyra-ui/markdown-katex-cache-generation");async function loadKatex(importKatex=()=>import("katex")){try{return resolveOptionalPeerCapability(await importKatex(),isKatexApi)}catch(error){return console.warn("<lr-markdown> needs the optional peer dependency `katex` to render math (the `math` property is set) \u2014 install it with `pnpm add katex`:",error),null}}function getKatex(importKatex){const generation=Reflect.get(globalThis,KATEX_CACHE_GENERATION);return generation!==cacheGeneration&&(cached=void 0,cacheGeneration=generation),cached||(cached=loadKatex(importKatex)),cached}export{getKatex,loadKatex};
1
+ import{resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const KATEX_WARNING_KEY="lyra-markdown-katex-unavailable",KATEX_WARNING="<lr-markdown>/<lr-markdown-core>: Math rendering is unavailable because the optional KaTeX peer could not load. TeX is rendered as literal text.";function isKatexApi(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&"renderToString"in value&&typeof value.renderToString=="function"}let cached,cacheGeneration;const KATEX_CACHE_GENERATION=Symbol.for("@aceshooting/lyra-ui/markdown-katex-cache-generation");async function loadKatex(importKatex=()=>import("katex")){try{return resolveOptionalPeerCapability(await importKatex(),isKatexApi)}catch{return devWarnOnce(KATEX_WARNING_KEY,KATEX_WARNING),null}}function getKatex(importKatex){const generation=Reflect.get(globalThis,KATEX_CACHE_GENERATION);return generation!==cacheGeneration&&(cached=void 0,cacheGeneration=generation),cached||(cached=loadKatex(importKatex)),cached}export{getKatex,loadKatex};
@@ -1 +1 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import"lit";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}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,getCachedHighlight,hitTestHighlightRanges,HIGHLIGHT_CACHE_MAX,internalLinkHrefFrom,markdownHighlightConfigChanged,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,MarkdownOwnedAnimationFrameController,MarkdownParserController,normalizeMarkdownHtmlMode,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight}from"./markdown-shared.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound}from"../../../internal/default-strings.generated.js";class LyraMarkdownRuntimeElement extends LyraElement{static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound}}}function createMarkdownVariantContext(tag,katexState){return{tag,connectedInstances:new Set,sharedParser:new MarkdownParserController,katexState}}class MarkdownRuntimeBase extends DocumentAnchorTarget(LyraMarkdownRuntimeElement){constructor(){super(),this.anchorKinds=["fragment","text-quote"],this.renderedHtml=null,this.isDarkTheme=!1,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 Set,this.handleKatexResolved=()=>{this.isConnected&&this.renderMarkdown()},this.onContentClick=event=>{const highlightId=hitTestHighlightRanges(this.resolvedHighlightRanges,event.clientX,event.clientY);if(highlightId){this.emit("lr-highlight-activate",{highlightId});return}const href=internalLinkHrefFrom(event,this.internalLinkPrefix);href!==null&&(event.preventDefault(),this.emit("lr-link-click",{href}))},new ThemeWatcher(this,()=>this.refreshTheme())}get marked(){return this.parser.get(this.deps?.marked)}refreshTheme(){this.isDarkTheme=resolveMarkdownDarkTheme(this)}connectedCallback(){super.connectedCallback(),this.markdownVariant.connectedInstances.add(this),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}adoptedCallback(){super.adoptedCallback(),this.cancelStreamingRender()}firstUpdated(changed){super.firstUpdated(changed);const contentRoot=this.renderRoot.querySelector('[part="content"]');contentRoot&&this.bindTextSelection(contentRoot)}willUpdate(changed){if(super.willUpdate(changed),changed.has("math")&&(this.mathFailureReported=!1),!this.deps||!markdownNeedsReparse(changed))return;if((changed.has("content")||changed.has("streaming")||markdownHighlightConfigChanged(changed))&&this.highlightToken++,markdownHighlightConfigChanged(changed)&&(this.failedHighlightKeys.clear(),markdownLanguageSetChanged(changed)&&this.highlightCache.clear()),this.streaming){this.scheduleStreamingRender();return}this.cancelStreamingRender(),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.renderMarkdown();return}const handle=this.streamingRenderFrames.request(view,()=>{this.streamingRenderRaf=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.renderMarkdown()});handle===void 0?this.isConnected&&this.renderMarkdown():this.streamingRenderFrames.handle===handle&&(this.streamingRenderRaf=handle)}async getUpdateComplete(){const complete=await super.getUpdateComplete(),settled=this.streamingRenderFrames.settled;return settled?(await settled,super.getUpdateComplete()):complete}updated(changed){super.updated(changed),applyMarkdownAriaBusy(this,!this.deps||this.streaming);const locale=this.effectiveLocale,localeChanged=this.textQuoteLocale!==void 0&&this.textQuoteLocale!==locale;this.textQuoteLocale=locale,localeChanged&&(this.textQuoteIndexCache=void 0),changed.has("renderedHtml")&&(this.textQuoteIndexCache=void 0),(changed.has("renderedHtml")||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights()}renderMarkdown(){if(this.streaming){this.renderedHtml=null,this.headingTree=[];return}const deps=this.deps;if(!deps)return;const variant=this.markdownVariant,outcome=renderMarkdownDocument({tag:variant.tag,deps,htmlMode:normalizeMarkdownHtmlMode(this.htmlMode),math:this.math,parse:(marked,pendingKeys,headingTreeOut)=>this.parseMarkdown(marked,pendingKeys,headingTreeOut),onParsed:()=>this.maybeLoadKatex(),isKatexConfirmedMissing:()=>variant.katexState.isConfirmedMissing()});if(outcome.headingTree&&(this.headingTree=outcome.headingTree),outcome.status==="fallback"){this.renderedHtml=null,this.emit("lr-render-error",{error:outcome.error});return}this.renderedHtml=outcome.html,outcome.mathFailed&&this.reportMathFailure(),outcome.pendingKeys.length>0&&this.highlightCode&&!this.streaming&&this.highlightPending(outcome.pendingKeys)}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.has(key));if(work.length===0)return;for(const{key}of work)this.inFlightHighlightKeys.add(key);const token=this.highlightToken,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(error){console.warn("<lr-markdown>/<lr-markdown-core> failed to tokenize a pending highlight:",error)}finally{for(const{key}of work)this.inFlightHighlightKeys.delete(key)}this.isConnected&&this.renderMarkdown()}parseMarkdown(marked,pendingKeys,headingTreeOut){const variant=this.markdownVariant;return parseMarkdownDocument({marked,content:normalizeMarkdownLeadingTabs(this.content,finiteInteger(this.tabSize,4,1,32)),markedConfigurations:[variant.sharedParser.get(marked)?.defaults,this.marked?.defaults],gfm:this.gfm,linkTarget:this.linkTarget,headingOffset:finiteInteger(this.headingOffset,0,0,6),escapeHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="escape",trustedHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="trusted",highlightCodeOption:this.highlightCode&&!this.streaming,getCachedHighlight:key=>this.getCachedHighlight(key),failedHighlightKeys:this.failedHighlightKeys,headingAnchorsOption:this.headingAnchors,mathOption:this.math,cachedKatex:this.math?variant.katexState.getIfLoaded():null,pendingKeys,headingTreeOut})}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 scope=scopeFromElement(root);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;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(){return renderMarkdownContent({content:this.content,sanitized:normalizeMarkdownHtmlMode(this.htmlMode)==="sanitize",renderedHtml:this.renderedHtml,hostAriaLabel:this.getAttribute("aria-label"),isDarkTheme:this.isDarkTheme,onClick:this.onContentClick,liveRegion:this.renderAnchorLiveRegion()})}}__decorate([state()],MarkdownRuntimeBase.prototype,"renderedHtml",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"isDarkTheme",void 0);export{MarkdownRuntimeBase,createMarkdownVariantContext};
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import"lit";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}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{addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,getCachedHighlight,hitTestHighlightRanges,HIGHLIGHT_CACHE_MAX,internalLinkHrefFrom,markdownAnchorFromTarget,markdownHighlightConfigChanged,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,MarkdownOwnedAnimationFrameController,MarkdownParserController,normalizeMarkdownHtmlMode,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight}from"./markdown-shared.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound}from"../../../internal/default-strings.generated.js";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}}}function createMarkdownVariantContext(tag,katexState){return{tag,connectedInstances:new Set,sharedParser:new MarkdownParserController,katexState}}class MarkdownRuntimeBase extends DocumentAnchorTarget(LyraMarkdownRuntimeElement){constructor(){super(),this.anchorKinds=["fragment","text-quote"],this.renderedHtml=null,this.isDarkTheme=!1,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 Set,this.handleKatexResolved=()=>{this.isConnected&&this.renderMarkdown()},this.onContentClick=event=>{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-click",{href})},new ThemeWatcher(this,()=>this.refreshTheme())}get marked(){return this.parser.get(this.deps?.marked)}refreshTheme(){this.isDarkTheme=resolveMarkdownDarkTheme(this)}connectedCallback(){super.connectedCallback(),this.markdownVariant.connectedInstances.add(this),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}adoptedCallback(){super.adoptedCallback(),this.cancelStreamingRender()}firstUpdated(changed){super.firstUpdated(changed);const contentRoot=this.renderRoot.querySelector('[part="content"]');contentRoot&&this.bindTextSelection(contentRoot)}willUpdate(changed){if(super.willUpdate(changed),changed.has("math")&&(this.mathFailureReported=!1),!this.deps||!markdownNeedsReparse(changed))return;if((changed.has("content")||changed.has("streaming")||markdownHighlightConfigChanged(changed))&&this.highlightToken++,markdownHighlightConfigChanged(changed)&&(this.failedHighlightKeys.clear(),markdownLanguageSetChanged(changed)&&this.highlightCache.clear()),this.streaming){this.scheduleStreamingRender();return}this.cancelStreamingRender(),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.renderMarkdown();return}const handle=this.streamingRenderFrames.request(view,()=>{this.streamingRenderRaf=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.renderMarkdown()});handle===void 0?this.isConnected&&this.renderMarkdown():this.streamingRenderFrames.handle===handle&&(this.streamingRenderRaf=handle)}async getUpdateComplete(){const complete=await super.getUpdateComplete(),settled=this.streamingRenderFrames.settled;return settled?(await settled,super.getUpdateComplete()):complete}updated(changed){super.updated(changed),applyMarkdownAriaBusy(this,!this.deps||this.streaming);const locale=this.effectiveLocale,localeChanged=this.textQuoteLocale!==void 0&&this.textQuoteLocale!==locale;this.textQuoteLocale=locale,localeChanged&&(this.textQuoteIndexCache=void 0),changed.has("renderedHtml")&&(this.textQuoteIndexCache=void 0),(changed.has("renderedHtml")||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights()}renderMarkdown(){if(this.streaming){this.renderedHtml=null,this.headingTree=[];return}const deps=this.deps;if(!deps)return;const variant=this.markdownVariant,outcome=renderMarkdownDocument({tag:variant.tag,deps,htmlMode:normalizeMarkdownHtmlMode(this.htmlMode),math:this.math,parse:(marked,pendingKeys,headingTreeOut)=>this.parseMarkdown(marked,pendingKeys,headingTreeOut),onParsed:()=>this.maybeLoadKatex(),isKatexConfirmedMissing:()=>variant.katexState.isConfirmedMissing()});if(outcome.headingTree&&(this.headingTree=outcome.headingTree),outcome.status==="fallback"){this.renderedHtml=null,this.emit("lr-render-error",{error:outcome.error});return}this.renderedHtml=outcome.html,outcome.mathFailed&&this.reportMathFailure(),outcome.pendingKeys.length>0&&this.highlightCode&&!this.streaming&&this.highlightPending(outcome.pendingKeys)}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.has(key));if(work.length===0)return;for(const{key}of work)this.inFlightHighlightKeys.add(key);const token=this.highlightToken,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{devWarnOnce(HIGHLIGHT_FAILURE_WARNING_KEY,HIGHLIGHT_FAILURE_WARNING)}finally{for(const{key}of work)this.inFlightHighlightKeys.delete(key)}this.isConnected&&this.renderMarkdown()}parseMarkdown(marked,pendingKeys,headingTreeOut){const variant=this.markdownVariant;return parseMarkdownDocument({marked,content:normalizeMarkdownLeadingTabs(this.content??"",finiteInteger(this.tabSize,4,1,32)),markedConfigurations:[variant.sharedParser.get(marked)?.defaults,this.marked?.defaults],gfm:this.gfm,linkTarget:this.linkTarget,headingOffset:finiteInteger(this.headingOffset,0,0,6),escapeHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="escape",trustedHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="trusted",highlightCodeOption:this.highlightCode&&!this.streaming,getCachedHighlight:key=>this.getCachedHighlight(key),failedHighlightKeys:this.failedHighlightKeys,headingAnchorsOption:this.headingAnchors,mathOption:this.math,cachedKatex:this.math?variant.katexState.getIfLoaded():null,pendingKeys,headingTreeOut})}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 scope=scopeFromElement(root);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;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(){return renderMarkdownContent({content:this.content??"",sanitized:normalizeMarkdownHtmlMode(this.htmlMode)==="sanitize",renderedHtml:this.renderedHtml,hostAriaLabel:this.getAttribute("aria-label"),isDarkTheme:this.isDarkTheme,onClick:this.onContentClick,liveRegion:this.renderAnchorLiveRegion()})}}__decorate([state()],MarkdownRuntimeBase.prototype,"renderedHtml",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"isDarkTheme",void 0);export{MarkdownRuntimeBase,createMarkdownVariantContext};
@@ -145,7 +145,7 @@ export declare class LyraMarkdownCore extends MarkdownRuntimeBase{static styles:
145
145
  static getMarked():Marked;
146
146
  /** Re-renders every connected `<lr-markdown-core>` instance after shared parser changes. */
147
147
  static updateAll():void;
148
- /** The Markdown source to render. */
148
+ /** The Markdown source to render. Removing the attribute clears the document and its tab stop. */
149
149
  content:string;
150
150
  /** Tab-stop width used to expand tabs in leading indentation before parsing. Finite values are
151
151
  * truncated and clamped to `[1, 32]`; non-finite values fall back to `4`. This is separate from
@@ -26,7 +26,7 @@ export interface MarkdownDeps{marked:MarkedModule|undefined;DOMPurify:HtmlSaniti
26
26
  * set `html-mode="trusted"` and doesn't need `dompurify` at all — degrades to
27
27
  * "that one half is missing" rather than failing outright. Exported (in
28
28
  * addition to the cached `loadMarkdownDeps()` below) so both failure paths —
29
- * and the real caught error each one logs — are directly testable without
29
+ * and their development diagnostics — are directly testable without
30
30
  * needing to actually uninstall either package.
31
31
  */
32
32
  export declare function loadMarkdownAndSanitizer(importMarked?:()=>Promise<unknown>,importDompurify?:()=>Promise<unknown>):Promise<MarkdownDeps>;
@@ -1 +1 @@
1
- import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";function isLyraMarkedParser(value){return typeof value=="object"&&value!==null&&"defaults"in value&&typeof value.defaults=="object"&&value.defaults!==null&&"use"in value&&typeof value.use=="function"&&"parse"in value&&typeof value.parse=="function"}function isMarkedModule(value){if(typeof value!="object"&&typeof value!="function"||value===null||!("Marked"in value))return!1;try{const Marked=value.Marked;return typeof Marked!="function"?!1:isLyraMarkedParser(new Marked)}catch{return!1}}let deps,resolvedDeps;async function loadMarkdownAndSanitizer(importMarked=()=>import("marked"),importDompurify=()=>import("dompurify")){let marked;try{marked=resolveOptionalPeerCapability(await importMarked(),isMarkedModule)??void 0}catch(err){console.warn("<lr-markdown> needs the optional peer dependency `marked` to parse Markdown \u2014 install it with `pnpm add marked`:",err)}let DOMPurify;try{DOMPurify=resolveOptionalPeerCapability(await importDompurify(),isHtmlSanitizer)??void 0}catch(err){console.warn('<lr-markdown> needs the optional peer dependency `dompurify` to sanitize rendered HTML \u2014 install it with `pnpm add dompurify`. Until then, content only renders when `html-mode="trusted"` is explicitly set:',err)}return{marked,DOMPurify}}function loadMarkdownDeps(){return deps||(deps=loadMarkdownAndSanitizer().then(resolved=>(resolvedDeps=resolved,resolved))),deps}function getMarkdownDepsIfLoaded(){return resolvedDeps}export{getMarkdownDepsIfLoaded,loadMarkdownAndSanitizer,loadMarkdownDeps};
1
+ import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const MARKDOWN_PARSER_WARNING_KEY="lyra-markdown-marked-unavailable",MARKDOWN_PARSER_WARNING="<lr-markdown>/<lr-markdown-core>: Markdown parsing is unavailable because the optional marked peer could not load. Content is rendered as plain text.",MARKDOWN_SANITIZER_WARNING_KEY="lyra-markdown-dompurify-unavailable",MARKDOWN_SANITIZER_WARNING="<lr-markdown>/<lr-markdown-core>: HTML sanitization is unavailable because the optional DOMPurify peer could not load. Content is rendered as plain text unless trusted HTML is explicitly selected.";function warnMarkdownParserUnavailable(){devWarnOnce(MARKDOWN_PARSER_WARNING_KEY,MARKDOWN_PARSER_WARNING)}function warnMarkdownSanitizerUnavailable(){devWarnOnce(MARKDOWN_SANITIZER_WARNING_KEY,MARKDOWN_SANITIZER_WARNING)}function isLyraMarkedParser(value){return typeof value=="object"&&value!==null&&"defaults"in value&&typeof value.defaults=="object"&&value.defaults!==null&&"use"in value&&typeof value.use=="function"&&"parse"in value&&typeof value.parse=="function"}function isMarkedModule(value){if(typeof value!="object"&&typeof value!="function"||value===null||!("Marked"in value))return!1;try{const Marked=value.Marked;return typeof Marked!="function"?!1:isLyraMarkedParser(new Marked)}catch{return!1}}let deps,resolvedDeps;async function loadMarkdownAndSanitizer(importMarked=()=>import("marked"),importDompurify=()=>import("dompurify")){let marked;try{marked=resolveOptionalPeerCapability(await importMarked(),isMarkedModule)??void 0}catch{warnMarkdownParserUnavailable()}let DOMPurify;try{DOMPurify=resolveOptionalPeerCapability(await importDompurify(),isHtmlSanitizer)??void 0}catch{warnMarkdownSanitizerUnavailable()}return{marked,DOMPurify}}function loadMarkdownDeps(){return deps||(deps=loadMarkdownAndSanitizer().then(resolved=>(resolvedDeps=resolved,resolved))),deps}function getMarkdownDepsIfLoaded(){return resolvedDeps}export{getMarkdownDepsIfLoaded,loadMarkdownAndSanitizer,loadMarkdownDeps};
@@ -172,7 +172,8 @@ onParsed:()=>void;isKatexConfirmedMissing:()=>boolean;}
172
172
  * event, so this stays a pure function of its inputs.
173
173
  *
174
174
  * Rendering never ships unsanitized or broken markup silently: a missing/throwing `marked`, or a
175
- * missing `dompurify` in `sanitize` mode both fall back to plain text plus `lr-render-error`.
175
+ * missing/throwing `dompurify` in `sanitize` mode both fall back to plain text plus
176
+ * `lr-render-error`.
176
177
  */
177
178
  export declare function renderMarkdownDocument(options:RenderMarkdownOptions):MarkdownRenderOutcome;
178
179
  /** The `lr-render-error` payload for a permanently-missing `katex` peer while `math` is set. */
@@ -215,6 +216,10 @@ locale?:string;}):ResolvedHighlightRange[];
215
216
  * events).
216
217
  */
217
218
  export declare function hitTestHighlightRanges(ranges:readonly ResolvedHighlightRange[],x:number,y:number):string|null;
219
+ /** Returns a genuine HTML anchor from a composed-path entry, rejecting hostile and structural
220
+ * lookalikes without relying on ambient-realm `instanceof` checks. The captured native calls
221
+ * brand-check foreign and adopted elements without trusting candidate-owned realm metadata. */
222
+ export declare function markdownAnchorFromTarget(target:unknown):HTMLAnchorElement|undefined;
218
223
  /** The `href` of the rendered link a click landed on, when `internal-link-prefix` claims it --
219
224
  * `null` for every other click, including one on an ordinary external link.
220
225
  *
@@ -1,8 +1,9 @@
1
- import{html,nothing}from"lit";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{Slugger}from"../../../internal/slugger.js";import{finiteInteger}from"../../../internal/numbers.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{createTextQuoteIndex,rangeFromTextQuoteMatch,rangesFromTextQuoteMatches,scopeFromElement,TEXT_QUOTE_LIMITS,TEXT_SELECTION_RECT_LIMIT}from"../../../internal/text-quote.js";import{prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{safeLinkHref,safeMediaSrc}from"../../../internal/safe-url.js";import{supportsCustomHighlights}from"../../../internal/text-highlights.js";import{normalizeShikiLanguage,SHIKI_THEMES}from"../code-block/shiki-types.js";import{resolveIsDarkTheme,watchDarkTheme}from"../code-block/shiki-dark-theme.js";import{loadMarkdownDeps,getMarkdownDepsIfLoaded}from"./markdown-loader.js";import{getKatex}from"./katex-loader.js";function createMarkdownParser(marked){if(!(!marked||typeof marked!="object"&&typeof marked!="function"||typeof marked.Marked!="function"))return new marked.Marked}class MarkdownParserController{get(marked){if(marked)return this.module!==marked&&(this.module=marked,this.parser=createMarkdownParser(marked)),this.parser}}function normalizeMarkdownLeadingTabs(content,tabSize){const width=finiteInteger(tabSize,4,1,32);return content.replace(/^[\t ]+/gm,indentation=>{let column=0,normalized="";for(const character of indentation){const spaces=character===" "?width-column%width:1;normalized+=" ".repeat(spaces),column+=spaces}return normalized})}class MarkdownOwnedAnimationFrameController{get handle(){return this.pending?.handle}get settled(){return this.pending?.settled}request(owner,callback){if(this.pending)return this.pending.handle;let resolveFrame;const settled=new Promise(resolve=>{resolveFrame=resolve}),pending={owner,settled,resolve:resolveFrame};this.pending=pending;try{pending.handle=owner.requestAnimationFrame(()=>{this.pending===pending&&(this.pending=void 0,pending.resolve(),callback())})}catch{this.pending===pending&&(this.pending=void 0),pending.resolve();return}return pending.handle}cancel(){const pending=this.pending;if(!pending)return!1;this.pending=void 0;try{pending.handle!==void 0&&pending.owner.cancelAnimationFrame(pending.handle)}catch{}finally{pending.resolve()}return!0}}const HTML_ESCAPES={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function escapeHtml(text){return text.replace(/[&<>"']/g,ch=>HTML_ESCAPES[ch]??ch)}function cleanHref(href){try{return encodeURI(href).replace(/%25/g,"%")}catch{return null}}const HIGHLIGHT_CACHE_MAX=100,HIGHLIGHT_CACHE_MAX_BYTES=2*1024*1024,HIGHLIGHT_CACHE_ENTRY_MAX_BYTES=512*1024,FAILED_HIGHLIGHT_MAX=256;function markdownHighlightKey(language,code){let a=2166136261,b=2654435769;const input=`${language}\0${code}`;for(let index=0;index<input.length;index++){const unit=input.charCodeAt(index);a=Math.imul(a^unit,16777619)>>>0,b=Math.imul(b^unit,2246822507)>>>0}return`${language}:${code.length}:${a.toString(36)}:${b.toString(36)}`}function addFailedHighlightKey(failed,key){if(!failed.has(key)){if(failed.size>=FAILED_HIGHLIGHT_MAX){const oldest=failed.values().next().value;oldest!==void 0&&failed.delete(oldest)}failed.add(key)}}async function processPendingHighlights(pending,worker,concurrency=4){const unique=[...new Map(pending.map(item=>[item.key,item])).values()];let next=0;const run=async()=>{for(;next<unique.length;){const item=unique[next++];item&&await worker(item)}};await Promise.all(Array.from({length:Math.min(concurrency,unique.length)},()=>run()))}function getCachedHighlight(cache,key){const cached=cache.get(key);return cached!==void 0&&(cache.delete(key),cache.set(key,cached)),cached}function setCachedHighlight(cache,key,html2,max=HIGHLIGHT_CACHE_MAX,maxBytes=HIGHLIGHT_CACHE_MAX_BYTES){const entryBytes=(key.length+html2.length)*2;if(entryBytes>HIGHLIGHT_CACHE_ENTRY_MAX_BYTES||entryBytes>maxBytes)return!1;cache.has(key)&&cache.delete(key);let retainedBytes=0;for(const[cachedKey,cachedHtml]of cache)retainedBytes+=(cachedKey.length+cachedHtml.length)*2;for(;cache.size>=max||retainedBytes+entryBytes>maxBytes;){const oldest=cache.keys().next().value;if(oldest===void 0)break;const oldestHtml=cache.get(oldest)??"";retainedBytes-=(oldest.length+oldestHtml.length)*2,cache.delete(oldest)}return cache.set(key,html2),!0}const MATH_INLINE_RE=/^\$((?:\\\$|[^$\s])(?:\\\$|[^$])*?)\$(?!\$)/;function mathExtension(renderMath){return{name:"math",level:"inline",start(src){const index=src.indexOf("$");return index===-1?void 0:index},tokenizer(src){if(src.startsWith("$$")){const close=src.indexOf("$$",2);if(close>2){const raw=src.slice(0,close+2),tex=src.slice(2,close).trim();if(tex)return{type:"math",raw,tex,display:!0}}}const inline=MATH_INLINE_RE.exec(src);if(inline)return{type:"math",raw:inline[0],tex:inline[1].replace(/\\\$/g,"$").trim(),display:!1}},renderer(token){return renderMath(token)}}}function parseMarkdownDocument(options){const{marked,content,gfm,linkTarget,escapeHtmlOption,trustedHtmlOption,highlightCodeOption,getCachedHighlight:getCached,failedHighlightKeys,headingAnchorsOption,mathOption,cachedKatex,pendingKeys,headingTreeOut}=options,headingOffset=finiteInteger(options.headingOffset,0),slugger=new Slugger,activeHighlightKeys=new Set,pendingHighlightKeys=new Set(options.pendingKeys.map(({key})=>key));let hadMathFallback=!1;const instance=new marked.Marked;mathOption&&instance.use({extensions:[mathExtension(token=>{if(!cachedKatex)return hadMathFallback=!0,escapeHtml(token.display?`$$${token.tex}$$`:`$${token.tex}$`);try{const mathml=cachedKatex.renderToString(token.tex,{output:"mathml",throwOnError:!1});return`<span part='math' data-display='${token.display?"block":"inline"}'>${mathml}</span>`}catch{return escapeHtml(token.display?`$$${token.tex}$$`:`$${token.tex}$`)}})]}),instance.use({renderer:{heading(token){const depth=Math.min(6,Math.max(1,token.depth+headingOffset)),label=this.parser.parseInline(token.tokens,this.parser.textRenderer),slug=slugger.slug(label);headingTreeOut.push({id:slug,label,level:depth});const idAttr=headingAnchorsOption&&slug?` id='${escapeHtml(slug)}'`:"";return`<h${depth} part='heading'${idAttr}>${this.parser.parseInline(token.tokens)}</h${depth}>
1
+ import{html,nothing}from"lit";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{Slugger}from"../../../internal/slugger.js";import{finiteInteger}from"../../../internal/numbers.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{createTextQuoteIndex,rangeFromTextQuoteMatch,rangesFromTextQuoteMatches,scopeFromElement,TEXT_QUOTE_LIMITS,TEXT_SELECTION_RECT_LIMIT}from"../../../internal/text-quote.js";import{prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{safeLinkHref,safeMediaSrc}from"../../../internal/safe-url.js";import{supportsCustomHighlights}from"../../../internal/text-highlights.js";import{normalizeShikiLanguage,SHIKI_THEMES}from"../code-block/shiki-types.js";import{resolveIsDarkTheme,watchDarkTheme}from"../code-block/shiki-dark-theme.js";import{loadMarkdownDeps,getMarkdownDepsIfLoaded}from"./markdown-loader.js";import{getKatex}from"./katex-loader.js";function createMarkdownParser(marked){if(!(!marked||typeof marked!="object"&&typeof marked!="function"||typeof marked.Marked!="function"))return new marked.Marked}class MarkdownParserController{get(marked){if(marked)return this.module!==marked&&(this.module=marked,this.parser=createMarkdownParser(marked)),this.parser}}function normalizeMarkdownLeadingTabs(content,tabSize){const width=finiteInteger(tabSize,4,1,32);return content.replace(/^[\t ]+/gm,indentation=>{let column=0,normalized="";for(const character of indentation){const spaces=character===" "?width-column%width:1;normalized+=" ".repeat(spaces),column+=spaces}return normalized})}class MarkdownOwnedAnimationFrameController{get handle(){return this.pending?.handle}get settled(){return this.pending?.settled}request(owner,callback){if(this.pending)return this.pending.handle;let resolveFrame;const settled=new Promise(resolve=>{resolveFrame=resolve}),pending={owner,settled,resolve:resolveFrame};this.pending=pending;try{pending.handle=owner.requestAnimationFrame(()=>{this.pending===pending&&(this.pending=void 0,pending.resolve(),callback())})}catch{this.pending===pending&&(this.pending=void 0),pending.resolve();return}return pending.handle}cancel(){const pending=this.pending;if(!pending)return!1;this.pending=void 0;try{pending.handle!==void 0&&pending.owner.cancelAnimationFrame(pending.handle)}catch{}finally{pending.resolve()}return!0}}const HTML_ESCAPES={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function escapeHtml(text){return text.replace(/[&<>"']/g,ch=>HTML_ESCAPES[ch]??ch)}function cleanHref(href){try{return encodeURI(href).replace(/%25/g,"%")}catch{return null}}const HIGHLIGHT_CACHE_MAX=100,HIGHLIGHT_CACHE_MAX_BYTES=2*1024*1024,HIGHLIGHT_CACHE_ENTRY_MAX_BYTES=512*1024,FAILED_HIGHLIGHT_MAX=256;function markdownHighlightKey(language,code){let a=2166136261,b=2654435769;const input=`${language}\0${code}`;for(let index=0;index<input.length;index++){const unit=input.charCodeAt(index);a=Math.imul(a^unit,16777619)>>>0,b=Math.imul(b^unit,2246822507)>>>0}return`${language}:${code.length}:${a.toString(36)}:${b.toString(36)}`}function addFailedHighlightKey(failed,key){if(!failed.has(key)){if(failed.size>=FAILED_HIGHLIGHT_MAX){const oldest=failed.values().next().value;oldest!==void 0&&failed.delete(oldest)}failed.add(key)}}async function processPendingHighlights(pending,worker,concurrency=4){const unique=[...new Map(pending.map(item=>[item.key,item])).values()];let next=0;const run=async()=>{for(;next<unique.length;){const item=unique[next++];item&&await worker(item)}};await Promise.all(Array.from({length:Math.min(concurrency,unique.length)},()=>run()))}function getCachedHighlight(cache,key){const cached=cache.get(key);return cached!==void 0&&(cache.delete(key),cache.set(key,cached)),cached}function setCachedHighlight(cache,key,html2,max=HIGHLIGHT_CACHE_MAX,maxBytes=HIGHLIGHT_CACHE_MAX_BYTES){const entryBytes=(key.length+html2.length)*2;if(entryBytes>HIGHLIGHT_CACHE_ENTRY_MAX_BYTES||entryBytes>maxBytes)return!1;cache.has(key)&&cache.delete(key);let retainedBytes=0;for(const[cachedKey,cachedHtml]of cache)retainedBytes+=(cachedKey.length+cachedHtml.length)*2;for(;cache.size>=max||retainedBytes+entryBytes>maxBytes;){const oldest=cache.keys().next().value;if(oldest===void 0)break;const oldestHtml=cache.get(oldest)??"";retainedBytes-=(oldest.length+oldestHtml.length)*2,cache.delete(oldest)}return cache.set(key,html2),!0}const MATH_INLINE_RE=/^\$((?:\\\$|[^$\s])(?:\\\$|[^$])*?)\$(?!\$)/;function mathExtension(renderMath){return{name:"math",level:"inline",start(src){const index=src.indexOf("$");return index===-1?void 0:index},tokenizer(src){if(src.startsWith("$$")){const close=src.indexOf("$$",2);if(close>2){const raw=src.slice(0,close+2),tex=src.slice(2,close).trim();if(tex)return{type:"math",raw,tex,display:!0}}}const inline=MATH_INLINE_RE.exec(src);if(inline)return{type:"math",raw:inline[0],tex:inline[1].replace(/\\\$/g,"$").trim(),display:!1}},renderer(token){return renderMath(token)}}}const MARKDOWN_SANITIZER_WARNING_KEY="lyra-markdown-dompurify-unavailable",MARKDOWN_SANITIZER_WARNING="<lr-markdown>/<lr-markdown-core>: HTML sanitization is unavailable because the optional DOMPurify peer could not load. Content is rendered as plain text unless trusted HTML is explicitly selected.";function warnMarkdownSanitizerUnavailable(){devWarnOnce(MARKDOWN_SANITIZER_WARNING_KEY,MARKDOWN_SANITIZER_WARNING)}function taskItemCheckboxLabel(context,tokens){for(const candidate of tokens){if(typeof candidate!="object"||candidate===null)continue;const token=candidate;if(token.type!=="text"&&token.type!=="paragraph"||!Array.isArray(token.tokens))continue;const inlineTokens=token.tokens.filter(inline=>typeof inline!="object"||inline===null?!0:inline.type!=="checkbox"),label=context.parser.parseInline(inlineTokens,context.parser.textRenderer).replace(/\s+/g," ").trim();if(label)return label}return null}function parseMarkdownDocument(options){const{marked,content,gfm,linkTarget,escapeHtmlOption,trustedHtmlOption,highlightCodeOption,getCachedHighlight:getCached,failedHighlightKeys,headingAnchorsOption,mathOption,cachedKatex,pendingKeys,headingTreeOut}=options,headingOffset=finiteInteger(options.headingOffset,0),slugger=new Slugger,activeHighlightKeys=new Set,pendingHighlightKeys=new Set(options.pendingKeys.map(({key})=>key)),taskItemCheckboxLabels=[];let hadMathFallback=!1;const instance=new marked.Marked;mathOption&&instance.use({extensions:[mathExtension(token=>{if(!cachedKatex)return hadMathFallback=!0,escapeHtml(token.display?`$$${token.tex}$$`:`$${token.tex}$`);try{const mathml=cachedKatex.renderToString(token.tex,{output:"mathml",throwOnError:!1});return`<span part='math' data-display='${token.display?"block":"inline"}'>${mathml}</span>`}catch{return escapeHtml(token.display?`$$${token.tex}$$`:`$${token.tex}$`)}})]}),instance.use({renderer:{heading(token){const depth=Math.min(6,Math.max(1,token.depth+headingOffset)),label=this.parser.parseInline(token.tokens,this.parser.textRenderer),slug=slugger.slug(label);headingTreeOut.push({id:slug,label,level:depth});const idAttr=headingAnchorsOption&&slug?` id='${escapeHtml(slug)}'`:"";return`<h${depth} part='heading'${idAttr}>${this.parser.parseInline(token.tokens)}</h${depth}>
2
2
  `},paragraph(token){return`<p part='paragraph'>${this.parser.parseInline(token.tokens)}</p>
3
3
  `},list(token){const ordered=token.ordered,start=token.start;let body="";for(const item of token.items)body+=this.listitem(item);const tag=ordered?"ol":"ul",startAttr=ordered&&start!==1?` start='${start}'`:"";return`<${tag} part='list'${startAttr}>
4
4
  ${body}</${tag}>
5
- `},code(token){const lang=(token.lang??"").trim().split(/\s+/)[0]??"",body=`${token.text.replace(/\n$/,"")}
5
+ `},listitem(token){const label=token.task===!0?taskItemCheckboxLabel(this,token.tokens):null;taskItemCheckboxLabels.push(label);try{return`<li>${this.parser.parse(token.tokens)}</li>
6
+ `}finally{taskItemCheckboxLabels.pop()}},checkbox(token){const label=taskItemCheckboxLabels.at(-1),checked=token.checked?" checked=''":"",labelAttr=label?` aria-label='${escapeHtml(label)}'`:"";return`<input${checked} disabled='' type='checkbox'${labelAttr}> `},code(token){const lang=(token.lang??"").trim().split(/\s+/)[0]??"",body=`${token.text.replace(/\n$/,"")}
6
7
  `,text=token.escaped?body:escapeHtml(body);if(highlightCodeOption&&lang){const key=markdownHighlightKey(lang,body);if(activeHighlightKeys.has(key)||activeHighlightKeys.size<HIGHLIGHT_CACHE_MAX){activeHighlightKeys.add(key);const cached=getCached(key);if(cached!==void 0)return cached;!failedHighlightKeys.has(key)&&!pendingHighlightKeys.has(key)&&(pendingHighlightKeys.add(key),pendingKeys.push({key,lang,code:body}))}}return`<pre part='code-block' tabindex='0'><code${lang?` class='language-${escapeHtml(lang)}'`:""}>${text}</code></pre>
7
8
  `},codespan(token){return`<code part='inline-code'>${escapeHtml(token.text)}</code>`},blockquote(token){return`<blockquote part='blockquote'>
8
9
  ${this.parser.parse(token.tokens)}</blockquote>
@@ -12,7 +13,7 @@ ${this.tablerow({text:headerRow})}</thead>
12
13
  `:"";return`<table part='table'>
13
14
  ${thead}${tbody}</table>
14
15
  `},link(token){const text=this.parser.parseInline(token.tokens),href=cleanHref(token.href);if(href===null)return text;const safeHref=trustedHtmlOption?href:safeLinkHref(href);if(safeHref===null)return text;const titleAttr=token.title?` title='${escapeHtml(token.title)}'`:"",targetAttr=linkTarget?` target='${escapeHtml(linkTarget)}' rel='noopener noreferrer'`:"";return`<a part='link' href='${escapeHtml(safeHref)}'${titleAttr}${targetAttr}>${text}</a>`},image(token){const altText=this.parser.parseInline(token.tokens,this.parser.textRenderer),href=cleanHref(token.href);if(href===null)return escapeHtml(altText);const safeHref=trustedHtmlOption?href:safeMediaSrc(href);if(safeHref===null)return escapeHtml(altText);const titleAttr=token.title?` title='${escapeHtml(token.title)}'`:"";return`<img part='img' src='${escapeHtml(safeHref)}' alt='${escapeHtml(altText)}'${titleAttr}>`},html(token){return escapeHtmlOption?escapeHtml(token.text):token.text}}});for(const configuration of options.markedConfigurations??[]){if(!configuration||typeof configuration!="object")continue;const configuredDefaults=Object.fromEntries(Object.entries(configuration).filter(([,value])=>value!=null));Object.keys(configuredDefaults).length>0&&instance.use(configuredDefaults)}return{html:instance.parse(content,{gfm,async:!1}),hadMathFallback}}const KATEX_OVERRIDE=Symbol.for("@aceshooting/lyra-ui/markdown-katex-override");function readKatexOverride(){return Reflect.has(globalThis,KATEX_OVERRIDE)?{present:!0,value:Reflect.get(globalThis,KATEX_OVERRIDE)}:{present:!1,value:null}}function createMarkdownKatexState(){let resolved,loadStarted=!1;const subscribers=new Set;return{getIfLoaded(){const override=readKatexOverride();return override.present?override.value:resolved??null},isConfirmedMissing(){const override=readKatexOverride();return(override.present?override.value:resolved)===null},startLoad(onResolved){readKatexOverride().present||resolved!==void 0||(subscribers.add(onResolved),!loadStarted&&(loadStarted=!0,getKatex().then(katex=>{resolved=katex;const pending=[...subscribers];subscribers.clear();for(const subscriber of pending)subscriber()})))}}}function markdownCodeTransformer(lang){return{name:"lr-markdown-code-block",pre(node){node.properties.part=["code-block"],node.properties.tabindex="0"},code(node){const classValue=node.properties.class,classes=Array.isArray(classValue)?classValue.map(String):classValue?[String(classValue)]:[];node.properties.class=[...classes,`language-${lang}`]}}}const SHIKI_COLOR=/^#(?:[\da-f]{3}|[\da-f]{4}|[\da-f]{6}|[\da-f]{8})$/i,SHIKI_STYLE_TO_DATA={color:"data-lr-shiki-light","background-color":"data-lr-shiki-light-bg","--shiki-light":"data-lr-shiki-light","--shiki-light-bg":"data-lr-shiki-light-bg","--shiki-dark":"data-lr-shiki-dark","--shiki-dark-bg":"data-lr-shiki-dark-bg"},SHIKI_DATA_TO_STYLE={"data-lr-shiki-light":"color","data-lr-shiki-light-bg":"background-color","data-lr-shiki-dark":"--shiki-dark","data-lr-shiki-dark-bg":"--shiki-dark-bg"};function encodeMarkdownHighlightStyles(markup){return markup.replace(/\sstyle=(["'])(.*?)\1/gi,(_attribute,_quote,value)=>{const attributes=[];for(const declaration of value.split(";")){const separator=declaration.indexOf(":");if(separator<0)continue;const property=declaration.slice(0,separator).trim().toLowerCase(),color=declaration.slice(separator+1).trim(),dataAttribute=SHIKI_STYLE_TO_DATA[property];dataAttribute&&SHIKI_COLOR.test(color)&&attributes.push(`${dataAttribute}="${color}"`)}return attributes.length>0?` ${attributes.join(" ")}`:""})}function restoreMarkdownHighlightStyles(markup){return markup.replace(/<[a-z][^<>]*>/gi,openingTag=>{const declarations=[],cleanTag=openingTag.replace(/\s(data-lr-shiki-(?:light-bg|dark-bg|light|dark))=(["'])(#[\da-f]+)\2/gi,(attribute,name,_quote,color)=>{const property=SHIKI_DATA_TO_STYLE[name.toLowerCase()];return!property||!SHIKI_COLOR.test(color)?attribute:(declarations.push(`${property}:${color}`),"")});return declarations.length===0?cleanTag:`${cleanTag.slice(0,-1)} style="${declarations.join(";")}">`})}function tokenizeMarkdownHighlight(hl,pending){try{const highlighted=hl.codeToHtml(pending.code,{lang:normalizeShikiLanguage(pending.lang),themes:SHIKI_THEMES,transformers:[markdownCodeTransformer(pending.lang)]});return`${encodeMarkdownHighlightStyles(highlighted)}
15
- `}catch{return null}}const markdownDepsLoadGenerations=new WeakMap;function beginMarkdownDepsLoad(host,apply){const generation=(markdownDepsLoadGenerations.get(host)??0)+1;markdownDepsLoadGenerations.set(host,generation);const alreadyLoaded=getMarkdownDepsIfLoaded();if(alreadyLoaded){apply(alreadyLoaded);return}loadMarkdownDeps().then(resolved=>{!host.isConnected||markdownDepsLoadGenerations.get(host)!==generation||apply(resolved)})}function markdownNeedsReparse(changed){return changed.has("content")||changed.has("tabSize")||changed.has("htmlMode")||changed.has("gfm")||changed.has("linkTarget")||changed.has("headingOffset")||changed.has("streaming")||changed.has("headingAnchors")||changed.has("math")||changed.has("highlightCode")||changed.has("languages")}function markdownHighlightConfigChanged(changed){return changed.has("highlightCode")||changed.has("languages")}function markdownLanguageSetChanged(changed){return changed.has("languages")}function normalizeMarkdownHtmlMode(value){return value==="escape"||value==="trusted"?value:"sanitize"}function renderMarkdownDocument(options){const{deps,tag}=options;if(!deps.marked)return{status:"fallback",error:new Error(`<${tag}> could not render: the "marked" peer dependency failed to load.`),headingTree:null};const pendingKeys=[],headingTree=[];let rawHtml,hadMathFallback;try{const parsed=options.parse(deps.marked,pendingKeys,headingTree);rawHtml=parsed.html,hadMathFallback=parsed.hadMathFallback}catch(error){return{status:"fallback",error,headingTree:null}}options.onParsed();const mathFailed=hadMathFallback&&options.isKatexConfirmedMissing();if(options.htmlMode!=="sanitize")return{status:"rendered",html:restoreMarkdownHighlightStyles(rawHtml),headingTree,mathFailed,pendingKeys};if(!deps.DOMPurify){const error=new Error(`<${tag}> could not render: sanitize is enabled (the default) but the "dompurify" peer dependency failed to load \u2014 refusing to render unsanitized HTML. Install it with \`pnpm add dompurify\`, or set html-mode="trusted" to explicitly opt out of sanitization.`);return console.warn(error.message),{status:"fallback",error,headingTree}}const sanitized=deps.DOMPurify.sanitize(rawHtml,{ADD_ATTR:["target"],FORBID_ATTR:["style"],...options.math?{ADD_TAGS:["semantics","annotation"]}:{}});return{status:"rendered",html:restoreMarkdownHighlightStyles(sanitized),headingTree,mathFailed,pendingKeys}}function markdownMathPeerError(tag){return new Error(`<${tag}> needs the optional peer dependency \`katex\` to render math (the \`math\` property is set) \u2014 install it with \`pnpm add katex\`.`)}function applyMarkdownAriaBusy(host,busy){busy?host.setAttribute("aria-busy","true"):host.removeAttribute("aria-busy")}function markdownScrollBehavior(root){const view=root.ownerDocument.defaultView;return!view||prefersReducedMotion(view)?"auto":"smooth"}function applyMarkdownFragmentAnchor(root,anchor,headingTree){if(!anchor.id)return!1;let index=-1;const headingLimit=Math.min(headingTree.length,TEXT_QUOTE_LIMITS.maxTraversalNodes);for(let headingIndex2=0;headingIndex2<headingLimit;headingIndex2++)if(headingTree[headingIndex2]?.id===anchor.id){index=headingIndex2;break}if(index<0)return!1;const walker=root.ownerDocument.createTreeWalker(root,1);let inspected=0,headingIndex=0,escapedIdMatch=null,positionalMatch=null,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes&&(node=walker.nextNode());){inspected++;const candidate=node;if(candidate.getAttribute("id")===anchor.id&&(escapedIdMatch??=candidate),/^H[1-6]$/.test(candidate.tagName)&&(headingIndex===index&&(positionalMatch=candidate),headingIndex++),escapedIdMatch&&positionalMatch)break}const el=escapedIdMatch??positionalMatch;return el?(el.scrollIntoView({behavior:markdownScrollBehavior(root),block:"start"}),!0):!1}function applyMarkdownTextQuoteAnchor(root,anchor,locale,index=createTextQuoteIndex(scopeFromElement(root),locale)){const match=index.resolve(anchor),range=match?rangeFromTextQuoteMatch(index.scope,match):null;return range?(((range.startContainer.nodeType===1?range.startContainer:range.startContainer.parentElement)??root).scrollIntoView({behavior:markdownScrollBehavior(root),block:"center"}),!0):!1}const HIGHLIGHT_TONES=["accent","success","warning","danger","neutral"],MARKDOWN_PAINTED_HIGHLIGHT_LIMIT=100;function repaintMarkdownHighlights(options){const resolved=[],rangesByTone=new Map(HIGHLIGHT_TONES.map(tone=>[tone,[]]));let activeRange=null;const workBudget=options.index.createWorkBudget(),matches=[];for(const highlight of prioritizedHighlightCandidates(options.highlights,options.activeHighlightId)){if(matches.length>=MARKDOWN_PAINTED_HIGHLIGHT_LIMIT)break;if(highlight.anchor.kind!=="text-quote")continue;const match=options.index.resolve(highlight.anchor,workBudget);match&&matches.push({highlight,match})}const ranges=rangesFromTextQuoteMatches(options.index.scope,matches.map(({match})=>match));for(let position=0;position<matches.length;position++){const{highlight}=matches[position],range=ranges[position]??null;range&&(rangesByTone.get(highlight.tone??"accent").push(range),resolved.push({id:highlight.id,range}),highlight.id===options.activeHighlightId&&(activeRange=range))}for(const[tone,ranges2]of rangesByTone)options.handle.setRanges(tone,ranges2);if(options.handle.setActive(activeRange),!supportsCustomHighlights(options.root.ownerDocument)){const walker=options.root.ownerDocument.createTreeWalker(options.root,1);let inspected=0,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes+MARKDOWN_PAINTED_HIGHLIGHT_LIMIT&&(node=walker.nextNode());){inspected++;const mark=node;mark.localName==="mark"&&mark.hasAttribute("data-lr-highlight-tone")&&!mark.hasAttribute("part")&&mark.setAttribute("part","highlight")}}return resolved}function hitTestHighlightRanges(ranges,x,y){let remainingRects=TEXT_SELECTION_RECT_LIMIT;for(let i=ranges.length-1;i>=0;i--){const hit=ranges[i];if(hit)for(const rect of hit.range.getClientRects()){if(remainingRects--<=0)return null;if(x>=rect.left&&x<=rect.right&&y>=rect.top&&y<=rect.bottom)return hit.id}}return null}function internalLinkHrefFrom(e,prefix){if(!prefix)return null;const anchor=e.composedPath().find(target=>typeof target=="object"&&target!==null&&"localName"in target&&target.localName==="a"&&"getAttribute"in target&&typeof target.getAttribute=="function");if(!anchor)return null;const href=anchor.getAttribute("href")??"";return href.startsWith(prefix)?href:null}function renderMarkdownContent(options){const isFallback=options.renderedHtml===null;return html`
16
+ `}catch{return null}}const markdownDepsLoadGenerations=new WeakMap;function beginMarkdownDepsLoad(host,apply){const generation=(markdownDepsLoadGenerations.get(host)??0)+1;markdownDepsLoadGenerations.set(host,generation);const alreadyLoaded=getMarkdownDepsIfLoaded();if(alreadyLoaded){apply(alreadyLoaded);return}loadMarkdownDeps().then(resolved=>{!host.isConnected||markdownDepsLoadGenerations.get(host)!==generation||apply(resolved)})}function markdownNeedsReparse(changed){return changed.has("content")||changed.has("tabSize")||changed.has("htmlMode")||changed.has("gfm")||changed.has("linkTarget")||changed.has("headingOffset")||changed.has("streaming")||changed.has("headingAnchors")||changed.has("math")||changed.has("highlightCode")||changed.has("languages")}function markdownHighlightConfigChanged(changed){return changed.has("highlightCode")||changed.has("languages")}function markdownLanguageSetChanged(changed){return changed.has("languages")}function normalizeMarkdownHtmlMode(value){return value==="escape"||value==="trusted"?value:"sanitize"}function renderMarkdownDocument(options){const{deps,tag}=options;if(!deps.marked)return{status:"fallback",error:new Error(`<${tag}> could not render: the "marked" peer dependency failed to load.`),headingTree:null};const pendingKeys=[],headingTree=[];let rawHtml,hadMathFallback;try{const parsed=options.parse(deps.marked,pendingKeys,headingTree);rawHtml=parsed.html,hadMathFallback=parsed.hadMathFallback}catch(error){return{status:"fallback",error,headingTree:null}}options.onParsed();const mathFailed=hadMathFallback&&options.isKatexConfirmedMissing();if(options.htmlMode!=="sanitize")return{status:"rendered",html:restoreMarkdownHighlightStyles(rawHtml),headingTree,mathFailed,pendingKeys};if(!deps.DOMPurify){const error=new Error(`<${tag}> could not render: sanitize is enabled (the default) but the "dompurify" peer dependency failed to load refusing to render unsanitized HTML. Install it with \`pnpm add dompurify\`, or set html-mode="trusted" to explicitly opt out of sanitization.`);return warnMarkdownSanitizerUnavailable(),{status:"fallback",error,headingTree}}let sanitized;try{const result=deps.DOMPurify.sanitize(rawHtml,{ADD_ATTR:["target"],FORBID_ATTR:["style"],...options.math?{ADD_TAGS:["semantics","annotation"]}:{}});if(typeof result!="string")throw new TypeError("The HTML sanitizer returned non-string markup.");sanitized=restoreMarkdownHighlightStyles(result)}catch(error){return warnMarkdownSanitizerUnavailable(),{status:"fallback",error,headingTree}}return{status:"rendered",html:sanitized,headingTree,mathFailed,pendingKeys}}function markdownMathPeerError(tag){return new Error(`<${tag}> needs the optional peer dependency \`katex\` to render math (the \`math\` property is set) install it with \`pnpm add katex\`.`)}function applyMarkdownAriaBusy(host,busy){busy?host.setAttribute("aria-busy","true"):host.removeAttribute("aria-busy")}function markdownScrollBehavior(root){const view=root.ownerDocument.defaultView;return!view||prefersReducedMotion(view)?"auto":"smooth"}function applyMarkdownFragmentAnchor(root,anchor,headingTree){if(!anchor.id)return!1;let index=-1;const headingLimit=Math.min(headingTree.length,TEXT_QUOTE_LIMITS.maxTraversalNodes);for(let headingIndex2=0;headingIndex2<headingLimit;headingIndex2++)if(headingTree[headingIndex2]?.id===anchor.id){index=headingIndex2;break}if(index<0)return!1;const walker=root.ownerDocument.createTreeWalker(root,1);let inspected=0,headingIndex=0,escapedIdMatch=null,positionalMatch=null,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes&&(node=walker.nextNode());){inspected++;const candidate=node;if(candidate.getAttribute("id")===anchor.id&&(escapedIdMatch??=candidate),/^H[1-6]$/.test(candidate.tagName)&&(headingIndex===index&&(positionalMatch=candidate),headingIndex++),escapedIdMatch&&positionalMatch)break}const el=escapedIdMatch??positionalMatch;return el?(el.scrollIntoView({behavior:markdownScrollBehavior(root),block:"start"}),!0):!1}function applyMarkdownTextQuoteAnchor(root,anchor,locale,index=createTextQuoteIndex(scopeFromElement(root),locale)){const match=index.resolve(anchor),range=match?rangeFromTextQuoteMatch(index.scope,match):null;return range?(((range.startContainer.nodeType===1?range.startContainer:range.startContainer.parentElement)??root).scrollIntoView({behavior:markdownScrollBehavior(root),block:"center"}),!0):!1}const HIGHLIGHT_TONES=["accent","success","warning","danger","neutral"],MARKDOWN_PAINTED_HIGHLIGHT_LIMIT=100;function repaintMarkdownHighlights(options){const resolved=[],rangesByTone=new Map(HIGHLIGHT_TONES.map(tone=>[tone,[]]));let activeRange=null;const workBudget=options.index.createWorkBudget(),matches=[];for(const highlight of prioritizedHighlightCandidates(options.highlights,options.activeHighlightId)){if(matches.length>=MARKDOWN_PAINTED_HIGHLIGHT_LIMIT)break;if(highlight.anchor.kind!=="text-quote")continue;const match=options.index.resolve(highlight.anchor,workBudget);match&&matches.push({highlight,match})}const ranges=rangesFromTextQuoteMatches(options.index.scope,matches.map(({match})=>match));for(let position=0;position<matches.length;position++){const{highlight}=matches[position],range=ranges[position]??null;range&&(rangesByTone.get(highlight.tone??"accent").push(range),resolved.push({id:highlight.id,range}),highlight.id===options.activeHighlightId&&(activeRange=range))}for(const[tone,ranges2]of rangesByTone)options.handle.setRanges(tone,ranges2);if(options.handle.setActive(activeRange),!supportsCustomHighlights(options.root.ownerDocument)){const walker=options.root.ownerDocument.createTreeWalker(options.root,1);let inspected=0,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes+MARKDOWN_PAINTED_HIGHLIGHT_LIMIT&&(node=walker.nextNode());){inspected++;const mark=node;mark.localName==="mark"&&mark.hasAttribute("data-lr-highlight-tone")&&!mark.hasAttribute("part")&&mark.setAttribute("part","highlight")}}return resolved}function hitTestHighlightRanges(ranges,x,y){let remainingRects=TEXT_SELECTION_RECT_LIMIT;for(let i=ranges.length-1;i>=0;i--){const hit=ranges[i];if(hit)for(const rect of hit.range.getClientRects()){if(remainingRects--<=0)return null;if(x>=rect.left&&x<=rect.right&&y>=rect.top&&y<=rect.bottom)return hit.id}}return null}const nativeElementGetAttribute=typeof Element>"u"?void 0:Element.prototype.getAttribute,nativeAnchorHref=typeof HTMLAnchorElement>"u"?void 0:Object.getOwnPropertyDescriptor(HTMLAnchorElement.prototype,"href")?.get;function markdownAnchorFromTarget(target){if(!(typeof target!="object"&&typeof target!="function"||target===null)&&!(!nativeElementGetAttribute||!nativeAnchorHref))try{return nativeElementGetAttribute.call(target,"data-lr-brand-probe"),nativeAnchorHref.call(target),target}catch{return}}function nativeAnchorAttribute(anchor,name){try{const value=nativeElementGetAttribute?.call(anchor,name);return typeof value=="string"?value:void 0}catch{return}}function internalLinkHrefFrom(e,prefix){if(!prefix)return null;const anchor=e.composedPath().find(target=>markdownAnchorFromTarget(target)!==void 0);if(!anchor)return null;const href=nativeAnchorAttribute(anchor,"href")??"";return href.startsWith(prefix)?href:null}function renderMarkdownContent(options){const isFallback=options.renderedHtml===null;return html`
16
17
  <div
17
18
  part="content"
18
19
  role="document"
@@ -26,4 +27,4 @@ ${thead}${tbody}</table>
26
27
  ${isFallback?options.content:unsafeHTML(options.renderedHtml)}
27
28
  </div>
28
29
  ${options.liveRegion}
29
- `}function watchMarkdownDarkTheme(host,apply){return apply(resolveIsDarkTheme(host)),watchDarkTheme(host,()=>apply(resolveIsDarkTheme(host)))}function resolveMarkdownDarkTheme(host){return resolveIsDarkTheme(host)}export{FAILED_HIGHLIGHT_MAX,HIGHLIGHT_CACHE_ENTRY_MAX_BYTES,HIGHLIGHT_CACHE_MAX,HIGHLIGHT_CACHE_MAX_BYTES,MARKDOWN_PAINTED_HIGHLIGHT_LIMIT,MarkdownOwnedAnimationFrameController,MarkdownParserController,addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,cleanHref,createMarkdownKatexState,createMarkdownParser,escapeHtml,getCachedHighlight,hitTestHighlightRanges,internalLinkHrefFrom,markdownCodeTransformer,markdownHighlightConfigChanged,markdownHighlightKey,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,normalizeMarkdownHtmlMode,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight,tokenizeMarkdownHighlight,watchMarkdownDarkTheme};
30
+ `}function watchMarkdownDarkTheme(host,apply){return apply(resolveIsDarkTheme(host)),watchDarkTheme(host,()=>apply(resolveIsDarkTheme(host)))}function resolveMarkdownDarkTheme(host){return resolveIsDarkTheme(host)}export{FAILED_HIGHLIGHT_MAX,HIGHLIGHT_CACHE_ENTRY_MAX_BYTES,HIGHLIGHT_CACHE_MAX,HIGHLIGHT_CACHE_MAX_BYTES,MARKDOWN_PAINTED_HIGHLIGHT_LIMIT,MarkdownOwnedAnimationFrameController,MarkdownParserController,addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,cleanHref,createMarkdownKatexState,createMarkdownParser,escapeHtml,getCachedHighlight,hitTestHighlightRanges,internalLinkHrefFrom,markdownAnchorFromTarget,markdownCodeTransformer,markdownHighlightConfigChanged,markdownHighlightKey,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,normalizeMarkdownHtmlMode,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight,tokenizeMarkdownHighlight,watchMarkdownDarkTheme};
@@ -136,7 +136,7 @@ export declare class LyraMarkdown extends MarkdownRuntimeBase{static styles:impo
136
136
  static getMarked():Marked;
137
137
  /** Re-renders every connected `<lr-markdown>` instance after shared parser configuration changes. */
138
138
  static updateAll():void;
139
- /** The Markdown source to render. */
139
+ /** The Markdown source to render. Removing the attribute clears the document and its tab stop. */
140
140
  content:string;
141
141
  /** Tab-stop width used when converting tabs in leading indentation to spaces before parsing.
142
142
  * Defaults to `4`; non-finite values fall back to that default and finite values are truncated
@@ -12,6 +12,8 @@ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';impo
12
12
  * `LyraToolbarActionProvider` protocol, which keeps implementation nodes private while exposing
13
13
  * ordered focus/tab-stop operations and stable action IDs. Both feedback thumbs and both branch
14
14
  * controls therefore remain independent arrow-key stops without parent shadow-root inspection.
15
+ * When a managed action leaves the toolbar, its optional `releaseTabIndex()` restores an untouched
16
+ * authored tab stop; a consumer change made after toolbar management always remains authoritative.
15
17
  * Providers notify availability/order changes with `lr-toolbar-actions-change`; plain authored
16
18
  * actions are observed in light DOM. A former stop is cleared, and if it held focus, focus moves to
17
19
  * the nearest survivor or the stable toolbar without overriding a newer external focus move.
@@ -22,6 +24,8 @@ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';impo
22
24
  * events, so each built-in can occur at most once. Provider action ids must be nonblank and unique
23
25
  * within that provider; invalid actions and later duplicates are omitted.
24
26
  *
27
+ * ArrowLeft/ArrowRight/Home/End from a slotted feedback comment editor remain native editing keys. Roving navigation still operates on the actual toolbar and thumb actions.
28
+ *
25
29
  * @customElement lr-message-actions
26
30
  * @slot - Additional controls (e.g. `lr-copy-button`, `lr-icon-button`, `lr-branch-picker`)
27
31
  * appended after the built-ins; they participate in the toolbar's arrow-key navigation.
@@ -39,7 +43,9 @@ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';impo
39
43
  * `lr-message-feedback`. `detail: { rating }`. A colliding event from a slotted custom child is
40
44
  * contained at the slot boundary and remains observable directly on that child.
41
45
  * @event lr-feedback-submit - The built-in feedback control's terminal cancelable persistence
42
- * request, including thumbs-only choices. Slotted collisions are contained at the slot boundary.
46
+ * request, including thumbs-only choices. Its frozen detail includes a nonblank `submissionId`;
47
+ * when prevented, pass that exact ID to `finalizePendingSubmit()` or
48
+ * `revertPendingSubmit()` on this wrapper. Slotted collisions are contained at the slot boundary.
43
49
  * @csspart base - The toolbar (`role="toolbar"`).
44
50
  * @csspart copy-button - The embedded `lr-copy-button`.
45
51
  * @csspart regenerate-button - The built-in regenerate icon button.
@@ -56,6 +62,15 @@ controls:readonly MessageActionControl[];private get effectiveControls();
56
62
  copyText:string;
57
63
  /** Forwarded to the embedded thumbs-only `lr-message-feedback` when enabled. */
58
64
  feedbackRating:MessageFeedbackValue;
65
+ /** Whether this component's current built-in feedback child is awaiting a persistence settle.
66
+ * This is a nonreflecting read-through; no `feedback-pending` attribute or change event exists. */
67
+ get feedbackPending():boolean;
68
+ /** Settles only the currently rendered built-in feedback transaction identified by `submissionId`.
69
+ * A removed, replaced, stale, or mismatched child fails closed. */
70
+ finalizePendingSubmit(submissionId:string):boolean;
71
+ /** Reverts only the currently rendered built-in feedback transaction identified by `submissionId`.
72
+ * A removed, replaced, stale, or mismatched child fails closed. */
73
+ revertPendingSubmit(submissionId:string):boolean;
59
74
  /** Visually hides the bar until the enclosing message is hovered or any control inside has focus. */
60
75
  revealOnInteraction:boolean;
61
76
  /** Accessible name for the toolbar. Defaults to the localized `messageActionsLabel`. */
@@ -69,6 +84,6 @@ accessibleLabel:string|null;private activeStopIndex;
69
84
  * technique) while `revealOnInteraction` is active. CSS alone cannot key `:host`'s own opacity off the
70
85
  * ancestor `lr-chat-message`'s hover state from inside this component's own shadow DOM, so the
71
86
  * reveal state is tracked in JS instead (see `bindHoverTarget()`). */
72
- private revealed;private hoverTarget;private stopSyncGeneration;private stopObserver?;private managedStops;private authoredTabIndex;private directActions;private nextDirectActionId;private focusedStop?;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected firstUpdated(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private bindHoverTarget;private unbindHoverTarget;private onHoverTargetEnter;private onHoverTargetLeave;private onFocusIn;private onFocusOut;
87
+ private revealed;private hoverTarget;private stopSyncGeneration;private stopObserver?;private managedStops;private directActions;private nextDirectActionId;private focusedStop?;private currentBuiltInFeedback;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected firstUpdated(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private bindHoverTarget;private unbindHoverTarget;private onHoverTargetEnter;private onHoverTargetLeave;private onFocusIn;private onFocusOut;
73
88
  /** Immediate rendered children plus flattened slotted roots that own logical actions. */
74
- private actionRoots;private sameAction;private isAvailable;private directActionFor;private logicalActions;private setActiveStop;private observeStopChanges;private onStopMutations;private reconcileStopsAfterChildren;private onSlotChange;private onToolbarActionsChange;private containSlottedFeedbackEvent;private onToolbarKeyDown;private onRegenerateClick;private onEditClick;private renderControl;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-actions':LyraMessageActions;}}
89
+ private actionRoots;private sameAction;private isAvailable;private directActionFor;private logicalActions;private setActiveStop;private releaseManagedStop;private releaseManagedStops;private observeStopChanges;private onStopMutations;private reconcileStopsAfterChildren;private onSlotChange;private onToolbarActionsChange;private containSlottedFeedbackEvent;private onToolbarKeyDown;private onRegenerateClick;private onEditClick;private renderControl;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-actions':LyraMessageActions;}}
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import"../../utility/copy-button/copy-button.class.js";import"../message-feedback/message-feedback.class.js";import{styles}from"./message-actions.styles.js";import{applyComposedFocusRepair,captureComposedFocusRepair,isComposedFocusAvailable,isSemanticActionElement}from"../../../internal/focus-navigation.js";import{composedContains}from"../../../internal/overlay-manager.js";import{isLyraToolbarActionProvider}from"./toolbar-actions.js";import{LYRA_DEFAULT_editMessage,LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_messageActionsLabel,LYRA_DEFAULT_regenerateResponse}from"../../../internal/default-strings.generated.js";const MESSAGE_ACTION_CONTROLS=["copy","regenerate","edit","feedback"];function regenerateIcon(){return svg`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import"../../utility/copy-button/copy-button.class.js";import"../message-feedback/message-feedback.class.js";import{styles}from"./message-actions.styles.js";import{applyComposedFocusRepair,captureComposedFocusRepair,isComposedFocusAvailable,isSemanticActionElement}from"../../../internal/focus-navigation.js";import{composedContains}from"../../../internal/overlay-manager.js";import{isLyraToolbarActionProvider}from"./toolbar-actions.js";import{LYRA_DEFAULT_editMessage,LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_messageActionsLabel,LYRA_DEFAULT_regenerateResponse}from"../../../internal/default-strings.generated.js";const MESSAGE_ACTION_CONTROLS=["copy","regenerate","edit","feedback"],MAX_TOOLBAR_ACTIONS=100,MAX_DESCRIPTOR_PROTOTYPES=100;function isObjectValue(value){return value!==null&&(typeof value=="object"||typeof value=="function")}function inheritedDescriptor(value,key){let current=value;for(let depth=0;current&&depth<MAX_DESCRIPTOR_PROTOTYPES;depth+=1){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(current,key)}catch{return}if(descriptor)return descriptor;try{current=Object.getPrototypeOf(current)}catch{return}}}function dataCallable(value,key){const descriptor=inheritedDescriptor(value,key);return descriptor&&"value"in descriptor&&typeof descriptor.value=="function"?descriptor.value:void 0}function dataValue(value,key){const descriptor=inheritedDescriptor(value,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}function projectDisabled(value){const descriptor=inheritedDescriptor(value,"disabled");if(!descriptor)return{valid:!0,disabled:!1};if("value"in descriptor)return{valid:!0,disabled:descriptor.value===!0};if(typeof descriptor.get!="function")return{valid:!1,disabled:!0};try{return{valid:!0,disabled:Reflect.apply(descriptor.get,value,[])===!0}}catch{return{valid:!1,disabled:!0}}}function projectToolbarAction(value){if(!isObjectValue(value))return;const id=dataValue(value,"id"),focus=dataCallable(value,"focus"),setTabIndex=dataCallable(value,"setTabIndex"),matchesEventPath=dataCallable(value,"matchesEventPath"),releaseTabIndex=dataCallable(value,"releaseTabIndex"),disabled=projectDisabled(value);if(typeof id!="string"||id.trim().length===0||!focus||!setTabIndex||!matchesEventPath||!disabled.valid)return;const action={id,disabled:disabled.disabled,focus(options){try{Reflect.apply(focus,value,[options])}catch{}},setTabIndex(tabIndex){try{Reflect.apply(setTabIndex,value,[tabIndex])}catch{}},...releaseTabIndex?{releaseTabIndex(){try{Reflect.apply(releaseTabIndex,value,[])}catch{}}}:{},matchesEventPath(path){try{return Reflect.apply(matchesEventPath,value,[path])===!0}catch{return!1}}};return{source:value,action}}function regenerateIcon(){return svg`
2
2
  <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
3
3
  <polyline points="23 4 23 10 17 10"></polyline>
4
4
  <polyline points="1 20 1 14 7 14"></polyline>
@@ -9,7 +9,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
9
9
  <path d="M12 20h9"></path>
10
10
  <path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
11
11
  </svg>
12
- `}class LyraMessageActions extends LyraElement{constructor(){super(...arguments),this.controls=[],this.copyText="",this.feedbackRating=null,this.revealOnInteraction=!1,this.label="",this.accessibleLabel=null,this.activeStopIndex=0,this.revealed=!1,this.hoverTarget=null,this.stopSyncGeneration=0,this.managedStops=[],this.authoredTabIndex=new WeakMap,this.directActions=new WeakMap,this.nextDirectActionId=0,this.onHoverTargetEnter=()=>{this.revealed=!0},this.onHoverTargetLeave=()=>{this.matches(":focus-within")||(this.revealed=!1)},this.onFocusIn=event=>{this.revealed=!0;const stops=this.logicalActions(),path=event.composedPath(),index=stops.findIndex(({action})=>action.matchesEventPath(path));if(index>=0){this.setActiveStop(stops,index,stops[index]);const base=this.renderRoot.querySelector('[part="base"]'),repair=base?captureComposedFocusRepair(this,base):null,stop=stops[index];this.focusedStop=stop&&repair?{index,owner:stop.owner,id:stop.action.id,repair}:void 0}else this.focusedStop=void 0},this.onFocusOut=event=>{this.hoverTarget?.matches(":hover")||(this.revealed=!1);const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedStop=void 0)},this.onStopMutations=records=>{for(const record of records){if(record.type!=="attributes"||record.attributeName!=="tabindex")continue;const target=record.target;this.authoredTabIndex.set(target,target.getAttribute("tabindex"))}this.reconcileStopsAfterChildren()},this.onSlotChange=()=>{const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()},this.onToolbarActionsChange=event=>{event.stopPropagation(),this.reconcileStopsAfterChildren()},this.containSlottedFeedbackEvent=event=>{event.stopPropagation()},this.onToolbarKeyDown=e=>{const stops=this.logicalActions();if(stops.length===0)return;const path=e.composedPath(),originIndex=stops.findIndex(({action})=>action.matchesEventPath(path)),currentIndex=originIndex>=0?originIndex:this.activeStopIndex,forwardKey=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backwardKey=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let target;if(e.key===forwardKey)target=(currentIndex+1)%stops.length;else if(e.key===backwardKey)target=(currentIndex-1+stops.length)%stops.length;else if(e.key==="Home")target=0;else if(e.key==="End")target=stops.length-1;else return;e.preventDefault(),this.setActiveStop(stops,target),stops[target]?.action.focus()},this.onRegenerateClick=()=>{this.emit("lr-regenerate",null)},this.onEditClick=()=>{this.emit("lr-edit",null)}}static{this.defaultStrings={...super.defaultStrings,editMessage:LYRA_DEFAULT_editMessage,fieldRequired:LYRA_DEFAULT_fieldRequired,messageActionsLabel:LYRA_DEFAULT_messageActionsLabel,regenerateResponse:LYRA_DEFAULT_regenerateResponse}}static{this.ownedCollectionProperties=Object.freeze(["controls"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get effectiveControls(){const seen=new Set,controls=[];for(const value of this.controls){if(typeof value!="string"||!MESSAGE_ACTION_CONTROLS.includes(value)||seen.has(value))continue;const control=value;seen.add(control),controls.push(control)}return controls}connectedCallback(){super.connectedCallback(),this.addEventListener("focusin",this.onFocusIn),this.addEventListener("focusout",this.onFocusOut),this.revealOnInteraction&&this.bindHoverTarget(),this.hasUpdated&&this.reconcileStopsAfterChildren()}disconnectedCallback(){this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.focusedStop=void 0,this.unbindHoverTarget(),this.removeEventListener("focusin",this.onFocusIn),this.removeEventListener("focusout",this.onFocusOut),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0}willUpdate(changed){super.willUpdate(changed),changed.has("revealOnInteraction")&&(this.revealOnInteraction?this.bindHoverTarget():this.unbindHoverTarget())}firstUpdated(changed){super.firstUpdated(changed),this.setActiveStop(this.logicalActions(),0),this.reconcileStopsAfterChildren()}updated(changed){if(super.updated(changed),changed.has("controls")){const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()}changed.has("revealed")&&this.toggleAttribute("data-revealed",this.revealed)}bindHoverTarget(){this.unbindHoverTarget();const target=this.closest("lr-chat-message")??this.parentElement;target&&(this.hoverTarget=target,target.addEventListener("pointerenter",this.onHoverTargetEnter),target.addEventListener("pointerleave",this.onHoverTargetLeave))}unbindHoverTarget(){this.hoverTarget?.removeEventListener("pointerenter",this.onHoverTargetEnter),this.hoverTarget?.removeEventListener("pointerleave",this.onHoverTargetLeave),this.hoverTarget=null,this.revealed=!1}actionRoots(){const base=this.renderRoot.querySelector('[part="base"]');if(!base)return[];const direct=[...base.children].filter(element=>element.localName!=="slot"),slot=base.querySelector("slot");return[...direct,...slot?.assignedElements({flatten:!0})??[]]}sameAction(left,right){return left.owner===right.owner&&left.action.id===right.action.id}isAvailable(action){try{return action.disabled!==!0}catch{return!1}}directActionFor(element){let action=this.directActions.get(element);if(action)return action;this.authoredTabIndex.has(element)||this.authoredTabIndex.set(element,element.getAttribute("tabindex"));const target=element;return action={id:`direct-${++this.nextDirectActionId}`,get disabled(){return!isComposedFocusAvailable(element)},focus(options){target.focus(options)},setTabIndex(tabIndex){target.tabIndex=tabIndex},matchesEventPath(path){return path.includes(element)}},this.directActions.set(element,action),action}logicalActions(){const actions=[],addProvider=(owner,provider)=>{let provided;try{provided=provider.getToolbarActions()}catch{return}const seen=new Set;for(const action of Array.from(provided).slice(0,100))!action||typeof action.id!="string"||action.id.trim().length===0||seen.has(action.id)||typeof action.focus!="function"||typeof action.setTabIndex!="function"||typeof action.matchesEventPath!="function"||(seen.add(action.id),this.isAvailable(action)&&actions.push({owner,action}))},visit=element=>{if(isLyraToolbarActionProvider(element)){addProvider(element,element);return}const authoredTabIndex=this.authoredTabIndex.has(element)?this.authoredTabIndex.get(element):element.getAttribute("tabindex");if(isSemanticActionElement(element)||authoredTabIndex!==null){const action=this.directActionFor(element);this.isAvailable(action)&&actions.push({owner:element,action});return}for(const child of element.children)visit(child)};for(const root of this.actionRoots())visit(root);return actions}setActiveStop(stops,index,preferred){this.stopObserver?.disconnect();for(const previous of this.managedStops)stops.some(stop=>this.sameAction(stop,previous))||previous.action.setTabIndex(-1);const preferredIndex=preferred?stops.findIndex(stop=>this.sameAction(stop,preferred)):-1;this.activeStopIndex=stops.length===0?0:preferredIndex>=0?preferredIndex:Math.min(Math.max(0,index),stops.length-1),stops.forEach(({action},stopIndex)=>{action.setTabIndex(stopIndex===this.activeStopIndex?0:-1)}),this.managedStops=stops,this.observeStopChanges()}observeStopChanges(){this.stopObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,base=this.renderRoot.querySelector('[part="base"]');if(!Observer||!base||!this.isConnected){this.stopObserver=void 0;return}const observer=new Observer(this.onStopMutations),roots=new Set([base,...this.actionRoots()]),options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.stopObserver=observer}async reconcileStopsAfterChildren(){const generation=++this.stopSyncGeneration,pending=this.actionRoots().map(root=>root.updateComplete).filter(value=>value!==void 0&&typeof value.then=="function");if(await Promise.all(pending),await Promise.resolve(),generation!==this.stopSyncGeneration||!this.isConnected)return;const stops=this.logicalActions(),focused=this.focusedStop,retainedIndex=focused?stops.findIndex(stop=>stop.owner===focused.owner&&stop.action.id===focused.id):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):this.activeStopIndex,Math.max(0,stops.length-1));if(this.setActiveStop(stops,targetIndex),focused&&retainedIndex<0){const base=this.renderRoot.querySelector('[part="base"]');base&&applyComposedFocusRepair(focused.repair,base)&&stops[targetIndex]?.action.focus(),this.focusedStop===focused&&(this.focusedStop=void 0)}}renderControl(type){switch(type){case"copy":return this.copyText?html`<lr-copy-button
12
+ `}class LyraMessageActions extends LyraElement{constructor(){super(...arguments),this.controls=[],this.copyText="",this.feedbackRating=null,this.revealOnInteraction=!1,this.label="",this.accessibleLabel=null,this.activeStopIndex=0,this.revealed=!1,this.hoverTarget=null,this.stopSyncGeneration=0,this.managedStops=[],this.directActions=new WeakMap,this.nextDirectActionId=0,this.onHoverTargetEnter=()=>{this.revealed=!0},this.onHoverTargetLeave=()=>{this.matches(":focus-within")||(this.revealed=!1)},this.onFocusIn=event=>{this.revealed=!0;const stops=this.logicalActions(),path=event.composedPath(),index=stops.findIndex(({action})=>action.matchesEventPath(path));if(index>=0){this.setActiveStop(stops,index,stops[index]);const base=this.renderRoot.querySelector('[part="base"]'),repair=base?captureComposedFocusRepair(this,base):null,stop=stops[index];this.focusedStop=stop&&repair?{index,owner:stop.owner,id:stop.action.id,source:stop.source,repair}:void 0}else this.focusedStop=void 0},this.onFocusOut=event=>{this.hoverTarget?.matches(":hover")||(this.revealed=!1);const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedStop=void 0)},this.onStopMutations=records=>{this.reconcileStopsAfterChildren()},this.onSlotChange=()=>{const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()},this.onToolbarActionsChange=event=>{event.stopPropagation(),this.reconcileStopsAfterChildren()},this.containSlottedFeedbackEvent=event=>{event.stopPropagation()},this.onToolbarKeyDown=e=>{const stops=this.logicalActions();if(stops.length===0)return;const path=e.composedPath(),originIndex=stops.findIndex(({action})=>action.matchesEventPath(path));if(originIndex<0&&path[0]!==e.currentTarget)return;const currentIndex=originIndex>=0?originIndex:this.activeStopIndex,forwardKey=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backwardKey=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let target;if(e.key===forwardKey)target=(currentIndex+1)%stops.length;else if(e.key===backwardKey)target=(currentIndex-1+stops.length)%stops.length;else if(e.key==="Home")target=0;else if(e.key==="End")target=stops.length-1;else return;e.preventDefault(),this.setActiveStop(stops,target),stops[target]?.action.focus()},this.onRegenerateClick=()=>{this.emit("lr-regenerate",null)},this.onEditClick=()=>{this.emit("lr-edit",null)}}static{this.defaultStrings={...super.defaultStrings,editMessage:LYRA_DEFAULT_editMessage,fieldRequired:LYRA_DEFAULT_fieldRequired,messageActionsLabel:LYRA_DEFAULT_messageActionsLabel,regenerateResponse:LYRA_DEFAULT_regenerateResponse}}static{this.ownedCollectionProperties=Object.freeze(["controls"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get effectiveControls(){const seen=new Set,controls=[];for(const value of this.controls){if(typeof value!="string"||!MESSAGE_ACTION_CONTROLS.includes(value)||seen.has(value))continue;const control=value;seen.add(control),controls.push(control)}return controls}get feedbackPending(){return this.currentBuiltInFeedback()?.pending===!0}finalizePendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.finalizePendingSubmit(submissionId):!1}revertPendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.revertPendingSubmit(submissionId):!1}currentBuiltInFeedback(){const base=this.renderRoot.querySelector('[part="base"]'),feedback=base?.querySelector('lr-message-feedback[part~="feedback"]');return feedback&&feedback.parentElement===base&&feedback.getRootNode()===this.renderRoot&&feedback.isConnected?feedback:void 0}connectedCallback(){super.connectedCallback(),this.addEventListener("focusin",this.onFocusIn),this.addEventListener("focusout",this.onFocusOut),this.revealOnInteraction&&this.bindHoverTarget(),this.hasUpdated&&this.reconcileStopsAfterChildren()}disconnectedCallback(){this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops(),this.focusedStop=void 0,this.unbindHoverTarget(),this.removeEventListener("focusin",this.onFocusIn),this.removeEventListener("focusout",this.onFocusOut),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops()}willUpdate(changed){super.willUpdate(changed),changed.has("revealOnInteraction")&&(this.revealOnInteraction?this.bindHoverTarget():this.unbindHoverTarget())}firstUpdated(changed){super.firstUpdated(changed),this.setActiveStop(this.logicalActions(),0),this.reconcileStopsAfterChildren()}updated(changed){if(super.updated(changed),changed.has("controls")){const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()}changed.has("revealed")&&this.toggleAttribute("data-revealed",this.revealed)}bindHoverTarget(){this.unbindHoverTarget();const target=this.closest("lr-chat-message")??this.parentElement;target&&(this.hoverTarget=target,target.addEventListener("pointerenter",this.onHoverTargetEnter),target.addEventListener("pointerleave",this.onHoverTargetLeave))}unbindHoverTarget(){this.hoverTarget?.removeEventListener("pointerenter",this.onHoverTargetEnter),this.hoverTarget?.removeEventListener("pointerleave",this.onHoverTargetLeave),this.hoverTarget=null,this.revealed=!1}actionRoots(){const base=this.renderRoot.querySelector('[part="base"]');if(!base)return[];const direct=[...base.children].filter(element=>element.localName!=="slot"),slot=base.querySelector("slot");return[...direct,...slot?.assignedElements({flatten:!0})??[]]}sameAction(left,right){return left.owner===right.owner&&left.source===right.source&&left.action.id===right.action.id}isAvailable(action){try{return action.disabled!==!0}catch{return!1}}directActionFor(element){let action=this.directActions.get(element);if(action)return action;const target=element,id=`direct-${++this.nextDirectActionId}`;let leasedTarget,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const leased=leasedTarget;leased&&leased.getAttribute("tabindex")===lastManagedTabIndex&&(leasedAuthoredTabIndex===null?leased.removeAttribute("tabindex"):leased.setAttribute("tabindex",leasedAuthoredTabIndex)),leasedTarget=void 0,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return action={id,get disabled(){return!isComposedFocusAvailable(element)},focus(options){target.focus(options)},setTabIndex(tabIndex){if(leasedTarget!==target&&(releaseTabIndex(),leasedTarget=target,leasedAuthoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,hasAuthoredTabIndex(){return leasedTarget!==target?target.hasAttribute("tabindex"):lastManagedTabIndex!==null&&target.getAttribute("tabindex")===lastManagedTabIndex?leasedAuthoredTabIndex!==null:target.hasAttribute("tabindex")},matchesEventPath(path){return path.includes(element)}},this.directActions.set(element,action),action}logicalActions(){const actions=[],addProvider=(owner,provider)=>{const getToolbarActions=dataCallable(provider,"getToolbarActions");if(!getToolbarActions)return;let provided;try{provided=Reflect.apply(getToolbarActions,provider,[])}catch{return}let isArray=!1;try{isArray=Array.isArray(provided)}catch{return}if(!isArray)return;const length=getOwnDataDescriptor(provided,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return;const seen=new Set,inspected=Math.min(length.value,MAX_TOOLBAR_ACTIONS);for(let index=0;index<inspected;index+=1){const candidate=getOwnDataDescriptor(provided,String(index));if(candidate===MISSING_OWN_DATA_DESCRIPTOR||candidate===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const projected=projectToolbarAction(candidate.value);!projected||seen.has(projected.action.id)||(seen.add(projected.action.id),this.isAvailable(projected.action)&&actions.push({owner,...projected}))}},visit=element=>{if(isLyraToolbarActionProvider(element)){addProvider(element,element);return}const knownAction=this.directActions.get(element);if(isSemanticActionElement(element)||(knownAction?.hasAuthoredTabIndex()??element.hasAttribute("tabindex"))){const action=this.directActionFor(element);this.isAvailable(action)&&actions.push({owner:element,action,source:action});return}for(const child of element.children)visit(child)};for(const root of this.actionRoots())visit(root);return actions}setActiveStop(stops,index,preferred){this.stopObserver?.disconnect();for(const previous of this.managedStops)stops.some(stop=>this.sameAction(stop,previous))||this.releaseManagedStop(previous);const preferredIndex=preferred?stops.findIndex(stop=>this.sameAction(stop,preferred)):-1;this.activeStopIndex=stops.length===0?0:preferredIndex>=0?preferredIndex:Math.min(Math.max(0,index),stops.length-1),stops.forEach(({action},stopIndex)=>{try{action.setTabIndex(stopIndex===this.activeStopIndex?0:-1)}catch{}}),this.managedStops=stops,this.observeStopChanges()}releaseManagedStop(stop){try{stop.action.releaseTabIndex?.()}catch{}this.directActions.get(stop.owner)===stop.action&&this.directActions.delete(stop.owner)}releaseManagedStops(){for(const stop of this.managedStops)this.releaseManagedStop(stop);this.managedStops=[]}observeStopChanges(){this.stopObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,base=this.renderRoot.querySelector('[part="base"]');if(!Observer||!base||!this.isConnected){this.stopObserver=void 0;return}const observer=new Observer(this.onStopMutations),roots=new Set([base,...this.actionRoots()]),options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.stopObserver=observer}async reconcileStopsAfterChildren(){const generation=++this.stopSyncGeneration,pending=this.actionRoots().map(root=>root.updateComplete).filter(value=>value!==void 0&&typeof value.then=="function");if(await Promise.all(pending),await Promise.resolve(),generation!==this.stopSyncGeneration||!this.isConnected)return;const stops=this.logicalActions(),focused=this.focusedStop,retainedIndex=focused?stops.findIndex(stop=>stop.owner===focused.owner&&stop.source===focused.source&&stop.action.id===focused.id):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):this.activeStopIndex,Math.max(0,stops.length-1));if(this.setActiveStop(stops,targetIndex),focused&&retainedIndex<0){const base=this.renderRoot.querySelector('[part="base"]');base&&applyComposedFocusRepair(focused.repair,base)&&stops[targetIndex]?.action.focus(),this.focusedStop===focused&&(this.focusedStop=void 0)}}renderControl(type){switch(type){case"copy":return this.copyText?html`<lr-copy-button
13
13
  part="copy-button"
14
14
  .value=${this.copyText}
15
15
  ></lr-copy-button>`:nothing;case"regenerate":return html`<button
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{max-inline-size:100%;display:inline-flex}:host([reveal-on-interaction]){opacity:0;transition:opacity var(--lr-transition-fast)}:host([reveal-on-interaction][data-revealed]){opacity:1}@media (hover:none){:host([reveal-on-interaction]){opacity:1}}@media (prefers-reduced-motion:reduce){:host([reveal-on-interaction]){transition:none}}[part=base]{align-items:center;gap:var(--lr-space-2xs);flex-wrap:wrap;max-inline-size:100%;display:flex}[part~=regenerate-button],[part~=edit-button]{inline-size:var(--lr-size-1-75rem);block-size:var(--lr-size-1-75rem);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border-radius:var(--lr-radius);color:var(--lr-color-text-quiet);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}[part~=regenerate-button]:hover,[part~=edit-button]:hover{background:var(--lr-color-surface-raised);color:var(--lr-color-text)}[part~=regenerate-button]:active,[part~=edit-button]:active{background:color-mix(in oklab, var(--lr-color-surface-raised), var(--lr-color-mix-partner) var(--lr-color-mix-active));color:var(--lr-color-text)}[part~=regenerate-button]:focus-visible,[part~=edit-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{max-inline-size:100%;display:inline-flex}:host([reveal-on-interaction]){opacity:0;transition:opacity var(--lr-transition-fast)}:host([reveal-on-interaction][data-revealed]){opacity:1}@media (hover:none){:host([reveal-on-interaction]){opacity:1}}@media (prefers-reduced-motion:reduce){:host([reveal-on-interaction]){transition:none}}[part=base]{align-items:center;gap:var(--lr-space-2xs);flex-wrap:wrap;max-inline-size:100%;display:flex}[part~=regenerate-button],[part~=edit-button]{inline-size:var(--lr-size-1-75rem);block-size:var(--lr-size-1-75rem);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);font:inherit;border-radius:var(--lr-radius);color:var(--lr-color-text-quiet);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}[part~=regenerate-button]:hover,[part~=edit-button]:hover{background:var(--lr-color-surface-raised);color:var(--lr-color-text)}[part~=regenerate-button]:active,[part~=edit-button]:active{background:color-mix(in oklab, var(--lr-color-surface-raised), var(--lr-color-mix-partner) var(--lr-color-mix-active));color:var(--lr-color-text)}[part~=regenerate-button]:focus-visible,[part~=edit-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}`;export{styles};
@@ -5,7 +5,9 @@
5
5
  * tab stop, focus an action, and associate a composed event with that action without receiving the
6
6
  * underlying element. `id` must remain stable while the logical action remains available.
7
7
  */
8
- export interface LyraToolbarAction{readonly id:string;readonly disabled:boolean;focus(options?:FocusOptions):void;setTabIndex(tabIndex:0| -1):void;matchesEventPath(path:readonly EventTarget[]):boolean;}
8
+ export interface LyraToolbarAction{readonly id:string;readonly disabled:boolean;focus(options?:FocusOptions):void;setTabIndex(tabIndex:0| -1):void;
9
+ /** Releases a parent toolbar's current tabindex lease, restoring an untouched authored value. */
10
+ releaseTabIndex?():void;matchesEventPath(path:readonly EventTarget[]):boolean;}
9
11
  /**
10
12
  * Public opt-in protocol for a composite child of `<lr-message-actions>`.
11
13
  *
@@ -1 +1 @@
1
- function isLyraToolbarActionProvider(value){return(typeof value=="object"&&value!==null||typeof value=="function")&&typeof value.getToolbarActions=="function"}export{isLyraToolbarActionProvider};
1
+ const MAX_DESCRIPTOR_PROTOTYPES=100;function hasCallableDataDescriptor(value,key){let current=value;for(let depth=0;current&&depth<100;depth+=1){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(current,key)}catch{return!1}if(descriptor)return"value"in descriptor&&typeof descriptor.value=="function";try{current=Object.getPrototypeOf(current)}catch{return!1}}return!1}function isLyraToolbarActionProvider(value){return(typeof value=="object"&&value!==null||typeof value=="function")&&hasCallableDataDescriptor(value,"getToolbarActions")}export{isLyraToolbarActionProvider};
@@ -1,4 +1,8 @@
1
- import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{LyraToolbarAction}from'../message-actions/toolbar-actions.js';export interface MessageFeedbackReason{readonly id:string;readonly label:string;}export type MessageFeedbackRating='up'|'down';export type MessageFeedbackValue=MessageFeedbackRating|null;export type MessageFeedbackDetailFor='none'|'up'|'down'|'both';export interface MessageFeedbackDetailConfiguration{readonly reasons?:readonly MessageFeedbackReason[];readonly commentable?:boolean;}export interface MessageFeedbackSubmitDetail{rating:MessageFeedbackValue;reasonIds:string[];comment:string;}export interface LyraMessageFeedbackEventMap{'lr-feedback-change':CustomEvent<{rating:MessageFeedbackValue;}>;'lr-feedback-submit':CustomEvent<LyraEventDetailSnapshot<MessageFeedbackSubmitDetail>>;'lr-toolbar-actions-change':Event;blur:CustomEvent<null>;focus:CustomEvent<null>;}
1
+ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';import{type PropertyDeclaration,type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{LyraTextWrap}from'../../../internal/shared-unions.js';import type{LyraToolbarAction}from'../message-actions/toolbar-actions.js';export interface MessageFeedbackReason{readonly id:string;readonly label:string;}export type MessageFeedbackRating='up'|'down';export type MessageFeedbackValue=MessageFeedbackRating|null;export type MessageFeedbackDetailFor='none'|'up'|'down'|'both';export interface MessageFeedbackDetailConfiguration{readonly reasons?:readonly MessageFeedbackReason[];readonly commentable?:boolean;}
2
+ /** Native `<textarea wrap>` values accepted by the optional comment field. */
3
+ export type MessageFeedbackWrap=LyraTextWrap;export interface MessageFeedbackSubmitDetail{rating:MessageFeedbackValue;reasonIds:string[];comment:string;
4
+ /** Opaque, nonblank correlation identity for this one feedback persistence transaction. */
5
+ readonly submissionId:string;}export interface LyraMessageFeedbackEventMap{'lr-feedback-change':CustomEvent<{rating:MessageFeedbackValue;}>;'lr-feedback-submit':CustomEvent<LyraEventDetailSnapshot<MessageFeedbackSubmitDetail>>;'lr-toolbar-actions-change':Event;blur:CustomEvent<null>;focus:CustomEvent<null>;}
2
6
  /**
3
7
  * `<lr-message-feedback>` — thumbs up/down for one assistant message, with an optional inline
4
8
  * detail step (categorical reason chips + a free-text comment) that opens as a disclosure directly
@@ -12,16 +16,23 @@ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';impo
12
16
  * `<lr-message-actions>`'s embedded built-in) never has a panel to reopen, so its thumbs always
13
17
  * behave as a plain toggle.
14
18
  * The detail record and its reasons are a bounded clone-owned readonly snapshot. Create and
15
- * reassign a new detail record after changes.
19
+ * reassign a new detail record after changes. When the detail record enables a comment textarea,
20
+ * its native `spellcheck`, `autocapitalize`, `autocorrect`, and `wrap` properties forward from
21
+ * this element; no textarea exists, and those values have no rendered target, otherwise.
22
+ *
23
+ * Asynchronous finalization or reversion preserves focus on an outside control. Settlement retains the existing thumb/submit fallback when focus remains within the feedback or was lost as its pending controls became disabled.
16
24
  *
17
25
  * @customElement lr-message-feedback
18
26
  * @event lr-feedback-change - `detail: { rating }`. Fires whenever thumb interaction changes the
19
27
  * provisional rating, including clearing it to `null`.
20
- * @event lr-feedback-submit - `detail: { rating, reasonIds, comment }`, fired immediately for a
21
- * thumbs-only terminal choice or by the detail panel's submit button.
22
- * Cancelable: `preventDefault()` holds the panel in its reflected `pending` state until the host
23
- * calls `finalizePendingSubmit()` after persistence succeeds or `revertPendingSubmit()` after it
24
- * fails. An uncanceled submit retains the synchronous close/announce/focus behavior.
28
+ * @event lr-feedback-submit - Frozen `detail: { rating, reasonIds, comment, submissionId }`, fired
29
+ * immediately for a thumbs-only terminal choice or by the detail panel's submit button.
30
+ * `submissionId` is a nonblank, never-reused transaction identity. Cancelable:
31
+ * `preventDefault()` holds the panel in its reflected `pending` state until the host calls
32
+ * `finalizePendingSubmit(submissionId)` after persistence succeeds or
33
+ * `revertPendingSubmit(submissionId)` after it fails. The legacy no-argument settle form works
34
+ * only for this instance's first never-invalidated transaction; later calls fail closed. An
35
+ * uncanceled submit retains the synchronous close/announce/focus behavior.
25
36
  * @event blur - Re-dispatched from the comment `<textarea>`'s own native `blur` -- bubbling and
26
37
  * composed (unlike the native event, which is neither), so a listener above the shadow boundary
27
38
  * can observe it. Mirrors `<lr-model-select>`'s identical re-dispatch for its own free-text
@@ -69,17 +80,31 @@ disabled:boolean;
69
80
  /** A canceled `lr-feedback-submit` is awaiting host persistence. While true, every feedback control is
70
81
  * disabled and the open panel is busy. Resolve through `finalizePendingSubmit()` or
71
82
  * `revertPendingSubmit()`; the component sets this state automatically. */
72
- pending:boolean;private panelOpen;private selectedReasonIds;private commentDraft;private pendingInternalRating;private submitGeneration;private pendingSubmission?;private upButtonEl?;private downButtonEl?;private submitButtonEl?;private liveRegion?;private readonly panelId;private readonly upToolbarAction;private readonly downToolbarAction;private createToolbarAction;
73
- /** Ordered logical actions exposed to an enclosing toolbar without exposing shadow nodes. */
83
+ pending:boolean;
84
+ /** Native spellcheck state for the optional comment textarea. `spellcheck="false"` parses false. */
85
+ spellcheck:boolean;
86
+ /** Native autocapitalization hint for the optional comment textarea. Empty preserves its default. */
87
+ autocapitalize:string;private autocorrectValue;
88
+ /** Native autocorrect state for the optional comment textarea. Reads are boolean; writes also
89
+ * accept the legacy `'off'` and `'false'` string forms. */
90
+ get autocorrect():boolean;set autocorrect(next:boolean|string);
91
+ /** Native wrapping mode for the optional comment textarea. Removing `wrap` restores `'soft'`. */
92
+ wrap:MessageFeedbackWrap;private panelOpen;private selectedReasonIds;private commentDraft;private detailProjectionSource;private detailProjection;private pendingInternalRating;private submissionSequence;private submissionCount;private legacyNoArgumentSettlementInvalidated;private lifecycleGeneration;private focusGeneration;private settingPending;private dispatchingSubmission?;private pendingSubmission?;private upButtonEl?;private downButtonEl?;private submitButtonEl?;private liveRegion?;private readonly panelId;private readonly upToolbarAction;private readonly downToolbarAction;private createToolbarAction;
93
+ /** Ordered logical actions exposed to an enclosing toolbar without exposing shadow nodes.
94
+ * A parent releases its optional lease when this provider leaves, restoring an untouched
95
+ * authored thumb tabindex without replacing a later consumer value. */
74
96
  getToolbarActions():readonly LyraToolbarAction[];
75
97
  /** Focuses the thumb matching the current `rating` (the up thumb when `rating` is `null`) --
76
98
  * lets a toolbar embedding this component (e.g. `<lr-message-actions>`) treat it as one
77
99
  * arrow-key stop. */
78
100
  focus(options?:FocusOptions):void;blur():void;
79
101
  /** Activates the thumb matching the current rating (the up thumb when unset). */
80
- click():void;private get detailReasons();private get detailCommentable();private get hasDetailContent();private detailApplies;protected willUpdate(changed:PropertyValues<this>):void;protected updated(changed:PropertyValues<this>):void;private setRatingFromInteraction;private activateThumb;private focusActiveThumb;private closePanel;private onPanelKeyDown;private toggleReason;private onCommentInput;private onCommentFocus;private onCommentBlur;private completeSubmission;
81
- /** Completes a submit held by `preventDefault()`, closing and announcing success. */
82
- finalizePendingSubmit():void;
83
- /** Releases a submit held by `preventDefault()`, restoring the rating that preceded the request
84
- * without announcing success or clearing a detailed draft. */
85
- revertPendingSubmit():void;private requestSubmission;private onSubmit;private renderThumb;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-feedback':LyraMessageFeedback;}}
102
+ click():void;private get detailReasons();private get detailCommentable();private get currentDetailProjection();private get hasDetailContent();private detailApplies;requestUpdate(name?:PropertyKey,oldValue?:unknown,options?:PropertyDeclaration):void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues<this>):void;protected updated(changed:PropertyValues<this>):void;private setRatingFromInteraction;private activateThumb;private focusActiveThumb;private closePanel;private onPanelKeyDown;private toggleReason;private onCommentInput;private onCommentFocus;private onCommentBlur;private setPending;
103
+ /** Retires a transaction synchronously so a later same-turn settlement cannot affect it. */
104
+ private invalidatePendingSubmission;private isCurrentPendingSubmission;private canSettleWithoutSubmissionId;private scheduleSettlementFocus;private ownsSettlementFocus;private settlePendingSubmission;private commitSettlement;
105
+ /** Completes a live held submit. Pass its event `submissionId`; a no-argument call is retained
106
+ * only for this instance's never-invalidated first transaction. Returns whether this call won. */
107
+ finalizePendingSubmit(submissionId?:string):boolean;
108
+ /** Reverts a live held submit to the rating preceding it. Pass its event `submissionId`; the
109
+ * restricted legacy no-argument form follows `finalizePendingSubmit()`. Returns whether it won. */
110
+ revertPendingSubmit(submissionId?:string):boolean;private requestSubmission;private onSubmit;private renderThumb;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-feedback':LyraMessageFeedback;}}