@aceshooting/lyra-ui 21.0.0 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +6 -3
  3. package/custom-elements.json +1 -1
  4. package/dist/ai/runtime.js +1 -1
  5. package/dist/ai/types.d.ts +13 -5
  6. package/dist/cli/lyra-rename-ledger.mjs +1 -0
  7. package/dist/cli/migrate-wa.mjs +33 -13
  8. package/dist/cli/migration-contract.json +1 -1
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +5 -3
  10. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +3 -2
  11. package/dist/components/agent-tools/tool-call-block/tool-call-block.class.d.ts +15 -3
  12. package/dist/components/agent-tools/tool-call-block/tool-call-block.class.js +3 -3
  13. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +24 -8
  14. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +3 -3
  15. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +4 -0
  16. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts +9 -5
  17. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  18. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +1 -1
  19. package/dist/components/agent-tools/tool-status.js +2 -2
  20. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +8 -0
  21. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +3 -2
  22. package/dist/components/agent-tools/tool-timeline/tool-timeline.styles.js +1 -1
  23. package/dist/components/agent-tools/trace-tree/span.d.ts +2 -2
  24. package/dist/components/charts/chart/box-plot.class.d.ts +3 -1
  25. package/dist/components/charts/chart/box-plot.class.js +9 -9
  26. package/dist/components/charts/chart/chart-bidi.d.ts +109 -0
  27. package/dist/components/charts/chart/chart-bidi.js +1 -0
  28. package/dist/components/charts/chart/chart.class.d.ts +17 -2
  29. package/dist/components/charts/chart/chart.class.js +10 -8
  30. package/dist/components/charts/chart/histogram.class.js +1 -1
  31. package/dist/components/charts/chart/lite-chart.class.d.ts +24 -5
  32. package/dist/components/charts/chart/lite-chart.class.js +9 -9
  33. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  34. package/dist/components/conversation/code-block/shiki-dark-theme.d.ts +2 -2
  35. package/dist/components/conversation/code-block/shiki-dark-theme.js +1 -1
  36. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +18 -2
  37. package/dist/components/conversation/conversation-item/conversation-item.class.js +3 -3
  38. package/dist/components/conversation/conversation-item/conversation-item.styles.js +1 -1
  39. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  40. package/dist/components/conversation/markdown/markdown-core.class.d.ts +3 -1
  41. package/dist/components/conversation/markdown/markdown.class.d.ts +3 -1
  42. package/dist/components/conversation/message-actions/message-actions.class.d.ts +7 -2
  43. package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
  44. package/dist/components/conversation/message-parts/message-parts.class.d.ts +6 -2
  45. package/dist/components/conversation/message-parts/message-parts.class.js +5 -3
  46. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +3 -2
  47. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  48. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +1 -5
  49. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +2 -2
  50. package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +7 -1
  51. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +3 -4
  52. package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +7 -1
  53. package/dist/components/conversation/streaming-text/streaming-text.class.js +3 -4
  54. package/dist/components/conversation/thread-list/thread-list.class.d.ts +13 -2
  55. package/dist/components/conversation/thread-list/thread-list.class.js +3 -3
  56. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  57. package/dist/components/data/document-library/document-library.class.js +2 -0
  58. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  59. package/dist/components/data/flow-minimap/flow-minimap.class.js +1 -1
  60. package/dist/components/data/flow-node/flow-node.class.d.ts +6 -2
  61. package/dist/components/data/flow-node/flow-node.class.js +6 -2
  62. package/dist/components/data/flow-node/flow-node.styles.js +1 -1
  63. package/dist/components/data/gauge/gauge.styles.js +1 -1
  64. package/dist/components/data/heatmap/heatmap.class.d.ts +3 -0
  65. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  66. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  67. package/dist/components/data/sparkline/sparkline.class.d.ts +5 -3
  68. package/dist/components/data/stat/stat.class.d.ts +4 -3
  69. package/dist/components/data/table/table.class.d.ts +32 -5
  70. package/dist/components/data/table/table.class.js +3 -2
  71. package/dist/components/forms/button/button.class.d.ts +7 -1
  72. package/dist/components/forms/button/button.styles.js +1 -1
  73. package/dist/components/forms/date-picker/date-input.styles.js +1 -1
  74. package/dist/components/forms/input/input.styles.js +1 -1
  75. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -0
  76. package/dist/components/layout/app-rail/app-rail.class.d.ts +50 -11
  77. package/dist/components/layout/app-rail/app-rail.class.js +2 -2
  78. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  79. package/dist/components/layout/menu/menu.class.d.ts +6 -5
  80. package/dist/components/layout/split-panel/split-panel.class.d.ts +2 -1
  81. package/dist/components/media/flag/language-map.d.ts +8 -0
  82. package/dist/components/media/flag/language-map.js +1 -1
  83. package/dist/components/media/map/map-loader.d.ts +7 -1
  84. package/dist/components/media/map/map.class.d.ts +111 -5
  85. package/dist/components/media/map/map.class.js +3 -3
  86. package/dist/components/media/media-card/media-card.class.d.ts +18 -5
  87. package/dist/components/media/media-card/media-card.class.js +1 -1
  88. package/dist/components/overlays/overlay/popover.class.d.ts +20 -0
  89. package/dist/components/overlays/overlay/popover.class.js +2 -2
  90. package/dist/components/retrieval/graph/graph.class.d.ts +3 -3
  91. package/dist/components/retrieval/graph/graph.class.js +1 -1
  92. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +5 -3
  93. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +3 -2
  94. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +3 -3
  95. package/dist/components/retrieval/mind-map/mind-map.class.js +1 -1
  96. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +4 -1
  97. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +5 -1
  98. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +4 -1
  99. package/dist/components/retrieval/source-picker/source-picker.class.js +5 -1
  100. package/dist/components/utility/icon/icon.class.d.ts +9 -3
  101. package/dist/components/utility/icon/icon.class.js +1 -1
  102. package/dist/components/utility/mutation-observer/mutation-observer.class.d.ts +14 -8
  103. package/dist/components/utility/mutation-observer/mutation-observer.class.js +1 -1
  104. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +6 -1
  105. package/dist/components/viewers/document-viewer/document-viewer.class.js +7 -1
  106. package/dist/components/viewers/document-viewer/registry.d.ts +12 -3
  107. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +13 -5
  108. package/dist/components/viewers/geojson-view/geojson-view.class.js +1 -1
  109. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -2
  110. package/dist/custom-elements-jsx.d.ts +1 -1
  111. package/dist/events.d.ts +644 -1242
  112. package/dist/internal/anchored-overlay-runtime.d.ts +2 -2
  113. package/dist/internal/cell-range.d.ts +0 -6
  114. package/dist/internal/cell-range.js +1 -1
  115. package/dist/internal/css-token-length.d.ts +7 -0
  116. package/dist/internal/css-token-length.js +1 -0
  117. package/dist/internal/default-strings.generated.d.ts +1 -1
  118. package/dist/internal/default-strings.generated.js +1 -1
  119. package/dist/internal/deferred-focus-return.d.ts +7 -4
  120. package/dist/internal/deferred-focus-return.js +1 -1
  121. package/dist/internal/dev-mode-attribute-warning.d.ts +35 -0
  122. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  123. package/dist/internal/localization-runtime.js +1 -1
  124. package/dist/internal/localization-types.d.ts +1 -1
  125. package/dist/internal/localization.js +2 -2
  126. package/dist/internal/package-metadata.d.ts +1 -1
  127. package/dist/internal/package-metadata.js +1 -1
  128. package/dist/internal/papaparse-loader.d.ts +1 -1
  129. package/dist/internal/papaparse-loader.js +1 -1
  130. package/dist/internal/positioner.d.ts +10 -0
  131. package/dist/internal/positioner.js +1 -1
  132. package/dist/internal/shared-unions.d.ts +2 -1
  133. package/dist/internal/slotted-overlay-controller.d.ts +20 -0
  134. package/dist/internal/slotted-overlay-controller.js +1 -0
  135. package/dist/internal/text-quote.d.ts +1 -1
  136. package/dist/internal/text-quote.js +1 -1
  137. package/dist/internal/theme-observation.d.ts +4 -0
  138. package/dist/internal/theme-observation.js +1 -0
  139. package/dist/internal/theme-watcher.js +1 -1
  140. package/dist/localization.d.ts +6 -1
  141. package/dist/localization.js +1 -1
  142. package/dist/lyra.d.ts +1 -1
  143. package/dist/lyra.js +1 -1
  144. package/dist/svelte.d.ts +1 -1
  145. package/dist/testing/lyra-tag-event-map.js +1 -1
  146. package/dist/translations/ar/agent-tools.js +1 -1
  147. package/dist/translations/cs/agent-tools.js +1 -1
  148. package/dist/translations/da/agent-tools.js +1 -1
  149. package/dist/translations/de/agent-tools.js +1 -1
  150. package/dist/translations/de-CH/agent-tools.js +1 -1
  151. package/dist/translations/es/agent-tools.js +1 -1
  152. package/dist/translations/fa/agent-tools.js +1 -1
  153. package/dist/translations/fi/agent-tools.js +1 -1
  154. package/dist/translations/fr/agent-tools.js +1 -1
  155. package/dist/translations/he/agent-tools.js +1 -1
  156. package/dist/translations/hi/agent-tools.js +1 -1
  157. package/dist/translations/hr/agent-tools.js +1 -1
  158. package/dist/translations/hu/agent-tools.js +1 -1
  159. package/dist/translations/id/agent-tools.js +1 -1
  160. package/dist/translations/it/agent-tools.js +1 -1
  161. package/dist/translations/ja/agent-tools.js +1 -1
  162. package/dist/translations/kk/agent-tools.js +1 -1
  163. package/dist/translations/ko/agent-tools.js +1 -1
  164. package/dist/translations/nb/agent-tools.js +1 -1
  165. package/dist/translations/nl/agent-tools.js +1 -1
  166. package/dist/translations/nn/agent-tools.js +1 -1
  167. package/dist/translations/pl/agent-tools.js +1 -1
  168. package/dist/translations/pt-BR/agent-tools.js +1 -1
  169. package/dist/translations/pt-PT/agent-tools.js +1 -1
  170. package/dist/translations/pt-PT/charts.js +1 -1
  171. package/dist/translations/pt-PT/conversation.js +1 -1
  172. package/dist/translations/pt-PT/data.js +1 -1
  173. package/dist/translations/pt-PT/forms.js +1 -1
  174. package/dist/translations/pt-PT/layout.js +1 -1
  175. package/dist/translations/pt-PT/media.js +1 -1
  176. package/dist/translations/pt-PT/retrieval.js +1 -1
  177. package/dist/translations/pt-PT/shared.js +1 -1
  178. package/dist/translations/pt-PT/utility.js +1 -1
  179. package/dist/translations/pt-PT/viewers.js +2 -2
  180. package/dist/translations/ro/agent-tools.js +1 -1
  181. package/dist/translations/ru/agent-tools.js +1 -1
  182. package/dist/translations/sl/agent-tools.js +1 -1
  183. package/dist/translations/sv/agent-tools.js +1 -1
  184. package/dist/translations/tr/agent-tools.js +1 -1
  185. package/dist/translations/uk/agent-tools.js +1 -1
  186. package/dist/translations/zh-CN/agent-tools.js +1 -1
  187. package/dist/translations/zh-TW/agent-tools.js +1 -1
  188. package/dist/utilities/index.d.ts +1 -1
  189. package/dist/utilities/index.js +1 -1
  190. package/dist/utilities/localization.d.ts +28 -10
  191. package/dist/vue.d.ts +1 -1
  192. package/llms/components/lr-accordion-item.md +2 -344
  193. package/llms/components/lr-accordion.md +2 -344
  194. package/llms/components/lr-app-rail-group.md +2 -721
  195. package/llms/components/lr-app-rail-item.md +2 -721
  196. package/llms/components/lr-app-rail.md +29 -4
  197. package/llms/components/lr-bar-chart.md +2 -87
  198. package/llms/components/lr-box-plot.md +1 -1
  199. package/llms/components/lr-breadcrumb-item.md +2 -67
  200. package/llms/components/lr-bubble-chart.md +2 -87
  201. package/llms/components/lr-button.md +7 -0
  202. package/llms/components/lr-chart.md +4 -5
  203. package/llms/components/lr-chip-group.md +2 -272
  204. package/llms/components/lr-conversation-item.md +20 -2
  205. package/llms/components/lr-date-input.md +2 -457
  206. package/llms/components/lr-date-picker.md +6 -2
  207. package/llms/components/lr-document-library.md +3 -3
  208. package/llms/components/lr-document-viewer.md +14 -5
  209. package/llms/components/lr-doughnut-chart.md +2 -87
  210. package/llms/components/lr-dropdown-item.md +2 -306
  211. package/llms/components/lr-dropdown.md +6 -0
  212. package/llms/components/lr-flag.md +9 -1
  213. package/llms/components/lr-flow-node.md +4 -1
  214. package/llms/components/lr-geojson-view.md +3 -90
  215. package/llms/components/lr-geojson-viewer.md +13 -5
  216. package/llms/components/lr-icon-button.md +4 -1
  217. package/llms/components/lr-icon.md +14 -6
  218. package/llms/components/lr-input.md +9 -2
  219. package/llms/components/lr-lite-chart.md +17 -9
  220. package/llms/components/lr-map.md +87 -2
  221. package/llms/components/lr-markdown-core.md +5 -4
  222. package/llms/components/lr-markdown.md +4 -2
  223. package/llms/components/lr-media-card.md +10 -5
  224. package/llms/components/lr-menu-item.md +2 -306
  225. package/llms/components/lr-menu.md +9 -6
  226. package/llms/components/lr-menubar-item.md +2 -125
  227. package/llms/components/lr-message-actions.md +4 -1
  228. package/llms/components/lr-message-parts.md +14 -5
  229. package/llms/components/lr-mutation-observer.md +12 -6
  230. package/llms/components/lr-navigation-menu-item.md +2 -237
  231. package/llms/components/lr-number-input.md +4 -0
  232. package/llms/components/lr-option.md +2 -712
  233. package/llms/components/lr-pie-chart.md +2 -87
  234. package/llms/components/lr-polar-area-chart.md +2 -87
  235. package/llms/components/lr-popover.md +10 -0
  236. package/llms/components/lr-prompt-input.md +5 -1
  237. package/llms/components/lr-radar-chart.md +2 -87
  238. package/llms/components/lr-reorder-item.md +2 -157
  239. package/llms/components/lr-result-field.md +2 -117
  240. package/llms/components/lr-retrieval-results.md +3 -1
  241. package/llms/components/lr-rubric-form.md +3 -2
  242. package/llms/components/lr-scatter-chart.md +2 -87
  243. package/llms/components/lr-selection-toolbar.md +4 -2
  244. package/llms/components/lr-source-card.md +2 -186
  245. package/llms/components/lr-source-picker.md +3 -1
  246. package/llms/components/lr-sparkline.md +9 -4
  247. package/llms/components/lr-split-panel.md +5 -3
  248. package/llms/components/lr-stat.md +4 -3
  249. package/llms/components/lr-streaming-text-core.md +7 -5
  250. package/llms/components/lr-streaming-text.md +9 -6
  251. package/llms/components/lr-swatch-picker.md +130 -0
  252. package/llms/components/lr-tag.md +2 -177
  253. package/llms/components/lr-thread-list.md +27 -4
  254. package/llms/components/lr-timeline-item.md +2 -120
  255. package/llms/components/lr-toast-item.md +2 -223
  256. package/llms/components/lr-tool-call-block.md +12 -3
  257. package/llms/components/lr-tool-call-chip.md +12 -6
  258. package/llms/components/lr-tool-param-form.md +3 -2
  259. package/llms/components/lr-tool-result-dialog.md +7 -3
  260. package/llms/components/lr-tool-result-view.md +4 -3
  261. package/llms/components/lr-tool-timeline.md +12 -5
  262. package/llms/components/lr-tree-item.md +2 -354
  263. package/llms/index.md +22 -4
  264. package/llms/migration.md +75 -1
  265. package/llms/peers.md +1 -1
  266. package/llms/shared.md +86 -39
  267. package/llms-full.txt +739 -163
  268. package/package.json +6 -6
  269. package/registrations.json +1 -1
  270. package/vscode-css-data.json +1 -1
  271. package/vscode-html-data.json +1 -1
  272. package/web-types.json +1 -1
@@ -253,7 +253,9 @@ streamingRender:MarkdownStreamingRender;
253
253
  * Custom code renderers and pre-escaped code bypass the header. In sanitize mode this also strips
254
254
  * authored style elements; trusted mode has no guarantee against authored visual copy deception. */
255
255
  codeBlockHeader:boolean;
256
- /** Compatibility spelling for enabling the code-block header. Either property enables it. */
256
+ /** Deprecated compatibility spelling of `code-block-header`: either property enables the header.
257
+ * Setting it logs a one-time development warning.
258
+ * @deprecated Use `code-block-header` (`codeBlockHeader`); removal not before 23.0.0. */
257
259
  codeBlockChrome:boolean;
258
260
  /** Syntax-highlights fenced code blocks via the same optional `shiki` peer `<lr-code-block>`
259
261
  * uses. `true` (the default) upgrades every fenced block from plain `<pre><code>` once the peer
@@ -93,7 +93,10 @@ finalizePendingSubmit(submissionId:string):boolean;
93
93
  /** Reverts only the currently rendered built-in feedback transaction identified by `submissionId`.
94
94
  * A removed, replaced, stale, or mismatched child fails closed. */
95
95
  revertPendingSubmit(submissionId:string):boolean;
96
- /** Visually hides the bar until the enclosing message is hovered or any control inside has focus. */
96
+ /** Visually hides the bar until the enclosing message is hovered or any control inside has focus.
97
+ * The bar also stays revealed while an `lr-dropdown`, `lr-popover` or `lr-context-menu` opened
98
+ * from a slotted control is open: that menu sits in the browser top layer, where Chromium and
99
+ * WebKit stop matching `:focus-within` here while focus is inside it. */
97
100
  revealOnInteraction:boolean;
98
101
  /** Accessible name for the toolbar. Omitting it localizes the default `messageActionsLabel`
99
102
  * message; an explicit empty string (`label=""` or `.label = ''`) suppresses that default and
@@ -108,6 +111,8 @@ accessibleLabel:string|null;private activeStopIndex;
108
111
  * technique) while `revealOnInteraction` is active. CSS alone cannot key `:host`'s own opacity off the
109
112
  * ancestor `lr-chat-message`'s hover state from inside this component's own shadow DOM, so the
110
113
  * reveal state is tracked in JS instead (see `bindHoverTarget()`). */
111
- private revealed;private hoverTarget;private stopSyncGeneration;private stopObserver?;private managedStops;private directActions;private nextDirectActionId;private focusedStop?;private currentBuiltInFeedback;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected firstUpdated(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private bindHoverTarget;private unbindHoverTarget;private onHoverTargetEnter;private onHoverTargetLeave;private onFocusIn;private onFocusOut;
114
+ private revealed;private hoverTarget;
115
+ /** Whether a menu opened from a slotted control is open -- see `revealOnInteraction`. */
116
+ private readonly slottedOverlay;private slottedOverlayWasOpen;private stopSyncGeneration;private stopObserver?;private managedStops;private directActions;private nextDirectActionId;private focusedStop?;private currentBuiltInFeedback;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected firstUpdated(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private bindHoverTarget;private unbindHoverTarget;private onHoverTargetEnter;private onHoverTargetLeave;private onFocusIn;private onFocusOut;
112
117
  /** Immediate rendered children plus flattened slotted roots that own logical actions. */
113
118
  private actionRoots;private sameAction;private isAvailable;private directActionFor;private logicalActions;private setActiveStop;private releaseManagedStop;private releaseManagedStops;private observeStopChanges;private onStopMutations;private reconcileStopsAfterChildren;private onSlotChange;private onToolbarActionsChange;private containSlottedFeedbackEvent;private onToolbarKeyDown;private onRegenerateClick;private onEditClick;private renderControl;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-actions':LyraMessageActions;}}
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import"../../utility/copy-button/copy-button.class.js";import"../message-feedback/message-feedback.class.js";import{styles}from"./message-actions.styles.js";import{applyComposedFocusRepair,captureComposedFocusRepair,isComposedFocusAvailable,isSemanticActionElement}from"../../../internal/focus-navigation.js";import{composedContains}from"../../../internal/overlay-manager.js";import{isLyraToolbarActionProvider}from"./toolbar-actions.js";import{LYRA_DEFAULT_editMessage,LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_messageActionsLabel,LYRA_DEFAULT_regenerateResponse}from"../../../internal/default-strings.generated.js";const MESSAGE_ACTION_CONTROLS=["copy","regenerate","edit","feedback"],MAX_TOOLBAR_ACTIONS=100,MAX_DESCRIPTOR_PROTOTYPES=100;function isObjectValue(value){return value!==null&&(typeof value=="object"||typeof value=="function")}function inheritedDescriptor(value,key){let current=value;for(let depth=0;current&&depth<MAX_DESCRIPTOR_PROTOTYPES;depth+=1){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(current,key)}catch{return}if(descriptor)return descriptor;try{current=Object.getPrototypeOf(current)}catch{return}}}function dataCallable(value,key){const descriptor=inheritedDescriptor(value,key);return descriptor&&"value"in descriptor&&typeof descriptor.value=="function"?descriptor.value:void 0}function dataValue(value,key){const descriptor=inheritedDescriptor(value,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}function projectDisabled(value){const descriptor=inheritedDescriptor(value,"disabled");if(!descriptor)return{valid:!0,disabled:!1};if("value"in descriptor)return{valid:!0,disabled:descriptor.value===!0};if(typeof descriptor.get!="function")return{valid:!1,disabled:!0};try{return{valid:!0,disabled:Reflect.apply(descriptor.get,value,[])===!0}}catch{return{valid:!1,disabled:!0}}}function projectToolbarAction(value){if(!isObjectValue(value))return;const id=dataValue(value,"id"),focus=dataCallable(value,"focus"),setTabIndex=dataCallable(value,"setTabIndex"),matchesEventPath=dataCallable(value,"matchesEventPath"),releaseTabIndex=dataCallable(value,"releaseTabIndex"),disabled=projectDisabled(value);if(typeof id!="string"||id.trim().length===0||!focus||!setTabIndex||!matchesEventPath||!disabled.valid)return;const action={id,disabled:disabled.disabled,focus(options){try{Reflect.apply(focus,value,[options])}catch{}},setTabIndex(tabIndex){try{Reflect.apply(setTabIndex,value,[tabIndex])}catch{}},...releaseTabIndex?{releaseTabIndex(){try{Reflect.apply(releaseTabIndex,value,[])}catch{}}}:{},matchesEventPath(path){try{return Reflect.apply(matchesEventPath,value,[path])===!0}catch{return!1}}};return{source:value,action}}function regenerateIcon(){return svg`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import"../../utility/copy-button/copy-button.class.js";import"../message-feedback/message-feedback.class.js";import{styles}from"./message-actions.styles.js";import{applyComposedFocusRepair,captureComposedFocusRepair,isComposedFocusAvailable,isSemanticActionElement}from"../../../internal/focus-navigation.js";import{composedContains}from"../../../internal/overlay-manager.js";import{SlottedOverlayController}from"../../../internal/slotted-overlay-controller.js";import{isLyraToolbarActionProvider}from"./toolbar-actions.js";import{LYRA_DEFAULT_editMessage,LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_messageActionsLabel,LYRA_DEFAULT_regenerateResponse}from"../../../internal/default-strings.generated.js";const MESSAGE_ACTION_CONTROLS=["copy","regenerate","edit","feedback"],MAX_TOOLBAR_ACTIONS=100,MAX_DESCRIPTOR_PROTOTYPES=100;function isObjectValue(value){return value!==null&&(typeof value=="object"||typeof value=="function")}function inheritedDescriptor(value,key){let current=value;for(let depth=0;current&&depth<MAX_DESCRIPTOR_PROTOTYPES;depth+=1){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(current,key)}catch{return}if(descriptor)return descriptor;try{current=Object.getPrototypeOf(current)}catch{return}}}function dataCallable(value,key){const descriptor=inheritedDescriptor(value,key);return descriptor&&"value"in descriptor&&typeof descriptor.value=="function"?descriptor.value:void 0}function dataValue(value,key){const descriptor=inheritedDescriptor(value,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}function projectDisabled(value){const descriptor=inheritedDescriptor(value,"disabled");if(!descriptor)return{valid:!0,disabled:!1};if("value"in descriptor)return{valid:!0,disabled:descriptor.value===!0};if(typeof descriptor.get!="function")return{valid:!1,disabled:!0};try{return{valid:!0,disabled:Reflect.apply(descriptor.get,value,[])===!0}}catch{return{valid:!1,disabled:!0}}}function projectToolbarAction(value){if(!isObjectValue(value))return;const id=dataValue(value,"id"),focus=dataCallable(value,"focus"),setTabIndex=dataCallable(value,"setTabIndex"),matchesEventPath=dataCallable(value,"matchesEventPath"),releaseTabIndex=dataCallable(value,"releaseTabIndex"),disabled=projectDisabled(value);if(typeof id!="string"||id.trim().length===0||!focus||!setTabIndex||!matchesEventPath||!disabled.valid)return;const action={id,disabled:disabled.disabled,focus(options){try{Reflect.apply(focus,value,[options])}catch{}},setTabIndex(tabIndex){try{Reflect.apply(setTabIndex,value,[tabIndex])}catch{}},...releaseTabIndex?{releaseTabIndex(){try{Reflect.apply(releaseTabIndex,value,[])}catch{}}}:{},matchesEventPath(path){try{return Reflect.apply(matchesEventPath,value,[path])===!0}catch{return!1}}};return{source:value,action}}function regenerateIcon(){return svg`
2
2
  <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
3
3
  <polyline points="23 4 23 10 17 10"></polyline>
4
4
  <polyline points="1 20 1 14 7 14"></polyline>
@@ -9,7 +9,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
9
9
  <path d="M12 20h9"></path>
10
10
  <path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
11
11
  </svg>
12
- `}class LyraMessageActions extends LyraElement{constructor(){super(...arguments),this.controls=[],this.copyText="",this.feedbackRating=null,this.revealOnInteraction=!1,this.accessibleLabel=null,this.activeStopIndex=0,this.revealed=!1,this.hoverTarget=null,this.stopSyncGeneration=0,this.managedStops=[],this.directActions=new WeakMap,this.nextDirectActionId=0,this.onHoverTargetEnter=()=>{this.revealed=!0},this.onHoverTargetLeave=()=>{this.matches(":focus-within")||(this.revealed=!1)},this.onFocusIn=event=>{this.revealed=!0;const stops=this.logicalActions(),path=event.composedPath(),index=stops.findIndex(({action})=>action.matchesEventPath(path));if(index>=0){this.setActiveStop(stops,index,stops[index]);const base=this.renderRoot.querySelector('[part="base"]'),repair=base?captureComposedFocusRepair(this,base):null,stop=stops[index];this.focusedStop=stop&&repair?{index,owner:stop.owner,id:stop.action.id,source:stop.source,repair}:void 0}else this.focusedStop=void 0},this.onFocusOut=event=>{this.hoverTarget?.matches(":hover")||(this.revealed=!1);const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedStop=void 0)},this.onStopMutations=records=>{this.reconcileStopsAfterChildren()},this.onSlotChange=()=>{const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()},this.onToolbarActionsChange=event=>{event.stopPropagation(),this.reconcileStopsAfterChildren()},this.containSlottedFeedbackEvent=event=>{event.stopPropagation()},this.onToolbarKeyDown=e=>{const stops=this.logicalActions();if(stops.length===0)return;const path=e.composedPath(),originIndex=stops.findIndex(({action})=>action.matchesEventPath(path));if(originIndex<0&&path[0]!==e.currentTarget)return;const currentIndex=originIndex>=0?originIndex:this.activeStopIndex,forwardKey=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backwardKey=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let target;if(e.key===forwardKey)target=(currentIndex+1)%stops.length;else if(e.key===backwardKey)target=(currentIndex-1+stops.length)%stops.length;else if(e.key==="Home")target=0;else if(e.key==="End")target=stops.length-1;else return;e.preventDefault(),this.setActiveStop(stops,target),stops[target]?.action.focus()},this.onRegenerateClick=()=>{this.emit("lr-regenerate",null)},this.onEditClick=()=>{this.emit("lr-edit",null)}}static{this.defaultStrings={...super.defaultStrings,editMessage:LYRA_DEFAULT_editMessage,fieldRequired:LYRA_DEFAULT_fieldRequired,messageActionsLabel:LYRA_DEFAULT_messageActionsLabel,regenerateResponse:LYRA_DEFAULT_regenerateResponse}}static{this.ownedCollectionProperties=Object.freeze(["controls"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get effectiveControls(){const seen=new Set,controls=[];for(const value of this.controls){if(typeof value!="string"||!MESSAGE_ACTION_CONTROLS.includes(value)||seen.has(value))continue;const control=value;seen.add(control),controls.push(control)}return controls}get feedbackPending(){return this.currentBuiltInFeedback()?.pending===!0}finalizePendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.finalizePendingSubmit(submissionId):!1}revertPendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.revertPendingSubmit(submissionId):!1}currentBuiltInFeedback(){const base=this.renderRoot.querySelector('[part="base"]'),feedback=base?.querySelector('lr-message-feedback[part~="feedback"]');return feedback&&feedback.parentElement===base&&feedback.getRootNode()===this.renderRoot&&feedback.isConnected?feedback:void 0}connectedCallback(){super.connectedCallback(),this.addEventListener("focusin",this.onFocusIn),this.addEventListener("focusout",this.onFocusOut),this.revealOnInteraction&&this.bindHoverTarget(),this.hasUpdated&&this.reconcileStopsAfterChildren()}disconnectedCallback(){this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops(),this.focusedStop=void 0,this.unbindHoverTarget(),this.removeEventListener("focusin",this.onFocusIn),this.removeEventListener("focusout",this.onFocusOut),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops()}willUpdate(changed){super.willUpdate(changed),changed.has("revealOnInteraction")&&(this.revealOnInteraction?this.bindHoverTarget():this.unbindHoverTarget())}firstUpdated(changed){super.firstUpdated(changed),this.setActiveStop(this.logicalActions(),0),this.reconcileStopsAfterChildren()}updated(changed){if(super.updated(changed),changed.has("controls")){const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()}changed.has("revealed")&&this.toggleAttribute("data-revealed",this.revealed)}bindHoverTarget(){this.unbindHoverTarget();const target=this.closest("lr-chat-message")??this.parentElement;target&&(this.hoverTarget=target,target.addEventListener("pointerenter",this.onHoverTargetEnter),target.addEventListener("pointerleave",this.onHoverTargetLeave))}unbindHoverTarget(){this.hoverTarget?.removeEventListener("pointerenter",this.onHoverTargetEnter),this.hoverTarget?.removeEventListener("pointerleave",this.onHoverTargetLeave),this.hoverTarget=null,this.revealed=!1}actionRoots(){const base=this.renderRoot.querySelector('[part="base"]');if(!base)return[];const direct=[...base.children].filter(element=>element.localName!=="slot"),slot=base.querySelector("slot");return[...direct,...slot?.assignedElements({flatten:!0})??[]]}sameAction(left,right){return left.owner===right.owner&&left.source===right.source&&left.action.id===right.action.id}isAvailable(action){try{return action.disabled!==!0}catch{return!1}}directActionFor(element){let action=this.directActions.get(element);if(action)return action;const target=element,id=`direct-${++this.nextDirectActionId}`;let leasedTarget,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const leased=leasedTarget;leased&&leased.getAttribute("tabindex")===lastManagedTabIndex&&(leasedAuthoredTabIndex===null?leased.removeAttribute("tabindex"):leased.setAttribute("tabindex",leasedAuthoredTabIndex)),leasedTarget=void 0,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return action={id,get disabled(){return!isComposedFocusAvailable(element)},focus(options){target.focus(options)},setTabIndex(tabIndex){if(leasedTarget!==target&&(releaseTabIndex(),leasedTarget=target,leasedAuthoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,hasAuthoredTabIndex(){return leasedTarget!==target?target.hasAttribute("tabindex"):lastManagedTabIndex!==null&&target.getAttribute("tabindex")===lastManagedTabIndex?leasedAuthoredTabIndex!==null:target.hasAttribute("tabindex")},matchesEventPath(path){return path.includes(element)}},this.directActions.set(element,action),action}logicalActions(){const actions=[],addProvider=(owner,provider)=>{const getToolbarActions=dataCallable(provider,"getToolbarActions");if(!getToolbarActions)return;let provided;try{provided=Reflect.apply(getToolbarActions,provider,[])}catch{return}let isArray=!1;try{isArray=Array.isArray(provided)}catch{return}if(!isArray)return;const length=getOwnDataDescriptor(provided,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return;const seen=new Set,inspected=Math.min(length.value,MAX_TOOLBAR_ACTIONS);for(let index=0;index<inspected;index+=1){const candidate=getOwnDataDescriptor(provided,String(index));if(candidate===MISSING_OWN_DATA_DESCRIPTOR||candidate===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const projected=projectToolbarAction(candidate.value);!projected||seen.has(projected.action.id)||(seen.add(projected.action.id),this.isAvailable(projected.action)&&actions.push({owner,...projected}))}},visit=element=>{if(isLyraToolbarActionProvider(element)){addProvider(element,element);return}const knownAction=this.directActions.get(element);if(isSemanticActionElement(element)||(knownAction?.hasAuthoredTabIndex()??element.hasAttribute("tabindex"))){const action=this.directActionFor(element);this.isAvailable(action)&&actions.push({owner:element,action,source:action});return}for(const child of element.children)visit(child)};for(const root of this.actionRoots())visit(root);return actions}setActiveStop(stops,index,preferred){this.stopObserver?.disconnect();for(const previous of this.managedStops)stops.some(stop=>this.sameAction(stop,previous))||this.releaseManagedStop(previous);const preferredIndex=preferred?stops.findIndex(stop=>this.sameAction(stop,preferred)):-1;this.activeStopIndex=stops.length===0?0:preferredIndex>=0?preferredIndex:Math.min(Math.max(0,index),stops.length-1),stops.forEach(({action},stopIndex)=>{try{action.setTabIndex(stopIndex===this.activeStopIndex?0:-1)}catch{}}),this.managedStops=stops,this.observeStopChanges()}releaseManagedStop(stop){try{stop.action.releaseTabIndex?.()}catch{}this.directActions.get(stop.owner)===stop.action&&this.directActions.delete(stop.owner)}releaseManagedStops(){for(const stop of this.managedStops)this.releaseManagedStop(stop);this.managedStops=[]}observeStopChanges(){this.stopObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,base=this.renderRoot.querySelector('[part="base"]');if(!Observer||!base||!this.isConnected){this.stopObserver=void 0;return}const observer=new Observer(this.onStopMutations),roots=new Set([base,...this.actionRoots()]),options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.stopObserver=observer}async reconcileStopsAfterChildren(){const generation=++this.stopSyncGeneration,pending=this.actionRoots().map(root=>root.updateComplete).filter(value=>value!==void 0&&typeof value.then=="function");if(await Promise.all(pending),await Promise.resolve(),generation!==this.stopSyncGeneration||!this.isConnected)return;const stops=this.logicalActions(),focused=this.focusedStop,retainedIndex=focused?stops.findIndex(stop=>stop.owner===focused.owner&&stop.source===focused.source&&stop.action.id===focused.id):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):this.activeStopIndex,Math.max(0,stops.length-1));if(this.setActiveStop(stops,targetIndex),focused&&retainedIndex<0){const base=this.renderRoot.querySelector('[part="base"]');base&&applyComposedFocusRepair(focused.repair,base)&&stops[targetIndex]?.action.focus(),this.focusedStop===focused&&(this.focusedStop=void 0)}}renderControl(type){switch(type){case"copy":return this.copyText?html`<lr-copy-button
12
+ `}class LyraMessageActions extends LyraElement{constructor(){super(...arguments),this.controls=[],this.copyText="",this.feedbackRating=null,this.revealOnInteraction=!1,this.accessibleLabel=null,this.activeStopIndex=0,this.revealed=!1,this.hoverTarget=null,this.slottedOverlay=new SlottedOverlayController(this,()=>this.renderRoot?.querySelector('[part="base"] > slot:not([name])')),this.slottedOverlayWasOpen=!1,this.stopSyncGeneration=0,this.managedStops=[],this.directActions=new WeakMap,this.nextDirectActionId=0,this.onHoverTargetEnter=()=>{this.revealed=!0},this.onHoverTargetLeave=()=>{!this.matches(":focus-within")&&!this.slottedOverlay.open&&(this.revealed=!1)},this.onFocusIn=event=>{this.revealed=!0;const stops=this.logicalActions(),path=event.composedPath(),index=stops.findIndex(({action})=>action.matchesEventPath(path));if(index>=0){this.setActiveStop(stops,index,stops[index]);const base=this.renderRoot.querySelector('[part="base"]'),repair=base?captureComposedFocusRepair(this,base):null,stop=stops[index];this.focusedStop=stop&&repair?{index,owner:stop.owner,id:stop.action.id,source:stop.source,repair}:void 0}else this.focusedStop=void 0},this.onFocusOut=event=>{!this.hoverTarget?.matches(":hover")&&!this.slottedOverlay.open&&(this.revealed=!1);const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedStop=void 0)},this.onStopMutations=records=>{this.reconcileStopsAfterChildren()},this.onSlotChange=()=>{const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()},this.onToolbarActionsChange=event=>{event.stopPropagation(),this.reconcileStopsAfterChildren()},this.containSlottedFeedbackEvent=event=>{event.stopPropagation()},this.onToolbarKeyDown=e=>{const stops=this.logicalActions();if(stops.length===0)return;const path=e.composedPath(),originIndex=stops.findIndex(({action})=>action.matchesEventPath(path));if(originIndex<0&&path[0]!==e.currentTarget)return;const currentIndex=originIndex>=0?originIndex:this.activeStopIndex,forwardKey=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backwardKey=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let target;if(e.key===forwardKey)target=(currentIndex+1)%stops.length;else if(e.key===backwardKey)target=(currentIndex-1+stops.length)%stops.length;else if(e.key==="Home")target=0;else if(e.key==="End")target=stops.length-1;else return;e.preventDefault(),this.setActiveStop(stops,target),stops[target]?.action.focus()},this.onRegenerateClick=()=>{this.emit("lr-regenerate",null)},this.onEditClick=()=>{this.emit("lr-edit",null)}}static{this.defaultStrings={...super.defaultStrings,editMessage:LYRA_DEFAULT_editMessage,fieldRequired:LYRA_DEFAULT_fieldRequired,messageActionsLabel:LYRA_DEFAULT_messageActionsLabel,regenerateResponse:LYRA_DEFAULT_regenerateResponse}}static{this.ownedCollectionProperties=Object.freeze(["controls"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-feedback-submit"])}get effectiveControls(){const seen=new Set,controls=[];for(const value of this.controls){if(typeof value!="string"||!MESSAGE_ACTION_CONTROLS.includes(value)||seen.has(value))continue;const control=value;seen.add(control),controls.push(control)}return controls}get feedbackPending(){return this.currentBuiltInFeedback()?.pending===!0}finalizePendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.finalizePendingSubmit(submissionId):!1}revertPendingSubmit(submissionId){const feedback=this.currentBuiltInFeedback();return typeof submissionId=="string"&&submissionId.trim().length>0&&feedback!==void 0?feedback.revertPendingSubmit(submissionId):!1}currentBuiltInFeedback(){const base=this.renderRoot.querySelector('[part="base"]'),feedback=base?.querySelector('lr-message-feedback[part~="feedback"]');return feedback&&feedback.parentElement===base&&feedback.getRootNode()===this.renderRoot&&feedback.isConnected?feedback:void 0}connectedCallback(){super.connectedCallback(),this.addEventListener("focusin",this.onFocusIn),this.addEventListener("focusout",this.onFocusOut),this.revealOnInteraction&&this.bindHoverTarget(),this.hasUpdated&&this.reconcileStopsAfterChildren()}disconnectedCallback(){this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops(),this.focusedStop=void 0,this.unbindHoverTarget(),this.removeEventListener("focusin",this.onFocusIn),this.removeEventListener("focusout",this.onFocusOut),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.stopSyncGeneration++,this.stopObserver?.disconnect(),this.stopObserver=void 0,this.releaseManagedStops()}willUpdate(changed){super.willUpdate(changed),changed.has("revealOnInteraction")&&(this.revealOnInteraction?this.bindHoverTarget():this.unbindHoverTarget());const overlayOpen=this.slottedOverlay.open;overlayOpen!==this.slottedOverlayWasOpen&&(this.slottedOverlayWasOpen=overlayOpen,overlayOpen?this.revealed=!0:!this.hoverTarget?.matches(":hover")&&!this.matches(":focus-within")&&(this.revealed=!1))}firstUpdated(changed){super.firstUpdated(changed),this.setActiveStop(this.logicalActions(),0),this.reconcileStopsAfterChildren()}updated(changed){if(super.updated(changed),changed.has("controls")){const stops=this.logicalActions();this.setActiveStop(stops,Math.min(this.activeStopIndex,Math.max(0,stops.length-1))),this.reconcileStopsAfterChildren()}changed.has("revealed")&&this.toggleAttribute("data-revealed",this.revealed)}bindHoverTarget(){this.unbindHoverTarget();const target=this.closest("lr-chat-message")??this.parentElement;target&&(this.hoverTarget=target,target.addEventListener("pointerenter",this.onHoverTargetEnter),target.addEventListener("pointerleave",this.onHoverTargetLeave))}unbindHoverTarget(){this.hoverTarget?.removeEventListener("pointerenter",this.onHoverTargetEnter),this.hoverTarget?.removeEventListener("pointerleave",this.onHoverTargetLeave),this.hoverTarget=null,this.revealed=!1}actionRoots(){const base=this.renderRoot.querySelector('[part="base"]');if(!base)return[];const direct=[...base.children].filter(element=>element.localName!=="slot"),slot=base.querySelector("slot");return[...direct,...slot?.assignedElements({flatten:!0})??[]]}sameAction(left,right){return left.owner===right.owner&&left.source===right.source&&left.action.id===right.action.id}isAvailable(action){try{return action.disabled!==!0}catch{return!1}}directActionFor(element){let action=this.directActions.get(element);if(action)return action;const target=element,id=`direct-${++this.nextDirectActionId}`;let leasedTarget,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1;const releaseTabIndex=()=>{const leased=leasedTarget;leased&&leased.getAttribute("tabindex")===lastManagedTabIndex&&(leasedAuthoredTabIndex===null?leased.removeAttribute("tabindex"):leased.setAttribute("tabindex",leasedAuthoredTabIndex)),leasedTarget=void 0,leasedAuthoredTabIndex=null,lastManagedTabIndex=null,consumerOwnsTabIndex=!1};return action={id,get disabled(){return!isComposedFocusAvailable(element)},focus(options){target.focus(options)},setTabIndex(tabIndex){if(leasedTarget!==target&&(releaseTabIndex(),leasedTarget=target,leasedAuthoredTabIndex=target.getAttribute("tabindex")),consumerOwnsTabIndex||lastManagedTabIndex!==null&&target.getAttribute("tabindex")!==lastManagedTabIndex){consumerOwnsTabIndex=!0;return}target.tabIndex=tabIndex,lastManagedTabIndex=target.getAttribute("tabindex")},releaseTabIndex,hasAuthoredTabIndex(){return leasedTarget!==target?target.hasAttribute("tabindex"):lastManagedTabIndex!==null&&target.getAttribute("tabindex")===lastManagedTabIndex?leasedAuthoredTabIndex!==null:target.hasAttribute("tabindex")},matchesEventPath(path){return path.includes(element)}},this.directActions.set(element,action),action}logicalActions(){const actions=[],addProvider=(owner,provider)=>{const getToolbarActions=dataCallable(provider,"getToolbarActions");if(!getToolbarActions)return;let provided;try{provided=Reflect.apply(getToolbarActions,provider,[])}catch{return}let isArray=!1;try{isArray=Array.isArray(provided)}catch{return}if(!isArray)return;const length=getOwnDataDescriptor(provided,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return;const seen=new Set,inspected=Math.min(length.value,MAX_TOOLBAR_ACTIONS);for(let index=0;index<inspected;index+=1){const candidate=getOwnDataDescriptor(provided,String(index));if(candidate===MISSING_OWN_DATA_DESCRIPTOR||candidate===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const projected=projectToolbarAction(candidate.value);!projected||seen.has(projected.action.id)||(seen.add(projected.action.id),this.isAvailable(projected.action)&&actions.push({owner,...projected}))}},visit=element=>{if(isLyraToolbarActionProvider(element)){addProvider(element,element);return}const knownAction=this.directActions.get(element);if(isSemanticActionElement(element)||(knownAction?.hasAuthoredTabIndex()??element.hasAttribute("tabindex"))){const action=this.directActionFor(element);this.isAvailable(action)&&actions.push({owner:element,action,source:action});return}for(const child of element.children)visit(child)};for(const root of this.actionRoots())visit(root);return actions}setActiveStop(stops,index,preferred){this.stopObserver?.disconnect();for(const previous of this.managedStops)stops.some(stop=>this.sameAction(stop,previous))||this.releaseManagedStop(previous);const preferredIndex=preferred?stops.findIndex(stop=>this.sameAction(stop,preferred)):-1;this.activeStopIndex=stops.length===0?0:preferredIndex>=0?preferredIndex:Math.min(Math.max(0,index),stops.length-1),stops.forEach(({action},stopIndex)=>{try{action.setTabIndex(stopIndex===this.activeStopIndex?0:-1)}catch{}}),this.managedStops=stops,this.observeStopChanges()}releaseManagedStop(stop){try{stop.action.releaseTabIndex?.()}catch{}this.directActions.get(stop.owner)===stop.action&&this.directActions.delete(stop.owner)}releaseManagedStops(){for(const stop of this.managedStops)this.releaseManagedStop(stop);this.managedStops=[]}observeStopChanges(){this.stopObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,base=this.renderRoot.querySelector('[part="base"]');if(!Observer||!base||!this.isConnected){this.stopObserver=void 0;return}const observer=new Observer(this.onStopMutations),roots=new Set([base,...this.actionRoots()]),options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.stopObserver=observer}async reconcileStopsAfterChildren(){const generation=++this.stopSyncGeneration,pending=this.actionRoots().map(root=>root.updateComplete).filter(value=>value!==void 0&&typeof value.then=="function");if(await Promise.all(pending),await Promise.resolve(),generation!==this.stopSyncGeneration||!this.isConnected)return;const stops=this.logicalActions(),focused=this.focusedStop,retainedIndex=focused?stops.findIndex(stop=>stop.owner===focused.owner&&stop.source===focused.source&&stop.action.id===focused.id):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):this.activeStopIndex,Math.max(0,stops.length-1));if(this.setActiveStop(stops,targetIndex),focused&&retainedIndex<0){const base=this.renderRoot.querySelector('[part="base"]');base&&applyComposedFocusRepair(focused.repair,base)&&stops[targetIndex]?.action.focus(),this.focusedStop===focused&&(this.focusedStop=void 0)}}renderControl(type){switch(type){case"copy":return this.copyText?html`<lr-copy-button
13
13
  part="copy-button"
14
14
  .value=${this.copyText}
15
15
  ></lr-copy-button>`:nothing;case"regenerate":return html`<lr-icon-button
@@ -44,7 +44,9 @@ export type MessagePartsToolDisplay='chip'|'block';export interface LyraMessageP
44
44
  * invocation id and renders the pair through one collapsed `<lr-tool-call-block>` at the call's
45
45
  * position; the folded result part renders nothing (it still counts toward `max-rendered-parts`).
46
46
  * The block shows a running state until the result arrives, and reads its duration from the
47
- * invocation's `startedAt`/`endedAt`. An invocation's `redactedFields` masks every built-in
47
+ * invocation's `startedAt`/`endedAt`. An invocation marked `denied` or `incomplete` keeps that
48
+ * status whatever result part is paired with it. In either display, an invocation's `displayName`
49
+ * (the application's translated tool label) is shown in place of its `name`. An invocation's `redactedFields` masks every built-in
48
50
  * rendering of its payload in either display: the block's details, the chip's summary, and a
49
51
  * standalone result part's result and error.
50
52
  *
@@ -125,7 +127,9 @@ renderPart?:MessagePartRenderer;
125
127
  streamingRender:MarkdownStreamingRender;
126
128
  /** Adds source-copy headers to built-in text and reasoning Markdown parts. Custom renderers replace this surface. */
127
129
  codeBlockHeader:boolean;
128
- /** Compatibility spelling for enabling built-in Markdown code headers. */
130
+ /** Deprecated compatibility spelling of `code-block-header`: either property enables the built-in
131
+ * Markdown code headers. Setting it logs a one-time development warning.
132
+ * @deprecated Use `code-block-header` (`codeBlockHeader`); removal not before 23.0.0. */
129
133
  codeBlockChrome:boolean;
130
134
  /** `0` (the default) renders every part -- unbounded, matching every prior release. A positive
131
135
  * value windows rendering to the newest N parts (host `parts` data is untouched); citation
@@ -1,5 +1,6 @@
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{isToolCallStatus}from"../../agent-tools/tool-status.js";import{projectedRedactionFields,redactToolDetail,TOO_MANY_REDACTION_PATHS}from"../../agent-tools/tool-redaction.js";import{literalSetConverter,trueDefaultBooleanConverter}from"../../../internal/converters.js";import{finiteCount}from"../../../internal/numbers.js";import{LyraElement}from"../../../internal/lyra-element.js";import{safeMediaSrc}from"../../../internal/safe-url.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{isNonBlankIdentity,isRecord}from"../../retrieval/retrieval-identity.js";import{styles}from"./message-parts.styles.js";import{LYRA_DEFAULT_envListValueHidden,LYRA_DEFAULT_messagePartError,LYRA_DEFAULT_messagePartRetry,LYRA_DEFAULT_messagePartsLabel,LYRA_DEFAULT_retry,LYRA_DEFAULT_thinkingPanelLabel}from"../../../internal/default-strings.generated.js";const MESSAGE_PARTS_CONTENT_MODES=Object.freeze(["plain","markdown"]),MESSAGE_PARTS_TOOL_DISPLAY=literalSetConverter(["chip","block"],"chip"),EMPTY_REDACTED_FIELDS=Object.freeze([]),TOOL_BLOCK_EXPORTPARTS="header:tool-block-header, body:tool-block-body, args:tool-block-args, result:tool-block-result, error:tool-block-error";function resolveBlockStatus(invocation,result){const status=isToolCallStatus(invocation.status)?invocation.status:"pending";return status==="denied"?"denied":status==="error"||result&&"error"in result?"error":result&&result.state==="streaming"?"running":result?"success":status}function invocationDuration(invocation){if(invocation.startedAt==null||invocation.endedAt==null)return;const diff=invocation.endedAt-invocation.startedAt;return Number.isFinite(diff)?diff:void 0}function normalizeMessagePartsContentMode(value){return typeof value=="string"&&MESSAGE_PARTS_CONTENT_MODES.includes(value)?value:"markdown"}class LyraMessageParts extends LyraElement{constructor(){super(...arguments),this.parts=[],this.contentModeValue="markdown",this.toolDisplayValue="chip",this.showReasoning=!0,this.streamingRender="plain",this.codeBlockHeader=!1,this.codeBlockChrome=!1,this.maxRenderedParts=0,this.accessibleLabel=null,this.knownErrorIds=new Set,this.redactionByInvocation=new Map,this.redactionMemo=new WeakMap,this.suppressNextErrorAnnouncement=!0}static{this.defaultStrings={...super.defaultStrings,envListValueHidden:LYRA_DEFAULT_envListValueHidden,messagePartError:LYRA_DEFAULT_messagePartError,messagePartRetry:LYRA_DEFAULT_messagePartRetry,messagePartsLabel:LYRA_DEFAULT_messagePartsLabel,retry:LYRA_DEFAULT_retry,thinkingPanelLabel:LYRA_DEFAULT_thinkingPanelLabel}}static{this.ownedCollectionProperties=Object.freeze(["parts"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-citation-select","lr-part-retry"])}get contentMode(){return this.contentModeValue}set contentMode(value){const previous=this.contentModeValue,normalized=normalizeMessagePartsContentMode(value);this.contentModeValue=normalized,typeof value=="string"&&value!==normalized&&this.getAttribute("content-mode")!==normalized&&this.setAttribute("content-mode",normalized),this.requestUpdate("contentMode",previous,{reflect:!0,hasChanged:()=>!0})}get toolDisplay(){return this.toolDisplayValue}set toolDisplay(value){const normalized=MESSAGE_PARTS_TOOL_DISPLAY.normalizeReflected(this,"tool-display",value),previous=this.toolDisplayValue;previous!==normalized&&(this.toolDisplayValue=normalized,this.requestUpdate("toolDisplay",previous))}connectedCallback(){super.connectedCallback(),this.errorAnnouncementSink?.element.ownerDocument!==this.ownerDocument&&(this.errorAnnouncementSink?.release(),this.errorAnnouncementSink=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}),this.hasUpdated&&(this.suppressNextErrorAnnouncement=!0,this.requestUpdate()))}disconnectedCallback(){super.disconnectedCallback(),this.errorAnnouncementSink?.release(),this.errorAnnouncementSink=void 0,this.suppressNextErrorAnnouncement=!0}get effectiveParts(){const seen=new Set;return this.parts.filter(part=>{const id=part?.id;return!isNonBlankIdentity(id)||seen.has(id)||part.type==="tool-call"&&!isRecord(part.invocation)||part.type==="citation"&&!isRecord(part.citation)||part.type==="attachment"&&!isRecord(part.document)?!1:(seen.add(id),!0)})}get effectiveMaxRenderedParts(){return finiteCount(this.maxRenderedParts,0)}get renderedParts(){const parts=this.effectiveParts,max=this.effectiveMaxRenderedParts;return max>0&&parts.length>max?parts.slice(-max):parts}willUpdate(changed){if(super.willUpdate(changed),!changed.has("parts")&&this.hasUpdated||(this.redactionByInvocation=this.projectRedactions(),!changed.has("parts")))return;const current=this.effectiveParts.filter(part=>part.type==="error");if(this.hasUpdated&&!this.suppressNextErrorAnnouncement)for(const part of current)this.knownErrorIds.has(part.id)||this.errorAnnouncementSink?.announce(part.message||this.localize("messagePartError"));this.knownErrorIds=new Set(current.map(part=>part.id))}projectRedactions(){const map=new Map,seen=new Set;for(const part of this.effectiveParts){if(part.type!=="tool-call")continue;const id=part.invocation.id;if(typeof id!="string"||seen.has(id))continue;seen.add(id);const paths=projectedRedactionFields(part.invocation.redactedFields)??TOO_MANY_REDACTION_PATHS;paths.length>0&&map.set(id,paths)}return map}redacted(part,invocationId,source){if(typeof invocationId!="string")return;const paths=this.redactionByInvocation.get(invocationId);if(!paths)return;const detail=redactToolDetail(source,paths,this.localize("envListValueHidden"),this.redactionMemo.get(part));return this.redactionMemo.set(part,detail),detail}updated(_changed){super.updated(_changed),this.suppressNextErrorAnnouncement=!1}selectCitation(event,part){event.stopPropagation(),this.emit("lr-citation-select",{citation:part.citation})}partNames(part){const parts=["part"];switch(part.type){case"text":parts.push("text");break;case"reasoning":parts.push("reasoning");break;case"tool-call":parts.push("tool-call");break;case"tool-result":parts.push("tool-result");break;case"citation":parts.push("citation");break;case"attachment":parts.push("attachment");break;case"data":parts.push("data");break;case"audio":parts.push("audio");break;case"error":parts.push("error");break}return part.state==="streaming"&&parts.push("part-streaming"),parts.join(" ")}renderToolBlock(part,paired){const invocation=part.invocation,result=paired?paired.result:invocation.result,error=paired&&"error"in paired?paired.error:invocation.error,redactedFields=this.redactionByInvocation.get(invocation.id)??EMPTY_REDACTED_FIELDS;return html`<lr-tool-call-block
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{isToolCallStatus}from"../../agent-tools/tool-status.js";import{projectedRedactionFields,redactToolDetail,TOO_MANY_REDACTION_PATHS}from"../../agent-tools/tool-redaction.js";import{literalSetConverter,trueDefaultBooleanConverter}from"../../../internal/converters.js";import{finiteCount}from"../../../internal/numbers.js";import{LyraElement}from"../../../internal/lyra-element.js";import{safeMediaSrc}from"../../../internal/safe-url.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{isNonBlankIdentity,isRecord}from"../../retrieval/retrieval-identity.js";import{warnDeprecatedUsage}from"../../../internal/dev-mode-attribute-warning.js";import{styles}from"./message-parts.styles.js";import{LYRA_DEFAULT_envListValueHidden,LYRA_DEFAULT_messagePartError,LYRA_DEFAULT_messagePartRetry,LYRA_DEFAULT_messagePartsLabel,LYRA_DEFAULT_retry,LYRA_DEFAULT_thinkingPanelLabel}from"../../../internal/default-strings.generated.js";const MESSAGE_PARTS_CONTENT_MODES=Object.freeze(["plain","markdown"]),MESSAGE_PARTS_TOOL_DISPLAY=literalSetConverter(["chip","block"],"chip"),EMPTY_REDACTED_FIELDS=Object.freeze([]),TOOL_BLOCK_EXPORTPARTS="header:tool-block-header, body:tool-block-body, args:tool-block-args, result:tool-block-result, error:tool-block-error";function resolveBlockStatus(invocation,result){const status=isToolCallStatus(invocation.status)?invocation.status:"pending";return status==="denied"||status==="incomplete"?status:status==="error"||result&&"error"in result?"error":result&&result.state==="streaming"?"running":result?"success":status}function invocationDuration(invocation){if(invocation.startedAt==null||invocation.endedAt==null)return;const diff=invocation.endedAt-invocation.startedAt;return Number.isFinite(diff)?diff:void 0}function invocationDisplayName(invocation){return typeof invocation.displayName=="string"?invocation.displayName:void 0}function normalizeMessagePartsContentMode(value){return typeof value=="string"&&MESSAGE_PARTS_CONTENT_MODES.includes(value)?value:"markdown"}class LyraMessageParts extends LyraElement{constructor(){super(...arguments),this.parts=[],this.contentModeValue="markdown",this.toolDisplayValue="chip",this.showReasoning=!0,this.streamingRender="plain",this.codeBlockHeader=!1,this.codeBlockChrome=!1,this.maxRenderedParts=0,this.accessibleLabel=null,this.knownErrorIds=new Set,this.redactionByInvocation=new Map,this.redactionMemo=new WeakMap,this.suppressNextErrorAnnouncement=!0}static{this.defaultStrings={...super.defaultStrings,envListValueHidden:LYRA_DEFAULT_envListValueHidden,messagePartError:LYRA_DEFAULT_messagePartError,messagePartRetry:LYRA_DEFAULT_messagePartRetry,messagePartsLabel:LYRA_DEFAULT_messagePartsLabel,retry:LYRA_DEFAULT_retry,thinkingPanelLabel:LYRA_DEFAULT_thinkingPanelLabel}}static{this.ownedCollectionProperties=Object.freeze(["parts"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-citation-select","lr-part-retry"])}get contentMode(){return this.contentModeValue}set contentMode(value){const previous=this.contentModeValue,normalized=normalizeMessagePartsContentMode(value);this.contentModeValue=normalized,typeof value=="string"&&value!==normalized&&this.getAttribute("content-mode")!==normalized&&this.setAttribute("content-mode",normalized),this.requestUpdate("contentMode",previous,{reflect:!0,hasChanged:()=>!0})}get toolDisplay(){return this.toolDisplayValue}set toolDisplay(value){const normalized=MESSAGE_PARTS_TOOL_DISPLAY.normalizeReflected(this,"tool-display",value),previous=this.toolDisplayValue;previous!==normalized&&(this.toolDisplayValue=normalized,this.requestUpdate("toolDisplay",previous))}connectedCallback(){super.connectedCallback(),this.errorAnnouncementSink?.element.ownerDocument!==this.ownerDocument&&(this.errorAnnouncementSink?.release(),this.errorAnnouncementSink=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}),this.hasUpdated&&(this.suppressNextErrorAnnouncement=!0,this.requestUpdate()))}disconnectedCallback(){super.disconnectedCallback(),this.errorAnnouncementSink?.release(),this.errorAnnouncementSink=void 0,this.suppressNextErrorAnnouncement=!0}get effectiveParts(){const seen=new Set;return this.parts.filter(part=>{const id=part?.id;return!isNonBlankIdentity(id)||seen.has(id)||part.type==="tool-call"&&!isRecord(part.invocation)||part.type==="citation"&&!isRecord(part.citation)||part.type==="attachment"&&!isRecord(part.document)?!1:(seen.add(id),!0)})}get effectiveMaxRenderedParts(){return finiteCount(this.maxRenderedParts,0)}get renderedParts(){const parts=this.effectiveParts,max=this.effectiveMaxRenderedParts;return max>0&&parts.length>max?parts.slice(-max):parts}willUpdate(changed){if(super.willUpdate(changed),changed.has("codeBlockChrome")&&this.codeBlockChrome===!0&&warnDeprecatedUsage(this,"property","codeBlockChrome","code-block-header"),!changed.has("parts")&&this.hasUpdated||(this.redactionByInvocation=this.projectRedactions(),!changed.has("parts")))return;const current=this.effectiveParts.filter(part=>part.type==="error");if(this.hasUpdated&&!this.suppressNextErrorAnnouncement)for(const part of current)this.knownErrorIds.has(part.id)||this.errorAnnouncementSink?.announce(part.message||this.localize("messagePartError"));this.knownErrorIds=new Set(current.map(part=>part.id))}projectRedactions(){const map=new Map,seen=new Set;for(const part of this.effectiveParts){if(part.type!=="tool-call")continue;const id=part.invocation.id;if(typeof id!="string"||seen.has(id))continue;seen.add(id);const paths=projectedRedactionFields(part.invocation.redactedFields)??TOO_MANY_REDACTION_PATHS;paths.length>0&&map.set(id,paths)}return map}redacted(part,invocationId,source){if(typeof invocationId!="string")return;const paths=this.redactionByInvocation.get(invocationId);if(!paths)return;const detail=redactToolDetail(source,paths,this.localize("envListValueHidden"),this.redactionMemo.get(part));return this.redactionMemo.set(part,detail),detail}updated(_changed){super.updated(_changed),this.suppressNextErrorAnnouncement=!1}selectCitation(event,part){event.stopPropagation(),this.emit("lr-citation-select",{citation:part.citation})}partNames(part){const parts=["part"];switch(part.type){case"text":parts.push("text");break;case"reasoning":parts.push("reasoning");break;case"tool-call":parts.push("tool-call");break;case"tool-result":parts.push("tool-result");break;case"citation":parts.push("citation");break;case"attachment":parts.push("attachment");break;case"data":parts.push("data");break;case"audio":parts.push("audio");break;case"error":parts.push("error");break}return part.state==="streaming"&&parts.push("part-streaming"),parts.join(" ")}renderToolBlock(part,paired){const invocation=part.invocation,result=paired?paired.result:invocation.result,error=paired&&"error"in paired?paired.error:invocation.error,redactedFields=this.redactionByInvocation.get(invocation.id)??EMPTY_REDACTED_FIELDS;return html`<lr-tool-call-block
2
2
  .name=${invocation.name}
3
+ .displayName=${invocationDisplayName(invocation)}
3
4
  .callId=${invocation.id}
4
5
  .args=${invocation.args}
5
6
  status=${resolveBlockStatus(invocation,paired)}
@@ -9,8 +10,8 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
9
10
  .redactedFields=${redactedFields}
10
11
  exportparts=${TOOL_BLOCK_EXPORTPARTS}
11
12
  ></lr-tool-call-block>`}pairTools(parts,custom){const calls=new Map;for(const part of parts){if(part.type!=="tool-call"||custom.has(part.id))continue;const id=part.invocation.id;isNonBlankIdentity(id)&&!calls.has(id)&&calls.set(id,part.id)}const results=new Map,folded=new Set;for(const part of parts){if(part.type!=="tool-result"||custom.has(part.id))continue;const id=part.invocationId;if(!isNonBlankIdentity(id))continue;const callPartId=calls.get(id);callPartId===void 0||results.has(callPartId)||(results.set(callPartId,part),folded.add(part.id))}return{custom,results,folded}}renderPartMarkdown(part){return html`<lr-markdown .content=${part.text} .streaming=${part.state==="streaming"}
12
- .streamingRender=${this.streamingRender} .codeBlockHeader=${this.codeBlockHeader}
13
- .codeBlockChrome=${this.codeBlockChrome}></lr-markdown>`}renderBuiltin(part,citationRank,pairing){switch(part.type){case"text":return this.contentMode==="markdown"?this.renderPartMarkdown(part):part.text;case"reasoning":return html`<lr-thinking-panel
13
+ .streamingRender=${this.streamingRender}
14
+ .codeBlockHeader=${this.codeBlockHeader||this.codeBlockChrome}></lr-markdown>`}renderBuiltin(part,citationRank,pairing){switch(part.type){case"text":return this.contentMode==="markdown"?this.renderPartMarkdown(part):part.text;case"reasoning":return html`<lr-thinking-panel
14
15
  .label=${this.localize("thinkingPanelLabel")}
15
16
  .mode=${part.state==="streaming"?"live":"post-hoc"}
16
17
  ?expanded=${part.collapsed===!1}
@@ -18,6 +19,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
18
19
  >`;case"tool-call":{if(this.toolDisplay==="block")return this.renderToolBlock(part,pairing?.results.get(part.id));const masked=this.redacted(part,part.invocation.id,{args:void 0,result:void 0,error:part.invocation.error}),summary=masked?masked.error:part.invocation.error;return html`<lr-tool-call-chip
19
20
  .callId=${part.invocation.id}
20
21
  .name=${part.invocation.name}
22
+ .displayName=${invocationDisplayName(part.invocation)}
21
23
  .status=${part.invocation.status}
22
24
  .summary=${summary??""}
23
25
  ></lr-tool-call-chip>`}case"tool-result":{const hasError="error"in part,masked=this.redacted(part,part.invocationId,{args:void 0,result:part.result,error:hasError?part.error:void 0}),result=masked?masked.result:part.result;return hasError?html`<div part="tool-result-error">
@@ -38,8 +38,9 @@ import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';impo
38
38
  * @csspart action-copy - The copy action.
39
39
  * @cssprop [--lr-selection-toolbar-placement-gap=var(--lr-space-s)] - Non-negative distance
40
40
  * between the selection and toolbar, and between the toolbar and viewport during collision
41
- * avoidance. Unitless pixel values and `px`, `rem`, and `em` values are resolved live; invalid values
42
- * fall back to the default and negative values clamp to `0`.
41
+ * avoidance. Unitless pixels, `px`, `rem`, `em`, and CSS length math are resolved live;
42
+ * percentages have no placement basis. Invalid values fall back to the default and negative
43
+ * values clamp to `0`.
43
44
  * @cssprop [--lr-overlay-surface=var(--lr-color-surface-overlay)] - Shared floating-surface fill,
44
45
  * on the toolbar.
45
46
  * @cssprop [--lr-overlay-border=var(--lr-color-border-subtle)] - Shared floating-surface edge
@@ -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,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{acquireAnnouncementSink}from"../../../internal/announcer.js";import{styles}from"./selection-toolbar.styles.js";import{isLibraryPromotedAndShowing,needsTopLayerEscape,promoteToTopLayer,stripStaleTopLayer}from"../../../internal/top-layer-escape.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.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.sink??=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}),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(),this.sink?.release(),this.sink=void 0,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),this.open&&this.text&&this.escapeTrappingAncestor(),(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.sink?.announce(this.localize("copyFailed")),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?.()}escapeTrappingAncestor(){const toolbar=this.toolbar;!toolbar||isLibraryPromotedAndShowing(toolbar)||(needsTopLayerEscape(toolbar)?promoteToTopLayer(toolbar):stripStaleTopLayer(toolbar))}render(){if(!this.open||!this.text)return html`${nothing}`;const label=this.accessibleLabel??(this.label==null?this.localize("selectionToolbarLabel"):this.label);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{resolveCssTokenLength}from"../../../internal/css-token-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{acquireAnnouncementSink}from"../../../internal/announcer.js";import{styles}from"./selection-toolbar.styles.js";import{isLibraryPromotedAndShowing,needsTopLayerEscape,promoteToTopLayer,stripStaleTopLayer}from"../../../internal/top-layer-escape.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.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.sink??=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}),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(),this.sink?.release(),this.sink=void 0,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),this.open&&this.text&&this.escapeTrappingAncestor(),(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.sink?.announce(this.localize("copyFailed")),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=resolveCssTokenLength(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=resolveCssTokenLength(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?.()}escapeTrappingAncestor(){const toolbar=this.toolbar;!toolbar||isLibraryPromotedAndShowing(toolbar)||(needsTopLayerEscape(toolbar)?promoteToTopLayer(toolbar):stripStaleTopLayer(toolbar))}render(){if(!this.open||!this.text)return html`${nothing}`;const label=this.accessibleLabel??(this.label==null?this.localize("selectionToolbarLabel"):this.label);return html`<div
2
2
  part="toolbar"
3
3
  role="toolbar"
4
4
  aria-label=${label}
@@ -24,11 +24,7 @@ streaming:boolean;
24
24
  * fallback; `progressive` renders completed Markdown blocks while the final block is arriving.
25
25
  * Use with `content-mode="markdown"`: in `auto` mode the element switches from plain text to
26
26
  * Markdown when detection first succeeds, which replaces the displayed reply once, mid-stream. */
27
- streamingRender:MarkdownStreamingRender;
28
- /** Compatibility spelling for source-copy headers in the composed Markdown element. */
29
- codeBlockChrome:boolean;
30
- /** Enables source-copy headers in the composed Markdown element. */
31
- codeBlockHeader:boolean;
27
+ streamingRender:MarkdownStreamingRender;abstract codeBlockChrome:boolean;abstract codeBlockHeader:boolean;
32
28
  /** Trailing-edge coalesce window, in ms, for `content` updates -- see the
33
29
  * class doc. */
34
30
  coalesceMs:number;
@@ -1,3 +1,3 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{Announcer}from"../../../internal/announcer.js";import{finiteDuration}from"../../../internal/numbers.js";import{trueDefaultBooleanFromAttributeConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{styles}from"./streaming-text.styles.js";const DEFAULT_COALESCE_MS=50,APPEND_MONOTONIC_MARKDOWN_PATTERNS=[/^ {0,3}#{1,6}\s+\S/m,/```/,/\*\*[^*\n]+\*\*/,/`[^`\n]+`/,/^ {0,3}[-*+]\s+\S/m,/^ {0,3}\d+\.\s+\S/m,/\[[^\]]+\]\([^)\s]+\)/,/^ {0,3}>\s?\S/m],BOUNDARY_SENSITIVE_MARKDOWN_PATTERNS=[/(?:^|[^\w])_[^_\n]+_(?:[^\w]|$)/];function looksLikeMarkdown(text){return text?[...APPEND_MONOTONIC_MARKDOWN_PATTERNS,...BOUNDARY_SENSITIVE_MARKDOWN_PATTERNS].some(pattern=>pattern.test(text)):!1}class StreamingTextRuntimeBase extends LyraElement{static{this.styles=[LyraElement.styles,styles]}get safeCoalesceMs(){return finiteDuration(this.coalesceMs,DEFAULT_COALESCE_MS,0)}constructor(){super(),this.content="",this.streaming=!1,this.streamingRender="plain",this.codeBlockChrome=!1,this.codeBlockHeader=!1,this.coalesceMs=DEFAULT_COALESCE_MS,this.contentMode="auto",this.tabSize=4,this.htmlMode="sanitize",this.gfm=!0,this.linkTarget="_blank",this.internalLinkPrefix="",this.headingOffset=0,this.highlightCode=!0,this.headingAnchors=!1,this.math=!1,this.maxHeight="",this.displayedContent="",this.lastScannedResult=!1,this.lastMonotonicResult=!1,this.coalescer=new Announcer({throttleMs:this.safeCoalesceMs,onFlush:text=>{this.displayedContent=text}})}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.coalescer.setTimerHost(ownerWindow),this.hasUpdated&&this.displayedContent!==this.content&&this.coalescer.announce(this.content,{force:!0})}willUpdate(changed){if(super.willUpdate(changed),changed.has("coalesceMs")&&(this.coalescer.throttleMs=this.safeCoalesceMs),changed.has("content")&&this.coalescer.announce(this.content,{force:!this.hasUpdated}),changed.has("streaming")&&changed.get("streaming")!==void 0&&changed.get("streaming")!==this.streaming&&this.coalescer.announce(this.content,{force:!0}),changed.has("displayedContent")&&this.displayedContent!==this.lastScannedContent){const previous=this.lastScannedContent;this.lastScannedContent=this.displayedContent,previous!==void 0&&this.displayedContent.startsWith(previous)&&this.lastMonotonicResult||(this.lastMonotonicResult=APPEND_MONOTONIC_MARKDOWN_PATTERNS.some(pattern=>pattern.test(this.displayedContent)),this.lastScannedResult=this.lastMonotonicResult||BOUNDARY_SENSITIVE_MARKDOWN_PATTERNS.some(pattern=>pattern.test(this.displayedContent)))}}updated(changed){super.updated(changed),changed.has("displayedContent")&&!this.effectiveMarkdown&&this.emit("lr-content-settled",null)}disconnectedCallback(){super.disconnectedCallback(),this.coalescer.cancel()}adoptedCallback(){super.adoptedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.coalescer.setTimerHost(ownerWindow)}get effectiveMarkdown(){return this.contentMode==="markdown"?!0:this.contentMode==="plain"?!1:this.lastScannedResult}stopOwnedEvent(event){event.stopPropagation()}render(){const cursor=this.streaming?html`<span part="cursor" aria-hidden="true"></span>`:nothing;return html`<div part="base"
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{Announcer}from"../../../internal/announcer.js";import{finiteDuration}from"../../../internal/numbers.js";import{warnDeprecatedUsage}from"../../../internal/dev-mode-attribute-warning.js";import{trueDefaultBooleanFromAttributeConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{styles}from"./streaming-text.styles.js";const DEFAULT_COALESCE_MS=50,APPEND_MONOTONIC_MARKDOWN_PATTERNS=[/^ {0,3}#{1,6}\s+\S/m,/```/,/\*\*[^*\n]+\*\*/,/`[^`\n]+`/,/^ {0,3}[-*+]\s+\S/m,/^ {0,3}\d+\.\s+\S/m,/\[[^\]]+\]\([^)\s]+\)/,/^ {0,3}>\s?\S/m],BOUNDARY_SENSITIVE_MARKDOWN_PATTERNS=[/(?:^|[^\w])_[^_\n]+_(?:[^\w]|$)/];function looksLikeMarkdown(text){return text?[...APPEND_MONOTONIC_MARKDOWN_PATTERNS,...BOUNDARY_SENSITIVE_MARKDOWN_PATTERNS].some(pattern=>pattern.test(text)):!1}class StreamingTextRuntimeBase extends LyraElement{static{this.styles=[LyraElement.styles,styles]}get safeCoalesceMs(){return finiteDuration(this.coalesceMs,DEFAULT_COALESCE_MS,0)}constructor(){super(),this.content="",this.streaming=!1,this.streamingRender="plain",this.coalesceMs=DEFAULT_COALESCE_MS,this.contentMode="auto",this.tabSize=4,this.htmlMode="sanitize",this.gfm=!0,this.linkTarget="_blank",this.internalLinkPrefix="",this.headingOffset=0,this.highlightCode=!0,this.headingAnchors=!1,this.math=!1,this.maxHeight="",this.displayedContent="",this.lastScannedResult=!1,this.lastMonotonicResult=!1,this.coalescer=new Announcer({throttleMs:this.safeCoalesceMs,onFlush:text=>{this.displayedContent=text}})}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.coalescer.setTimerHost(ownerWindow),this.hasUpdated&&this.displayedContent!==this.content&&this.coalescer.announce(this.content,{force:!0})}willUpdate(changed){if(super.willUpdate(changed),changed.has("codeBlockChrome")&&this.codeBlockChrome===!0&&warnDeprecatedUsage(this,"property","codeBlockChrome","code-block-header"),changed.has("coalesceMs")&&(this.coalescer.throttleMs=this.safeCoalesceMs),changed.has("content")&&this.coalescer.announce(this.content,{force:!this.hasUpdated}),changed.has("streaming")&&changed.get("streaming")!==void 0&&changed.get("streaming")!==this.streaming&&this.coalescer.announce(this.content,{force:!0}),changed.has("displayedContent")&&this.displayedContent!==this.lastScannedContent){const previous=this.lastScannedContent;this.lastScannedContent=this.displayedContent,previous!==void 0&&this.displayedContent.startsWith(previous)&&this.lastMonotonicResult||(this.lastMonotonicResult=APPEND_MONOTONIC_MARKDOWN_PATTERNS.some(pattern=>pattern.test(this.displayedContent)),this.lastScannedResult=this.lastMonotonicResult||BOUNDARY_SENSITIVE_MARKDOWN_PATTERNS.some(pattern=>pattern.test(this.displayedContent)))}}updated(changed){super.updated(changed),changed.has("displayedContent")&&!this.effectiveMarkdown&&this.emit("lr-content-settled",null)}disconnectedCallback(){super.disconnectedCallback(),this.coalescer.cancel()}adoptedCallback(){super.adoptedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.coalescer.setTimerHost(ownerWindow)}get effectiveMarkdown(){return this.contentMode==="markdown"?!0:this.contentMode==="plain"?!1:this.lastScannedResult}stopOwnedEvent(event){event.stopPropagation()}render(){const cursor=this.streaming?html`<span part="cursor" aria-hidden="true"></span>`:nothing;return html`<div part="base"
2
2
  >${this.effectiveMarkdown?html`${this.renderMarkdown()}${cursor}`:html`<span class="plain">${this.displayedContent}</span> ${cursor}`}</div
3
- >`}}__decorate([property()],StreamingTextRuntimeBase.prototype,"content",void 0),__decorate([property({type:Boolean,reflect:!0})],StreamingTextRuntimeBase.prototype,"streaming",void 0),__decorate([property({attribute:"streaming-render"})],StreamingTextRuntimeBase.prototype,"streamingRender",void 0),__decorate([property({type:Boolean,attribute:"code-block-chrome"})],StreamingTextRuntimeBase.prototype,"codeBlockChrome",void 0),__decorate([property({type:Boolean,attribute:"code-block-header"})],StreamingTextRuntimeBase.prototype,"codeBlockHeader",void 0),__decorate([property({type:Number,attribute:"coalesce-ms"})],StreamingTextRuntimeBase.prototype,"coalesceMs",void 0),__decorate([property({reflect:!0,attribute:"content-mode"})],StreamingTextRuntimeBase.prototype,"contentMode",void 0),__decorate([property({attribute:!1})],StreamingTextRuntimeBase.prototype,"languages",void 0),__decorate([property({type:Number,attribute:"tab-size"})],StreamingTextRuntimeBase.prototype,"tabSize",void 0),__decorate([property({attribute:"html-mode"})],StreamingTextRuntimeBase.prototype,"htmlMode",void 0),__decorate([property({converter:trueDefaultBooleanConverter})],StreamingTextRuntimeBase.prototype,"gfm",void 0),__decorate([property({attribute:"link-target"})],StreamingTextRuntimeBase.prototype,"linkTarget",void 0),__decorate([property({attribute:"internal-link-prefix"})],StreamingTextRuntimeBase.prototype,"internalLinkPrefix",void 0),__decorate([property({type:Number,attribute:"heading-offset"})],StreamingTextRuntimeBase.prototype,"headingOffset",void 0),__decorate([property({attribute:"highlight-code",converter:trueDefaultBooleanConverter})],StreamingTextRuntimeBase.prototype,"highlightCode",void 0),__decorate([property({type:Boolean,attribute:"heading-anchors"})],StreamingTextRuntimeBase.prototype,"headingAnchors",void 0),__decorate([property({type:Boolean})],StreamingTextRuntimeBase.prototype,"math",void 0),__decorate([property({attribute:"max-height"})],StreamingTextRuntimeBase.prototype,"maxHeight",void 0),__decorate([state()],StreamingTextRuntimeBase.prototype,"displayedContent",void 0);export{StreamingTextRuntimeBase,looksLikeMarkdown};
3
+ >`}}__decorate([property()],StreamingTextRuntimeBase.prototype,"content",void 0),__decorate([property({type:Boolean,reflect:!0})],StreamingTextRuntimeBase.prototype,"streaming",void 0),__decorate([property({attribute:"streaming-render"})],StreamingTextRuntimeBase.prototype,"streamingRender",void 0),__decorate([property({type:Number,attribute:"coalesce-ms"})],StreamingTextRuntimeBase.prototype,"coalesceMs",void 0),__decorate([property({reflect:!0,attribute:"content-mode"})],StreamingTextRuntimeBase.prototype,"contentMode",void 0),__decorate([property({attribute:!1})],StreamingTextRuntimeBase.prototype,"languages",void 0),__decorate([property({type:Number,attribute:"tab-size"})],StreamingTextRuntimeBase.prototype,"tabSize",void 0),__decorate([property({attribute:"html-mode"})],StreamingTextRuntimeBase.prototype,"htmlMode",void 0),__decorate([property({converter:trueDefaultBooleanConverter})],StreamingTextRuntimeBase.prototype,"gfm",void 0),__decorate([property({attribute:"link-target"})],StreamingTextRuntimeBase.prototype,"linkTarget",void 0),__decorate([property({attribute:"internal-link-prefix"})],StreamingTextRuntimeBase.prototype,"internalLinkPrefix",void 0),__decorate([property({type:Number,attribute:"heading-offset"})],StreamingTextRuntimeBase.prototype,"headingOffset",void 0),__decorate([property({attribute:"highlight-code",converter:trueDefaultBooleanConverter})],StreamingTextRuntimeBase.prototype,"highlightCode",void 0),__decorate([property({type:Boolean,attribute:"heading-anchors"})],StreamingTextRuntimeBase.prototype,"headingAnchors",void 0),__decorate([property({type:Boolean})],StreamingTextRuntimeBase.prototype,"math",void 0),__decorate([property({attribute:"max-height"})],StreamingTextRuntimeBase.prototype,"maxHeight",void 0),__decorate([state()],StreamingTextRuntimeBase.prototype,"displayedContent",void 0);export{StreamingTextRuntimeBase,looksLikeMarkdown};
@@ -69,4 +69,10 @@ export interface LyraStreamingTextCoreEventMap extends StreamingTextRuntimeEvent
69
69
  * @status experimental
70
70
  * @since 16.0.0
71
71
  */
72
- export declare class LyraStreamingTextCore extends StreamingTextRuntimeBase{protected renderMarkdown():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-streaming-text-core':LyraStreamingTextCore;}}
72
+ export declare class LyraStreamingTextCore extends StreamingTextRuntimeBase{
73
+ /** Enables source-copy headers in the composed `<lr-markdown-core>`. */
74
+ codeBlockHeader:boolean;
75
+ /** Deprecated compatibility spelling of `code-block-header`: either property enables the headers.
76
+ * Setting it logs a one-time development warning.
77
+ * @deprecated Use `code-block-header` (`codeBlockHeader`); removal not before 23.0.0. */
78
+ codeBlockChrome:boolean;protected renderMarkdown():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-streaming-text-core':LyraStreamingTextCore;}}
@@ -1,10 +1,9 @@
1
- import{html}from"lit";import{StreamingTextRuntimeBase}from"./streaming-text-base.class.js";import{looksLikeMarkdown}from"./streaming-text-base.class.js";class LyraStreamingTextCore extends StreamingTextRuntimeBase{renderMarkdown(){return html`<lr-markdown-core
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html}from"lit";import{property}from"lit/decorators.js";import{StreamingTextRuntimeBase}from"./streaming-text-base.class.js";import{looksLikeMarkdown}from"./streaming-text-base.class.js";class LyraStreamingTextCore extends StreamingTextRuntimeBase{constructor(){super(...arguments),this.codeBlockHeader=!1,this.codeBlockChrome=!1}renderMarkdown(){return html`<lr-markdown-core
2
2
  exportparts="content, heading, paragraph, list, code-block, code-block-header, code-block-language, code-block-copy, inline-code, link, table, blockquote, img, math, task-list, task-item, task-item-checked, task-checkbox, table-wrapper, code-block-frame, code-block-copy-success, code-block-copy-error, streaming-tail"
3
3
  .content=${this.displayedContent}
4
4
  .streaming=${this.streaming}
5
5
  .streamingRender=${this.streamingRender}
6
- .codeBlockChrome=${this.codeBlockChrome}
7
- .codeBlockHeader=${this.codeBlockHeader}
6
+ .codeBlockHeader=${this.codeBlockHeader||this.codeBlockChrome}
8
7
  .languages=${this.languages??{}}
9
8
  .tabSize=${this.tabSize}
10
9
  .htmlMode=${this.htmlMode}
@@ -21,4 +20,4 @@ import{html}from"lit";import{StreamingTextRuntimeBase}from"./streaming-text-base
21
20
  @lr-highlight-activate=${this.stopOwnedEvent}
22
21
  @lr-text-select=${this.stopOwnedEvent}
23
22
  @lr-anchor-result=${this.stopOwnedEvent}
24
- ></lr-markdown-core>`}}export{LyraStreamingTextCore,looksLikeMarkdown};
23
+ ></lr-markdown-core>`}}__decorate([property({type:Boolean,attribute:"code-block-header"})],LyraStreamingTextCore.prototype,"codeBlockHeader",void 0),__decorate([property({type:Boolean,attribute:"code-block-chrome"})],LyraStreamingTextCore.prototype,"codeBlockChrome",void 0);export{LyraStreamingTextCore,looksLikeMarkdown};
@@ -136,4 +136,10 @@ import{type TemplateResult}from'lit';import{StreamingTextRuntimeBase}from'./stre
136
136
  * @status stable
137
137
  * @since 4.0.0
138
138
  */
139
- export declare class LyraStreamingText extends StreamingTextRuntimeBase{protected renderMarkdown():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-streaming-text':LyraStreamingText;}}
139
+ export declare class LyraStreamingText extends StreamingTextRuntimeBase{
140
+ /** Enables source-copy headers in the composed `<lr-markdown>`. */
141
+ codeBlockHeader:boolean;
142
+ /** Deprecated compatibility spelling of `code-block-header`: either property enables the headers.
143
+ * Setting it logs a one-time development warning.
144
+ * @deprecated Use `code-block-header` (`codeBlockHeader`); removal not before 23.0.0. */
145
+ codeBlockChrome:boolean;protected renderMarkdown():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-streaming-text':LyraStreamingText;}}
@@ -1,10 +1,9 @@
1
- import{html}from"lit";import{StreamingTextRuntimeBase}from"./streaming-text-base.class.js";import{looksLikeMarkdown}from"./streaming-text-base.class.js";class LyraStreamingText extends StreamingTextRuntimeBase{renderMarkdown(){return html`<lr-markdown
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html}from"lit";import{property}from"lit/decorators.js";import{StreamingTextRuntimeBase}from"./streaming-text-base.class.js";import{looksLikeMarkdown}from"./streaming-text-base.class.js";class LyraStreamingText extends StreamingTextRuntimeBase{constructor(){super(...arguments),this.codeBlockHeader=!1,this.codeBlockChrome=!1}renderMarkdown(){return html`<lr-markdown
2
2
  exportparts="content, heading, paragraph, list, code-block, code-block-header, code-block-language, code-block-copy, inline-code, link, table, blockquote, img, math, task-list, task-item, task-item-checked, task-checkbox, table-wrapper, code-block-frame, code-block-copy-success, code-block-copy-error, streaming-tail"
3
3
  .content=${this.displayedContent}
4
4
  .streaming=${this.streaming}
5
5
  .streamingRender=${this.streamingRender}
6
- .codeBlockChrome=${this.codeBlockChrome}
7
- .codeBlockHeader=${this.codeBlockHeader}
6
+ .codeBlockHeader=${this.codeBlockHeader||this.codeBlockChrome}
8
7
  .languages=${this.languages}
9
8
  .tabSize=${this.tabSize}
10
9
  .htmlMode=${this.htmlMode}
@@ -21,4 +20,4 @@ import{html}from"lit";import{StreamingTextRuntimeBase}from"./streaming-text-base
21
20
  @lr-highlight-activate=${this.stopOwnedEvent}
22
21
  @lr-text-select=${this.stopOwnedEvent}
23
22
  @lr-anchor-result=${this.stopOwnedEvent}
24
- ></lr-markdown>`}}export{LyraStreamingText,looksLikeMarkdown};
23
+ ></lr-markdown>`}}__decorate([property({type:Boolean,attribute:"code-block-header"})],LyraStreamingText.prototype,"codeBlockHeader",void 0),__decorate([property({type:Boolean,attribute:"code-block-chrome"})],LyraStreamingText.prototype,"codeBlockChrome",void 0);export{LyraStreamingText,looksLikeMarkdown};
@@ -123,6 +123,13 @@ export interface ThreadGroupToggleDetail{groupId:string;collapsed:boolean;}expor
123
123
  * above wrap this component's own callback output and are a different surface. Styling row
124
124
  * density here replaces the older `::part(row) { --lr-theme-*: … }` workaround, which retheme'd
125
125
  * the whole row subtree (`renderActions` popups included).
126
+ * @csspart row-item-base-menu-open - Data mode: state alias on `row-item-base` while a menu that
127
+ * `renderActions` opened from that row is open (the row item's own `base-menu-open`). Key a
128
+ * hover- or focus-revealed row-menu trigger on it as well as on `:hover`/`:focus-within`, e.g.
129
+ * `::part(row-item-base-menu-open) { --app-row-actions-opacity: 1; }` read by
130
+ * `::part(row-actions)`: the open menu sits in the browser top layer, where Chromium and WebKit
131
+ * stop matching `:hover` and `:focus-within` on the row while the pointer or focus is inside it.
132
+ * The row also keeps its built-in hover tint while the menu is open.
126
133
  * @csspart row-item-active-indicator - Data mode: the row item's decorative active indicator,
127
134
  * exported from `lr-conversation-item`.
128
135
  * @csspart row-item-select-button - Data mode: the row item's selectable button-like region.
@@ -240,8 +247,12 @@ rowActions:readonly ThreadRowAction[];
240
247
  * default to the `fixed` strategy inside the virtual row and open at full size outside the list
241
248
  * (in the browser top layer where the native Popover API exists), in both directions; a
242
249
  * promoted menu whose trigger scrolls out of the list is hidden until the trigger returns. An
243
- * explicit `positioning-strategy="absolute"` keeps a menu inside the row. Unset (the default)
244
- * leaves `rowActions`' output byte-for-byte unchanged. */
250
+ * explicit `positioning-strategy="absolute"` keeps a menu inside the row. While such a menu is
251
+ * open its row carries `row-item-base-menu-open`, so a trigger revealed on row hover or focus
252
+ * can stay revealed while the pointer or focus is inside the top-layer menu. Arrow, Home and End
253
+ * keys a returned control already handled (`preventDefault()`, as `lr-menu` does) stay with that
254
+ * control instead of also moving between rows. Unset (the default) leaves `rowActions`' output
255
+ * byte-for-byte unchanged. */
245
256
  renderActions?:(thread:LyraChatThread)=>TemplateResult;
246
257
  /** Data mode only: renders non-interactive content in the row's start slot, before its label
247
258
  * and excerpt. The callback runs during the virtualized row render. */
@@ -17,9 +17,9 @@ 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)}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.error=!1,this.errorDescription="",this.stickyGroupItems=new Map,this.searchText="",this.hasEmptySlot=!1,this.hasDefaultSlotContent=!1,this.focusTaskGeneration=0,this.injectedListItemRoles=new Set,this.onSearchInput=e=>{e.stopPropagation(),this.setSearchText(e.target.value)},this.onClearSearch=()=>{this.searchText!==""&&(this.setSearchText(""),this.searchInputEl?.focus())},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`
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.error=!1,this.errorDescription="",this.stickyGroupItems=new Map,this.searchText="",this.hasEmptySlot=!1,this.hasDefaultSlotContent=!1,this.focusTaskGeneration=0,this.injectedListItemRoles=new Set,this.onSearchInput=e=>{e.stopPropagation(),this.setSearchText(e.target.value)},this.onClearSearch=()=>{this.searchText!==""&&(this.setSearchText(""),this.searchInputEl?.focus())},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"||e.defaultPrevented)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
- 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"
22
+ exportparts="base:row-item-base, base-menu-open:row-item-base-menu-open, 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??""}
@@ -144,7 +144,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
144
144
  ${this.error?renderDataState(this,{loading:!1,error:!0,empty:!1,errorHeading:this.errorHeading,errorDescription:this.errorDescription,onRetry:this.onErrorRetry,emitRetry:(detail,init)=>this.emit("lr-retry",detail,init)},"error","lr-retry"):showEmpty?html`<div part="empty">
145
145
  ${this.searchText.trim()?this.localize("noMatches"):this.localize("threadListEmpty")}
146
146
  </div>`:html`<lr-virtual-list
147
- exportparts="base:viewport, sticky-group:group-sticky, row:row, row-wrapper:row-wrapper, group-header:group-header, group-toggle:group-toggle, group-label:group-label, group-adornment:group-adornment, group-icon:group-icon, row-start:row-start, row-excerpt:row-excerpt, row-content:row-content, row-meta:row-meta, row-actions:row-actions, row-action:row-action, pin-glyph:pin-glyph, row-item-base:row-item-base, row-item-active-indicator:row-item-active-indicator, row-item-select-button:row-item-select-button, row-item-start:row-item-start, row-item-content:row-item-content, row-item-label:row-item-label, row-item-label-input:row-item-label-input, row-item-rename-button:row-item-rename-button, row-item-excerpt:row-item-excerpt, row-item-meta:row-item-meta, row-item-timestamp:row-item-timestamp, row-item-actions:row-item-actions"
147
+ exportparts="base:viewport, sticky-group:group-sticky, row:row, row-wrapper:row-wrapper, group-header:group-header, group-toggle:group-toggle, group-label:group-label, group-adornment:group-adornment, group-icon:group-icon, row-start:row-start, row-excerpt:row-excerpt, row-content:row-content, row-meta:row-meta, row-actions:row-actions, row-action:row-action, pin-glyph:pin-glyph, row-item-base:row-item-base, row-item-base-menu-open:row-item-base-menu-open, row-item-active-indicator:row-item-active-indicator, row-item-select-button:row-item-select-button, row-item-start:row-item-start, row-item-content:row-item-content, row-item-label:row-item-label, row-item-label-input:row-item-label-input, row-item-rename-button:row-item-rename-button, row-item-excerpt:row-item-excerpt, row-item-meta:row-item-meta, row-item-timestamp:row-item-timestamp, row-item-actions:row-item-actions"
148
148
  row-height="auto"
149
149
  .items=${items}
150
150
  .groups=${this.stickyGroups?this.stickyAnchors(items):void 0}