@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,4 +1,4 @@
1
- import type{LyraOrientation,LyraToolStatus}from'../../../internal/shared-unions.js';import type{LyraVariant}from'../../../internal/variants.js';
1
+ import type{LyraGraphSourceSummary,LyraSourceBounds,LyraGraphOverview}from'../../../data-sources.js';import type{LyraOrientation,LyraToolStatus}from'../../../internal/shared-unions.js';import type{LyraVariant}from'../../../internal/variants.js';
2
2
  /** A named input/output connection point on a flow node. Collections retain the first valid
3
3
  * occurrence of each id; an unreadable optional label does not reserve that id. */
4
4
  export interface FlowHandle{readonly id:string;readonly label?:string;}
@@ -37,7 +37,9 @@ export interface FlowRunDecoration{readonly status:LyraToolStatus;readonly progr
37
37
  /** Finite, positive, sorted bounds actually used by the canvas. */
38
38
  readonly minZoom:number;readonly maxZoom:number;}
39
39
  /** Detached, deeply frozen state delivered to each companion observer. */
40
- export interface FlowStructureSnapshot{readonly nodes:readonly FlowStructureNodeSnapshot[];readonly edges:readonly FlowStructureEdgeSnapshot[];readonly viewport:FlowViewportSnapshot;
40
+ export interface FlowStructureSnapshot{
41
+ /** Accepted source-wide extent and optional complete overview; scene arrays remain bounded. */
42
+ readonly source?:Readonly<{coverage:'complete'|'neighborhood'|'aggregate';total:LyraGraphSourceSummary;worldBounds:LyraSourceBounds;overview:LyraGraphOverview|null;}>;readonly nodes:readonly FlowStructureNodeSnapshot[];readonly edges:readonly FlowStructureEdgeSnapshot[];readonly viewport:FlowViewportSnapshot;
41
43
  /** The canvas's `readonly` state. */
42
44
  readonly locked:boolean;readonly orientation:LyraOrientation;readonly layerGap:number;readonly nodeGap:number;}export interface FlowLayoutChangeDetail{readonly positions:Readonly<Record<string,Readonly<{x:number;y:number;}>>>;
43
45
  /** True when the configured layered-layout work ceiling omitted virtual ordering waypoints. */
@@ -0,0 +1 @@
1
+ class FlowViewportIndex{constructor(entries){this.leaves=new Map,this.entries=new Map,this.parents=new WeakMap,this.root=this.build(entries.map(({value,bounds},order)=>({value,order,...bounds})))}build(entries){if(!entries.length)return;const bounds={left:1/0,top:1/0,right:-1/0,bottom:-1/0};for(const entry of entries)bounds.left=Math.min(bounds.left,entry.left),bounds.top=Math.min(bounds.top,entry.top),bounds.right=Math.max(bounds.right,entry.right),bounds.bottom=Math.max(bounds.bottom,entry.bottom);if(entries.length<=8){const leaf={...bounds,entries};for(const entry of entries)this.entries.set(entry.value,entry),this.leaves.set(entry.value,leaf);return leaf}const horizontal=bounds.right-bounds.left>=bounds.bottom-bounds.top;entries.sort((a,b)=>horizontal?(a.left+a.right)/2-(b.left+b.right)/2:(a.top+a.bottom)/2-(b.top+b.bottom)/2);const middle=entries.length>>>1,branch={...bounds,first:this.build(entries.slice(0,middle)),second:this.build(entries.slice(middle))};return branch.first&&this.parents.set(branch.first,branch),branch.second&&this.parents.set(branch.second,branch),branch}update(value,bounds){const entry=this.entries.get(value);if(!entry)return;Object.assign(entry,bounds);let branch=this.leaves.get(value);for(;branch;){const children=branch.entries??[branch.first,branch.second];branch.left=1/0,branch.top=1/0,branch.right=-1/0,branch.bottom=-1/0;for(const child of children)branch.left=Math.min(branch.left,child.left),branch.top=Math.min(branch.top,child.top),branch.right=Math.max(branch.right,child.right),branch.bottom=Math.max(branch.bottom,child.bottom);branch=this.parents.get(branch)}}intersects(a,b){return a.right>=b.left&&a.left<=b.right&&a.bottom>=b.top&&a.top<=b.bottom}query(viewport){const found=[],visit=branch=>{if(!(!branch||!this.intersects(branch,viewport)))if(branch.entries)for(const entry of branch.entries)this.intersects(entry,viewport)&&found.push(entry);else visit(branch.first),visit(branch.second)};return visit(this.root),found.sort((a,b)=>a.order-b.order),found.map(entry=>entry.value)}}export{FlowViewportIndex};
@@ -4,19 +4,25 @@ import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from
4
4
  * a draggable viewport rectangle, for orientation and fast navigation on canvases larger than the
5
5
  * screen. Draws no edges (nodes only, matching the React Flow/n8n minimap convention) and never
6
6
  * reads `nodes` itself — geometry always comes from the canvas's `registerCompanion()` snapshots, so
7
- * the two can never disagree. The initial companion snapshot is silent; keyboard, map-click, and
7
+ * the two can never disagree. The complete node overview and moving viewport use separate SVG
8
+ * layers, so viewport-only updates retain the node layer. The initial companion snapshot is silent; keyboard, map-click, and
8
9
  * wheel viewport changes append their next rAF-coalesced snapshot to the document's shared
9
10
  * light-DOM polite sink, while a completed viewport drag appends its final position once.
10
11
  * Identical repeats remain distinct additions and `[part="live-region"]` stays an aria-hidden
11
12
  * mirror. A completed viewport drag consumes the browser-synthesized click that follows its
12
13
  * `pointerup`; canceled or lost-capture drags stay silent and leave the next genuine map click
13
14
  * available for click-to-center navigation.
15
+ * Source snapshots use exact global world bounds and bounded aggregate bins; scene nodes never
16
+ * stand in for the global overview. Missing overview data has a separate localized message.
17
+ * A zero-length world axis receives a centered one-unit display extent without changing its data.
14
18
  *
15
19
  * @customElement lr-flow-minimap
16
20
  * @csspart base - The root wrapper. Drops its floating-surface chrome (border, background,
17
21
  * radius) under `frame="plain"`.
18
22
  * @csspart map - The scaled SVG.
19
- * @csspart node - One rect per node.
23
+ * @csspart node - One rect per node in array mode.
24
+ * @csspart aggregate-bin - One provider aggregate rectangle in source mode.
25
+ * @csspart source-unavailable - Message when the source overview is unavailable.
20
26
  * @csspart viewport - The exact visible canvas-view rectangle.
21
27
  * @csspart viewport-hit-area - The transparent, draggable/focusable interaction rectangle, floored
22
28
  * to the shared hit-area size without changing the visible viewport geometry.
@@ -56,4 +62,4 @@ label:string;
56
62
  * frame isn't doubled. The map's own hover/click affordances and the viewport rect stay either
57
63
  * way -- only the outer `[part="base"]` decoration goes. Mirrors `lr-flow-controls`'/
58
64
  * `lr-flow-run-status`'s identical `frame`. */
59
- frame:LyraFrame;private snapshot;private liveText;private readonly announcements;private canvasEl?;private unsubscribe?;private dragState?;private dragEventWindow?;private justDraggedViewport;private announceNextSnapshot;private viewportMinSizePx;private baseBorderPx;private readonly instructionsId;private readonly companionController;connectedCallback():void;private refreshViewportMetrics;disconnectedCallback():void;adoptedCallback():void;private announceViewport;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private attachCanvas;private cancelViewportDrag;private contentBounds;private mapSizePx;private viewportRectContent;private clientToContentPoint;private onMapClick;private onMapWheel;private onViewportPointerDown;private onViewportPointerMove;private onViewportPointerUp;private detachViewportDragListeners;private onViewportKeyDown;private renderNodes;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-flow-minimap':LyraFlowMinimap;}}
65
+ frame:LyraFrame;private snapshot;private liveText;private readonly announcements;private canvasEl?;private unsubscribe?;private companionGeneration;private dragState?;private dragEventWindow?;private geometryObserver?;private invalidateDragGeometry;private justDraggedViewport;private announceNextSnapshot;private viewportMinSizePx;private baseBorderPx;private readonly instructionsId;private readonly companionController;connectedCallback():void;private refreshViewportMetrics;disconnectedCallback():void;adoptedCallback():void;private announceViewport;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private attachCanvas;private cancelViewportDrag;private boundsNodes?;private cachedBounds?;private contentBounds;private mapSizePx;private viewportRectContent;private clientToContentPoint;private ownsEvent;private captureInteraction;private invokeCanvas;private onMapClick;private onMapWheel;private onViewportPointerDown;private onViewportPointerMove;private onViewportPointerUp;private detachViewportDragListeners;private onViewportKeyDown;private renderNodes;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-flow-minimap':LyraFlowMinimap;}}
@@ -1,4 +1,4 @@
1
- import{__decorate}from"tslib";import{html,svg,nothing}from"lit";import{property,state}from"lit/decorators.js";import{guard}from"lit/directives/guard.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel,nextId,srOnly}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-minimap.styles.js";import{LYRA_DEFAULT_flowMinimapInstructions,LYRA_DEFAULT_flowMinimapLabel,LYRA_DEFAULT_flowMinimapViewport,LYRA_DEFAULT_flowMinimapViewportChanged}from"../../../internal/default-strings/data.generated.js";function isFlowCanvasLike(element){const candidate=element;return typeof candidate.registerCompanion=="function"&&typeof candidate.setViewport=="function"&&typeof candidate.zoomIn=="function"&&typeof candidate.zoomOut=="function"&&typeof candidate.fit=="function"&&typeof candidate.readonly=="boolean"}const DEFAULT_VIEWPORT_MIN_SIZE_PX=40;class LyraFlowMinimap extends LyraElement{constructor(){super(...arguments),this.for="",this.label="",this.frame="card",this.snapshot=null,this.liveText="",this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.viewportMinSizePx=DEFAULT_VIEWPORT_MIN_SIZE_PX,this.baseBorderPx=0,this.instructionsId=nextId("flow-minimap-instructions"),this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.onMapClick=e=>{if(this.justDraggedViewport){this.justDraggedViewport=!1;return}if(!this.canvasEl||!this.snapshot||this.canvasEl.readonly)return;const point=this.clientToContentPoint(e.currentTarget,e.clientX,e.clientY),{zoom,width,height}=this.snapshot.viewport;this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:width/2-point.x*zoom,y:height/2-point.y*zoom,zoom})},this.onMapWheel=e=>{!this.canvasEl||this.canvasEl.readonly||(e.preventDefault(),this.announceNextSnapshot=!0,e.deltaY<0?this.canvasEl.zoomIn():this.canvasEl.zoomOut())},this.onViewportPointerDown=e=>{const dragEventWindow=this.ownerDocument.defaultView;!this.canvasEl||!this.snapshot||!dragEventWindow||this.canvasEl.readonly||(e.stopPropagation(),this.detachViewportDragListeners(),this.justDraggedViewport=!1,this.dragState={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startViewport:{...this.snapshot.viewport},moved:!1},e.target.setPointerCapture?.(e.pointerId),this.dragEventWindow=dragEventWindow,dragEventWindow.addEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.addEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.addEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.addEventListener("lostpointercapture",this.onViewportPointerUp))},this.onViewportPointerMove=e=>{const drag=this.dragState;if(!drag||e.pointerId!==drag.pointerId)return;if(!this.canvasEl||this.canvasEl.readonly){this.cancelViewportDrag();return}const ctm=this.renderRoot.querySelector('[part="map"]')?.getScreenCTM();if(!ctm)return;const scale=ctm.a||1,dxContent=(e.clientX-drag.startClientX)/scale,dyContent=(e.clientY-drag.startClientY)/scale;dxContent===0&&dyContent===0||(drag.moved=!0,drag.latestViewport={x:drag.startViewport.x-dxContent*drag.startViewport.zoom,y:drag.startViewport.y-dyContent*drag.startViewport.zoom,zoom:drag.startViewport.zoom},this.canvasEl.setViewport(drag.latestViewport))},this.onViewportPointerUp=e=>{const drag=this.dragState;!drag||e.pointerId!==drag.pointerId||(this.justDraggedViewport=e.type==="pointerup"&&drag.moved,this.justDraggedViewport&&drag.latestViewport&&!this.canvasEl?.readonly&&this.announceViewport(drag.latestViewport),this.dragState=void 0,this.detachViewportDragListeners())},this.onViewportKeyDown=e=>{if(!this.canvasEl||!this.snapshot||this.canvasEl.readonly)return;if(e.key==="+"||e.key==="="){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.zoomIn();return}if(e.key==="-"||e.key==="_"){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.zoomOut();return}if(e.key==="Enter"||e.key==="Home"){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.fit();return}const{x,y,zoom,width,height}=this.snapshot.viewport,stepX=width*.1,stepY=height*.1;e.key==="ArrowRight"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:x-stepX,y,zoom})):e.key==="ArrowLeft"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:x+stepX,y,zoom})):e.key==="ArrowDown"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x,y:y-stepY,zoom})):e.key==="ArrowUp"&&(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x,y:y+stepY,zoom}))}}static{this.defaultStrings={...super.defaultStrings,flowMinimapInstructions:LYRA_DEFAULT_flowMinimapInstructions,flowMinimapLabel:LYRA_DEFAULT_flowMinimapLabel,flowMinimapViewport:LYRA_DEFAULT_flowMinimapViewport,flowMinimapViewportChanged:LYRA_DEFAULT_flowMinimapViewportChanged}}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.companionController.connect()}refreshViewportMetrics(){const view=this.ownerDocument?.defaultView;if(!view||!this.isConnected)return;const computed=view.getComputedStyle(this),minSize=resolveCssTokenLength(computed.getPropertyValue("--lr-flow-minimap-viewport-min-size").trim()||computed.getPropertyValue("--lr-icon-button-size").trim(),{host:this});this.viewportMinSizePx=minSize!==void 0&&Number.isFinite(minSize)&&minSize>=0?minSize:DEFAULT_VIEWPORT_MIN_SIZE_PX;const border=resolveCssTokenLength(computed.getPropertyValue("--lr-border-width-thin").trim(),{host:this});this.baseBorderPx=border!==void 0&&Number.isFinite(border)&&border>=0?border:0}disconnectedCallback(){super.disconnectedCallback(),this.announceNextSnapshot=!1,this.liveText="",this.companionController.disconnect()}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.companionController.adopt()}announceViewport(viewport){const number=getNumberFormat(this.effectiveLocale,{maximumFractionDigits:0}),percent=getNumberFormat(this.effectiveLocale,{style:"percent",maximumFractionDigits:1}),text=this.localize("flowMinimapViewportChanged",void 0,{x:number.format(viewport.x),y:number.format(viewport.y),zoom:percent.format(viewport.zoom)});this.liveText=text,this.announcements.announcePolite(text)}willUpdate(changed){super.willUpdate(changed);const previous=changed.get("snapshot");(changed.size!==1||previous?.nodes!==this.snapshot?.nodes)&&this.refreshViewportMetrics(),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged()}updated(changed){super.updated(changed);const base=this.renderRoot.querySelector('[part~="base"]')??void 0;syncAriaDescribedByElements(this,base,this.getAttribute("aria-describedby"))}attachCanvas(canvas){this.cancelViewportDrag(),this.unsubscribe?.(),this.unsubscribe=void 0,this.snapshot=null,this.canvasEl=canvas??void 0,canvas&&(this.unsubscribe=canvas.registerCompanion(snapshot=>{!this.isConnected||this.canvasEl!==canvas||(this.snapshot=snapshot,snapshot.locked&&this.cancelViewportDrag(),this.announceNextSnapshot&&(this.announceNextSnapshot=!1,this.announceViewport(snapshot.viewport)))}))}cancelViewportDrag(){this.dragState=void 0,this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.detachViewportDragListeners()}contentBounds(){const nodes=this.snapshot?.nodes??[];if(nodes.length===0)return{minX:0,minY:0,maxX:1,maxY:1};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const n of nodes)minX=Math.min(minX,n.x),minY=Math.min(minY,n.y),maxX=Math.max(maxX,n.x+n.width),maxY=Math.max(maxY,n.y+n.height);return{minX,minY,maxX,maxY}}mapSizePx(){const inset=2*this.baseBorderPx;return{width:Math.max(0,this.clientWidth-inset),height:Math.max(0,this.clientHeight-inset)}}viewportRectContent(viewBoxWidth,viewBoxHeight,minimumPhysicalSize=this.viewportMinSizePx){const vp=this.snapshot?.viewport;if(!vp||vp.zoom===0)return{x:0,y:0,width:0,height:0};const x=-vp.x/vp.zoom,y=-vp.y/vp.zoom,width=vp.width/vp.zoom,height=vp.height/vp.zoom,map=this.mapSizePx(),scale=map.width>0&&map.height>0&&viewBoxWidth>0&&viewBoxHeight>0?Math.min(map.width/viewBoxWidth,map.height/viewBoxHeight):0,floor=scale>0?minimumPhysicalSize/scale:0;if(!Number.isFinite(floor)||floor<=0)return{x,y,width,height};const flooredWidth=Math.max(width,floor),flooredHeight=Math.max(height,floor);return{x:x-(flooredWidth-width)/2,y:y-(flooredHeight-height)/2,width:flooredWidth,height:flooredHeight}}clientToContentPoint(svgEl,clientX,clientY){const ctm=svgEl.getScreenCTM();if(!ctm)return{x:0,y:0};const pt=svgEl.createSVGPoint();pt.x=clientX,pt.y=clientY;const transformed=pt.matrixTransform(ctm.inverse());return{x:transformed.x,y:transformed.y}}detachViewportDragListeners(){const dragEventWindow=this.dragEventWindow;dragEventWindow&&(dragEventWindow.removeEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.removeEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.removeEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.removeEventListener("lostpointercapture",this.onViewportPointerUp),this.dragEventWindow=void 0)}renderNodes(){return svg`${(this.snapshot?.nodes??[]).map(n=>svg`<rect part="node" data-status=${n.status??nothing} x=${n.x} y=${n.y} width=${n.width} height=${n.height} rx="2"></rect>`)}`}render(){const label=hostAriaLabel(this)??(this.label||this.localize("flowMinimapLabel"));if(!this.canvasEl||!this.snapshot)return html`<div part="base" aria-hidden="true"></div>`;const bounds=this.contentBounds(),padding=20,vbX=bounds.minX-padding,vbY=bounds.minY-padding,vbW=Math.max(1,bounds.maxX-bounds.minX+padding*2),vbH=Math.max(1,bounds.maxY-bounds.minY+padding*2),viewportRect=this.viewportRectContent(vbW,vbH,0),viewportHitRect=this.viewportRectContent(vbW,vbH),locked=this.snapshot.locked||this.canvasEl.readonly;return html`<div
1
+ import{__decorate}from"tslib";import{html,svg,nothing}from"lit";import{property,state}from"lit/decorators.js";import{guard}from"lit/directives/guard.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel,nextId,srOnly}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-minimap.styles.js";import{LYRA_DEFAULT_flowMinimapInstructions,LYRA_DEFAULT_flowMinimapLabel,LYRA_DEFAULT_flowMinimapSourceUnavailable,LYRA_DEFAULT_flowMinimapViewport,LYRA_DEFAULT_flowMinimapViewportChanged}from"../../../internal/default-strings/data.generated.js";function isFlowCanvasLike(element){const candidate=element;return typeof candidate.registerCompanion=="function"&&typeof candidate.setViewport=="function"&&typeof candidate.zoomIn=="function"&&typeof candidate.zoomOut=="function"&&typeof candidate.fit=="function"&&typeof candidate.readonly=="boolean"}function sameSourceBounds(left,right){const a=left?.source?.worldBounds,b=right?.source?.worldBounds;return a===b||!!a&&!!b&&a.x===b.x&&a.y===b.y&&a.width===b.width&&a.height===b.height}const DEFAULT_VIEWPORT_MIN_SIZE_PX=40;class LyraFlowMinimap extends LyraElement{constructor(){super(...arguments),this.for="",this.label="",this.frame="card",this.snapshot=null,this.liveText="",this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.companionGeneration=0,this.invalidateDragGeometry=()=>{this.dragState&&(this.dragState.geometryDirty=!0)},this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.viewportMinSizePx=DEFAULT_VIEWPORT_MIN_SIZE_PX,this.baseBorderPx=0,this.instructionsId=nextId("flow-minimap-instructions"),this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.onMapClick=e=>{if(!this.ownsEvent(e))return;if(this.justDraggedViewport){this.justDraggedViewport=!1;return}const action=this.captureInteraction(e);if(!action)return;const point=this.clientToContentPoint(e.currentTarget,e.clientX,e.clientY);if(!action.current())return;const{zoom,width,height}=action.snapshot.viewport;this.invokeCanvas(action,"setViewport",[{x:width/2-point.x*zoom,y:height/2-point.y*zoom,zoom}])},this.onMapWheel=e=>{const action=this.captureInteraction(e);action&&(e.preventDefault(),this.invokeCanvas(action,e.deltaY<0?"zoomIn":"zoomOut"))},this.onViewportPointerDown=e=>{const action=this.captureInteraction(e);if(!action)return;const dragEventWindow=this.ownerDocument.defaultView;if(!dragEventWindow)return;const svgEl=e.currentTarget?.ownerSVGElement??this.renderRoot.querySelector('[part="map"]'),ctm=svgEl?.getScreenCTM();if(!ctm||!svgEl||!action.current())return;const inverse=ctm.inverse();if(!action.current())return;const captureTarget=e.target,capture=captureTarget.setPointerCapture;action.current()&&(capture&&Reflect.apply(capture,captureTarget,[e.pointerId]),action.current()&&(e.stopPropagation(),this.detachViewportDragListeners(),this.justDraggedViewport=!1,this.dragState={canvas:action.canvas,generation:this.companionGeneration,pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startViewport:{...action.snapshot.viewport},moved:!1,inverse,svg:svgEl,geometryDirty:!1},this.dragEventWindow=dragEventWindow,dragEventWindow.addEventListener("resize",this.invalidateDragGeometry),dragEventWindow.addEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.addEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.addEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.addEventListener("lostpointercapture",this.onViewportPointerUp)))},this.onViewportPointerMove=e=>{const drag=this.dragState;if(!drag||e.pointerId!==drag.pointerId)return;const action=this.captureInteraction();if(!action||this.dragState!==drag||action.canvas!==drag.canvas||this.companionGeneration!==drag.generation){this.dragState===drag&&this.cancelViewportDrag();return}if(drag.geometryDirty){const ctm=drag.svg.getScreenCTM();if(!ctm||!action.current()||this.dragState!==drag)return;const inverse=ctm.inverse();if(!action.current()||this.dragState!==drag)return;drag.inverse=inverse,drag.geometryDirty=!1}const dx=e.clientX-drag.startClientX,dy=e.clientY-drag.startClientY,dxContent=drag.inverse.a*dx+drag.inverse.c*dy,dyContent=drag.inverse.b*dx+drag.inverse.d*dy;dxContent===0&&dyContent===0||(drag.moved=!0,drag.latestViewport={x:drag.startViewport.x-dxContent*drag.startViewport.zoom,y:drag.startViewport.y-dyContent*drag.startViewport.zoom,zoom:drag.startViewport.zoom},this.invokeCanvas(action,"setViewport",[drag.latestViewport],!1))},this.onViewportPointerUp=e=>{const drag=this.dragState;if(!drag||e.pointerId!==drag.pointerId)return;const action=this.captureInteraction();if(!action||this.dragState!==drag||action.canvas!==drag.canvas||this.companionGeneration!==drag.generation){this.dragState===drag&&this.cancelViewportDrag();return}this.justDraggedViewport=e.type==="pointerup"&&drag.moved,this.justDraggedViewport&&drag.latestViewport&&action.current()&&this.announceViewport(drag.latestViewport),this.dragState=void 0,this.detachViewportDragListeners()},this.onViewportKeyDown=e=>{const action=this.captureInteraction(e);if(!action)return;if(e.key==="+"||e.key==="="){e.preventDefault(),this.invokeCanvas(action,"zoomIn");return}if(e.key==="-"||e.key==="_"){e.preventDefault(),this.invokeCanvas(action,"zoomOut");return}if(e.key==="Enter"||e.key==="Home"){e.preventDefault(),this.invokeCanvas(action,"fit");return}const{x,y,zoom,width,height}=action.snapshot.viewport,stepX=width*.1,stepY=height*.1;e.key==="ArrowRight"?(e.preventDefault(),this.invokeCanvas(action,"setViewport",[{x:x-stepX,y,zoom}])):e.key==="ArrowLeft"?(e.preventDefault(),this.invokeCanvas(action,"setViewport",[{x:x+stepX,y,zoom}])):e.key==="ArrowDown"?(e.preventDefault(),this.invokeCanvas(action,"setViewport",[{x,y:y-stepY,zoom}])):e.key==="ArrowUp"&&(e.preventDefault(),this.invokeCanvas(action,"setViewport",[{x,y:y+stepY,zoom}]))}}static{this.defaultStrings={...super.defaultStrings,flowMinimapInstructions:LYRA_DEFAULT_flowMinimapInstructions,flowMinimapLabel:LYRA_DEFAULT_flowMinimapLabel,flowMinimapSourceUnavailable:LYRA_DEFAULT_flowMinimapSourceUnavailable,flowMinimapViewport:LYRA_DEFAULT_flowMinimapViewport,flowMinimapViewportChanged:LYRA_DEFAULT_flowMinimapViewportChanged}}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.companionController.connect();const Observer=this.ownerDocument.defaultView?.ResizeObserver;this.geometryObserver=Observer?new Observer(this.invalidateDragGeometry):void 0,this.geometryObserver?.observe(this)}refreshViewportMetrics(){const view=this.ownerDocument?.defaultView;if(!view||!this.isConnected)return;const computed=view.getComputedStyle(this),minSize=resolveCssTokenLength(computed.getPropertyValue("--lr-flow-minimap-viewport-min-size").trim()||computed.getPropertyValue("--lr-icon-button-size").trim(),{host:this});this.viewportMinSizePx=minSize!==void 0&&Number.isFinite(minSize)&&minSize>=0?minSize:DEFAULT_VIEWPORT_MIN_SIZE_PX;const border=resolveCssTokenLength(computed.getPropertyValue("--lr-border-width-thin").trim(),{host:this});this.baseBorderPx=border!==void 0&&Number.isFinite(border)&&border>=0?border:0}disconnectedCallback(){super.disconnectedCallback(),this.announceNextSnapshot=!1,this.liveText="",this.companionController.disconnect(),this.geometryObserver?.disconnect(),this.geometryObserver=void 0}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.companionController.adopt()}announceViewport(viewport){const number=getNumberFormat(this.effectiveLocale,{maximumFractionDigits:0}),percent=getNumberFormat(this.effectiveLocale,{style:"percent",maximumFractionDigits:1}),text=this.localize("flowMinimapViewportChanged",void 0,{x:number.format(viewport.x),y:number.format(viewport.y),zoom:percent.format(viewport.zoom)});this.liveText=text,this.announcements.announcePolite(text)}willUpdate(changed){super.willUpdate(changed);const previous=changed.get("snapshot");(changed.size!==1||previous?.nodes!==this.snapshot?.nodes||!sameSourceBounds(previous,this.snapshot))&&(this.refreshViewportMetrics(),this.invalidateDragGeometry()),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged()}updated(changed){super.updated(changed);const base=this.renderRoot.querySelector('[part~="base"]')??void 0;syncAriaDescribedByElements(this,base,this.getAttribute("aria-describedby"))}attachCanvas(canvas){const generation=++this.companionGeneration;this.cancelViewportDrag(),this.unsubscribe?.(),this.unsubscribe=void 0,this.snapshot=null,this.canvasEl=canvas??void 0,canvas&&(this.unsubscribe=canvas.registerCompanion(snapshot=>{!this.isConnected||this.canvasEl!==canvas||generation!==this.companionGeneration||(sameSourceBounds(this.snapshot,snapshot)||this.cancelViewportDrag(),this.snapshot=snapshot,snapshot.locked&&this.cancelViewportDrag(),this.announceNextSnapshot&&(this.announceNextSnapshot=!1,this.announceViewport(snapshot.viewport)))}))}cancelViewportDrag(){this.dragState=void 0,this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.detachViewportDragListeners()}contentBounds(){const world=this.snapshot?.source?.worldBounds;if(world)return{minX:world.x,minY:world.y,maxX:world.x+world.width,maxY:world.y+world.height};const nodes=this.snapshot?.nodes??[];if(this.boundsNodes===nodes&&this.cachedBounds)return this.cachedBounds;if(this.boundsNodes=nodes,nodes.length===0)return this.cachedBounds={minX:0,minY:0,maxX:1,maxY:1};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const n of nodes)minX=Math.min(minX,n.x),minY=Math.min(minY,n.y),maxX=Math.max(maxX,n.x+n.width),maxY=Math.max(maxY,n.y+n.height);return this.cachedBounds={minX,minY,maxX,maxY}}mapSizePx(){const inset=2*this.baseBorderPx;return{width:Math.max(0,this.clientWidth-inset),height:Math.max(0,this.clientHeight-inset)}}viewportRectContent(viewBoxWidth,viewBoxHeight,minimumPhysicalSize=this.viewportMinSizePx){const vp=this.snapshot?.viewport;if(!vp||vp.zoom===0)return{x:0,y:0,width:0,height:0};const x=-vp.x/vp.zoom,y=-vp.y/vp.zoom,width=vp.width/vp.zoom,height=vp.height/vp.zoom,map=this.mapSizePx(),scale=map.width>0&&map.height>0&&viewBoxWidth>0&&viewBoxHeight>0?Math.min(map.width/viewBoxWidth,map.height/viewBoxHeight):0,floor=scale>0?minimumPhysicalSize/scale:0;if(!Number.isFinite(floor)||floor<=0)return{x,y,width,height};const flooredWidth=Math.max(width,floor),flooredHeight=Math.max(height,floor);return{x:x-(flooredWidth-width)/2,y:y-(flooredHeight-height)/2,width:flooredWidth,height:flooredHeight}}clientToContentPoint(svgEl,clientX,clientY){const ctm=svgEl.getScreenCTM();if(!ctm)return{x:0,y:0};const pt=svgEl.createSVGPoint();pt.x=clientX,pt.y=clientY;const transformed=pt.matrixTransform(ctm.inverse());return{x:transformed.x,y:transformed.y}}ownsEvent(event){const target=event.currentTarget;return this.isConnected&&!!target&&this.renderRoot.contains(target)}captureInteraction(event){const canvas=this.canvasEl,snapshot=this.snapshot,generation=this.companionGeneration;if(!canvas||!snapshot)return;const current=()=>this.isConnected&&this.canvasEl===canvas&&this.companionGeneration===generation&&this.snapshot===snapshot&&(!event||this.ownsEvent(event));if(!current())return;const locked=canvas.readonly;if(!(!current()||locked||snapshot.locked))return{canvas,snapshot,current}}invokeCanvas(action,method,args=[],announce=!0){if(!action.current())return;const callback=action.canvas[method];!action.current()||typeof callback!="function"||(announce&&(this.announceNextSnapshot=!0),Reflect.apply(callback,action.canvas,args))}detachViewportDragListeners(){const dragEventWindow=this.dragEventWindow;dragEventWindow&&(dragEventWindow.removeEventListener("resize",this.invalidateDragGeometry),dragEventWindow.removeEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.removeEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.removeEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.removeEventListener("lostpointercapture",this.onViewportPointerUp),this.dragEventWindow=void 0)}renderNodes(){const source=this.snapshot?.source;return source?svg`${(source.overview?.bins??[]).map(bin=>svg`<rect part="aggregate-bin" x=${bin.bounds.x} y=${bin.bounds.y} width=${bin.bounds.width} height=${bin.bounds.height}></rect>`)}`:svg`${(this.snapshot?.nodes??[]).map(n=>svg`<rect part="node" data-status=${n.status??nothing} x=${n.x} y=${n.y} width=${n.width} height=${n.height} rx="2"></rect>`)}`}render(){const label=hostAriaLabel(this)??(this.label||this.localize("flowMinimapLabel"));if(!this.canvasEl||!this.snapshot)return html`<div part="base" aria-hidden="true"></div>`;const bounds=this.contentBounds(),source=this.snapshot.source,padding=source?0:20,vbX=bounds.minX-padding-(source&&source.worldBounds.width===0?.5:0),vbY=bounds.minY-padding-(source&&source.worldBounds.height===0?.5:0),vbW=source?source.worldBounds.width||1:Math.max(1,bounds.maxX-bounds.minX+padding*2),vbH=source?source.worldBounds.height||1:Math.max(1,bounds.maxY-bounds.minY+padding*2),viewportRect=this.viewportRectContent(vbW,vbH,0),viewportHitRect=this.viewportRectContent(vbW,vbH),locked=this.snapshot.locked||this.canvasEl.readonly;return html`<div
2
2
  part="base"
3
3
  role="region"
4
4
  aria-label=${label}
@@ -12,7 +12,15 @@ import{__decorate}from"tslib";import{html,svg,nothing}from"lit";import{property,
12
12
  @click=${this.onMapClick}
13
13
  @wheel=${this.onMapWheel}
14
14
  >
15
- ${guard([this.snapshot.nodes],()=>this.renderNodes())}
15
+ ${guard([source?source.overview:this.snapshot.nodes,!!source],()=>this.renderNodes())}
16
+ </svg>
17
+ <svg
18
+ class="viewport-layer"
19
+ viewBox="${vbX} ${vbY} ${vbW} ${vbH}"
20
+ preserveAspectRatio="xMidYMid meet"
21
+ @click=${this.onMapClick}
22
+ @wheel=${this.onMapWheel}
23
+ >
16
24
  <g data-viewport-control>
17
25
  <rect
18
26
  part="viewport"
@@ -39,6 +47,7 @@ import{__decorate}from"tslib";import{html,svg,nothing}from"lit";import{property,
39
47
  ></rect>
40
48
  </g>
41
49
  </svg>
50
+ ${source&&!source.overview?html`<div part="source-unavailable">${this.localize("flowMinimapSourceUnavailable")}</div>`:nothing}
42
51
  <div part="instructions" class="sr-only" id=${this.instructionsId}>
43
52
  ${this.localize("flowMinimapInstructions")}
44
53
  </div>
@@ -1 +1 @@
1
- import{focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";import{flowStatusPaint}from"../flow-canvas/flow-status.styles.js";const styles=css` ${flowStatusPaint} :host { display: block; inline-size: var(--lr-flow-minimap-inline-size, var(--lr-size-12rem)); block-size: var(--lr-flow-minimap-block-size, var(--lr-size-8rem)); } [part='base'] { inline-size: 100%; block-size: 100%; border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius); background: var(--lr-color-surface); overflow: hidden; } :host([frame='plain']) [part='base'] { border: 0; border-radius: 0; background: transparent; } [part='map'] { display: block; inline-size: 100%; block-size: 100%; cursor: pointer; transition: background-color var(--lr-transition-fast); } [part='map']:hover { background: var(--lr-color-brand-quiet); } [part='map']:active { background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='base'][data-locked] [part='map'] { cursor: default; } [part='base'][data-locked] [part='map']:hover, [part='base'][data-locked] [part='map']:active { background: transparent; } [part='node'] { fill: var(--_lr-flow-status-paint, var(--lr-flow-status-color, var(--lr-color-border-strong))); } [part='viewport'] { --_lr-flow-minimap-viewport: var(--lr-flow-minimap-viewport-color, var(--lr-color-brand)); fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 15%, transparent); stroke: var(--_lr-flow-minimap-viewport); stroke-width: 2; pointer-events: none; } [part='viewport-hit-area'] { fill: transparent; stroke: transparent; pointer-events: all; cursor: grab; } [data-viewport-control]:hover [part='viewport'] { fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 25%, transparent); stroke-width: 3; } [data-viewport-control]:has([part='viewport-hit-area']:active) [part='viewport'] { fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 40%, transparent); stroke-width: 4; } [part='viewport-hit-area']:active { cursor: grabbing; } [part='viewport-hit-area']:focus-visible { ${focusRing} } [part='base'][data-locked] [part='viewport-hit-area'] { cursor: default; pointer-events: none; } [part='base'][data-locked] [data-viewport-control]:hover [part='viewport'] { fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 15%, transparent); stroke-width: 2; } `;export{styles};
1
+ import{focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";import{flowStatusPaint}from"../flow-canvas/flow-status.styles.js";const styles=css` ${flowStatusPaint} :host { display: block; inline-size: var(--lr-flow-minimap-inline-size, var(--lr-size-12rem)); block-size: var(--lr-flow-minimap-block-size, var(--lr-size-8rem)); } [part='base'] { position: relative; inline-size: 100%; block-size: 100%; border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius); background: var(--lr-color-surface); overflow: hidden; } :host([frame='plain']) [part='base'] { border: 0; border-radius: 0; background: transparent; } [part='map'], .viewport-layer { transform: translateZ(0); } .viewport-layer { position: absolute; inset: 0; inline-size: 100%; block-size: 100%; pointer-events: none; } [part='map'] { display: block; inline-size: 100%; block-size: 100%; cursor: pointer; transition: background-color var(--lr-transition-fast); } [part='map']:hover, [part='base']:hover [part='map'] { background: var(--lr-color-brand-quiet); } [part='map']:active, [part='base']:active [part='map'] { background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='base'][data-locked] [part='map'] { cursor: default; } [part='base'][data-locked] [part='map']:hover, [part='base'][data-locked] [part='map']:active, [part='base'][data-locked]:hover [part='map'], [part='base'][data-locked]:active [part='map'] { background: transparent; } [part='node'] { fill: var(--_lr-flow-status-paint, var(--lr-flow-status-color, var(--lr-color-border-strong))); } [part='aggregate-bin'] { fill: var(--lr-color-brand-quiet); stroke: var(--lr-color-border-strong); vector-effect: non-scaling-stroke; } [part='source-unavailable'] { position: absolute; inset-inline: var(--lr-space-s); inset-block-end: var(--lr-space-s); color: var(--lr-color-text); background: var(--lr-color-surface); font-size: var(--lr-font-size-xs); overflow-wrap: anywhere; pointer-events: none; } [part='viewport'] { --_lr-flow-minimap-viewport: var(--lr-flow-minimap-viewport-color, var(--lr-color-brand)); fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 15%, transparent); stroke: var(--_lr-flow-minimap-viewport); stroke-width: 2; pointer-events: none; } [part='viewport-hit-area'] { fill: transparent; stroke: transparent; pointer-events: all; cursor: grab; } [data-viewport-control]:hover [part='viewport'] { fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 25%, transparent); stroke-width: 3; } [data-viewport-control]:has([part='viewport-hit-area']:active) [part='viewport'] { fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 40%, transparent); stroke-width: 4; } [part='viewport-hit-area']:active { cursor: grabbing; } [part='viewport-hit-area']:focus-visible { ${focusRing} } [part='base'][data-locked] [part='viewport-hit-area'] { cursor: default; pointer-events: none; } [part='base'][data-locked] [data-viewport-control]:hover [part='viewport'] { fill: color-mix(in srgb, var(--_lr-flow-minimap-viewport) 15%, transparent); stroke-width: 2; } `;export{styles};
@@ -33,7 +33,10 @@ readonly color?:string;}
33
33
  * - A comparison series of a different length pairs by index: extra comparison entries are
34
34
  * ignored, and stages past its end simply get no comparison bar.
35
35
  * - Malformed/non-record entries and records without a string `label` are omitted while later
36
- * valid neighbors remain in either series; caller-owned arrays are never rewritten.
36
+ * valid neighbors remain in either series; caller-owned arrays are never rewritten. Long invalid
37
+ * runs are inspected in cancelable chunks. The previous completed view remains aria-busy until
38
+ * both new series are ready; disconnecting or explicit refresh revokes unfinished work. Keep
39
+ * pending source arrays and records unchanged, or reassign/explicitly refresh to restart them.
37
40
  * - At most 500 valid stages render, each as its own bar row; a `stages` array past that length
38
41
  * renders a localized `[part="limit"]` notice after the list rather than mounting an unbounded
39
42
  * number of bars. Every stage's share is still measured against the true first stage regardless
@@ -64,7 +67,8 @@ readonly color?:string;}
64
67
  * @since 12.0.0
65
68
  */
66
69
  export declare class LyraFunnel extends LyraElement{static styles:import("lit").CSSResultGroup[];
67
- /** The ordered stages, first to last. Every share is measured against the first entry. */
70
+ /** The ordered stages, first to last. Every share is measured against the first entry.
71
+ * Reassign after changes, or call `requestUpdate()` after mutating the existing array. */
68
72
  stages:readonly LyraFunnelStage[];
69
73
  /**
70
74
  * An optional baseline/peer cohort drawn behind each bar as an outline. It is normalized to its
@@ -79,4 +83,4 @@ label:string;
79
83
  /** Omits the change from the previous stage that is otherwise rendered above each later stage. */
80
84
  withoutDropoff:boolean;
81
85
  /** Fraction digits used for every share and drop-off percentage. */
82
- sharePrecision:number;private get precision();private formatValue;private formatShare;private validStages;private resolveStages;private barLength;private changeText;private renderStage;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-funnel':LyraFunnel;}}
86
+ sharePrecision:number;private get precision();private formatValue;private formatShare;private stagesMemo?;private readonly stageScans;private completedStages;private cancelStageScans;requestUpdate(name?:PropertyKey,oldValue?:unknown,options?:Parameters<LyraElement['requestUpdate']>[2]):void;disconnectedCallback():void;connectedCallback():void;private get scanningStages();private continueStageScan;private validStages;private resolveStages;private computeStages;private barLength;private changeText;private renderStage;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-funnel':LyraFunnel;}}
@@ -1,4 +1,4 @@
1
- import{__decorate}from"tslib";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{chartValueFractionDigits}from"../../charts/chart/chart-number-format.js";import{finiteInteger,finiteNumber}from"../../../internal/numbers.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{styles}from"./funnel.styles.js";import{LYRA_DEFAULT_funnelComparisonShare,LYRA_DEFAULT_funnelDropoffDecreased,LYRA_DEFAULT_funnelDropoffIncreased,LYRA_DEFAULT_funnelStagesLimit,LYRA_DEFAULT_trendUnchanged}from"../../../internal/default-strings/data.generated.js";import{LYRA_DEFAULT_chart,LYRA_DEFAULT_comparePanel,LYRA_DEFAULT_noData}from"../../../internal/default-strings/shared.generated.js";const MAX_SHARE_PRECISION=20,MAX_RENDERED_STAGES=500;class LyraFunnel extends LyraElement{constructor(){super(...arguments),this.stages=[],this.comparison=[],this.comparisonLabel="",this.label="",this.withoutDropoff=!1,this.sharePrecision=0}static{this.defaultStrings={...super.defaultStrings,chart:LYRA_DEFAULT_chart,comparePanel:LYRA_DEFAULT_comparePanel,funnelComparisonShare:LYRA_DEFAULT_funnelComparisonShare,funnelDropoffDecreased:LYRA_DEFAULT_funnelDropoffDecreased,funnelDropoffIncreased:LYRA_DEFAULT_funnelDropoffIncreased,funnelStagesLimit:LYRA_DEFAULT_funnelStagesLimit,noData:LYRA_DEFAULT_noData,trendUnchanged:LYRA_DEFAULT_trendUnchanged}}static{this.styles=[LyraElement.styles,styles]}get precision(){return finiteInteger(this.sharePrecision,0,0,MAX_SHARE_PRECISION)}formatValue(value){return getNumberFormat(this.effectiveLocale,{maximumFractionDigits:chartValueFractionDigits(value)}).format(value)}formatShare(ratio){const precision=this.precision,percent=Math.abs(ratio)*100,digits=percent>0&&percent<.5*10**-precision?Math.min(20,-Math.floor(Math.log10(percent))):precision;return getNumberFormat(this.effectiveLocale,{style:"percent",minimumFractionDigits:precision,maximumFractionDigits:digits}).format(ratio)}validStages(value){if(!Array.isArray(value))return[];const stages=[];for(let index=0;index<value.length;index+=1)try{const stage=value[index];if(!stage||typeof stage!="object"||Array.isArray(stage))continue;const record=stage;if(typeof record.label!="string")continue;stages.push(Object.freeze({label:record.label,value:typeof record.value=="number"?finiteNumber(record.value,0):0,...typeof record.color=="string"?{color:record.color}:{}}))}catch{}return stages}resolveStages(){const stages=this.validStages(this.stages),comparison=this.validStages(this.comparison),values=stages.map(stage=>finiteNumber(stage.value,0)),base=values[0]??0,hasBase=base>0,comparisonValues=comparison.map(stage=>finiteNumber(stage.value,0)),comparisonBase=comparisonValues[0]??0,hasComparisonBase=comparisonBase>0;return stages.map((stage,index)=>{const value=values[index]??0,previous=values[index-1],comparisonValue=comparisonValues[index];return{stage,value,share:hasBase?value/base:null,change:index>0&&previous!==void 0&&previous>0?(value-previous)/previous:null,comparisonShare:hasComparisonBase&&comparisonValue!==void 0?comparisonValue/comparisonBase:null}})}barLength(share){return`${(share===null?0:finiteNumber(Math.min(1,Math.max(0,share)),0))*100}%`}changeText(change){return change===0?this.localize("trendUnchanged"):this.localize(change>0?"funnelDropoffIncreased":"funnelDropoffDecreased",void 0,{value:this.formatShare(Math.abs(change))})}renderStage(resolved){const{stage,value,share,change,comparisonShare}=resolved,barColor=sanitizeCssColor(stage.color),barPart=share!==null&&share>1?"bar bar-overflow":"bar",comparisonName=this.comparisonLabel||this.localize("comparePanel");return html`<li part="stage">
1
+ import{__decorate}from"tslib";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{chartValueFractionDigits}from"../../charts/chart/chart-number-format.js";import{finiteInteger,finiteNumber}from"../../../internal/numbers.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{styles}from"./funnel.styles.js";import{LYRA_DEFAULT_funnelComparisonShare,LYRA_DEFAULT_funnelDropoffDecreased,LYRA_DEFAULT_funnelDropoffIncreased,LYRA_DEFAULT_funnelStagesLimit,LYRA_DEFAULT_trendUnchanged}from"../../../internal/default-strings/data.generated.js";import{LYRA_DEFAULT_chart,LYRA_DEFAULT_comparePanel,LYRA_DEFAULT_noData}from"../../../internal/default-strings/shared.generated.js";const MAX_SHARE_PRECISION=20,MAX_RENDERED_STAGES=500;class LyraFunnel extends LyraElement{constructor(){super(...arguments),this.stages=[],this.comparison=[],this.comparisonLabel="",this.label="",this.withoutDropoff=!1,this.sharePrecision=0,this.stageScans=new Map,this.completedStages=[]}static{this.defaultStrings={...super.defaultStrings,chart:LYRA_DEFAULT_chart,comparePanel:LYRA_DEFAULT_comparePanel,funnelComparisonShare:LYRA_DEFAULT_funnelComparisonShare,funnelDropoffDecreased:LYRA_DEFAULT_funnelDropoffDecreased,funnelDropoffIncreased:LYRA_DEFAULT_funnelDropoffIncreased,funnelStagesLimit:LYRA_DEFAULT_funnelStagesLimit,noData:LYRA_DEFAULT_noData,trendUnchanged:LYRA_DEFAULT_trendUnchanged}}static{this.styles=[LyraElement.styles,styles]}get precision(){return finiteInteger(this.sharePrecision,0,0,MAX_SHARE_PRECISION)}formatValue(value){return getNumberFormat(this.effectiveLocale,{maximumFractionDigits:chartValueFractionDigits(value)}).format(value)}formatShare(ratio){const precision=this.precision,percent=Math.abs(ratio)*100,digits=percent>0&&percent<.5*10**-precision?Math.min(20,-Math.floor(Math.log10(percent))):precision;return getNumberFormat(this.effectiveLocale,{style:"percent",minimumFractionDigits:precision,maximumFractionDigits:digits}).format(ratio)}cancelStageScans(){for(const scan of this.stageScans?.values()??[])clearTimeout(scan.timer);this.stageScans?.clear(),this.stagesMemo=void 0}requestUpdate(name,oldValue,options){(name===void 0||name==="stages"||name==="comparison")&&this.cancelStageScans(),super.requestUpdate(name,oldValue,options)}disconnectedCallback(){this.cancelStageScans(),super.disconnectedCallback()}connectedCallback(){super.connectedCallback(),super.requestUpdate()}get scanningStages(){return[...this.stageScans.values()].some(scan=>!scan.done)}continueStageScan(scan){const end=Math.min(scan.length,scan.cursor+1e4);for(;scan.cursor<end&&scan.stages.length<=MAX_RENDERED_STAGES;scan.cursor++)try{const stage=scan.source[scan.cursor];if(!stage||typeof stage!="object"||Array.isArray(stage))continue;const record=stage;if(typeof record.label!="string")continue;scan.stages.push(Object.freeze({label:record.label,value:typeof record.value=="number"?finiteNumber(record.value,0):0,...typeof record.color=="string"?{color:record.color}:{}}))}catch{}scan.done=scan.cursor>=scan.length||scan.stages.length>MAX_RENDERED_STAGES,!scan.done&&this.isConnected&&(scan.timer=setTimeout(()=>{scan.timer=void 0,!(!this.isConnected||this.stageScans.get(scan.source)!==scan)&&(this.continueStageScan(scan),scan.done&&super.requestUpdate())},0))}validStages(value){if(!Array.isArray(value))return[];let scan=this.stageScans.get(value);return scan||(scan={source:value,stages:[],length:value.length,cursor:0,done:!1},this.stageScans.set(value,scan),this.continueStageScan(scan)),scan.stages}resolveStages(){const memo=this.stagesMemo;if(memo&&memo.stages===this.stages&&memo.comparison===this.comparison)return memo.result;const result=this.computeStages();return this.scanningStages?this.completedStages:(this.completedStages=result,this.stagesMemo={stages:this.stages,comparison:this.comparison,result},result)}computeStages(){const stages=this.validStages(this.stages),comparison=this.validStages(this.comparison),values=stages.map(stage=>finiteNumber(stage.value,0)),base=values[0]??0,hasBase=base>0,comparisonValues=comparison.map(stage=>finiteNumber(stage.value,0)),comparisonBase=comparisonValues[0]??0,hasComparisonBase=comparisonBase>0;return stages.map((stage,index)=>{const value=values[index]??0,previous=values[index-1],comparisonValue=comparisonValues[index];return{stage,value,share:hasBase?value/base:null,change:index>0&&previous!==void 0&&previous>0?(value-previous)/previous:null,comparisonShare:hasComparisonBase&&comparisonValue!==void 0?comparisonValue/comparisonBase:null}})}barLength(share){return`${(share===null?0:finiteNumber(Math.min(1,Math.max(0,share)),0))*100}%`}changeText(change){return change===0?this.localize("trendUnchanged"):this.localize(change>0?"funnelDropoffIncreased":"funnelDropoffDecreased",void 0,{value:this.formatShare(Math.abs(change))})}renderStage(resolved){const{stage,value,share,change,comparisonShare}=resolved,barColor=sanitizeCssColor(stage.color),barPart=share!==null&&share>1?"bar bar-overflow":"bar",comparisonName=this.comparisonLabel||this.localize("comparePanel");return html`<li part="stage">
2
2
  ${!this.withoutDropoff&&change!==null?html`<span part="dropoff">${this.changeText(change)}</span>`:nothing}
3
3
  <span part="stage-header">
4
4
  <span part="stage-label">${stage.label}</span>
@@ -18,7 +18,7 @@ import{__decorate}from"tslib";import{html,nothing}from"lit";import{property}from
18
18
  style=${styleMap({inlineSize:this.barLength(share),...barColor===void 0?{}:{backgroundColor:barColor}})}
19
19
  ></span>
20
20
  </span>
21
- </li>`}render(){const resolved=this.resolveStages();if(resolved.length===0)return html`<div part="base"><p part="empty">${this.localize("noData")}</p></div>`;const truncated=resolved.length>MAX_RENDERED_STAGES,renderedStages=resolved.slice(0,MAX_RENDERED_STAGES),name=hostAriaLabel(this)??(this.label||this.localize("chart"));return html`<div part="base">
21
+ </li>`}render(){const resolved=this.resolveStages();if(resolved.length===0)return html`<div part="base" aria-busy=${this.scanningStages?"true":"false"}>${this.scanningStages?nothing:html`<p part="empty">${this.localize("noData")}</p>`}</div>`;const truncated=resolved.length>MAX_RENDERED_STAGES,renderedStages=resolved.slice(0,MAX_RENDERED_STAGES),name=hostAriaLabel(this)??(this.label||this.localize("chart"));return html`<div part="base" aria-busy=${this.scanningStages?"true":"false"}>
22
22
  <ol part="stages" aria-label=${name}>
23
23
  ${renderedStages.map(entry=>this.renderStage(entry))}
24
24
  </ol>
@@ -42,7 +42,7 @@ export declare function parseIsoDate(iso:string):Date;
42
42
  * every other locale-derived string on the same canvas (weekday labels, formatted values) —
43
43
  * so a calendar's month and weekday labels never disagree on language.
44
44
  */
45
- export declare function buildCalendarGrid(days:readonly CalendarDay[],firstDayOfWeek?:number,monthLabelText?:(jsMonth:number,year:number)=>string|undefined,locale?:string):{cells:CalendarCell[];weekCount:number;firstWeekStart:Date;monthLabels:{week:number;label:string;}[];
45
+ export declare function buildCalendarGrid(days:readonly CalendarDay[],firstDayOfWeek?:number,monthLabelText?:(jsMonth:number,year:number)=>string|undefined,locale?:string,maxCells?:number):{cells:CalendarCell[];weekCount:number;firstWeekStart:Date;monthLabels:{week:number;label:string;}[];
46
46
  /** True when input cardinality or a sparse span exceeded the bounded projection. */
47
47
  truncated:boolean;};
48
48
  /** Splits `value`'s rank within `sorted` (ascending, pre-sorted by the caller) into `bucketCount` quartile-style buckets. */
@@ -1 +1 @@
1
- import{minMax}from"./heatmap-scale.js";import{resolveIntlLocale}from"../../../internal/intl-cache.js";const MS_PER_DAY=864e5,MAX_CALENDAR_INPUT_DAYS=1e4,MAX_CALENDAR_WEEKS=530;function parseIsoDate(iso){const[y=NaN,m=NaN,d=NaN]=iso.split("-").map(Number);return new Date(Date.UTC(y,m-1,d))}function isCalendarValid(iso,parsed){const[y=NaN,m=NaN,d=NaN]=iso.split("-").map(Number);return parsed.getUTCFullYear()===y&&parsed.getUTCMonth()===m-1&&parsed.getUTCDate()===d}function buildCalendarGrid(days,firstDayOfWeek=0,monthLabelText,locale){const inputWasTruncated=days.length>MAX_CALENDAR_INPUT_DAYS,parsedByDate=new Map;days.slice(0,MAX_CALENDAR_INPUT_DAYS).map(d=>({...d,dateObj:parseIsoDate(d.date)})).filter(d=>!Number.isNaN(d.dateObj.getTime())&&isCalendarValid(d.date,d.dateObj)).forEach(day=>{parsedByDate.has(day.date)||parsedByDate.set(day.date,day)});const parsed=[...parsedByDate.values()];if(parsed.length===0)return{cells:[],weekCount:0,firstWeekStart:new Date(0),monthLabels:[],truncated:inputWasTruncated};const timeBounds=minMax(parsed.map(d=>d.dateObj.getTime())),min=new Date(timeBounds[0]),daysBackToAnchor=(min.getUTCDay()-firstDayOfWeek+7)%7,firstWeekStart=new Date(Date.UTC(min.getUTCFullYear(),min.getUTCMonth(),min.getUTCDate()-daysBackToAnchor)),projectedCells=parsed.map(d=>{const weekday=(d.dateObj.getUTCDay()-firstDayOfWeek+7)%7,daysSinceStart=Math.round((d.dateObj.getTime()-firstWeekStart.getTime())/MS_PER_DAY),week=Math.floor(daysSinceStart/7);return{date:d.date,value:d.value,week,weekday}}),naturalWeekCount=minMax(projectedCells.map(c=>c.week))[1]+1,spanWasTruncated=naturalWeekCount>MAX_CALENDAR_WEEKS,weekCount=Math.min(naturalWeekCount,MAX_CALENDAR_WEEKS),cells=projectedCells.filter(cell=>cell.week<weekCount),monthLabels=[],seenMonths=new Set;for(const cell of cells.slice().sort((a,b)=>a.week-b.week||a.weekday-b.weekday)){const cellDate=parseIsoDate(cell.date),key=`${cellDate.getUTCFullYear()}-${cellDate.getUTCMonth()}`;seenMonths.has(key)||(seenMonths.add(key),monthLabels.push({week:cell.week,label:monthLabelText?.(cellDate.getUTCMonth(),cellDate.getUTCFullYear())??cellDate.toLocaleString(resolveIntlLocale(locale),{month:"short",timeZone:"UTC"})}))}return{cells,weekCount,firstWeekStart,monthLabels,truncated:inputWasTruncated||spanWasTruncated}}function quartileBucket(value,sorted,bucketCount){if(sorted.length===0)return 0;let lo=0,hi=sorted.length;for(;lo<hi;){const mid=lo+hi>>>1;sorted[mid]<=value?lo=mid+1:hi=mid}const rank=lo/sorted.length;return Math.min(bucketCount-1,Math.floor(rank*bucketCount))}export{MAX_CALENDAR_INPUT_DAYS,MAX_CALENDAR_WEEKS,buildCalendarGrid,parseIsoDate,quartileBucket};
1
+ import{finiteCount}from"../../../internal/numbers.js";import{getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{minMax}from"./heatmap-scale.js";import{getDateTimeFormat}from"../../../internal/intl-cache.js";const MS_PER_DAY=864e5,MAX_CALENDAR_INPUT_DAYS=1e4,MAX_CALENDAR_WEEKS=530;function parseIsoDate(iso){const[y=NaN,m=NaN,d=NaN]=iso.split("-").map(Number);return new Date(Date.UTC(y,m-1,d))}function isCalendarValid(iso,parsed){const[y=NaN,m=NaN,d=NaN]=iso.split("-").map(Number);return parsed.getUTCFullYear()===y&&parsed.getUTCMonth()===m-1&&parsed.getUTCDate()===d}function buildCalendarGrid(days,firstDayOfWeek=0,monthLabelText,locale,maxCells=MAX_CALENDAR_INPUT_DAYS){const limit=Math.max(1,Math.min(1e5,finiteCount(maxCells,MAX_CALENDAR_INPUT_DAYS))),weekLimit=Math.max(1,Math.floor(MAX_CALENDAR_WEEKS*limit/MAX_CALENDAR_INPUT_DAYS)),own=(value,key)=>{if(!value||typeof value!="object")return;const descriptor=getOwnDataDescriptor(value,key);return typeof descriptor=="object"?descriptor.value:void 0},rawLength=own(days,"length"),length=finiteCount(typeof rawLength=="number"?rawLength:0,0),inputWasTruncated=length>limit,parsedByDate=new Map;for(let index=0;index<Math.min(length,limit);index++){const day=own(days,String(index)),date=own(day,"date"),value=own(day,"value");if(typeof date!="string"||typeof value!="number")continue;const dateObj=parseIsoDate(date);!Number.isNaN(dateObj.getTime())&&isCalendarValid(date,dateObj)&&!parsedByDate.has(date)&&parsedByDate.set(date,{date,value,dateObj})}const parsed=[...parsedByDate.values()];if(parsed.length===0)return{cells:[],weekCount:0,firstWeekStart:new Date(0),monthLabels:[],truncated:inputWasTruncated};const timeBounds=minMax(parsed.map(d=>d.dateObj.getTime())),min=new Date(timeBounds[0]),daysBackToAnchor=(min.getUTCDay()-firstDayOfWeek+7)%7,firstWeekStart=new Date(Date.UTC(min.getUTCFullYear(),min.getUTCMonth(),min.getUTCDate()-daysBackToAnchor)),projectedCells=parsed.map(d=>{const weekday=(d.dateObj.getUTCDay()-firstDayOfWeek+7)%7,daysSinceStart=Math.round((d.dateObj.getTime()-firstWeekStart.getTime())/MS_PER_DAY),week=Math.floor(daysSinceStart/7);return{date:d.date,value:d.value,week,weekday}}),naturalWeekCount=minMax(projectedCells.map(c=>c.week))[1]+1,spanWasTruncated=naturalWeekCount>weekLimit,weekCount=Math.min(naturalWeekCount,weekLimit),cells=projectedCells.filter(cell=>cell.week<weekCount),monthLabels=[],seenMonths=new Set;for(const cell of cells.slice().sort((a,b)=>a.week-b.week||a.weekday-b.weekday)){const cellDate=parseIsoDate(cell.date),key=`${cellDate.getUTCFullYear()}-${cellDate.getUTCMonth()}`;seenMonths.has(key)||(seenMonths.add(key),monthLabels.push({week:cell.week,label:monthLabelText?.(cellDate.getUTCMonth(),cellDate.getUTCFullYear())??getDateTimeFormat(locale,{month:"short",timeZone:"UTC"}).format(cellDate)}))}return{cells,weekCount,firstWeekStart,monthLabels,truncated:inputWasTruncated||spanWasTruncated}}function quartileBucket(value,sorted,bucketCount){if(sorted.length===0)return 0;let lo=0,hi=sorted.length;for(;lo<hi;){const mid=lo+hi>>>1;sorted[mid]<=value?lo=mid+1:hi=mid}const rank=lo/sorted.length;return Math.min(bucketCount-1,Math.floor(rank*bucketCount))}export{MAX_CALENDAR_INPUT_DAYS,MAX_CALENDAR_WEEKS,buildCalendarGrid,parseIsoDate,quartileBucket};
@@ -1 +1 @@
1
- const MS_PER_DAY=864e5;function hitTestMatrix(x,y,geometry,isInteractive){const{rows,cols,cellSize,padLeft,padTop}=geometry;if(rows===0||cols===0)return null;const col=Math.floor((x-padLeft)/cellSize),row=Math.floor((y-padTop)/(geometry.rowHeight??cellSize));if(row<0||row>=rows||col<0||col>=cols||geometry.customShape&&(x-padLeft-col*cellSize>=geometry.cellWidth||y-padTop-row*(geometry.rowHeight??cellSize)>=geometry.cellHeight))return null;const position={row,col};return isInteractive(position)?position:null}function firstInteractiveMatrixCell(rows,cols,isInteractive){for(let row=0;row<rows;row++)for(let col=0;col<cols;col++){const position={row,col};if(isInteractive(position))return position}return null}function nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols,isInteractive){let nextRow=row,nextCol=col;for(;;){const candidateRow=Math.min(rows-1,Math.max(0,nextRow+dRow)),candidateCol=Math.min(cols-1,Math.max(0,nextCol+dCol));if(candidateRow===nextRow&&candidateCol===nextCol)return{row,col};nextRow=candidateRow,nextCol=candidateCol;const position={row:nextRow,col:nextCol};if(isInteractive(position))return position}}function hitTestCalendar(x,y,weekCount,columnPositions,cellSize,rowPositions,positionAt,isInteractive){if(weekCount===0)return null;const resolvedCellSize=cellSize();let week=null;for(let index=0;index<weekCount;index++){const start=columnPositions[index];if(x>=start&&x<start+resolvedCellSize){week=index;break}}if(week===null)return null;const resolvedRows=rowPositions(),resolvedRowCellSize=cellSize();let weekday=null;for(let index=0;index<7;index++){const start=resolvedRows[index];if(y>=start&&y<start+resolvedRowCellSize){weekday=index;break}}if(weekday===null)return null;const position=positionAt(week,weekday);return isInteractive(position)?position:null}function firstInteractiveCalendarCell(weekCount,positionAt,isInteractive){for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const position=positionAt(week,weekday);if(isInteractive(position))return position}return null}function nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount,positionAt,isInteractive){let nextWeek=week,nextWeekday=weekday;for(;;){const candidateWeek=Math.min(weekCount-1,Math.max(0,nextWeek+dWeek)),candidateWeekday=Math.min(6,Math.max(0,nextWeekday+dWeekday));if(candidateWeek===nextWeek&&candidateWeekday===nextWeekday)return positionAt(week,weekday);nextWeek=candidateWeek,nextWeekday=candidateWeekday;const position=positionAt(nextWeek,nextWeekday);if(isInteractive(position))return position}}function calendarDateAt(week,weekday,datesByPosition,firstWeekStart){const index=week*7+weekday;return datesByPosition[index]??new Date(firstWeekStart.getTime()+index*864e5).toISOString().slice(0,10)}function calendarCellAt(week,weekday,cellsByPosition,datesByPosition,firstWeekStart,signedDomain){const cell=cellsByPosition.get(`${week}:${weekday}`);return cell?{date:cell.date,value:cell.value}:{date:calendarDateAt(week,weekday,datesByPosition,firstWeekStart),value:signedDomain?Number.NaN:-1}}function calendarValueAt(week,weekday,cellsByPosition,signedDomain){const cell=cellsByPosition.get(`${week}:${weekday}`);return cell?cell.value:signedDomain?Number.NaN:-1}function matrixCellRect(position,geometry){return{x:geometry.padLeft+position.col*geometry.cellSize,y:geometry.padTop+position.row*(geometry.rowHeight??geometry.cellSize),w:geometry.cellWidth,h:geometry.cellHeight}}function calendarCellRect(week,weekday,geometry){return{x:geometry.columnPositions[week]??geometry.padLeft,y:geometry.rowPositions[weekday]??geometry.padTop,w:geometry.cellSize,h:geometry.cellSize}}function accessibleMatrixCellRect(position,painted){return{x:painted.padLeft+position.col*painted.cellSize,y:painted.padTop+position.row*(painted.rowHeight??painted.cellSize),w:painted.cellWidth??painted.cellSize-1,h:painted.cellHeight??painted.cellSize-1}}export{accessibleMatrixCellRect,calendarCellAt,calendarCellRect,calendarDateAt,calendarValueAt,firstInteractiveCalendarCell,firstInteractiveMatrixCell,hitTestCalendar,hitTestMatrix,matrixCellRect,nextInteractiveCalendarCell,nextInteractiveMatrixCell};
1
+ const MS_PER_DAY=864e5;function hitTestMatrix(x,y,geometry,isInteractive){const{rows,cols,cellSize,padLeft,padTop}=geometry;if(rows===0||cols===0)return null;const col=Math.floor((x-padLeft)/cellSize),row=Math.floor((y-padTop)/(geometry.rowHeight??cellSize));if(row<0||row>=rows||col<0||col>=cols||geometry.customShape&&(x-padLeft-col*cellSize>=geometry.cellWidth||y-padTop-row*(geometry.rowHeight??cellSize)>=geometry.cellHeight))return null;const position={row,col};return isInteractive(position)?position:null}function firstInteractiveMatrixCell(rows,cols,isInteractive){for(let row=0;row<rows;row++)for(let col=0;col<cols;col++){const position={row,col};if(isInteractive(position))return position}return null}function nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols,isInteractive){let nextRow=row,nextCol=col;for(;;){const candidateRow=Math.min(rows-1,Math.max(0,nextRow+dRow)),candidateCol=Math.min(cols-1,Math.max(0,nextCol+dCol));if(candidateRow===nextRow&&candidateCol===nextCol)return{row,col};nextRow=candidateRow,nextCol=candidateCol;const position={row:nextRow,col:nextCol};if(isInteractive(position))return position}}function hitTestCalendar(x,y,weekCount,columnPositions,cellSize,rowPositions,positionAt,isInteractive){if(weekCount===0)return null;const resolvedCellSize=cellSize();let low=0,high=weekCount;for(;low<high;){const middle=Math.floor((low+high)/2);columnPositions[middle]<=x?low=middle+1:high=middle}const week=low-1;if(week<0||x>=columnPositions[week]+resolvedCellSize)return null;const resolvedRows=rowPositions(),resolvedRowCellSize=resolvedCellSize;let weekday=null;for(let index=0;index<7;index++){const start=resolvedRows[index];if(y>=start&&y<start+resolvedRowCellSize){weekday=index;break}}if(weekday===null)return null;const position=positionAt(week,weekday);return isInteractive(position)?position:null}function firstInteractiveCalendarCell(weekCount,positionAt,isInteractive){for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const position=positionAt(week,weekday);if(isInteractive(position))return position}return null}function nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount,positionAt,isInteractive){let nextWeek=week,nextWeekday=weekday;for(;;){const candidateWeek=Math.min(weekCount-1,Math.max(0,nextWeek+dWeek)),candidateWeekday=Math.min(6,Math.max(0,nextWeekday+dWeekday));if(candidateWeek===nextWeek&&candidateWeekday===nextWeekday)return positionAt(week,weekday);nextWeek=candidateWeek,nextWeekday=candidateWeekday;const position=positionAt(nextWeek,nextWeekday);if(isInteractive(position))return position}}function calendarDateAt(week,weekday,datesByPosition,firstWeekStart){const index=week*7+weekday;return datesByPosition[index]??new Date(firstWeekStart.getTime()+index*864e5).toISOString().slice(0,10)}function calendarCellAt(week,weekday,cellsByPosition,datesByPosition,firstWeekStart,signedDomain){const cell=cellsByPosition.get(`${week}:${weekday}`);return cell?{date:cell.date,value:cell.value}:{date:calendarDateAt(week,weekday,datesByPosition,firstWeekStart),value:signedDomain?Number.NaN:-1}}function calendarValueAt(week,weekday,cellsByPosition,signedDomain){const cell=cellsByPosition.get(`${week}:${weekday}`);return cell?cell.value:signedDomain?Number.NaN:-1}function matrixCellRect(position,geometry){return{x:geometry.padLeft+position.col*geometry.cellSize,y:geometry.padTop+position.row*(geometry.rowHeight??geometry.cellSize),w:geometry.cellWidth,h:geometry.cellHeight}}function calendarCellRect(week,weekday,geometry){return{x:geometry.columnPositions[week]??geometry.padLeft,y:geometry.rowPositions[weekday]??geometry.padTop,w:geometry.cellSize,h:geometry.cellSize}}function accessibleMatrixCellRect(position,painted){return{x:painted.padLeft+position.col*painted.cellSize,y:painted.padTop+position.row*(painted.rowHeight??painted.cellSize),w:painted.cellWidth??painted.cellSize-1,h:painted.cellHeight??painted.cellSize-1}}export{accessibleMatrixCellRect,calendarCellAt,calendarCellRect,calendarDateAt,calendarValueAt,firstInteractiveCalendarCell,firstInteractiveMatrixCell,hitTestCalendar,hitTestMatrix,matrixCellRect,nextInteractiveCalendarCell,nextInteractiveMatrixCell};
@@ -1,7 +1,7 @@
1
1
  export declare const DEFAULT_BUCKET_COUNT=5;
2
2
  /** Maximum visually distinct bucket steps on an 8-bit RGB channel. */
3
3
  export declare const MAX_BUCKET_COUNT=256;
4
- /** Maximum canonical matrix cells. */
4
+ /** Default canonical matrix cell budget; max-cells can raise it up to tenfold. */
5
5
  export declare const MAX_HEATMAP_CELLS=10000;
6
6
  /** Maximum caller-supplied legend or annotation entries. */
7
7
  export declare const MAX_HEATMAP_DECORATIONS=256;
@@ -0,0 +1 @@
1
+ import{SourceRequestController,sourceCount,sourceRevision}from"../../../internal/source-request-controller.js";import{matrixContains,matrixDomain,matrixExactCell,matrixRectangle,matrixTiles}from"./heatmap-matrix-source.js";class HeatmapMatrixSourceController{constructor(host,repaint,locale){this.repaint=repaint,this.locale=locale,this.source=null,this.rows=0,this.cols=0,this.domain=null,this.viewport=null,this.tiles=[],this.cells=[],this.cursor=null,this.selected=null,this.loading=!1,this.error=!1,this.tileBusy=!1,this.exactBusy=0,this.pendingCoordinates=new Set,this.acceptedInput=null,this.previousViewport=null,this.key="",this.exactVersion=0,this.windowVersion=0,this.requests=new SourceRequestController(host,{channels:["tiles","focus","cells"],onReset:()=>this.clear()})}cancelExact(){const version=++this.exactVersion,epoch=this.requests.epoch,cancel=this.cancelFocus,focus=this.focusIntent,window=this.window;this.cancelFocus=void 0,this.focusIntent=void 0,this.window=void 0,this.windowVersion++,window&&(window.results.length=0,window.finish(!1)),cancel?.(),focus?.resolve(null),this.requests.invalidate("focus"),version===this.exactVersion&&epoch===this.requests.epoch&&this.requests.invalidate("cells")}retainWindowFor(row,col){const window=this.window;!window||matrixContains(window.rectangle,{rowStart:row,rowEnd:row+1,columnStart:col,columnEnd:col+1})||(this.window=void 0,this.windowVersion++,window.results.length=0,window.finish(!1),this.requests.invalidate("cells"))}detach(){this.requests.setSource(void 0,void 0),this.clear(),this.key=""}invalidate(){this.requests.refresh(),this.key=""}clear(){this.exactVersion++,this.windowVersion++,this.source=null,this.rows=0,this.cols=0,this.domain=null,this.viewport=null,this.error=!1,this.cancelFocus?.(),this.cancelFocus=void 0,this.focusIntent?.resolve(null),this.focusIntent=void 0,this.tileIntent=void 0,this.window&&(this.window.results.length=0,this.window.finish(!1)),this.window=void 0,this.tiles=[],this.cells=[],this.cursor=null,this.selected=null,this.loading=!1}configure(source,input,explicit,budget){const epoch=this.requests.epoch;try{const revision=sourceRevision(source.revision);if(this.requests.epoch!==epoch)return;const rows=sourceCount(source.rowCount);if(this.requests.epoch!==epoch)return;const cols=sourceCount(source.columnCount);if(this.requests.epoch!==epoch)return;if(!Number.isSafeInteger(rows*cols))throw new RangeError("Invalid matrix size");const domain=matrixDomain(source.domain);if(this.requests.epoch!==epoch)return;const changed=this.requests.setSource(source,revision);if(this.requests.epoch!==epoch+(changed?1:0))return;this.revision=revision,this.source=source,this.rows=rows,this.cols=cols,this.domain=domain;let viewport=null;if(input!==null){const rectangle=matrixRectangle(input);if(rows&&cols){if(!explicit&&input===this.acceptedInput&&this.previousViewport){const height=Math.min(rows,this.previousViewport.rowEnd-this.previousViewport.rowStart),width=Math.min(cols,this.previousViewport.columnEnd-this.previousViewport.columnStart),rowStart=Math.min(this.previousViewport.rowStart,rows-height),columnStart=Math.min(this.previousViewport.columnStart,cols-width);viewport=Object.freeze({rowStart,rowEnd:rowStart+height,columnStart,columnEnd:columnStart+width})}else viewport=rectangle;if(!matrixContains({rowStart:0,rowEnd:rows,columnStart:0,columnEnd:cols},viewport))throw new RangeError("Invalid matrix viewport")}else if(explicit)throw new RangeError("Invalid empty matrix viewport")}else rows&&cols&&(viewport=Object.freeze({rowStart:0,rowEnd:rows,columnStart:0,columnEnd:cols}));if(this.acceptedInput=input,this.previousViewport=viewport,this.viewport=viewport,this.error=!1,!viewport){this.tiles=[],this.loading=!1;return}const key=`${this.requests.epoch}:${viewport.rowStart}:${viewport.rowEnd}:${viewport.columnStart}:${viewport.columnEnd}:${budget}`;if(key===this.key)return;this.key=key;const configuredEpoch=this.requests.epoch;if(this.cancelExact(),configuredEpoch!==this.requests.epoch||this.source!==source)return;const lease=this.requests.begin("tiles",this.locale());if(!lease)return;this.loading=!0,this.tileIntent={lease,source,viewport,budget,domain},this.pumpTiles()}catch{(this.requests.epoch===epoch||this.source===source)&&this.fail()}}fail(){this.error||(this.invalidate(),this.error=!0,this.repaint())}pumpTiles(){if(this.tileBusy||!this.tileIntent)return;const intent=this.tileIntent;this.tileIntent=void 0,intent.lease.isCurrent()&&(this.tileBusy=!0,(async()=>{try{const query=intent.source.query;if(!intent.lease.isCurrent())return;const reply=await query.call(intent.source,Object.freeze({...intent.viewport,maxCells:intent.budget,signal:intent.lease.context.signal}));if(!intent.lease.isCurrent())return;const tiles=matrixTiles(reply,intent.viewport,intent.budget,intent.domain);if(!intent.lease.isCurrent())return;this.tiles=tiles,this.loading=!1,this.error=!1,this.repaint()}catch{intent.lease.isCurrent()&&(this.tiles=[],this.loading=!1,this.error=!0,this.repaint())}finally{this.tileBusy=!1,this.pumpTiles()}})())}valid(row,col){return Number.isSafeInteger(row)&&Number.isSafeInteger(col)&&row>=0&&col>=0&&row<this.rows&&col<this.cols}cached(row,col){return this.cursor?.row===row&&this.cursor.col===col?this.cursor:this.cells.find(cell=>cell.row===row&&cell.col===col)??this.window?.results.find(cell=>cell.row===row&&cell.col===col)??(this.selected?.row===row&&this.selected.col===col?this.selected:void 0)}exact(row,col){const version=++this.exactVersion,epoch=this.requests.epoch,cancel=this.cancelFocus,focus=this.focusIntent;if(this.cancelFocus=void 0,this.focusIntent=void 0,cancel?.(),focus?.resolve(null),this.requests.invalidate("focus"),version!==this.exactVersion||epoch!==this.requests.epoch||!this.valid(row,col)||!this.source||this.error)return Promise.resolve(null);const cached=this.cached(row,col);if(cached)return Promise.resolve(cached);const lease=this.requests.begin("focus",this.locale());return!lease||version!==this.exactVersion?Promise.resolve(null):new Promise(resolve=>{let settled=!1;const finish=value=>{settled||(settled=!0,resolve(value))};this.cancelFocus=()=>finish(null),this.focusIntent={row,col,lease,resolve:finish},this.pumpExact()})}ensureWindow(row,col){if(!this.valid(row,col)||this.error)return Promise.resolve(!1);const height=Math.min(20,this.rows),width=Math.min(20,this.cols),rowStart=Math.max(0,Math.min(this.rows-height,row-Math.floor(height/2))),columnStart=Math.max(0,Math.min(this.cols-width,col-Math.floor(width/2))),rectangle=Object.freeze({rowStart,rowEnd:rowStart+height,columnStart,columnEnd:columnStart+width});if(this.window&&matrixContains(this.window.rectangle,{rowStart:row,rowEnd:row+1,columnStart:col,columnEnd:col+1}))return this.window.done;const version=++this.windowVersion,previous=this.window;if(this.window=void 0,previous&&(previous.results.length=0,previous.finish(!1)),this.cells.some(cell=>cell.row===row&&cell.col===col))return this.requests.invalidate("cells"),Promise.resolve(version===this.windowVersion);const lease=this.requests.begin("cells",this.locale());if(!lease||version!==this.windowVersion)return Promise.resolve(!1);let finish;const done=new Promise(resolve=>{finish=resolve});return this.window={lease,rectangle,next:0,results:[],pending:0,done,finish},this.pumpExact(),done}pumpExact(){for(;this.exactBusy<2;){if(this.focusIntent){const intent=this.focusIntent;if(this.pendingCoordinates.has(`${this.requests.epoch}:${intent.row}:${intent.col}`))return;if(this.focusIntent=void 0,!intent.lease.isCurrent()){intent.resolve(null);continue}const cached2=this.cached(intent.row,intent.col);if(cached2){intent.resolve(cached2);continue}this.read(intent.row,intent.col,intent.lease,value=>intent.resolve(value));continue}const window=this.window;if(!window||!window.lease.isCurrent())return;const width=window.rectangle.columnEnd-window.rectangle.columnStart,count=width*(window.rectangle.rowEnd-window.rectangle.rowStart);if(window.next===count){window.pending===0&&(this.cells=Object.freeze(window.results.sort((a,b)=>a.row-b.row||a.col-b.col)),this.window=void 0,window.finish(!0),this.repaint());return}const index=window.next++,row=window.rectangle.rowStart+Math.floor(index/width),col=window.rectangle.columnStart+index%width,cached=this.cached(row,col);if(cached){window.results.push(cached);continue}window.pending++,this.read(row,col,window.lease,value=>{window.pending--,!(window!==this.window||!window.lease.isCurrent())&&(value?window.results.push(value):(window.results.length=0,window.finish(!1),this.window=void 0,this.error=!0,this.repaint()))})}}read(row,col,lease,complete){const source=this.source,domain=this.domain,coordinate=`${this.requests.epoch}:${row}:${col}`;this.pendingCoordinates.add(coordinate),this.exactBusy++,(async()=>{try{const getCell=source.getCell;if(!lease.isCurrent()){complete(null);return}const reply=await getCell.call(source,row,col,{signal:lease.context.signal});if(!lease.isCurrent()){complete(null);return}const cell=matrixExactCell(reply,domain);complete(lease.isCurrent()?Object.freeze({row,col,...cell}):null)}catch{lease.isCurrent()&&(this.error=!0,this.repaint()),complete(null)}finally{this.pendingCoordinates.delete(coordinate),this.exactBusy--,this.pumpExact()}})()}}export{HeatmapMatrixSourceController};
@@ -0,0 +1,5 @@
1
+ import type{LyraSourceRevision}from'../../../data-sources.js';import type{LyraSourceValue,LyraSourceRequest,LyraNumericDomain}from'../../../utilities/data-preparation.js';export interface LyraHeatmapMatrixViewport{readonly rowStart:number;readonly rowEnd:number;readonly columnStart:number;readonly columnEnd:number;}export type LyraHeatmapMatrixReducer='mean'|'min'|'max';export interface LyraHeatmapTile extends LyraHeatmapMatrixViewport{readonly count:number;readonly validCount:number;readonly min:number|null;readonly max:number|null;readonly sum:number;}export interface LyraHeatmapMatrixRangeSelectDetail extends LyraHeatmapTile{readonly revision:LyraSourceRevision;}export interface HeatmapSourceCell{readonly value:number|null;readonly rowLabel:string;readonly columnLabel:string;}
2
+ /** Immutable indexed matrix. Query implementations own aggregation and storage. */
3
+ export interface LyraHeatmapMatrixSource{readonly revision:LyraSourceRevision;readonly rowCount:number;readonly columnCount:number;readonly domain:LyraNumericDomain|null;query(request:LyraSourceRequest&LyraHeatmapMatrixViewport&{readonly maxCells:number;}):LyraSourceValue<readonly LyraHeatmapTile[]>;getCell(row:number,column:number,request:LyraSourceRequest):LyraSourceValue<HeatmapSourceCell>;}export declare function matrixRectangle(value:unknown):LyraHeatmapMatrixViewport;export declare function matrixDomain(value:unknown):LyraNumericDomain|null;export declare function matrixExactCell(value:unknown,domain:LyraNumericDomain|null):HeatmapSourceCell;export declare function matrixContains(outer:LyraHeatmapMatrixViewport,inner:LyraHeatmapMatrixViewport):boolean;
4
+ /** Validates a complete rectangular partition in O(T log T) work and O(T) storage. */
5
+ export declare function matrixTiles(reply:unknown,rectangle:LyraHeatmapMatrixViewport,budget:number,domain:LyraNumericDomain|null):readonly LyraHeatmapTile[];
@@ -0,0 +1 @@
1
+ import{sourceCount}from"../../../internal/source-request-controller.js";function field(value,key){if(typeof value!="object"&&typeof value!="function"||value===null)throw new TypeError("Invalid matrix record");const descriptor=Object.getOwnPropertyDescriptor(value,key);if(!descriptor||!Object.hasOwn(descriptor,"value"))throw new TypeError("Invalid matrix field");return descriptor.value}function finite(value){if(typeof value!="number"||!Number.isFinite(value))throw new TypeError("Invalid matrix number");return value}function matrixRectangle(value){const rowStart=sourceCount(field(value,"rowStart")),rowEnd=sourceCount(field(value,"rowEnd")),columnStart=sourceCount(field(value,"columnStart")),columnEnd=sourceCount(field(value,"columnEnd"));if(rowStart>=rowEnd||columnStart>=columnEnd||!Number.isSafeInteger((rowEnd-rowStart)*(columnEnd-columnStart)))throw new RangeError("Invalid matrix rectangle");return Object.freeze({rowStart,rowEnd,columnStart,columnEnd})}function matrixDomain(value){if(value===null)return null;const min=finite(field(value,"min")),max=finite(field(value,"max"));if(min>max)throw new RangeError("Invalid matrix domain");return Object.freeze({min,max})}function matrixExactCell(value,domain){const raw=field(value,"value"),number=raw===null?null:finite(raw),rowLabel=field(value,"rowLabel"),columnLabel=field(value,"columnLabel");if(typeof rowLabel!="string"||typeof columnLabel!="string"||rowLabel.length>1024||columnLabel.length>1024||number!==null&&(!domain||number<domain.min||number>domain.max))throw new RangeError("Invalid matrix cell");return Object.freeze({value:number,rowLabel,columnLabel})}function matrixContains(outer,inner){return inner.rowStart>=outer.rowStart&&inner.rowEnd<=outer.rowEnd&&inner.columnStart>=outer.columnStart&&inner.columnEnd<=outer.columnEnd}function matrixTiles(reply,rectangle,budget,domain){if(!Array.isArray(reply))throw new TypeError("Invalid matrix tiles");const length=sourceCount(field(reply,"length"));if(!length||length>budget)throw new RangeError("Invalid matrix tile budget");const tiles=[],boundaries=new Set([rectangle.columnStart,rectangle.columnEnd]),events=[];for(let index=0;index<length;index++){const input=field(reply,String(index)),bounds=matrixRectangle(input),count=sourceCount(field(input,"count")),validCount=sourceCount(field(input,"validCount")),sum=finite(field(input,"sum")),rawMin=field(input,"min"),rawMax=field(input,"max"),min=rawMin===null?null:finite(rawMin),max=rawMax===null?null:finite(rawMax);if(!matrixContains(rectangle,bounds)||count!==(bounds.rowEnd-bounds.rowStart)*(bounds.columnEnd-bounds.columnStart)||validCount>count)throw new RangeError("Invalid matrix tile counts");if(validCount===0){if(min!==null||max!==null||sum!==0)throw new RangeError("Invalid empty matrix tile")}else{if(!domain||min===null||max===null||min>max||min<domain.min||max>domain.max)throw new RangeError("Invalid matrix tile extrema");const mean=sum/validCount,scale=Math.max(1,Math.abs(min),Math.abs(max),Math.abs(mean));if(!Number.isFinite(mean)||mean/scale<min/scale-32*Number.EPSILON||mean/scale>max/scale+32*Number.EPSILON)throw new RangeError("Invalid matrix tile mean")}tiles.push(Object.freeze({...bounds,count,validCount,min,max,sum})),boundaries.add(bounds.columnStart),boundaries.add(bounds.columnEnd),events.push({row:bounds.rowStart,start:bounds.columnStart,end:bounds.columnEnd,delta:1},{row:bounds.rowEnd,start:bounds.columnStart,end:bounds.columnEnd,delta:-1})}const columns=[...boundaries].sort((a,b)=>a-b),indices=new Map(columns.map((column,index)=>[column,index])),size=columns.length-1,low=new Int32Array(size*4),high=new Int32Array(size*4),lazy=new Int32Array(size*4);function update(node,left,right,start,end,delta){if(start<=left&&right<=end){low[node]=low[node]+delta,high[node]=high[node]+delta,lazy[node]=lazy[node]+delta;return}const middle=Math.floor((left+right)/2);start<middle&&update(node*2,left,middle,start,end,delta),end>middle&&update(node*2+1,middle,right,start,end,delta),low[node]=lazy[node]+Math.min(low[node*2],low[node*2+1]),high[node]=lazy[node]+Math.max(high[node*2],high[node*2+1])}events.sort((a,b)=>a.row-b.row);let previous=rectangle.rowStart,cursor=0;for(;cursor<events.length;){const row=events[cursor].row;if(row>previous&&(low[1]!==1||high[1]!==1))throw new RangeError("Incomplete matrix partition");for(;cursor<events.length&&events[cursor].row===row;){const event=events[cursor++];update(1,0,size,indices.get(event.start),indices.get(event.end),event.delta)}previous=row}if(previous!==rectangle.rowEnd||low[1]!==0||high[1]!==0)throw new RangeError("Incomplete matrix partition");return Object.freeze(tiles)}export{matrixContains,matrixDomain,matrixExactCell,matrixRectangle,matrixTiles};
@@ -25,22 +25,6 @@ export declare function sqrtStep(count:number,max:number,steps:number):number;
25
25
  * scale case (the `'sqrt'` scale already has its own discrete `sqrtStep()`).
26
26
  */
27
27
  export declare function linearBucket(value:number,lo:number,hi:number,steps:number):number;
28
- /**
29
- * Normalizes `value` to `[0, 1]` around an anchored `midpoint` rather than the plain `lo`-`hi`
30
- * span, so a diverging ramp's neutral color lands exactly on `midpoint` instead of wherever the
31
- * data's own midpoint happens to fall.
32
- *
33
- * The two halves are scaled independently: `lo`->0, `midpoint`->0.5, `hi`->1. That deliberately
34
- * does NOT preserve a single units-per-pixel ratio across the whole range — with data running
35
- * -4.93 to +28.8 around a zero midpoint, an equal color distance means "equally far from
36
- * neutral in its own direction", which is the entire point of a diverging ramp. A caller wanting
37
- * a symmetric ramp passes a symmetric `domain` (e.g. `[-28.8, 28.8]`).
38
- *
39
- * Falls back to `finiteRatio`'s plain normalization when `midpoint` sits outside `[lo, hi]` or
40
- * any input is non-finite, so a mis-set midpoint degrades to today's behavior rather than
41
- * producing a a division by zero.
42
- */
43
- export declare function midpointRatio(value:number,lo:number,hi:number,midpoint:number):number;
44
28
  /** `linearAlpha`'s midpoint-anchored twin, keeping the same 0.1-1.0 floor. */
45
29
  export declare function midpointAlpha(value:number,lo:number,hi:number,midpoint:number):number;
46
30
  /** `linearBucket`'s midpoint-anchored twin. */
@@ -1 +1 @@
1
- import{finiteRatio}from"../../../internal/numbers.js";import{minMax}from"../../../internal/numbers.js";function linearAlpha(value,lo,hi){return .1+.9*finiteRatio(value,lo,hi)}function sqrtStep(count,max,steps){if(count<0)return-1;if(max<=0)return 0;const ratio=Math.sqrt(count)/Math.sqrt(max);return Math.min(steps-1,Math.floor(ratio*steps))}function linearBucket(value,lo,hi,steps){const t=finiteRatio(value,lo,hi);return Math.min(steps-1,Math.floor(t*steps))}function midpointRatio(value,lo,hi,midpoint){return!Number.isFinite(value)||!Number.isFinite(midpoint)?finiteRatio(value,lo,hi):!Number.isFinite(lo)||!Number.isFinite(hi)?finiteRatio(value,lo,hi):!(midpoint>lo)||!(midpoint<hi)?finiteRatio(value,lo,hi):value<=lo?0:value>=hi?1:value<=midpoint?.5*((value-lo)/(midpoint-lo)):.5+.5*((value-midpoint)/(hi-midpoint))}function midpointAlpha(value,lo,hi,midpoint){return .1+.9*midpointRatio(value,lo,hi,midpoint)}function midpointBucket(value,lo,hi,midpoint,steps){const t=midpointRatio(value,lo,hi,midpoint);return Math.min(steps-1,Math.floor(t*steps))}export{linearAlpha,linearBucket,midpointAlpha,midpointBucket,midpointRatio,minMax,sqrtStep};
1
+ import{finiteRatio}from"../../../internal/numbers.js";import{minMax}from"../../../internal/numbers.js";function linearAlpha(value,lo,hi){return .1+.9*finiteRatio(value,lo,hi)}function sqrtStep(count,max,steps){if(count<0)return-1;if(max<=0)return 0;const ratio=Math.sqrt(count)/Math.sqrt(max);return Math.min(steps-1,Math.floor(ratio*steps))}function linearBucket(value,lo,hi,steps){const t=finiteRatio(value,lo,hi);return Math.min(steps-1,Math.floor(t*steps))}function midpointRatio(value,lo,hi,midpoint){return!Number.isFinite(value)||!Number.isFinite(midpoint)?finiteRatio(value,lo,hi):!Number.isFinite(lo)||!Number.isFinite(hi)?finiteRatio(value,lo,hi):!(midpoint>lo)||!(midpoint<hi)?finiteRatio(value,lo,hi):value<=lo?0:value>=hi?1:value<=midpoint?.5*((value-lo)/(midpoint-lo)):.5+.5*((value-midpoint)/(hi-midpoint))}function midpointAlpha(value,lo,hi,midpoint){return .1+.9*midpointRatio(value,lo,hi,midpoint)}function midpointBucket(value,lo,hi,midpoint,steps){const t=midpointRatio(value,lo,hi,midpoint);return Math.min(steps-1,Math.floor(t*steps))}export{linearAlpha,linearBucket,midpointAlpha,midpointBucket,minMax,sqrtStep};
@@ -1,4 +1,4 @@
1
- import{type PropertyDeclaration,type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';export{hexToRgb,resolveRgb}from'./heatmap-colors.js';export{MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS,MAX_ACCESSIBLE_HEATMAP_CELLS,normalizeBucketCount}from'./heatmap-limits.js';import{type CalendarDay}from'./calendar-grid.js';
1
+ import type{LyraHeatmapMatrixSource,LyraHeatmapMatrixViewport,LyraHeatmapMatrixReducer,LyraHeatmapMatrixRangeSelectDetail}from'./heatmap-matrix-source.js';export type{LyraHeatmapMatrixSource,LyraHeatmapMatrixViewport,LyraHeatmapMatrixReducer,LyraHeatmapTile,LyraHeatmapMatrixRangeSelectDetail}from'./heatmap-matrix-source.js';import{type PropertyDeclaration,type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';export{hexToRgb,resolveRgb}from'./heatmap-colors.js';export{MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS,MAX_ACCESSIBLE_HEATMAP_CELLS,normalizeBucketCount}from'./heatmap-limits.js';import{type CalendarDay}from'./calendar-grid.js';
2
2
  /**
3
3
  * Which matrix label band, if any, is frozen while the grid scrolls.
4
4
  *
@@ -96,7 +96,7 @@ cellWidth?:number;cellHeight?:number;cellRadius?:number;};
96
96
  * Caller-supplied `data.columnX`/`data.rowY` origins, when present, take precedence over
97
97
  * `padLeft`/`padTop` plus the gaps for positioning individual columns and rows.
98
98
  */
99
- export type LyraHeatmapCalendarGeometry={padLeft:number;padTop:number;cellSize:number;cellWidth:number;cellHeight:number;cellGapX:number;cellGapY:number;cellRadius:number;weekCount:number;firstDayOfWeek:number;};export interface LyraHeatmapEventMap{
99
+ export type LyraHeatmapCalendarGeometry={padLeft:number;padTop:number;cellSize:number;cellWidth:number;cellHeight:number;cellGapX:number;cellGapY:number;cellRadius:number;weekCount:number;firstDayOfWeek:number;};export interface LyraHeatmapEventMap{'lr-matrix-range-select':CustomEvent<LyraHeatmapMatrixRangeSelectDetail>;
100
100
  /** A cell was activated by pointer or Enter/Space. */
101
101
  'lr-cell-activate':CustomEvent<LyraHeatmapCellClickDetail>;'lr-matrix-geometry-change':CustomEvent<LyraHeatmapMatrixGeometryChangeDetail>;'lr-calendar-geometry-change':CustomEvent<LyraHeatmapCalendarGeometry>;'lr-selection-change':CustomEvent<HeatmapSelectionChangeDetail>;}
102
102
  /** The snapshot format returned by `LyraHeatmap.exportData()`: `'png'` for the raster canvas
@@ -230,10 +230,12 @@ export type LyraHeatmapExportFormat='csv'|'png';
230
230
  * intersects again; environments without `IntersectionObserver` retain eager drawing. A grid
231
231
  * whose backing store would exceed the engine's canvas limits (16,384 px per side, 16,777,216
232
232
  * pixels) is painted at a lower resolution instead of blank, and `exportData('png')` follows it.
233
- * Matrix work is capped at `MAX_HEATMAP_CELLS`; calendar input/span and decoration collections
234
- * have corresponding exported ceilings. A localized `[part="projection-limit"]` disclosure is
233
+ * Matrix work defaults to 10,000 cells and `max-cells` can raise it to 100,000; calendar input/span and decoration collections
234
+ * keep their existing default envelopes. A localized `[part="projection-limit"]` disclosure is
235
235
  * attached whenever canonicalization truncates caller input.
236
- * Public data records and decoration collections are clone-owned, bounded readonly snapshots.
236
+ * Matrix and calendar collections are descriptor-safe projected into bounded render snapshots.
237
+ * Decorations retain at most 10,000 input entries and 50,000 cloned values, then display at most
238
+ * 256 entries; shared admission loss has its own input-limit notice.
237
239
  * Create and reassign a new record or array after changing `data`, `annotations`, `legendStops`,
238
240
  * or `colorSteps`.
239
241
  *
@@ -296,10 +298,33 @@ export type LyraHeatmapExportFormat='csv'|'png';
296
298
  * @cssprop [--lr-heatmap-sticky-label-bg=var(--lr-color-surface)] - Backdrop painted under a frozen `stickyLabels` band. Must be opaque: it covers the same labels the scrolling canvas painted underneath it.
297
299
  * @cssprop [--lr-heatmap-grid-max-block-size=none] - Block-size ceiling of the `stickyLabels` scrollport. A frozen column band only stays behind once the grid actually scrolls vertically.
298
300
  * @cssprop [--lr-heatmap-color-steps-gradient=linear-gradient(to right, var(--lr-heatmap-scale-lo), var(--lr-heatmap-scale-hi))] - Gradient painted on the continuous legend bar. Set on the host by the component itself while `colorSteps` is supplied AND the legend is rendered, and removed again when either stops being true -- `withoutLegend` takes the whole legend row out of the DOM, and the legend bar is this property's only reader; the fallback is the two-endpoint scale ramp.
301
+ * Matrix sources own aggregation and storage. Tiles partition a half-open viewport; source
302
+ * geometry is proportional and matrixGeometry is undefined. Exact keyboard activation uses
303
+ * absolute coordinates and maps missing null values to NaN. Aggregate pointer activation and
304
+ * Shift+Enter emit lr-matrix-range-select without expanding selectedCells. Source CSV exports
305
+ * only the complete current tile snapshot, with half-open coordinates and the chosen reducer.
306
+ * Accessible source mode exposes a bounded 20 by 20 exact window below the overview. Revealing
307
+ * an outside cell silently pans an explicit viewport; null continues to show the whole matrix.
308
+ * Invalid new rectangles fail visibly; an unchanged accepted rectangle clamps on source shrink.
309
+ * Source query and exact requests are bounded independently; ignored cancellation cannot create
310
+ * additional physical requests. Providers must supply an index rather than scan raw data per query.
311
+ * @event lr-matrix-range-select - A source aggregate range was activated; detail contains its revision, bounds and statistics.
312
+ * @csspart source-status - Loading status for a source request.
313
+ * @csspart source-error - Localized source failure.
314
+ * @csspart source-summary - Complete source and displayed viewport summary.
315
+ * @csspart source-exact-window - Bounded exact source grid below the overview.
299
316
  * @status stable
300
317
  * @since 4.0.0
301
318
  */
302
- export declare class LyraHeatmap extends LyraElement<LyraHeatmapEventMap>{protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly immutableEventDetails:readonly string[];protected static readonly ownedCollectionProperties:readonly string[];
319
+ export declare class LyraHeatmap extends LyraElement<LyraHeatmapEventMap>{
320
+ /** Provider-owned immutable full matrix; takes precedence over legacy matrix arrays. */
321
+ get matrixSource():LyraHeatmapMatrixSource|null;set matrixSource(value:LyraHeatmapMatrixSource|null);private sourceInput;
322
+ /** Half-open source rectangle. Null displays the complete matrix. */
323
+ get matrixViewport():LyraHeatmapMatrixViewport|null;set matrixViewport(value:LyraHeatmapMatrixViewport|null);private sourceViewportInput;private sourceViewportInvalid;
324
+ /** Reducer used only for aggregate tile colors; exact events never contain tile means. */
325
+ matrixReducer:LyraHeatmapMatrixReducer;private sourceNeedsConfigure;private sourceViewportExplicit;private sourceWidth;private sourceSelectionKey;private sourceSelectedCellsInput;private sourceSelectedCellsEpoch;private sourceSelectedKeys;private sourceRevealIntent;private sourceNavigationIntent;private sourceFocusVersion;private sourceRestoringFocus;private sourceHasSucceeded;private sourceFailureAnnounced;private sourceResult;private sourceController;
326
+ /** Focus an exact source coordinate without selecting it. Pans an explicit viewport when needed. */
327
+ revealSourceCell(row:number,col:number):Promise<boolean>;private sourceCurrent;private configureSource;private sourceHovered;private sourceRangeLabel;private sourceHover;private sourceReducerLabel;private sourceTileValue;private sourceRange;private sourceActivate;private sourceTileAt;private sourceClick;private sourceKeydown;private sourceCellLabel;private sourceCsv;private paintSource;private renderSource;protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly immutableEventDetails:readonly string[];protected static readonly ownedCollectionProperties:readonly string[];
303
328
  /** `data` is a single opaque record (row/col labels plus a `values` matrix), not an item
304
329
  * sequence -- and a legitimately large matrix (tens of thousands of cells) can exceed the
305
330
  * generic snapshot machinery's node budget, which would otherwise silently replace the whole
@@ -308,7 +333,10 @@ export declare class LyraHeatmap extends LyraElement<LyraHeatmapEventMap>{protec
308
333
  * snapshot/freeze here loses no safety. */
309
334
  protected static readonly identityCollectionObjectProperties:readonly string[];static styles:import("lit").CSSResultGroup[];static get observedAttributes():string[];
310
335
  /** All mode-specific input. Reassign this property after changing caller-owned collections. */
311
- data:HeatmapData;private get effectiveMode();
336
+ data:HeatmapData;
337
+ /** Maximum admitted cells, default 10,000 and bounded to 1–100,000. Calendar input and its
338
+ * 530-week default span scale with this budget. Accessible DOM cells remain windowed at 400. */
339
+ maxCells:number;private get cellBudget();private get effectiveMode();
312
340
  /**
313
341
  * Width, in CSS px, of the matrix row-label gutter, or `'auto'` to measure the widest label and
314
342
  * size the gutter to fit (never below the built-in 60px, never above 40% of the host's width, so
@@ -605,7 +633,8 @@ selectedCell:HeatmapSelectedCell|null;
605
633
  * Click or Enter/Space toggles a cell. Drag paints/erases; Shift+arrows extends a rectangular
606
634
  * range. The default false preserves the existing single-cell event and selection contract. */
607
635
  multiple:boolean;
608
- /** Controlled selection in multiple mode. First MAX_HEATMAP_CELLS entries are clone-owned;
636
+ /** Controlled selection in multiple mode. Up to 10,000 entries and 50,000 cloned values are retained;
637
+ * truncation is disclosed in the projection-limit notice. Entries are clone-owned;
609
638
  * duplicates, invalid/out-of-grid coordinates and non-interactive cells are ignored. Matrix
610
639
  * entries use integer row/col; calendar entries use ISO dates (interactive gaps included).
611
640
  * User actions propose a new array through lr-selection-change, never mutate this property. */
@@ -664,11 +693,11 @@ cellColor?:(pos:MatrixCellPos|CalendarCellPos,value:number)=>string|undefined;pr
664
693
  * continuously into `colorSteps.length` buckets instead. Unset (the default, or fewer than 2
665
694
  * entries) keeps today's 2-endpoint interpolation exactly. Invalid entries use the canvas
666
695
  * fallback color and prevent the custom legend gradient from being assigned. */
667
- colorSteps?:readonly string[];private get calendarColumnX();private get calendarRowY();private canvas?;private resizeObserver?;private intersectionObserver?;private drawFrameRequest?;private dprQuery?;private dprChangeListener?;constructor();private calendarSpacingTrackingArmed?;private explicitCalendarSpacingProperties?;requestUpdate(name?:PropertyKey,oldValue?:unknown,options?:PropertyDeclaration):void;private explicitCalendarSpacing;private cachedValueRange;private cachedMatrixData;private cachedCalendarGrid;private cachedCalendarSortedValues;private cachedCalendarCellsByPos;private cachedCalendarCellsByDate;private cachedAnnotations;private warnOnLegendRampMismatch;private cachedLegendStops;private cachedColorSteps;private cachedCalendarAnnotationDates;private cachedMatrixAnnotationPositions;private decorationProjectionTruncated;private cachedCalendarDateByPos;private cachedColumnGeometry?;private cachedRowGeometry?;private cachedAccessiblePositions;private cachedAccessiblePositionsByKey;private cachedAccessiblePositionIndexByKey;private cachedRamp;private canvasHasContent;private canvasVisible;private drawDirty;private overlayRevision;private hoverCell;private focusedCell;private liveText;private accessibleTargetSizePx;private pendingAccessibleFocus;private pendingAccessibleFocusOrigin;private restoringAccessibleFocus;private accessibleFocusGeneration;private readonly announcements;private authorRole;private authorAriaLabel;private generatedAriaLabel;private syncingGeneratedSemantics;private hasSyncedDescribedByElements;attributeChangedCallback(name:string,oldValue:string|null,value:string|null):void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private watchDpr;private clearDprWatcher;private onDprChange;protected willUpdate(changed:PropertyValues):void;private rebuildBoundedDecorations;private get projectionTruncated();private get cellProjectionTruncated();private projectedCellCount;private projectionDescription;private rebuildCanonicalMatrixData;private selectedCellDescription;private computeValueRange;private localizedValueLabel;private formatNumericValue;private syncExternalDescription;protected updated(changed:PropertyValues):void;
696
+ colorSteps?:readonly string[];private get calendarColumnX();private get calendarRowY();private canvas?;private resizeObserver?;private intersectionObserver?;private drawFrameRequest?;private dprQuery?;private dprChangeListener?;constructor();private calendarSpacingTrackingArmed?;private explicitCalendarSpacingProperties?;requestUpdate(name?:PropertyKey,oldValue?:unknown,options?:PropertyDeclaration):void;private explicitCalendarSpacing;private cachedValueRange;private cachedMatrixData;private cachedCalendarGrid;private cachedCalendarSortedValues;private cachedCalendarCellsByPos;private cachedCalendarCellsByDate;private cachedAnnotations;private warnOnLegendRampMismatch;private cachedLegendStops;private cachedColorSteps;private cachedCalendarAnnotationDates;private cachedMatrixAnnotationPositions;private decorationProjectionTruncated;private cachedCalendarDateByPos;private cachedColumnGeometry?;private cachedRowGeometry?;private cachedAccessiblePositions;private cachedAccessiblePositionsByKey;private cachedAccessiblePositionIndexByKey;private cachedRamp;private canvasHasContent;private canvasVisible;private drawDirty;private overlayRevision;private hoverCell;private focusedCell;private liveText;private accessibleTargetSizePx;private pendingAccessibleFocus;private pendingAccessibleFocusOrigin;private restoringAccessibleFocus;private accessibleFocusGeneration;private readonly announcements;private authorRole;private authorAriaLabel;private generatedAriaLabel;private syncingGeneratedSemantics;private hasSyncedDescribedByElements;attributeChangedCallback(name:string,oldValue:string|null,value:string|null):void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private watchDpr;private clearDprWatcher;private onDprChange;protected willUpdate(changed:PropertyValues):void;private rebuildBoundedDecorations;private get ownedInputTruncated();private get projectionTruncated();private get cellProjectionTruncated();private projectedCellCount;private projectionDescription;private rebuildCanonicalMatrixData;private selectedCellDescription;private computeValueRange;private localizedValueLabel;private formatNumericValue;private syncExternalDescription;private initialLimitUpdate;private lastLimitNotice;protected updated(changed:PropertyValues):void;
668
697
  /** Redraws canvas content after an upstream token or theme change. */
669
- refreshTheme():void;private paintedTheme?;private themeSignature;private onThemeSignal;private refreshAccessibleTargetSize;private scaleEndpoints;private labelColor;private labelFont;private stickyLabelBg;private noDataFill;private focusRingColor;private annotationColor;private selectedColor;private strokeCellState;private isSelectedPos;private draw;private requestDraw;private syncDeferredFitFrame;private repaintFocusRing;private scheduleDraw;private cancelDrawFrame;private resolveColorStep;private colorRamp;private calendarCellSize;private calendarSpacing;private clampFitCellSize;private columnXFor;private rowYFor;private calendarColumnPositions;private calendarRowPositions;private weekdayLabels;private paintCalendarAxisLabels;private drawCalendar;private paintCalendar;private matrixCellSize;private matrixRowHeight;private matrixCellShape;private calendarCellShape;private fillMatrixCell;private paintMatrixCell;private paintMatrixFocusOverlays;private focusRepaintBounds;private repaintMatrixFocusCell;private paintMatrixFocusCell;private paintCalendarCell;private fillCalendarCell;private recordCalendarGeometry;private paintCalendarFocusOverlays;private repaintCalendarFocusCell;private paintCalendarFocusCell;private drawMatrix;private paintMatrix;private paintMatrixRowLabels;private paintMatrixColLabels;private paintFrozenLabelBands;private frozenBandCanvas;private sizeCanvas;private paintFrozenBand;private hitTest;private matrixNavigationGeometry;private calendarNavigationGeometry;private hitTestMatrix;private firstInteractiveMatrixCell;private nextInteractiveMatrixCell;private firstInteractiveCalendarCell;private nextInteractiveCalendarCell;private hitTestCalendar;private calendarCellAt;private calendarValueAt;private calendarDateAt;private calendarPos;private cellRect;private accessibleCellRect;private defaultCellText;private matrixCellText;private calendarCellText;private valueAt;private resolveCellText;private isCellInteractive;
698
+ refreshTheme():void;private paintedTheme?;private themeSignature;private onThemeSignal;private refreshAccessibleTargetSize;private scaleEndpoints;private labelColor;private labelFont;private stickyLabelBg;private noDataFill;private focusRingColor;private annotationColor;private selectedColor;private strokeCellState;private isSelectedPos;private draw;private requestDraw;private syncDeferredFitFrame;private repaintFocusRing;private scheduleDraw;private cancelDrawFrame;private resolveColorStep;private resolvedStepsMemo?;private resolvedColorSteps;private colorRamp;private calendarCellSize;private calendarSpacing;private clampFitCellSize;private calendarPaintColumns?;private calendarPaintRows?;private columnXFor;private rowYFor;private calendarColumnPositions;private calendarRowPositions;private weekdayLabels;private paintCalendarAxisLabels;private drawCalendar;private paintCalendar;private matrixCellSize;private matrixRowHeight;private matrixCellShape;private calendarCellShape;private fillMatrixCell;private paintMatrixCell;private paintMatrixFocusOverlays;private focusRepaintBounds;private repaintMatrixFocusCell;private paintMatrixFocusCell;private paintCalendarCell;private fillCalendarCell;private recordCalendarGeometry;private paintCalendarFocusOverlays;private repaintCalendarFocusCell;private paintCalendarFocusCell;private drawMatrix;private paintMatrix;private paintMatrixRowLabels;private paintMatrixColLabels;private paintFrozenLabelBands;private frozenBandCanvas;private sizeCanvas;private paintFrozenBand;private hitTest;private matrixNavigationGeometry;private calendarNavigationGeometry;private hitTestMatrix;private firstInteractiveMatrixCell;private nextInteractiveMatrixCell;private firstInteractiveCalendarCell;private nextInteractiveCalendarCell;private hitTestCalendar;private calendarCellAt;private calendarValueAt;private calendarDateAt;private calendarPos;private cellRect;private accessibleCellRect;private defaultCellText;private matrixCellText;private calendarCellText;private valueAt;private resolveCellText;private isCellInteractive;
670
699
  /** Refreshes the aria-hidden shadow mirror and shared light-DOM sink for a newly-focused cell.
671
700
  * The selected state goes through the same `heatmapSelectedCellLabel`
672
701
  * template as the host aria-label, so a locale can place the "selected"
673
702
  * wording anywhere around the cell text instead of it being appended. */
674
- private announce;private emitCellClick;private selectedPositions;private selectionPreview?;private selectionAnchor;private selectionRangeBase?;private proposedSelectionKeys?;private selectionGesture?;private suppressSelectionClick;private get currentSelectedPositions();private selectedPaintPositions;private rebuildSelectedPositions;private selectionCoordinates;private proposeSelection;private toggleSelectionPositions;private toggleSelectionAxis;private selectionKeyDown;private extendSelection;private selectionPointerPosition;private onSelectionPointerDown;private paintSelectionTo;private repaintCell;private onSelectionPointerMove;private onSelectionPointerUp;private onSelectionPointerCancel;private cancelSelectionGesture;private consumeSelectionClick;private get gridScrollport();private tooltipSize;private measureTooltip;private tooltipAnchor;private scrollCellIntoView;private samePos;private onPointerMove;private onPointerLeave;private onCanvasClick;private edgeCell;private onKeyDown;private onMatrixKeyDown;private onCalendarKeyDown;private canvasColorCache;private resolveCellColor;private rebuildAccessiblePositions;private accessibleCellPositions;private accessibleCellKey;private accessibleCellIdentity;private accessibleCellAtKey;private focusAccessibleCell;private onAccessibleCellFocus;private onAccessibleCellClick;private onAccessibleCellKeyDown;private renderAccessibleCells;private renderLegendScale;private renderGridSurface;private renderTooltip;private renderLegend;render():TemplateResult;private formatCount;}declare global{interface HTMLElementTagNameMap{'lr-heatmap':LyraHeatmap;}}
703
+ private announce;private emitCellClick;private selectedPositions;private selectionPreview?;private selectionAnchor;private selectionRangeBase?;private proposedSelectionKeys?;private selectionGesture?;private suppressSelectionClick;private get currentSelectedPositions();private pendingSelectionRepaint?;private selectedPaintPositions;private rebuildSelectedPositions;private selectionCoordinates;private proposeSelection;private toggleSelectionPositions;private toggleSelectionAxis;private selectionKeyDown;private extendSelection;private selectionPointerPosition;private onSelectionPointerDown;private paintSelectionTo;private repaintCell;private onSelectionPointerMove;private onSelectionPointerUp;private onSelectionPointerCancel;private cancelSelectionGesture;private consumeSelectionClick;private get gridScrollport();private tooltipSize;private measureTooltip;private tooltipAnchor;private scrollCellIntoView;private samePos;private onPointerMove;private onPointerLeave;private onCanvasClick;private edgeCell;private onKeyDown;private onMatrixKeyDown;private onCalendarKeyDown;private canvasColorCache;private resolveCellColor;private rebuildAccessiblePositions;private accessibleCellPositions;private accessibleCellKey;private accessibleCellIdentity;private accessibleCellAtKey;private focusAccessibleCell;private onAccessibleCellFocus;private onAccessibleCellClick;private onAccessibleCellKeyDown;private accessibleWindowStart;private syncAccessibleTabStop;private renderAccessibleCells;private renderLegendScale;private renderGridSurface;private renderTooltip;private renderLegend;render():TemplateResult;private formatCount;}declare global{interface HTMLElementTagNameMap{'lr-heatmap':LyraHeatmap;}}