@aceshooting/lyra-ui 19.0.0 → 20.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migration-contract.json +1 -1
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +14 -4
  5. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
  6. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +1 -0
  7. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +4 -3
  8. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +1 -1
  9. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts +3 -1
  10. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +1 -0
  11. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +4 -3
  12. package/dist/components/agent-tools/context-inspector/context-inspector.styles.js +1 -1
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +1 -1
  14. package/dist/components/agent-tools/eval-result/eval-result.class.js +1 -1
  15. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.d.ts +1 -0
  16. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +4 -3
  17. package/dist/components/agent-tools/evaluation-run/evaluation-run.styles.js +1 -1
  18. package/dist/components/agent-tools/policy-summary/policy-summary.class.d.ts +1 -0
  19. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +4 -3
  20. package/dist/components/agent-tools/policy-summary/policy-summary.styles.js +1 -1
  21. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +1 -1
  22. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +10 -1
  23. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +3 -3
  24. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +1 -1
  25. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +6 -3
  26. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +1 -1
  27. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +14 -3
  28. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
  29. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +12 -2
  30. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +3 -1
  31. package/dist/components/charts/chart/box-plot.class.d.ts +15 -3
  32. package/dist/components/charts/chart/box-plot.class.js +3 -3
  33. package/dist/components/charts/chart/box-plot.styles.js +1 -1
  34. package/dist/components/charts/chart/chart.class.d.ts +24 -6
  35. package/dist/components/charts/chart/chart.class.js +3 -3
  36. package/dist/components/charts/chart/chart.styles.js +1 -1
  37. package/dist/components/charts/chart/lite-chart.class.js +1 -1
  38. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  39. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +4 -2
  40. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +1 -1
  41. package/dist/components/conversation/branch-picker/branch-picker.class.d.ts +4 -2
  42. package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -1
  43. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +4 -3
  44. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  45. package/dist/components/conversation/code-block/code-block-core.class.d.ts +6 -11
  46. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  47. package/dist/components/conversation/code-block/code-block-shared.d.ts +29 -1
  48. package/dist/components/conversation/code-block/code-block-shared.js +1 -1
  49. package/dist/components/conversation/code-block/code-block.class.d.ts +6 -11
  50. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  51. package/dist/components/conversation/markdown/markdown-shared.js +2 -2
  52. package/dist/components/conversation/message-actions/message-actions.class.d.ts +4 -2
  53. package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
  54. package/dist/components/conversation/message-parts/message-parts.class.d.ts +17 -2
  55. package/dist/components/conversation/model-select/model-select.class.js +1 -0
  56. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  57. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +5 -1
  58. package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -2
  59. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +6 -1
  60. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +2 -2
  61. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +5 -1
  62. package/dist/components/conversation/realtime-session/realtime-session.class.js +1 -1
  63. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +5 -1
  64. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  65. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +13 -2
  66. package/dist/components/conversation/voice-picker/voice-picker.class.js +5 -3
  67. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  68. package/dist/components/data/calendar/calendar.class.d.ts +9 -0
  69. package/dist/components/data/calendar/calendar.class.js +2 -2
  70. package/dist/components/data/calendar/calendar.styles.js +1 -1
  71. package/dist/components/data/condition-builder/condition-builder.class.d.ts +5 -1
  72. package/dist/components/data/context-meter/context-meter.class.d.ts +4 -0
  73. package/dist/components/data/context-meter/context-meter.styles.js +1 -1
  74. package/dist/components/data/data-grid/data-grid.class.d.ts +8 -2
  75. package/dist/components/data/data-grid/data-grid.class.js +1 -2
  76. package/dist/components/data/flow-node/flow-node.class.d.ts +7 -4
  77. package/dist/components/data/flow-node/flow-node.styles.js +1 -1
  78. package/dist/components/data/funnel/funnel.class.d.ts +5 -0
  79. package/dist/components/data/funnel/funnel.class.js +4 -3
  80. package/dist/components/data/funnel/funnel.styles.js +1 -1
  81. package/dist/components/data/gauge/gauge.class.d.ts +12 -1
  82. package/dist/components/data/gauge/gauge.styles.js +1 -1
  83. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +50 -13
  84. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +2 -2
  85. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +1 -1
  86. package/dist/components/data/heatmap/heatmap.class.d.ts +27 -9
  87. package/dist/components/data/heatmap/heatmap.class.js +5 -3
  88. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +2 -0
  89. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  90. package/dist/components/data/table/table.class.d.ts +10 -1
  91. package/dist/components/data/table/table.class.js +3 -2
  92. package/dist/components/data/tree/tree.class.d.ts +20 -1
  93. package/dist/components/data/tree/tree.class.js +1 -1
  94. package/dist/components/data/word-cloud/word-cloud.class.d.ts +4 -1
  95. package/dist/components/data/word-cloud/word-cloud.class.js +2 -2
  96. package/dist/components/forms/button/button.class.js +1 -1
  97. package/dist/components/forms/checkbox/checkbox.class.d.ts +11 -8
  98. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  99. package/dist/components/forms/checkbox/checkbox.styles.js +1 -1
  100. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +2 -2
  101. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  102. package/dist/components/forms/code-editor/code-editor.class.d.ts +2 -0
  103. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  104. package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
  105. package/dist/components/forms/color-picker/color-picker.class.d.ts +11 -1
  106. package/dist/components/forms/color-picker/color-picker.class.js +4 -3
  107. package/dist/components/forms/combobox/combobox.class.d.ts +69 -20
  108. package/dist/components/forms/combobox/combobox.class.js +8 -6
  109. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  110. package/dist/components/forms/date-picker/date-input.class.d.ts +22 -2
  111. package/dist/components/forms/date-picker/date-input.class.js +4 -2
  112. package/dist/components/forms/date-picker/date-input.styles.js +1 -1
  113. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +18 -4
  114. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  115. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +18 -4
  116. package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
  117. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
  118. package/dist/components/forms/icon-button/icon-button.class.d.ts +1 -1
  119. package/dist/components/forms/input/time-input.class.d.ts +11 -1
  120. package/dist/components/forms/input/time-input.class.js +4 -3
  121. package/dist/components/forms/input/time-input.styles.js +1 -1
  122. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +17 -3
  123. package/dist/components/forms/locale-picker/locale-picker.class.js +3 -2
  124. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  125. package/dist/components/forms/otp-input/otp-input.class.d.ts +13 -5
  126. package/dist/components/forms/otp-input/otp-input.class.js +2 -2
  127. package/dist/components/forms/otp-input/otp-input.styles.js +1 -1
  128. package/dist/components/forms/phone-input/phone-input.class.d.ts +10 -3
  129. package/dist/components/forms/phone-input/phone-input.class.js +6 -2
  130. package/dist/components/forms/phone-input/phone-input.styles.js +1 -1
  131. package/dist/components/forms/radio/radio-group.class.d.ts +1 -1
  132. package/dist/components/forms/radio/radio-group.class.js +2 -2
  133. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +9 -1
  134. package/dist/components/forms/rubric-form/rubric-form.class.js +5 -3
  135. package/dist/components/forms/select/select.class.d.ts +6 -2
  136. package/dist/components/forms/select/select.class.js +4 -2
  137. package/dist/components/forms/select/select.styles.js +1 -1
  138. package/dist/components/forms/slider/slider.class.d.ts +5 -1
  139. package/dist/components/forms/slider/slider.class.js +3 -3
  140. package/dist/components/forms/switch/switch.class.d.ts +6 -5
  141. package/dist/components/forms/switch/switch.class.js +1 -1
  142. package/dist/components/forms/time-range/time-range.class.d.ts +2 -2
  143. package/dist/components/forms/token-input/token-input.class.d.ts +13 -3
  144. package/dist/components/forms/token-input/token-input.class.js +3 -1
  145. package/dist/components/layout/carousel/carousel.class.d.ts +4 -1
  146. package/dist/components/layout/carousel/carousel.class.js +1 -1
  147. package/dist/components/layout/command-palette/command-palette.class.d.ts +8 -2
  148. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  149. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  150. package/dist/components/layout/details/accordion.class.js +1 -1
  151. package/dist/components/layout/dock-panel/dock-panel.class.d.ts +10 -7
  152. package/dist/components/layout/dock-panel/dock-panel.class.js +2 -2
  153. package/dist/components/layout/dock-panel/dock-panel.styles.js +1 -1
  154. package/dist/components/layout/menu/menu.class.d.ts +13 -3
  155. package/dist/components/layout/menu/menu.class.js +4 -3
  156. package/dist/components/layout/menu/menu.styles.js +1 -1
  157. package/dist/components/layout/page/page.class.d.ts +7 -1
  158. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
  159. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  160. package/dist/components/layout/segmented/segmented.class.d.ts +2 -0
  161. package/dist/components/layout/segmented/segmented.styles.js +1 -1
  162. package/dist/components/layout/virtual-list/virtual-list.styles.js +1 -1
  163. package/dist/components/layout/widget/widget.class.d.ts +15 -2
  164. package/dist/components/layout/widget/widget.class.js +1 -1
  165. package/dist/components/layout/widget/widget.styles.js +1 -1
  166. package/dist/components/media/avatar/avatar.class.d.ts +4 -0
  167. package/dist/components/media/avatar/avatar.styles.js +1 -1
  168. package/dist/components/media/avatar-group/avatar-group.class.d.ts +8 -1
  169. package/dist/components/media/avatar-group/avatar-group.styles.js +1 -1
  170. package/dist/components/media/drop-zone/drop-zone.class.d.ts +10 -4
  171. package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
  172. package/dist/components/media/drop-zone/drop-zone.styles.js +1 -1
  173. package/dist/components/media/flag/flag.class.js +1 -1
  174. package/dist/components/media/map/map.class.d.ts +19 -5
  175. package/dist/components/media/map/map.class.js +3 -3
  176. package/dist/components/media/video-playlist/video-playlist.class.d.ts +6 -3
  177. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  178. package/dist/components/overlays/callout/callout.class.d.ts +4 -1
  179. package/dist/components/overlays/dialog/dialog.class.d.ts +4 -1
  180. package/dist/components/overlays/overlay/overlay.styles.js +1 -1
  181. package/dist/components/overlays/overlay/popover.class.d.ts +9 -1
  182. package/dist/components/overlays/overlay/popover.class.js +3 -2
  183. package/dist/components/overlays/overlay/tooltip.class.d.ts +14 -4
  184. package/dist/components/overlays/overlay/tooltip.class.js +3 -2
  185. package/dist/components/overlays/popup/popup.class.d.ts +15 -1
  186. package/dist/components/overlays/popup/popup.class.js +3 -3
  187. package/dist/components/overlays/popup/popup.styles.js +1 -1
  188. package/dist/components/overlays/progress/progress-bar.class.d.ts +2 -0
  189. package/dist/components/overlays/progress/progress.styles.js +1 -1
  190. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +4 -2
  191. package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
  192. package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts +4 -0
  193. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +4 -3
  194. package/dist/components/retrieval/claim-evidence/claim-evidence.styles.js +1 -1
  195. package/dist/components/retrieval/community-card/community-card.class.d.ts +6 -1
  196. package/dist/components/retrieval/community-card/community-card.styles.js +1 -1
  197. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +9 -1
  198. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +4 -3
  199. package/dist/components/retrieval/entity-card/entity-card.styles.js +1 -1
  200. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +4 -2
  201. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  202. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +2 -2
  203. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +18 -4
  204. package/dist/components/retrieval/graph-legend/graph-legend.class.js +2 -2
  205. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +7 -0
  206. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +4 -3
  207. package/dist/components/retrieval/grounding-summary/grounding-summary.styles.js +1 -1
  208. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +6 -0
  209. package/dist/components/retrieval/memory-panel/memory-panel.class.js +4 -3
  210. package/dist/components/retrieval/memory-panel/memory-panel.styles.js +1 -1
  211. package/dist/components/retrieval/mind-map/mind-map-layout.d.ts +17 -1
  212. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  213. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +8 -1
  214. package/dist/components/retrieval/mind-map/mind-map.class.js +3 -2
  215. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +5 -0
  216. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +6 -5
  217. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
  218. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +5 -5
  219. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
  220. package/dist/components/retrieval/source-list/source-list.class.d.ts +21 -2
  221. package/dist/components/retrieval/source-list/source-list.class.js +2 -2
  222. package/dist/components/retrieval/source-list/source-list.styles.js +1 -1
  223. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +3 -1
  224. package/dist/components/retrieval/source-picker/source-picker.class.js +2 -2
  225. package/dist/components/utility/diff-view/diff-view.class.d.ts +105 -8
  226. package/dist/components/utility/diff-view/diff-view.class.js +21 -5
  227. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  228. package/dist/components/utility/export-button/export-button.class.d.ts +26 -2
  229. package/dist/components/utility/export-button/export-button.class.js +4 -2
  230. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  231. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +19 -1
  232. package/dist/components/utility/mention-popover/mention-popover.class.js +3 -2
  233. package/dist/components/utility/mention-popover/mention-popover.styles.js +1 -1
  234. package/dist/components/utility/tour/tour.class.d.ts +1 -3
  235. package/dist/components/utility/tour/tour.class.js +1 -1
  236. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts +20 -3
  237. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
  238. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  239. package/dist/components/viewers/geojson-view/geojson-view.styles.js +1 -1
  240. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +5 -0
  241. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +6 -3
  242. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +7 -1
  243. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +1 -1
  244. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts +7 -1
  245. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +1 -1
  246. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +5 -0
  247. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +1 -1
  248. package/dist/custom-elements-jsx.d.ts +1 -1
  249. package/dist/events.d.ts +79 -30
  250. package/dist/internal/accessibility-visibility.js +1 -1
  251. package/dist/internal/aria-reflection.js +1 -1
  252. package/dist/internal/catalog-picker.d.ts +14 -3
  253. package/dist/internal/catalog-picker.js +1 -1
  254. package/dist/internal/default-strings.generated.d.ts +1 -1
  255. package/dist/internal/default-strings.generated.js +2 -2
  256. package/dist/internal/localization-types.d.ts +1 -1
  257. package/dist/internal/localization.js +2 -2
  258. package/dist/internal/lyra-element.d.ts +17 -0
  259. package/dist/internal/lyra-element.js +2 -2
  260. package/dist/internal/package-metadata.d.ts +1 -1
  261. package/dist/internal/package-metadata.js +1 -1
  262. package/dist/svelte.d.ts +1 -1
  263. package/dist/testing/lyra-tag-event-map.js +1 -1
  264. package/dist/translations/ar/agent-tools.js +1 -1
  265. package/dist/translations/ar/data.js +1 -1
  266. package/dist/translations/ar/retrieval.js +1 -1
  267. package/dist/translations/ar/shared.js +1 -1
  268. package/dist/translations/ar/viewers.js +1 -1
  269. package/dist/translations/de/agent-tools.js +1 -1
  270. package/dist/translations/de/data.js +1 -1
  271. package/dist/translations/de/retrieval.js +1 -1
  272. package/dist/translations/de/shared.js +1 -1
  273. package/dist/translations/de/viewers.js +1 -1
  274. package/dist/translations/es/agent-tools.js +1 -1
  275. package/dist/translations/es/data.js +1 -1
  276. package/dist/translations/es/retrieval.js +1 -1
  277. package/dist/translations/es/shared.js +1 -1
  278. package/dist/translations/es/viewers.js +1 -1
  279. package/dist/translations/fa/agent-tools.js +1 -1
  280. package/dist/translations/fa/data.js +1 -1
  281. package/dist/translations/fa/retrieval.js +1 -1
  282. package/dist/translations/fa/shared.js +1 -1
  283. package/dist/translations/fa/viewers.js +1 -1
  284. package/dist/translations/fr/agent-tools.js +1 -1
  285. package/dist/translations/fr/data.js +1 -1
  286. package/dist/translations/fr/retrieval.js +1 -1
  287. package/dist/translations/fr/shared.js +1 -1
  288. package/dist/translations/fr/viewers.js +1 -1
  289. package/dist/translations/he/agent-tools.js +1 -1
  290. package/dist/translations/he/data.js +1 -1
  291. package/dist/translations/he/retrieval.js +1 -1
  292. package/dist/translations/he/shared.js +1 -1
  293. package/dist/translations/he/viewers.js +1 -1
  294. package/dist/translations/it/agent-tools.js +1 -1
  295. package/dist/translations/it/data.js +1 -1
  296. package/dist/translations/it/retrieval.js +1 -1
  297. package/dist/translations/it/shared.js +1 -1
  298. package/dist/translations/it/viewers.js +1 -1
  299. package/dist/translations/ja/agent-tools.js +1 -1
  300. package/dist/translations/ja/data.js +1 -1
  301. package/dist/translations/ja/retrieval.js +1 -1
  302. package/dist/translations/ja/shared.js +1 -1
  303. package/dist/translations/ja/viewers.js +1 -1
  304. package/dist/translations/pt-BR/agent-tools.js +1 -1
  305. package/dist/translations/pt-BR/data.js +1 -1
  306. package/dist/translations/pt-BR/retrieval.js +1 -1
  307. package/dist/translations/pt-BR/shared.js +1 -1
  308. package/dist/translations/pt-BR/viewers.js +1 -1
  309. package/dist/translations/ro/agent-tools.js +1 -1
  310. package/dist/translations/ro/data.js +1 -1
  311. package/dist/translations/ro/retrieval.js +1 -1
  312. package/dist/translations/ro/shared.js +1 -1
  313. package/dist/translations/ro/viewers.js +1 -1
  314. package/dist/translations/ru/agent-tools.js +1 -1
  315. package/dist/translations/ru/data.js +1 -1
  316. package/dist/translations/ru/retrieval.js +1 -1
  317. package/dist/translations/ru/shared.js +1 -1
  318. package/dist/translations/ru/viewers.js +1 -1
  319. package/dist/translations/zh-CN/agent-tools.js +1 -1
  320. package/dist/translations/zh-CN/data.js +1 -1
  321. package/dist/translations/zh-CN/retrieval.js +1 -1
  322. package/dist/translations/zh-CN/shared.js +1 -1
  323. package/dist/translations/zh-CN/viewers.js +1 -1
  324. package/dist/vue.d.ts +1 -1
  325. package/llms/components/lr-activity-feed.md +20 -9
  326. package/llms/components/lr-approval-queue.md +3 -2
  327. package/llms/components/lr-archive-viewer.md +8 -1
  328. package/llms/components/lr-artifact-panel.md +3 -1
  329. package/llms/components/lr-audio-visualizer.md +3 -1
  330. package/llms/components/lr-avatar-group.md +13 -6
  331. package/llms/components/lr-avatar.md +6 -2
  332. package/llms/components/lr-bar-chart.md +6 -3
  333. package/llms/components/lr-box-plot.md +6 -2
  334. package/llms/components/lr-branch-picker.md +3 -1
  335. package/llms/components/lr-bubble-chart.md +6 -3
  336. package/llms/components/lr-calendar.md +10 -3
  337. package/llms/components/lr-carousel.md +4 -2
  338. package/llms/components/lr-chart.md +12 -4
  339. package/llms/components/lr-chat-viewport.md +3 -2
  340. package/llms/components/lr-checkbox.md +8 -5
  341. package/llms/components/lr-citation-badge.md +2 -0
  342. package/llms/components/lr-claim-evidence.md +6 -2
  343. package/llms/components/lr-code-editor.md +3 -1
  344. package/llms/components/lr-color-picker.md +20 -8
  345. package/llms/components/lr-combobox.md +26 -3
  346. package/llms/components/lr-command-palette.md +6 -3
  347. package/llms/components/lr-community-card.md +7 -4
  348. package/llms/components/lr-context-inspector.md +3 -2
  349. package/llms/components/lr-context-meter.md +13 -5
  350. package/llms/components/lr-data-grid.md +2 -0
  351. package/llms/components/lr-date-input.md +12 -3
  352. package/llms/components/lr-date-picker.md +11 -2
  353. package/llms/components/lr-diff-view.md +46 -5
  354. package/llms/components/lr-doughnut-chart.md +6 -3
  355. package/llms/components/lr-drop-zone.md +7 -3
  356. package/llms/components/lr-embedding-explorer.md +8 -2
  357. package/llms/components/lr-emoji-picker.md +5 -1
  358. package/llms/components/lr-entity-chip.md +2 -0
  359. package/llms/components/lr-eval-run.md +3 -2
  360. package/llms/components/lr-export-button.md +5 -2
  361. package/llms/components/lr-flow-node.md +7 -4
  362. package/llms/components/lr-funnel.md +7 -2
  363. package/llms/components/lr-gauge.md +7 -2
  364. package/llms/components/lr-geojson-view.md +10 -2
  365. package/llms/components/lr-geojson-viewer.md +10 -2
  366. package/llms/components/lr-graph-legend.md +6 -3
  367. package/llms/components/lr-graph-query-builder.md +21 -11
  368. package/llms/components/lr-grounding-summary.md +8 -2
  369. package/llms/components/lr-heatmap.md +5 -2
  370. package/llms/components/lr-histogram.md +4 -2
  371. package/llms/components/lr-json-schema-viewer.md +7 -5
  372. package/llms/components/lr-line-chart.md +6 -3
  373. package/llms/components/lr-locale-picker.md +4 -1
  374. package/llms/components/lr-map.md +5 -3
  375. package/llms/components/lr-memory-panel.md +6 -2
  376. package/llms/components/lr-mention-popover.md +7 -4
  377. package/llms/components/lr-message-actions.md +3 -1
  378. package/llms/components/lr-message-parts.md +8 -2
  379. package/llms/components/lr-mind-map.md +11 -2
  380. package/llms/components/lr-option.md +25 -2
  381. package/llms/components/lr-otp-input.md +3 -1
  382. package/llms/components/lr-phone-input.md +9 -5
  383. package/llms/components/lr-pie-chart.md +6 -3
  384. package/llms/components/lr-polar-area-chart.md +6 -3
  385. package/llms/components/lr-policy-summary.md +3 -2
  386. package/llms/components/lr-progress-bar.md +4 -1
  387. package/llms/components/lr-prompt-input.md +4 -1
  388. package/llms/components/lr-prompt-queue.md +5 -2
  389. package/llms/components/lr-radar-chart.md +6 -3
  390. package/llms/components/lr-rag-eval-dashboard.md +7 -2
  391. package/llms/components/lr-realtime-session.md +3 -1
  392. package/llms/components/lr-rubric-form.md +6 -1
  393. package/llms/components/lr-scatter-chart.md +6 -3
  394. package/llms/components/lr-segmented.md +3 -1
  395. package/llms/components/lr-select.md +7 -1
  396. package/llms/components/lr-selection-toolbar.md +4 -1
  397. package/llms/components/lr-sequence-strip.md +7 -3
  398. package/llms/components/lr-source-card.md +16 -1
  399. package/llms/components/lr-source-list.md +17 -2
  400. package/llms/components/lr-source-picker.md +3 -1
  401. package/llms/components/lr-subagent-panel.md +6 -3
  402. package/llms/components/lr-switch.md +4 -3
  403. package/llms/components/lr-table.md +6 -1
  404. package/llms/components/lr-thinking-panel.md +8 -5
  405. package/llms/components/lr-token-input.md +15 -1
  406. package/llms/components/lr-tool-call-chip.md +2 -0
  407. package/llms/components/lr-tool-param-form.md +15 -4
  408. package/llms/components/lr-tooltip.md +8 -4
  409. package/llms/components/lr-trace-tree.md +7 -4
  410. package/llms/components/lr-video-playlist.md +7 -5
  411. package/llms/components/lr-voice-picker.md +7 -4
  412. package/llms/components/lr-widget.md +15 -2
  413. package/llms/migration.md +4 -4
  414. package/llms-full.txt +552 -159
  415. package/package.json +10 -8
  416. package/registrations.json +1 -1
  417. package/vscode-css-data.json +1 -1
  418. package/vscode-html-data.json +1 -1
  419. package/web-types.json +1 -1
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{LyraElement}from"../../../internal/lyra-element.js";import{isNonBlankIdentity}from"../retrieval-identity.js";import{isRtl}from"../../../internal/rtl.js";import"../../media/file-icon/file-icon.class.js";import"../../forms/input/input.class.js";import"../../forms/checkbox/checkbox.class.js";import"../../overlays/empty/empty.class.js";import{styles}from"./source-picker.styles.js";import{normalizeReflectedOptionalSize,optionalSizeConverter}from"../../../internal/variants.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{activeElementIn}from"../../../internal/active-element.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_fileSizeUnitB,LYRA_DEFAULT_fileSizeUnitGb,LYRA_DEFAULT_fileSizeUnitKb,LYRA_DEFAULT_fileSizeUnitMb,LYRA_DEFAULT_fileSizeUnitTb,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_noData,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_progress,LYRA_DEFAULT_restore,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_selectAllSources,LYRA_DEFAULT_sourceListDefaultLabel,LYRA_DEFAULT_sourcePickerSelection,LYRA_DEFAULT_valueInvalid}from"../../../internal/default-strings.generated.js";const MAX_SOURCE_NODES=2e3,MAX_SOURCE_DEPTH=64,EMPTY_SOURCE_ENTRIES=Object.freeze([]),EMPTY_SOURCE_IDS=Object.freeze([]);class LyraSourcePicker extends LyraElement{constructor(){super(...arguments),this.sources=[],this.selectedSourceIds=[],this.showSelectAll=!0,this.searchable=!0,this.accessibleLabel=null,this.expandedIds=new Set,this.query="",this.activeId=null,this.keyboardFocusGeneration=0,this.isMounting=!0,this.lastFilterAnnouncement="",this.onTreeKeyDown=e=>{const rows=this.visibleRows();if(rows.length===0)return;const currentIndex=Math.max(0,rows.findIndex(r=>r.entry.id===this.activeId)),current=rows[currentIndex],rtl=isRtl(this),expandKey=rtl?"ArrowLeft":"ArrowRight",collapseKey=rtl?"ArrowRight":"ArrowLeft";switch(e.key){case"ArrowDown":e.preventDefault(),this.focusRowByIndex(Math.min(rows.length-1,currentIndex+1),rows);break;case"ArrowUp":e.preventDefault(),this.focusRowByIndex(Math.max(0,currentIndex-1),rows);break;case"Home":e.preventDefault(),this.focusRowByIndex(0,rows);break;case"End":e.preventDefault(),this.focusRowByIndex(rows.length-1,rows);break;case expandKey:if(e.preventDefault(),current.hasChildren&&!this.expandedIds.has(current.entry.id))this.expandedIds=new Set(this.expandedIds).add(current.entry.id);else if(current.hasChildren){const next=this.visibleRows()[currentIndex+1];next&&next.depth>current.depth&&this.focusRowByIndex(currentIndex+1,this.visibleRows())}break;case collapseKey:if(e.preventDefault(),current.hasChildren&&this.expandedIds.has(current.entry.id)){const set=new Set(this.expandedIds);set.delete(current.entry.id),this.expandedIds=set}else for(let i=currentIndex-1;i>=0;i--)if(rows[i].depth<current.depth){this.focusRowByIndex(i,rows);break}break;case"Enter":case" ":e.preventDefault(),this.toggleEntry(current.entry);break;default:return}}}static{this.defaultStrings={...super.defaultStrings,collapse:LYRA_DEFAULT_collapse,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,fieldRequired:LYRA_DEFAULT_fieldRequired,fileSizeUnitB:LYRA_DEFAULT_fileSizeUnitB,fileSizeUnitGb:LYRA_DEFAULT_fileSizeUnitGb,fileSizeUnitKb:LYRA_DEFAULT_fileSizeUnitKb,fileSizeUnitMb:LYRA_DEFAULT_fileSizeUnitMb,fileSizeUnitTb:LYRA_DEFAULT_fileSizeUnitTb,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,noData:LYRA_DEFAULT_noData,noMatches:LYRA_DEFAULT_noMatches,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,progress:LYRA_DEFAULT_progress,restore:LYRA_DEFAULT_restore,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,selectAllSources:LYRA_DEFAULT_selectAllSources,sourceListDefaultLabel:LYRA_DEFAULT_sourceListDefaultLabel,sourcePickerSelection:LYRA_DEFAULT_sourcePickerSelection,valueInvalid:LYRA_DEFAULT_valueInvalid}}static{this.ownedCollectionProperties=Object.freeze(["sources","selectedSourceIds"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-sources-change"])}get size(){return this._size}set size(next){const normalized=normalizeReflectedOptionalSize(this,next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}get sourceEntries(){return Array.isArray(this.sources)?this.sources:EMPTY_SOURCE_ENTRIES}get selectedIds(){return Array.isArray(this.selectedSourceIds)?this.selectedSourceIds:EMPTY_SOURCE_IDS}connectedCallback(){super.connectedCallback(),this.announcementSink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){this.isMounting=!0,this.lastFilterAnnouncement="",this.announcementSink?.release(),this.announcementSink=void 0,super.disconnectedCallback()}get sourceModel(){if(this.normalizedInput===this.sourceEntries&&this.normalizedModel)return this.normalizedModel;const roots=[],nodes=[],byEntry=new WeakMap,seenObjects=new WeakSet,seenIds=new Set;let limited=!1;const stack=[];stack.push({sources:this.sourceEntries,target:roots,depth:0,index:0});let inspected=0;for(;stack.length;){const frame=stack[stack.length-1];if(frame.index>=frame.sources.length){stack.pop();continue}if(inspected>=MAX_SOURCE_NODES){limited=!0;break}const source=frame.sources[frame.index++];if(inspected++,!source||typeof source!="object"||seenObjects.has(source)||!isNonBlankIdentity(source.id)||!isNonBlankIdentity(source.label)||seenIds.has(source.id)){limited=!0;continue}if(nodes.length>=MAX_SOURCE_NODES||frame.depth>MAX_SOURCE_DEPTH){limited=!0;continue}seenObjects.add(source),seenIds.add(source.id);const declaredGroup=Array.isArray(source.children),entry={id:source.id,label:source.label,...source.mimeType!==void 0?{mimeType:source.mimeType}:{},...source.name!==void 0?{name:source.name}:{},...declaredGroup?{children:[]}:{}},node={entry,depth:frame.depth,children:[],leafIds:[]};declaredGroup&&(entry.children=node.children.map(child=>child.entry)),frame.target.push(node),nodes.push(node),byEntry.set(entry,node);const children=Array.isArray(source.children)?source.children:[];children.length&&frame.depth>=MAX_SOURCE_DEPTH&&(limited=!0),children.length&&frame.depth<MAX_SOURCE_DEPTH&&stack.push({sources:children,target:node.children,depth:frame.depth+1,index:0})}for(let index=nodes.length-1;index>=0;index--){const node=nodes[index];node.entry.children!==void 0&&(node.entry.children=node.children.map(child=>child.entry)),node.leafIds=node.entry.children===void 0?[node.entry.id]:[...new Set(node.children.flatMap(child=>child.leafIds))]}const leafIds=[...new Set(roots.flatMap(root=>root.leafIds))];return this.normalizedInput=this.sourceEntries,this.normalizedModel={roots,nodes,byEntry,leafIds,limited},this.normalizedModel}allLeafIds(){return this.sourceModel.leafIds}descendantLeafIds(entry){return this.sourceModel.byEntry.get(entry)?.leafIds??[]}normalizedSelectedSourceIds(){const valid=new Set(this.allLeafIds()),seen=new Set;return this.selectedIds.filter(id=>!valid.has(id)||seen.has(id)?!1:(seen.add(id),!0))}checkedState(entry,selectedIds){const leaves=this.descendantLeafIds(entry),selected=leaves.filter(id=>selectedIds.has(id));return selected.length===0?"false":selected.length===leaves.length?"true":"mixed"}matchesQuery(entry){return entry.label.toLocaleLowerCase(this.effectiveLocale).includes(this.query.trim().toLocaleLowerCase(this.effectiveLocale))}isFiltering(){return this.searchable&&this.query.trim().length>0}visibleRows(){const rows=[],filtering=this.isFiltering(),matches=new Set;if(filtering)for(let index=this.sourceModel.nodes.length-1;index>=0;index--){const node=this.sourceModel.nodes[index];(this.matchesQuery(node.entry)||node.children.some(child=>matches.has(child)))&&matches.add(node)}const stack=[...this.sourceModel.roots].reverse();for(;stack.length;){const node=stack.pop();if(filtering&&!matches.has(node))continue;const hasChildren=node.entry.children!==void 0;if(rows.push({entry:node.entry,depth:node.depth,hasChildren}),hasChildren&&(filtering||this.expandedIds.has(node.entry.id)))for(let index=node.children.length-1;index>=0;index--)stack.push(node.children[index])}return rows}willUpdate(changed){if(super.willUpdate(changed),changed.has("sources")||changed.has("selectedSourceIds")){const normalized=this.normalizedSelectedSourceIds(),current=this.selectedIds;(normalized.length!==current.length||normalized.some((id,index)=>id!==current[index]))&&(this.selectedSourceIds=normalized)}if(!changed.has("sources")&&!changed.has("query")&&!changed.has("expandedIds")&&!changed.has("searchable"))return;const focusedIndex=Array.from(this.renderRoot.querySelectorAll('[part~="item"]')).indexOf(activeElementIn(this.shadowRoot)),rows=this.visibleRows(),retainedIndex=rows.findIndex(row=>row.entry.id===this.activeId),nextIndex=retainedIndex>=0?retainedIndex:rows.length?Math.min(Math.max(focusedIndex,0),rows.length-1):-1;this.activeId=nextIndex>=0?rows[nextIndex].entry.id:null,focusedIndex>=0&&(this.pendingFocusIndex=nextIndex>=0?nextIndex:this.sourceEntries.length===0||!this.searchable?"base":"search")}updated(changed){super.updated(changed);const pending=this.pendingFocusIndex;pending!==void 0&&(this.pendingFocusIndex=void 0,pending==="search"?this.renderRoot.querySelector('[part~="search"]')?.focus():pending==="base"?this.renderRoot.querySelector('[part="base"]')?.focus():this.renderRoot.querySelectorAll('[part~="item"]')[pending]?.focus());const wasMounting=this.isMounting;if(this.isMounting=!1,wasMounting||!changed.has("query")&&!changed.has("sources"))return;if(!this.isFiltering()){this.lastFilterAnnouncement="";return}const count=this.visibleRows().length,signature=`${this.query.trim().toLocaleLowerCase(this.effectiveLocale)}\0${count}`;signature!==this.lastFilterAnnouncement&&(this.lastFilterAnnouncement=signature,count===0&&this.announcementSink?.announce(this.localize("noMatches")))}commitSelection(next){this.selectedSourceIds=next,this.emit("lr-sources-change",{selectedSourceIds:next})}toggleEntry(entry){const leaves=this.descendantLeafIds(entry),set=new Set(this.normalizedSelectedSourceIds()),willSelect=this.checkedState(entry,set)!=="true";for(const id of leaves)willSelect?set.add(id):set.delete(id);this.commitSelection([...set])}toggleSelectAll(){const all=this.allLeafIds(),selectedIds=new Set(this.normalizedSelectedSourceIds()),allSelected=all.length>0&&all.every(id=>selectedIds.has(id));this.commitSelection(allSelected?[]:all)}focusRowByIndex(index,rows){const targetId=rows[index]?.entry.id;if(!targetId)return;this.activeId=targetId;const generation=++this.keyboardFocusGeneration;this.updateComplete.then(()=>{if(!this.isConnected||generation!==this.keyboardFocusGeneration)return;const currentIndex=this.visibleRows().findIndex(row=>row.entry.id===targetId);if(currentIndex<0)return;this.renderRoot.querySelectorAll('[part~="item"]')[currentIndex]?.focus()})}renderRow(row,active,selectedIds){const state2=this.checkedState(row.entry,selectedIds),expanded=row.hasChildren&&(this.expandedIds.has(row.entry.id)||this.isFiltering());return html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{isNonBlankIdentity}from"../retrieval-identity.js";import{isRtl}from"../../../internal/rtl.js";import"../../media/file-icon/file-icon.class.js";import"../../forms/input/input.class.js";import"../../forms/checkbox/checkbox.class.js";import"../../overlays/empty/empty.class.js";import{styles}from"./source-picker.styles.js";import{normalizeReflectedOptionalSize,optionalSizeConverter}from"../../../internal/variants.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{activeElementIn}from"../../../internal/active-element.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_fileSizeUnitB,LYRA_DEFAULT_fileSizeUnitGb,LYRA_DEFAULT_fileSizeUnitKb,LYRA_DEFAULT_fileSizeUnitMb,LYRA_DEFAULT_fileSizeUnitTb,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_noData,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_progress,LYRA_DEFAULT_restore,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_selectAllSources,LYRA_DEFAULT_sourceListDefaultLabel,LYRA_DEFAULT_sourcePickerSelection,LYRA_DEFAULT_valueInvalid}from"../../../internal/default-strings.generated.js";const MAX_SOURCE_NODES=2e3,MAX_SOURCE_DEPTH=64,EMPTY_SOURCE_ENTRIES=Object.freeze([]),EMPTY_SOURCE_IDS=Object.freeze([]);class LyraSourcePicker extends LyraElement{constructor(){super(...arguments),this.sources=[],this.selectedSourceIds=[],this.showSelectAll=!0,this.searchable=!0,this.accessibleLabel=null,this.expandedIds=new Set,this.query="",this.activeId=null,this.keyboardFocusGeneration=0,this.isMounting=!0,this.lastFilterAnnouncement="",this.onTreeKeyDown=e=>{const rows=this.visibleRows();if(rows.length===0)return;const currentIndex=Math.max(0,rows.findIndex(r=>r.entry.id===this.activeId)),current=rows[currentIndex],rtl=isRtl(this),expandKey=rtl?"ArrowLeft":"ArrowRight",collapseKey=rtl?"ArrowRight":"ArrowLeft";switch(e.key){case"ArrowDown":e.preventDefault(),this.focusRowByIndex(Math.min(rows.length-1,currentIndex+1),rows);break;case"ArrowUp":e.preventDefault(),this.focusRowByIndex(Math.max(0,currentIndex-1),rows);break;case"Home":e.preventDefault(),this.focusRowByIndex(0,rows);break;case"End":e.preventDefault(),this.focusRowByIndex(rows.length-1,rows);break;case expandKey:if(e.preventDefault(),current.hasChildren&&!this.expandedIds.has(current.entry.id))this.expandedIds=new Set(this.expandedIds).add(current.entry.id);else if(current.hasChildren){const next=this.visibleRows()[currentIndex+1];next&&next.depth>current.depth&&this.focusRowByIndex(currentIndex+1,this.visibleRows())}break;case collapseKey:if(e.preventDefault(),current.hasChildren&&this.expandedIds.has(current.entry.id)){const set=new Set(this.expandedIds);set.delete(current.entry.id),this.expandedIds=set}else for(let i=currentIndex-1;i>=0;i--)if(rows[i].depth<current.depth){this.focusRowByIndex(i,rows);break}break;case"Enter":case" ":e.preventDefault(),this.toggleEntry(current.entry);break;default:return}}}static{this.defaultStrings={...super.defaultStrings,collapse:LYRA_DEFAULT_collapse,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,fieldRequired:LYRA_DEFAULT_fieldRequired,fileSizeUnitB:LYRA_DEFAULT_fileSizeUnitB,fileSizeUnitGb:LYRA_DEFAULT_fileSizeUnitGb,fileSizeUnitKb:LYRA_DEFAULT_fileSizeUnitKb,fileSizeUnitMb:LYRA_DEFAULT_fileSizeUnitMb,fileSizeUnitTb:LYRA_DEFAULT_fileSizeUnitTb,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,noData:LYRA_DEFAULT_noData,noMatches:LYRA_DEFAULT_noMatches,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,progress:LYRA_DEFAULT_progress,restore:LYRA_DEFAULT_restore,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,selectAllSources:LYRA_DEFAULT_selectAllSources,sourceListDefaultLabel:LYRA_DEFAULT_sourceListDefaultLabel,sourcePickerSelection:LYRA_DEFAULT_sourcePickerSelection,valueInvalid:LYRA_DEFAULT_valueInvalid}}static{this.ownedCollectionProperties=Object.freeze(["sources","selectedSourceIds"])}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-sources-change"])}get size(){return this._size}set size(next){const normalized=normalizeReflectedOptionalSize(this,next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}get sourceEntries(){return Array.isArray(this.sources)?this.sources:EMPTY_SOURCE_ENTRIES}get selectedIds(){return Array.isArray(this.selectedSourceIds)?this.selectedSourceIds:EMPTY_SOURCE_IDS}connectedCallback(){super.connectedCallback(),this.announcementSink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){this.isMounting=!0,this.lastFilterAnnouncement="",this.announcementSink?.release(),this.announcementSink=void 0,super.disconnectedCallback()}get sourceModel(){if(this.normalizedInput===this.sourceEntries&&this.normalizedModel)return this.normalizedModel;const roots=[],nodes=[],byEntry=new WeakMap,seenObjects=new WeakSet,seenIds=new Set;let limited=!1;const stack=[];stack.push({sources:this.sourceEntries,target:roots,depth:0,index:0});let inspected=0;for(;stack.length;){const frame=stack[stack.length-1];if(frame.index>=frame.sources.length){stack.pop();continue}if(inspected>=MAX_SOURCE_NODES){limited=!0;break}const source=frame.sources[frame.index++];if(inspected++,!source||typeof source!="object"||seenObjects.has(source)||!isNonBlankIdentity(source.id)||!isNonBlankIdentity(source.label)||seenIds.has(source.id)){limited=!0;continue}if(nodes.length>=MAX_SOURCE_NODES||frame.depth>MAX_SOURCE_DEPTH){limited=!0;continue}seenObjects.add(source),seenIds.add(source.id);const declaredGroup=Array.isArray(source.children),entry={id:source.id,label:source.label,...source.mimeType!==void 0?{mimeType:source.mimeType}:{},...source.name!==void 0?{name:source.name}:{},...declaredGroup?{children:[]}:{}},node={entry,depth:frame.depth,children:[],leafIds:[]};declaredGroup&&(entry.children=node.children.map(child=>child.entry)),frame.target.push(node),nodes.push(node),byEntry.set(entry,node);const children=Array.isArray(source.children)?source.children:[];children.length&&frame.depth>=MAX_SOURCE_DEPTH&&(limited=!0),children.length&&frame.depth<MAX_SOURCE_DEPTH&&stack.push({sources:children,target:node.children,depth:frame.depth+1,index:0})}for(let index=nodes.length-1;index>=0;index--){const node=nodes[index];node.entry.children!==void 0&&(node.entry.children=node.children.map(child=>child.entry)),node.leafIds=node.entry.children===void 0?[node.entry.id]:[...new Set(node.children.flatMap(child=>child.leafIds))]}const leafIds=[...new Set(roots.flatMap(root=>root.leafIds))];return this.normalizedInput=this.sourceEntries,this.normalizedModel={roots,nodes,byEntry,leafIds,limited},this.normalizedModel}allLeafIds(){return this.sourceModel.leafIds}descendantLeafIds(entry){return this.sourceModel.byEntry.get(entry)?.leafIds??[]}normalizedSelectedSourceIds(){const valid=new Set(this.allLeafIds()),seen=new Set;return this.selectedIds.filter(id=>!valid.has(id)||seen.has(id)?!1:(seen.add(id),!0))}checkedState(entry,selectedIds){const leaves=this.descendantLeafIds(entry),selected=leaves.filter(id=>selectedIds.has(id));return selected.length===0?"false":selected.length===leaves.length?"true":"mixed"}matchesQuery(entry){return entry.label.toLocaleLowerCase(this.effectiveLocale).includes(this.query.trim().toLocaleLowerCase(this.effectiveLocale))}isFiltering(){return this.searchable&&this.query.trim().length>0}visibleRows(){const rows=[],filtering=this.isFiltering(),matches=new Set;if(filtering)for(let index=this.sourceModel.nodes.length-1;index>=0;index--){const node=this.sourceModel.nodes[index];(this.matchesQuery(node.entry)||node.children.some(child=>matches.has(child)))&&matches.add(node)}const stack=[...this.sourceModel.roots].reverse();for(;stack.length;){const node=stack.pop();if(filtering&&!matches.has(node))continue;const hasChildren=node.entry.children!==void 0;if(rows.push({entry:node.entry,depth:node.depth,hasChildren}),hasChildren&&(filtering||this.expandedIds.has(node.entry.id)))for(let index=node.children.length-1;index>=0;index--)stack.push(node.children[index])}return rows}willUpdate(changed){if(super.willUpdate(changed),changed.has("sources")||changed.has("selectedSourceIds")){const normalized=this.normalizedSelectedSourceIds(),current=this.selectedIds;if(normalized.length!==current.length||normalized.some((id,index)=>id!==current[index])){const shouldAnnounce=this.hasUpdated&&changed.has("sources");this.selectedSourceIds=normalized,shouldAnnounce&&this.emit("lr-sources-change",{selectedSourceIds:normalized})}}if(!changed.has("sources")&&!changed.has("query")&&!changed.has("expandedIds")&&!changed.has("searchable"))return;const focusedIndex=Array.from(this.renderRoot.querySelectorAll('[part~="item"]')).indexOf(activeElementIn(this.shadowRoot)),rows=this.visibleRows(),retainedIndex=rows.findIndex(row=>row.entry.id===this.activeId),nextIndex=retainedIndex>=0?retainedIndex:rows.length?Math.min(Math.max(focusedIndex,0),rows.length-1):-1;this.activeId=nextIndex>=0?rows[nextIndex].entry.id:null,focusedIndex>=0&&(this.pendingFocusIndex=nextIndex>=0?nextIndex:this.sourceEntries.length===0||!this.searchable?"base":"search")}updated(changed){super.updated(changed);const pending=this.pendingFocusIndex;pending!==void 0&&(this.pendingFocusIndex=void 0,pending==="search"?this.renderRoot.querySelector('[part~="search"]')?.focus():pending==="base"?this.renderRoot.querySelector('[part="base"]')?.focus():this.renderRoot.querySelectorAll('[part~="item"]')[pending]?.focus());const wasMounting=this.isMounting;if(this.isMounting=!1,wasMounting||!changed.has("query")&&!changed.has("sources"))return;if(!this.isFiltering()){this.lastFilterAnnouncement="";return}const count=this.visibleRows().length,signature=`${this.query.trim().toLocaleLowerCase(this.effectiveLocale)}\0${count}`;signature!==this.lastFilterAnnouncement&&(this.lastFilterAnnouncement=signature,count===0&&this.announcementSink?.announce(this.localize("noMatches")))}commitSelection(next){this.selectedSourceIds=next,this.emit("lr-sources-change",{selectedSourceIds:next})}toggleEntry(entry){const leaves=this.descendantLeafIds(entry),set=new Set(this.normalizedSelectedSourceIds()),willSelect=this.checkedState(entry,set)!=="true";for(const id of leaves)willSelect?set.add(id):set.delete(id);this.commitSelection([...set])}toggleSelectAll(){const all=this.allLeafIds(),selectedIds=new Set(this.normalizedSelectedSourceIds()),allSelected=all.length>0&&all.every(id=>selectedIds.has(id));this.commitSelection(allSelected?[]:all)}focusRowByIndex(index,rows){const targetId=rows[index]?.entry.id;if(!targetId)return;this.activeId=targetId;const generation=++this.keyboardFocusGeneration;this.updateComplete.then(()=>{if(!this.isConnected||generation!==this.keyboardFocusGeneration)return;const currentIndex=this.visibleRows().findIndex(row=>row.entry.id===targetId);if(currentIndex<0)return;this.renderRoot.querySelectorAll('[part~="item"]')[currentIndex]?.focus()})}renderRow(row,active,selectedIds){const state2=this.checkedState(row.entry,selectedIds),expanded=row.hasChildren&&(this.expandedIds.has(row.entry.id)||this.isFiltering());return html`
2
2
  <div
3
3
  part="item"
4
4
  role="treeitem"
@@ -25,7 +25,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
25
25
  ></lr-file-icon>
26
26
  <span part="label">${row.entry.label}</span>
27
27
  </div>
28
- `}render(){const hostLabel=hostAriaLabel(this),label=hostLabel===null?this.accessibleLabel??(this.label==null?this.localize("sourceListDefaultLabel"):this.label):this.label!=null&&this.label!==hostLabel?this.label:this.localize("sourceListDefaultLabel"),sourceModel=this.sourceModel,selectedIds=this.normalizedSelectedSourceIds(),selectedIdSet=new Set(selectedIds);if(sourceModel.roots.length===0)return this.sourceEntries.length>0?html`<div part="base" tabindex="-1">
28
+ `}render(){const hostLabel=this.hasAttribute("aria-label")?this.getAttribute("aria-label")??"":null,label=hostLabel===null?this.accessibleLabel??(this.label==null?this.localize("sourceListDefaultLabel"):this.label):this.label!=null&&this.label!==hostLabel?this.label:this.localize("sourceListDefaultLabel"),sourceModel=this.sourceModel,selectedIds=this.normalizedSelectedSourceIds(),selectedIdSet=new Set(selectedIds);if(sourceModel.roots.length===0)return this.sourceEntries.length>0?html`<div part="base" tabindex="-1">
29
29
  <div part="error">${this.localize("valueInvalid")}</div>
30
30
  </div>`:html`<div part="base" tabindex="-1">
31
31
  <lr-empty part="empty" heading=${this.localize("noData")}></lr-empty>
@@ -1,7 +1,15 @@
1
- import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import{type LyraClipboardWriteFailure,type LyraClipboardWriteSuccess}from'../../../internal/clipboard.js';import{type ShikiLanguageInput}from'../../conversation/code-block/code-loader.js';export interface LyraDiffViewEventMap{'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-error':CustomEvent<null>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;}
1
+ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import{type LyraClipboardWriteFailure,type LyraClipboardWriteSuccess}from'../../../internal/clipboard.js';import type{AnchorResultDetail,HighlightActivateDetail,LyraAnchor,LyraAnchorKind}from'../../viewers/document-viewer/anchors.js';import type{LyraSearchChangeDetail}from'../../../internal/text-viewer-target.js';import{type ShikiLanguageInput}from'../../conversation/code-block/code-loader.js';export interface LyraDiffViewEventMap{'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-error':CustomEvent<null>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;
2
+ /** Fired whenever the search query, match count, or active match index changes, from
3
+ * `search()`/`searchNext()`/`searchPrevious()`/`clearSearch()`. */
4
+ 'lr-search-change':CustomEvent<LyraSearchChangeDetail>;
5
+ /** A `highlights` entry's `[part="line-highlight-action"]` button was clicked or activated via
6
+ * Enter/Space. */
7
+ 'lr-highlight-activate':CustomEvent<HighlightActivateDetail>;
8
+ /** Fired after an `anchor` property assignment or a `scrollToAnchor()` call is applied. */
9
+ 'lr-anchor-result':CustomEvent<AnchorResultDetail>;}
2
10
  /** The internal diff rendering layout -- `'unified'` (the default) is one interleaved column,
3
11
  * `'split'` is two side-by-side columns derived from the same `LyraDiffOp[]`. */
4
- export type LyraDiffViewLayout='unified'|'split';
12
+ export type LyraDiffViewLayout='unified'|'split';declare class LyraDiffViewBase extends LyraElement<LyraDiffViewEventMap>{}declare const LyraDiffView_base:Omit<typeof LyraDiffViewBase,'prototype'> &(new(...args:ConstructorParameters<typeof LyraDiffViewBase>)=>InstanceType<typeof LyraDiffViewBase> &import("../../../lyra.js").LyraAnchorTarget&{renderAnchorLiveRegion():unknown;});
5
13
  /**
6
14
  * `<lr-diff-view>` — a real two-string line diff (Hirschberg LCS alignment), rendered as
7
15
  * interleaved unified-diff output -- not diff-flavored syntax highlighting over an
@@ -9,6 +17,16 @@ export type LyraDiffViewLayout='unified'|'split';
9
17
  * the consumer already unified-diffed; it has no two-string-compare entry point). First-party
10
18
  * invention (no Web Awesome equivalent).
11
19
  *
20
+ * Adopts `DocumentAnchorTarget`: a `line-range` anchor addresses the 0-based index into the
21
+ * rendered diff's own op sequence (`start`; an optional `end` covers a multi-line range for
22
+ * `highlights`) -- not an old-file/new-file source line number, since those diverge on any
23
+ * insertion or deletion. `scrollToAnchor()` resolves it, transparently expanding (and, for
24
+ * `highlights`, painting through) any `contextLines` fold that currently hides the target run
25
+ * rather than leaving it inaccessible behind a static marker. `search()` is a locale-aware
26
+ * case-insensitive substring match over each rendered line's own text, one match per line
27
+ * ordered by that same op index, built on the shared bounded viewer-search budget and
28
+ * `internal/viewer-search.ts`'s `announceSearchResult()`.
29
+ *
12
30
  * @customElement lr-diff-view
13
31
  * @event lr-copy - Fired after clipboard writing fulfills. The frozen shared outcome detail is
14
32
  * `{ ok: true, text }`, where `text` is the full unified diff.
@@ -17,10 +35,23 @@ export type LyraDiffViewLayout='unified'|'split';
17
35
  * @event lr-copy-error - The clipboard write failed. The frozen shared outcome detail is
18
36
  * `{ ok: false, text, reason, error }`, where
19
37
  * `reason` is `'unsupported' | 'denied' | 'failed'`.
38
+ * @event lr-search-change - Fired whenever the search query, match count, or active match index
39
+ * changes. `detail: { query, matchCount, matchCountExact, activeIndex }`. Search accepts at
40
+ * most 4,096 query code units, scans at most 4,000,000 line code units, and retains at most
41
+ * 10,000 matches; `matchCountExact=false` identifies a ceiling-truncated lower bound.
42
+ * @event lr-highlight-activate - A `highlights` entry's `[part="line-highlight-action"]` button
43
+ * was clicked or activated via Enter/Space. `detail: { highlightId }`.
44
+ * @event lr-anchor-result - Fired after an `anchor` property assignment or a `scrollToAnchor()`
45
+ * call is applied. `detail: { found }`.
20
46
  * @csspart base - The root wrapper.
21
47
  * @csspart line - A single line. Carries `data-type="equal"|"add"|"remove"|"empty"|"fold"`
22
48
  * (`"empty"` is an unbalanced-replace placeholder cell in `layout="split"` and never carries a
23
- * `+`/`-` prefix; `"fold"` is the collapsed-unchanged-lines marker `contextLines` produces).
49
+ * `+`/`-` prefix; `"fold"` is the collapsed-unchanged-lines marker `contextLines` produces),
50
+ * `data-match`/`data-active-match` while a search result covers it, and `data-highlight`
51
+ * (the resolved tone, default `accent`) plus `data-active-highlight` while a `highlights` entry
52
+ * covers it.
53
+ * @csspart line-highlight-action - The focusable button a resolved `highlights` entry adds to the
54
+ * line it first covers; emits `lr-highlight-activate`.
24
55
  * @csspart copy-button - The copy affordance, only rendered while `copyable`.
25
56
  * @csspart limit - The localized fallback rendered when either input exceeds `maxLines`.
26
57
  * @csspart side - One column in `layout="split"` (`data-side="old"|"new"`).
@@ -33,10 +64,26 @@ export type LyraDiffViewLayout='unified'|'split';
33
64
  * @cssprop [--lr-diff-view-remove-color=var(--lr-color-danger)] - Removed-line text color.
34
65
  * @cssprop [--lr-diff-view-fold-background=var(--lr-color-surface-raised)] - Fold-marker background.
35
66
  * @cssprop [--lr-diff-view-fold-color=var(--lr-color-text-quiet)] - Fold-marker text color.
67
+ * @cssprop [--lr-diff-view-match-color=var(--lr-color-warning)] - Outline color of a line
68
+ * containing a non-active search match.
69
+ * @cssprop [--lr-diff-view-active-match-color=var(--lr-color-warning)] - Outline color of the
70
+ * line containing the active search match.
71
+ * @cssprop [--lr-diff-view-highlight-accent-background=var(--lr-color-brand-quiet)] - Background
72
+ * of an `accent`-tone (the default) `highlights` line.
73
+ * @cssprop [--lr-diff-view-highlight-success-background=var(--lr-color-success-quiet)] -
74
+ * Background of a `success`-tone `highlights` line.
75
+ * @cssprop [--lr-diff-view-highlight-warning-background=var(--lr-color-warning-quiet)] -
76
+ * Background of a `warning`-tone `highlights` line.
77
+ * @cssprop [--lr-diff-view-highlight-danger-background=var(--lr-color-danger-quiet)] -
78
+ * Background of a `danger`-tone `highlights` line.
79
+ * @cssprop [--lr-diff-view-highlight-neutral-background=var(--lr-color-surface-raised)] -
80
+ * Background of a `neutral`-tone `highlights` line.
81
+ * @cssprop [--lr-diff-view-highlight-active-outline=var(--lr-color-brand)] - Outline of the line
82
+ * whose covering highlight is `activeHighlightId`.
36
83
  * @status stable
37
84
  * @since 4.0.0
38
85
  */
39
- export declare class LyraDiffView extends LyraElement<LyraDiffViewEventMap>{static styles:import("lit").CSSResultGroup[];
86
+ export declare class LyraDiffView extends LyraDiffView_base{static styles:import("lit").CSSResultGroup[];
40
87
  /** The "before" text. Default `''` renders an all-additions diff of `newText`. */
41
88
  oldText:string;
42
89
  /** The "after" text. Default `''` renders an all-removals diff of `oldText`. */
@@ -67,16 +114,29 @@ contextLines?:number;
67
114
  /** Maximum lines accepted on either input side before rendering a bounded fallback. Defaults
68
115
  * to `5000`. `Infinity` relaxes this line-count limit; aggregate text and comparison work
69
116
  * remain bounded. */
70
- maxLines:number;private copyStatus;private diffTooLarge;
117
+ maxLines:number;
118
+ /** Anchor kinds this component resolves via `scrollToAnchor()`. Feature-detectable capability
119
+ * mirror -- the same pattern every other `DocumentAnchorTarget`-adopting viewer uses for this
120
+ * field. */
121
+ readonly anchorKinds:readonly LyraAnchorKind[];private copyStatus;private diffTooLarge;
71
122
  /** Copy outcomes announce through a light-DOM sink because live regions inside shadow roots are
72
123
  * not consistently exposed by assistive technology. */
73
- private copyAnnouncementSink?;private highlightedOldLines;private highlightedNewLines;private highlightToken;private loadHighlighterCore;private copyTimer?;
124
+ private copyAnnouncementSink?;private searchMatches;private searchMatchCountExact;private searchActiveIndex;private searchQuery;private lastSearchLocale;private pendingSearchResetEvent;
125
+ /** Diff ops a `scrollToAnchor()`/search navigation revealed out of a `contextLines` fold --
126
+ * the whole equal-run one of them belongs to renders unfolded instead of behind its marker.
127
+ * Reset whenever `diffOps` itself is recomputed (the previous ops are no longer reachable). */
128
+ private forcedVisibleOps;private readonly searchAnnouncements;private readonly searchAnnouncer;private highlightedOldLines;private highlightedNewLines;private highlightToken;private loadHighlighterCore;private copyTimer?;
74
129
  /** Invalidates clipboard outcomes when another activation, source change, disconnect, or
75
130
  * adoption makes the pending write obsolete. */
76
131
  private copyGeneration;
77
132
  /** Canonical scalar text and grammar-map inputs. Every later diff/highlight read uses these
78
133
  * admitted values instead of re-reading caller-owned public properties. */
79
- private oldTextSnapshot;private newTextSnapshot;private languageSnapshot;private languagesSnapshot?;private diffOps;protected willUpdate(changed:PropertyValues):void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private cancelCopyTimer;private resetCopyFeedback;private syncHighlight;
134
+ private oldTextSnapshot;private newTextSnapshot;private languageSnapshot;private languagesSnapshot?;private diffOps;
135
+ /** O(1) reverse lookup from an op reference (rendered as `[part="line"]`, in both unified and
136
+ * split layouts, since both derive from this same array) to its stable 0-based `line-range`
137
+ * anchor index. Rebuilt in lockstep with `diffOps` -- every op is a fresh object literal each
138
+ * recompute, so a stale entry can never alias a same-shaped later op. */
139
+ private opIndexMap;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private hasSearchState;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private cancelCopyTimer;private resetCopyFeedback;private syncHighlight;
80
140
  /** Tokenizes `text` as one document (so multi-line tokens survive) and splits shiki's own
81
141
  * rendered `.line` spans back into a per-source-line HTML array, normalized to exactly
82
142
  * `splitLines(text).length` entries -- shiki's own trailing-newline handling can otherwise be
@@ -93,4 +153,41 @@ private tokenizeLines;
93
153
  * `trailingFold`. Only maximal `equal` runs are ever folded -- `add`/`remove` ops are always
94
154
  * visible. A run that is both the very first and very last thing in the diff (i.e. `oldText` and
95
155
  * `newText` are identical) is never folded: there is no adjacent change to give context around. */
96
- private computeFolds;private foldMarker;private get unifiedText();private isCurrentCopy;private showCopyStatus;private copy;private onCopyClick;private renderUnified;private renderSplit;private renderSplitCell;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-diff-view':LyraDiffView;}}
156
+ private computeFolds;private foldMarker;
157
+ /** Force-reveals the equal-run `op` belongs to (a no-op once it is already forced), then waits
158
+ * for that to render before the caller looks up the corresponding DOM line. */
159
+ private revealOp;private lineElementForOpIndex;private scrollOpIndexIntoView;
160
+ /** Resolves a `line-range` anchor by scrolling the line at its 0-based `start` op index into
161
+ * view, first expanding any `contextLines` fold currently hiding it. `end` is not consulted
162
+ * here -- it only widens what a covering `highlights` entry paints; the scroll target is
163
+ * always `start`. */
164
+ protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;
165
+ /** Host-supplied `highlights` resolved against `this.diffOps`, keyed by the covered op. A
166
+ * `line-range` entry paints every op in its (clamped) `[start, end]` span, first-array-order
167
+ * highlight winning any overlap; `owners` records the first (lowest-index) op each highlight
168
+ * wins, the one that renders the focusable `[part="line-highlight-action"]` button; `order`
169
+ * positions each resolved highlight (0-based) for that button's accessible name, and `total`
170
+ * is the resolved-set size, mirroring `<lr-xml-viewer>`'s `highlightActionLabel()` numbering. */
171
+ private resolvedHighlightOps;
172
+ /** The localized accessible name/label of one highlight's action button -- its own `label` when
173
+ * the host supplied one, otherwise its position in the resolved set. Mirrors `<lr-xml-viewer>`. */
174
+ private highlightActionLabel;private activateHighlight;private emitSearchChange;private recomputeSearchMatches;
175
+ /** Resolves the retained match count -- one match per rendered line (diff op) whose text
176
+ * contains a locale-aware case-insensitive substring of `query`, ordered by that line's
177
+ * `line-range` op index; an empty/whitespace query behaves like `clearSearch()` and resolves
178
+ * `0`. Inspect `lr-search-change.matchCountExact` to distinguish an exact total from a lower
179
+ * bound once a resource ceiling is reached. */
180
+ search(query:string):Promise<number>;
181
+ /** Advances to the next match, wrapping to the first after the last. Resolves `true` once the
182
+ * active match moved, `false` when there are no matches -- the shape the shared
183
+ * `LyraTextViewerTarget` search contract declares. */
184
+ searchNext():Promise<boolean>;
185
+ /** Moves to the previous match, wrapping to the last before the first. Resolves `true` once the
186
+ * active match moved, `false` when there are no matches. */
187
+ searchPrevious():Promise<boolean>;
188
+ /** Clears the query, matches, and active index, and resets `lr-search-change` to a
189
+ * 0-match/no-active-index state. */
190
+ clearSearch():void;private get unifiedText();private isCurrentCopy;private showCopyStatus;private copy;private onCopyClick;
191
+ /** Per-render O(1) lookups so each `renderDiffLine()` call doesn't re-scan `highlights`/
192
+ * `searchMatches`. */
193
+ private lineRenderContext;private renderDiffLine;private renderUnified;private renderSplit;private renderSplitCell;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-diff-view':LyraDiffView;}}export{};
@@ -1,5 +1,19 @@
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{unsafeHTML}from"lit/directives/unsafe-html.js";import{LyraElement}from"../../../internal/lyra-element.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{literalSetConverter}from"../../../internal/converters.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{computeLineDiff,pairOpsForSplit}from"./diff-line-diff.js";import{loadShikiHighlighterCore,SHIKI_THEMES}from"../../conversation/code-block/code-loader.js";import{styles}from"./diff-view.styles.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyDiff,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_diffViewHiddenLines,LYRA_DEFAULT_diffViewNewLabel,LYRA_DEFAULT_diffViewOldLabel,LYRA_DEFAULT_diffViewTooLarge}from"../../../internal/default-strings.generated.js";const COPY_CONFIRM_MS=1500,splitLines=text=>text===""?[]:text.split(/\r\n|\r|\n/),MAX_DIFF_CHARACTERS=1e6,MAX_DIFF_COMPARISONS=4e6,MAX_DIFF_LANGUAGES=1e4,MAX_DIFF_LANGUAGE_INSPECTIONS=MAX_DIFF_LANGUAGES*2;function projectLanguages(value){if(!(value===null||typeof value!="object"))try{if(Array.isArray(value))return;const projected=Object.create(null),keys=Object.getOwnPropertyNames(value);let inspected=0,admitted=0;for(const key of keys){if(inspected>=MAX_DIFF_LANGUAGE_INSPECTIONS||admitted>=MAX_DIFF_LANGUAGES)break;inspected+=1;const descriptor=getOwnDataDescriptor(value,key);descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR||!descriptor.enumerable||(Object.defineProperty(projected,key,{value:descriptor.value,enumerable:!0,configurable:!1,writable:!1}),admitted+=1)}return Object.freeze(projected)}catch{return}}const DIFF_VIEW_LAYOUT=literalSetConverter(["unified","split"],"unified");class LyraDiffView extends LyraElement{constructor(){super(...arguments),this.oldText="",this.newText="",this.copyable=!1,this.maxHeight="",this._layout="unified",this.language="",this.maxLines=5e3,this.copyStatus="rest",this.diffTooLarge=!1,this.highlightedOldLines=null,this.highlightedNewLines=null,this.highlightToken=0,this.loadHighlighterCore=loadShikiHighlighterCore,this.copyGeneration=0,this.oldTextSnapshot="",this.newTextSnapshot="",this.languageSnapshot="",this.diffOps=[],this.onCopyClick=()=>{this.copy()}}static{this.defaultStrings={...super.defaultStrings,copied:LYRA_DEFAULT_copied,copy:LYRA_DEFAULT_copy,copyDiff:LYRA_DEFAULT_copyDiff,copyFailed:LYRA_DEFAULT_copyFailed,diffViewHiddenLines:LYRA_DEFAULT_diffViewHiddenLines,diffViewNewLabel:LYRA_DEFAULT_diffViewNewLabel,diffViewOldLabel:LYRA_DEFAULT_diffViewOldLabel,diffViewTooLarge:LYRA_DEFAULT_diffViewTooLarge}}static{this.styles=[LyraElement.styles,styles]}get layout(){return this._layout}set layout(next){const normalized=DIFF_VIEW_LAYOUT.normalizeReflected(this,"layout",next),old=this._layout;old!==normalized&&(this._layout=normalized,this.requestUpdate("layout",old))}willUpdate(changed){if(super.willUpdate(changed),!this.hasUpdated||changed.has("oldText")||changed.has("newText")){const oldText=this.oldText,newText=this.newText;this.oldTextSnapshot=typeof oldText=="string"?oldText:"",this.newTextSnapshot=typeof newText=="string"?newText:""}if(!this.hasUpdated||changed.has("language")||changed.has("languages")){const language=this.language;this.languageSnapshot=typeof language=="string"?language:"",this.languagesSnapshot=projectLanguages(this.languages)}if(this.hasUpdated&&(changed.has("oldText")||changed.has("newText")||changed.has("copyable")||changed.has("maxLines"))&&this.resetCopyFeedback(),changed.has("oldText")||changed.has("newText")||changed.has("maxLines")){const oldLines=splitLines(this.oldTextSnapshot),newLines=splitLines(this.newTextSnapshot),maxLines=this.maxLines===Number.POSITIVE_INFINITY?Number.POSITIVE_INFINITY:finiteCount(this.maxLines,5e3),characterCount=this.oldTextSnapshot.length+this.newTextSnapshot.length,comparisons=oldLines.length*newLines.length;this.diffTooLarge=oldLines.length>maxLines||newLines.length>maxLines||characterCount>MAX_DIFF_CHARACTERS||comparisons>MAX_DIFF_COMPARISONS,this.diffOps=this.diffTooLarge?[]:computeLineDiff(oldLines,newLines)}(changed.has("oldText")||changed.has("newText")||changed.has("language")||changed.has("languages")||changed.has("maxLines"))&&this.syncHighlight()}connectedCallback(){super.connectedCallback(),this.copyAnnouncementSink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){super.disconnectedCallback(),this.resetCopyFeedback(),this.copyAnnouncementSink?.release(),this.copyAnnouncementSink=void 0}adoptedCallback(){super.adoptedCallback(),this.resetCopyFeedback(),this.copyAnnouncementSink?.release(),this.copyAnnouncementSink=void 0}cancelCopyTimer(){const timer=this.copyTimer;this.copyTimer=void 0,timer&&timer.owner.clearTimeout(timer.handle)}resetCopyFeedback(){this.copyGeneration+=1,this.cancelCopyTimer(),this.copyStatus="rest"}syncHighlight(){const token=++this.highlightToken;if(this.diffTooLarge){this.highlightedOldLines=null,this.highlightedNewLines=null;return}const lang=this.languageSnapshot,languages=this.languagesSnapshot;if(!lang||!languages||!Object.hasOwn(languages,lang)){this.highlightedOldLines=null,this.highlightedNewLines=null;return}let loading;try{loading=this.loadHighlighterCore(languages)}catch{this.highlightedOldLines=null,this.highlightedNewLines=null;return}loading.then(hl=>{if(token===this.highlightToken){if(!hl){this.highlightedOldLines=null,this.highlightedNewLines=null;return}this.highlightedOldLines=this.tokenizeLines(hl,this.oldTextSnapshot,lang),this.highlightedNewLines=this.tokenizeLines(hl,this.newTextSnapshot,lang)}},()=>{token===this.highlightToken&&(this.highlightedOldLines=null,this.highlightedNewLines=null)})}tokenizeLines(hl,text,lang){try{const html2=hl.codeToHtml(text,{lang,themes:SHIKI_THEMES}),DOMParserCtor=this.ownerDocument.defaultView?.DOMParser;if(!DOMParserCtor)return null;const doc=new DOMParserCtor().parseFromString(html2,"text/html"),lines=Array.from(doc.querySelectorAll("code > .line")).map(line=>line.innerHTML),expected=splitLines(text).length;for(;lines.length>expected;)lines.pop();for(;lines.length<expected;)lines.push("");return lines}catch{return null}}computeFolds(){const ops=this.diffOps,visible=new Set(ops),foldBefore=new Map;let trailingFold=0;const ctx=this.contextLines==null||!Number.isFinite(this.contextLines)||this.contextLines<0?void 0:finiteCount(this.contextLines);if(ctx===void 0)return{visible,foldBefore,trailingFold};let i=0;for(;i<ops.length;){if(ops[i].type!=="equal"){i++;continue}let j=i;for(;j<ops.length&&ops[j].type==="equal";)j++;const runLength=j-i,isLeading=i===0,isTrailing=j===ops.length;if(!(isLeading&&isTrailing)){if(isLeading){const hidden=Math.max(0,runLength-ctx);if(hidden>0){for(let k=i;k<i+hidden;k++)visible.delete(ops[k]);foldBefore.set(ops[i+hidden],hidden)}}else if(isTrailing){const shown=Math.min(ctx,runLength),hidden=runLength-shown;if(hidden>0){for(let k=i+shown;k<j;k++)visible.delete(ops[k]);trailingFold=hidden}}else if(runLength>ctx*2){const hiddenStart=i+ctx,hiddenEnd=j-ctx;for(let k=hiddenStart;k<hiddenEnd;k++)visible.delete(ops[k]);foldBefore.set(ops[hiddenStart],hiddenEnd-hiddenStart)}}i=j}return{visible,foldBefore,trailingFold}}foldMarker(count){const text=this.localize("diffViewHiddenLines",void 0,{count:getNumberFormat(this.effectiveLocale).format(count),pluralCount:count});return html`<div part="line" data-type="fold">${text}</div>`}get unifiedText(){return this.diffOps.map(op=>`${op.type==="add"?"+":op.type==="remove"?"-":" "} ${op.text}`).join(`
2
- `)}isCurrentCopy(generation,owner){return this.isConnected&&this.copyable&&!this.diffTooLarge&&generation===this.copyGeneration&&this.ownerDocument.defaultView===owner}showCopyStatus(status,generation){const owner=this.ownerDocument.defaultView;if(!owner||!this.isCurrentCopy(generation,owner))return;this.copyStatus=status,this.copyAnnouncementSink?.announce(status==="success"?this.localize("copied"):this.localize("copyFailed")),this.cancelCopyTimer();let handle=0;handle=owner.setTimeout(()=>{const timer=this.copyTimer;timer?.owner!==owner||timer.handle!==handle||timer.generation!==generation||!this.isCurrentCopy(generation,owner)||(this.copyTimer=void 0,this.copyStatus="rest")},COPY_CONFIRM_MS),this.copyTimer={owner,handle,generation}}async copy(){if(!this.copyable||this.diffTooLarge)return;const generation=++this.copyGeneration;this.cancelCopyTimer(),this.copyStatus="rest";const text=this.unifiedText,owner=this.isConnected?this.ownerDocument.defaultView:null;if(!owner)return;const outcome=await writeClipboardText(owner,text);if(this.isCurrentCopy(generation,owner)){if(!outcome.ok){this.showCopyStatus("error",generation),this.emit("lr-error"),this.emit("lr-copy-error",outcome);return}this.showCopyStatus("success",generation),this.emit("lr-copy",outcome)}}renderUnified(){const{visible,foldBefore,trailingFold}=this.computeFolds();let oldCounter=0,newCounter=0;const rows=[];for(const op of this.diffOps){const fold=foldBefore.get(op);if(fold!==void 0&&rows.push(this.foldMarker(fold)),visible.has(op)){const marker=op.type==="add"?"+":op.type==="remove"?"-":" ",lines=op.type==="add"?this.highlightedNewLines:this.highlightedOldLines,index=op.type==="add"?newCounter:oldCounter,highlighted=lines?.[index];rows.push(html`<div part="line" data-type=${op.type}>${marker} ${highlighted!==void 0?unsafeHTML(highlighted):op.text}</div>`)}op.type!=="add"&&oldCounter++,op.type!=="remove"&&newCounter++}return trailingFold>0&&rows.push(this.foldMarker(trailingFold)),html`<pre>${rows}</pre>`}renderSplit(){const{visible,foldBefore,trailingFold}=this.computeFolds(),splitRows=pairOpsForSplit(this.diffOps);let oldCounter=0,newCounter=0;const leftCells=[],rightCells=[];for(const row of splitRows){const foldOp=row.left&&row.left.type==="equal"?row.left:row.right&&row.right.type==="equal"?row.right:null,fold=foldOp?foldBefore.get(foldOp):void 0;fold!==void 0&&(leftCells.push(this.foldMarker(fold)),rightCells.push(this.foldMarker(fold))),foldOp!==null&&!visible.has(foldOp)||(leftCells.push(this.renderSplitCell(row.left,row.left?oldCounter:-1,this.highlightedOldLines)),rightCells.push(this.renderSplitCell(row.right,row.right?newCounter:-1,this.highlightedNewLines))),row.left&&oldCounter++,row.right&&newCounter++}return trailingFold>0&&(leftCells.push(this.foldMarker(trailingFold)),rightCells.push(this.foldMarker(trailingFold))),html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{acquireAnnouncementSink,Announcer}from"../../../internal/announcer.js";import{announceSearchResult}from"../../../internal/viewer-search.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{literalSetConverter}from"../../../internal/converters.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{DocumentAnchorTarget,prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{boundedViewerSearchQuery,ViewerSearchWorkBudget}from"../../viewers/viewer-search-limits.js";import{ViewerAnnouncementController}from"../../viewers/viewer-announcements.js";import{computeLineDiff,pairOpsForSplit}from"./diff-line-diff.js";import{loadShikiHighlighterCore,SHIKI_THEMES}from"../../conversation/code-block/code-loader.js";import{styles}from"./diff-view.styles.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyDiff,LYRA_DEFAULT_copyFailed,LYRA_DEFAULT_details,LYRA_DEFAULT_diffViewHiddenLines,LYRA_DEFAULT_diffViewNewLabel,LYRA_DEFAULT_diffViewOldLabel,LYRA_DEFAULT_diffViewTooLarge,LYRA_DEFAULT_highlightOfTotal,LYRA_DEFAULT_highlightWithLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_remove,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_viewerSearchActiveMatch,LYRA_DEFAULT_viewerSearchMatchCount,LYRA_DEFAULT_viewerSearchNoMatches}from"../../../internal/default-strings.generated.js";const COPY_CONFIRM_MS=1500,splitLines=text=>text===""?[]:text.split(/\r\n|\r|\n/),MAX_DIFF_CHARACTERS=1e6,MAX_DIFF_COMPARISONS=4e6,MAX_DIFF_LANGUAGES=1e4,MAX_DIFF_LANGUAGE_INSPECTIONS=MAX_DIFF_LANGUAGES*2,MAX_SEARCH_MATCHES=1e4,MAX_PAINTED_HIGHLIGHTS=100;function projectLanguages(value){if(!(value===null||typeof value!="object"))try{if(Array.isArray(value))return;const projected=Object.create(null),keys=Object.getOwnPropertyNames(value);let inspected=0,admitted=0;for(const key of keys){if(inspected>=MAX_DIFF_LANGUAGE_INSPECTIONS||admitted>=MAX_DIFF_LANGUAGES)break;inspected+=1;const descriptor=getOwnDataDescriptor(value,key);descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR||!descriptor.enumerable||(Object.defineProperty(projected,key,{value:descriptor.value,enumerable:!0,configurable:!1,writable:!1}),admitted+=1)}return Object.freeze(projected)}catch{return}}const DIFF_VIEW_LAYOUT=literalSetConverter(["unified","split"],"unified");class LyraDiffViewBase extends LyraElement{}class LyraDiffView extends DocumentAnchorTarget(LyraDiffViewBase){constructor(){super(...arguments),this.oldText="",this.newText="",this.copyable=!1,this.maxHeight="",this._layout="unified",this.language="",this.maxLines=5e3,this.anchorKinds=["line-range"],this.copyStatus="rest",this.diffTooLarge=!1,this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.searchQuery="",this.lastSearchLocale="",this.pendingSearchResetEvent=!1,this.forcedVisibleOps=new Set,this.searchAnnouncements=new ViewerAnnouncementController(this),this.searchAnnouncer=new Announcer({onFlush:text=>this.searchAnnouncements.announcePolite(text)}),this.highlightedOldLines=null,this.highlightedNewLines=null,this.highlightToken=0,this.loadHighlighterCore=loadShikiHighlighterCore,this.copyGeneration=0,this.oldTextSnapshot="",this.newTextSnapshot="",this.languageSnapshot="",this.diffOps=[],this.opIndexMap=new Map,this.onCopyClick=()=>{this.copy()}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,collapse:LYRA_DEFAULT_collapse,copied:LYRA_DEFAULT_copied,copy:LYRA_DEFAULT_copy,copyDiff:LYRA_DEFAULT_copyDiff,copyFailed:LYRA_DEFAULT_copyFailed,details:LYRA_DEFAULT_details,diffViewHiddenLines:LYRA_DEFAULT_diffViewHiddenLines,diffViewNewLabel:LYRA_DEFAULT_diffViewNewLabel,diffViewOldLabel:LYRA_DEFAULT_diffViewOldLabel,diffViewTooLarge:LYRA_DEFAULT_diffViewTooLarge,highlightOfTotal:LYRA_DEFAULT_highlightOfTotal,highlightWithLabel:LYRA_DEFAULT_highlightWithLabel,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,remove:LYRA_DEFAULT_remove,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,viewerSearchActiveMatch:LYRA_DEFAULT_viewerSearchActiveMatch,viewerSearchMatchCount:LYRA_DEFAULT_viewerSearchMatchCount,viewerSearchNoMatches:LYRA_DEFAULT_viewerSearchNoMatches}}static{this.styles=[LyraElement.styles,styles,srOnly]}get layout(){return this._layout}set layout(next){const normalized=DIFF_VIEW_LAYOUT.normalizeReflected(this,"layout",next),old=this._layout;old!==normalized&&(this._layout=normalized,this.requestUpdate("layout",old))}willUpdate(changed){if(super.willUpdate(changed),!this.hasUpdated||changed.has("oldText")||changed.has("newText")){const oldText=this.oldText,newText=this.newText;this.oldTextSnapshot=typeof oldText=="string"?oldText:"",this.newTextSnapshot=typeof newText=="string"?newText:""}if(!this.hasUpdated||changed.has("language")||changed.has("languages")){const language=this.language;this.languageSnapshot=typeof language=="string"?language:"",this.languagesSnapshot=projectLanguages(this.languages)}if(this.hasUpdated&&(changed.has("oldText")||changed.has("newText")||changed.has("copyable")||changed.has("maxLines"))&&this.resetCopyFeedback(),changed.has("oldText")||changed.has("newText")||changed.has("maxLines")){const oldLines=splitLines(this.oldTextSnapshot),newLines=splitLines(this.newTextSnapshot),maxLines=this.maxLines===Number.POSITIVE_INFINITY?Number.POSITIVE_INFINITY:finiteCount(this.maxLines,5e3),characterCount=this.oldTextSnapshot.length+this.newTextSnapshot.length,comparisons=oldLines.length*newLines.length;this.diffTooLarge=oldLines.length>maxLines||newLines.length>maxLines||characterCount>MAX_DIFF_CHARACTERS||comparisons>MAX_DIFF_COMPARISONS,this.diffOps=this.diffTooLarge?[]:computeLineDiff(oldLines,newLines),this.opIndexMap=new Map(this.diffOps.map((op,index)=>[op,index])),this.pendingSearchResetEvent||=this.hasSearchState(),this.forcedVisibleOps=new Set,this.searchQuery="",this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1}(changed.has("oldText")||changed.has("newText")||changed.has("language")||changed.has("languages")||changed.has("maxLines"))&&this.syncHighlight()}updated(changed){super.updated(changed),this.pendingSearchResetEvent&&(this.pendingSearchResetEvent=!1,this.emitSearchChange());const locale=this.effectiveLocale;if(locale!==this.lastSearchLocale){const shouldRecompute=!!this.searchQuery;this.lastSearchLocale=locale,shouldRecompute&&this.scheduleAfterUpdate(()=>{this.search(this.searchQuery)},"search")}}hasSearchState(){return this.searchQuery!==""||this.searchMatches.length>0||!this.searchMatchCountExact||this.searchActiveIndex!==-1}connectedCallback(){super.connectedCallback(),this.copyAnnouncementSink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.searchAnnouncements.connect();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.searchAnnouncer.setTimerHost(ownerWindow)}disconnectedCallback(){super.disconnectedCallback(),this.resetCopyFeedback(),this.copyAnnouncementSink?.release(),this.copyAnnouncementSink=void 0,this.searchAnnouncer.cancel(),this.searchAnnouncements.disconnect()}adoptedCallback(){super.adoptedCallback(),this.resetCopyFeedback(),this.copyAnnouncementSink?.release(),this.copyAnnouncementSink=void 0,this.searchAnnouncements.adopted();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.searchAnnouncer.setTimerHost(ownerWindow)}cancelCopyTimer(){const timer=this.copyTimer;this.copyTimer=void 0,timer&&timer.owner.clearTimeout(timer.handle)}resetCopyFeedback(){this.copyGeneration+=1,this.cancelCopyTimer(),this.copyStatus="rest"}syncHighlight(){const token=++this.highlightToken;if(this.diffTooLarge){this.highlightedOldLines=null,this.highlightedNewLines=null;return}const lang=this.languageSnapshot,languages=this.languagesSnapshot;if(!lang||!languages||!Object.hasOwn(languages,lang)){this.highlightedOldLines=null,this.highlightedNewLines=null;return}let loading;try{loading=this.loadHighlighterCore(languages)}catch{this.highlightedOldLines=null,this.highlightedNewLines=null;return}loading.then(hl=>{if(token===this.highlightToken){if(!hl){this.highlightedOldLines=null,this.highlightedNewLines=null;return}this.highlightedOldLines=this.tokenizeLines(hl,this.oldTextSnapshot,lang),this.highlightedNewLines=this.tokenizeLines(hl,this.newTextSnapshot,lang)}},()=>{token===this.highlightToken&&(this.highlightedOldLines=null,this.highlightedNewLines=null)})}tokenizeLines(hl,text,lang){try{const html2=hl.codeToHtml(text,{lang,themes:SHIKI_THEMES}),DOMParserCtor=this.ownerDocument.defaultView?.DOMParser;if(!DOMParserCtor)return null;const doc=new DOMParserCtor().parseFromString(html2,"text/html"),lines=Array.from(doc.querySelectorAll("code > .line")).map(line=>line.innerHTML),expected=splitLines(text).length;for(;lines.length>expected;)lines.pop();for(;lines.length<expected;)lines.push("");return lines}catch{return null}}computeFolds(){const ops=this.diffOps,visible=new Set(ops),foldBefore=new Map;let trailingFold=0;const ctx=this.contextLines==null||!Number.isFinite(this.contextLines)||this.contextLines<0?void 0:finiteCount(this.contextLines);if(ctx===void 0)return{visible,foldBefore,trailingFold};let i=0;for(;i<ops.length;){if(ops[i].type!=="equal"){i++;continue}let j=i;for(;j<ops.length&&ops[j].type==="equal";)j++;const runLength=j-i,isLeading=i===0,isTrailing=j===ops.length;let runHasForcedReveal=!1;if(this.forcedVisibleOps.size>0){for(let k=i;k<j;k++)if(this.forcedVisibleOps.has(ops[k])){runHasForcedReveal=!0;break}}if(!(isLeading&&isTrailing)){if(!runHasForcedReveal){if(isLeading){const hidden=Math.max(0,runLength-ctx);if(hidden>0){for(let k=i;k<i+hidden;k++)visible.delete(ops[k]);foldBefore.set(ops[i+hidden],hidden)}}else if(isTrailing){const shown=Math.min(ctx,runLength),hidden=runLength-shown;if(hidden>0){for(let k=i+shown;k<j;k++)visible.delete(ops[k]);trailingFold=hidden}}else if(runLength>ctx*2){const hiddenStart=i+ctx,hiddenEnd=j-ctx;for(let k=hiddenStart;k<hiddenEnd;k++)visible.delete(ops[k]);foldBefore.set(ops[hiddenStart],hiddenEnd-hiddenStart)}}}i=j}return{visible,foldBefore,trailingFold}}foldMarker(count){const text=this.localize("diffViewHiddenLines",void 0,{count:getNumberFormat(this.effectiveLocale).format(count),pluralCount:count});return html`<div part="line" data-type="fold">${text}</div>`}async revealOp(op){if(!this.forcedVisibleOps.has(op)){const next=new Set(this.forcedVisibleOps);next.add(op),this.forcedVisibleOps=next}await this.updateComplete}lineElementForOpIndex(index){return this.renderRoot.querySelector(`[data-op-index="${index}"]`)}async scrollOpIndexIntoView(index){const op=this.diffOps[index];if(!op)return!1;await this.revealOp(op);const target=this.lineElementForOpIndex(index);return target?(target.scrollIntoView({behavior:prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth",block:"nearest"}),!0):!1}async applyAnchor(anchor){if(anchor.kind!=="line-range")return!1;const index=anchor.start;return!Number.isInteger(index)||index<0||index>=this.diffOps.length?!1:this.scrollOpIndexIntoView(index)}resolvedHighlightOps(){const perOp=new Map,owners=new Map,order=new Map,ops=this.diffOps;if(ops.length===0)return{perOp,owners,order,total:0};const seen=new Set;for(const highlight of prioritizedHighlightCandidates(this.highlights,this.activeHighlightId)){if(order.size>=MAX_PAINTED_HIGHLIGHTS)break;if(seen.has(highlight.id)||(seen.add(highlight.id),highlight.anchor.kind!=="line-range"))continue;const start=Math.max(0,Math.min(highlight.anchor.start,ops.length-1)),end=Math.max(start,Math.min(highlight.anchor.end??highlight.anchor.start,ops.length-1));let resolvedAny=!1;for(let index=start;index<=end;index++){const op=ops[index];resolvedAny=!0,!perOp.has(op)&&(perOp.set(op,highlight),owners.has(highlight)||owners.set(highlight,op))}resolvedAny&&order.set(highlight,order.size)}return{perOp,owners,order,total:order.size}}highlightActionLabel(highlight,index,total){if(highlight.label)return this.localize("highlightWithLabel",void 0,{label:highlight.label});const numberFormat=getNumberFormat(this.effectiveLocale);return this.localize("highlightOfTotal",void 0,{index:numberFormat.format(index+1),total:numberFormat.format(total)})}activateHighlight(highlight){this.emit("lr-highlight-activate",{highlightId:highlight.id})}emitSearchChange(){this.emit("lr-search-change",{query:this.searchQuery,matchCount:this.searchMatches.length,matchCountExact:this.searchMatchCountExact,activeIndex:this.searchActiveIndex}),announceSearchResult((key,fallback,values)=>this.localize(key,fallback,values),this.searchAnnouncer,this.effectiveLocale,this.searchMatches.length,this.searchActiveIndex)}recomputeSearchMatches(){this.lastSearchLocale=this.effectiveLocale;const boundedQuery=boundedViewerSearchQuery(this.searchQuery,this.effectiveLocale),needle=boundedQuery.needle,matches=[];let matchCountExact=boundedQuery.accepted;if(boundedQuery.accepted&&needle){const budget=new ViewerSearchWorkBudget;for(let index=0;index<this.diffOps.length;index++){if(budget.includes(this.diffOps[index].text,needle,this.effectiveLocale)){if(matches.length===MAX_SEARCH_MATCHES){matchCountExact=!1;break}matches.push({opIndex:index})}if(!budget.complete){matchCountExact=!1;break}}}this.searchMatches=matches,this.searchMatchCountExact=matchCountExact}async search(query){this.searchQuery=query,this.recomputeSearchMatches(),this.searchActiveIndex=this.searchMatches.length>0?0:-1,this.emitSearchChange();const active=this.searchMatches[this.searchActiveIndex];return active&&await this.scrollOpIndexIntoView(active.opIndex),this.searchMatches.length}async searchNext(){return this.searchMatches.length?(this.searchActiveIndex=(this.searchActiveIndex+1)%this.searchMatches.length,this.emitSearchChange(),await this.scrollOpIndexIntoView(this.searchMatches[this.searchActiveIndex].opIndex),!0):!1}async searchPrevious(){return this.searchMatches.length?(this.searchActiveIndex=(this.searchActiveIndex-1+this.searchMatches.length)%this.searchMatches.length,this.emitSearchChange(),await this.scrollOpIndexIntoView(this.searchMatches[this.searchActiveIndex].opIndex),!0):!1}clearSearch(){this.searchQuery="",this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.emitSearchChange()}get unifiedText(){return this.diffOps.map(op=>`${op.type==="add"?"+":op.type==="remove"?"-":" "} ${op.text}`).join(`
2
+ `)}isCurrentCopy(generation,owner){return this.isConnected&&this.copyable&&!this.diffTooLarge&&generation===this.copyGeneration&&this.ownerDocument.defaultView===owner}showCopyStatus(status,generation){const owner=this.ownerDocument.defaultView;if(!owner||!this.isCurrentCopy(generation,owner))return;this.copyStatus=status,this.copyAnnouncementSink?.announce(status==="success"?this.localize("copied"):this.localize("copyFailed")),this.cancelCopyTimer();let handle=0;handle=owner.setTimeout(()=>{const timer=this.copyTimer;timer?.owner!==owner||timer.handle!==handle||timer.generation!==generation||!this.isCurrentCopy(generation,owner)||(this.copyTimer=void 0,this.copyStatus="rest")},COPY_CONFIRM_MS),this.copyTimer={owner,handle,generation}}async copy(){if(!this.copyable||this.diffTooLarge)return;const generation=++this.copyGeneration;this.cancelCopyTimer(),this.copyStatus="rest";const text=this.unifiedText,owner=this.isConnected?this.ownerDocument.defaultView:null;if(!owner)return;const outcome=await writeClipboardText(owner,text);if(this.isCurrentCopy(generation,owner)){if(!outcome.ok){this.showCopyStatus("error",generation),this.emit("lr-error"),this.emit("lr-copy-error",outcome);return}this.showCopyStatus("success",generation),this.emit("lr-copy",outcome)}}lineRenderContext(){const{perOp,owners,order,total}=this.resolvedHighlightOps();return{perOp,owners,order,total,matchedOpIndexes:new Set(this.searchMatches.map(match=>match.opIndex)),activeMatchOpIndex:this.searchMatches[this.searchActiveIndex]?.opIndex??-1}}renderDiffLine(op,marker,content,context){const index=this.opIndexMap.get(op),isMatch=index!==void 0&&context.matchedOpIndexes.has(index),isActiveMatch=index!==void 0&&index===context.activeMatchOpIndex,highlight=context.perOp.get(op),owner=highlight&&context.owners.get(highlight)===op?highlight:void 0,ownerLabel=owner?this.highlightActionLabel(owner,context.order.get(owner)??0,context.total):"";return html`<div
3
+ part="line"
4
+ data-type=${op.type}
5
+ data-op-index=${index??nothing}
6
+ ?data-match=${isMatch}
7
+ ?data-active-match=${isActiveMatch}
8
+ data-highlight=${highlight?highlight.tone??"accent":nothing}
9
+ ?data-active-highlight=${!!highlight&&highlight.id===this.activeHighlightId}
10
+ >${marker} ${content}${owner?html`<button
11
+ part="line-highlight-action"
12
+ type="button"
13
+ data-highlight-id=${owner.id}
14
+ aria-label=${ownerLabel}
15
+ @click=${event=>{event.stopPropagation(),this.activateHighlight(owner)}}
16
+ >${owner.label||ownerLabel}</button>`:nothing}</div>`}renderUnified(){const{visible,foldBefore,trailingFold}=this.computeFolds(),context=this.lineRenderContext();let oldCounter=0,newCounter=0;const rows=[];for(const op of this.diffOps){const fold=foldBefore.get(op);if(fold!==void 0&&rows.push(this.foldMarker(fold)),visible.has(op)){const marker=op.type==="add"?"+":op.type==="remove"?"-":" ",lines=op.type==="add"?this.highlightedNewLines:this.highlightedOldLines,index=op.type==="add"?newCounter:oldCounter,highlighted=lines?.[index];rows.push(this.renderDiffLine(op,marker,highlighted!==void 0?unsafeHTML(highlighted):op.text,context))}op.type!=="add"&&oldCounter++,op.type!=="remove"&&newCounter++}return trailingFold>0&&rows.push(this.foldMarker(trailingFold)),html`<pre>${rows}</pre>`}renderSplit(){const{visible,foldBefore,trailingFold}=this.computeFolds(),context=this.lineRenderContext(),splitRows=pairOpsForSplit(this.diffOps);let oldCounter=0,newCounter=0;const leftCells=[],rightCells=[];for(const row of splitRows){const foldOp=row.left&&row.left.type==="equal"?row.left:row.right&&row.right.type==="equal"?row.right:null,fold=foldOp?foldBefore.get(foldOp):void 0;fold!==void 0&&(leftCells.push(this.foldMarker(fold)),rightCells.push(this.foldMarker(fold))),foldOp!==null&&!visible.has(foldOp)||(leftCells.push(this.renderSplitCell(row.left,row.left?oldCounter:-1,this.highlightedOldLines,context)),rightCells.push(this.renderSplitCell(row.right,row.right?newCounter:-1,this.highlightedNewLines,context))),row.left&&oldCounter++,row.right&&newCounter++}return trailingFold>0&&(leftCells.push(this.foldMarker(trailingFold)),rightCells.push(this.foldMarker(trailingFold))),html`
3
17
  <div class="split-grid">
4
18
  <div part="side" data-side="old" role="region" aria-label=${this.localize("diffViewOldLabel")}>
5
19
  ${leftCells}
@@ -8,9 +22,10 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
8
22
  ${rightCells}
9
23
  </div>
10
24
  </div>
11
- `}renderSplitCell(op,lineIndex,highlightedLines){if(!op)return html`<div part="line" data-type="empty"></div>`;const marker=op.type==="add"?"+":op.type==="remove"?"-":" ",highlighted=lineIndex>=0?highlightedLines?.[lineIndex]:void 0;return html`<div part="line" data-type=${op.type}>${marker} ${highlighted!==void 0?unsafeHTML(highlighted):op.text}</div>`}render(){const sanitizedMaxHeight=sanitizeCssLength(this.maxHeight),maxHeightStyle=sanitizedMaxHeight?styleMap({"--lr-diff-view-max-height":sanitizedMaxHeight}):nothing;return this.diffTooLarge?html`<div part="base" style=${maxHeightStyle}>
25
+ `}renderSplitCell(op,lineIndex,highlightedLines,context){if(!op)return html`<div part="line" data-type="empty"></div>`;const marker=op.type==="add"?"+":op.type==="remove"?"-":" ",highlighted=lineIndex>=0?highlightedLines?.[lineIndex]:void 0;return this.renderDiffLine(op,marker,highlighted!==void 0?unsafeHTML(highlighted):op.text,context)}render(){const sanitizedMaxHeight=sanitizeCssLength(this.maxHeight),maxHeightStyle=sanitizedMaxHeight?styleMap({"--lr-diff-view-max-height":sanitizedMaxHeight}):nothing;return this.diffTooLarge?html`<div part="base" style=${maxHeightStyle}>
12
26
  <div part="limit">${this.localize("diffViewTooLarge")}</div>
13
- </div>`:html`
27
+ </div>
28
+ ${this.renderAnchorLiveRegion()}`:html`
14
29
  <div part="base" style=${maxHeightStyle}>
15
30
  ${this.copyable?html`<button
16
31
  part="copy-button"
@@ -22,4 +37,5 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
22
37
  </button>`:nothing}
23
38
  ${this.layout==="split"?this.renderSplit():this.renderUnified()}
24
39
  </div>
25
- `}}__decorate([property({attribute:!1})],LyraDiffView.prototype,"oldText",void 0),__decorate([property({attribute:!1})],LyraDiffView.prototype,"newText",void 0),__decorate([property({type:Boolean})],LyraDiffView.prototype,"copyable",void 0),__decorate([property({attribute:"max-height"})],LyraDiffView.prototype,"maxHeight",void 0),__decorate([property({reflect:!0,converter:DIFF_VIEW_LAYOUT})],LyraDiffView.prototype,"layout",null),__decorate([property()],LyraDiffView.prototype,"language",void 0),__decorate([property({attribute:!1})],LyraDiffView.prototype,"languages",void 0),__decorate([property({type:Number,attribute:"context-lines"})],LyraDiffView.prototype,"contextLines",void 0),__decorate([property({type:Number,attribute:"max-lines"})],LyraDiffView.prototype,"maxLines",void 0),__decorate([state()],LyraDiffView.prototype,"copyStatus",void 0),__decorate([state()],LyraDiffView.prototype,"diffTooLarge",void 0),__decorate([state()],LyraDiffView.prototype,"highlightedOldLines",void 0),__decorate([state()],LyraDiffView.prototype,"highlightedNewLines",void 0);export{LyraDiffView};
40
+ ${this.renderAnchorLiveRegion()}
41
+ `}}__decorate([property({attribute:!1})],LyraDiffView.prototype,"oldText",void 0),__decorate([property({attribute:!1})],LyraDiffView.prototype,"newText",void 0),__decorate([property({type:Boolean})],LyraDiffView.prototype,"copyable",void 0),__decorate([property({attribute:"max-height"})],LyraDiffView.prototype,"maxHeight",void 0),__decorate([property({reflect:!0,converter:DIFF_VIEW_LAYOUT})],LyraDiffView.prototype,"layout",null),__decorate([property()],LyraDiffView.prototype,"language",void 0),__decorate([property({attribute:!1})],LyraDiffView.prototype,"languages",void 0),__decorate([property({type:Number,attribute:"context-lines"})],LyraDiffView.prototype,"contextLines",void 0),__decorate([property({type:Number,attribute:"max-lines"})],LyraDiffView.prototype,"maxLines",void 0),__decorate([state()],LyraDiffView.prototype,"copyStatus",void 0),__decorate([state()],LyraDiffView.prototype,"diffTooLarge",void 0),__decorate([state()],LyraDiffView.prototype,"searchMatches",void 0),__decorate([state()],LyraDiffView.prototype,"searchActiveIndex",void 0),__decorate([state()],LyraDiffView.prototype,"forcedVisibleOps",void 0),__decorate([state()],LyraDiffView.prototype,"highlightedOldLines",void 0),__decorate([state()],LyraDiffView.prototype,"highlightedNewLines",void 0);export{LyraDiffView};
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{--_lr-diff-view-max-height:none;--_lr-diff-view-font:var(--lr-font-mono);--_lr-diff-view-add-background:var(--lr-color-success-quiet);--_lr-diff-view-add-color:var(--lr-color-success);--_lr-diff-view-remove-background:var(--lr-color-danger-quiet);--_lr-diff-view-remove-color:var(--lr-color-danger);--_lr-diff-view-fold-background:var(--lr-color-surface-raised);--_lr-diff-view-fold-color:var(--lr-color-text-quiet);display:block}[part=base]{max-block-size:var(--lr-diff-view-max-height,var(--_lr-diff-view-max-height));border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);position:relative;overflow:auto}pre{padding:var(--lr-space-s);margin:0}[part=limit]{padding:var(--lr-space-m);color:var(--lr-color-text-quiet);overflow-wrap:anywhere}.split-grid{gap:var(--lr-space-s);padding:var(--lr-space-s);grid-template-columns:1fr 1fr;align-items:start;display:grid}[part=side]{min-inline-size:0;overflow:auto hidden}[part=line]{font-family:var(--lr-diff-view-font,var(--_lr-diff-view-font));font-size:var(--lr-font-size-sm);line-height:var(--lr-line-height-snug);white-space:pre-wrap;box-sizing:border-box;inline-size:max-content;min-inline-size:100%}[part=line]:not([data-type=fold]){direction:ltr;unicode-bidi:isolate}[part=line][data-type=add]{background:var(--lr-diff-view-add-background,var(--_lr-diff-view-add-background));color:var(--lr-diff-view-add-color,var(--_lr-diff-view-add-color))}[part=line][data-type=remove]{background:var(--lr-diff-view-remove-background,var(--_lr-diff-view-remove-background));color:var(--lr-diff-view-remove-color,var(--_lr-diff-view-remove-color))}[part=line][data-type=fold]{color:var(--lr-diff-view-fold-color,var(--_lr-diff-view-fold-color));background:var(--lr-diff-view-fold-background,var(--_lr-diff-view-fold-background));text-align:center}[part=copy-button]{border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);font-size:var(--lr-font-size-xs);padding:var(--lr-size-0-125rem) var(--lr-space-s);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);cursor:pointer;transition:var(--lr-transition-interactive);position:absolute;inset-block-start:var(--lr-space-xs);inset-inline-end:var(--lr-space-xs)}[part=copy-button]:hover{border-color:var(--lr-color-brand)}[part=copy-button]:active{border-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=copy-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{--_lr-diff-view-max-height:none;--_lr-diff-view-font:var(--lr-font-mono);--_lr-diff-view-add-background:var(--lr-color-success-quiet);--_lr-diff-view-add-color:var(--lr-color-success);--_lr-diff-view-remove-background:var(--lr-color-danger-quiet);--_lr-diff-view-remove-color:var(--lr-color-danger);--_lr-diff-view-fold-background:var(--lr-color-surface-raised);--_lr-diff-view-fold-color:var(--lr-color-text-quiet);display:block}[part=base]{max-block-size:var(--lr-diff-view-max-height,var(--_lr-diff-view-max-height));border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);position:relative;overflow:auto}pre{padding:var(--lr-space-s);margin:0}[part=limit]{padding:var(--lr-space-m);color:var(--lr-color-text-quiet);overflow-wrap:anywhere}.split-grid{gap:var(--lr-space-s);padding:var(--lr-space-s);grid-template-columns:1fr 1fr;align-items:start;display:grid}[part=side]{min-inline-size:0;overflow:auto hidden}[part=line]{font-family:var(--lr-diff-view-font,var(--_lr-diff-view-font));font-size:var(--lr-font-size-sm);line-height:var(--lr-line-height-snug);white-space:pre-wrap;box-sizing:border-box;inline-size:max-content;min-inline-size:100%}[part=line]:not([data-type=fold]){direction:ltr;unicode-bidi:isolate}[part=line][data-type=add]{background:var(--lr-diff-view-add-background,var(--_lr-diff-view-add-background));color:var(--lr-diff-view-add-color,var(--_lr-diff-view-add-color))}[part=line][data-type=remove]{background:var(--lr-diff-view-remove-background,var(--_lr-diff-view-remove-background));color:var(--lr-diff-view-remove-color,var(--_lr-diff-view-remove-color))}[part=line][data-type=fold]{color:var(--lr-diff-view-fold-color,var(--_lr-diff-view-fold-color));background:var(--lr-diff-view-fold-background,var(--_lr-diff-view-fold-background));text-align:center}[part=line][data-match]{outline:var(--lr-border-width-thin) dashed var(--lr-diff-view-match-color,var(--lr-color-warning))}[part=line][data-active-match]{outline:var(--lr-border-width-medium) solid var(--lr-diff-view-active-match-color,var(--lr-color-warning))}[part=line][data-highlight]{--_lr-diff-view-highlight-background:var(--lr-diff-view-highlight-accent-background,var(--lr-color-brand-quiet));background:var(--_lr-diff-view-highlight-background)}[part=line][data-highlight=success]{--_lr-diff-view-highlight-background:var(--lr-diff-view-highlight-success-background,var(--lr-color-success-quiet))}[part=line][data-highlight=warning]{--_lr-diff-view-highlight-background:var(--lr-diff-view-highlight-warning-background,var(--lr-color-warning-quiet))}[part=line][data-highlight=danger]{--_lr-diff-view-highlight-background:var(--lr-diff-view-highlight-danger-background,var(--lr-color-danger-quiet))}[part=line][data-highlight=neutral]{--_lr-diff-view-highlight-background:var(--lr-diff-view-highlight-neutral-background,var(--lr-color-surface-raised))}[part=line][data-active-highlight]{outline:var(--lr-border-width-medium) solid var(--lr-diff-view-highlight-active-outline,var(--lr-color-brand));outline-offset:var(--lr-focus-ring-offset)}[part=line-highlight-action]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;font:inherit;font-size:var(--lr-font-size-xs);padding:var(--lr-size-0-125rem) var(--lr-space-xs);transition:var(--lr-transition-interactive);margin-inline-start:var(--lr-space-xs);display:inline-block}[part=line-highlight-action]:hover{background:var(--_lr-diff-view-highlight-background)}[part=line-highlight-action]:active{background:color-mix(in oklab, var(--_lr-diff-view-highlight-background), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=line-highlight-action]:focus-visible{outline:var(--lr-focus-ring);outline-offset:var(--lr-focus-ring-offset)}[part=copy-button]{border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);font-size:var(--lr-font-size-xs);padding:var(--lr-size-0-125rem) var(--lr-space-s);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);cursor:pointer;transition:var(--lr-transition-interactive);position:absolute;inset-block-start:var(--lr-space-xs);inset-inline-end:var(--lr-space-xs)}[part=copy-button]:hover{border-color:var(--lr-color-brand)}[part=copy-button]:active{border-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=copy-button]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}`;export{styles};
@@ -69,6 +69,10 @@ readonly extension?:string;}export type LyraExportFormatOption=LyraExportFormat|
69
69
  * @cssprop --lr-export-button-active-background - Trigger fill while pressed.
70
70
  * @cssprop --lr-export-button-active-color - Trigger label and icon colour while pressed.
71
71
  * @cssprop --lr-export-button-active-border - Trigger edge colour while pressed.
72
+ * @cssprop [--lr-export-button-gap=var(--lr-space-xs)] - Gap between the trigger's icon and label.
73
+ * Constant across the `size` ladder's tiers.
74
+ * @cssprop [--lr-export-button-radius=var(--lr-radius)] - Trigger corner radius. Retune it without
75
+ * a `::part(trigger)` rule.
72
76
  * @property size - Optional density on the shared `2xs` through `xl` ladder, including the
73
77
  * `small`/`medium`/`large` aliases. It changes the trigger and menu-row typography and padding;
74
78
  * the 40px default hit-area floor remains in place. Unset preserves the established geometry.
@@ -136,14 +140,34 @@ accessibleLabel:string|null;open:boolean;private triggerEl?;private menuEl?;
136
140
  /** True from a failed built-in CSV/JSON export until the next export attempt starts; drives
137
141
  * the visible `trigger-error` part token. */
138
142
  private exportFailed;
143
+ /** Removes the settled-closed format menu from layout (`[hidden]` -> `display:none`) so its
144
+ * stale placed coordinates and full-content box stop contributing to whatever ancestor
145
+ * establishes its CSS containing block. Starts `true`, clears as soon as `open` becomes true --
146
+ * before `syncMenuOverlay()`'s deferred placement runs, so the menu is still a real, measurable
147
+ * box -- and is set back only once the CSS opacity/transform exit transition has actually
148
+ * finished playing (`settleMenuHidden()`), preserving the existing fade in the meantime. Mirrors
149
+ * `LyraSelect`'s `listboxHidden`. */
150
+ private menuHidden;private menuHideToken;
139
151
  /** Handle on the shared light-DOM live region export outcomes announce through -- a region
140
152
  * rendered inside this shadow root is not reliably announced. Acquired on connect, not on the
141
153
  * first failure, so assistive tech is already observing before any text arrives. */
142
- private sink?;private readonly menuId;private cleanup?;private overlay?;private menuPositioned;private pointerDocument?;private connectionGeneration;private connectedDocument?;private pendingDisconnectDocument?;private _isFirstUpdate;private openVetoed;
154
+ private sink?;private readonly menuId;private cleanup?;private overlay?;
155
+ /** Reactive so the CSS `[data-positioned]` gate (export-button.styles.ts) can defer the
156
+ * opacity/transform open transition one render past the `hidden` -> unhidden one -- see that
157
+ * rule's own comment. */
158
+ private menuPositioned;private pointerDocument?;private connectionGeneration;private connectedDocument?;private pendingDisconnectDocument?;private _isFirstUpdate;private openVetoed;
143
159
  /** Which menu item to focus the next time `open` flips true; reset after use. */
144
160
  private pendingMenuFocusIndex;private formatsFocusSnapshot?;private forcedMenuClose?;
145
161
  /** Tracks only the temporary focus-rescue tabindex this component added itself. */
146
- private injectedHostTabIndex;private restoreFocusOnMenuClose;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private bindDocumentPointer;private unbindDocumentPointer;private onDocPointer;private openMenu;private closeMenu;private activateMenuOverlay;private deactivateMenuOverlay;private syncMenuOverlay;private menuItemEls;
162
+ private injectedHostTabIndex;private restoreFocusOnMenuClose;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private bindDocumentPointer;private unbindDocumentPointer;private onDocPointer;private openMenu;private closeMenu;private activateMenuOverlay;private deactivateMenuOverlay;private syncMenuOverlay;
163
+ /** Removes the menu from layout only once its CSS opacity/transform exit transition has
164
+ * actually finished playing -- or immediately when there is none to wait for (reduced motion,
165
+ * a collapsed `formats` list with no menu element at all, or a `--lr-transition-fast` override
166
+ * of `0s`), matching this component's own transition-duration custom property rather than a
167
+ * hardcoded guess. A safety timeout covers a browser that never dispatches the end event.
168
+ * Superseded by a fresh close (a new token) or a reopen (`this.open` true again) at either
169
+ * await point. */
170
+ private settleMenuHidden;private menuItemEls;
147
171
  /** Focuses the menu item at `index` (clamped), if the menu is already open and rendered. */
148
172
  private focusMenuItem;
149
173
  /** Opens the menu (if closed) and focuses `index`, or moves focus there directly if already open. */
@@ -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{LyraElement}from"../../../internal/lyra-element.js";import{optionalLiteralSetConverter}from"../../../internal/converters.js";import{normalizeReflectedOptionalSize,optionalSizeConverter}from"../../../internal/variants.js";import{sizes}from"../../../internal/sizes.styles.js";import{deferredPlaceReady as place}from"../../../internal/anchored-overlay-runtime.js";import{nextId}from"../../../internal/a11y.js";import{resolveEffectivePositioningStrategy}from"../../../internal/positioning-strategy.js";import{buildCsv,downloadBlob}from"./csv.js";import{styles}from"./export-button.styles.js";import{activeElementIn}from"../../../internal/active-element.js";import{activateNonmodalOverlay}from"../../../internal/nonmodal-overlay-manager.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{LYRA_DEFAULT_exportButtonLabel,LYRA_DEFAULT_exportFormatMenuLabel,LYRA_DEFAULT_statusError}from"../../../internal/default-strings.generated.js";const EXPORT_BUTTON_APPEARANCE=optionalLiteralSetConverter(["outlined","quiet"]),MAX_EXPORT_FORMATS=1e4;function queueDocumentMicrotask(ownerDocument,callback){const ownerWindow=ownerDocument.defaultView;if(ownerWindow){ownerWindow.queueMicrotask(callback);return}Promise.resolve().then(callback)}function formatArrayLength(value){try{if(!Array.isArray(value))return;const length=getOwnDataDescriptor(value,"length");return length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0?void 0:{source:value,length:Math.min(length.value,MAX_EXPORT_FORMATS)}}catch{return}}function projectExportFormat(value){if(value==="csv"||value==="json")return value;if(value===null||typeof value!="object")return;const formatId=getOwnDataDescriptor(value,"formatId"),label=getOwnDataDescriptor(value,"label");if(formatId===MISSING_OWN_DATA_DESCRIPTOR||formatId===UNSAFE_OWN_DATA_DESCRIPTOR||label===MISSING_OWN_DATA_DESCRIPTOR||label===UNSAFE_OWN_DATA_DESCRIPTOR||typeof formatId.value!="string"||formatId.value.trim().length===0||typeof label.value!="string"||label.value.trim().length===0)return;const description=getOwnDataDescriptor(value,"description"),extension=getOwnDataDescriptor(value,"extension");return Object.freeze({formatId:formatId.value,label:label.value,...description!==MISSING_OWN_DATA_DESCRIPTOR&&description!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof description.value=="string"?{description:description.value}:{},...extension!==MISSING_OWN_DATA_DESCRIPTOR&&extension!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof extension.value=="string"?{extension:extension.value}:{}})}class LyraExportButton extends LyraElement{constructor(){super(...arguments),this._rows=Object.freeze([]),this._columns=Object.freeze([]),this.filename="export",this.bom=!1,this._formats=Object.freeze(["csv"]),this.disabled=!1,this.loading=!1,this.accessibleLabel=null,this.open=!1,this.exportFailed=!1,this.menuId=nextId("export-menu"),this.menuPositioned=!1,this.connectionGeneration=0,this._isFirstUpdate=!0,this.openVetoed=!1,this.pendingMenuFocusIndex=0,this.injectedHostTabIndex=!1,this.restoreFocusOnMenuClose=!1,this.onDocPointer=e=>{e.composedPath().includes(this)||(this.overlay?.isActive()?this.overlay.dismissBackdrop():this.closeMenu())},this.syncMenuOverlay=()=>{if(this.cleanup?.(),this.cleanup=void 0,this.menuPositioned=!1,this.unbindDocumentPointer(),!this.open||!this.isConnected){const restoreFocus=this.restoreFocusOnMenuClose;this.restoreFocusOnMenuClose=!1,this.deactivateMenuOverlay(restoreFocus);return}this.activateMenuOverlay(),this.bindDocumentPointer();const anchor=this.triggerEl,menu=this.menuEl,ownerDocument=this.ownerDocument;if(!anchor||!menu)return;const placement=place(anchor,menu,{strategy:resolveEffectivePositioningStrategy(this,void 0,"fixed")});this.cleanup=placement,placement.ready.then(positioned=>{if(!(this.cleanup!==placement||!this.open||!this.isConnected||this.ownerDocument!==ownerDocument)){if(!positioned){this.forcedMenuClose="state",this.open=!1;return}this.menuPositioned=!0,this.focusMenuItem(this.pendingMenuFocusIndex),this.pendingMenuFocusIndex=0}})},this.onKeyDown=e=>{if(this.formats.length<=1||this.disabled||this.loading)return;const items=this.menuItemEls(),currentIndex=items.indexOf(e.target);switch(e.key){case"ArrowDown":e.preventDefault(),this.focusMenuItemOnOpen(currentIndex===-1?0:currentIndex+1);break;case"ArrowUp":e.preventDefault(),this.focusMenuItemOnOpen(currentIndex===-1?items.length-1:currentIndex-1);break;case"Home":this.open&&(e.preventDefault(),this.focusMenuItem(0));break;case"End":this.open&&(e.preventDefault(),this.focusMenuItem(items.length-1));break}}}static{this.defaultStrings={...super.defaultStrings,exportButtonLabel:LYRA_DEFAULT_exportButtonLabel,exportFormatMenuLabel:LYRA_DEFAULT_exportFormatMenuLabel,statusError:LYRA_DEFAULT_statusError}}static{this.styles=[LyraElement.styles,sizes,styles]}static{this.properties={rows:{attribute:!1,noAccessor:!0},columns:{attribute:!1,noAccessor:!0},formats:{attribute:!1,noAccessor:!0}}}get rows(){return this._rows}set rows(next){const previous=this._rows,source=Array.isArray(next)?next:[];this._rows=Object.freeze(source.map(row=>Object.freeze({...row}))),this.requestUpdate("rows",previous)}get columns(){return this._columns}set columns(next){const previous=this._columns,source=Array.isArray(next)?next:[];this._columns=Object.freeze(source.map(column=>Object.freeze({...column}))),this.requestUpdate("columns",previous)}get formats(){return this._formats}set formats(next){const previous=this._formats,source=formatArrayLength(next),seen=new Set,formats=[];for(let index=0;source&&index<source.length;index+=1){const descriptor=getOwnDataDescriptor(source.source,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const snapshot=projectExportFormat(descriptor.value);if(!snapshot)continue;const id=typeof snapshot=="string"?snapshot:snapshot.formatId;typeof id!="string"||id.trim()===""||seen.has(id)||(seen.add(id),formats.push(snapshot))}this._formats=Object.freeze(formats),this.requestUpdate("formats",previous)}get size(){return this._size}set size(next){const normalized=normalizeReflectedOptionalSize(this,next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}get appearance(){return this._appearance}set appearance(next){const normalized=EXPORT_BUTTON_APPEARANCE.normalizeReflected(this,"appearance",next),old=this._appearance;old!==normalized&&(this._appearance=normalized,this.requestUpdate("appearance",old))}connectedCallback(){const pendingDisconnectDocument=this.pendingDisconnectDocument;if(this.pendingDisconnectDocument=void 0,this.connectionGeneration+=1,this.connectedDocument=this.ownerDocument,super.connectedCallback(),this.sink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),pendingDisconnectDocument){if(pendingDisconnectDocument===this.ownerDocument){this.deactivateMenuOverlay(!1),this.restoreFocusOnMenuClose=!1,this.open=!1;return}this.hasUpdated&&this.open&&this.scheduleAfterUpdate(this.syncMenuOverlay,"export-button-menu-overlay");return}this.hasUpdated&&this.open&&this.scheduleAfterUpdate(this.syncMenuOverlay,"export-button-menu-overlay")}disconnectedCallback(){const generation=++this.connectionGeneration,disconnectDocument=this.connectedDocument??this.ownerDocument;this.pendingDisconnectDocument=disconnectDocument,super.disconnectedCallback(),this.cleanup?.(),this.cleanup=void 0,this.menuPositioned=!1,this.unbindDocumentPointer(),this.overlay?.suspend(),this.restoreFocusOnMenuClose=!1,this.sink?.release(),this.sink=void 0,queueDocumentMicrotask(disconnectDocument,()=>{this.connectionGeneration!==generation||this.isConnected||this.pendingDisconnectDocument!==disconnectDocument||(this.pendingDisconnectDocument=void 0,this.deactivateMenuOverlay(!1),this.restoreFocusOnMenuClose=!1,this.open=!1)})}adoptedCallback(){super.adoptedCallback(),this.cleanup?.(),this.cleanup=void 0,this.unbindDocumentPointer(),this.overlay?.suspend(),this.sink?.release(),this.sink=void 0}bindDocumentPointer(){if(!this.isConnected)return;const owner=this.ownerDocument;this.pointerDocument!==owner&&(this.unbindDocumentPointer(),owner.addEventListener("pointerdown",this.onDocPointer),this.pointerDocument=owner)}unbindDocumentPointer(){this.pointerDocument?.removeEventListener("pointerdown",this.onDocPointer),this.pointerDocument=void 0}openMenu(){this.open||(this.open=!0)}closeMenu(restoreFocus=!1){this.open&&(this.restoreFocusOnMenuClose||=restoreFocus,this.open=!1)}activateMenuOverlay(){if(this.overlay?.isActive()){this.overlay.resume();return}this.overlay=activateNonmodalOverlay({host:this,panel:()=>this.menuEl??null,onEscape:()=>this.closeMenu(!0),onBackdrop:()=>this.closeMenu(),onTab:()=>this.closeMenu(),restoreFocusTo:()=>this.triggerEl??null})}deactivateMenuOverlay(restoreFocus){const overlay=this.overlay;this.overlay=void 0,overlay?.deactivate({restoreFocus}),this.unbindDocumentPointer()}menuItemEls(){return Array.from(this.renderRoot.querySelectorAll('[part="menu-item"]'))}focusMenuItem(index){const items=this.menuItemEls();items.length!==0&&items[Math.max(0,Math.min(items.length-1,index))]?.focus()}focusMenuItemOnOpen(index){this.open&&this.menuPositioned?this.focusMenuItem(index):(this.pendingMenuFocusIndex=index,this.open||this.openMenu())}firstUpdated(changed){super.firstUpdated(changed),this.renderRoot.addEventListener("keydown",this.onKeyDown)}willUpdate(changed){if(super.willUpdate(changed),this._isFirstUpdate=!this.hasUpdated,this.setAttribute("aria-busy",String(this.loading)),(changed.has("disabled")||changed.has("loading"))&&!this.disabled&&!this.loading&&this.injectedHostTabIndex&&(this.getAttribute("tabindex")==="-1"&&this.removeAttribute("tabindex"),this.injectedHostTabIndex=!1),(changed.has("disabled")||changed.has("loading"))&&(this.disabled||this.loading)){const active=activeElementIn(this.shadowRoot);if(active===this.triggerEl||active?.getAttribute("part")==="menu-item"){this.hasAttribute("tabindex")||(this.tabIndex=-1,this.injectedHostTabIndex=!0);const ownerHTMLElement=this.ownerDocument.defaultView?.HTMLElement,nativeFocus=ownerHTMLElement?Reflect.get(ownerHTMLElement.prototype,"focus",this):void 0;typeof nativeFocus=="function"&&nativeFocus.call(this,{preventScroll:!0})}this.open&&(this.open=!1,this.forcedMenuClose="state")}if(changed.has("formats")){const active=activeElementIn(this.shadowRoot),index=this.menuItemEls().indexOf(active),previous=changed.get("formats")?.[index];this.formatsFocusSnapshot=index>=0&&previous?{index,id:this.formatId(previous)}:void 0}if(this.open&&this.formats.length<=1){const previousOpen=changed.get("open");this.forcedMenuClose=changed.has("formats")&&changed.get("formats")?.length?"formats":previousOpen===!1||previousOpen===void 0?"invalid-open":"state",this.open=!1}this.announceMenuTransition(changed)}announceMenuTransition(changed){if(this.openVetoed=!1,!changed.has("open")||this._isFirstUpdate||this.forcedMenuClose)return;const name=this.open?"lr-show":"lr-hide";this.emit(name,null,{cancelable:!0}).defaultPrevented&&(this.openVetoed=!0,this.open=!this.open)}updated(changed){super.updated(changed);const forcedMenuClose=this.forcedMenuClose;if(this.forcedMenuClose=void 0,(changed.has("open")||forcedMenuClose==="formats"||forcedMenuClose==="state")&&!this.openVetoed?this.syncMenuOverlay():this.openVetoed&&(this.restoreFocusOnMenuClose=!1),changed.has("formats")&&this.formatsFocusSnapshot){const{index,id}=this.formatsFocusSnapshot;this.formatsFocusSnapshot=void 0,this.scheduleAfterUpdate(()=>{if(this.formats.length<=1)this.closeMenu(),this.triggerEl?.focus();else if(this.open){const nextIndex=this.formats.findIndex(format=>this.formatId(format)===id);this.focusMenuItemOnOpen(nextIndex>=0?nextIndex:index)}})}}effectiveColumns(rows){if(this.columns.length>0)return this.columns;const keys=new Set;for(const row of rows)for(const key of Object.keys(row))keys.add(key);return Array.from(keys,key=>({key,label:key}))}rowsToExport(){if(this.getRows===void 0)return this.rows;const supplied=this.getRows();return Array.isArray(supplied)?supplied:[]}rowsForExport(rows){const keys=this.effectiveColumns(rows).map(c=>c.key);return rows.map(row=>{const picked=Object.create(null);for(const key of keys)picked[key]=row[key];return picked})}formatId(format){return typeof format=="string"?format:format.formatId}formatLabel(format){return typeof format=="string"?format.toUpperCase():format.label}doExport(formatOption){if(this.disabled||this.loading)return;this.closeMenu(),this.triggerEl?.focus(),this.exportFailed=!1;const format=this.formatId(formatOption);if(!this.emit("lr-export",Object.freeze({format}),{cancelable:!0}).defaultPrevented&&!(format!=="csv"&&format!=="json"))try{const rows=this.rowsToExport();format==="csv"?downloadBlob(buildCsv(rows,this.effectiveColumns(rows),{bom:this.bom}),`${this.filename}.csv`,"text/csv;charset=utf-8;",this.ownerDocument):downloadBlob(JSON.stringify(this.rowsForExport(rows),null,2),`${this.filename}.json`,"application/json",this.ownerDocument),this.emit("lr-export-complete",Object.freeze({format}))}catch(error){this.exportFailed=!0,this.sink?.announce(this.localize("statusError")),this.emit("lr-export-error",Object.freeze({format,error}))}}onTriggerClick(){this.disabled||this.loading||this.formats.length!==0&&(this.formats.length===1?this.doExport(this.formats[0]):this.open?this.closeMenu():this.openMenu())}focus(options){this.triggerEl?.focus(options)}blur(){this.triggerEl?.blur()}click(){this.triggerEl?.click()}get effectiveLabel(){return this.label==null?this.localize("exportButtonLabel"):this.label}render(){const label=this.effectiveLabel,labelNamesTrigger=label.trim().length>0,accessibleLabel=this.accessibleLabel??(labelNamesTrigger?label:this.localize("exportButtonLabel")),triggerAriaLabel=this.accessibleLabel!==null||!labelNamesTrigger?accessibleLabel:nothing;return html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{optionalLiteralSetConverter}from"../../../internal/converters.js";import{normalizeReflectedOptionalSize,optionalSizeConverter}from"../../../internal/variants.js";import{sizes}from"../../../internal/sizes.styles.js";import{deferredPlaceReady as place}from"../../../internal/anchored-overlay-runtime.js";import{nextId}from"../../../internal/a11y.js";import{resolveEffectivePositioningStrategy}from"../../../internal/positioning-strategy.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{buildCsv,downloadBlob}from"./csv.js";import{styles}from"./export-button.styles.js";import{activeElementIn}from"../../../internal/active-element.js";import{activateNonmodalOverlay}from"../../../internal/nonmodal-overlay-manager.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{LYRA_DEFAULT_exportButtonLabel,LYRA_DEFAULT_exportFormatMenuLabel,LYRA_DEFAULT_statusError}from"../../../internal/default-strings.generated.js";function parseCssTime(value){const trimmed=value.trim();return trimmed.endsWith("ms")?Number.parseFloat(trimmed):trimmed.endsWith("s")?Number.parseFloat(trimmed)*1e3:0}function maxCssTransitionTime(value){return Math.max(0,...value.split(",").map(parseCssTime).filter(Number.isFinite))}const EXPORT_BUTTON_APPEARANCE=optionalLiteralSetConverter(["outlined","quiet"]),MAX_EXPORT_FORMATS=1e4;function queueDocumentMicrotask(ownerDocument,callback){const ownerWindow=ownerDocument.defaultView;if(ownerWindow){ownerWindow.queueMicrotask(callback);return}Promise.resolve().then(callback)}function formatArrayLength(value){try{if(!Array.isArray(value))return;const length=getOwnDataDescriptor(value,"length");return length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0?void 0:{source:value,length:Math.min(length.value,MAX_EXPORT_FORMATS)}}catch{return}}function projectExportFormat(value){if(value==="csv"||value==="json")return value;if(value===null||typeof value!="object")return;const formatId=getOwnDataDescriptor(value,"formatId"),label=getOwnDataDescriptor(value,"label");if(formatId===MISSING_OWN_DATA_DESCRIPTOR||formatId===UNSAFE_OWN_DATA_DESCRIPTOR||label===MISSING_OWN_DATA_DESCRIPTOR||label===UNSAFE_OWN_DATA_DESCRIPTOR||typeof formatId.value!="string"||formatId.value.trim().length===0||typeof label.value!="string"||label.value.trim().length===0)return;const description=getOwnDataDescriptor(value,"description"),extension=getOwnDataDescriptor(value,"extension");return Object.freeze({formatId:formatId.value,label:label.value,...description!==MISSING_OWN_DATA_DESCRIPTOR&&description!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof description.value=="string"?{description:description.value}:{},...extension!==MISSING_OWN_DATA_DESCRIPTOR&&extension!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof extension.value=="string"?{extension:extension.value}:{}})}class LyraExportButton extends LyraElement{constructor(){super(...arguments),this._rows=Object.freeze([]),this._columns=Object.freeze([]),this.filename="export",this.bom=!1,this._formats=Object.freeze(["csv"]),this.disabled=!1,this.loading=!1,this.accessibleLabel=null,this.open=!1,this.exportFailed=!1,this.menuHidden=!0,this.menuHideToken=0,this.menuId=nextId("export-menu"),this.menuPositioned=!1,this.connectionGeneration=0,this._isFirstUpdate=!0,this.openVetoed=!1,this.pendingMenuFocusIndex=0,this.injectedHostTabIndex=!1,this.restoreFocusOnMenuClose=!1,this.onDocPointer=e=>{e.composedPath().includes(this)||(this.overlay?.isActive()?this.overlay.dismissBackdrop():this.closeMenu())},this.syncMenuOverlay=()=>{if(this.cleanup?.(),this.cleanup=void 0,this.menuPositioned=!1,this.unbindDocumentPointer(),!this.open||!this.isConnected){const restoreFocus=this.restoreFocusOnMenuClose;this.restoreFocusOnMenuClose=!1,this.deactivateMenuOverlay(restoreFocus),this.settleMenuHidden();return}this.activateMenuOverlay(),this.bindDocumentPointer();const anchor=this.triggerEl,menu=this.menuEl,ownerDocument=this.ownerDocument;if(!anchor||!menu)return;const placement=place(anchor,menu,{strategy:resolveEffectivePositioningStrategy(this,void 0,"fixed")});this.cleanup=placement,placement.ready.then(positioned=>{if(!(this.cleanup!==placement||!this.open||!this.isConnected||this.ownerDocument!==ownerDocument)){if(!positioned){this.forcedMenuClose="state",this.open=!1;return}this.menuPositioned=!0,this.focusMenuItem(this.pendingMenuFocusIndex),this.pendingMenuFocusIndex=0}})},this.onKeyDown=e=>{if(this.formats.length<=1||this.disabled||this.loading)return;const items=this.menuItemEls(),currentIndex=items.indexOf(e.target);switch(e.key){case"ArrowDown":e.preventDefault(),this.focusMenuItemOnOpen(currentIndex===-1?0:currentIndex+1);break;case"ArrowUp":e.preventDefault(),this.focusMenuItemOnOpen(currentIndex===-1?items.length-1:currentIndex-1);break;case"Home":this.open&&(e.preventDefault(),this.focusMenuItem(0));break;case"End":this.open&&(e.preventDefault(),this.focusMenuItem(items.length-1));break}}}static{this.defaultStrings={...super.defaultStrings,exportButtonLabel:LYRA_DEFAULT_exportButtonLabel,exportFormatMenuLabel:LYRA_DEFAULT_exportFormatMenuLabel,statusError:LYRA_DEFAULT_statusError}}static{this.styles=[LyraElement.styles,sizes,styles]}static{this.properties={rows:{attribute:!1,noAccessor:!0},columns:{attribute:!1,noAccessor:!0},formats:{attribute:!1,noAccessor:!0}}}get rows(){return this._rows}set rows(next){const previous=this._rows,source=Array.isArray(next)?next:[];this._rows=Object.freeze(source.map(row=>Object.freeze({...row}))),this.requestUpdate("rows",previous)}get columns(){return this._columns}set columns(next){const previous=this._columns,source=Array.isArray(next)?next:[];this._columns=Object.freeze(source.map(column=>Object.freeze({...column}))),this.requestUpdate("columns",previous)}get formats(){return this._formats}set formats(next){const previous=this._formats,source=formatArrayLength(next),seen=new Set,formats=[];for(let index=0;source&&index<source.length;index+=1){const descriptor=getOwnDataDescriptor(source.source,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const snapshot=projectExportFormat(descriptor.value);if(!snapshot)continue;const id=typeof snapshot=="string"?snapshot:snapshot.formatId;typeof id!="string"||id.trim()===""||seen.has(id)||(seen.add(id),formats.push(snapshot))}this._formats=Object.freeze(formats),this.requestUpdate("formats",previous)}get size(){return this._size}set size(next){const normalized=normalizeReflectedOptionalSize(this,next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}get appearance(){return this._appearance}set appearance(next){const normalized=EXPORT_BUTTON_APPEARANCE.normalizeReflected(this,"appearance",next),old=this._appearance;old!==normalized&&(this._appearance=normalized,this.requestUpdate("appearance",old))}connectedCallback(){const pendingDisconnectDocument=this.pendingDisconnectDocument;if(this.pendingDisconnectDocument=void 0,this.connectionGeneration+=1,this.connectedDocument=this.ownerDocument,super.connectedCallback(),this.sink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),pendingDisconnectDocument){if(pendingDisconnectDocument===this.ownerDocument){this.deactivateMenuOverlay(!1),this.restoreFocusOnMenuClose=!1,this.open=!1;return}this.hasUpdated&&this.open&&(this.menuHidden=!1,this.scheduleAfterUpdate(this.syncMenuOverlay,"export-button-menu-overlay"));return}this.hasUpdated&&this.open&&(this.menuHidden=!1,this.scheduleAfterUpdate(this.syncMenuOverlay,"export-button-menu-overlay"))}disconnectedCallback(){const generation=++this.connectionGeneration,disconnectDocument=this.connectedDocument??this.ownerDocument;this.pendingDisconnectDocument=disconnectDocument,super.disconnectedCallback(),this.cleanup?.(),this.cleanup=void 0,this.menuPositioned=!1,this.unbindDocumentPointer(),this.overlay?.suspend(),this.restoreFocusOnMenuClose=!1,this.sink?.release(),this.sink=void 0,this.menuHideToken++,this.menuHidden=!0,queueDocumentMicrotask(disconnectDocument,()=>{this.connectionGeneration!==generation||this.isConnected||this.pendingDisconnectDocument!==disconnectDocument||(this.pendingDisconnectDocument=void 0,this.deactivateMenuOverlay(!1),this.restoreFocusOnMenuClose=!1,this.open=!1)})}adoptedCallback(){super.adoptedCallback(),this.cleanup?.(),this.cleanup=void 0,this.unbindDocumentPointer(),this.overlay?.suspend(),this.sink?.release(),this.sink=void 0}bindDocumentPointer(){if(!this.isConnected)return;const owner=this.ownerDocument;this.pointerDocument!==owner&&(this.unbindDocumentPointer(),owner.addEventListener("pointerdown",this.onDocPointer),this.pointerDocument=owner)}unbindDocumentPointer(){this.pointerDocument?.removeEventListener("pointerdown",this.onDocPointer),this.pointerDocument=void 0}openMenu(){this.open||(this.open=!0)}closeMenu(restoreFocus=!1){this.open&&(this.restoreFocusOnMenuClose||=restoreFocus,this.open=!1)}activateMenuOverlay(){if(this.overlay?.isActive()){this.overlay.resume();return}this.overlay=activateNonmodalOverlay({host:this,panel:()=>this.menuEl??null,onEscape:()=>this.closeMenu(!0),onBackdrop:()=>this.closeMenu(),onTab:()=>this.closeMenu(),restoreFocusTo:()=>this.triggerEl??null})}deactivateMenuOverlay(restoreFocus){const overlay=this.overlay;this.overlay=void 0,overlay?.deactivate({restoreFocus}),this.unbindDocumentPointer()}async settleMenuHidden(){const token=++this.menuHideToken;if(await this.updateComplete,token!==this.menuHideToken||this.open)return;const menu=this.menuEl,view=this.ownerDocument.defaultView;if(menu&&view&&!prefersReducedMotion(view)){const computed=view.getComputedStyle(menu),durationMs=maxCssTransitionTime(computed.transitionDuration)+maxCssTransitionTime(computed.transitionDelay);if(durationMs>0&&(await new Promise(resolve=>{let settled=!1,timeout;const finish=()=>{settled||(settled=!0,timeout!==void 0&&view.clearTimeout(timeout),menu.removeEventListener("transitionend",onEnd),menu.removeEventListener("transitioncancel",onEnd),resolve())},onEnd=event=>{event.target===menu&&finish()};menu.addEventListener("transitionend",onEnd),menu.addEventListener("transitioncancel",onEnd),timeout=view.setTimeout(finish,durationMs+50)}),token!==this.menuHideToken||this.open))return}this.menuHidden=!0}menuItemEls(){return Array.from(this.renderRoot.querySelectorAll('[part="menu-item"]'))}focusMenuItem(index){const items=this.menuItemEls();items.length!==0&&items[Math.max(0,Math.min(items.length-1,index))]?.focus()}focusMenuItemOnOpen(index){this.open&&this.menuPositioned?this.focusMenuItem(index):(this.pendingMenuFocusIndex=index,this.open||this.openMenu())}firstUpdated(changed){super.firstUpdated(changed),this.renderRoot.addEventListener("keydown",this.onKeyDown)}willUpdate(changed){if(super.willUpdate(changed),this._isFirstUpdate=!this.hasUpdated,this.setAttribute("aria-busy",String(this.loading)),(changed.has("disabled")||changed.has("loading"))&&!this.disabled&&!this.loading&&this.injectedHostTabIndex&&(this.getAttribute("tabindex")==="-1"&&this.removeAttribute("tabindex"),this.injectedHostTabIndex=!1),(changed.has("disabled")||changed.has("loading"))&&(this.disabled||this.loading)){const active=activeElementIn(this.shadowRoot);if(active===this.triggerEl||active?.getAttribute("part")==="menu-item"){this.hasAttribute("tabindex")||(this.tabIndex=-1,this.injectedHostTabIndex=!0);const ownerHTMLElement=this.ownerDocument.defaultView?.HTMLElement,nativeFocus=ownerHTMLElement?Reflect.get(ownerHTMLElement.prototype,"focus",this):void 0;typeof nativeFocus=="function"&&nativeFocus.call(this,{preventScroll:!0})}this.open&&(this.open=!1,this.forcedMenuClose="state")}if(changed.has("formats")){const active=activeElementIn(this.shadowRoot),index=this.menuItemEls().indexOf(active),previous=changed.get("formats")?.[index];this.formatsFocusSnapshot=index>=0&&previous?{index,id:this.formatId(previous)}:void 0}if(this.open&&this.formats.length<=1){const previousOpen=changed.get("open");this.forcedMenuClose=changed.has("formats")&&changed.get("formats")?.length?"formats":previousOpen===!1||previousOpen===void 0?"invalid-open":"state",this.open=!1}this.announceMenuTransition(changed),this.open&&(this.menuHidden=!1),this.open||(this.menuPositioned=!1)}announceMenuTransition(changed){if(this.openVetoed=!1,!changed.has("open")||this._isFirstUpdate||this.forcedMenuClose)return;const name=this.open?"lr-show":"lr-hide";this.emit(name,null,{cancelable:!0}).defaultPrevented&&(this.openVetoed=!0,this.open=!this.open)}updated(changed){super.updated(changed);const forcedMenuClose=this.forcedMenuClose;if(this.forcedMenuClose=void 0,(changed.has("open")||forcedMenuClose==="formats"||forcedMenuClose==="state")&&!this.openVetoed?this.syncMenuOverlay():this.openVetoed&&(this.restoreFocusOnMenuClose=!1),changed.has("formats")&&this.formatsFocusSnapshot){const{index,id}=this.formatsFocusSnapshot;this.formatsFocusSnapshot=void 0,this.scheduleAfterUpdate(()=>{if(this.formats.length<=1)this.closeMenu(),this.triggerEl?.focus();else if(this.open){const nextIndex=this.formats.findIndex(format=>this.formatId(format)===id);this.focusMenuItemOnOpen(nextIndex>=0?nextIndex:index)}})}}effectiveColumns(rows){if(this.columns.length>0)return this.columns;const keys=new Set;for(const row of rows)for(const key of Object.keys(row))keys.add(key);return Array.from(keys,key=>({key,label:key}))}rowsToExport(){if(this.getRows===void 0)return this.rows;const supplied=this.getRows();return Array.isArray(supplied)?supplied:[]}rowsForExport(rows){const keys=this.effectiveColumns(rows).map(c=>c.key);return rows.map(row=>{const picked=Object.create(null);for(const key of keys)picked[key]=row[key];return picked})}formatId(format){return typeof format=="string"?format:format.formatId}formatLabel(format){return typeof format=="string"?format.toUpperCase():format.label}doExport(formatOption){if(this.disabled||this.loading)return;this.closeMenu(),this.triggerEl?.focus(),this.exportFailed=!1;const format=this.formatId(formatOption);if(!this.emit("lr-export",Object.freeze({format}),{cancelable:!0}).defaultPrevented&&!(format!=="csv"&&format!=="json"))try{const rows=this.rowsToExport();format==="csv"?downloadBlob(buildCsv(rows,this.effectiveColumns(rows),{bom:this.bom}),`${this.filename}.csv`,"text/csv;charset=utf-8;",this.ownerDocument):downloadBlob(JSON.stringify(this.rowsForExport(rows),null,2),`${this.filename}.json`,"application/json",this.ownerDocument),this.emit("lr-export-complete",Object.freeze({format}))}catch(error){this.exportFailed=!0,this.sink?.announce(this.localize("statusError")),this.emit("lr-export-error",Object.freeze({format,error}))}}onTriggerClick(){this.disabled||this.loading||this.formats.length!==0&&(this.formats.length===1?this.doExport(this.formats[0]):this.open?this.closeMenu():this.openMenu())}focus(options){this.triggerEl?.focus(options)}blur(){this.triggerEl?.blur()}click(){this.triggerEl?.click()}get effectiveLabel(){return this.label==null?this.localize("exportButtonLabel"):this.label}render(){const label=this.effectiveLabel,labelNamesTrigger=label.trim().length>0,accessibleLabel=this.accessibleLabel??(labelNamesTrigger?label:this.localize("exportButtonLabel")),triggerAriaLabel=this.accessibleLabel!==null||!labelNamesTrigger?accessibleLabel:nothing;return html`
2
2
  <button
3
3
  part=${this.exportFailed?"trigger trigger-error":"trigger"}
4
4
  type="button"
@@ -15,6 +15,8 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
15
15
  ${this.formats.length>1?html`<div
16
16
  id=${this.menuId}
17
17
  part="menu"
18
+ ?hidden=${this.menuHidden}
19
+ ?data-positioned=${this.menuPositioned}
18
20
  role="menu"
19
21
  aria-label=${this.localize("exportFormatMenuLabel",void 0,{label:accessibleLabel})}
20
22
  >
@@ -29,4 +31,4 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
29
31
  ${typeof f!="string"&&f.description?html`<span part="format-description">${f.description}</span>`:nothing}
30
32
  </button>`)}
31
33
  </div>`:nothing}
32
- `}}__decorate([property({attribute:!1})],LyraExportButton.prototype,"getRows",void 0),__decorate([property()],LyraExportButton.prototype,"filename",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"bom",void 0),__decorate([property({reflect:!0,converter:optionalSizeConverter})],LyraExportButton.prototype,"size",null),__decorate([property({reflect:!0,converter:EXPORT_BUTTON_APPEARANCE})],LyraExportButton.prototype,"appearance",null),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"disabled",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"loading",void 0),__decorate([property()],LyraExportButton.prototype,"label",void 0),__decorate([property({attribute:"aria-label"})],LyraExportButton.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"open",void 0),__decorate([query('[part~="trigger"]')],LyraExportButton.prototype,"triggerEl",void 0),__decorate([query('[part="menu"]')],LyraExportButton.prototype,"menuEl",void 0),__decorate([state()],LyraExportButton.prototype,"exportFailed",void 0);export{LyraExportButton};
34
+ `}}__decorate([property({attribute:!1})],LyraExportButton.prototype,"getRows",void 0),__decorate([property()],LyraExportButton.prototype,"filename",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"bom",void 0),__decorate([property({reflect:!0,converter:optionalSizeConverter})],LyraExportButton.prototype,"size",null),__decorate([property({reflect:!0,converter:EXPORT_BUTTON_APPEARANCE})],LyraExportButton.prototype,"appearance",null),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"disabled",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"loading",void 0),__decorate([property()],LyraExportButton.prototype,"label",void 0),__decorate([property({attribute:"aria-label"})],LyraExportButton.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraExportButton.prototype,"open",void 0),__decorate([query('[part~="trigger"]')],LyraExportButton.prototype,"triggerEl",void 0),__decorate([query('[part="menu"]')],LyraExportButton.prototype,"menuEl",void 0),__decorate([state()],LyraExportButton.prototype,"exportFailed",void 0),__decorate([state()],LyraExportButton.prototype,"menuHidden",void 0),__decorate([state()],LyraExportButton.prototype,"menuPositioned",void 0);export{LyraExportButton};
@@ -1 +1 @@
1
- import{css}from"lit";import{overlaySurface}from"../../../internal/overlay-surface.styles.js";const styles=css` :host { display: inline-block; position: relative; --_lr-export-button-background: var(--lr-color-surface); --_lr-export-button-color: var(--lr-color-text); --_lr-export-button-border: var(--lr-color-border); --_lr-export-button-hover-background: var(--lr-color-surface); --_lr-export-button-hover-color: var(--lr-color-text); --_lr-export-button-hover-border: var(--lr-color-brand); --_lr-export-button-active-background: color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active)); --_lr-export-button-active-color: var(--lr-color-text); --_lr-export-button-active-border: var(--lr-color-brand); } :host([appearance='outlined']) { --_lr-export-button-background: transparent; --_lr-export-button-color: var(--lr-color-brand); --_lr-export-button-border: var(--lr-color-border-strong); --_lr-export-button-hover-background: var(--lr-color-brand-quiet); --_lr-export-button-hover-color: var(--lr-color-brand); --_lr-export-button-hover-border: var(--lr-color-brand); --_lr-export-button-active-background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); --_lr-export-button-active-color: var(--lr-color-brand); --_lr-export-button-active-border: var(--lr-color-brand); } :host([appearance='quiet']) { --_lr-export-button-background: transparent; --_lr-export-button-color: var(--lr-color-text-quiet); --_lr-export-button-border: var(--lr-color-border); --_lr-export-button-hover-background: var(--lr-color-brand-quiet); --_lr-export-button-hover-color: var(--lr-color-text-quiet); --_lr-export-button-hover-border: var(--lr-color-brand); --_lr-export-button-active-background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); --_lr-export-button-active-color: var(--lr-color-text-quiet); --_lr-export-button-active-border: var(--lr-color-brand); } [part~='trigger'] { display: inline-flex; align-items: center; justify-content: center; gap: var(--lr-space-xs); padding: var(--lr-space-xs) var(--lr-space-m); border: var(--lr-border-width-thin) solid var(--lr-export-button-border, var(--_lr-export-button-border)); border-radius: var(--lr-radius); background: var(--lr-export-button-background, var(--_lr-export-button-background)); color: var(--lr-export-button-color, var(--_lr-export-button-color)); font: inherit; min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); cursor: pointer; } :where([part~='trigger']):hover:where(:not(:disabled)) { background: var(--lr-export-button-hover-background, var(--_lr-export-button-hover-background)); color: var(--lr-export-button-hover-color, var(--_lr-export-button-hover-color)); border-color: var(--lr-export-button-hover-border, var(--_lr-export-button-hover-border)); } :where([part~='trigger']):active:where(:not(:disabled)) { background: var(--lr-export-button-active-background, var(--_lr-export-button-active-background)); color: var(--lr-export-button-active-color, var(--_lr-export-button-active-color)); border-color: var(--lr-export-button-active-border, var(--_lr-export-button-active-border)); } :host([size='2xs']) [part~='trigger'], :host([size='xs']) [part~='trigger'], :host([size='s']) [part~='trigger'], :host([size='small']) [part~='trigger'], :host([size='m']) [part~='trigger'], :host([size='medium']) [part~='trigger'], :host([size='l']) [part~='trigger'], :host([size='large']) [part~='trigger'], :host([size='xl']) [part~='trigger'], :host([size='2xs']) [part='menu-item'], :host([size='xs']) [part='menu-item'], :host([size='s']) [part='menu-item'], :host([size='small']) [part='menu-item'], :host([size='m']) [part='menu-item'], :host([size='medium']) [part='menu-item'], :host([size='l']) [part='menu-item'], :host([size='large']) [part='menu-item'], :host([size='xl']) [part='menu-item'] { font-size: var(--lr-form-control-font-size); padding-block: var(--lr-form-control-padding-block); padding-inline: var(--lr-form-control-padding-inline); min-block-size: max(var(--lr-icon-button-size), var(--lr-form-control-height)); } [part~='trigger']:disabled { opacity: var(--lr-opacity-disabled); cursor: not-allowed; } [part~='trigger']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: var(--lr-focus-ring-offset); } [part~='trigger-error'] { border-color: var(--lr-color-danger); color: var(--lr-color-danger); } [part='menu'] { visibility: hidden; position: fixed; z-index: var(--lr-layer-dropdown); box-sizing: border-box; inline-size: max-content; min-inline-size: min( var(--lr-popover-viewport-clamp), var(--lr-size-8rem), var(--lr-positioner-available-inline-size, 100vw) ); max-inline-size: min( var(--lr-popover-viewport-clamp), var(--lr-size-20rem), var(--lr-positioner-available-inline-size, 100vw) ); max-block-size: var(--lr-positioner-available-block-size, 100vh); overflow: auto; padding: var(--lr-space-xs); ${overlaySurface} box-shadow: var(--lr-overlay-shadow-anchored, var(--lr-shadow-m)); opacity: 0; transform: translateY(var(--lr-size-neg-4px)); transition: opacity var(--lr-transition-fast), transform var(--lr-transition-fast); } :host([open]) [part='menu'] { visibility: visible; opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { [part='menu'] { transition: none; } } [part='menu-item'] { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--lr-size-1px); box-sizing: border-box; inline-size: 100%; min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); text-align: center; padding: var(--lr-space-xs) var(--lr-space-s); border: none; background: none; color: inherit; font: inherit; cursor: pointer; border-radius: var(--lr-radius); } :where([part='menu-item']):hover:where(:not(:disabled)) { background: var(--lr-color-brand-quiet); } :where([part='menu-item']):active:where(:not(:disabled)) { background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='menu-item']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: var(--lr-focus-ring-offset); } [part='menu-item']:disabled { opacity: var(--lr-opacity-disabled); cursor: not-allowed; } [part='format-description'] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); } [part='format-label'], [part='format-description'] { max-inline-size: 100%; overflow-wrap: anywhere; } `;export{styles};
1
+ import{css}from"lit";import{overlaySurface}from"../../../internal/overlay-surface.styles.js";const styles=css` :host { display: inline-block; position: relative; --_lr-export-button-background: var(--lr-color-surface); --_lr-export-button-color: var(--lr-color-text); --_lr-export-button-border: var(--lr-color-border); --_lr-export-button-hover-background: var(--lr-color-surface); --_lr-export-button-hover-color: var(--lr-color-text); --_lr-export-button-hover-border: var(--lr-color-brand); --_lr-export-button-active-background: color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active)); --_lr-export-button-active-color: var(--lr-color-text); --_lr-export-button-active-border: var(--lr-color-brand); } :host([appearance='outlined']) { --_lr-export-button-background: transparent; --_lr-export-button-color: var(--lr-color-brand); --_lr-export-button-border: var(--lr-color-border-strong); --_lr-export-button-hover-background: var(--lr-color-brand-quiet); --_lr-export-button-hover-color: var(--lr-color-brand); --_lr-export-button-hover-border: var(--lr-color-brand); --_lr-export-button-active-background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); --_lr-export-button-active-color: var(--lr-color-brand); --_lr-export-button-active-border: var(--lr-color-brand); } :host([appearance='quiet']) { --_lr-export-button-background: transparent; --_lr-export-button-color: var(--lr-color-text-quiet); --_lr-export-button-border: var(--lr-color-border); --_lr-export-button-hover-background: var(--lr-color-brand-quiet); --_lr-export-button-hover-color: var(--lr-color-text-quiet); --_lr-export-button-hover-border: var(--lr-color-brand); --_lr-export-button-active-background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); --_lr-export-button-active-color: var(--lr-color-text-quiet); --_lr-export-button-active-border: var(--lr-color-brand); } [part~='trigger'] { display: inline-flex; align-items: center; justify-content: center; gap: var(--lr-export-button-gap, var(--lr-space-xs)); padding: var(--lr-space-xs) var(--lr-space-m); border: var(--lr-border-width-thin) solid var(--lr-export-button-border, var(--_lr-export-button-border)); border-radius: var(--lr-export-button-radius, var(--lr-radius)); background: var(--lr-export-button-background, var(--_lr-export-button-background)); color: var(--lr-export-button-color, var(--_lr-export-button-color)); font: inherit; min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); cursor: pointer; } :where([part~='trigger']):hover:where(:not(:disabled)) { background: var(--lr-export-button-hover-background, var(--_lr-export-button-hover-background)); color: var(--lr-export-button-hover-color, var(--_lr-export-button-hover-color)); border-color: var(--lr-export-button-hover-border, var(--_lr-export-button-hover-border)); } :where([part~='trigger']):active:where(:not(:disabled)) { background: var(--lr-export-button-active-background, var(--_lr-export-button-active-background)); color: var(--lr-export-button-active-color, var(--_lr-export-button-active-color)); border-color: var(--lr-export-button-active-border, var(--_lr-export-button-active-border)); } :host([size='2xs']) [part~='trigger'], :host([size='xs']) [part~='trigger'], :host([size='s']) [part~='trigger'], :host([size='small']) [part~='trigger'], :host([size='m']) [part~='trigger'], :host([size='medium']) [part~='trigger'], :host([size='l']) [part~='trigger'], :host([size='large']) [part~='trigger'], :host([size='xl']) [part~='trigger'], :host([size='2xs']) [part='menu-item'], :host([size='xs']) [part='menu-item'], :host([size='s']) [part='menu-item'], :host([size='small']) [part='menu-item'], :host([size='m']) [part='menu-item'], :host([size='medium']) [part='menu-item'], :host([size='l']) [part='menu-item'], :host([size='large']) [part='menu-item'], :host([size='xl']) [part='menu-item'] { font-size: var(--lr-form-control-font-size); padding-block: var(--lr-form-control-padding-block); padding-inline: var(--lr-form-control-padding-inline); min-block-size: max(var(--lr-icon-button-size), var(--lr-form-control-height)); } [part~='trigger']:disabled { opacity: var(--lr-opacity-disabled); cursor: not-allowed; } [part~='trigger']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: var(--lr-focus-ring-offset); } [part~='trigger-error'] { border-color: var(--lr-color-danger); color: var(--lr-color-danger); } [part='menu'][hidden] { display: none; } [part='menu'] { visibility: hidden; position: fixed; z-index: var(--lr-layer-dropdown); box-sizing: border-box; inline-size: max-content; min-inline-size: min( var(--lr-popover-viewport-clamp), var(--lr-size-8rem), var(--lr-positioner-available-inline-size, 100vw) ); max-inline-size: min( var(--lr-popover-viewport-clamp), var(--lr-size-20rem), var(--lr-positioner-available-inline-size, 100vw) ); max-block-size: var(--lr-positioner-available-block-size, 100vh); overflow: auto; padding: var(--lr-space-xs); ${overlaySurface} box-shadow: var(--lr-overlay-shadow-anchored, var(--lr-shadow-m)); opacity: 0; transform: translateY(var(--lr-size-neg-4px)); transition: opacity var(--lr-transition-fast), transform var(--lr-transition-fast); } :host([open]) [part='menu'] { visibility: visible; } :host([open]) [part='menu'][data-positioned] { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { [part='menu'] { transition: none; } } [part='menu-item'] { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--lr-size-1px); box-sizing: border-box; inline-size: 100%; min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); text-align: center; padding: var(--lr-space-xs) var(--lr-space-s); border: none; background: none; color: inherit; font: inherit; cursor: pointer; border-radius: var(--lr-radius); } :where([part='menu-item']):hover:where(:not(:disabled)) { background: var(--lr-color-brand-quiet); } :where([part='menu-item']):active:where(:not(:disabled)) { background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='menu-item']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: var(--lr-focus-ring-offset); } [part='menu-item']:disabled { opacity: var(--lr-opacity-disabled); cursor: not-allowed; } [part='format-description'] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); } [part='format-label'], [part='format-description'] { max-inline-size: 100%; overflow-wrap: anywhere; } `;export{styles};