@aceshooting/lyra-ui 14.0.0 → 14.1.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 (475) hide show
  1. package/CHANGELOG.md +155 -19
  2. package/custom-elements.json +1 -1
  3. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +3 -1
  4. package/dist/components/agent-tools/commit-card/commit-card.class.js +2 -2
  5. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -1
  6. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -1
  7. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +6 -2
  8. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +4 -4
  9. package/dist/components/agent-tools/result-card/result-card.class.d.ts +1 -1
  10. package/dist/components/agent-tools/result-card/result-card.class.js +1 -1
  11. package/dist/components/agent-tools/result-card/result-field.class.d.ts +1 -1
  12. package/dist/components/agent-tools/result-card/result-field.class.js +1 -1
  13. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts +1 -1
  14. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
  15. package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -1
  16. package/dist/components/agent-tools/terminal/terminal.class.js +2 -2
  17. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +2 -2
  18. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  19. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
  20. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  21. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +4 -4
  22. package/dist/components/agent-tools/trace-tree/span.d.ts +3 -1
  23. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  24. package/dist/components/charts/chart/box-plot.class.d.ts +2 -0
  25. package/dist/components/charts/chart/box-plot.class.js +1 -1
  26. package/dist/components/charts/chart/chart.class.d.ts +6 -1
  27. package/dist/components/charts/chart/chart.class.js +1 -1
  28. package/dist/components/charts/chart/lite-chart.class.d.ts +20 -11
  29. package/dist/components/charts/chart/lite-chart.class.js +10 -8
  30. package/dist/components/conversation/chat-message/chat-message.class.d.ts +4 -3
  31. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -3
  32. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  33. package/dist/components/conversation/code-block/code-block-shared.d.ts +3 -3
  34. package/dist/components/conversation/code-block/code-block-shared.js +2 -2
  35. package/dist/components/conversation/code-block/code-block.class.d.ts +4 -3
  36. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  37. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  38. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  39. package/dist/components/conversation/conversation-item/conversation-item.class.js +1 -1
  40. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  41. package/dist/components/conversation/markdown/markdown-core.class.d.ts +1 -1
  42. package/dist/components/conversation/markdown/markdown.class.d.ts +1 -1
  43. package/dist/components/conversation/message-actions/message-actions.class.d.ts +2 -0
  44. package/dist/components/conversation/message-actions/message-actions.class.js +1 -1
  45. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +3 -1
  46. package/dist/components/conversation/message-feedback/message-feedback.class.js +2 -2
  47. package/dist/components/conversation/message-parts/message-parts.class.d.ts +3 -0
  48. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  49. package/dist/components/conversation/thread-list/thread-list.class.js +1 -1
  50. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +2 -0
  51. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  52. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts +2 -1
  53. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +1 -1
  54. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.d.ts +3 -0
  55. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.js +1 -0
  56. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -2
  57. package/dist/components/conversation/usage-badge/usage-badge.class.js +1 -1
  58. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -3
  59. package/dist/components/conversation/widget-renderer/resolve.d.ts +4 -6
  60. package/dist/components/conversation/widget-renderer/resolve.js +1 -1
  61. package/dist/components/data/calendar/calendar.class.d.ts +6 -3
  62. package/dist/components/data/calendar/calendar.class.js +1 -1
  63. package/dist/components/data/calendar/calendar.styles.js +1 -1
  64. package/dist/components/data/condition-builder/condition-builder.class.d.ts +3 -1
  65. package/dist/components/data/condition-builder/condition-builder.class.js +15 -1
  66. package/dist/components/data/context-meter/context-meter.class.js +2 -2
  67. package/dist/components/data/data-grid/data-grid.class.d.ts +6 -2
  68. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  69. package/dist/components/data/document-library/document-library.class.d.ts +5 -2
  70. package/dist/components/data/document-library/document-library.class.js +1 -1
  71. package/dist/components/data/file-tree/file-tree.class.d.ts +2 -1
  72. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  73. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +5 -2
  74. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  75. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  76. package/dist/components/data/flow-canvas/flow-types.d.ts +2 -1
  77. package/dist/components/data/funnel/funnel.class.d.ts +1 -0
  78. package/dist/components/data/funnel/funnel.class.js +1 -1
  79. package/dist/components/data/gauge/gauge.class.d.ts +4 -1
  80. package/dist/components/data/gauge/gauge.class.js +6 -6
  81. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +5 -2
  82. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +15 -1
  83. package/dist/components/data/heatmap/heatmap.class.d.ts +7 -4
  84. package/dist/components/data/heatmap/heatmap.class.js +1 -1
  85. package/dist/components/data/sparkline/sparkline.class.d.ts +2 -1
  86. package/dist/components/data/sparkline/sparkline.class.js +1 -1
  87. package/dist/components/data/stat/stat.class.d.ts +6 -2
  88. package/dist/components/data/stat/stat.class.js +1 -1
  89. package/dist/components/data/table/table.class.d.ts +5 -2
  90. package/dist/components/data/table/table.class.js +2 -2
  91. package/dist/components/data/timeline/timeline.class.d.ts +7 -2
  92. package/dist/components/data/timeline/timeline.class.js +1 -1
  93. package/dist/components/data/timeline/timeline.styles.js +1 -1
  94. package/dist/components/data/tree/tree-item.class.d.ts +3 -1
  95. package/dist/components/data/tree/tree-item.class.js +1 -1
  96. package/dist/components/data/tree/tree.class.d.ts +4 -1
  97. package/dist/components/data/tree/tree.class.js +1 -1
  98. package/dist/components/data/word-cloud/word-cloud-layout.d.ts +2 -1
  99. package/dist/components/data/word-cloud/word-cloud-layout.js +1 -1
  100. package/dist/components/data/word-cloud/word-cloud.class.d.ts +2 -1
  101. package/dist/components/forms/button/button.class.d.ts +5 -3
  102. package/dist/components/forms/button/button.class.js +1 -1
  103. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  104. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  105. package/dist/components/forms/code-editor/code-editor.class.d.ts +11 -3
  106. package/dist/components/forms/code-editor/code-editor.class.js +6 -7
  107. package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
  108. package/dist/components/forms/color-picker/color-picker.class.d.ts +5 -1
  109. package/dist/components/forms/color-picker/color-picker.class.js +4 -4
  110. package/dist/components/forms/combobox/combobox.class.d.ts +19 -8
  111. package/dist/components/forms/combobox/combobox.class.js +3 -3
  112. package/dist/components/forms/combobox/option.class.d.ts +4 -0
  113. package/dist/components/forms/combobox/option.class.js +2 -2
  114. package/dist/components/forms/date-picker/calendar-core.d.ts +1 -1
  115. package/dist/components/forms/date-picker/calendar-core.js +1 -1
  116. package/dist/components/forms/date-picker/date-input.class.d.ts +20 -10
  117. package/dist/components/forms/date-picker/date-input.class.js +4 -4
  118. package/dist/components/forms/date-picker/date-picker.class.d.ts +24 -13
  119. package/dist/components/forms/date-picker/date-picker.class.js +7 -7
  120. package/dist/components/forms/date-picker/date-picker.styles.js +1 -1
  121. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +11 -3
  122. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -3
  123. package/dist/components/forms/emoji-picker/emoji-types.d.ts +2 -2
  124. package/dist/components/forms/icon-button/icon-button.class.d.ts +4 -2
  125. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  126. package/dist/components/forms/input/input.class.d.ts +5 -1
  127. package/dist/components/forms/input/input.class.js +1 -1
  128. package/dist/components/forms/input/native-time-input.class.d.ts +3 -0
  129. package/dist/components/forms/input/number-input.class.d.ts +3 -0
  130. package/dist/components/forms/input/time-input.class.d.ts +3 -0
  131. package/dist/components/forms/input/time-input.class.js +1 -1
  132. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +5 -1
  133. package/dist/components/forms/locale-picker/locale-picker.class.js +2 -2
  134. package/dist/components/forms/otp-input/otp-input.class.d.ts +5 -1
  135. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  136. package/dist/components/forms/phone-input/phone-input.class.d.ts +21 -8
  137. package/dist/components/forms/phone-input/phone-input.class.js +1 -1
  138. package/dist/components/forms/radio/radio-button.class.d.ts +4 -0
  139. package/dist/components/forms/radio/radio-group.class.d.ts +4 -1
  140. package/dist/components/forms/radio/radio-group.class.js +1 -1
  141. package/dist/components/forms/radio/radio.class.d.ts +6 -2
  142. package/dist/components/forms/radio/radio.class.js +1 -1
  143. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +7 -1
  144. package/dist/components/forms/rubric-form/rubric-form.class.js +3 -3
  145. package/dist/components/forms/select/select.class.d.ts +8 -2
  146. package/dist/components/forms/select/select.class.js +2 -2
  147. package/dist/components/forms/slider/slider.class.d.ts +12 -6
  148. package/dist/components/forms/slider/slider.class.js +2 -2
  149. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +4 -0
  150. package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
  151. package/dist/components/forms/switch/switch.class.d.ts +5 -1
  152. package/dist/components/forms/switch/switch.class.js +1 -1
  153. package/dist/components/forms/textarea/textarea.class.d.ts +3 -0
  154. package/dist/components/forms/textarea/textarea.class.js +1 -1
  155. package/dist/components/forms/time-range/time-range.class.d.ts +3 -0
  156. package/dist/components/forms/time-range/time-range.class.js +1 -1
  157. package/dist/components/forms/token-input/token-input.class.d.ts +8 -2
  158. package/dist/components/forms/token-input/token-input.class.js +2 -2
  159. package/dist/components/forms/token-input/token-input.styles.js +1 -1
  160. package/dist/components/layout/app-rail/app-rail.class.d.ts +3 -1
  161. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  162. package/dist/components/layout/carousel/carousel.class.d.ts +3 -2
  163. package/dist/components/layout/carousel/carousel.class.js +1 -1
  164. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  165. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +2 -0
  166. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  167. package/dist/components/layout/details/details.class.d.ts +3 -3
  168. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +3 -1
  169. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  170. package/dist/components/layout/menu/menu-label.class.d.ts +3 -3
  171. package/dist/components/layout/menu/menu.class.d.ts +4 -1
  172. package/dist/components/layout/menu/menu.class.js +1 -1
  173. package/dist/components/layout/multi-split/multi-split.class.d.ts +9 -3
  174. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  175. package/dist/components/layout/multi-split/multi-split.styles.js +1 -1
  176. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -1
  177. package/dist/components/layout/reorder-list/reorder-item.class.js +1 -1
  178. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  179. package/dist/components/layout/reorder-list/reorder-owner.js +1 -1
  180. package/dist/components/layout/split-panel/split-panel.class.d.ts +2 -1
  181. package/dist/components/layout/split-panel/split-panel.class.js +1 -1
  182. package/dist/components/layout/tab-group/tab-group.class.d.ts +3 -1
  183. package/dist/components/layout/tab-group/tab-group.class.js +1 -1
  184. package/dist/components/layout/widget/widget.class.d.ts +6 -2
  185. package/dist/components/layout/widget/widget.class.js +1 -1
  186. package/dist/components/media/animation/animation.class.d.ts +3 -2
  187. package/dist/components/media/animation/animation.class.js +1 -1
  188. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +4 -3
  189. package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
  190. package/dist/components/media/av-player/av-metadata.d.ts +3 -2
  191. package/dist/components/media/av-player/av-player.class.d.ts +4 -3
  192. package/dist/components/media/av-player/av-player.class.js +3 -3
  193. package/dist/components/media/av-player/av-player.styles.js +1 -1
  194. package/dist/components/media/avatar/avatar.class.d.ts +2 -1
  195. package/dist/components/media/avatar/avatar.class.js +1 -1
  196. package/dist/components/media/file-input/file-input.class.d.ts +4 -2
  197. package/dist/components/media/file-input/file-input.class.js +1 -1
  198. package/dist/components/media/file-input/file-input.styles.js +1 -1
  199. package/dist/components/media/image-viewer/image-viewer.class.d.ts +2 -1
  200. package/dist/components/media/image-viewer/image-viewer.class.js +1 -1
  201. package/dist/components/media/image-viewer/image-viewer.styles.js +1 -1
  202. package/dist/components/media/map/map.class.d.ts +5 -3
  203. package/dist/components/media/map/map.class.js +1 -1
  204. package/dist/components/media/map/map.styles.js +1 -1
  205. package/dist/components/media/media-card/media-card.class.d.ts +1 -1
  206. package/dist/components/media/media-card/media-card.class.js +1 -1
  207. package/dist/components/media/pan-zoom/pan-zoom.class.js +1 -1
  208. package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +1 -1
  209. package/dist/components/media/sequence-playback/sequence-playback.styles.js +1 -1
  210. package/dist/components/media/video/video.class.d.ts +2 -1
  211. package/dist/components/media/video/video.styles.js +1 -1
  212. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -2
  213. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
  214. package/dist/components/overlays/chip/chip-group.class.d.ts +2 -0
  215. package/dist/components/overlays/chip/chip-group.class.js +1 -1
  216. package/dist/components/overlays/dialog/dialog.class.d.ts +2 -0
  217. package/dist/components/overlays/dialog/dialog.class.js +1 -1
  218. package/dist/components/overlays/empty/empty.class.d.ts +2 -0
  219. package/dist/components/overlays/empty/empty.class.js +1 -1
  220. package/dist/components/overlays/kbd/kbd.class.d.ts +2 -0
  221. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  222. package/dist/components/overlays/overlay/popover.class.d.ts +3 -1
  223. package/dist/components/overlays/overlay/popover.class.js +1 -1
  224. package/dist/components/overlays/overlay/tooltip.class.d.ts +3 -1
  225. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  226. package/dist/components/overlays/rating/rating.class.d.ts +2 -0
  227. package/dist/components/overlays/rating/rating.class.js +1 -1
  228. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +2 -2
  229. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +5 -2
  230. package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
  231. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +4 -2
  232. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  233. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  234. package/dist/components/retrieval/graph/graph.class.d.ts +9 -7
  235. package/dist/components/retrieval/graph/graph.class.js +1 -1
  236. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +1 -3
  237. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +2 -0
  238. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +1 -1
  239. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +3 -2
  240. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +7 -3
  241. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +2 -1
  242. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js +1 -1
  243. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +2 -1
  244. package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
  245. package/dist/components/utility/format/format-number.class.d.ts +3 -1
  246. package/dist/components/utility/format/format-options.js +1 -1
  247. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +3 -2
  248. package/dist/components/utility/json-viewer/json-viewer.class.js +2 -2
  249. package/dist/components/utility/known-date/known-date.class.d.ts +9 -5
  250. package/dist/components/utility/known-date/known-date.class.js +2 -2
  251. package/dist/components/utility/known-date/known-date.styles.js +1 -1
  252. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +3 -1
  253. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  254. package/dist/components/utility/poll-status/poll-status.class.d.ts +3 -0
  255. package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
  256. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +1 -0
  257. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +1 -1
  258. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +2 -1
  259. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +1 -1
  260. package/dist/components/viewers/document-preview/document-preview.class.d.ts +4 -2
  261. package/dist/components/viewers/document-preview/document-preview.class.js +1 -1
  262. package/dist/components/viewers/document-preview/document-preview.styles.js +1 -1
  263. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +3 -2
  264. package/dist/components/viewers/document-viewer/document-viewer.class.js +2 -2
  265. package/dist/components/viewers/document-viewer/registry-ownership.d.ts +1 -0
  266. package/dist/components/viewers/document-viewer/registry-ownership.js +1 -0
  267. package/dist/components/viewers/document-viewer/registry.js +1 -1
  268. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +7 -1
  269. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  270. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +2 -1
  271. package/dist/components/viewers/email-viewer/email-viewer.class.js +2 -2
  272. package/dist/components/viewers/include/include-resource.js +1 -1
  273. package/dist/components/viewers/include/include.class.d.ts +3 -1
  274. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +4 -2
  275. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +4 -4
  276. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +1 -1
  277. package/dist/components/viewers/passive-markup.js +1 -1
  278. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +2 -1
  279. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +1 -1
  280. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +2 -1
  281. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +1 -1
  282. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  283. package/dist/custom-elements-jsx.d.ts +1 -1
  284. package/dist/internal/aria-reflection.js +1 -1
  285. package/dist/internal/catalog-picker.js +1 -1
  286. package/dist/internal/default-strings.generated.d.ts +1 -1
  287. package/dist/internal/default-strings.generated.js +1 -1
  288. package/dist/internal/dev-mode-attribute-warning.d.ts +3 -0
  289. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  290. package/dist/internal/form-associated.js +1 -1
  291. package/dist/internal/localization-types.d.ts +1 -1
  292. package/dist/internal/localization.js +1 -1
  293. package/dist/internal/lyra-element.js +1 -1
  294. package/dist/internal/native-control-description.d.ts +7 -0
  295. package/dist/internal/native-control-description.js +1 -0
  296. package/dist/internal/option-selection.js +1 -1
  297. package/dist/internal/overlay-order.d.ts +6 -0
  298. package/dist/internal/overlay-order.js +1 -0
  299. package/dist/internal/overlay-stack.d.ts +1 -1
  300. package/dist/internal/overlay-stack.js +1 -1
  301. package/dist/internal/package-metadata.d.ts +1 -1
  302. package/dist/internal/package-metadata.js +1 -1
  303. package/dist/internal/positioner.d.ts +5 -4
  304. package/dist/internal/reactive-property-writes.d.ts +1 -0
  305. package/dist/internal/reactive-property-writes.js +1 -0
  306. package/dist/internal/svg-title.d.ts +3 -0
  307. package/dist/internal/svg-title.js +1 -0
  308. package/dist/svelte.d.ts +1 -1
  309. package/dist/translations/ar.js +1 -1
  310. package/dist/translations/de.js +1 -1
  311. package/dist/translations/es.js +1 -1
  312. package/dist/translations/fa.js +1 -1
  313. package/dist/translations/fr.js +1 -1
  314. package/dist/translations/he.js +1 -1
  315. package/dist/translations/ja.js +1 -1
  316. package/dist/translations/pt-BR.js +1 -1
  317. package/dist/translations/ru.js +1 -1
  318. package/dist/translations/zh-CN.js +1 -1
  319. package/dist/vue.d.ts +1 -1
  320. package/llms/components/lr-accordion-item.md +4 -0
  321. package/llms/components/lr-accordion.md +4 -0
  322. package/llms/components/lr-agent-trace.md +3 -0
  323. package/llms/components/lr-animation.md +4 -0
  324. package/llms/components/lr-app-rail-item.md +4 -2
  325. package/llms/components/lr-app-rail.md +4 -2
  326. package/llms/components/lr-attachment-chip.md +6 -0
  327. package/llms/components/lr-av-player.md +14 -0
  328. package/llms/components/lr-avatar.md +4 -0
  329. package/llms/components/lr-box-plot.md +6 -0
  330. package/llms/components/lr-button.md +11 -3
  331. package/llms/components/lr-calendar-viewer.md +4 -0
  332. package/llms/components/lr-calendar.md +5 -0
  333. package/llms/components/lr-carousel.md +5 -0
  334. package/llms/components/lr-chart.md +13 -4
  335. package/llms/components/lr-chat-message.md +4 -0
  336. package/llms/components/lr-checkbox.md +3 -0
  337. package/llms/components/lr-chip-group.md +3 -0
  338. package/llms/components/lr-chip.md +3 -0
  339. package/llms/components/lr-code-block-core.md +16 -4
  340. package/llms/components/lr-code-block.md +7 -0
  341. package/llms/components/lr-code-editor.md +18 -5
  342. package/llms/components/lr-color-picker.md +9 -0
  343. package/llms/components/lr-combobox.md +35 -4
  344. package/llms/components/lr-command-palette.md +4 -0
  345. package/llms/components/lr-commit-card.md +3 -0
  346. package/llms/components/lr-compare-panel.md +7 -0
  347. package/llms/components/lr-condition-builder.md +5 -0
  348. package/llms/components/lr-conversation-item.md +3 -0
  349. package/llms/components/lr-copy-button.md +6 -0
  350. package/llms/components/lr-dashboard-grid.md +5 -0
  351. package/llms/components/lr-data-grid.md +11 -1
  352. package/llms/components/lr-dataset-viewer.md +3 -2
  353. package/llms/components/lr-date-input.md +46 -6
  354. package/llms/components/lr-date-picker.md +46 -6
  355. package/llms/components/lr-details.md +4 -0
  356. package/llms/components/lr-dialog.md +4 -0
  357. package/llms/components/lr-document-library.md +4 -0
  358. package/llms/components/lr-document-preview.md +7 -1
  359. package/llms/components/lr-document-viewer.md +9 -3
  360. package/llms/components/lr-dropdown-item.md +4 -0
  361. package/llms/components/lr-dropdown.md +3 -0
  362. package/llms/components/lr-ebook-viewer.md +4 -0
  363. package/llms/components/lr-email-viewer.md +5 -0
  364. package/llms/components/lr-emoji-picker.md +17 -3
  365. package/llms/components/lr-empty.md +3 -0
  366. package/llms/components/lr-entity-card.md +3 -0
  367. package/llms/components/lr-entity-chip.md +4 -0
  368. package/llms/components/lr-file-input.md +7 -0
  369. package/llms/components/lr-file-tree.md +5 -1
  370. package/llms/components/lr-filter-bar.md +5 -0
  371. package/llms/components/lr-flow-canvas.md +8 -1
  372. package/llms/components/lr-flow-node.md +2 -1
  373. package/llms/components/lr-flow-run-status.md +1 -1
  374. package/llms/components/lr-format-number.md +4 -0
  375. package/llms/components/lr-funnel.md +4 -0
  376. package/llms/components/lr-gauge.md +4 -0
  377. package/llms/components/lr-generation-metrics.md +5 -0
  378. package/llms/components/lr-graph-query-builder.md +6 -0
  379. package/llms/components/lr-graph.md +8 -2
  380. package/llms/components/lr-heatmap.md +13 -0
  381. package/llms/components/lr-icon-button.md +7 -0
  382. package/llms/components/lr-image-viewer.md +9 -0
  383. package/llms/components/lr-include.md +5 -0
  384. package/llms/components/lr-ingestion-queue.md +4 -0
  385. package/llms/components/lr-input.md +22 -8
  386. package/llms/components/lr-json-viewer.md +4 -0
  387. package/llms/components/lr-kbd.md +3 -0
  388. package/llms/components/lr-knowledge-graph-explorer.md +7 -0
  389. package/llms/components/lr-known-date.md +7 -0
  390. package/llms/components/lr-lite-chart.md +21 -4
  391. package/llms/components/lr-live-region.md +3 -0
  392. package/llms/components/lr-locale-picker.md +6 -0
  393. package/llms/components/lr-map.md +8 -0
  394. package/llms/components/lr-markdown-core.md +4 -0
  395. package/llms/components/lr-markdown.md +8 -4
  396. package/llms/components/lr-media-card.md +5 -2
  397. package/llms/components/lr-mention-popover.md +5 -0
  398. package/llms/components/lr-menu-item.md +4 -0
  399. package/llms/components/lr-menu-label.md +4 -3
  400. package/llms/components/lr-menu.md +4 -0
  401. package/llms/components/lr-message-actions.md +3 -0
  402. package/llms/components/lr-message-feedback.md +4 -0
  403. package/llms/components/lr-message-parts.md +3 -2
  404. package/llms/components/lr-model-select.md +8 -0
  405. package/llms/components/lr-multi-split.md +15 -6
  406. package/llms/components/lr-native-time-input.md +10 -0
  407. package/llms/components/lr-node-palette.md +3 -0
  408. package/llms/components/lr-notebook-viewer.md +4 -1
  409. package/llms/components/lr-number-input.md +12 -1
  410. package/llms/components/lr-option.md +35 -4
  411. package/llms/components/lr-otp-input.md +10 -0
  412. package/llms/components/lr-pan-zoom.md +1 -2
  413. package/llms/components/lr-phone-input.md +20 -5
  414. package/llms/components/lr-poll-status.md +4 -0
  415. package/llms/components/lr-popover.md +3 -0
  416. package/llms/components/lr-popup.md +3 -2
  417. package/llms/components/lr-prompt-studio.md +7 -0
  418. package/llms/components/lr-provenance-panel.md +3 -0
  419. package/llms/components/lr-push-to-talk.md +3 -0
  420. package/llms/components/lr-radio-button.md +13 -4
  421. package/llms/components/lr-radio-group.md +5 -0
  422. package/llms/components/lr-radio.md +9 -0
  423. package/llms/components/lr-rating.md +3 -0
  424. package/llms/components/lr-reorder-item.md +6 -0
  425. package/llms/components/lr-reorder-list.md +6 -0
  426. package/llms/components/lr-result-card.md +3 -0
  427. package/llms/components/lr-result-field.md +3 -0
  428. package/llms/components/lr-rubric-form.md +12 -0
  429. package/llms/components/lr-select.md +9 -0
  430. package/llms/components/lr-sequence-playback.md +4 -0
  431. package/llms/components/lr-slider.md +16 -4
  432. package/llms/components/lr-source-picker.md +4 -0
  433. package/llms/components/lr-span-waterfall.md +3 -0
  434. package/llms/components/lr-sparkline.md +4 -0
  435. package/llms/components/lr-split-panel.md +4 -0
  436. package/llms/components/lr-stack-trace.md +3 -0
  437. package/llms/components/lr-stat.md +10 -0
  438. package/llms/components/lr-subagent-panel.md +3 -2
  439. package/llms/components/lr-svg-viewer.md +3 -0
  440. package/llms/components/lr-swatch-picker.md +4 -0
  441. package/llms/components/lr-switch.md +6 -0
  442. package/llms/components/lr-tab-group.md +4 -0
  443. package/llms/components/lr-table.md +10 -2
  444. package/llms/components/lr-terminal.md +3 -0
  445. package/llms/components/lr-textarea.md +9 -0
  446. package/llms/components/lr-thread-list.md +6 -3
  447. package/llms/components/lr-time-input.md +3 -0
  448. package/llms/components/lr-time-range.md +5 -0
  449. package/llms/components/lr-timeline-item.md +6 -0
  450. package/llms/components/lr-timeline.md +6 -0
  451. package/llms/components/lr-token-input.md +14 -0
  452. package/llms/components/lr-tool-call-chip.md +5 -3
  453. package/llms/components/lr-tool-param-form.md +4 -0
  454. package/llms/components/lr-tool-result-dialog.md +4 -0
  455. package/llms/components/lr-tool-select-dialog.md +4 -0
  456. package/llms/components/lr-tooltip.md +6 -0
  457. package/llms/components/lr-trace-tree.md +3 -0
  458. package/llms/components/lr-transcript-feed.md +3 -0
  459. package/llms/components/lr-tree-item.md +12 -5
  460. package/llms/components/lr-tree.md +12 -5
  461. package/llms/components/lr-typing-indicator.md +3 -0
  462. package/llms/components/lr-usage-badge.md +4 -0
  463. package/llms/components/lr-video.md +8 -2
  464. package/llms/components/lr-virtual-list.md +5 -3
  465. package/llms/components/lr-voice-picker.md +8 -0
  466. package/llms/components/lr-widget-renderer.md +9 -0
  467. package/llms/components/lr-widget.md +4 -2
  468. package/llms/components/lr-word-cloud.md +4 -0
  469. package/llms/components/lr-xml-viewer.md +9 -2
  470. package/llms/components/lr-zoomable-frame.md +6 -3
  471. package/llms-full.txt +4080 -2711
  472. package/package.json +4 -4
  473. package/vscode-css-data.json +1 -1
  474. package/vscode-html-data.json +1 -1
  475. 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"lit";import{state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteInteger}from"../../../internal/numbers.js";import{DocumentAnchorTarget}from"../../../internal/anchor-target.js";import{buildQuoteAnchor,createTextQuoteIndex,scopeFromElement}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,getCachedHighlight,hitTestHighlightRanges,HIGHLIGHT_CACHE_MAX,internalLinkHrefFrom,markdownAnchorFromTarget,markdownHighlightConfigChanged,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,MarkdownOwnedAnimationFrameController,MarkdownParserController,normalizeMarkdownHtmlMode,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight}from"./markdown-shared.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound}from"../../../internal/default-strings.generated.js";const HIGHLIGHT_FAILURE_WARNING_KEY="lyra-markdown-highlight-failed",HIGHLIGHT_FAILURE_WARNING="<lr-markdown>/<lr-markdown-core>: Syntax highlighting could not complete. Code is rendered as plain text.";function keyboardHighlightIdFrom(ranges,event){const coordinateLess=event.clientX===0&&event.clientY===0&&event.screenX===0&&event.screenY===0;if(event.detail!==0&&!coordinateLess)return null;const anchor=event.composedPath().find(target=>markdownAnchorFromTarget(target)!==void 0);if(!anchor)return null;for(let index=ranges.length-1;index>=0;index--){const range=ranges[index];if(range)try{if(range.range.intersectsNode(anchor))return range.id}catch{}}return null}class LyraMarkdownRuntimeElement extends LyraElement{static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound}}}function createMarkdownVariantContext(tag,katexState){return{tag,connectedInstances:new Set,sharedParser:new MarkdownParserController,katexState}}class MarkdownRuntimeBase extends DocumentAnchorTarget(LyraMarkdownRuntimeElement){constructor(){super(),this.anchorKinds=["fragment","text-quote"],this.renderedHtml=null,this.isDarkTheme=!1,this.parser=new MarkdownParserController,this.headingTree=[],this.markdownTextScopeBuilds=0,this.resolvedHighlightRanges=[],this.mathFailureReported=!1,this.highlightCache=new Map,this.highlightToken=0,this.streamingRenderFrames=new MarkdownOwnedAnimationFrameController,this.failedHighlightKeys=new Set,this.inFlightHighlightKeys=new Set,this.handleKatexResolved=()=>{this.isConnected&&this.renderMarkdown()},this.onContentClick=event=>{const href=internalLinkHrefFrom(event,this.internalLinkPrefix);href!==null&&event.preventDefault();const highlightId=hitTestHighlightRanges(this.resolvedHighlightRanges,event.clientX,event.clientY)??keyboardHighlightIdFrom(this.resolvedHighlightRanges,event);highlightId&&this.emit("lr-highlight-activate",{highlightId}),href!==null&&this.emit("lr-link-click",{href})},new ThemeWatcher(this,()=>this.refreshTheme())}get marked(){return this.parser.get(this.deps?.marked)}refreshTheme(){this.isDarkTheme=resolveMarkdownDarkTheme(this)}connectedCallback(){super.connectedCallback(),this.markdownVariant.connectedInstances.add(this),this.refreshTheme(),beginMarkdownDepsLoad(this,resolved=>{this.deps=resolved,this.renderMarkdown(),this.requestUpdate()})}disconnectedCallback(){this.markdownVariant.connectedInstances.delete(this),super.disconnectedCallback(),this.highlightToken++,this.cancelStreamingRender(),this.highlightHandle?.release(),this.highlightHandle=void 0,this.textQuoteIndexCache=void 0}adoptedCallback(){super.adoptedCallback(),this.cancelStreamingRender()}firstUpdated(changed){super.firstUpdated(changed);const contentRoot=this.renderRoot.querySelector('[part="content"]');contentRoot&&this.bindTextSelection(contentRoot)}willUpdate(changed){if(super.willUpdate(changed),changed.has("math")&&(this.mathFailureReported=!1),!this.deps||!markdownNeedsReparse(changed))return;if((changed.has("content")||changed.has("streaming")||markdownHighlightConfigChanged(changed))&&this.highlightToken++,markdownHighlightConfigChanged(changed)&&(this.failedHighlightKeys.clear(),markdownLanguageSetChanged(changed)&&this.highlightCache.clear()),this.streaming){this.scheduleStreamingRender();return}this.cancelStreamingRender(),this.renderMarkdown()}cancelStreamingRender(){const handle=this.streamingRenderRaf;this.streamingRenderRaf=void 0,!this.streamingRenderFrames.cancel()&&handle!==void 0&&this.ownerDocument.defaultView?.cancelAnimationFrame(handle)}scheduleStreamingRender(){if(this.streamingRenderRaf!==void 0)return;const view=this.ownerDocument.defaultView;if(!view){this.isConnected&&this.renderMarkdown();return}const handle=this.streamingRenderFrames.request(view,()=>{this.streamingRenderRaf=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.renderMarkdown()});handle===void 0?this.isConnected&&this.renderMarkdown():this.streamingRenderFrames.handle===handle&&(this.streamingRenderRaf=handle)}async getUpdateComplete(){const complete=await super.getUpdateComplete(),settled=this.streamingRenderFrames.settled;return settled?(await settled,super.getUpdateComplete()):complete}updated(changed){super.updated(changed),applyMarkdownAriaBusy(this,!this.deps||this.streaming);const locale=this.effectiveLocale,localeChanged=this.textQuoteLocale!==void 0&&this.textQuoteLocale!==locale;this.textQuoteLocale=locale,localeChanged&&(this.textQuoteIndexCache=void 0),changed.has("renderedHtml")&&(this.textQuoteIndexCache=void 0),(changed.has("renderedHtml")||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights()}renderMarkdown(){if(this.streaming){this.renderedHtml=null,this.headingTree=[];return}const deps=this.deps;if(!deps)return;const variant=this.markdownVariant,outcome=renderMarkdownDocument({tag:variant.tag,deps,htmlMode:normalizeMarkdownHtmlMode(this.htmlMode),math:this.math,parse:(marked,pendingKeys,headingTreeOut)=>this.parseMarkdown(marked,pendingKeys,headingTreeOut),onParsed:()=>this.maybeLoadKatex(),isKatexConfirmedMissing:()=>variant.katexState.isConfirmedMissing()});if(outcome.headingTree&&(this.headingTree=outcome.headingTree),outcome.status==="fallback"){this.renderedHtml=null,this.emit("lr-render-error",{error:outcome.error});return}this.renderedHtml=outcome.html,outcome.mathFailed&&this.reportMathFailure(),outcome.pendingKeys.length>0&&this.highlightCode&&!this.streaming&&this.highlightPending(outcome.pendingKeys)}maybeLoadKatex(){this.math&&this.markdownVariant.katexState.startLoad(this.handleKatexResolved)}reportMathFailure(){this.mathFailureReported||(this.mathFailureReported=!0,this.emit("lr-render-error",{error:markdownMathPeerError(this.markdownVariant.tag)}))}getCachedHighlight(key){return getCachedHighlight(this.highlightCache,key)}setCachedHighlight(key,html){return setCachedHighlight(this.highlightCache,key,html,HIGHLIGHT_CACHE_MAX)}async highlightPending(pendingKeys){const work=pendingKeys.filter(({key})=>!this.inFlightHighlightKeys.has(key));if(work.length===0)return;for(const{key}of work)this.inFlightHighlightKeys.add(key);const token=this.highlightToken,languages=this.languages,isCurrent=()=>token===this.highlightToken&&this.isConnected,tokenizeOne=async pending=>{const html=await this.tokenizePendingHighlight(pending,languages,isCurrent);!isCurrent()||html===void 0||(html===null||!this.setCachedHighlight(pending.key,html))&&addFailedHighlightKey(this.failedHighlightKeys,pending.key)};try{await processPendingHighlights(work,tokenizeOne)}catch{devWarnOnce(HIGHLIGHT_FAILURE_WARNING_KEY,HIGHLIGHT_FAILURE_WARNING)}finally{for(const{key}of work)this.inFlightHighlightKeys.delete(key)}this.isConnected&&this.renderMarkdown()}parseMarkdown(marked,pendingKeys,headingTreeOut){const variant=this.markdownVariant;return parseMarkdownDocument({marked,content:normalizeMarkdownLeadingTabs(this.content,finiteInteger(this.tabSize,4,1,32)),markedConfigurations:[variant.sharedParser.get(marked)?.defaults,this.marked?.defaults],gfm:this.gfm,linkTarget:this.linkTarget,headingOffset:finiteInteger(this.headingOffset,0,0,6),escapeHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="escape",trustedHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="trusted",highlightCodeOption:this.highlightCode&&!this.streaming,getCachedHighlight:key=>this.getCachedHighlight(key),failedHighlightKeys:this.failedHighlightKeys,headingAnchorsOption:this.headingAnchors,mathOption:this.math,cachedKatex:this.math?variant.katexState.getIfLoaded():null,pendingKeys,headingTreeOut})}getHeadingTree(){return[...this.headingTree]}contentRoot(){return this.renderRoot.querySelector('[part="content"]')}async applyAnchor(anchor){const root=this.contentRoot();if(!root)return!1;if(anchor.kind==="fragment")return applyMarkdownFragmentAnchor(root,anchor,this.headingTree);if(anchor.kind==="text-quote"){const index=this.markdownTextIndex(root),found=applyMarkdownTextQuoteAnchor(root,anchor,this.effectiveLocale,index);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.repaintHighlights(),found}return!1}computeSelectionAnchor(range){const root=this.contentRoot();if(!root)return null;const anchor=buildQuoteAnchor(range,this.markdownTextIndex(root).scope);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.scheduleAfterUpdate(()=>this.repaintHighlights()),anchor}ensureHighlightHandle(){return this.highlightHandle??=acquireHighlightHandle(this,this.ownerDocument),this.highlightHandle}markdownTextIndex(root){const locale=this.effectiveLocale,cached=this.textQuoteIndexCache;if(cached?.root===root&&cached.locale===locale&&!cached.mappingDirty)return cached.index;if(cached?.mappingDirty){const handle=this.ensureHighlightHandle();for(const tone of["accent","success","warning","danger","neutral"])handle.setRanges(tone,[]);handle.setActive(null)}const scope=scopeFromElement(root);if(this.markdownTextScopeBuilds++,cached?.root===root&&cached.locale===locale&&cached.index.rebindScope(scope))return cached.mappingDirty=!1,cached.index;const index=createTextQuoteIndex(scope,locale);return this.textQuoteIndexCache={root,locale,index,mappingDirty:!1},index}markdownTextScopeBuildCount(){return this.markdownTextScopeBuilds}markdownTextQuoteScanCount(){return this.textQuoteIndexCache?.index.scanCount??0}repaintHighlights(){this.resolvedHighlightRanges=[];const root=this.contentRoot();if(!root)return;const index=this.markdownTextIndex(root);this.resolvedHighlightRanges=repaintMarkdownHighlights({locale:this.effectiveLocale,root,handle:this.ensureHighlightHandle(),highlights:this.highlights,activeHighlightId:this.activeHighlightId,index}),!supportsCustomHighlights(this.ownerDocument)&&this.textQuoteIndexCache&&(this.textQuoteIndexCache.mappingDirty=!0)}render(){return renderMarkdownContent({content:this.content,sanitized:normalizeMarkdownHtmlMode(this.htmlMode)==="sanitize",renderedHtml:this.renderedHtml,hostAriaLabel:this.getAttribute("aria-label"),isDarkTheme:this.isDarkTheme,onClick:this.onContentClick,liveRegion:this.renderAnchorLiveRegion()})}}__decorate([state()],MarkdownRuntimeBase.prototype,"renderedHtml",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"isDarkTheme",void 0);export{MarkdownRuntimeBase,createMarkdownVariantContext};
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import"lit";import{state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteInteger}from"../../../internal/numbers.js";import{DocumentAnchorTarget}from"../../../internal/anchor-target.js";import{buildQuoteAnchor,createTextQuoteIndex,scopeFromElement}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{addFailedHighlightKey,applyMarkdownAriaBusy,applyMarkdownFragmentAnchor,applyMarkdownTextQuoteAnchor,beginMarkdownDepsLoad,getCachedHighlight,hitTestHighlightRanges,HIGHLIGHT_CACHE_MAX,internalLinkHrefFrom,markdownAnchorFromTarget,markdownHighlightConfigChanged,markdownLanguageSetChanged,markdownMathPeerError,markdownNeedsReparse,MarkdownOwnedAnimationFrameController,MarkdownParserController,normalizeMarkdownHtmlMode,normalizeMarkdownLeadingTabs,parseMarkdownDocument,processPendingHighlights,renderMarkdownContent,renderMarkdownDocument,repaintMarkdownHighlights,resolveMarkdownDarkTheme,setCachedHighlight}from"./markdown-shared.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound}from"../../../internal/default-strings.generated.js";const HIGHLIGHT_FAILURE_WARNING_KEY="lyra-markdown-highlight-failed",HIGHLIGHT_FAILURE_WARNING="<lr-markdown>/<lr-markdown-core>: Syntax highlighting could not complete. Code is rendered as plain text.";function keyboardHighlightIdFrom(ranges,event){const coordinateLess=event.clientX===0&&event.clientY===0&&event.screenX===0&&event.screenY===0;if(event.detail!==0&&!coordinateLess)return null;const anchor=event.composedPath().find(target=>markdownAnchorFromTarget(target)!==void 0);if(!anchor)return null;for(let index=ranges.length-1;index>=0;index--){const range=ranges[index];if(range)try{if(range.range.intersectsNode(anchor))return range.id}catch{}}return null}class LyraMarkdownRuntimeElement extends LyraElement{static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound}}}function createMarkdownVariantContext(tag,katexState){return{tag,connectedInstances:new Set,sharedParser:new MarkdownParserController,katexState}}class MarkdownRuntimeBase extends DocumentAnchorTarget(LyraMarkdownRuntimeElement){constructor(){super(),this.anchorKinds=["fragment","text-quote"],this.renderedHtml=null,this.isDarkTheme=!1,this.parser=new MarkdownParserController,this.headingTree=[],this.markdownTextScopeBuilds=0,this.resolvedHighlightRanges=[],this.mathFailureReported=!1,this.highlightCache=new Map,this.highlightToken=0,this.streamingRenderFrames=new MarkdownOwnedAnimationFrameController,this.failedHighlightKeys=new Set,this.inFlightHighlightKeys=new Set,this.handleKatexResolved=()=>{this.isConnected&&this.renderMarkdown()},this.onContentClick=event=>{const href=internalLinkHrefFrom(event,this.internalLinkPrefix);href!==null&&event.preventDefault();const highlightId=hitTestHighlightRanges(this.resolvedHighlightRanges,event.clientX,event.clientY)??keyboardHighlightIdFrom(this.resolvedHighlightRanges,event);highlightId&&this.emit("lr-highlight-activate",{highlightId}),href!==null&&this.emit("lr-link-click",{href})},new ThemeWatcher(this,()=>this.refreshTheme())}get marked(){return this.parser.get(this.deps?.marked)}refreshTheme(){this.isDarkTheme=resolveMarkdownDarkTheme(this)}connectedCallback(){super.connectedCallback(),this.markdownVariant.connectedInstances.add(this),this.refreshTheme(),beginMarkdownDepsLoad(this,resolved=>{this.deps=resolved,this.renderMarkdown(),this.requestUpdate()})}disconnectedCallback(){this.markdownVariant.connectedInstances.delete(this),super.disconnectedCallback(),this.highlightToken++,this.cancelStreamingRender(),this.highlightHandle?.release(),this.highlightHandle=void 0,this.textQuoteIndexCache=void 0}adoptedCallback(){super.adoptedCallback(),this.cancelStreamingRender()}firstUpdated(changed){super.firstUpdated(changed);const contentRoot=this.renderRoot.querySelector('[part="content"]');contentRoot&&this.bindTextSelection(contentRoot)}willUpdate(changed){if(super.willUpdate(changed),changed.has("math")&&(this.mathFailureReported=!1),!this.deps||!markdownNeedsReparse(changed))return;if((changed.has("content")||changed.has("streaming")||markdownHighlightConfigChanged(changed))&&this.highlightToken++,markdownHighlightConfigChanged(changed)&&(this.failedHighlightKeys.clear(),markdownLanguageSetChanged(changed)&&this.highlightCache.clear()),this.streaming){this.scheduleStreamingRender();return}this.cancelStreamingRender(),this.renderMarkdown()}cancelStreamingRender(){const handle=this.streamingRenderRaf;this.streamingRenderRaf=void 0,!this.streamingRenderFrames.cancel()&&handle!==void 0&&this.ownerDocument.defaultView?.cancelAnimationFrame(handle)}scheduleStreamingRender(){if(this.streamingRenderRaf!==void 0)return;const view=this.ownerDocument.defaultView;if(!view){this.isConnected&&this.renderMarkdown();return}const handle=this.streamingRenderFrames.request(view,()=>{this.streamingRenderRaf=void 0,this.isConnected&&this.ownerDocument.defaultView===view&&this.renderMarkdown()});handle===void 0?this.isConnected&&this.renderMarkdown():this.streamingRenderFrames.handle===handle&&(this.streamingRenderRaf=handle)}async getUpdateComplete(){const complete=await super.getUpdateComplete(),settled=this.streamingRenderFrames.settled;return settled?(await settled,super.getUpdateComplete()):complete}updated(changed){super.updated(changed),applyMarkdownAriaBusy(this,!this.deps||this.streaming);const locale=this.effectiveLocale,localeChanged=this.textQuoteLocale!==void 0&&this.textQuoteLocale!==locale;this.textQuoteLocale=locale,localeChanged&&(this.textQuoteIndexCache=void 0),changed.has("renderedHtml")&&(this.textQuoteIndexCache=void 0),(changed.has("renderedHtml")||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights()}renderMarkdown(){if(this.streaming){this.renderedHtml=null,this.headingTree=[];return}const deps=this.deps;if(!deps)return;const variant=this.markdownVariant,outcome=renderMarkdownDocument({tag:variant.tag,deps,htmlMode:normalizeMarkdownHtmlMode(this.htmlMode),math:this.math,parse:(marked,pendingKeys,headingTreeOut)=>this.parseMarkdown(marked,pendingKeys,headingTreeOut),onParsed:()=>this.maybeLoadKatex(),isKatexConfirmedMissing:()=>variant.katexState.isConfirmedMissing()});if(outcome.headingTree&&(this.headingTree=outcome.headingTree),outcome.status==="fallback"){this.renderedHtml=null,this.emit("lr-render-error",{error:outcome.error});return}this.renderedHtml=outcome.html,outcome.mathFailed&&this.reportMathFailure(),outcome.pendingKeys.length>0&&this.highlightCode&&!this.streaming&&this.highlightPending(outcome.pendingKeys)}maybeLoadKatex(){this.math&&this.markdownVariant.katexState.startLoad(this.handleKatexResolved)}reportMathFailure(){this.mathFailureReported||(this.mathFailureReported=!0,this.emit("lr-render-error",{error:markdownMathPeerError(this.markdownVariant.tag)}))}getCachedHighlight(key){return getCachedHighlight(this.highlightCache,key)}setCachedHighlight(key,html){return setCachedHighlight(this.highlightCache,key,html,HIGHLIGHT_CACHE_MAX)}async highlightPending(pendingKeys){const work=pendingKeys.filter(({key})=>!this.inFlightHighlightKeys.has(key));if(work.length===0)return;for(const{key}of work)this.inFlightHighlightKeys.add(key);const token=this.highlightToken,languages=this.languages,isCurrent=()=>token===this.highlightToken&&this.isConnected,tokenizeOne=async pending=>{const html=await this.tokenizePendingHighlight(pending,languages,isCurrent);!isCurrent()||html===void 0||(html===null||!this.setCachedHighlight(pending.key,html))&&addFailedHighlightKey(this.failedHighlightKeys,pending.key)};try{await processPendingHighlights(work,tokenizeOne)}catch{devWarnOnce(HIGHLIGHT_FAILURE_WARNING_KEY,HIGHLIGHT_FAILURE_WARNING)}finally{for(const{key}of work)this.inFlightHighlightKeys.delete(key)}this.isConnected&&this.renderMarkdown()}parseMarkdown(marked,pendingKeys,headingTreeOut){const variant=this.markdownVariant;return parseMarkdownDocument({marked,content:normalizeMarkdownLeadingTabs(this.content??"",finiteInteger(this.tabSize,4,1,32)),markedConfigurations:[variant.sharedParser.get(marked)?.defaults,this.marked?.defaults],gfm:this.gfm,linkTarget:this.linkTarget,headingOffset:finiteInteger(this.headingOffset,0,0,6),escapeHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="escape",trustedHtmlOption:normalizeMarkdownHtmlMode(this.htmlMode)==="trusted",highlightCodeOption:this.highlightCode&&!this.streaming,getCachedHighlight:key=>this.getCachedHighlight(key),failedHighlightKeys:this.failedHighlightKeys,headingAnchorsOption:this.headingAnchors,mathOption:this.math,cachedKatex:this.math?variant.katexState.getIfLoaded():null,pendingKeys,headingTreeOut})}getHeadingTree(){return[...this.headingTree]}contentRoot(){return this.renderRoot.querySelector('[part="content"]')}async applyAnchor(anchor){const root=this.contentRoot();if(!root)return!1;if(anchor.kind==="fragment")return applyMarkdownFragmentAnchor(root,anchor,this.headingTree);if(anchor.kind==="text-quote"){const index=this.markdownTextIndex(root),found=applyMarkdownTextQuoteAnchor(root,anchor,this.effectiveLocale,index);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.repaintHighlights(),found}return!1}computeSelectionAnchor(range){const root=this.contentRoot();if(!root)return null;const anchor=buildQuoteAnchor(range,this.markdownTextIndex(root).scope);return!supportsCustomHighlights(this.ownerDocument)&&this.highlights.length>0&&this.scheduleAfterUpdate(()=>this.repaintHighlights()),anchor}ensureHighlightHandle(){return this.highlightHandle??=acquireHighlightHandle(this,this.ownerDocument),this.highlightHandle}markdownTextIndex(root){const locale=this.effectiveLocale,cached=this.textQuoteIndexCache;if(cached?.root===root&&cached.locale===locale&&!cached.mappingDirty)return cached.index;if(cached?.mappingDirty){const handle=this.ensureHighlightHandle();for(const tone of["accent","success","warning","danger","neutral"])handle.setRanges(tone,[]);handle.setActive(null)}const scope=scopeFromElement(root);if(this.markdownTextScopeBuilds++,cached?.root===root&&cached.locale===locale&&cached.index.rebindScope(scope))return cached.mappingDirty=!1,cached.index;const index=createTextQuoteIndex(scope,locale);return this.textQuoteIndexCache={root,locale,index,mappingDirty:!1},index}markdownTextScopeBuildCount(){return this.markdownTextScopeBuilds}markdownTextQuoteScanCount(){return this.textQuoteIndexCache?.index.scanCount??0}repaintHighlights(){this.resolvedHighlightRanges=[];const root=this.contentRoot();if(!root)return;const index=this.markdownTextIndex(root);this.resolvedHighlightRanges=repaintMarkdownHighlights({locale:this.effectiveLocale,root,handle:this.ensureHighlightHandle(),highlights:this.highlights,activeHighlightId:this.activeHighlightId,index}),!supportsCustomHighlights(this.ownerDocument)&&this.textQuoteIndexCache&&(this.textQuoteIndexCache.mappingDirty=!0)}render(){return renderMarkdownContent({content:this.content??"",sanitized:normalizeMarkdownHtmlMode(this.htmlMode)==="sanitize",renderedHtml:this.renderedHtml,hostAriaLabel:this.getAttribute("aria-label"),isDarkTheme:this.isDarkTheme,onClick:this.onContentClick,liveRegion:this.renderAnchorLiveRegion()})}}__decorate([state()],MarkdownRuntimeBase.prototype,"renderedHtml",void 0),__decorate([state()],MarkdownRuntimeBase.prototype,"isDarkTheme",void 0);export{MarkdownRuntimeBase,createMarkdownVariantContext};
@@ -145,7 +145,7 @@ export declare class LyraMarkdownCore extends MarkdownRuntimeBase{static styles:
145
145
  static getMarked():Marked;
146
146
  /** Re-renders every connected `<lr-markdown-core>` instance after shared parser changes. */
147
147
  static updateAll():void;
148
- /** The Markdown source to render. */
148
+ /** The Markdown source to render. Removing the attribute clears the document and its tab stop. */
149
149
  content:string;
150
150
  /** Tab-stop width used to expand tabs in leading indentation before parsing. Finite values are
151
151
  * truncated and clamped to `[1, 32]`; non-finite values fall back to `4`. This is separate from
@@ -136,7 +136,7 @@ export declare class LyraMarkdown extends MarkdownRuntimeBase{static styles:impo
136
136
  static getMarked():Marked;
137
137
  /** Re-renders every connected `<lr-markdown>` instance after shared parser configuration changes. */
138
138
  static updateAll():void;
139
- /** The Markdown source to render. */
139
+ /** The Markdown source to render. Removing the attribute clears the document and its tab stop. */
140
140
  content:string;
141
141
  /** Tab-stop width used when converting tabs in leading indentation to spaces before parsing.
142
142
  * Defaults to `4`; non-finite values fall back to that default and finite values are truncated
@@ -24,6 +24,8 @@ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';impo
24
24
  * events, so each built-in can occur at most once. Provider action ids must be nonblank and unique
25
25
  * within that provider; invalid actions and later duplicates are omitted.
26
26
  *
27
+ * ArrowLeft/ArrowRight/Home/End from a slotted feedback comment editor remain native editing keys. Roving navigation still operates on the actual toolbar and thumb actions.
28
+ *
27
29
  * @customElement lr-message-actions
28
30
  * @slot - Additional controls (e.g. `lr-copy-button`, `lr-icon-button`, `lr-branch-picker`)
29
31
  * appended after the built-ins; they participate in the toolbar's arrow-key navigation.
@@ -9,7 +9,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
9
9
  <path d="M12 20h9"></path>
10
10
  <path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
11
11
  </svg>
12
- `}class LyraMessageActions extends LyraElement{constructor(){super(...arguments),this.controls=[],this.copyText="",this.feedbackRating=null,this.revealOnInteraction=!1,this.label="",this.accessibleLabel=null,this.activeStopIndex=0,this.revealed=!1,this.hoverTarget=null,this.stopSyncGeneration=0,this.managedStops=[],this.directActions=new WeakMap,this.nextDirectActionId=0,this.onHoverTargetEnter=()=>{this.revealed=!0},this.onHoverTargetLeave=()=>{this.matches(":focus-within")||(this.revealed=!1)},this.onFocusIn=event=>{this.revealed=!0;const stops=this.logicalActions(),path=event.composedPath(),index=stops.findIndex(({action})=>action.matchesEventPath(path));if(index>=0){this.setActiveStop(stops,index,stops[index]);const base=this.renderRoot.querySelector('[part="base"]'),repair=base?captureComposedFocusRepair(this,base):null,stop=stops[index];this.focusedStop=stop&&repair?{index,owner:stop.owner,id:stop.action.id,source:stop.source,repair}:void 0}else this.focusedStop=void 0},this.onFocusOut=event=>{this.hoverTarget?.matches(":hover")||(this.revealed=!1);const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedStop=void 0)},this.onStopMutations=records=>{this.reconcileStopsAfterChildren()},this.onSlotChange=()=>{const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()},this.onToolbarActionsChange=event=>{event.stopPropagation(),this.reconcileStopsAfterChildren()},this.containSlottedFeedbackEvent=event=>{event.stopPropagation()},this.onToolbarKeyDown=e=>{const stops=this.logicalActions();if(stops.length===0)return;const path=e.composedPath(),originIndex=stops.findIndex(({action})=>action.matchesEventPath(path)),currentIndex=originIndex>=0?originIndex:this.activeStopIndex,forwardKey=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backwardKey=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let target;if(e.key===forwardKey)target=(currentIndex+1)%stops.length;else if(e.key===backwardKey)target=(currentIndex-1+stops.length)%stops.length;else if(e.key==="Home")target=0;else if(e.key==="End")target=stops.length-1;else return;e.preventDefault(),this.setActiveStop(stops,target),stops[target]?.action.focus()},this.onRegenerateClick=()=>{this.emit("lr-regenerate",null)},this.onEditClick=()=>{this.emit("lr-edit",null)}}static{this.defaultStrings={...super.defaultStrings,editMessage:LYRA_DEFAULT_editMessage,fieldRequired:LYRA_DEFAULT_fieldRequired,messageActionsLabel:LYRA_DEFAULT_messageActionsLabel,regenerateResponse:LYRA_DEFAULT_regenerateResponse}}static{this.ownedCollectionProperties=Object.freeze(["controls"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get effectiveControls(){const seen=new Set,controls=[];for(const value of this.controls){if(typeof value!="string"||!MESSAGE_ACTION_CONTROLS.includes(value)||seen.has(value))continue;const control=value;seen.add(control),controls.push(control)}return controls}get feedbackPending(){return this.currentBuiltInFeedback()?.pending===!0}finalizePendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.finalizePendingSubmit(submissionId):!1}revertPendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.revertPendingSubmit(submissionId):!1}currentBuiltInFeedback(){const base=this.renderRoot.querySelector('[part="base"]'),feedback=base?.querySelector('lr-message-feedback[part~="feedback"]');return feedback&&feedback.parentElement===base&&feedback.getRootNode()===this.renderRoot&&feedback.isConnected?feedback:void 0}connectedCallback(){super.connectedCallback(),this.addEventListener("focusin",this.onFocusIn),this.addEventListener("focusout",this.onFocusOut),this.revealOnInteraction&&this.bindHoverTarget(),this.hasUpdated&&this.reconcileStopsAfterChildren()}disconnectedCallback(){this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops(),this.focusedStop=void 0,this.unbindHoverTarget(),this.removeEventListener("focusin",this.onFocusIn),this.removeEventListener("focusout",this.onFocusOut),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops()}willUpdate(changed){super.willUpdate(changed),changed.has("revealOnInteraction")&&(this.revealOnInteraction?this.bindHoverTarget():this.unbindHoverTarget())}firstUpdated(changed){super.firstUpdated(changed),this.setActiveStop(this.logicalActions(),0),this.reconcileStopsAfterChildren()}updated(changed){if(super.updated(changed),changed.has("controls")){const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()}changed.has("revealed")&&this.toggleAttribute("data-revealed",this.revealed)}bindHoverTarget(){this.unbindHoverTarget();const target=this.closest("lr-chat-message")??this.parentElement;target&&(this.hoverTarget=target,target.addEventListener("pointerenter",this.onHoverTargetEnter),target.addEventListener("pointerleave",this.onHoverTargetLeave))}unbindHoverTarget(){this.hoverTarget?.removeEventListener("pointerenter",this.onHoverTargetEnter),this.hoverTarget?.removeEventListener("pointerleave",this.onHoverTargetLeave),this.hoverTarget=null,this.revealed=!1}actionRoots(){const base=this.renderRoot.querySelector('[part="base"]');if(!base)return[];const direct=[...base.children].filter(element=>element.localName!=="slot"),slot=base.querySelector("slot");return[...direct,...slot?.assignedElements({flatten:!0})??[]]}sameAction(left,right){return left.owner===right.owner&&left.source===right.source&&left.action.id===right.action.id}isAvailable(action){try{return action.disabled!==!0}catch{return!1}}directActionFor(element){let action=this.directActions.get(element);if(action)return action;const target=element,id=`direct-${++this.nextDirectActionId}`;let leasedTarget,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const leased=leasedTarget;leased&&leased.getAttribute("tabindex")===lastManagedTabIndex&&(leasedAuthoredTabIndex===null?leased.removeAttribute("tabindex"):leased.setAttribute("tabindex",leasedAuthoredTabIndex)),leasedTarget=void 0,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return action={id,get disabled(){return!isComposedFocusAvailable(element)},focus(options){target.focus(options)},setTabIndex(tabIndex){if(leasedTarget!==target&&(releaseTabIndex(),leasedTarget=target,leasedAuthoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,hasAuthoredTabIndex(){return leasedTarget!==target?target.hasAttribute("tabindex"):lastManagedTabIndex!==null&&target.getAttribute("tabindex")===lastManagedTabIndex?leasedAuthoredTabIndex!==null:target.hasAttribute("tabindex")},matchesEventPath(path){return path.includes(element)}},this.directActions.set(element,action),action}logicalActions(){const actions=[],addProvider=(owner,provider)=>{const getToolbarActions=dataCallable(provider,"getToolbarActions");if(!getToolbarActions)return;let provided;try{provided=Reflect.apply(getToolbarActions,provider,[])}catch{return}let isArray=!1;try{isArray=Array.isArray(provided)}catch{return}if(!isArray)return;const length=getOwnDataDescriptor(provided,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return;const seen=new Set,inspected=Math.min(length.value,MAX_TOOLBAR_ACTIONS);for(let index=0;index<inspected;index+=1){const candidate=getOwnDataDescriptor(provided,String(index));if(candidate===MISSING_OWN_DATA_DESCRIPTOR||candidate===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const projected=projectToolbarAction(candidate.value);!projected||seen.has(projected.action.id)||(seen.add(projected.action.id),this.isAvailable(projected.action)&&actions.push({owner,...projected}))}},visit=element=>{if(isLyraToolbarActionProvider(element)){addProvider(element,element);return}const knownAction=this.directActions.get(element);if(isSemanticActionElement(element)||(knownAction?.hasAuthoredTabIndex()??element.hasAttribute("tabindex"))){const action=this.directActionFor(element);this.isAvailable(action)&&actions.push({owner:element,action,source:action});return}for(const child of element.children)visit(child)};for(const root of this.actionRoots())visit(root);return actions}setActiveStop(stops,index,preferred){this.stopObserver?.disconnect();for(const previous of this.managedStops)stops.some(stop=>this.sameAction(stop,previous))||this.releaseManagedStop(previous);const preferredIndex=preferred?stops.findIndex(stop=>this.sameAction(stop,preferred)):-1;this.activeStopIndex=stops.length===0?0:preferredIndex>=0?preferredIndex:Math.min(Math.max(0,index),stops.length-1),stops.forEach(({action},stopIndex)=>{try{action.setTabIndex(stopIndex===this.activeStopIndex?0:-1)}catch{}}),this.managedStops=stops,this.observeStopChanges()}releaseManagedStop(stop){try{stop.action.releaseTabIndex?.()}catch{}this.directActions.get(stop.owner)===stop.action&&this.directActions.delete(stop.owner)}releaseManagedStops(){for(const stop of this.managedStops)this.releaseManagedStop(stop);this.managedStops=[]}observeStopChanges(){this.stopObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,base=this.renderRoot.querySelector('[part="base"]');if(!Observer||!base||!this.isConnected){this.stopObserver=void 0;return}const observer=new Observer(this.onStopMutations),roots=new Set([base,...this.actionRoots()]),options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.stopObserver=observer}async reconcileStopsAfterChildren(){const generation=++this.stopSyncGeneration,pending=this.actionRoots().map(root=>root.updateComplete).filter(value=>value!==void 0&&typeof value.then=="function");if(await Promise.all(pending),await Promise.resolve(),generation!==this.stopSyncGeneration||!this.isConnected)return;const stops=this.logicalActions(),focused=this.focusedStop,retainedIndex=focused?stops.findIndex(stop=>stop.owner===focused.owner&&stop.source===focused.source&&stop.action.id===focused.id):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):this.activeStopIndex,Math.max(0,stops.length-1));if(this.setActiveStop(stops,targetIndex),focused&&retainedIndex<0){const base=this.renderRoot.querySelector('[part="base"]');base&&applyComposedFocusRepair(focused.repair,base)&&stops[targetIndex]?.action.focus(),this.focusedStop===focused&&(this.focusedStop=void 0)}}renderControl(type){switch(type){case"copy":return this.copyText?html`<lr-copy-button
12
+ `}class LyraMessageActions extends LyraElement{constructor(){super(...arguments),this.controls=[],this.copyText="",this.feedbackRating=null,this.revealOnInteraction=!1,this.label="",this.accessibleLabel=null,this.activeStopIndex=0,this.revealed=!1,this.hoverTarget=null,this.stopSyncGeneration=0,this.managedStops=[],this.directActions=new WeakMap,this.nextDirectActionId=0,this.onHoverTargetEnter=()=>{this.revealed=!0},this.onHoverTargetLeave=()=>{this.matches(":focus-within")||(this.revealed=!1)},this.onFocusIn=event=>{this.revealed=!0;const stops=this.logicalActions(),path=event.composedPath(),index=stops.findIndex(({action})=>action.matchesEventPath(path));if(index>=0){this.setActiveStop(stops,index,stops[index]);const base=this.renderRoot.querySelector('[part="base"]'),repair=base?captureComposedFocusRepair(this,base):null,stop=stops[index];this.focusedStop=stop&&repair?{index,owner:stop.owner,id:stop.action.id,source:stop.source,repair}:void 0}else this.focusedStop=void 0},this.onFocusOut=event=>{this.hoverTarget?.matches(":hover")||(this.revealed=!1);const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedStop=void 0)},this.onStopMutations=records=>{this.reconcileStopsAfterChildren()},this.onSlotChange=()=>{const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()},this.onToolbarActionsChange=event=>{event.stopPropagation(),this.reconcileStopsAfterChildren()},this.containSlottedFeedbackEvent=event=>{event.stopPropagation()},this.onToolbarKeyDown=e=>{const stops=this.logicalActions();if(stops.length===0)return;const path=e.composedPath(),originIndex=stops.findIndex(({action})=>action.matchesEventPath(path));if(originIndex<0&&path[0]!==e.currentTarget)return;const currentIndex=originIndex>=0?originIndex:this.activeStopIndex,forwardKey=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backwardKey=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let target;if(e.key===forwardKey)target=(currentIndex+1)%stops.length;else if(e.key===backwardKey)target=(currentIndex-1+stops.length)%stops.length;else if(e.key==="Home")target=0;else if(e.key==="End")target=stops.length-1;else return;e.preventDefault(),this.setActiveStop(stops,target),stops[target]?.action.focus()},this.onRegenerateClick=()=>{this.emit("lr-regenerate",null)},this.onEditClick=()=>{this.emit("lr-edit",null)}}static{this.defaultStrings={...super.defaultStrings,editMessage:LYRA_DEFAULT_editMessage,fieldRequired:LYRA_DEFAULT_fieldRequired,messageActionsLabel:LYRA_DEFAULT_messageActionsLabel,regenerateResponse:LYRA_DEFAULT_regenerateResponse}}static{this.ownedCollectionProperties=Object.freeze(["controls"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get effectiveControls(){const seen=new Set,controls=[];for(const value of this.controls){if(typeof value!="string"||!MESSAGE_ACTION_CONTROLS.includes(value)||seen.has(value))continue;const control=value;seen.add(control),controls.push(control)}return controls}get feedbackPending(){return this.currentBuiltInFeedback()?.pending===!0}finalizePendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.finalizePendingSubmit(submissionId):!1}revertPendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.revertPendingSubmit(submissionId):!1}currentBuiltInFeedback(){const base=this.renderRoot.querySelector('[part="base"]'),feedback=base?.querySelector('lr-message-feedback[part~="feedback"]');return feedback&&feedback.parentElement===base&&feedback.getRootNode()===this.renderRoot&&feedback.isConnected?feedback:void 0}connectedCallback(){super.connectedCallback(),this.addEventListener("focusin",this.onFocusIn),this.addEventListener("focusout",this.onFocusOut),this.revealOnInteraction&&this.bindHoverTarget(),this.hasUpdated&&this.reconcileStopsAfterChildren()}disconnectedCallback(){this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops(),this.focusedStop=void 0,this.unbindHoverTarget(),this.removeEventListener("focusin",this.onFocusIn),this.removeEventListener("focusout",this.onFocusOut),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops()}willUpdate(changed){super.willUpdate(changed),changed.has("revealOnInteraction")&&(this.revealOnInteraction?this.bindHoverTarget():this.unbindHoverTarget())}firstUpdated(changed){super.firstUpdated(changed),this.setActiveStop(this.logicalActions(),0),this.reconcileStopsAfterChildren()}updated(changed){if(super.updated(changed),changed.has("controls")){const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()}changed.has("revealed")&&this.toggleAttribute("data-revealed",this.revealed)}bindHoverTarget(){this.unbindHoverTarget();const target=this.closest("lr-chat-message")??this.parentElement;target&&(this.hoverTarget=target,target.addEventListener("pointerenter",this.onHoverTargetEnter),target.addEventListener("pointerleave",this.onHoverTargetLeave))}unbindHoverTarget(){this.hoverTarget?.removeEventListener("pointerenter",this.onHoverTargetEnter),this.hoverTarget?.removeEventListener("pointerleave",this.onHoverTargetLeave),this.hoverTarget=null,this.revealed=!1}actionRoots(){const base=this.renderRoot.querySelector('[part="base"]');if(!base)return[];const direct=[...base.children].filter(element=>element.localName!=="slot"),slot=base.querySelector("slot");return[...direct,...slot?.assignedElements({flatten:!0})??[]]}sameAction(left,right){return left.owner===right.owner&&left.source===right.source&&left.action.id===right.action.id}isAvailable(action){try{return action.disabled!==!0}catch{return!1}}directActionFor(element){let action=this.directActions.get(element);if(action)return action;const target=element,id=`direct-${++this.nextDirectActionId}`;let leasedTarget,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const leased=leasedTarget;leased&&leased.getAttribute("tabindex")===lastManagedTabIndex&&(leasedAuthoredTabIndex===null?leased.removeAttribute("tabindex"):leased.setAttribute("tabindex",leasedAuthoredTabIndex)),leasedTarget=void 0,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return action={id,get disabled(){return!isComposedFocusAvailable(element)},focus(options){target.focus(options)},setTabIndex(tabIndex){if(leasedTarget!==target&&(releaseTabIndex(),leasedTarget=target,leasedAuthoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,hasAuthoredTabIndex(){return leasedTarget!==target?target.hasAttribute("tabindex"):lastManagedTabIndex!==null&&target.getAttribute("tabindex")===lastManagedTabIndex?leasedAuthoredTabIndex!==null:target.hasAttribute("tabindex")},matchesEventPath(path){return path.includes(element)}},this.directActions.set(element,action),action}logicalActions(){const actions=[],addProvider=(owner,provider)=>{const getToolbarActions=dataCallable(provider,"getToolbarActions");if(!getToolbarActions)return;let provided;try{provided=Reflect.apply(getToolbarActions,provider,[])}catch{return}let isArray=!1;try{isArray=Array.isArray(provided)}catch{return}if(!isArray)return;const length=getOwnDataDescriptor(provided,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return;const seen=new Set,inspected=Math.min(length.value,MAX_TOOLBAR_ACTIONS);for(let index=0;index<inspected;index+=1){const candidate=getOwnDataDescriptor(provided,String(index));if(candidate===MISSING_OWN_DATA_DESCRIPTOR||candidate===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const projected=projectToolbarAction(candidate.value);!projected||seen.has(projected.action.id)||(seen.add(projected.action.id),this.isAvailable(projected.action)&&actions.push({owner,...projected}))}},visit=element=>{if(isLyraToolbarActionProvider(element)){addProvider(element,element);return}const knownAction=this.directActions.get(element);if(isSemanticActionElement(element)||(knownAction?.hasAuthoredTabIndex()??element.hasAttribute("tabindex"))){const action=this.directActionFor(element);this.isAvailable(action)&&actions.push({owner:element,action,source:action});return}for(const child of element.children)visit(child)};for(const root of this.actionRoots())visit(root);return actions}setActiveStop(stops,index,preferred){this.stopObserver?.disconnect();for(const previous of this.managedStops)stops.some(stop=>this.sameAction(stop,previous))||this.releaseManagedStop(previous);const preferredIndex=preferred?stops.findIndex(stop=>this.sameAction(stop,preferred)):-1;this.activeStopIndex=stops.length===0?0:preferredIndex>=0?preferredIndex:Math.min(Math.max(0,index),stops.length-1),stops.forEach(({action},stopIndex)=>{try{action.setTabIndex(stopIndex===this.activeStopIndex?0:-1)}catch{}}),this.managedStops=stops,this.observeStopChanges()}releaseManagedStop(stop){try{stop.action.releaseTabIndex?.()}catch{}this.directActions.get(stop.owner)===stop.action&&this.directActions.delete(stop.owner)}releaseManagedStops(){for(const stop of this.managedStops)this.releaseManagedStop(stop);this.managedStops=[]}observeStopChanges(){this.stopObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,base=this.renderRoot.querySelector('[part="base"]');if(!Observer||!base||!this.isConnected){this.stopObserver=void 0;return}const observer=new Observer(this.onStopMutations),roots=new Set([base,...this.actionRoots()]),options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.stopObserver=observer}async reconcileStopsAfterChildren(){const generation=++this.stopSyncGeneration,pending=this.actionRoots().map(root=>root.updateComplete).filter(value=>value!==void 0&&typeof value.then=="function");if(await Promise.all(pending),await Promise.resolve(),generation!==this.stopSyncGeneration||!this.isConnected)return;const stops=this.logicalActions(),focused=this.focusedStop,retainedIndex=focused?stops.findIndex(stop=>stop.owner===focused.owner&&stop.source===focused.source&&stop.action.id===focused.id):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):this.activeStopIndex,Math.max(0,stops.length-1));if(this.setActiveStop(stops,targetIndex),focused&&retainedIndex<0){const base=this.renderRoot.querySelector('[part="base"]');base&&applyComposedFocusRepair(focused.repair,base)&&stops[targetIndex]?.action.focus(),this.focusedStop===focused&&(this.focusedStop=void 0)}}renderControl(type){switch(type){case"copy":return this.copyText?html`<lr-copy-button
13
13
  part="copy-button"
14
14
  .value=${this.copyText}
15
15
  ></lr-copy-button>`:nothing;case"regenerate":return html`<button
@@ -20,6 +20,8 @@ readonly submissionId:string;}export interface LyraMessageFeedbackEventMap{'lr-f
20
20
  * its native `spellcheck`, `autocapitalize`, `autocorrect`, and `wrap` properties forward from
21
21
  * this element; no textarea exists, and those values have no rendered target, otherwise.
22
22
  *
23
+ * Asynchronous finalization or reversion preserves focus on an outside control. Settlement retains the existing thumb/submit fallback when focus remains within the feedback or was lost as its pending controls became disabled.
24
+ *
23
25
  * @customElement lr-message-feedback
24
26
  * @event lr-feedback-change - `detail: { rating }`. Fires whenever thumb interaction changes the
25
27
  * provisional rating, including clearing it to `null`.
@@ -99,7 +101,7 @@ focus(options?:FocusOptions):void;blur():void;
99
101
  /** Activates the thumb matching the current rating (the up thumb when unset). */
100
102
  click():void;private get detailReasons();private get detailCommentable();private get currentDetailProjection();private get hasDetailContent();private detailApplies;requestUpdate(name?:PropertyKey,oldValue?:unknown,options?:PropertyDeclaration):void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues<this>):void;protected updated(changed:PropertyValues<this>):void;private setRatingFromInteraction;private activateThumb;private focusActiveThumb;private closePanel;private onPanelKeyDown;private toggleReason;private onCommentInput;private onCommentFocus;private onCommentBlur;private setPending;
101
103
  /** Retires a transaction synchronously so a later same-turn settlement cannot affect it. */
102
- private invalidatePendingSubmission;private isCurrentPendingSubmission;private canSettleWithoutSubmissionId;private scheduleSettlementFocus;private settlePendingSubmission;private commitSettlement;
104
+ private invalidatePendingSubmission;private isCurrentPendingSubmission;private canSettleWithoutSubmissionId;private scheduleSettlementFocus;private ownsSettlementFocus;private settlePendingSubmission;private commitSettlement;
103
105
  /** Completes a live held submit. Pass its event `submissionId`; a no-argument call is retained
104
106
  * only for this instance's never-invalidated first transaction. Returns whether this call won. */
105
107
  finalizePendingSubmit(submissionId?:string):boolean;
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,query,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{autocorrectConverter,declaredDefaultConverter,normalizeAutocorrect,omittedEmptyStringConverter,trueDefaultSpellcheckConverter}from"../../../internal/converters.js";import{styles}from"./message-feedback.styles.js";import{LYRA_DEFAULT_feedbackCommentLabel,LYRA_DEFAULT_feedbackCommentPlaceholder,LYRA_DEFAULT_feedbackNegative,LYRA_DEFAULT_feedbackPositive,LYRA_DEFAULT_feedbackReasonsLabel,LYRA_DEFAULT_feedbackSubmit,LYRA_DEFAULT_feedbackSubmitted}from"../../../internal/default-strings.generated.js";function thumbIcon(direction,filled){return svg`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,query,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{deepActiveElementIn}from"../../../internal/active-element.js";import{composedContains}from"../../../internal/overlay-stack.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{autocorrectConverter,declaredDefaultConverter,normalizeAutocorrect,omittedEmptyStringConverter,trueDefaultSpellcheckConverter}from"../../../internal/converters.js";import{styles}from"./message-feedback.styles.js";import{LYRA_DEFAULT_feedbackCommentLabel,LYRA_DEFAULT_feedbackCommentPlaceholder,LYRA_DEFAULT_feedbackNegative,LYRA_DEFAULT_feedbackPositive,LYRA_DEFAULT_feedbackReasonsLabel,LYRA_DEFAULT_feedbackSubmit,LYRA_DEFAULT_feedbackSubmitted}from"../../../internal/default-strings.generated.js";function thumbIcon(direction,filled){return svg`
2
2
  <svg
3
3
  width="1em"
4
4
  height="1em"
@@ -11,7 +11,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
11
11
  aria-hidden="true"
12
12
  focusable="false"
13
13
  ><path d=${direction==="up"?"M7 11v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1h3Z":"M17 13V4a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v8h4Z"}></path><path d=${direction==="up"?"M7 11l3.5-7A2 2 0 0 1 12 3a1 1 0 0 1 1 1v6h4.5a2 2 0 0 1 2 2.3l-1.2 7A2 2 0 0 1 16.3 21H9a2 2 0 0 1-2-2v-8Z":"M17 13l-3.5 7A2 2 0 0 1 12 21a1 1 0 0 1-1-1v-6H6.5a2 2 0 0 1-2-2.3l1.2-7A2 2 0 0 1 7.7 3H15a2 2 0 0 1 2 2v8Z"}></path></svg>
14
- `}const MAX_PROJECTED_FEEDBACK_REASONS=1e4,EMPTY_FEEDBACK_DETAIL_PROJECTION=Object.freeze({reasons:Object.freeze([]),commentable:!1});function isObjectValue(value){return value!==null&&(typeof value=="object"||typeof value=="function")}function isArrayValue(value){try{return Array.isArray(value)}catch{return!1}}function projectFeedbackDetail(detail){if(!isObjectValue(detail))return EMPTY_FEEDBACK_DETAIL_PROJECTION;const reasonsDescriptor=getOwnDataDescriptor(detail,"reasons"),commentableDescriptor=getOwnDataDescriptor(detail,"commentable"),commentable=commentableDescriptor!==MISSING_OWN_DATA_DESCRIPTOR&&commentableDescriptor!==UNSAFE_OWN_DATA_DESCRIPTOR&&commentableDescriptor.value===!0,reasonsValue=reasonsDescriptor!==MISSING_OWN_DATA_DESCRIPTOR&&reasonsDescriptor!==UNSAFE_OWN_DATA_DESCRIPTOR?reasonsDescriptor.value:void 0;if(!isArrayValue(reasonsValue))return commentable?Object.freeze({reasons:Object.freeze([]),commentable}):EMPTY_FEEDBACK_DETAIL_PROJECTION;const lengthDescriptor=getOwnDataDescriptor(reasonsValue,"length");if(lengthDescriptor===MISSING_OWN_DATA_DESCRIPTOR||lengthDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof lengthDescriptor.value!="number"||!Number.isSafeInteger(lengthDescriptor.value)||lengthDescriptor.value<0)return commentable?Object.freeze({reasons:Object.freeze([]),commentable}):EMPTY_FEEDBACK_DETAIL_PROJECTION;const reasons=[],seen=new Set,length=Math.min(lengthDescriptor.value,MAX_PROJECTED_FEEDBACK_REASONS);for(let index=0;index<length;index+=1){const rowDescriptor=getOwnDataDescriptor(reasonsValue,String(index));if(rowDescriptor===MISSING_OWN_DATA_DESCRIPTOR||rowDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||!isObjectValue(rowDescriptor.value))continue;const row=rowDescriptor.value,idDescriptor=getOwnDataDescriptor(row,"id"),labelDescriptor=getOwnDataDescriptor(row,"label");if(idDescriptor===MISSING_OWN_DATA_DESCRIPTOR||idDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||labelDescriptor===MISSING_OWN_DATA_DESCRIPTOR||labelDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof idDescriptor.value!="string"||typeof labelDescriptor.value!="string")continue;const id=idDescriptor.value,label=labelDescriptor.value;id.trim().length===0||seen.has(id)||(seen.add(id),reasons.push(Object.freeze({id,label})))}return Object.freeze({reasons:Object.freeze(reasons),commentable})}class LyraMessageFeedback extends LyraElement{constructor(){super(...arguments),this.rating=null,this.detailFor="down",this.disabled=!1,this.pending=!1,this.spellcheck=!0,this.autocapitalize="",this.autocorrectValue=!0,this.wrap="soft",this.panelOpen=!1,this.selectedReasonIds=[],this.commentDraft="",this.detailProjectionSource=Symbol("unprojected-feedback-detail"),this.detailProjection=EMPTY_FEEDBACK_DETAIL_PROJECTION,this.submissionSequence=0,this.submissionCount=0,this.legacyNoArgumentSettlementInvalidated=!1,this.lifecycleGeneration=0,this.focusGeneration=0,this.settingPending=!1,this.panelId=nextId("message-feedback-panel"),this.upToolbarAction=this.createToolbarAction("up"),this.downToolbarAction=this.createToolbarAction("down"),this.onPanelKeyDown=e=>{e.key==="Escape"&&(e.stopPropagation(),this.closePanel())},this.onCommentInput=e=>{this.commentDraft=e.target.value},this.onCommentFocus=()=>{this.emit("focus",null)},this.onCommentBlur=()=>{this.emit("blur",null)},this.onSubmit=()=>{if(this.disabled||this.pending||!this.rating||!this.panelOpen)return;const validReasonIds=new Set(this.detailReasons.map(reason=>reason.id));this.requestSubmission({rating:this.rating,reasonIds:this.selectedReasonIds.filter(id=>validReasonIds.has(id)),comment:this.detailCommentable?this.commentDraft.trim():""},this.rating,!0)}}static{this.defaultStrings={...super.defaultStrings,feedbackCommentLabel:LYRA_DEFAULT_feedbackCommentLabel,feedbackCommentPlaceholder:LYRA_DEFAULT_feedbackCommentPlaceholder,feedbackNegative:LYRA_DEFAULT_feedbackNegative,feedbackPositive:LYRA_DEFAULT_feedbackPositive,feedbackReasonsLabel:LYRA_DEFAULT_feedbackReasonsLabel,feedbackSubmit:LYRA_DEFAULT_feedbackSubmit,feedbackSubmitted:LYRA_DEFAULT_feedbackSubmitted}}static{this.ownedCollectionProperties=Object.freeze(["detail"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get autocorrect(){return this.autocorrectValue}set autocorrect(next){const previous=this.autocorrectValue;this.autocorrectValue=normalizeAutocorrect(next),this.requestUpdate("autocorrect",previous)}createToolbarAction(direction){const host=this,button=()=>direction==="up"?host.upButtonEl:host.downButtonEl;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.upToolbarAction,this.downToolbarAction]}focus(options){(this.rating==="down"?this.downButtonEl:this.upButtonEl)?.focus(options)}blur(){this.upButtonEl?.blur(),this.downButtonEl?.blur()}click(){this.disabled||this.pending||(this.rating==="down"?this.downButtonEl:this.upButtonEl)?.click()}get detailReasons(){return this.currentDetailProjection.reasons}get detailCommentable(){return this.currentDetailProjection.commentable}get currentDetailProjection(){const detail=this.detail;return detail!==this.detailProjectionSource&&(this.detailProjectionSource=detail,this.detailProjection=projectFeedbackDetail(detail)),this.detailProjection}get hasDetailContent(){return this.detailReasons.length>0||this.detailCommentable}detailApplies(direction){return this.detailFor==="both"||this.detailFor===direction}requestUpdate(name,oldValue,options){const currentValue=name==="rating"?this.rating:name==="detail"?this.detail:name==="detailFor"?this.detailFor:name==="pending"?this.pending:void 0,changed=oldValue!==currentValue,internalRatingWrite=name==="rating"&&this.pendingInternalRating?.rating===this.rating;changed&&(name==="rating"||name==="detail"||name==="detailFor"||name==="pending")&&!(name==="rating"&&internalRatingWrite)&&(this.focusGeneration=(this.focusGeneration??0)+1,this.pendingSubmission&&(name!=="pending"||!this.settingPending&&this.pending===!1)&&this.invalidatePendingSubmission()),super.requestUpdate(name,oldValue,options)}disconnectedCallback(){this.lifecycleGeneration+=1,this.invalidatePendingSubmission(),this.upToolbarAction.releaseTabIndex?.(),this.downToolbarAction.releaseTabIndex?.(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.lifecycleGeneration+=1,this.invalidatePendingSubmission(),this.upToolbarAction.releaseTabIndex?.(),this.downToolbarAction.releaseTabIndex?.()}willUpdate(changed){if(super.willUpdate(changed),changed.has("rating")){const internal=this.pendingInternalRating?.rating===this.rating;this.pendingInternalRating=void 0,internal||(this.invalidatePendingSubmission(),this.setPending(!1),this.panelOpen=!1,this.selectedReasonIds=[],this.commentDraft="")}if(changed.has("detail")){const validIds=new Set(this.detailReasons.map(reason=>reason.id));this.selectedReasonIds=this.selectedReasonIds.filter(id=>validIds.has(id)),this.detailCommentable||(this.commentDraft="")}this.panelOpen&&(!this.rating||!this.detailApplies(this.rating)||!this.hasDetailContent)&&(this.invalidatePendingSubmission(),this.setPending(!1),this.panelOpen=!1,changed.has("detailFor")&&(this.selectedReasonIds=[],this.commentDraft=""))}updated(changed){super.updated(changed),(changed.has("disabled")||changed.has("pending"))&&this.emit("lr-toolbar-actions-change")}setRatingFromInteraction(rating){this.pendingInternalRating={rating},this.rating=rating}activateThumb(next){if(this.disabled||this.pending)return;const previousRating=this.rating;if(this.rating===next){if(this.panelOpen){this.setRatingFromInteraction(null),this.panelOpen=!1,this.selectedReasonIds=[],this.commentDraft="",this.emit("lr-feedback-change",{rating:null}),this.requestSubmission({rating:null,reasonIds:[],comment:""},previousRating,!0);return}if(this.detailApplies(next)&&this.hasDetailContent){this.panelOpen=!0;return}this.setRatingFromInteraction(null),this.emit("lr-feedback-change",{rating:null}),this.requestSubmission({rating:null,reasonIds:[],comment:""},previousRating,!1);return}this.selectedReasonIds=[],this.commentDraft="",this.setRatingFromInteraction(next),this.panelOpen=this.detailApplies(next)&&this.hasDetailContent,this.emit("lr-feedback-change",{rating:next}),this.panelOpen||this.requestSubmission({rating:next,reasonIds:[],comment:""},previousRating,!1)}focusActiveThumb(){(this.rating==="down"?this.downButtonEl:this.upButtonEl)?.focus()}closePanel(){this.panelOpen&&(this.panelOpen=!1,this.focusActiveThumb())}toggleReason(id){this.disabled||this.pending||(this.selectedReasonIds=this.selectedReasonIds.includes(id)?this.selectedReasonIds.filter(r=>r!==id):[...this.selectedReasonIds,id])}setPending(pending){this.settingPending=!0,this.pending=pending,this.settingPending=!1}invalidatePendingSubmission(){const transaction=this.pendingSubmission;transaction&&(this.pendingSubmission=void 0,this.dispatchingSubmission===transaction&&(this.dispatchingSubmission=void 0),this.legacyNoArgumentSettlementInvalidated=!0,this.focusGeneration+=1,this.setPending(!1))}isCurrentPendingSubmission(transaction){return this.pendingSubmission===transaction&&this.pending&&this.isConnected&&transaction.lifecycleGeneration===this.lifecycleGeneration&&transaction.rating===this.rating&&transaction.detail===this.detail&&transaction.detailFor===this.detailFor?!0:(this.pendingSubmission===transaction&&this.invalidatePendingSubmission(),!1)}canSettleWithoutSubmissionId(transaction){return!this.legacyNoArgumentSettlementInvalidated&&this.submissionCount===1&&transaction.sequence===1}scheduleSettlementFocus(transaction,destination){const focusGeneration=++this.focusGeneration,lifecycleGeneration=transaction.lifecycleGeneration;this.updateComplete.then(()=>{focusGeneration!==this.focusGeneration||lifecycleGeneration!==this.lifecycleGeneration||!this.isConnected||this.pending||this.pendingSubmission||(destination==="submit"&&this.panelOpen?this.submitButtonEl?.focus():this.focusActiveThumb())})}settlePendingSubmission(settlement,submissionId){const transaction=this.pendingSubmission;if(!transaction||!this.isCurrentPendingSubmission(transaction))return!1;if(submissionId===void 0){if(!this.canSettleWithoutSubmissionId(transaction))return!1}else if(submissionId!==transaction.submissionId)return!1;return transaction.settlement?!1:this.dispatchingSubmission===transaction?(transaction.settlement=settlement,!0):(this.commitSettlement(transaction,settlement),!0)}commitSettlement(transaction,settlement){if(this.isCurrentPendingSubmission(transaction)){if(this.pendingSubmission=void 0,this.dispatchingSubmission===transaction&&(this.dispatchingSubmission=void 0),this.setPending(!1),settlement==="finalize"){this.panelOpen=!1,this.liveRegion?.announce(this.localize("feedbackSubmitted"),{force:!0}),this.scheduleSettlementFocus(transaction,"thumb");return}this.setRatingFromInteraction(transaction.previousRating),this.panelOpen=transaction.panelWasOpen,this.scheduleSettlementFocus(transaction,transaction.panelWasOpen?"submit":"thumb")}}finalizePendingSubmit(submissionId){return this.settlePendingSubmission("finalize",submissionId)}revertPendingSubmit(submissionId){return this.settlePendingSubmission("revert",submissionId)}requestSubmission(detail,previousRating,panelWasOpen){this.focusGeneration+=1;const sequence=++this.submissionSequence;this.submissionCount+=1;const transaction={submissionId:nextId("message-feedback-submission"),sequence,lifecycleGeneration:this.lifecycleGeneration,rating:this.rating,detail:this.detail,detailFor:this.detailFor,previousRating,panelWasOpen};this.pendingSubmission=transaction,this.setPending(!0),this.dispatchingSubmission=transaction;const event=this.emit("lr-feedback-submit",{...detail,submissionId:transaction.submissionId},{cancelable:!0});if(this.dispatchingSubmission===transaction&&(this.dispatchingSubmission=void 0),!!this.isCurrentPendingSubmission(transaction)){if(transaction.settlement){this.commitSettlement(transaction,transaction.settlement);return}event.defaultPrevented||this.commitSettlement(transaction,"finalize")}}renderThumb(direction){const pressed=this.rating===direction,canExpand=this.detailApplies(direction)&&this.hasDetailContent;return html`
14
+ `}const MAX_PROJECTED_FEEDBACK_REASONS=1e4,EMPTY_FEEDBACK_DETAIL_PROJECTION=Object.freeze({reasons:Object.freeze([]),commentable:!1});function isObjectValue(value){return value!==null&&(typeof value=="object"||typeof value=="function")}function isArrayValue(value){try{return Array.isArray(value)}catch{return!1}}function projectFeedbackDetail(detail){if(!isObjectValue(detail))return EMPTY_FEEDBACK_DETAIL_PROJECTION;const reasonsDescriptor=getOwnDataDescriptor(detail,"reasons"),commentableDescriptor=getOwnDataDescriptor(detail,"commentable"),commentable=commentableDescriptor!==MISSING_OWN_DATA_DESCRIPTOR&&commentableDescriptor!==UNSAFE_OWN_DATA_DESCRIPTOR&&commentableDescriptor.value===!0,reasonsValue=reasonsDescriptor!==MISSING_OWN_DATA_DESCRIPTOR&&reasonsDescriptor!==UNSAFE_OWN_DATA_DESCRIPTOR?reasonsDescriptor.value:void 0;if(!isArrayValue(reasonsValue))return commentable?Object.freeze({reasons:Object.freeze([]),commentable}):EMPTY_FEEDBACK_DETAIL_PROJECTION;const lengthDescriptor=getOwnDataDescriptor(reasonsValue,"length");if(lengthDescriptor===MISSING_OWN_DATA_DESCRIPTOR||lengthDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof lengthDescriptor.value!="number"||!Number.isSafeInteger(lengthDescriptor.value)||lengthDescriptor.value<0)return commentable?Object.freeze({reasons:Object.freeze([]),commentable}):EMPTY_FEEDBACK_DETAIL_PROJECTION;const reasons=[],seen=new Set,length=Math.min(lengthDescriptor.value,MAX_PROJECTED_FEEDBACK_REASONS);for(let index=0;index<length;index+=1){const rowDescriptor=getOwnDataDescriptor(reasonsValue,String(index));if(rowDescriptor===MISSING_OWN_DATA_DESCRIPTOR||rowDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||!isObjectValue(rowDescriptor.value))continue;const row=rowDescriptor.value,idDescriptor=getOwnDataDescriptor(row,"id"),labelDescriptor=getOwnDataDescriptor(row,"label");if(idDescriptor===MISSING_OWN_DATA_DESCRIPTOR||idDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||labelDescriptor===MISSING_OWN_DATA_DESCRIPTOR||labelDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof idDescriptor.value!="string"||typeof labelDescriptor.value!="string")continue;const id=idDescriptor.value,label=labelDescriptor.value;id.trim().length===0||seen.has(id)||(seen.add(id),reasons.push(Object.freeze({id,label})))}return Object.freeze({reasons:Object.freeze(reasons),commentable})}class LyraMessageFeedback extends LyraElement{constructor(){super(...arguments),this.rating=null,this.detailFor="down",this.disabled=!1,this.pending=!1,this.spellcheck=!0,this.autocapitalize="",this.autocorrectValue=!0,this.wrap="soft",this.panelOpen=!1,this.selectedReasonIds=[],this.commentDraft="",this.detailProjectionSource=Symbol("unprojected-feedback-detail"),this.detailProjection=EMPTY_FEEDBACK_DETAIL_PROJECTION,this.submissionSequence=0,this.submissionCount=0,this.legacyNoArgumentSettlementInvalidated=!1,this.lifecycleGeneration=0,this.focusGeneration=0,this.settingPending=!1,this.panelId=nextId("message-feedback-panel"),this.upToolbarAction=this.createToolbarAction("up"),this.downToolbarAction=this.createToolbarAction("down"),this.onPanelKeyDown=e=>{e.key==="Escape"&&(e.stopPropagation(),this.closePanel())},this.onCommentInput=e=>{this.commentDraft=e.target.value},this.onCommentFocus=()=>{this.emit("focus",null)},this.onCommentBlur=()=>{this.emit("blur",null)},this.onSubmit=()=>{if(this.disabled||this.pending||!this.rating||!this.panelOpen)return;const validReasonIds=new Set(this.detailReasons.map(reason=>reason.id));this.requestSubmission({rating:this.rating,reasonIds:this.selectedReasonIds.filter(id=>validReasonIds.has(id)),comment:this.detailCommentable?this.commentDraft.trim():""},this.rating,!0)}}static{this.defaultStrings={...super.defaultStrings,feedbackCommentLabel:LYRA_DEFAULT_feedbackCommentLabel,feedbackCommentPlaceholder:LYRA_DEFAULT_feedbackCommentPlaceholder,feedbackNegative:LYRA_DEFAULT_feedbackNegative,feedbackPositive:LYRA_DEFAULT_feedbackPositive,feedbackReasonsLabel:LYRA_DEFAULT_feedbackReasonsLabel,feedbackSubmit:LYRA_DEFAULT_feedbackSubmit,feedbackSubmitted:LYRA_DEFAULT_feedbackSubmitted}}static{this.ownedCollectionProperties=Object.freeze(["detail"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get autocorrect(){return this.autocorrectValue}set autocorrect(next){const previous=this.autocorrectValue;this.autocorrectValue=normalizeAutocorrect(next),this.requestUpdate("autocorrect",previous)}createToolbarAction(direction){const host=this,button=()=>direction==="up"?host.upButtonEl:host.downButtonEl;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.upToolbarAction,this.downToolbarAction]}focus(options){(this.rating==="down"?this.downButtonEl:this.upButtonEl)?.focus(options)}blur(){this.upButtonEl?.blur(),this.downButtonEl?.blur()}click(){this.disabled||this.pending||(this.rating==="down"?this.downButtonEl:this.upButtonEl)?.click()}get detailReasons(){return this.currentDetailProjection.reasons}get detailCommentable(){return this.currentDetailProjection.commentable}get currentDetailProjection(){const detail=this.detail;return detail!==this.detailProjectionSource&&(this.detailProjectionSource=detail,this.detailProjection=projectFeedbackDetail(detail)),this.detailProjection}get hasDetailContent(){return this.detailReasons.length>0||this.detailCommentable}detailApplies(direction){return this.detailFor==="both"||this.detailFor===direction}requestUpdate(name,oldValue,options){const currentValue=name==="rating"?this.rating:name==="detail"?this.detail:name==="detailFor"?this.detailFor:name==="pending"?this.pending:void 0,changed=oldValue!==currentValue,internalRatingWrite=name==="rating"&&this.pendingInternalRating?.rating===this.rating;changed&&(name==="rating"||name==="detail"||name==="detailFor"||name==="pending")&&!(name==="rating"&&internalRatingWrite)&&(this.focusGeneration=(this.focusGeneration??0)+1,this.pendingSubmission&&(name!=="pending"||!this.settingPending&&this.pending===!1)&&this.invalidatePendingSubmission()),super.requestUpdate(name,oldValue,options)}disconnectedCallback(){this.lifecycleGeneration+=1,this.invalidatePendingSubmission(),this.upToolbarAction.releaseTabIndex?.(),this.downToolbarAction.releaseTabIndex?.(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.lifecycleGeneration+=1,this.invalidatePendingSubmission(),this.upToolbarAction.releaseTabIndex?.(),this.downToolbarAction.releaseTabIndex?.()}willUpdate(changed){if(super.willUpdate(changed),changed.has("rating")){const internal=this.pendingInternalRating?.rating===this.rating;this.pendingInternalRating=void 0,internal||(this.invalidatePendingSubmission(),this.setPending(!1),this.panelOpen=!1,this.selectedReasonIds=[],this.commentDraft="")}if(changed.has("detail")){const validIds=new Set(this.detailReasons.map(reason=>reason.id));this.selectedReasonIds=this.selectedReasonIds.filter(id=>validIds.has(id)),this.detailCommentable||(this.commentDraft="")}this.panelOpen&&(!this.rating||!this.detailApplies(this.rating)||!this.hasDetailContent)&&(this.invalidatePendingSubmission(),this.setPending(!1),this.panelOpen=!1,changed.has("detailFor")&&(this.selectedReasonIds=[],this.commentDraft=""))}updated(changed){super.updated(changed),(changed.has("disabled")||changed.has("pending"))&&this.emit("lr-toolbar-actions-change")}setRatingFromInteraction(rating){this.pendingInternalRating={rating},this.rating=rating}activateThumb(next){if(this.disabled||this.pending)return;const previousRating=this.rating;if(this.rating===next){if(this.panelOpen){this.setRatingFromInteraction(null),this.panelOpen=!1,this.selectedReasonIds=[],this.commentDraft="",this.emit("lr-feedback-change",{rating:null}),this.requestSubmission({rating:null,reasonIds:[],comment:""},previousRating,!0);return}if(this.detailApplies(next)&&this.hasDetailContent){this.panelOpen=!0;return}this.setRatingFromInteraction(null),this.emit("lr-feedback-change",{rating:null}),this.requestSubmission({rating:null,reasonIds:[],comment:""},previousRating,!1);return}this.selectedReasonIds=[],this.commentDraft="",this.setRatingFromInteraction(next),this.panelOpen=this.detailApplies(next)&&this.hasDetailContent,this.emit("lr-feedback-change",{rating:next}),this.panelOpen||this.requestSubmission({rating:next,reasonIds:[],comment:""},previousRating,!1)}focusActiveThumb(){(this.rating==="down"?this.downButtonEl:this.upButtonEl)?.focus()}closePanel(){this.panelOpen&&(this.panelOpen=!1,this.focusActiveThumb())}toggleReason(id){this.disabled||this.pending||(this.selectedReasonIds=this.selectedReasonIds.includes(id)?this.selectedReasonIds.filter(r=>r!==id):[...this.selectedReasonIds,id])}setPending(pending){this.settingPending=!0,this.pending=pending,this.settingPending=!1}invalidatePendingSubmission(){const transaction=this.pendingSubmission;transaction&&(this.pendingSubmission=void 0,this.dispatchingSubmission===transaction&&(this.dispatchingSubmission=void 0),this.legacyNoArgumentSettlementInvalidated=!0,this.focusGeneration+=1,this.setPending(!1))}isCurrentPendingSubmission(transaction){return this.pendingSubmission===transaction&&this.pending&&this.isConnected&&transaction.lifecycleGeneration===this.lifecycleGeneration&&transaction.rating===this.rating&&transaction.detail===this.detail&&transaction.detailFor===this.detailFor?!0:(this.pendingSubmission===transaction&&this.invalidatePendingSubmission(),!1)}canSettleWithoutSubmissionId(transaction){return!this.legacyNoArgumentSettlementInvalidated&&this.submissionCount===1&&transaction.sequence===1}scheduleSettlementFocus(transaction,destination){const focusGeneration=++this.focusGeneration,lifecycleGeneration=transaction.lifecycleGeneration;this.ownsSettlementFocus()&&this.updateComplete.then(()=>{focusGeneration!==this.focusGeneration||lifecycleGeneration!==this.lifecycleGeneration||!this.isConnected||this.pending||this.pendingSubmission||!this.ownsSettlementFocus()||(destination==="submit"&&this.panelOpen?this.submitButtonEl?.focus():this.focusActiveThumb())})}ownsSettlementFocus(){const doc=this.ownerDocument,active=deepActiveElementIn(doc);return active===null||active===doc.body||active===doc.documentElement||composedContains(this,active)}settlePendingSubmission(settlement,submissionId){const transaction=this.pendingSubmission;if(!transaction||!this.isCurrentPendingSubmission(transaction))return!1;if(submissionId===void 0){if(!this.canSettleWithoutSubmissionId(transaction))return!1}else if(submissionId!==transaction.submissionId)return!1;return transaction.settlement?!1:this.dispatchingSubmission===transaction?(transaction.settlement=settlement,!0):(this.commitSettlement(transaction,settlement),!0)}commitSettlement(transaction,settlement){if(this.isCurrentPendingSubmission(transaction)){if(this.pendingSubmission=void 0,this.dispatchingSubmission===transaction&&(this.dispatchingSubmission=void 0),this.setPending(!1),settlement==="finalize"){this.panelOpen=!1,this.liveRegion?.announce(this.localize("feedbackSubmitted"),{force:!0}),this.scheduleSettlementFocus(transaction,"thumb");return}this.setRatingFromInteraction(transaction.previousRating),this.panelOpen=transaction.panelWasOpen,this.scheduleSettlementFocus(transaction,transaction.panelWasOpen?"submit":"thumb")}}finalizePendingSubmit(submissionId){return this.settlePendingSubmission("finalize",submissionId)}revertPendingSubmit(submissionId){return this.settlePendingSubmission("revert",submissionId)}requestSubmission(detail,previousRating,panelWasOpen){this.focusGeneration+=1;const sequence=++this.submissionSequence;this.submissionCount+=1;const transaction={submissionId:nextId("message-feedback-submission"),sequence,lifecycleGeneration:this.lifecycleGeneration,rating:this.rating,detail:this.detail,detailFor:this.detailFor,previousRating,panelWasOpen};this.pendingSubmission=transaction,this.setPending(!0),this.dispatchingSubmission=transaction;const event=this.emit("lr-feedback-submit",{...detail,submissionId:transaction.submissionId},{cancelable:!0});if(this.dispatchingSubmission===transaction&&(this.dispatchingSubmission=void 0),!!this.isCurrentPendingSubmission(transaction)){if(transaction.settlement){this.commitSettlement(transaction,transaction.settlement);return}event.defaultPrevented||this.commitSettlement(transaction,"finalize")}}renderThumb(direction){const pressed=this.rating===direction,canExpand=this.detailApplies(direction)&&this.hasDetailContent;return html`
15
15
  <button
16
16
  part=${direction==="up"?"up-button":"down-button"}
17
17
  type="button"
@@ -10,6 +10,9 @@ export type MessagePartsContentMode='plain'|'markdown';export interface LyraMess
10
10
  * citation ranks, retry payloads, and error announcements all consume that same projection.
11
11
  * Streaming text and reasoning parts forward that state into their nested Markdown renderer, so
12
12
  * parsing/highlighting coalesces until the same-id part becomes complete.
13
+ * Streaming text and reasoning show accumulated plain text; Markdown parsing and syntax
14
+ * highlighting wait until that part completes.
15
+ *
13
16
  * Citation ranks are derived in one linear render prepass, including for mixed streaming arrays.
14
17
  *
15
18
  * Public collection properties take bounded, clone-owned readonly snapshots. Create a new
@@ -20,7 +20,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
20
20
  >
21
21
  ${rows.length===0?html`<div part="empty" role="option" aria-selected="false" aria-disabled="true">${emptyText}</div>`:this.renderRows(rows,activeId)}
22
22
  </div>
23
- `}get hasVisibleLabel(){return this.label.length>0||this.slotPresence.has("label")}renderLabel(){return html`<label part="form-control-label" for=${this.controlId} ?hidden=${!this.hasVisibleLabel}
23
+ `}get hasVisibleLabel(){return(this.label??"").length>0||this.slotPresence.has("label")}renderLabel(){return html`<label part="form-control-label" for=${this.controlId} ?hidden=${!this.hasVisibleLabel}
24
24
  >${this.label}<slot name="label"></slot></label
25
25
  >`}renderHintError(hasError,hasHint){return html`
26
26
  <div id="model-select-error" part="error" ?hidden=${!hasError}>
@@ -29,7 +29,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
29
29
  <div id="model-select-hint" part="hint" ?hidden=${!hasHint}>
30
30
  ${this.hint}<slot name="hint"></slot>
31
31
  </div>
32
- `}renderClosed(){const rows=this.effectiveEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasValue=this.value.length>0,hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||this.hint.length>0,hasError=this.slotPresence.has("error")||this.errorText.length>0,describedBy=[hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
32
+ `}renderClosed(){const rows=this.effectiveEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasValue=this.value.length>0,hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
33
33
  ${this.renderLabel()}
34
34
  <button
35
35
  id=${this.controlId}
@@ -59,7 +59,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
59
59
  </button>
60
60
  ${this.renderListbox(rows,activeId,this.localize("modelSelectNoModels"))}
61
61
  ${this.renderHintError(hasError,hasHint)}
62
- `}renderFreeText(){const rows=this.filteredEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||this.hint.length>0,hasError=this.slotPresence.has("error")||this.errorText.length>0,describedBy=[hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
62
+ `}renderFreeText(){const rows=this.filteredEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
63
63
  ${this.renderLabel()}
64
64
  <div part="combobox" @mousedown=${this.onComboMouseDown}>
65
65
  ${this.provider?html`<span part="provider-badge">${this.provider}</span>`:""}
@@ -47,7 +47,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
47
47
  >`:nothing}
48
48
  ${this.rowActions.length>0||this.renderActions?this.renderRowActions(thread):nothing}
49
49
  </lr-conversation-item>
50
- `;return this.wrapRow?html`<div part="row-wrapper">${this.wrapRow(source,row)}</div>`:row},this.renderItem=item=>{const listItem=item;return listItem.kind==="group"?this.renderGroupHeader(listItem):this.renderRow(listItem.thread)},this.renderStickyGroup=group=>{const item=this.stickyGroupItems.get(String(group.key));return item?this.renderGroupHeader(item,{sticky:!0}):nothing},this.itemKey=item=>{const listItem=item;return listItem.kind==="group"?this.groupItemKey(listItem.id):this.threadItemKey(listItem.thread.id)},this.onDefaultSlotChange=e=>{const assigned=e.target.assignedElements({flatten:!0}),keep=new Set(assigned);this.restoreInjectedListItemRoles(keep),this.markAsListItems(assigned),this.hasDefaultSlotContent=assigned.length>0},this.onSlottedSelect=e=>{e.stopPropagation()},this.onEmptySlotChange=e=>{this.hasEmptySlot=e.target.assignedElements({flatten:!0}).length>0}}static{this.defaultStrings={...super.defaultStrings,archiveConversation:LYRA_DEFAULT_archiveConversation,deleteConversation:LYRA_DEFAULT_deleteConversation,noMatches:LYRA_DEFAULT_noMatches,pinConversation:LYRA_DEFAULT_pinConversation,searchThreads:LYRA_DEFAULT_searchThreads,threadGroupArchived:LYRA_DEFAULT_threadGroupArchived,threadGroupCollapse:LYRA_DEFAULT_threadGroupCollapse,threadGroupExpand:LYRA_DEFAULT_threadGroupExpand,threadGroupPinned:LYRA_DEFAULT_threadGroupPinned,threadGroupPrevious30Days:LYRA_DEFAULT_threadGroupPrevious30Days,threadGroupPrevious7Days:LYRA_DEFAULT_threadGroupPrevious7Days,threadGroupToday:LYRA_DEFAULT_threadGroupToday,threadGroupYesterday:LYRA_DEFAULT_threadGroupYesterday,threadListEmpty:LYRA_DEFAULT_threadListEmpty,threadListLabel:LYRA_DEFAULT_threadListLabel,threadListMatchAnnounce:LYRA_DEFAULT_threadListMatchAnnounce,unarchiveConversation:LYRA_DEFAULT_unarchiveConversation,unpinConversation:LYRA_DEFAULT_unpinConversation}}static{this.ownedCollectionProperties=Object.freeze(["threads","groupOrder","collapsedGroupIds","rowActions"])}static{this.identityCollectionProperties=Object.freeze(["threads"])}static{this.styles=[LyraElement.styles,styles]}get dataMode(){return this.normalizedThreads.length>0||!this.hasDefaultSlotContent}connectedCallback(){if(super.connectedCallback(),this.hasUpdated){const defaultSlotted=this.defaultSlottedElements();this.hasDefaultSlotContent=defaultSlotted.length>0,this.normalizedThreads.length===0&&this.markAsListItems(defaultSlotted)}}willUpdate(changed){super.willUpdate(changed),(changed.has("threads")||changed.has("searchText")||changed.has("filter")||changed.has("grouping")||changed.has("groupBy")||changed.has("groupOrder")||changed.has("collapsedGroupIds")||changed.has("showArchived"))&&this.focusTaskGeneration++;const syncSlottedContent=()=>{const defaultSlotted=this.defaultSlottedElements();this.hasDefaultSlotContent=defaultSlotted.length>0;const hasDataThreads=this.normalizedThreads.length>0;hasDataThreads&&defaultSlotted.length>0?(this.restoreInjectedListItemRoles(),devWarnOnce(THREADS_AND_SLOTTED_CONTENT_WARNING_KEY,THREADS_AND_SLOTTED_CONTENT_WARNING)):hasDataThreads||this.markAsListItems(defaultSlotted)};this.hasUpdated?changed.has("threads")&&syncSlottedContent():this.seedFirstRenderState(()=>{this.hasEmptySlot=Array.from(this.children).some(el=>el.getAttribute("slot")==="empty"),syncSlottedContent()})}defaultSlottedElements(){return Array.from(this.children).filter(el=>!el.hasAttribute("slot"))}markAsListItems(elements){for(const el of elements)el.hasAttribute("role")||(el.setAttribute("role","listitem"),this.injectedListItemRoles.add(el))}restoreInjectedListItemRoles(keep=new Set){for(const element of this.injectedListItemRoles)keep.has(element)||(element.getAttribute("role")==="listitem"&&element.removeAttribute("role"),this.injectedListItemRoles.delete(element))}disconnectedCallback(){this.focusTaskGeneration++,this.restoreInjectedListItemRoles(),super.disconnectedCallback()}get normalizedThreads(){const seen=new Set;return canonicalThreads(this.threads).filter(thread=>seen.has(thread.id)?!1:(seen.add(thread.id),!0))}sourceThread(thread){return sourceThreadByProjection.get(thread)??thread}sourceThreads(threads){return Object.freeze(threads.map(thread=>this.sourceThread(thread)))}get visibleThreads(){const q=this.searchText.trim().toLocaleLowerCase(this.effectiveLocale),withArchiveFilter=this.normalizedThreads.filter(thread=>this.showArchived||!thread.archived);return q===""?withArchiveFilter:withArchiveFilter.filter(t=>this.filter?this.filter(this.sourceThread(t),q):defaultFilter(t,q,this.effectiveLocale))}bucketFor(thread,now){if(thread.archived)return"archived";if(thread.pinned)return"pinned";const ts=thread.timestamp===void 0?void 0:normalizeLyraTimestamp(thread.timestamp);if(!ts)return"previous30";const dayMs=864e5,startOfDay=d=>new Date(d.getFullYear(),d.getMonth(),d.getDate()).getTime(),diffDays=Math.round((startOfDay(now)-startOfDay(ts))/dayMs);return diffDays===0?"today":diffDays===1?"yesterday":diffDays<=7?"previous7":diffDays<=30?"previous30":`month:${ts.getFullYear()}-${String(ts.getMonth()+1).padStart(2,"0")}`}bucketLabel(key){const groupDate=key.startsWith("month:")?this.dateForBucket(key):void 0;switch(key){case"pinned":return this.localize("threadGroupPinned");case"today":return this.localize("threadGroupToday");case"yesterday":return this.localize("threadGroupYesterday");case"previous7":return this.localize("threadGroupPrevious7Days");case"previous30":return this.localize("threadGroupPrevious30Days");case"archived":return this.localize("threadGroupArchived");default:return this.formatDate?.(groupDate)??getDateTimeFormat(this.effectiveLocale,{month:"long",year:"numeric"}).format(groupDate)}}dateForBucket(key){if(!key.startsWith("month:"))return;const[,ym]=key.split(":"),[year,month]=ym.split("-").map(Number);return new Date(year,month-1,1)}orderedCustomGroupIds(grouped){const firstSeen=[...grouped.keys()];if(typeof this.groupOrder=="function")try{return[...firstSeen].sort(this.groupOrder)}catch{return firstSeen}if(!this.groupOrder)return firstSeen;const ordered=[...new Set(this.groupOrder)].filter(id=>grouped.has(id)),listed=new Set(ordered);return[...ordered,...firstSeen.filter(id=>!listed.has(id))]}groupedItems(grouped,order,contextFor,defaultLabel){const collapsedIds=new Set(this.collapsedGroupIds),items=[];for(const id of order){const groupedThreads=grouped.get(id);if(!groupedThreads||groupedThreads.length===0)continue;const context=contextFor(id,groupedThreads),label=this.getGroupLabel?.(context)??defaultLabel(context);items.push({kind:"group",id,label,adornment:this.renderGroupAdornment?.(context),collapsed:collapsedIds.has(id)}),collapsedIds.has(id)||items.push(...groupedThreads.map(thread=>({kind:"thread",thread})))}return items}buildItems(visible){if(this.grouping==="none")return visible.map(thread=>({kind:"thread",thread}));if(this.grouping==="custom"){if(!this.groupBy)return visible.map(thread=>({kind:"thread",thread}));const grouped2=new Map;for(const thread of visible){let id;try{id=this.groupBy(this.sourceThread(thread))}catch{continue}if(typeof id!="string"||id.trim().length===0)continue;const existing=grouped2.get(id);existing?existing.push(thread):grouped2.set(id,[thread])}return this.groupedItems(grouped2,this.orderedCustomGroupIds(grouped2),(id,groupedThreads)=>({id,threads:this.sourceThreads(groupedThreads)}),context=>context.id)}const now=new Date,grouped=new Map,monthKeys=new Set;for(const thread of visible){const id=this.bucketFor(thread,now),existing=grouped.get(id);existing?existing.push(thread):grouped.set(id,[thread]),id.startsWith("month:")&&monthKeys.add(id)}const order=["pinned","today","yesterday","previous7","previous30",...[...monthKeys].sort().reverse(),"archived"];return this.groupedItems(grouped,order,(id,groupedThreads)=>{const bucket=id;return{id,threads:this.sourceThreads(groupedThreads),bucket,date:bucket.startsWith("month:")?this.dateForBucket(bucket):void 0}},context=>this.bucketLabel(context.bucket))}announceMatchCount(count){this.searchText.trim()!==""&&this.liveRegion?.announce(this.localize("threadListMatchAnnounce",void 0,{count:getNumberFormat(this.effectiveLocale).format(count),pluralCount:count}))}rowElements(){return this.dataMode?(this.virtualListEl?.renderedRows??[]).flatMap(row=>[...row.querySelectorAll("lr-conversation-item")]):[...this.querySelectorAll("lr-conversation-item")]}selectButtonEl(row){return row.shadowRoot?.querySelector('[part="select-button"]')??null}isNavigableRow(row){const option=this.selectButtonEl(row);return!!(option&&option.getAttribute("role")==="button"&&row.hidden===!1&&row.getAttribute("aria-hidden")!=="true"&&row.getAttribute("aria-disabled")!=="true"&&!row.inert&&row.closest("[inert]")===null&&option.hidden===!1&&option.getAttribute("aria-hidden")!=="true"&&option.getAttribute("aria-disabled")!=="true"&&!option.inert&&option.closest("[inert]")===null)}navigableRows(){return this.rowElements().filter(row=>this.isNavigableRow(row))}focusedRowIndex(rows){return rows.findIndex(row=>activeElementIn(row.shadowRoot)!=null)}focusVirtualThreadFromItemIndex(list,items,initialItemIndex,direction,focusGeneration){(async()=>{let targetItemIndex=initialItemIndex;for(;targetItemIndex>=0&&targetItemIndex<items.length;){for(;items[targetItemIndex]?.kind==="group";)targetItemIndex+=direction;const targetItem=items[targetItemIndex];if(!targetItem||targetItem.kind!=="thread")return;const targetId=targetItem.thread.id;list.scrollToIndex(targetItemIndex,{align:"auto",behavior:"auto"});let targetRow;for(let attempt=0;attempt<2;attempt+=1){if(await new Promise(resolve=>{const view=this.ownerDocument.defaultView;view?view.requestAnimationFrame(()=>resolve()):requestAnimationFrame(()=>resolve())}),focusGeneration!==this.focusTaskGeneration||!this.isConnected||this.virtualListEl!==list||(await list.updateComplete,focusGeneration!==this.focusTaskGeneration||!this.isConnected||this.virtualListEl!==list))return;if(targetRow=this.rowElements().find(row=>row.conversationId===targetId),targetRow)break}if(targetRow&&this.isNavigableRow(targetRow)){this.selectButtonEl(targetRow)?.focus();return}targetItemIndex+=direction}})()}renderRowActions(thread){const source=this.sourceThread(thread);return html`
50
+ `;return this.wrapRow?html`<div part="row-wrapper">${this.wrapRow(source,row)}</div>`:row},this.renderItem=item=>{const listItem=item;return listItem.kind==="group"?this.renderGroupHeader(listItem):this.renderRow(listItem.thread)},this.renderStickyGroup=group=>{const item=this.stickyGroupItems.get(String(group.key));return item?this.renderGroupHeader(item,{sticky:!0}):nothing},this.itemKey=item=>{const listItem=item;return listItem.kind==="group"?this.groupItemKey(listItem.id):this.threadItemKey(listItem.thread.id)},this.onDefaultSlotChange=e=>{const assigned=e.target.assignedElements({flatten:!0}),keep=new Set(assigned);this.restoreInjectedListItemRoles(keep),this.markAsListItems(assigned),this.hasDefaultSlotContent=assigned.length>0},this.onSlottedSelect=e=>{e.stopPropagation()},this.onEmptySlotChange=e=>{this.hasEmptySlot=e.target.assignedElements({flatten:!0}).length>0}}static{this.defaultStrings={...super.defaultStrings,archiveConversation:LYRA_DEFAULT_archiveConversation,deleteConversation:LYRA_DEFAULT_deleteConversation,noMatches:LYRA_DEFAULT_noMatches,pinConversation:LYRA_DEFAULT_pinConversation,searchThreads:LYRA_DEFAULT_searchThreads,threadGroupArchived:LYRA_DEFAULT_threadGroupArchived,threadGroupCollapse:LYRA_DEFAULT_threadGroupCollapse,threadGroupExpand:LYRA_DEFAULT_threadGroupExpand,threadGroupPinned:LYRA_DEFAULT_threadGroupPinned,threadGroupPrevious30Days:LYRA_DEFAULT_threadGroupPrevious30Days,threadGroupPrevious7Days:LYRA_DEFAULT_threadGroupPrevious7Days,threadGroupToday:LYRA_DEFAULT_threadGroupToday,threadGroupYesterday:LYRA_DEFAULT_threadGroupYesterday,threadListEmpty:LYRA_DEFAULT_threadListEmpty,threadListLabel:LYRA_DEFAULT_threadListLabel,threadListMatchAnnounce:LYRA_DEFAULT_threadListMatchAnnounce,unarchiveConversation:LYRA_DEFAULT_unarchiveConversation,unpinConversation:LYRA_DEFAULT_unpinConversation}}static{this.ownedCollectionProperties=Object.freeze(["threads","groupOrder","collapsedGroupIds","rowActions"])}static{this.identityCollectionProperties=Object.freeze(["threads"])}static{this.styles=[LyraElement.styles,styles]}get dataMode(){return this.normalizedThreads.length>0||!this.hasDefaultSlotContent}connectedCallback(){if(super.connectedCallback(),this.hasUpdated){const defaultSlotted=this.defaultSlottedElements();this.hasDefaultSlotContent=defaultSlotted.length>0,this.normalizedThreads.length===0&&this.markAsListItems(defaultSlotted)}}willUpdate(changed){super.willUpdate(changed),(changed.has("threads")||changed.has("searchText")||changed.has("filter")||changed.has("grouping")||changed.has("groupBy")||changed.has("groupOrder")||changed.has("collapsedGroupIds")||changed.has("showArchived"))&&this.focusTaskGeneration++;const syncSlottedContent=()=>{const defaultSlotted=this.defaultSlottedElements();this.hasDefaultSlotContent=defaultSlotted.length>0;const hasDataThreads=this.normalizedThreads.length>0;hasDataThreads&&defaultSlotted.length>0?(this.restoreInjectedListItemRoles(),devWarnOnce(THREADS_AND_SLOTTED_CONTENT_WARNING_KEY,THREADS_AND_SLOTTED_CONTENT_WARNING)):hasDataThreads||this.markAsListItems(defaultSlotted)};this.hasUpdated?changed.has("threads")&&syncSlottedContent():this.seedFirstRenderState(()=>{this.hasEmptySlot=Array.from(this.children).some(el=>el.getAttribute("slot")==="empty"),syncSlottedContent()})}defaultSlottedElements(){return Array.from(this.children).filter(el=>!el.getAttribute("slot"))}markAsListItems(elements){for(const el of elements)el.hasAttribute("role")||(el.setAttribute("role","listitem"),this.injectedListItemRoles.add(el))}restoreInjectedListItemRoles(keep=new Set){for(const element of this.injectedListItemRoles)keep.has(element)||(element.getAttribute("role")==="listitem"&&element.removeAttribute("role"),this.injectedListItemRoles.delete(element))}disconnectedCallback(){this.focusTaskGeneration++,this.restoreInjectedListItemRoles(),super.disconnectedCallback()}get normalizedThreads(){const seen=new Set;return canonicalThreads(this.threads).filter(thread=>seen.has(thread.id)?!1:(seen.add(thread.id),!0))}sourceThread(thread){return sourceThreadByProjection.get(thread)??thread}sourceThreads(threads){return Object.freeze(threads.map(thread=>this.sourceThread(thread)))}get visibleThreads(){const q=this.searchText.trim().toLocaleLowerCase(this.effectiveLocale),withArchiveFilter=this.normalizedThreads.filter(thread=>this.showArchived||!thread.archived);return q===""?withArchiveFilter:withArchiveFilter.filter(t=>this.filter?this.filter(this.sourceThread(t),q):defaultFilter(t,q,this.effectiveLocale))}bucketFor(thread,now){if(thread.archived)return"archived";if(thread.pinned)return"pinned";const ts=thread.timestamp===void 0?void 0:normalizeLyraTimestamp(thread.timestamp);if(!ts)return"previous30";const dayMs=864e5,startOfDay=d=>new Date(d.getFullYear(),d.getMonth(),d.getDate()).getTime(),diffDays=Math.round((startOfDay(now)-startOfDay(ts))/dayMs);return diffDays===0?"today":diffDays===1?"yesterday":diffDays<=7?"previous7":diffDays<=30?"previous30":`month:${ts.getFullYear()}-${String(ts.getMonth()+1).padStart(2,"0")}`}bucketLabel(key){const groupDate=key.startsWith("month:")?this.dateForBucket(key):void 0;switch(key){case"pinned":return this.localize("threadGroupPinned");case"today":return this.localize("threadGroupToday");case"yesterday":return this.localize("threadGroupYesterday");case"previous7":return this.localize("threadGroupPrevious7Days");case"previous30":return this.localize("threadGroupPrevious30Days");case"archived":return this.localize("threadGroupArchived");default:return this.formatDate?.(groupDate)??getDateTimeFormat(this.effectiveLocale,{month:"long",year:"numeric"}).format(groupDate)}}dateForBucket(key){if(!key.startsWith("month:"))return;const[,ym]=key.split(":"),[year,month]=ym.split("-").map(Number);return new Date(year,month-1,1)}orderedCustomGroupIds(grouped){const firstSeen=[...grouped.keys()];if(typeof this.groupOrder=="function")try{return[...firstSeen].sort(this.groupOrder)}catch{return firstSeen}if(!this.groupOrder)return firstSeen;const ordered=[...new Set(this.groupOrder)].filter(id=>grouped.has(id)),listed=new Set(ordered);return[...ordered,...firstSeen.filter(id=>!listed.has(id))]}groupedItems(grouped,order,contextFor,defaultLabel){const collapsedIds=new Set(this.collapsedGroupIds),items=[];for(const id of order){const groupedThreads=grouped.get(id);if(!groupedThreads||groupedThreads.length===0)continue;const context=contextFor(id,groupedThreads),label=this.getGroupLabel?.(context)??defaultLabel(context);items.push({kind:"group",id,label,adornment:this.renderGroupAdornment?.(context),collapsed:collapsedIds.has(id)}),collapsedIds.has(id)||items.push(...groupedThreads.map(thread=>({kind:"thread",thread})))}return items}buildItems(visible){if(this.grouping==="none")return visible.map(thread=>({kind:"thread",thread}));if(this.grouping==="custom"){if(!this.groupBy)return visible.map(thread=>({kind:"thread",thread}));const grouped2=new Map;for(const thread of visible){let id;try{id=this.groupBy(this.sourceThread(thread))}catch{continue}if(typeof id!="string"||id.trim().length===0)continue;const existing=grouped2.get(id);existing?existing.push(thread):grouped2.set(id,[thread])}return this.groupedItems(grouped2,this.orderedCustomGroupIds(grouped2),(id,groupedThreads)=>({id,threads:this.sourceThreads(groupedThreads)}),context=>context.id)}const now=new Date,grouped=new Map,monthKeys=new Set;for(const thread of visible){const id=this.bucketFor(thread,now),existing=grouped.get(id);existing?existing.push(thread):grouped.set(id,[thread]),id.startsWith("month:")&&monthKeys.add(id)}const order=["pinned","today","yesterday","previous7","previous30",...[...monthKeys].sort().reverse(),"archived"];return this.groupedItems(grouped,order,(id,groupedThreads)=>{const bucket=id;return{id,threads:this.sourceThreads(groupedThreads),bucket,date:bucket.startsWith("month:")?this.dateForBucket(bucket):void 0}},context=>this.bucketLabel(context.bucket))}announceMatchCount(count){this.searchText.trim()!==""&&this.liveRegion?.announce(this.localize("threadListMatchAnnounce",void 0,{count:getNumberFormat(this.effectiveLocale).format(count),pluralCount:count}))}rowElements(){return this.dataMode?(this.virtualListEl?.renderedRows??[]).flatMap(row=>[...row.querySelectorAll("lr-conversation-item")]):[...this.querySelectorAll("lr-conversation-item")]}selectButtonEl(row){return row.shadowRoot?.querySelector('[part="select-button"]')??null}isNavigableRow(row){const option=this.selectButtonEl(row);return!!(option&&option.getAttribute("role")==="button"&&row.hidden===!1&&row.getAttribute("aria-hidden")!=="true"&&row.getAttribute("aria-disabled")!=="true"&&!row.inert&&row.closest("[inert]")===null&&option.hidden===!1&&option.getAttribute("aria-hidden")!=="true"&&option.getAttribute("aria-disabled")!=="true"&&!option.inert&&option.closest("[inert]")===null)}navigableRows(){return this.rowElements().filter(row=>this.isNavigableRow(row))}focusedRowIndex(rows){return rows.findIndex(row=>activeElementIn(row.shadowRoot)!=null)}focusVirtualThreadFromItemIndex(list,items,initialItemIndex,direction,focusGeneration){(async()=>{let targetItemIndex=initialItemIndex;for(;targetItemIndex>=0&&targetItemIndex<items.length;){for(;items[targetItemIndex]?.kind==="group";)targetItemIndex+=direction;const targetItem=items[targetItemIndex];if(!targetItem||targetItem.kind!=="thread")return;const targetId=targetItem.thread.id;list.scrollToIndex(targetItemIndex,{align:"auto",behavior:"auto"});let targetRow;for(let attempt=0;attempt<2;attempt+=1){if(await new Promise(resolve=>{const view=this.ownerDocument.defaultView;view?view.requestAnimationFrame(()=>resolve()):requestAnimationFrame(()=>resolve())}),focusGeneration!==this.focusTaskGeneration||!this.isConnected||this.virtualListEl!==list||(await list.updateComplete,focusGeneration!==this.focusTaskGeneration||!this.isConnected||this.virtualListEl!==list))return;if(targetRow=this.rowElements().find(row=>row.conversationId===targetId),targetRow)break}if(targetRow&&this.isNavigableRow(targetRow)){this.selectButtonEl(targetRow)?.focus();return}targetItemIndex+=direction}})()}renderRowActions(thread){const source=this.sourceThread(thread);return html`
51
51
  <span slot="actions" part="row-actions">
52
52
  ${this.rowActions.includes("pin")?html`<button
53
53
  type="button"
@@ -29,6 +29,8 @@ text:string;interim?:boolean;timestamp?:LyraTimestamp;}export interface LyraTran
29
29
  * Public collection properties take bounded, clone-owned readonly snapshots. Create a new
30
30
  * collection and reassign it after changes; mutating the assigned array does not update the view.
31
31
  *
32
+ * Activating the focused jump action resumes follow and transfers focus to the scroll base when the action disappears, unless a newer outside focus move takes precedence.
33
+ *
32
34
  * @customElement lr-transcript-feed
33
35
  * @slot empty - Custom empty state. Default: the localized "No transcript yet".
34
36
  * @event lr-follow-change - `detail: { following: boolean }` — a user scroll or jump-button click
@@ -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}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{getDateTimeFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{styles}from"./transcript-feed.styles.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{normalizeLyraTimestamp}from"../timestamp.js";import{LYRA_DEFAULT_jumpToLatest,LYRA_DEFAULT_transcriptFeedEmpty,LYRA_DEFAULT_transcriptFeedInterim,LYRA_DEFAULT_transcriptFeedLabel}from"../../../internal/default-strings.generated.js";const NEAR_BOTTOM_PX=48;class LyraTranscriptFeed extends LyraElement{constructor(){super(...arguments),this.entries=[],this.follow=!0,this.showTimestamps=!1,this.maxRenderedEntries=500,this.sessionId="",this.accessibleLabel=null,this._isFirstUpdate=!0,this.announcedFinalIds=new Set,this.sessionChanged=!1,this.pendingSessionBaseline=!1,this.onScroll=e=>{const base=e.currentTarget,atBottom=base.scrollHeight-base.scrollTop-base.clientHeight<=NEAR_BOTTOM_PX;atBottom!==this.follow&&(this.follow=atBottom,this.emit("lr-follow-change",{following:atBottom}))},this.onJumpClick=()=>{const changed=!this.follow;this.scrollToBottom(),changed&&this.emit("lr-follow-change",{following:!0})}}static{this.defaultStrings={...super.defaultStrings,jumpToLatest:LYRA_DEFAULT_jumpToLatest,transcriptFeedEmpty:LYRA_DEFAULT_transcriptFeedEmpty,transcriptFeedInterim:LYRA_DEFAULT_transcriptFeedInterim,transcriptFeedLabel:LYRA_DEFAULT_transcriptFeedLabel}}static{this.ownedCollectionProperties=Object.freeze(["entries"])}static{this.styles=[LyraElement.styles,styles]}get effectiveMaxRenderedEntries(){return finiteCount(this.maxRenderedEntries,500)}get normalizedEntries(){const seen=new Set;return this.entries.filter(entry=>entry===null||typeof entry!="object"||typeof entry.id!="string"||entry.id.trim().length===0||typeof entry.text!="string"||seen.has(entry.id)?!1:(seen.add(entry.id),!0))}get renderedEntries(){const entries=this.normalizedEntries,maxRenderedEntries=this.effectiveMaxRenderedEntries;return maxRenderedEntries>0&&entries.length>maxRenderedEntries?entries.slice(-maxRenderedEntries):entries}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink()}disconnectedCallback(){super.disconnectedCallback(),this.releaseAnnouncementSink()}adoptedCallback(){super.adoptedCallback(),this.syncAnnouncementSink()}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}willUpdate(changed){super.willUpdate(changed),this._isFirstUpdate=!this.hasUpdated,this.sessionChanged=changed.has("sessionId")&&this.hasUpdated,this.sessionChanged&&(this.announcedFinalIds.clear(),this.pendingSessionBaseline=!0)}updated(changed){super.updated(changed),changed.has("entries")&&(this.follow&&this.scrollToBottom(),this.announceFinalizedEntries())}announceFinalizedEntries(){const alreadyAnnounced=this.announcedFinalIds,fresh=[];for(const entry of this.normalizedEntries)entry.interim||alreadyAnnounced.has(entry.id)||(alreadyAnnounced.add(entry.id),fresh.push(entry.text));const establishesBaseline=this._isFirstUpdate||this.sessionChanged||this.pendingSessionBaseline;if(this.pendingSessionBaseline=!1,establishesBaseline)return;const sink=this.announcementSink;if(sink)for(const text of fresh){const message=text.replace(/\s+/g," ").trim();message&&sink.announce(message)}}scrollToBottom(){this.follow=!0;const base=this.renderRoot.querySelector('[part="base"]');base&&(base.scrollTop=base.scrollHeight)}showSpeakerFor(list,index){const prev=list[index-1],current=list[index];return!prev||prev.speaker!==current.speaker}formatTs(value){const date=normalizeLyraTimestamp(value);return date?this.formatTimestamp?this.formatTimestamp(date):getDateTimeFormat(this.effectiveLocale,{hour:"numeric",minute:"2-digit"}).format(date):null}renderEntry(entry,showSpeaker,interim){const parts=["entry"];interim&&parts.push("interim");const timestamp=entry.timestamp==null?null:this.formatTs(entry.timestamp);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}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{getDateTimeFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{captureComposedFocusRepair,applyComposedFocusRepair}from"../../../internal/focus-navigation.js";import{styles}from"./transcript-feed.styles.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{normalizeLyraTimestamp}from"../timestamp.js";import{LYRA_DEFAULT_jumpToLatest,LYRA_DEFAULT_transcriptFeedEmpty,LYRA_DEFAULT_transcriptFeedInterim,LYRA_DEFAULT_transcriptFeedLabel}from"../../../internal/default-strings.generated.js";const NEAR_BOTTOM_PX=48;class LyraTranscriptFeed extends LyraElement{constructor(){super(...arguments),this.entries=[],this.follow=!0,this.showTimestamps=!1,this.maxRenderedEntries=500,this.sessionId="",this.accessibleLabel=null,this._isFirstUpdate=!0,this.announcedFinalIds=new Set,this.sessionChanged=!1,this.pendingSessionBaseline=!1,this.onScroll=e=>{const base=e.currentTarget,atBottom=base.scrollHeight-base.scrollTop-base.clientHeight<=NEAR_BOTTOM_PX;atBottom!==this.follow&&(this.follow=atBottom,this.emit("lr-follow-change",{following:atBottom}))},this.onJumpClick=()=>{const jump=this.renderRoot.querySelector('[part="jump-button"]'),base=this.renderRoot.querySelector('[part="base"]'),repair=jump?captureComposedFocusRepair(jump,base):null,changed=!this.follow;this.scrollToBottom(),changed&&this.emit("lr-follow-change",{following:!0}),repair&&this.updateComplete.then(()=>{this.isConnected&&this.follow&&applyComposedFocusRepair(repair)})}}static{this.defaultStrings={...super.defaultStrings,jumpToLatest:LYRA_DEFAULT_jumpToLatest,transcriptFeedEmpty:LYRA_DEFAULT_transcriptFeedEmpty,transcriptFeedInterim:LYRA_DEFAULT_transcriptFeedInterim,transcriptFeedLabel:LYRA_DEFAULT_transcriptFeedLabel}}static{this.ownedCollectionProperties=Object.freeze(["entries"])}static{this.styles=[LyraElement.styles,styles]}get effectiveMaxRenderedEntries(){return finiteCount(this.maxRenderedEntries,500)}get normalizedEntries(){const seen=new Set;return this.entries.filter(entry=>entry===null||typeof entry!="object"||typeof entry.id!="string"||entry.id.trim().length===0||typeof entry.text!="string"||seen.has(entry.id)?!1:(seen.add(entry.id),!0))}get renderedEntries(){const entries=this.normalizedEntries,maxRenderedEntries=this.effectiveMaxRenderedEntries;return maxRenderedEntries>0&&entries.length>maxRenderedEntries?entries.slice(-maxRenderedEntries):entries}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink()}disconnectedCallback(){super.disconnectedCallback(),this.releaseAnnouncementSink()}adoptedCallback(){super.adoptedCallback(),this.syncAnnouncementSink()}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}willUpdate(changed){super.willUpdate(changed),this._isFirstUpdate=!this.hasUpdated,this.sessionChanged=changed.has("sessionId")&&this.hasUpdated,this.sessionChanged&&(this.announcedFinalIds.clear(),this.pendingSessionBaseline=!0)}updated(changed){super.updated(changed),changed.has("entries")&&(this.follow&&this.scrollToBottom(),this.announceFinalizedEntries())}announceFinalizedEntries(){const alreadyAnnounced=this.announcedFinalIds,fresh=[];for(const entry of this.normalizedEntries)entry.interim||alreadyAnnounced.has(entry.id)||(alreadyAnnounced.add(entry.id),fresh.push(entry.text));const establishesBaseline=this._isFirstUpdate||this.sessionChanged||this.pendingSessionBaseline;if(this.pendingSessionBaseline=!1,establishesBaseline)return;const sink=this.announcementSink;if(sink)for(const text of fresh){const message=text.replace(/\s+/g," ").trim();message&&sink.announce(message)}}scrollToBottom(){this.follow=!0;const base=this.renderRoot.querySelector('[part="base"]');base&&(base.scrollTop=base.scrollHeight)}showSpeakerFor(list,index){const prev=list[index-1],current=list[index];return!prev||prev.speaker!==current.speaker}formatTs(value){const date=normalizeLyraTimestamp(value);return date?this.formatTimestamp?this.formatTimestamp(date):getDateTimeFormat(this.effectiveLocale,{hour:"numeric",minute:"2-digit"}).format(date):null}renderEntry(entry,showSpeaker,interim){const parts=["entry"];interim&&parts.push("interim");const timestamp=entry.timestamp==null?null:this.formatTs(entry.timestamp);return html`
2
2
  <div part=${parts.join(" ")} ?data-interim=${interim}>
3
3
  ${showSpeaker&&entry.speaker?html`<span part="speaker">${entry.speaker}</span>`:nothing}
4
4
  <span part="text" dir="auto">${entry.text}</span>
@@ -74,7 +74,8 @@ export declare class LyraTypingIndicator extends LyraElement{static styles:impor
74
74
  shape:TypingIndicatorShape;
75
75
  /** Accessible name, exposed via `role="status"`. Not re-announced on every
76
76
  * animation frame — only mount (and any later change to this property)
77
- * produces a new announcement. An empty or whitespace-only value falls
77
+ * produces a new announcement. Removing the attribute restores the localized fallback; an
78
+ * explicit host aria-label keeps precedence. An empty or whitespace-only value falls
78
79
  * back to the localized "Thinking…" copy (see
79
80
  * `accessibleLabel`) so the component never loses its accessible name. */
80
81
  label:string;
@@ -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}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./typing-indicator.styles.js";import{LYRA_DEFAULT_thinking}from"../../../internal/default-strings.generated.js";class LyraTypingIndicator extends LyraElement{constructor(){super(...arguments),this.shape="dots",this.label="",this.size="m",this.appliedAriaLabel=null,this.explicitAriaLabel=null}static{this.defaultStrings={...super.defaultStrings,thinking:LYRA_DEFAULT_thinking}}static{this.styles=[LyraElement.styles,styles,srOnly]}get accessibleLabel(){if(this.explicitAriaLabel!==null)return this.explicitAriaLabel;const trimmed=this.label.trim();return trimmed===""?this.localize("thinking"):trimmed}willUpdate(changed){super.willUpdate(changed),this.setAttribute("role","status");const currentAriaLabel=this.getAttribute("aria-label");currentAriaLabel!==this.appliedAriaLabel&&(this.explicitAriaLabel=currentAriaLabel),this.setAttribute("aria-label",this.accessibleLabel),this.appliedAriaLabel=this.accessibleLabel}render(){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}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./typing-indicator.styles.js";import{LYRA_DEFAULT_thinking}from"../../../internal/default-strings.generated.js";class LyraTypingIndicator extends LyraElement{constructor(){super(...arguments),this.shape="dots",this.label="",this.size="m",this.appliedAriaLabel=null,this.explicitAriaLabel=null}static{this.defaultStrings={...super.defaultStrings,thinking:LYRA_DEFAULT_thinking}}static{this.styles=[LyraElement.styles,styles,srOnly]}get accessibleLabel(){if(this.explicitAriaLabel!==null)return this.explicitAriaLabel;const trimmed=(this.label??"").trim();return trimmed===""?this.localize("thinking"):trimmed}willUpdate(changed){super.willUpdate(changed),this.setAttribute("role","status");const currentAriaLabel=this.getAttribute("aria-label");currentAriaLabel!==this.appliedAriaLabel&&(this.explicitAriaLabel=currentAriaLabel),this.setAttribute("aria-label",this.accessibleLabel),this.appliedAriaLabel=this.accessibleLabel}render(){return html`
2
2
  <span part="base" aria-hidden="true">${this.renderShape()}</span>
3
3
  <span class="sr-only">${this.accessibleLabel}</span>
4
4
  `}renderShape(){switch(this.shape){case"pulse":return html`<span part="pulse"></span>`;case"cursor":return html`<span part="cursor"></span>`;default:return html`<span part="dot"></span><span part="dot"></span><span part="dot"></span>`}}}__decorate([property({reflect:!0})],LyraTypingIndicator.prototype,"shape",void 0),__decorate([property()],LyraTypingIndicator.prototype,"label",void 0),__decorate([property({reflect:!0})],LyraTypingIndicator.prototype,"size",void 0);export{LyraTypingIndicator};
@@ -0,0 +1,3 @@
1
+ import type{LyraElement}from'../../../internal/lyra-element.js';import{type OverlayHandle}from'../../../internal/nonmodal-overlay-manager.js';import type{OverlayOrderReservation}from'../../../internal/overlay-order.js';export type UsageBadgeOverlayHandle=Pick<OverlayHandle,'deactivate'|'isTopmost'>;
2
+ /** Loads only for an open badge; no modal inerting, scroll lock, or automatic focus movement. */
3
+ export declare function activateUsageBadgeOverlay(host:LyraElement,onEscape:()=>void,orderReservation?:OverlayOrderReservation):UsageBadgeOverlayHandle|undefined;
@@ -0,0 +1 @@
1
+ import{deferredPlace as place}from"../../../internal/anchored-overlay-runtime.js";import{activateNonmodalOverlay}from"../../../internal/nonmodal-overlay-manager.js";import{RenderedStateController}from"../../../internal/rendered-state.js";function activateUsageBadgeOverlay(host,onEscape,orderReservation){const anchor=host.renderRoot.querySelector('[part="base"]'),panel=()=>host.renderRoot.querySelector('[part="tooltip"]'),popup=panel();if(!anchor||!popup)return;const cleanupPositioner=place(anchor,popup,{placement:"top-start"}),handle=activateNonmodalOverlay({host,panel,onEscape,orderReservation,beforeInitialFocus:()=>!1,restoreFocusTo:null}),renderedState=new RenderedStateController(host,panel,rendered=>{handle.isActive()&&(rendered?handle.resume():handle.suspend())});return handle.isActive()&&renderedState.start(),{deactivate:options=>(cleanupPositioner?.(),renderedState.stop(),handle.deactivate(options)),isTopmost:()=>(renderedState.check(),handle.isTopmost())}}export{activateUsageBadgeOverlay};
@@ -22,6 +22,8 @@ import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from
22
22
  * visual density on every other component that spells it, so the name was moved to what it
23
23
  * actually does. A stale `compact` attribute is inert.
24
24
  *
25
+ * Removing cost-text or summary safely omits that content; explicit empty values remain empty and later values restore it. An open tooltip participates in shared Escape ordering even while only hovered, and dismissal preserves focus elsewhere.
26
+ *
25
27
  * @customElement lr-usage-badge
26
28
  * @slot summary - Visible summary shown when no built-in segment is set. The `summary` property is
27
29
  * its text fallback. A details-only badge without either form of summary remains non-focusable.
@@ -63,7 +65,7 @@ formatLatency?:(ms:number)=>string;
63
65
  * when set; the tooltip always shows full grouped figures regardless. Named for the number
64
66
  * formatting it selects, not for density: `compact` means visual density on twenty other
65
67
  * components in this library, and this one has no density mode at all. */
66
- abbreviate:boolean;private tooltipOpen;private hasDetailsSlot;private hasSummarySlot;private detailsText;private readonly tooltipId;private cleanupPositioner?;private hovering;private focused;protected willUpdate(changed:PropertyValues<this>):void;protected updated(changed:PropertyValues):void;disconnectedCallback():void;private onDetailsSlotChange;private onSummarySlotChange;private get hasTokensIn();private get hasTokensOut();private get hasCost();
68
+ abbreviate:boolean;private tooltipOpen;private hasDetailsSlot;private hasSummarySlot;private detailsText;private readonly tooltipId;private tooltipOverlay?;private tooltipRuntime?;private tooltipOrder?;private tooltipOpening?;private hovering;private focused;protected willUpdate(changed:PropertyValues<this>):void;protected updated(changed:PropertyValues):void;disconnectedCallback():void;private onDetailsSlotChange;private onSummarySlotChange;private get hasTokensIn();private get hasTokensOut();private get hasCost();
67
69
  /** `latencyMs` normalized to a finite, non-negative duration -- `undefined` while unset or
68
70
  * non-finite (the `latency` segment/tooltip row is omitted entirely). */
69
- private get validLatencyMs();private get hasLatency();private get hasVisibleContent();private get hasVisibleSummary();private get hasDisplayContent();private get hasTooltipContent();private get hasInteractiveTooltip();private formatTokenCount;private formatTokenCountFull;private localizedDuration;private showTooltip;private hideTooltip;private closeTooltipLifecycle;private onMouseEnter;private onMouseLeave;private onFocus;private onBlur;private onKeyDown;render():TemplateResult;private renderBadgeContent;}declare global{interface HTMLElementTagNameMap{'lr-usage-badge':LyraUsageBadge;}}
71
+ private get validLatencyMs();private get hasLatency();private get hasVisibleContent();private get hasVisibleSummary();private get hasDisplayContent();private get hasTooltipContent();private get hasInteractiveTooltip();private formatTokenCount;private formatTokenCountFull;private localizedDuration;private loadTooltipOverlayRuntime;protected getUpdateComplete():Promise<boolean>;private waitForTooltipOpening;private cancelTooltipOpening;private showTooltip;private hideTooltip;private closeTooltipLifecycle;private onMouseEnter;private onMouseLeave;private onFocus;private onBlur;private onKeyDown;render():TemplateResult;private renderBadgeContent;}declare global{interface HTMLElementTagNameMap{'lr-usage-badge':LyraUsageBadge;}}
@@ -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,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{deferredPlace as place}from"../../../internal/anchored-overlay-runtime.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{styles}from"./usage-badge.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{durationMessageValue}from"../../../internal/duration.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_tokensIn,LYRA_DEFAULT_tokensOut,LYRA_DEFAULT_usageBadgeCostLabel,LYRA_DEFAULT_usageBadgeLabel,LYRA_DEFAULT_usageBadgeLatencyLabel,LYRA_DEFAULT_usageBadgeTokensIn,LYRA_DEFAULT_usageBadgeTokensInLabel,LYRA_DEFAULT_usageBadgeTokensOut,LYRA_DEFAULT_usageBadgeTokensOutLabel,LYRA_DEFAULT_usageBadgeTotalTokensLabel}from"../../../internal/default-strings.generated.js";class LyraUsageBadge extends LyraElement{constructor(){super(...arguments),this.costText="",this.summary="",this.abbreviate=!1,this.tooltipOpen=!1,this.hasDetailsSlot=!1,this.hasSummarySlot=!1,this.detailsText="",this.tooltipId=nextId("usage-badge-tooltip"),this.hovering=!1,this.focused=!1,this.onDetailsSlotChange=e=>{const assigned=e.target.assignedElements({flatten:!0});this.hasDetailsSlot=assigned.length>0,this.detailsText=assigned.slice(0,64).map(element=>{const renderedText=element.innerText;return typeof renderedText=="string"?renderedText:element.textContent??""}).join(" ").replace(/\s+/g," ").trim().slice(0,4096),this.hasInteractiveTooltip||this.closeTooltipLifecycle()},this.onSummarySlotChange=e=>{this.hasSummarySlot=e.target.assignedElements({flatten:!0}).length>0,this.hasInteractiveTooltip||this.closeTooltipLifecycle()},this.onMouseEnter=()=>{this.hovering=!0,this.showTooltip()},this.onMouseLeave=()=>{this.hovering=!1,!this.focused&&this.hideTooltip()},this.onFocus=()=>{this.focused=!0,this.showTooltip()},this.onBlur=()=>{this.focused=!1,!this.hovering&&this.hideTooltip()},this.onKeyDown=e=>{e.key==="Escape"&&this.tooltipOpen&&(e.stopPropagation(),this.hideTooltip())}}static{this.defaultStrings={...super.defaultStrings,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,tokensIn:LYRA_DEFAULT_tokensIn,tokensOut:LYRA_DEFAULT_tokensOut,usageBadgeCostLabel:LYRA_DEFAULT_usageBadgeCostLabel,usageBadgeLabel:LYRA_DEFAULT_usageBadgeLabel,usageBadgeLatencyLabel:LYRA_DEFAULT_usageBadgeLatencyLabel,usageBadgeTokensIn:LYRA_DEFAULT_usageBadgeTokensIn,usageBadgeTokensInLabel:LYRA_DEFAULT_usageBadgeTokensInLabel,usageBadgeTokensOut:LYRA_DEFAULT_usageBadgeTokensOut,usageBadgeTokensOutLabel:LYRA_DEFAULT_usageBadgeTokensOutLabel,usageBadgeTotalTokensLabel:LYRA_DEFAULT_usageBadgeTotalTokensLabel}}static{this.styles=[LyraElement.styles,styles,srOnly]}willUpdate(changed){super.willUpdate(changed),this.seedFirstRenderState(()=>{const children=Array.from(this.children);this.hasDetailsSlot=children.some(child=>child.getAttribute("slot")==="details"),this.hasSummarySlot=children.some(child=>child.getAttribute("slot")==="summary")}),this.hasUpdated&&(changed.has("tokensIn")||changed.has("tokensOut")||changed.has("costText")||changed.has("latencyMs")||changed.has("summary"))&&!this.hasInteractiveTooltip&&this.closeTooltipLifecycle()}updated(changed){if(super.updated(changed),changed.has("tooltipOpen")&&(this.cleanupPositioner?.(),this.cleanupPositioner=void 0,this.tooltipOpen)){const anchor=this.renderRoot.querySelector('[part="base"]'),tooltip=this.renderRoot.querySelector('[part="tooltip"]');anchor&&tooltip&&(this.cleanupPositioner=place(anchor,tooltip,{placement:"top-start"}))}}disconnectedCallback(){super.disconnectedCallback(),this.cleanupPositioner?.(),this.cleanupPositioner=void 0,this.tooltipOpen=!1,this.hovering=!1,this.focused=!1}get hasTokensIn(){return this.tokensIn!=null&&Number.isFinite(this.tokensIn)}get hasTokensOut(){return this.tokensOut!=null&&Number.isFinite(this.tokensOut)}get hasCost(){return this.costText.length>0}get validLatencyMs(){if(!(this.latencyMs==null||!Number.isFinite(this.latencyMs)))return finiteRange(this.latencyMs,this.latencyMs,0)}get hasLatency(){return this.validLatencyMs!==void 0}get hasVisibleContent(){return this.hasTokensIn||this.hasTokensOut||this.hasCost||this.hasLatency}get hasVisibleSummary(){return this.summary.length>0||this.hasSummarySlot}get hasDisplayContent(){return this.hasVisibleContent||this.hasVisibleSummary}get hasTooltipContent(){return this.hasVisibleContent||this.hasDetailsSlot}get hasInteractiveTooltip(){return this.hasDisplayContent&&this.hasTooltipContent}formatTokenCount(n){return getNumberFormat(this.effectiveLocale,this.abbreviate?{notation:"compact"}:{}).format(n)}formatTokenCountFull(n){return getNumberFormat(this.effectiveLocale).format(n)}localizedDuration(ms){if(this.formatLatency)return this.formatLatency(ms);const duration=durationMessageValue(ms),value=getNumberFormat(this.effectiveLocale,{maximumFractionDigits:duration.key==="durationMilliseconds"?0:1}).format(duration.value);return this.localize(duration.key,void 0,{value})}showTooltip(){!this.hasInteractiveTooltip||this.tooltipOpen||(this.tooltipOpen=!0)}hideTooltip(){this.tooltipOpen&&(this.tooltipOpen=!1)}closeTooltipLifecycle(){this.tooltipOpen=!1,this.hovering=!1,this.focused=!1,this.cleanupPositioner?.(),this.cleanupPositioner=void 0}render(){const interactive=this.hasInteractiveTooltip,tokensIn=this.hasTokensIn?finiteCount(this.tokensIn):void 0,tokensOut=this.hasTokensOut?finiteCount(this.tokensOut):void 0,hasBoth=tokensIn!==void 0&&tokensOut!==void 0;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,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{reserveOverlayOrder}from"../../../internal/overlay-order.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{styles}from"./usage-badge.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{durationMessageValue}from"../../../internal/duration.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_tokensIn,LYRA_DEFAULT_tokensOut,LYRA_DEFAULT_usageBadgeCostLabel,LYRA_DEFAULT_usageBadgeLabel,LYRA_DEFAULT_usageBadgeLatencyLabel,LYRA_DEFAULT_usageBadgeTokensIn,LYRA_DEFAULT_usageBadgeTokensInLabel,LYRA_DEFAULT_usageBadgeTokensOut,LYRA_DEFAULT_usageBadgeTokensOutLabel,LYRA_DEFAULT_usageBadgeTotalTokensLabel}from"../../../internal/default-strings.generated.js";class LyraUsageBadge extends LyraElement{constructor(){super(...arguments),this.costText="",this.summary="",this.abbreviate=!1,this.tooltipOpen=!1,this.hasDetailsSlot=!1,this.hasSummarySlot=!1,this.detailsText="",this.tooltipId=nextId("usage-badge-tooltip"),this.hovering=!1,this.focused=!1,this.onDetailsSlotChange=e=>{const assigned=e.target.assignedElements({flatten:!0});this.hasDetailsSlot=assigned.length>0,this.detailsText=assigned.slice(0,64).map(element=>{const renderedText=element.innerText;return typeof renderedText=="string"?renderedText:element.textContent??""}).join(" ").replace(/\s+/g," ").trim().slice(0,4096),this.hasInteractiveTooltip||this.closeTooltipLifecycle()},this.onSummarySlotChange=e=>{this.hasSummarySlot=e.target.assignedElements({flatten:!0}).length>0,this.hasInteractiveTooltip||this.closeTooltipLifecycle()},this.onMouseEnter=()=>{this.hovering=!0,this.showTooltip()},this.onMouseLeave=()=>{this.hovering=!1,!this.focused&&this.hideTooltip()},this.onFocus=()=>{this.focused=!0,this.showTooltip()},this.onBlur=()=>{this.focused=!1,!this.hovering&&this.hideTooltip()},this.onKeyDown=e=>{e.key!=="Escape"||e.isComposing||e.keyCode===229||(this.tooltipOpening&&this.cancelTooltipOpening(),this.tooltipOpen&&this.tooltipOverlay?.isTopmost()&&(e.stopPropagation(),this.hideTooltip()))}}static{this.defaultStrings={...super.defaultStrings,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,tokensIn:LYRA_DEFAULT_tokensIn,tokensOut:LYRA_DEFAULT_tokensOut,usageBadgeCostLabel:LYRA_DEFAULT_usageBadgeCostLabel,usageBadgeLabel:LYRA_DEFAULT_usageBadgeLabel,usageBadgeLatencyLabel:LYRA_DEFAULT_usageBadgeLatencyLabel,usageBadgeTokensIn:LYRA_DEFAULT_usageBadgeTokensIn,usageBadgeTokensInLabel:LYRA_DEFAULT_usageBadgeTokensInLabel,usageBadgeTokensOut:LYRA_DEFAULT_usageBadgeTokensOut,usageBadgeTokensOutLabel:LYRA_DEFAULT_usageBadgeTokensOutLabel,usageBadgeTotalTokensLabel:LYRA_DEFAULT_usageBadgeTotalTokensLabel}}static{this.styles=[LyraElement.styles,styles,srOnly]}willUpdate(changed){super.willUpdate(changed),this.seedFirstRenderState(()=>{const children=Array.from(this.children);this.hasDetailsSlot=children.some(child=>child.getAttribute("slot")==="details"),this.hasSummarySlot=children.some(child=>child.getAttribute("slot")==="summary")}),this.hasUpdated&&(changed.has("tokensIn")||changed.has("tokensOut")||changed.has("costText")||changed.has("latencyMs")||changed.has("summary"))&&!this.hasInteractiveTooltip&&this.closeTooltipLifecycle()}updated(changed){super.updated(changed),changed.has("tooltipOpen")&&(this.tooltipOverlay?.deactivate({restoreFocus:!1}),this.tooltipOverlay=void 0,this.tooltipOpen&&this.isConnected&&(this.tooltipOverlay=this.tooltipRuntime?.activateUsageBadgeOverlay(this,()=>this.hideTooltip(),this.tooltipOrder),this.tooltipOrder=void 0))}disconnectedCallback(){super.disconnectedCallback(),this.closeTooltipLifecycle()}get hasTokensIn(){return this.tokensIn!=null&&Number.isFinite(this.tokensIn)}get hasTokensOut(){return this.tokensOut!=null&&Number.isFinite(this.tokensOut)}get hasCost(){return(this.costText??"").length>0}get validLatencyMs(){if(!(this.latencyMs==null||!Number.isFinite(this.latencyMs)))return finiteRange(this.latencyMs,this.latencyMs,0)}get hasLatency(){return this.validLatencyMs!==void 0}get hasVisibleContent(){return this.hasTokensIn||this.hasTokensOut||this.hasCost||this.hasLatency}get hasVisibleSummary(){return(this.summary??"").length>0||this.hasSummarySlot}get hasDisplayContent(){return this.hasVisibleContent||this.hasVisibleSummary}get hasTooltipContent(){return this.hasVisibleContent||this.hasDetailsSlot}get hasInteractiveTooltip(){return this.hasDisplayContent&&this.hasTooltipContent}formatTokenCount(n){return getNumberFormat(this.effectiveLocale,this.abbreviate?{notation:"compact"}:{}).format(n)}formatTokenCountFull(n){return getNumberFormat(this.effectiveLocale).format(n)}localizedDuration(ms){if(this.formatLatency)return this.formatLatency(ms);const duration=durationMessageValue(ms),value=getNumberFormat(this.effectiveLocale,{maximumFractionDigits:duration.key==="durationMilliseconds"?0:1}).format(duration.value);return this.localize(duration.key,void 0,{value})}loadTooltipOverlayRuntime(){return import("./usage-badge-overlay-runtime.js")}getUpdateComplete(){return this.tooltipOpening?this.waitForTooltipOpening():super.getUpdateComplete()}async waitForTooltipOpening(){let complete=await super.getUpdateComplete();for(;this.tooltipOpening;)await this.tooltipOpening.ready,complete=await super.getUpdateComplete();return complete}cancelTooltipOpening(){this.tooltipOpening?.cancel(),this.tooltipOpening=void 0,this.tooltipOrder=void 0}showTooltip(){if(!this.hasInteractiveTooltip||this.tooltipOpen||this.tooltipOpening||!this.isConnected)return;const document=this.ownerDocument,order=reserveOverlayOrder(document);if(this.tooltipRuntime){this.tooltipOrder=order,this.tooltipOpen=!0;return}let settle;const opening={ready:new Promise(resolve=>{settle=resolve}),cancel:settle};this.tooltipOpening=opening,this.loadTooltipOverlayRuntime().then(runtime=>{this.tooltipOpening!==opening||!this.isConnected||this.ownerDocument!==document||!this.hasInteractiveTooltip||!this.hovering&&!this.focused||!this.renderRoot.querySelector('[part="base"]')?.getClientRects().length||(this.tooltipRuntime=runtime,this.tooltipOrder=order,this.tooltipOpen=!0)},()=>{}).finally(()=>{this.tooltipOpening===opening&&(this.tooltipOpening=void 0),settle()})}hideTooltip(){this.cancelTooltipOpening(),this.tooltipOpen=!1,this.tooltipOverlay?.deactivate({restoreFocus:!1}),this.tooltipOverlay=void 0}closeTooltipLifecycle(){this.hideTooltip(),this.hovering=!1,this.focused=!1}render(){const interactive=this.hasInteractiveTooltip,tokensIn=this.hasTokensIn?finiteCount(this.tokensIn):void 0,tokensOut=this.hasTokensOut?finiteCount(this.tokensOut):void 0,hasBoth=tokensIn!==void 0&&tokensOut!==void 0;return html`
2
2
  <div
3
3
  part="base"
4
4
  role=${interactive?"group":nothing}
@@ -29,7 +29,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
29
29
  >
30
30
  ${rows.length===0?html`<div part="empty" role="option" aria-selected="false" aria-disabled="true">${emptyText}</div>`:this.renderRows(rows,activeId)}
31
31
  </div>
32
- `}get hasVisibleLabel(){return this.label.length>0||this.slotPresence.has("label")}renderLabel(){return html`<label part="form-control-label" for=${this.controlId} ?hidden=${!this.hasVisibleLabel}
32
+ `}get hasVisibleLabel(){return(this.label??"").length>0||this.slotPresence.has("label")}renderLabel(){return html`<label part="form-control-label" for=${this.controlId} ?hidden=${!this.hasVisibleLabel}
33
33
  >${this.label}<slot name="label"></slot></label
34
34
  >`}renderHintError(hasError,hasHint){return html`
35
35
  <div id="voice-picker-error" part="error" ?hidden=${!hasError}>
@@ -51,7 +51,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
51
51
  >
52
52
  ${playing?pauseIcon():playIcon()}
53
53
  </button>
54
- `}renderClosed(){const rows=this.effectiveEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasValue=this.value.length>0,hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||this.hint.length>0,hasError=this.slotPresence.has("error")||this.errorText.length>0,describedBy=[hasError?"voice-picker-error":"",hasHint?"voice-picker-hint":""].filter(Boolean).join(" ");return html`
54
+ `}renderClosed(){const rows=this.effectiveEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasValue=this.value.length>0,hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[hasError?"voice-picker-error":"",hasHint?"voice-picker-hint":""].filter(Boolean).join(" ");return html`
55
55
  ${this.renderLabel()}
56
56
  <div class="control-row">
57
57
  <button
@@ -84,7 +84,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
84
84
  </div>
85
85
  ${this.renderListbox([...rows,...this.malformedCatalogEntries],activeId,this.localize("voicePickerNoVoices"))}
86
86
  ${this.renderHintError(hasError,hasHint)}
87
- `}renderFreeText(){const rows=this.filteredEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||this.hint.length>0,hasError=this.slotPresence.has("error")||this.errorText.length>0,describedBy=[hasError?"voice-picker-error":"",hasHint?"voice-picker-hint":""].filter(Boolean).join(" ");return html`
87
+ `}renderFreeText(){const rows=this.filteredEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[hasError?"voice-picker-error":"",hasHint?"voice-picker-hint":""].filter(Boolean).join(" ");return html`
88
88
  ${this.renderLabel()}
89
89
  <div class="control-row">
90
90
  <div part="combobox" @mousedown=${this.onComboMouseDown}>
@@ -1,8 +1,3 @@
1
- /**
2
- * DOM-free, bounded allowlist resolution for `<lr-widget-renderer>`. Authored input is copied into
3
- * a capped snapshot exactly once before validation/resolution, so getters and sibling indices
4
- * outside the admitted prefix are never touched and later passes cannot observe mutation.
5
- */
6
1
  import{type LyraWidgetTypeRegistry}from'./registry.js';export interface LyraWidgetNode{readonly type:string;readonly id?:string;readonly props?:Readonly<Record<string,unknown>>;readonly children?:readonly(LyraWidgetNode|string)[];readonly slot?:string;readonly actionId?:string;readonly payload?:unknown;}export interface LyraWidgetBinding{readonly $bind:string;readonly fallback?:string|number|boolean|null;}
7
2
  /** Version-two document. Controlled binding state is supplied separately through `bindingState`. */
8
3
  export interface LyraWidgetDocument{readonly version:'2';readonly root:LyraWidgetNode;}
@@ -25,7 +20,10 @@ nodePath:string;kind:'builtin-row'|'builtin-col'|'builtin-text'|'mapped';tag?:st
25
20
  /** Semantic control classification, independent of actions and bindings. */
26
21
  interactive:boolean;props:Record<string,unknown>;actionEvent?:string;actionId?:string;payload?:unknown;bindings:Array<{prop:string;path:string;event?:string;}>;children:ResolvedNode[];slot?:string;}export type ResolvedNode=ResolvedText|ResolvedElement;export interface ResolveContext{registry:LyraWidgetTypeRegistry;bindingState:unknown;
27
22
  /** Warning keys retained for one renderer document/registry generation. */
28
- warned:Set<string>;warn?:(message:string)=>void;}
23
+ warned:Set<string>;
24
+ /** Explicit diagnostic callback, active in every runtime. Without one, authoring warnings
25
+ * are emitted only in development; keys and caps belong to this context generation. */
26
+ warn?:(message:string)=>void;}
29
27
  /** Resolves one bounded immutable snapshot through `ctx.registry`. Structural invalidity returns
30
28
  * `null`; throwing getters/registry access propagate so the renderer can emit one normalized error. */
31
29
  export declare function resolveTree(root:LyraWidgetNode|null|undefined,ctx:ResolveContext):ResolvedNode|null;