@aceshooting/lyra-ui 13.0.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/CHANGELOG.md +212 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migration-contract.json +1 -1
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +23 -15
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +9 -6
  6. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +12 -3
  7. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +2 -1
  8. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +4 -2
  9. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -1
  10. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +1 -1
  11. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +1 -1
  12. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +7 -7
  13. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +5 -5
  14. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +23 -10
  15. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +13 -6
  16. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +3 -3
  17. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
  18. package/dist/components/agent-tools/stack-trace/stack-trace-parse.js +3 -3
  19. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +1 -1
  20. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  21. package/dist/components/agent-tools/task-list/task-list.class.d.ts +1 -2
  22. package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
  23. package/dist/components/agent-tools/terminal/terminal.class.d.ts +10 -1
  24. package/dist/components/agent-tools/terminal/terminal.class.js +3 -3
  25. package/dist/components/agent-tools/terminal/terminal.styles.js +1 -1
  26. package/dist/components/agent-tools/test-results/test-results.class.d.ts +4 -2
  27. package/dist/components/agent-tools/test-results/test-results.class.js +2 -2
  28. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +2 -0
  29. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +1 -1
  30. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
  31. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  32. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +3 -2
  33. package/dist/components/agent-tools/tool-param-form/tool-param-form.d.ts +1 -1
  34. package/dist/components/agent-tools/tool-param-form/tool-param-form.js +1 -1
  35. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +1 -1
  36. package/dist/components/agent-tools/tool-result-view/registry.d.ts +2 -1
  37. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +1 -1
  38. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +1 -1
  39. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +18 -12
  40. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +6 -6
  41. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +9 -3
  42. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
  43. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  44. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
  45. package/dist/components/charts/chart/box-plot.class.d.ts +10 -3
  46. package/dist/components/charts/chart/box-plot.class.js +9 -9
  47. package/dist/components/charts/chart/box-plot.styles.js +1 -1
  48. package/dist/components/charts/chart/chart-core-loader.js +1 -1
  49. package/dist/components/charts/chart/chart-feature-loader.js +1 -1
  50. package/dist/components/charts/chart/chart-preload.d.ts +1 -1
  51. package/dist/components/charts/chart/chart-preload.js +1 -1
  52. package/dist/components/charts/chart/chart.class.d.ts +27 -9
  53. package/dist/components/charts/chart/chart.class.js +23 -14
  54. package/dist/components/charts/chart/chart.styles.js +1 -1
  55. package/dist/components/charts/chart/histogram-bin.js +1 -1
  56. package/dist/components/charts/chart/lite-chart.class.js +7 -3
  57. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  58. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +1 -1
  59. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +2 -2
  60. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +10 -5
  61. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +1 -1
  62. package/dist/components/conversation/branch-picker/branch-picker.class.d.ts +4 -2
  63. package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -1
  64. package/dist/components/conversation/branch-picker/branch-picker.styles.js +1 -1
  65. package/dist/components/conversation/chat-composer/chat-composer.class.d.ts +6 -2
  66. package/dist/components/conversation/chat-composer/chat-composer.class.js +3 -3
  67. package/dist/components/conversation/chat-composer/chat-composer.styles.js +1 -1
  68. package/dist/components/conversation/chat-message/chat-message.class.js +2 -2
  69. package/dist/components/conversation/chat-message/chat-message.styles.js +1 -1
  70. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +1 -1
  71. package/dist/components/conversation/code-block/code-block-shared.js +1 -1
  72. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  73. package/dist/components/conversation/code-block/code-loader.d.ts +1 -1
  74. package/dist/components/conversation/code-block/code-loader.js +1 -1
  75. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  76. package/dist/components/conversation/conversation-item/conversation-item.styles.js +1 -1
  77. package/dist/components/conversation/generation-metrics/generation-metrics.styles.js +1 -1
  78. package/dist/components/conversation/markdown/katex-loader.d.ts +4 -4
  79. package/dist/components/conversation/markdown/katex-loader.js +1 -1
  80. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  81. package/dist/components/conversation/markdown/markdown-loader.d.ts +1 -1
  82. package/dist/components/conversation/markdown/markdown-loader.js +1 -1
  83. package/dist/components/conversation/markdown/markdown-shared.d.ts +6 -1
  84. package/dist/components/conversation/markdown/markdown-shared.js +5 -4
  85. package/dist/components/conversation/message-actions/message-actions.class.d.ts +16 -3
  86. package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
  87. package/dist/components/conversation/message-actions/message-actions.styles.js +1 -1
  88. package/dist/components/conversation/message-actions/toolbar-actions.d.ts +3 -1
  89. package/dist/components/conversation/message-actions/toolbar-actions.js +1 -1
  90. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +38 -15
  91. package/dist/components/conversation/message-feedback/message-feedback.class.js +7 -3
  92. package/dist/components/conversation/message-feedback/message-feedback.styles.js +1 -1
  93. package/dist/components/conversation/message-parts/message-parts.class.d.ts +7 -4
  94. package/dist/components/conversation/message-parts/message-parts.class.js +2 -2
  95. package/dist/components/conversation/message-parts/message-parts.styles.js +1 -1
  96. package/dist/components/conversation/model-select/model-select.class.d.ts +5 -2
  97. package/dist/components/conversation/model-select/model-select.class.js +5 -2
  98. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +3 -5
  99. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
  100. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +9 -2
  101. package/dist/components/conversation/prompt-input/prompt-input.class.js +3 -3
  102. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  103. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +20 -4
  104. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +1 -1
  105. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
  106. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +17 -8
  107. package/dist/components/conversation/push-to-talk/push-to-talk.class.js +1 -1
  108. package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +1 -1
  109. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +6 -3
  110. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  111. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +1 -1
  112. package/dist/components/conversation/thread-list/thread-list.class.d.ts +14 -4
  113. package/dist/components/conversation/thread-list/thread-list.class.js +11 -11
  114. package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
  115. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
  116. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +12 -4
  117. package/dist/components/conversation/voice-picker/voice-picker.class.js +5 -2
  118. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  119. package/dist/components/data/calendar/calendar.class.d.ts +12 -4
  120. package/dist/components/data/calendar/calendar.class.js +2 -2
  121. package/dist/components/data/calendar/calendar.styles.js +1 -1
  122. package/dist/components/data/context-meter/context-meter.class.d.ts +3 -1
  123. package/dist/components/data/context-meter/context-meter.class.js +3 -3
  124. package/dist/components/data/data-grid/data-grid.class.d.ts +45 -4
  125. package/dist/components/data/data-grid/data-grid.class.js +25 -11
  126. package/dist/components/data/data-grid/data-grid.styles.js +1 -1
  127. package/dist/components/data/document-library/document-library.class.js +1 -1
  128. package/dist/components/data/env-list/env-list.class.js +1 -1
  129. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +19 -12
  130. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -2
  131. package/dist/components/data/flow-controls/flow-controls.styles.js +1 -1
  132. package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
  133. package/dist/components/data/gauge/gauge.class.js +1 -1
  134. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +1 -1
  135. package/dist/components/data/heatmap/heatmap.class.js +1 -1
  136. package/dist/components/data/sequence-strip/sequence-strip.class.js +1 -1
  137. package/dist/components/data/stat/stat.class.js +1 -1
  138. package/dist/components/data/table/table.class.d.ts +10 -14
  139. package/dist/components/data/table/table.class.js +4 -3
  140. package/dist/components/data/table/table.styles.js +1 -1
  141. package/dist/components/data/timeline/timeline.class.js +1 -1
  142. package/dist/components/data/tree/tree-item.styles.js +1 -1
  143. package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
  144. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +7 -2
  145. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  146. package/dist/components/forms/code-editor/code-editor.class.d.ts +8 -4
  147. package/dist/components/forms/code-editor/code-editor.class.js +16 -5
  148. package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
  149. package/dist/components/forms/color-picker/color-picker.class.d.ts +1 -1
  150. package/dist/components/forms/color-picker/color-picker.class.js +1 -1
  151. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  152. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  153. package/dist/components/forms/date-picker/date-picker.class.d.ts +9 -2
  154. package/dist/components/forms/date-picker/date-picker.class.js +4 -4
  155. package/dist/components/forms/date-picker/date-picker.styles.js +1 -1
  156. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  157. package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
  158. package/dist/components/forms/input/input.class.d.ts +11 -4
  159. package/dist/components/forms/input/input.class.js +7 -1
  160. package/dist/components/forms/input/time-input.class.d.ts +8 -2
  161. package/dist/components/forms/input/time-input.class.js +1 -1
  162. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +17 -3
  163. package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
  164. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  165. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
  166. package/dist/components/forms/select/select.styles.js +1 -1
  167. package/dist/components/forms/slider/slider.class.js +1 -1
  168. package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
  169. package/dist/components/forms/token-input/token-input.class.js +1 -1
  170. package/dist/components/forms/token-input/token-input.styles.js +1 -1
  171. package/dist/components/layout/app-rail/app-rail.class.d.ts +6 -4
  172. package/dist/components/layout/app-rail/app-rail.class.js +4 -3
  173. package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
  174. package/dist/components/layout/command-palette/command-palette.class.d.ts +2 -2
  175. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  176. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  177. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  178. package/dist/components/layout/details/details.class.d.ts +13 -12
  179. package/dist/components/layout/details/details.class.js +43 -34
  180. package/dist/components/layout/details/details.styles.js +1 -1
  181. package/dist/components/layout/dock-panel/dock-panel.class.d.ts +4 -3
  182. package/dist/components/layout/dock-panel/dock-panel.class.js +2 -1
  183. package/dist/components/layout/filter-bar/filter-bar.class.js +2 -2
  184. package/dist/components/layout/menu/menu-item.class.js +2 -2
  185. package/dist/components/layout/menu/menu.class.js +1 -1
  186. package/dist/components/layout/multi-split/multi-split.class.d.ts +10 -5
  187. package/dist/components/layout/multi-split/multi-split.class.js +2 -1
  188. package/dist/components/layout/scroller/scroller.class.d.ts +4 -4
  189. package/dist/components/layout/scroller/scroller.styles.js +1 -1
  190. package/dist/components/layout/split-panel/split-panel.class.d.ts +3 -2
  191. package/dist/components/layout/split-panel/split-panel.class.js +3 -2
  192. package/dist/components/layout/tab-group/tab-group.styles.js +1 -1
  193. package/dist/components/layout/virtual-list/virtual-list.class.js +2 -2
  194. package/dist/components/layout/widget/widget.styles.js +1 -1
  195. package/dist/components/media/file-input/file-input.styles.js +1 -1
  196. package/dist/components/media/flag/flag.class.js +1 -1
  197. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  198. package/dist/components/media/map/map-loader.js +1 -1
  199. package/dist/components/media/map/map.class.d.ts +17 -31
  200. package/dist/components/media/map/map.class.js +1 -1
  201. package/dist/components/media/qr-code/qr-code-loader.js +1 -1
  202. package/dist/components/media/qr-code/qr-code.class.d.ts +5 -2
  203. package/dist/components/media/qr-code/qr-code.class.js +2 -2
  204. package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +2 -2
  205. package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
  206. package/dist/components/overlays/alert/alert.styles.js +1 -1
  207. package/dist/components/overlays/callout/callout.styles.js +1 -1
  208. package/dist/components/overlays/dialog/dialog.styles.js +1 -1
  209. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  210. package/dist/components/overlays/overlay/popover.class.js +1 -1
  211. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  212. package/dist/components/overlays/rating/rating.class.js +1 -1
  213. package/dist/components/overlays/toast/toast-item.class.js +1 -1
  214. package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts +11 -5
  215. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +3 -3
  216. package/dist/components/retrieval/graph/graph-loader.js +1 -1
  217. package/dist/components/retrieval/graph/graph.class.d.ts +1 -1
  218. package/dist/components/retrieval/graph/graph.class.js +10 -10
  219. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +4 -2
  220. package/dist/components/retrieval/graph-legend/graph-legend.class.js +1 -1
  221. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +14 -6
  222. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +7 -5
  223. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +3 -2
  224. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +4 -3
  225. package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
  226. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +4 -1
  227. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +2 -1
  228. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  229. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +15 -6
  230. package/dist/components/retrieval/memory-panel/memory-panel.class.js +1 -1
  231. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
  232. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
  233. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +17 -12
  234. package/dist/components/retrieval/node-palette/node-palette.class.js +2 -2
  235. package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
  236. package/dist/components/retrieval/path-strip/path-strip.class.js +1 -1
  237. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +1 -1
  238. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +5 -5
  239. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  240. package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
  241. package/dist/components/utility/copy-button/copy-button.class.d.ts +2 -1
  242. package/dist/components/utility/copy-button/copy-button.class.js +1 -1
  243. package/dist/components/utility/diff-view/diff-view.class.d.ts +4 -1
  244. package/dist/components/utility/diff-view/diff-view.class.js +1 -1
  245. package/dist/components/utility/export-button/export-button.class.d.ts +2 -2
  246. package/dist/components/utility/export-button/export-button.class.js +1 -1
  247. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  248. package/dist/components/utility/format/format-date.class.js +1 -1
  249. package/dist/components/utility/format/relative-time.class.js +1 -1
  250. package/dist/components/utility/icon/dompurify-loader.js +1 -1
  251. package/dist/components/utility/icon/icon-library.js +1 -1
  252. package/dist/components/utility/intersection-observer/intersection-observer.class.js +1 -1
  253. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +3 -1
  254. package/dist/components/utility/json-viewer/json-viewer.class.js +5 -5
  255. package/dist/components/utility/known-date/known-date.class.js +1 -1
  256. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +29 -44
  257. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  258. package/dist/components/utility/mutation-observer/mutation-observer.class.js +1 -1
  259. package/dist/components/viewers/calendar-viewer/calendar-loader.js +1 -1
  260. package/dist/components/viewers/document-compare/document-compare.class.d.ts +11 -8
  261. package/dist/components/viewers/document-compare/document-compare.class.js +2 -2
  262. package/dist/components/viewers/document-preview/document-preview.class.d.ts +4 -2
  263. package/dist/components/viewers/document-preview/document-preview.class.js +4 -4
  264. package/dist/components/viewers/document-preview/document-preview.styles.js +1 -1
  265. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +2 -0
  266. package/dist/components/viewers/document-viewer/document-viewer.styles.js +1 -1
  267. package/dist/components/viewers/docx-viewer/docx-loader.js +1 -1
  268. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +1 -1
  269. package/dist/components/viewers/ebook-viewer/ebook-loader.d.ts +1 -1
  270. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +2 -2
  271. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  272. package/dist/components/viewers/email-viewer/email-loader.js +1 -1
  273. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +1 -1
  274. package/dist/components/viewers/email-viewer/email-viewer.class.js +2 -2
  275. package/dist/components/viewers/html-viewer/dompurify-loader.js +1 -1
  276. package/dist/components/viewers/notebook-viewer/dompurify-loader.js +1 -1
  277. package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
  278. package/dist/components/viewers/pptx-viewer/pptx-loader.js +1 -1
  279. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-loader.js +1 -1
  280. package/dist/components/viewers/svg-viewer/dompurify-loader.js +1 -1
  281. package/dist/components/viewers/viewer-loading.js +1 -1
  282. package/dist/components/viewers/viewer-search-limits.d.ts +2 -0
  283. package/dist/components/viewers/viewer-search-limits.js +1 -1
  284. package/dist/custom-elements-jsx.d.ts +1 -1
  285. package/dist/events.d.ts +13 -6
  286. package/dist/internal/aria-controls.d.ts +16 -13
  287. package/dist/internal/aria-controls.js +1 -1
  288. package/dist/internal/aria-reflection.js +1 -1
  289. package/dist/internal/catalog-picker.d.ts +2 -2
  290. package/dist/internal/catalog-picker.js +1 -1
  291. package/dist/internal/chart-annotation-registration.d.ts +1 -0
  292. package/dist/internal/chart-annotation-registration.js +1 -0
  293. package/dist/internal/data-descriptors.d.ts +13 -0
  294. package/dist/internal/data-descriptors.js +1 -0
  295. package/dist/internal/default-strings.generated.d.ts +1 -1
  296. package/dist/internal/default-strings.generated.js +2 -2
  297. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  298. package/dist/internal/element-internals.d.ts +4 -3
  299. package/dist/internal/element-internals.js +1 -1
  300. package/dist/internal/highlight-collection.d.ts +2 -0
  301. package/dist/internal/highlight-collection.js +1 -1
  302. package/dist/internal/localization-types.d.ts +1 -1
  303. package/dist/internal/localization.js +2 -2
  304. package/dist/internal/lyra-element.d.ts +10 -1
  305. package/dist/internal/lyra-element.js +2 -1
  306. package/dist/internal/package-metadata.d.ts +1 -1
  307. package/dist/internal/package-metadata.js +1 -1
  308. package/dist/internal/papaparse-loader.js +1 -1
  309. package/dist/internal/pseudo-localization.js +1 -1
  310. package/dist/internal/safe-css.js +1 -1
  311. package/dist/internal/step-value.d.ts +6 -0
  312. package/dist/internal/step-value.js +1 -0
  313. package/dist/internal/text-quote.js +1 -1
  314. package/dist/lyra.d.ts +1 -1
  315. package/dist/svelte.d.ts +1 -1
  316. package/dist/translations/ar.js +2 -2
  317. package/dist/translations/de.js +2 -2
  318. package/dist/translations/es.js +2 -2
  319. package/dist/translations/fa.js +2 -2
  320. package/dist/translations/fr.js +2 -2
  321. package/dist/translations/he.js +2 -2
  322. package/dist/translations/ja.js +2 -2
  323. package/dist/translations/pseudo/ar-XB.js +1 -1
  324. package/dist/translations/pt-BR.js +2 -2
  325. package/dist/translations/ru.js +2 -2
  326. package/dist/translations/zh-CN.js +2 -2
  327. package/dist/vue.d.ts +1 -1
  328. package/llms/components/lr-accordion-item.md +6 -5
  329. package/llms/components/lr-accordion.md +6 -5
  330. package/llms/components/lr-activity-feed.md +6 -5
  331. package/llms/components/lr-agent-run.md +1 -1
  332. package/llms/components/lr-agent-workspace.md +3 -2
  333. package/llms/components/lr-attachment-chip.md +2 -3
  334. package/llms/components/lr-audio-visualizer.md +9 -6
  335. package/llms/components/lr-bar-chart.md +2 -2
  336. package/llms/components/lr-box-plot.md +9 -6
  337. package/llms/components/lr-bubble-chart.md +2 -2
  338. package/llms/components/lr-calendar.md +10 -4
  339. package/llms/components/lr-chart.md +11 -5
  340. package/llms/components/lr-chat-composer.md +2 -1
  341. package/llms/components/lr-chunk-inspector.md +2 -2
  342. package/llms/components/lr-code-block-core.md +4 -4
  343. package/llms/components/lr-code-block.md +10 -14
  344. package/llms/components/lr-code-editor.md +2 -0
  345. package/llms/components/lr-copy-button.md +4 -1
  346. package/llms/components/lr-data-grid.md +11 -2
  347. package/llms/components/lr-date-input.md +4 -0
  348. package/llms/components/lr-date-picker.md +5 -1
  349. package/llms/components/lr-details.md +6 -5
  350. package/llms/components/lr-diff-view.md +6 -0
  351. package/llms/components/lr-document-compare.md +6 -2
  352. package/llms/components/lr-document-preview.md +11 -3
  353. package/llms/components/lr-document-viewer.md +5 -1
  354. package/llms/components/lr-docx-viewer.md +6 -0
  355. package/llms/components/lr-doughnut-chart.md +2 -2
  356. package/llms/components/lr-ebook-viewer.md +8 -3
  357. package/llms/components/lr-email-viewer.md +5 -0
  358. package/llms/components/lr-eval-dataset.md +2 -2
  359. package/llms/components/lr-export-button.md +9 -0
  360. package/llms/components/lr-file-input.md +5 -8
  361. package/llms/components/lr-format-date.md +3 -1
  362. package/llms/components/lr-graph-legend.md +4 -2
  363. package/llms/components/lr-grounding-summary.md +8 -8
  364. package/llms/components/lr-histogram.md +2 -2
  365. package/llms/components/lr-ingestion-queue.md +1 -1
  366. package/llms/components/lr-intersection-observer.md +9 -0
  367. package/llms/components/lr-json-viewer.md +6 -1
  368. package/llms/components/lr-knowledge-base.md +10 -1
  369. package/llms/components/lr-line-chart.md +2 -2
  370. package/llms/components/lr-lite-chart.md +8 -5
  371. package/llms/components/lr-locale-picker.md +6 -0
  372. package/llms/components/lr-map.md +15 -5
  373. package/llms/components/lr-markdown.md +7 -4
  374. package/llms/components/lr-media-card.md +0 -6
  375. package/llms/components/lr-mention-popover.md +12 -10
  376. package/llms/components/lr-message-actions.md +10 -3
  377. package/llms/components/lr-message-feedback.md +20 -7
  378. package/llms/components/lr-message-parts.md +3 -1
  379. package/llms/components/lr-model-select.md +5 -2
  380. package/llms/components/lr-multi-split.md +5 -1
  381. package/llms/components/lr-mutation-observer.md +8 -0
  382. package/llms/components/lr-node-palette.md +5 -2
  383. package/llms/components/lr-pie-chart.md +2 -2
  384. package/llms/components/lr-polar-area-chart.md +2 -2
  385. package/llms/components/lr-prompt-input.md +7 -3
  386. package/llms/components/lr-prompt-queue.md +6 -0
  387. package/llms/components/lr-push-to-talk.md +5 -0
  388. package/llms/components/lr-qr-code.md +6 -0
  389. package/llms/components/lr-radar-chart.md +2 -2
  390. package/llms/components/lr-rating.md +5 -0
  391. package/llms/components/lr-relative-time.md +2 -0
  392. package/llms/components/lr-result-card.md +3 -3
  393. package/llms/components/lr-result-field.md +3 -3
  394. package/llms/components/lr-retrieval-results.md +1 -1
  395. package/llms/components/lr-scatter-chart.md +2 -2
  396. package/llms/components/lr-scroller.md +5 -5
  397. package/llms/components/lr-sequence-playback.md +1 -2
  398. package/llms/components/lr-slider.md +3 -1
  399. package/llms/components/lr-streaming-text.md +2 -3
  400. package/llms/components/lr-terminal.md +14 -5
  401. package/llms/components/lr-thinking-panel.md +3 -1
  402. package/llms/components/lr-thread-list.md +20 -1
  403. package/llms/components/lr-tool-call-chip.md +2 -2
  404. package/llms/components/lr-tool-param-form.md +2 -2
  405. package/llms/components/lr-tool-result-view.md +2 -3
  406. package/llms/components/lr-tool-select-dialog.md +2 -2
  407. package/llms/components/lr-voice-picker.md +7 -2
  408. package/llms/components/lr-widget-renderer.md +12 -13
  409. package/llms/peers.md +5 -5
  410. package/llms/shared.md +74 -63
  411. package/llms-full.txt +629 -247
  412. package/package.json +21 -14
  413. package/vscode-css-data.json +1 -1
  414. package/vscode-html-data.json +1 -1
  415. package/web-types.json +1 -1
  416. package/dist/components/viewers/docx-viewer/fixtures/minimal-docx-fixture.d.ts +0 -1
  417. package/dist/components/viewers/docx-viewer/fixtures/minimal-docx-fixture.js +0 -1
  418. package/dist/components/viewers/ebook-viewer/fixtures/minimal-epub-fixture.d.ts +0 -1
  419. package/dist/components/viewers/ebook-viewer/fixtures/minimal-epub-fixture.js +0 -1
  420. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.d.ts +0 -1
  421. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.js +0 -1
@@ -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{activeElementIn}from"../../../internal/active-element.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{styles}from"./prompt-queue.styles.js";import{LYRA_DEFAULT_attachmentUntitledFile,LYRA_DEFAULT_moveDown,LYRA_DEFAULT_moveUp,LYRA_DEFAULT_promptInputAttachments,LYRA_DEFAULT_promptQueueActionLabel,LYRA_DEFAULT_promptQueueEmpty,LYRA_DEFAULT_promptQueueItemLabel,LYRA_DEFAULT_promptQueueLabel,LYRA_DEFAULT_promptQueueSendNow,LYRA_DEFAULT_remove}from"../../../internal/default-strings.generated.js";function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function uniqueQueueItems(source){const seen=new Set,result=[];for(const item of Array.isArray(source)?source:[])!isRecord(item)||typeof item.id!="string"||!item.id.trim()||seen.has(item.id)||(seen.add(item.id),result.push(item));return result}class LyraPromptQueue extends LyraElement{constructor(){super(...arguments),this.items=[],this.editable=!0,this.disabled=!1,this.label="",this.accessibleLabel=null,this.containNativeEvent=event=>{event.stopPropagation()}}static{this.defaultStrings={...super.defaultStrings,attachmentUntitledFile:LYRA_DEFAULT_attachmentUntitledFile,moveDown:LYRA_DEFAULT_moveDown,moveUp:LYRA_DEFAULT_moveUp,promptInputAttachments:LYRA_DEFAULT_promptInputAttachments,promptQueueActionLabel:LYRA_DEFAULT_promptQueueActionLabel,promptQueueEmpty:LYRA_DEFAULT_promptQueueEmpty,promptQueueItemLabel:LYRA_DEFAULT_promptQueueItemLabel,promptQueueLabel:LYRA_DEFAULT_promptQueueLabel,promptQueueSendNow:LYRA_DEFAULT_promptQueueSendNow,remove:LYRA_DEFAULT_remove}}static{this.ownedCollectionProperties=Object.freeze(["items"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-queue-change","lr-send-now"])}get effectiveItems(){return uniqueQueueItems(this.items)}willUpdate(changed){if(super.willUpdate(changed),!changed.has("items")&&!changed.has("editable")&&!changed.has("disabled"))return;const focusedControl=activeElementIn(this.shadowRoot),action=focusedControl?.getAttribute("data-action")??void 0,editorFocused=focusedControl?.getAttribute("part")==="editor";if(!action&&!editorFocused)return;const focusedItem=focusedControl?.closest("[data-id]"),focusedId=focusedItem?.dataset.id;if(!focusedId||!focusedControl)return;const previousItems=uniqueQueueItems(changed.get("items")),items=this.effectiveItems,rowRemoved=changed.has("items")&&!items.some(item=>item.id===focusedId),editorRemoved=editorFocused&&changed.has("editable")&&!this.editable,controlDisabled=changed.has("disabled")&&this.disabled;if(!rowRemoved&&!editorRemoved&&!controlDisabled)return;const previousIndex=previousItems.findIndex(item=>item.id===focusedId),target=rowRemoved?items[Math.min(Math.max(previousIndex,0),items.length-1)]:items.find(item=>item.id===focusedId),rowActions=focusedItem?.querySelectorAll("[data-action]")??[];this.pendingRemovalFocus={targetId:target?.id,action,actionIndex:action?[...rowActions].findIndex(candidate=>candidate===focusedControl):-1,origin:focusedControl}}updated(changed){super.updated(changed);const pending=this.pendingRemovalFocus;if(!pending)return;this.pendingRemovalFocus=void 0;const internalActive=activeElementIn(this.shadowRoot),documentActive=activeElementIn(this.ownerDocument);if(internalActive!==null&&internalActive!==pending.origin||documentActive!==null&&documentActive!==this&&documentActive!==this.ownerDocument.body)return;if(!pending.targetId){this.shadowRoot?.querySelector('[part="base"]')?.focus();return}const actions=[...[...this.shadowRoot?.querySelectorAll("[data-id]")??[]].find(item=>item.dataset.id===pending.targetId)?.querySelectorAll("[data-action]")??[]],isEnabled=candidate=>candidate.disabled!==!0&&candidate.getAttribute("aria-disabled")!=="true",equivalentAction=pending.action?actions.find(candidate=>candidate.dataset.action===pending.action&&isEnabled(candidate)):void 0;if(equivalentAction){equivalentAction.focus();return}const preferredIndex=pending.actionIndex>=0?pending.actionIndex:0;for(let distance=0;distance<actions.length;distance++){const before=actions[preferredIndex-distance];if(before&&isEnabled(before)){before.focus();return}const after=actions[preferredIndex+distance];if(after&&isEnabled(after)){after.focus();return}}this.shadowRoot?.querySelector('[part="base"]')?.focus()}emitChange(items,reason,itemId){this.disabled||this.emit("lr-queue-change",{items,reason,itemId})}edit(item,value){this.disabled||!this.editable||this.emitChange(this.effectiveItems.map(candidate=>candidate.id===item.id?{...candidate,value}:{...candidate}),"edit",item.id)}removeItem(item){this.disabled||this.emitChange(this.effectiveItems.filter(candidate=>candidate.id!==item.id).map(candidate=>({...candidate})),"remove",item.id)}move(item,offset){if(this.disabled)return;const items=this.effectiveItems,index=items.findIndex(candidate=>candidate.id===item.id),target=index+offset;if(index<0||target<0||target>=items.length)return;const next=items.map(candidate=>({...candidate})),[moved]=next.splice(index,1);moved&&(next.splice(target,0,moved),this.emitChange(next,"reorder",item.id))}sendNow(item){this.disabled||this.emit("lr-send-now",{item})}renderItem(item,index,itemCount){const formattedIndex=getNumberFormat(this.effectiveLocale).format(index+1),editorLabel=this.localize("promptQueueItemLabel",void 0,{index:formattedIndex}),actionLabel=action=>this.localize("promptQueueActionLabel",void 0,{action,index:formattedIndex});return html`<li part="item" data-id=${item.id}>
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{activeElementIn}from"../../../internal/active-element.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{styles}from"./prompt-queue.styles.js";import{LYRA_DEFAULT_attachmentUntitledFile,LYRA_DEFAULT_moveDown,LYRA_DEFAULT_moveUp,LYRA_DEFAULT_promptInputAttachments,LYRA_DEFAULT_promptQueueActionLabel,LYRA_DEFAULT_promptQueueEmpty,LYRA_DEFAULT_promptQueueItemLabel,LYRA_DEFAULT_promptQueueLabel,LYRA_DEFAULT_promptQueueSendNow,LYRA_DEFAULT_remove}from"../../../internal/default-strings.generated.js";const MAX_PROJECTED_QUEUE_ITEMS=1e4,MAX_PROJECTED_QUEUE_ATTACHMENTS=1e4,EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS=Object.freeze([]);function descriptorValue(value,property2){return getOwnDataDescriptor(value,property2)}function valueOfDescriptor(descriptor){return descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR?void 0:descriptor.value}function projectPromptQueueAttachment(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const idDescriptor=descriptorValue(value,"id"),nameDescriptor=descriptorValue(value,"name"),mimeTypeDescriptor=descriptorValue(value,"mimeType"),uriDescriptor=descriptorValue(value,"uri"),versionDescriptor=descriptorValue(value,"version");if([idDescriptor,nameDescriptor,mimeTypeDescriptor,uriDescriptor,versionDescriptor].some(descriptor=>descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return;const id=valueOfDescriptor(idDescriptor),name=valueOfDescriptor(nameDescriptor);if(typeof id!="string"||id.trim().length===0||typeof name!="string")return;const mimeType=valueOfDescriptor(mimeTypeDescriptor),uri=valueOfDescriptor(uriDescriptor),version=valueOfDescriptor(versionDescriptor);return Object.freeze({id,name,...typeof mimeType=="string"?{mimeType}:{},...typeof uri=="string"?{uri}:{},...typeof version=="string"?{version}:{}})}catch{return}}function projectPromptQueueAttachments(value){try{if(!Array.isArray(value))return;const lengthDescriptor=descriptorValue(value,"length");if(lengthDescriptor===MISSING_OWN_DATA_DESCRIPTOR||lengthDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof lengthDescriptor.value!="number"||!Number.isSafeInteger(lengthDescriptor.value)||lengthDescriptor.value<0)return;const attachments=[],length=Math.min(lengthDescriptor.value,MAX_PROJECTED_QUEUE_ATTACHMENTS);for(let index=0;index<length;index+=1){const descriptor=descriptorValue(value,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const attachment=projectPromptQueueAttachment(descriptor.value);attachment&&attachments.push(attachment)}return Object.freeze(attachments)}catch{return}}function projectPromptQueueItem(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const idDescriptor=descriptorValue(value,"id"),valueDescriptor=descriptorValue(value,"value"),attachmentsDescriptor=descriptorValue(value,"attachments"),createdAtDescriptor=descriptorValue(value,"createdAt"),metadataDescriptor=descriptorValue(value,"metadata");if([idDescriptor,valueDescriptor,attachmentsDescriptor,createdAtDescriptor,metadataDescriptor].some(descriptor=>descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return;const id=valueOfDescriptor(idDescriptor),prompt=valueOfDescriptor(valueDescriptor);if(typeof id!="string"||id.trim().length===0||typeof prompt!="string")return;const attachmentsValue=valueOfDescriptor(attachmentsDescriptor),attachments=attachmentsDescriptor===MISSING_OWN_DATA_DESCRIPTOR||attachmentsValue===void 0?void 0:projectPromptQueueAttachments(attachmentsValue),createdAt=valueOfDescriptor(createdAtDescriptor),metadata=valueOfDescriptor(metadataDescriptor);return Object.freeze({source:value,id,value:prompt,...attachments===void 0?{}:{attachments},...typeof createdAt=="number"&&Number.isFinite(createdAt)?{createdAt}:{},...metadata!==void 0?{metadata}:{}})}catch{return}}function projectPromptQueueItems(value){try{if(!Array.isArray(value))return EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS;const lengthDescriptor=descriptorValue(value,"length");if(lengthDescriptor===MISSING_OWN_DATA_DESCRIPTOR||lengthDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof lengthDescriptor.value!="number"||!Number.isSafeInteger(lengthDescriptor.value)||lengthDescriptor.value<0)return EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS;const items=[],seen=new Set,length=Math.min(lengthDescriptor.value,MAX_PROJECTED_QUEUE_ITEMS);for(let index=0;index<length;index+=1){const descriptor=descriptorValue(value,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const item=projectPromptQueueItem(descriptor.value);!item||seen.has(item.id)||(seen.add(item.id),items.push(item))}return Object.freeze(items)}catch{return EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS}}function toDocumentRef(attachment){return Object.freeze({id:attachment.id,name:attachment.name,...attachment.mimeType===void 0?{}:{mimeType:attachment.mimeType},...attachment.uri===void 0?{}:{uri:attachment.uri},...attachment.version===void 0?{}:{version:attachment.version}})}function toPromptQueueItem(item,value=item.value){return Object.freeze({id:item.id,value,...item.attachments===void 0?{}:{attachments:Object.freeze(item.attachments.map(toDocumentRef))},...item.createdAt===void 0?{}:{createdAt:item.createdAt},...item.metadata===void 0?{}:{metadata:item.metadata}})}class LyraPromptQueue extends LyraElement{constructor(){super(...arguments),this.items=[],this.editable=!0,this.disabled=!1,this.label="",this.accessibleLabel=null,this.canonicalItemsBySource=new WeakMap,this.containNativeEvent=event=>{event.stopPropagation()}}static{this.defaultStrings={...super.defaultStrings,attachmentUntitledFile:LYRA_DEFAULT_attachmentUntitledFile,moveDown:LYRA_DEFAULT_moveDown,moveUp:LYRA_DEFAULT_moveUp,promptInputAttachments:LYRA_DEFAULT_promptInputAttachments,promptQueueActionLabel:LYRA_DEFAULT_promptQueueActionLabel,promptQueueEmpty:LYRA_DEFAULT_promptQueueEmpty,promptQueueItemLabel:LYRA_DEFAULT_promptQueueItemLabel,promptQueueLabel:LYRA_DEFAULT_promptQueueLabel,promptQueueSendNow:LYRA_DEFAULT_promptQueueSendNow,remove:LYRA_DEFAULT_remove}}static{this.ownedCollectionProperties=Object.freeze(["items"])}static{this.identityCollectionProperties=Object.freeze(["items"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-queue-change","lr-send-now"])}static{this.identityEventDetailProperties=Object.freeze({"lr-send-now":Object.freeze(["item"])})}static{this.identityEventDetailCollectionItems=Object.freeze({"lr-queue-change":Object.freeze(["items"])})}canonicalItemsFor(source){if(source===null||typeof source!="object"&&typeof source!="function")return EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS;const cached=this.canonicalItemsBySource.get(source);if(cached)return cached;const result=projectPromptQueueItems(source);return this.canonicalItemsBySource.set(source,result),result}cachedCanonicalItemsFor(source){return source!==null&&(typeof source=="object"||typeof source=="function")?this.canonicalItemsBySource.get(source)??EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS:EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS}get effectiveItems(){return this.canonicalItemsFor(this.items)}willUpdate(changed){if(super.willUpdate(changed),!changed.has("items")&&!changed.has("editable")&&!changed.has("disabled"))return;const focusedControl=activeElementIn(this.shadowRoot),action=focusedControl?.getAttribute("data-action")??void 0,editorFocused=focusedControl?.getAttribute("part")==="editor";if(!action&&!editorFocused)return;const focusedItem=focusedControl?.closest("[data-id]"),focusedId=focusedItem?.dataset.id;if(!focusedId||!focusedControl)return;const previousItems=changed.has("items")?this.cachedCanonicalItemsFor(changed.get("items")):EMPTY_CANONICAL_PROMPT_QUEUE_ITEMS,items=this.effectiveItems,rowRemoved=changed.has("items")&&!items.some(item=>item.id===focusedId),editorRemoved=editorFocused&&changed.has("editable")&&!this.editable,controlDisabled=changed.has("disabled")&&this.disabled;if(!rowRemoved&&!editorRemoved&&!controlDisabled)return;const previousIndex=previousItems.findIndex(item=>item.id===focusedId),target=rowRemoved?items[Math.min(Math.max(previousIndex,0),items.length-1)]:items.find(item=>item.id===focusedId),rowActions=focusedItem?.querySelectorAll("[data-action]")??[];this.pendingRemovalFocus={targetId:target?.id,action,actionIndex:action?[...rowActions].findIndex(candidate=>candidate===focusedControl):-1,origin:focusedControl}}updated(changed){super.updated(changed);const pending=this.pendingRemovalFocus;if(!pending)return;this.pendingRemovalFocus=void 0;const internalActive=activeElementIn(this.shadowRoot),documentActive=activeElementIn(this.ownerDocument);if(internalActive!==null&&internalActive!==pending.origin||documentActive!==null&&documentActive!==this&&documentActive!==this.ownerDocument.body)return;if(!pending.targetId){this.shadowRoot?.querySelector('[part="base"]')?.focus();return}const actions=[...[...this.shadowRoot?.querySelectorAll("[data-id]")??[]].find(item=>item.dataset.id===pending.targetId)?.querySelectorAll("[data-action]")??[]],isEnabled=candidate=>candidate.disabled!==!0&&candidate.getAttribute("aria-disabled")!=="true",equivalentAction=pending.action?actions.find(candidate=>candidate.dataset.action===pending.action&&isEnabled(candidate)):void 0;if(equivalentAction){equivalentAction.focus();return}const preferredIndex=pending.actionIndex>=0?pending.actionIndex:0;for(let distance=0;distance<actions.length;distance++){const before=actions[preferredIndex-distance];if(before&&isEnabled(before)){before.focus();return}const after=actions[preferredIndex+distance];if(after&&isEnabled(after)){after.focus();return}}this.shadowRoot?.querySelector('[part="base"]')?.focus()}emitChange(items,reason,itemId){this.disabled||this.emit("lr-queue-change",{items,reason,itemId})}edit(item,value){this.disabled||!this.editable||this.emitChange(this.effectiveItems.map(candidate=>toPromptQueueItem(candidate,candidate.id===item.id?value:candidate.value)),"edit",item.id)}removeItem(item){this.disabled||this.emitChange(this.effectiveItems.filter(candidate=>candidate.id!==item.id).map(candidate=>toPromptQueueItem(candidate)),"remove",item.id)}move(item,offset){if(this.disabled)return;const items=this.effectiveItems,index=items.findIndex(candidate=>candidate.id===item.id),target=index+offset;if(index<0||target<0||target>=items.length)return;const next=[...items],[moved]=next.splice(index,1);moved&&(next.splice(target,0,moved),this.emitChange(next.map(candidate=>toPromptQueueItem(candidate)),"reorder",item.id))}sendNow(item){this.disabled||this.emit("lr-send-now",{item:toPromptQueueItem(item)})}renderItem(item,index,itemCount){const formattedIndex=getNumberFormat(this.effectiveLocale).format(index+1),editorLabel=this.localize("promptQueueItemLabel",void 0,{index:formattedIndex}),actionLabel=action=>this.localize("promptQueueActionLabel",void 0,{action,index:formattedIndex});return html`<li part="item" data-id=${item.id}>
2
2
  ${this.editable?html`<lr-textarea
3
3
  part="editor"
4
4
  .value=${item.value}
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{contain-intrinsic-inline-size:var(--lr-size-20rem);display:block;container-type:inline-size}[part=base]{gap:var(--lr-space-xs);flex-direction:column;display:flex}[part=heading]{color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);font-weight:var(--lr-font-weight-semibold);margin:0}[part=list]{gap:var(--lr-space-xs);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}[part~=item]{align-items:center;gap:var(--lr-space-xs);padding:var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);grid-template-columns:minmax(0,1fr) auto;display:grid}[part=value]{white-space:pre-wrap;overflow-wrap:anywhere;min-inline-size:0}[part=attachments]{gap:var(--lr-space-2xs) var(--lr-space-xs);min-inline-size:0;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-xs);flex-wrap:wrap;grid-column:1/-1;margin:0;padding:0;list-style:none;display:flex}[part=attachment]{overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%}[part=actions]{justify-content:flex-end;gap:var(--lr-space-2xs);flex-wrap:wrap;display:flex}[part~=action]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size)}[part=empty]{color:var(--lr-color-text-quiet);margin:0}@container (inline-size<=319.98px){[part~=item]{grid-template-columns:minmax(0,1fr)}[part=actions]{justify-content:flex-start}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{contain-intrinsic-inline-size:var(--lr-size-20rem);display:block;container-type:inline-size}[part=base]{gap:var(--lr-space-xs);flex-direction:column;display:flex}[part=heading]{color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);font-weight:var(--lr-font-weight-semibold);margin:0}[part=list]{gap:var(--lr-space-xs);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}[part~=item]{align-items:center;gap:var(--lr-space-xs);padding:var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);grid-template-columns:minmax(0,1fr) auto;display:grid}[part=value]{white-space:pre-wrap;overflow-wrap:anywhere;min-inline-size:0}[part=attachments]{gap:var(--lr-space-2xs) var(--lr-space-xs);min-inline-size:0;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-xs);flex-wrap:wrap;grid-column:1/-1;margin:0;padding:0;list-style:none;display:flex}[part=attachment]{overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%}[part=actions]{justify-content:flex-end;gap:var(--lr-space-2xs);flex-wrap:wrap;display:flex}[part~=action]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);justify-content:center;align-items:center;display:inline-flex}[part=empty]{color:var(--lr-color-text-quiet);margin:0}@container (inline-size<=319.98px){[part~=item]{grid-template-columns:minmax(0,1fr)}[part=actions]{justify-content:flex-start}}`;export{styles};
@@ -82,19 +82,28 @@ get state():PushToTalkState;private _stream;
82
82
  get stream():MediaStream|null;private liveRegion?;private trigger?;private recorder?;private chunks;private recordingStartedAt;
83
83
  /** Window that granted the active capture. Native objects and scheduled work for a take stay
84
84
  * bound to this realm even if the custom element is adopted before the recorder stops. */
85
- private captureWindow?;private cancelRequested;private recorderStopRequested;private recorderFailed;private holdGesture?;private holdGestureGeneration;private tickTimer?;private maxDurationTimer?;private audioCtx?;private analyser?;private levelData?;private levelFrame?;
85
+ private captureWindow?;private activeCapture?;private pendingRequest?;private captureIntent?;private queuedIntent?;private lifecycleGeneration;private captureSequence;private intentSequence;private cancelRequested;private recorderStopRequested;private recorderFailed;private holdGesture?;private tickTimer?;private maxDurationTimer?;private audioCtx?;private analyser?;private levelData?;private levelFrame?;
86
86
  /** Lit's server DOM intentionally gives custom elements no browser-owned document. */
87
- private get ownerWindow();private syncCaptureSupport;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues<this>):void;focus(options?:FocusOptions):void;blur():void;
87
+ private get ownerWindow();private get captureOwner();private ownsCurrentLifecycle;private isCurrentRealm;private rebaseCurrentRealmOwner;private createIntent;private isLiveIntent;private clearIntent;
88
+ /** Makes a request incapable of mutating a later lifecycle. A native permission prompt cannot
89
+ * be aborted, so its eventual stream is stopped in its own continuation rather than being
90
+ * allowed to re-enter the component's current state. */
91
+ private retirePendingRequest;
92
+ /** Disconnect, adoption, and disablement revoke both the physical intent and request authority
93
+ * before any release handler can turn an involuntary teardown into a normal `lr-record-stop`. */
94
+ private invalidateLifecycle;private canAdoptRequest;private canStartRequest;private notifyCancellation;
95
+ /** A physical B press can land after A has requested recorder stop but before `onstop` runs.
96
+ * Queue only that still-held intent, so B cannot be lost or create a concurrent recorder. */
97
+ private resumeQueuedIntent;private finishRetiredRequest;private finishUnusableRequest;private syncCaptureSupport;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues<this>):void;focus(options?:FocusOptions):void;blur():void;
88
98
  /** Programmatically starts/stops a take using the component's configured interaction mode. */
89
99
  click():void;private resolveMimeType;private setState;private announce;
90
- /** Begins a take: requests the microphone, then starts recording. Resolves `false` if the request
91
- * is denied, errors, or the control is disabled/unsupported/already active/requesting. */
92
- start():Promise<boolean>;
100
+ /** Begins a take. A public call creates a programmatic intent; a same-owner physical B press
101
+ * can instead attach its live intent to A's one pending browser permission request. */
102
+ start():Promise<boolean>;private startForIntent;private captureConstraints;private requestPermission;private startRecorder;
93
103
  /** Stops the active take, finalizing it via `lr-record-stop`. No-op unless `state === 'recording'`. */
94
104
  stop():void;
95
105
  /** Discards the active or pending take: fires `lr-record-cancel`, never `lr-record-stop`. */
96
106
  cancel():void;private requestRecorderStop;private finalizeStop;private failRecorder;private teardownStream;private stopRuntimeLoops;private syncElapsedTimer;private syncMaxDurationTimer;private syncLevelMeter;private startLevelMeter;private sampleLevel;private stopLevelMeter;private formatElapsed;private onPointerDown;private onPointerUp;private onPointerCancel;
97
- /** Ends a hold-mode press: stops an active take, or cancels a still-pending permission request
98
- * so recording never silently starts after the user already let go. Mirrors
99
- * disconnectedCallback()'s identical dual check. */
107
+ /** Releasing A only clears A's physical intent. Its browser permission prompt stays available
108
+ * for a same-owner B press; an explicit mode/lifecycle change retires it instead. */
100
109
  private releaseHoldGesture;private onKeyDown;private onKeyUp;private onBlur;private onClick;private get triggerLabel();private get statusText();render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-push-to-talk':LyraPushToTalk;}}
@@ -7,7 +7,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
7
7
  <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
8
8
  <line x1="12" y1="19" x2="12" y2="23"></line>
9
9
  <line x1="8" y1="23" x2="16" y2="23"></line>
10
- `)}function pulseGlyph(){return icon(svg`<circle cx="12" cy="12" r="6"></circle>`)}class LyraPushToTalk extends LyraElement{constructor(){super(...arguments),this._mode="hold",this.timesliceMs=0,this.mimeType="",this.deviceId="",this.levelEvents=!1,this.maxDurationMs=0,this.showTimer=!0,this.disabled=!1,this.elapsedMs=0,this.captureSupported=!1,this._state="idle",this._stream=null,this.chunks=[],this.recordingStartedAt=0,this.cancelRequested=!1,this.recorderStopRequested=!1,this.recorderFailed=!1,this.holdGestureGeneration=0,this.onPointerDown=e=>{if(!(this.mode!=="hold"||this.disabled)){e.preventDefault();try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}this.holdGesture||(this.holdGesture={generation:++this.holdGestureGeneration,source:"pointer",pointerId:e.pointerId},this.start())}},this.onPointerUp=event=>{this.holdGesture?.source!=="pointer"||this.holdGesture.pointerId!==event.pointerId||this.releaseHoldGesture()},this.onPointerCancel=event=>{this.holdGesture?.source!=="pointer"||this.holdGesture.pointerId!==event.pointerId||this.releaseHoldGesture()},this.onKeyDown=e=>{if(!this.disabled){if(e.key==="Escape"){e.preventDefault(),this.cancel();return}e.key!=="Enter"&&e.key!==" "||this.mode==="hold"&&(e.repeat||(e.preventDefault(),!this.holdGesture&&(this.holdGesture={generation:++this.holdGestureGeneration,source:"keyboard",key:e.key},this.start())))}},this.onKeyUp=e=>{e.key!=="Enter"&&e.key!==" "||this.holdGesture?.source!=="keyboard"||this.holdGesture.key!==e.key||this.releaseHoldGesture()},this.onBlur=()=>{this.releaseHoldGesture()},this.onClick=()=>{this.mode!=="toggle"||this.disabled||(this._state==="recording"?this.stop():this.start())}}static{this.defaultStrings={...super.defaultStrings,pushToTalkCancelled:LYRA_DEFAULT_pushToTalkCancelled,pushToTalkDenied:LYRA_DEFAULT_pushToTalkDenied,pushToTalkError:LYRA_DEFAULT_pushToTalkError,pushToTalkHold:LYRA_DEFAULT_pushToTalkHold,pushToTalkRequesting:LYRA_DEFAULT_pushToTalkRequesting,pushToTalkStart:LYRA_DEFAULT_pushToTalkStart,pushToTalkStarted:LYRA_DEFAULT_pushToTalkStarted,pushToTalkStop:LYRA_DEFAULT_pushToTalkStop,pushToTalkStopped:LYRA_DEFAULT_pushToTalkStopped,pushToTalkUnsupported:LYRA_DEFAULT_pushToTalkUnsupported}}static{this.styles=[LyraElement.styles,styles]}get mode(){return this._mode}set mode(next){const normalized=PUSH_TO_TALK_MODE.normalize(next),old=this._mode;old!==normalized&&(this._mode=normalized,this.requestUpdate("mode",old))}get state(){return this._state}get stream(){return this._stream}get ownerWindow(){return this.ownerDocument?.defaultView??null}syncCaptureSupport(){this.captureSupported=isPushToTalkSupported(this.ownerWindow)}connectedCallback(){super.connectedCallback(),this.requestUpdate("mode",void 0),this.hasAttribute("data-state")||this.setAttribute("data-state",this._state)}disconnectedCallback(){this.releaseHoldGesture(),(this._state==="recording"||this._state==="requesting")&&this.cancel(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.syncCaptureSupport()}willUpdate(changed){super.willUpdate(changed),this.hasUpdated?this.syncCaptureSupport():this.seedFirstRenderState(()=>this.syncCaptureSupport()),changed.has("mode")&&this.holdGesture&&this.releaseHoldGesture(),changed.has("disabled")&&this.disabled&&(this.releaseHoldGesture(),(this._state==="recording"||this._state==="requesting")&&this.cancel());const owner=this.captureWindow;this._state!=="recording"||!owner||(changed.has("showTimer")&&this.syncElapsedTimer(owner),changed.has("maxDurationMs")&&this.syncMaxDurationTimer(owner),changed.has("levelEvents")&&this.syncLevelMeter(owner))}focus(options){this.trigger?.focus(options)}blur(){this.trigger?.blur()}click(){this.disabled||!isPushToTalkSupported(this.ownerWindow)||(this.mode==="toggle"?this.trigger?.click():this._state==="recording"?this.stop():this.start())}resolveMimeType(owner){if(this.mimeType)return this.mimeType;for(const candidate of CANDIDATE_MIME_TYPES)if(owner.MediaRecorder.isTypeSupported?.(candidate))return candidate;return""}setState(next){if(this._state===next)return;const old=this._state;this._state=next,this.setAttribute("data-state",next),this.requestUpdate("state",old),this.emit("lr-record-state-change",{state:next})}announce(text){const region=this.liveRegion;region&&(region.mode="polite",region.announce(text,{force:!0}))}async start(){if(this.disabled||this._state==="recording"||this._state==="requesting")return!1;const owner=this.ownerWindow;if(!isPushToTalkSupported(owner))return!1;this.captureWindow=owner,this.cancelRequested=!1,this.setState("requesting");try{const additionalConstraints={...this.audioConstraints??{}};delete additionalConstraints.deviceId;const constraints={audio:{...additionalConstraints,...this.deviceId?{deviceId:{exact:this.deviceId}}:{}}},stream=await owner.navigator.mediaDevices.getUserMedia(constraints);if(this.disabled||!this.isConnected||this.cancelRequested||this.captureWindow!==owner||this.ownerWindow!==owner){for(const track of stream.getTracks())track.stop();return this.cancelRequested=!1,this.captureWindow===owner&&(this.captureWindow=void 0),this.setState("idle"),this.emit("lr-record-cancel",null),this.announce(this.localize("pushToTalkCancelled")),!1}this._stream=stream;const mimeType=this.resolveMimeType(owner),recorder=new owner.MediaRecorder(stream,mimeType?{mimeType}:void 0);this.recorder=recorder,this.recorderStopRequested=!1,this.recorderFailed=!1,this.chunks=[];const timeslice=this.timesliceMs>0?finiteDuration(this.timesliceMs,MAX_TIMEOUT_MS,1,MAX_TIMEOUT_MS):void 0,emitChunksForTake=timeslice!==void 0;return recorder.ondataavailable=e=>{this.recorder!==recorder||this.captureWindow!==owner||!e.data||e.data.size===0||(this.chunks.push(e.data),emitChunksForTake&&this.emit("lr-record-chunk",{blob:e.data}))},recorder.onstop=()=>this.finalizeStop(recorder,owner),recorder.onerror=event=>this.failRecorder(recorder,owner,event.error??new Error("MediaRecorder failed")),recorder.start(timeslice),this.recordingStartedAt=owner.performance.now(),this.elapsedMs=0,this.setState("recording"),this.emit("lr-record-start",{stream}),this.announce(this.localize("pushToTalkStarted")),this.syncLevelMeter(owner),this.syncMaxDurationTimer(owner,!0),this.syncElapsedTimer(owner,!0),!0}catch(err){if(this.teardownStream(),this.cancelRequested||this.disabled||!this.isConnected||this.ownerWindow!==owner)return this.cancelRequested=!1,this.setState("idle"),this.emit("lr-record-cancel",null),this.isConnected&&this.announce(this.localize("pushToTalkCancelled")),!1;const denied=typeof err=="object"&&err!==null&&"name"in err&&err.name==="NotAllowedError";return this.setState(denied?"denied":"error"),this.emit("lr-record-error",{error:err}),this.announce(this.localize(denied?"pushToTalkDenied":"pushToTalkError")),!1}}stop(){this.requestRecorderStop(!1)}cancel(){if(this._state==="requesting"){this.cancelRequested=!0;return}this._state==="recording"&&this.requestRecorderStop(!0)}requestRecorderStop(cancelled){if(this._state!=="recording"||(cancelled&&(this.cancelRequested=!0),this.recorderStopRequested))return;this.recorderStopRequested=!0,this.stopRuntimeLoops();const recorder=this.recorder;recorder&&recorder.state!=="inactive"&&recorder.stop()}finalizeStop(recorder,owner){if(this.recorder!==recorder||this.captureWindow!==owner||this.recorderFailed)return;const cancelled=this.cancelRequested,durationMs=Math.round(owner.performance.now()-this.recordingStartedAt),mimeType=recorder.mimeType||this.resolveMimeType(owner)||"audio/webm",blob=new owner.Blob(this.chunks,{type:mimeType});this.teardownStream(),this.setState("idle"),cancelled?(this.emit("lr-record-cancel",null),this.announce(this.localize("pushToTalkCancelled"))):(this.emit("lr-record-stop",{blob,durationMs}),this.announce(this.localize("pushToTalkStopped"))),this.cancelRequested=!1}failRecorder(recorder,owner,error){this.recorder!==recorder||this.captureWindow!==owner||this.recorderFailed||this.cancelRequested||(this.recorderFailed=!0,this.cancelRequested=!1,this.teardownStream(),this.setState("error"),this.emit("lr-record-error",{error}),this.announce(this.localize("pushToTalkError")))}teardownStream(){for(const track of this._stream?.getTracks()??[])track.stop();this._stream=null,this.recorder&&(this.recorder.ondataavailable=null,this.recorder.onstop=null,this.recorder.onerror=null),this.recorder=void 0,this.recorderStopRequested=!1,this.chunks=[],this.stopRuntimeLoops(),this.captureWindow=void 0}stopRuntimeLoops(){this.tickTimer&&this.tickTimer.owner.clearInterval(this.tickTimer.handle),this.tickTimer=void 0,this.maxDurationTimer&&this.maxDurationTimer.owner.clearTimeout(this.maxDurationTimer.handle),this.maxDurationTimer=void 0,this.stopLevelMeter()}syncElapsedTimer(owner,initial=!1){if(this.tickTimer&&this.tickTimer.owner.clearInterval(this.tickTimer.handle),this.tickTimer=void 0,!this.showTimer||this._state!=="recording"||this.captureWindow!==owner)return;initial||(this.elapsedMs=owner.performance.now()-this.recordingStartedAt);const timer={owner,handle:0};timer.handle=owner.setInterval(()=>{this.tickTimer!==timer||this.captureWindow!==owner||this._state!=="recording"||(this.elapsedMs=owner.performance.now()-this.recordingStartedAt)},1e3),this.tickTimer=timer}syncMaxDurationTimer(owner,initial=!1){if(this.maxDurationTimer&&this.maxDurationTimer.owner.clearTimeout(this.maxDurationTimer.handle),this.maxDurationTimer=void 0,this.maxDurationMs<=0||this._state!=="recording"||this.captureWindow!==owner)return;const duration=finiteDuration(this.maxDurationMs,MAX_TIMEOUT_MS,1,MAX_TIMEOUT_MS),elapsed=initial?0:Math.max(0,owner.performance.now()-this.recordingStartedAt),timer={owner,handle:0};timer.handle=owner.setTimeout(()=>{this.maxDurationTimer!==timer||this.captureWindow!==owner||(this.maxDurationTimer=void 0,this.stop())},Math.max(0,duration-elapsed)),this.maxDurationTimer=timer}syncLevelMeter(owner){if(!this.levelEvents||this._state!=="recording"||this.captureWindow!==owner||!this._stream){this.stopLevelMeter();return}this.audioCtx||this.startLevelMeter(this._stream,owner)}startLevelMeter(stream,owner){const AudioCtxCtor=owner.AudioContext??owner.webkitAudioContext;if(!AudioCtxCtor)return;const audioCtx=new AudioCtxCtor;this.audioCtx=audioCtx;const source=audioCtx.createMediaStreamSource(stream),analyser=audioCtx.createAnalyser();this.analyser=analyser,analyser.fftSize=256,source.connect(analyser),this.levelData=new owner.Uint8Array(analyser.frequencyBinCount),this.sampleLevel(owner)}sampleLevel(owner){if(!this.analyser||!this.levelData||this._state!=="recording"||this.captureWindow!==owner)return;this.analyser.getByteTimeDomainData(this.levelData);let sumSquares=0;for(const v of this.levelData){const norm=(v-128)/128;sumSquares+=norm*norm}const rms=Math.sqrt(sumSquares/this.levelData.length);this.emit("lr-level",{level:Math.min(1,rms)});const request={owner,handle:0};request.handle=owner.requestAnimationFrame(()=>{this.levelFrame===request&&(this.levelFrame=void 0,!(!this.isConnected||this.ownerWindow!==owner)&&this.sampleLevel(owner))}),this.levelFrame=request}stopLevelMeter(){this.levelFrame&&this.levelFrame.owner.cancelAnimationFrame(this.levelFrame.handle),this.levelFrame=void 0,this.analyser=void 0,this.levelData=void 0,this.audioCtx&&(this.audioCtx.close().catch(()=>{}),this.audioCtx=void 0)}formatElapsed(ms){const totalSeconds=Math.floor(ms/1e3),minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60,locale=this.effectiveLocale,minuteText=getNumberFormat(locale,{useGrouping:!1}).format(minutes),secondText=getNumberFormat(locale,{minimumIntegerDigits:2,useGrouping:!1}).format(seconds);return`${minuteText}:${secondText}`}releaseHoldGesture(){this.holdGesture&&(this.holdGesture=void 0,this.holdGestureGeneration+=1,this._state==="requesting"?this.cancel():this.stop())}get triggerLabel(){const override=this.getAttribute("aria-label");return override!==null?override:this.mode==="hold"?this.localize("pushToTalkHold"):this._state==="recording"?this.localize("pushToTalkStop"):this.localize("pushToTalkStart")}get statusText(){if(!this.captureSupported)return this.localize("pushToTalkUnsupported");switch(this._state){case"requesting":return this.localize("pushToTalkRequesting");case"denied":return this.localize("pushToTalkDenied");case"error":return this.localize("pushToTalkError");default:return""}}render(){const supported=this.captureSupported,recording=this._state==="recording",status=this.statusText;return html`
10
+ `)}function pulseGlyph(){return icon(svg`<circle cx="12" cy="12" r="6"></circle>`)}class LyraPushToTalk extends LyraElement{constructor(){super(...arguments),this._mode="hold",this.timesliceMs=0,this.mimeType="",this.deviceId="",this.levelEvents=!1,this.maxDurationMs=0,this.showTimer=!0,this.disabled=!1,this.elapsedMs=0,this.captureSupported=!1,this._state="idle",this._stream=null,this.chunks=[],this.recordingStartedAt=0,this.lifecycleGeneration=0,this.captureSequence=0,this.intentSequence=0,this.cancelRequested=!1,this.recorderStopRequested=!1,this.recorderFailed=!1,this.onPointerDown=e=>{if(this.mode!=="hold"||this.disabled)return;e.preventDefault();try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}if(this.holdGesture)return;const intent=this.createIntent("hold",{source:"pointer",pointerId:e.pointerId});intent&&(this.holdGesture=intent,this.startForIntent(intent))},this.onPointerUp=event=>{this.holdGesture?.source!=="pointer"||this.holdGesture.pointerId!==event.pointerId||this.releaseHoldGesture()},this.onPointerCancel=event=>{this.holdGesture?.source!=="pointer"||this.holdGesture.pointerId!==event.pointerId||this.releaseHoldGesture()},this.onKeyDown=e=>{if(this.disabled)return;if(e.key==="Escape"){e.preventDefault(),this.cancel();return}if(e.key!=="Enter"&&e.key!==" "||this.mode!=="hold"||e.repeat||(e.preventDefault(),this.holdGesture))return;const intent=this.createIntent("hold",{source:"keyboard",key:e.key});intent&&(this.holdGesture=intent,this.startForIntent(intent))},this.onKeyUp=e=>{e.key!=="Enter"&&e.key!==" "||this.holdGesture?.source!=="keyboard"||this.holdGesture.key!==e.key||this.releaseHoldGesture()},this.onBlur=()=>{this.releaseHoldGesture()},this.onClick=()=>{this.mode!=="toggle"||this.disabled||(this._state==="recording"?this.stop():this.start())}}static{this.defaultStrings={...super.defaultStrings,pushToTalkCancelled:LYRA_DEFAULT_pushToTalkCancelled,pushToTalkDenied:LYRA_DEFAULT_pushToTalkDenied,pushToTalkError:LYRA_DEFAULT_pushToTalkError,pushToTalkHold:LYRA_DEFAULT_pushToTalkHold,pushToTalkRequesting:LYRA_DEFAULT_pushToTalkRequesting,pushToTalkStart:LYRA_DEFAULT_pushToTalkStart,pushToTalkStarted:LYRA_DEFAULT_pushToTalkStarted,pushToTalkStop:LYRA_DEFAULT_pushToTalkStop,pushToTalkStopped:LYRA_DEFAULT_pushToTalkStopped,pushToTalkUnsupported:LYRA_DEFAULT_pushToTalkUnsupported}}static{this.styles=[LyraElement.styles,styles]}get mode(){return this._mode}set mode(next){const normalized=PUSH_TO_TALK_MODE.normalize(next),old=this._mode;old!==normalized&&(this._mode=normalized,this.requestUpdate("mode",old))}get state(){return this._state}get stream(){return this._stream}get ownerWindow(){return this.ownerDocument?.defaultView??null}get captureOwner(){const owner=this.ownerWindow;if(isPushToTalkSupported(owner))return{document:this.ownerDocument,window:owner,generation:this.lifecycleGeneration}}ownsCurrentLifecycle(owner){return this.isConnected&&this.isCurrentRealm(owner)&&this.lifecycleGeneration===owner.generation}isCurrentRealm(owner){return this.ownerDocument===owner.document&&this.ownerWindow===owner.window}rebaseCurrentRealmOwner(owner){this.isCurrentRealm(owner)&&(owner.generation=this.lifecycleGeneration)}createIntent(kind,details={}){const owner=this.captureOwner;if(!owner)return;const intent={id:++this.intentSequence,owner,kind,...details};return this.captureIntent=intent,intent}isLiveIntent(intent){return this.captureIntent===intent&&!this.disabled&&this.ownsCurrentLifecycle(intent.owner)&&(intent.kind!=="hold"||this.holdGesture===intent)}clearIntent(intent){this.captureIntent===intent&&(this.captureIntent=void 0),this.holdGesture===intent&&(this.holdGesture=void 0),this.queuedIntent===intent&&(this.queuedIntent=void 0)}retirePendingRequest(request,notifyCancellation){request.invalidated=!0,request.notifyCancellation||=notifyCancellation,request.retiredAtIntentId=this.intentSequence,request.retiredAtGeneration=this.lifecycleGeneration,this.pendingRequest===request&&(this.pendingRequest=void 0),this.clearIntent(request.intent),this._state==="requesting"&&!this.activeCapture&&this.setState("idle")}invalidateLifecycle(notifyCancellation,retainCurrentRealmIntents=!1){this.lifecycleGeneration+=1,this.captureIntent&&retainCurrentRealmIntents&&this.isCurrentRealm(this.captureIntent.owner)?this.rebaseCurrentRealmOwner(this.captureIntent.owner):this.captureIntent=void 0,this.holdGesture&&retainCurrentRealmIntents&&this.isCurrentRealm(this.holdGesture.owner)?this.rebaseCurrentRealmOwner(this.holdGesture.owner):this.holdGesture=void 0,this.queuedIntent&&retainCurrentRealmIntents&&this.isCurrentRealm(this.queuedIntent.owner)?this.rebaseCurrentRealmOwner(this.queuedIntent.owner):this.queuedIntent=void 0;const request=this.pendingRequest;request&&(retainCurrentRealmIntents&&this.isCurrentRealm(request.owner)?this.rebaseCurrentRealmOwner(request.owner):this.retirePendingRequest(request,notifyCancellation));const active=this.activeCapture;active&&(active.notifyCancellation&&=notifyCancellation,this.requestRecorderStop(!0))}canAdoptRequest(request,intent){return this.pendingRequest===request&&!request.invalidated&&this._state==="requesting"&&this.ownsCurrentLifecycle(request.owner)&&this.isLiveIntent(intent)&&request.owner.document===intent.owner.document&&request.owner.window===intent.owner.window&&request.owner.generation===intent.owner.generation}canStartRequest(request){return this.canAdoptRequest(request,request.intent)}notifyCancellation(){this.emit("lr-record-cancel",null),this.isConnected&&this.announce(this.localize("pushToTalkCancelled"))}resumeQueuedIntent(){const intent=this.queuedIntent;this.queuedIntent=void 0,!(!intent||!this.isLiveIntent(intent))&&this.startForIntent(intent)}finishRetiredRequest(request){request.notifyCancellation&&!request.cancellationNotified&&request.retiredAtIntentId===this.intentSequence&&request.retiredAtGeneration===this.lifecycleGeneration&&!this.pendingRequest&&!this.activeCapture&&!this.captureIntent&&(request.cancellationNotified=!0,this.notifyCancellation())}finishUnusableRequest(request){if(request.invalidated){this.finishRetiredRequest(request);return}this.pendingRequest===request&&(this.pendingRequest=void 0),this.clearIntent(request.intent),this._state==="requesting"&&!this.activeCapture&&this.setState("idle"),this.notifyCancellation()}syncCaptureSupport(){this.captureSupported=isPushToTalkSupported(this.ownerWindow)}connectedCallback(){super.connectedCallback(),this.requestUpdate("mode",void 0),this.hasAttribute("data-state")||this.setAttribute("data-state",this._state)}disconnectedCallback(){const previousOwner=this.activeCapture?.owner??this.pendingRequest?.owner;this.invalidateLifecycle(!1,!!previousOwner&&!this.isCurrentRealm(previousOwner)),super.disconnectedCallback()}adoptedCallback(){this.invalidateLifecycle(!1,!0),super.adoptedCallback(),this.syncCaptureSupport()}willUpdate(changed){super.willUpdate(changed),this.hasUpdated?this.syncCaptureSupport():this.seedFirstRenderState(()=>this.syncCaptureSupport()),changed.has("mode")&&changed.get("mode")!==void 0&&this.holdGesture&&this.releaseHoldGesture(!0),changed.has("disabled")&&this.disabled&&this.invalidateLifecycle(!0);const owner=this.captureWindow;this._state!=="recording"||!owner||(changed.has("showTimer")&&this.syncElapsedTimer(owner),changed.has("maxDurationMs")&&this.syncMaxDurationTimer(owner),changed.has("levelEvents")&&this.syncLevelMeter(owner))}focus(options){this.trigger?.focus(options)}blur(){this.trigger?.blur()}click(){this.disabled||!isPushToTalkSupported(this.ownerWindow)||(this.mode==="toggle"?this.trigger?.click():this._state==="recording"?this.stop():this.start())}resolveMimeType(owner){if(this.mimeType)return this.mimeType;for(const candidate of CANDIDATE_MIME_TYPES)if(owner.MediaRecorder.isTypeSupported?.(candidate))return candidate;return""}setState(next){if(this._state===next)return;const old=this._state;this._state=next,this.setAttribute("data-state",next),this.requestUpdate("state",old),this.emit("lr-record-state-change",{state:next})}announce(text){const region=this.liveRegion;region&&(region.mode="polite",region.announce(text,{force:!0}))}async start(){if(this.disabled||this._state==="recording")return!1;const intent=this.createIntent("programmatic");return intent?this.startForIntent(intent):!1}startForIntent(intent){const pending=this.pendingRequest;if(pending)return this.canAdoptRequest(pending,intent)?(pending.intent=intent,pending.completion??Promise.resolve(!1)):(this.clearIntent(intent),Promise.resolve(!1));if(this._state==="recording")return intent.kind==="hold"&&this.activeCapture&&this.recorderStopRequested&&this.isLiveIntent(intent)?(this.queuedIntent=intent,Promise.resolve(!1)):(this.clearIntent(intent),Promise.resolve(!1));if(!this.isLiveIntent(intent))return this.clearIntent(intent),Promise.resolve(!1);const request={id:++this.captureSequence,owner:intent.owner,intent,invalidated:!1,notifyCancellation:!1,cancellationNotified:!1};this.pendingRequest=request,this.setState("requesting");const completion=this.requestPermission(request);return request.completion=completion,completion}captureConstraints(){const additionalConstraints={...this.audioConstraints??{}};return delete additionalConstraints.deviceId,{audio:{...additionalConstraints,...this.deviceId?{deviceId:{exact:this.deviceId}}:{}}}}async requestPermission(request){try{const stream=await request.owner.window.navigator.mediaDevices.getUserMedia(this.captureConstraints());if(!this.canStartRequest(request)){for(const track of stream.getTracks())track.stop();return this.finishUnusableRequest(request),!1}return this.pendingRequest=void 0,this.startRecorder(request,stream)}catch(error){if(!this.canStartRequest(request))return this.finishUnusableRequest(request),!1;this.pendingRequest=void 0,this.clearIntent(request.intent);const denied=typeof error=="object"&&error!==null&&"name"in error&&error.name==="NotAllowedError";return this.setState(denied?"denied":"error"),this.emit("lr-record-error",{error}),this.announce(this.localize(denied?"pushToTalkDenied":"pushToTalkError")),!1}}startRecorder(request,stream){const owner=request.owner.window,active={id:request.id,owner:request.owner,intent:request.intent,notifyCancellation:!0};this.activeCapture=active,this.captureWindow=owner,this._stream=stream,this.cancelRequested=!1,this.recorderStopRequested=!1,this.recorderFailed=!1,this.chunks=[];try{const mimeType=this.resolveMimeType(owner),recorder=new owner.MediaRecorder(stream,mimeType?{mimeType}:void 0);this.recorder=recorder;const timeslice=this.timesliceMs>0?finiteDuration(this.timesliceMs,MAX_TIMEOUT_MS,1,MAX_TIMEOUT_MS):void 0,emitChunksForTake=timeslice!==void 0;return recorder.ondataavailable=event=>{this.recorder!==recorder||this.activeCapture!==active||!event.data||event.data.size===0||(this.chunks.push(event.data),emitChunksForTake&&this.emit("lr-record-chunk",{blob:event.data}))},recorder.onstop=()=>this.finalizeStop(recorder,active),recorder.onerror=event=>this.failRecorder(recorder,active,event.error??new Error("MediaRecorder failed")),recorder.start(timeslice),this.recordingStartedAt=owner.performance.now(),this.elapsedMs=0,this.setState("recording"),this.emit("lr-record-start",{stream}),this.announce(this.localize("pushToTalkStarted")),this.syncLevelMeter(owner),this.syncMaxDurationTimer(owner,!0),this.syncElapsedTimer(owner,!0),!0}catch(error){if(this.activeCapture!==active){for(const track of stream.getTracks())track.stop();return!1}return this.teardownStream(active),this.clearIntent(active.intent),this.setState("error"),this.emit("lr-record-error",{error}),this.announce(this.localize("pushToTalkError")),!1}}stop(){this.requestRecorderStop(!1)}cancel(){const pending=this.pendingRequest;if(pending&&this._state==="requesting"){this.retirePendingRequest(pending,!0);return}this._state==="recording"&&this.requestRecorderStop(!0)}requestRecorderStop(cancelled){const active=this.activeCapture;if(this._state!=="recording"||!active||(cancelled&&(this.cancelRequested=!0),this.recorderStopRequested))return;this.recorderStopRequested=!0,this.stopRuntimeLoops();const recorder=this.recorder;recorder&&recorder.state!=="inactive"&&recorder.stop()}finalizeStop(recorder,active){if(this.recorder!==recorder||this.activeCapture!==active||this.recorderFailed)return;const owner=active.owner.window,cancelled=this.cancelRequested,durationMs=Math.round(owner.performance.now()-this.recordingStartedAt),mimeType=recorder.mimeType||this.resolveMimeType(owner)||"audio/webm",blob=new owner.Blob(this.chunks,{type:mimeType});this.teardownStream(active),this.clearIntent(active.intent),this.setState("idle"),cancelled?active.notifyCancellation&&this.notifyCancellation():(this.emit("lr-record-stop",{blob,durationMs}),this.announce(this.localize("pushToTalkStopped"))),this.cancelRequested=!1,this.resumeQueuedIntent()}failRecorder(recorder,active,error){this.recorder!==recorder||this.activeCapture!==active||this.recorderFailed||this.cancelRequested||(this.recorderFailed=!0,this.cancelRequested=!1,this.teardownStream(active),this.clearIntent(active.intent),this.setState("error"),this.emit("lr-record-error",{error}),this.announce(this.localize("pushToTalkError")),this.resumeQueuedIntent())}teardownStream(active=this.activeCapture){if(!(!active||this.activeCapture!==active)){for(const track of this._stream?.getTracks()??[])track.stop();this._stream=null,this.recorder&&(this.recorder.ondataavailable=null,this.recorder.onstop=null,this.recorder.onerror=null),this.recorder=void 0,this.recorderStopRequested=!1,this.chunks=[],this.stopRuntimeLoops(),this.captureWindow=void 0,this.activeCapture=void 0}}stopRuntimeLoops(){this.tickTimer&&this.tickTimer.owner.clearInterval(this.tickTimer.handle),this.tickTimer=void 0,this.maxDurationTimer&&this.maxDurationTimer.owner.clearTimeout(this.maxDurationTimer.handle),this.maxDurationTimer=void 0,this.stopLevelMeter()}syncElapsedTimer(owner,initial=!1){this.tickTimer&&this.tickTimer.owner.clearInterval(this.tickTimer.handle),this.tickTimer=void 0;const active=this.activeCapture;if(!this.showTimer||this._state!=="recording"||!active||active.owner.window!==owner||!this.ownsCurrentLifecycle(active.owner))return;initial||(this.elapsedMs=owner.performance.now()-this.recordingStartedAt);const timer={owner,handle:0};timer.handle=owner.setInterval(()=>{this.tickTimer!==timer||this.activeCapture!==active||this._state!=="recording"||!this.ownsCurrentLifecycle(active.owner)||(this.elapsedMs=owner.performance.now()-this.recordingStartedAt)},1e3),this.tickTimer=timer}syncMaxDurationTimer(owner,initial=!1){this.maxDurationTimer&&this.maxDurationTimer.owner.clearTimeout(this.maxDurationTimer.handle),this.maxDurationTimer=void 0;const active=this.activeCapture;if(this.maxDurationMs<=0||this._state!=="recording"||!active||active.owner.window!==owner||!this.ownsCurrentLifecycle(active.owner))return;const duration=finiteDuration(this.maxDurationMs,MAX_TIMEOUT_MS,1,MAX_TIMEOUT_MS),elapsed=initial?0:Math.max(0,owner.performance.now()-this.recordingStartedAt),timer={owner,handle:0};timer.handle=owner.setTimeout(()=>{this.maxDurationTimer!==timer||this.activeCapture!==active||!this.ownsCurrentLifecycle(active.owner)||(this.maxDurationTimer=void 0,this.stop())},Math.max(0,duration-elapsed)),this.maxDurationTimer=timer}syncLevelMeter(owner){const active=this.activeCapture;if(!this.levelEvents||this._state!=="recording"||!active||active.owner.window!==owner||!this.ownsCurrentLifecycle(active.owner)||!this._stream){this.stopLevelMeter();return}this.audioCtx||this.startLevelMeter(this._stream,owner)}startLevelMeter(stream,owner){const AudioCtxCtor=owner.AudioContext??owner.webkitAudioContext;if(!AudioCtxCtor)return;const audioCtx=new AudioCtxCtor;this.audioCtx=audioCtx;const source=audioCtx.createMediaStreamSource(stream),analyser=audioCtx.createAnalyser();this.analyser=analyser,analyser.fftSize=256,source.connect(analyser),this.levelData=new owner.Uint8Array(analyser.frequencyBinCount),this.sampleLevel(owner)}sampleLevel(owner){const active=this.activeCapture;if(!this.analyser||!this.levelData||this._state!=="recording"||!active||active.owner.window!==owner||!this.ownsCurrentLifecycle(active.owner))return;this.analyser.getByteTimeDomainData(this.levelData);let sumSquares=0;for(const v of this.levelData){const norm=(v-128)/128;sumSquares+=norm*norm}const rms=Math.sqrt(sumSquares/this.levelData.length);this.emit("lr-level",{level:Math.min(1,rms)});const request={owner,handle:0};request.handle=owner.requestAnimationFrame(()=>{this.levelFrame!==request||this.activeCapture!==active||(this.levelFrame=void 0,this.ownsCurrentLifecycle(active.owner)&&this.sampleLevel(owner))}),this.levelFrame=request}stopLevelMeter(){this.levelFrame&&this.levelFrame.owner.cancelAnimationFrame(this.levelFrame.handle),this.levelFrame=void 0,this.analyser=void 0,this.levelData=void 0,this.audioCtx&&(this.audioCtx.close().catch(()=>{}),this.audioCtx=void 0)}formatElapsed(ms){const totalSeconds=Math.floor(ms/1e3),minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60,locale=this.effectiveLocale,minuteText=getNumberFormat(locale,{useGrouping:!1}).format(minutes),secondText=getNumberFormat(locale,{minimumIntegerDigits:2,useGrouping:!1}).format(seconds);return`${minuteText}:${secondText}`}releaseHoldGesture(retirePending=!1){const intent=this.holdGesture;if(!intent)return;this.holdGesture=void 0,this.captureIntent===intent&&(this.captureIntent=void 0),this.queuedIntent===intent&&(this.queuedIntent=void 0);const pending=this.pendingRequest;if(pending?.intent===intent){retirePending&&this.retirePendingRequest(pending,!0);return}this.activeCapture?.intent===intent&&this.requestRecorderStop(!1)}get triggerLabel(){const override=this.getAttribute("aria-label");return override!==null?override:this.mode==="hold"?this.localize("pushToTalkHold"):this._state==="recording"?this.localize("pushToTalkStop"):this.localize("pushToTalkStart")}get statusText(){if(!this.captureSupported)return this.localize("pushToTalkUnsupported");switch(this._state){case"requesting":return this.localize("pushToTalkRequesting");case"denied":return this.localize("pushToTalkDenied");case"error":return this.localize("pushToTalkError");default:return""}}render(){const supported=this.captureSupported,recording=this._state==="recording",status=this.statusText;return html`
11
11
  <button
12
12
  part="trigger"
13
13
  type="button"
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{align-items:center;gap:var(--lr-space-xs);flex-direction:column;min-inline-size:0;max-inline-size:100%;display:inline-flex}:host([disabled]){cursor:not-allowed}[part=trigger]{inline-size:var(--lr-push-to-talk-size,var(--lr-size-3rem));block-size:var(--lr-push-to-talk-size,var(--lr-size-3rem));min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;touch-action:none;border-radius:50%;justify-content:center;align-items:center;display:inline-flex;position:relative}[part=trigger]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=trigger]:disabled{opacity:var(--lr-opacity-disabled);cursor:not-allowed}:where([part=trigger]):hover:where(:not(:disabled)){background:var(--lr-color-brand-quiet)}:where([part=trigger]):active:where(:not(:disabled)){background:color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active))}:host([data-state=recording]) [part=trigger]{border-color:var(--lr-push-to-talk-trigger-recording-border-color,var(--lr-push-to-talk-recording-color,var(--lr-color-danger)));color:var(--lr-push-to-talk-trigger-recording-color,var(--lr-push-to-talk-recording-color,var(--lr-color-danger)))}[part=icon]{line-height:var(--lr-line-height-none);display:inline-flex}[part=pulse]{inset:calc(-1 * var(--lr-size-4px));border:var(--lr-border-width-medium) solid var(--lr-push-to-talk-pulse-recording-border-color,var(--lr-push-to-talk-recording-color,var(--lr-color-danger)));pointer-events:none;animation:lr-push-to-talk-pulse var(--lr-transition-ambient) infinite;border-radius:50%;position:absolute}@keyframes lr-push-to-talk-pulse{0%,to{opacity:.7;transform:scale(.9)}50%{opacity:.2;transform:scale(1.15)}}@media (prefers-reduced-motion:reduce){[part=pulse]{opacity:.6;transform:none;animation:none!important}}[part=status]{overflow-wrap:anywhere;max-inline-size:100%;font-size:var(--lr-font-size-sm);color:var(--lr-color-text-quiet);text-align:center}[part=timer]{font-size:var(--lr-font-size-sm);font-variant-numeric:tabular-nums;color:var(--lr-color-text-quiet)}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{align-items:center;gap:var(--lr-space-xs);flex-direction:column;min-inline-size:0;max-inline-size:100%;display:inline-flex}:host([disabled]){cursor:not-allowed}[part=trigger]{font:inherit;inline-size:var(--lr-push-to-talk-size,var(--lr-size-3rem));block-size:var(--lr-push-to-talk-size,var(--lr-size-3rem));min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;touch-action:none;border-radius:50%;justify-content:center;align-items:center;display:inline-flex;position:relative}[part=trigger]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=trigger]:disabled{opacity:var(--lr-opacity-disabled);cursor:not-allowed}:where([part=trigger]):hover:where(:not(:disabled)){background:var(--lr-color-brand-quiet)}:where([part=trigger]):active:where(:not(:disabled)){background:color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active))}:host([data-state=recording]) [part=trigger]{border-color:var(--lr-push-to-talk-trigger-recording-border-color,var(--lr-push-to-talk-recording-color,var(--lr-color-danger)));color:var(--lr-push-to-talk-trigger-recording-color,var(--lr-push-to-talk-recording-color,var(--lr-color-danger)))}[part=icon]{line-height:var(--lr-line-height-none);display:inline-flex}[part=pulse]{inset:calc(-1 * var(--lr-size-4px));border:var(--lr-border-width-medium) solid var(--lr-push-to-talk-pulse-recording-border-color,var(--lr-push-to-talk-recording-color,var(--lr-color-danger)));pointer-events:none;animation:lr-push-to-talk-pulse var(--lr-transition-ambient) infinite;border-radius:50%;position:absolute}@keyframes lr-push-to-talk-pulse{0%,to{opacity:.7;transform:scale(.9)}50%{opacity:.2;transform:scale(1.15)}}@media (prefers-reduced-motion:reduce){[part=pulse]{opacity:.6;transform:none;animation:none!important}}[part=status]{overflow-wrap:anywhere;max-inline-size:100%;font-size:var(--lr-font-size-sm);color:var(--lr-color-text-quiet);text-align:center}[part=timer]{font-size:var(--lr-font-size-sm);font-variant-numeric:tabular-nums;color:var(--lr-color-text-quiet)}`;export{styles};
@@ -51,19 +51,22 @@ anchor:DocumentLocator|null;rect:DOMRectReadOnly|null;
51
51
  * moves to the nearest action or the stable toolbar when the set becomes empty. Duplicate names
52
52
  * normalize first-wins.
53
53
  */
54
- actions:readonly SelectionAction[];label:string;accessibleLabel:string|null;private copyFailed;private toolbar?;private overlay?;private stopPositioning?;private activeActionIndex;private lifecycleGeneration;private positioningGeneration;private rovingGeneration;private pendingActionFocus?;private focusedAction?;private actionObserver?;private managedActionStops;private authoredActionTabIndex;private get effectiveActions();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private syncOpenLifecycle;private dismiss;private activate;private isCurrentLifecycle;
54
+ actions:readonly SelectionAction[];label:string;accessibleLabel:string|null;private copyFailed;private toolbar?;private overlay?;private stopPositioning?;private activeActionIndex;private lifecycleGeneration;private positioningGeneration;private rovingGeneration;private pendingActionFocus?;private focusedAction?;private actionObserver?;private managedActionStops;private actionTabIndexLeases;private get effectiveActions();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private syncOpenLifecycle;private dismiss;private activate;private isCurrentLifecycle;
55
55
  /** Every stop in the `role="toolbar"` roving group, in rendered order: the built-in actions
56
56
  * first, then whatever a consumer slotted into `actions`. Slotted stops live in the host's
57
57
  * light DOM (not `renderRoot`), so every containment check below has to accept both. */
58
58
  private actionButtons;private actionRoots;private actionForStop;
59
59
  /** Whether `button` is still one of this toolbar's own stops -- rendered inside the shadow root,
60
60
  * or slotted as a light-DOM child of the host. */
61
- private ownsActionButton;private onActionsSlotChange;private syncRovingStops;private setRovingStops;private observeActionChanges;private onActionMutations;private onToolbarFocusIn;private containNativeEvent;private onToolbarFocusOut;private onToolbarKeyDown;private actionPartNames;private actionLabel;
61
+ private ownsActionButton;private onActionsSlotChange;private syncRovingStops;
62
+ /** A manager-written tabindex must not turn an otherwise non-action element into a permanent
63
+ * authored action after that manager releases it. */
64
+ private hasAuthoredActionTabIndex;private writeActionTabIndex;private releaseActionTabIndex;private releaseManagedActionStops;private setRovingStops;private observeActionChanges;private onActionMutations;private onToolbarFocusIn;private containNativeEvent;private onToolbarFocusOut;private onToolbarKeyDown;private actionPartNames;private actionLabel;
62
65
  /** Coerces a caller-supplied `rect` to finite geometry before it reaches any style sink --
63
66
  * `rect` is typed `DOMRectReadOnly`, but TS cannot enforce that across the property boundary,
64
67
  * and `coordinates()` feeds a `styleMap()` whose first commit serializes the whole `style`
65
68
  * value as one string (see `sanitizeCssColor`'s doc comment for why that matters). */
66
- private safeRect;private viewportBounds;private coordinates;
69
+ private safeRect;private viewportBounds;private px;private coordinates;
67
70
  /** Resolves the shared selection-anchor and collision-edge distance from the host's live
68
71
  * custom property. Placement works in viewport pixels, so it must not pass an unresolved CSS
69
72
  * expression into geometry math; unsupported values retain the historical 8px fallback. */
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{styleMap}from"lit/directives/style-map.js";import{deepActiveElementIn}from"../../../internal/active-element.js";import{resolveCssLength}from"../../../internal/css-length.js";import{composedParentElement}from"../../../internal/active-element.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets,isActionableElement,isSemanticActionElement}from"../../../internal/focus-navigation.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteNumber,finiteRange}from"../../../internal/numbers.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{activateNonmodalOverlay,composedContains}from"../../../internal/nonmodal-overlay-manager.js";import{styles}from"./selection-toolbar.styles.js";import{LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_selectionAsk,LYRA_DEFAULT_selectionCite,LYRA_DEFAULT_selectionQuote,LYRA_DEFAULT_selectionToolbarLabel}from"../../../internal/default-strings.generated.js";const SELECTION_ACTIONS=["ask","quote","cite","copy"],DEFAULT_PLACEMENT_GAP_PX=8;class LyraSelectionToolbar extends LyraElement{constructor(){super(...arguments),this.open=!1,this.text="",this.anchor=null,this.rect=null,this.actions=["ask","quote","cite","copy"],this.label="",this.accessibleLabel=null,this.copyFailed=!1,this.activeActionIndex=0,this.lifecycleGeneration=0,this.positioningGeneration=0,this.rovingGeneration=0,this.managedActionStops=new Set,this.authoredActionTabIndex=new WeakMap,this.onActionsSlotChange=()=>{this.syncRovingStops()},this.onActionMutations=records=>{for(const record of records){if(record.type!=="attributes"||record.attributeName!=="tabindex")continue;const target=record.target;this.authoredActionTabIndex.has(target)&&this.authoredActionTabIndex.set(target,target.getAttribute("tabindex"))}this.syncRovingStops()},this.onToolbarFocusIn=event=>{const buttons=this.actionButtons(),path=event.composedPath(),index=buttons.findIndex(button=>path.includes(button));if(index<0){this.focusedAction=void 0;return}const origin=path[0],stop=origin?.nodeType===1&&typeof origin.focus=="function"?origin:buttons[index],toolbar=this.toolbar,repair=stop&&toolbar?captureComposedFocusRepair(stop,toolbar):null;this.focusedAction=stop&&repair?{action:this.actionForStop(stop),index,repair,stop}:void 0,this.syncRovingStops(index)},this.containNativeEvent=event=>{event.stopPropagation()},this.onToolbarFocusOut=event=>{const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedAction=void 0)},this.onToolbarKeyDown=event=>{const buttons=this.actionButtons();if(buttons.length===0)return;const originIndex=buttons.findIndex(button=>event.composedPath().includes(button)),currentIndex=originIndex>=0?originIndex:this.activeActionIndex,forward=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backward=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let next;if(event.key===forward)next=(currentIndex+1)%buttons.length;else if(event.key===backward)next=(currentIndex-1+buttons.length)%buttons.length;else if(event.key==="Home")next=0;else if(event.key==="End")next=buttons.length-1;else return;event.preventDefault(),this.focusedAction=void 0;const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView;this.syncRovingStops(next).then(button=>{!button||!this.isCurrentLifecycle(generation,owner)||!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)||button.focus()})},this.updateToolbarPosition=()=>{const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view)return;const gap=this.placementGapPx(),edge=gap,viewport=this.viewportBounds(view),rect=this.safeRect(this.rect??new view.DOMRect(viewport.left+viewport.width/2,viewport.top,0,0));toolbar.style.setProperty("--_lr-selection-toolbar-max-inline-size",`${Math.max(0,viewport.width-edge*2)}px`),toolbar.style.setProperty("--_lr-selection-toolbar-max-block-size",`${Math.max(0,viewport.height-edge*2)}px`);const width=toolbar.offsetWidth,height=toolbar.offsetHeight,desiredInline=rect.left+rect.width/2,desiredLeft=desiredInline-width/2,minLeft=viewport.left+edge,maxLeft=Math.max(minLeft,viewport.right-width-edge),left=Math.min(maxLeft,Math.max(minLeft,desiredLeft)),above=rect.top-height-gap,below=rect.bottom+gap,minTop=viewport.top+edge,desiredTop=above>=minTop?above:below,maxTop=Math.max(minTop,viewport.bottom-height-edge),top=Math.min(maxTop,Math.max(minTop,desiredTop)),logicalInline=this.effectiveDirection==="rtl"?viewport.layoutWidth-desiredInline:desiredInline;toolbar.style.setProperty("--_lr-selection-toolbar-inline-start",`${logicalInline}px`),toolbar.style.setProperty("--_lr-selection-toolbar-block-start",`${rect.top}px`),toolbar.style.setProperty("--_lr-selection-toolbar-inline-shift",`${left-(desiredInline-width/2)}px`),toolbar.style.setProperty("--_lr-selection-toolbar-block-shift",`${top-(rect.top-height)}px`),toolbar.toggleAttribute("data-positioned",!0)}}static{this.defaultStrings={...super.defaultStrings,copy:LYRA_DEFAULT_copy,copyFailed:LYRA_DEFAULT_copyFailed,selectionAsk:LYRA_DEFAULT_selectionAsk,selectionCite:LYRA_DEFAULT_selectionCite,selectionQuote:LYRA_DEFAULT_selectionQuote,selectionToolbarLabel:LYRA_DEFAULT_selectionToolbarLabel}}static{this.ownedCollectionProperties=Object.freeze(["anchor","actions"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-selection-action"])}get effectiveActions(){const seen=new Set,actions=[];for(const value of this.actions){if(typeof value!="string"||!SELECTION_ACTIONS.includes(value)||seen.has(value))continue;const action=value;seen.add(action),actions.push(action)}return actions}connectedCallback(){super.connectedCallback(),this.hasUpdated&&(this.syncOpenLifecycle(),this.syncRovingStops())}disconnectedCallback(){this.lifecycleGeneration++,this.rovingGeneration++,this.pendingActionFocus=void 0,this.focusedAction=void 0,this.actionObserver?.disconnect(),this.actionObserver=void 0,this.retirePositioning(),this.overlay?.suspend(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.lifecycleGeneration++,this.rovingGeneration++,this.pendingActionFocus=void 0,this.focusedAction=void 0,this.actionObserver?.disconnect(),this.actionObserver=void 0,this.retirePositioning()}willUpdate(changed){if(super.willUpdate(changed),this.copyFailed&&(changed.has("text")||changed.has("open")&&this.open)&&(this.copyFailed=!1),!changed.has("actions"))return;const active=deepActiveElementIn(this.ownerDocument),toolbar=this.toolbar;if(!active||!toolbar)return;const index=this.actionButtons().indexOf(active);if(index<0)return;const repair=captureComposedFocusRepair(active,toolbar);repair&&(this.pendingActionFocus={action:this.actionForStop(active),index,repair,stop:active})}updated(changed){if(super.updated(changed),(changed.has("open")||changed.has("text"))&&this.syncOpenLifecycle(),this.open&&this.text&&(changed.has("rect")||changed.has("actions"))&&this.updateToolbarPosition(),this.open&&this.text&&(changed.has("open")||changed.has("text")||changed.has("actions"))){const pending=changed.has("actions")?this.pendingActionFocus:void 0;if(this.pendingActionFocus=void 0,!pending){this.syncRovingStops();return}this.syncRovingStops(pending.index,pending)}}syncOpenLifecycle(){if(!this.isConnected){this.retirePositioning(),this.overlay?.deactivate(),this.overlay=void 0;return}if(!this.open||!this.text){this.retirePositioning(),this.overlay?.deactivate(),this.overlay=void 0;return}this.overlay?.isActive()?this.overlay.resume():this.overlay=activateNonmodalOverlay({host:this,panel:()=>this.toolbar??null,onEscape:()=>this.dismiss()}),this.startPositioning()}dismiss(){this.open&&(this.open=!1,this.emit("lr-dismiss",null))}async activate(action){const text=this.text,anchor=this.anchor,generation=this.lifecycleGeneration,owner=this.isConnected?this.ownerDocument.defaultView:null;if(this.copyFailed=!1,action==="copy"){const outcome=await writeClipboardText(owner,text);if(!this.isCurrentLifecycle(generation,owner))return;if(!outcome.ok){this.copyFailed=!0,this.emit("lr-error",null),this.emit("lr-copy-error",outcome);return}this.emit("lr-copy",outcome)}this.isCurrentLifecycle(generation,owner)&&this.emit("lr-selection-action",{action,text,anchor})}isCurrentLifecycle(generation,owner){return generation===this.lifecycleGeneration&&this.isConnected&&this.ownerDocument.defaultView===owner}actionButtons(){const toolbar=this.toolbar;return toolbar?collectComposedFocusTargets(toolbar,{mode:"programmatic",includeRoot:!1}).elements.filter(button=>!!isSemanticActionElement(button)||(this.authoredActionTabIndex.has(button)?this.authoredActionTabIndex.get(button)!==null:button.hasAttribute("tabindex"))):[]}actionRoots(){const builtIn=[...this.renderRoot.querySelectorAll("lr-button[data-action]")],slot=this.renderRoot.querySelector('slot[name="actions"]');return[...builtIn,...slot?.assignedElements({flatten:!0})??[]]}actionForStop(stop){const action=[...this.renderRoot.querySelectorAll("lr-button[data-action]")].find(button=>composedContains(button,stop))?.getAttribute("data-action");return action&&SELECTION_ACTIONS.includes(action)?action:void 0}ownsActionButton(button){return this.actionButtons().includes(button)}async syncRovingStops(preferredIndex=this.activeActionIndex,requestedRepair){const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView,request=++this.rovingGeneration;if(!owner||!this.isConnected)return;const roots=this.actionRoots();await Promise.all(roots.map(root=>root.updateComplete)),await Promise.resolve();const buttons=this.actionButtons();if(request!==this.rovingGeneration||!this.isCurrentLifecycle(generation,owner)||buttons.some(button=>!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)))return;const focused=requestedRepair??this.focusedAction,exactIndex=focused?buttons.indexOf(focused.stop):-1,retainedIndex=exactIndex>=0?exactIndex:focused?.action?buttons.findIndex(button=>this.actionForStop(button)===focused.action):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):Math.max(0,preferredIndex),Math.max(0,buttons.length-1));this.setRovingStops(buttons,targetIndex);const target=buttons[targetIndex];return focused&&target!==focused.stop&&(applyComposedFocusRepair(focused.repair,target??this.toolbar??null),this.focusedAction===focused&&(this.focusedAction=void 0)),target}setRovingStops(buttons,index){this.actionObserver?.disconnect();for(const button of buttons)this.authoredActionTabIndex.has(button)||this.authoredActionTabIndex.set(button,button.getAttribute("tabindex"));for(const previous of this.managedActionStops)!buttons.includes(previous)&&(previous.hasAttribute("tabindex")||isActionableElement(previous))&&(previous.tabIndex=-1);this.activeActionIndex=buttons.length===0?0:Math.min(Math.max(0,index),buttons.length-1),buttons.forEach((button,buttonIndex)=>{button.tabIndex=buttonIndex===this.activeActionIndex?0:-1}),this.managedActionStops=new Set(buttons),this.observeActionChanges(buttons)}observeActionChanges(buttons){this.actionObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,toolbar=this.toolbar;if(!Observer||!toolbar||!this.isConnected){this.actionObserver=void 0;return}const observer=new Observer(this.onActionMutations),roots=new Set([toolbar,...this.actionRoots()]);for(const button of buttons){let current=button;for(;current&&current!==this;){const root=current.getRootNode();root.nodeType===11&&"host"in root&&roots.add(root),current=composedParentElement(current)}}const 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.actionObserver=observer}actionPartNames(action){const parts=["action"];switch(action){case"ask":parts.push("action-ask");break;case"quote":parts.push("action-quote");break;case"cite":parts.push("action-cite");break;case"copy":parts.push("action-copy");break}return parts.join(" ")}actionLabel(action){switch(action){case"ask":return this.localize("selectionAsk");case"quote":return this.localize("selectionQuote");case"cite":return this.localize("selectionCite");case"copy":return this.localize(this.copyFailed?"copyFailed":"copy")}}safeRect(rect){return{left:finiteNumber(rect.left,0),top:finiteNumber(rect.top,0),width:finiteNumber(rect.width,0),bottom:finiteNumber(rect.bottom,0)}}viewportBounds(view){const layoutWidth=Math.max(0,finiteNumber(view.innerWidth,0)),layoutHeight=Math.max(0,finiteNumber(view.innerHeight,0)),viewport=view.visualViewport,left=Math.max(0,finiteNumber(viewport?.offsetLeft??0,0)),top=Math.max(0,finiteNumber(viewport?.offsetTop??0,0)),width=Math.max(0,finiteNumber(viewport?.width??layoutWidth,layoutWidth)),height=Math.max(0,finiteNumber(viewport?.height??layoutHeight,layoutHeight));return{left,top,width,height,right:left+width,bottom:top+height,layoutWidth}}coordinates(){const view=this.ownerDocument.defaultView,viewport=view?this.viewportBounds(view):{left:0,top:0,width:0,height:0,right:0,bottom:0,layoutWidth:0},rect=this.rect?this.safeRect(this.rect):void 0,desiredInline=rect?rect.left+rect.width/2:viewport.left+viewport.width/2,block=rect?.top??viewport.top;return{"--_lr-selection-toolbar-inline-start":`${this.effectiveDirection==="rtl"?viewport.layoutWidth-desiredInline:desiredInline}px`,"--_lr-selection-toolbar-block-start":`${block}px`}}placementGapPx(){const raw=this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue("--lr-selection-toolbar-placement-gap").trim()??"";return finiteRange(resolveCssLength(raw,{host:this})??DEFAULT_PLACEMENT_GAP_PX,DEFAULT_PLACEMENT_GAP_PX,0)}startPositioning(){this.retirePositioning();const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view||!this.isConnected)return;const generation=this.positioningGeneration,update=()=>{generation!==this.positioningGeneration||!this.isConnected||this.ownerDocument.defaultView!==view||this.toolbar!==toolbar||this.updateToolbarPosition()};let resizeFrame;const scheduleResizeUpdate=()=>{resizeFrame===void 0&&(resizeFrame=view.requestAnimationFrame(()=>{resizeFrame=void 0,update()}))},observer=typeof view.ResizeObserver>"u"?void 0:new view.ResizeObserver(scheduleResizeUpdate);observer?.observe(toolbar),view.addEventListener("resize",update),view.visualViewport?.addEventListener("resize",update),view.visualViewport?.addEventListener("scroll",update),update(),this.stopPositioning=()=>{observer?.disconnect(),resizeFrame!==void 0&&view.cancelAnimationFrame(resizeFrame),resizeFrame=void 0,view.removeEventListener("resize",update),view.visualViewport?.removeEventListener("resize",update),view.visualViewport?.removeEventListener("scroll",update)}}retirePositioning(){this.positioningGeneration++;const stop=this.stopPositioning;this.stopPositioning=void 0,stop?.()}render(){if(!this.open||!this.text)return html`${nothing}`;const label=this.accessibleLabel??(this.label||this.localize("selectionToolbarLabel"));return html`<div
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{styleMap}from"lit/directives/style-map.js";import{deepActiveElementIn}from"../../../internal/active-element.js";import{resolveCssLength}from"../../../internal/css-length.js";import{composedParentElement}from"../../../internal/active-element.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets,isSemanticActionElement}from"../../../internal/focus-navigation.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteAdd,finiteMidpoint,finiteRange}from"../../../internal/numbers.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{activateNonmodalOverlay,composedContains}from"../../../internal/nonmodal-overlay-manager.js";import{styles}from"./selection-toolbar.styles.js";import{LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_selectionAsk,LYRA_DEFAULT_selectionCite,LYRA_DEFAULT_selectionQuote,LYRA_DEFAULT_selectionToolbarLabel}from"../../../internal/default-strings.generated.js";const SELECTION_ACTIONS=["ask","quote","cite","copy"],DEFAULT_PLACEMENT_GAP_PX=8;class LyraSelectionToolbar extends LyraElement{constructor(){super(...arguments),this.open=!1,this.text="",this.anchor=null,this.rect=null,this.actions=["ask","quote","cite","copy"],this.label="",this.accessibleLabel=null,this.copyFailed=!1,this.activeActionIndex=0,this.lifecycleGeneration=0,this.positioningGeneration=0,this.rovingGeneration=0,this.managedActionStops=new Set,this.actionTabIndexLeases=new WeakMap,this.onActionsSlotChange=()=>{this.syncRovingStops()},this.onActionMutations=records=>{this.syncRovingStops()},this.onToolbarFocusIn=event=>{const buttons=this.actionButtons(),path=event.composedPath(),index=buttons.findIndex(button=>path.includes(button));if(index<0){this.focusedAction=void 0;return}const origin=path[0],stop=origin?.nodeType===1&&typeof origin.focus=="function"?origin:buttons[index],toolbar=this.toolbar,repair=stop&&toolbar?captureComposedFocusRepair(stop,toolbar):null;this.focusedAction=stop&&repair?{action:this.actionForStop(stop),index,repair,stop}:void 0,this.syncRovingStops(index)},this.containNativeEvent=event=>{event.stopPropagation()},this.onToolbarFocusOut=event=>{const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedAction=void 0)},this.onToolbarKeyDown=event=>{const buttons=this.actionButtons();if(buttons.length===0)return;const originIndex=buttons.findIndex(button=>event.composedPath().includes(button)),currentIndex=originIndex>=0?originIndex:this.activeActionIndex,forward=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backward=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let next;if(event.key===forward)next=(currentIndex+1)%buttons.length;else if(event.key===backward)next=(currentIndex-1+buttons.length)%buttons.length;else if(event.key==="Home")next=0;else if(event.key==="End")next=buttons.length-1;else return;event.preventDefault(),this.focusedAction=void 0;const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView;this.syncRovingStops(next).then(button=>{!button||!this.isCurrentLifecycle(generation,owner)||!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)||button.focus()})},this.updateToolbarPosition=()=>{const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view)return;const viewport=this.viewportBounds(view),maxEdge=finiteMidpoint(0,Math.min(viewport.width,viewport.height)),gap=finiteRange(this.placementGapPx(),DEFAULT_PLACEMENT_GAP_PX,0,maxEdge),edge=gap,fallbackInline=finiteMidpoint(viewport.left,viewport.right),rect=this.rect?this.safeRect(this.rect):{left:fallbackInline,top:viewport.top,width:0,height:0,right:fallbackInline,bottom:viewport.top,inlineCenter:fallbackInline},doubleEdge=finiteAdd(edge,edge),maxInlineSize=finiteRange(finiteAdd(viewport.width,-doubleEdge),0,0,Number.MAX_VALUE),maxBlockSize=finiteRange(finiteAdd(viewport.height,-doubleEdge),0,0,Number.MAX_VALUE);toolbar.style.setProperty("--_lr-selection-toolbar-max-inline-size",this.px(maxInlineSize)),toolbar.style.setProperty("--_lr-selection-toolbar-max-block-size",this.px(maxBlockSize));const width=finiteRange(toolbar.offsetWidth,0,0,Number.MAX_VALUE),height=finiteRange(toolbar.offsetHeight,0,0,Number.MAX_VALUE),desiredInline=finiteRange(rect.inlineCenter,viewport.left,viewport.left,viewport.right),anchorBlock=finiteRange(rect.top,viewport.top,viewport.top,viewport.bottom),desiredLeft=finiteAdd(desiredInline,-finiteMidpoint(0,width)),minLeft=finiteAdd(viewport.left,edge),maxLeft=Math.max(minLeft,finiteAdd(finiteAdd(viewport.right,-width),-edge)),left=finiteRange(desiredLeft,minLeft,minLeft,maxLeft),above=finiteAdd(finiteAdd(rect.top,-height),-gap),below=finiteAdd(rect.bottom,gap),minTop=finiteAdd(viewport.top,edge),desiredTop=above>=minTop?above:below,maxTop=Math.max(minTop,finiteAdd(finiteAdd(viewport.bottom,-height),-edge)),top=finiteRange(desiredTop,minTop,minTop,maxTop),logicalInline=this.effectiveDirection==="rtl"?finiteAdd(viewport.layoutWidth,-desiredInline):desiredInline;toolbar.style.setProperty("--_lr-selection-toolbar-inline-start",this.px(logicalInline)),toolbar.style.setProperty("--_lr-selection-toolbar-block-start",this.px(anchorBlock)),toolbar.style.setProperty("--_lr-selection-toolbar-inline-shift",this.px(finiteAdd(left,-desiredLeft))),toolbar.style.setProperty("--_lr-selection-toolbar-block-shift",this.px(finiteAdd(top,-finiteAdd(anchorBlock,-height)))),toolbar.toggleAttribute("data-positioned",!0)}}static{this.defaultStrings={...super.defaultStrings,copy:LYRA_DEFAULT_copy,copyFailed:LYRA_DEFAULT_copyFailed,selectionAsk:LYRA_DEFAULT_selectionAsk,selectionCite:LYRA_DEFAULT_selectionCite,selectionQuote:LYRA_DEFAULT_selectionQuote,selectionToolbarLabel:LYRA_DEFAULT_selectionToolbarLabel}}static{this.ownedCollectionProperties=Object.freeze(["anchor","actions"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-selection-action"])}get effectiveActions(){const seen=new Set,actions=[];for(const value of this.actions){if(typeof value!="string"||!SELECTION_ACTIONS.includes(value)||seen.has(value))continue;const action=value;seen.add(action),actions.push(action)}return actions}connectedCallback(){super.connectedCallback(),this.hasUpdated&&(this.syncOpenLifecycle(),this.syncRovingStops())}disconnectedCallback(){this.lifecycleGeneration++,this.rovingGeneration++,this.pendingActionFocus=void 0,this.focusedAction=void 0,this.actionObserver?.disconnect(),this.actionObserver=void 0,this.releaseManagedActionStops(),this.retirePositioning(),this.overlay?.suspend(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.lifecycleGeneration++,this.rovingGeneration++,this.pendingActionFocus=void 0,this.focusedAction=void 0,this.actionObserver?.disconnect(),this.actionObserver=void 0,this.releaseManagedActionStops(),this.retirePositioning()}willUpdate(changed){if(super.willUpdate(changed),this.copyFailed&&(changed.has("text")||changed.has("open")&&this.open)&&(this.copyFailed=!1),!changed.has("actions"))return;const active=deepActiveElementIn(this.ownerDocument),toolbar=this.toolbar;if(!active||!toolbar)return;const index=this.actionButtons().indexOf(active);if(index<0)return;const repair=captureComposedFocusRepair(active,toolbar);repair&&(this.pendingActionFocus={action:this.actionForStop(active),index,repair,stop:active})}updated(changed){if(super.updated(changed),(changed.has("open")||changed.has("text"))&&this.syncOpenLifecycle(),this.open&&this.text&&(changed.has("rect")||changed.has("actions"))&&this.updateToolbarPosition(),this.open&&this.text&&(changed.has("open")||changed.has("text")||changed.has("actions"))){const pending=changed.has("actions")?this.pendingActionFocus:void 0;if(this.pendingActionFocus=void 0,!pending){this.syncRovingStops();return}this.syncRovingStops(pending.index,pending)}}syncOpenLifecycle(){if(!this.isConnected){this.retirePositioning(),this.overlay?.deactivate(),this.overlay=void 0,this.releaseManagedActionStops();return}if(!this.open||!this.text){this.retirePositioning(),this.overlay?.deactivate(),this.overlay=void 0,this.releaseManagedActionStops();return}this.overlay?.isActive()?this.overlay.resume():this.overlay=activateNonmodalOverlay({host:this,panel:()=>this.toolbar??null,onEscape:()=>this.dismiss()}),this.startPositioning()}dismiss(){this.open&&(this.open=!1,this.emit("lr-dismiss",null))}async activate(action){const text=this.text,anchor=this.anchor,generation=this.lifecycleGeneration,owner=this.isConnected?this.ownerDocument.defaultView:null;if(this.copyFailed=!1,action==="copy"){const outcome=await writeClipboardText(owner,text);if(!this.isCurrentLifecycle(generation,owner))return;if(!outcome.ok){this.copyFailed=!0,this.emit("lr-error",null),this.emit("lr-copy-error",outcome);return}this.emit("lr-copy",outcome)}this.isCurrentLifecycle(generation,owner)&&this.emit("lr-selection-action",{action,text,anchor})}isCurrentLifecycle(generation,owner){return generation===this.lifecycleGeneration&&this.isConnected&&this.ownerDocument.defaultView===owner}actionButtons(){const toolbar=this.toolbar;return toolbar?collectComposedFocusTargets(toolbar,{mode:"programmatic",includeRoot:!1}).elements.filter(button=>!!isSemanticActionElement(button)||this.hasAuthoredActionTabIndex(button)):[]}actionRoots(){const builtIn=[...this.renderRoot.querySelectorAll("lr-button[data-action]")],slot=this.renderRoot.querySelector('slot[name="actions"]');return[...builtIn,...slot?.assignedElements({flatten:!0})??[]]}actionForStop(stop){const action=[...this.renderRoot.querySelectorAll("lr-button[data-action]")].find(button=>composedContains(button,stop))?.getAttribute("data-action");return action&&SELECTION_ACTIONS.includes(action)?action:void 0}ownsActionButton(button){return this.actionButtons().includes(button)}async syncRovingStops(preferredIndex=this.activeActionIndex,requestedRepair){const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView,request=++this.rovingGeneration;if(!owner||!this.isConnected)return;const roots=this.actionRoots();await Promise.all(roots.map(root=>root.updateComplete)),await Promise.resolve();const buttons=this.actionButtons();if(request!==this.rovingGeneration||!this.isCurrentLifecycle(generation,owner)||buttons.some(button=>!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)))return;const focused=requestedRepair??this.focusedAction,exactIndex=focused?buttons.indexOf(focused.stop):-1,retainedIndex=exactIndex>=0?exactIndex:focused?.action?buttons.findIndex(button=>this.actionForStop(button)===focused.action):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):Math.max(0,preferredIndex),Math.max(0,buttons.length-1));this.setRovingStops(buttons,targetIndex);const target=buttons[targetIndex];return focused&&target!==focused.stop&&(applyComposedFocusRepair(focused.repair,target??this.toolbar??null),this.focusedAction===focused&&(this.focusedAction=void 0)),target}hasAuthoredActionTabIndex(button){const lease=this.actionTabIndexLeases.get(button);return lease&&lease.lastManaged!==null&&button.getAttribute("tabindex")===lease.lastManaged?lease.authored!==null:button.hasAttribute("tabindex")}writeActionTabIndex(button,tabIndex){let lease=this.actionTabIndexLeases.get(button);if(lease||(lease={authored:button.getAttribute("tabindex"),lastManaged:null,consumerOwns:!1},this.actionTabIndexLeases.set(button,lease)),lease.consumerOwns||lease.lastManaged!==null&&button.getAttribute("tabindex")!==lease.lastManaged){lease.consumerOwns=!0;return}button.tabIndex=tabIndex,lease.lastManaged=button.getAttribute("tabindex")}releaseActionTabIndex(button){const lease=this.actionTabIndexLeases.get(button);lease&&(!lease.consumerOwns&&button.getAttribute("tabindex")===lease.lastManaged&&(lease.authored===null?button.removeAttribute("tabindex"):button.setAttribute("tabindex",lease.authored)),this.actionTabIndexLeases.delete(button))}releaseManagedActionStops(){for(const button of this.managedActionStops)this.releaseActionTabIndex(button);this.managedActionStops.clear()}setRovingStops(buttons,index){this.actionObserver?.disconnect();for(const previous of this.managedActionStops)buttons.includes(previous)||this.releaseActionTabIndex(previous);this.activeActionIndex=buttons.length===0?0:Math.min(Math.max(0,index),buttons.length-1),buttons.forEach((button,buttonIndex)=>{this.writeActionTabIndex(button,buttonIndex===this.activeActionIndex?0:-1)}),this.managedActionStops=new Set(buttons),this.observeActionChanges(buttons)}observeActionChanges(buttons){this.actionObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,toolbar=this.toolbar;if(!Observer||!toolbar||!this.isConnected){this.actionObserver=void 0;return}const observer=new Observer(this.onActionMutations),roots=new Set([toolbar,...this.actionRoots()]);for(const button of buttons){let current=button;for(;current&&current!==this;){const root=current.getRootNode();root.nodeType===11&&"host"in root&&roots.add(root),current=composedParentElement(current)}}const 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.actionObserver=observer}actionPartNames(action){const parts=["action"];switch(action){case"ask":parts.push("action-ask");break;case"quote":parts.push("action-quote");break;case"cite":parts.push("action-cite");break;case"copy":parts.push("action-copy");break}return parts.join(" ")}actionLabel(action){switch(action){case"ask":return this.localize("selectionAsk");case"quote":return this.localize("selectionQuote");case"cite":return this.localize("selectionCite");case"copy":return this.localize(this.copyFailed?"copyFailed":"copy")}}safeRect(rect){const left=finiteRange(rect.left,0,-Number.MAX_VALUE,Number.MAX_VALUE),top=finiteRange(rect.top,0,-Number.MAX_VALUE,Number.MAX_VALUE),width=finiteRange(rect.width,0,0,Number.MAX_VALUE),height=finiteRange(rect.height,0,0,Number.MAX_VALUE),right=finiteAdd(left,width),bottom=finiteAdd(top,height);return{left,top,width,height,right,bottom,inlineCenter:finiteMidpoint(left,right)}}viewportBounds(view){const layoutWidth=finiteRange(view.innerWidth,0,0,Number.MAX_VALUE),layoutHeight=finiteRange(view.innerHeight,0,0,Number.MAX_VALUE),viewport=view.visualViewport,left=finiteRange(viewport?.offsetLeft??0,0,0,Number.MAX_VALUE),top=finiteRange(viewport?.offsetTop??0,0,0,Number.MAX_VALUE),width=finiteRange(viewport?.width??layoutWidth,layoutWidth,0,Number.MAX_VALUE),height=finiteRange(viewport?.height??layoutHeight,layoutHeight,0,Number.MAX_VALUE);return{left,top,width,height,right:finiteAdd(left,width),bottom:finiteAdd(top,height),layoutWidth}}px(value){return`${finiteRange(value,0,-Number.MAX_VALUE,Number.MAX_VALUE)}px`}coordinates(){const view=this.ownerDocument.defaultView,viewport=view?this.viewportBounds(view):{left:0,top:0,width:0,height:0,right:0,bottom:0,layoutWidth:0},fallbackInline=finiteMidpoint(viewport.left,viewport.right),rect=this.rect?this.safeRect(this.rect):{left:fallbackInline,top:viewport.top,width:0,height:0,right:fallbackInline,bottom:viewport.top,inlineCenter:fallbackInline},desiredInline=finiteRange(rect.inlineCenter,viewport.left,viewport.left,viewport.right),block=finiteRange(rect.top,viewport.top,viewport.top,viewport.bottom),logicalInline=this.effectiveDirection==="rtl"?finiteAdd(viewport.layoutWidth,-desiredInline):desiredInline;return{"--_lr-selection-toolbar-inline-start":this.px(logicalInline),"--_lr-selection-toolbar-block-start":this.px(block)}}placementGapPx(){const computed=this.ownerDocument.defaultView?.getComputedStyle(this),publicValue=resolveCssLength(computed?.getPropertyValue("--lr-selection-toolbar-placement-gap").trim()??"",{host:this});if(publicValue!==void 0)return finiteRange(publicValue,DEFAULT_PLACEMENT_GAP_PX,0,Number.MAX_VALUE);const tokenValue=resolveCssLength(computed?.getPropertyValue("--lr-space-s").trim()??"",{host:this});return finiteRange(tokenValue??DEFAULT_PLACEMENT_GAP_PX,DEFAULT_PLACEMENT_GAP_PX,0,Number.MAX_VALUE)}startPositioning(){this.retirePositioning();const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view||!this.isConnected)return;const generation=this.positioningGeneration,update=()=>{generation!==this.positioningGeneration||!this.isConnected||this.ownerDocument.defaultView!==view||this.toolbar!==toolbar||this.updateToolbarPosition()};let resizeFrame;const scheduleResizeUpdate=()=>{resizeFrame===void 0&&(resizeFrame=view.requestAnimationFrame(()=>{resizeFrame=void 0,update()}))},observer=typeof view.ResizeObserver>"u"?void 0:new view.ResizeObserver(scheduleResizeUpdate);observer?.observe(toolbar),view.addEventListener("resize",update),view.visualViewport?.addEventListener("resize",update),view.visualViewport?.addEventListener("scroll",update),update(),this.stopPositioning=()=>{observer?.disconnect(),resizeFrame!==void 0&&view.cancelAnimationFrame(resizeFrame),resizeFrame=void 0,view.removeEventListener("resize",update),view.visualViewport?.removeEventListener("resize",update),view.visualViewport?.removeEventListener("scroll",update)}}retirePositioning(){this.positioningGeneration++;const stop=this.stopPositioning;this.stopPositioning=void 0,stop?.()}render(){if(!this.open||!this.text)return html`${nothing}`;const label=this.accessibleLabel??(this.label||this.localize("selectionToolbarLabel"));return html`<div
2
2
  part="toolbar"
3
3
  role="toolbar"
4
4
  aria-label=${label}
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{--_lr-selection-toolbar-placement-gap-default:var(--lr-space-s);display:contents}[part=toolbar]{z-index:var(--lr-overlay-stack-index,var(--lr-layer-popover));inline-size:max-content;max-inline-size:min(calc(100vw - var(--lr-space-m)), var(--_lr-selection-toolbar-max-inline-size,calc(100vw - var(--lr-space-m))));max-block-size:var(--_lr-selection-toolbar-max-block-size,calc(100vh - var(--lr-space-m)));box-sizing:border-box;gap:var(--lr-space-2xs);padding:var(--lr-space-2xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);box-shadow:var(--lr-shadow-m);transform:translate(-50%, calc(-100% - var(--lr-selection-toolbar-placement-gap,var(--_lr-selection-toolbar-placement-gap-default))));flex-wrap:wrap;display:flex;position:fixed;inset-block-start:var(--_lr-selection-toolbar-block-start);inset-inline-start:var(--_lr-selection-toolbar-inline-start);overflow:auto}:host(:dir(rtl)) [part=toolbar]{transform:translate(50%, calc(-100% - var(--lr-selection-toolbar-placement-gap,var(--_lr-selection-toolbar-placement-gap-default))))}[part=toolbar][data-positioned]{transform:translate(calc(-50% + var(--_lr-selection-toolbar-inline-shift)), calc(-100% + var(--_lr-selection-toolbar-block-shift)))}:host(:dir(rtl)) [part=toolbar][data-positioned]{transform:translate(calc(50% + var(--_lr-selection-toolbar-inline-shift)), calc(-100% + var(--_lr-selection-toolbar-block-shift)))}[part~=action]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);max-inline-size:100%}[part~=action]::part(base){white-space:normal;overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%}[part~=action]:hover{color:var(--lr-color-brand)}[part~=action]:active{color:color-mix(in oklab, var(--lr-color-brand), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part~=action]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{--_lr-selection-toolbar-placement-gap-default:var(--lr-space-s);display:contents}[part=toolbar]{z-index:var(--lr-overlay-stack-index,var(--lr-layer-popover));inline-size:max-content;max-inline-size:min(calc(100vw - var(--lr-space-m)), var(--_lr-selection-toolbar-max-inline-size,calc(100vw - var(--lr-space-m))));max-block-size:var(--_lr-selection-toolbar-max-block-size,calc(100vh - var(--lr-space-m)));box-sizing:border-box;gap:var(--lr-space-2xs);padding:var(--lr-space-2xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);box-shadow:var(--lr-shadow-m);transform:translate(-50%, calc(-100% - var(--lr-selection-toolbar-placement-gap,var(--_lr-selection-toolbar-placement-gap-default))));flex-wrap:wrap;display:flex;position:fixed;inset-block-start:var(--_lr-selection-toolbar-block-start);inset-inline-start:var(--_lr-selection-toolbar-inline-start);overflow:auto}:host(:dir(rtl)) [part=toolbar]{transform:translate(50%, calc(-100% - var(--lr-selection-toolbar-placement-gap,var(--_lr-selection-toolbar-placement-gap-default))))}[part=toolbar][data-positioned]{transform:translate(calc(-50% + var(--_lr-selection-toolbar-inline-shift)), calc(-100% + var(--_lr-selection-toolbar-block-shift)))}:host(:dir(rtl)) [part=toolbar][data-positioned]{transform:translate(calc(50% + var(--_lr-selection-toolbar-inline-shift)), calc(-100% + var(--_lr-selection-toolbar-block-shift)))}[part~=action]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);justify-content:center;align-items:center;max-inline-size:100%;display:inline-flex}[part~=action]::part(base){white-space:normal;overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%}[part~=action]:hover{color:var(--lr-color-brand)}[part~=action]:active{color:color-mix(in oklab, var(--lr-color-brand), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part~=action]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}`;export{styles};
@@ -31,8 +31,10 @@ title:string;excerpt?:string;timestamp?:LyraTimestamp;pinned?:boolean;archived?:
31
31
  * `<lr-dropdown>` + `<lr-menu>` with Rename/Delete — sets `renderActions` instead; its content is appended after any
32
32
  * built-in `rowActions` output in the same slot, and `wrapRow` continues to compose around the result.
33
33
  *
34
- * Public collection properties take bounded, clone-owned readonly snapshots. Create a new
35
- * collection and reassign it after changes; mutating the assigned array does not update the view.
34
+ * Public collection properties take bounded, detached readonly sequences. Thread display fields
35
+ * are projected from own data descriptors once per assignment; callbacks retain the caller's
36
+ * exact source thread identity. Create a new collection and reassign it after changes; mutating
37
+ * the assigned array does not update the view.
36
38
  *
37
39
  * @customElement lr-thread-list
38
40
  * @slot - Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each
@@ -101,6 +103,14 @@ title:string;excerpt?:string;timestamp?:LyraTimestamp;pinned?:boolean;archived?:
101
103
  * @csspart row-item-meta - Data mode: the row item's `meta` wrapper.
102
104
  * @csspart row-item-timestamp - Data mode: the row item's `<time>` element.
103
105
  * @csspart row-item-actions - Data mode: the row item's `actions` wrapper.
106
+ * @cssprop [--lr-thread-list-group-toggle-hover-bg=var(--lr-color-surface-raised)] - Group-toggle hover background.
107
+ * @cssprop [--lr-thread-list-group-toggle-hover-color=var(--lr-color-text)] - Group-toggle hover foreground.
108
+ * @cssprop [--lr-thread-list-group-toggle-active-bg=color-mix(in oklab, var(--lr-thread-list-group-toggle-hover-bg, var(--lr-color-surface-raised)), var(--lr-color-mix-partner) var(--lr-color-mix-active))] - Group-toggle pressed background.
109
+ * @cssprop [--lr-thread-list-group-toggle-active-color=var(--lr-thread-list-group-toggle-hover-color, var(--lr-color-text))] - Group-toggle pressed foreground.
110
+ * @cssprop [--lr-thread-list-row-action-hover-bg=var(--lr-color-surface-raised)] - Row-action hover background.
111
+ * @cssprop [--lr-thread-list-row-action-hover-color=var(--lr-color-text)] - Row-action hover foreground.
112
+ * @cssprop [--lr-thread-list-row-action-active-bg=color-mix(in oklab, var(--lr-thread-list-row-action-hover-bg, var(--lr-color-surface-raised)), var(--lr-color-mix-partner) var(--lr-color-mix-active))] - Row-action pressed background.
113
+ * @cssprop [--lr-thread-list-row-action-active-color=var(--lr-thread-list-row-action-hover-color, var(--lr-color-text))] - Row-action pressed foreground.
104
114
  * @cssprop [--lr-thread-list-excerpt-highlight-background=var(--lr-color-warning-quiet)] -
105
115
  * Background of `<mark>` descendants returned by `renderExcerpt`.
106
116
  * @cssprop [--lr-thread-list-excerpt-highlight-foreground=inherit] - Foreground of `<mark>`
@@ -112,7 +122,7 @@ title:string;excerpt?:string;timestamp?:LyraTimestamp;pinned?:boolean;archived?:
112
122
  * @status stable
113
123
  * @since 4.0.0
114
124
  */
115
- export declare class LyraThreadList extends LyraElement<LyraThreadListEventMap>{protected static readonly ownedCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];
125
+ export declare class LyraThreadList extends LyraElement<LyraThreadListEventMap>{protected static readonly ownedCollectionProperties:readonly string[];protected static readonly identityCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];
116
126
  /** At least one valid thread ⇒ data mode (the default slot is ignored). No valid threads and no
117
127
  * slotted content ⇒ data mode with zero rows (the built-in empty state). No valid threads with
118
128
  * slotted content ⇒ slotted mode. Thread ids must be nonempty and unique; invalid/later
@@ -218,7 +228,7 @@ label?:string;
218
228
  wrapRow?:(thread:LyraChatThread,row:TemplateResult)=>TemplateResult;
219
229
  /** Group header items by id, refreshed whenever the item list is rebuilt, so the sticky callback
220
230
  * can render the same header the anchor points at. */
221
- private readonly stickyGroupItems;private searchText;private hasEmptySlot;private hasDefaultSlotContent;private virtualListEl?;private liveRegion?;private focusTaskGeneration;private readonly injectedListItemRoles;private get dataMode();connectedCallback():void;protected willUpdate(changed:PropertyValues):void;private defaultSlottedElements;private markAsListItems;private restoreInjectedListItemRoles;disconnectedCallback():void;private get normalizedThreads();private get visibleThreads();private bucketFor;private bucketLabel;private dateForBucket;private orderedCustomGroupIds;private groupedItems;private buildItems;private onSearchInput;private announceMatchCount;private onSearchKeyDown;private onSearchFocus;private onSearchBlur;private rowElements;private selectButtonEl;
231
+ private readonly stickyGroupItems;private searchText;private hasEmptySlot;private hasDefaultSlotContent;private virtualListEl?;private liveRegion?;private focusTaskGeneration;private readonly injectedListItemRoles;private get dataMode();connectedCallback():void;protected willUpdate(changed:PropertyValues):void;private defaultSlottedElements;private markAsListItems;private restoreInjectedListItemRoles;disconnectedCallback():void;private get normalizedThreads();private sourceThread;private sourceThreads;private get visibleThreads();private bucketFor;private bucketLabel;private dateForBucket;private orderedCustomGroupIds;private groupedItems;private buildItems;private onSearchInput;private announceMatchCount;private onSearchKeyDown;private onSearchFocus;private onSearchBlur;private rowElements;private selectButtonEl;
222
232
  /** A row is navigable only while both its public host and semantic option can receive focus.
223
233
  * `wrapRow` may place the host below an inert ancestor, and an inert target refuses focus
224
234
  * silently, so the navigation scan must exclude it before committing an index. */
@@ -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{styles}from"./thread-list.styles.js";import{getDateTimeFormat,getNumberFormat,resolveIntlLocale}from"../../../internal/intl-cache.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{activeElementIn}from"../../../internal/active-element.js";import{normalizeLyraTimestamp}from"../timestamp.js";import{LYRA_DEFAULT_archiveConversation,LYRA_DEFAULT_deleteConversation,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_pinConversation,LYRA_DEFAULT_searchThreads,LYRA_DEFAULT_threadGroupArchived,LYRA_DEFAULT_threadGroupCollapse,LYRA_DEFAULT_threadGroupExpand,LYRA_DEFAULT_threadGroupPinned,LYRA_DEFAULT_threadGroupPrevious30Days,LYRA_DEFAULT_threadGroupPrevious7Days,LYRA_DEFAULT_threadGroupToday,LYRA_DEFAULT_threadGroupYesterday,LYRA_DEFAULT_threadListEmpty,LYRA_DEFAULT_threadListLabel,LYRA_DEFAULT_threadListMatchAnnounce,LYRA_DEFAULT_unarchiveConversation,LYRA_DEFAULT_unpinConversation}from"../../../internal/default-strings.generated.js";const ICON_VIEW_BOX="0 0 24 24",ICON_STROKE_WIDTH="1.75";function pinIcon(){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{styles}from"./thread-list.styles.js";import{getDateTimeFormat,getNumberFormat,resolveIntlLocale}from"../../../internal/intl-cache.js";import{presenceTrueDefaultBooleanConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{activeElementIn}from"../../../internal/active-element.js";import{MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR,getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{normalizeLyraTimestamp}from"../timestamp.js";import{LYRA_DEFAULT_archiveConversation,LYRA_DEFAULT_deleteConversation,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_pinConversation,LYRA_DEFAULT_searchThreads,LYRA_DEFAULT_threadGroupArchived,LYRA_DEFAULT_threadGroupCollapse,LYRA_DEFAULT_threadGroupExpand,LYRA_DEFAULT_threadGroupPinned,LYRA_DEFAULT_threadGroupPrevious30Days,LYRA_DEFAULT_threadGroupPrevious7Days,LYRA_DEFAULT_threadGroupToday,LYRA_DEFAULT_threadGroupYesterday,LYRA_DEFAULT_threadListEmpty,LYRA_DEFAULT_threadListLabel,LYRA_DEFAULT_threadListMatchAnnounce,LYRA_DEFAULT_unarchiveConversation,LYRA_DEFAULT_unpinConversation}from"../../../internal/default-strings.generated.js";const ICON_VIEW_BOX="0 0 24 24",ICON_STROKE_WIDTH="1.75";function pinIcon(){return svg`
2
2
  <svg width="1em" height="1em" viewBox=${ICON_VIEW_BOX} fill="none" stroke="currentColor" stroke-width=${ICON_STROKE_WIDTH} stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
3
3
  <path d="M12 17v5"></path>
4
4
  <path d="M9 3h6l1 6 3 3v2H5v-2l3-3Z"></path>
@@ -17,13 +17,13 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
17
17
  <path d="M6 7l1 14h10l1-14"></path>
18
18
  <path d="M9 7V4h6v3"></path>
19
19
  </svg>
20
- `}function defaultFilter(thread,query2,locale){const intlLocale=resolveIntlLocale(locale);return thread.title.toLocaleLowerCase(intlLocale).includes(query2)||(thread.excerpt??"").toLocaleLowerCase(intlLocale).includes(query2)}function rehydrateThreadTimestamp(value){if(value===void 0)return;if(typeof value!="object"||typeof value.getTime!="function")return value;let epoch;try{epoch=value.getTime()}catch{return}return Number.isFinite(epoch)?new Date(epoch):void 0}class LyraThreadList extends LyraElement{constructor(){super(...arguments),this.threads=[],this.activeConversationId="",this.searchable=!1,this.grouping="date",this.collapsedGroupIds=[],this.rowActions=[],this.showArchived=!1,this.renamable=!0,this.compact=!1,this.stickyGroups=!1,this.stickyGroupItems=new Map,this.searchText="",this.hasEmptySlot=!1,this.hasDefaultSlotContent=!1,this.focusTaskGeneration=0,this.injectedListItemRoles=new Set,this.onSearchInput=e=>{if(e.stopPropagation(),this.focusTaskGeneration++,this.searchText=e.target.value,!this.dataMode){this.emit("lr-query-change",{text:this.searchText});return}const count=this.visibleThreads.length;this.emit("lr-filter-change",{text:this.searchText,matchCount:count}),this.announceMatchCount(count)},this.onSearchKeyDown=e=>{if(e.key!=="ArrowDown")return;this.focusTaskGeneration++;const rows=this.navigableRows();rows.length!==0&&(e.preventDefault(),this.selectButtonEl(rows[0])?.focus())},this.onSearchFocus=()=>{this.emit("focus",null)},this.onSearchBlur=()=>{this.emit("blur",null)},this.onListKeyDown=e=>{if(e.key!=="ArrowDown"&&e.key!=="ArrowUp"&&e.key!=="Home"&&e.key!=="End")return;const origin=e.composedPath()[0];if(origin?.nodeType===1&&origin.closest('[part="group-toggle"]'))return;const focusGeneration=++this.focusTaskGeneration,list=this.virtualListEl;if(this.dataMode&&(e.key==="Home"||e.key==="End")&&list?.scrollContainer){const items2=list.items;e.preventDefault(),this.focusVirtualThreadFromItemIndex(list,items2,e.key==="Home"?0:items2.length-1,e.key==="Home"?1:-1,focusGeneration);return}const rows=this.navigableRows();if(rows.length===0)return;const currentIndex=this.focusedRowIndex(rows);let targetIndex;if(e.key==="Home"?targetIndex=0:e.key==="End"?targetIndex=rows.length-1:e.key==="ArrowDown"?targetIndex=currentIndex<0?0:currentIndex+1:targetIndex=currentIndex<0?rows.length-1:currentIndex-1,e.preventDefault(),targetIndex>=0&&targetIndex<rows.length){this.selectButtonEl(rows[targetIndex])?.focus();return}if(!list?.scrollContainer)return;const currentRow=rows[currentIndex];if(!currentRow)return;const items=list.items,currentItemIndex=items.findIndex(item=>item.kind==="thread"&&item.thread.id===currentRow.conversationId);if(currentItemIndex<0)return;const direction=e.key==="ArrowDown"?1:-1;this.focusVirtualThreadFromItemIndex(list,items,currentItemIndex+direction,direction,focusGeneration)},this.renderRow=item=>{const thread=item,row=html`
20
+ `}function defaultFilter(thread,query2,locale){const intlLocale=resolveIntlLocale(locale);return thread.title.toLocaleLowerCase(intlLocale).includes(query2)||(thread.excerpt??"").toLocaleLowerCase(intlLocale).includes(query2)}const THREADS_AND_SLOTTED_CONTENT_WARNING_KEY="lyra-thread-list:threads-and-slotted-content",THREADS_AND_SLOTTED_CONTENT_WARNING="<lr-thread-list>: both `threads` and slotted content were supplied; `threads` data mode wins and the default slot is ignored.",canonicalThreadSnapshots=new WeakMap,sourceThreadByProjection=new WeakMap;function normalizeProjectedTimestamp(value){if(!(typeof value!="string"&&typeof value!="number"&&(value===null||typeof value!="object")))return normalizeLyraTimestamp(value)}function isSafeNonArrayObject(value){if(value===null||typeof value!="object")return!1;try{return!Array.isArray(value)}catch{return!1}}function projectThread(value){if(!isSafeNonArrayObject(value))return;const id=getOwnDataDescriptor(value,"id"),title=getOwnDataDescriptor(value,"title"),excerpt=getOwnDataDescriptor(value,"excerpt"),timestamp=getOwnDataDescriptor(value,"timestamp"),pinned=getOwnDataDescriptor(value,"pinned"),archived=getOwnDataDescriptor(value,"archived");if(id===MISSING_OWN_DATA_DESCRIPTOR||id===UNSAFE_OWN_DATA_DESCRIPTOR||title===MISSING_OWN_DATA_DESCRIPTOR||title===UNSAFE_OWN_DATA_DESCRIPTOR||typeof id.value!="string"||id.value.trim().length===0||typeof title.value!="string")return;const thread=Object.freeze({id:id.value,title:title.value,excerpt:excerpt===MISSING_OWN_DATA_DESCRIPTOR||excerpt===UNSAFE_OWN_DATA_DESCRIPTOR||typeof excerpt.value!="string"?void 0:excerpt.value,timestamp:timestamp===MISSING_OWN_DATA_DESCRIPTOR||timestamp===UNSAFE_OWN_DATA_DESCRIPTOR?void 0:normalizeProjectedTimestamp(timestamp.value),pinned:pinned===MISSING_OWN_DATA_DESCRIPTOR||pinned===UNSAFE_OWN_DATA_DESCRIPTOR||typeof pinned.value!="boolean"?!1:pinned.value,archived:archived===MISSING_OWN_DATA_DESCRIPTOR||archived===UNSAFE_OWN_DATA_DESCRIPTOR||typeof archived.value!="boolean"?!1:archived.value});return sourceThreadByProjection.set(thread,value),thread}function canonicalThreads(values){const cached=canonicalThreadSnapshots.get(values);if(cached)return cached;const projected=[];for(const value of values){const thread=projectThread(value);thread&&projected.push(thread)}const snapshot=Object.freeze(projected);return canonicalThreadSnapshots.set(values,snapshot),snapshot}class LyraThreadList extends LyraElement{constructor(){super(...arguments),this.threads=[],this.activeConversationId="",this.searchable=!1,this.grouping="date",this.collapsedGroupIds=[],this.rowActions=[],this.showArchived=!1,this.renamable=!0,this.compact=!1,this.stickyGroups=!1,this.stickyGroupItems=new Map,this.searchText="",this.hasEmptySlot=!1,this.hasDefaultSlotContent=!1,this.focusTaskGeneration=0,this.injectedListItemRoles=new Set,this.onSearchInput=e=>{if(e.stopPropagation(),this.focusTaskGeneration++,this.searchText=e.target.value,!this.dataMode){this.emit("lr-query-change",{text:this.searchText});return}const count=this.visibleThreads.length;this.emit("lr-filter-change",{text:this.searchText,matchCount:count}),this.announceMatchCount(count)},this.onSearchKeyDown=e=>{if(e.key!=="ArrowDown")return;this.focusTaskGeneration++;const rows=this.navigableRows();rows.length!==0&&(e.preventDefault(),this.selectButtonEl(rows[0])?.focus())},this.onSearchFocus=()=>{this.emit("focus",null)},this.onSearchBlur=()=>{this.emit("blur",null)},this.onListKeyDown=e=>{if(e.key!=="ArrowDown"&&e.key!=="ArrowUp"&&e.key!=="Home"&&e.key!=="End")return;const origin=e.composedPath()[0];if(origin?.nodeType===1&&origin.closest('[part="group-toggle"]'))return;const focusGeneration=++this.focusTaskGeneration,list=this.virtualListEl;if(this.dataMode&&(e.key==="Home"||e.key==="End")&&list?.scrollContainer){const items2=list.items;e.preventDefault(),this.focusVirtualThreadFromItemIndex(list,items2,e.key==="Home"?0:items2.length-1,e.key==="Home"?1:-1,focusGeneration);return}const rows=this.navigableRows();if(rows.length===0)return;const currentIndex=this.focusedRowIndex(rows);let targetIndex;if(e.key==="Home"?targetIndex=0:e.key==="End"?targetIndex=rows.length-1:e.key==="ArrowDown"?targetIndex=currentIndex<0?0:currentIndex+1:targetIndex=currentIndex<0?rows.length-1:currentIndex-1,e.preventDefault(),targetIndex>=0&&targetIndex<rows.length){this.selectButtonEl(rows[targetIndex])?.focus();return}if(!list?.scrollContainer)return;const currentRow=rows[currentIndex];if(!currentRow)return;const items=list.items,currentItemIndex=items.findIndex(item=>item.kind==="thread"&&item.thread.id===currentRow.conversationId);if(currentItemIndex<0)return;const direction=e.key==="ArrowDown"?1:-1;this.focusVirtualThreadFromItemIndex(list,items,currentItemIndex+direction,direction,focusGeneration)},this.renderRow=item=>{const thread=item,source=this.sourceThread(thread),row=html`
21
21
  <lr-conversation-item
22
22
  exportparts="base:row-item-base, active-indicator:row-item-active-indicator, select-button:row-item-select-button, start:row-item-start, content:row-item-content, label:row-item-label, label-input:row-item-label-input, rename-button:row-item-rename-button, excerpt:row-item-excerpt, meta:row-item-meta, timestamp:row-item-timestamp, actions:row-item-actions"
23
23
  conversation-id=${thread.id}
24
24
  label=${thread.title}
25
25
  excerpt=${thread.excerpt??""}
26
- .timestamp=${rehydrateThreadTimestamp(thread.timestamp)}
26
+ .timestamp=${thread.timestamp}
27
27
  ?active=${thread.id===this.activeConversationId}
28
28
  ?compact=${this.compact}
29
29
  .renamable=${this.renamable}
@@ -31,23 +31,23 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
31
31
  @lr-rename=${e=>{e.stopPropagation(),this.emit("lr-thread-rename",{conversationId:thread.id,label:e.detail.label})}}
32
32
  >
33
33
  ${this.renderStart?html`<span slot="start" part="row-start" inert
34
- >${this.renderStart(thread)}</span
34
+ >${this.renderStart(source)}</span
35
35
  >`:nothing}
36
36
  ${this.renderExcerpt?html`<span slot="excerpt" part="row-excerpt" inert
37
- >${this.renderExcerpt(thread)}</span
37
+ >${this.renderExcerpt(source)}</span
38
38
  >`:nothing}
39
39
  ${this.renderRowContent?html`<span slot="content" part="row-content" inert
40
- >${this.renderRowContent(thread)}</span
40
+ >${this.renderRowContent(source)}</span
41
41
  >`:nothing}
42
42
  ${thread.pinned?html`<span slot="meta" part="row-meta pin-glyph" aria-hidden="true"
43
43
  >${pinIcon()}</span
44
44
  >`:nothing}
45
45
  ${this.renderMeta?html`<span slot="meta" part="row-meta" inert
46
- >${this.renderMeta(thread)}</span
46
+ >${this.renderMeta(source)}</span
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(thread,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.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(),console.warn("[lr-thread-list] both `threads` and slotted content were supplied -- `threads` (data mode) wins and the default slot is ignored.")):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 this.threads.filter(thread=>thread===null||typeof thread!="object"||typeof thread.id!="string"||thread.id.trim().length===0||typeof thread.title!="string"||seen.has(thread.id)?!1:(seen.add(thread.id),!0))}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(t,q):defaultFilter(t,q,this.effectiveLocale))}bucketFor(thread,now){if(thread.archived)return"archived";if(thread.pinned)return"pinned";const ts=thread.timestamp==null?void 0:normalizeLyraTimestamp(rehydrateThreadTimestamp(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,threads){const groupDate=key.startsWith("month:")?this.dateForBucket(key):void 0,context={id:key,threads,bucket:key,date:groupDate};if(this.getGroupLabel)return this.getGroupLabel(context);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(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: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:groupedThreads,bucket,date:bucket.startsWith("month:")?this.dateForBucket(bucket):void 0}},context=>this.bucketLabel(context.bucket,context.threads))}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){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.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`
51
51
  <span slot="actions" part="row-actions">
52
52
  ${this.rowActions.includes("pin")?html`<button
53
53
  type="button"
@@ -73,7 +73,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
73
73
  >
74
74
  ${trashIcon()}
75
75
  </button>`:nothing}
76
- ${this.renderActions?this.renderActions(thread):nothing}
76
+ ${this.renderActions?this.renderActions(source):nothing}
77
77
  </span>
78
78
  `}renderGroupHeader(item,options={}){const nextCollapsed=!item.collapsed;return html`
79
79
  <div
@@ -84,7 +84,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
84
84
  >
85
85
  ${options.sticky?html`
86
86
  <span part="group-icon" aria-hidden="true"
87
- >${item.collapsed?"+":"\u2212"}</span
87
+ >${item.collapsed?"+":""}</span
88
88
  >
89
89
  <span part="group-label">${item.label}</span>
90
90
  `:html`
@@ -96,7 +96,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
96
96
  @click=${()=>this.emit("lr-group-toggle",{groupId:item.id,collapsed:nextCollapsed})}
97
97
  >
98
98
  <span part="group-icon" aria-hidden="true"
99
- >${item.collapsed?"+":"\u2212"}</span
99
+ >${item.collapsed?"+":""}</span
100
100
  >
101
101
  <span part="group-label">${item.label}</span>
102
102
  </button>
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{flex-direction:column;block-size:100%;min-block-size:0;display:flex}[part=base]{flex-direction:column;flex:auto;min-block-size:0;display:flex}[part=search]{padding:var(--lr-space-s);border-block-end:var(--lr-border-width-thin) solid var(--lr-color-border)}[part=search-input]{box-sizing:border-box;inline-size:100%;padding-inline:var(--lr-space-s);padding-block:var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);font:inherit}[part=search-input]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=search-input]:hover{border-color:var(--lr-color-brand)}[part=search-input]::placeholder{color:var(--lr-color-text-quiet)}[part=search-input]::-webkit-search-cancel-button,[part=search-input]::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}[part=list],lr-virtual-list{flex-direction:column;flex:auto;min-block-size:0;display:flex}lr-virtual-list::part(base){flex:auto;min-block-size:0}[part=empty]{padding:var(--lr-space-l);color:var(--lr-color-text-quiet);text-align:center}lr-virtual-list::part(group-header){box-sizing:border-box;align-items:center;gap:var(--lr-space-xs);min-inline-size:0;padding:var(--lr-space-xs) var(--lr-space-s);background:var(--lr-color-surface);color:var(--lr-color-text-quiet);display:flex}lr-virtual-list::part(group-toggle){align-items:center;gap:var(--lr-space-xs);min-inline-size:0;min-block-size:var(--lr-icon-button-size);color:inherit;font:inherit;font-weight:var(--lr-font-weight-semibold);text-align:start;cursor:pointer;background:0 0;border:0;flex:auto;padding:0;display:flex}lr-virtual-list::part(group-toggle):hover{background:var(--lr-color-surface-raised);color:var(--lr-color-text)}lr-virtual-list::part(group-toggle):active{background:color-mix(in oklab, var(--lr-color-surface-raised), var(--lr-color-mix-partner) var(--lr-color-mix-active));color:var(--lr-color-text)}lr-virtual-list::part(group-toggle):focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}lr-virtual-list::part(group-icon){inline-size:var(--lr-size-1rem);font-size:var(--lr-font-size-lg);font-weight:var(--lr-font-weight-normal);justify-content:center;align-items:center;display:inline-flex}lr-virtual-list::part(group-adornment){flex:none;min-inline-size:0}lr-virtual-list::part(row-start),lr-virtual-list::part(row-content),lr-virtual-list::part(row-meta),lr-virtual-list::part(row-actions){min-inline-size:0}lr-virtual-list::part(row-start),lr-virtual-list::part(row-actions){align-items:center;display:inline-flex}lr-virtual-list::part(row-action){inline-size:var(--lr-size-1-5rem);block-size:var(--lr-size-1-5rem);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border-radius:var(--lr-radius-xs);color:var(--lr-color-text-quiet);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}lr-virtual-list::part(row-action):hover{background:var(--lr-color-surface-raised);color:var(--lr-color-text)}lr-virtual-list::part(row-action):active{background:color-mix(in oklab, var(--lr-color-surface-raised), var(--lr-color-mix-partner) var(--lr-color-mix-active));color:var(--lr-color-text)}lr-virtual-list::part(row-action):focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}lr-virtual-list::part(pin-glyph){color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-2xs);display:inline-flex}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{flex-direction:column;block-size:100%;min-block-size:0;display:flex}[part=base]{flex-direction:column;flex:auto;min-block-size:0;display:flex}[part=search]{padding:var(--lr-space-s);border-block-end:var(--lr-border-width-thin) solid var(--lr-color-border)}[part=search-input]{box-sizing:border-box;inline-size:100%;padding-inline:var(--lr-space-s);padding-block:var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);font:inherit}[part=search-input]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=search-input]:hover{border-color:var(--lr-color-brand)}[part=search-input]::placeholder{color:var(--lr-color-text-quiet)}[part=search-input]::-webkit-search-cancel-button,[part=search-input]::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}[part=list],lr-virtual-list{flex-direction:column;flex:auto;min-block-size:0;display:flex}lr-virtual-list::part(base){flex:auto;min-block-size:0}[part=empty]{padding:var(--lr-space-l);color:var(--lr-color-text-quiet);text-align:center}lr-virtual-list::part(group-header){box-sizing:border-box;align-items:center;gap:var(--lr-space-xs);min-inline-size:0;padding:var(--lr-space-xs) var(--lr-space-s);background:var(--lr-color-surface);color:var(--lr-color-text-quiet);display:flex}lr-virtual-list::part(group-toggle){align-items:center;gap:var(--lr-space-xs);min-inline-size:0;min-block-size:var(--lr-icon-button-size);color:inherit;font:inherit;font-weight:var(--lr-font-weight-semibold);text-align:start;cursor:pointer;background:0 0;border:0;flex:auto;padding:0;display:flex}lr-virtual-list::part(group-toggle):hover{background:var(--lr-thread-list-group-toggle-hover-bg,var(--lr-color-surface-raised));color:var(--lr-thread-list-group-toggle-hover-color,var(--lr-color-text))}lr-virtual-list::part(group-toggle):active{background:var(--lr-thread-list-group-toggle-active-bg,color-mix(in oklab, var(--lr-thread-list-group-toggle-hover-bg,var(--lr-color-surface-raised)), var(--lr-color-mix-partner) var(--lr-color-mix-active)));color:var(--lr-thread-list-group-toggle-active-color,var(--lr-thread-list-group-toggle-hover-color,var(--lr-color-text)))}lr-virtual-list::part(group-toggle):focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}lr-virtual-list::part(group-icon){inline-size:var(--lr-size-1rem);font-size:var(--lr-font-size-lg);font-weight:var(--lr-font-weight-normal);justify-content:center;align-items:center;display:inline-flex}lr-virtual-list::part(group-adornment){flex:none;min-inline-size:0}lr-virtual-list::part(row-start),lr-virtual-list::part(row-content),lr-virtual-list::part(row-meta),lr-virtual-list::part(row-actions){min-inline-size:0}lr-virtual-list::part(row-start),lr-virtual-list::part(row-actions){align-items:center;display:inline-flex}lr-virtual-list::part(row-action){inline-size:var(--lr-size-1-5rem);block-size:var(--lr-size-1-5rem);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border-radius:var(--lr-radius-xs);color:var(--lr-color-text-quiet);font:inherit;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}lr-virtual-list::part(row-action):hover{background:var(--lr-thread-list-row-action-hover-bg,var(--lr-color-surface-raised));color:var(--lr-thread-list-row-action-hover-color,var(--lr-color-text))}lr-virtual-list::part(row-action):active{background:var(--lr-thread-list-row-action-active-bg,color-mix(in oklab, var(--lr-thread-list-row-action-hover-bg,var(--lr-color-surface-raised)), var(--lr-color-mix-partner) var(--lr-color-mix-active)));color:var(--lr-thread-list-row-action-active-color,var(--lr-thread-list-row-action-hover-color,var(--lr-color-text)))}lr-virtual-list::part(row-action):focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}lr-virtual-list::part(pin-glyph){color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-2xs);display:inline-flex}`;export{styles};
@@ -1 +1 @@
1
- import{css}from"lit";import{srOnly}from"../../../internal/a11y.js";const styles=[css`:host{block-size:100%;inline-size:100%;display:block;position:relative}[part=base]{gap:var(--lr-space-xs);block-size:100%;inline-size:100%;padding:var(--lr-space-s);box-sizing:border-box;flex-direction:column;display:flex;overflow:hidden auto}[part=base]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(-1 * var(--lr-focus-ring-offset))}[part=log],[part=interim-area]{gap:var(--lr-space-xs);flex-direction:column;min-inline-size:0;max-inline-size:100%;display:flex}[part=interim-area]{margin-block-start:var(--lr-space-xs)}[part=entry]{align-items:baseline;gap:var(--lr-space-2xs);min-inline-size:0;max-inline-size:100%;animation:lr-transcript-fade-in var(--lr-duration-fast) var(--lr-easing-standard);flex-wrap:wrap;display:flex}@keyframes lr-transcript-fade-in{0%{opacity:0;transform:translateY(var(--lr-size-4px))}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){[part=entry]{animation:none!important}}[part=entry][data-interim]{opacity:var(--lr-opacity-disabled);font-style:italic}[part=speaker]{overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%;font-weight:var(--lr-font-weight-semibold);color:var(--lr-color-text-quiet);flex:100%}[part=text]{overflow-wrap:anywhere;flex:auto;min-inline-size:0;max-inline-size:100%}[part=timestamp]{font-size:var(--lr-font-size-xs);color:var(--lr-color-text-quiet);flex:none}[part=empty]{padding:var(--lr-space-m);color:var(--lr-color-text-quiet);text-align:center}[part=jump-button]{padding:var(--lr-space-2xs) var(--lr-space-s);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius-pill);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;box-shadow:var(--lr-shadow-m);position:absolute;inset-block-end:var(--lr-space-s);inset-inline-end:var(--lr-space-s)}[part=jump-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=jump-button]:hover{background:var(--lr-color-brand-quiet)}[part=jump-button]:active{background:color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active))}`,srOnly];export{styles};
1
+ import{css}from"lit";import{srOnly}from"../../../internal/a11y.js";const styles=[css`:host{block-size:100%;inline-size:100%;display:block;position:relative}[part=base]{gap:var(--lr-space-xs);block-size:100%;inline-size:100%;padding:var(--lr-space-s);box-sizing:border-box;flex-direction:column;display:flex;overflow:hidden auto}[part=base]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(-1 * var(--lr-focus-ring-offset))}[part=log],[part=interim-area]{gap:var(--lr-space-xs);flex-direction:column;min-inline-size:0;max-inline-size:100%;display:flex}[part=interim-area]{margin-block-start:var(--lr-space-xs)}[part~=entry]{align-items:baseline;gap:var(--lr-space-2xs);min-inline-size:0;max-inline-size:100%;animation:lr-transcript-fade-in var(--lr-duration-fast) var(--lr-easing-standard);flex-wrap:wrap;display:flex}@keyframes lr-transcript-fade-in{0%{opacity:0;transform:translateY(var(--lr-size-4px))}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){[part~=entry]{animation:none!important}}[part~=entry][data-interim]{color:var(--lr-color-text-quiet);font-style:italic}[part=speaker]{overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%;font-weight:var(--lr-font-weight-semibold);color:var(--lr-color-text-quiet);flex:100%}[part=text]{overflow-wrap:anywhere;flex:auto;min-inline-size:0;max-inline-size:100%}[part=timestamp]{font-size:var(--lr-font-size-xs);color:var(--lr-color-text-quiet);flex:none}[part=empty]{padding:var(--lr-space-m);color:var(--lr-color-text-quiet);text-align:center}[part=jump-button]{font:inherit;padding:var(--lr-space-2xs) var(--lr-space-s);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius-pill);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;box-shadow:var(--lr-shadow-m);position:absolute;inset-block-end:var(--lr-space-s);inset-inline-end:var(--lr-space-s)}[part=jump-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=jump-button]:hover{background:var(--lr-color-brand-quiet)}[part=jump-button]:active{background:color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active))}`,srOnly];export{styles};