@aceshooting/lyra-ui 14.3.2 → 15.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/custom-elements.json +1 -1
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migration-contract.json +1 -1
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +4 -0
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +3 -3
  7. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +3 -2
  8. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +1 -1
  9. package/dist/components/agent-tools/commit-card/commit-card.styles.js +1 -1
  10. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +8 -3
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +3 -1
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +10 -1
  14. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +1 -1
  15. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
  16. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts +19 -1
  17. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +4 -4
  18. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  19. package/dist/components/agent-tools/task-list/task-list.class.d.ts +5 -0
  20. package/dist/components/agent-tools/task-list/task-list.class.js +3 -3
  21. package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -1
  22. package/dist/components/agent-tools/terminal/terminal.styles.js +1 -1
  23. package/dist/components/agent-tools/test-results/test-results.class.js +1 -1
  24. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +10 -7
  25. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +15 -14
  26. package/dist/components/agent-tools/tool-param-form/tool-param-form.d.ts +1 -1
  27. package/dist/components/agent-tools/tool-param-form/tool-param-form.js +1 -1
  28. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +1 -1
  29. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts +5 -2
  30. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +1 -1
  31. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +3 -1
  32. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +9 -1
  33. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +1 -1
  34. package/dist/components/charts/chart/box-plot.class.d.ts +64 -4
  35. package/dist/components/charts/chart/box-plot.class.js +5 -5
  36. package/dist/components/charts/chart/chart-colors.d.ts +10 -0
  37. package/dist/components/charts/chart/chart-colors.js +1 -1
  38. package/dist/components/charts/chart/chart.class.d.ts +35 -10
  39. package/dist/components/charts/chart/chart.class.js +4 -4
  40. package/dist/components/charts/chart/lite-chart.class.d.ts +10 -2
  41. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  42. package/dist/components/conversation/markdown/markdown.class.d.ts +9 -1
  43. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  44. package/dist/components/conversation/message-parts/message-parts.class.d.ts +18 -1
  45. package/dist/components/conversation/message-parts/message-parts.class.js +4 -4
  46. package/dist/components/conversation/model-select/model-select.class.d.ts +6 -2
  47. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  48. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  49. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +5 -1
  50. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  51. package/dist/components/data/calendar/calendar.class.js +2 -2
  52. package/dist/components/data/context-meter/context-meter.styles.js +1 -1
  53. package/dist/components/data/data-grid/data-grid-types.d.ts +8 -2
  54. package/dist/components/data/data-grid/data-grid.class.d.ts +16 -3
  55. package/dist/components/data/data-grid/data-grid.class.js +3 -2
  56. package/dist/components/data/env-list/env-list.styles.js +1 -1
  57. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +22 -2
  58. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  59. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +12 -4
  60. package/dist/components/data/flow-minimap/flow-minimap.class.js +2 -2
  61. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  62. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +5 -1
  63. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  64. package/dist/components/data/heatmap/heatmap.class.d.ts +12 -1
  65. package/dist/components/data/heatmap/heatmap.class.js +3 -3
  66. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  67. package/dist/components/forms/button/button.styles.js +1 -1
  68. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  69. package/dist/components/forms/combobox/combobox.class.js +1 -1
  70. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  71. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  72. package/dist/components/forms/date-picker/date-picker.class.d.ts +12 -1
  73. package/dist/components/forms/date-picker/date-picker.class.js +1 -1
  74. package/dist/components/forms/icon-button/icon-button.class.d.ts +27 -5
  75. package/dist/components/forms/icon-button/icon-button.class.js +7 -3
  76. package/dist/components/forms/input/input.styles.js +1 -1
  77. package/dist/components/forms/input/time-input.class.d.ts +13 -2
  78. package/dist/components/forms/input/time-input.class.js +1 -1
  79. package/dist/components/forms/otp-input/otp-input.class.d.ts +8 -1
  80. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  81. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +1 -1
  82. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
  83. package/dist/components/forms/select/select.class.d.ts +1 -1
  84. package/dist/components/forms/select/select.class.js +1 -1
  85. package/dist/components/forms/slider/slider.class.d.ts +4 -1
  86. package/dist/components/forms/slider/slider.class.js +1 -1
  87. package/dist/components/forms/textarea/textarea.class.d.ts +9 -4
  88. package/dist/components/forms/textarea/textarea.class.js +1 -1
  89. package/dist/components/forms/time-range/time-range.class.js +1 -1
  90. package/dist/components/layout/app-rail/app-rail.class.d.ts +7 -2
  91. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  92. package/dist/components/layout/card/card.class.js +2 -2
  93. package/dist/components/layout/card/card.styles.js +1 -1
  94. package/dist/components/layout/control-group/control-group.class.js +1 -1
  95. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +1 -1
  96. package/dist/components/layout/details/details.styles.js +1 -1
  97. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +13 -3
  98. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  99. package/dist/components/layout/menu/dropdown-item.class.d.ts +2 -0
  100. package/dist/components/layout/menu/menu-item.class.d.ts +28 -1
  101. package/dist/components/layout/menu/menu-item.class.js +45 -35
  102. package/dist/components/layout/menu/menu-item.styles.js +1 -1
  103. package/dist/components/layout/menu/menu.class.js +1 -1
  104. package/dist/components/layout/multi-split/multi-split.class.d.ts +12 -2
  105. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  106. package/dist/components/layout/page/page.class.js +2 -1
  107. package/dist/components/layout/page/page.styles.js +1 -1
  108. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +6 -4
  109. package/dist/components/layout/responsive-panel/responsive-panel.class.js +2 -2
  110. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +1 -1
  111. package/dist/components/layout/stepper/stepper.class.js +2 -2
  112. package/dist/components/layout/virtual-list/virtual-list.class.js +2 -2
  113. package/dist/components/layout/widget/widget.class.d.ts +12 -2
  114. package/dist/components/layout/widget/widget.class.js +2 -2
  115. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +1 -1
  116. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +3 -3
  117. package/dist/components/media/file-icon/file-icon.class.d.ts +3 -1
  118. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  119. package/dist/components/media/file-input/file-input.class.d.ts +1 -1
  120. package/dist/components/media/file-input/file-input.class.js +1 -1
  121. package/dist/components/media/flag/flag.styles.js +1 -1
  122. package/dist/components/media/image-comparer/image-comparer.class.d.ts +5 -5
  123. package/dist/components/media/image-comparer/image-comparer.class.js +1 -1
  124. package/dist/components/media/image-comparer/image-comparer.styles.js +1 -1
  125. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  126. package/dist/components/media/map/map.styles.js +1 -1
  127. package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
  128. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  129. package/dist/components/media/video-playlist/video-playlist.styles.js +1 -1
  130. package/dist/components/overlays/alert/alert.class.d.ts +6 -0
  131. package/dist/components/overlays/alert/alert.styles.js +1 -1
  132. package/dist/components/overlays/empty/empty.class.js +2 -2
  133. package/dist/components/overlays/kbd/kbd.styles.js +1 -1
  134. package/dist/components/overlays/progress/progress-ring.class.d.ts +4 -1
  135. package/dist/components/overlays/progress/progress.styles.js +1 -1
  136. package/dist/components/overlays/toast/toast.styles.js +1 -1
  137. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  138. package/dist/components/retrieval/graph/graph.class.d.ts +10 -3
  139. package/dist/components/retrieval/graph/graph.class.js +1 -1
  140. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  141. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +1 -1
  142. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +6 -6
  143. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +2 -2
  144. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  145. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -3
  146. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +3 -3
  147. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +7 -1
  148. package/dist/components/retrieval/node-palette/node-palette.class.js +23 -13
  149. package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
  150. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +4 -1
  151. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +1 -1
  152. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +1 -1
  153. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +4 -3
  154. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  155. package/dist/components/retrieval/source-list/source-list.class.d.ts +7 -1
  156. package/dist/components/retrieval/source-list/source-list.class.js +1 -1
  157. package/dist/components/utility/export-button/export-button.class.d.ts +14 -2
  158. package/dist/components/utility/export-button/export-button.class.js +3 -3
  159. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  160. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  161. package/dist/components/utility/known-date/known-date.class.js +1 -1
  162. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +4 -2
  163. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  164. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +9 -1
  165. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +4 -4
  166. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +1 -1
  167. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +4 -4
  168. package/dist/components/viewers/document-compare/document-compare.class.d.ts +5 -0
  169. package/dist/components/viewers/document-compare/document-compare.class.js +9 -4
  170. package/dist/components/viewers/document-compare/document-compare.styles.js +1 -1
  171. package/dist/components/viewers/document-preview/document-preview.class.d.ts +9 -1
  172. package/dist/components/viewers/document-preview/document-preview.class.js +2 -1
  173. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +5 -0
  174. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  175. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +5 -0
  176. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +1 -1
  177. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +3 -3
  178. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  179. package/dist/custom-elements-jsx.d.ts +1 -1
  180. package/dist/events.d.ts +5 -4
  181. package/dist/internal/package-metadata.d.ts +1 -1
  182. package/dist/internal/package-metadata.js +1 -1
  183. package/dist/lyra.d.ts +1 -1
  184. package/dist/svelte.d.ts +1 -1
  185. package/dist/vue.d.ts +1 -1
  186. package/llms/components/lr-alert.md +11 -3
  187. package/llms/components/lr-box-plot.md +21 -4
  188. package/llms/components/lr-chart.md +13 -4
  189. package/llms/components/lr-code-block.md +5 -4
  190. package/llms/components/lr-data-grid.md +24 -10
  191. package/llms/components/lr-document-compare.md +5 -0
  192. package/llms/components/lr-dropdown-item.md +24 -0
  193. package/llms/components/lr-eval-dataset.md +5 -4
  194. package/llms/components/lr-export-button.md +10 -5
  195. package/llms/components/lr-filter-bar.md +4 -1
  196. package/llms/components/lr-flow-minimap.md +7 -1
  197. package/llms/components/lr-icon-button.md +6 -1
  198. package/llms/components/lr-lite-chart.md +2 -1
  199. package/llms/components/lr-markdown.md +2 -2
  200. package/llms/components/lr-menu-item.md +24 -0
  201. package/llms/components/lr-menu.md +24 -0
  202. package/llms/components/lr-message-parts.md +7 -0
  203. package/llms/components/lr-model-settings-panel.md +4 -1
  204. package/llms/components/lr-node-palette.md +5 -4
  205. package/llms/components/lr-pdf-viewer.md +7 -0
  206. package/llms/components/lr-responsive-panel.md +2 -2
  207. package/llms/components/lr-subagent-panel.md +17 -2
  208. package/llms/components/lr-thinking-panel.md +4 -0
  209. package/llms/components/lr-timeline-item.md +1 -1
  210. package/llms/components/lr-timeline.md +1 -1
  211. package/llms/components/lr-tool-select-dialog.md +4 -3
  212. package/llms/components/lr-virtual-list.md +11 -11
  213. package/llms/peers.md +1 -1
  214. package/llms-full.txt +205 -59
  215. package/package.json +7 -7
  216. package/vscode-css-data.json +1 -1
  217. package/vscode-html-data.json +1 -1
  218. package/web-types.json +1 -1
@@ -84,6 +84,14 @@ export interface LyraMarkdownEventMap extends LyraAnchorTargetEventMap{'lr-rende
84
84
  * missing `katex` peer renders the literal, unparsed TeX source (delimiters included) and fires one
85
85
  * `lr-render-error`.
86
86
  *
87
+ * Migrating a `<wa-markdown><script type="text/markdown">...</script></wa-markdown>` usage: on
88
+ * connect, a direct `<script type="text/markdown">` child's text is read once and adopted as
89
+ * `content` (leading/trailing whitespace trimmed) -- but only while `content` has never been
90
+ * authored (no `content` attribute/property set, including an explicitly empty one). Setting
91
+ * `content` -- then or later -- always wins; the script child is not re-read after connect, so
92
+ * mutating its text in place has no effect. Prefer the reactive `content` property directly for
93
+ * anything that updates after first connect.
94
+ *
87
95
  * @customElement lr-markdown
88
96
  * @event lr-link-click - Fired (and the click prevented) when a rendered
89
97
  * link's `href` starts with `internal-link-prefix`. `detail: { href: string }`.
@@ -201,4 +209,4 @@ languages?:Readonly<Record<string,ShikiLanguageInput>>;
201
209
  headingAnchors:boolean;
202
210
  /** Renders `$...$`/`$$...$$` TeX via the optional `katex` peer, as MathML. `false` (the
203
211
  * default) renders `$...$` literally, unparsed -- today's exact output. */
204
- math:boolean;protected get markdownVariant():MarkdownVariantContext;protected tokenizePendingHighlight(pending:PendingHighlight,languages:Readonly<Record<string,ShikiLanguageInput>> |undefined,isCurrent:()=>boolean):Promise<MarkdownHighlightAttempt>;}declare global{interface HTMLElementTagNameMap{'lr-markdown':LyraMarkdown;}}
212
+ math:boolean;connectedCallback():void;private adoptScriptContent;protected get markdownVariant():MarkdownVariantContext;protected tokenizePendingHighlight(pending:PendingHighlight,languages:Readonly<Record<string,ShikiLanguageInput>> |undefined,isCurrent:()=>boolean):Promise<MarkdownHighlightAttempt>;}declare global{interface HTMLElementTagNameMap{'lr-markdown':LyraMarkdown;}}
@@ -1 +1 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{getMarkdownDepsIfLoaded}from"./markdown-loader.js";import{loadShikiHighlighter,loadShikiLanguage,loadShikiHighlighterCore,normalizeShikiLanguage}from"../code-block/code-loader.js";import{createMarkdownKatexState,tokenizeMarkdownHighlight}from"./markdown-shared.js";import{createMarkdownVariantContext,MarkdownRuntimeBase}from"./markdown-base.class.js";import{styles}from"./markdown.styles.js";import{trueDefaultBooleanFromAttributeConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound}from"../../../internal/default-strings.generated.js";const katexState=createMarkdownKatexState();class LyraMarkdown extends MarkdownRuntimeBase{constructor(){super(...arguments),this.content="",this.tabSize=4,this.htmlMode="sanitize",this.gfm=!0,this.linkTarget="_blank",this.internalLinkPrefix="",this.headingOffset=0,this.streaming=!1,this.highlightCode=!0,this.headingAnchors=!1,this.math=!1}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound}}static{this.styles=[LyraElement.styles,styles,srOnly]}static{this.variant=createMarkdownVariantContext("lr-markdown",katexState)}static getMarked(){const parser=this.variant.sharedParser.get(getMarkdownDepsIfLoaded()?.marked);if(!parser)throw new Error("LyraMarkdown.getMarked() requires the optional `marked` peer; await preloadMarkdown() first.");return parser}static updateAll(){for(const instance of this.variant.connectedInstances)instance.renderMarkdown()}get markdownVariant(){return LyraMarkdown.variant}async tokenizePendingHighlight(pending,languages,isCurrent){const normalizedLang=normalizeShikiLanguage(pending.lang);let highlighter;if(languages&&(languages[normalizedLang]??languages[pending.lang]))highlighter=await loadShikiHighlighterCore(languages);else{const base=await loadShikiHighlighter();if(!isCurrent())return;if(!base)return null;const loaded=await loadShikiLanguage(base,pending.lang);if(!isCurrent())return;highlighter=loaded?base:null}if(isCurrent())return highlighter?tokenizeMarkdownHighlight(highlighter,pending):null}}__decorate([property()],LyraMarkdown.prototype,"content",void 0),__decorate([property({type:Number,attribute:"tab-size"})],LyraMarkdown.prototype,"tabSize",void 0),__decorate([property({attribute:"html-mode"})],LyraMarkdown.prototype,"htmlMode",void 0),__decorate([property({converter:trueDefaultBooleanConverter})],LyraMarkdown.prototype,"gfm",void 0),__decorate([property({attribute:"link-target"})],LyraMarkdown.prototype,"linkTarget",void 0),__decorate([property({attribute:"internal-link-prefix"})],LyraMarkdown.prototype,"internalLinkPrefix",void 0),__decorate([property({type:Number,attribute:"heading-offset"})],LyraMarkdown.prototype,"headingOffset",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraMarkdown.prototype,"streaming",void 0),__decorate([property({attribute:"highlight-code",converter:trueDefaultBooleanConverter})],LyraMarkdown.prototype,"highlightCode",void 0),__decorate([property({attribute:!1})],LyraMarkdown.prototype,"languages",void 0),__decorate([property({type:Boolean,attribute:"heading-anchors"})],LyraMarkdown.prototype,"headingAnchors",void 0),__decorate([property({type:Boolean})],LyraMarkdown.prototype,"math",void 0);export{LyraMarkdown};
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{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{getMarkdownDepsIfLoaded}from"./markdown-loader.js";import{loadShikiHighlighter,loadShikiLanguage,loadShikiHighlighterCore,normalizeShikiLanguage}from"../code-block/code-loader.js";import{createMarkdownKatexState,tokenizeMarkdownHighlight}from"./markdown-shared.js";import{createMarkdownVariantContext,MarkdownRuntimeBase}from"./markdown-base.class.js";import{styles}from"./markdown.styles.js";import{trueDefaultBooleanFromAttributeConverter as trueDefaultBooleanConverter}from"../../../internal/converters.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound}from"../../../internal/default-strings.generated.js";const katexState=createMarkdownKatexState();class LyraMarkdown extends MarkdownRuntimeBase{constructor(){super(...arguments),this.content="",this.tabSize=4,this.htmlMode="sanitize",this.gfm=!0,this.linkTarget="_blank",this.internalLinkPrefix="",this.headingOffset=0,this.streaming=!1,this.highlightCode=!0,this.headingAnchors=!1,this.math=!1}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound}}static{this.styles=[LyraElement.styles,styles,srOnly]}static{this.variant=createMarkdownVariantContext("lr-markdown",katexState)}static getMarked(){const parser=this.variant.sharedParser.get(getMarkdownDepsIfLoaded()?.marked);if(!parser)throw new Error("LyraMarkdown.getMarked() requires the optional `marked` peer; await preloadMarkdown() first.");return parser}static updateAll(){for(const instance of this.variant.connectedInstances)instance.renderMarkdown()}connectedCallback(){this.adoptScriptContent(),super.connectedCallback()}adoptScriptContent(){if(this.hasAttribute("content")||this.content)return;const text=this.querySelector(':scope > script[type="text/markdown"]')?.textContent;text!=null&&(this.content=text.trim())}get markdownVariant(){return LyraMarkdown.variant}async tokenizePendingHighlight(pending,languages,isCurrent){const normalizedLang=normalizeShikiLanguage(pending.lang);let highlighter;if(languages&&(languages[normalizedLang]??languages[pending.lang]))highlighter=await loadShikiHighlighterCore(languages);else{const base=await loadShikiHighlighter();if(!isCurrent())return;if(!base)return null;const loaded=await loadShikiLanguage(base,pending.lang);if(!isCurrent())return;highlighter=loaded?base:null}if(isCurrent())return highlighter?tokenizeMarkdownHighlight(highlighter,pending):null}}__decorate([property()],LyraMarkdown.prototype,"content",void 0),__decorate([property({type:Number,attribute:"tab-size"})],LyraMarkdown.prototype,"tabSize",void 0),__decorate([property({attribute:"html-mode"})],LyraMarkdown.prototype,"htmlMode",void 0),__decorate([property({converter:trueDefaultBooleanConverter})],LyraMarkdown.prototype,"gfm",void 0),__decorate([property({attribute:"link-target"})],LyraMarkdown.prototype,"linkTarget",void 0),__decorate([property({attribute:"internal-link-prefix"})],LyraMarkdown.prototype,"internalLinkPrefix",void 0),__decorate([property({type:Number,attribute:"heading-offset"})],LyraMarkdown.prototype,"headingOffset",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraMarkdown.prototype,"streaming",void 0),__decorate([property({attribute:"highlight-code",converter:trueDefaultBooleanConverter})],LyraMarkdown.prototype,"highlightCode",void 0),__decorate([property({attribute:!1})],LyraMarkdown.prototype,"languages",void 0),__decorate([property({type:Boolean,attribute:"heading-anchors"})],LyraMarkdown.prototype,"headingAnchors",void 0),__decorate([property({type:Boolean})],LyraMarkdown.prototype,"math",void 0);export{LyraMarkdown};
@@ -71,5 +71,22 @@ get contentMode():MessagePartsContentMode;set contentMode(value:MessagePartsCont
71
71
  showReasoning:boolean;
72
72
  /** Optional host renderer. Returning `undefined` delegates to the built-in renderer. */
73
73
  renderPart?:MessagePartRenderer;
74
+ /** `0` (the default) renders every part -- unbounded, matching every prior release. A positive
75
+ * value windows rendering to the newest N parts (host `parts` data is untouched); citation
76
+ * ranks are still computed against the full sequence first, so a badge's number stays stable
77
+ * even once an earlier citation rolls out of the rendered window. Opt in for a message that can
78
+ * grow an unusually large number of parts (e.g. a long agentic run with many interleaved
79
+ * tool-call/tool-result parts), where unbounded live DOM can visibly stall the main thread. */
80
+ maxRenderedParts:number;
74
81
  /** Accessible name override for the internal message-part group. */
75
- accessibleLabel:string|null;private knownErrorIds;private errorAnnouncementSink?;private suppressNextErrorAnnouncement;connectedCallback():void;disconnectedCallback():void;private get effectiveParts();protected willUpdate(changed:PropertyValues<this>):void;protected updated(_changed:PropertyValues<this>):void;private selectCitation;private partNames;private renderBuiltin;private renderOne;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-parts':LyraMessageParts;}}
82
+ accessibleLabel:string|null;private knownErrorIds;private errorAnnouncementSink?;private suppressNextErrorAnnouncement;connectedCallback():void;disconnectedCallback():void;private get effectiveParts();
83
+ /** `maxRenderedParts`, normalized to a finite non-negative integer (falling back to the
84
+ * property's own default of `0`) -- a raw `NaN` (e.g. an invalid `max-rendered-parts`
85
+ * attribute) would otherwise make `maxRenderedParts > 0` always false, which happens to already
86
+ * match the "render all" fallback, but only by the same accidental-`NaN`-comparison quirk this
87
+ * guard exists to remove. */
88
+ private get effectiveMaxRenderedParts();
89
+ /** `effectiveParts`, windowed to the newest `effectiveMaxRenderedParts` entries when that cap is
90
+ * positive. Never affects citation numbering -- ranks are always derived from the full
91
+ * `effectiveParts` sequence before this window is applied. */
92
+ private get renderedParts();protected willUpdate(changed:PropertyValues<this>):void;protected updated(_changed:PropertyValues<this>):void;private selectCitation;private partNames;private renderBuiltin;private renderOne;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-message-parts':LyraMessageParts;}}
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.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_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"]);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.showReasoning=!0,this.accessibleLabel=null,this.knownErrorIds=new Set,this.suppressNextErrorAnnouncement=!0}static{this.defaultStrings={...super.defaultStrings,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})}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)})}willUpdate(changed){if(super.willUpdate(changed),!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))}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(" ")}renderBuiltin(part,citationRank){switch(part.type){case"text":return this.contentMode==="markdown"?html`<lr-markdown .content=${part.text} .streaming=${part.state==="streaming"}></lr-markdown>`:part.text;case"reasoning":return html`<lr-thinking-panel
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{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_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"]);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.showReasoning=!0,this.maxRenderedParts=0,this.accessibleLabel=null,this.knownErrorIds=new Set,this.suppressNextErrorAnnouncement=!0}static{this.defaultStrings={...super.defaultStrings,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})}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"))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))}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(" ")}renderBuiltin(part,citationRank){switch(part.type){case"text":return this.contentMode==="markdown"?html`<lr-markdown .content=${part.text} .streaming=${part.state==="streaming"}></lr-markdown>`:part.text;case"reasoning":return html`<lr-thinking-panel
2
2
  .label=${this.localize("thinkingPanelLabel")}
3
3
  .mode=${part.state==="streaming"?"live":"post-hoc"}
4
4
  ?expanded=${part.collapsed===!1}
@@ -44,6 +44,6 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
44
44
  >${this.localize("retry")}</lr-button
45
45
  >`:nothing}`}}renderOne(part,index,citationRank){if(part.type==="reasoning"&&!this.showReasoning)return nothing;const custom=this.renderPart?.(part,index);return html`<div part=${this.partNames(part)} data-type=${part.type} data-state=${part.state??"complete"}>
46
46
  ${custom===void 0?this.renderBuiltin(part,citationRank):custom}
47
- </div>`}render(){const label=this.accessibleLabel??this.localize("messagePartsLabel"),parts=this.effectiveParts,citationRanks=new Array(parts.length).fill(0);let citationRank=0;for(let index=0;index<parts.length;index++)parts[index]?.type==="citation"&&(citationRanks[index]=++citationRank);return html`<div part="base" role="group" aria-label=${label}>
48
- ${repeat(parts,part=>part.id,(part,index)=>this.renderOne(part,index,citationRanks[index]??0))}
49
- </div>`}}__decorate([property({attribute:!1})],LyraMessageParts.prototype,"parts",void 0),__decorate([property({reflect:!0,attribute:"content-mode"})],LyraMessageParts.prototype,"contentMode",null),__decorate([property({type:Boolean,attribute:"show-reasoning",reflect:!0,converter:trueDefaultBooleanConverter})],LyraMessageParts.prototype,"showReasoning",void 0),__decorate([property({attribute:!1})],LyraMessageParts.prototype,"renderPart",void 0),__decorate([property({attribute:"aria-label"})],LyraMessageParts.prototype,"accessibleLabel",void 0);export{LyraMessageParts};
47
+ </div>`}render(){const label=this.accessibleLabel??this.localize("messagePartsLabel"),allParts=this.effectiveParts,citationRanks=new Map;let citationRank=0;for(const part of allParts)part.type==="citation"&&citationRanks.set(part.id,++citationRank);const parts=this.renderedParts;return html`<div part="base" role="group" aria-label=${label}>
48
+ ${repeat(parts,part=>part.id,(part,index)=>this.renderOne(part,index,citationRanks.get(part.id)??0))}
49
+ </div>`}}__decorate([property({attribute:!1})],LyraMessageParts.prototype,"parts",void 0),__decorate([property({reflect:!0,attribute:"content-mode"})],LyraMessageParts.prototype,"contentMode",null),__decorate([property({type:Boolean,attribute:"show-reasoning",reflect:!0,converter:trueDefaultBooleanConverter})],LyraMessageParts.prototype,"showReasoning",void 0),__decorate([property({attribute:!1})],LyraMessageParts.prototype,"renderPart",void 0),__decorate([property({type:Number,attribute:"max-rendered-parts"})],LyraMessageParts.prototype,"maxRenderedParts",void 0),__decorate([property({attribute:"aria-label"})],LyraMessageParts.prototype,"accessibleLabel",void 0);export{LyraMessageParts};
@@ -137,7 +137,8 @@ autocapitalize:string;
137
137
  * Empty string omits the attribute (browser default). Named `autoCorrect` (capital `C`), not
138
138
  * `autocorrect`, purely to dodge a TS `lib.dom.d.ts` collision: newer DOM typings declare a
139
139
  * `boolean`-typed `HTMLElement.autocorrect` IDL member, which conflicts with this string-typed
140
- * property of the same name -- same fix as `<lr-textarea>`/`<lr-date-input>`. The explicit
140
+ * property of the same name -- same rename fix as `<lr-date-input>` (`<lr-textarea>` instead
141
+ * keeps the native `autocorrect` name and overrides it as a boolean accessor). The explicit
141
142
  * attribute mapping preserves the lowercase wire name in generated component metadata. */
142
143
  autoCorrect:string;
143
144
  /** Native editing and virtual-keyboard hints forwarded to free-text mode's input. */
@@ -150,7 +151,10 @@ get open():boolean;set open(next:boolean);
150
151
  * or Shoelace needs no attribute rewrite. */
151
152
  size:LyraSize;private get activeIndex();private get query();private touched;private readonly slotPresence;private internals;private validityController;
152
153
  /** Consumer-supplied validation message reflected through `custom-error`. */
153
- customError:string|null;private listId;private controlId;private _fieldsetDisabled;private _name;private _disabled;private _required;private suppressControlBlur;private modeFocusRepair?;private focusedModeRepair?;private focusReturnTarget?;private readonly catalogPicker;constructor();
154
+ customError:string|null;private listId;private controlId;
155
+ /** Whether a host `aria-describedby` was last reflected onto the active control -- see
156
+ * `checkbox.class.ts`'s identically-named field for why the sync call must stay guarded. */
157
+ private hasSyncedDescribedByElements;private _fieldsetDisabled;private _name;private _disabled;private _required;private suppressControlBlur;private modeFocusRepair?;private focusedModeRepair?;private focusReturnTarget?;private readonly catalogPicker;constructor();
154
158
  /** Forwards to the internal trigger button (closed-dropdown mode) or combobox input (free-text
155
159
  * mode) -- mirrors `<lr-button>`'s host `click()` forwarding so a generic form-automation
156
160
  * helper or another component calling `.click()` on the host element actually opens the
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{activeElementIn}from"../../../internal/active-element.js";import{applyComposedFocusRepair,captureComposedFocusRepair,isComposedFocusAvailable}from"../../../internal/focus-navigation.js";import{LyraElement}from"../../../internal/lyra-element.js";import{installFormControlLabelSupport}from"../../../internal/form-control-labels.js";installFormControlLabelSupport();import{sizes}from"../../../internal/sizes.styles.js";import{hostAriaLabel,nextId}from"../../../internal/a11y.js";import{chevronIcon}from"../../../internal/icons.js";import{AnchoredValidityController,VALIDITY_ANCHOR}from"../../../internal/anchored-validity.js";import{syncValidityStates}from"../../../internal/custom-states.js";import{styles}from"./model-select.styles.js";import{spellcheckFromAttributeConverter as spellcheckConverter}from"../../../internal/converters.js";import{attachInternalsSafely,getFormOwner,installCustomErrorProperty,isBarredFromValidation,setFormOwner}from"../../../internal/form-associated.js";import{installInvalidEventAlias}from"../../../internal/invalid-event-alias.js";import{CatalogPickerController}from"../../../internal/catalog-picker.js";import{SlotPresenceController}from"../../../internal/slot-presence-controller.js";import{LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_model,LYRA_DEFAULT_modelSelectNoModels,LYRA_DEFAULT_modelSelectRequired,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_notInCatalog}from"../../../internal/default-strings.generated.js";class LyraModelSelect extends LyraElement{static{this.defaultStrings={...super.defaultStrings,fieldRequired:LYRA_DEFAULT_fieldRequired,model:LYRA_DEFAULT_model,modelSelectNoModels:LYRA_DEFAULT_modelSelectNoModels,modelSelectRequired:LYRA_DEFAULT_modelSelectRequired,noMatches:LYRA_DEFAULT_noMatches,notInCatalog:LYRA_DEFAULT_notInCatalog}}static{this.ownedCollectionProperties=Object.freeze(["catalog"])}static{this.formAssociated=!0}static{this.styles=[LyraElement.styles,sizes,styles]}static{this.properties={customError:{attribute:"custom-error",reflect:!0,noAccessor:!0},disabled:{type:Boolean,reflect:!0,noAccessor:!0},required:{type:Boolean,reflect:!0,noAccessor:!0},value:{attribute:!1,noAccessor:!0},defaultValue:{attribute:"value",reflect:!0,useDefault:!0,noAccessor:!0},name:{reflect:!0,noAccessor:!0}}}get open(){return this.catalogPicker.open}set open(next){this.catalogPicker.setOpen(next)}get activeIndex(){return this.catalogPicker.activeIndex}get query(){return this.catalogPicker.query}constructor(){super(),this.provider="",this.allowCustom=!1,this.readonly=!1,this.label="",this.hint="",this.errorText="",this.placeholder="",this.spellcheck=!0,this.autocapitalize="",this.autoCorrect="",this.autocomplete="off",this.inputMode="",this.enterKeyHint="",this.size="m",this.touched=!1,this.slotPresence=new SlotPresenceController(this),this.listId=nextId("model-select-list"),this.controlId=nextId("model-select-control"),this._fieldsetDisabled=!1,this._name="",this._disabled=!1,this._required=!1,this.suppressControlBlur=!1,this.catalogPicker=new CatalogPickerController(this,{catalog:()=>this.catalog,allowCustom:()=>this.allowCustom,isReadonly:()=>this.readonly,locale:()=>this.effectiveLocale,searchableFields:entry=>[entry.id,entry.label],emitChange:detail=>this.emit("lr-change",detail),onValueChange:(value,oldValue)=>{this.internals.setFormValue(value),this.updateValidity(),this.requestUpdate("value",oldValue)},onDefaultValueChange:(_value,oldValue)=>this.requestUpdate("defaultValue",oldValue),onStateChange:(state2,oldValue)=>{state2==="open"?this.requestUpdate("open",oldValue):this.requestUpdate()},onControlFocus:event=>this.captureModeFocus(event),onControlBlur:event=>{this.effectiveDisabled||(this.touched=!0),this.retireModeFocusAfterBlur(event)},forwardFreeInputClick:!0}),this.onTriggerClick=()=>{this.effectiveDisabled||(this.open?this.hide():this.show())},this.onTriggerBlur=event=>{this.catalogPicker.handleControlBlur(event)},this.onTriggerFocus=event=>{this.catalogPicker.handleControlFocus(event)},this.onTriggerKeyDown=e=>{this.catalogPicker.handleTriggerKeyDown(e)},this.onComboMouseDown=e=>{this.catalogPicker.handleComboMouseDown(e)},this.onInputFocus=event=>{this.catalogPicker.handleInputFocus(event)},this.onInput=e=>{this.catalogPicker.handleInput(e)},this.onInputBlur=event=>{this.catalogPicker.handleControlBlur(event)},this.onInputKeyDown=e=>{this.catalogPicker.handleInputKeyDown(e)},this.onListboxMouseDown=e=>{this.catalogPicker.handleListboxMouseDown(e)},this.onListboxClick=e=>{this.catalogPicker.handleListboxClick(e)},this.internals=attachInternalsSafely(this),this.validityController=new AnchoredValidityController(this,this.internals,()=>this[VALIDITY_ANCHOR]()),installCustomErrorProperty(this,()=>this.validityController.customValidityMessage),installInvalidEventAlias(this,init=>this.emit("lr-invalid",null,init)),this.internals.setFormValue("")}click(){this.catalogPicker.click()}focus(options){this.catalogPicker.focus(options)}blur(){this.catalogPicker.blur()}get input(){return this.catalogPicker.input}get selectionStart(){return this.input?.selectionStart??null}set selectionStart(value){this.input&&(this.input.selectionStart=value)}get selectionEnd(){return this.input?.selectionEnd??null}set selectionEnd(value){this.input&&(this.input.selectionEnd=value)}get selectionDirection(){return this.input?.selectionDirection??null}set selectionDirection(value){this.input&&(this.input.selectionDirection=value)}select(){this.catalogPicker.select()}setSelectionRange(start,end,direction){this.catalogPicker.setSelectionRange(start,end,direction)}setRangeText(replacement,start,end,selectMode){this.catalogPicker.setRangeText(replacement,start,end,selectMode)}get form(){return getFormOwner(this.internals)}set form(owner){setFormOwner(this,owner)}getForm(){return getFormOwner(this.internals)}get labels(){return this.internals.labels}get validity(){return this.internals.validity}get validationMessage(){return this.internals.validationMessage}get willValidate(){return this.internals.willValidate}[VALIDITY_ANCHOR](){return this.renderRoot?.querySelector('[part="trigger"], [part="combobox-input"]')??null}connectedCallback(){super.connectedCallback(),this.updateValidity(),this.catalogPicker.connected(this.hasUpdated)}willUpdate(changed){super.willUpdate(changed);let modeChanged=!1;if(this.hasUpdated){const renderedControl=this.renderRoot.querySelector('[part="trigger"], [part="combobox-input"]');modeChanged=renderedControl?.getAttribute("part")==="trigger"!==this.closedMode,this.suppressControlBlur=modeChanged,this.catalogPicker.suppressControlEvents=modeChanged,this.modeFocusRepair=modeChanged&&renderedControl!==null&&activeElementIn(this.shadowRoot)===renderedControl?captureComposedFocusRepair(this,this.modeFocusFallback()??renderedControl)??void 0:modeChanged?this.focusedModeRepair:void 0}this.open&&(changed.has("catalog")||changed.has("value")||changed.has("allowCustom"))&&this.catalogPicker.reconcileRows(void 0,changed.has("value")||changed.has("allowCustom")||modeChanged,!1)}disconnectedCallback(){super.disconnectedCallback(),this.modeFocusRepair=void 0,this.focusedModeRepair=void 0,this.focusReturnTarget=void 0,this.catalogPicker.disconnected()}adoptedCallback(){super.adoptedCallback(),this.modeFocusRepair=void 0,this.focusedModeRepair=void 0,this.focusReturnTarget=void 0,this.catalogPicker.adopted()}get value(){return this.catalogPicker.value}set value(next){this.catalogPicker.value=next}get defaultValue(){return this.catalogPicker.defaultValue}set defaultValue(next){this.catalogPicker.defaultValue=next}get name(){return this._name}set name(next){const old=this._name;this._name=next??"",this._name?this.setAttribute("name",this._name):this.removeAttribute("name"),this.requestUpdate("name",old)}get disabled(){return this._disabled}set disabled(next){const old=this._disabled;this._disabled=!!next,this.toggleAttribute("disabled",this._disabled),this._disabled&&this.hide(),this.updateValidity(),this.requestUpdate("disabled",old)}get required(){return this._required}set required(next){const old=this._required;this._required=!!next,this.toggleAttribute("required",this._required),this.updateValidity(),this.requestUpdate("required",old)}get effectiveDisabled(){return this.disabled||this._fieldsetDisabled}get barredFromValidation(){return isBarredFromValidation(this,this.internals)}updateValidity(){this.barredFromValidation?this.validityController.setValidity({}):this.required&&!this.value?this.validityController.setValidity({valueMissing:!0},this.localize("modelSelectRequired")):this.validityController.setValidity({}),this.publishValidityStates()}publishValidityStates(){syncValidityStates(this.internals,{required:this.required,hasInteracted:this.touched,barred:this.barredFromValidation})}formResetCallback(){this.touched=!1,this.catalogPicker.resetValue()}formStateRestoreCallback(state2,_mode){this.catalogPicker.restoreState(state2)}formDisabledCallback(disabled){this._fieldsetDisabled=disabled,disabled&&this.hide(),this.updateValidity(),this.requestUpdate()}checkValidity(){return this.internals.checkValidity()}reportValidity(){return this.touched=!0,this.publishValidityStates(),this.internals.reportValidity()}setCustomValidity(message){this.validityController.setCustomValidity(message??""),this.publishValidityStates()}get closedMode(){return this.catalogPicker.closedMode}get effectiveEntries(){return this.catalogPicker.effectiveEntries}get filteredEntries(){return this.catalogPicker.filteredEntries}labelFor(id){return this.catalogPicker.labelFor(id)}show(){this.catalogPicker.show()}hide(){this.catalogPicker.hide()}updated(changed){super.updated(changed);const reposition=changed.has("open")||this.open&&(changed.has("catalog")||changed.has("allowCustom"));this.catalogPicker.updated(reposition),(changed.has("required")||changed.has("readonly")||changed.has("touched")||changed.has("value"))&&(changed.has("readonly")&&this.updateValidity(),this.toggleAttribute("data-invalid",this.touched&&!this.internals.validity.valid)),this.publishValidityStates(),this.suppressControlBlur=!1,this.catalogPicker.suppressControlEvents=!1;const focusRepair=this.modeFocusRepair;this.modeFocusRepair=void 0,focusRepair&&this.scheduleAfterUpdate(()=>{const replacement=this[VALIDITY_ANCHOR](),target=replacement&&isComposedFocusAvailable(replacement)?replacement:this.modeFocusFallback();applyComposedFocusRepair(focusRepair,target),this.focusedModeRepair===focusRepair&&(this.focusedModeRepair=void 0)},"model-select-mode-focus")}rememberFocusReturn(event){const related=event.relatedTarget;related&&related.nodeType===1&&isComposedFocusAvailable(related)&&(this.focusReturnTarget=related)}captureModeFocus(event){this.rememberFocusReturn(event);const control=event.currentTarget;!control||control.nodeType!==1||(this.focusedModeRepair=captureComposedFocusRepair(this,this.modeFocusFallback()??control)??void 0)}retireModeFocusAfterBlur(event){const destination=event.relatedTarget;if(destination&&destination.nodeType===1){this.focusedModeRepair=void 0;return}queueMicrotask(()=>{!this.suppressControlBlur&&!this.effectiveDisabled&&!this.hasAttribute("inert")&&(this.focusedModeRepair=void 0)})}modeFocusFallback(){if(this.focusReturnTarget&&isComposedFocusAvailable(this.focusReturnTarget))return this.focusReturnTarget;const owner=this.renderRoot.querySelector('[part="form-control"]');return owner&&isComposedFocusAvailable(owner)?owner:null}renderRows(rows,activeId){return rows.map((entry,i)=>{const id=`${this.listId}-opt-${i}`,selected=entry.id===this.value;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,state}from"lit/decorators.js";import{activeElementIn}from"../../../internal/active-element.js";import{applyComposedFocusRepair,captureComposedFocusRepair,isComposedFocusAvailable}from"../../../internal/focus-navigation.js";import{LyraElement}from"../../../internal/lyra-element.js";import{installFormControlLabelSupport}from"../../../internal/form-control-labels.js";installFormControlLabelSupport();import{sizes}from"../../../internal/sizes.styles.js";import{hostAriaLabel,nextId}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{chevronIcon}from"../../../internal/icons.js";import{AnchoredValidityController,VALIDITY_ANCHOR}from"../../../internal/anchored-validity.js";import{syncValidityStates}from"../../../internal/custom-states.js";import{styles}from"./model-select.styles.js";import{spellcheckFromAttributeConverter as spellcheckConverter}from"../../../internal/converters.js";import{attachInternalsSafely,getFormOwner,installCustomErrorProperty,isBarredFromValidation,setFormOwner}from"../../../internal/form-associated.js";import{installInvalidEventAlias}from"../../../internal/invalid-event-alias.js";import{CatalogPickerController}from"../../../internal/catalog-picker.js";import{SlotPresenceController}from"../../../internal/slot-presence-controller.js";import{LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_model,LYRA_DEFAULT_modelSelectNoModels,LYRA_DEFAULT_modelSelectRequired,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_notInCatalog}from"../../../internal/default-strings.generated.js";class LyraModelSelect extends LyraElement{static{this.defaultStrings={...super.defaultStrings,fieldRequired:LYRA_DEFAULT_fieldRequired,model:LYRA_DEFAULT_model,modelSelectNoModels:LYRA_DEFAULT_modelSelectNoModels,modelSelectRequired:LYRA_DEFAULT_modelSelectRequired,noMatches:LYRA_DEFAULT_noMatches,notInCatalog:LYRA_DEFAULT_notInCatalog}}static{this.ownedCollectionProperties=Object.freeze(["catalog"])}static{this.formAssociated=!0}static{this.styles=[LyraElement.styles,sizes,styles]}static{this.properties={customError:{attribute:"custom-error",reflect:!0,noAccessor:!0},disabled:{type:Boolean,reflect:!0,noAccessor:!0},required:{type:Boolean,reflect:!0,noAccessor:!0},value:{attribute:!1,noAccessor:!0},defaultValue:{attribute:"value",reflect:!0,useDefault:!0,noAccessor:!0},name:{reflect:!0,noAccessor:!0}}}get open(){return this.catalogPicker.open}set open(next){this.catalogPicker.setOpen(next)}get activeIndex(){return this.catalogPicker.activeIndex}get query(){return this.catalogPicker.query}constructor(){super(),this.provider="",this.allowCustom=!1,this.readonly=!1,this.label="",this.hint="",this.errorText="",this.placeholder="",this.spellcheck=!0,this.autocapitalize="",this.autoCorrect="",this.autocomplete="off",this.inputMode="",this.enterKeyHint="",this.size="m",this.touched=!1,this.slotPresence=new SlotPresenceController(this),this.listId=nextId("model-select-list"),this.controlId=nextId("model-select-control"),this.hasSyncedDescribedByElements=!1,this._fieldsetDisabled=!1,this._name="",this._disabled=!1,this._required=!1,this.suppressControlBlur=!1,this.catalogPicker=new CatalogPickerController(this,{catalog:()=>this.catalog,allowCustom:()=>this.allowCustom,isReadonly:()=>this.readonly,locale:()=>this.effectiveLocale,searchableFields:entry=>[entry.id,entry.label],emitChange:detail=>this.emit("lr-change",detail),onValueChange:(value,oldValue)=>{this.internals.setFormValue(value),this.updateValidity(),this.requestUpdate("value",oldValue)},onDefaultValueChange:(_value,oldValue)=>this.requestUpdate("defaultValue",oldValue),onStateChange:(state2,oldValue)=>{state2==="open"?this.requestUpdate("open",oldValue):this.requestUpdate()},onControlFocus:event=>this.captureModeFocus(event),onControlBlur:event=>{this.effectiveDisabled||(this.touched=!0),this.retireModeFocusAfterBlur(event)},forwardFreeInputClick:!0}),this.onTriggerClick=()=>{this.effectiveDisabled||(this.open?this.hide():this.show())},this.onTriggerBlur=event=>{this.catalogPicker.handleControlBlur(event)},this.onTriggerFocus=event=>{this.catalogPicker.handleControlFocus(event)},this.onTriggerKeyDown=e=>{this.catalogPicker.handleTriggerKeyDown(e)},this.onComboMouseDown=e=>{this.catalogPicker.handleComboMouseDown(e)},this.onInputFocus=event=>{this.catalogPicker.handleInputFocus(event)},this.onInput=e=>{this.catalogPicker.handleInput(e)},this.onInputBlur=event=>{this.catalogPicker.handleControlBlur(event)},this.onInputKeyDown=e=>{this.catalogPicker.handleInputKeyDown(e)},this.onListboxMouseDown=e=>{this.catalogPicker.handleListboxMouseDown(e)},this.onListboxClick=e=>{this.catalogPicker.handleListboxClick(e)},this.internals=attachInternalsSafely(this),this.validityController=new AnchoredValidityController(this,this.internals,()=>this[VALIDITY_ANCHOR]()),installCustomErrorProperty(this,()=>this.validityController.customValidityMessage),installInvalidEventAlias(this,init=>this.emit("lr-invalid",null,init)),this.internals.setFormValue("")}click(){this.catalogPicker.click()}focus(options){this.catalogPicker.focus(options)}blur(){this.catalogPicker.blur()}get input(){return this.catalogPicker.input}get selectionStart(){return this.input?.selectionStart??null}set selectionStart(value){this.input&&(this.input.selectionStart=value)}get selectionEnd(){return this.input?.selectionEnd??null}set selectionEnd(value){this.input&&(this.input.selectionEnd=value)}get selectionDirection(){return this.input?.selectionDirection??null}set selectionDirection(value){this.input&&(this.input.selectionDirection=value)}select(){this.catalogPicker.select()}setSelectionRange(start,end,direction){this.catalogPicker.setSelectionRange(start,end,direction)}setRangeText(replacement,start,end,selectMode){this.catalogPicker.setRangeText(replacement,start,end,selectMode)}get form(){return getFormOwner(this.internals)}set form(owner){setFormOwner(this,owner)}getForm(){return getFormOwner(this.internals)}get labels(){return this.internals.labels}get validity(){return this.internals.validity}get validationMessage(){return this.internals.validationMessage}get willValidate(){return this.internals.willValidate}[VALIDITY_ANCHOR](){return this.renderRoot?.querySelector('[part="trigger"], [part="combobox-input"]')??null}connectedCallback(){super.connectedCallback(),this.updateValidity(),this.catalogPicker.connected(this.hasUpdated)}willUpdate(changed){super.willUpdate(changed);let modeChanged=!1;if(this.hasUpdated){const renderedControl=this.renderRoot.querySelector('[part="trigger"], [part="combobox-input"]');modeChanged=renderedControl?.getAttribute("part")==="trigger"!==this.closedMode,this.suppressControlBlur=modeChanged,this.catalogPicker.suppressControlEvents=modeChanged,this.modeFocusRepair=modeChanged&&renderedControl!==null&&activeElementIn(this.shadowRoot)===renderedControl?captureComposedFocusRepair(this,this.modeFocusFallback()??renderedControl)??void 0:modeChanged?this.focusedModeRepair:void 0}this.open&&(changed.has("catalog")||changed.has("value")||changed.has("allowCustom"))&&this.catalogPicker.reconcileRows(void 0,changed.has("value")||changed.has("allowCustom")||modeChanged,!1)}disconnectedCallback(){super.disconnectedCallback(),this.modeFocusRepair=void 0,this.focusedModeRepair=void 0,this.focusReturnTarget=void 0,this.catalogPicker.disconnected()}adoptedCallback(){super.adoptedCallback(),this.modeFocusRepair=void 0,this.focusedModeRepair=void 0,this.focusReturnTarget=void 0,this.catalogPicker.adopted()}get value(){return this.catalogPicker.value}set value(next){this.catalogPicker.value=next}get defaultValue(){return this.catalogPicker.defaultValue}set defaultValue(next){this.catalogPicker.defaultValue=next}get name(){return this._name}set name(next){const old=this._name;this._name=next??"",this._name?this.setAttribute("name",this._name):this.removeAttribute("name"),this.requestUpdate("name",old)}get disabled(){return this._disabled}set disabled(next){const old=this._disabled;this._disabled=!!next,this.toggleAttribute("disabled",this._disabled),this._disabled&&this.hide(),this.updateValidity(),this.requestUpdate("disabled",old)}get required(){return this._required}set required(next){const old=this._required;this._required=!!next,this.toggleAttribute("required",this._required),this.updateValidity(),this.requestUpdate("required",old)}get effectiveDisabled(){return this.disabled||this._fieldsetDisabled}get barredFromValidation(){return isBarredFromValidation(this,this.internals)}updateValidity(){this.barredFromValidation?this.validityController.setValidity({}):this.required&&!this.value?this.validityController.setValidity({valueMissing:!0},this.localize("modelSelectRequired")):this.validityController.setValidity({}),this.publishValidityStates()}publishValidityStates(){syncValidityStates(this.internals,{required:this.required,hasInteracted:this.touched,barred:this.barredFromValidation})}formResetCallback(){this.touched=!1,this.catalogPicker.resetValue()}formStateRestoreCallback(state2,_mode){this.catalogPicker.restoreState(state2)}formDisabledCallback(disabled){this._fieldsetDisabled=disabled,disabled&&this.hide(),this.updateValidity(),this.requestUpdate()}checkValidity(){return this.internals.checkValidity()}reportValidity(){return this.touched=!0,this.publishValidityStates(),this.internals.reportValidity()}setCustomValidity(message){this.validityController.setCustomValidity(message??""),this.publishValidityStates()}get closedMode(){return this.catalogPicker.closedMode}get effectiveEntries(){return this.catalogPicker.effectiveEntries}get filteredEntries(){return this.catalogPicker.filteredEntries}labelFor(id){return this.catalogPicker.labelFor(id)}show(){this.catalogPicker.show()}hide(){this.catalogPicker.hide()}updated(changed){super.updated(changed);const hostDescribedBy=this.getAttribute("aria-describedby");if(hostDescribedBy||this.hasSyncedDescribedByElements){const control=this.renderRoot.querySelector(`#${CSS.escape(this.controlId)}`);this.hasSyncedDescribedByElements=syncAriaDescribedByElements(this,control??void 0,hostDescribedBy)}const reposition=changed.has("open")||this.open&&(changed.has("catalog")||changed.has("allowCustom"));this.catalogPicker.updated(reposition),(changed.has("required")||changed.has("readonly")||changed.has("touched")||changed.has("value"))&&(changed.has("readonly")&&this.updateValidity(),this.toggleAttribute("data-invalid",this.touched&&!this.internals.validity.valid)),this.publishValidityStates(),this.suppressControlBlur=!1,this.catalogPicker.suppressControlEvents=!1;const focusRepair=this.modeFocusRepair;this.modeFocusRepair=void 0,focusRepair&&this.scheduleAfterUpdate(()=>{const replacement=this[VALIDITY_ANCHOR](),target=replacement&&isComposedFocusAvailable(replacement)?replacement:this.modeFocusFallback();applyComposedFocusRepair(focusRepair,target),this.focusedModeRepair===focusRepair&&(this.focusedModeRepair=void 0)},"model-select-mode-focus")}rememberFocusReturn(event){const related=event.relatedTarget;related&&related.nodeType===1&&isComposedFocusAvailable(related)&&(this.focusReturnTarget=related)}captureModeFocus(event){this.rememberFocusReturn(event);const control=event.currentTarget;!control||control.nodeType!==1||(this.focusedModeRepair=captureComposedFocusRepair(this,this.modeFocusFallback()??control)??void 0)}retireModeFocusAfterBlur(event){const destination=event.relatedTarget;if(destination&&destination.nodeType===1){this.focusedModeRepair=void 0;return}queueMicrotask(()=>{!this.suppressControlBlur&&!this.effectiveDisabled&&!this.hasAttribute("inert")&&(this.focusedModeRepair=void 0)})}modeFocusFallback(){if(this.focusReturnTarget&&isComposedFocusAvailable(this.focusReturnTarget))return this.focusReturnTarget;const owner=this.renderRoot.querySelector('[part="form-control"]');return owner&&isComposedFocusAvailable(owner)?owner:null}renderRows(rows,activeId){return rows.map((entry,i)=>{const id=`${this.listId}-opt-${i}`,selected=entry.id===this.value;return html`<div
2
2
  part="option"
3
3
  id=${id}
4
4
  role="option"
@@ -29,7 +29,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
29
29
  <div id="model-select-hint" part="hint" ?hidden=${!hasHint}>
30
30
  ${this.hint}<slot name="hint"></slot>
31
31
  </div>
32
- `}renderClosed(){const rows=this.effectiveEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasValue=this.value.length>0,hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
32
+ `}renderClosed(){const rows=this.effectiveEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasValue=this.value.length>0,hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[this.getAttribute("aria-describedby")??"",hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
33
33
  ${this.renderLabel()}
34
34
  <button
35
35
  id=${this.controlId}
@@ -59,7 +59,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
59
59
  </button>
60
60
  ${this.renderListbox(rows,activeId,this.localize("modelSelectNoModels"))}
61
61
  ${this.renderHintError(hasError,hasHint)}
62
- `}renderFreeText(){const rows=this.filteredEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
62
+ `}renderFreeText(){const rows=this.filteredEntries,activeId=this.activeIndex>=0&&rows[this.activeIndex]?`${this.listId}-opt-${this.activeIndex}`:"",hasLabel=this.hasVisibleLabel,hasHint=this.slotPresence.has("hint")||(this.hint??"").length>0,hasError=this.slotPresence.has("error")||(this.errorText??"").length>0,describedBy=[this.getAttribute("aria-describedby")??"",hasError?"model-select-error":"",hasHint?"model-select-hint":""].filter(Boolean).join(" ");return html`
63
63
  ${this.renderLabel()}
64
64
  <div part="combobox" @mousedown=${this.onComboMouseDown}>
65
65
  ${this.provider?html`<span part="provider-badge">${this.provider}</span>`:""}
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{contain-intrinsic-inline-size:var(--lr-size-20rem);display:block;container-type:inline-size}[part=base]{gap:var(--lr-space-s);flex-direction:column;min-inline-size:0;display:flex}[part=controls]{align-items:flex-start;gap:var(--lr-space-xs);flex-wrap:wrap;display:flex}[part=controls]>*{min-inline-size:min(100%, var(--lr-prompt-input-control-width,var(--lr-size-12rem)));flex:1 1 var(--lr-prompt-input-control-width,var(--lr-size-12rem))}[part=sources]{border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);inline-size:100%}[part=sources-summary]{min-block-size:var(--lr-icon-button-size);padding:var(--lr-space-xs) var(--lr-space-s);text-align:start;cursor:pointer;align-items:center;display:flex}[part=sources-summary]:hover{color:var(--lr-color-brand)}[part=sources-summary]:active{color:var(--lr-color-brand);background:color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=sources-summary]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=source-picker]{padding:var(--lr-space-s);border-block-start:var(--lr-border-width-thin) solid var(--lr-color-border)}[part=chips]{gap:var(--lr-space-xs);flex-wrap:wrap;display:flex}[part=start]{display:inline-flex}@container (inline-size<=319.98px){[part=controls]{flex-direction:column}[part=controls]>*{inline-size:100%}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{contain-intrinsic-inline-size:var(--lr-size-20rem);display:block;container-type:inline-size}[part=base]{gap:var(--lr-space-s);flex-direction:column;min-inline-size:0;display:flex}[part=controls]{align-items:flex-start;gap:var(--lr-space-xs);flex-wrap:wrap;display:flex}[part=controls]>*{min-inline-size:min(100%, var(--lr-prompt-input-control-width,var(--lr-size-12rem)));flex:1 1 var(--lr-prompt-input-control-width,var(--lr-size-12rem))}[part=sources]{border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);inline-size:100%}[part=sources-summary]{min-block-size:var(--lr-icon-button-size);padding:var(--lr-space-xs) var(--lr-space-s);text-align:start;cursor:pointer;align-items:center;display:flex}[part=sources-summary]:hover{color:var(--lr-color-brand)}[part=sources-summary]:active{color:var(--lr-color-brand);background:color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=sources-summary]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=source-picker]{padding:var(--lr-space-s);border-block-start:var(--lr-border-width-thin) solid var(--lr-color-border)}[part=chips]{gap:var(--lr-space-xs);flex-wrap:wrap;display:flex}[part=start]{display:inline-flex}@container (inline-size<=319.98px){[part=controls]{flex-direction:column}[part=controls]>*{flex-basis:auto;inline-size:100%}}`;export{styles};
@@ -51,7 +51,11 @@ anchor:DocumentLocator|null;rect:DOMRectReadOnly|null;
51
51
  * moves to the nearest action or the stable toolbar when the set becomes empty. Duplicate names
52
52
  * normalize first-wins.
53
53
  */
54
- actions:readonly SelectionAction[];label:string;accessibleLabel:string|null;private copyFailed;private toolbar?;private overlay?;private stopPositioning?;private activeActionIndex;private lifecycleGeneration;private positioningGeneration;private rovingGeneration;private pendingActionFocus?;private focusedAction?;private actionObserver?;private managedActionStops;private actionTabIndexLeases;private get effectiveActions();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private syncOpenLifecycle;private dismiss;private activate;private isCurrentLifecycle;
54
+ actions:readonly SelectionAction[];label:string;accessibleLabel:string|null;private copyFailed;private toolbar?;private overlay?;private stopPositioning?;
55
+ /** Announces a copy failure -- the copy button's own `aria-label`/text flipping to
56
+ * `localize('copyFailed')` is not reliably re-announced by a screen reader without an
57
+ * explicit live region, unlike every other failure/transition state in this family. */
58
+ private sink?;private activeActionIndex;private lifecycleGeneration;private positioningGeneration;private rovingGeneration;private pendingActionFocus?;private focusedAction?;private actionObserver?;private managedActionStops;private actionTabIndexLeases;private get effectiveActions();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private syncOpenLifecycle;private dismiss;private activate;private isCurrentLifecycle;
55
59
  /** Every stop in the `role="toolbar"` roving group, in rendered order: the built-in actions
56
60
  * first, then whatever a consumer slotted into `actions`. Slotted stops live in the host's
57
61
  * light DOM (not `renderRoot`), so every containment check below has to accept both. */
@@ -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{styles}from"./selection-toolbar.styles.js";import{LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_selectionAsk,LYRA_DEFAULT_selectionCite,LYRA_DEFAULT_selectionQuote,LYRA_DEFAULT_selectionToolbarLabel}from"../../../internal/default-strings.generated.js";const SELECTION_ACTIONS=["ask","quote","cite","copy"],DEFAULT_PLACEMENT_GAP_PX=8;class LyraSelectionToolbar extends LyraElement{constructor(){super(...arguments),this.open=!1,this.text="",this.anchor=null,this.rect=null,this.actions=["ask","quote","cite","copy"],this.label="",this.accessibleLabel=null,this.copyFailed=!1,this.activeActionIndex=0,this.lifecycleGeneration=0,this.positioningGeneration=0,this.rovingGeneration=0,this.managedActionStops=new Set,this.actionTabIndexLeases=new WeakMap,this.onActionsSlotChange=()=>{this.syncRovingStops()},this.onActionMutations=records=>{this.syncRovingStops()},this.onToolbarFocusIn=event=>{const buttons=this.actionButtons(),path=event.composedPath(),index=buttons.findIndex(button=>path.includes(button));if(index<0){this.focusedAction=void 0;return}const origin=path[0],stop=origin?.nodeType===1&&typeof origin.focus=="function"?origin:buttons[index],toolbar=this.toolbar,repair=stop&&toolbar?captureComposedFocusRepair(stop,toolbar):null;this.focusedAction=stop&&repair?{action:this.actionForStop(stop),index,repair,stop}:void 0,this.syncRovingStops(index)},this.containNativeEvent=event=>{event.stopPropagation()},this.onToolbarFocusOut=event=>{const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedAction=void 0)},this.onToolbarKeyDown=event=>{const buttons=this.actionButtons();if(buttons.length===0)return;const originIndex=buttons.findIndex(button=>event.composedPath().includes(button)),currentIndex=originIndex>=0?originIndex:this.activeActionIndex,forward=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backward=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let next;if(event.key===forward)next=(currentIndex+1)%buttons.length;else if(event.key===backward)next=(currentIndex-1+buttons.length)%buttons.length;else if(event.key==="Home")next=0;else if(event.key==="End")next=buttons.length-1;else return;event.preventDefault(),this.focusedAction=void 0;const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView;this.syncRovingStops(next).then(button=>{!button||!this.isCurrentLifecycle(generation,owner)||!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)||button.focus()})},this.updateToolbarPosition=()=>{const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view)return;const viewport=this.viewportBounds(view),maxEdge=finiteMidpoint(0,Math.min(viewport.width,viewport.height)),gap=finiteRange(this.placementGapPx(),DEFAULT_PLACEMENT_GAP_PX,0,maxEdge),edge=gap,fallbackInline=finiteMidpoint(viewport.left,viewport.right),rect=this.rect?this.safeRect(this.rect):{left:fallbackInline,top:viewport.top,width:0,height:0,right:fallbackInline,bottom:viewport.top,inlineCenter:fallbackInline},doubleEdge=finiteAdd(edge,edge),maxInlineSize=finiteRange(finiteAdd(viewport.width,-doubleEdge),0,0,Number.MAX_VALUE),maxBlockSize=finiteRange(finiteAdd(viewport.height,-doubleEdge),0,0,Number.MAX_VALUE);toolbar.style.setProperty("--_lr-selection-toolbar-max-inline-size",this.px(maxInlineSize)),toolbar.style.setProperty("--_lr-selection-toolbar-max-block-size",this.px(maxBlockSize));const width=finiteRange(toolbar.offsetWidth,0,0,Number.MAX_VALUE),height=finiteRange(toolbar.offsetHeight,0,0,Number.MAX_VALUE),desiredInline=finiteRange(rect.inlineCenter,viewport.left,viewport.left,viewport.right),anchorBlock=finiteRange(rect.top,viewport.top,viewport.top,viewport.bottom),desiredLeft=finiteAdd(desiredInline,-finiteMidpoint(0,width)),minLeft=finiteAdd(viewport.left,edge),maxLeft=Math.max(minLeft,finiteAdd(finiteAdd(viewport.right,-width),-edge)),left=finiteRange(desiredLeft,minLeft,minLeft,maxLeft),above=finiteAdd(finiteAdd(rect.top,-height),-gap),below=finiteAdd(rect.bottom,gap),minTop=finiteAdd(viewport.top,edge),desiredTop=above>=minTop?above:below,maxTop=Math.max(minTop,finiteAdd(finiteAdd(viewport.bottom,-height),-edge)),top=finiteRange(desiredTop,minTop,minTop,maxTop),logicalInline=this.effectiveDirection==="rtl"?finiteAdd(viewport.layoutWidth,-desiredInline):desiredInline;toolbar.style.setProperty("--_lr-selection-toolbar-inline-start",this.px(logicalInline)),toolbar.style.setProperty("--_lr-selection-toolbar-block-start",this.px(anchorBlock)),toolbar.style.setProperty("--_lr-selection-toolbar-inline-shift",this.px(finiteAdd(left,-desiredLeft))),toolbar.style.setProperty("--_lr-selection-toolbar-block-shift",this.px(finiteAdd(top,-finiteAdd(anchorBlock,-height)))),toolbar.toggleAttribute("data-positioned",!0)}}static{this.defaultStrings={...super.defaultStrings,copy:LYRA_DEFAULT_copy,copyFailed:LYRA_DEFAULT_copyFailed,selectionAsk:LYRA_DEFAULT_selectionAsk,selectionCite:LYRA_DEFAULT_selectionCite,selectionQuote:LYRA_DEFAULT_selectionQuote,selectionToolbarLabel:LYRA_DEFAULT_selectionToolbarLabel}}static{this.ownedCollectionProperties=Object.freeze(["anchor","actions"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-selection-action"])}get effectiveActions(){const seen=new Set,actions=[];for(const value of this.actions){if(typeof value!="string"||!SELECTION_ACTIONS.includes(value)||seen.has(value))continue;const action=value;seen.add(action),actions.push(action)}return actions}connectedCallback(){super.connectedCallback(),this.hasUpdated&&(this.syncOpenLifecycle(),this.syncRovingStops())}disconnectedCallback(){this.lifecycleGeneration++,this.rovingGeneration++,this.pendingActionFocus=void 0,this.focusedAction=void 0,this.actionObserver?.disconnect(),this.actionObserver=void 0,this.releaseManagedActionStops(),this.retirePositioning(),this.overlay?.suspend(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.lifecycleGeneration++,this.rovingGeneration++,this.pendingActionFocus=void 0,this.focusedAction=void 0,this.actionObserver?.disconnect(),this.actionObserver=void 0,this.releaseManagedActionStops(),this.retirePositioning()}willUpdate(changed){if(super.willUpdate(changed),this.copyFailed&&(changed.has("text")||changed.has("open")&&this.open)&&(this.copyFailed=!1),!changed.has("actions"))return;const active=deepActiveElementIn(this.ownerDocument),toolbar=this.toolbar;if(!active||!toolbar)return;const index=this.actionButtons().indexOf(active);if(index<0)return;const repair=captureComposedFocusRepair(active,toolbar);repair&&(this.pendingActionFocus={action:this.actionForStop(active),index,repair,stop:active})}updated(changed){if(super.updated(changed),(changed.has("open")||changed.has("text"))&&this.syncOpenLifecycle(),this.open&&this.text&&(changed.has("rect")||changed.has("actions"))&&this.updateToolbarPosition(),this.open&&this.text&&(changed.has("open")||changed.has("text")||changed.has("actions"))){const pending=changed.has("actions")?this.pendingActionFocus:void 0;if(this.pendingActionFocus=void 0,!pending){this.syncRovingStops();return}this.syncRovingStops(pending.index,pending)}}syncOpenLifecycle(){if(!this.isConnected){this.retirePositioning(),this.overlay?.deactivate(),this.overlay=void 0,this.releaseManagedActionStops();return}if(!this.open||!this.text){this.retirePositioning(),this.overlay?.deactivate(),this.overlay=void 0,this.releaseManagedActionStops();return}this.overlay?.isActive()?this.overlay.resume():this.overlay=activateNonmodalOverlay({host:this,panel:()=>this.toolbar??null,onEscape:()=>this.dismiss()}),this.startPositioning()}dismiss(){this.open&&(this.open=!1,this.emit("lr-dismiss",null))}async activate(action){const text=this.text,anchor=this.anchor,generation=this.lifecycleGeneration,owner=this.isConnected?this.ownerDocument.defaultView:null;if(this.copyFailed=!1,action==="copy"){const outcome=await writeClipboardText(owner,text);if(!this.isCurrentLifecycle(generation,owner))return;if(!outcome.ok){this.copyFailed=!0,this.emit("lr-error",null),this.emit("lr-copy-error",outcome);return}this.emit("lr-copy",outcome)}this.isCurrentLifecycle(generation,owner)&&this.emit("lr-selection-action",{action,text,anchor})}isCurrentLifecycle(generation,owner){return generation===this.lifecycleGeneration&&this.isConnected&&this.ownerDocument.defaultView===owner}actionButtons(){const toolbar=this.toolbar;return toolbar?collectComposedFocusTargets(toolbar,{mode:"programmatic",includeRoot:!1}).elements.filter(button=>!!isSemanticActionElement(button)||this.hasAuthoredActionTabIndex(button)):[]}actionRoots(){const builtIn=[...this.renderRoot.querySelectorAll("lr-button[data-action]")],slot=this.renderRoot.querySelector('slot[name="actions"]');return[...builtIn,...slot?.assignedElements({flatten:!0})??[]]}actionForStop(stop){const action=[...this.renderRoot.querySelectorAll("lr-button[data-action]")].find(button=>composedContains(button,stop))?.getAttribute("data-action");return action&&SELECTION_ACTIONS.includes(action)?action:void 0}ownsActionButton(button){return this.actionButtons().includes(button)}async syncRovingStops(preferredIndex=this.activeActionIndex,requestedRepair){const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView,request=++this.rovingGeneration;if(!owner||!this.isConnected)return;const roots=this.actionRoots();await Promise.all(roots.map(root=>root.updateComplete)),await Promise.resolve();const buttons=this.actionButtons();if(request!==this.rovingGeneration||!this.isCurrentLifecycle(generation,owner)||buttons.some(button=>!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)))return;const focused=requestedRepair??this.focusedAction,exactIndex=focused?buttons.indexOf(focused.stop):-1,retainedIndex=exactIndex>=0?exactIndex:focused?.action?buttons.findIndex(button=>this.actionForStop(button)===focused.action):-1,targetIndex=retainedIndex>=0?retainedIndex:Math.min(focused?Math.max(0,focused.index):Math.max(0,preferredIndex),Math.max(0,buttons.length-1));this.setRovingStops(buttons,targetIndex);const target=buttons[targetIndex];return focused&&target!==focused.stop&&(applyComposedFocusRepair(focused.repair,target??this.toolbar??null),this.focusedAction===focused&&(this.focusedAction=void 0)),target}hasAuthoredActionTabIndex(button){const lease=this.actionTabIndexLeases.get(button);return lease&&lease.lastManaged!==null&&button.getAttribute("tabindex")===lease.lastManaged?lease.authored!==null:button.hasAttribute("tabindex")}writeActionTabIndex(button,tabIndex){let lease=this.actionTabIndexLeases.get(button);if(lease||(lease={authored:button.getAttribute("tabindex"),lastManaged:null,consumerOwns:!1},this.actionTabIndexLeases.set(button,lease)),lease.consumerOwns||lease.lastManaged!==null&&button.getAttribute("tabindex")!==lease.lastManaged){lease.consumerOwns=!0;return}button.tabIndex=tabIndex,lease.lastManaged=button.getAttribute("tabindex")}releaseActionTabIndex(button){const lease=this.actionTabIndexLeases.get(button);lease&&(!lease.consumerOwns&&button.getAttribute("tabindex")===lease.lastManaged&&(lease.authored===null?button.removeAttribute("tabindex"):button.setAttribute("tabindex",lease.authored)),this.actionTabIndexLeases.delete(button))}releaseManagedActionStops(){for(const button of this.managedActionStops)this.releaseActionTabIndex(button);this.managedActionStops.clear()}setRovingStops(buttons,index){this.actionObserver?.disconnect();for(const previous of this.managedActionStops)buttons.includes(previous)||this.releaseActionTabIndex(previous);this.activeActionIndex=buttons.length===0?0:Math.min(Math.max(0,index),buttons.length-1),buttons.forEach((button,buttonIndex)=>{this.writeActionTabIndex(button,buttonIndex===this.activeActionIndex?0:-1)}),this.managedActionStops=new Set(buttons),this.observeActionChanges(buttons)}observeActionChanges(buttons){this.actionObserver?.disconnect();const Observer=this.ownerDocument.defaultView?.MutationObserver,toolbar=this.toolbar;if(!Observer||!toolbar||!this.isConnected){this.actionObserver=void 0;return}const observer=new Observer(this.onActionMutations),roots=new Set([toolbar,...this.actionRoots()]);for(const button of buttons){let current=button;for(;current&&current!==this;){const root=current.getRootNode();root.nodeType===11&&"host"in root&&roots.add(root),current=composedParentElement(current)}}const options={attributes:!0,attributeOldValue:!0,attributeFilter:["aria-disabled","aria-hidden","contenteditable","controls","disabled","hidden","href","inert","open","role","tabindex","type"],childList:!0,subtree:!0};for(const root of roots)observer.observe(root,options);this.actionObserver=observer}actionPartNames(action){const parts=["action"];switch(action){case"ask":parts.push("action-ask");break;case"quote":parts.push("action-quote");break;case"cite":parts.push("action-cite");break;case"copy":parts.push("action-copy");break}return parts.join(" ")}actionLabel(action){switch(action){case"ask":return this.localize("selectionAsk");case"quote":return this.localize("selectionQuote");case"cite":return this.localize("selectionCite");case"copy":return this.localize(this.copyFailed?"copyFailed":"copy")}}safeRect(rect){const left=finiteRange(rect.left,0,-Number.MAX_VALUE,Number.MAX_VALUE),top=finiteRange(rect.top,0,-Number.MAX_VALUE,Number.MAX_VALUE),width=finiteRange(rect.width,0,0,Number.MAX_VALUE),height=finiteRange(rect.height,0,0,Number.MAX_VALUE),right=finiteAdd(left,width),bottom=finiteAdd(top,height);return{left,top,width,height,right,bottom,inlineCenter:finiteMidpoint(left,right)}}viewportBounds(view){const layoutWidth=finiteRange(view.innerWidth,0,0,Number.MAX_VALUE),layoutHeight=finiteRange(view.innerHeight,0,0,Number.MAX_VALUE),viewport=view.visualViewport,left=finiteRange(viewport?.offsetLeft??0,0,0,Number.MAX_VALUE),top=finiteRange(viewport?.offsetTop??0,0,0,Number.MAX_VALUE),width=finiteRange(viewport?.width??layoutWidth,layoutWidth,0,Number.MAX_VALUE),height=finiteRange(viewport?.height??layoutHeight,layoutHeight,0,Number.MAX_VALUE);return{left,top,width,height,right:finiteAdd(left,width),bottom:finiteAdd(top,height),layoutWidth}}px(value){return`${finiteRange(value,0,-Number.MAX_VALUE,Number.MAX_VALUE)}px`}coordinates(){const view=this.ownerDocument.defaultView,viewport=view?this.viewportBounds(view):{left:0,top:0,width:0,height:0,right:0,bottom:0,layoutWidth:0},fallbackInline=finiteMidpoint(viewport.left,viewport.right),rect=this.rect?this.safeRect(this.rect):{left:fallbackInline,top:viewport.top,width:0,height:0,right:fallbackInline,bottom:viewport.top,inlineCenter:fallbackInline},desiredInline=finiteRange(rect.inlineCenter,viewport.left,viewport.left,viewport.right),block=finiteRange(rect.top,viewport.top,viewport.top,viewport.bottom),logicalInline=this.effectiveDirection==="rtl"?finiteAdd(viewport.layoutWidth,-desiredInline):desiredInline;return{"--_lr-selection-toolbar-inline-start":this.px(logicalInline),"--_lr-selection-toolbar-block-start":this.px(block)}}placementGapPx(){const computed=this.ownerDocument.defaultView?.getComputedStyle(this),publicValue=resolveCssLength(computed?.getPropertyValue("--lr-selection-toolbar-placement-gap").trim()??"",{host:this});if(publicValue!==void 0)return finiteRange(publicValue,DEFAULT_PLACEMENT_GAP_PX,0,Number.MAX_VALUE);const tokenValue=resolveCssLength(computed?.getPropertyValue("--lr-space-s").trim()??"",{host:this});return finiteRange(tokenValue??DEFAULT_PLACEMENT_GAP_PX,DEFAULT_PLACEMENT_GAP_PX,0,Number.MAX_VALUE)}startPositioning(){this.retirePositioning();const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view||!this.isConnected)return;const generation=this.positioningGeneration,update=()=>{generation!==this.positioningGeneration||!this.isConnected||this.ownerDocument.defaultView!==view||this.toolbar!==toolbar||this.updateToolbarPosition()};let resizeFrame;const scheduleResizeUpdate=()=>{resizeFrame===void 0&&(resizeFrame=view.requestAnimationFrame(()=>{resizeFrame=void 0,update()}))},observer=typeof view.ResizeObserver>"u"?void 0:new view.ResizeObserver(scheduleResizeUpdate);observer?.observe(toolbar),view.addEventListener("resize",update),view.visualViewport?.addEventListener("resize",update),view.visualViewport?.addEventListener("scroll",update),update(),this.stopPositioning=()=>{observer?.disconnect(),resizeFrame!==void 0&&view.cancelAnimationFrame(resizeFrame),resizeFrame=void 0,view.removeEventListener("resize",update),view.visualViewport?.removeEventListener("resize",update),view.visualViewport?.removeEventListener("scroll",update)}}retirePositioning(){this.positioningGeneration++;const stop=this.stopPositioning;this.stopPositioning=void 0,stop?.()}render(){if(!this.open||!this.text)return html`${nothing}`;const label=this.accessibleLabel??(this.label||this.localize("selectionToolbarLabel"));return html`<div
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{LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_selectionAsk,LYRA_DEFAULT_selectionCite,LYRA_DEFAULT_selectionQuote,LYRA_DEFAULT_selectionToolbarLabel}from"../../../internal/default-strings.generated.js";const SELECTION_ACTIONS=["ask","quote","cite","copy"],DEFAULT_PLACEMENT_GAP_PX=8;class LyraSelectionToolbar extends LyraElement{constructor(){super(...arguments),this.open=!1,this.text="",this.anchor=null,this.rect=null,this.actions=["ask","quote","cite","copy"],this.label="",this.accessibleLabel=null,this.copyFailed=!1,this.activeActionIndex=0,this.lifecycleGeneration=0,this.positioningGeneration=0,this.rovingGeneration=0,this.managedActionStops=new Set,this.actionTabIndexLeases=new WeakMap,this.onActionsSlotChange=()=>{this.syncRovingStops()},this.onActionMutations=records=>{this.syncRovingStops()},this.onToolbarFocusIn=event=>{const buttons=this.actionButtons(),path=event.composedPath(),index=buttons.findIndex(button=>path.includes(button));if(index<0){this.focusedAction=void 0;return}const origin=path[0],stop=origin?.nodeType===1&&typeof origin.focus=="function"?origin:buttons[index],toolbar=this.toolbar,repair=stop&&toolbar?captureComposedFocusRepair(stop,toolbar):null;this.focusedAction=stop&&repair?{action:this.actionForStop(stop),index,repair,stop}:void 0,this.syncRovingStops(index)},this.containNativeEvent=event=>{event.stopPropagation()},this.onToolbarFocusOut=event=>{const destination=event.relatedTarget;destination&&destination.nodeType===1&&!composedContains(this,destination)&&(this.focusedAction=void 0)},this.onToolbarKeyDown=event=>{const buttons=this.actionButtons();if(buttons.length===0)return;const originIndex=buttons.findIndex(button=>event.composedPath().includes(button)),currentIndex=originIndex>=0?originIndex:this.activeActionIndex,forward=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backward=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft";let next;if(event.key===forward)next=(currentIndex+1)%buttons.length;else if(event.key===backward)next=(currentIndex-1+buttons.length)%buttons.length;else if(event.key==="Home")next=0;else if(event.key==="End")next=buttons.length-1;else return;event.preventDefault(),this.focusedAction=void 0;const generation=this.lifecycleGeneration,owner=this.ownerDocument.defaultView;this.syncRovingStops(next).then(button=>{!button||!this.isCurrentLifecycle(generation,owner)||!button.isConnected||button.ownerDocument!==this.ownerDocument||!this.ownsActionButton(button)||button.focus()})},this.updateToolbarPosition=()=>{const toolbar=this.toolbar,view=this.ownerDocument.defaultView;if(!toolbar||!view)return;const viewport=this.viewportBounds(view),maxEdge=finiteMidpoint(0,Math.min(viewport.width,viewport.height)),gap=finiteRange(this.placementGapPx(),DEFAULT_PLACEMENT_GAP_PX,0,maxEdge),edge=gap,fallbackInline=finiteMidpoint(viewport.left,viewport.right),rect=this.rect?this.safeRect(this.rect):{left:fallbackInline,top:viewport.top,width:0,height:0,right:fallbackInline,bottom:viewport.top,inlineCenter:fallbackInline},doubleEdge=finiteAdd(edge,edge),maxInlineSize=finiteRange(finiteAdd(viewport.width,-doubleEdge),0,0,Number.MAX_VALUE),maxBlockSize=finiteRange(finiteAdd(viewport.height,-doubleEdge),0,0,Number.MAX_VALUE);toolbar.style.setProperty("--_lr-selection-toolbar-max-inline-size",this.px(maxInlineSize)),toolbar.style.setProperty("--_lr-selection-toolbar-max-block-size",this.px(maxBlockSize));const width=finiteRange(toolbar.offsetWidth,0,0,Number.MAX_VALUE),height=finiteRange(toolbar.offsetHeight,0,0,Number.MAX_VALUE),desiredInline=finiteRange(rect.inlineCenter,viewport.left,viewport.left,viewport.right),anchorBlock=finiteRange(rect.top,viewport.top,viewport.top,viewport.bottom),desiredLeft=finiteAdd(desiredInline,-finiteMidpoint(0,width)),minLeft=finiteAdd(viewport.left,edge),maxLeft=Math.max(minLeft,finiteAdd(finiteAdd(viewport.right,-width),-edge)),left=finiteRange(desiredLeft,minLeft,minLeft,maxLeft),above=finiteAdd(finiteAdd(rect.top,-height),-gap),below=finiteAdd(rect.bottom,gap),minTop=finiteAdd(viewport.top,edge),desiredTop=above>=minTop?above:below,maxTop=Math.max(minTop,finiteAdd(finiteAdd(viewport.bottom,-height),-edge)),top=finiteRange(desiredTop,minTop,minTop,maxTop),logicalInline=this.effectiveDirection==="rtl"?finiteAdd(viewport.layoutWidth,-desiredInline):desiredInline;toolbar.style.setProperty("--_lr-selection-toolbar-inline-start",this.px(logicalInline)),toolbar.style.setProperty("--_lr-selection-toolbar-block-start",this.px(anchorBlock)),toolbar.style.setProperty("--_lr-selection-toolbar-inline-shift",this.px(finiteAdd(left,-desiredLeft))),toolbar.style.setProperty("--_lr-selection-toolbar-block-shift",this.px(finiteAdd(top,-finiteAdd(anchorBlock,-height)))),toolbar.toggleAttribute("data-positioned",!0)}}static{this.defaultStrings={...super.defaultStrings,copy:LYRA_DEFAULT_copy,copyFailed:LYRA_DEFAULT_copyFailed,selectionAsk:LYRA_DEFAULT_selectionAsk,selectionCite:LYRA_DEFAULT_selectionCite,selectionQuote:LYRA_DEFAULT_selectionQuote,selectionToolbarLabel:LYRA_DEFAULT_selectionToolbarLabel}}static{this.ownedCollectionProperties=Object.freeze(["anchor","actions"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-selection-action"])}get effectiveActions(){const seen=new Set,actions=[];for(const value of this.actions){if(typeof value!="string"||!SELECTION_ACTIONS.includes(value)||seen.has(value))continue;const action=value;seen.add(action),actions.push(action)}return actions}connectedCallback(){super.connectedCallback(),this.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),(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?.()}render(){if(!this.open||!this.text)return html`${nothing}`;const label=this.accessibleLabel??(this.label||this.localize("selectionToolbarLabel"));return html`<div
2
2
  part="toolbar"
3
3
  role="toolbar"
4
4
  aria-label=${label}
@@ -1,2 +1,2 @@
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,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{formatISO,localDate,monthMatrix,parseISO,resolveFirstDayOfWeek,weekdayLabels}from"../../forms/date-picker/calendar-core.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{styles}from"./calendar.styles.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR,getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{LYRA_DEFAULT_calendarEmpty,LYRA_DEFAULT_calendarLabel,LYRA_DEFAULT_calendarNextMonth,LYRA_DEFAULT_calendarPreviousMonth}from"../../../internal/default-strings.generated.js";const monthStart=date=>localDate(date.getFullYear(),date.getMonth(),1),canonicalEventSnapshots=new WeakMap;function normalizeCalendarEventDate(value){if(typeof value=="string"){const date=parseISO(value);return date?formatISO(date):void 0}if(typeof value=="number"){if(!Number.isFinite(value))return;const date=new Date(value);return Number.isNaN(date.getTime())?void 0:formatISO(date)}if(!(value===null||typeof value!="object"))try{const epoch=Date.prototype.getTime.call(value);return Number.isFinite(epoch)?formatISO(new Date(epoch)):void 0}catch{return}}function isSafeNonArrayObject(value){if(value===null||typeof value!="object")return!1;try{return!Array.isArray(value)}catch{return!1}}function projectCalendarEvent(value){if(!isSafeNonArrayObject(value))return;const date=getOwnDataDescriptor(value,"date"),title=getOwnDataDescriptor(value,"title"),color=getOwnDataDescriptor(value,"color");if(date===MISSING_OWN_DATA_DESCRIPTOR||date===UNSAFE_OWN_DATA_DESCRIPTOR||title===MISSING_OWN_DATA_DESCRIPTOR||title===UNSAFE_OWN_DATA_DESCRIPTOR||typeof title.value!="string"||title.value.trim().length===0)return;const normalizedDate=normalizeCalendarEventDate(date.value);if(normalizedDate)return Object.freeze({source:value,date:normalizedDate,title:title.value,color:color===MISSING_OWN_DATA_DESCRIPTOR||color===UNSAFE_OWN_DATA_DESCRIPTOR||typeof color.value!="string"?void 0:color.value})}function canonicalCalendarEvents(values){const cached=canonicalEventSnapshots.get(values);if(cached)return cached;const projected=[];for(const value of values){const event=projectCalendarEvent(value);event&&projected.push(event)}const snapshot=Object.freeze(projected);return canonicalEventSnapshots.set(values,snapshot),snapshot}class LyraCalendar extends LyraElement{constructor(){super(...arguments),this.events=[],this.value="",this.viewDate=formatISO(new Date).slice(0,7)+"-01",this._view="month",this.firstDayOfWeek="auto",this.accessibleLabel="",this.focusedDate=""}static{this.defaultStrings={...super.defaultStrings,calendarEmpty:LYRA_DEFAULT_calendarEmpty,calendarLabel:LYRA_DEFAULT_calendarLabel,calendarNextMonth:LYRA_DEFAULT_calendarNextMonth,calendarPreviousMonth:LYRA_DEFAULT_calendarPreviousMonth}}static{this.ownedCollectionProperties=Object.freeze(["events"])}static{this.identityCollectionProperties=Object.freeze(["events"])}static{this.styles=[LyraElement.styles,styles]}get view(){return this._view}set view(value){const normalized=value==="agenda"?"agenda":"month",previous=this._view;if(previous===normalized){value!==normalized&&this.requestUpdate("view",previous);return}this._view=normalized,this.requestUpdate("view",previous)}get viewStart(){const parsed=parseISO(this.viewDate);return monthStart(parsed||new Date)}get normalizedFirstDayOfWeek(){return resolveFirstDayOfWeek(this.firstDayOfWeek,this.effectiveLocale)}changeMonth(delta){const next=localDate(this.viewStart.getFullYear(),this.viewStart.getMonth()+delta,1);this.viewDate=formatISO(next),this.emit("lr-view-change",{viewDate:this.viewDate})}selectDate(date){this.value=date,this.focusedDate=date,this.emit("lr-date-select",{date})}get effectiveEvents(){return canonicalCalendarEvents(this.events)}bucketEventsByDate(events){const buckets=new Map;for(const event of events){const bucket=buckets.get(event.date);bucket?bucket.push(event):buckets.set(event.date,[event])}return buckets}weeks(){const start=this.viewStart;return monthMatrix(start.getFullYear(),start.getMonth(),this.normalizedFirstDayOfWeek)}gridBounds(weeks){return[weeks[0][0],weeks[weeks.length-1][6]]}onDayKeyDown(event,date){let delta=0;if(event.key==="ArrowLeft")delta=this.effectiveDirection==="rtl"?1:-1;else if(event.key==="ArrowRight")delta=this.effectiveDirection==="rtl"?-1:1;else if(event.key==="ArrowUp")delta=-7;else if(event.key==="ArrowDown")delta=7;else if(event.key==="Enter"||event.key===" "){event.preventDefault(),this.selectDate(formatISO(date));return}else return;event.preventDefault();const next=new Date(date);next.setDate(next.getDate()+delta);const[gridFirst,gridLast]=this.gridBounds(this.weeks());(next<gridFirst||next>gridLast)&&(this.viewDate=formatISO(monthStart(next)),this.emit("lr-view-change",{viewDate:this.viewDate})),this.focusedDate=formatISO(next),queueMicrotask(()=>this.renderRoot.querySelector(`[data-date="${this.focusedDate}"]`)?.focus())}weekdays(){return weekdayLabels(this.normalizedFirstDayOfWeek,"short",this.effectiveLocale)}updated(changed){super.updated(changed),this.getAttribute("view")!==this._view&&this.setAttribute("view",this._view)}render(){const start=this.viewStart,weeks=this.weeks(),monthTitle=getDateTimeFormat(this.effectiveLocale,{month:"long",year:"numeric"}).format(start),today=formatISO(new Date),label=hostAriaLabel(this)??this.localize("calendarLabel"),dayLabelFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"full"}),agendaDateFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"medium"}),dayNumberFmt=getNumberFormat(this.effectiveLocale),events=this.effectiveEvents,agenda=events.filter(event=>event.date.startsWith(formatISO(start).slice(0,7))).sort((a,b)=>a.date<b.date?-1:a.date>b.date?1:0),eventsByDate=this.view==="month"?this.bucketEventsByDate(events):void 0,[gridFirst,gridLast]=this.gridBounds(weeks),rawAnchor=this.focusedDate||this.value||today,rawAnchorDate=parseISO(rawAnchor),anchor=rawAnchorDate&&rawAnchorDate>=gridFirst&&rawAnchorDate<=gridLast?rawAnchor:formatISO(start);return html`<section aria-label=${label}><header part="header navigation"><button part="nav previous-button" type="button" aria-label=${this.localize("calendarPreviousMonth")} @click=${()=>this.changeMonth(-1)}><span part="nav-glyph" aria-hidden="true">‹</span></button><span part="title">${monthTitle}</span><button part="nav next-button" type="button" aria-label=${this.localize("calendarNextMonth")} @click=${()=>this.changeMonth(1)}><span part="nav-glyph" aria-hidden="true">›</span></button></header>
2
- ${this.view==="agenda"?html`<div part="agenda">${agenda.length?agenda.map(event=>{const date=parseISO(event.date),bg=event.color?sanitizeCssColor(event.color):void 0;return html`<button part="agenda-event" type="button" style=${styleMap(bg?{"--_lr-calendar-agenda-event-background":bg,"--_lr-calendar-agenda-event-foreground":"var(--lr-color-on-brand)"}:{})} @click=${()=>this.emit("lr-event-select",{event:event.source})}><strong>${date?agendaDateFmt.format(date):event.date}</strong> ${event.title}</button>`}):html`<p>${this.localize("calendarEmpty")}</p>`}</div>`:html`<div part="weekdays">${this.weekdays().map(day=>html`<span part="weekday">${day}</span>`)}</div><div part="grid" role="grid" aria-label=${monthTitle}>${weeks.map(week=>html`<div part="week" role="row">${week.map(date=>{const dateIso=formatISO(date),dayEvents=eventsByDate?.get(dateIso)??[];return html`<div part="day" role="gridcell" data-date=${dateIso} data-outside=${date.getMonth()!==start.getMonth()?"true":"false"} data-today=${dateIso===today?"true":"false"} data-selected=${dateIso===this.value?"true":"false"} aria-selected=${dateIso===this.value?"true":"false"} aria-label=${dayLabelFmt.format(date)} tabindex=${dateIso===anchor?"0":"-1"} @click=${event=>{(event.target===event.currentTarget||event.target.getAttribute("part")==="date")&&this.selectDate(dateIso)}} @keydown=${event=>{event.target===event.currentTarget&&this.onDayKeyDown(event,date)}}><span part="date">${dayNumberFmt.format(date.getDate())}</span>${dayEvents.map(item=>{const bg=item.color?sanitizeCssColor(item.color):void 0;return html`<button part="event" type="button" style=${styleMap(bg?{backgroundColor:bg}:{})} @click=${event=>{event.stopPropagation(),this.emit("lr-event-select",{event:item.source})}}>${item.title}</button>`})}</div>`})}</div>`)}</div>`}</section>`}}__decorate([property({attribute:!1})],LyraCalendar.prototype,"events",void 0),__decorate([property()],LyraCalendar.prototype,"value",void 0),__decorate([property({attribute:"view-date"})],LyraCalendar.prototype,"viewDate",void 0),__decorate([property({reflect:!0})],LyraCalendar.prototype,"view",null),__decorate([property({attribute:"first-day-of-week"})],LyraCalendar.prototype,"firstDayOfWeek",void 0),__decorate([property({attribute:"aria-label"})],LyraCalendar.prototype,"accessibleLabel",void 0),__decorate([state()],LyraCalendar.prototype,"focusedDate",void 0);export{LyraCalendar};
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{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{formatISO,localDate,monthMatrix,parseISO,resolveFirstDayOfWeek,weekdayLabels}from"../../forms/date-picker/calendar-core.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{styles}from"./calendar.styles.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR,getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{LYRA_DEFAULT_calendarEmpty,LYRA_DEFAULT_calendarLabel,LYRA_DEFAULT_calendarNextMonth,LYRA_DEFAULT_calendarPreviousMonth}from"../../../internal/default-strings.generated.js";const monthStart=date=>localDate(date.getFullYear(),date.getMonth(),1),canonicalEventSnapshots=new WeakMap;function normalizeCalendarEventDate(value){if(typeof value=="string"){const date=parseISO(value);return date?formatISO(date):void 0}if(typeof value=="number"){if(!Number.isFinite(value))return;const date=new Date(value);return Number.isNaN(date.getTime())?void 0:formatISO(date)}if(!(value===null||typeof value!="object"))try{const epoch=Date.prototype.getTime.call(value);return Number.isFinite(epoch)?formatISO(new Date(epoch)):void 0}catch{return}}function isSafeNonArrayObject(value){if(value===null||typeof value!="object")return!1;try{return!Array.isArray(value)}catch{return!1}}function projectCalendarEvent(value){if(!isSafeNonArrayObject(value))return;const date=getOwnDataDescriptor(value,"date"),title=getOwnDataDescriptor(value,"title"),color=getOwnDataDescriptor(value,"color");if(date===MISSING_OWN_DATA_DESCRIPTOR||date===UNSAFE_OWN_DATA_DESCRIPTOR||title===MISSING_OWN_DATA_DESCRIPTOR||title===UNSAFE_OWN_DATA_DESCRIPTOR||typeof title.value!="string"||title.value.trim().length===0)return;const normalizedDate=normalizeCalendarEventDate(date.value);if(normalizedDate)return Object.freeze({source:value,date:normalizedDate,title:title.value,color:color===MISSING_OWN_DATA_DESCRIPTOR||color===UNSAFE_OWN_DATA_DESCRIPTOR||typeof color.value!="string"?void 0:color.value})}function canonicalCalendarEvents(values){const cached=canonicalEventSnapshots.get(values);if(cached)return cached;const projected=[];for(const value of values){const event=projectCalendarEvent(value);event&&projected.push(event)}const snapshot=Object.freeze(projected);return canonicalEventSnapshots.set(values,snapshot),snapshot}class LyraCalendar extends LyraElement{constructor(){super(...arguments),this.events=[],this.value="",this.viewDate=formatISO(new Date).slice(0,7)+"-01",this._view="month",this.firstDayOfWeek="auto",this.accessibleLabel="",this.focusedDate=""}static{this.defaultStrings={...super.defaultStrings,calendarEmpty:LYRA_DEFAULT_calendarEmpty,calendarLabel:LYRA_DEFAULT_calendarLabel,calendarNextMonth:LYRA_DEFAULT_calendarNextMonth,calendarPreviousMonth:LYRA_DEFAULT_calendarPreviousMonth}}static{this.ownedCollectionProperties=Object.freeze(["events"])}static{this.identityCollectionProperties=Object.freeze(["events"])}static{this.styles=[LyraElement.styles,styles]}get view(){return this._view}set view(value){const normalized=value==="agenda"?"agenda":"month",previous=this._view;if(previous===normalized){value!==normalized&&this.requestUpdate("view",previous);return}this._view=normalized,this.requestUpdate("view",previous)}get viewStart(){const parsed=parseISO(this.viewDate);return monthStart(parsed||new Date)}get normalizedFirstDayOfWeek(){return resolveFirstDayOfWeek(this.firstDayOfWeek,this.effectiveLocale)}changeMonth(delta){const next=localDate(this.viewStart.getFullYear(),this.viewStart.getMonth()+delta,1);this.viewDate=formatISO(next),this.emit("lr-view-change",{viewDate:this.viewDate})}selectDate(date){this.value=date,this.focusedDate=date,this.emit("lr-date-select",{date})}get effectiveEvents(){return canonicalCalendarEvents(this.events)}bucketEventsByDate(events){const buckets=new Map;for(const event of events){const bucket=buckets.get(event.date);bucket?bucket.push(event):buckets.set(event.date,[event])}return buckets}weeks(){const start=this.viewStart;return monthMatrix(start.getFullYear(),start.getMonth(),this.normalizedFirstDayOfWeek)}gridBounds(weeks){return[weeks[0][0],weeks[weeks.length-1][6]]}onDayKeyDown(event,date){let delta=0;if(event.key==="ArrowLeft")delta=this.effectiveDirection==="rtl"?1:-1;else if(event.key==="ArrowRight")delta=this.effectiveDirection==="rtl"?-1:1;else if(event.key==="ArrowUp")delta=-7;else if(event.key==="ArrowDown")delta=7;else if(event.key==="Enter"||event.key===" "){event.preventDefault(),this.selectDate(formatISO(date));return}else return;event.preventDefault();const next=new Date(date);next.setDate(next.getDate()+delta);const[gridFirst,gridLast]=this.gridBounds(this.weeks());(next<gridFirst||next>gridLast)&&(this.viewDate=formatISO(monthStart(next)),this.emit("lr-view-change",{viewDate:this.viewDate})),this.focusedDate=formatISO(next),queueMicrotask(()=>this.renderRoot.querySelector(`[data-date="${this.focusedDate}"]`)?.focus())}weekdays(){return weekdayLabels(this.normalizedFirstDayOfWeek,"short",this.effectiveLocale)}updated(changed){super.updated(changed),this.getAttribute("view")!==this._view&&this.setAttribute("view",this._view)}render(){const start=this.viewStart,weeks=this.weeks(),monthTitle=getDateTimeFormat(this.effectiveLocale,{month:"long",year:"numeric"}).format(start),today=formatISO(new Date),label=hostAriaLabel(this)??this.localize("calendarLabel"),dayLabelFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"full"}),agendaDateFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"medium"}),dayNumberFmt=getNumberFormat(this.effectiveLocale),events=this.effectiveEvents,agenda=events.filter(event=>event.date.startsWith(formatISO(start).slice(0,7))).sort((a,b)=>a.date<b.date?-1:a.date>b.date?1:0),eventsByDate=this.view==="month"?this.bucketEventsByDate(events):void 0,[gridFirst,gridLast]=this.gridBounds(weeks),rawAnchor=this.focusedDate||this.value||today,rawAnchorDate=parseISO(rawAnchor),anchor=rawAnchorDate&&rawAnchorDate>=gridFirst&&rawAnchorDate<=gridLast?rawAnchor:formatISO(start);return html`<section aria-label=${label}><header part="header navigation"><button part="nav previous-button" type="button" aria-label=${this.localize("calendarPreviousMonth")} @click=${()=>this.changeMonth(-1)}><span part="nav-glyph" aria-hidden="true">‹</span></button><span part="title">${monthTitle}</span><button part="nav next-button" type="button" aria-label=${this.localize("calendarNextMonth")} @click=${()=>this.changeMonth(1)}><span part="nav-glyph" aria-hidden="true">›</span></button></header>
2
+ ${this.view==="agenda"?html`<div part="agenda">${agenda.length?agenda.map(event=>{const date=parseISO(event.date),bg=event.color?sanitizeCssColor(event.color):void 0;return html`<button part="agenda-event" type="button" style=${styleMap(bg?{"--_lr-calendar-agenda-event-background":bg,"--_lr-calendar-agenda-event-foreground":"var(--lr-color-on-brand)"}:{})} @click=${()=>this.emit("lr-event-select",{event:event.source})}><strong>${date?agendaDateFmt.format(date):event.date}</strong> ${event.title}</button>`}):html`<p>${this.localize("calendarEmpty")}</p>`}</div>`:html`<div part="weekdays">${this.weekdays().map(day=>html`<span part="weekday">${day}</span>`)}</div><div part="grid" role="grid" aria-label=${monthTitle}>${weeks.map(week=>html`<div part="week" role="row">${week.map(date=>{const dateIso=formatISO(date),dayEvents=eventsByDate?.get(dateIso)??[];return html`<div part="day" role="gridcell" data-date=${dateIso} data-outside=${date.getMonth()!==start.getMonth()?"true":"false"} data-today=${dateIso===today?"true":"false"} data-selected=${dateIso===this.value?"true":"false"} aria-selected=${dateIso===this.value?"true":"false"} aria-current=${dateIso===today?"date":nothing} aria-label=${dayLabelFmt.format(date)} tabindex=${dateIso===anchor?"0":"-1"} @click=${event=>{(event.target===event.currentTarget||event.target.getAttribute("part")==="date")&&this.selectDate(dateIso)}} @keydown=${event=>{event.target===event.currentTarget&&this.onDayKeyDown(event,date)}}><span part="date">${dayNumberFmt.format(date.getDate())}</span>${dayEvents.map(item=>{const bg=item.color?sanitizeCssColor(item.color):void 0;return html`<button part="event" type="button" style=${styleMap(bg?{backgroundColor:bg}:{})} @click=${event=>{event.stopPropagation(),this.emit("lr-event-select",{event:item.source})}}>${item.title}</button>`})}</div>`})}</div>`)}</div>`}</section>`}}__decorate([property({attribute:!1})],LyraCalendar.prototype,"events",void 0),__decorate([property()],LyraCalendar.prototype,"value",void 0),__decorate([property({attribute:"view-date"})],LyraCalendar.prototype,"viewDate",void 0),__decorate([property({reflect:!0})],LyraCalendar.prototype,"view",null),__decorate([property({attribute:"first-day-of-week"})],LyraCalendar.prototype,"firstDayOfWeek",void 0),__decorate([property({attribute:"aria-label"})],LyraCalendar.prototype,"accessibleLabel",void 0),__decorate([state()],LyraCalendar.prototype,"focusedDate",void 0);export{LyraCalendar};
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{inline-size:100%;min-inline-size:0;display:block}:host([shape=ring]){inline-size:var(--lr-size-8em);block-size:var(--lr-size-8em);display:inline-block}[part=base]{gap:var(--lr-space-xs);flex-direction:column;display:flex}:host([shape=ring]) [part=base]{block-size:100%;inline-size:100%}[part=label]{overflow-wrap:anywhere;min-inline-size:0;font-size:var(--lr-font-size-xs);color:var(--lr-color-text-quiet);font-family:var(--lr-font)}[part=track]{block-size:var(--lr-size-0-5rem);border-radius:calc(var(--lr-radius) * .5);background:color-mix(in srgb, var(--lr-color-border) 30%, transparent);align-items:stretch;display:flex;position:relative;overflow:hidden}[part=segment]{background:var(--lr-color-border);block-size:100%;transition:flex-basis var(--lr-transition-base);flex:none;display:block}[part=segment]:not(:first-of-type){border-inline-start:var(--lr-border-width-thin) solid var(--lr-color-surface)}[part=segment][data-tone=brand]{background:var(--lr-color-brand)}[part=segment][data-tone=success]{background:var(--lr-color-success)}[part=segment][data-tone=warning]{background:var(--lr-color-warning)}[part=segment][data-tone=danger]{background:var(--lr-color-danger)}[part=segment][style*=--lr-context-meter-segment-color]{background:var(--lr-context-meter-segment-color)}[part=legend]{align-items:center;gap:var(--lr-space-2xs) var(--lr-space-s);font-size:var(--lr-font-size-xs);color:var(--lr-color-text-quiet);flex-wrap:wrap;margin-block-start:var(--lr-space-xs);display:flex}[part=legend-item]{align-items:center;gap:var(--lr-space-2xs);min-inline-size:0;display:inline-flex}[part=legend-swatch]{inline-size:var(--lr-context-meter-legend-swatch-size,var(--lr-size-0-625rem));block-size:var(--lr-context-meter-legend-swatch-size,var(--lr-size-0-625rem));border-radius:var(--lr-radius-xs);background:var(--lr-color-border);flex:none}[part=legend-swatch][data-tone=brand]{background:var(--lr-color-brand)}[part=legend-swatch][data-tone=success]{background:var(--lr-color-success)}[part=legend-swatch][data-tone=warning]{background:var(--lr-color-warning)}[part=legend-swatch][data-tone=danger]{background:var(--lr-color-danger)}[part=legend-swatch][style*=--lr-context-meter-segment-color]{background:var(--lr-context-meter-segment-color)}[part=legend-label]{overflow-wrap:anywhere;min-inline-size:0}:host([shape=ring][show-legend]){block-size:auto}:host([shape=ring][show-legend]) svg[part=base]{inline-size:var(--lr-size-8em);block-size:var(--lr-size-8em)}:host([shape=ring]) svg[part=base]{display:block;overflow:visible}:host([shape=ring]) [part=track]{fill:none;stroke:color-mix(in srgb, var(--lr-color-border) 30%, transparent)}:host([shape=ring]) [part=segment]{fill:none;stroke:var(--lr-color-border);stroke-linecap:butt;transition:stroke-dasharray var(--lr-transition-base), stroke-dashoffset var(--lr-transition-base)}:host([shape=ring]) [part=segment][data-tone=brand]{stroke:var(--lr-color-brand)}:host([shape=ring]) [part=segment][data-tone=success]{stroke:var(--lr-color-success)}:host([shape=ring]) [part=segment][data-tone=warning]{stroke:var(--lr-color-warning)}:host([shape=ring]) [part=segment][data-tone=danger]{stroke:var(--lr-color-danger)}:host([shape=ring]) [part=segment][style*=--lr-context-meter-segment-color]{stroke:var(--lr-context-meter-segment-color)}:host([shape=ring]) [part=label]{overflow:hidden}:host([shape=ring]) .ring-label{overflow-wrap:anywhere;block-size:100%;inline-size:100%;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-2xs);line-height:var(--lr-line-height-compact);text-align:center;text-transform:uppercase;justify-content:center;align-items:center;display:flex;overflow:hidden}@media (forced-colors:active){[part=segment],[part=legend-swatch]{forced-color-adjust:none;border:var(--lr-border-width-thin) solid Canvas;background:canvastext}[part=segment][data-tone=success],[part=legend-swatch][data-tone=success]{border-style:dashed}[part=segment][data-tone=warning],[part=legend-swatch][data-tone=warning]{border-style:dotted}[part=segment][data-tone=danger],[part=legend-swatch][data-tone=danger]{border-style:double}:host([shape=ring]) [part=segment]{fill:none;stroke:canvastext}:host([shape=ring]) [part=segment][data-tone=success]{stroke-dasharray:8 3}:host([shape=ring]) [part=segment][data-tone=warning]{stroke-dasharray:2 3}:host([shape=ring]) [part=segment][data-tone=danger]{stroke-dasharray:8 2 2 2}}@media (prefers-reduced-motion:reduce){[part=segment]{transition:none!important}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{inline-size:100%;min-inline-size:0;display:block}:host([shape=ring]){inline-size:var(--lr-size-8em);block-size:var(--lr-size-8em);display:inline-block}[part=base]{gap:var(--lr-space-xs);flex-direction:column;display:flex}:host([shape=ring]) [part=base]{block-size:100%;inline-size:100%}[part=label]{overflow-wrap:anywhere;min-inline-size:0;font-size:var(--lr-font-size-xs);color:var(--lr-color-text-quiet);font-family:var(--lr-font)}[part=track]{block-size:var(--lr-size-0-5rem);border-radius:calc(var(--lr-radius) * .5);background:color-mix(in srgb, var(--lr-color-border) 30%, transparent);align-items:stretch;display:flex;position:relative;overflow:hidden}[part=segment]{min-inline-size:calc(var(--lr-border-width-thin) * 2);background:var(--lr-color-border);block-size:100%;transition:flex-basis var(--lr-transition-base);flex:none;display:block}[part=segment]:not(:first-of-type){border-inline-start:var(--lr-border-width-thin) solid var(--lr-color-surface)}[part=segment][data-tone=brand]{background:var(--lr-color-brand)}[part=segment][data-tone=success]{background:var(--lr-color-success)}[part=segment][data-tone=warning]{background:var(--lr-color-warning)}[part=segment][data-tone=danger]{background:var(--lr-color-danger)}[part=segment][style*=--lr-context-meter-segment-color]{background:var(--lr-context-meter-segment-color)}[part=legend]{align-items:center;gap:var(--lr-space-2xs) var(--lr-space-s);font-size:var(--lr-font-size-xs);color:var(--lr-color-text-quiet);flex-wrap:wrap;margin-block-start:var(--lr-space-xs);display:flex}[part=legend-item]{align-items:center;gap:var(--lr-space-2xs);min-inline-size:0;display:inline-flex}[part=legend-swatch]{inline-size:var(--lr-context-meter-legend-swatch-size,var(--lr-size-0-625rem));block-size:var(--lr-context-meter-legend-swatch-size,var(--lr-size-0-625rem));border-radius:var(--lr-radius-xs);background:var(--lr-color-border);flex:none}[part=legend-swatch][data-tone=brand]{background:var(--lr-color-brand)}[part=legend-swatch][data-tone=success]{background:var(--lr-color-success)}[part=legend-swatch][data-tone=warning]{background:var(--lr-color-warning)}[part=legend-swatch][data-tone=danger]{background:var(--lr-color-danger)}[part=legend-swatch][style*=--lr-context-meter-segment-color]{background:var(--lr-context-meter-segment-color)}[part=legend-label]{overflow-wrap:anywhere;min-inline-size:0}:host([shape=ring][show-legend]){block-size:auto}:host([shape=ring][show-legend]) svg[part=base]{inline-size:var(--lr-size-8em);block-size:var(--lr-size-8em)}:host([shape=ring]) svg[part=base]{display:block;overflow:visible}:host([shape=ring]) [part=track]{fill:none;stroke:color-mix(in srgb, var(--lr-color-border) 30%, transparent)}:host([shape=ring]) [part=segment]{fill:none;stroke:var(--lr-color-border);stroke-linecap:butt;transition:stroke-dasharray var(--lr-transition-base), stroke-dashoffset var(--lr-transition-base)}:host([shape=ring]) [part=segment][data-tone=brand]{stroke:var(--lr-color-brand)}:host([shape=ring]) [part=segment][data-tone=success]{stroke:var(--lr-color-success)}:host([shape=ring]) [part=segment][data-tone=warning]{stroke:var(--lr-color-warning)}:host([shape=ring]) [part=segment][data-tone=danger]{stroke:var(--lr-color-danger)}:host([shape=ring]) [part=segment][style*=--lr-context-meter-segment-color]{stroke:var(--lr-context-meter-segment-color)}:host([shape=ring]) [part=label]{overflow:hidden}:host([shape=ring]) .ring-label{overflow-wrap:anywhere;block-size:100%;inline-size:100%;color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-2xs);line-height:var(--lr-line-height-compact);text-align:center;text-transform:uppercase;justify-content:center;align-items:center;display:flex;overflow:hidden}@media (forced-colors:active){[part=segment],[part=legend-swatch]{forced-color-adjust:none;border:var(--lr-border-width-thin) solid Canvas;background:canvastext}[part=segment][data-tone=success],[part=legend-swatch][data-tone=success]{border-style:dashed}[part=segment][data-tone=warning],[part=legend-swatch][data-tone=warning]{border-style:dotted}[part=segment][data-tone=danger],[part=legend-swatch][data-tone=danger]{border-style:double}:host([shape=ring]) [part=segment]{fill:none;stroke:canvastext}:host([shape=ring]) [part=segment][data-tone=success]{stroke-dasharray:8 3}:host([shape=ring]) [part=segment][data-tone=warning]{stroke-dasharray:2 3}:host([shape=ring]) [part=segment][data-tone=danger]{stroke-dasharray:8 2 2 2}}@media (prefers-reduced-motion:reduce){[part=segment]{transition:none!important}}`;export{styles};
@@ -19,7 +19,13 @@ export type DataGridSize=Exclude<LyraSize,'2xs'>;
19
19
  * direction. Both spellings are permanent and interchangeable -- neither is deprecated. */
20
20
  export type DataGridPinSide='left'|'right'|'start'|'end'|false;export type DataGridSortAlgorithm='alphanumeric'|'alphanumericCaseSensitive'|'text'|'textCaseSensitive'|'datetime'|'basic';export type DataGridFilterType='text'|'equals'|'number-range'|'date-range'|'set'|'includes-any'|'includes-all';export type DataGridAggregation<Row=unknown> ='sum'|'min'|'max'|'mean'|'median'|'count'|'unique'|'uniqueCount'|'extent'|((rows:readonly Row[],values:readonly unknown[])=>unknown);
21
21
  /** One column in a data grid. `field` accepts dot-separated property paths. */
22
- export interface DataGridColumn<Row=Record<string,unknown>>{readonly id?:string;readonly field?:string;readonly label?:string;readonly align?:'left'|'center'|'right'|'start'|'end';readonly width?:number;readonly minWidth?:number;readonly maxWidth?:number;readonly flex?:number;readonly formatter?:(value:unknown,row:Row)=>string|TemplateResult|Node|unknown;readonly value?:(row:Row)=>unknown;readonly sortable?:boolean;readonly sortFn?:DataGridSortAlgorithm;readonly comparator?:(left:unknown,right:unknown,leftRow:Row,rightRow:Row)=>number;readonly sortDescFirst?:boolean;readonly sortUndefined?:'first'|'last'|1| -1;readonly searchable?:boolean;readonly filterable?:boolean;readonly filterType?:DataGridFilterType;readonly filterFn?:(value:unknown,filter:unknown,row:Row)=>boolean;readonly hidden?:boolean;readonly hideable?:boolean;readonly resizable?:boolean;readonly movable?:boolean;readonly pinnable?:boolean;readonly pinned?:DataGridPinSide;readonly footer?:string|((rows:readonly Row[])=>unknown);readonly aggregation?:DataGridAggregation<Row>;readonly aggregatedFormatter?:(value:unknown,rows:readonly Row[])=>string|TemplateResult|Node|unknown;}export interface DataGridSort{readonly id:string;readonly desc:boolean;}
22
+ export interface DataGridColumn<Row=Record<string,unknown>>{readonly id?:string;readonly field?:string;readonly label?:string;readonly align?:'left'|'center'|'right'|'start'|'end';readonly width?:number;readonly minWidth?:number;readonly maxWidth?:number;readonly flex?:number;readonly formatter?:(value:unknown,row:Row)=>string|TemplateResult|Node|unknown;
23
+ /** Applied as the generated cell's native `title`, symmetrical with `<lr-table>`'s
24
+ * `columns[].cellTitle` -- e.g. the untruncated text behind an ellipsized cell, or a formatted
25
+ * timestamp behind a relative one. Returning `undefined` (or an empty string) omits the
26
+ * attribute entirely rather than rendering `title=""`, which would suppress an ancestor's own
27
+ * tooltip. */
28
+ readonly cellTitle?:(row:Row)=>string|undefined;readonly value?:(row:Row)=>unknown;readonly sortable?:boolean;readonly sortFn?:DataGridSortAlgorithm;readonly comparator?:(left:unknown,right:unknown,leftRow:Row,rightRow:Row)=>number;readonly sortDescFirst?:boolean;readonly sortUndefined?:'first'|'last'|1| -1;readonly searchable?:boolean;readonly filterable?:boolean;readonly filterType?:DataGridFilterType;readonly filterFn?:(value:unknown,filter:unknown,row:Row)=>boolean;readonly hidden?:boolean;readonly hideable?:boolean;readonly resizable?:boolean;readonly movable?:boolean;readonly pinnable?:boolean;readonly pinned?:DataGridPinSide;readonly footer?:string|((rows:readonly Row[])=>unknown);readonly aggregation?:DataGridAggregation<Row>;readonly aggregatedFormatter?:(value:unknown,rows:readonly Row[])=>string|TemplateResult|Node|unknown;}export interface DataGridSort{readonly id:string;readonly desc:boolean;}
23
29
  /** Public sorting-state spelling used by the mirrored data-grid contract. */
24
30
  export type SortingState=readonly DataGridSort[];
25
31
  /** Additive descriptive alias retained for callers that prefer a component-qualified name. */
@@ -41,4 +47,4 @@ readonly key:DataGridKey;readonly row:Row;}
41
47
  /** A user-expanded or collapsed client-side group. */
42
48
  export interface DataGridGroupDetail<Row=Record<string,unknown>>{readonly key:string;readonly columnId:string;readonly value:unknown;readonly rows:readonly Row[];}export interface DataGridSelectionDetail<Row=Record<string,unknown>>{readonly selectedRowKeys:readonly DataGridKey[];
43
49
  /** Mirrored compatibility alias for `selectedRowKeys`. */
44
- readonly selectedKeys:readonly DataGridKey[];readonly selectedRows:readonly Row[];}export interface LyraDataGridEventMap<Row=Record<string,unknown>>{focus:FocusEvent;blur:FocusEvent;request:CustomEvent<LyraEventDetailSnapshot<DataGridRequest>>;'lr-cell-click':CustomEvent<DataGridCellDetail<Row>>;'lr-cell-contextmenu':CustomEvent<DataGridCellContextMenuDetail<Row>>;'lr-column-move':CustomEvent<LyraEventDetailSnapshot<DataGridColumnMoveDetail>>;'lr-column-pin':CustomEvent<DataGridColumnPinDetail>;'lr-column-resize':CustomEvent<DataGridColumnResizeDetail>;'lr-column-visibility-change':CustomEvent<DataGridColumnVisibilityDetail>;'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;'lr-data-error':CustomEvent<LyraEventDetailSnapshot<DataGridDataErrorDetail>>;'lr-filter-change':CustomEvent<Readonly<{filters:readonly DataGridFilter[];}>>;'lr-group-collapse':CustomEvent<Readonly<DataGridGroupDetail<Row>>>;'lr-group-expand':CustomEvent<Readonly<DataGridGroupDetail<Row>>>;'lr-page-change':CustomEvent<DataGridPageDetail>;'lr-row-collapse':CustomEvent<DataGridRowDetail<Row>>;'lr-row-expand':CustomEvent<DataGridRowDetail<Row>>;'lr-row-select':CustomEvent<Readonly<DataGridSelectionDetail<Row>>>;'lr-sort-change':CustomEvent<Readonly<{sort:DataGridSortingState;}>>;'lr-error':CustomEvent<null>;}
50
+ readonly selectedKeys:readonly DataGridKey[];readonly selectedRows:readonly Row[];}export interface LyraDataGridEventMap<Row=Record<string,unknown>>{focus:FocusEvent;blur:FocusEvent;request:CustomEvent<LyraEventDetailSnapshot<DataGridRequest>>;'lr-cell-click':CustomEvent<DataGridCellDetail<Row>>;'lr-cell-contextmenu':CustomEvent<DataGridCellContextMenuDetail<Row>>;'lr-column-move':CustomEvent<LyraEventDetailSnapshot<DataGridColumnMoveDetail>>;'lr-column-pin':CustomEvent<DataGridColumnPinDetail>;'lr-column-resize':CustomEvent<DataGridColumnResizeDetail>;'lr-column-visibility-change':CustomEvent<DataGridColumnVisibilityDetail>;'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;'lr-data-error':CustomEvent<LyraEventDetailSnapshot<DataGridDataErrorDetail>>;'lr-filter-change':CustomEvent<Readonly<{filters:readonly DataGridFilter[];}>>;'lr-group-collapse':CustomEvent<Readonly<DataGridGroupDetail<Row>>>;'lr-group-expand':CustomEvent<Readonly<DataGridGroupDetail<Row>>>;'lr-page-change':CustomEvent<DataGridPageDetail>;'lr-row-collapse':CustomEvent<DataGridRowDetail<Row>>;'lr-row-expand':CustomEvent<DataGridRowDetail<Row>>;'lr-row-select':CustomEvent<Readonly<DataGridSelectionDetail<Row>>>;'lr-sort-request':CustomEvent<Readonly<{sort:DataGridSortingState;}>>;'lr-sort-change':CustomEvent<Readonly<{sort:DataGridSortingState;}>>;'lr-error':CustomEvent<null>;}
@@ -58,7 +58,11 @@ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from
58
58
  * `rowKey` plus the mirrored `key` compatibility alias.
59
59
  * @event lr-row-select - Fired after a user changes selection with canonical `selectedRowKeys`
60
60
  * plus the mirrored `selectedKeys` compatibility alias.
61
- * @event lr-sort-change - Fired after a user changes sorting.
61
+ * @event lr-sort-request - Cancelable sort proposal, fired before `sort` commits. Frozen readonly
62
+ * `detail: { sort }`. Vetoing it leaves `sort` unchanged and suppresses `lr-sort-change`.
63
+ * Mirrors `<lr-table>`'s identical `lr-sort-request`/`lr-sort` veto-then-commit contract.
64
+ * @event lr-sort-change - Fired after a user changes sorting, unless a preceding `lr-sort-request`
65
+ * was vetoed.
62
66
  * @event focus - Native focus relayed once from the toolbar search or active column-filter input.
63
67
  * @event blur - Native blur relayed once from the toolbar search or active column-filter input.
64
68
  * @csspart body - The sole vertical and horizontal scroll viewport; header and footer columns
@@ -219,6 +223,15 @@ searchFn:((value:unknown,term:string,row:Row)=>boolean)|null;
219
223
  searchTerm:string;
220
224
  /** Row-selection behavior. A bare attribute means `multiple`. */
221
225
  selectable:DataGridSelectable;
226
+ /** Alias of {@link selectable} using `<lr-table>`'s `selectionMode`/`selection-mode` spelling,
227
+ * so a consumer migrating between the two grid components doesn't need to remember that they
228
+ * chose different property names for the same row-selection concept. `selectable` remains the
229
+ * canonical spelling (mirrored from `<wa-data-grid>`, so it is never renamed); reading and
230
+ * writing `selectionMode` reads and writes `selectable` directly through the same underlying
231
+ * state -- there is no separate value to fall out of sync. The bare `''` attribute shorthand
232
+ * for `'multiple'` (`selectable`'s own convenience form) normalizes to `'multiple'` when read
233
+ * back through this alias. */
234
+ get selectionMode():'none'|'single'|'multiple';set selectionMode(value:'none'|'single'|'multiple');
222
235
  /** Callback disabling selection for individual rows. */
223
236
  selectableRows:((row:Row)=>boolean)|null;private _selectedRowKeys;
224
237
  /** Clone-owned controlled selected row keys. */
@@ -226,7 +239,7 @@ get selectedRowKeys():readonly DataGridKey[];set selectedRowKeys(value:readonly
226
239
  /** Mirrored compatibility alias for `selectedRowKeys`. */
227
240
  get selectedKeys():readonly DataGridKey[];set selectedKeys(value:readonly DataGridKey[]);
228
241
  /** Selected rows, derived from `selectedRowKeys`. Assigning current source rows updates those keys. */
229
- get selectedRows():readonly Row[];set selectedRows(next:readonly Row[]);
242
+ get selectedRows():readonly Row[];set selectedRows(next:readonly Row[]);private resolveSelectedRowsAssignment;
230
243
  /** Uses server/event-driven loading and skips client processing. */
231
244
  server:boolean;
232
245
  /** Density on the shared Lyra size ladder. */
@@ -324,7 +337,7 @@ setState(state:DataGridState):void;
324
337
  * proportionally across flexible columns, preserving each column's min/max bounds. */
325
338
  sizeColumnsToFit():void;
326
339
  /** Shows or hides one column without emitting the user-only visibility event. */
327
- toggleColumn(columnId:string,visible:boolean):void;private validColumnMap;private delimitedRows;private copyAndReport;private writeClipboard;private setColumnWidth;private cancelRequestTimer;private scheduleServerRequest;private loadServerData;private get selectionMode();private get selectionEnabled();
340
+ toggleColumn(columnId:string,visible:boolean):void;private validColumnMap;private delimitedRows;private copyAndReport;private writeClipboard;private setColumnWidth;private cancelRequestTimer;private scheduleServerRequest;private loadServerData;private get selectionEnabled();
328
341
  /** ARIA columns and every row-spanning cell share this one selection-column adjustment. */
329
342
  private get ariaColumnCount();private rowIsSelectable;private rowMatches;private processedChildrenFor;private hasMatchingDescendant;private get pageRows();private get currentPageSelectableRows();
330
343
  /** Object-valued grouping callbacks may return a fresh object on every projection. The lowest