@aceshooting/lyra-ui 29.0.2 → 29.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +19 -26
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migrate-wa.mjs +2 -0
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +5 -3
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +4 -3
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
  8. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +21 -5
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +14 -11
  10. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +34 -7
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +25 -11
  14. package/dist/components/agent-tools/eval-result/eval-result-source.js +1 -0
  15. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +31 -11
  16. package/dist/components/agent-tools/eval-result/eval-result.class.js +29 -15
  17. package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -1
  18. package/dist/components/agent-tools/eval-result/eval-run-result.d.ts +10 -0
  19. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +26 -5
  20. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -6
  21. package/dist/components/agent-tools/span-waterfall/span-waterfall.d.ts +1 -1
  22. package/dist/components/agent-tools/span-waterfall/span-waterfall.js +1 -1
  23. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
  24. package/dist/components/agent-tools/task-list/task-list.class.d.ts +29 -6
  25. package/dist/components/agent-tools/task-list/task-list.class.js +13 -7
  26. package/dist/components/agent-tools/task-list/task-list.d.ts +1 -1
  27. package/dist/components/agent-tools/task-list/task-list.js +1 -1
  28. package/dist/components/agent-tools/task-list/task-list.styles.js +1 -1
  29. package/dist/components/agent-tools/terminal/terminal.class.d.ts +9 -5
  30. package/dist/components/agent-tools/terminal/terminal.class.js +8 -8
  31. package/dist/components/agent-tools/test-results/test-results.class.d.ts +16 -4
  32. package/dist/components/agent-tools/test-results/test-results.class.js +15 -6
  33. package/dist/components/agent-tools/test-results/test-results.d.ts +1 -0
  34. package/dist/components/agent-tools/test-results/test-results.js +1 -1
  35. package/dist/components/agent-tools/test-results/test-results.styles.js +1 -1
  36. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +7 -4
  37. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -1
  38. package/dist/components/agent-tools/trace-tree/span-projection.js +1 -0
  39. package/dist/components/agent-tools/trace-tree/span-shared.d.ts +29 -0
  40. package/dist/components/agent-tools/trace-tree/span-shared.js +1 -0
  41. package/dist/components/agent-tools/trace-tree/span.d.ts +5 -35
  42. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  43. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +27 -5
  44. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +19 -9
  45. package/dist/components/agent-tools/trace-tree/trace-tree.d.ts +1 -1
  46. package/dist/components/agent-tools/trace-tree/trace-tree.js +1 -1
  47. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
  48. package/dist/components/charts/chart/bar-chart.class.d.ts +5 -1
  49. package/dist/components/charts/chart/box-plot.class.d.ts +2 -2
  50. package/dist/components/charts/chart/box-plot.class.js +3 -3
  51. package/dist/components/charts/chart/bubble-chart.class.d.ts +5 -1
  52. package/dist/components/charts/chart/chart-prepared-data.d.ts +9 -0
  53. package/dist/components/charts/chart/chart-prepared-data.js +1 -0
  54. package/dist/components/charts/chart/chart-spatial-data.js +2 -0
  55. package/dist/components/charts/chart/chart-sync.js +1 -1
  56. package/dist/components/charts/chart/chart-table-sampling.js +1 -1
  57. package/dist/components/charts/chart/chart.class.d.ts +56 -6
  58. package/dist/components/charts/chart/chart.class.js +18 -8
  59. package/dist/components/charts/chart/chart.styles.js +1 -1
  60. package/dist/components/charts/chart/doughnut-chart.class.d.ts +5 -1
  61. package/dist/components/charts/chart/histogram-buckets.d.ts +1 -1
  62. package/dist/components/charts/chart/histogram-buckets.js +1 -1
  63. package/dist/components/charts/chart/histogram.class.d.ts +19 -4
  64. package/dist/components/charts/chart/histogram.class.js +1 -1
  65. package/dist/components/charts/chart/line-chart.class.d.ts +5 -1
  66. package/dist/components/charts/chart/lite-chart.class.d.ts +51 -11
  67. package/dist/components/charts/chart/lite-chart.class.js +33 -27
  68. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  69. package/dist/components/charts/chart/pie-chart.class.d.ts +5 -1
  70. package/dist/components/charts/chart/polar-area-chart.class.d.ts +5 -1
  71. package/dist/components/charts/chart/radar-chart.class.d.ts +5 -1
  72. package/dist/components/charts/chart/scatter-chart.class.d.ts +5 -1
  73. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +6 -3
  74. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +6 -5
  75. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -1
  76. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +8 -0
  77. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  78. package/dist/components/conversation/code-block/code-block-base.class.d.ts +5 -3
  79. package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
  80. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -1
  81. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  82. package/dist/components/conversation/code-block/code-block-shared.d.ts +6 -4
  83. package/dist/components/conversation/code-block/code-block-shared.js +3 -2
  84. package/dist/components/conversation/code-block/code-block.class.d.ts +11 -4
  85. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  86. package/dist/components/conversation/code-block/code-block.d.ts +1 -1
  87. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  88. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  89. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  90. package/dist/components/conversation/markdown/markdown-base.class.d.ts +6 -4
  91. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  92. package/dist/components/conversation/markdown/markdown-code-header.d.ts +2 -2
  93. package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
  94. package/dist/components/conversation/markdown/markdown-core.class.d.ts +8 -3
  95. package/dist/components/conversation/markdown/markdown-progressive.js +2 -2
  96. package/dist/components/conversation/markdown/markdown-shared.d.ts +5 -10
  97. package/dist/components/conversation/markdown/markdown-shared.js +5 -5
  98. package/dist/components/conversation/markdown/markdown-streaming-tail.js +1 -1
  99. package/dist/components/conversation/markdown/markdown.class.d.ts +17 -10
  100. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  101. package/dist/components/conversation/markdown/markdown.styles.js +1 -1
  102. package/dist/components/conversation/model-select/model-select.class.d.ts +4 -3
  103. package/dist/components/conversation/model-select/model-select.class.js +3 -2
  104. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  105. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +2 -1
  106. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
  107. package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +1 -1
  108. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -2
  109. package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -1
  110. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  111. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +10 -2
  112. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +15 -6
  113. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
  114. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +3 -1
  115. package/dist/components/conversation/realtime-session/realtime-session.class.js +2 -1
  116. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  117. package/dist/components/conversation/streaming-text/markdown-detection.d.ts +2 -0
  118. package/dist/components/conversation/streaming-text/markdown-detection.js +4 -1
  119. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +6 -2
  120. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +3 -3
  121. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -1
  122. package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
  123. package/dist/components/conversation/thread-list/thread-list.class.d.ts +34 -4
  124. package/dist/components/conversation/thread-list/thread-list.class.js +22 -15
  125. package/dist/components/conversation/thread-list/thread-list.d.ts +1 -1
  126. package/dist/components/conversation/thread-list/thread-list.js +1 -1
  127. package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
  128. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +6 -2
  129. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +3 -2
  130. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
  131. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +3 -2
  132. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -2
  133. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  134. package/dist/components/data/calendar/calendar.class.d.ts +5 -2
  135. package/dist/components/data/calendar/calendar.class.js +1 -1
  136. package/dist/components/data/data-grid/data-grid-processing.js +2 -2
  137. package/dist/components/data/data-grid/data-grid.class.d.ts +22 -8
  138. package/dist/components/data/data-grid/data-grid.class.js +20 -19
  139. package/dist/components/data/data-grid/data-grid.styles.js +1 -1
  140. package/dist/components/data/document-library/document-library.class.d.ts +31 -4
  141. package/dist/components/data/document-library/document-library.class.js +25 -12
  142. package/dist/components/data/document-library/document-library.styles.js +1 -1
  143. package/dist/components/data/file-tree/file-tree.class.d.ts +30 -6
  144. package/dist/components/data/file-tree/file-tree.class.js +4 -3
  145. package/dist/components/data/file-tree/file-tree.d.ts +1 -0
  146. package/dist/components/data/file-tree/file-tree.js +1 -1
  147. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +31 -6
  148. package/dist/components/data/flow-canvas/flow-canvas.class.js +40 -19
  149. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  150. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  151. package/dist/components/data/flow-canvas/flow-source.js +1 -0
  152. package/dist/components/data/flow-canvas/flow-types.d.ts +4 -2
  153. package/dist/components/data/flow-canvas/flow-viewport-index.js +1 -0
  154. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +9 -3
  155. package/dist/components/data/flow-minimap/flow-minimap.class.js +11 -2
  156. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  157. package/dist/components/data/funnel/funnel.class.d.ts +7 -3
  158. package/dist/components/data/funnel/funnel.class.js +2 -2
  159. package/dist/components/data/heatmap/calendar-grid.d.ts +1 -1
  160. package/dist/components/data/heatmap/calendar-grid.js +1 -1
  161. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
  162. package/dist/components/data/heatmap/heatmap-limits.d.ts +1 -1
  163. package/dist/components/data/heatmap/heatmap-matrix-source-controller.js +1 -0
  164. package/dist/components/data/heatmap/heatmap-matrix-source.d.ts +5 -0
  165. package/dist/components/data/heatmap/heatmap-matrix-source.js +1 -0
  166. package/dist/components/data/heatmap/heatmap-scale.d.ts +0 -16
  167. package/dist/components/data/heatmap/heatmap-scale.js +1 -1
  168. package/dist/components/data/heatmap/heatmap.class.d.ts +40 -11
  169. package/dist/components/data/heatmap/heatmap.class.js +26 -6
  170. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  171. package/dist/components/data/pagination/pagination.class.js +1 -1
  172. package/dist/components/data/sequence-strip/sequence-strip-item.d.ts +17 -0
  173. package/dist/components/data/sequence-strip/sequence-strip-source-controller.js +1 -0
  174. package/dist/components/data/sequence-strip/sequence-strip-source.d.ts +5 -0
  175. package/dist/components/data/sequence-strip/sequence-strip-source.js +1 -0
  176. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +24 -19
  177. package/dist/components/data/sequence-strip/sequence-strip.class.js +23 -4
  178. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  179. package/dist/components/data/sparkline/sparkline.class.d.ts +17 -4
  180. package/dist/components/data/sparkline/sparkline.class.js +3 -3
  181. package/dist/components/data/sparkline/sparkline.styles.js +1 -1
  182. package/dist/components/data/table/table.class.d.ts +14 -10
  183. package/dist/components/data/table/table.class.js +17 -16
  184. package/dist/components/data/timeline/timeline.class.d.ts +5 -2
  185. package/dist/components/data/timeline/timeline.class.js +1 -1
  186. package/dist/components/data/tree/tree-item.class.js +1 -1
  187. package/dist/components/data/tree/tree-owner-controller.js +1 -1
  188. package/dist/components/data/tree/tree.class.d.ts +28 -6
  189. package/dist/components/data/tree/tree.class.js +3 -3
  190. package/dist/components/data/tree/tree.d.ts +1 -0
  191. package/dist/components/data/tree/tree.js +1 -1
  192. package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -7
  193. package/dist/components/data/word-cloud/word-cloud.class.js +6 -4
  194. package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
  195. package/dist/components/forms/catalog-picker-base.d.ts +1 -1
  196. package/dist/components/forms/catalog-picker-base.js +6 -6
  197. package/dist/components/forms/catalog-picker-base.styles.js +1 -1
  198. package/dist/components/forms/combobox/combobox.class.d.ts +7 -3
  199. package/dist/components/forms/combobox/combobox.class.js +1 -1
  200. package/dist/components/forms/combobox/option.class.d.ts +4 -2
  201. package/dist/components/forms/combobox/option.class.js +2 -2
  202. package/dist/components/forms/country-picker/country-picker.class.d.ts +3 -1
  203. package/dist/components/forms/country-picker/country-picker.class.js +1 -1
  204. package/dist/components/forms/currency-picker/currency-picker.class.d.ts +2 -0
  205. package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
  206. package/dist/components/forms/currency-picker/currency-presentation.js +1 -1
  207. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +6 -2
  208. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -2
  209. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
  210. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +8 -2
  211. package/dist/components/forms/locale-picker/locale-picker.class.js +5 -4
  212. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  213. package/dist/components/forms/select/select.class.d.ts +11 -3
  214. package/dist/components/forms/select/select.class.js +4 -4
  215. package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +2 -0
  216. package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
  217. package/dist/components/forms/token-input/token-input.class.d.ts +6 -1
  218. package/dist/components/forms/token-input/token-input.class.js +15 -13
  219. package/dist/components/forms/unit-picker/unit-picker.class.d.ts +2 -0
  220. package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
  221. package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
  222. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  223. package/dist/components/layout/command-palette/command-palette.class.d.ts +5 -2
  224. package/dist/components/layout/command-palette/command-palette.class.js +2 -1
  225. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  226. package/dist/components/layout/menu/menu-item.class.d.ts +2 -2
  227. package/dist/components/layout/menu/menu-item.class.js +2 -2
  228. package/dist/components/layout/menu/menu.class.d.ts +1 -1
  229. package/dist/components/layout/menu/menu.class.js +1 -1
  230. package/dist/components/layout/menubar/menubar.class.d.ts +1 -1
  231. package/dist/components/layout/menubar/menubar.class.js +1 -1
  232. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -2
  233. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
  234. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
  235. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  236. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +13 -9
  237. package/dist/components/layout/virtual-list/virtual-list.class.js +21 -17
  238. package/dist/components/media/av-player/av-cue-index.js +1 -0
  239. package/dist/components/media/av-player/av-cue-source.d.ts +13 -0
  240. package/dist/components/media/av-player/av-cue-source.js +1 -0
  241. package/dist/components/media/av-player/av-metadata.d.ts +2 -2
  242. package/dist/components/media/av-player/av-metadata.js +1 -1
  243. package/dist/components/media/av-player/av-player-cue-source-controller.js +1 -0
  244. package/dist/components/media/av-player/av-player.class.d.ts +34 -12
  245. package/dist/components/media/av-player/av-player.class.js +15 -10
  246. package/dist/components/media/flag/flag.class.js +1 -1
  247. package/dist/components/media/flag/language-map.js +1 -1
  248. package/dist/components/media/lightbox/lightbox-source.js +1 -0
  249. package/dist/components/media/lightbox/lightbox-types.d.ts +15 -0
  250. package/dist/components/media/lightbox/lightbox.class.d.ts +22 -21
  251. package/dist/components/media/lightbox/lightbox.class.js +6 -4
  252. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  253. package/dist/components/media/map/map-geojson-diff.d.ts +6 -6
  254. package/dist/components/media/map/map-geojson-diff.js +1 -1
  255. package/dist/components/media/map/map-loader.d.ts +5 -1
  256. package/dist/components/media/map/map.class.d.ts +24 -6
  257. package/dist/components/media/map/map.class.js +2 -2
  258. package/dist/components/media/map/map.styles.js +1 -1
  259. package/dist/components/media/video-playlist/video-playlist.class.d.ts +2 -1
  260. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  261. package/dist/components/overlays/chip/chip.class.d.ts +1 -1
  262. package/dist/components/overlays/chip/chip.class.js +1 -1
  263. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +30 -8
  264. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +22 -8
  265. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
  266. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  267. package/dist/components/retrieval/graph/graph-source-composition.js +1 -0
  268. package/dist/components/retrieval/graph/graph-source-controller.js +1 -0
  269. package/dist/components/retrieval/graph/graph-spatial-controller.js +2 -2
  270. package/dist/components/retrieval/graph/graph-spatial-model.js +1 -0
  271. package/dist/components/retrieval/graph/graph-spatial.js +1 -1
  272. package/dist/components/retrieval/graph/graph.class.d.ts +31 -6
  273. package/dist/components/retrieval/graph/graph.class.js +26 -5
  274. package/dist/components/retrieval/graph/graph.d.ts +1 -1
  275. package/dist/components/retrieval/graph/graph.js +1 -1
  276. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  277. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +33 -4
  278. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +27 -17
  279. package/dist/components/retrieval/ingestion-queue/ingestion-queue.d.ts +1 -1
  280. package/dist/components/retrieval/ingestion-queue/ingestion-queue.js +1 -1
  281. package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +1 -1
  282. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +27 -4
  283. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +29 -14
  284. package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
  285. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +17 -3
  286. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +15 -10
  287. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -1
  288. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -5
  289. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +17 -10
  290. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.d.ts +1 -1
  291. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.js +1 -1
  292. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  293. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  294. package/dist/components/retrieval/mind-map/mind-map-model.js +1 -0
  295. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +27 -4
  296. package/dist/components/retrieval/mind-map/mind-map.class.js +11 -7
  297. package/dist/components/retrieval/mind-map/mind-map.d.ts +1 -0
  298. package/dist/components/retrieval/mind-map/mind-map.js +1 -1
  299. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  300. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +24 -2
  301. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +17 -3
  302. package/dist/components/retrieval/neighbor-list/neighbor-list.d.ts +1 -1
  303. package/dist/components/retrieval/neighbor-list/neighbor-list.js +1 -1
  304. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
  305. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +8 -4
  306. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +11 -7
  307. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
  308. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +12 -6
  309. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +30 -17
  310. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
  311. package/dist/components/retrieval/retrieval-results/retrieval-results-model.js +1 -0
  312. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +46 -5
  313. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +31 -9
  314. package/dist/components/retrieval/retrieval-results/retrieval-results.d.ts +1 -1
  315. package/dist/components/retrieval/retrieval-results/retrieval-results.js +1 -1
  316. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +1 -1
  317. package/dist/components/utility/diff-view/diff-view.class.d.ts +16 -8
  318. package/dist/components/utility/diff-view/diff-view.class.js +3 -2
  319. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  320. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +31 -3
  321. package/dist/components/utility/json-viewer/json-viewer.class.js +13 -4
  322. package/dist/components/utility/json-viewer/json-viewer.d.ts +1 -0
  323. package/dist/components/utility/json-viewer/json-viewer.js +1 -1
  324. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  325. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +6 -4
  326. package/dist/components/utility/mention-popover/mention-popover.class.js +6 -5
  327. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +34 -7
  328. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +9 -7
  329. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +28 -4
  330. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +12 -11
  331. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -1
  332. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +17 -16
  333. package/dist/components/viewers/geojson-view/geojson-viewer.d.ts +1 -1
  334. package/dist/components/viewers/geojson-view/geojson-viewer.js +1 -1
  335. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +31 -5
  336. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +11 -8
  337. package/dist/components/viewers/table-viewer-shared.js +19 -3
  338. package/dist/components/viewers/viewer-search-limits.js +1 -1
  339. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +35 -3
  340. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +20 -5
  341. package/dist/components/viewers/xml-viewer/xml-viewer.d.ts +1 -1
  342. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  343. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  344. package/dist/countries.js +1 -1
  345. package/dist/data-sources.d.ts +34 -0
  346. package/dist/data-sources.js +1 -0
  347. package/dist/events.d.ts +51 -7
  348. package/dist/framework-types.d.ts +1 -1
  349. package/dist/internal/accessibility-visibility.d.ts +4 -2
  350. package/dist/internal/accessibility-visibility.js +1 -1
  351. package/dist/internal/accessible-text-controller.js +1 -1
  352. package/dist/internal/anchor-target.js +2 -2
  353. package/dist/internal/catalog-picker.d.ts +1 -7
  354. package/dist/internal/catalog-picker.js +1 -1
  355. package/dist/internal/collection-snapshot.js +1 -1
  356. package/dist/internal/default-strings/agent-tools.generated.js +1 -1
  357. package/dist/internal/default-strings/charts.generated.js +1 -1
  358. package/dist/internal/default-strings/conversation.generated.js +1 -1
  359. package/dist/internal/default-strings/data.generated.js +1 -1
  360. package/dist/internal/default-strings/forms.generated.js +1 -1
  361. package/dist/internal/default-strings/layout.generated.js +1 -1
  362. package/dist/internal/default-strings/media.generated.js +1 -1
  363. package/dist/internal/default-strings/retrieval.generated.js +1 -1
  364. package/dist/internal/default-strings/shared.generated.js +1 -1
  365. package/dist/internal/default-strings/utility.generated.js +1 -1
  366. package/dist/internal/delimited-data.js +1 -1
  367. package/dist/internal/fixed-containing-block.js +1 -1
  368. package/dist/internal/flow-scene-envelope.js +1 -0
  369. package/dist/internal/graph-scene-controller.js +1 -0
  370. package/dist/internal/hierarchy-source-controller.js +1 -0
  371. package/dist/internal/hierarchy-source-view.js +29 -0
  372. package/dist/internal/hierarchy-source-view.styles.js +1 -0
  373. package/dist/internal/inherited-attribute-hub.d.ts +6 -0
  374. package/dist/internal/inherited-attribute-hub.js +1 -1
  375. package/dist/internal/intl-cache.js +1 -1
  376. package/dist/internal/keyed-index.js +1 -0
  377. package/dist/internal/localization-types.d.ts +1 -1
  378. package/dist/internal/localization.js +2 -2
  379. package/dist/internal/lyra-element.d.ts +2 -2
  380. package/dist/internal/lyra-element.js +3 -2
  381. package/dist/internal/native-modal-context.js +1 -1
  382. package/dist/internal/option-selection.js +1 -1
  383. package/dist/internal/package-metadata.js +1 -1
  384. package/dist/internal/positioner.js +1 -1
  385. package/dist/internal/resource-loader.d.ts +2 -0
  386. package/dist/internal/resource-loader.js +1 -1
  387. package/dist/internal/scoped-definitions.generated.js +1 -1
  388. package/dist/internal/search-haystack.js +1 -0
  389. package/dist/internal/selection-catalog.d.ts +5 -0
  390. package/dist/internal/selection-catalog.js +1 -1
  391. package/dist/internal/shiki-language-sources.js +1 -0
  392. package/dist/internal/source-page-controller.js +1 -0
  393. package/dist/internal/source-page-scope.js +1 -0
  394. package/dist/internal/source-request-controller.js +1 -0
  395. package/dist/internal/source-window-controller.js +1 -0
  396. package/dist/internal/spatial-source-controller.js +1 -0
  397. package/dist/internal/text-quote.d.ts +2 -6
  398. package/dist/internal/text-quote.js +1 -1
  399. package/dist/internal/theme-watcher.js +1 -1
  400. package/dist/internal/virtual-list-composition.js +1 -0
  401. package/dist/lyra.d.ts +1 -1
  402. package/dist/lyra.js +1 -1
  403. package/dist/testing/interaction-drivers.js +1 -1
  404. package/dist/testing/lyra-tag-event-map.js +1 -1
  405. package/dist/units.js +1 -1
  406. package/dist/utilities/data-preparation.d.ts +56 -0
  407. package/dist/utilities/data-preparation.js +1 -0
  408. package/dist/utilities/data-spatial.d.ts +26 -0
  409. package/dist/utilities/data-spatial.js +1 -0
  410. package/dist/utilities/index.d.ts +1 -1
  411. package/dist/utilities/index.js +1 -1
  412. package/llms/components/lr-activity-feed.md +7 -2
  413. package/llms/components/lr-agent-trace.md +49 -9
  414. package/llms/components/lr-agent-workspace.md +15 -8
  415. package/llms/components/lr-av-player.md +180 -10
  416. package/llms/components/lr-bar-chart.md +1 -1
  417. package/llms/components/lr-box-plot.md +8 -0
  418. package/llms/components/lr-bubble-chart.md +1 -1
  419. package/llms/components/lr-calendar.md +26 -3
  420. package/llms/components/lr-chart.md +310 -23
  421. package/llms/components/lr-chat-viewport.md +6 -0
  422. package/llms/components/lr-code-block-core.md +12 -7
  423. package/llms/components/lr-code-block.md +23 -9
  424. package/llms/components/lr-combobox.md +27 -15
  425. package/llms/components/lr-command-palette.md +16 -3
  426. package/llms/components/lr-country-picker.md +23 -6
  427. package/llms/components/lr-csv-viewer.md +95 -12
  428. package/llms/components/lr-currency-picker.md +23 -3
  429. package/llms/components/lr-data-grid.md +24 -6
  430. package/llms/components/lr-dataset-viewer.md +92 -11
  431. package/llms/components/lr-dialog.md +1 -1
  432. package/llms/components/lr-diff-view.md +19 -6
  433. package/llms/components/lr-document-library.md +60 -5
  434. package/llms/components/lr-doughnut-chart.md +1 -1
  435. package/llms/components/lr-embedding-explorer.md +89 -9
  436. package/llms/components/lr-emoji-picker.md +7 -2
  437. package/llms/components/lr-eval-dataset.md +56 -7
  438. package/llms/components/lr-eval-result.md +89 -4
  439. package/llms/components/lr-export-button.md +1 -1
  440. package/llms/components/lr-file-tree.md +60 -6
  441. package/llms/components/lr-flag.md +5 -2
  442. package/llms/components/lr-flow-canvas.md +152 -14
  443. package/llms/components/lr-flow-minimap.md +32 -4
  444. package/llms/components/lr-funnel.md +14 -0
  445. package/llms/components/lr-geojson-viewer.md +27 -10
  446. package/llms/components/lr-graph.md +43 -7
  447. package/llms/components/lr-heatmap.md +161 -5
  448. package/llms/components/lr-histogram.md +55 -9
  449. package/llms/components/lr-ingestion-queue.md +54 -3
  450. package/llms/components/lr-json-viewer.md +87 -7
  451. package/llms/components/lr-knowledge-base-admin.md +60 -4
  452. package/llms/components/lr-knowledge-base.md +121 -9
  453. package/llms/components/lr-knowledge-graph-explorer.md +106 -11
  454. package/llms/components/lr-lightbox.md +42 -6
  455. package/llms/components/lr-line-chart.md +28 -5
  456. package/llms/components/lr-lite-chart.md +96 -31
  457. package/llms/components/lr-locale-picker.md +6 -4
  458. package/llms/components/lr-map.md +67 -8
  459. package/llms/components/lr-markdown-core.md +10 -5
  460. package/llms/components/lr-markdown.md +23 -6
  461. package/llms/components/lr-mention-popover.md +11 -6
  462. package/llms/components/lr-mind-map.md +91 -10
  463. package/llms/components/lr-model-select.md +8 -4
  464. package/llms/components/lr-model-settings-panel.md +10 -2
  465. package/llms/components/lr-navigation-menu.md +1 -1
  466. package/llms/components/lr-neighbor-list.md +69 -2
  467. package/llms/components/lr-pie-chart.md +1 -1
  468. package/llms/components/lr-polar-area-chart.md +1 -1
  469. package/llms/components/lr-prompt-input.md +9 -2
  470. package/llms/components/lr-prompt-queue.md +11 -3
  471. package/llms/components/lr-radar-chart.md +1 -1
  472. package/llms/components/lr-rag-eval-dashboard.md +9 -2
  473. package/llms/components/lr-realtime-session.md +6 -2
  474. package/llms/components/lr-reorder-list.md +4 -0
  475. package/llms/components/lr-retrieval-compare.md +9 -4
  476. package/llms/components/lr-retrieval-results.md +104 -6
  477. package/llms/components/lr-scatter-chart.md +1 -1
  478. package/llms/components/lr-select.md +20 -10
  479. package/llms/components/lr-sequence-strip.md +92 -2
  480. package/llms/components/lr-span-waterfall.md +78 -8
  481. package/llms/components/lr-sparkline.md +42 -11
  482. package/llms/components/lr-spreadsheet-viewer.md +109 -14
  483. package/llms/components/lr-streaming-text-core.md +4 -2
  484. package/llms/components/lr-streaming-text.md +5 -1
  485. package/llms/components/lr-table.md +96 -115
  486. package/llms/components/lr-task-list.md +93 -9
  487. package/llms/components/lr-terminal.md +9 -0
  488. package/llms/components/lr-test-results.md +77 -3
  489. package/llms/components/lr-thread-list.md +86 -1
  490. package/llms/components/lr-time-zone-picker.md +8 -3
  491. package/llms/components/lr-timeline.md +5 -0
  492. package/llms/components/lr-token-input.md +7 -2
  493. package/llms/components/lr-tool-timeline.md +13 -4
  494. package/llms/components/lr-trace-tree.md +96 -10
  495. package/llms/components/lr-transcript-feed.md +9 -2
  496. package/llms/components/lr-tree.md +87 -15
  497. package/llms/components/lr-unit-picker.md +8 -3
  498. package/llms/components/lr-video-playlist.md +2 -0
  499. package/llms/components/lr-virtual-list.md +17 -8
  500. package/llms/components/lr-voice-picker.md +8 -3
  501. package/llms/components/lr-word-cloud.md +128 -12
  502. package/llms/components/lr-xml-viewer.md +106 -9
  503. package/llms/index.md +1 -1
  504. package/llms/peers.md +1 -1
  505. package/llms/shared/events-and-types.md +725 -264
  506. package/llms/shared/forms-and-accessibility.md +3 -17
  507. package/llms/shared/imports-and-registration.md +3 -17
  508. package/llms/shared/localization-and-rtl.md +0 -2
  509. package/llms/shared/styles-and-tokens.md +27 -36
  510. package/llms/shared/testing-and-utilities.md +4 -5
  511. package/llms/shared.md +770 -349
  512. package/llms.txt +1 -2
  513. package/locales.json +139 -139
  514. package/package.json +13 -4
  515. package/registrations.json +1 -1
  516. package/skills/compose-lyra-interfaces/SKILL.md +6 -8
  517. package/skills/lyra-ui/SKILL.md +20 -51
  518. package/skills/lyra-ui/commands/review.md +16 -33
  519. package/skills/lyra-ui/commands/update.md +6 -5
  520. package/skills/lyra-ui/online-api.md +15 -0
  521. package/skills/lyra-ui/reporting.md +2 -1
@@ -1,8 +1,18 @@
1
- import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,svg,nothing}from"lit";import{property,state,query}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{formatShortDuration}from"../../../internal/duration.js";import{isRtl}from"../../../internal/rtl.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{finiteCount,finiteNumber}from"../../../internal/numbers.js";import{chevronIcon}from"../../../internal/icons.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{styles}from"./trace-tree.styles.js";import{MAX_RENDERED_LYRA_SPANS,normalizeLyraSpans}from"./span.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{LYRA_DEFAULT_accessibleLabelSeparator,LYRA_DEFAULT_cost,LYRA_DEFAULT_duration,LYRA_DEFAULT_spanKindAgent,LYRA_DEFAULT_spanKindEmbedding,LYRA_DEFAULT_spanKindLlm,LYRA_DEFAULT_spanKindOther,LYRA_DEFAULT_spanKindRetriever,LYRA_DEFAULT_spanKindTool,LYRA_DEFAULT_spanProjectionLimit,LYRA_DEFAULT_traceTree,LYRA_DEFAULT_traceTreeMetricLabel,LYRA_DEFAULT_traceTreeSpanStatus}from"../../../internal/default-strings/agent-tools.generated.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_noData,LYRA_DEFAULT_open,LYRA_DEFAULT_statusDenied,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusIncomplete,LYRA_DEFAULT_statusPending,LYRA_DEFAULT_statusRunning,LYRA_DEFAULT_statusSuccess,LYRA_DEFAULT_statusUnknown,LYRA_DEFAULT_tokensIn,LYRA_DEFAULT_tokensOut}from"../../../internal/default-strings/shared.generated.js";const ICON_VIEW_BOX="0 0 24 24",ICON_STROKE_WIDTH="1.75";function glyph(paths){return svg`
1
+ import{__decorate}from"tslib";import{collectionSupport,publicCollectionTruncation}from"../../../internal/collection-snapshot.js";import{html,svg,nothing}from"lit";import{property,state,query}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{formatShortDuration}from"../../../internal/duration.js";import{isRtl}from"../../../internal/rtl.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{finiteCount,finiteNumber}from"../../../internal/numbers.js";import{chevronIcon}from"../../../internal/icons.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{styles}from"./trace-tree.styles.js";import{normalizeLyraSpanKind,normalizeLyraSpanStatus}from"./span.js";import{projectLyraSpans}from"./span-projection.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{HierarchySourceController,hierarchyField,hierarchyKey,hierarchyText}from"../../../internal/hierarchy-source-controller.js";import{hierarchySourceView}from"../../../internal/hierarchy-source-view.js";import{hierarchySourceStyles}from"../../../internal/hierarchy-source-view.styles.js";import{LYRA_DEFAULT_accessibleLabelSeparator,LYRA_DEFAULT_cost,LYRA_DEFAULT_duration,LYRA_DEFAULT_spanKindAgent,LYRA_DEFAULT_spanKindEmbedding,LYRA_DEFAULT_spanKindLlm,LYRA_DEFAULT_spanKindOther,LYRA_DEFAULT_spanKindRetriever,LYRA_DEFAULT_spanKindTool,LYRA_DEFAULT_spanProjectionLimit,LYRA_DEFAULT_traceTree,LYRA_DEFAULT_traceTreeMetricLabel,LYRA_DEFAULT_traceTreeSpanStatus}from"../../../internal/default-strings/agent-tools.generated.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_expand,LYRA_DEFAULT_item,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_noData,LYRA_DEFAULT_open,LYRA_DEFAULT_retry,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusDenied,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusIncomplete,LYRA_DEFAULT_statusPending,LYRA_DEFAULT_statusRunning,LYRA_DEFAULT_statusSuccess,LYRA_DEFAULT_statusUnknown,LYRA_DEFAULT_tokensIn,LYRA_DEFAULT_tokensOut,LYRA_DEFAULT_treeSourceError,LYRA_DEFAULT_treeSourceSummary}from"../../../internal/default-strings/shared.generated.js";const ICON_VIEW_BOX="0 0 24 24",ICON_STROKE_WIDTH="1.75";function glyph(paths){return svg`
2
2
  <svg width="1em" height="1em" viewBox=${ICON_VIEW_BOX} fill="none" stroke="currentColor"
3
3
  stroke-width=${ICON_STROKE_WIDTH} stroke-linecap="round" stroke-linejoin="round"
4
4
  aria-hidden="true" focusable="false">${paths}</svg>
5
- `}function agentIcon(){return glyph(svg`<rect x="5" y="8" width="14" height="10" rx="2"></rect><circle cx="9.5" cy="13" r="1"></circle><circle cx="14.5" cy="13" r="1"></circle><path d="M12 8V5"></path><circle cx="12" cy="4" r="1"></circle>`)}function llmIcon(){return glyph(svg`<path d="M12 3l1.6 4.4L18 9l-4.4 1.6L12 15l-1.6-4.4L6 9l4.4-1.6z"></path><path d="M18.5 15l.7 1.9 1.9.7-1.9.7-.7 1.9-.7-1.9-1.9-.7 1.9-.7z"></path>`)}function toolIcon(){return glyph(svg`<path d="M14.7 6.3a4 4 0 0 1-5.4 5.4L4 17l3 3 5.3-5.3a4 4 0 0 1 5.4-5.4l-2.3 2.3-2-2z"></path>`)}function retrieverIcon(){return glyph(svg`<circle cx="10.5" cy="10.5" r="6.5"></circle><line x1="15.5" y1="15.5" x2="20" y2="20"></line>`)}function embeddingIcon(){return glyph(svg`<circle cx="6" cy="6" r="1.6"></circle><circle cx="18" cy="6" r="1.6"></circle><circle cx="6" cy="18" r="1.6"></circle><circle cx="18" cy="18" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><line x1="7.3" y1="7.3" x2="10.8" y2="10.8"></line><line x1="16.7" y1="7.3" x2="13.2" y2="10.8"></line><line x1="7.3" y1="16.7" x2="10.8" y2="13.2"></line><line x1="16.7" y1="16.7" x2="13.2" y2="13.2"></line>`)}function otherIcon(){return glyph(svg`<circle cx="12" cy="12" r="8"></circle>`)}const KIND_ICON={agent:agentIcon,llm:llmIcon,tool:toolIcon,retriever:retrieverIcon,embedding:embeddingIcon,other:otherIcon},KIND_LABEL_KEY={agent:"spanKindAgent",llm:"spanKindLlm",tool:"spanKindTool",retriever:"spanKindRetriever",embedding:"spanKindEmbedding",other:"spanKindOther"},STATUS_LABEL_KEY={pending:"statusPending",running:"statusRunning",success:"statusSuccess",error:"statusError",denied:"statusDenied",incomplete:"statusIncomplete",unknown:"statusUnknown"};class LyraTraceTree extends LyraElement{constructor(){super(...arguments),this.spans=[],this.hiddenKinds=[],this.activeSpanId=null,this.withTokens=!1,this.withCost=!1,this.withoutBars=!1,this.collapsedIds=new Set,this.focusedId=null,this.previousStatuses=new Map,this.pendingAnnouncements=[],this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.renderedProjectionTruncated=!1,this.onKeyDown=e=>{const rows=this.buildRows();if(rows.length===0)return;const currentIndex=rows.findIndex(r=>r.span.id===this.focusedId),current=currentIndex>=0?rows[currentIndex]:rows[0];if(!current)return;const rtl=isRtl(this),expandKey=rtl?"ArrowLeft":"ArrowRight",collapseKey=rtl?"ArrowRight":"ArrowLeft";switch(e.key){case"ArrowDown":e.preventDefault(),this.focusRow(rows[Math.min(rows.length-1,currentIndex+1)]);break;case"ArrowUp":e.preventDefault(),this.focusRow(rows[Math.max(0,currentIndex-1)]);break;case"Home":e.preventDefault(),this.focusRow(rows[0]);break;case"End":e.preventDefault(),this.focusRow(rows[rows.length-1]);break;case expandKey:if(e.preventDefault(),!current.hasChildren)break;if(this.collapsedIds.has(current.span.id))this.toggleSpan(current.span.id);else{const child=rows[currentIndex+1];child&&child.depth>current.depth&&this.focusRow(child)}break;case collapseKey:if(e.preventDefault(),current.hasChildren&&!this.collapsedIds.has(current.span.id))this.toggleSpan(current.span.id);else for(let i=currentIndex-1;i>=0;i--){const row=rows[i];if(row&&row.depth<current.depth){this.focusRow(row);break}}break;case"Enter":case" ":e.preventDefault(),this.selectRow(current.span.id);break;default:return}}}static{this.defaultStrings={...super.defaultStrings,accessibleLabelSeparator:LYRA_DEFAULT_accessibleLabelSeparator,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,cost:LYRA_DEFAULT_cost,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,duration:LYRA_DEFAULT_duration,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,noData:LYRA_DEFAULT_noData,open:LYRA_DEFAULT_open,spanKindAgent:LYRA_DEFAULT_spanKindAgent,spanKindEmbedding:LYRA_DEFAULT_spanKindEmbedding,spanKindLlm:LYRA_DEFAULT_spanKindLlm,spanKindOther:LYRA_DEFAULT_spanKindOther,spanKindRetriever:LYRA_DEFAULT_spanKindRetriever,spanKindTool:LYRA_DEFAULT_spanKindTool,spanProjectionLimit:LYRA_DEFAULT_spanProjectionLimit,statusDenied:LYRA_DEFAULT_statusDenied,statusError:LYRA_DEFAULT_statusError,statusIncomplete:LYRA_DEFAULT_statusIncomplete,statusPending:LYRA_DEFAULT_statusPending,statusRunning:LYRA_DEFAULT_statusRunning,statusSuccess:LYRA_DEFAULT_statusSuccess,statusUnknown:LYRA_DEFAULT_statusUnknown,tokensIn:LYRA_DEFAULT_tokensIn,tokensOut:LYRA_DEFAULT_tokensOut,traceTree:LYRA_DEFAULT_traceTree,traceTreeMetricLabel:LYRA_DEFAULT_traceTreeMetricLabel,traceTreeSpanStatus:LYRA_DEFAULT_traceTreeSpanStatus}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["spans","hiddenKinds"])}static{this.identityCollectionProperties=Object.freeze(["spans"])}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.renderedProjectionTruncated}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}hierarchy(){const key=this.hierarchyKey;return(!key||key[0]!==this.spans||key[1]!==this.activeSpanId||key[2]!==this.hiddenKinds)&&(this.hierarchyKey=[this.spans,this.activeSpanId,this.hiddenKinds],this.hierarchyCache=this.buildHierarchy()),this.hierarchyCache}buildHierarchy(){const projection=normalizeLyraSpans(this.spans,this.activeSpanId),{truncated,extentEndMs}=projection;let{spans,byId}=projection;if(this.hiddenKinds.length>0){const hidden=new Set(this.hiddenKinds);spans=spans.filter(span=>!hidden.has(span.kind)),byId=new Map(spans.map(span=>[span.id,span]))}const childrenOf=new Map,parentOf=new Map,roots=[],hasCyclicParentChain=span=>{const visited=new Set([span.id]);let parentId=span.parentId;for(;parentId!=null;){if(visited.has(parentId))return!0;visited.add(parentId),parentId=byId.get(parentId)?.parentId}return!1};for(const span of spans){const parent=span.parentId!=null&&!hasCyclicParentChain(span)?byId.get(span.parentId):void 0;if(parent&&parent.id!==span.id){const list=childrenOf.get(parent.id)??[];list.push(span),childrenOf.set(parent.id,list),parentOf.set(span.id,parent.id)}else roots.push(span)}const byStart=(a,b)=>a.startMs-b.startMs;roots.sort(byStart);for(const list of childrenOf.values())list.sort(byStart);return{spans,byId,childrenOf,parentOf,roots,truncated,extentEndMs}}buildRows(hierarchy=this.hierarchy()){const rows=[],stack=[...hierarchy.roots].reverse().map((span,reverseIndex)=>({span,depth:0,posInSet:hierarchy.roots.length-reverseIndex,setSize:hierarchy.roots.length})),visited=new Set;for(;stack.length>0&&rows.length<MAX_RENDERED_LYRA_SPANS;){const current=stack.pop();if(!current||visited.has(current.span.id))continue;visited.add(current.span.id);const children=hierarchy.childrenOf.get(current.span.id)??[];if(rows.push({...current,hasChildren:children.length>0}),!(children.length===0||this.collapsedIds.has(current.span.id)))for(let index=children.length-1;index>=0;index--){const child=children[index];child&&stack.push({span:child,depth:current.depth+1,posInSet:index+1,setSize:children.length})}}return rows}traceExtent(hierarchy=this.hierarchy()){return finiteNumber(hierarchy.extentEndMs,0)||1}formatDuration(ms){return ms==null?"":formatShortDuration(this.localize.bind(this),this.effectiveLocale,ms)}formatNumber(n){return getNumberFormat(this.effectiveLocale).format(finiteCount(n))}validTokenMetric(value){return typeof value=="number"&&Number.isFinite(value)&&value>=0}toggleSpan(id){const collapsed=this.collapsedIds.has(id);collapsed||this.renderedRowById(id)?.focus();const next=new Set(this.collapsedIds);collapsed?next.delete(id):next.add(id),this.collapsedIds=next,this.focusedId=id,this.emit("lr-span-toggle",{spanId:id,expanded:collapsed})}async expandAll(){this.collapsedIds=new Set,await this.updateComplete}collapseAll(){const next=new Set,hierarchy=this.hierarchy(),{byId,parentOf}=hierarchy,hasChild=new Set(hierarchy.childrenOf.keys());for(const id of hasChild)next.add(id);if(this.collapsedIds=next,this.focusedId!=null){const before=this.focusedId;let current=byId.get(before);for(;current&&parentOf.has(current.id);)current=byId.get(parentOf.get(current.id));this.focusedId=current?.id??null,current&&current.id!==before&&shadowFocusTarget(this)&&this.renderedRowById(current.id)?.focus()}}focusRow(row){row&&(this.focusedId=row.span.id,this.updateComplete.then(()=>{this.renderedRowById(row.span.id)?.focus()}))}selectRow(id){this.focusedId=id,this.emit("lr-span-select",{spanId:id})}willUpdate(changed){if(super.willUpdate(changed),changed.has("spans")||changed.has("hiddenKinds")||changed.has("activeSpanId")||changed.has("collapsedIds")){const hierarchy=this.hierarchy(),ids=new Set(hierarchy.byId.keys());let pruned=null;for(const id of this.collapsedIds)ids.has(id)||(pruned??=new Set(this.collapsedIds),pruned.delete(id));if(pruned&&(this.collapsedIds=pruned),(changed.has("spans")||changed.has("activeSpanId"))&&this.activeSpanId&&hierarchy.byId.has(this.activeSpanId)){const revealed=new Set(this.collapsedIds);let currentId=this.activeSpanId,changedCollapse=!1;for(;hierarchy.parentOf.has(currentId);)currentId=hierarchy.parentOf.get(currentId),revealed.delete(currentId)&&(changedCollapse=!0);changedCollapse&&(this.collapsedIds=revealed)}const rows=this.buildRows(hierarchy),visibleIds=new Set(rows.map(row=>row.span.id));if((this.focusedId==null||!ids.has(this.focusedId))&&(this.focusedId=this.activeSpanId&&visibleIds.has(this.activeSpanId)?this.activeSpanId:rows[0]?.span.id??null),changed.has("spans")){for(const row of rows){const{span}=row,prev=this.previousStatuses.get(span.id);prev!==void 0&&prev!==span.status&&this.pendingAnnouncements.push(this.localize("traceTreeSpanStatus",void 0,{name:span.name,status:this.localize(STATUS_LABEL_KEY[span.status])}))}this.previousStatuses=new Map(hierarchy.spans.map(span=>[span.id,span.status]))}const visibleAncestor=id=>{let current=id?hierarchy.byId.get(id):void 0;for(;current;){if(visibleIds.has(current.id))return current.id;current=hierarchy.parentOf.has(current.id)?hierarchy.byId.get(hierarchy.parentOf.get(current.id)):void 0}return null};this.focusedId=visibleAncestor(changed.has("activeSpanId")?this.activeSpanId:null)??visibleAncestor(this.focusedId)??visibleAncestor(this.activeSpanId)??rows[0]?.span.id??null}}renderedRowById(id){const ownerCss=this.ownerDocument.defaultView?.CSS;return typeof ownerCss?.escape=="function"?this.renderRoot.querySelector(`[data-id="${ownerCss.escape(id)}"]`):Array.from(this.renderRoot.querySelectorAll("[data-id]")).find(element=>element.dataset.id===id)??null}updated(changed){if(super.updated(changed),changed.has("activeSpanId")&&this.activeSpanId){const row=this.renderedRowById(this.activeSpanId);if(row){const reducedMotion=!row.ownerDocument.defaultView||prefersReducedMotion(this);row.scrollIntoView({block:"nearest",behavior:reducedMotion?"auto":"smooth"})}}if(this.pendingAnnouncements.length>0){const texts=this.pendingAnnouncements;this.pendingAnnouncements=[];for(const text of texts)this.liveRegion?.announce(text)}this.limitAnnouncementInitialized&&this.renderedProjectionTruncated&&!this.previouslyTruncated&&this.announcements.announcePolite(this.localize("spanProjectionLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_LYRA_SPANS)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.renderedProjectionTruncated}renderHeader(){return html`
5
+ `}function agentIcon(){return glyph(svg`<rect x="5" y="8" width="14" height="10" rx="2"></rect><circle cx="9.5" cy="13" r="1"></circle><circle cx="14.5" cy="13" r="1"></circle><path d="M12 8V5"></path><circle cx="12" cy="4" r="1"></circle>`)}function llmIcon(){return glyph(svg`<path d="M12 3l1.6 4.4L18 9l-4.4 1.6L12 15l-1.6-4.4L6 9l4.4-1.6z"></path><path d="M18.5 15l.7 1.9 1.9.7-1.9.7-.7 1.9-.7-1.9-1.9-.7 1.9-.7z"></path>`)}function toolIcon(){return glyph(svg`<path d="M14.7 6.3a4 4 0 0 1-5.4 5.4L4 17l3 3 5.3-5.3a4 4 0 0 1 5.4-5.4l-2.3 2.3-2-2z"></path>`)}function retrieverIcon(){return glyph(svg`<circle cx="10.5" cy="10.5" r="6.5"></circle><line x1="15.5" y1="15.5" x2="20" y2="20"></line>`)}function embeddingIcon(){return glyph(svg`<circle cx="6" cy="6" r="1.6"></circle><circle cx="18" cy="6" r="1.6"></circle><circle cx="6" cy="18" r="1.6"></circle><circle cx="18" cy="18" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><line x1="7.3" y1="7.3" x2="10.8" y2="10.8"></line><line x1="16.7" y1="7.3" x2="13.2" y2="10.8"></line><line x1="7.3" y1="16.7" x2="10.8" y2="13.2"></line><line x1="16.7" y1="16.7" x2="13.2" y2="13.2"></line>`)}function otherIcon(){return glyph(svg`<circle cx="12" cy="12" r="8"></circle>`)}const KIND_ICON={agent:agentIcon,llm:llmIcon,tool:toolIcon,retriever:retrieverIcon,embedding:embeddingIcon,other:otherIcon},KIND_LABEL_KEY={agent:"spanKindAgent",llm:"spanKindLlm",tool:"spanKindTool",retriever:"spanKindRetriever",embedding:"spanKindEmbedding",other:"spanKindOther"},STATUS_LABEL_KEY={pending:"statusPending",running:"statusRunning",success:"statusSuccess",error:"statusError",denied:"statusDenied",incomplete:"statusIncomplete",unknown:"statusUnknown"};class LyraTraceTree extends LyraElement{constructor(){super(...arguments),this._treeSource=void 0,this.sourceVersion=0,this.sourcePaintVersion=0,this.sourceSummaries=new WeakMap,this.wasSource=!1,this.sourceControl=new HierarchySourceController(this,{normalize:(value,key)=>this.normalizeSourceSpan(value,key),payload:{maxUnits:2e6,maxRowUnits:65536,unitsOf:span=>span.id.length+span.name.length+(span.detail?.length??0)+(span.costText?.length??0)},onChange:()=>{const old=this.sourcePaintVersion++;this.requestUpdate("sourcePaintVersion",old)},accepted:(action,_row,_state,current)=>{!current()||this.treeSource===void 0||(action.type==="toggle"?this.emit("lr-span-toggle",{spanId:action.key,expanded:action.expanded}):action.type==="select"&&this.emit("lr-span-select",{spanId:action.key}))}}),this.spans=[],this.maxNodes=500,this.hiddenKinds=[],this.activeSpanId=null,this.withTokens=!1,this.withCost=!1,this.withoutBars=!1,this.collapsedIds=new Set,this.focusedId=null,this.previousStatuses=new Map,this.pendingAnnouncements=[],this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.renderedProjectionTruncated=!1,this.onKeyDown=e=>{if(this.treeSource!==void 0||e.currentTarget!==this.renderRoot.querySelector("[role=tree]"))return;const rows=this.buildRows();if(rows.length===0)return;const currentIndex=rows.findIndex(r=>r.span.id===this.focusedId),current=currentIndex>=0?rows[currentIndex]:rows[0];if(!current)return;const rtl=isRtl(this),expandKey=rtl?"ArrowLeft":"ArrowRight",collapseKey=rtl?"ArrowRight":"ArrowLeft";switch(e.key){case"ArrowDown":e.preventDefault(),this.focusRow(rows[Math.min(rows.length-1,currentIndex+1)]);break;case"ArrowUp":e.preventDefault(),this.focusRow(rows[Math.max(0,currentIndex-1)]);break;case"Home":e.preventDefault(),this.focusRow(rows[0]);break;case"End":e.preventDefault(),this.focusRow(rows[rows.length-1]);break;case expandKey:if(e.preventDefault(),!current.hasChildren)break;if(this.collapsedIds.has(current.span.id))this.toggleSpan(current.span.id);else{const child=rows[currentIndex+1];child&&child.depth>current.depth&&this.focusRow(child)}break;case collapseKey:if(e.preventDefault(),current.hasChildren&&!this.collapsedIds.has(current.span.id))this.toggleSpan(current.span.id);else for(let i=currentIndex-1;i>=0;i--){const row=rows[i];if(row&&row.depth<current.depth){this.focusRow(row);break}}break;case"Enter":case" ":e.preventDefault(),this.selectRow(current.span.id);break;default:return}}}static{this.defaultStrings={...super.defaultStrings,accessibleLabelSeparator:LYRA_DEFAULT_accessibleLabelSeparator,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,cost:LYRA_DEFAULT_cost,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,duration:LYRA_DEFAULT_duration,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,expand:LYRA_DEFAULT_expand,item:LYRA_DEFAULT_item,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,noData:LYRA_DEFAULT_noData,open:LYRA_DEFAULT_open,retry:LYRA_DEFAULT_retry,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,spanKindAgent:LYRA_DEFAULT_spanKindAgent,spanKindEmbedding:LYRA_DEFAULT_spanKindEmbedding,spanKindLlm:LYRA_DEFAULT_spanKindLlm,spanKindOther:LYRA_DEFAULT_spanKindOther,spanKindRetriever:LYRA_DEFAULT_spanKindRetriever,spanKindTool:LYRA_DEFAULT_spanKindTool,spanProjectionLimit:LYRA_DEFAULT_spanProjectionLimit,statusDenied:LYRA_DEFAULT_statusDenied,statusError:LYRA_DEFAULT_statusError,statusIncomplete:LYRA_DEFAULT_statusIncomplete,statusPending:LYRA_DEFAULT_statusPending,statusRunning:LYRA_DEFAULT_statusRunning,statusSuccess:LYRA_DEFAULT_statusSuccess,statusUnknown:LYRA_DEFAULT_statusUnknown,tokensIn:LYRA_DEFAULT_tokensIn,tokensOut:LYRA_DEFAULT_tokensOut,traceTree:LYRA_DEFAULT_traceTree,traceTreeMetricLabel:LYRA_DEFAULT_traceTreeMetricLabel,traceTreeSpanStatus:LYRA_DEFAULT_traceTreeSpanStatus,treeSourceError:LYRA_DEFAULT_treeSourceError,treeSourceSummary:LYRA_DEFAULT_treeSourceSummary}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["spans","hiddenKinds"])}static{this.identityCollectionProperties=Object.freeze(["spans"])}static{this.styles=[LyraElement.styles,hierarchySourceStyles,styles]}get treeSource(){return this._treeSource}set treeSource(value){const previous=this._treeSource;this._treeSource=value,this.sourceVersion++,this.sourceReveal=void 0,this.sourceWrapper=value===void 0?void 0:this.wrapSource(value),this.syncSource(!0),this.requestUpdate("treeSource",previous)}revealSourceKey(key){return this.treeSource===void 0?Promise.resolve(!1):this.sourceControl.reveal(key)}syncSource(force=!1){this.sourceControl?.update(this.sourceWrapper,this.effectiveLocale,force,{search:"",hiddenKinds:this.hiddenKinds??[]})}wrapSource(source){const host=this;return{get revision(){return source.revision},async project(request){const version=host.sourceVersion,owner=host.ownerDocument,owned=()=>host._treeSource===source&&host.sourceVersion===version&&host.ownerDocument===owner&&host.isConnected&&!request.signal.aborted,current=()=>{if(!owned())return!1;const revision=source.revision;return owned()&&revision===request.revision},check=()=>{if(!current())throw new Error("Trace source changed")};check();const project=source.project;check();const result=await project.call(source,request);check();const summary=result.summary;check();const startMs=hierarchyField(summary,"startMs");check();const endMs=hierarchyField(summary,"endMs");if(check(),typeof startMs!="number"||typeof endMs!="number"||!Number.isFinite(startMs)||!Number.isFinite(endMs)||startMs<0||endMs<startMs||!Number.isFinite(endMs-startMs))throw new TypeError("Invalid trace extent");const view=result.rows;check();const count=view.count;check();const hasItemAt="itemAt"in view;check();const itemAt=hasItemAt?view.itemAt:void 0;check();let wrapped;if(typeof itemAt=="function"){const indexed=view;wrapped={count,itemAt(index){check();const method=indexed.itemAt;check();const value=method.call(indexed,index);return check(),value},keyAt(index){check();const method=indexed.keyAt;check();const value=method.call(indexed,index);return check(),value},indexOfKey(key){check();const method=indexed.indexOfKey;check();const value=method.call(indexed,key);return check(),value}}}else{const ranged=view;wrapped={count,async read(range){const active=()=>{if(check(),range.signal.aborted)throw new Error("Trace range changed")};active();const method=ranged.read;active();const value=await method.call(ranged,range);return active(),value},async indexOfKey(key,context){const active=()=>{if(check(),context.signal.aborted)throw new Error("Trace navigation changed")};active();const method=ranged.indexOfKey;active();const value=await method.call(ranged,key,context);return active(),value}}}const state2=result.state;check();const total=result.total;check();const focusIndex=result.focusIndex;return check(),host.sourceSummaries.set(wrapped,Object.freeze({startMs,endMs,current})),{state:state2,total,rows:wrapped,...focusIndex===void 0?{}:{focusIndex}}}}}normalizeSourceSpan(value,key){const source=this.treeSource,version=this.sourceVersion,owner=this.ownerDocument,epoch=this.sourceControl.epoch,projection=this.sourceControl.projection,owned=()=>this.isConnected&&this.ownerDocument===owner&&this.treeSource===source&&this.sourceVersion===version&&this.sourceControl.epoch===epoch&&this.sourceControl.projection===projection&&!this.sourceControl.loading,accepted=projection?this.sourceSummaries.get(projection.rows):void 0,current=()=>owned()&&!!accepted?.current()&&owned(),field=name=>{if(!current())throw new Error("Trace source changed");const result=hierarchyField(value,name);if(!current())throw new Error("Trace source changed");return result},id=hierarchyKey(field("id"));if(id!==key)throw new TypeError("Trace key mismatch");const startMs=field("startMs"),endMs=field("endMs");if(typeof startMs!="number"||!Number.isFinite(startMs)||startMs<0||endMs!==void 0&&(typeof endMs!="number"||!Number.isFinite(endMs)||endMs<startMs))throw new TypeError("Invalid span timing");const tokensIn=field("tokensIn"),tokensOut=field("tokensOut");return Object.freeze({id,name:hierarchyText(field("name")),detail:hierarchyText(field("detail")),costText:hierarchyText(field("costText")),kind:normalizeLyraSpanKind(field("kind")),status:normalizeLyraSpanStatus(field("status")),startMs,...endMs===void 0?{}:{endMs},...typeof tokensIn=="number"&&this.validTokenMetric(tokensIn)?{tokensIn}:{},...typeof tokensOut=="number"&&this.validTokenMetric(tokensOut)?{tokensOut}:{}})}requestUpdate(name,oldValue){this._treeSource!==void 0&&(name===void 0||name==="hiddenKinds")&&(this.sourceVersion++,this.sourceReveal=void 0,this.syncSource(!0)),super.requestUpdate(name,oldValue)}disconnectedCallback(){this.sourceVersion++,this.sourceReveal=void 0,this.sourceAnnouncement=void 0,this.pendingAnnouncements=[],super.disconnectedCallback()}sourceSummary(){const projection=this.sourceControl.projection;return projection?this.localize("treeSourceSummary",void 0,{visible:getNumberFormat(this.effectiveLocale).format(projection.rows.count),total:getNumberFormat(this.effectiveLocale).format(projection.total)}):""}updateSourceEffects(){const source=this.treeSource,binding=this.sourceWrapper,version=this.sourceVersion,epoch=this.sourceControl.epoch,owner=this.ownerDocument,projection=this.sourceControl.projection,{error,loading,rowError,rowsObserved}=this.sourceControl,bound=()=>this.isConnected&&this.ownerDocument===owner&&this.treeSource===source&&this.sourceWrapper===binding&&this.sourceVersion===version&&this.sourceControl.epoch===epoch,current=()=>bound()&&this.sourceControl.projection===projection&&this.sourceControl.error===error&&this.sourceControl.loading===loading&&this.sourceControl.rowError===rowError&&this.sourceControl.rowsObserved===rowsObserved;if(!current())return;for(const row of this.renderRoot.querySelectorAll("[data-source-key]")){const active=row.dataset.sourceKey===this.activeSpanId;row.setAttribute("aria-current",String(active)),row.toggleAttribute("data-active",active)}const status=error?this.localize("treeSourceError"):loading?this.localize("loading"):this.sourceSummary();if(!current()||this.sourceAnnouncement!==void 0&&status!==this.sourceAnnouncement&&(this.announcements.announcePolite(status),!current()))return;if(rowsObserved){const message=rowError?this.localize("treeSourceError"):"";if(!current()||(this.announcements.transition("source-rows",rowError?"error":"ready",message),!current()))return}this.sourceAnnouncement=status;const key=this.activeSpanId;!key||this.sourceReveal?.[0]===epoch&&this.sourceReveal[1]===key||(this.sourceReveal=[epoch,key],this.sourceControl.whenReady().then(ready=>{ready&&bound()&&this.activeSpanId===key&&this.sourceControl.reveal(key)}))}sourceSpanLabel(span){const fragments=[span.name,span.detail??"",this.localize(KIND_LABEL_KEY[span.kind]),this.localize(STATUS_LABEL_KEY[span.status]),this.formatDuration(span.endMs===void 0?void 0:span.endMs-span.startMs)];return this.withTokens&&(this.validTokenMetric(span.tokensIn)&&fragments.push(this.localize("traceTreeMetricLabel",void 0,{label:this.localize("tokensIn"),value:this.formatNumber(span.tokensIn)})),this.validTokenMetric(span.tokensOut)&&fragments.push(this.localize("traceTreeMetricLabel",void 0,{label:this.localize("tokensOut"),value:this.formatNumber(span.tokensOut)}))),this.withCost&&span.costText&&fragments.push(this.localize("traceTreeMetricLabel",void 0,{label:this.localize("cost"),value:span.costText})),fragments.filter(Boolean).join(this.localize("accessibleLabelSeparator"))}renderSourceSpan(span){const projection=this.sourceControl.projection,summary=projection&&this.sourceSummaries.get(projection.rows);if(!summary)return html``;const extent=summary.endMs-summary.startMs||1,start=Math.max(0,Math.min(span.status==="running"?99:100,(span.startMs-summary.startMs)/extent*100)),end=span.endMs??(span.status==="running"?summary.endMs:span.startMs),width=Math.max(span.status==="running"?1:0,Math.min(100-start,(end-span.startMs)/extent*100));return html`<span class="source-span" ?data-active=${this.activeSpanId===span.id}>
6
+ <span part="icon">${KIND_ICON[span.kind]()}</span><span part="name">${span.name}</span>
7
+ <span part="detail">${span.detail??""}</span>
8
+ <span part="status-text" data-status=${span.status}>${this.localize(STATUS_LABEL_KEY[span.status])}</span>
9
+ ${this.withoutBars?nothing:html`<span part="bar-track"><span part="bar" data-status=${span.status}
10
+ style=${`inset-inline-start:${start}%;inline-size:${width}%`}></span></span>`}
11
+ <span part="duration">${this.formatDuration(span.endMs===void 0?void 0:span.endMs-span.startMs)}</span>
12
+ ${this.withTokens?html`<span part="tokens-in">${this.validTokenMetric(span.tokensIn)?this.formatNumber(span.tokensIn):""}</span>
13
+ <span part="tokens-out">${this.validTokenMetric(span.tokensOut)?this.formatNumber(span.tokensOut):""}</span>`:nothing}
14
+ ${this.withCost?html`<span part="cost">${span.costText??""}</span>`:nothing}
15
+ </span>`}get effectiveMaxNodes(){return Math.max(1,Math.min(5e3,finiteCount(this.maxNodes,500)))}connectedCallback(){super.connectedCallback(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.renderedProjectionTruncated}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.sourceVersion++,this.sourceReveal=void 0,this.sourceAnnouncement=void 0,this.sourceControl.adopted(),this.syncSource(!0)}hierarchy(){const projection=projectLyraSpans(this.spans,this.activeSpanId,this.effectiveMaxNodes),key=this.hierarchyKey;return(!key||key[0]!==projection||key[1]!==this.hiddenKinds)&&(this.hierarchyKey=[projection,this.hiddenKinds],this.hierarchyCache=this.buildHierarchy(projection)),this.hierarchyCache}buildHierarchy(projection=projectLyraSpans(this.spans,this.activeSpanId,this.effectiveMaxNodes)){const{truncated,extentEndMs}=projection;let{spans,byId}=projection;if(this.hiddenKinds.length>0){const hidden=new Set(this.hiddenKinds);spans=spans.filter(span=>!hidden.has(span.kind)),byId=new Map(spans.map(span=>[span.id,span]))}const childrenOf=new Map,parentOf=new Map,roots=[],hasCyclicParentChain=span=>{const visited=new Set([span.id]);let parentId=span.parentId;for(;parentId!=null;){if(visited.has(parentId))return!0;visited.add(parentId),parentId=byId.get(parentId)?.parentId}return!1};for(const span of spans){const parent=span.parentId!=null&&!hasCyclicParentChain(span)?byId.get(span.parentId):void 0;if(parent&&parent.id!==span.id){const list=childrenOf.get(parent.id)??[];list.push(span),childrenOf.set(parent.id,list),parentOf.set(span.id,parent.id)}else roots.push(span)}const byStart=(a,b)=>a.startMs-b.startMs;roots.sort(byStart);for(const list of childrenOf.values())list.sort(byStart);return{spans,byId,childrenOf,parentOf,roots,truncated,extentEndMs}}buildRows(hierarchy=this.hierarchy()){const rows=[],stack=[...hierarchy.roots].reverse().map((span,reverseIndex)=>({span,depth:0,posInSet:hierarchy.roots.length-reverseIndex,setSize:hierarchy.roots.length})),visited=new Set;for(;stack.length>0&&rows.length<this.effectiveMaxNodes;){const current=stack.pop();if(!current||visited.has(current.span.id))continue;visited.add(current.span.id);const children=hierarchy.childrenOf.get(current.span.id)??[];if(rows.push({...current,hasChildren:children.length>0}),!(children.length===0||this.collapsedIds.has(current.span.id)))for(let index=children.length-1;index>=0;index--){const child=children[index];child&&stack.push({span:child,depth:current.depth+1,posInSet:index+1,setSize:children.length})}}return rows}traceExtent(hierarchy=this.hierarchy()){return finiteNumber(hierarchy.extentEndMs,0)||1}formatDuration(ms){return ms==null?"":formatShortDuration(this.localize.bind(this),this.effectiveLocale,ms)}formatNumber(n){return getNumberFormat(this.effectiveLocale).format(finiteCount(n))}validTokenMetric(value){return typeof value=="number"&&Number.isFinite(value)&&value>=0}toggleSpan(id){if(this.treeSource!==void 0||!this.isConnected)return;const collapsed=this.collapsedIds.has(id);collapsed||this.renderedRowById(id)?.focus();const next=new Set(this.collapsedIds);collapsed?next.delete(id):next.add(id),this.collapsedIds=next,this.focusedId=id,this.emit("lr-span-toggle",{spanId:id,expanded:collapsed})}async expandAll(){this.treeSource===void 0&&(this.collapsedIds=new Set,await this.updateComplete)}collapseAll(){if(this.treeSource!==void 0)return;const next=new Set,hierarchy=this.hierarchy(),{byId,parentOf}=hierarchy,hasChild=new Set(hierarchy.childrenOf.keys());for(const id of hasChild)next.add(id);if(this.collapsedIds=next,this.focusedId!=null){const before=this.focusedId;let current=byId.get(before);for(;current&&parentOf.has(current.id);)current=byId.get(parentOf.get(current.id));this.focusedId=current?.id??null,current&&current.id!==before&&shadowFocusTarget(this)&&this.renderedRowById(current.id)?.focus()}}focusRow(row){row&&(this.focusedId=row.span.id,this.updateComplete.then(()=>{this.renderedRowById(row.span.id)?.focus()}))}selectRow(id){this.treeSource!==void 0||!this.isConnected||(this.focusedId=id,this.emit("lr-span-select",{spanId:id}))}willUpdate(changed){if(super.willUpdate(changed),this.syncSource(),this.treeSource!==void 0){this.wasSource=!0,this.pendingAnnouncements=[],this.previousStatuses.clear(),this.renderedProjectionTruncated=!1;return}if(this.wasSource&&(this.wasSource=!1,this.sourceAnnouncement=void 0,this.sourceReveal=void 0,changed.set("spans",void 0)),changed.has("spans")||changed.has("hiddenKinds")||changed.has("activeSpanId")||changed.has("collapsedIds")){const hierarchy=this.hierarchy(),ids=new Set(hierarchy.byId.keys());let pruned=null;for(const id of this.collapsedIds)ids.has(id)||(pruned??=new Set(this.collapsedIds),pruned.delete(id));if(pruned&&(this.collapsedIds=pruned),(changed.has("spans")||changed.has("activeSpanId"))&&this.activeSpanId&&hierarchy.byId.has(this.activeSpanId)){const revealed=new Set(this.collapsedIds);let currentId=this.activeSpanId,changedCollapse=!1;for(;hierarchy.parentOf.has(currentId);)currentId=hierarchy.parentOf.get(currentId),revealed.delete(currentId)&&(changedCollapse=!0);changedCollapse&&(this.collapsedIds=revealed)}const rows=this.buildRows(hierarchy),visibleIds=new Set(rows.map(row=>row.span.id));if((this.focusedId==null||!ids.has(this.focusedId))&&(this.focusedId=this.activeSpanId&&visibleIds.has(this.activeSpanId)?this.activeSpanId:rows[0]?.span.id??null),changed.has("spans")){for(const row of rows){const{span}=row,prev=this.previousStatuses.get(span.id);prev!==void 0&&prev!==span.status&&this.pendingAnnouncements.push(this.localize("traceTreeSpanStatus",void 0,{name:span.name,status:this.localize(STATUS_LABEL_KEY[span.status])}))}this.previousStatuses=new Map(hierarchy.spans.map(span=>[span.id,span.status]))}const visibleAncestor=id=>{let current=id?hierarchy.byId.get(id):void 0;for(;current;){if(visibleIds.has(current.id))return current.id;current=hierarchy.parentOf.has(current.id)?hierarchy.byId.get(hierarchy.parentOf.get(current.id)):void 0}return null};this.focusedId=visibleAncestor(changed.has("activeSpanId")?this.activeSpanId:null)??visibleAncestor(this.focusedId)??visibleAncestor(this.activeSpanId)??rows[0]?.span.id??null}}renderedRowById(id){const ownerCss=this.ownerDocument.defaultView?.CSS;return typeof ownerCss?.escape=="function"?this.renderRoot.querySelector(`[data-id="${ownerCss.escape(id)}"]`):Array.from(this.renderRoot.querySelectorAll("[data-id]")).find(element=>element.dataset.id===id)??null}updated(changed){if(super.updated(changed),this.treeSource!==void 0){this.updateSourceEffects();return}if(changed.has("activeSpanId")&&this.activeSpanId){const row=this.renderedRowById(this.activeSpanId);if(row){const reducedMotion=!row.ownerDocument.defaultView||prefersReducedMotion(this);row.scrollIntoView({block:"nearest",behavior:reducedMotion?"auto":"smooth"})}}if(this.pendingAnnouncements.length>0){const texts=this.pendingAnnouncements;this.pendingAnnouncements=[];for(const text of texts)this.liveRegion?.announce(text)}this.limitAnnouncementInitialized&&this.renderedProjectionTruncated&&!this.previouslyTruncated&&this.announcements.announcePolite(this.localize("spanProjectionLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(this.effectiveMaxNodes)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.renderedProjectionTruncated}renderHeader(){return html`
6
16
  <div part="header">
7
17
  <span class="col-toggle" aria-hidden="true"></span>
8
18
  <span class="col-icon" aria-hidden="true"></span>
@@ -14,7 +24,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
14
24
  ${this.withTokens?html`<span class="col-tokens">${this.localize("tokensIn")}</span><span class="col-tokens">${this.localize("tokensOut")}</span>`:nothing}
15
25
  ${this.withCost?html`<span class="col-cost">${this.localize("cost")}</span>`:nothing}
16
26
  </div>
17
- `}renderRow(row,firstId,extent){const{span,depth,hasChildren,posInSet,setSize}=row,expanded=hasChildren&&!this.collapsedIds.has(span.id),isActive=this.activeSpanId===span.id,tabbable=this.focusedId===span.id||this.focusedId==null&&span.id===firstId,rawStartPct=span.startMs/extent*100,startPct=span.status==="running"?Math.min(99,rawStartPct):rawStartPct,endMs=span.endMs??(span.status==="running"?extent:span.startMs),widthPct=Math.max(span.status==="running"?1:0,(endMs-span.startMs)/extent*100),durationLabel=this.formatDuration(span.endMs!=null?span.endMs-span.startMs:void 0),fragments=[span.name,span.detail??"",this.localize(KIND_LABEL_KEY[span.kind]),this.localize(STATUS_LABEL_KEY[span.status]),durationLabel,this.withTokens&&this.validTokenMetric(span.tokensIn)?this.localize("traceTreeMetricLabel",void 0,{label:this.localize("tokensIn"),value:this.formatNumber(span.tokensIn)}):"",this.withTokens&&this.validTokenMetric(span.tokensOut)?this.localize("traceTreeMetricLabel",void 0,{label:this.localize("tokensOut"),value:this.formatNumber(span.tokensOut)}):"",this.withCost&&span.costText?this.localize("traceTreeMetricLabel",void 0,{label:this.localize("cost"),value:span.costText}):""].filter(Boolean);return html`
27
+ `}renderRow(row,firstId,extent){const{span,depth,hasChildren,posInSet,setSize}=row,version=this.sourceVersion,spans=this.spans,current=()=>this.isConnected&&this.treeSource===void 0&&version===this.sourceVersion&&this.spans===spans,expanded=hasChildren&&!this.collapsedIds.has(span.id),isActive=this.activeSpanId===span.id,tabbable=this.focusedId===span.id||this.focusedId==null&&span.id===firstId,rawStartPct=span.startMs/extent*100,startPct=span.status==="running"?Math.min(99,rawStartPct):rawStartPct,endMs=span.endMs??(span.status==="running"?extent:span.startMs),widthPct=Math.max(span.status==="running"?1:0,(endMs-span.startMs)/extent*100),durationLabel=this.formatDuration(span.endMs!=null?span.endMs-span.startMs:void 0),fragments=[span.name,span.detail??"",this.localize(KIND_LABEL_KEY[span.kind]),this.localize(STATUS_LABEL_KEY[span.status]),durationLabel,this.withTokens&&this.validTokenMetric(span.tokensIn)?this.localize("traceTreeMetricLabel",void 0,{label:this.localize("tokensIn"),value:this.formatNumber(span.tokensIn)}):"",this.withTokens&&this.validTokenMetric(span.tokensOut)?this.localize("traceTreeMetricLabel",void 0,{label:this.localize("tokensOut"),value:this.formatNumber(span.tokensOut)}):"",this.withCost&&span.costText?this.localize("traceTreeMetricLabel",void 0,{label:this.localize("cost"),value:span.costText}):""].filter(Boolean);return html`
18
28
  <div
19
29
  part="row"
20
30
  role="treeitem"
@@ -28,8 +38,8 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
28
38
  aria-label=${fragments.join(this.localize("accessibleLabelSeparator"))}
29
39
  ?data-active=${isActive}
30
40
  style=${`--_lr-trace-tree-depth:${depth}`}
31
- @click=${()=>this.selectRow(span.id)}
32
- @focus=${()=>{this.focusedId=span.id}}
41
+ @click=${()=>{current()&&this.selectRow(span.id)}}
42
+ @focus=${()=>{current()&&(this.focusedId=span.id)}}
33
43
  >
34
44
  <button
35
45
  part="toggle"
@@ -38,7 +48,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
38
48
  aria-hidden="true"
39
49
  ?hidden=${!hasChildren}
40
50
  @mousedown=${e=>e.preventDefault()}
41
- @click=${e=>{e.stopPropagation(),hasChildren&&this.toggleSpan(span.id)}}
51
+ @click=${e=>{e.stopPropagation(),current()&&hasChildren&&this.toggleSpan(span.id)}}
42
52
  >
43
53
  ${hasChildren?chevronIcon():nothing}
44
54
  </button>
@@ -54,7 +64,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
54
64
  <span part="tokens-out">${this.validTokenMetric(span.tokensOut)?this.formatNumber(span.tokensOut):""}</span>`:nothing}
55
65
  ${this.withCost?html`<span part="cost">${span.costText??""}</span>`:nothing}
56
66
  </div>
57
- `}render(){const hierarchy=this.hierarchy();this.renderedProjectionTruncated=hierarchy.truncated;const rows=this.buildRows(hierarchy),firstId=rows[0]?.span.id,extent=this.traceExtent(hierarchy);return html`
67
+ `}render(){if(this.treeSource!==void 0)return hierarchySourceView(this.sourceControl,{label:this.label??this.localize("traceTree"),rtl:this.effectiveDirection==="rtl",multiple:!1,loading:this.localize("loading"),error:this.localize("treeSourceError"),empty:this.localize("noData"),retry:this.localize("retry"),expand:this.localize("expand"),collapse:this.localize("collapse"),summary:this.sourceSummary(),content:span=>this.renderSourceSpan(span),name:span=>this.sourceSpanLabel(span),select:row=>{this.sourceControl.project({type:"select",key:row.key,selected:!0,scope:"item"},!0,row)}});const hierarchy=this.hierarchy();this.renderedProjectionTruncated=hierarchy.truncated||!!publicCollectionTruncation(this,"spans");const rows=this.buildRows(hierarchy),firstId=rows[0]?.span.id,extent=this.traceExtent(hierarchy);return html`
58
68
  <div
59
69
  part="base"
60
70
  role="tree"
@@ -62,7 +72,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
62
72
  @keydown=${this.onKeyDown}
63
73
  >
64
74
  ${rows.length===0?html`<lr-empty part="empty" heading=${this.localize("noData")}></lr-empty>`:html`${this.withTokens||this.withCost?this.renderHeader():nothing}${repeat(rows,row=>row.span.id,row=>this.renderRow(row,firstId,extent))}`}
65
- ${hierarchy.truncated?html`<p part="limit" role="note">${this.localize("spanProjectionLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_LYRA_SPANS)})}</p>`:nothing}
75
+ ${this.renderedProjectionTruncated?html`<p part="limit" role="note">${this.localize("spanProjectionLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(this.effectiveMaxNodes)})}</p>`:nothing}
66
76
  </div>
67
77
  <lr-live-region part="live-region" mode="polite"></lr-live-region>
68
- `}}__decorate([property({attribute:!1})],LyraTraceTree.prototype,"spans",void 0),__decorate([property({attribute:!1})],LyraTraceTree.prototype,"hiddenKinds",void 0),__decorate([property({attribute:"active-span-id"})],LyraTraceTree.prototype,"activeSpanId",void 0),__decorate([property()],LyraTraceTree.prototype,"label",void 0),__decorate([property({type:Boolean,attribute:"with-tokens",reflect:!0})],LyraTraceTree.prototype,"withTokens",void 0),__decorate([property({type:Boolean,attribute:"with-cost",reflect:!0})],LyraTraceTree.prototype,"withCost",void 0),__decorate([property({type:Boolean,attribute:"without-bars",reflect:!0})],LyraTraceTree.prototype,"withoutBars",void 0),__decorate([state()],LyraTraceTree.prototype,"collapsedIds",void 0),__decorate([state()],LyraTraceTree.prototype,"focusedId",void 0),__decorate([query("lr-live-region")],LyraTraceTree.prototype,"liveRegion",void 0);export{LyraTraceTree};
78
+ `}}__decorate([property({attribute:!1})],LyraTraceTree.prototype,"treeSource",null),__decorate([property({attribute:!1})],LyraTraceTree.prototype,"spans",void 0),__decorate([property({type:Number,attribute:"max-nodes"})],LyraTraceTree.prototype,"maxNodes",void 0),__decorate([property({attribute:!1})],LyraTraceTree.prototype,"hiddenKinds",void 0),__decorate([property({attribute:"active-span-id"})],LyraTraceTree.prototype,"activeSpanId",void 0),__decorate([property()],LyraTraceTree.prototype,"label",void 0),__decorate([property({type:Boolean,attribute:"with-tokens",reflect:!0})],LyraTraceTree.prototype,"withTokens",void 0),__decorate([property({type:Boolean,attribute:"with-cost",reflect:!0})],LyraTraceTree.prototype,"withCost",void 0),__decorate([property({type:Boolean,attribute:"without-bars",reflect:!0})],LyraTraceTree.prototype,"withoutBars",void 0),__decorate([state()],LyraTraceTree.prototype,"collapsedIds",void 0),__decorate([state()],LyraTraceTree.prototype,"focusedId",void 0),__decorate([query("lr-live-region")],LyraTraceTree.prototype,"liveRegion",void 0);export{LyraTraceTree};
@@ -1,2 +1,2 @@
1
1
  /** @deprecated Import @aceshooting/lyra-ui/components/lr-trace-tree.js to register this component. */
2
- export*from'./trace-tree.class.js';export*from'./span.js';import'../../utility/live-region/live-region.js';import'../../overlays/empty/empty.js';
2
+ export*from'./trace-tree.class.js';export*from'./span.js';import'../../utility/live-region/live-region.js';import'../../layout/virtual-list/virtual-list.js';import'../../overlays/empty/empty.js';
@@ -1 +1 @@
1
- export*from"./trace-tree.class.js";export*from"./span.js";import{LyraTraceTree}from"./trace-tree.class.js";import{defineElement}from"../../../internal/prefix.js";import"../../utility/live-region/live-region.js";import"../../overlays/empty/empty.js";defineElement("trace-tree",LyraTraceTree);
1
+ export*from"./trace-tree.class.js";export*from"./span.js";import{LyraTraceTree}from"./trace-tree.class.js";import{defineElement}from"../../../internal/prefix.js";import"../../utility/live-region/live-region.js";import"../../layout/virtual-list/virtual-list.js";import"../../overlays/empty/empty.js";defineElement("trace-tree",LyraTraceTree);
@@ -1 +1 @@
1
- import{iconHitTarget,focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";import{mediumContainerQuery}from"../../../internal/container-breakpoints.styles.js";const styles=css` :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); --_lr-trace-tree-bar-column: var(--lr-size-6rem); --_lr-trace-tree-tokens-in-column: 0; --_lr-trace-tree-tokens-out-column: 0; --_lr-trace-tree-cost-column: 0; } :host([without-bars]) { --_lr-trace-tree-bar-column: ; } :host([with-tokens]) { --_lr-trace-tree-tokens-in-column: var(--lr-size-3-5rem); --_lr-trace-tree-tokens-out-column: var(--lr-size-3-5rem); } :host([with-cost]) { --_lr-trace-tree-cost-column: var(--lr-size-3-5rem); } [part='base'] { display: flex; flex-direction: column; overflow-x: auto; overflow-y: hidden; font: inherit; color: var(--lr-color-text); } [part='header'], [part='row'] { display: grid; grid-template-columns: var(--lr-icon-button-size) var(--lr-size-1em) minmax(var(--lr-size-4rem), 1fr) minmax(0, 0.75fr) max-content var(--_lr-trace-tree-bar-column) var(--lr-size-3-5rem) var(--_lr-trace-tree-tokens-in-column) var(--_lr-trace-tree-tokens-out-column) var(--_lr-trace-tree-cost-column); align-items: center; gap: var(--lr-space-xs); padding-block: var(--lr-space-xs); padding-inline-end: var(--lr-space-s); border-block-end: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); box-sizing: border-box; } [part='header'] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-xs); } [part='row'] { cursor: pointer; } [part='row']:hover { background: var(--lr-color-surface-raised); } [part='row']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: calc(-1 * var(--lr-focus-ring-width)); } [part='row'][data-active] { background: var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)); } [part='row']:where([data-active]):hover { background: color-mix( in oklab, var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part='row']:active { background: color-mix(in oklab, var(--lr-color-surface-raised), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='row']:where([data-active]):active { background: color-mix( in oklab, var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part='row'][data-active] :is([part='detail'], [part='duration'], [part='tokens-in'], [part='tokens-out'], [part='cost']), [part='row'][data-active] [part='status-text']:is([data-status='pending'], [data-status='incomplete']) { color: var(--lr-trace-tree-row-active-color, var(--lr-color-text)); } [part='row'][data-active] [part='status-text'][data-status='success'] { color: color-mix( in srgb, var(--lr-trace-tree-success-color, var(--lr-color-success)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='row'][data-active] [part='status-text'][data-status='error'] { color: color-mix( in srgb, var(--lr-trace-tree-error-color, var(--lr-color-danger)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='row'][data-active] [part='status-text'][data-status='denied'] { color: color-mix( in srgb, var(--lr-trace-tree-denied-color, var(--lr-color-warning)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='row'][data-active] [part='status-text'][data-status='running'] { color: color-mix( in srgb, var(--lr-trace-tree-running-color, var(--lr-color-brand)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='toggle'] { flex: 0 0 auto; font: inherit; inline-size: var(--lr-size-1-25rem); block-size: var(--lr-size-1-25rem); ${iconHitTarget} display: inline-flex; align-items: center; justify-content: center; background: none; border: none; padding: 0; color: var(--lr-color-text-quiet); cursor: pointer; } [part='toggle']:hover { background: var(--lr-trace-tree-toggle-hover-bg, var(--lr-color-brand-quiet)); } [part='toggle']:active { background: color-mix( in oklab, var(--lr-trace-tree-toggle-hover-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part='toggle']:focus-visible { ${focusRing} } [part='toggle'][hidden] { display: inline-flex; visibility: hidden; } [part='row'][aria-expanded='true'] [part='toggle'] svg { transform: rotate(90deg); } :host(:dir(rtl)) [part='row']:not([aria-expanded='true']) [part='toggle'] svg { transform: rotate(180deg); } [part='icon'] { flex: 0 0 auto; display: inline-flex; color: var(--lr-color-text-quiet); } [part='name'] { min-inline-size: var(--lr-size-4rem); padding-inline-start: min( calc(var(--_lr-trace-tree-depth, 0) * var(--lr-space-l)), var(--lr-trace-tree-max-indent, var(--lr-size-12rem)) ); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } [part='detail'] { color: var(--lr-color-text-quiet); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } [part='status-text'] { font-size: var(--lr-font-size-xs); } [part='status-text'][data-status='success'] { color: var(--lr-trace-tree-success-color, var(--lr-color-success)); } [part='status-text'][data-status='error'] { color: var(--lr-trace-tree-error-color, var(--lr-color-danger)); } [part='status-text'][data-status='denied'] { color: var(--lr-trace-tree-denied-color, var(--lr-color-warning)); } [part='status-text'][data-status='running'] { color: var(--lr-trace-tree-running-color, var(--lr-color-brand)); } [part='status-text']:is([data-status='pending'], [data-status='incomplete'], [data-status='unknown']) { color: var(--lr-trace-tree-pending-color, var(--lr-color-text-quiet)); } [part='bar-track'] { position: relative; inline-size: 100%; block-size: var(--lr-size-0-5rem); background: var(--lr-trace-tree-bar-track-bg, var(--lr-color-surface-raised)); border-radius: var(--lr-radius-xs); overflow: hidden; } [part='bar'] { position: absolute; inset-block: 0; border-radius: inherit; } [part='bar'][data-status='success'] { background: var(--lr-trace-tree-success-color, var(--lr-color-success)); } [part='bar'][data-status='error'] { background: var(--lr-trace-tree-error-color, var(--lr-color-danger)); } [part='bar'][data-status='denied'] { background: var(--lr-trace-tree-denied-color, var(--lr-color-warning)); } [part='bar']:is([data-status='pending'], [data-status='incomplete'], [data-status='unknown']) { background: var(--lr-trace-tree-pending-color, var(--lr-color-text-quiet)); } [part='bar'][data-status='running'] { background-image: repeating-linear-gradient( 45deg, var(--lr-trace-tree-running-color, var(--lr-color-brand)) 0 var(--lr-size-6px), var(--lr-trace-tree-running-stripe-bg, var(--lr-color-brand-quiet)) var(--lr-size-6px) calc(var(--lr-size-6px) * 2) ); background-size: 200% 100%; animation: var(--_lr-motion-animation, lr-trace-tree-stripe var(--lr-transition-ambient) infinite); } :host(:dir(rtl)) [part='bar'][data-status='running'] { animation-name: var(--_lr-motion-animation, lr-trace-tree-stripe-rtl); } @media (prefers-reduced-motion: reduce) { [part='bar'][data-status='running'], :host(:dir(rtl)) [part='bar'][data-status='running'] { animation: none; background-position: 0 0; } } @keyframes lr-trace-tree-stripe { to { background-position: calc(var(--lr-size-24px) * -1) 0; } } @keyframes lr-trace-tree-stripe-rtl { to { background-position: var(--lr-size-24px) 0; } } [part='duration'], [part='tokens-in'], [part='tokens-out'], [part='cost'] { min-inline-size: 0; text-align: end; font-variant-numeric: tabular-nums; color: var(--lr-color-text-quiet); } [part='empty'] { padding: var(--lr-space-l); } [part='limit'] { margin: var(--lr-space-s); color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-xs); } @container ${mediumContainerQuery} { [part='tokens-in'], [part='tokens-out'], [part='cost'], [part='header'] .col-tokens, [part='header'] .col-cost { display: none; } [part='header'], [part='row'] { grid-template-columns: var(--lr-icon-button-size) var(--lr-size-1em) minmax(var(--lr-size-4rem), 1fr) minmax(0, 0.75fr) max-content var(--_lr-trace-tree-bar-column) var(--lr-size-3-5rem); } } @container (max-inline-size: 359.98px) { [part='bar-track'], [part='header'] .col-bar { display: none; } [part='header'], [part='row'] { grid-template-columns: var(--lr-icon-button-size) var(--lr-size-1em) minmax(var(--lr-size-4rem), 1fr) minmax(0, 0.75fr) max-content var(--lr-size-3-5rem); } } `;export{styles};
1
+ import{iconHitTarget,focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";import{mediumContainerQuery}from"../../../internal/container-breakpoints.styles.js";const styles=css` [part~='source-label'] { flex: 1; } [part~='source-row']:where([data-active]) { --_source-row-fill: var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)); color: var(--lr-trace-tree-row-active-color, var(--lr-color-text)); } .source-span { display: flex; align-items: center; flex-wrap: wrap; gap: var(--lr-space-xs); min-inline-size: 0; inline-size: 100%; padding-block: var(--lr-space-xs); } .source-span [part='name'] { flex: 1; min-inline-size: var(--lr-size-4rem); } .source-span [part='bar-track'] { inline-size: var(--_lr-trace-tree-bar-column); } .source-span:where([data-active]) { color: var(--lr-trace-tree-row-active-color, var(--lr-color-text)); } :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); --_lr-trace-tree-bar-column: var(--lr-size-6rem); --_lr-trace-tree-tokens-in-column: 0; --_lr-trace-tree-tokens-out-column: 0; --_lr-trace-tree-cost-column: 0; } :host([without-bars]) { --_lr-trace-tree-bar-column: ; } :host([with-tokens]) { --_lr-trace-tree-tokens-in-column: var(--lr-size-3-5rem); --_lr-trace-tree-tokens-out-column: var(--lr-size-3-5rem); } :host([with-cost]) { --_lr-trace-tree-cost-column: var(--lr-size-3-5rem); } [part='base'] { display: flex; flex-direction: column; overflow-x: auto; overflow-y: hidden; font: inherit; color: var(--lr-color-text); } [part='header'], [part='row'] { display: grid; grid-template-columns: var(--lr-icon-button-size) var(--lr-size-1em) minmax(var(--lr-size-4rem), 1fr) minmax(0, 0.75fr) max-content var(--_lr-trace-tree-bar-column) var(--lr-size-3-5rem) var(--_lr-trace-tree-tokens-in-column) var(--_lr-trace-tree-tokens-out-column) var(--_lr-trace-tree-cost-column); align-items: center; gap: var(--lr-space-xs); padding-block: var(--lr-space-xs); padding-inline-end: var(--lr-space-s); border-block-end: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); box-sizing: border-box; } [part='header'] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-xs); } [part='row'] { cursor: pointer; } [part='row']:hover { background: var(--lr-color-surface-raised); } [part='row']:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color); outline-offset: calc(-1 * var(--lr-focus-ring-width)); } [part='row'][data-active] { background: var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)); } [part='row']:where([data-active]):hover { background: color-mix( in oklab, var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part='row']:active { background: color-mix(in oklab, var(--lr-color-surface-raised), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='row']:where([data-active]):active { background: color-mix( in oklab, var(--lr-trace-tree-row-active-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part='row'][data-active] :is([part='detail'], [part='duration'], [part='tokens-in'], [part='tokens-out'], [part='cost']), [part='row'][data-active] [part='status-text']:is([data-status='pending'], [data-status='incomplete']) { color: var(--lr-trace-tree-row-active-color, var(--lr-color-text)); } [part='row'][data-active] [part='status-text'][data-status='success'] { color: color-mix( in srgb, var(--lr-trace-tree-success-color, var(--lr-color-success)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='row'][data-active] [part='status-text'][data-status='error'] { color: color-mix( in srgb, var(--lr-trace-tree-error-color, var(--lr-color-danger)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='row'][data-active] [part='status-text'][data-status='denied'] { color: color-mix( in srgb, var(--lr-trace-tree-denied-color, var(--lr-color-warning)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='row'][data-active] [part='status-text'][data-status='running'] { color: color-mix( in srgb, var(--lr-trace-tree-running-color, var(--lr-color-brand)) 75%, var(--lr-trace-tree-row-active-color, var(--lr-color-text)) ); } [part='toggle'] { flex: 0 0 auto; font: inherit; inline-size: var(--lr-size-1-25rem); block-size: var(--lr-size-1-25rem); ${iconHitTarget} display: inline-flex; align-items: center; justify-content: center; background: none; border: none; padding: 0; color: var(--lr-color-text-quiet); cursor: pointer; } [part='toggle']:hover { background: var(--lr-trace-tree-toggle-hover-bg, var(--lr-color-brand-quiet)); } [part='toggle']:active { background: color-mix( in oklab, var(--lr-trace-tree-toggle-hover-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part='toggle']:focus-visible { ${focusRing} } [part='toggle'][hidden] { display: inline-flex; visibility: hidden; } [part='row'][aria-expanded='true'] [part='toggle'] svg { transform: rotate(90deg); } :host(:dir(rtl)) [part='row']:not([aria-expanded='true']) [part='toggle'] svg { transform: rotate(180deg); } [part='icon'] { flex: 0 0 auto; display: inline-flex; color: var(--lr-color-text-quiet); } [part='name'] { min-inline-size: var(--lr-size-4rem); padding-inline-start: min( calc(var(--_lr-trace-tree-depth, 0) * var(--lr-space-l)), var(--lr-trace-tree-max-indent, var(--lr-size-12rem)) ); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } [part='detail'] { color: var(--lr-color-text-quiet); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } [part='status-text'] { font-size: var(--lr-font-size-xs); } [part='status-text'][data-status='success'] { color: var(--lr-trace-tree-success-color, var(--lr-color-success)); } [part='status-text'][data-status='error'] { color: var(--lr-trace-tree-error-color, var(--lr-color-danger)); } [part='status-text'][data-status='denied'] { color: var(--lr-trace-tree-denied-color, var(--lr-color-warning)); } [part='status-text'][data-status='running'] { color: var(--lr-trace-tree-running-color, var(--lr-color-brand)); } [part='status-text']:is([data-status='pending'], [data-status='incomplete'], [data-status='unknown']) { color: var(--lr-trace-tree-pending-color, var(--lr-color-text-quiet)); } [part='bar-track'] { position: relative; inline-size: 100%; block-size: var(--lr-size-0-5rem); background: var(--lr-trace-tree-bar-track-bg, var(--lr-color-surface-raised)); border-radius: var(--lr-radius-xs); overflow: hidden; } [part='bar'] { position: absolute; inset-block: 0; border-radius: inherit; } [part='bar'][data-status='success'] { background: var(--lr-trace-tree-success-color, var(--lr-color-success)); } [part='bar'][data-status='error'] { background: var(--lr-trace-tree-error-color, var(--lr-color-danger)); } [part='bar'][data-status='denied'] { background: var(--lr-trace-tree-denied-color, var(--lr-color-warning)); } [part='bar']:is([data-status='pending'], [data-status='incomplete'], [data-status='unknown']) { background: var(--lr-trace-tree-pending-color, var(--lr-color-text-quiet)); } [part='bar'][data-status='running'] { background-image: repeating-linear-gradient( 45deg, var(--lr-trace-tree-running-color, var(--lr-color-brand)) 0 var(--lr-size-6px), var(--lr-trace-tree-running-stripe-bg, var(--lr-color-brand-quiet)) var(--lr-size-6px) calc(var(--lr-size-6px) * 2) ); background-size: 200% 100%; animation: var(--_lr-motion-animation, lr-trace-tree-stripe var(--lr-transition-ambient) infinite); } :host(:dir(rtl)) [part='bar'][data-status='running'] { animation-name: var(--_lr-motion-animation, lr-trace-tree-stripe-rtl); } @media (prefers-reduced-motion: reduce) { [part='bar'][data-status='running'], :host(:dir(rtl)) [part='bar'][data-status='running'] { animation: none; background-position: 0 0; } } @keyframes lr-trace-tree-stripe { to { background-position: calc(var(--lr-size-24px) * -1) 0; } } @keyframes lr-trace-tree-stripe-rtl { to { background-position: var(--lr-size-24px) 0; } } [part='duration'], [part='tokens-in'], [part='tokens-out'], [part='cost'] { min-inline-size: 0; text-align: end; font-variant-numeric: tabular-nums; color: var(--lr-color-text-quiet); } [part='empty'] { padding: var(--lr-space-l); } [part='limit'] { margin: var(--lr-space-s); color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-xs); } @container ${mediumContainerQuery} { [part='tokens-in'], [part='tokens-out'], [part='cost'], [part='header'] .col-tokens, [part='header'] .col-cost { display: none; } [part='header'], [part='row'] { grid-template-columns: var(--lr-icon-button-size) var(--lr-size-1em) minmax(var(--lr-size-4rem), 1fr) minmax(0, 0.75fr) max-content var(--_lr-trace-tree-bar-column) var(--lr-size-3-5rem); } } @container (max-inline-size: 359.98px) { [part='bar-track'], [part='header'] .col-bar { display: none; } [part='header'], [part='row'] { grid-template-columns: var(--lr-icon-button-size) var(--lr-size-1em) minmax(var(--lr-size-4rem), 1fr) minmax(0, 0.75fr) max-content var(--lr-size-3-5rem); } } `;export{styles};
@@ -1,8 +1,12 @@
1
- import{LyraChart,type LyraChartType}from'./chart.class.js';
1
+ export type{LyraChartPreparedData,LyraChartSourcePointSelectDetail,LyraChartSourceCategorySelectDetail,LyraPreparedSeriesData,LyraPreparedCategoryData,LyraSeriesPointRef}from'./chart.class.js';import{LyraChart,type LyraChartType}from'./chart.class.js';
2
2
  /**
3
3
  * `<lr-bar-chart>` — `<lr-chart>` with a `"bar"` default. Like the mirrored Web Awesome tag,
4
4
  * its writable `type` still accepts the complete chart-type vocabulary.
5
5
  *
6
+ * Prepared-data compatibility follows the current writable type: line accepts series, bar
7
+ * accepts series/categories, radial category types accept categories. Spatial types require
8
+ * their own source route and reject these prepared kinds.
9
+ *
6
10
  * @customElement lr-bar-chart
7
11
  * @status stable
8
12
  * @since 4.0.0
@@ -149,9 +149,9 @@ dataTableToggle:boolean;private dataTableExpandedOverride;private readonly dataT
149
149
  valueFormatter?:LyraChartValueFormatter;
150
150
  /** Unified context-object formatter shared with the other chart surfaces. The tooltip lists all
151
151
  * five statistics, each formatted with its own `statistic`. */
152
- formatter?:LyraChartFormatter;private loading;private loadFailed;private canvasUnavailable;private visible;private keyboardDatumIndex;private keyboardDatumAnnouncement;private intersectionObserver?;private intersectionGeneration;private readonly reducedMotionWatch;private canvasEl?;private chart?;private stopAnnotationRegistrationWatch?;private chartJsModule?;private loadGeneration;private descriptionId;private lastDrawnDirection?;private lastDrawnLocale?;private readonly announcements;private lastDataTruncationAnnouncement;private isMounting;connectedCallback():void;private onBoxPlotPluginLoaded;disconnectedCallback():void;adoptedCallback():void;private armReducedMotionWatcher;private disarmReducedMotionWatcher;private get ownerWindow();private effectiveHiddenDatasetIndexes;private applyDatasetVisibility;protected updated(changed:PropertyValues):void;private themeColors;private seriesColor;private seriesBorderColor;private seriesFillColor;private forcedColorFill;private styleColor;private styleNumber;private readonly tooltipIsolationPlugin;private buildConfig;private draw;private setCanvasUnavailable;private drawIfVisible;private rebuildAfterAnnotationRegistration;
152
+ formatter?:LyraChartFormatter;private loading;private loadFailed;private canvasUnavailable;private visible;private keyboardDatumIndex;private keyboardDatumAnnouncement;private intersectionObserver?;private intersectionGeneration;private readonly reducedMotionWatch;private canvasEl?;private chart?;private stopAnnotationRegistrationWatch?;private chartJsModule?;private loadGeneration;private descriptionId;private lastDrawnDirection?;private lastDrawnLocale?;private readonly announcements;private lastDataTruncationAnnouncement;private isMounting;connectedCallback():void;private onBoxPlotPluginLoaded;disconnectedCallback():void;adoptedCallback():void;private armReducedMotionWatcher;private disarmReducedMotionWatcher;private get ownerWindow();private effectiveHiddenDatasetIndexes;private applyDatasetVisibility;protected updated(changed:PropertyValues):void;private themeColors;private seriesColor;private seriesBorderColor;private seriesFillColor;private forcedColorPatterns;private forcedColorSurface?;private forcedColorFill;private styleColor;private styleNumber;private readonly tooltipIsolationPlugin;private buildConfig;private draw;private setCanvasUnavailable;private drawIfVisible;private rebuildAfterAnnotationRegistration;
153
153
  /** Re-reads canvas theme custom properties after an out-of-band ancestor theme change. */
154
154
  refreshTheme():void;private seriesDisplayLabel;private formatValue;
155
155
  /** Returns a spreadsheet-safe CSV snapshot or the current canvas PNG data URL.
156
156
  * CSV preserves raw summary precision unless `formatter` or `valueFormatter` supplies text. */
157
- exportData(format:'csv'|'png'):string;private boxPlotDescription;private boxDatums;private boxStatistics;private boxAnnouncement;private activateBox;private handlePointClick;private showKeyboardBox;private keyboardBoxShown;private readonly onCanvasBlur;private onCanvasFocus;private onCanvasKeyDown;private validPoint;private accessibleName;private dataTableSample;private generatedDataIsSampled;private dataTruncationMessage;private dataTableRows?;requestUpdate(...args:Parameters<LyraElement['requestUpdate']>):void;private renderDataTableRows;private renderDataTable;private hasCustomDataTable;private toggleDataset;private renderLegend;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-box-plot':LyraBoxPlot;}}
157
+ exportData(format:'csv'|'png'):string;private descriptionMemo?;private boxPlotDescription;private buildBoxPlotDescription;private boxDatumsMemo?;private boxDatums;private boxStatistics;private boxAnnouncement;private activateBox;private handlePointClick;private showKeyboardBox;private keyboardBoxShown;private readonly onCanvasBlur;private onCanvasFocus;private onCanvasKeyDown;private validPoint;private accessibleName;private sampleMemo?;private dataTableSample;private generatedDataIsSampled;private dataTruncationMessage;private dataTableRows?;requestUpdate(...args:Parameters<LyraElement['requestUpdate']>):void;private renderDataTableRows;private renderDataTable;private hasCustomDataTable;private toggleDataset;private renderLegend;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-box-plot':LyraBoxPlot;}}
@@ -1,5 +1,5 @@
1
- import{__decorate}from"tslib";import{collectionSupport,snapshotPublicCollection}from"../../../internal/collection-snapshot.js";import{boundChartSeriesValues}from"./chart-series-bounds.js";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{createReducedMotionWatch}from"./chart-surface-shared.js";import{loadChartJs}from"./chart-core-loader.js";import{loadBoxPlotAndRegister}from"./box-plot-loader.js";import{loadBoxPlotAndRegister as loadBoxPlotAndRegister2}from"./box-plot-loader.js";import{onAnnotationPluginRegistered}from"../../../internal/chart-annotation-registration.js";import{styles}from"./box-plot.styles.js";import{chartSurfaceStyles}from"./chart-surface.styles.js";import"../../overlays/skeleton/skeleton.class.js";import{getListFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{formatChartValue}from"./chart-number-format.js";import{isKeyboardFocusEvent}from"../../../internal/focus-modality.js";import{showChartActiveDatum}from"./chart-active-datum.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{FALLBACK_GRID_COLOR,FALLBACK_LEGEND_COLOR,FALLBACK_TICK_COLOR,FALLBACK_TICK_FONT_SIZE,FALLBACK_TOOLTIP_BG,FALLBACK_TOOLTIP_TEXT}from"./chart-colors.js";import{ChartTokenCache}from"./chart-token-cache.js";import{chartDataTableVisible,hasSlottedChartDataTable,hasArraySeriesData}from"./chart-data-table.js";import{createForcedColorPattern,forcedColorEncoding,forcedColorsActive}from"./chart-forced-colors.js";import{specialistTokens}from"../../../internal/specialist-host-tokens.styles.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{legendVisibilityDetail,normalizeHiddenDatasets}from"./chart-legend-visibility.js";import{sampleChartTableIndexes}from"./chart-table-sampling.js";import{canvasSentence,isolateCanvasLabel,isolateScaleTickLabels,tooltipIsolationHook,bidiStyles,isolateHtml}from"./chart-bidi.js";import{escapeCsvField}from"../../utility/export-button/csv.js";import{chartChromeLegendPlacement,normalizeChartChromeLegendPosition}from"./chart-chrome.js";import{CSS_NUMBER_SOURCE}from"../../../internal/css-number.js";import{LYRA_DEFAULT_boxPlot,LYRA_DEFAULT_boxPlotData,LYRA_DEFAULT_boxPlotMax,LYRA_DEFAULT_boxPlotMedian,LYRA_DEFAULT_boxPlotMin,LYRA_DEFAULT_boxPlotMissingLibrary,LYRA_DEFAULT_boxPlotQ1,LYRA_DEFAULT_boxPlotQ3,LYRA_DEFAULT_boxPlotSeriesSummary,LYRA_DEFAULT_boxPlotSummaryEmpty,LYRA_DEFAULT_boxPlotSummaryWithData,LYRA_DEFAULT_chartCategory,LYRA_DEFAULT_chartDataSampled,LYRA_DEFAULT_chartPlotSampled,LYRA_DEFAULT_chartPointLabel,LYRA_DEFAULT_chartRenderUnavailable,LYRA_DEFAULT_chartSeriesLabel,LYRA_DEFAULT_chartSeriesNoData,LYRA_DEFAULT_chartSummarySeparator,LYRA_DEFAULT_chartTrendDecreasing,LYRA_DEFAULT_chartTrendFlat,LYRA_DEFAULT_chartTrendIncreasing,LYRA_DEFAULT_liteChartMarkSummary}from"../../../internal/default-strings/charts.generated.js";import{LYRA_DEFAULT_chartValueLabel,LYRA_DEFAULT_loading}from"../../../internal/default-strings/shared.generated.js";const DIRECT_PIXEL_NUMBER=new RegExp(`^(${CSS_NUMBER_SOURCE})(?:px)?$`,"i");function isBoxPlotSeries(value){return hasArraySeriesData(value)}function normalizeBoxPlotSeries(value){try{return Object.freeze(Array.isArray(value)?value.filter(isBoxPlotSeries):[])}catch{return Object.freeze([])}}function summaryOf(point){return{min:point.min,q1:point.q1,median:point.median,q3:point.q3,max:point.max}}let boxPlotPlugin;function loadBoxPlotPlugin(){return boxPlotPlugin||(boxPlotPlugin=loadBoxPlotAndRegister()),boxPlotPlugin}class LyraBoxPlot extends LyraElement{static{this.defaultStrings={...super.defaultStrings,boxPlot:LYRA_DEFAULT_boxPlot,boxPlotData:LYRA_DEFAULT_boxPlotData,boxPlotMax:LYRA_DEFAULT_boxPlotMax,boxPlotMedian:LYRA_DEFAULT_boxPlotMedian,boxPlotMin:LYRA_DEFAULT_boxPlotMin,boxPlotMissingLibrary:LYRA_DEFAULT_boxPlotMissingLibrary,boxPlotQ1:LYRA_DEFAULT_boxPlotQ1,boxPlotQ3:LYRA_DEFAULT_boxPlotQ3,boxPlotSeriesSummary:LYRA_DEFAULT_boxPlotSeriesSummary,boxPlotSummaryEmpty:LYRA_DEFAULT_boxPlotSummaryEmpty,boxPlotSummaryWithData:LYRA_DEFAULT_boxPlotSummaryWithData,chartCategory:LYRA_DEFAULT_chartCategory,chartDataSampled:LYRA_DEFAULT_chartDataSampled,chartPlotSampled:LYRA_DEFAULT_chartPlotSampled,chartPointLabel:LYRA_DEFAULT_chartPointLabel,chartRenderUnavailable:LYRA_DEFAULT_chartRenderUnavailable,chartSeriesLabel:LYRA_DEFAULT_chartSeriesLabel,chartSeriesNoData:LYRA_DEFAULT_chartSeriesNoData,chartSummarySeparator:LYRA_DEFAULT_chartSummarySeparator,chartTrendDecreasing:LYRA_DEFAULT_chartTrendDecreasing,chartTrendFlat:LYRA_DEFAULT_chartTrendFlat,chartTrendIncreasing:LYRA_DEFAULT_chartTrendIncreasing,chartValueLabel:LYRA_DEFAULT_chartValueLabel,liteChartMarkSummary:LYRA_DEFAULT_liteChartMarkSummary,loading:LYRA_DEFAULT_loading}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["labels","hiddenDatasets"])}static{this.styles=[LyraElement.styles,specialistTokens,chartSurfaceStyles,styles,srOnly,bidiStyles]}static{this.immutableEventDetails=Object.freeze(["lr-legend-visibility-change-request","lr-legend-visibility-change"])}constructor(){super(),this.canvasTokens=new ChartTokenCache(this),this.labels=[],this._datasets=Object.freeze([]),this.datasetsSource=this._datasets,this.withLegend=!1,this.legendPosition="bottom",this.height="280px",this.xLabel="",this.yLabel="",this.withoutZeroBaseline=!1,this.label=null,this.description=null,this.withDataTable=!1,this.dataTableToggle=!1,this.dataTableExpandedOverride=null,this.dataTableId=nextId("box-plot-data-table"),this.loading=!0,this.loadFailed=!1,this.canvasUnavailable=!1,this.visible=!0,this.keyboardDatumIndex=0,this.keyboardDatumAnnouncement="",this.intersectionGeneration=0,this.reducedMotionWatch=createReducedMotionWatch(this,()=>this.drawIfVisible()),this.loadGeneration=0,this.descriptionId=nextId("box-plot-description"),this.announcements=new AnnouncementSinkController(this),this.lastDataTruncationAnnouncement="",this.isMounting=!0,this.tooltipIsolationPlugin={id:"lyra-box-plot-bidi",beforeTooltipDraw:tooltipIsolationHook(()=>this.effectiveDirection)},this.keyboardBoxShown=!1,this.onCanvasBlur=()=>{this.showKeyboardBox(void 0)},new ThemeWatcher(this,()=>{this.chart&&this.canvasTokens.hasThemeChanged()&&this.refreshTheme()})}get datasets(){return this._datasets}set datasets(value){if(Object.is(value,this.datasetsSource)||Object.is(value,this._datasets))return;const previous=this._datasets;this.datasetsSource=value,this._datasets=normalizeBoxPlotSeries(snapshotPublicCollection(boundChartSeriesValues(value,6)??value,this.ownerDocument?.defaultView)),this.requestUpdate("datasets",previous)}get dataTableVisible(){return chartDataTableVisible(this.withDataTable,this.dataTableToggle,this.dataTableExpandedOverride)}toggleDataTable(){this.dataTableExpandedOverride=!this.dataTableVisible}connectedCallback(){super.connectedCallback(),this.stopAnnotationRegistrationWatch?.(),this.stopAnnotationRegistrationWatch=onAnnotationPluginRegistered(()=>this.rebuildAfterAnnotationRegistration()),this.visible=!this.ownerWindow?.IntersectionObserver,this.armReducedMotionWatcher();const generation=++this.loadGeneration;loadBoxPlotPlugin().then(boxMod=>this.onBoxPlotPluginLoaded(boxMod,generation));const IntersectionObserverCtor=this.ownerWindow?.IntersectionObserver;if(IntersectionObserverCtor){const ownerWindow=this.ownerWindow,observerGeneration=++this.intersectionGeneration,observer=new IntersectionObserverCtor(entries=>{if(observerGeneration!==this.intersectionGeneration||this.intersectionObserver!==observer||!this.isConnected||this.ownerWindow!==ownerWindow)return;const wasVisible=this.visible;this.visible=entries[0]?.isIntersecting??!0,this.visible&&!wasVisible&&this.drawIfVisible()});this.intersectionObserver=observer,observer.observe(this)}}async onBoxPlotPluginLoaded(boxMod,generation=this.loadGeneration){if(generation!==this.loadGeneration||!this.isConnected)return;try{await this.updateComplete}catch{return}if(await new Promise(resolve=>this.updateBrowserDerivedState(resolve)),generation!==this.loadGeneration||!this.isConnected)return;if(this.loading=!1,!boxMod){this.loadFailed=!0,this.appliedLegendVisibility=void 0,this.chart?.destroy(),this.chart=void 0,this.chartJsModule=void 0;return}this.loadFailed=!1;const chartMod=await loadChartJs();generation!==this.loadGeneration||!this.isConnected||(this.chartJsModule=chartMod??void 0,this.drawIfVisible())}disconnectedCallback(){super.disconnectedCallback(),this.stopAnnotationRegistrationWatch?.(),this.stopAnnotationRegistrationWatch=void 0,this.lastDataTruncationAnnouncement="",this.isMounting=!0,this.loadGeneration+=1,this.appliedLegendVisibility=void 0,this.chart?.destroy(),this.chart=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.intersectionGeneration+=1,this.visible=!0,this.disarmReducedMotionWatcher()}adoptedCallback(){this.canvasTokens.clear(),super.adoptedCallback(),this.announcements.adopted(),this.disarmReducedMotionWatcher(),this.armReducedMotionWatcher()}armReducedMotionWatcher(){this.reducedMotionWatch.arm()}disarmReducedMotionWatcher(){this.reducedMotionWatch.disarm()}get ownerWindow(){return this.ownerDocument?.defaultView??void 0}effectiveHiddenDatasetIndexes(){return normalizeHiddenDatasets(this.hiddenDatasets,this.datasets.length)??[]}applyDatasetVisibility(){if(!this.chart)return!1;const datasetCount=this.chart.data.datasets?.length??0,sourceSeriesIndexes=this.dataTableSample().seriesIndexes,controlled=normalizeHiddenDatasets(this.hiddenDatasets,this.datasets.length);if(controlled===void 0){for(let index=0;index<datasetCount;index++){const metadata=this.chart.getDatasetMeta?.(index);metadata&&(metadata.hidden=null)}return datasetCount>0}const hidden=new Set(controlled);for(let index=0;index<datasetCount;index++)this.chart.setDatasetVisibility(index,!hidden.has(sourceSeriesIndexes[index]??index));return datasetCount>0}updated(changed){super.updated(changed);const appliedVisibility=this.appliedLegendVisibility;if(this.appliedLegendVisibility=void 0,!this.isConnected)return;const wasMounting=this.isMounting;this.isMounting=!1,changed.has("keyboardDatumAnnouncement")&&changed.get("keyboardDatumAnnouncement")!==void 0&&this.keyboardDatumAnnouncement!==""&&this.announcements.announcePolite(this.keyboardDatumAnnouncement),changed.has("loadFailed")&&changed.get("loadFailed")!==void 0&&this.loadFailed&&this.announcements.announceAssertive(this.localize("boxPlotMissingLibrary"));const dataTruncation=this.dataTruncationMessage();if(wasMounting&&(this.lastDataTruncationAnnouncement=dataTruncation),!this.loading&&!this.loadFailed&&!wasMounting&&dataTruncation!==this.lastDataTruncationAnnouncement&&(this.lastDataTruncationAnnouncement=dataTruncation,dataTruncation&&this.announcements.announcePolite(dataTruncation)),this.setAttribute("aria-busy",String(this.loading)),changed.has("height")){const height=sanitizeCssLength(this.height,"height");height?this.style.setProperty("--_lr-chart-height",height):this.style.removeProperty("--_lr-chart-height")}if(this.loading)return;const visibilityAlreadyApplied=appliedVisibility!==void 0&&appliedVisibility.chart===this.chart&&appliedVisibility.hidden===this.hiddenDatasets,contentChanged=["labels","datasets","hiddenDatasets","withLegend","legendPosition","height","xLabel","yLabel","withoutZeroBaseline","valueFormatter","formatter","locale","strings","loading"].some(name=>changed.has(name)&&(name!=="hiddenDatasets"||!visibilityAlreadyApplied)),direction=this.effectiveDirection,locale=this.effectiveLocale,contextChanged=this.lastDrawnDirection!==void 0&&this.lastDrawnDirection!==direction||this.lastDrawnLocale!==void 0&&this.lastDrawnLocale!==locale;this.lastDrawnDirection=direction,this.lastDrawnLocale=locale,!(!contentChanged&&!contextChanged)&&this.drawIfVisible()}themeColors(){const cs=this.canvasTokens.sync()??this.style;return{grid:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-grid-color").trim()||cs.getPropertyValue("--_lr-chart-grid-color").trim(),FALLBACK_GRID_COLOR),tick:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-tick-color").trim()||cs.getPropertyValue("--_lr-chart-tick-color").trim(),FALLBACK_TICK_COLOR),tickFontSize:this.styleNumber("--lr-chart-tick-font-size",FALLBACK_TICK_FONT_SIZE,"--_lr-chart-tick-font-size"),legend:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-legend-color").trim()||cs.getPropertyValue("--_lr-chart-legend-color").trim(),FALLBACK_LEGEND_COLOR),tooltipBg:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-tooltip-bg").trim()||cs.getPropertyValue("--_lr-chart-tooltip-bg").trim(),FALLBACK_TOOLTIP_BG),tooltipText:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-tooltip-color").trim()||cs.getPropertyValue("--_lr-chart-tooltip-color").trim(),FALLBACK_TOOLTIP_TEXT)}}seriesColor(index,palette=this.canvasTokens.palette()){const fallback=palette[index%palette.length]??"transparent",series=this.datasets[index];return series?.color?this.canvasTokens.resolve(series.color,fallback):fallback}seriesBorderColor(index,palette=this.canvasTokens.palette()){const base=this.seriesColor(index,palette);return this.styleColor(`--lr-box-plot-border-color-${index%8+1}`,base)}seriesFillColor(index,palette=this.canvasTokens.palette()){const base=this.seriesColor(index,palette);return this.styleColor(`--lr-box-plot-fill-color-${index%8+1}`,base)}forcedColorFill(index,background){return!this.ownerWindow||!forcedColorsActive(this.ownerWindow)?background:createForcedColorPattern(this.ownerDocument,index,background,this.styleColor("--lr-color-surface",FALLBACK_TOOLTIP_BG))}styleColor(name,fallback){const view=this.ownerWindow,value=(view?view.getComputedStyle(this):this.style).getPropertyValue(name).trim();return value?this.canvasTokens.resolve(value,fallback):fallback}styleNumber(name,fallback,fallbackToken){const view=this.ownerWindow,cs=view?view.getComputedStyle(this):this.style,value=cs.getPropertyValue(name).trim()||(fallbackToken?cs.getPropertyValue(fallbackToken).trim():""),direct=DIRECT_PIXEL_NUMBER.exec(value);if(direct){const resolved2=Number.parseFloat(direct[1]);if(Number.isFinite(resolved2)&&resolved2>=0)return resolved2}if(!value||!view)return fallback;const resolved=this.canvasTokens.length(value,()=>{const probe=this.ownerDocument.createElement("span");probe.hidden=!0,probe.setAttribute("aria-hidden","true"),probe.style.inlineSize=value,(this.shadowRoot??this).append(probe);try{return Number.parseFloat(view.getComputedStyle(probe).inlineSize)}finally{probe.remove()}});return Number.isFinite(resolved)&&resolved>=0?resolved:fallback}buildConfig(){const theme=this.themeColors(),palette=this.canvasTokens.palette(),sample=this.dataTableSample(),direction=this.effectiveDirection==="rtl"?"rtl":"ltr",afterTickToLabelConversion=scale=>isolateScaleTickLabels(scale,direction);return{type:"boxplot",data:{labels:sample.rowIndexes.map(index=>this.labels[index]??""),datasets:sample.seriesIndexes.map(sourceIndex=>{const s=this.datasets[sourceIndex],fillColor=this.seriesFillColor(sourceIndex,palette),borderColor=this.seriesBorderColor(sourceIndex,palette);return{label:s.label,data:sample.rowIndexes.map(index=>{const point=s.data[index];return this.validPoint(point)?summaryOf(point):null}),backgroundColor:this.forcedColorFill(sourceIndex,fillColor),borderColor}})},options:{locale:this.effectiveLocale,responsive:!0,maintainAspectRatio:!1,animation:prefersReducedMotion(this)?!1:void 0,onClick:(event,_elements,chart)=>this.handlePointClick(event,chart),elements:{boxandwhiskers:{borderWidth:this.styleNumber("--lr-box-plot-border-width",1,"--lr-border-width-thin"),itemRadius:this.styleNumber("--lr-box-plot-item-radius",0)}},plugins:{legend:{display:!1,labels:{color:theme.legend}},tooltip:{backgroundColor:theme.tooltipBg,titleColor:theme.tooltipText,bodyColor:theme.tooltipText,...this.formatter||this.valueFormatter?{callbacks:{label:context=>{const raw=context.raw,point=this.validPoint(raw)?raw:void 0;if(!point)return;const datasetIndex=Number.isInteger(context.datasetIndex)?sample.seriesIndexes[context.datasetIndex]:void 0,index=Number.isInteger(context.dataIndex)?sample.rowIndexes[context.dataIndex]:void 0,lines=this.boxStatistics(point).map(([statistic,name,value])=>canvasSentence(sentenceValue=>this.localize("chartValueLabel",void 0,{label:name,value:sentenceValue}),this.formatValue(value,"tooltip",{...datasetIndex===void 0?{}:{datasetIndex},...index===void 0?{}:{index,label:this.labels[index]||void 0},...datasetIndex===void 0?{}:{seriesLabel:this.datasets[datasetIndex]?.label},statistic,axis:"y"}))),label=String(context.dataset?.label??"");return label?[label,...lines]:lines}}}:{}}},scales:{x:{afterTickToLabelConversion,title:{display:!!this.xLabel,text:isolateCanvasLabel(this.xLabel,direction),color:theme.tick},ticks:{color:theme.tick,font:{size:theme.tickFontSize}},grid:{color:theme.grid}},y:{afterTickToLabelConversion,position:this.effectiveDirection==="rtl"?"right":"left",beginAtZero:!this.withoutZeroBaseline,title:{display:!!this.yLabel,text:isolateCanvasLabel(this.yLabel,direction),color:theme.tick},ticks:{color:theme.tick,font:{size:theme.tickFontSize},...this.formatter||this.valueFormatter?{callback:value=>this.formatValue(Number(value),"tick",{axis:"y"})}:{}},grid:{color:theme.grid}}}}}}draw(){if(!this.chartJsModule||!this.canvasEl)return;if(!this.chart&&!this.canvasEl.getContext("2d")){this.setCanvasUnavailable(!0);return}this.canvasTokens.beginThemeDraw();const config=this.buildConfig();if(this.chart){this.chart.data=config.data,this.chart.options=config.options??{},this.applyDatasetVisibility(),this.chart.update("none"),this.canvasTokens.rememberTheme();return}const candidate=new this.chartJsModule.Chart(this.canvasEl,{...config,plugins:[this.tooltipIsolationPlugin]}),context=candidate;if(context.canvas===null||context.ctx===null){candidate.destroy(),this.setCanvasUnavailable(!0);return}this.chart=candidate,this.setCanvasUnavailable(!1),this.hiddenDatasets!==void 0&&(this.applyDatasetVisibility(),this.chart.update("none")),this.canvasTokens.rememberTheme()}setCanvasUnavailable(unavailable){this.canvasUnavailable!==unavailable&&(this.canvasUnavailable=unavailable,queueMicrotask(()=>{this.isConnected&&this.requestUpdate()}),unavailable&&this.announcements.announceAssertive(this.localize("chartRenderUnavailable")))}drawIfVisible(){!this.isConnected||!this.visible||this.draw()}rebuildAfterAnnotationRegistration(){this.chart&&(this.appliedLegendVisibility=void 0,this.chart.destroy(),this.chart=void 0,this.drawIfVisible())}refreshTheme(){this.canvasTokens.clear(),this.drawIfVisible(),this.withLegend&&this.requestUpdate()}seriesDisplayLabel(series){return series.label||this.localize("chartSeriesLabel")}formatValue(value,surface,metadata={}){const legacyContext=surface==="export"||surface==="spoken"?"table":surface==="visual"?void 0:surface;return this.formatter?.({value,surface,...metadata})??(legacyContext?this.valueFormatter?.(value,legacyContext):void 0)??(surface==="export"?value:formatChartValue(value,this.effectiveLocale))}exportData(format){if(format==="png")return this.chart?.toBase64Image?.()??"";const header=["category","series","min","q1","median","q3","max"].map(escapeCsvField).join(","),rows=[];return this.datasets.forEach((series,datasetIndex)=>{series.data.forEach((point,index)=>{if(!this.validPoint(point))return;const metadata={datasetIndex,index,label:this.labels[index]||void 0,seriesLabel:series.label,axis:"y"};rows.push([this.labels[index]??"",this.seriesDisplayLabel(series),this.formatValue(point.min,"export",{...metadata,statistic:"min"}),this.formatValue(point.q1,"export",{...metadata,statistic:"q1"}),this.formatValue(point.median,"export",{...metadata,statistic:"median"}),this.formatValue(point.q3,"export",{...metadata,statistic:"q3"}),this.formatValue(point.max,"export",{...metadata,statistic:"max"})].map(escapeCsvField).join(","))})}),[header,...rows].join(`\r
2
- `)}boxPlotDescription(){if(this.description)return this.description;const summaries=this.dataTableSample().seriesIndexes.map(index=>{const series=this.datasets[index];let count=0,first=0,last=0,min=0,minIndex=0,max=0,maxIndex=0;for(const[pointIndex,point]of series.data.entries())this.validPoint(point)&&(count===0&&(first=point.median,min=point.median,minIndex=pointIndex,max=point.median,maxIndex=pointIndex),last=point.median,point.median<min&&(min=point.median,minIndex=pointIndex),point.median>max&&(max=point.median,maxIndex=pointIndex),count++);if(count===0)return this.localize("chartSeriesNoData",void 0,{label:this.seriesDisplayLabel(series)});const trend=last>first?this.localize("chartTrendIncreasing"):last<first?this.localize("chartTrendDecreasing"):this.localize("chartTrendFlat");return this.localize("boxPlotSeriesSummary",void 0,{label:this.seriesDisplayLabel(series),count:getNumberFormat(this.effectiveLocale).format(count),min:this.formatValue(min,"spoken",{datasetIndex:index,index:minIndex,label:this.labels[minIndex]||void 0,seriesLabel:series.label,statistic:"median",axis:"y"}),max:this.formatValue(max,"spoken",{datasetIndex:index,index:maxIndex,label:this.labels[maxIndex]||void 0,seriesLabel:series.label,statistic:"median",axis:"y"}),trend})});return summaries.length?this.localize("boxPlotSummaryWithData",void 0,{summaries:summaries.join(this.localize("chartSummarySeparator"))}):this.localize("boxPlotSummaryEmpty")}boxDatums(){const sample=this.dataTableSample(),datums=[];for(const datasetIndex of sample.seriesIndexes){const series=this.datasets[datasetIndex];if(series)for(const index of sample.rowIndexes){const point=series.data[index];this.validPoint(point)&&datums.push({datasetIndex,index,label:this.labels[index]||void 0,value:summaryOf(point)})}}return datums}boxStatistics(point){return[["min",this.localize("boxPlotMin"),point.min],["q1",this.localize("boxPlotQ1"),point.q1],["median",this.localize("boxPlotMedian"),point.median],["q3",this.localize("boxPlotQ3"),point.q3],["max",this.localize("boxPlotMax"),point.max]]}boxAnnouncement(datum,position,total){const numberFormat=getNumberFormat(this.effectiveLocale),point=datum.value,summary=(point?this.boxStatistics(point):[]).filter(([,,value])=>Number.isFinite(value)).map(([statistic,label,value])=>this.localize("chartValueLabel",void 0,{label,value:this.formatValue(value,"spoken",{datasetIndex:datum.datasetIndex,index:datum.index,label:datum.label,seriesLabel:this.datasets[datum.datasetIndex]?.label,statistic,axis:"y"})})).join(this.localize("chartSummarySeparator"));return this.localize("liteChartMarkSummary",void 0,{series:this.datasets[datum.datasetIndex]?.label||this.localize("chartSeriesLabel"),label:datum.label??this.localize("chartPointLabel",void 0,{n:numberFormat.format(datum.index+1)}),value:summary,index:numberFormat.format(position+1),total:numberFormat.format(total)})}activateBox(datum){const datums=this.boxDatums(),position=datums.findIndex(candidate=>candidate.datasetIndex===datum.datasetIndex&&candidate.index===datum.index);position>=0&&(this.keyboardDatumIndex=position,this.keyboardDatumAnnouncement=this.boxAnnouncement(datum,position,datums.length)),this.emit("lr-datum-activate",{...datum,kind:"box"}),this.emit("lr-point-activate",{...datum})}handlePointClick(event,chart){const hit=chart.getElementsAtEventForMode?.(event,"nearest",{intersect:!0},!0)?.[0];if(!hit)return;const sample=this.dataTableSample(),datasetIndex=sample.seriesIndexes[hit.datasetIndex],index=sample.rowIndexes[hit.index];if(datasetIndex===void 0||index===void 0)return;const point=this.datasets[datasetIndex]?.data[index];this.activateBox({datasetIndex,index,label:this.labels[index]||void 0,value:this.validPoint(point)?summaryOf(point):null})}showKeyboardBox(datum){if(!this.chart||!datum&&!this.keyboardBoxShown)return;const sample=this.dataTableSample();this.keyboardBoxShown=showChartActiveDatum(this.chart,datum&&{datasetIndex:sample.seriesIndexes.indexOf(datum.datasetIndex),index:sample.rowIndexes.indexOf(datum.index)})}onCanvasFocus(event){const datums=this.boxDatums();datums.length&&(this.keyboardDatumIndex=Math.min(this.keyboardDatumIndex,datums.length-1),isKeyboardFocusEvent(event)&&this.showKeyboardBox(datums[this.keyboardDatumIndex]),this.keyboardDatumAnnouncement=this.boxAnnouncement(datums[this.keyboardDatumIndex],this.keyboardDatumIndex,datums.length))}onCanvasKeyDown(event){const datums=this.boxDatums();if(!datums.length)return;if(this.keyboardDatumIndex=Math.min(this.keyboardDatumIndex,datums.length-1),event.key==="Enter"||event.key===" "){event.preventDefault(),this.activateBox(datums[this.keyboardDatumIndex]);return}const rtl=this.effectiveDirection==="rtl",forward=rtl?"ArrowLeft":"ArrowRight",backward=rtl?"ArrowRight":"ArrowLeft";let next=this.keyboardDatumIndex;if(event.key===forward||event.key==="ArrowDown")next=Math.min(datums.length-1,next+1);else if(event.key===backward||event.key==="ArrowUp")next=Math.max(0,next-1);else if(event.key==="Home")next=0;else if(event.key==="End")next=datums.length-1;else return;event.preventDefault(),this.keyboardDatumIndex=next,this.showKeyboardBox(datums[next]),this.keyboardDatumAnnouncement=this.boxAnnouncement(datums[next],next,datums.length)}validPoint(point){return!!point&&[point.min,point.q1,point.median,point.q3,point.max].every(Number.isFinite)&&point.min<=point.q1&&point.q1<=point.median&&point.median<=point.q3&&point.q3<=point.max}accessibleName(fallback){return this.getAttribute("aria-label")??this.label??fallback}dataTableSample(){let rowCount=this.labels.length;for(const series of this.datasets)rowCount=Math.max(rowCount,series.data.length);const indexes=sampleChartTableIndexes(rowCount,this.datasets.length);return{rowCount,seriesCount:this.datasets.length,...indexes}}generatedDataIsSampled(){const sample=this.dataTableSample();return sample.rowCount===0||sample.seriesCount===0?!1:sample.rowIndexes.length<sample.rowCount||sample.seriesIndexes.length<sample.seriesCount}dataTruncationMessage(){return this.generatedDataIsSampled()?this.hasCustomDataTable()?this.localize("chartPlotSampled"):this.localize("chartDataSampled"):""}requestUpdate(...args){args[0]!=="keyboardDatumAnnouncement"&&(this.dataTableRows=void 0),super.requestUpdate(...args)}renderDataTableRows(){if(this.dataTableRows)return this.dataTableRows;const numberFormat=getNumberFormat(this.effectiveLocale),direction=this.effectiveDirection==="rtl"?"rtl":"ltr",sample=this.dataTableSample();return this.dataTableRows=sample.seriesIndexes.flatMap(seriesIndex=>{const series=this.datasets[seriesIndex];return sample.rowIndexes.map(index=>{const point=series.data[index],metadata={datasetIndex:seriesIndex,index,label:this.labels[index]||void 0,seriesLabel:series.label,axis:"y"};return this.validPoint(point)?html`
1
+ import{__decorate}from"tslib";import{positionIndex}from"../../../internal/keyed-index.js";import{collectionSupport,snapshotPublicCollection}from"../../../internal/collection-snapshot.js";import{boundChartSeriesValues}from"./chart-series-bounds.js";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{createReducedMotionWatch}from"./chart-surface-shared.js";import{loadChartJs}from"./chart-core-loader.js";import{loadBoxPlotAndRegister}from"./box-plot-loader.js";import{loadBoxPlotAndRegister as loadBoxPlotAndRegister2}from"./box-plot-loader.js";import{onAnnotationPluginRegistered}from"../../../internal/chart-annotation-registration.js";import{styles}from"./box-plot.styles.js";import{chartSurfaceStyles}from"./chart-surface.styles.js";import"../../overlays/skeleton/skeleton.class.js";import{getListFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{formatChartValue}from"./chart-number-format.js";import{isKeyboardFocusEvent}from"../../../internal/focus-modality.js";import{showChartActiveDatum}from"./chart-active-datum.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{FALLBACK_GRID_COLOR,FALLBACK_LEGEND_COLOR,FALLBACK_TICK_COLOR,FALLBACK_TICK_FONT_SIZE,FALLBACK_TOOLTIP_BG,FALLBACK_TOOLTIP_TEXT}from"./chart-colors.js";import{ChartTokenCache}from"./chart-token-cache.js";import{chartDataTableVisible,hasSlottedChartDataTable,hasArraySeriesData}from"./chart-data-table.js";import{createForcedColorPattern,forcedColorEncoding,forcedColorsActive}from"./chart-forced-colors.js";import{specialistTokens}from"../../../internal/specialist-host-tokens.styles.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{legendVisibilityDetail,normalizeHiddenDatasets}from"./chart-legend-visibility.js";import{sampleChartTableIndexes}from"./chart-table-sampling.js";import{canvasSentence,isolateCanvasLabel,isolateScaleTickLabels,tooltipIsolationHook,bidiStyles,isolateHtml}from"./chart-bidi.js";import{escapeCsvField}from"../../utility/export-button/csv.js";import{chartChromeLegendPlacement,normalizeChartChromeLegendPosition}from"./chart-chrome.js";import{CSS_NUMBER_SOURCE}from"../../../internal/css-number.js";import{LYRA_DEFAULT_boxPlot,LYRA_DEFAULT_boxPlotData,LYRA_DEFAULT_boxPlotMax,LYRA_DEFAULT_boxPlotMedian,LYRA_DEFAULT_boxPlotMin,LYRA_DEFAULT_boxPlotMissingLibrary,LYRA_DEFAULT_boxPlotQ1,LYRA_DEFAULT_boxPlotQ3,LYRA_DEFAULT_boxPlotSeriesSummary,LYRA_DEFAULT_boxPlotSummaryEmpty,LYRA_DEFAULT_boxPlotSummaryWithData,LYRA_DEFAULT_chartCategory,LYRA_DEFAULT_chartDataSampled,LYRA_DEFAULT_chartPlotSampled,LYRA_DEFAULT_chartPointLabel,LYRA_DEFAULT_chartRenderUnavailable,LYRA_DEFAULT_chartSeriesLabel,LYRA_DEFAULT_chartSeriesNoData,LYRA_DEFAULT_liteChartMarkSummary}from"../../../internal/default-strings/charts.generated.js";import{LYRA_DEFAULT_chartSummarySeparator,LYRA_DEFAULT_chartTrendDecreasing,LYRA_DEFAULT_chartTrendFlat,LYRA_DEFAULT_chartTrendIncreasing,LYRA_DEFAULT_chartValueLabel,LYRA_DEFAULT_loading}from"../../../internal/default-strings/shared.generated.js";const DIRECT_PIXEL_NUMBER=new RegExp(`^(${CSS_NUMBER_SOURCE})(?:px)?$`,"i");function isBoxPlotSeries(value){return hasArraySeriesData(value)}function normalizeBoxPlotSeries(value){try{return Object.freeze(Array.isArray(value)?value.filter(isBoxPlotSeries):[])}catch{return Object.freeze([])}}function summaryOf(point){return{min:point.min,q1:point.q1,median:point.median,q3:point.q3,max:point.max}}let boxPlotPlugin;function loadBoxPlotPlugin(){return boxPlotPlugin||(boxPlotPlugin=loadBoxPlotAndRegister()),boxPlotPlugin}class LyraBoxPlot extends LyraElement{static{this.defaultStrings={...super.defaultStrings,boxPlot:LYRA_DEFAULT_boxPlot,boxPlotData:LYRA_DEFAULT_boxPlotData,boxPlotMax:LYRA_DEFAULT_boxPlotMax,boxPlotMedian:LYRA_DEFAULT_boxPlotMedian,boxPlotMin:LYRA_DEFAULT_boxPlotMin,boxPlotMissingLibrary:LYRA_DEFAULT_boxPlotMissingLibrary,boxPlotQ1:LYRA_DEFAULT_boxPlotQ1,boxPlotQ3:LYRA_DEFAULT_boxPlotQ3,boxPlotSeriesSummary:LYRA_DEFAULT_boxPlotSeriesSummary,boxPlotSummaryEmpty:LYRA_DEFAULT_boxPlotSummaryEmpty,boxPlotSummaryWithData:LYRA_DEFAULT_boxPlotSummaryWithData,chartCategory:LYRA_DEFAULT_chartCategory,chartDataSampled:LYRA_DEFAULT_chartDataSampled,chartPlotSampled:LYRA_DEFAULT_chartPlotSampled,chartPointLabel:LYRA_DEFAULT_chartPointLabel,chartRenderUnavailable:LYRA_DEFAULT_chartRenderUnavailable,chartSeriesLabel:LYRA_DEFAULT_chartSeriesLabel,chartSeriesNoData:LYRA_DEFAULT_chartSeriesNoData,chartSummarySeparator:LYRA_DEFAULT_chartSummarySeparator,chartTrendDecreasing:LYRA_DEFAULT_chartTrendDecreasing,chartTrendFlat:LYRA_DEFAULT_chartTrendFlat,chartTrendIncreasing:LYRA_DEFAULT_chartTrendIncreasing,chartValueLabel:LYRA_DEFAULT_chartValueLabel,liteChartMarkSummary:LYRA_DEFAULT_liteChartMarkSummary,loading:LYRA_DEFAULT_loading}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["labels","hiddenDatasets"])}static{this.styles=[LyraElement.styles,specialistTokens,chartSurfaceStyles,styles,srOnly,bidiStyles]}static{this.immutableEventDetails=Object.freeze(["lr-legend-visibility-change-request","lr-legend-visibility-change"])}constructor(){super(),this.canvasTokens=new ChartTokenCache(this),this.labels=[],this._datasets=Object.freeze([]),this.datasetsSource=this._datasets,this.withLegend=!1,this.legendPosition="bottom",this.height="280px",this.xLabel="",this.yLabel="",this.withoutZeroBaseline=!1,this.label=null,this.description=null,this.withDataTable=!1,this.dataTableToggle=!1,this.dataTableExpandedOverride=null,this.dataTableId=nextId("box-plot-data-table"),this.loading=!0,this.loadFailed=!1,this.canvasUnavailable=!1,this.visible=!0,this.keyboardDatumIndex=0,this.keyboardDatumAnnouncement="",this.intersectionGeneration=0,this.reducedMotionWatch=createReducedMotionWatch(this,()=>this.drawIfVisible()),this.loadGeneration=0,this.descriptionId=nextId("box-plot-description"),this.announcements=new AnnouncementSinkController(this),this.lastDataTruncationAnnouncement="",this.isMounting=!0,this.forcedColorPatterns=new Map,this.tooltipIsolationPlugin={id:"lyra-box-plot-bidi",beforeTooltipDraw:tooltipIsolationHook(()=>this.effectiveDirection)},this.keyboardBoxShown=!1,this.onCanvasBlur=()=>{this.showKeyboardBox(void 0)},new ThemeWatcher(this,()=>{this.chart&&this.canvasTokens.hasThemeChanged()&&this.refreshTheme()})}get datasets(){return this._datasets}set datasets(value){if(Object.is(value,this.datasetsSource)||Object.is(value,this._datasets))return;const previous=this._datasets;this.datasetsSource=value,this._datasets=normalizeBoxPlotSeries(snapshotPublicCollection(boundChartSeriesValues(value,6)??value,this.ownerDocument?.defaultView)),this.requestUpdate("datasets",previous)}get dataTableVisible(){return chartDataTableVisible(this.withDataTable,this.dataTableToggle,this.dataTableExpandedOverride)}toggleDataTable(){this.dataTableExpandedOverride=!this.dataTableVisible}connectedCallback(){super.connectedCallback(),this.stopAnnotationRegistrationWatch?.(),this.stopAnnotationRegistrationWatch=onAnnotationPluginRegistered(()=>this.rebuildAfterAnnotationRegistration()),this.visible=!this.ownerWindow?.IntersectionObserver,this.armReducedMotionWatcher();const generation=++this.loadGeneration;loadBoxPlotPlugin().then(boxMod=>this.onBoxPlotPluginLoaded(boxMod,generation));const IntersectionObserverCtor=this.ownerWindow?.IntersectionObserver;if(IntersectionObserverCtor){const ownerWindow=this.ownerWindow,observerGeneration=++this.intersectionGeneration,observer=new IntersectionObserverCtor(entries=>{if(observerGeneration!==this.intersectionGeneration||this.intersectionObserver!==observer||!this.isConnected||this.ownerWindow!==ownerWindow)return;const wasVisible=this.visible;this.visible=entries[0]?.isIntersecting??!0,this.visible&&!wasVisible&&this.drawIfVisible()});this.intersectionObserver=observer,observer.observe(this)}}async onBoxPlotPluginLoaded(boxMod,generation=this.loadGeneration){if(generation!==this.loadGeneration||!this.isConnected)return;try{await this.updateComplete}catch{return}if(await new Promise(resolve=>this.updateBrowserDerivedState(resolve)),generation!==this.loadGeneration||!this.isConnected)return;if(this.loading=!1,!boxMod){this.loadFailed=!0,this.appliedLegendVisibility=void 0,this.chart?.destroy(),this.chart=void 0,this.chartJsModule=void 0;return}this.loadFailed=!1;const chartMod=await loadChartJs();generation!==this.loadGeneration||!this.isConnected||(this.chartJsModule=chartMod??void 0,this.drawIfVisible())}disconnectedCallback(){super.disconnectedCallback(),this.stopAnnotationRegistrationWatch?.(),this.stopAnnotationRegistrationWatch=void 0,this.lastDataTruncationAnnouncement="",this.isMounting=!0,this.loadGeneration+=1,this.appliedLegendVisibility=void 0,this.chart?.destroy(),this.chart=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.intersectionGeneration+=1,this.visible=!0,this.disarmReducedMotionWatcher()}adoptedCallback(){this.canvasTokens.clear(),super.adoptedCallback(),this.announcements.adopted(),this.disarmReducedMotionWatcher(),this.armReducedMotionWatcher()}armReducedMotionWatcher(){this.reducedMotionWatch.arm()}disarmReducedMotionWatcher(){this.reducedMotionWatch.disarm()}get ownerWindow(){return this.ownerDocument?.defaultView??void 0}effectiveHiddenDatasetIndexes(){return normalizeHiddenDatasets(this.hiddenDatasets,this.datasets.length)??[]}applyDatasetVisibility(){if(!this.chart)return!1;const datasetCount=this.chart.data.datasets?.length??0,sourceSeriesIndexes=this.dataTableSample().seriesIndexes,controlled=normalizeHiddenDatasets(this.hiddenDatasets,this.datasets.length);if(controlled===void 0){for(let index=0;index<datasetCount;index++){const metadata=this.chart.getDatasetMeta?.(index);metadata&&(metadata.hidden=null)}return datasetCount>0}const hidden=new Set(controlled);for(let index=0;index<datasetCount;index++)this.chart.setDatasetVisibility(index,!hidden.has(sourceSeriesIndexes[index]??index));return datasetCount>0}updated(changed){super.updated(changed);const appliedVisibility=this.appliedLegendVisibility;if(this.appliedLegendVisibility=void 0,!this.isConnected)return;const wasMounting=this.isMounting;this.isMounting=!1,changed.has("keyboardDatumAnnouncement")&&changed.get("keyboardDatumAnnouncement")!==void 0&&this.keyboardDatumAnnouncement!==""&&this.announcements.announcePolite(this.keyboardDatumAnnouncement),changed.has("loadFailed")&&changed.get("loadFailed")!==void 0&&this.loadFailed&&this.announcements.announceAssertive(this.localize("boxPlotMissingLibrary"));const dataTruncation=this.dataTruncationMessage();if(wasMounting&&(this.lastDataTruncationAnnouncement=dataTruncation),!this.loading&&!this.loadFailed&&!wasMounting&&dataTruncation!==this.lastDataTruncationAnnouncement&&(this.lastDataTruncationAnnouncement=dataTruncation,dataTruncation&&this.announcements.announcePolite(dataTruncation)),this.setAttribute("aria-busy",String(this.loading)),changed.has("height")){const height=sanitizeCssLength(this.height,"height");height?this.style.setProperty("--_lr-chart-height",height):this.style.removeProperty("--_lr-chart-height")}if(this.loading)return;const visibilityAlreadyApplied=appliedVisibility!==void 0&&appliedVisibility.chart===this.chart&&appliedVisibility.hidden===this.hiddenDatasets,contentChanged=["labels","datasets","hiddenDatasets","withLegend","legendPosition","height","xLabel","yLabel","withoutZeroBaseline","valueFormatter","formatter","locale","strings","loading"].some(name=>changed.has(name)&&(name!=="hiddenDatasets"||!visibilityAlreadyApplied)),direction=this.effectiveDirection,locale=this.effectiveLocale,contextChanged=this.lastDrawnDirection!==void 0&&this.lastDrawnDirection!==direction||this.lastDrawnLocale!==void 0&&this.lastDrawnLocale!==locale;this.lastDrawnDirection=direction,this.lastDrawnLocale=locale,!(!contentChanged&&!contextChanged)&&this.drawIfVisible()}themeColors(){const cs=this.canvasTokens.sync()??this.style;return{grid:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-grid-color").trim()||cs.getPropertyValue("--_lr-chart-grid-color").trim(),FALLBACK_GRID_COLOR),tick:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-tick-color").trim()||cs.getPropertyValue("--_lr-chart-tick-color").trim(),FALLBACK_TICK_COLOR),tickFontSize:this.styleNumber("--lr-chart-tick-font-size",FALLBACK_TICK_FONT_SIZE,"--_lr-chart-tick-font-size"),legend:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-legend-color").trim()||cs.getPropertyValue("--_lr-chart-legend-color").trim(),FALLBACK_LEGEND_COLOR),tooltipBg:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-tooltip-bg").trim()||cs.getPropertyValue("--_lr-chart-tooltip-bg").trim(),FALLBACK_TOOLTIP_BG),tooltipText:this.canvasTokens.resolve(cs.getPropertyValue("--lr-chart-tooltip-color").trim()||cs.getPropertyValue("--_lr-chart-tooltip-color").trim(),FALLBACK_TOOLTIP_TEXT)}}seriesColor(index,palette=this.canvasTokens.palette()){const fallback=palette[index%palette.length]??"transparent",series=this.datasets[index];return series?.color?this.canvasTokens.resolve(series.color,fallback):fallback}seriesBorderColor(index,palette=this.canvasTokens.palette()){const base=this.seriesColor(index,palette);return this.styleColor(`--lr-box-plot-border-color-${index%8+1}`,base)}seriesFillColor(index,palette=this.canvasTokens.palette()){const base=this.seriesColor(index,palette);return this.styleColor(`--lr-box-plot-fill-color-${index%8+1}`,base)}forcedColorFill(index,background){if(!this.ownerWindow||!forcedColorsActive(this.ownerWindow))return background;const surface=this.forcedColorSurface??=this.styleColor("--lr-color-surface",FALLBACK_TOOLTIP_BG),key=`${index%8}/${background}/${surface}`,cached=this.forcedColorPatterns.get(key);if(cached!==void 0)return cached;const value=createForcedColorPattern(this.ownerDocument,index,background,surface);return this.forcedColorPatterns.set(key,value),value}styleColor(name,fallback){const view=this.ownerWindow,value=(view?view.getComputedStyle(this):this.style).getPropertyValue(name).trim();return value?this.canvasTokens.resolve(value,fallback):fallback}styleNumber(name,fallback,fallbackToken){const view=this.ownerWindow,cs=view?view.getComputedStyle(this):this.style,value=cs.getPropertyValue(name).trim()||(fallbackToken?cs.getPropertyValue(fallbackToken).trim():""),direct=DIRECT_PIXEL_NUMBER.exec(value);if(direct){const resolved2=Number.parseFloat(direct[1]);if(Number.isFinite(resolved2)&&resolved2>=0)return resolved2}if(!value||!view)return fallback;const resolved=this.canvasTokens.length(value,()=>{const probe=this.ownerDocument.createElement("span");probe.hidden=!0,probe.setAttribute("aria-hidden","true"),probe.style.inlineSize=value,(this.shadowRoot??this).append(probe);try{return Number.parseFloat(view.getComputedStyle(probe).inlineSize)}finally{probe.remove()}});return Number.isFinite(resolved)&&resolved>=0?resolved:fallback}buildConfig(){this.forcedColorPatterns.clear(),this.forcedColorSurface=void 0;const theme=this.themeColors(),palette=this.canvasTokens.palette(),sample=this.dataTableSample(),direction=this.effectiveDirection==="rtl"?"rtl":"ltr",afterTickToLabelConversion=scale=>isolateScaleTickLabels(scale,direction);return{type:"boxplot",data:{labels:sample.rowIndexes.map(index=>this.labels[index]??""),datasets:sample.seriesIndexes.map(sourceIndex=>{const s=this.datasets[sourceIndex],fillColor=this.seriesFillColor(sourceIndex,palette),borderColor=this.seriesBorderColor(sourceIndex,palette);return{label:s.label,data:sample.rowIndexes.map(index=>{const point=s.data[index];return this.validPoint(point)?summaryOf(point):null}),backgroundColor:this.forcedColorFill(sourceIndex,fillColor),borderColor}})},options:{locale:this.effectiveLocale,responsive:!0,maintainAspectRatio:!1,animation:prefersReducedMotion(this)?!1:void 0,onClick:(event,_elements,chart)=>this.handlePointClick(event,chart),elements:{boxandwhiskers:{borderWidth:this.styleNumber("--lr-box-plot-border-width",1,"--lr-border-width-thin"),itemRadius:this.styleNumber("--lr-box-plot-item-radius",0)}},plugins:{legend:{display:!1,labels:{color:theme.legend}},tooltip:{backgroundColor:theme.tooltipBg,titleColor:theme.tooltipText,bodyColor:theme.tooltipText,...this.formatter||this.valueFormatter?{callbacks:{label:context=>{const raw=context.raw,point=this.validPoint(raw)?raw:void 0;if(!point)return;const datasetIndex=Number.isInteger(context.datasetIndex)?sample.seriesIndexes[context.datasetIndex]:void 0,index=Number.isInteger(context.dataIndex)?sample.rowIndexes[context.dataIndex]:void 0,lines=this.boxStatistics(point).map(([statistic,name,value])=>canvasSentence(sentenceValue=>this.localize("chartValueLabel",void 0,{label:name,value:sentenceValue}),this.formatValue(value,"tooltip",{...datasetIndex===void 0?{}:{datasetIndex},...index===void 0?{}:{index,label:this.labels[index]||void 0},...datasetIndex===void 0?{}:{seriesLabel:this.datasets[datasetIndex]?.label},statistic,axis:"y"}))),label=String(context.dataset?.label??"");return label?[label,...lines]:lines}}}:{}}},scales:{x:{afterTickToLabelConversion,title:{display:!!this.xLabel,text:isolateCanvasLabel(this.xLabel,direction),color:theme.tick},ticks:{color:theme.tick,font:{size:theme.tickFontSize}},grid:{color:theme.grid}},y:{afterTickToLabelConversion,position:this.effectiveDirection==="rtl"?"right":"left",beginAtZero:!this.withoutZeroBaseline,title:{display:!!this.yLabel,text:isolateCanvasLabel(this.yLabel,direction),color:theme.tick},ticks:{color:theme.tick,font:{size:theme.tickFontSize},...this.formatter||this.valueFormatter?{callback:value=>this.formatValue(Number(value),"tick",{axis:"y"})}:{}},grid:{color:theme.grid}}}}}}draw(){if(!this.chartJsModule||!this.canvasEl)return;if(!this.chart&&!this.canvasEl.getContext("2d")){this.setCanvasUnavailable(!0);return}this.canvasTokens.beginThemeDraw();const config=this.buildConfig();if(this.chart){this.chart.data=config.data,this.chart.options=config.options??{},this.applyDatasetVisibility(),this.chart.update("none"),this.canvasTokens.rememberTheme();return}const candidate=new this.chartJsModule.Chart(this.canvasEl,{...config,plugins:[this.tooltipIsolationPlugin]}),context=candidate;if(context.canvas===null||context.ctx===null){candidate.destroy(),this.setCanvasUnavailable(!0);return}this.chart=candidate,this.setCanvasUnavailable(!1),this.hiddenDatasets!==void 0&&(this.applyDatasetVisibility(),this.chart.update("none")),this.canvasTokens.rememberTheme()}setCanvasUnavailable(unavailable){this.canvasUnavailable!==unavailable&&(this.canvasUnavailable=unavailable,queueMicrotask(()=>{this.isConnected&&this.requestUpdate()}),unavailable&&this.announcements.announceAssertive(this.localize("chartRenderUnavailable")))}drawIfVisible(){!this.isConnected||!this.visible||this.draw()}rebuildAfterAnnotationRegistration(){this.chart&&(this.appliedLegendVisibility=void 0,this.chart.destroy(),this.chart=void 0,this.drawIfVisible())}refreshTheme(){this.canvasTokens.clear(),this.drawIfVisible(),this.withLegend&&this.requestUpdate("canvasPresentation",null)}seriesDisplayLabel(series){return series.label||this.localize("chartSeriesLabel")}formatValue(value,surface,metadata={}){const legacyContext=surface==="export"||surface==="spoken"?"table":surface==="visual"?void 0:surface;return this.formatter?.({value,surface,...metadata})??(legacyContext?this.valueFormatter?.(value,legacyContext):void 0)??(surface==="export"?value:formatChartValue(value,this.effectiveLocale))}exportData(format){if(format==="png")return this.chart?.toBase64Image?.()??"";const header=["category","series","min","q1","median","q3","max"].map(escapeCsvField).join(","),rows=[];return this.datasets.forEach((series,datasetIndex)=>{series.data.forEach((point,index)=>{if(!this.validPoint(point))return;const metadata={datasetIndex,index,label:this.labels[index]||void 0,seriesLabel:series.label,axis:"y"};rows.push([this.labels[index]??"",this.seriesDisplayLabel(series),this.formatValue(point.min,"export",{...metadata,statistic:"min"}),this.formatValue(point.q1,"export",{...metadata,statistic:"q1"}),this.formatValue(point.median,"export",{...metadata,statistic:"median"}),this.formatValue(point.q3,"export",{...metadata,statistic:"q3"}),this.formatValue(point.max,"export",{...metadata,statistic:"max"})].map(escapeCsvField).join(","))})}),[header,...rows].join(`\r
2
+ `)}boxPlotDescription(){if(this.description)return this.description;const keys=[this.datasets,this.labels,this.effectiveLocale,this.strings,this.formatter,this.valueFormatter];if(this.descriptionMemo?.keys.every((key,index)=>key===keys[index]))return this.descriptionMemo.value;const value=this.buildBoxPlotDescription();return this.descriptionMemo={keys,value},value}buildBoxPlotDescription(){const summaries=this.dataTableSample().seriesIndexes.map(index=>{const series=this.datasets[index];let count=0,first=0,last=0,min=0,minIndex=0,max=0,maxIndex=0;for(const[pointIndex,point]of series.data.entries())this.validPoint(point)&&(count===0&&(first=point.median,min=point.median,minIndex=pointIndex,max=point.median,maxIndex=pointIndex),last=point.median,point.median<min&&(min=point.median,minIndex=pointIndex),point.median>max&&(max=point.median,maxIndex=pointIndex),count++);if(count===0)return this.localize("chartSeriesNoData",void 0,{label:this.seriesDisplayLabel(series)});const trend=last>first?this.localize("chartTrendIncreasing"):last<first?this.localize("chartTrendDecreasing"):this.localize("chartTrendFlat");return this.localize("boxPlotSeriesSummary",void 0,{label:this.seriesDisplayLabel(series),count:getNumberFormat(this.effectiveLocale).format(count),min:this.formatValue(min,"spoken",{datasetIndex:index,index:minIndex,label:this.labels[minIndex]||void 0,seriesLabel:series.label,statistic:"median",axis:"y"}),max:this.formatValue(max,"spoken",{datasetIndex:index,index:maxIndex,label:this.labels[maxIndex]||void 0,seriesLabel:series.label,statistic:"median",axis:"y"}),trend})});return summaries.length?this.localize("boxPlotSummaryWithData",void 0,{summaries:summaries.join(this.localize("chartSummarySeparator"))}):this.localize("boxPlotSummaryEmpty")}boxDatums(){const sample=this.dataTableSample();if(this.boxDatumsMemo?.sample===sample)return this.boxDatumsMemo.value;const datums=[];for(const datasetIndex of sample.seriesIndexes){const series=this.datasets[datasetIndex];if(series)for(const index of sample.rowIndexes){const point=series.data[index];this.validPoint(point)&&datums.push({datasetIndex,index,label:this.labels[index]||void 0,value:summaryOf(point)})}}return this.boxDatumsMemo={sample,value:datums},datums}boxStatistics(point){return[["min",this.localize("boxPlotMin"),point.min],["q1",this.localize("boxPlotQ1"),point.q1],["median",this.localize("boxPlotMedian"),point.median],["q3",this.localize("boxPlotQ3"),point.q3],["max",this.localize("boxPlotMax"),point.max]]}boxAnnouncement(datum,position,total){const numberFormat=getNumberFormat(this.effectiveLocale),point=datum.value,summary=(point?this.boxStatistics(point):[]).filter(([,,value])=>Number.isFinite(value)).map(([statistic,label,value])=>this.localize("chartValueLabel",void 0,{label,value:this.formatValue(value,"spoken",{datasetIndex:datum.datasetIndex,index:datum.index,label:datum.label,seriesLabel:this.datasets[datum.datasetIndex]?.label,statistic,axis:"y"})})).join(this.localize("chartSummarySeparator"));return this.localize("liteChartMarkSummary",void 0,{series:this.datasets[datum.datasetIndex]?.label||this.localize("chartSeriesLabel"),label:datum.label??this.localize("chartPointLabel",void 0,{n:numberFormat.format(datum.index+1)}),value:summary,index:numberFormat.format(position+1),total:numberFormat.format(total)})}activateBox(datum){const datums=this.boxDatums(),position=datums.findIndex(candidate=>candidate.datasetIndex===datum.datasetIndex&&candidate.index===datum.index);position>=0&&(this.keyboardDatumIndex=position,this.keyboardDatumAnnouncement=this.boxAnnouncement(datum,position,datums.length)),this.emit("lr-datum-activate",{...datum,kind:"box"}),this.emit("lr-point-activate",{...datum})}handlePointClick(event,chart){const hit=chart.getElementsAtEventForMode?.(event,"nearest",{intersect:!0},!0)?.[0];if(!hit)return;const sample=this.dataTableSample(),datasetIndex=sample.seriesIndexes[hit.datasetIndex],index=sample.rowIndexes[hit.index];if(datasetIndex===void 0||index===void 0)return;const point=this.datasets[datasetIndex]?.data[index];this.activateBox({datasetIndex,index,label:this.labels[index]||void 0,value:this.validPoint(point)?summaryOf(point):null})}showKeyboardBox(datum){if(!this.chart||!datum&&!this.keyboardBoxShown)return;const sample=this.dataTableSample();this.keyboardBoxShown=showChartActiveDatum(this.chart,datum&&{datasetIndex:positionIndex(sample.seriesIndexes).get(datum.datasetIndex)??-1,index:positionIndex(sample.rowIndexes).get(datum.index)??-1})}onCanvasFocus(event){const datums=this.boxDatums();datums.length&&(this.keyboardDatumIndex=Math.min(this.keyboardDatumIndex,datums.length-1),isKeyboardFocusEvent(event)&&this.showKeyboardBox(datums[this.keyboardDatumIndex]),this.keyboardDatumAnnouncement=this.boxAnnouncement(datums[this.keyboardDatumIndex],this.keyboardDatumIndex,datums.length))}onCanvasKeyDown(event){const datums=this.boxDatums();if(!datums.length)return;if(this.keyboardDatumIndex=Math.min(this.keyboardDatumIndex,datums.length-1),event.key==="Enter"||event.key===" "){event.preventDefault(),this.activateBox(datums[this.keyboardDatumIndex]);return}const rtl=this.effectiveDirection==="rtl",forward=rtl?"ArrowLeft":"ArrowRight",backward=rtl?"ArrowRight":"ArrowLeft";let next=this.keyboardDatumIndex;if(event.key===forward||event.key==="ArrowDown")next=Math.min(datums.length-1,next+1);else if(event.key===backward||event.key==="ArrowUp")next=Math.max(0,next-1);else if(event.key==="Home")next=0;else if(event.key==="End")next=datums.length-1;else return;event.preventDefault(),this.keyboardDatumIndex=next,this.showKeyboardBox(datums[next]),this.keyboardDatumAnnouncement=this.boxAnnouncement(datums[next],next,datums.length)}validPoint(point){return!!point&&[point.min,point.q1,point.median,point.q3,point.max].every(Number.isFinite)&&point.min<=point.q1&&point.q1<=point.median&&point.median<=point.q3&&point.q3<=point.max}accessibleName(fallback){return this.getAttribute("aria-label")??this.label??fallback}dataTableSample(){if(this.sampleMemo?.datasets===this.datasets&&this.sampleMemo.labels===this.labels)return this.sampleMemo.value;let rowCount=this.labels.length;for(const series of this.datasets)rowCount=Math.max(rowCount,series.data.length);const indexes=sampleChartTableIndexes(rowCount,this.datasets.length),value={rowCount,seriesCount:this.datasets.length,...indexes};return this.sampleMemo={datasets:this.datasets,labels:this.labels,value},value}generatedDataIsSampled(){const sample=this.dataTableSample();return sample.rowCount===0||sample.seriesCount===0?!1:sample.rowIndexes.length<sample.rowCount||sample.seriesIndexes.length<sample.seriesCount}dataTruncationMessage(){return this.generatedDataIsSampled()?this.hasCustomDataTable()?this.localize("chartPlotSampled"):this.localize("chartDataSampled"):""}requestUpdate(...args){const key=args[0];key===void 0&&(this.descriptionMemo=void 0),(key===void 0||["datasets","labels","formatter","valueFormatter","locale","strings","withDataTable","dataTableToggle","dataTableExpandedOverride"].includes(String(key)))&&(this.dataTableRows=void 0),super.requestUpdate(...args)}renderDataTableRows(){if(this.dataTableRows)return this.dataTableRows;const numberFormat=getNumberFormat(this.effectiveLocale),direction=this.effectiveDirection==="rtl"?"rtl":"ltr",sample=this.dataTableSample();return this.dataTableRows=sample.seriesIndexes.flatMap(seriesIndex=>{const series=this.datasets[seriesIndex];return sample.rowIndexes.map(index=>{const point=series.data[index],metadata={datasetIndex:seriesIndex,index,label:this.labels[index]||void 0,seriesLabel:series.label,axis:"y"};return this.validPoint(point)?html`
3
3
  <tr>
4
4
  <th scope="row">${isolateHtml(this.labels[index]||this.localize("chartPointLabel",void 0,{n:numberFormat.format(index+1)}),direction)}</th>
5
5
  <td>${isolateHtml(this.seriesDisplayLabel(series),direction)}</td>
@@ -27,7 +27,7 @@ import{__decorate}from"tslib";import{collectionSupport,snapshotPublicCollection}
27
27
  ${this.renderDataTableRows()}
28
28
  </tbody>
29
29
  </table>
30
- `}hasCustomDataTable(){return hasSlottedChartDataTable(this)}toggleDataset(index){if(!this.chart||index<0||index>=this.datasets.length)return;const hidden=this.effectiveHiddenDatasetIndexes(),wasHidden=hidden.includes(index),nextHidden=wasHidden?hidden.filter(candidate=>candidate!==index):[...hidden,index].sort((left,right)=>left-right),visible=wasHidden;if(this.emit("lr-legend-visibility-change-request",legendVisibilityDetail(index,visible,nextHidden),{cancelable:!0}).defaultPrevented)return;this.hiddenDatasets=nextHidden;const appliedVisibility={chart:this.chart,hidden:this.hiddenDatasets};this.applyDatasetVisibility(),this.chart.update("none"),this.appliedLegendVisibility=appliedVisibility,this.requestUpdate(),this.emit("lr-legend-visibility-change",legendVisibilityDetail(index,visible,nextHidden))}renderLegend(){if(!this.withLegend)return nothing;const palette=this.canvasTokens.palette(),forced=forcedColorsActive(this.ownerWindow),controlledHidden=normalizeHiddenDatasets(this.hiddenDatasets,this.datasets.length),controlledHiddenSet=controlledHidden===void 0?void 0:new Set(controlledHidden),sample=this.dataTableSample();return html`
30
+ `}hasCustomDataTable(){return hasSlottedChartDataTable(this)}toggleDataset(index){if(!this.chart||index<0||index>=this.datasets.length)return;const hidden=this.effectiveHiddenDatasetIndexes(),wasHidden=hidden.includes(index),nextHidden=wasHidden?hidden.filter(candidate=>candidate!==index):[...hidden,index].sort((left,right)=>left-right),visible=wasHidden;if(this.emit("lr-legend-visibility-change-request",legendVisibilityDetail(index,visible,nextHidden),{cancelable:!0}).defaultPrevented)return;this.hiddenDatasets=nextHidden;const appliedVisibility={chart:this.chart,hidden:this.hiddenDatasets};this.applyDatasetVisibility(),this.chart.update("none"),this.appliedLegendVisibility=appliedVisibility,this.requestUpdate("canvasPresentation",null),this.emit("lr-legend-visibility-change",legendVisibilityDetail(index,visible,nextHidden))}renderLegend(){if(!this.withLegend)return nothing;const palette=this.canvasTokens.palette(),forced=forcedColorsActive(this.ownerWindow),controlledHidden=normalizeHiddenDatasets(this.hiddenDatasets,this.datasets.length),controlledHiddenSet=controlledHidden===void 0?void 0:new Set(controlledHidden),sample=this.dataTableSample();return html`
31
31
  <div part="legend" role="group" aria-label=${this.accessibleName(this.localize("boxPlot"))}>
32
32
  ${sample.seriesIndexes.map(index=>{const series=this.datasets[index],color=this.seriesFillColor(index,palette),visible=controlledHiddenSet===void 0||!controlledHiddenSet.has(index),encoding=forced?forcedColorEncoding(index).name:void 0;return html`
33
33
  <button
@@ -1,9 +1,13 @@
1
- import{LyraChart,type LyraChartType}from'./chart.class.js';
1
+ export type{LyraSpatialBounds,LyraSpatialChartSource,LyraSpatialChartPoint,LyraSpatialChartSeries,LyraChartSpatialPointSelectDetail,LyraSpatialBinSelectDetail}from'./chart.class.js';export type{LyraChartPreparedData,LyraChartSourcePointSelectDetail,LyraChartSourceCategorySelectDetail,LyraPreparedSeriesData,LyraPreparedCategoryData,LyraSeriesPointRef}from'./chart.class.js';import{LyraChart,type LyraChartType}from'./chart.class.js';
2
2
  /**
3
3
  * `<lr-bubble-chart>` — `<lr-chart>` with a `"bubble"` default and the mirrored writable type. Feed
4
4
  * points via `LyraChartSeries.points`, whose exported `LyraChartPoint` type carries
5
5
  * `x`/`y`, optional bubble `r` (radius), and an optional per-point `label`.
6
6
  *
7
+ * Prepared-data compatibility follows the current writable type: line accepts series, bar
8
+ * accepts series/categories, radial category types accept categories. Spatial types require
9
+ * the spatial source route with bounded density and exact original point identity.
10
+ *
7
11
  * @customElement lr-bubble-chart
8
12
  * @status stable
9
13
  * @since 4.0.0
@@ -0,0 +1,9 @@
1
+ import type{LyraSpatialChartSource}from'../../../utilities/data-spatial.js';import type{LyraPreparedSeriesData,LyraPreparedCategoryData,LyraObservationCounts,LyraNumericDomain,LyraSeriesSample,LyraSeriesObservation,LyraSeriesPointRef,LyraSourceValue,LyraSeriesRangeRequest}from'../../../utilities/data-preparation.js';import type{LyraSourceRevision}from'../../../data-sources.js';type NonspatialChartData=LyraPreparedSeriesData|LyraPreparedCategoryData;export type LyraChartPreparedData=NonspatialChartData|LyraSpatialChartSource;export interface LyraChartSourcePointSelectDetail{readonly revision:LyraSourceRevision;readonly seriesId:string;readonly sourceIndex:number;readonly point:LyraSeriesObservation;}export interface LyraChartSourceCategorySelectDetail{readonly revision:LyraSourceRevision;readonly seriesId:string;readonly categoryId:string;readonly value:number;readonly observationCount:number;}export interface PreparedChartSeries{readonly id:string;readonly label:string;readonly counts:LyraObservationCounts;readonly xDomain:LyraNumericDomain|null;readonly yDomain:LyraNumericDomain|null;readonly samples:readonly(LyraSeriesSample|null)[];readonly values:readonly number[];}export interface PreparedChartModel{readonly source:NonspatialChartData;readonly type:string;readonly revision:LyraSourceRevision;readonly kind:'series'|'categories';readonly labels:readonly string[];readonly categoryIds:readonly string[];readonly categoryCounts:readonly number[];readonly series:readonly PreparedChartSeries[];readonly validCount:number;readonly invalidCount:number;readonly displayedCount:number;readonly peerCount:number;readonly rowCount:number;readonly limit:number;}
2
+ /** Copies only the admitted summary. Legacy arrays and source readers are never enumerated. */
3
+ export declare function prepareChartModel(source:unknown,type:string,limit:number):PreparedChartModel;
4
+ /** Overlays one exact observation without reconnecting an omitted path segment. */
5
+ export declare function withPreparedPoint(model:PreparedChartModel,ref:LyraSeriesPointRef,point:LyraSeriesObservation):PreparedChartModel;
6
+ /** Resolves promptly on cancellation even when a host reader ignores its signal. */
7
+ export declare function preparedResponse<T>(response:LyraSourceValue<T>,signal:AbortSignal):Promise<T>;
8
+ /** Validates a bounded indexed refinement while preserving the snapshot's full domains/counts. */
9
+ export declare function withPreparedRange(model:PreparedChartModel,request:LyraSeriesRangeRequest,values:readonly LyraSeriesSample[]):PreparedChartModel;export{};
@@ -0,0 +1 @@
1
+ import{sourceCount,sourceRevision}from"../../../internal/source-request-controller.js";function field(value,key){if(!value||typeof value!="object")throw new TypeError("Invalid prepared record");const descriptor=Object.getOwnPropertyDescriptor(value,key);if(!descriptor||!("value"in descriptor))throw new TypeError("Prepared fields must be own data properties");return descriptor.value}function array(value,maximum){if(!Array.isArray(value))throw new RangeError("Invalid prepared array");const length=sourceCount(field(value,"length"));if(length>maximum)throw new RangeError("Prepared array budget exceeded");const result=[];for(let index=0;index<length;index++)result.push(field(value,String(index)));return result}function number(value){if(typeof value!="number"||!Number.isFinite(value))throw new TypeError("Invalid prepared number");return value}function text(value,maximum,nonblank=!1){if(typeof value!="string"||value.length>maximum||nonblank&&!value.trim())throw new TypeError("Invalid prepared metadata");return value}function counts(value){const source=sourceCount(field(value,"sourceCount")),valid=sourceCount(field(value,"validCount")),invalid=sourceCount(field(value,"invalidCount"));if(valid>source||invalid!==source-valid)throw new RangeError("Invalid prepared counts");return Object.freeze({sourceCount:source,validCount:valid,invalidCount:invalid})}function domain(value,valid){if(valid===0&&value===null)return null;const min=number(field(value,"min")),max=number(field(value,"max"));if(!valid||max<min)throw new RangeError("Invalid prepared domain");return Object.freeze({min,max})}function addCount(a,b){return sourceCount(a+b)}function sample(value,count,x,y){const sourceIndex=sourceCount(field(value,"sourceIndex")),pointX=number(field(value,"x")),pointY=number(field(value,"y")),breakBefore=field(value,"breakBefore");if(sourceIndex>=count.sourceCount||!x||!y||pointX<x.min||pointX>x.max||pointY<y.min||pointY>y.max||typeof breakBefore!="boolean")throw new RangeError("Invalid prepared sample");return Object.freeze({x:pointX,y:pointY,sourceIndex,breakBefore})}function finish(model){let displayedCount=0,peerCount=0,rowCount=0;for(const series of model.series){const size=model.kind==="series"?series.samples.length:series.values.length;displayedCount+=model.kind==="series"?series.samples.reduce((sum,point)=>sum+ +(point!==null),0):size,peerCount+=size,rowCount=Math.max(rowCount,size)}if(peerCount>model.limit||rowCount*model.series.length>1e3||displayedCount>9e3)throw new RangeError("Prepared rendering budget exceeded");return Object.freeze({...model,series:Object.freeze(model.series),displayedCount,peerCount,rowCount})}function prepareChartModel(source,type,limit){const kind=field(source,"kind"),revision=sourceRevision(field(source,"revision"));if(kind!=="series"&&kind!=="categories")throw new TypeError("Incompatible prepared kind");if(kind==="series"?!["line","bar"].includes(type):!["bar","pie","doughnut","radar","polarArea"].includes(type))throw new TypeError("Incompatible prepared chart type");const entries=array(field(source,"series"),1e3);if(!entries.length)throw new RangeError("Prepared series are required");const identifiers=new Set;let metadataUnits=0,validCount=0,invalidCount=0;const metadata=value=>{const id=text(field(value,"id"),256,!0),label=text(field(value,"label"),1024);if(metadataUnits+=id.length+label.length,metadataUnits>65536)throw new RangeError("Prepared metadata budget exceeded");return{id,label}},categories=[],categoryCounts=[];let categoryTotals;if(kind==="categories"){categoryTotals=counts(field(source,"counts")),validCount=categoryTotals.validCount,invalidCount=categoryTotals.invalidCount;const ids=new Set;for(const value of array(field(source,"categories"),1e3)){const category=metadata(value);if(ids.has(category.id))throw new TypeError("Duplicate prepared category ID");ids.add(category.id),categories.push(category)}const rawCounts=array(field(source,"categoryCounts"),1e3);if(rawCounts.length!==categories.length)throw new RangeError("Prepared category count mismatch");let total=0;for(const value of rawCounts){const count=sourceCount(value);total=addCount(total,count),categoryCounts.push(count)}if(total!==validCount)throw new RangeError("Prepared category counts do not conserve observations");if(!["count","sum","mean","host-defined"].includes(String(field(source,"aggregation"))))throw new TypeError("Invalid prepared aggregation")}else if(limit<5||typeof field(source,"getPoint")!="function")throw new RangeError("Prepared series require an exact reader and overlay capacity");const result=[];let admittedEntries=0;for(const value of entries){const meta=metadata(value);if(identifiers.has(meta.id))throw new TypeError("Duplicate prepared series ID");if(identifiers.add(meta.id),kind==="categories"){const values=array(field(value,"values"),Math.min(limit-admittedEntries,1e3)).map(number);if(admittedEntries+=values.length,values.length!==categories.length)throw new RangeError("Prepared category values mismatch");result.push(Object.freeze({...meta,counts:categoryTotals,xDomain:null,yDomain:null,samples:Object.freeze([]),values:Object.freeze(values)}))}else{const totals=counts(field(value,"counts"));validCount=addCount(validCount,totals.validCount),invalidCount=addCount(invalidCount,totals.invalidCount);const x=domain(field(value,"xDomain"),totals.validCount),y=domain(field(value,"yDomain"),totals.validCount),raw=array(field(value,"samples"),Math.min(limit-admittedEntries-2,1e3));if(raw.length>totals.validCount||totals.validCount>0&&!raw.length)throw new RangeError("Invalid prepared sample count");const samples=[];let previous=-1;for(const value2 of raw){const point=sample(value2,totals,x,y);if(point.sourceIndex<=previous||previous<0&&!point.breakBefore)throw new RangeError("Prepared samples must preserve ordered source indices");if(type==="line"&&previous>=0&&point.breakBefore&&samples.push(null),samples.push(point),previous=point.sourceIndex,admittedEntries+samples.length+2>limit)throw new RangeError("Prepared rendering budget exceeded")}admittedEntries+=samples.length,result.push(Object.freeze({...meta,counts:totals,xDomain:x,yDomain:y,samples:Object.freeze(samples),values:Object.freeze([])}))}}const model=finish({source,type,revision,kind,labels:Object.freeze(categories.map(value=>value.label)),categoryIds:Object.freeze(categories.map(value=>value.id)),categoryCounts:Object.freeze(categoryCounts),series:result,validCount,invalidCount,limit}),reserve=kind==="series"?2:0;if(model.peerCount+reserve>limit||model.displayedCount+ +(kind==="series")>9e3||(model.rowCount+reserve)*entries.length>1e3)throw new RangeError("Prepared overlay capacity exceeded");return model}function withPreparedPoint(model,ref,point){if(model.kind!=="series")throw new TypeError("Exact points require prepared series");const index=model.series.findIndex(entry2=>entry2.id===ref.seriesId),entry=model.series[index];if(!entry)throw new RangeError("Unknown prepared series");const value=sample({x:field(point,"x"),y:field(point,"y"),sourceIndex:ref.sourceIndex,breakBefore:!0},entry.counts,entry.xDomain,entry.yDomain);if(entry.samples.some(sample2=>sample2?.sourceIndex===ref.sourceIndex))return model;const series=[...model.series];return series[index]=Object.freeze({...entry,samples:Object.freeze([...entry.samples,...entry.samples.length?[null]:[],value])}),finish({...model,series})}async function preparedResponse(response,signal){let abort;try{return await new Promise((resolve,reject)=>{abort=()=>reject(signal.reason),signal.addEventListener("abort",abort,{once:!0}),Promise.resolve(response).then(resolve,reject),signal.aborted&&abort()})}finally{abort&&signal.removeEventListener("abort",abort)}}function withPreparedRange(model,request,values){if(model.kind!=="series"||model.source.kind!=="series")throw new TypeError("Refinement requires prepared series");const index=model.series.findIndex(series=>series.id===request.seriesId),entry=model.series[index];if(!entry)throw new RangeError("Unknown prepared series");const points=array(values,request.maxPoints).map(value=>sample(value,entry.counts,entry.xDomain,entry.yDomain));for(const point of points)if(point.sourceIndex<request.startIndex||point.sourceIndex>=request.endIndex)throw new RangeError("Refinement outside requested range");const source={kind:"series",revision:model.revision,getPoint:model.source.getPoint,series:model.series.map((series,position)=>({id:series.id,label:series.label,counts:series.counts,xDomain:series.xDomain,yDomain:series.yDomain,samples:position===index?points:series.samples.filter(point=>point!==null)}))},refined=prepareChartModel(source,model.type,model.limit);return Object.freeze({...refined,source:model.source})}export{prepareChartModel,preparedResponse,withPreparedPoint,withPreparedRange};
@@ -0,0 +1,2 @@
1
+ import{escapeCsvField}from"../../utility/export-button/csv.js";function domain(min,max){if(!Number.isFinite(min)||!Number.isFinite(max)||min>max)throw new RangeError("Invalid spatial coordinate domain.")}function spatialCoordinate(value,min,max){if(domain(min,max),!Number.isFinite(value)||value<min||value>max)throw new RangeError("Spatial coordinate is outside its domain.");if(min===max)return .5;if(value===min)return 0;if(value===max)return 1;const span=max-min;return Number.isFinite(span)?(value-min)/span:(value/2-min/2)/(max/2-min/2)}function spatialOriginal(normalized,min,max){if(domain(min,max),!Number.isFinite(normalized)||normalized<0||normalized>1)throw new RangeError("Invalid normalized spatial coordinate.");if(min===max||normalized===0)return min;if(normalized===1)return max;const span=max-min,midpoint=min/2+max/2,original=Number.isFinite(span)?min+normalized*span:normalized<=.5?min*(1-normalized*2)+midpoint*(normalized*2):midpoint*(2-normalized*2)+max*(normalized*2-1);if(!Number.isFinite(original))throw new RangeError("Unrepresentable spatial coordinate.");return Math.max(min,Math.min(max,original))}function spatialPaintRadius(radius,width,height){if(![radius,width,height].every(value=>Number.isFinite(value)&&value>=0))throw new RangeError("Invalid spatial paint dimensions.");return Math.min(radius,Math.min(Number.MAX_VALUE,Math.hypot(width,height)))}function spatialCsv(series,points,bins,format){if(series.length>1e3||points.length+bins.length>1e3)throw new RangeError("Spatial export exceeds its record budget.");const labels=new Map(series.map(entry=>[entry.id,entry.label])),rows=["kind,seriesId,seriesLabel,id,sourceIndex,label,x,y,radius,minX,maxX,minY,maxY,count"],numeric=(value,record,column)=>format?.(value,record,column)??value;for(const point of points)rows.push(["point",point.seriesId,labels.get(point.seriesId),point.id,numeric(point.sourceIndex,point,"sourceIndex"),point.label,numeric(point.x,point,"x"),numeric(point.y,point,"y"),point.radius===void 0?"":numeric(point.radius,point,"radius"),"","","","",""].map(escapeCsvField).join(","));for(const bin of bins)rows.push(["bin","","","","","","","","",numeric(bin.bounds.minX,bin,"minX"),numeric(bin.bounds.maxX,bin,"maxX"),numeric(bin.bounds.minY,bin,"minY"),numeric(bin.bounds.maxY,bin,"maxY"),numeric(bin.count,bin,"count")].map(escapeCsvField).join(","));return rows.join(`\r
2
+ `)}export{spatialCoordinate,spatialCsv,spatialOriginal,spatialPaintRadius};
@@ -1 +1 @@
1
- import{adoptChartSyncStyles}from"./chart-sync-style-adoption.js";const documents=new WeakMap;class ChartSyncController{constructor(host,project,reset,isNavigationTarget){this.host=host,this.project=project,this.reset=reset,this.isNavigationTarget=isNavigationTarget,this.groupName="",this.scrollTargets=[],this.shown=!1,this.onLeave=()=>{this.clear()},this.onKeyDown=event=>{event.key==="Escape"&&this.clear()},this.onScroll=event=>{if(!this.shown&&!this.group?.active)return;const target=event.target;target&&typeof target.nodeType=="number"&&(target===this.document||this.includesComposed(target,this.host)||this.includesComposed(this.host,target))&&(this.clear(),this.receive())},this.onBlur=event=>{const target=event.relatedTarget;target&&typeof target.nodeType=="number"&&(this.isNavigationTarget?this.isNavigationTarget(target):this.includesComposed(this.host,target))||this.clear()}}get enabled(){return this.group!==void 0}update(name,compatible,invalidateOwner=!1){const normalized=typeof name=="string"&&compatible?name.trim():"";if(!this.host.isConnected||!normalized){this.disconnect();return}const doc=this.host.ownerDocument;if(doc!==this.document||normalized!==this.groupName){this.disconnect();let groups=documents.get(doc);groups||(groups=new Map,documents.set(doc,groups));let group=groups.get(normalized);group||(group={members:new Set},groups.set(normalized,group)),this.document=doc,this.groupName=normalized,this.group=group,group.members.add(this),this.host.addEventListener("pointerleave",this.onLeave),this.host.addEventListener("pointercancel",this.onLeave),this.host.addEventListener("focusout",this.onBlur),this.host.shadowRoot?.addEventListener("focusout",this.onBlur),this.host.addEventListener("keydown",this.onKeyDown);const roots=new Set([doc]);this.host.shadowRoot&&roots.add(this.host.shadowRoot);for(let node=this.host;node;node=this.composedParent(node))roots.add(node.getRootNode());this.scrollTargets=[...roots];for(const root of this.scrollTargets)root.addEventListener("scroll",this.onScroll,!0)}this.releaseStyles??=adoptChartSyncStyles(this.host),invalidateOwner&&this.group?.active?.owner===this&&this.clear(),this.receive()}publish(label,index){if(!label||!this.group){this.clear();return}const active=this.group.active;if(this.shown&&active?.owner===this&&active.label===label&&active.index===index)return;const presentation=this.project(label,index);if(!presentation){this.clear();return}this.group.active={owner:this,label,index};for(const member of[...this.group.members])member===this?member.show(presentation):member.receive()}clear(){if(this.group?.active?.owner===this){this.group.active=void 0;for(const member of[...this.group.members])member.hide()}}disconnect(){if(this.releaseStyles?.(),this.releaseStyles=void 0,!this.group){this.hide(!1);return}this.clear();const group=this.group;if(group?.members.delete(this),group&&group.members.size===0&&this.document){const groups=documents.get(this.document);groups?.delete(this.groupName),groups?.size===0&&documents.delete(this.document)}this.host.removeEventListener("pointerleave",this.onLeave),this.host.removeEventListener("pointercancel",this.onLeave),this.host.removeEventListener("focusout",this.onBlur),this.host.shadowRoot?.removeEventListener("focusout",this.onBlur),this.host.removeEventListener("keydown",this.onKeyDown);for(const root of this.scrollTargets)root.removeEventListener("scroll",this.onScroll,!0);this.scrollTargets=[],this.group=void 0,this.document=void 0,this.groupName="",this.hide()}composedParent(node){return node.assignedSlot??node.parentNode??(node.nodeType===11?node.host??null:null)}includesComposed(ancestor,descendant){for(let node=descendant;node;node=this.composedParent(node))if(node===ancestor)return!0;return!1}hide(reset=!0){reset&&this.shown&&this.reset?.(),this.shown=!1,this.crosshair?.remove(),this.tooltip?.remove(),this.crosshair=void 0,this.tooltip=void 0}receive(){const active=this.group?.active,presentation=active&&this.host.isConnected?this.project(active.label,active.owner===this?active.index:void 0):void 0;this.show(presentation)}show(presentation){const wasShown=this.shown;if(this.hide(!1),!presentation){wasShown&&this.reset?.();return}this.shown=!0;const{container,x,top,height}=presentation;if(![x,top,height].every(Number.isFinite)||height<=0||container.clientWidth<=0)return;const doc=this.host.ownerDocument,crosshair=doc.createElement("div");crosshair.setAttribute("part","sync-crosshair"),crosshair.setAttribute("aria-hidden","true"),crosshair.style.left=`${x}px`,crosshair.style.top=`${top}px`,crosshair.style.height=`${height}px`,container.append(crosshair),this.crosshair=crosshair;const content=presentation.tooltip;if(!content||!content.rows.length&&!content.title)return;const tooltip=doc.createElement("div");tooltip.setAttribute("part","sync-tooltip"),tooltip.setAttribute("aria-hidden","true");for(const text of[content.title,...content.rows]){if(!text)continue;const line=doc.createElement("div"),isolated=doc.createElement("bdi");isolated.textContent=text,line.append(isolated),tooltip.append(line)}container.append(tooltip);const inlineSize=Math.min(tooltip.getBoundingClientRect().width,container.clientWidth),blockSize=tooltip.getBoundingClientRect().height;tooltip.style.left=`${Math.max(container.scrollLeft,Math.min(x,container.scrollLeft+container.clientWidth-inlineSize))}px`,tooltip.style.top=`${Math.max(container.scrollTop,Math.min(top,container.scrollTop+container.clientHeight-blockSize))}px`,this.tooltip=tooltip}}export{ChartSyncController};
1
+ import{adoptChartSyncStyles}from"./chart-sync-style-adoption.js";const documents=new WeakMap;class ChartSyncController{constructor(host,project,reset,isNavigationTarget){this.host=host,this.project=project,this.reset=reset,this.isNavigationTarget=isNavigationTarget,this.groupName="",this.scrollTargets=[],this.shown=!1,this.onLeave=()=>{this.clear()},this.onKeyDown=event=>{event.key==="Escape"&&this.clear()},this.onScroll=event=>{if(!this.shown&&(!this.group?.active||this.group.frame!==void 0))return;const target=event.target;target&&typeof target.nodeType=="number"&&(target===this.document||this.includesComposed(target,this.host)||this.includesComposed(this.host,target))&&(this.clear(),this.receive())},this.onBlur=event=>{const target=event.relatedTarget;target&&typeof target.nodeType=="number"&&(this.isNavigationTarget?this.isNavigationTarget(target):this.includesComposed(this.host,target))||this.clear()}}get enabled(){return this.group!==void 0}update(name,compatible,invalidateOwner=!1){const normalized=typeof name=="string"&&compatible?name.trim():"";if(!this.host.isConnected||!normalized){this.disconnect();return}const doc=this.host.ownerDocument;if(doc!==this.document||normalized!==this.groupName){this.disconnect();let groups=documents.get(doc);groups||(groups=new Map,documents.set(doc,groups));let group=groups.get(normalized);group||(group={members:new Set},groups.set(normalized,group)),this.document=doc,this.groupName=normalized,this.group=group,group.members.add(this),this.host.addEventListener("pointerleave",this.onLeave),this.host.addEventListener("pointercancel",this.onLeave),this.host.addEventListener("focusout",this.onBlur),this.host.shadowRoot?.addEventListener("focusout",this.onBlur),this.host.addEventListener("keydown",this.onKeyDown);const roots=new Set([doc]);this.host.shadowRoot&&roots.add(this.host.shadowRoot);for(let node=this.host;node;node=this.composedParent(node))roots.add(node.getRootNode());this.scrollTargets=[...roots];for(const root of this.scrollTargets)root.addEventListener("scroll",this.onScroll,!0)}this.releaseStyles??=adoptChartSyncStyles(this.host),invalidateOwner&&this.group?.active?.owner===this&&this.clear(),this.receive()}publish(label,index){if(!label||!this.group){this.clear();return}const active=this.group.active;if(this.shown&&active?.owner===this&&active.label===label&&active.index===index)return;const group=this.group;if(group.active={owner:this,label,index},group.frame!==void 0)return;const view=this.document?.defaultView;view&&(group.frame=view.requestAnimationFrame(()=>{group.frame=void 0;const current=group.active;if(!current)return;const presentations=[...group.members].map(member=>({member,presentation:member.host.isConnected?member.project(current.label,member===current.owner?current.index:void 0):void 0}));if(!presentations.find(item=>item.member===current.owner)?.presentation){current.owner.clear();return}const widths=presentations.map(({presentation})=>presentation?.container.clientWidth??0),writes=presentations.map(({member,presentation},index2)=>member.show(presentation,widths[index2])).map(measure=>measure?.());for(const write of writes)write?.()}))}clear(){if(this.group?.active?.owner===this){this.group.active=void 0,this.group.frame!==void 0&&this.document?.defaultView?.cancelAnimationFrame(this.group.frame),this.group.frame=void 0;for(const member of[...this.group.members])member.hide()}}disconnect(){if(this.releaseStyles?.(),this.releaseStyles=void 0,!this.group){this.hide(!1);return}this.clear();const group=this.group;if(group?.members.delete(this),group&&group.members.size===0&&this.document){const groups=documents.get(this.document);groups?.delete(this.groupName),groups?.size===0&&documents.delete(this.document)}this.host.removeEventListener("pointerleave",this.onLeave),this.host.removeEventListener("pointercancel",this.onLeave),this.host.removeEventListener("focusout",this.onBlur),this.host.shadowRoot?.removeEventListener("focusout",this.onBlur),this.host.removeEventListener("keydown",this.onKeyDown);for(const root of this.scrollTargets)root.removeEventListener("scroll",this.onScroll,!0);this.scrollTargets=[],this.group=void 0,this.document=void 0,this.groupName="",this.hide()}composedParent(node){return node.assignedSlot??node.parentNode??(node.nodeType===11?node.host??null:null)}includesComposed(ancestor,descendant){for(let node=descendant;node;node=this.composedParent(node))if(node===ancestor)return!0;return!1}hide(reset=!0){reset&&this.shown&&this.reset?.(),this.shown=!1,this.crosshair?.remove(),this.tooltip?.remove(),this.crosshair=void 0,this.tooltip=void 0}receive(){const active=this.group?.active,presentation=active&&this.host.isConnected?this.project(active.label,active.owner===this?active.index:void 0):void 0;this.show(presentation)?.()?.()}show(presentation,containerWidth=presentation?.container.clientWidth??0){const wasShown=this.shown;if(this.hide(!1),!presentation){wasShown&&this.reset?.();return}this.shown=!0;const{container,x,top,height}=presentation;if(![x,top,height].every(Number.isFinite)||height<=0||containerWidth<=0)return;const doc=this.host.ownerDocument,crosshair=doc.createElement("div");crosshair.setAttribute("part","sync-crosshair"),crosshair.setAttribute("aria-hidden","true"),crosshair.style.left=`${x}px`,crosshair.style.top=`${top}px`,crosshair.style.height=`${height}px`,container.append(crosshair),this.crosshair=crosshair;const content=presentation.tooltip;if(!content||!content.rows.length&&!content.title)return;const tooltip=doc.createElement("div");tooltip.setAttribute("part","sync-tooltip"),tooltip.setAttribute("aria-hidden","true");for(const text of[content.title,...content.rows]){if(!text)continue;const line=doc.createElement("div"),isolated=doc.createElement("bdi");isolated.textContent=text,line.append(isolated),tooltip.append(line)}return container.append(tooltip),this.tooltip=tooltip,()=>{const rect=tooltip.getBoundingClientRect(),width=container.clientWidth,height2=container.clientHeight,left=container.scrollLeft,topEdge=container.scrollTop,inlineSize=Math.min(rect.width,width),xPosition=Math.max(left,Math.min(x,left+width-inlineSize)),yPosition=Math.max(topEdge,Math.min(top,topEdge+height2-rect.height));return()=>{tooltip.style.left=`${xPosition}px`,tooltip.style.top=`${yPosition}px`}}}}export{ChartSyncController};
@@ -1 +1 @@
1
- import{finiteCount}from"../../../internal/numbers.js";const MAX_RENDERED_CHART_RECORDS=1e3;function endpointSampleMinimum(sourceCount){return sourceCount>1?2:sourceCount}function evenlySpacedIndexes(sourceCount,sampleCount){if(sourceCount===0||sampleCount===0)return[];if(sampleCount===1)return[0];const lastSourceIndex=sourceCount-1,lastSampleIndex=sampleCount-1;return Array.from({length:sampleCount},(_,sampleIndex)=>sampleIndex===lastSampleIndex?lastSourceIndex:Math.min(lastSourceIndex,Math.max(0,Math.round(sampleIndex/lastSampleIndex*lastSourceIndex))))}function sampleCounts(rowCount,seriesCount){const series=Math.min(seriesCount,Math.floor(MAX_RENDERED_CHART_RECORDS/endpointSampleMinimum(rowCount)));return{rows:Math.min(rowCount,Math.floor(MAX_RENDERED_CHART_RECORDS/series)),series}}function sampleChartTableIndexes(rowCount,seriesCount){const rows=finiteCount(rowCount,0),series=finiteCount(seriesCount,0);if(rows===0||series===0)return{rowIndexes:evenlySpacedIndexes(rows,Math.min(rows,MAX_RENDERED_CHART_RECORDS)),seriesIndexes:evenlySpacedIndexes(series,Math.min(series,MAX_RENDERED_CHART_RECORDS))};const selected=sampleCounts(rows,series);return{rowIndexes:evenlySpacedIndexes(rows,selected.rows),seriesIndexes:evenlySpacedIndexes(series,selected.series)}}export{MAX_RENDERED_CHART_RECORDS,sampleChartTableIndexes};
1
+ import{finiteCount}from"../../../internal/numbers.js";const MAX_RENDERED_CHART_RECORDS=1e3;function endpointSampleMinimum(sourceCount){return sourceCount>1?2:sourceCount}function evenlySpacedIndexes(sourceCount,sampleCount){if(sourceCount===0||sampleCount===0)return[];if(sampleCount===1)return[0];const lastSourceIndex=sourceCount-1,lastSampleIndex=sampleCount-1;return Array.from({length:sampleCount},(_,sampleIndex)=>sampleIndex===lastSampleIndex?lastSourceIndex:Math.min(lastSourceIndex,Math.max(0,Math.round(sampleIndex/lastSampleIndex*lastSourceIndex))))}function sampleCounts(rowCount,seriesCount,budget){const series=Math.min(seriesCount,Math.floor(budget/endpointSampleMinimum(rowCount)));return{rows:Math.min(rowCount,Math.floor(budget/series)),series}}function sampleChartTableIndexes(rowCount,seriesCount,options={}){const budget=normalizeChartRecordLimit(options.maxRecords),rows=finiteCount(rowCount,0),series=finiteCount(seriesCount,0);if(rows===0||series===0)return{rowIndexes:evenlySpacedIndexes(rows,Math.min(rows,budget)),seriesIndexes:evenlySpacedIndexes(series,Math.min(series,budget))};const selected=sampleCounts(rows,series,budget),width=typeof options.width=="number"&&Number.isFinite(options.width)&&options.width>0?Math.max(endpointSampleMinimum(rows),Math.floor(options.width)):selected.rows,rowBudget=Math.min(selected.rows,width),seriesIndexes=evenlySpacedIndexes(series,selected.series);return{rowIndexes:options.valueAt&&rows>rowBudget?extremaIndexes(rows,rowBudget,seriesIndexes,options.valueAt):evenlySpacedIndexes(rows,rowBudget),seriesIndexes}}function normalizeChartRecordLimit(value){return Math.max(2,Math.min(MAX_RENDERED_CHART_RECORDS,finiteCount(typeof value=="number"?value:Number.NaN,MAX_RENDERED_CHART_RECORDS)))}function extremaIndexes(rows,budget,series,valueAt){if(budget-2<2*series.length)return evenlySpacedIndexes(rows,budget);const hasGaps=series.some(dataset=>{for(let row=1;row<rows-1;row++){const value=valueAt(row,dataset);if(typeof value!="number"||!Number.isFinite(value))return!0}return!1}),bucketCount=Math.floor((budget-2)/((hasGaps?3:2)*series.length));if(bucketCount<1)return evenlySpacedIndexes(rows,budget);const indexes=new Set([0,rows-1]);for(let bucket=0;bucket<bucketCount;bucket++){const start=1+Math.floor(bucket*(rows-2)/bucketCount),end=1+Math.floor((bucket+1)*(rows-2)/bucketCount);for(const dataset of series){let gap,min=1/0,max=-1/0,minIndex=start,maxIndex=start;for(let row=start;row<end;row++){const value=valueAt(row,dataset);if(typeof value!="number"||!Number.isFinite(value)){gap??=row;continue}value<min&&(min=value,minIndex=row),value>=max&&(max=value,maxIndex=row)}gap!==void 0&&indexes.add(gap),indexes.add(minIndex),indexes.add(maxIndex)}}for(const index of evenlySpacedIndexes(rows,budget)){if(indexes.size>=budget)break;indexes.add(index)}return[...indexes].sort((a,b)=>a-b)}export{MAX_RENDERED_CHART_RECORDS,normalizeChartRecordLimit,sampleChartTableIndexes};