@aceshooting/lyra-ui 19.0.1 → 20.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/CHANGELOG.md +159 -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 +14 -4
  5. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
  6. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +1 -0
  7. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +4 -3
  8. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +1 -1
  9. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts +3 -1
  10. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +1 -0
  11. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +4 -3
  12. package/dist/components/agent-tools/context-inspector/context-inspector.styles.js +1 -1
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +1 -1
  14. package/dist/components/agent-tools/eval-result/eval-result.class.js +1 -1
  15. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.d.ts +1 -0
  16. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +4 -3
  17. package/dist/components/agent-tools/evaluation-run/evaluation-run.styles.js +1 -1
  18. package/dist/components/agent-tools/policy-summary/policy-summary.class.d.ts +1 -0
  19. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +4 -3
  20. package/dist/components/agent-tools/policy-summary/policy-summary.styles.js +1 -1
  21. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +1 -1
  22. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +10 -1
  23. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +3 -3
  24. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +1 -1
  25. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +6 -3
  26. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +1 -1
  27. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +14 -3
  28. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
  29. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +12 -2
  30. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +3 -1
  31. package/dist/components/charts/chart/box-plot.class.d.ts +15 -3
  32. package/dist/components/charts/chart/box-plot.class.js +3 -3
  33. package/dist/components/charts/chart/box-plot.styles.js +1 -1
  34. package/dist/components/charts/chart/chart.class.d.ts +23 -5
  35. package/dist/components/charts/chart/chart.class.js +2 -2
  36. package/dist/components/charts/chart/chart.styles.js +1 -1
  37. package/dist/components/charts/chart/lite-chart.class.js +1 -1
  38. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  39. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +4 -2
  40. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +1 -1
  41. package/dist/components/conversation/branch-picker/branch-picker.class.d.ts +4 -2
  42. package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -1
  43. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +4 -3
  44. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  45. package/dist/components/conversation/code-block/code-block-core.class.d.ts +6 -11
  46. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  47. package/dist/components/conversation/code-block/code-block-shared.d.ts +29 -1
  48. package/dist/components/conversation/code-block/code-block-shared.js +1 -1
  49. package/dist/components/conversation/code-block/code-block.class.d.ts +6 -11
  50. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  51. package/dist/components/conversation/markdown/markdown-shared.js +2 -2
  52. package/dist/components/conversation/message-actions/message-actions.class.d.ts +4 -2
  53. package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
  54. package/dist/components/conversation/message-parts/message-parts.class.d.ts +17 -2
  55. package/dist/components/conversation/model-select/model-select.class.js +1 -0
  56. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  57. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +5 -1
  58. package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -2
  59. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +6 -1
  60. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +2 -2
  61. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +5 -1
  62. package/dist/components/conversation/realtime-session/realtime-session.class.js +1 -1
  63. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +5 -1
  64. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  65. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +13 -2
  66. package/dist/components/conversation/voice-picker/voice-picker.class.js +5 -3
  67. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  68. package/dist/components/data/calendar/calendar.class.d.ts +9 -0
  69. package/dist/components/data/calendar/calendar.class.js +2 -2
  70. package/dist/components/data/calendar/calendar.styles.js +1 -1
  71. package/dist/components/data/condition-builder/condition-builder.class.d.ts +5 -1
  72. package/dist/components/data/context-meter/context-meter.class.d.ts +4 -0
  73. package/dist/components/data/context-meter/context-meter.styles.js +1 -1
  74. package/dist/components/data/data-grid/data-grid.class.d.ts +8 -2
  75. package/dist/components/data/data-grid/data-grid.class.js +1 -2
  76. package/dist/components/data/flow-node/flow-node.class.d.ts +7 -4
  77. package/dist/components/data/flow-node/flow-node.styles.js +1 -1
  78. package/dist/components/data/funnel/funnel.class.d.ts +5 -0
  79. package/dist/components/data/funnel/funnel.class.js +4 -3
  80. package/dist/components/data/funnel/funnel.styles.js +1 -1
  81. package/dist/components/data/gauge/gauge.class.d.ts +12 -1
  82. package/dist/components/data/gauge/gauge.styles.js +1 -1
  83. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +50 -13
  84. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +2 -2
  85. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +1 -1
  86. package/dist/components/data/heatmap/heatmap.class.d.ts +27 -9
  87. package/dist/components/data/heatmap/heatmap.class.js +5 -3
  88. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +2 -0
  89. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  90. package/dist/components/data/table/table.class.d.ts +8 -0
  91. package/dist/components/data/table/table.class.js +2 -1
  92. package/dist/components/data/tree/tree.class.d.ts +20 -1
  93. package/dist/components/data/tree/tree.class.js +1 -1
  94. package/dist/components/data/word-cloud/word-cloud.class.d.ts +4 -1
  95. package/dist/components/data/word-cloud/word-cloud.class.js +2 -2
  96. package/dist/components/forms/button/button.class.js +1 -1
  97. package/dist/components/forms/checkbox/checkbox.class.d.ts +11 -8
  98. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  99. package/dist/components/forms/checkbox/checkbox.styles.js +1 -1
  100. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +2 -2
  101. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  102. package/dist/components/forms/code-editor/code-editor.class.d.ts +2 -0
  103. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  104. package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
  105. package/dist/components/forms/color-picker/color-picker.class.d.ts +11 -1
  106. package/dist/components/forms/color-picker/color-picker.class.js +4 -3
  107. package/dist/components/forms/combobox/combobox.class.d.ts +67 -18
  108. package/dist/components/forms/combobox/combobox.class.js +7 -6
  109. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  110. package/dist/components/forms/date-picker/date-input.class.d.ts +22 -2
  111. package/dist/components/forms/date-picker/date-input.class.js +4 -2
  112. package/dist/components/forms/date-picker/date-input.styles.js +1 -1
  113. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +18 -4
  114. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  115. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +18 -4
  116. package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
  117. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
  118. package/dist/components/forms/icon-button/icon-button.class.d.ts +1 -1
  119. package/dist/components/forms/input/time-input.class.d.ts +11 -1
  120. package/dist/components/forms/input/time-input.class.js +4 -3
  121. package/dist/components/forms/input/time-input.styles.js +1 -1
  122. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +17 -3
  123. package/dist/components/forms/locale-picker/locale-picker.class.js +3 -2
  124. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  125. package/dist/components/forms/otp-input/otp-input.class.d.ts +13 -5
  126. package/dist/components/forms/otp-input/otp-input.class.js +2 -2
  127. package/dist/components/forms/otp-input/otp-input.styles.js +1 -1
  128. package/dist/components/forms/phone-input/phone-input.class.d.ts +10 -3
  129. package/dist/components/forms/phone-input/phone-input.class.js +6 -2
  130. package/dist/components/forms/phone-input/phone-input.styles.js +1 -1
  131. package/dist/components/forms/radio/radio-group.class.d.ts +1 -1
  132. package/dist/components/forms/radio/radio-group.class.js +2 -2
  133. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +9 -1
  134. package/dist/components/forms/rubric-form/rubric-form.class.js +5 -3
  135. package/dist/components/forms/select/select.class.d.ts +4 -0
  136. package/dist/components/forms/select/select.styles.js +1 -1
  137. package/dist/components/forms/slider/slider.class.d.ts +5 -1
  138. package/dist/components/forms/slider/slider.class.js +3 -3
  139. package/dist/components/forms/switch/switch.class.d.ts +6 -5
  140. package/dist/components/forms/switch/switch.class.js +1 -1
  141. package/dist/components/forms/time-range/time-range.class.d.ts +2 -2
  142. package/dist/components/forms/token-input/token-input.class.d.ts +13 -3
  143. package/dist/components/forms/token-input/token-input.class.js +3 -1
  144. package/dist/components/layout/carousel/carousel.class.d.ts +4 -1
  145. package/dist/components/layout/carousel/carousel.class.js +1 -1
  146. package/dist/components/layout/command-palette/command-palette.class.d.ts +8 -2
  147. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  148. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  149. package/dist/components/layout/details/accordion.class.js +1 -1
  150. package/dist/components/layout/dock-panel/dock-panel.class.d.ts +10 -7
  151. package/dist/components/layout/dock-panel/dock-panel.class.js +2 -2
  152. package/dist/components/layout/dock-panel/dock-panel.styles.js +1 -1
  153. package/dist/components/layout/menu/menu.class.d.ts +13 -3
  154. package/dist/components/layout/menu/menu.class.js +4 -3
  155. package/dist/components/layout/menu/menu.styles.js +1 -1
  156. package/dist/components/layout/page/page.class.d.ts +7 -1
  157. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
  158. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  159. package/dist/components/layout/segmented/segmented.class.d.ts +2 -0
  160. package/dist/components/layout/segmented/segmented.styles.js +1 -1
  161. package/dist/components/layout/virtual-list/virtual-list.styles.js +1 -1
  162. package/dist/components/layout/widget/widget.class.d.ts +15 -2
  163. package/dist/components/layout/widget/widget.class.js +1 -1
  164. package/dist/components/layout/widget/widget.styles.js +1 -1
  165. package/dist/components/media/avatar/avatar.class.d.ts +4 -0
  166. package/dist/components/media/avatar/avatar.styles.js +1 -1
  167. package/dist/components/media/avatar-group/avatar-group.class.d.ts +8 -1
  168. package/dist/components/media/avatar-group/avatar-group.styles.js +1 -1
  169. package/dist/components/media/drop-zone/drop-zone.class.d.ts +10 -4
  170. package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
  171. package/dist/components/media/drop-zone/drop-zone.styles.js +1 -1
  172. package/dist/components/media/flag/flag.class.js +1 -1
  173. package/dist/components/media/map/map.class.d.ts +19 -5
  174. package/dist/components/media/map/map.class.js +3 -3
  175. package/dist/components/media/video-playlist/video-playlist.class.d.ts +6 -3
  176. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  177. package/dist/components/overlays/callout/callout.class.d.ts +4 -1
  178. package/dist/components/overlays/dialog/dialog.class.d.ts +4 -1
  179. package/dist/components/overlays/overlay/overlay.styles.js +1 -1
  180. package/dist/components/overlays/overlay/popover.class.d.ts +9 -1
  181. package/dist/components/overlays/overlay/popover.class.js +3 -2
  182. package/dist/components/overlays/overlay/tooltip.class.d.ts +14 -4
  183. package/dist/components/overlays/overlay/tooltip.class.js +3 -2
  184. package/dist/components/overlays/popup/popup.class.d.ts +15 -1
  185. package/dist/components/overlays/popup/popup.class.js +3 -3
  186. package/dist/components/overlays/popup/popup.styles.js +1 -1
  187. package/dist/components/overlays/progress/progress-bar.class.d.ts +2 -0
  188. package/dist/components/overlays/progress/progress.styles.js +1 -1
  189. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +4 -2
  190. package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
  191. package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts +4 -0
  192. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +4 -3
  193. package/dist/components/retrieval/claim-evidence/claim-evidence.styles.js +1 -1
  194. package/dist/components/retrieval/community-card/community-card.class.d.ts +6 -1
  195. package/dist/components/retrieval/community-card/community-card.styles.js +1 -1
  196. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +9 -1
  197. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +4 -3
  198. package/dist/components/retrieval/entity-card/entity-card.styles.js +1 -1
  199. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +4 -2
  200. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  201. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +2 -2
  202. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +18 -4
  203. package/dist/components/retrieval/graph-legend/graph-legend.class.js +2 -2
  204. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +7 -0
  205. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +4 -3
  206. package/dist/components/retrieval/grounding-summary/grounding-summary.styles.js +1 -1
  207. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +6 -0
  208. package/dist/components/retrieval/memory-panel/memory-panel.class.js +4 -3
  209. package/dist/components/retrieval/memory-panel/memory-panel.styles.js +1 -1
  210. package/dist/components/retrieval/mind-map/mind-map-layout.d.ts +17 -1
  211. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  212. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +8 -1
  213. package/dist/components/retrieval/mind-map/mind-map.class.js +3 -2
  214. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +5 -0
  215. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +6 -5
  216. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
  217. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +5 -5
  218. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
  219. package/dist/components/retrieval/source-list/source-list.class.d.ts +21 -2
  220. package/dist/components/retrieval/source-list/source-list.class.js +2 -2
  221. package/dist/components/retrieval/source-list/source-list.styles.js +1 -1
  222. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +3 -1
  223. package/dist/components/retrieval/source-picker/source-picker.class.js +2 -2
  224. package/dist/components/utility/diff-view/diff-view.class.d.ts +105 -8
  225. package/dist/components/utility/diff-view/diff-view.class.js +21 -5
  226. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  227. package/dist/components/utility/export-button/export-button.class.d.ts +26 -2
  228. package/dist/components/utility/export-button/export-button.class.js +4 -2
  229. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  230. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +19 -1
  231. package/dist/components/utility/mention-popover/mention-popover.class.js +3 -2
  232. package/dist/components/utility/mention-popover/mention-popover.styles.js +1 -1
  233. package/dist/components/utility/tour/tour.class.d.ts +1 -3
  234. package/dist/components/utility/tour/tour.class.js +1 -1
  235. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts +20 -3
  236. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
  237. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  238. package/dist/components/viewers/geojson-view/geojson-view.styles.js +1 -1
  239. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +5 -0
  240. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +6 -3
  241. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +7 -1
  242. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +1 -1
  243. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts +7 -1
  244. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +1 -1
  245. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +5 -0
  246. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +1 -1
  247. package/dist/custom-elements-jsx.d.ts +1 -1
  248. package/dist/events.d.ts +79 -30
  249. package/dist/internal/accessibility-visibility.js +1 -1
  250. package/dist/internal/aria-reflection.js +1 -1
  251. package/dist/internal/catalog-picker.d.ts +14 -3
  252. package/dist/internal/catalog-picker.js +1 -1
  253. package/dist/internal/default-strings.generated.d.ts +1 -1
  254. package/dist/internal/default-strings.generated.js +2 -2
  255. package/dist/internal/localization-types.d.ts +1 -1
  256. package/dist/internal/localization.js +2 -2
  257. package/dist/internal/lyra-element.d.ts +17 -0
  258. package/dist/internal/lyra-element.js +2 -2
  259. package/dist/internal/package-metadata.d.ts +1 -1
  260. package/dist/internal/package-metadata.js +1 -1
  261. package/dist/svelte.d.ts +1 -1
  262. package/dist/testing/lyra-tag-event-map.js +1 -1
  263. package/dist/translations/ar/agent-tools.js +1 -1
  264. package/dist/translations/ar/data.js +1 -1
  265. package/dist/translations/ar/retrieval.js +1 -1
  266. package/dist/translations/ar/shared.js +1 -1
  267. package/dist/translations/ar/viewers.js +1 -1
  268. package/dist/translations/de/agent-tools.js +1 -1
  269. package/dist/translations/de/data.js +1 -1
  270. package/dist/translations/de/retrieval.js +1 -1
  271. package/dist/translations/de/shared.js +1 -1
  272. package/dist/translations/de/viewers.js +1 -1
  273. package/dist/translations/es/agent-tools.js +1 -1
  274. package/dist/translations/es/data.js +1 -1
  275. package/dist/translations/es/retrieval.js +1 -1
  276. package/dist/translations/es/shared.js +1 -1
  277. package/dist/translations/es/viewers.js +1 -1
  278. package/dist/translations/fa/agent-tools.js +1 -1
  279. package/dist/translations/fa/data.js +1 -1
  280. package/dist/translations/fa/retrieval.js +1 -1
  281. package/dist/translations/fa/shared.js +1 -1
  282. package/dist/translations/fa/viewers.js +1 -1
  283. package/dist/translations/fr/agent-tools.js +1 -1
  284. package/dist/translations/fr/data.js +1 -1
  285. package/dist/translations/fr/retrieval.js +1 -1
  286. package/dist/translations/fr/shared.js +1 -1
  287. package/dist/translations/fr/viewers.js +1 -1
  288. package/dist/translations/he/agent-tools.js +1 -1
  289. package/dist/translations/he/data.js +1 -1
  290. package/dist/translations/he/retrieval.js +1 -1
  291. package/dist/translations/he/shared.js +1 -1
  292. package/dist/translations/he/viewers.js +1 -1
  293. package/dist/translations/it/agent-tools.js +1 -1
  294. package/dist/translations/it/data.js +1 -1
  295. package/dist/translations/it/retrieval.js +1 -1
  296. package/dist/translations/it/shared.js +1 -1
  297. package/dist/translations/it/viewers.js +1 -1
  298. package/dist/translations/ja/agent-tools.js +1 -1
  299. package/dist/translations/ja/data.js +1 -1
  300. package/dist/translations/ja/retrieval.js +1 -1
  301. package/dist/translations/ja/shared.js +1 -1
  302. package/dist/translations/ja/viewers.js +1 -1
  303. package/dist/translations/pt-BR/agent-tools.js +1 -1
  304. package/dist/translations/pt-BR/data.js +1 -1
  305. package/dist/translations/pt-BR/retrieval.js +1 -1
  306. package/dist/translations/pt-BR/shared.js +1 -1
  307. package/dist/translations/pt-BR/viewers.js +1 -1
  308. package/dist/translations/ro/agent-tools.js +1 -1
  309. package/dist/translations/ro/data.js +1 -1
  310. package/dist/translations/ro/retrieval.js +1 -1
  311. package/dist/translations/ro/shared.js +1 -1
  312. package/dist/translations/ro/viewers.js +1 -1
  313. package/dist/translations/ru/agent-tools.js +1 -1
  314. package/dist/translations/ru/data.js +1 -1
  315. package/dist/translations/ru/retrieval.js +1 -1
  316. package/dist/translations/ru/shared.js +1 -1
  317. package/dist/translations/ru/viewers.js +1 -1
  318. package/dist/translations/zh-CN/agent-tools.js +1 -1
  319. package/dist/translations/zh-CN/data.js +1 -1
  320. package/dist/translations/zh-CN/retrieval.js +1 -1
  321. package/dist/translations/zh-CN/shared.js +1 -1
  322. package/dist/translations/zh-CN/viewers.js +1 -1
  323. package/dist/vue.d.ts +1 -1
  324. package/llms/components/lr-activity-feed.md +20 -9
  325. package/llms/components/lr-approval-queue.md +3 -2
  326. package/llms/components/lr-archive-viewer.md +8 -1
  327. package/llms/components/lr-artifact-panel.md +3 -1
  328. package/llms/components/lr-audio-visualizer.md +3 -1
  329. package/llms/components/lr-avatar-group.md +13 -6
  330. package/llms/components/lr-avatar.md +6 -2
  331. package/llms/components/lr-bar-chart.md +6 -3
  332. package/llms/components/lr-box-plot.md +6 -2
  333. package/llms/components/lr-branch-picker.md +3 -1
  334. package/llms/components/lr-bubble-chart.md +6 -3
  335. package/llms/components/lr-calendar.md +10 -3
  336. package/llms/components/lr-carousel.md +4 -2
  337. package/llms/components/lr-chart.md +12 -4
  338. package/llms/components/lr-chat-viewport.md +3 -2
  339. package/llms/components/lr-checkbox.md +8 -5
  340. package/llms/components/lr-citation-badge.md +2 -0
  341. package/llms/components/lr-claim-evidence.md +6 -2
  342. package/llms/components/lr-code-editor.md +3 -1
  343. package/llms/components/lr-color-picker.md +20 -8
  344. package/llms/components/lr-combobox.md +26 -3
  345. package/llms/components/lr-command-palette.md +6 -3
  346. package/llms/components/lr-community-card.md +7 -4
  347. package/llms/components/lr-context-inspector.md +3 -2
  348. package/llms/components/lr-context-meter.md +13 -5
  349. package/llms/components/lr-data-grid.md +2 -0
  350. package/llms/components/lr-date-input.md +12 -3
  351. package/llms/components/lr-date-picker.md +11 -2
  352. package/llms/components/lr-diff-view.md +46 -5
  353. package/llms/components/lr-doughnut-chart.md +6 -3
  354. package/llms/components/lr-drop-zone.md +7 -3
  355. package/llms/components/lr-embedding-explorer.md +8 -2
  356. package/llms/components/lr-emoji-picker.md +5 -1
  357. package/llms/components/lr-entity-chip.md +2 -0
  358. package/llms/components/lr-eval-run.md +3 -2
  359. package/llms/components/lr-export-button.md +5 -2
  360. package/llms/components/lr-flow-node.md +7 -4
  361. package/llms/components/lr-funnel.md +7 -2
  362. package/llms/components/lr-gauge.md +7 -2
  363. package/llms/components/lr-geojson-view.md +10 -2
  364. package/llms/components/lr-geojson-viewer.md +10 -2
  365. package/llms/components/lr-graph-legend.md +6 -3
  366. package/llms/components/lr-graph-query-builder.md +21 -11
  367. package/llms/components/lr-grounding-summary.md +8 -2
  368. package/llms/components/lr-heatmap.md +5 -2
  369. package/llms/components/lr-histogram.md +4 -2
  370. package/llms/components/lr-json-schema-viewer.md +7 -5
  371. package/llms/components/lr-line-chart.md +6 -3
  372. package/llms/components/lr-locale-picker.md +4 -1
  373. package/llms/components/lr-map.md +5 -3
  374. package/llms/components/lr-memory-panel.md +6 -2
  375. package/llms/components/lr-mention-popover.md +7 -4
  376. package/llms/components/lr-message-actions.md +3 -1
  377. package/llms/components/lr-message-parts.md +8 -2
  378. package/llms/components/lr-mind-map.md +11 -2
  379. package/llms/components/lr-option.md +25 -2
  380. package/llms/components/lr-otp-input.md +3 -1
  381. package/llms/components/lr-phone-input.md +9 -5
  382. package/llms/components/lr-pie-chart.md +6 -3
  383. package/llms/components/lr-polar-area-chart.md +6 -3
  384. package/llms/components/lr-policy-summary.md +3 -2
  385. package/llms/components/lr-progress-bar.md +4 -1
  386. package/llms/components/lr-prompt-input.md +4 -1
  387. package/llms/components/lr-prompt-queue.md +5 -2
  388. package/llms/components/lr-radar-chart.md +6 -3
  389. package/llms/components/lr-rag-eval-dashboard.md +7 -2
  390. package/llms/components/lr-realtime-session.md +3 -1
  391. package/llms/components/lr-rubric-form.md +6 -1
  392. package/llms/components/lr-scatter-chart.md +6 -3
  393. package/llms/components/lr-segmented.md +3 -1
  394. package/llms/components/lr-select.md +7 -1
  395. package/llms/components/lr-selection-toolbar.md +4 -1
  396. package/llms/components/lr-sequence-strip.md +7 -3
  397. package/llms/components/lr-source-card.md +16 -1
  398. package/llms/components/lr-source-list.md +17 -2
  399. package/llms/components/lr-source-picker.md +3 -1
  400. package/llms/components/lr-subagent-panel.md +6 -3
  401. package/llms/components/lr-switch.md +4 -3
  402. package/llms/components/lr-table.md +6 -1
  403. package/llms/components/lr-thinking-panel.md +8 -5
  404. package/llms/components/lr-token-input.md +15 -1
  405. package/llms/components/lr-tool-call-chip.md +2 -0
  406. package/llms/components/lr-tool-param-form.md +15 -4
  407. package/llms/components/lr-tooltip.md +8 -4
  408. package/llms/components/lr-trace-tree.md +7 -4
  409. package/llms/components/lr-video-playlist.md +7 -5
  410. package/llms/components/lr-voice-picker.md +7 -4
  411. package/llms/components/lr-widget.md +15 -2
  412. package/llms/migration.md +4 -4
  413. package/llms-full.txt +552 -159
  414. package/package.json +11 -9
  415. package/registrations.json +1 -1
  416. package/vscode-css-data.json +1 -1
  417. package/vscode-html-data.json +1 -1
  418. package/web-types.json +1 -1
@@ -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{html}from"lit";import{property,query}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteInteger,finiteNumber,finiteRange}from"../../../internal/numbers.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{resolveCanvasColor}from"../../../internal/canvas-color.js";import{literalSetConverter}from"../../../internal/converters.js";import{styles}from"./audio-visualizer.styles.js";import{LYRA_DEFAULT_audioVisualizerIdle,LYRA_DEFAULT_audioVisualizerLabel,LYRA_DEFAULT_audioVisualizerListening,LYRA_DEFAULT_audioVisualizerSpeaking,LYRA_DEFAULT_audioVisualizerThinking}from"../../../internal/default-strings.generated.js";const AUDIO_VISUALIZER_MODE=literalSetConverter(["bars","waveform"],"bars"),AUDIO_VISUALIZER_STATE=literalSetConverter(["idle","listening","thinking","speaking"],"idle"),WAVEFORM_SAMPLES=64,AMBIENT_REDUCED_MOTION_INTERVAL_MS=500,DEFAULT_AMBIENT_DURATION_MS=1800;function parseAmbientDuration(value){const match=/^\+?(?:(?:\d+\.?\d*)|(?:\.\d+))(?:e[+-]?\d+)?(ms|s)$/i.exec(value.trim());if(!match)return;const unit=match[1].toLowerCase(),numeric=Number(value.trim().slice(0,-unit.length)),milliseconds=finiteNumber(numeric*(unit==="s"?1e3:1),0);return milliseconds>0?milliseconds:void 0}function clampAmplitudeProduct(amplitude,gain,min,max){const product=finiteNumber(amplitude,0)*finiteNumber(gain,1);return Number.isFinite(product)?finiteRange(product,0,min,max):product>0?max:product<0?min:0}function readIntersectionState(entries,target){try{if(!Array.isArray(entries))return;for(const candidate of entries)if(!(!candidate||typeof candidate!="object"&&typeof candidate!="function"))try{const entry=candidate;if(entry.target!==target)continue;const isIntersecting=entry.isIntersecting;if(typeof isIntersecting=="boolean")return isIntersecting}catch{}}catch{}}class LyraAudioVisualizer extends LyraElement{static{this.defaultStrings={...super.defaultStrings,audioVisualizerIdle:LYRA_DEFAULT_audioVisualizerIdle,audioVisualizerLabel:LYRA_DEFAULT_audioVisualizerLabel,audioVisualizerListening:LYRA_DEFAULT_audioVisualizerListening,audioVisualizerSpeaking:LYRA_DEFAULT_audioVisualizerSpeaking,audioVisualizerThinking:LYRA_DEFAULT_audioVisualizerThinking}}static{this.styles=[LyraElement.styles,styles]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get state(){return this._state}set state(next){const normalized=AUDIO_VISUALIZER_STATE.normalize(next),old=this._state;old!==normalized&&(this._state=normalized,this.requestUpdate("state",old))}get mode(){return this._mode}set mode(next){const normalized=AUDIO_VISUALIZER_MODE.normalize(next),old=this._mode;old!==normalized&&(this._mode=normalized,this.requestUpdate("mode",old))}get effectiveBarCount(){return finiteInteger(this.barCount,5,1,64)}get effectiveLevel(){return this.level==null?null:finiteRange(this.level,0,0,1)}get effectiveGain(){return finiteNumber(this.gain,1)}constructor(){super(),this.stream=null,this.level=null,this._state="idle",this._mode="bars",this.barCount=5,this.gain=1,this.label="",this.lastAmbientDrawMs=0,this.visible=!0,this.visibilityKnown=!0,this.intersectionGeneration=0,this.onAudioCtxStateChange=()=>{this.scheduleDraw()},this.scheduleDraw=()=>{if(!this.visibilityKnown||!this.visible||this.drawFrameRequest)return;const owner=this.ownerDocument.defaultView;if(!owner||!this.isConnected)return;const request={owner,handle:0};request.handle=owner.requestAnimationFrame(nowMs=>this.drawFrame(request,nowMs)),this.drawFrameRequest=request},this.requestUpdate("state",void 0),this.requestUpdate("mode",void 0),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback();const owner=this.ownerDocument.defaultView;if(!owner)return;const ResizeObserverCtor=owner.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(entries=>{if(!this.isConnected||this.ownerDocument.defaultView!==owner||this.resizeObserver!==observer)return;const rect=entries[entries.length-1]?.contentRect;rect&&(this.hostSize={width:rect.width,height:rect.height}),this.scheduleDraw()}),this.resizeObserver=observer,observer.observe(this)}if(this.watchDpr(),typeof owner.matchMedia=="function"){const query2=owner.matchMedia("(prefers-reduced-motion: reduce)"),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.motionQuery!==query2||this.scheduleDraw()};this.motionQuery=query2,this.motionChangeListener=listener,query2.addEventListener("change",listener)}this.resolvedColors=void 0,this.ambientDurationMs=void 0,this.syncAnalyser(),this.bindVisibilityObserver(owner),this.lastAmbientDrawMs=0,this.scheduleDraw()}disconnectedCallback(){super.disconnectedCallback(),this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.hostSize=void 0,this.clearDprWatcher(),this.clearMotionWatcher(),this.clearVisibilityObserver(),this.visible=!1,this.visibilityKnown=!1,this.cancelDrawFrame(),this.closeAudioContext()}adoptedCallback(){super.adoptedCallback(),this.clearVisibilityObserver(),this.visible=!1,this.visibilityKnown=!1}bindVisibilityObserver(owner){this.clearVisibilityObserver();let IntersectionObserverCtor;try{IntersectionObserverCtor=owner.IntersectionObserver}catch{this.restoreImmediateVisibility();return}if(typeof IntersectionObserverCtor!="function"){this.restoreImmediateVisibility();return}this.visible=!1,this.visibilityKnown=!1;const generation=++this.intersectionGeneration;let observer;try{observer=new IntersectionObserverCtor(entries=>{if(generation!==this.intersectionGeneration||!this.isConnected||this.ownerDocument.defaultView!==owner||this.intersectionObserver!==observer)return;const isIntersecting=readIntersectionState(entries,this);if(isIntersecting===void 0)return;const wasPaintable=this.visibilityKnown&&this.visible;this.visibilityKnown=!0,this.visible=isIntersecting,this.visible?wasPaintable||this.scheduleDraw():this.cancelDrawFrame()}),this.intersectionObserver=observer,observer.observe(this)}catch{try{observer?.disconnect()}catch{}if(generation!==this.intersectionGeneration)return;this.intersectionObserver=void 0,this.intersectionGeneration++,this.restoreImmediateVisibility()}}clearVisibilityObserver(){this.intersectionGeneration++;try{this.intersectionObserver?.disconnect()}catch{}this.intersectionObserver=void 0}restoreImmediateVisibility(){this.visible=!0,this.visibilityKnown=!0}watchDpr(){this.clearDprWatcher();const owner=this.ownerDocument.defaultView;if(!owner||typeof owner.matchMedia!="function")return;const query2=owner.matchMedia(`(resolution: ${owner.devicePixelRatio}dppx)`),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.dprQuery!==query2||(this.watchDpr(),this.scheduleDraw())};this.dprQuery=query2,this.dprChangeListener=listener,query2.addEventListener("change",listener)}clearDprWatcher(){this.dprQuery&&this.dprChangeListener&&this.dprQuery.removeEventListener("change",this.dprChangeListener),this.dprQuery=void 0,this.dprChangeListener=void 0}clearMotionWatcher(){this.motionQuery&&this.motionChangeListener&&this.motionQuery.removeEventListener("change",this.motionChangeListener),this.motionQuery=void 0,this.motionChangeListener=void 0}refreshTheme(){this.resolvedColors=void 0,this.ambientDurationMs=void 0,this.scheduleDraw()}get hasUsableAudioStream(){if(!this.stream||typeof this.stream.getAudioTracks!="function")return!1;try{return this.stream.getAudioTracks().some(track=>track.readyState!=="ended")}catch{return!1}}syncAnalyser(){if(!this.isConnected||!this.hasUsableAudioStream){this.sourceNode?.disconnect(),this.sourceNode=void 0,this.analyser=void 0,this.timeDomainData=void 0,this.audioCtx&&this.audioCtx.suspend().catch(()=>{});return}const stream=this.stream;if(!stream)return;const owner=this.ownerDocument.defaultView;if(!owner)return;let context=this.audioCtx,source;try{if(!context){const AudioCtxCtor=owner.AudioContext??owner.webkitAudioContext;if(!AudioCtxCtor)return;context=new AudioCtxCtor,context.addEventListener("statechange",this.onAudioCtxStateChange)}source=context.createMediaStreamSource(stream);const analyser=context.createAnalyser();analyser.fftSize=this.mode==="waveform"?2048:256,source.connect(analyser);const data=new owner.Uint8Array(analyser.frequencyBinCount);this.sourceNode?.disconnect(),this.audioCtx=context,this.sourceNode=source,this.analyser=analyser,this.timeDomainData=data,context.resume().catch(()=>{})}catch{source?.disconnect(),context&&(context.removeEventListener("statechange",this.onAudioCtxStateChange),context.close().catch(()=>{})),this.audioCtx=void 0,this.sourceNode=void 0,this.analyser=void 0,this.timeDomainData=void 0}}closeAudioContext(){this.sourceNode?.disconnect(),this.sourceNode=void 0,this.analyser=void 0,this.timeDomainData=void 0,this.audioCtx&&(this.audioCtx.removeEventListener("statechange",this.onAudioCtxStateChange),this.audioCtx.close().catch(()=>{}),this.audioCtx=void 0)}get hasLiveSignal(){return!!this.analyser&&this.audioCtx?.state==="running"||this.level!=null}stateLabel(){switch(this.state){case"listening":return this.localize("audioVisualizerListening");case"thinking":return this.localize("audioVisualizerThinking");case"speaking":return this.localize("audioVisualizerSpeaking");default:return this.localize("audioVisualizerIdle")}}willUpdate(changed){super.willUpdate(changed),(changed.has("stream")||changed.has("mode")&&this.stream)&&this.syncAnalyser(),this.syncDefaultRole();const currentAriaLabel=this.getAttribute("aria-label");if(currentAriaLabel!==null&&currentAriaLabel!==this.generatedAriaLabel)this.generatedAriaLabel=void 0;else{const generated=this.label||this.localize("audioVisualizerLabel",void 0,{state:this.stateLabel()});currentAriaLabel!==generated&&this.setAttribute("aria-label",generated),this.generatedAriaLabel=generated}}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),name==="role"&&oldValue!==value&&value===null&&this.syncDefaultRole()}syncDefaultRole(){this.hasAttribute("role")||this.setAttribute("role","img")}updated(changed){super.updated(changed),["state","mode","barCount","gain","level","stream"].some(key=>changed.has(key))&&this.scheduleDraw()}get isTimeDriven(){return this.analyser&&this.audioCtx?.state==="running"?!0:this.level!=null||prefersReducedMotion(this.ownerDocument.defaultView)?!1:this.state!=="idle"}drawFrame(request,nowMs){if(this.drawFrameRequest!==request||(this.drawFrameRequest=void 0,!this.isConnected||this.ownerDocument.defaultView!==request.owner)||!this.visibilityKnown||!this.visible)return;if(prefersReducedMotion(request.owner)&&!this.hasLiveSignal){if(nowMs-this.lastAmbientDrawMs<AMBIENT_REDUCED_MOTION_INTERVAL_MS){this.scheduleDraw();return}this.lastAmbientDrawMs=nowMs}this.draw(nowMs),this.isTimeDriven&&this.scheduleDraw()}cancelDrawFrame(){const request=this.drawFrameRequest;request&&request.owner.cancelAnimationFrame(request.handle),this.drawFrameRequest=void 0}barsFromTimeDomain(data,barCount){const segmentSize=Math.max(1,Math.floor(data.length/barCount)),bars=[];for(let i=0;i<barCount;i++){let sumSquares=0;const start=i*segmentSize,end=Math.min(data.length,start+segmentSize);for(let j=start;j<end;j++){const norm=(data[j]-128)/128;sumSquares+=norm*norm}bars.push(Math.sqrt(sumSquares/Math.max(1,end-start)))}return bars}ambientAmplitudes(nowMs,reduced){const n=this.mode==="waveform"?WAVEFORM_SAMPLES:this.effectiveBarCount,phase=reduced?0:finiteNumber(nowMs,0)/this.resolveAmbientDuration();switch(this.state){case"listening":case"speaking":{const pulse=reduced?.3:.25+.15*Math.sin(phase*2*Math.PI);return new Array(n).fill(pulse)}case"thinking":return reduced?new Array(n).fill(.3):Array.from({length:n},(_,i)=>{const pos=phase%1,dist=Math.abs(i/(n-1||1)-pos);return .15+.35*Math.max(0,1-dist*4)});default:return new Array(n).fill(.08)}}resolveAmbientDuration(){if(this.ambientDurationMs!==void 0)return this.ambientDurationMs;const style=this.ownerDocument.defaultView?.getComputedStyle(this),value=style?.getPropertyValue("--lr-audio-visualizer-ambient-duration").trim()||style?.getPropertyValue("--_lr-audio-visualizer-ambient-duration-default").trim()||"";return this.ambientDurationMs=parseAmbientDuration(value)??DEFAULT_AMBIENT_DURATION_MS,this.ambientDurationMs}currentAmplitudes(nowMs){if(this.analyser&&this.timeDomainData&&this.audioCtx?.state==="running")return this.analyser.getByteTimeDomainData(this.timeDomainData),this.mode==="waveform"?Array.from(this.timeDomainData,v=>(v-128)/128):this.barsFromTimeDomain(this.timeDomainData,this.effectiveBarCount);if(this.effectiveLevel!=null){const n=this.mode==="waveform"?WAVEFORM_SAMPLES:this.effectiveBarCount;return new Array(n).fill(this.effectiveLevel)}return this.ambientAmplitudes(nowMs,prefersReducedMotion(this.ownerDocument.defaultView))}resolveColors(){const cs=this.ownerDocument.defaultView?.getComputedStyle(this),active=cs?.getPropertyValue("--lr-audio-visualizer-color").trim()||cs?.getPropertyValue("--_lr-audio-visualizer-color-default").trim()||"#0969da",quiet=cs?.getPropertyValue("--lr-audio-visualizer-quiet-color").trim()||cs?.getPropertyValue("--_lr-audio-visualizer-quiet-color-default").trim()||"#ddf4ff";return{active:resolveCanvasColor(this,active,"#0969da"),quiet:resolveCanvasColor(this,quiet,"#ddf4ff")}}draw(nowMs){const canvas=this.canvas;if(!canvas)return;const size=this.hostSize??this.getBoundingClientRect(),w=Math.max(1,size.width),h=Math.max(1,size.height||48),dpr=this.ownerDocument.defaultView?.devicePixelRatio||1,backingW=Math.floor(w*dpr),backingH=Math.floor(h*dpr);canvas.width!==backingW&&(canvas.width=backingW),canvas.height!==backingH&&(canvas.height=backingH);const cssW=`${w}px`,cssH=`${h}px`;canvas.style.width!==cssW&&(canvas.style.width=cssW),canvas.style.height!==cssH&&(canvas.style.height=cssH);const ctx=canvas.getContext("2d");if(!ctx)return;ctx.setTransform(dpr,0,0,dpr,0,0),ctx.clearRect(0,0,w,h),this.resolvedColors??=this.resolveColors();const{active:activeColor,quiet:quietColor}=this.resolvedColors,amplitudes=this.currentAmplitudes(nowMs),active=this.hasLiveSignal||this.state==="listening"||this.state==="thinking"||this.state==="speaking";ctx.fillStyle=active?activeColor:quietColor,ctx.strokeStyle=active?activeColor:quietColor;const gain=this.effectiveGain;if(this.mode==="waveform")ctx.lineWidth=2,ctx.beginPath(),amplitudes.forEach((amp,i)=>{const x=i/(amplitudes.length-1||1)*w,y=h/2-clampAmplitudeProduct(amp,gain,-1,1)*(h/2);i===0?ctx.moveTo(x,y):ctx.lineTo(x,y)}),ctx.stroke();else{const n=amplitudes.length,gap=n>1?Math.max(0,Math.min(4,(w-n*2)/(n-1))):0,barWidth=Math.max(2,(w-gap*(n-1))/n);amplitudes.forEach((amp,i)=>{const barH=Math.max(2,clampAmplitudeProduct(amp,gain,0,1)*h),x=i*(barWidth+gap),y=(h-barH)/2;ctx.fillRect(x,y,barWidth,barH)})}}render(){return html`<div part="base"><canvas part="canvas" aria-hidden="true"></canvas></div>`}}__decorate([property({attribute:!1})],LyraAudioVisualizer.prototype,"stream",void 0),__decorate([property({type:Number})],LyraAudioVisualizer.prototype,"level",void 0),__decorate([property({reflect:!0,converter:AUDIO_VISUALIZER_STATE})],LyraAudioVisualizer.prototype,"state",null),__decorate([property({reflect:!0,converter:AUDIO_VISUALIZER_MODE})],LyraAudioVisualizer.prototype,"mode",null),__decorate([property({type:Number,attribute:"bar-count"})],LyraAudioVisualizer.prototype,"barCount",void 0),__decorate([property({type:Number})],LyraAudioVisualizer.prototype,"gain",void 0),__decorate([property()],LyraAudioVisualizer.prototype,"label",void 0),__decorate([query("canvas")],LyraAudioVisualizer.prototype,"canvas",void 0);export{LyraAudioVisualizer};
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}from"lit";import{property,query}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteInteger,finiteNumber,finiteRange}from"../../../internal/numbers.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{resolveCanvasColor}from"../../../internal/canvas-color.js";import{literalSetConverter}from"../../../internal/converters.js";import{styles}from"./audio-visualizer.styles.js";import{LYRA_DEFAULT_audioVisualizerIdle,LYRA_DEFAULT_audioVisualizerLabel,LYRA_DEFAULT_audioVisualizerListening,LYRA_DEFAULT_audioVisualizerSpeaking,LYRA_DEFAULT_audioVisualizerThinking}from"../../../internal/default-strings.generated.js";const AUDIO_VISUALIZER_MODE=literalSetConverter(["bars","waveform"],"bars"),AUDIO_VISUALIZER_STATE=literalSetConverter(["idle","listening","thinking","speaking"],"idle"),WAVEFORM_SAMPLES=64,AMBIENT_REDUCED_MOTION_INTERVAL_MS=500,DEFAULT_AMBIENT_DURATION_MS=1800;function parseAmbientDuration(value){const match=/^\+?(?:(?:\d+\.?\d*)|(?:\.\d+))(?:e[+-]?\d+)?(ms|s)$/i.exec(value.trim());if(!match)return;const unit=match[1].toLowerCase(),numeric=Number(value.trim().slice(0,-unit.length)),milliseconds=finiteNumber(numeric*(unit==="s"?1e3:1),0);return milliseconds>0?milliseconds:void 0}function clampAmplitudeProduct(amplitude,gain,min,max){const product=finiteNumber(amplitude,0)*finiteNumber(gain,1);return Number.isFinite(product)?finiteRange(product,0,min,max):product>0?max:product<0?min:0}function readIntersectionState(entries,target){try{if(!Array.isArray(entries))return;for(const candidate of entries)if(!(!candidate||typeof candidate!="object"&&typeof candidate!="function"))try{const entry=candidate;if(entry.target!==target)continue;const isIntersecting=entry.isIntersecting;if(typeof isIntersecting=="boolean")return isIntersecting}catch{}}catch{}}class LyraAudioVisualizer extends LyraElement{static{this.defaultStrings={...super.defaultStrings,audioVisualizerIdle:LYRA_DEFAULT_audioVisualizerIdle,audioVisualizerLabel:LYRA_DEFAULT_audioVisualizerLabel,audioVisualizerListening:LYRA_DEFAULT_audioVisualizerListening,audioVisualizerSpeaking:LYRA_DEFAULT_audioVisualizerSpeaking,audioVisualizerThinking:LYRA_DEFAULT_audioVisualizerThinking}}static{this.styles=[LyraElement.styles,styles]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get state(){return this._state}set state(next){const normalized=AUDIO_VISUALIZER_STATE.normalize(next),old=this._state;old!==normalized&&(this._state=normalized,this.requestUpdate("state",old))}get mode(){return this._mode}set mode(next){const normalized=AUDIO_VISUALIZER_MODE.normalize(next),old=this._mode;old!==normalized&&(this._mode=normalized,this.requestUpdate("mode",old))}get effectiveBarCount(){return finiteInteger(this.barCount,5,1,64)}get effectiveLevel(){return this.level==null?null:finiteRange(this.level,0,0,1)}get effectiveGain(){return finiteNumber(this.gain,1)}constructor(){super(),this.stream=null,this.level=null,this._state="idle",this._mode="bars",this.barCount=5,this.gain=1,this.lastAmbientDrawMs=0,this.visible=!0,this.visibilityKnown=!0,this.intersectionGeneration=0,this.onAudioCtxStateChange=()=>{this.scheduleDraw()},this.scheduleDraw=()=>{if(!this.visibilityKnown||!this.visible||this.drawFrameRequest)return;const owner=this.ownerDocument.defaultView;if(!owner||!this.isConnected)return;const request={owner,handle:0};request.handle=owner.requestAnimationFrame(nowMs=>this.drawFrame(request,nowMs)),this.drawFrameRequest=request},this.requestUpdate("state",void 0),this.requestUpdate("mode",void 0),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback();const owner=this.ownerDocument.defaultView;if(!owner)return;const ResizeObserverCtor=owner.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(entries=>{if(!this.isConnected||this.ownerDocument.defaultView!==owner||this.resizeObserver!==observer)return;const rect=entries[entries.length-1]?.contentRect;rect&&(this.hostSize={width:rect.width,height:rect.height}),this.scheduleDraw()}),this.resizeObserver=observer,observer.observe(this)}if(this.watchDpr(),typeof owner.matchMedia=="function"){const query2=owner.matchMedia("(prefers-reduced-motion: reduce)"),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.motionQuery!==query2||this.scheduleDraw()};this.motionQuery=query2,this.motionChangeListener=listener,query2.addEventListener("change",listener)}this.resolvedColors=void 0,this.ambientDurationMs=void 0,this.syncAnalyser(),this.bindVisibilityObserver(owner),this.lastAmbientDrawMs=0,this.scheduleDraw()}disconnectedCallback(){super.disconnectedCallback(),this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.hostSize=void 0,this.clearDprWatcher(),this.clearMotionWatcher(),this.clearVisibilityObserver(),this.visible=!1,this.visibilityKnown=!1,this.cancelDrawFrame(),this.closeAudioContext()}adoptedCallback(){super.adoptedCallback(),this.clearVisibilityObserver(),this.visible=!1,this.visibilityKnown=!1}bindVisibilityObserver(owner){this.clearVisibilityObserver();let IntersectionObserverCtor;try{IntersectionObserverCtor=owner.IntersectionObserver}catch{this.restoreImmediateVisibility();return}if(typeof IntersectionObserverCtor!="function"){this.restoreImmediateVisibility();return}this.visible=!1,this.visibilityKnown=!1;const generation=++this.intersectionGeneration;let observer;try{observer=new IntersectionObserverCtor(entries=>{if(generation!==this.intersectionGeneration||!this.isConnected||this.ownerDocument.defaultView!==owner||this.intersectionObserver!==observer)return;const isIntersecting=readIntersectionState(entries,this);if(isIntersecting===void 0)return;const wasPaintable=this.visibilityKnown&&this.visible;this.visibilityKnown=!0,this.visible=isIntersecting,this.visible?wasPaintable||this.scheduleDraw():this.cancelDrawFrame()}),this.intersectionObserver=observer,observer.observe(this)}catch{try{observer?.disconnect()}catch{}if(generation!==this.intersectionGeneration)return;this.intersectionObserver=void 0,this.intersectionGeneration++,this.restoreImmediateVisibility()}}clearVisibilityObserver(){this.intersectionGeneration++;try{this.intersectionObserver?.disconnect()}catch{}this.intersectionObserver=void 0}restoreImmediateVisibility(){this.visible=!0,this.visibilityKnown=!0}watchDpr(){this.clearDprWatcher();const owner=this.ownerDocument.defaultView;if(!owner||typeof owner.matchMedia!="function")return;const query2=owner.matchMedia(`(resolution: ${owner.devicePixelRatio}dppx)`),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.dprQuery!==query2||(this.watchDpr(),this.scheduleDraw())};this.dprQuery=query2,this.dprChangeListener=listener,query2.addEventListener("change",listener)}clearDprWatcher(){this.dprQuery&&this.dprChangeListener&&this.dprQuery.removeEventListener("change",this.dprChangeListener),this.dprQuery=void 0,this.dprChangeListener=void 0}clearMotionWatcher(){this.motionQuery&&this.motionChangeListener&&this.motionQuery.removeEventListener("change",this.motionChangeListener),this.motionQuery=void 0,this.motionChangeListener=void 0}refreshTheme(){this.resolvedColors=void 0,this.ambientDurationMs=void 0,this.scheduleDraw()}get hasUsableAudioStream(){if(!this.stream||typeof this.stream.getAudioTracks!="function")return!1;try{return this.stream.getAudioTracks().some(track=>track.readyState!=="ended")}catch{return!1}}syncAnalyser(){if(!this.isConnected||!this.hasUsableAudioStream){this.sourceNode?.disconnect(),this.sourceNode=void 0,this.analyser=void 0,this.timeDomainData=void 0,this.audioCtx&&this.audioCtx.suspend().catch(()=>{});return}const stream=this.stream;if(!stream)return;const owner=this.ownerDocument.defaultView;if(!owner)return;let context=this.audioCtx,source;try{if(!context){const AudioCtxCtor=owner.AudioContext??owner.webkitAudioContext;if(!AudioCtxCtor)return;context=new AudioCtxCtor,context.addEventListener("statechange",this.onAudioCtxStateChange)}source=context.createMediaStreamSource(stream);const analyser=context.createAnalyser();analyser.fftSize=this.mode==="waveform"?2048:256,source.connect(analyser);const data=new owner.Uint8Array(analyser.frequencyBinCount);this.sourceNode?.disconnect(),this.audioCtx=context,this.sourceNode=source,this.analyser=analyser,this.timeDomainData=data,context.resume().catch(()=>{})}catch{source?.disconnect(),context&&(context.removeEventListener("statechange",this.onAudioCtxStateChange),context.close().catch(()=>{})),this.audioCtx=void 0,this.sourceNode=void 0,this.analyser=void 0,this.timeDomainData=void 0}}closeAudioContext(){this.sourceNode?.disconnect(),this.sourceNode=void 0,this.analyser=void 0,this.timeDomainData=void 0,this.audioCtx&&(this.audioCtx.removeEventListener("statechange",this.onAudioCtxStateChange),this.audioCtx.close().catch(()=>{}),this.audioCtx=void 0)}get hasLiveSignal(){return!!this.analyser&&this.audioCtx?.state==="running"||this.level!=null}stateLabel(){switch(this.state){case"listening":return this.localize("audioVisualizerListening");case"thinking":return this.localize("audioVisualizerThinking");case"speaking":return this.localize("audioVisualizerSpeaking");default:return this.localize("audioVisualizerIdle")}}willUpdate(changed){super.willUpdate(changed),(changed.has("stream")||changed.has("mode")&&this.stream)&&this.syncAnalyser(),this.syncDefaultRole();const currentAriaLabel=this.getAttribute("aria-label");if(currentAriaLabel!==null&&currentAriaLabel!==this.generatedAriaLabel)this.generatedAriaLabel=void 0;else{const generated=this.label==null?this.localize("audioVisualizerLabel",void 0,{state:this.stateLabel()}):this.label;currentAriaLabel!==generated&&this.setAttribute("aria-label",generated),this.generatedAriaLabel=generated}}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),name==="role"&&oldValue!==value&&value===null&&this.syncDefaultRole()}syncDefaultRole(){this.hasAttribute("role")||this.setAttribute("role","img")}updated(changed){super.updated(changed),["state","mode","barCount","gain","level","stream"].some(key=>changed.has(key))&&this.scheduleDraw()}get isTimeDriven(){return this.analyser&&this.audioCtx?.state==="running"?!0:this.level!=null||prefersReducedMotion(this.ownerDocument.defaultView)?!1:this.state!=="idle"}drawFrame(request,nowMs){if(this.drawFrameRequest!==request||(this.drawFrameRequest=void 0,!this.isConnected||this.ownerDocument.defaultView!==request.owner)||!this.visibilityKnown||!this.visible)return;if(prefersReducedMotion(request.owner)&&!this.hasLiveSignal){if(nowMs-this.lastAmbientDrawMs<AMBIENT_REDUCED_MOTION_INTERVAL_MS){this.scheduleDraw();return}this.lastAmbientDrawMs=nowMs}this.draw(nowMs),this.isTimeDriven&&this.scheduleDraw()}cancelDrawFrame(){const request=this.drawFrameRequest;request&&request.owner.cancelAnimationFrame(request.handle),this.drawFrameRequest=void 0}barsFromTimeDomain(data,barCount){const segmentSize=Math.max(1,Math.floor(data.length/barCount)),bars=[];for(let i=0;i<barCount;i++){let sumSquares=0;const start=i*segmentSize,end=Math.min(data.length,start+segmentSize);for(let j=start;j<end;j++){const norm=(data[j]-128)/128;sumSquares+=norm*norm}bars.push(Math.sqrt(sumSquares/Math.max(1,end-start)))}return bars}ambientAmplitudes(nowMs,reduced){const n=this.mode==="waveform"?WAVEFORM_SAMPLES:this.effectiveBarCount,phase=reduced?0:finiteNumber(nowMs,0)/this.resolveAmbientDuration();switch(this.state){case"listening":case"speaking":{const pulse=reduced?.3:.25+.15*Math.sin(phase*2*Math.PI);return new Array(n).fill(pulse)}case"thinking":return reduced?new Array(n).fill(.3):Array.from({length:n},(_,i)=>{const pos=phase%1,dist=Math.abs(i/(n-1||1)-pos);return .15+.35*Math.max(0,1-dist*4)});default:return new Array(n).fill(.08)}}resolveAmbientDuration(){if(this.ambientDurationMs!==void 0)return this.ambientDurationMs;const style=this.ownerDocument.defaultView?.getComputedStyle(this),value=style?.getPropertyValue("--lr-audio-visualizer-ambient-duration").trim()||style?.getPropertyValue("--_lr-audio-visualizer-ambient-duration-default").trim()||"";return this.ambientDurationMs=parseAmbientDuration(value)??DEFAULT_AMBIENT_DURATION_MS,this.ambientDurationMs}currentAmplitudes(nowMs){if(this.analyser&&this.timeDomainData&&this.audioCtx?.state==="running")return this.analyser.getByteTimeDomainData(this.timeDomainData),this.mode==="waveform"?Array.from(this.timeDomainData,v=>(v-128)/128):this.barsFromTimeDomain(this.timeDomainData,this.effectiveBarCount);if(this.effectiveLevel!=null){const n=this.mode==="waveform"?WAVEFORM_SAMPLES:this.effectiveBarCount;return new Array(n).fill(this.effectiveLevel)}return this.ambientAmplitudes(nowMs,prefersReducedMotion(this.ownerDocument.defaultView))}resolveColors(){const cs=this.ownerDocument.defaultView?.getComputedStyle(this),active=cs?.getPropertyValue("--lr-audio-visualizer-color").trim()||cs?.getPropertyValue("--_lr-audio-visualizer-color-default").trim()||"#0969da",quiet=cs?.getPropertyValue("--lr-audio-visualizer-quiet-color").trim()||cs?.getPropertyValue("--_lr-audio-visualizer-quiet-color-default").trim()||"#ddf4ff";return{active:resolveCanvasColor(this,active,"#0969da"),quiet:resolveCanvasColor(this,quiet,"#ddf4ff")}}draw(nowMs){const canvas=this.canvas;if(!canvas)return;const size=this.hostSize??this.getBoundingClientRect(),w=Math.max(1,size.width),h=Math.max(1,size.height||48),dpr=this.ownerDocument.defaultView?.devicePixelRatio||1,backingW=Math.floor(w*dpr),backingH=Math.floor(h*dpr);canvas.width!==backingW&&(canvas.width=backingW),canvas.height!==backingH&&(canvas.height=backingH);const cssW=`${w}px`,cssH=`${h}px`;canvas.style.width!==cssW&&(canvas.style.width=cssW),canvas.style.height!==cssH&&(canvas.style.height=cssH);const ctx=canvas.getContext("2d");if(!ctx)return;ctx.setTransform(dpr,0,0,dpr,0,0),ctx.clearRect(0,0,w,h),this.resolvedColors??=this.resolveColors();const{active:activeColor,quiet:quietColor}=this.resolvedColors,amplitudes=this.currentAmplitudes(nowMs),active=this.hasLiveSignal||this.state==="listening"||this.state==="thinking"||this.state==="speaking";ctx.fillStyle=active?activeColor:quietColor,ctx.strokeStyle=active?activeColor:quietColor;const gain=this.effectiveGain;if(this.mode==="waveform")ctx.lineWidth=2,ctx.beginPath(),amplitudes.forEach((amp,i)=>{const x=i/(amplitudes.length-1||1)*w,y=h/2-clampAmplitudeProduct(amp,gain,-1,1)*(h/2);i===0?ctx.moveTo(x,y):ctx.lineTo(x,y)}),ctx.stroke();else{const n=amplitudes.length,gap=n>1?Math.max(0,Math.min(4,(w-n*2)/(n-1))):0,barWidth=Math.max(2,(w-gap*(n-1))/n);amplitudes.forEach((amp,i)=>{const barH=Math.max(2,clampAmplitudeProduct(amp,gain,0,1)*h),x=i*(barWidth+gap),y=(h-barH)/2;ctx.fillRect(x,y,barWidth,barH)})}}render(){return html`<div part="base"><canvas part="canvas" aria-hidden="true"></canvas></div>`}}__decorate([property({attribute:!1})],LyraAudioVisualizer.prototype,"stream",void 0),__decorate([property({type:Number})],LyraAudioVisualizer.prototype,"level",void 0),__decorate([property({reflect:!0,converter:AUDIO_VISUALIZER_STATE})],LyraAudioVisualizer.prototype,"state",null),__decorate([property({reflect:!0,converter:AUDIO_VISUALIZER_MODE})],LyraAudioVisualizer.prototype,"mode",null),__decorate([property({type:Number,attribute:"bar-count"})],LyraAudioVisualizer.prototype,"barCount",void 0),__decorate([property({type:Number})],LyraAudioVisualizer.prototype,"gain",void 0),__decorate([property()],LyraAudioVisualizer.prototype,"label",void 0),__decorate([query("canvas")],LyraAudioVisualizer.prototype,"canvas",void 0);export{LyraAudioVisualizer};
@@ -29,8 +29,10 @@ export declare class LyraBranchPicker extends LyraElement<LyraBranchPickerEventM
29
29
  index:number;
30
30
  /** Total number of branches. While `count < 2` the component renders nothing at all. */
31
31
  count:number;
32
- /** Accessible name for the group. Defaults to the localized `branchPickerLabel`. */
33
- label:string;private previousButtonEl?;private nextButtonEl?;private liveRegion?;private readonly groupId;
32
+ /** Accessible name for the group. Omitting it localizes the default `branchPickerLabel`
33
+ * message; an explicit empty string (`label=""` or `.label = ''`) suppresses that default and
34
+ * renders no label. */
35
+ label?:string;private previousButtonEl?;private nextButtonEl?;private liveRegion?;private readonly groupId;
34
36
  /** Gates the position announcement so a freshly-mounted picker never announces its own initial
35
37
  * position -- mirrors `<lr-chat-message>`'s identical `isMounting` gate for status-change
36
38
  * announcements. */
@@ -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}from"lit";import{property,query}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{chevronIcon}from"../../../internal/icons.js";import{finiteCount,finiteInteger}from"../../../internal/numbers.js";import"../../utility/live-region/live-region.class.js";import{styles}from"./branch-picker.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{LYRA_DEFAULT_branchNext,LYRA_DEFAULT_branchPickerLabel,LYRA_DEFAULT_branchPosition,LYRA_DEFAULT_branchPrevious}from"../../../internal/default-strings.generated.js";class LyraBranchPicker extends LyraElement{constructor(){super(...arguments),this.index=0,this.count=1,this.label="",this.groupId=nextId("branch-picker"),this.isMounting=!0,this.previousToolbarAction=this.createToolbarAction("previous"),this.nextToolbarAction=this.createToolbarAction("next")}static{this.defaultStrings={...super.defaultStrings,branchNext:LYRA_DEFAULT_branchNext,branchPickerLabel:LYRA_DEFAULT_branchPickerLabel,branchPosition:LYRA_DEFAULT_branchPosition,branchPrevious:LYRA_DEFAULT_branchPrevious}}static{this.styles=[LyraElement.styles,styles]}createToolbarAction(direction){const host=this,button=()=>direction==="previous"?host.previousButtonEl:host.nextButtonEl;let leasedButton,authoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const target=leasedButton;target&&target.getAttribute("tabindex")===lastManagedTabIndex&&(authoredTabIndex===null?target.removeAttribute("tabindex"):target.setAttribute("tabindex",authoredTabIndex)),leasedButton=void 0,authoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return{id:direction,get disabled(){return!button()||button().disabled},focus(options){button()?.focus(options)},setTabIndex(tabIndex){const target=button();if(!target){releaseTabIndex();return}if(leasedButton!==target&&(releaseTabIndex(),leasedButton=target,authoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,matchesEventPath(path){const target=button();return target!==void 0&&path.includes(target)}}}getToolbarActions(){return this.normalizedCount<2?[]:[this.previousToolbarAction,this.nextToolbarAction]}get normalizedCount(){return finiteCount(this.count,1)}get normalizedIndex(){const count=this.normalizedCount;return count===0?0:finiteInteger(this.index,0,0,count-1)}focus(options){((this.normalizedIndex>0?this.previousButtonEl:this.nextButtonEl)??this.previousButtonEl??this.nextButtonEl)?.focus(options)}blur(){this.previousButtonEl?.blur(),this.nextButtonEl?.blur()}click(){((this.normalizedIndex>0?this.previousButtonEl:this.nextButtonEl)??this.previousButtonEl??this.nextButtonEl)?.click()}updated(changed){super.updated(changed);const wasMounting=this.isMounting;if(this.isMounting=!1,changed.has("index")&&!wasMounting){const formatter=getNumberFormat(this.effectiveLocale);this.liveRegion?.announce(this.formatPosition(formatter),{force:!0})}(changed.has("index")||changed.has("count"))&&(this.normalizedCount<2&&this.releaseToolbarActions(),this.emit("lr-toolbar-actions-change"))}disconnectedCallback(){this.isMounting=!0,this.releaseToolbarActions(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.releaseToolbarActions()}releaseToolbarActions(){this.previousToolbarAction.releaseTabIndex?.(),this.nextToolbarAction.releaseTabIndex?.()}formatPosition(formatter=getNumberFormat(this.effectiveLocale)){return this.localize("branchPosition",void 0,{index:formatter.format(this.normalizedIndex+1),total:formatter.format(this.normalizedCount)})}requestIndex(next){next<0||next>this.normalizedCount-1||next===this.normalizedIndex||this.emit("lr-branch-change",{index:next})}render(){const count=this.normalizedCount;if(count<2)return html``;const index=this.normalizedIndex,label=this.label||this.localize("branchPickerLabel"),ariaLabel=this.getAttribute("aria-label")??label,formatter=getNumberFormat(this.effectiveLocale);return html`
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}from"lit";import{property,query}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{chevronIcon}from"../../../internal/icons.js";import{finiteCount,finiteInteger}from"../../../internal/numbers.js";import"../../utility/live-region/live-region.class.js";import{styles}from"./branch-picker.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{LYRA_DEFAULT_branchNext,LYRA_DEFAULT_branchPickerLabel,LYRA_DEFAULT_branchPosition,LYRA_DEFAULT_branchPrevious}from"../../../internal/default-strings.generated.js";class LyraBranchPicker extends LyraElement{constructor(){super(...arguments),this.index=0,this.count=1,this.groupId=nextId("branch-picker"),this.isMounting=!0,this.previousToolbarAction=this.createToolbarAction("previous"),this.nextToolbarAction=this.createToolbarAction("next")}static{this.defaultStrings={...super.defaultStrings,branchNext:LYRA_DEFAULT_branchNext,branchPickerLabel:LYRA_DEFAULT_branchPickerLabel,branchPosition:LYRA_DEFAULT_branchPosition,branchPrevious:LYRA_DEFAULT_branchPrevious}}static{this.styles=[LyraElement.styles,styles]}createToolbarAction(direction){const host=this,button=()=>direction==="previous"?host.previousButtonEl:host.nextButtonEl;let leasedButton,authoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const target=leasedButton;target&&target.getAttribute("tabindex")===lastManagedTabIndex&&(authoredTabIndex===null?target.removeAttribute("tabindex"):target.setAttribute("tabindex",authoredTabIndex)),leasedButton=void 0,authoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return{id:direction,get disabled(){return!button()||button().disabled},focus(options){button()?.focus(options)},setTabIndex(tabIndex){const target=button();if(!target){releaseTabIndex();return}if(leasedButton!==target&&(releaseTabIndex(),leasedButton=target,authoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,matchesEventPath(path){const target=button();return target!==void 0&&path.includes(target)}}}getToolbarActions(){return this.normalizedCount<2?[]:[this.previousToolbarAction,this.nextToolbarAction]}get normalizedCount(){return finiteCount(this.count,1)}get normalizedIndex(){const count=this.normalizedCount;return count===0?0:finiteInteger(this.index,0,0,count-1)}focus(options){((this.normalizedIndex>0?this.previousButtonEl:this.nextButtonEl)??this.previousButtonEl??this.nextButtonEl)?.focus(options)}blur(){this.previousButtonEl?.blur(),this.nextButtonEl?.blur()}click(){((this.normalizedIndex>0?this.previousButtonEl:this.nextButtonEl)??this.previousButtonEl??this.nextButtonEl)?.click()}updated(changed){super.updated(changed);const wasMounting=this.isMounting;if(this.isMounting=!1,changed.has("index")&&!wasMounting){const formatter=getNumberFormat(this.effectiveLocale);this.liveRegion?.announce(this.formatPosition(formatter),{force:!0})}(changed.has("index")||changed.has("count"))&&(this.normalizedCount<2&&this.releaseToolbarActions(),this.emit("lr-toolbar-actions-change"))}disconnectedCallback(){this.isMounting=!0,this.releaseToolbarActions(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.releaseToolbarActions()}releaseToolbarActions(){this.previousToolbarAction.releaseTabIndex?.(),this.nextToolbarAction.releaseTabIndex?.()}formatPosition(formatter=getNumberFormat(this.effectiveLocale)){return this.localize("branchPosition",void 0,{index:formatter.format(this.normalizedIndex+1),total:formatter.format(this.normalizedCount)})}requestIndex(next){next<0||next>this.normalizedCount-1||next===this.normalizedIndex||this.emit("lr-branch-change",{index:next})}render(){const count=this.normalizedCount;if(count<2)return html``;const index=this.normalizedIndex,label=this.label==null?this.localize("branchPickerLabel"):this.label,ariaLabel=this.getAttribute("aria-label")??label,formatter=getNumberFormat(this.effectiveLocale);return html`
2
2
  <div part="base" id=${this.groupId} role="group" aria-label=${ariaLabel}>
3
3
  <button
4
4
  part="previous-button"
@@ -68,9 +68,10 @@ bottomThreshold:number;
68
68
  /** Index of the first unread item -- element-child index in slotted mode, `items` index in virtual
69
69
  * mode. Host-owned unread bookkeeping in, divider/pill count out. `null` disables both. */
70
70
  unreadStartIndex:number|null;
71
- /** Accessible name for the log region. Defaults to the localized `chatViewportLabel`;
72
- * a host `aria-label` (see `accessibleLabel`) wins over both. */
73
- label:string;
71
+ /** Accessible name for the log region. Omitting it localizes the default `chatViewportLabel`
72
+ * message; an explicit empty string (`label=""` or `.label = ''`) suppresses that default and
73
+ * renders no label. A host `aria-label` (see `accessibleLabel`) wins over both. */
74
+ label?:string;
74
75
  /** Host `aria-label`, forwarded to the internal `role="log"` element -- an `aria-label` left
75
76
  * on the custom-element host itself names nothing, because the log role lives inside the
76
77
  * shadow root. Wins over `label` and the localized default. */
@@ -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}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{LyraVirtualList}from"../../layout/virtual-list/virtual-list.class.js";import{styles}from"./chat-viewport.styles.js";import{getNumberFormat,getPluralRules}from"../../../internal/intl-cache.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{composedAccessibilityText}from"../../../internal/accessibility-visibility.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets}from"../../../internal/focus-navigation.js";import{LYRA_DEFAULT_chatViewportLabel,LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_jumpToLatest,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_newMessageCount,LYRA_DEFAULT_newMessages,LYRA_DEFAULT_newMessagesCount,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_search,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";class LyraChatViewport extends LyraElement{constructor(){super(...arguments),this.follow=!0,this.live="off",this.bottomThreshold=24,this.unreadStartIndex=null,this.label="",this.accessibleLabel=null,this.unreadDividerTop=null,this.pendingUserIntent=!1,this.pendingUserIntentExpiryFrame=null,this.scrollbarDragActive=!1,this.isMounting=!0,this.growthFrame=null,this.armedMode=null,this.armGeneration=0,this.followFocusRepair=null,this.knownProjectedNodes=new WeakSet,this.markUserIntent=()=>{this.pendingUserIntent=!0,this.cancelPendingUserIntentExpiry();const owner=this.ownerDocument.defaultView;if(!owner){this.pendingUserIntent=!1;return}const firstFrame={owner,handle:0};firstFrame.handle=owner.requestAnimationFrame(()=>{if(this.pendingUserIntentExpiryFrame!==firstFrame)return;if(!this.isConnected||this.ownerDocument.defaultView!==owner){this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1;return}const secondFrame={owner,handle:0};secondFrame.handle=owner.requestAnimationFrame(()=>{this.pendingUserIntentExpiryFrame===secondFrame&&(this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1)}),this.pendingUserIntentExpiryFrame=secondFrame}),this.pendingUserIntentExpiryFrame=firstFrame},this.onPointerDown=event=>{const scroll=this.scrollEl;if(!scroll||event.button!==0||event.target!==scroll)return;const computed=getComputedStyle(scroll),borderLeft=Number.parseFloat(computed.borderLeftWidth)||0,borderRight=Number.parseFloat(computed.borderRightWidth)||0,gutter=scroll.offsetWidth-scroll.clientWidth-borderLeft-borderRight;if(gutter<=0)return;const rect=scroll.getBoundingClientRect();if(!(computed.direction==="rtl"?event.clientX<=rect.left+borderLeft+gutter:event.clientX>=rect.right-borderRight-gutter))return;this.scrollbarDragActive=!0;const owner=this.ownerDocument.defaultView;!owner||this.scrollbarDragWindow===owner||(this.releaseScrollbarDragListeners(),this.scrollbarDragWindow=owner,owner.addEventListener("pointerup",this.onPointerUp),owner.addEventListener("pointercancel",this.onPointerUp),owner.addEventListener("lostpointercapture",this.onPointerUp))},this.onPointerUp=()=>{this.scrollbarDragActive=!1,this.releaseScrollbarDragListeners()},this.onKeyDown=e=>{(e.key==="PageUp"||e.key==="ArrowUp"||e.key==="Home")&&this.markUserIntent()},this.onScroll=()=>{const el=this.scrollEl;if(!el)return;if(el.scrollHeight-el.scrollTop-el.clientHeight<=this.effectiveBottomThreshold){this.clearUserIntent(),this.follow||(this.follow=!0);return}(this.consumeUserIntent()||this.scrollbarDragActive)&&this.follow&&(this.follow=!1)},this.onVirtualRangeChanged=e=>{const list=this.virtualListEl;if(!list||e.composedPath()[0]!==list)return;const detail=e.detail;if(!detail||!Number.isFinite(detail.start)||!Number.isFinite(detail.end)||detail.start<0||detail.end<detail.start)return;if(list.items.length>0&&detail.end>=list.items.length-1){this.clearUserIntent(),this.follow||(this.follow=!0);return}if(this.consumeUserIntent()||this.scrollbarDragActive){this.follow&&(this.follow=!1);return}this.follow&&this.performScrollToEnd("auto")},this.onSlotChange=()=>{this.announceNewProjectedNodes();const wasVirtual=this.armedMode==="virtual";this.armObservers(),this.armedMode==="virtual"!==wasVirtual&&this.requestUpdate()},this.onContentMutations=records=>{this.scheduleGrowthTick();const sink=this.announcementSink;if(sink)for(const record of records)for(const node of record.addedNodes){if(this.knownProjectedNodes.has(node)||node instanceof Element&&node.hasAttribute("data-lr-chat-viewport-unread-boundary"))continue;this.knownProjectedNodes.add(node);const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();text&&sink.announce(text)}}}static{this.defaultStrings={...super.defaultStrings,chatViewportLabel:LYRA_DEFAULT_chatViewportLabel,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,jumpToLatest:LYRA_DEFAULT_jumpToLatest,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,newMessageCount:LYRA_DEFAULT_newMessageCount,newMessages:LYRA_DEFAULT_newMessages,newMessagesCount:LYRA_DEFAULT_newMessagesCount,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select}}static{this.styles=[LyraElement.styles,styles]}get messageElements(){let elements=this.contentSlot?.assignedElements({flatten:!0})??Array.from(this.children);for(let depth=0;depth<4&&elements.some(element=>element.localName==="slot");depth++)elements=elements.flatMap(element=>element.localName==="slot"?element.assignedElements({flatten:!0}):[element]);return elements.filter(element=>!element.hasAttribute("data-lr-chat-viewport-unread-boundary"))}get virtualListEl(){const children=this.messageElements;return children.length===1&&children[0]instanceof LyraVirtualList?children[0]:null}get effectiveBottomThreshold(){return finiteRange(this.bottomThreshold,24,0)}get effectiveUnreadStartIndex(){return this.unreadStartIndex==null?null:finiteCount(this.unreadStartIndex)}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink(),this.hasUpdated&&this.armObservers()}disconnectedCallback(){super.disconnectedCallback(),this.releaseAnnouncementSink(),this.teardownObservers(),this.releaseScrollbarDragListeners(),this.clearUserIntent(),this.scrollbarDragActive=!1,this.followFocusRepair=null,this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0}willUpdate(changed){if(super.willUpdate(changed),this.hasUpdated&&changed.has("follow")&&this.follow&&changed.get("follow")===!1){const pill=this.renderRoot.querySelector('[part="jump-pill"]');this.followFocusRepair=pill?captureComposedFocusRepair(pill,this.transcriptFocusOwner()):null}this.hasUpdated&&changed.has("unreadStartIndex")&&this.updateUnreadDividerPosition()}firstUpdated(changed){super.firstUpdated(changed),this.armObservers()}updated(changed){super.updated(changed),changed.has("live")&&this.syncAnnouncementSink(),this.unreadBoundaryEl?.setAttribute("aria-label",this.localize("newMessages"));const wasMounting=this.isMounting;if(this.isMounting=!1,changed.has("follow")){if(this.follow){const behavior=wasMounting?"auto":this.pendingScrollBehavior??(prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth");this.pendingScrollBehavior=void 0,this.performScrollToEnd(behavior)}wasMounting||this.emit("lr-follow-change",{following:this.follow})}const focusRepair=this.followFocusRepair;this.followFocusRepair=null,focusRepair&&applyComposedFocusRepair(focusRepair)}transcriptFocusOwner(){const list=this.virtualListEl;return list?collectComposedFocusTargets(list,{includeRoot:!1,mode:"programmatic"}).elements[0]??null:this.scrollEl??null}scrollToBottom(options){const behavior=prefersReducedMotion(this.ownerDocument.defaultView)?"auto":options?.behavior??"smooth";this.follow?this.performScrollToEnd(behavior):(this.pendingScrollBehavior=behavior,this.follow=!0)}scrollToUnread(options){const unreadStartIndex=this.effectiveUnreadStartIndex;if(unreadStartIndex==null)return!1;const behavior=prefersReducedMotion(this.ownerDocument.defaultView)?"auto":options?.behavior??"smooth",list=this.virtualListEl;if(list)return unreadStartIndex>=list.items.length?!1:(list.scrollToIndex(unreadStartIndex,{align:"start",behavior}),!0);const scrollEl=this.scrollEl;return!scrollEl||this.unreadDividerTop==null?!1:(scrollEl.scrollTo({top:this.unreadDividerTop,behavior}),!0)}performScrollToEnd(behavior){const list=this.virtualListEl;if(list){list.items.length>0&&list.scrollToIndex(list.items.length-1,{align:"end",behavior});return}const el=this.scrollEl;el&&el.scrollTo({top:el.scrollHeight,behavior})}get totalCount(){const list=this.virtualListEl;return list?list.items.length:this.messageElements.length}get unreadCount(){const unreadStartIndex=this.effectiveUnreadStartIndex;return unreadStartIndex==null?0:Math.max(0,this.totalCount-unreadStartIndex)}pillLabel(){const count=this.unreadCount;if(count<=0)return this.localize("jumpToLatest");const key=getPluralRules(this.effectiveLocale).select(count)==="one"?"newMessageCount":"newMessagesCount";return this.localize(key,void 0,{count:getNumberFormat(this.effectiveLocale).format(count)})}updateUnreadDividerPosition(){const unreadStartIndex=this.effectiveUnreadStartIndex;if(this.virtualListEl||unreadStartIndex==null){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}const content=this.contentEl,target=this.messageElements[unreadStartIndex];if(!target||!content){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}this.syncSemanticUnreadBoundary(target),this.unreadDividerTop=target.getBoundingClientRect().top-content.getBoundingClientRect().top}syncSemanticUnreadBoundary(target){if(!target||this.virtualListEl){this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0;return}const parent=target.parentNode;if(!parent)return;const boundary=this.unreadBoundaryEl??this.ownerDocument.createElement("div");boundary.setAttribute("data-lr-chat-viewport-unread-boundary",""),boundary.setAttribute("role","separator"),boundary.setAttribute("aria-label",this.localize("newMessages"));const targetSlot=target.getAttribute("slot");targetSlot===null?boundary.removeAttribute("slot"):boundary.setAttribute("slot",targetSlot),(boundary.parentNode!==parent||boundary.nextSibling!==target)&&parent.insertBefore(boundary,target),this.unreadBoundaryEl=boundary,this.knownProjectedNodes.add(boundary)}cancelPendingUserIntentExpiry(){const frame=this.pendingUserIntentExpiryFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.pendingUserIntentExpiryFrame=null}clearUserIntent(){this.pendingUserIntent=!1,this.cancelPendingUserIntentExpiry()}consumeUserIntent(){const wasPending=this.pendingUserIntent;return this.clearUserIntent(),wasPending}releaseScrollbarDragListeners(){const owner=this.scrollbarDragWindow;owner&&(owner.removeEventListener("pointerup",this.onPointerUp),owner.removeEventListener("pointercancel",this.onPointerUp),owner.removeEventListener("lostpointercapture",this.onPointerUp),this.scrollbarDragWindow=void 0)}scheduleGrowthTick(){if(this.growthFrame)return;const owner=this.ownerDocument.defaultView;if(!owner)return;const frame={owner,handle:0};frame.handle=owner.requestAnimationFrame(()=>{this.growthFrame===frame&&(this.growthFrame=null,!(!this.isConnected||this.ownerDocument.defaultView!==owner)&&(this.updateUnreadDividerPosition(),this.follow&&this.performScrollToEnd("auto")))}),this.growthFrame=frame}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){const politeness=this.live==="polite"||this.live==="assertive"?this.live:void 0;if(!this.isConnected||politeness===void 0){this.releaseAnnouncementSink();return}this.announcementSink?.politeness===politeness&&this.announcementSink.element.ownerDocument===this.ownerDocument||(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink(politeness,{document:this.ownerDocument,source:this}))}announcementTextFor(node){const primary=composedAccessibilityText(node);if(!(node instanceof Element)||!node.shadowRoot)return primary;const content=composedAccessibilityText(node.childNodes),normalizedPrimary=primary.replace(/\s+/g," ").trim(),normalizedContent=content.replace(/\s+/g," ").trim();return!normalizedContent||normalizedPrimary.includes(normalizedContent)?primary:primary?`${primary} ${content}`:content}announceNewProjectedNodes(){const sink=this.announcementSink;for(const node of this.messageElements){if(this.knownProjectedNodes.has(node)||(this.knownProjectedNodes.add(node),!sink||!this.hasUpdated))continue;const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();text&&sink.announce(text)}}armObservers(){const owner=this.ownerDocument.defaultView,list=this.virtualListEl,mode=list?"virtual":"slotted";for(const node of this.messageElements)this.knownProjectedNodes.add(node);if(this.observerWindow===owner&&this.armedMode===mode&&(mode==="slotted"||this.listenedVirtualList===list))return;if(this.teardownObservers(),this.observerWindow=owner??void 0,this.armedMode=mode,list)this.listenedVirtualList=list,list.addEventListener("lr-visible-range-change",this.onVirtualRangeChanged);else{const content=this.contentEl;if(content){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.scheduleGrowthTick()}}),this.contentResizeObserver=observer,this.contentResizeObserver.observe(content)}}const MutationObserverCtor=owner?.MutationObserver;if(MutationObserverCtor){let observer;observer=new MutationObserverCtor(records=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentMutationObserver!==observer||this.onContentMutations(records)}),this.contentMutationObserver=observer,this.contentMutationObserver.observe(this,{childList:!0})}}const scrollEl=this.scrollEl;if(scrollEl){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.scrollResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.follow&&this.performScrollToEnd("auto")}}),this.scrollResizeObserver=observer,this.scrollResizeObserver.observe(scrollEl)}}const generation=++this.armGeneration;queueMicrotask(()=>{!this.isConnected||generation!==this.armGeneration||this.updateUnreadDividerPosition()})}teardownObservers(){this.scrollResizeObserver?.disconnect(),this.scrollResizeObserver=void 0,this.contentResizeObserver?.disconnect(),this.contentResizeObserver=void 0,this.contentMutationObserver?.disconnect(),this.contentMutationObserver=void 0,this.listenedVirtualList?.removeEventListener("lr-visible-range-change",this.onVirtualRangeChanged),this.listenedVirtualList=void 0,this.observerWindow=void 0,this.armedMode=null,this.armGeneration++;const frame=this.growthFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.growthFrame=null}render(){const label=this.accessibleLabel??(this.label||this.localize("chatViewportLabel")),virtual=this.virtualListEl!==null;return html`
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}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{LyraVirtualList}from"../../layout/virtual-list/virtual-list.class.js";import{styles}from"./chat-viewport.styles.js";import{getNumberFormat,getPluralRules}from"../../../internal/intl-cache.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{composedAccessibilityText}from"../../../internal/accessibility-visibility.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets}from"../../../internal/focus-navigation.js";import{LYRA_DEFAULT_chatViewportLabel,LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_jumpToLatest,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_newMessageCount,LYRA_DEFAULT_newMessages,LYRA_DEFAULT_newMessagesCount,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_search,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";class LyraChatViewport extends LyraElement{constructor(){super(...arguments),this.follow=!0,this.live="off",this.bottomThreshold=24,this.unreadStartIndex=null,this.accessibleLabel=null,this.unreadDividerTop=null,this.pendingUserIntent=!1,this.pendingUserIntentExpiryFrame=null,this.scrollbarDragActive=!1,this.isMounting=!0,this.growthFrame=null,this.armedMode=null,this.armGeneration=0,this.followFocusRepair=null,this.knownProjectedNodes=new WeakSet,this.markUserIntent=()=>{this.pendingUserIntent=!0,this.cancelPendingUserIntentExpiry();const owner=this.ownerDocument.defaultView;if(!owner){this.pendingUserIntent=!1;return}const firstFrame={owner,handle:0};firstFrame.handle=owner.requestAnimationFrame(()=>{if(this.pendingUserIntentExpiryFrame!==firstFrame)return;if(!this.isConnected||this.ownerDocument.defaultView!==owner){this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1;return}const secondFrame={owner,handle:0};secondFrame.handle=owner.requestAnimationFrame(()=>{this.pendingUserIntentExpiryFrame===secondFrame&&(this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1)}),this.pendingUserIntentExpiryFrame=secondFrame}),this.pendingUserIntentExpiryFrame=firstFrame},this.onPointerDown=event=>{const scroll=this.scrollEl;if(!scroll||event.button!==0||event.target!==scroll)return;const computed=getComputedStyle(scroll),borderLeft=Number.parseFloat(computed.borderLeftWidth)||0,borderRight=Number.parseFloat(computed.borderRightWidth)||0,gutter=scroll.offsetWidth-scroll.clientWidth-borderLeft-borderRight;if(gutter<=0)return;const rect=scroll.getBoundingClientRect();if(!(computed.direction==="rtl"?event.clientX<=rect.left+borderLeft+gutter:event.clientX>=rect.right-borderRight-gutter))return;this.scrollbarDragActive=!0;const owner=this.ownerDocument.defaultView;!owner||this.scrollbarDragWindow===owner||(this.releaseScrollbarDragListeners(),this.scrollbarDragWindow=owner,owner.addEventListener("pointerup",this.onPointerUp),owner.addEventListener("pointercancel",this.onPointerUp),owner.addEventListener("lostpointercapture",this.onPointerUp))},this.onPointerUp=()=>{this.scrollbarDragActive=!1,this.releaseScrollbarDragListeners()},this.onKeyDown=e=>{(e.key==="PageUp"||e.key==="ArrowUp"||e.key==="Home")&&this.markUserIntent()},this.onScroll=()=>{const el=this.scrollEl;if(!el)return;if(el.scrollHeight-el.scrollTop-el.clientHeight<=this.effectiveBottomThreshold){this.clearUserIntent(),this.follow||(this.follow=!0);return}(this.consumeUserIntent()||this.scrollbarDragActive)&&this.follow&&(this.follow=!1)},this.onVirtualRangeChanged=e=>{const list=this.virtualListEl;if(!list||e.composedPath()[0]!==list)return;const detail=e.detail;if(!detail||!Number.isFinite(detail.start)||!Number.isFinite(detail.end)||detail.start<0||detail.end<detail.start)return;if(list.items.length>0&&detail.end>=list.items.length-1){this.clearUserIntent(),this.follow||(this.follow=!0);return}if(this.consumeUserIntent()||this.scrollbarDragActive){this.follow&&(this.follow=!1);return}this.follow&&this.performScrollToEnd("auto")},this.onSlotChange=()=>{this.announceNewProjectedNodes();const wasVirtual=this.armedMode==="virtual";this.armObservers(),this.armedMode==="virtual"!==wasVirtual&&this.requestUpdate()},this.onContentMutations=records=>{this.scheduleGrowthTick();const sink=this.announcementSink;if(sink)for(const record of records)for(const node of record.addedNodes){if(this.knownProjectedNodes.has(node)||node instanceof Element&&node.hasAttribute("data-lr-chat-viewport-unread-boundary"))continue;this.knownProjectedNodes.add(node);const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();text&&sink.announce(text)}}}static{this.defaultStrings={...super.defaultStrings,chatViewportLabel:LYRA_DEFAULT_chatViewportLabel,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,jumpToLatest:LYRA_DEFAULT_jumpToLatest,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,newMessageCount:LYRA_DEFAULT_newMessageCount,newMessages:LYRA_DEFAULT_newMessages,newMessagesCount:LYRA_DEFAULT_newMessagesCount,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select}}static{this.styles=[LyraElement.styles,styles]}get messageElements(){let elements=this.contentSlot?.assignedElements({flatten:!0})??Array.from(this.children);for(let depth=0;depth<4&&elements.some(element=>element.localName==="slot");depth++)elements=elements.flatMap(element=>element.localName==="slot"?element.assignedElements({flatten:!0}):[element]);return elements.filter(element=>!element.hasAttribute("data-lr-chat-viewport-unread-boundary"))}get virtualListEl(){const children=this.messageElements;return children.length===1&&children[0]instanceof LyraVirtualList?children[0]:null}get effectiveBottomThreshold(){return finiteRange(this.bottomThreshold,24,0)}get effectiveUnreadStartIndex(){return this.unreadStartIndex==null?null:finiteCount(this.unreadStartIndex)}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink(),this.hasUpdated&&this.armObservers()}disconnectedCallback(){super.disconnectedCallback(),this.releaseAnnouncementSink(),this.teardownObservers(),this.releaseScrollbarDragListeners(),this.clearUserIntent(),this.scrollbarDragActive=!1,this.followFocusRepair=null,this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0}willUpdate(changed){if(super.willUpdate(changed),this.hasUpdated&&changed.has("follow")&&this.follow&&changed.get("follow")===!1){const pill=this.renderRoot.querySelector('[part="jump-pill"]');this.followFocusRepair=pill?captureComposedFocusRepair(pill,this.transcriptFocusOwner()):null}this.hasUpdated&&changed.has("unreadStartIndex")&&this.updateUnreadDividerPosition()}firstUpdated(changed){super.firstUpdated(changed),this.armObservers()}updated(changed){super.updated(changed),changed.has("live")&&this.syncAnnouncementSink(),this.unreadBoundaryEl?.setAttribute("aria-label",this.localize("newMessages"));const wasMounting=this.isMounting;if(this.isMounting=!1,changed.has("follow")){if(this.follow){const behavior=wasMounting?"auto":this.pendingScrollBehavior??(prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth");this.pendingScrollBehavior=void 0,this.performScrollToEnd(behavior)}wasMounting||this.emit("lr-follow-change",{following:this.follow})}const focusRepair=this.followFocusRepair;this.followFocusRepair=null,focusRepair&&applyComposedFocusRepair(focusRepair)}transcriptFocusOwner(){const list=this.virtualListEl;return list?collectComposedFocusTargets(list,{includeRoot:!1,mode:"programmatic"}).elements[0]??null:this.scrollEl??null}scrollToBottom(options){const behavior=prefersReducedMotion(this.ownerDocument.defaultView)?"auto":options?.behavior??"smooth";this.follow?this.performScrollToEnd(behavior):(this.pendingScrollBehavior=behavior,this.follow=!0)}scrollToUnread(options){const unreadStartIndex=this.effectiveUnreadStartIndex;if(unreadStartIndex==null)return!1;const behavior=prefersReducedMotion(this.ownerDocument.defaultView)?"auto":options?.behavior??"smooth",list=this.virtualListEl;if(list)return unreadStartIndex>=list.items.length?!1:(list.scrollToIndex(unreadStartIndex,{align:"start",behavior}),!0);const scrollEl=this.scrollEl;return!scrollEl||this.unreadDividerTop==null?!1:(scrollEl.scrollTo({top:this.unreadDividerTop,behavior}),!0)}performScrollToEnd(behavior){const list=this.virtualListEl;if(list){list.items.length>0&&list.scrollToIndex(list.items.length-1,{align:"end",behavior});return}const el=this.scrollEl;el&&el.scrollTo({top:el.scrollHeight,behavior})}get totalCount(){const list=this.virtualListEl;return list?list.items.length:this.messageElements.length}get unreadCount(){const unreadStartIndex=this.effectiveUnreadStartIndex;return unreadStartIndex==null?0:Math.max(0,this.totalCount-unreadStartIndex)}pillLabel(){const count=this.unreadCount;if(count<=0)return this.localize("jumpToLatest");const key=getPluralRules(this.effectiveLocale).select(count)==="one"?"newMessageCount":"newMessagesCount";return this.localize(key,void 0,{count:getNumberFormat(this.effectiveLocale).format(count)})}updateUnreadDividerPosition(){const unreadStartIndex=this.effectiveUnreadStartIndex;if(this.virtualListEl||unreadStartIndex==null){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}const content=this.contentEl,target=this.messageElements[unreadStartIndex];if(!target||!content){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}this.syncSemanticUnreadBoundary(target),this.unreadDividerTop=target.getBoundingClientRect().top-content.getBoundingClientRect().top}syncSemanticUnreadBoundary(target){if(!target||this.virtualListEl){this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0;return}const parent=target.parentNode;if(!parent)return;const boundary=this.unreadBoundaryEl??this.ownerDocument.createElement("div");boundary.setAttribute("data-lr-chat-viewport-unread-boundary",""),boundary.setAttribute("role","separator"),boundary.setAttribute("aria-label",this.localize("newMessages"));const targetSlot=target.getAttribute("slot");targetSlot===null?boundary.removeAttribute("slot"):boundary.setAttribute("slot",targetSlot),(boundary.parentNode!==parent||boundary.nextSibling!==target)&&parent.insertBefore(boundary,target),this.unreadBoundaryEl=boundary,this.knownProjectedNodes.add(boundary)}cancelPendingUserIntentExpiry(){const frame=this.pendingUserIntentExpiryFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.pendingUserIntentExpiryFrame=null}clearUserIntent(){this.pendingUserIntent=!1,this.cancelPendingUserIntentExpiry()}consumeUserIntent(){const wasPending=this.pendingUserIntent;return this.clearUserIntent(),wasPending}releaseScrollbarDragListeners(){const owner=this.scrollbarDragWindow;owner&&(owner.removeEventListener("pointerup",this.onPointerUp),owner.removeEventListener("pointercancel",this.onPointerUp),owner.removeEventListener("lostpointercapture",this.onPointerUp),this.scrollbarDragWindow=void 0)}scheduleGrowthTick(){if(this.growthFrame)return;const owner=this.ownerDocument.defaultView;if(!owner)return;const frame={owner,handle:0};frame.handle=owner.requestAnimationFrame(()=>{this.growthFrame===frame&&(this.growthFrame=null,!(!this.isConnected||this.ownerDocument.defaultView!==owner)&&(this.updateUnreadDividerPosition(),this.follow&&this.performScrollToEnd("auto")))}),this.growthFrame=frame}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){const politeness=this.live==="polite"||this.live==="assertive"?this.live:void 0;if(!this.isConnected||politeness===void 0){this.releaseAnnouncementSink();return}this.announcementSink?.politeness===politeness&&this.announcementSink.element.ownerDocument===this.ownerDocument||(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink(politeness,{document:this.ownerDocument,source:this}))}announcementTextFor(node){const primary=composedAccessibilityText(node);if(!(node instanceof Element)||!node.shadowRoot)return primary;const content=composedAccessibilityText(node.childNodes),normalizedPrimary=primary.replace(/\s+/g," ").trim(),normalizedContent=content.replace(/\s+/g," ").trim();return!normalizedContent||normalizedPrimary.includes(normalizedContent)?primary:primary?`${primary} ${content}`:content}announceNewProjectedNodes(){const sink=this.announcementSink;for(const node of this.messageElements){if(this.knownProjectedNodes.has(node)||(this.knownProjectedNodes.add(node),!sink||!this.hasUpdated))continue;const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();text&&sink.announce(text)}}armObservers(){const owner=this.ownerDocument.defaultView,list=this.virtualListEl,mode=list?"virtual":"slotted";for(const node of this.messageElements)this.knownProjectedNodes.add(node);if(this.observerWindow===owner&&this.armedMode===mode&&(mode==="slotted"||this.listenedVirtualList===list))return;if(this.teardownObservers(),this.observerWindow=owner??void 0,this.armedMode=mode,list)this.listenedVirtualList=list,list.addEventListener("lr-visible-range-change",this.onVirtualRangeChanged);else{const content=this.contentEl;if(content){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.scheduleGrowthTick()}}),this.contentResizeObserver=observer,this.contentResizeObserver.observe(content)}}const MutationObserverCtor=owner?.MutationObserver;if(MutationObserverCtor){let observer;observer=new MutationObserverCtor(records=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentMutationObserver!==observer||this.onContentMutations(records)}),this.contentMutationObserver=observer,this.contentMutationObserver.observe(this,{childList:!0})}}const scrollEl=this.scrollEl;if(scrollEl){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.scrollResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.follow&&this.performScrollToEnd("auto")}}),this.scrollResizeObserver=observer,this.scrollResizeObserver.observe(scrollEl)}}const generation=++this.armGeneration;queueMicrotask(()=>{!this.isConnected||generation!==this.armGeneration||this.updateUnreadDividerPosition()})}teardownObservers(){this.scrollResizeObserver?.disconnect(),this.scrollResizeObserver=void 0,this.contentResizeObserver?.disconnect(),this.contentResizeObserver=void 0,this.contentMutationObserver?.disconnect(),this.contentMutationObserver=void 0,this.listenedVirtualList?.removeEventListener("lr-visible-range-change",this.onVirtualRangeChanged),this.listenedVirtualList=void 0,this.observerWindow=void 0,this.armedMode=null,this.armGeneration++;const frame=this.growthFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.growthFrame=null}render(){const label=this.accessibleLabel??(this.label==null?this.localize("chatViewportLabel"):this.label),virtual=this.virtualListEl!==null;return html`
2
2
  <div part="base" ?data-virtual=${virtual}>
3
3
  <div
4
4
  part="scroll"
@@ -145,16 +145,11 @@ copyable:boolean;
145
145
  * string to the control's accessible name, for a dense header that already carries a filename,
146
146
  * a language chip and slotted `header-actions`. */
147
147
  copyAppearance:LyraCodeBlockCopyAppearance;
148
- /** Whether a light-DOM child is assigned to `header-actions`. Read from `children` rather than a
149
- * `slotchange`, because the slot only exists once the header renders -- and whether the header
150
- * renders at all is exactly what this answers for a code block with no filename, language,
151
- * copy control or collapse toggle. `headerActionsObserver` closes that loop for a child appended
152
- * after first render, which no `slotchange` could ever report for a header that isn't there. */
148
+ /** Whether a light-DOM child is assigned to `header-actions`. Set from `headerActions`
149
+ * (`CodeBlockHeaderActionsController` in code-block-shared.ts), which closes the loop for a
150
+ * child appended after first render, which no `slotchange` could ever report for a header
151
+ * that isn't there. */
153
152
  private hasHeaderActions;
154
- /** Watches the host's own light DOM so appending (or removing) a `slot="header-actions"` child
155
- * brings the header into existence -- or retires it -- without the consumer touching a
156
- * property. */
157
- private headerActionsObserver?;
158
153
  /** A CSS length (e.g. `"20rem"`); once set, the code scrolls internally
159
154
  * past this height instead of growing the page. */
160
155
  maxHeight:string;
@@ -189,13 +184,13 @@ readonly anchorKinds:readonly LyraAnchor['kind'][];private focusedLine;private r
189
184
  * highlighted output. For a TypeScript annotation, use `import type { ShikiLanguageSource } from
190
185
  * '@aceshooting/lyra-ui/components/conversation/code-block/code-block-core.js'`; this granular
191
186
  * type-only import emits no registration side effect. */
192
- languages:Readonly<Record<string,ShikiLanguageSource>>;private highlightedHtml;private shikiReady;private justCopied;private copyFailed;private isDarkTheme;private readonly interactions;private highlightToken;private highlighterGeneration;private activeLanguages?;private readonly bodyId;constructor();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private preSuppliedGrammar;private lineHighlightSet;private activeHighlightLineSet;private lineCount;
187
+ languages:Readonly<Record<string,ShikiLanguageSource>>;private highlightedHtml;private shikiReady;private justCopied;private copyFailed;private isDarkTheme;private readonly interactions;private readonly headerActions;private highlightToken;private highlighterGeneration;private activeLanguages?;private readonly bodyId;constructor();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private preSuppliedGrammar;private lineHighlightSet;private activeHighlightLineSet;private lineCount;
193
188
  /** Resolves a `line-range` anchor (or a `highlights` id string resolving to one) by scrolling
194
189
  * its start line into view within `[part="body"]`. Resolves `false` when the anchor isn't a
195
190
  * `line-range`, the id isn't found, or the start line is out of bounds. */
196
191
  scrollToAnchor(target:LyraAnchor|string):Promise<boolean>;
197
192
  /** Recomputes Shiki palette selection after an imperative CSSOM theme change. */
198
- refreshTheme():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private syncHeaderActions;private observeHeaderActions;
193
+ refreshTheme():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;
199
194
  /** Whether this render shows the loading skeleton instead of the code. Unlike `<lr-code-block>`,
200
195
  * the only highlighter this variant ever waits on is the fine-grained one seeded from
201
196
  * `languages` -- so a `language` absent from that map has nothing pending and never shows the
@@ -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{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{ensureShikiLanguageLoaded,loadShikiHighlighterCore,normalizeShikiLanguage,resolvedShikiLanguages}from"./shiki-types.js";import{styles}from"./code-block.styles.js";import{CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockLineHasFocus,codeBlockLineCount,codeBlockLineHighlightSet,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LYRA_DEFAULT_codeBlockLineLabel,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copied,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings.generated.js";class LyraCodeBlockCore extends LyraElement{static{this.defaultStrings={...super.defaultStrings,codeBlockLineLabel:LYRA_DEFAULT_codeBlockLineLabel,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.ownedCollectionProperties=Object.freeze(["languages"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}constructor(){super(),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.copyable=!0,this.copyAppearance="text",this.hasHeaderActions=!1,this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.focusedLine=1,this.restoreFocusedLineAfterUpdate=!1,this.languages={},this.highlightedHtml=null,this.shikiReady=!1,this.justCopied=!1,this.copyFailed=!1,this.isDarkTheme=!1,this.interactions=new CodeBlockInteractionController({host:this,setFocusedLine:line=>{this.focusedLine=line},setJustCopied:value=>{this.justCopied=value},setCopyFailed:value=>{this.copyFailed=value},setDarkTheme:value=>{this.isDarkTheme=value},emitLineActivate:line=>this.emit("lr-line-activate",{line}),emitCopy:outcome=>this.emit("lr-copy",outcome),emitError:()=>this.emit("lr-error",null),emitCopyError:outcome=>this.emit("lr-copy-error",outcome),requestToggle:collapsed=>!this.emit("lr-toggle-request",{collapsed},{cancelable:!0}).defaultPrevented,emitToggle:collapsed=>this.emit("lr-toggle",{collapsed}),emitTextSelect:selection=>this.emit("lr-text-select",selection)}),this.highlightToken=0,this.highlighterGeneration=0,this.bodyId=nextId("code-block-body"),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback(),this.refreshTheme(),this.observeHeaderActions();const languages=this.languages,generation=this.activateLanguages(languages);Object.keys(languages).length!==0&&loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(()=>{!this.isConnected||generation!==this.highlighterGeneration||languages!==this.languages||(this.shikiReady=!0,this.syncHighlight())})}disconnectedCallback(){super.disconnectedCallback(),this.headerActionsObserver?.disconnect(),this.headerActionsObserver=void 0,this.interactions.disconnect(),this.activeLanguages=void 0,this.highlighterGeneration+=1,this.highlightToken+=1,this.shikiReady=!1,this.highlightedHtml=null}adoptedCallback(){super.adoptedCallback(),this.interactions.disconnect()}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}lineHighlightSet(){return codeBlockLineHighlightSet(this.highlightLines??"",this.highlights,this.lineCount())}activeHighlightLineSet(){return codeBlockActiveHighlightLineSet(this.highlights,this.activeHighlightId,this.lineCount())}lineCount(){return codeBlockLineCount(this.code??"")}async scrollToAnchor(target){return scrollCodeBlockToAnchor(this,target)}refreshTheme(){this.interactions.refreshTheme()}willUpdate(changed){super.willUpdate(changed),this.syncHeaderActions(),this.restoreFocusedLineAfterUpdate=codeBlockLineHasFocus(this),changed.has("code")&&(this.focusedLine=clampCodeBlockFocusedLine(this.focusedLine,this.lineCount())),changed.has("languages")&&this.activateLanguages(this.languages),this.interactions.needsHighlightResync(changed,this.effectiveLocale,this.localize("codeBlockLineLabel"))&&(this.shikiReady||this.preSuppliedGrammar()?this.syncHighlight():this.highlightedHtml=null)}updated(changed){super.updated(changed),applyCodeBlockAriaBusy(this,this.showsSkeleton()),this.restoreFocusedLineAfterUpdate&&(restoreCodeBlockLineFocus(this,this.focusedLine),this.restoreFocusedLineAfterUpdate=!1)}syncHeaderActions(){const children=this.children;this.hasHeaderActions=(children?Array.from(children):[]).some(child=>child.getAttribute("slot")==="header-actions")}observeHeaderActions(){this.headerActionsObserver||typeof MutationObserver>"u"||(this.syncHeaderActions(),this.headerActionsObserver=new MutationObserver(()=>this.syncHeaderActions()),this.headerActionsObserver.observe(this,{childList:!0,attributes:!0,attributeFilter:["slot"],subtree:!0}))}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!!this.preSuppliedGrammar())}activateLanguages(languages){return this.activeLanguages===languages?this.highlighterGeneration:(this.activeLanguages=languages,this.highlighterGeneration+=1,this.highlightToken+=1,this.shikiReady=!1,this.highlightedHtml=null,this.highlighterGeneration)}syncHighlight(){const languages=this.languages,generation=this.activateLanguages(languages),token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang){this.highlightedHtml=null;return}const source=languages?.[lang]??languages?.[this.language];if(source===void 0){this.highlightedHtml=null;return}this.highlightedHtml=null,loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(async hl=>{if(token!==this.highlightToken||generation!==this.highlighterGeneration||languages!==this.languages)return;if(!hl){if(!this.isConnected)return;this.shikiReady=!0,this.highlightedHtml=null;return}const loaded=await ensureShikiLanguageLoaded(hl,lang,source);token===this.highlightToken&&(generation!==this.highlighterGeneration||languages!==this.languages||this.isConnected&&(this.shikiReady=!0,this.highlightedHtml=loaded?this.tokenize(hl,lang):null))})}tokenize(hl,lang){return tokenizeCodeBlock(hl,{code:this.code??"",lang,lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line)})}renderPlainCode(){return renderCodeBlockPlainCode({code:this.code??"",lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),localize:this.localize.bind(this),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line),onLineActivate:line=>this.interactions.onLineActivate(line),onLineKeyDown:(e,line)=>this.interactions.onLineKeyDown(e,line)})}render(){return renderCodeBlockShell({filename:this.filename,language:this.language,copyable:this.copyable,copyAppearance:this.copyAppearance,hasHeaderActions:this.hasHeaderActions,collapsible:this.collapsible,collapsed:this.collapsed,justCopied:this.justCopied,copyFailed:this.copyFailed,bodyId:this.bodyId,accessibleLabel:this.accessibleLabel,maxHeight:this.maxHeight,isDarkTheme:this.isDarkTheme,showSkeleton:this.showsSkeleton(),highlightedHtml:this.highlightedHtml,lineNumbers:this.lineNumbers,localize:this.localize.bind(this),renderPlainCode:()=>this.renderPlainCode(),onToggle:this.interactions.toggleCollapsed,onCopy:this.interactions.copy,onBodyMouseUp:this.interactions.onBodyMouseUp,onBodyClick:this.interactions.onBodyClick,onBodyKeyDown:this.interactions.onBodyKeyDown,onBodyFocusIn:this.interactions.onBodyFocusIn})}}__decorate([property()],LyraCodeBlockCore.prototype,"code",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"language",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlockCore.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsed",void 0),__decorate([property({type:Boolean,reflect:!0,converter:trueDefaultBooleanConverter})],LyraCodeBlockCore.prototype,"copyable",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlockCore.prototype,"copyAppearance",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"hasHeaderActions",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlockCore.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlockCore.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlockCore.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlockCore.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlockCore.prototype,"activeHighlightId",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"focusedLine",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"languages",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"highlightedHtml",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"shikiReady",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"justCopied",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"copyFailed",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"isDarkTheme",void 0);export{LyraCodeBlockCore};
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{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{ensureShikiLanguageLoaded,loadShikiHighlighterCore,normalizeShikiLanguage,resolvedShikiLanguages}from"./shiki-types.js";import{styles}from"./code-block.styles.js";import{CodeBlockHeaderActionsController,CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockLineHasFocus,codeBlockLineCount,codeBlockLineHighlightSet,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LYRA_DEFAULT_codeBlockLineLabel,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copied,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings.generated.js";class LyraCodeBlockCore extends LyraElement{static{this.defaultStrings={...super.defaultStrings,codeBlockLineLabel:LYRA_DEFAULT_codeBlockLineLabel,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.ownedCollectionProperties=Object.freeze(["languages"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}constructor(){super(),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.copyable=!0,this.copyAppearance="text",this.hasHeaderActions=!1,this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.focusedLine=1,this.restoreFocusedLineAfterUpdate=!1,this.languages={},this.highlightedHtml=null,this.shikiReady=!1,this.justCopied=!1,this.copyFailed=!1,this.isDarkTheme=!1,this.interactions=new CodeBlockInteractionController({host:this,setFocusedLine:line=>{this.focusedLine=line},setJustCopied:value=>{this.justCopied=value},setCopyFailed:value=>{this.copyFailed=value},setDarkTheme:value=>{this.isDarkTheme=value},emitLineActivate:line=>this.emit("lr-line-activate",{line}),emitCopy:outcome=>this.emit("lr-copy",outcome),emitError:()=>this.emit("lr-error",null),emitCopyError:outcome=>this.emit("lr-copy-error",outcome),requestToggle:collapsed=>!this.emit("lr-toggle-request",{collapsed},{cancelable:!0}).defaultPrevented,emitToggle:collapsed=>this.emit("lr-toggle",{collapsed}),emitTextSelect:selection=>this.emit("lr-text-select",selection)}),this.headerActions=new CodeBlockHeaderActionsController({host:this,setHasHeaderActions:value=>{this.hasHeaderActions=value}}),this.highlightToken=0,this.highlighterGeneration=0,this.bodyId=nextId("code-block-body"),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback(),this.refreshTheme(),this.headerActions.observe();const languages=this.languages,generation=this.activateLanguages(languages);Object.keys(languages).length!==0&&loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(()=>{!this.isConnected||generation!==this.highlighterGeneration||languages!==this.languages||(this.shikiReady=!0,this.syncHighlight())})}disconnectedCallback(){super.disconnectedCallback(),this.headerActions.disconnect(),this.interactions.disconnect(),this.activeLanguages=void 0,this.highlighterGeneration+=1,this.highlightToken+=1,this.shikiReady=!1,this.highlightedHtml=null}adoptedCallback(){super.adoptedCallback(),this.interactions.disconnect()}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}lineHighlightSet(){return codeBlockLineHighlightSet(this.highlightLines??"",this.highlights,this.lineCount())}activeHighlightLineSet(){return codeBlockActiveHighlightLineSet(this.highlights,this.activeHighlightId,this.lineCount())}lineCount(){return codeBlockLineCount(this.code??"")}async scrollToAnchor(target){return scrollCodeBlockToAnchor(this,target)}refreshTheme(){this.interactions.refreshTheme()}willUpdate(changed){super.willUpdate(changed),this.headerActions.sync(),this.restoreFocusedLineAfterUpdate=codeBlockLineHasFocus(this),changed.has("code")&&(this.focusedLine=clampCodeBlockFocusedLine(this.focusedLine,this.lineCount())),changed.has("languages")&&this.activateLanguages(this.languages),this.interactions.needsHighlightResync(changed,this.effectiveLocale,this.localize("codeBlockLineLabel"))&&(this.shikiReady||this.preSuppliedGrammar()?this.syncHighlight():this.highlightedHtml=null)}updated(changed){super.updated(changed),applyCodeBlockAriaBusy(this,this.showsSkeleton()),this.restoreFocusedLineAfterUpdate&&(restoreCodeBlockLineFocus(this,this.focusedLine),this.restoreFocusedLineAfterUpdate=!1)}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!!this.preSuppliedGrammar())}activateLanguages(languages){return this.activeLanguages===languages?this.highlighterGeneration:(this.activeLanguages=languages,this.highlighterGeneration+=1,this.highlightToken+=1,this.shikiReady=!1,this.highlightedHtml=null,this.highlighterGeneration)}syncHighlight(){const languages=this.languages,generation=this.activateLanguages(languages),token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang){this.highlightedHtml=null;return}const source=languages?.[lang]??languages?.[this.language];if(source===void 0){this.highlightedHtml=null;return}this.highlightedHtml=null,loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(async hl=>{if(token!==this.highlightToken||generation!==this.highlighterGeneration||languages!==this.languages)return;if(!hl){if(!this.isConnected)return;this.shikiReady=!0,this.highlightedHtml=null;return}const loaded=await ensureShikiLanguageLoaded(hl,lang,source);token===this.highlightToken&&(generation!==this.highlighterGeneration||languages!==this.languages||this.isConnected&&(this.shikiReady=!0,this.highlightedHtml=loaded?this.tokenize(hl,lang):null))})}tokenize(hl,lang){return tokenizeCodeBlock(hl,{code:this.code??"",lang,lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line)})}renderPlainCode(){return renderCodeBlockPlainCode({code:this.code??"",lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),localize:this.localize.bind(this),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line),onLineActivate:line=>this.interactions.onLineActivate(line),onLineKeyDown:(e,line)=>this.interactions.onLineKeyDown(e,line)})}render(){return renderCodeBlockShell({filename:this.filename,language:this.language,copyable:this.copyable,copyAppearance:this.copyAppearance,hasHeaderActions:this.hasHeaderActions,collapsible:this.collapsible,collapsed:this.collapsed,justCopied:this.justCopied,copyFailed:this.copyFailed,bodyId:this.bodyId,accessibleLabel:this.accessibleLabel,maxHeight:this.maxHeight,isDarkTheme:this.isDarkTheme,showSkeleton:this.showsSkeleton(),highlightedHtml:this.highlightedHtml,lineNumbers:this.lineNumbers,localize:this.localize.bind(this),renderPlainCode:()=>this.renderPlainCode(),onToggle:this.interactions.toggleCollapsed,onCopy:this.interactions.copy,onBodyMouseUp:this.interactions.onBodyMouseUp,onBodyClick:this.interactions.onBodyClick,onBodyKeyDown:this.interactions.onBodyKeyDown,onBodyFocusIn:this.interactions.onBodyFocusIn})}}__decorate([property()],LyraCodeBlockCore.prototype,"code",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"language",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlockCore.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsed",void 0),__decorate([property({type:Boolean,reflect:!0,converter:trueDefaultBooleanConverter})],LyraCodeBlockCore.prototype,"copyable",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlockCore.prototype,"copyAppearance",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"hasHeaderActions",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlockCore.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlockCore.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlockCore.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlockCore.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlockCore.prototype,"activeHighlightId",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"focusedLine",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"languages",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"highlightedHtml",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"shikiReady",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"justCopied",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"copyFailed",void 0),__decorate([state()],LyraCodeBlockCore.prototype,"isDarkTheme",void 0);export{LyraCodeBlockCore};
@@ -170,4 +170,32 @@ disconnect():void;private setCopyStatus;
170
170
  setFocusedLine(line:number):void;onLineActivate:(line:number)=>void;onLineKeyDown:(e:KeyboardEvent,line:number)=>void;onBodyClick:(e:MouseEvent)=>void;onBodyKeyDown:(e:KeyboardEvent)=>void;onBodyFocusIn:(e:FocusEvent)=>void;
171
171
  /** Anchors a text selection ending inside `[part="body"]` to the `line-range` it spans, so a
172
172
  * host can persist or otherwise act on it. Fires nothing when there's no active selection. */
173
- onBodyMouseUp:()=>void;copy:()=>Promise<void>;toggleCollapsed:()=>void;}export{};
173
+ onBodyMouseUp:()=>void;copy:()=>Promise<void>;toggleCollapsed:()=>void;}
174
+ /** The reactive write {@linkcode CodeBlockHeaderActionsController} cannot perform itself: each
175
+ * component keeps `hasHeaderActions` as its own `@state()` (it reaches the shared render
176
+ * options this module's `renderCodeBlockShell()` accepts) and hands the setter in as a
177
+ * callback, the same shape `CodeBlockInteractionOptions` uses for `focusedLine`/`justCopied`/
178
+ * etc. */
179
+ export interface CodeBlockHeaderActionsOptions{host:HTMLElement;setHasHeaderActions:(value:boolean)=>void;}
180
+ /**
181
+ * Watches a code-block host's own light DOM so appending (or removing) a `slot="header-actions"`
182
+ * child brings the header into existence -- or retires it -- without the consumer touching a
183
+ * property.
184
+ *
185
+ * `<lr-code-block>` and `<lr-code-block-core>` previously each defined their own byte-identical
186
+ * `syncHeaderActions()`/`observeHeaderActions()` private methods plus the backing
187
+ * `headerActionsObserver` field -- exactly the drift class this module exists to prevent, and
188
+ * already caught once before for `renderPlainCode()`. Both components now instantiate this
189
+ * single controller instead.
190
+ */
191
+ export declare class CodeBlockHeaderActionsController{private readonly options;private observer?;constructor(options:CodeBlockHeaderActionsOptions);
192
+ /** Re-reads the host's light DOM and reports the result through `setHasHeaderActions`. Safe to
193
+ * call on every update pass -- it does its own light-DOM read, not a diff against `observe()`'s
194
+ * MutationObserver state. */
195
+ sync():void;
196
+ /** Starts (once) watching the host's light DOM for a `header-actions` slot claim, syncing
197
+ * immediately so a child already present at call time is picked up. A no-op on a second call
198
+ * or when `MutationObserver` is unavailable. */
199
+ observe():void;
200
+ /** Retires the observer, e.g. on host disconnect. */
201
+ disconnect():void;}export{};
@@ -85,4 +85,4 @@ import{html,nothing}from"lit";import{unsafeHTML}from"lit/directives/unsafe-html.
85
85
  ${options.showSkeleton?html`<lr-skeleton shape="rect" .announce=${!1}></lr-skeleton>`:options.highlightedHtml!==null?unsafeHTML(options.highlightedHtml):html`<pre part="pre" class=${options.lineNumbers?"line-numbers":nothing}>${options.renderPlainCode()}</pre>`}
86
86
  </div>
87
87
  </div>
88
- `}class CodeBlockInteractionController{needsHighlightResync(changed,locale,lineLabel){const localizationChanged=this.highlightedLocale!==locale||this.highlightedLineLabel!==lineLabel;return this.highlightedLocale=locale,this.highlightedLineLabel=lineLabel,localizationChanged||codeBlockNeedsHighlightResync(changed)}constructor(options){this.options=options,this.copyGeneration=0,this.onLineActivate=line=>{this.setFocusedLine(line),this.options.emitLineActivate(line)},this.onLineKeyDown=(e,line)=>{const{host}=this.options,action=codeBlockLineKeyAction(e.key,line,codeBlockLineCount(host.code??""));if(action===null)return;if(e.preventDefault(),action.kind==="activate"){this.onLineActivate(line);return}const next=action.line;this.setFocusedLine(next),host.updateComplete.then(()=>{host.renderRoot.querySelector(`[part~="line-button"][data-line="${next}"]`)?.focus()})},this.onBodyClick=e=>{if(e.composedPath()[0]?.closest?.("button[data-inline-handler]"))return;const line=codeBlockEventLine(e);line!==null&&this.onLineActivate(line)},this.onBodyKeyDown=e=>{if(e.composedPath()[0]?.closest?.("button[data-inline-handler]"))return;const line=codeBlockEventLine(e);line!==null&&this.onLineKeyDown(e,line)},this.onBodyFocusIn=e=>{const line=codeBlockEventLine(e);line!==null&&this.setFocusedLine(line)},this.onBodyMouseUp=()=>{const selection=codeBlockSelectionAnchor(this.options.host.shadowRoot);selection&&this.options.emitTextSelect(selection)},this.copy=async()=>{const{host}=this.options,owner=host.isConnected?host.ownerDocument.defaultView:null,text=host.code??"",generation=++this.copyGeneration;this.cancelCopyTimer(),this.setCopyStatus("rest");const outcome=await writeClipboardText(owner,text);if(!owner||!host.isConnected||host.ownerDocument.defaultView!==owner||generation!==this.copyGeneration)return;outcome.ok?(this.options.emitCopy(outcome),this.setCopyStatus("success")):(this.setCopyStatus("error"),this.options.emitError(),this.options.emitCopyError(outcome));let handle=0;handle=owner.setTimeout(()=>{this.copyTimer?.owner!==owner||this.copyTimer.handle!==handle||!host.isConnected||host.ownerDocument.defaultView!==owner||generation!==this.copyGeneration||(this.copyTimer=void 0,this.setCopyStatus("rest"))},CODE_BLOCK_COPY_CONFIRM_MS),this.copyTimer={owner,handle}},this.toggleCollapsed=()=>{const{host}=this.options,collapsed=!host.collapsed;this.options.requestToggle(collapsed)&&(host.collapsed=collapsed,this.options.emitToggle(host.collapsed))}}refreshTheme(){this.options.setDarkTheme(resolveIsDarkTheme(this.options.host))}cancelCopyTimer(){const timer=this.copyTimer;this.copyTimer=void 0,timer&&timer.owner.clearTimeout(timer.handle)}disconnect(){this.copyGeneration++,this.cancelCopyTimer(),this.options.setJustCopied(!1),this.options.setCopyFailed(!1)}setCopyStatus(status){this.options.setJustCopied(status==="success"),this.options.setCopyFailed(status==="error")}setFocusedLine(line){this.options.setFocusedLine(line);for(const target of this.options.host.renderRoot.querySelectorAll('[data-line][part~="line-button"]'))target.tabIndex=Number(target.dataset.line)===line?0:-1}}export{CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockEventLine,codeBlockLineCount,codeBlockLineHasFocus,codeBlockLineHighlightSet,codeBlockLineTransformer,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,parseHighlightLines,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock};
88
+ `}class CodeBlockInteractionController{needsHighlightResync(changed,locale,lineLabel){const localizationChanged=this.highlightedLocale!==locale||this.highlightedLineLabel!==lineLabel;return this.highlightedLocale=locale,this.highlightedLineLabel=lineLabel,localizationChanged||codeBlockNeedsHighlightResync(changed)}constructor(options){this.options=options,this.copyGeneration=0,this.onLineActivate=line=>{this.setFocusedLine(line),this.options.emitLineActivate(line)},this.onLineKeyDown=(e,line)=>{const{host}=this.options,action=codeBlockLineKeyAction(e.key,line,codeBlockLineCount(host.code??""));if(action===null)return;if(e.preventDefault(),action.kind==="activate"){this.onLineActivate(line);return}const next=action.line;this.setFocusedLine(next),host.updateComplete.then(()=>{host.renderRoot.querySelector(`[part~="line-button"][data-line="${next}"]`)?.focus()})},this.onBodyClick=e=>{if(e.composedPath()[0]?.closest?.("button[data-inline-handler]"))return;const line=codeBlockEventLine(e);line!==null&&this.onLineActivate(line)},this.onBodyKeyDown=e=>{if(e.composedPath()[0]?.closest?.("button[data-inline-handler]"))return;const line=codeBlockEventLine(e);line!==null&&this.onLineKeyDown(e,line)},this.onBodyFocusIn=e=>{const line=codeBlockEventLine(e);line!==null&&this.setFocusedLine(line)},this.onBodyMouseUp=()=>{const selection=codeBlockSelectionAnchor(this.options.host.shadowRoot);selection&&this.options.emitTextSelect(selection)},this.copy=async()=>{const{host}=this.options,owner=host.isConnected?host.ownerDocument.defaultView:null,text=host.code??"",generation=++this.copyGeneration;this.cancelCopyTimer(),this.setCopyStatus("rest");const outcome=await writeClipboardText(owner,text);if(!owner||!host.isConnected||host.ownerDocument.defaultView!==owner||generation!==this.copyGeneration)return;outcome.ok?(this.options.emitCopy(outcome),this.setCopyStatus("success")):(this.setCopyStatus("error"),this.options.emitError(),this.options.emitCopyError(outcome));let handle=0;handle=owner.setTimeout(()=>{this.copyTimer?.owner!==owner||this.copyTimer.handle!==handle||!host.isConnected||host.ownerDocument.defaultView!==owner||generation!==this.copyGeneration||(this.copyTimer=void 0,this.setCopyStatus("rest"))},CODE_BLOCK_COPY_CONFIRM_MS),this.copyTimer={owner,handle}},this.toggleCollapsed=()=>{const{host}=this.options,collapsed=!host.collapsed;this.options.requestToggle(collapsed)&&(host.collapsed=collapsed,this.options.emitToggle(host.collapsed))}}refreshTheme(){this.options.setDarkTheme(resolveIsDarkTheme(this.options.host))}cancelCopyTimer(){const timer=this.copyTimer;this.copyTimer=void 0,timer&&timer.owner.clearTimeout(timer.handle)}disconnect(){this.copyGeneration++,this.cancelCopyTimer(),this.options.setJustCopied(!1),this.options.setCopyFailed(!1)}setCopyStatus(status){this.options.setJustCopied(status==="success"),this.options.setCopyFailed(status==="error")}setFocusedLine(line){this.options.setFocusedLine(line);for(const target of this.options.host.renderRoot.querySelectorAll('[data-line][part~="line-button"]'))target.tabIndex=Number(target.dataset.line)===line?0:-1}}function codeBlockHasHeaderActions(host){return Array.from(host.children).some(child=>child.getAttribute("slot")==="header-actions")}class CodeBlockHeaderActionsController{constructor(options){this.options=options}sync(){this.options.setHasHeaderActions(codeBlockHasHeaderActions(this.options.host))}observe(){this.observer||typeof MutationObserver>"u"||(this.sync(),this.observer=new MutationObserver(()=>this.sync()),this.observer.observe(this.options.host,{childList:!0,attributes:!0,attributeFilter:["slot"],subtree:!0}))}disconnect(){this.observer?.disconnect(),this.observer=void 0}}export{CodeBlockHeaderActionsController,CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockEventLine,codeBlockLineCount,codeBlockLineHasFocus,codeBlockLineHighlightSet,codeBlockLineTransformer,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,parseHighlightLines,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock};
@@ -165,16 +165,11 @@ copyable:boolean;
165
165
  * string to the control's accessible name, for a dense header that already carries a filename,
166
166
  * a language chip and slotted `header-actions`. */
167
167
  copyAppearance:LyraCodeBlockCopyAppearance;
168
- /** Whether a light-DOM child is assigned to `header-actions`. Read from `children` rather than a
169
- * `slotchange`, because the slot only exists once the header renders -- and whether the header
170
- * renders at all is exactly what this answers for a code block with no filename, language,
171
- * copy control or collapse toggle. `headerActionsObserver` closes that loop for a child appended
172
- * after first render, which no `slotchange` could ever report for a header that isn't there. */
168
+ /** Whether a light-DOM child is assigned to `header-actions`. Set from `headerActions`
169
+ * (`CodeBlockHeaderActionsController` in code-block-shared.ts), which closes the loop for a
170
+ * child appended after first render, which no `slotchange` could ever report for a header
171
+ * that isn't there. */
173
172
  private hasHeaderActions;
174
- /** Watches the host's own light DOM so appending (or removing) a `slot="header-actions"` child
175
- * brings the header into existence -- or retires it -- without the consumer touching a
176
- * property. */
177
- private headerActionsObserver?;
178
173
  /** A CSS length (e.g. `"20rem"`); once set, the code scrolls internally
179
174
  * past this height instead of growing the page. */
180
175
  maxHeight:string;
@@ -210,12 +205,12 @@ readonly anchorKinds:readonly LyraAnchor['kind'][];private focusedLine;private r
210
205
  * annotation, use `import type { ShikiLanguageInput } from
211
206
  * '@aceshooting/lyra-ui/components/conversation/code-block/code-block.js'`;
212
207
  * this granular type-only import emits no registration side effect. */
213
- languages?:Readonly<Record<string,ShikiLanguageInput>>;private highlightedHtml;private shikiReady;private justCopied;private copyFailed;private isDarkTheme;private highlighter?;private readonly interactions;private highlightToken;private defaultHighlighterLoading;private readonly bodyId;constructor();connectedCallback():void;private ensureDefaultHighlighter;disconnectedCallback():void;adoptedCallback():void;private preSuppliedGrammar;private lineHighlightSet;private activeHighlightLineSet;private lineCount;
208
+ languages?:Readonly<Record<string,ShikiLanguageInput>>;private highlightedHtml;private shikiReady;private justCopied;private copyFailed;private isDarkTheme;private highlighter?;private readonly interactions;private readonly headerActions;private highlightToken;private defaultHighlighterLoading;private readonly bodyId;constructor();connectedCallback():void;private ensureDefaultHighlighter;disconnectedCallback():void;adoptedCallback():void;private preSuppliedGrammar;private lineHighlightSet;private activeHighlightLineSet;private lineCount;
214
209
  /** Resolves a `line-range` anchor (or a `highlights` id string resolving to one) by scrolling
215
210
  * its start line into view within `[part="body"]`. Resolves `false` when the anchor isn't a
216
211
  * `line-range`, the id isn't found, or the start line is out of bounds. */
217
212
  scrollToAnchor(target:LyraAnchor|string):Promise<boolean>;
218
213
  /** Recomputes Shiki palette selection after an imperative CSSOM theme change. */
219
- refreshTheme():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private syncHeaderActions;private observeHeaderActions;
214
+ refreshTheme():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;
220
215
  /** Whether this render shows the loading skeleton instead of the code. */
221
216
  private showsSkeleton;private syncHighlight;private tokenize;private renderPlainCode;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-code-block':LyraCodeBlock;}}
@@ -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{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{loadShikiHighlighter,loadShikiLanguage,loadShikiHighlighterCore,normalizeShikiLanguage,shikiHasLoadedLanguage}from"./code-loader.js";import{styles}from"./code-block.styles.js";import{CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockLineHasFocus,codeBlockLineCount,codeBlockLineHighlightSet,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LYRA_DEFAULT_codeBlockLineLabel,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copied,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings.generated.js";class LyraCodeBlock extends LyraElement{static{this.defaultStrings={...super.defaultStrings,codeBlockLineLabel:LYRA_DEFAULT_codeBlockLineLabel,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}constructor(){super(),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.copyable=!0,this.copyAppearance="text",this.hasHeaderActions=!1,this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.focusedLine=1,this.restoreFocusedLineAfterUpdate=!1,this.highlightedHtml=null,this.shikiReady=!1,this.justCopied=!1,this.copyFailed=!1,this.isDarkTheme=!1,this.interactions=new CodeBlockInteractionController({host:this,setFocusedLine:line=>{this.focusedLine=line},setJustCopied:value=>{this.justCopied=value},setCopyFailed:value=>{this.copyFailed=value},setDarkTheme:value=>{this.isDarkTheme=value},emitLineActivate:line=>this.emit("lr-line-activate",{line}),emitCopy:outcome=>this.emit("lr-copy",outcome),emitError:()=>this.emit("lr-error",null),emitCopyError:outcome=>this.emit("lr-copy-error",outcome),requestToggle:collapsed=>!this.emit("lr-toggle-request",{collapsed},{cancelable:!0}).defaultPrevented,emitToggle:collapsed=>this.emit("lr-toggle",{collapsed}),emitTextSelect:selection=>this.emit("lr-text-select",selection)}),this.highlightToken=0,this.defaultHighlighterLoading=!1,this.bodyId=nextId("code-block-body"),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback(),this.refreshTheme(),this.observeHeaderActions(),this.ensureDefaultHighlighter(),(this.preSuppliedGrammar()||this.highlighter)&&this.syncHighlight()}ensureDefaultHighlighter(){!this.isConnected||this.highlighter!==void 0||this.defaultHighlighterLoading||(this.defaultHighlighterLoading=!0,loadShikiHighlighter().then(hl=>{this.defaultHighlighterLoading=!1,this.isConnected&&(this.highlighter=hl,this.shikiReady=!0,this.syncHighlight())}))}disconnectedCallback(){this.highlightToken++,super.disconnectedCallback(),this.headerActionsObserver?.disconnect(),this.headerActionsObserver=void 0,this.interactions.disconnect(),this.highlightedHtml=null}adoptedCallback(){super.adoptedCallback(),this.interactions.disconnect()}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}lineHighlightSet(){return codeBlockLineHighlightSet(this.highlightLines??"",this.highlights,this.lineCount())}activeHighlightLineSet(){return codeBlockActiveHighlightLineSet(this.highlights,this.activeHighlightId,this.lineCount())}lineCount(){return codeBlockLineCount(this.code??"")}async scrollToAnchor(target){return scrollCodeBlockToAnchor(this,target)}refreshTheme(){this.interactions.refreshTheme()}willUpdate(changed){super.willUpdate(changed),this.syncHeaderActions(),this.restoreFocusedLineAfterUpdate=codeBlockLineHasFocus(this),changed.has("code")&&(this.focusedLine=clampCodeBlockFocusedLine(this.focusedLine,this.lineCount())),this.interactions.needsHighlightResync(changed,this.effectiveLocale,this.localize("codeBlockLineLabel"))&&(this.shikiReady||this.preSuppliedGrammar())&&this.syncHighlight()}updated(changed){super.updated(changed),applyCodeBlockAriaBusy(this,this.showsSkeleton()),this.restoreFocusedLineAfterUpdate&&(restoreCodeBlockLineFocus(this,this.focusedLine),this.restoreFocusedLineAfterUpdate=!1)}syncHeaderActions(){const children=this.children;this.hasHeaderActions=(children?Array.from(children):[]).some(child=>child.getAttribute("slot")==="header-actions")}observeHeaderActions(){this.headerActionsObserver||typeof MutationObserver>"u"||(this.syncHeaderActions(),this.headerActionsObserver=new MutationObserver(()=>this.syncHeaderActions()),this.headerActionsObserver.observe(this,{childList:!0,attributes:!0,attributeFilter:["slot"],subtree:!0}))}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!this.preSuppliedGrammar())}syncHighlight(){const token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang){this.highlightedHtml=null;return}const languages=this.languages;if(languages?.[lang]??languages?.[this.language]){this.highlightedHtml=null,loadShikiHighlighterCore(languages).then(hl2=>{token===this.highlightToken&&this.isConnected&&(this.highlightedHtml=hl2?this.tokenize(hl2,lang):null)});return}const hl=this.highlighter;if(!hl){this.highlightedHtml=null;return}if(shikiHasLoadedLanguage(hl,lang)){this.highlightedHtml=this.tokenize(hl,lang);return}this.highlightedHtml=null,loadShikiLanguage(hl,lang).then(ok=>{token===this.highlightToken&&this.isConnected&&(this.highlightedHtml=ok?this.tokenize(hl,lang):null)})}tokenize(hl,lang){return tokenizeCodeBlock(hl,{code:this.code??"",lang,lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line)})}renderPlainCode(){return renderCodeBlockPlainCode({code:this.code??"",lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),localize:this.localize.bind(this),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line),onLineActivate:line=>this.interactions.onLineActivate(line),onLineKeyDown:(e,line)=>this.interactions.onLineKeyDown(e,line)})}render(){return renderCodeBlockShell({filename:this.filename,language:this.language,copyable:this.copyable,copyAppearance:this.copyAppearance,hasHeaderActions:this.hasHeaderActions,collapsible:this.collapsible,collapsed:this.collapsed,justCopied:this.justCopied,copyFailed:this.copyFailed,bodyId:this.bodyId,accessibleLabel:this.accessibleLabel,maxHeight:this.maxHeight,isDarkTheme:this.isDarkTheme,showSkeleton:this.showsSkeleton(),highlightedHtml:this.highlightedHtml,lineNumbers:this.lineNumbers,localize:this.localize.bind(this),renderPlainCode:()=>this.renderPlainCode(),onToggle:this.interactions.toggleCollapsed,onCopy:this.interactions.copy,onBodyMouseUp:this.interactions.onBodyMouseUp,onBodyClick:this.interactions.onBodyClick,onBodyKeyDown:this.interactions.onBodyKeyDown,onBodyFocusIn:this.interactions.onBodyFocusIn})}}__decorate([property()],LyraCodeBlock.prototype,"code",void 0),__decorate([property()],LyraCodeBlock.prototype,"language",void 0),__decorate([property()],LyraCodeBlock.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlock.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlock.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlock.prototype,"collapsed",void 0),__decorate([property({type:Boolean,reflect:!0,converter:trueDefaultBooleanConverter})],LyraCodeBlock.prototype,"copyable",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlock.prototype,"copyAppearance",void 0),__decorate([state()],LyraCodeBlock.prototype,"hasHeaderActions",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlock.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlock.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlock.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlock.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlock.prototype,"activeHighlightId",void 0),__decorate([state()],LyraCodeBlock.prototype,"focusedLine",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"languages",void 0),__decorate([state()],LyraCodeBlock.prototype,"highlightedHtml",void 0),__decorate([state()],LyraCodeBlock.prototype,"shikiReady",void 0),__decorate([state()],LyraCodeBlock.prototype,"justCopied",void 0),__decorate([state()],LyraCodeBlock.prototype,"copyFailed",void 0),__decorate([state()],LyraCodeBlock.prototype,"isDarkTheme",void 0);export{LyraCodeBlock};
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{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{loadShikiHighlighter,loadShikiLanguage,loadShikiHighlighterCore,normalizeShikiLanguage,shikiHasLoadedLanguage}from"./code-loader.js";import{styles}from"./code-block.styles.js";import{CodeBlockHeaderActionsController,CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockLineHasFocus,codeBlockLineCount,codeBlockLineHighlightSet,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LYRA_DEFAULT_codeBlockLineLabel,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copied,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings.generated.js";class LyraCodeBlock extends LyraElement{static{this.defaultStrings={...super.defaultStrings,codeBlockLineLabel:LYRA_DEFAULT_codeBlockLineLabel,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}constructor(){super(),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.copyable=!0,this.copyAppearance="text",this.hasHeaderActions=!1,this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.focusedLine=1,this.restoreFocusedLineAfterUpdate=!1,this.highlightedHtml=null,this.shikiReady=!1,this.justCopied=!1,this.copyFailed=!1,this.isDarkTheme=!1,this.interactions=new CodeBlockInteractionController({host:this,setFocusedLine:line=>{this.focusedLine=line},setJustCopied:value=>{this.justCopied=value},setCopyFailed:value=>{this.copyFailed=value},setDarkTheme:value=>{this.isDarkTheme=value},emitLineActivate:line=>this.emit("lr-line-activate",{line}),emitCopy:outcome=>this.emit("lr-copy",outcome),emitError:()=>this.emit("lr-error",null),emitCopyError:outcome=>this.emit("lr-copy-error",outcome),requestToggle:collapsed=>!this.emit("lr-toggle-request",{collapsed},{cancelable:!0}).defaultPrevented,emitToggle:collapsed=>this.emit("lr-toggle",{collapsed}),emitTextSelect:selection=>this.emit("lr-text-select",selection)}),this.headerActions=new CodeBlockHeaderActionsController({host:this,setHasHeaderActions:value=>{this.hasHeaderActions=value}}),this.highlightToken=0,this.defaultHighlighterLoading=!1,this.bodyId=nextId("code-block-body"),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback(),this.refreshTheme(),this.headerActions.observe(),this.ensureDefaultHighlighter(),(this.preSuppliedGrammar()||this.highlighter)&&this.syncHighlight()}ensureDefaultHighlighter(){!this.isConnected||this.highlighter!==void 0||this.defaultHighlighterLoading||(this.defaultHighlighterLoading=!0,loadShikiHighlighter().then(hl=>{this.defaultHighlighterLoading=!1,this.isConnected&&(this.highlighter=hl,this.shikiReady=!0,this.syncHighlight())}))}disconnectedCallback(){this.highlightToken++,super.disconnectedCallback(),this.headerActions.disconnect(),this.interactions.disconnect(),this.highlightedHtml=null}adoptedCallback(){super.adoptedCallback(),this.interactions.disconnect()}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}lineHighlightSet(){return codeBlockLineHighlightSet(this.highlightLines??"",this.highlights,this.lineCount())}activeHighlightLineSet(){return codeBlockActiveHighlightLineSet(this.highlights,this.activeHighlightId,this.lineCount())}lineCount(){return codeBlockLineCount(this.code??"")}async scrollToAnchor(target){return scrollCodeBlockToAnchor(this,target)}refreshTheme(){this.interactions.refreshTheme()}willUpdate(changed){super.willUpdate(changed),this.headerActions.sync(),this.restoreFocusedLineAfterUpdate=codeBlockLineHasFocus(this),changed.has("code")&&(this.focusedLine=clampCodeBlockFocusedLine(this.focusedLine,this.lineCount())),this.interactions.needsHighlightResync(changed,this.effectiveLocale,this.localize("codeBlockLineLabel"))&&(this.shikiReady||this.preSuppliedGrammar())&&this.syncHighlight()}updated(changed){super.updated(changed),applyCodeBlockAriaBusy(this,this.showsSkeleton()),this.restoreFocusedLineAfterUpdate&&(restoreCodeBlockLineFocus(this,this.focusedLine),this.restoreFocusedLineAfterUpdate=!1)}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!this.preSuppliedGrammar())}syncHighlight(){const token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang){this.highlightedHtml=null;return}const languages=this.languages;if(languages?.[lang]??languages?.[this.language]){this.highlightedHtml=null,loadShikiHighlighterCore(languages).then(hl2=>{token===this.highlightToken&&this.isConnected&&(this.highlightedHtml=hl2?this.tokenize(hl2,lang):null)});return}const hl=this.highlighter;if(!hl){this.highlightedHtml=null;return}if(shikiHasLoadedLanguage(hl,lang)){this.highlightedHtml=this.tokenize(hl,lang);return}this.highlightedHtml=null,loadShikiLanguage(hl,lang).then(ok=>{token===this.highlightToken&&this.isConnected&&(this.highlightedHtml=ok?this.tokenize(hl,lang):null)})}tokenize(hl,lang){return tokenizeCodeBlock(hl,{code:this.code??"",lang,lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line)})}renderPlainCode(){return renderCodeBlockPlainCode({code:this.code??"",lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),localize:this.localize.bind(this),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line),onLineActivate:line=>this.interactions.onLineActivate(line),onLineKeyDown:(e,line)=>this.interactions.onLineKeyDown(e,line)})}render(){return renderCodeBlockShell({filename:this.filename,language:this.language,copyable:this.copyable,copyAppearance:this.copyAppearance,hasHeaderActions:this.hasHeaderActions,collapsible:this.collapsible,collapsed:this.collapsed,justCopied:this.justCopied,copyFailed:this.copyFailed,bodyId:this.bodyId,accessibleLabel:this.accessibleLabel,maxHeight:this.maxHeight,isDarkTheme:this.isDarkTheme,showSkeleton:this.showsSkeleton(),highlightedHtml:this.highlightedHtml,lineNumbers:this.lineNumbers,localize:this.localize.bind(this),renderPlainCode:()=>this.renderPlainCode(),onToggle:this.interactions.toggleCollapsed,onCopy:this.interactions.copy,onBodyMouseUp:this.interactions.onBodyMouseUp,onBodyClick:this.interactions.onBodyClick,onBodyKeyDown:this.interactions.onBodyKeyDown,onBodyFocusIn:this.interactions.onBodyFocusIn})}}__decorate([property()],LyraCodeBlock.prototype,"code",void 0),__decorate([property()],LyraCodeBlock.prototype,"language",void 0),__decorate([property()],LyraCodeBlock.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlock.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlock.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlock.prototype,"collapsed",void 0),__decorate([property({type:Boolean,reflect:!0,converter:trueDefaultBooleanConverter})],LyraCodeBlock.prototype,"copyable",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlock.prototype,"copyAppearance",void 0),__decorate([state()],LyraCodeBlock.prototype,"hasHeaderActions",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlock.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlock.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlock.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlock.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlock.prototype,"activeHighlightId",void 0),__decorate([state()],LyraCodeBlock.prototype,"focusedLine",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"languages",void 0),__decorate([state()],LyraCodeBlock.prototype,"highlightedHtml",void 0),__decorate([state()],LyraCodeBlock.prototype,"shikiReady",void 0),__decorate([state()],LyraCodeBlock.prototype,"justCopied",void 0),__decorate([state()],LyraCodeBlock.prototype,"copyFailed",void 0),__decorate([state()],LyraCodeBlock.prototype,"isDarkTheme",void 0);export{LyraCodeBlock};
@@ -12,8 +12,8 @@ ${this.tablerow({text:headerRow})}</thead>
12
12
  `,tbody=bodyRows?`<tbody>${bodyRows}</tbody>
13
13
  `:"";return`<table part='table'>
14
14
  ${thead}${tbody}</table>
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)}
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,sanitizedMaxHeight=sanitizeCssLength(options.maxHeight);return html`
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(";")}">`})}const MARKDOWN_ANCHOR_ATTR=/([a-zA-Z][\w-]*)\s*=\s*(\x22([^\x22]*)\x22|\x27([^\x27]*)\x27|[^\s\x22\x27=<>\x60]+)/g;function enforceMarkdownAnchorRelGuard(markup){return markup.replace(/<a\b[^<>]*>/gi,tag=>{MARKDOWN_ANCHOR_ATTR.lastIndex=0;let hasTarget=!1,relMatch=null,match;for(;match=MARKDOWN_ANCHOR_ATTR.exec(tag);){const name=match[1].toLowerCase();name==="target"?hasTarget=!0:name==="rel"&&(relMatch=match)}if(!hasTarget)return tag;const authoredValue=relMatch?relMatch[3]??relMatch[4]??relMatch[2]:"",tokens=new Set(authoredValue.split(/\s+/).filter(token=>token!==""&&token.toLowerCase()!=="opener"));tokens.add("noopener"),tokens.add("noreferrer");const relValue=[...tokens].join(" ");if(relMatch){const start=relMatch.index,end=start+relMatch[0].length;return`${tag.slice(0,start)}rel='${relValue}'${tag.slice(end)}`}return`${tag.slice(0,-1)} rel='${relValue}'>`})}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)}
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:enforceMarkdownAnchorRelGuard(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=enforceMarkdownAnchorRelGuard(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,sanitizedMaxHeight=sanitizeCssLength(options.maxHeight);return html`
17
17
  <div
18
18
  part="content"
19
19
  role="document"
@@ -95,8 +95,10 @@ finalizePendingSubmit(submissionId:string):boolean;
95
95
  revertPendingSubmit(submissionId:string):boolean;
96
96
  /** Visually hides the bar until the enclosing message is hovered or any control inside has focus. */
97
97
  revealOnInteraction:boolean;
98
- /** Accessible name for the toolbar. Defaults to the localized `messageActionsLabel`. */
99
- label:string;
98
+ /** Accessible name for the toolbar. Omitting it localizes the default `messageActionsLabel`
99
+ * message; an explicit empty string (`label=""` or `.label = ''`) suppresses that default and
100
+ * renders no label. */
101
+ label?:string;
100
102
  /** Overrides the toolbar's computed accessible name. Wins over `label` and the localized
101
103
  * default. Attribute-reflects from a host-level `aria-label` so a plain-markup consumer gets
102
104
  * ARIA-name forwarding without setting a JS property. */