@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,6 +1,26 @@
1
- import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{guard}from"lit/directives/guard.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{finiteInteger,finiteNumber,finiteRange,minMax}from"../../../internal/numbers.js";import{getScratchCtx,resolveBoundedCanvasAllocation}from"../../../internal/canvas.js";import{resolveCanvasColor}from"../../../internal/canvas-color.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{activeElementIn,shadowFocusTarget}from"../../../internal/active-element.js";import{linearAlpha,linearBucket,midpointAlpha,midpointBucket,sqrtStep}from"./heatmap-scale.js";import{styles}from"./heatmap.styles.js";import{resolveRgb,formatRgb}from"./heatmap-colors.js";import{hexToRgb,resolveRgb as resolveRgb2}from"./heatmap-colors.js";import{DEFAULT_BUCKET_COUNT,MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS,MAX_ACCESSIBLE_HEATMAP_CELLS,normalizeBucketCount}from"./heatmap-limits.js";import{MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS as MAX_HEATMAP_CELLS2,MAX_HEATMAP_DECORATIONS as MAX_HEATMAP_DECORATIONS2,MAX_ACCESSIBLE_HEATMAP_CELLS as MAX_ACCESSIBLE_HEATMAP_CELLS2,normalizeBucketCount as normalizeBucketCount2}from"./heatmap-limits.js";import{buildCalendarGrid,parseIsoDate,quartileBucket}from"./calendar-grid.js";import{accessibleMatrixCellRect,calendarCellAt as readCalendarCell,calendarCellRect,calendarDateAt as readCalendarDate,calendarValueAt as readCalendarValue,firstInteractiveCalendarCell as findFirstInteractiveCalendarCell,firstInteractiveMatrixCell as findFirstInteractiveMatrixCell,hitTestCalendar as hitTestCalendarGrid,hitTestMatrix as hitTestMatrixGrid,matrixCellRect,nextInteractiveCalendarCell as findNextInteractiveCalendarCell,nextInteractiveMatrixCell as findNextInteractiveMatrixCell}from"./heatmap-grid-navigation.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{literalSetConverter}from"../../../internal/converters.js";import{HeatmapLabelCache}from"./heatmap-label-cache.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{escapeCsvField}from"../../utility/export-button/csv.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{LYRA_DEFAULT_heatmapCalendarCellLabel,LYRA_DEFAULT_heatmapCalendarLabel,LYRA_DEFAULT_heatmapDecorationLimit,LYRA_DEFAULT_heatmapDefaultColLabel,LYRA_DEFAULT_heatmapDefaultRowLabel,LYRA_DEFAULT_heatmapMatrixCellLabel,LYRA_DEFAULT_heatmapMatrixLabel,LYRA_DEFAULT_heatmapNoDataValue,LYRA_DEFAULT_heatmapProjectionLimit,LYRA_DEFAULT_heatmapSelectedCellLabel,LYRA_DEFAULT_heatmapSelectedCount,LYRA_DEFAULT_heatmapValueLabel}from"../../../internal/default-strings/data.generated.js";const PAD_LEFT=60,PAD_TOP=20,ROW_LABEL_INSET=4,MAX_ROW_LABEL_FRACTION=.4,MAX_COL_LABEL_HEIGHT=240,COL_LABEL_INSET=6,labelExtentConverter={fromAttribute:value=>{if(value===null)return;const trimmed=value.trim();if(trimmed.toLowerCase()==="auto")return"auto";const parsed=Number.parseFloat(trimmed);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0},toAttribute:value=>value===void 0?null:String(value)},STICKY_LABELS=literalSetConverter(["none","rows","cols","both"],"none"),FALLBACK_NO_DATA_FILL="rgba(128,128,128,0.25)",FALLBACK_STICKY_LABEL_BG="#ffffff",RAMP_STEPS=7,FALLBACK_SCALE_LO="#cde2fb",FALLBACK_SCALE_HI="#0969da",FALLBACK_LABEL_FONT="10px system-ui, sans-serif",CAL_PAD_LEFT=28,CAL_WEEKDAY_LABEL_INSET=2,CAL_LABEL_H=16,CAL_CELL=11,CAL_GAP=2,DEFAULT_MATRIX_CELL_SIZE=22,MAX_MATRIX_ROW_HEIGHT=4096,DEFAULT_ACCESSIBLE_TARGET_SIZE_PX=40,FIT_MIN_CELL=4,RING_LINE_WIDTH=2,FALLBACK_FOCUS_RING_COLOR="#0969da",FALLBACK_ANNOTATION_COLOR="#cf222e",FALLBACK_SELECTED_COLOR="#1a7f37",SCOPED_COLOR=/var\(|currentcolor|light-dark\(/i,MAX_CANVAS_DIMENSION=16384,MAX_CANVAS_PIXELS=16777216,ARROW_KEYS=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),GRID_KEYS=new Set([...ARROW_KEYS,"Home","End"]),MS_PER_DAY=864e5,CAL_MONTH_LABEL_GAP=2;function isoDateAtOffset(firstWeekStart,dayOffset){return new Date(firstWeekStart.getTime()+dayOffset*MS_PER_DAY).toISOString().slice(0,10)}function legendStopsChanged(value,previous){if(Object.is(value,previous))return!1;if(!Array.isArray(value)||!Array.isArray(previous)||value.length!==previous.length)return!0;for(let index=0;index<value.length;index+=1){if(Object.hasOwn(value,index)!==Object.hasOwn(previous,index))return!0;const next=value[index],before=previous[index];if(!next||!before){if(!Object.is(next,before))return!0;continue}if(!Object.is(next.value,before.value)||!Object.is(next.color,before.color)||!Object.is(next.label,before.label)||!Object.is(next.partOfRamp,before.partOfRamp))return!0}return!1}const optionalCellSizeConverter={fromAttribute(value){if(value===null||value.trim()==="")return;const parsed=Number(value);return Number.isFinite(parsed)?parsed:void 0}},DEFAULT_MATRIX_DATA=Object.freeze({kind:"matrix",rowLabels:Object.freeze([]),colLabels:Object.freeze([]),values:Object.freeze([])});function normalizeCellSizeClamp(value){if(!(value==null||!Number.isFinite(value)))return finiteRange(value,FIT_MIN_CELL,FIT_MIN_CELL)}const bucketCountConverter={fromAttribute(value){return value===null?DEFAULT_BUCKET_COUNT:normalizeBucketCount(Number(value))}};function mixRgb(from,to,t){const clamped=Math.min(1,Math.max(0,t)),r=Math.round(from[0]+(to[0]-from[0])*clamped),g=Math.round(from[1]+(to[1]-from[1])*clamped),b=Math.round(from[2]+(to[2]-from[2])*clamped),a=from[3]+(to[3]-from[3])*clamped;return formatRgb([r,g,b,a])}const CALENDAR_SPACING_PROPERTIES=new Set(["cellGapX","cellGapY","cellRadius"]);class LyraHeatmap extends LyraElement{static{this.defaultStrings={...super.defaultStrings,heatmapCalendarCellLabel:LYRA_DEFAULT_heatmapCalendarCellLabel,heatmapCalendarLabel:LYRA_DEFAULT_heatmapCalendarLabel,heatmapDecorationLimit:LYRA_DEFAULT_heatmapDecorationLimit,heatmapDefaultColLabel:LYRA_DEFAULT_heatmapDefaultColLabel,heatmapDefaultRowLabel:LYRA_DEFAULT_heatmapDefaultRowLabel,heatmapMatrixCellLabel:LYRA_DEFAULT_heatmapMatrixCellLabel,heatmapMatrixLabel:LYRA_DEFAULT_heatmapMatrixLabel,heatmapNoDataValue:LYRA_DEFAULT_heatmapNoDataValue,heatmapProjectionLimit:LYRA_DEFAULT_heatmapProjectionLimit,heatmapSelectedCellLabel:LYRA_DEFAULT_heatmapSelectedCellLabel,heatmapSelectedCount:LYRA_DEFAULT_heatmapSelectedCount,heatmapValueLabel:LYRA_DEFAULT_heatmapValueLabel}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-selection-change"])}static{this.ownedCollectionProperties=Object.freeze(["data","annotations","legendStops","colorSteps","selectedCells"])}static{this.identityCollectionObjectProperties=Object.freeze(["data"])}static{this.styles=[LyraElement.styles,styles,srOnly]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get effectiveMode(){return this.data.kind}get stickyLabels(){return this._stickyLabels}set stickyLabels(next){const normalized=STICKY_LABELS.normalizeReflected(this,"sticky-labels",next),old=this._stickyLabels;old!==normalized&&(this._stickyLabels=normalized,this.requestUpdate("stickyLabels",old))}get effectiveStickyLabels(){return this.effectiveMode==="matrix"?this._stickyLabels:"none"}get freezesRowLabels(){const sticky=this.effectiveStickyLabels;return sticky==="rows"||sticky==="both"}get freezesColLabels(){const sticky=this.effectiveStickyLabels;return sticky==="cols"||sticky==="both"}get effectiveColLabelRotation(){if(typeof this.colLabelRotation!="number")return 0;const degrees=finiteNumber(this.colLabelRotation,0);return Math.min(90,Math.max(0,degrees))}get matrixPadLeft(){if(this.rowLabelWidth==="auto")return this.resolvedRowLabelWidth;if(typeof this.rowLabelWidth!="number")return PAD_LEFT;const resolved=finiteNumber(this.rowLabelWidth,PAD_LEFT);return resolved>=0?resolved:PAD_LEFT}get matrixGeometry(){if(this.effectiveMode==="matrix")return this.lastPaintedMatrixGeometry}set matrixGeometry(_value){}get calendarGeometry(){if(this.effectiveMode==="calendar")return this.lastPaintedCalendarGeometry}set calendarGeometry(_value){}exportData(format){if(format==="csv")return this.exportCsv();if(format!=="png"||!this.canvasHasContent||this.drawDirty||!this.canvas||this.canvas.width<=0||this.canvas.height<=0)return"";try{const rowBand=this.frozenBandCanvas("row-labels"),colBand=this.frozenBandCanvas("col-labels");if(!rowBand&&!colBand)return this.canvas.toDataURL("image/png");const composite=this.ownerDocument.createElement("canvas");composite.width=this.canvas.width,composite.height=this.canvas.height;const context=composite.getContext("2d");return context?(context.drawImage(this.canvas,0,0),rowBand&&rowBand.width>0&&rowBand.height>0&&context.drawImage(rowBand,0,0),colBand&&colBand.width>0&&colBand.height>0&&context.drawImage(colBand,0,0),composite.toDataURL("image/png")):""}catch{return""}}exportCsv(){const data=this.data;if(data.kind==="calendar"){const header2=["date","value"].map(escapeCsvField).join(","),rows2=data.days.filter(day=>!this.isNoData(day.value)).map(day=>[day.date,day.value].map(escapeCsvField).join(","));return[header2,...rows2].join(`\r
1
+ import{__decorate}from"tslib";import{matrixRectangle}from"./heatmap-matrix-source.js";import{HeatmapMatrixSourceController}from"./heatmap-matrix-source-controller.js";import{lyraLocaleCatalogVersion}from"../../../internal/localization-runtime.js";import{getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{collectionSupport,publicCollectionTruncation}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{guard}from"lit/directives/guard.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{finiteCount,finiteInteger,finiteNumber,finiteRange,minMax}from"../../../internal/numbers.js";import{getScratchCtx,resolveBoundedCanvasAllocation}from"../../../internal/canvas.js";import{resolveCanvasColor}from"../../../internal/canvas-color.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{activeElementIn,shadowFocusTarget}from"../../../internal/active-element.js";import{linearAlpha,linearBucket,midpointAlpha,midpointBucket,sqrtStep}from"./heatmap-scale.js";import{styles}from"./heatmap.styles.js";import{resolveRgb,formatRgb}from"./heatmap-colors.js";import{hexToRgb,resolveRgb as resolveRgb2}from"./heatmap-colors.js";import{DEFAULT_BUCKET_COUNT,MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS,MAX_ACCESSIBLE_HEATMAP_CELLS,normalizeBucketCount}from"./heatmap-limits.js";import{MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS as MAX_HEATMAP_CELLS2,MAX_HEATMAP_DECORATIONS as MAX_HEATMAP_DECORATIONS2,MAX_ACCESSIBLE_HEATMAP_CELLS as MAX_ACCESSIBLE_HEATMAP_CELLS2,normalizeBucketCount as normalizeBucketCount2}from"./heatmap-limits.js";import{buildCalendarGrid,parseIsoDate,quartileBucket}from"./calendar-grid.js";import{accessibleMatrixCellRect,calendarCellAt as readCalendarCell,calendarCellRect,calendarDateAt as readCalendarDate,calendarValueAt as readCalendarValue,firstInteractiveCalendarCell as findFirstInteractiveCalendarCell,firstInteractiveMatrixCell as findFirstInteractiveMatrixCell,hitTestCalendar as hitTestCalendarGrid,hitTestMatrix as hitTestMatrixGrid,matrixCellRect,nextInteractiveCalendarCell as findNextInteractiveCalendarCell,nextInteractiveMatrixCell as findNextInteractiveMatrixCell}from"./heatmap-grid-navigation.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{literalSetConverter}from"../../../internal/converters.js";import{HeatmapLabelCache}from"./heatmap-label-cache.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{escapeCsvField}from"../../utility/export-button/csv.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{LYRA_DEFAULT_heatmapCalendarCellLabel,LYRA_DEFAULT_heatmapCalendarLabel,LYRA_DEFAULT_heatmapDecorationLimit,LYRA_DEFAULT_heatmapDefaultColLabel,LYRA_DEFAULT_heatmapDefaultRowLabel,LYRA_DEFAULT_heatmapInputLimit,LYRA_DEFAULT_heatmapMatrixCellLabel,LYRA_DEFAULT_heatmapMatrixLabel,LYRA_DEFAULT_heatmapNoDataValue,LYRA_DEFAULT_heatmapProjectionLimit,LYRA_DEFAULT_heatmapSelectedCellLabel,LYRA_DEFAULT_heatmapSelectedCount,LYRA_DEFAULT_heatmapSourceError,LYRA_DEFAULT_heatmapSourceExactWindow,LYRA_DEFAULT_heatmapSourceKeyboardHelp,LYRA_DEFAULT_heatmapSourceMax,LYRA_DEFAULT_heatmapSourceMean,LYRA_DEFAULT_heatmapSourceMin,LYRA_DEFAULT_heatmapSourceRangeLabel,LYRA_DEFAULT_heatmapSourceSummary,LYRA_DEFAULT_heatmapValueLabel}from"../../../internal/default-strings/data.generated.js";import{LYRA_DEFAULT_loading,LYRA_DEFAULT_noData}from"../../../internal/default-strings/shared.generated.js";const PAD_LEFT=60,PAD_TOP=20,ROW_LABEL_INSET=4,MAX_ROW_LABEL_FRACTION=.4,MAX_COL_LABEL_HEIGHT=240,COL_LABEL_INSET=6,labelExtentConverter={fromAttribute:value=>{if(value===null)return;const trimmed=value.trim();if(trimmed.toLowerCase()==="auto")return"auto";const parsed=Number.parseFloat(trimmed);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0},toAttribute:value=>value===void 0?null:String(value)},STICKY_LABELS=literalSetConverter(["none","rows","cols","both"],"none"),FALLBACK_NO_DATA_FILL="rgba(128,128,128,0.25)",FALLBACK_STICKY_LABEL_BG="#ffffff",RAMP_STEPS=7,FALLBACK_SCALE_LO="#cde2fb",FALLBACK_SCALE_HI="#0969da",FALLBACK_LABEL_FONT="10px system-ui, sans-serif",CAL_PAD_LEFT=28,CAL_WEEKDAY_LABEL_INSET=2,CAL_LABEL_H=16,CAL_CELL=11,CAL_GAP=2,DEFAULT_MATRIX_CELL_SIZE=22,MAX_MATRIX_ROW_HEIGHT=4096,DEFAULT_ACCESSIBLE_TARGET_SIZE_PX=40,FIT_MIN_CELL=4,RING_LINE_WIDTH=2,FALLBACK_FOCUS_RING_COLOR="#0969da",FALLBACK_ANNOTATION_COLOR="#cf222e",FALLBACK_SELECTED_COLOR="#1a7f37",SCOPED_COLOR=/var\(|currentcolor|light-dark\(/i,MAX_CANVAS_DIMENSION=16384,MAX_CANVAS_PIXELS=16777216,ARROW_KEYS=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),GRID_KEYS=new Set([...ARROW_KEYS,"Home","End"]),MS_PER_DAY=864e5,CAL_MONTH_LABEL_GAP=2;function isoDateAtOffset(firstWeekStart,dayOffset){return new Date(firstWeekStart.getTime()+dayOffset*MS_PER_DAY).toISOString().slice(0,10)}function legendStopsChanged(value,previous){if(Object.is(value,previous))return!1;if(!Array.isArray(value)||!Array.isArray(previous)||value.length!==previous.length)return!0;for(let index=0;index<value.length;index+=1){if(Object.hasOwn(value,index)!==Object.hasOwn(previous,index))return!0;const next=value[index],before=previous[index];if(!next||!before){if(!Object.is(next,before))return!0;continue}if(!Object.is(next.value,before.value)||!Object.is(next.color,before.color)||!Object.is(next.label,before.label)||!Object.is(next.partOfRamp,before.partOfRamp))return!0}return!1}const optionalCellSizeConverter={fromAttribute(value){if(value===null||value.trim()==="")return;const parsed=Number(value);return Number.isFinite(parsed)?parsed:void 0}},DEFAULT_MATRIX_DATA=Object.freeze({kind:"matrix",rowLabels:Object.freeze([]),colLabels:Object.freeze([]),values:Object.freeze([])});function normalizeCellSizeClamp(value){if(!(value==null||!Number.isFinite(value)))return finiteRange(value,FIT_MIN_CELL,FIT_MIN_CELL)}const bucketCountConverter={fromAttribute(value){return value===null?DEFAULT_BUCKET_COUNT:normalizeBucketCount(Number(value))}};function mixRgb(from,to,t){const clamped=Math.min(1,Math.max(0,t)),r=Math.round(from[0]+(to[0]-from[0])*clamped),g=Math.round(from[1]+(to[1]-from[1])*clamped),b=Math.round(from[2]+(to[2]-from[2])*clamped),a=from[3]+(to[3]-from[3])*clamped;return formatRgb([r,g,b,a])}const CALENDAR_SPACING_PROPERTIES=new Set(["cellGapX","cellGapY","cellRadius"]);class LyraHeatmap extends LyraElement{static{this.defaultStrings={...super.defaultStrings,heatmapCalendarCellLabel:LYRA_DEFAULT_heatmapCalendarCellLabel,heatmapCalendarLabel:LYRA_DEFAULT_heatmapCalendarLabel,heatmapDecorationLimit:LYRA_DEFAULT_heatmapDecorationLimit,heatmapDefaultColLabel:LYRA_DEFAULT_heatmapDefaultColLabel,heatmapDefaultRowLabel:LYRA_DEFAULT_heatmapDefaultRowLabel,heatmapInputLimit:LYRA_DEFAULT_heatmapInputLimit,heatmapMatrixCellLabel:LYRA_DEFAULT_heatmapMatrixCellLabel,heatmapMatrixLabel:LYRA_DEFAULT_heatmapMatrixLabel,heatmapNoDataValue:LYRA_DEFAULT_heatmapNoDataValue,heatmapProjectionLimit:LYRA_DEFAULT_heatmapProjectionLimit,heatmapSelectedCellLabel:LYRA_DEFAULT_heatmapSelectedCellLabel,heatmapSelectedCount:LYRA_DEFAULT_heatmapSelectedCount,heatmapSourceError:LYRA_DEFAULT_heatmapSourceError,heatmapSourceExactWindow:LYRA_DEFAULT_heatmapSourceExactWindow,heatmapSourceKeyboardHelp:LYRA_DEFAULT_heatmapSourceKeyboardHelp,heatmapSourceMax:LYRA_DEFAULT_heatmapSourceMax,heatmapSourceMean:LYRA_DEFAULT_heatmapSourceMean,heatmapSourceMin:LYRA_DEFAULT_heatmapSourceMin,heatmapSourceRangeLabel:LYRA_DEFAULT_heatmapSourceRangeLabel,heatmapSourceSummary:LYRA_DEFAULT_heatmapSourceSummary,heatmapValueLabel:LYRA_DEFAULT_heatmapValueLabel,loading:LYRA_DEFAULT_loading,noData:LYRA_DEFAULT_noData}}get matrixSource(){return this.sourceInput}set matrixSource(value){const old=this.sourceInput;this.sourceInput=value,value===null?this.sourceController?.detach():this.sourceController?.invalidate(),this.sourceNeedsConfigure=!0,this.requestUpdate("matrixSource",old,{hasChanged:()=>!0})}get matrixViewport(){return this.sourceViewportInput}set matrixViewport(value){const old=this.sourceViewportInput;this.sourceViewportInvalid=!1;try{this.sourceViewportInput=value===null?null:matrixRectangle(value)}catch{this.sourceViewportInvalid=!0,this.sourceViewportInput=null}this.sourceViewportExplicit=!0,this.sourceNeedsConfigure=!0;const next=this.sourceViewportInput;!this.sourceViewportInvalid&&(old===next||old!==null&&next!==null&&old.rowStart===next.rowStart&&old.rowEnd===next.rowEnd&&old.columnStart===next.columnStart&&old.columnEnd===next.columnEnd)||this.sourceController?.invalidate(),this.requestUpdate("matrixViewport",old,{hasChanged:()=>!0})}async revealSourceCell(row,col){const source=this.matrixSource,intent=++this.sourceRevealIntent;if(!source||!this.isConnected)return!1;const owner=this.ownerDocument,currentIntent=()=>intent===this.sourceRevealIntent&&this.matrixSource===source&&this.isConnected&&this.ownerDocument===owner;if(this.sourceController.retainWindowFor(row,col),!currentIntent()||(await this.updateComplete,!currentIntent()))return!1;const controller=this.sourceController;if(this.matrixSource!==source||!controller.valid(row,col)||controller.error)return!1;const viewport=controller.viewport;if(viewport&&this.matrixViewport&&(row<viewport.rowStart||row>=viewport.rowEnd||col<viewport.columnStart||col>=viewport.columnEnd)){const height=viewport.rowEnd-viewport.rowStart,width=viewport.columnEnd-viewport.columnStart,rowStart=Math.max(0,Math.min(controller.rows-height,row)),columnStart=Math.max(0,Math.min(controller.cols-width,col));if(this.matrixViewport=Object.freeze({rowStart,rowEnd:rowStart+height,columnStart,columnEnd:columnStart+width}),await this.updateComplete,!currentIntent())return!1}const focusBefore=activeElementIn(this.ownerDocument),focusVersion=this.sourceFocusVersion,epoch=controller.requests.epoch,current=()=>currentIntent()&&this.sourceCurrent(source,epoch)&&focusVersion===this.sourceFocusVersion,cell=await controller.exact(row,col);if(!cell||!current())return!1;const cellInteractive=this.cellInteractive;if(!current()||!(cellInteractive?.call(this,{row,col},cell.value??Number.NaN)??!0)||!current())return!1;const label=this.sourceCellLabel(cell,current);if(!current()||(controller.cursor=cell,this.accessibleCells&&!await controller.ensureWindow(row,col))||!current()||(this.sourceResult++,await this.updateComplete,!current()))return!1;const control=this.shadowRoot?.querySelector(`[data-source-row="${row}"][data-source-col="${col}"]`)??this.shadowRoot?.querySelector("[data-source-entry]");if(activeElementIn(this.ownerDocument)!==focusBefore)return!1;this.sourceRestoringFocus=!0;try{control?.focus()}finally{this.sourceRestoringFocus=!1}return current()&&this.announcements.announcePolite(label),!!control&&current()}sourceCurrent(source,epoch){return this.isConnected&&this.matrixSource===source&&this.sourceController.requests.epoch===epoch}configureSource(){if(!this.matrixSource)return;const width=Math.floor(Math.min(MAX_CANVAS_DIMENSION,Math.max(0,this.getBoundingClientRect().width)));if(!(width<=0)&&!(!this.sourceNeedsConfigure&&width===this.sourceWidth)){if(this.sourceWidth=width,this.sourceNeedsConfigure=!1,this.sourceViewportInvalid||this.data.kind!=="matrix"||!["mean","min","max"].includes(this.matrixReducer)){this.sourceController.fail();return}this.sourceController.configure(this.matrixSource,this.matrixViewport,this.sourceViewportExplicit,Math.min(this.cellBudget,Math.max(1,width*width))),this.sourceViewportExplicit=!1}}sourceRangeLabel(tile){const format=value=>value===null?this.localize("heatmapNoDataValue"):getNumberFormat(this.effectiveLocale).format(value);return this.localize("heatmapSourceRangeLabel",void 0,{rowStart:format(tile.rowStart+1),rowEnd:format(tile.rowEnd),columnStart:format(tile.columnStart+1),columnEnd:format(tile.columnEnd),valid:format(tile.validCount),count:format(tile.count),min:format(tile.min),max:format(tile.max),reducer:this.sourceReducerLabel(),value:format(this.sourceTileValue(tile))})}sourceReducerLabel(){return this.localize(this.matrixReducer==="min"?"heatmapSourceMin":this.matrixReducer==="max"?"heatmapSourceMax":"heatmapSourceMean")}sourceTileValue(tile){return tile.validCount===0?null:this.matrixReducer==="mean"?tile.sum/tile.validCount:tile[this.matrixReducer]}sourceRange(tile){const controller=this.sourceController;!this.matrixSource||controller.error||controller.loading||controller.revision===void 0||this.emit("lr-matrix-range-select",Object.freeze({...tile,revision:controller.revision}))}async sourceActivate(row,col,origin="keyboard"){const source=this.matrixSource,epoch=this.sourceController.requests.epoch;if(!source)return;const cell=await this.sourceController.exact(row,col);if(!cell||!this.sourceCurrent(source,epoch))return;const cellInteractive=this.cellInteractive;if(!(!this.sourceCurrent(source,epoch)||!(cellInteractive?.call(this,{row,col},cell.value??Number.NaN)??!0)||!this.sourceCurrent(source,epoch))){if(this.sourceController.cursor=cell,this.sourceResult++,this.multiple){const cells=this.selectedCells.slice(0,MAX_HEATMAP_CELLS).filter(cell2=>cell2.row!==void 0&&cell2.col!==void 0&&this.sourceController.valid(cell2.row,cell2.col)),next=cells.some(cell2=>cell2.row===row&&cell2.col===col)?cells.filter(cell2=>cell2.row!==row||cell2.col!==col):[...cells.slice(0,MAX_HEATMAP_CELLS-1),{row,col}];if(!this.sourceCurrent(source,epoch)||(this.emit("lr-selection-change",{selectedCells:next,source:origin}),!this.sourceCurrent(source,epoch)))return}this.emit("lr-cell-activate",Object.freeze({row,col,value:cell.value??Number.NaN}))}}sourceTileAt(row,col){return this.sourceController.tiles.find(tile=>row>=tile.rowStart&&row<tile.rowEnd&&col>=tile.columnStart&&col<tile.columnEnd)}sourceCellLabel(cell,current){const cellText=this.cellText;return current()?cellText?.call(this,{row:cell.row,col:cell.col},cell.value??Number.NaN)??this.localize("heatmapMatrixCellLabel",void 0,{row:cell.rowLabel,col:cell.columnLabel,value:cell.value===null?this.localize("heatmapNoDataValue"):getNumberFormat(this.effectiveLocale).format(cell.value)}):""}sourceCsv(){const controller=this.sourceController;return controller.loading||controller.error||!controller.tiles.length?"":["rowStart,rowEnd,columnStart,columnEnd,count,validCount,min,max,sum,reducer,value",...controller.tiles.map(tile=>[tile.rowStart,tile.rowEnd,tile.columnStart,tile.columnEnd,tile.count,tile.validCount,tile.min??"",tile.max??"",tile.sum,this.matrixReducer,this.sourceTileValue(tile)??""].map(escapeCsvField).join(","))].join(`\r
2
+ `)}paintSource(){this.configureSource();const controller=this.sourceController,viewport=controller.viewport,canvas=this.shadowRoot?.querySelector("canvas");if(!canvas||!viewport||controller.loading||controller.error)return;const source=this.matrixSource,epoch=controller.requests.epoch,width=this.sourceWidth,ctx=this.sizeCanvas(canvas,width,width),cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!ctx||!cs){this.scheduleAfterUpdate(()=>{this.sourceCurrent(source,epoch)&&controller.fail()},"heatmap-source-canvas-failure");return}const ramp=this.colorRamp(RAMP_STEPS,cs).colors,noData=this.noDataFill(cs),lo=this.cachedValueRange?.[0]??0,hi=this.cachedValueRange?.[1]??1;ctx.clearRect(0,0,width,width);for(const tile of controller.tiles){const value=this.sourceTileValue(tile),magnitude=Math.max(1,Math.abs(lo),Math.abs(hi),Math.abs(value??0)),normalized=value===null||lo===hi?0:(value/magnitude-lo/magnitude)/(hi/magnitude-lo/magnitude);ctx.fillStyle=value===null?noData:ramp[this.scale==="sqrt"?Math.max(0,sqrtStep(Math.max(0,normalized),1,ramp.length)):this.rampBucket(value,lo,hi,ramp.length)],ctx.fillRect((tile.columnStart-viewport.columnStart)/(viewport.columnEnd-viewport.columnStart)*width,(tile.rowStart-viewport.rowStart)/(viewport.rowEnd-viewport.rowStart)*width,(tile.columnEnd-tile.columnStart)/(viewport.columnEnd-viewport.columnStart)*width,(tile.rowEnd-tile.rowStart)/(viewport.rowEnd-viewport.rowStart)*width)}const cursor=controller.cursor;cursor&&cursor.row>=viewport.rowStart&&cursor.row<viewport.rowEnd&&cursor.col>=viewport.columnStart&&cursor.col<viewport.columnEnd&&(ctx.strokeStyle=this.focusRingColor(cs),ctx.strokeRect((cursor.col-viewport.columnStart)/(viewport.columnEnd-viewport.columnStart)*width,(cursor.row-viewport.rowStart)/(viewport.rowEnd-viewport.rowStart)*width,Math.max(1,width/(viewport.columnEnd-viewport.columnStart)),Math.max(1,width/(viewport.rowEnd-viewport.rowStart))));const selected=this.selectedCell;selected?.row!==void 0&&selected.col!==void 0&&controller.valid(selected.row,selected.col)&&selected.row>=viewport.rowStart&&selected.row<viewport.rowEnd&&selected.col>=viewport.columnStart&&selected.col<viewport.columnEnd&&(ctx.strokeStyle=this.selectedColor(cs),ctx.strokeRect((selected.col-viewport.columnStart)/(viewport.columnEnd-viewport.columnStart)*width,(selected.row-viewport.rowStart)/(viewport.rowEnd-viewport.rowStart)*width,Math.max(1,width/(viewport.columnEnd-viewport.columnStart)),Math.max(1,width/(viewport.rowEnd-viewport.rowStart)))),this.canvasHasContent=!0}renderSource(){const controller=this.sourceController,viewport=controller.viewport,number=value=>getNumberFormat(this.effectiveLocale).format(value),summary=viewport?this.localize("heatmapSourceSummary",void 0,{rows:number(controller.rows),cols:number(controller.cols),rowStart:number(viewport.rowStart+1),rowEnd:number(viewport.rowEnd),columnStart:number(viewport.columnStart+1),columnEnd:number(viewport.columnEnd),tiles:number(controller.tiles.length)}):this.localize("noData"),completeSummary=this.localize("heatmapMatrixLabel",void 0,{rows:number(controller.rows),cols:number(controller.cols),label:this.valueLabel||this.localize("heatmapValueLabel"),range:controller.domain?`${number(controller.domain.min)}–${number(controller.domain.max)}`:this.localize("heatmapNoDataValue")}),cells=controller.cells,rows=[...new Set(cells.map(cell=>cell.row))],cursor=controller.cursor,source=this.matrixSource,epoch=controller.requests.epoch,presentation=new Map,current=()=>this.sourceCurrent(source,epoch);for(const cell of cells){const cellInteractive=this.cellInteractive;if(!current())return html``;const interactive=cellInteractive?.call(this,{row:cell.row,col:cell.col},cell.value??Number.NaN)??!0;if(!current())return html``;const label=this.sourceCellLabel(cell,current);if(!current())return html``;const cellColor=this.cellColor;if(!current())return html``;const color=cellColor?.call(this,{row:cell.row,col:cell.col},cell.value??Number.NaN);if(!this.sourceCurrent(source,epoch))return html``;presentation.set(cell,{label,interactive,color:color?sanitizeCssColor(color)??void 0:void 0})}const entry=cells.find(cell=>presentation.get(cell)?.interactive&&cell.row===cursor?.row&&cell.col===cursor.col)??cells.find(cell=>presentation.get(cell)?.interactive),windowLabel=cells.length?this.localize("heatmapSourceExactWindow",void 0,{rowStart:number(cells[0].row+1),rowEnd:number(cells[cells.length-1].row+1),columnStart:number(Math.min(...cells.map(cell=>cell.col))+1),columnEnd:number(Math.max(...cells.map(cell=>cell.col))+1)}):this.localize("loading");return html`<div part="base" aria-busy=${String(controller.loading)} @focusin=${()=>{this.sourceRestoringFocus||this.sourceFocusVersion++}}>
3
+ <p part="source-summary">${summary} ${completeSummary}</p>
4
+ <p id="source-help">${this.localize("heatmapSourceKeyboardHelp")}</p>
5
+ ${controller.error?html`<p part="source-error">${this.localize("heatmapSourceError")}</p>`:nothing}
6
+ ${viewport?html`<div class="source-axes" aria-hidden="true"><span>${number(viewport.columnStart+1)}</span><span>${number(viewport.columnStart+Math.floor((viewport.columnEnd-viewport.columnStart-1)/2)+1)}</span><span>${number(viewport.columnEnd)}</span></div>`:nothing}
7
+ <canvas part="canvas" data-source-entry tabindex=${this.accessibleCells?"-1":"0"} role=${this.accessibleCells?nothing:"application"}
8
+ aria-hidden=${this.accessibleCells?"true":nothing} aria-label=${this.accessibleCells?nothing:this.getAttribute("aria-label")||summary} aria-describedby="source-help"
9
+ @click=${this.sourceClick} @mousemove=${this.sourceHover} @mouseleave=${()=>{this.sourceHovered=null}} @keydown=${this.sourceKeydown}></canvas>
10
+ ${this.sourceHovered?html`<p part="tooltip">${this.sourceRangeLabel(this.sourceHovered)}</p>`:nothing}
11
+ ${this.accessibleCells?html`<p>${windowLabel}</p><div part="source-exact-window" role="grid" aria-label=${this.getAttribute("aria-label")||windowLabel}
12
+ aria-rowcount=${controller.rows} aria-colcount=${controller.cols} tabindex=${entry?"-1":"0"} data-source-entry @keydown=${this.sourceKeydown}>
13
+ ${rows.map(row=>html`<div role="row" aria-rowindex=${row+1}>${cells.filter(cell=>cell.row===row).map(cell=>html`<div role="gridcell" aria-colindex=${cell.col+1} aria-selected=${String(this.multiple?this.sourceSelectedKeys.has(`${cell.row}:${cell.col}`):this.selectedCell?.row===cell.row&&this.selectedCell.col===cell.col)}><button part="cell" data-source-row=${cell.row} data-source-col=${cell.col}
14
+ ?disabled=${!presentation.get(cell)?.interactive} style=${styleMap({backgroundColor:presentation.get(cell)?.color})}
15
+ tabindex=${entry?.row===cell.row&&entry?.col===cell.col?"0":"-1"}
16
+ @focus=${()=>{this.sourceCurrent(source,epoch)&&controller.cells===cells&&(controller.cursor=cell,controller.retainWindowFor(cell.row,cell.col),this.sourceResult++)}}
17
+ @click=${()=>{this.sourceCurrent(source,epoch)&&controller.cells===cells&&this.sourceActivate(cell.row,cell.col,"pointer")}}>${presentation.get(cell)?.label}</button></div>`)}</div>`)}
18
+ </div>`:nothing}
19
+ ${this.withoutLegend?nothing:this.renderLegend(this.cachedValueRange)}
20
+ <div part="source-status">${controller.loading?this.localize("loading"):nothing}</div>
21
+ </div>`}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-selection-change"])}static{this.ownedCollectionProperties=Object.freeze(["data","annotations","legendStops","colorSteps","selectedCells"])}static{this.identityCollectionObjectProperties=Object.freeze(["data"])}static{this.styles=[LyraElement.styles,styles,srOnly]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get cellBudget(){return Math.max(1,Math.min(1e5,finiteCount(this.maxCells,MAX_HEATMAP_CELLS)))}get effectiveMode(){return this.data.kind}get stickyLabels(){return this._stickyLabels}set stickyLabels(next){const normalized=STICKY_LABELS.normalizeReflected(this,"sticky-labels",next),old=this._stickyLabels;old!==normalized&&(this._stickyLabels=normalized,this.requestUpdate("stickyLabels",old))}get effectiveStickyLabels(){return this.effectiveMode==="matrix"?this._stickyLabels:"none"}get freezesRowLabels(){const sticky=this.effectiveStickyLabels;return sticky==="rows"||sticky==="both"}get freezesColLabels(){const sticky=this.effectiveStickyLabels;return sticky==="cols"||sticky==="both"}get effectiveColLabelRotation(){if(typeof this.colLabelRotation!="number")return 0;const degrees=finiteNumber(this.colLabelRotation,0);return Math.min(90,Math.max(0,degrees))}get matrixPadLeft(){if(this.rowLabelWidth==="auto")return this.resolvedRowLabelWidth;if(typeof this.rowLabelWidth!="number")return PAD_LEFT;const resolved=finiteNumber(this.rowLabelWidth,PAD_LEFT);return resolved>=0?resolved:PAD_LEFT}get matrixGeometry(){if(!(this.matrixSource||this.effectiveMode!=="matrix"))return this.lastPaintedMatrixGeometry}set matrixGeometry(_value){}get calendarGeometry(){if(this.effectiveMode==="calendar")return this.lastPaintedCalendarGeometry}set calendarGeometry(_value){}exportData(format){if(format==="csv")return this.exportCsv();if(this.matrixSource&&(this.sourceController.loading||this.sourceController.error||this.sourceNeedsConfigure)||format!=="png"||!this.canvasHasContent||this.drawDirty||!this.canvas||this.canvas.width<=0||this.canvas.height<=0)return"";try{const rowBand=this.frozenBandCanvas("row-labels"),colBand=this.frozenBandCanvas("col-labels");if(!rowBand&&!colBand)return this.canvas.toDataURL("image/png");const composite=this.ownerDocument.createElement("canvas");composite.width=this.canvas.width,composite.height=this.canvas.height;const context=composite.getContext("2d");return context?(context.drawImage(this.canvas,0,0),rowBand&&rowBand.width>0&&rowBand.height>0&&context.drawImage(rowBand,0,0),colBand&&colBand.width>0&&colBand.height>0&&context.drawImage(colBand,0,0),composite.toDataURL("image/png")):""}catch{return""}}exportCsv(){if(this.matrixSource)return this.sourceCsv();const data=this.data;if(data.kind==="calendar"){const header2=["date","value"].map(escapeCsvField).join(","),rows2=data.days.filter(day=>!this.isNoData(day.value)).map(day=>[day.date,day.value].map(escapeCsvField).join(","));return[header2,...rows2].join(`\r
2
22
  `)}const header=["row","column","value"].map(escapeCsvField).join(","),rows=[];return data.values.forEach((rowValues,rowIndex)=>{const rowLabel=data.rowLabels[rowIndex]??"";rowValues.forEach((value,colIndex)=>{if(this.isNoData(value))return;const colLabel=data.colLabels[colIndex]??"";rows.push([rowLabel,colLabel,value].map(escapeCsvField).join(","))})}),[header,...rows].join(`\r
3
- `)}get matrixPadTop(){if(this.colLabelHeight==="auto")return this.resolvedColLabelHeight;if(typeof this.colLabelHeight!="number")return PAD_TOP;const resolved=finiteNumber(this.colLabelHeight,PAD_TOP);return resolved>=0?resolved:PAD_TOP}measureColLabelHeight(cs){const labels=this.matrixColLabels;if(labels.length===0)return PAD_TOP;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_TOP;ctx.font=this.labelFont(cs);let widest=0;const interval=finiteInteger(this.colLabelInterval,1,1);for(let index=0;index<labels.length;index+=interval)widest=Math.max(widest,this.labelWidth(ctx,labels[index]));const radians=this.effectiveColLabelRotation*Math.PI/180,projected=widest*Math.sin(radians);return Math.max(PAD_TOP,Math.min(Math.ceil(projected)+COL_LABEL_INSET,MAX_COL_LABEL_HEIGHT))}measureRowLabelWidth(cs){const labels=this.matrixRowLabels;if(labels.length===0)return PAD_LEFT;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of labels)widest=Math.max(widest,this.labelWidth(ctx,label));const hostWidth=this.clientWidth||0,cap=hostWidth>0?hostWidth*MAX_ROW_LABEL_FRACTION:Number.POSITIVE_INFINITY;return Math.min(Math.max(PAD_LEFT,Math.ceil(widest)+ROW_LABEL_INSET*2),cap)}withLabelCache(paint){const previous=this.labelCache;this.labelCache=new HeatmapLabelCache;try{paint()}finally{this.labelCache=previous}}labelWidth(ctx,label){return this.labelCache?.width(ctx,label)??ctx.measureText(label).width}ellipsize(ctx,label,maxWidth){return this.labelCache?.clip(ctx,label,maxWidth,()=>this.ellipsizeLabel(ctx,label,maxWidth))??this.ellipsizeLabel(ctx,label,maxWidth)}ellipsizeLabel(ctx,label,maxWidth){if(maxWidth<=0)return"";if(this.labelWidth(ctx,label)<=maxWidth)return label;const characters=[...label],shortened=kept=>`${characters.slice(0,kept).join("")}…`;let fits=0,most=characters.length-1;for(;fits<most;){const kept=fits+most+1>>1;this.labelWidth(ctx,shortened(kept))<=maxWidth?fits=kept:most=kept-1}return fits>0||this.labelWidth(ctx,"…")<=maxWidth?shortened(fits):""}get calendarPadLeft(){const requested=this.calendarWeekdayLabelWidth;return requested==="auto"?this.resolvedCalendarWeekdayLabelWidth:requested??CAL_PAD_LEFT}measureCalendarWeekdayLabelWidth(cs,firstWeekStart){const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return CAL_PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of this.weekdayLabels(firstWeekStart))label&&(widest=Math.max(widest,this.labelWidth(ctx,label)));const hostWidth=this.clientWidth||0,cap=hostWidth>0?Math.max(CAL_PAD_LEFT,hostWidth*MAX_ROW_LABEL_FRACTION):Number.POSITIVE_INFINITY;return Math.min(Math.max(CAL_PAD_LEFT,Math.ceil(widest)+CAL_WEEKDAY_LABEL_INSET*2),cap)}get matrixRowLabels(){return this.cachedMatrixData.rowLabels}get matrixColLabels(){return this.cachedMatrixData.colLabels}get matrixValues(){return this.cachedMatrixData.values}get calendarDays(){return this.data.kind==="calendar"?this.data.days:[]}get calendarData(){return this.data.kind==="calendar"?this.data:void 0}get cellSize(){return this._cellSize??(this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE)}set cellSize(value){const oldValue=this._cellSize;this._cellSize=value==null?void 0:finiteRange(value,this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE,1),this.requestUpdate("cellSize",oldValue)}get rowHeight(){return this._rowHeight}set rowHeight(value){const oldValue=this._rowHeight;this._rowHeight=value==null||!Number.isFinite(value)?void 0:finiteRange(value,1,1,MAX_MATRIX_ROW_HEIGHT),this.requestUpdate("rowHeight",oldValue)}get signedDomain(){return this.domain!==void 0||this.midpoint!==void 0}rampAlpha(value,lo,hi){const anchor=this.midpoint;return anchor===void 0?linearAlpha(value,lo,hi):midpointAlpha(value,lo,hi,anchor)}rampBucket(value,lo,hi,steps){const anchor=this.midpoint;return anchor===void 0?linearBucket(value,lo,hi,steps):midpointBucket(value,lo,hi,anchor,steps)}isNoData(value){return Number.isFinite(value)?value<0&&!this.signedDomain:!0}get maxCellSize(){return this._maxCellSize}set maxCellSize(value){const oldValue=this._maxCellSize;this._maxCellSize=normalizeCellSizeClamp(value),this.requestUpdate("maxCellSize",oldValue)}get minCellSize(){return this._minCellSize}set minCellSize(value){const oldValue=this._minCellSize;this._minCellSize=normalizeCellSizeClamp(value),this.requestUpdate("minCellSize",oldValue)}get normalizedFirstDayOfWeek(){return(finiteInteger(this.calendarData?.firstDayOfWeek??0,0)%7+7)%7}get bucketCount(){return this._bucketCount}set bucketCount(value){const oldValue=this._bucketCount;this._bucketCount=normalizeBucketCount(value),this.requestUpdate("bucketCount",oldValue)}toggleRowSelection(row){this.toggleSelectionAxis(row,!0)}toggleColumnSelection(col){this.toggleSelectionAxis(col,!1)}get calendarWeekdayLabelText(){return this.calendarData?.weekdayLabelText}get calendarWeekdayLabelWidth(){const value=this.calendarData?.weekdayLabelWidth;if(value==="auto")return value;if(typeof value!="number")return;const resolved=finiteNumber(value,CAL_PAD_LEFT);return resolved>=0?resolved:void 0}get calendarMonthLabelText(){return this.calendarData?.monthLabelText}get calendarColumnX(){return this.calendarData?.columnX}get calendarRowY(){return this.calendarData?.rowY}constructor(){super(),this.data=DEFAULT_MATRIX_DATA,this._stickyLabels="none",this.resolvedColLabelHeight=PAD_TOP,this.resolvedRowLabelWidth=PAD_LEFT,this.resolvedCalendarWeekdayLabelWidth=CAL_PAD_LEFT,this.withoutLegend=!1,this.scale="linear",this.cellGapX=1,this.cellGapY=1,this.cellRadius=0,this.colLabelInterval=1,this.fitToWidth=!1,this._bucketCount=DEFAULT_BUCKET_COUNT,this.annotations=[],this.selectedCell=null,this.multiple=!1,this.selectedCells=[],this.accessibleCells=!1,this.cachedValueRange=null,this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1},this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays),this.cachedCalendarSortedValues=[],this.cachedCalendarCellsByPos=new Map,this.cachedCalendarCellsByDate=new Map,this.cachedAnnotations=[],this.cachedLegendStops=[],this.cachedColorSteps=[],this.cachedCalendarAnnotationDates=new Set,this.cachedMatrixAnnotationPositions=new Set,this.decorationProjectionTruncated=!1,this.cachedCalendarDateByPos=[],this.cachedAccessiblePositions=[],this.cachedAccessiblePositionsByKey=new Map,this.cachedAccessiblePositionIndexByKey=new Map,this.cachedRamp=null,this.canvasHasContent=!1,this.canvasVisible=!0,this.drawDirty=!1,this.overlayRevision=0,this.hoverCell=null,this.focusedCell=null,this.liveText="",this.accessibleTargetSizePx=DEFAULT_ACCESSIBLE_TARGET_SIZE_PX,this.restoringAccessibleFocus=!1,this.accessibleFocusGeneration=0,this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.authorRole=null,this.authorAriaLabel=null,this.generatedAriaLabel="",this.syncingGeneratedSemantics=!1,this.hasSyncedDescribedByElements=!1,this.onDprChange=()=>{this.watchDpr(),this.requestDraw()},this.scheduleDraw=()=>{if(this.drawFrameRequest)return;const owner=this.ownerDocument.defaultView;if(!owner||!this.isConnected)return;const request={owner,handle:0};request.handle=owner.requestAnimationFrame(()=>{this.drawFrameRequest===request&&(this.drawFrameRequest=void 0,this.isConnected&&this.ownerDocument.defaultView===owner&&this.requestDraw())}),this.drawFrameRequest=request},this.selectedPositions=new Map,this.selectionAnchor=null,this.suppressSelectionClick=!1,this.onSelectionPointerDown=event=>{if(!this.multiple||event.button!==0||!event.isPrimary||this.selectionGesture)return;const pos=this.selectionPointerPosition(event);if(!pos)return;event.preventDefault(),this.suppressSelectionClick=!1,this.selectionRangeBase=void 0,this.selectionAnchor=pos,this.focusedCell=pos,this.accessibleCells?this.focusAccessibleCell(pos):this.canvas?.focus();const target=event.currentTarget;this.selectionGesture={pointerId:event.pointerId,target,start:pos,previous:pos,moved:!1,selecting:!this.selectedPositions.has(this.accessibleCellKey(pos)),cells:new Map(this.selectedPositions)};try{target.setPointerCapture(event.pointerId)}catch{}this.paintSelectionTo(pos)},this.onSelectionPointerMove=event=>{if(this.selectionGesture?.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&!this.samePos(pos,this.selectionGesture.previous)&&this.paintSelectionTo(pos)},this.onSelectionPointerUp=event=>{const gesture=this.selectionGesture;if(!gesture||gesture.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&this.paintSelectionTo(pos),this.cancelSelectionGesture(),this.proposeSelection(gesture.cells,"pointer"),gesture.moved||this.emitCellClick(gesture.start,"pointer",!1)},this.onSelectionPointerCancel=event=>{this.selectionGesture?.pointerId===event.pointerId&&this.cancelSelectionGesture()},this.tooltipSize={inline:0,block:0},this.onPointerMove=e=>{const next=this.hitTest(e.offsetX,e.offsetY);this.samePos(this.hoverCell,next)||(this.hoverCell=next)},this.onPointerLeave=()=>{this.hoverCell=null},this.onCanvasClick=e=>{if(this.consumeSelectionClick(e))return;const pos=this.hitTest(e.offsetX,e.offsetY);pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos))},this.onKeyDown=e=>{if(this.selectionKeyDown(e,this.focusedCell))return;const previous=this.focusedCell,edge=this.edgeCell(e);if(edge?(e.preventDefault(),this.focusedCell=edge,this.scrollCellIntoView(edge)):this.effectiveMode==="calendar"?this.onCalendarKeyDown(e):this.onMatrixKeyDown(e),(edge||ARROW_KEYS.has(e.key))&&this.focusedCell){const proposedKeys=this.extendSelection(previous,this.focusedCell,e.shiftKey);this.announce(this.focusedCell,proposedKeys?.has(this.accessibleCellKey(this.focusedCell)))}},this.canvasColorCache=new Map,this.onAccessibleCellFocus=e=>{if(this.restoringAccessibleFocus)return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.samePos(pos,this.focusedCell)||(this.selectionAnchor=pos,this.selectionRangeBase=void 0),this.focusedCell=pos,this.announce(pos))},this.onAccessibleCellClick=e=>{if(this.consumeSelectionClick(e))return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos,e.detail===0?"keyboard":"pointer"))},this.onAccessibleCellKeyDown=e=>{const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.selectionKeyDown(e,pos)||GRID_KEYS.has(e.key)&&(e.preventDefault(),this.focusedCell=pos,this.onKeyDown(e),this.focusAccessibleCell(this.focusedCell)))},new ThemeWatcher(this,()=>this.onThemeSignal()),this.calendarSpacingTrackingArmed=!0}requestUpdate(name,oldValue,options){this.calendarSpacingTrackingArmed&&name!==void 0&&CALENDAR_SPACING_PROPERTIES.has(name)&&(this.explicitCalendarSpacingProperties??=new Set).add(name),super.requestUpdate(name,oldValue,options)}explicitCalendarSpacing(name){if(!this.explicitCalendarSpacingProperties?.has(name))return;const value=this[name];return value??void 0}warnOnLegendRampMismatch(){const rampColors=this.cachedColorSteps.map(color=>sanitizeCssColor(color)??color);if(rampColors.length===0)return;const legendColors=this.cachedLegendStops.filter(stop=>!!stop.color&&stop.partOfRamp!==!1).map(stop=>sanitizeCssColor(stop.color??"")??stop.color??"");legendColors.length===0||legendColors.length===rampColors.length&&legendColors.every((color,index)=>color===rampColors[index])||devWarnOnce("lyra-heatmap-legend-ramp-mismatch",`<${this.localName}>: legendStops describes ${legendColors.length} colour(s) that do not match the ${rampColors.length} colorSteps the cells are painted from, so the legend may misdescribe the ramp. Supply legendStops built from the same array as colorSteps, or omit it to keep the built-in gradient key.`)}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),!(oldValue===value||this.syncingGeneratedSemantics)&&(name==="role"&&(this.authorRole=value),name==="aria-label"&&(this.authorAriaLabel=value))}connectedCallback(){super.connectedCallback(),this.refreshAccessibleTargetSize();const owner=this.ownerDocument.defaultView,ResizeObserverCtor=owner?.ResizeObserver;if(owner&&ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.resizeObserver!==observer||this.scheduleDraw()}),this.resizeObserver=observer,observer.observe(this)}const IntersectionObserverCtor=owner?.IntersectionObserver;if(this.canvasVisible=!0,owner&&IntersectionObserverCtor){let observer;observer=new IntersectionObserverCtor(entries=>{if(!this.isConnected||this.ownerDocument.defaultView!==owner||this.intersectionObserver!==observer)return;const entry=entries.find(candidate=>candidate.target===this);!entry||entry.isIntersecting===this.canvasVisible||(this.canvasVisible=entry.isIntersecting,this.canvasVisible&&this.drawDirty&&this.scheduleDraw())}),this.intersectionObserver=observer,observer.observe(this)}this.cachedRamp=null,this.paintedTheme=void 0,this.canvasColorCache.clear(),this.watchDpr(),this.drawDirty&&!ResizeObserverCtor&&this.scheduleDraw()}disconnectedCallback(){super.disconnectedCallback(),this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.accessibleFocusGeneration++,this.pendingAccessibleFocus=void 0,this.pendingAccessibleFocusOrigin=void 0,this.restoringAccessibleFocus=!1,this.hoverCell=null,this.focusedCell=null,this.liveText="",this.canvasHasContent=!1,this.drawDirty=!0,this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.canvasVisible=!0,this.clearDprWatcher(),this.cancelDrawFrame()}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}watchDpr(){this.clearDprWatcher();const owner=this.ownerDocument.defaultView;if(!owner||typeof owner.matchMedia!="function")return;const query2=owner.matchMedia(`(resolution: ${owner.devicePixelRatio}dppx)`),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.dprQuery!==query2||this.onDprChange()};this.dprQuery=query2,this.dprChangeListener=listener,query2.addEventListener("change",listener)}clearDprWatcher(){this.dprQuery&&this.dprChangeListener&&this.dprQuery.removeEventListener("change",this.dprChangeListener),this.dprQuery=void 0,this.dprChangeListener=void 0}willUpdate(changed){super.willUpdate(changed),(changed.size!==1||!changed.has("hoverCell"))&&this.overlayRevision++,(changed.has("data")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&this.rebuildCanonicalMatrixData(),(changed.has("annotations")||changed.has("legendStops")||changed.has("colorSteps")||!this.hasUpdated)&&this.rebuildBoundedDecorations();const accessibleModeChanged=changed.has("accessibleCells")&&this.hasUpdated,collectionChanged=changed.has("data")||changed.has("cellInteractive"),activeRenderedControl=collectionChanged||accessibleModeChanged?shadowFocusTarget(this):null,activeAccessibleCell=activeRenderedControl?.matches('[part="cell"]')?activeRenderedControl:null,renderedAccessibleCells=activeAccessibleCell?.matches('[part="cell"]')?[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]]:[],accessibleFocusSnapshot=activeAccessibleCell?.matches('[part="cell"]')?{identity:activeAccessibleCell.dataset.cellIdentity,index:renderedAccessibleCells.indexOf(activeAccessibleCell)}:void 0;if(collectionChanged&&(this.focusedCell=null,this.hoverCell=null,this.liveText=""),changed.has("data")||changed.has("locale")||!this.hasUpdated){this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays,this.normalizedFirstDayOfWeek,this.calendarMonthLabelText,this.effectiveLocale),this.cachedCalendarSortedValues=this.cachedCalendarGrid.cells.map(cell=>cell.value).filter(value=>!this.isNoData(value)).sort((a,b)=>a-b),this.cachedCalendarCellsByPos=new Map(this.cachedCalendarGrid.cells.map(cell=>[`${cell.week}:${cell.weekday}`,cell])),this.cachedCalendarCellsByDate=new Map(this.cachedCalendarGrid.cells.map(cell=>[cell.date,cell]));const{firstWeekStart,weekCount}=this.cachedCalendarGrid;this.cachedCalendarDateByPos=Array.from({length:weekCount*7},(_,index)=>isoDateAtOffset(firstWeekStart,index))}if(changed.has("colorSteps")||changed.has("withoutLegend")||!this.hasUpdated){const colorSteps=this.withoutLegend?[]:this.cachedColorSteps.map(sanitizeCssColor);colorSteps.length>=2&&colorSteps.every(color=>color!==void 0)?this.style.setProperty("--lr-heatmap-color-steps-gradient",`linear-gradient(to right, ${colorSteps.join(", ")})`):this.style.removeProperty("--lr-heatmap-color-steps-gradient")}if((changed.has("data")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&(this.cachedValueRange=this.computeValueRange()),(collectionChanged||!this.hasUpdated)&&this.rebuildAccessiblePositions(),(collectionChanged||accessibleModeChanged||changed.has("multiple"))&&(this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.proposedSelectionKeys=void 0),(collectionChanged||changed.has("selectedCells")||changed.has("multiple")||!this.hasUpdated)&&(this.rebuildSelectedPositions(),changed.has("selectedCells")&&this.selectionGesture&&this.cancelSelectionGesture(),changed.has("selectedCells")&&this.selectionRangeBase&&(this.proposedSelectionKeys?.size!==this.selectedPositions.size||[...this.selectedPositions.keys()].some(key=>!this.proposedSelectionKeys?.has(key)))&&(this.selectionAnchor=this.focusedCell,this.selectionRangeBase=void 0)),accessibleFocusSnapshot){const positions=this.accessibleCellPositions(),target=(accessibleFocusSnapshot.identity==null?void 0:positions.find(pos=>this.accessibleCellIdentity(pos)===accessibleFocusSnapshot.identity))??positions[Math.min(Math.max(accessibleFocusSnapshot.index,0),positions.length-1)]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeAccessibleCell??void 0,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}if(accessibleModeChanged){const previouslyAccessible=changed.get("accessibleCells")===!0;if(previouslyAccessible&&!this.accessibleCells&&activeAccessibleCell){const key=activeAccessibleCell.dataset.cellKey,target=key?this.accessibleCellAtKey(key):null;target&&(this.focusedCell=target,this.liveText=this.resolveCellText(target)),this.pendingAccessibleFocus="canvas",this.pendingAccessibleFocusOrigin=activeAccessibleCell,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}else if(!previouslyAccessible&&this.accessibleCells&&activeRenderedControl?.matches('[part="canvas"]')){const positions=this.accessibleCellPositions(),target=this.focusedCell?positions.find(pos=>this.samePos(pos,this.focusedCell))??positions[0]??null:positions[0]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeRenderedControl,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}}const bounds=this.cachedValueRange,range=bounds?`${this.formatNumericValue(bounds[0])}–${this.formatNumericValue(bounds[1])}`:this.localize("heatmapNoDataValue"),valueLabel=this.localizedValueLabel();let label;if(this.effectiveMode==="calendar")label=this.localize("heatmapCalendarLabel",void 0,{days:this.formatCount(this.cachedCalendarGrid.cells.length),label:valueLabel,range});else{const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;label=this.localize("heatmapMatrixLabel",void 0,{rows:this.formatCount(rows),cols:this.formatCount(cols),label:valueLabel,range})}const selectedText=this.selectedCellDescription(),generatedAriaLabel=[label,selectedText,this.projectionDescription()].filter(Boolean).join(" ");this.generatedAriaLabel=generatedAriaLabel,this.syncingGeneratedSemantics=!0;try{this.authorRole===null&&this.getAttribute("role")!=="group"&&this.setAttribute("role","group"),this.authorAriaLabel===null&&this.getAttribute("aria-label")!==generatedAriaLabel&&this.setAttribute("aria-label",generatedAriaLabel)}finally{this.syncingGeneratedSemantics=!1}}rebuildBoundedDecorations(){this.cachedAnnotations=this.annotations.slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>({...entry})),this.cachedLegendStops=(this.legendStops??[]).slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>({...entry})),this.cachedColorSteps=(this.colorSteps??[]).slice(0,MAX_HEATMAP_DECORATIONS),this.warnOnLegendRampMismatch(),this.cachedCalendarAnnotationDates=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.date==null?[]:[annotation.date])),this.cachedMatrixAnnotationPositions=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.row==null||annotation.col==null?[]:[`${annotation.row}:${annotation.col}`])),this.decorationProjectionTruncated=this.annotations.length>MAX_HEATMAP_DECORATIONS||(this.legendStops?.length??0)>MAX_HEATMAP_DECORATIONS||(this.colorSteps?.length??0)>MAX_HEATMAP_DECORATIONS}get projectionTruncated(){return this.decorationProjectionTruncated||(this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated)}get cellProjectionTruncated(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated}projectedCellCount(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount*7:this.matrixRowLabels.length*this.matrixColLabels.length}projectionDescription(){const messages=[];return this.cellProjectionTruncated&&messages.push(this.localize("heatmapProjectionLimit",void 0,{count:this.formatCount(this.projectedCellCount())})),this.decorationProjectionTruncated&&messages.push(this.localize("heatmapDecorationLimit",void 0,{count:this.formatCount(MAX_HEATMAP_DECORATIONS)})),messages.join(" ")}rebuildCanonicalMatrixData(){if(this.data.kind!=="matrix"){this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1};return}const colCount=Math.min(this.data.colLabels.length,MAX_HEATMAP_CELLS),rowLimit=colCount===0?Math.min(this.data.rowLabels.length,MAX_HEATMAP_CELLS):Math.floor(MAX_HEATMAP_CELLS/colCount),rowCount=Math.min(this.data.rowLabels.length,rowLimit),rowLabels=this.data.rowLabels.slice(0,rowCount).map(String),colLabels=this.data.colLabels.slice(0,colCount).map(String),source=this.data,values=Array.from({length:rowCount},(_,row)=>Array.from({length:colCount},(_2,col)=>source.values[row]?.[col]??(this.signedDomain?Number.NaN:-1)));this.cachedMatrixData={rowLabels,colLabels,values,truncated:rowCount!==this.data.rowLabels.length||colCount!==this.data.colLabels.length||this.data.values.some((row,index)=>index>=rowCount||row.length>colCount)}}selectedCellDescription(){if(this.multiple){const count=this.currentSelectedPositions.size;return count?this.localize("heatmapSelectedCount",void 0,{count:this.formatCount(count)}):""}if(!this.selectedCell)return"";if(this.effectiveMode==="calendar"){if(this.selectedCell.date==null)return"";const match=this.cachedCalendarCellsByDate.get(this.selectedCell.date);return match?this.localize("heatmapSelectedCellLabel",void 0,{cell:this.calendarCellText({week:match.week,weekday:match.weekday,date:match.date})}):""}const{row,col}=this.selectedCell;return row==null||col==null||row<0||row>=this.matrixRowLabels.length||col<0||col>=this.matrixColLabels.length?"":this.localize("heatmapSelectedCellLabel",void 0,{cell:this.matrixCellText({row,col})})}computeValueRange(){const pinned=this.domain;if(pinned){const[lo,hi]=pinned;if(Number.isFinite(lo)&&Number.isFinite(hi)&&lo!==hi)return lo<hi?[lo,hi]:[hi,lo]}const source=this.effectiveMode==="calendar"?this.cachedCalendarGrid.cells.map(cell=>cell.value):this.matrixValues.flat();return minMax(source.filter(v=>!this.isNoData(v)))}localizedValueLabel(){return this.valueLabel===void 0?this.localize("heatmapValueLabel"):this.valueLabel}formatNumericValue(value){return getNumberFormat(this.effectiveLocale||void 0).format(value)}syncExternalDescription(){const describedBy=this.getAttribute("aria-describedby");if(!describedBy&&!this.hasSyncedDescribedByElements)return;const control=this.accessibleCells?this.renderRoot.querySelector('[part="cells"]'):this.canvas;this.hasSyncedDescribedByElements=syncAriaDescribedByElements(this,control??void 0,describedBy)}updated(changed){if(super.updated(changed),this.syncExternalDescription(),this.hoverCell&&this.effectiveStickyLabels!=="none"&&this.scheduleAfterUpdate(()=>this.measureTooltip(),"heatmap-tooltip-metrics"),["data","cellSize","rowHeight","cellGapX","cellGapY","cellRadius","colLabelInterval","maxCellSize","minCellSize","valueLabel","scale","domain","midpoint","fitToWidth","rowLabelWidth","colLabelHeight","colLabelRotation","bucketCount","annotations","focusedCell","colorSteps","cellColor","selectedCell","selectedCells","multiple","selectionPreview","legendStops","accessibleCells","accessibleTargetSizePx","locale","stickyLabels"].some(name=>changed.has(name))){if(changed.has("focusedCell")&&[...changed.keys()].every(key=>key==="focusedCell"||key==="liveText")&&this.repaintFocusRing(changed.get("focusedCell")))return;this.requestDraw()}const pending=this.pendingAccessibleFocus;if(pending===void 0)return;this.pendingAccessibleFocus=void 0;const origin=this.pendingAccessibleFocusOrigin;this.pendingAccessibleFocusOrigin=void 0;const generation=this.accessibleFocusGeneration;this.scheduleAfterUpdate(()=>{try{if(generation!==this.accessibleFocusGeneration||!this.isConnected)return;if(origin){const internalActive=shadowFocusTarget(this),documentActive=activeElementIn(this.ownerDocument),focusStayedAtOrigin=internalActive===origin,originWasRemovedWithoutReplacement=internalActive===null&&(documentActive===null||documentActive===this||documentActive===this.ownerDocument.body);if(!focusStayedAtOrigin&&!originWasRemovedWithoutReplacement)return}if(pending==="base"){this.shadowRoot?.querySelector('[part="base"]')?.focus();return}if(pending==="canvas"){this.shadowRoot?.querySelector('[part="canvas"]')?.focus();return}const identity=this.accessibleCellIdentity(pending);[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellIdentity===identity)?.focus()}finally{this.restoringAccessibleFocus=!1}},"heatmap-accessible-focus")}refreshTheme(){this.cachedRamp=null,this.refreshAccessibleTargetSize()||this.requestDraw()}themeSignature(){const cs=this.ownerDocument.defaultView?.getComputedStyle(this);return cs?[...this.scaleEndpoints(cs),this.noDataFill(cs),this.labelColor(cs),this.labelFont(cs),this.focusRingColor(cs),this.annotationColor(cs),this.selectedColor(cs),this.stickyLabelBg(cs),...this.cachedColorSteps.map(step=>this.resolveColorStep(step,""))].join("\0"):""}onThemeSignal(){const signature=this.themeSignature(),resized=this.refreshAccessibleTargetSize();signature===this.paintedTheme&&!this.cellColor||(this.paintedTheme=signature,this.cachedRamp=null,resized||this.scheduleDraw())}refreshAccessibleTargetSize(){const raw=this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue("--lr-icon-button-size").trim()??"",resolved=resolveCssTokenLength(raw,{host:this}),next=resolved!==void 0&&Number.isFinite(resolved)&&resolved>0?resolved:DEFAULT_ACCESSIBLE_TARGET_SIZE_PX;return next===this.accessibleTargetSizePx?!1:(this.accessibleTargetSizePx=next,!0)}scaleEndpoints(cs){const lo=cs.getPropertyValue("--lr-heatmap-scale-lo").trim()||cs.getPropertyValue("--_lr-heatmap-scale-lo").trim()||FALLBACK_SCALE_LO,hi=cs.getPropertyValue("--lr-heatmap-scale-hi").trim()||cs.getPropertyValue("--_lr-heatmap-scale-hi").trim()||FALLBACK_SCALE_HI;return[lo,hi]}labelColor(cs){return cs.getPropertyValue("--lr-color-text-quiet").trim()||"#6b7280"}labelFont(cs){return cs.getPropertyValue("--lr-heatmap-label-font").trim()||cs.getPropertyValue("--_lr-heatmap-label-font").trim()||FALLBACK_LABEL_FONT}stickyLabelBg(cs){const raw=cs.getPropertyValue("--lr-heatmap-sticky-label-bg").trim()||cs.getPropertyValue("--_lr-heatmap-sticky-label-bg").trim()||FALLBACK_STICKY_LABEL_BG;return formatRgb(resolveRgb(raw,FALLBACK_STICKY_LABEL_BG,this.ownerDocument))}noDataFill(cs){return cs.getPropertyValue("--lr-heatmap-no-data-fill").trim()||cs.getPropertyValue("--_lr-heatmap-no-data-fill").trim()||FALLBACK_NO_DATA_FILL}focusRingColor(cs){return cs.getPropertyValue("--lr-heatmap-focus-ring-color").trim()||cs.getPropertyValue("--_lr-heatmap-focus-ring-color").trim()||FALLBACK_FOCUS_RING_COLOR}annotationColor(cs){return cs.getPropertyValue("--lr-heatmap-annotation-color").trim()||cs.getPropertyValue("--_lr-heatmap-annotation-color").trim()||FALLBACK_ANNOTATION_COLOR}selectedColor(cs){return cs.getPropertyValue("--lr-heatmap-selected-color").trim()||cs.getPropertyValue("--_lr-heatmap-selected-color").trim()||FALLBACK_SELECTED_COLOR}strokeCellState(ctx,x,y,size,state2,color,paintedShape){const shape=paintedShape??(this.effectiveMode==="matrix"?this.matrixCellShape(size):this.calendarCellShape(size)),width=shape?.custom?shape.w:size,height=shape?.custom?shape.h:size;shape?.custom&&(ctx.save(),ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.clip());const inset=Math.min(state2==="annotation"?.5:state2==="selected"?3.5:6.5,Math.max(.5,(Math.min(width,height)-RING_LINE_WIDTH-1)/2)),w=Math.max(1,width-inset*2),h=Math.max(1,height-inset*2);ctx.lineWidth=RING_LINE_WIDTH,ctx.strokeStyle=color,ctx.setLineDash?.(state2==="annotation"?[]:state2==="selected"?[4,2]:[1,2]),shape?.custom&&shape.radius>0?(ctx.beginPath(),ctx.roundRect(x+inset,y+inset,w,h,Math.max(0,shape.radius-inset)),ctx.stroke()):ctx.strokeRect(x+inset,y+inset,w,h),ctx.setLineDash?.([]),shape?.custom&&ctx.restore()}isSelectedPos(pos){return this.multiple?this.currentSelectedPositions.has(this.accessibleCellKey(pos)):this.selectedCell?"week"in pos?this.selectedCell.date==null?!1:this.calendarCellAt(pos).date===this.selectedCell.date:this.selectedCell.row===pos.row&&this.selectedCell.col===pos.col:!1}draw(){if(!this.canvasVisible){this.drawDirty=!0;return}this.syncDeferredFitFrame(!1),this.drawDirty=!1,this.canvasHasContent=!1,this.paintedTheme??=this.themeSignature(),this.effectiveMode==="calendar"?this.drawCalendar():this.drawMatrix()}requestDraw(){this.drawDirty=!0,this.isConnected&&(this.canvasVisible?this.draw():this.syncDeferredFitFrame(!0))}syncDeferredFitFrame(deferred){const base=this.shadowRoot?.querySelector('[part="base"]');if(!base)return;let contained=!1;deferred&&this.fitToWidth&&this.clientWidth>0&&(contained=(this.effectiveMode==="calendar"?this.columnXFor(Math.max(1,this.cachedCalendarGrid.weekCount)):this.matrixPadLeft+this.matrixColLabels.length*this.matrixCellSize(this.matrixColLabels.length))<=this.clientWidth),base.toggleAttribute("data-fit-frame-contained",contained)}repaintFocusRing(previous){if(!this.canvasHasContent||!this.canvas||this.drawDirty)return!1;const current=this.focusedCell;if(this.effectiveMode==="calendar"){if(previous&&!("week"in previous)||current&&!("week"in current))return!1;this.repaintCalendarFocusCell(previous&&"week"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintCalendarFocusCell(current)}else{if(previous&&!("row"in previous)||current&&!("row"in current))return!1;this.repaintMatrixFocusCell(previous&&"row"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintMatrixFocusCell(current)}return!0}cancelDrawFrame(){const request=this.drawFrameRequest;request&&request.owner.cancelAnimationFrame(request.handle),this.drawFrameRequest=void 0}resolveColorStep(color,fallback){const safe=sanitizeCssColor(color);return safe?resolveCanvasColor(this,safe,fallback):fallback}colorRamp(bucketCount,cs){const steps=this.cachedColorSteps;if(steps&&steps.length>=2){const key2=`steps ${steps.join(" ")}`;if(this.cachedRamp?.key===key2)return this.cachedRamp;const resolved=steps.map((color,index)=>this.resolveColorStep(color,index===steps.length-1?FALLBACK_SCALE_HI:FALLBACK_SCALE_LO)),colors2=resolved.map(color=>formatRgb(resolveRgb(color,FALLBACK_SCALE_LO,this.ownerDocument))),loRgb2=resolveRgb(resolved[0],FALLBACK_SCALE_LO,this.ownerDocument),hiRgb2=resolveRgb(resolved[resolved.length-1],FALLBACK_SCALE_HI,this.ownerDocument);return this.cachedRamp={key:key2,colors:colors2,loRgb:loRgb2,hiRgb:hiRgb2},this.cachedRamp}const[scaleLo,scaleHi]=this.scaleEndpoints(cs),normalizedBucketCount=normalizeBucketCount(bucketCount),key=`${scaleLo}\0${scaleHi}\0${normalizedBucketCount}`;if(this.cachedRamp?.key===key)return this.cachedRamp;const loRgb=resolveRgb(scaleLo,FALLBACK_SCALE_LO,this.ownerDocument),hiRgb=resolveRgb(scaleHi,FALLBACK_SCALE_HI,this.ownerDocument),colors=Array.from({length:normalizedBucketCount},(_,i)=>mixRgb(loRgb,hiRgb,i/(normalizedBucketCount-1)));return this.cachedRamp={key,colors,loRgb,hiRgb},this.cachedRamp}calendarCellSize(){return this.calendarSpacing().cellSize}calendarSpacing(){const{weekCount}=this.cachedCalendarGrid,rawGapX=this.explicitCalendarSpacing("cellGapX"),rawGapY=this.explicitCalendarSpacing("cellGapY"),rawRadius=this.explicitCalendarSpacing("cellRadius"),boundGap=(raw,size2)=>raw===void 0?CAL_GAP:finiteRange(raw,CAL_GAP,0,Math.max(0,size2-1));let size;if(this.fitToWidth&&weekCount>0){const fitGap=boundGap(rawGapX,this.cellSize),hostWidth=this.clientWidth||this.calendarPadLeft+weekCount*(this.cellSize+fitGap);size=this.clampFitCellSize((hostWidth-this.calendarPadLeft)/weekCount-fitGap)}else size=this.cellSize;return this.accessibleCells&&(size=Math.max(size,this.accessibleTargetSizePx)),{cellSize:size,gapX:boundGap(rawGapX,size),gapY:boundGap(rawGapY,size),radius:rawRadius===void 0?0:finiteRange(rawRadius,0,0,size/2)}}clampFitCellSize(size){const floored=finiteRange(size,FIT_MIN_CELL,Math.max(FIT_MIN_CELL,this.minCellSize??FIT_MIN_CELL));return this.maxCellSize==null?floored:Math.min(floored,this.maxCellSize)}columnXFor(week){return this.calendarColumnPositions()[week]??this.calendarPadLeft}rowYFor(weekday){return this.calendarRowPositions()[weekday]??CAL_LABEL_H}calendarColumnPositions(){const{cellSize,gapX:gap}=this.calendarSpacing(),weekCount=this.cachedCalendarGrid.weekCount,callback=this.calendarColumnX,padLeft=this.calendarPadLeft,cached=this.cachedColumnGeometry;if(cached!==void 0&&cached.callback===callback&&cached.padLeft===padLeft&&cached.cellSize===cellSize&&cached.gap===gap&&cached.weekCount===weekCount)return cached.positions;const positions=[];for(let index=0;index<=weekCount;index++){const fallback=index===0?padLeft:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedColumnGeometry={callback,padLeft,cellSize,gap,weekCount,positions},positions}calendarRowPositions(){const{cellSize,gapY:gap}=this.calendarSpacing(),callback=this.calendarRowY,cached=this.cachedRowGeometry;if(cached!==void 0&&cached.callback===callback&&cached.cellSize===cellSize&&cached.gap===gap)return cached.positions;const positions=[];for(let index=0;index<=7;index++){const fallback=index===0?CAL_LABEL_H:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedRowGeometry={callback,cellSize,gap,positions},positions}weekdayLabels(firstWeekStart){const formatter=getDateTimeFormat(this.effectiveLocale||void 0,{weekday:"short",timeZone:"UTC"}),labels=["","","","","","",""];for(const weekday of[1,3,5]){const row=(weekday-this.normalizedFirstDayOfWeek+7)%7;labels[row]=this.calendarWeekdayLabelText?.(weekday)??formatter.format(new Date(firstWeekStart.getTime()+row*MS_PER_DAY))}return labels}paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels,months=!0,weekdays=!0){if(ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs),months){const canvasRight=this.columnXFor(Math.max(1,this.cachedCalendarGrid.weekCount)),placed=[];monthLabels.forEach((month,index)=>{const label=this.ellipsize(ctx,month.label,canvasRight);if(!label)return;const width=this.labelWidth(ctx,label),x=Math.max(0,Math.min(this.columnXFor(month.week),canvasRight-width)),nextWeek=monthLabels[index+1]?.week??Math.max(month.week+1,this.cachedCalendarGrid.weekCount),entry={label,x,end:x+width+CAL_MONTH_LABEL_GAP,span:nextWeek-month.week};let previous=placed[placed.length-1];for(;previous&&entry.x<previous.end&&entry.span>previous.span;)placed.pop(),previous=placed[placed.length-1];previous&&entry.x<previous.end||placed.push(entry)});for(const{label,x}of placed)ctx.fillText(label,x,CAL_LABEL_H-4)}if(weekdays){const available=this.calendarPadLeft-CAL_WEEKDAY_LABEL_INSET*2;this.weekdayLabels(firstWeekStart).forEach((label,weekday)=>{const shown=label?this.ellipsize(ctx,label,available):"";shown&&ctx.fillText(shown,CAL_WEEKDAY_LABEL_INSET,this.rowYFor(weekday)+cellSize-1)})}}drawCalendar(){this.withLabelCache(()=>this.paintCalendar())}paintCalendar(){if(!this.canvas)return;const{weekCount,firstWeekStart,monthLabels}=this.cachedCalendarGrid,cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;this.calendarWeekdayLabelWidth==="auto"&&(this.resolvedCalendarWeekdayLabelWidth=this.measureCalendarWeekdayLabelWidth(cs,firstWeekStart));const spacing=this.calendarSpacing(),cellSize=spacing.cellSize,w=this.columnXFor(Math.max(1,weekCount)),h=this.rowYFor(7),ctx=this.sizeCanvas(this.canvas,w,h);if(!ctx)return;ctx.clearRect(0,0,w,h);const buckets=normalizeBucketCount(this.bucketCount),ramp=this.colorRamp(buckets,cs).colors,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const value=this.calendarValueAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday),override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(value,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,buckets)];this.fillCalendarCell(ctx,x,y,cellSize,spacing.radius)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.date==null)continue;const match=this.cachedCalendarCellsByDate.get(ann.date);if(!match)continue;const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs))}for(const match of this.selectedPaintPositions())if("week"in match){const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs))}if(this.focusedCell&&"week"in this.focusedCell){const{week,weekday}=this.focusedCell;if(week<weekCount&&weekday<7){const x=this.columnXFor(week),y=this.rowYFor(weekday);this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}}this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels),this.canvasHasContent=!0,this.recordCalendarGeometry(spacing,weekCount)&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-calendar-accessible-geometry")}matrixCellSize(cols){let size;if(this.fitToWidth&&cols>0){const padLeft=this.matrixPadLeft,hostWidth=this.clientWidth||padLeft+cols*this.cellSize;size=this.clampFitCellSize((hostWidth-padLeft)/cols)}else size=this.cellSize;if(!this.accessibleCells)return size;const target=this.accessibleTargetSizePx,custom=finiteNumber(this.cellGapX,1)!==1||finiteNumber(this.cellGapY,1)!==1||finiteRange(this.cellRadius,0,0)>0,gap=this.rowHeight!==void 0?finiteRange(this.cellGapX,1,0,target):custom?Math.max(finiteRange(this.cellGapX,1,0,target),finiteRange(this.cellGapY,1,0,target)):0;return Math.max(size,target+gap)}matrixRowHeight(cellSize){if(this.rowHeight===void 0)return cellSize;const height=finiteRange(this.rowHeight,cellSize,1);if(!this.accessibleCells)return height;const target=this.accessibleTargetSizePx;return Math.max(height,target+finiteRange(this.cellGapY,1,0,target))}matrixCellShape(size,height=this.matrixRowHeight(size)){if(height===size&&finiteNumber(this.cellGapX,1)===1&&finiteNumber(this.cellGapY,1)===1&&finiteRange(this.cellRadius,0,0)===0)return{w:size-1,h:size-1,radius:0,custom:!1};const target=this.accessibleCells?this.accessibleTargetSizePx:1,w=size-finiteRange(this.cellGapX,1,0,Math.max(0,size-Math.min(size,target))),h=height-finiteRange(this.cellGapY,1,0,Math.max(0,height-Math.min(height,target))),radius=finiteRange(this.cellRadius,0,0,Math.min(w,h)/2);return{w,h,radius,custom:height!==size||w!==size-1||h!==size-1||radius!==0}}calendarCellShape(size){const radius=this.calendarSpacing().radius;return radius>0?{w:size,h:size,radius:Math.min(radius,size/2),custom:!0}:void 0}fillMatrixCell(ctx,x,y,shape){shape.radius===0?ctx.fillRect(x,y,shape.w,shape.h):(ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.fill())}paintMatrixCell(ctx,row,col,cellSize,rowHeight,shape,cs,rampData,noDataFill){const value=this.matrixValues[row]?.[col]??Number.NaN,bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.({row,col},value);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,rampData.colors.length);ctx.fillStyle=step<0?noDataFill:rampData.colors[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=rampData.colors[this.rampBucket(value,lo,hi,rampData.colors.length)]:ctx.fillStyle=mixRgb(rampData.loRgb,rampData.hiRgb,this.rampAlpha(value,lo,hi));this.fillMatrixCell(ctx,this.matrixPadLeft+col*cellSize,this.matrixPadTop+row*rowHeight,shape)}paintMatrixFocusOverlays(ctx,row,col,cellSize,rowHeight,shape,cs,state2){const x=this.matrixPadLeft+col*cellSize,y=this.matrixPadTop+row*rowHeight;state2==="annotation"&&this.cachedMatrixAnnotationPositions.has(`${row}:${col}`)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs),shape),state2==="selected"&&this.isSelectedPos({row,col})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs),shape),state2==="focus"&&this.focusedCell&&"row"in this.focusedCell&&this.focusedCell.row===row&&this.focusedCell.col===col&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs),shape)}focusRepaintBounds(ctx,x,y,cellSize,cellHeight=cellSize){const padding=RING_LINE_WIDTH+1,dpr=ctx.getTransform().a,left=Math.floor((x-padding)*dpr)/dpr,top=Math.floor((y-padding)*dpr)/dpr,right=Math.ceil((x+cellSize+padding)*dpr)/dpr,bottom=Math.ceil((y+cellHeight+padding)*dpr)/dpr;return{left,top,width:right-left,height:bottom-top,radius:Math.ceil((2*padding+1/dpr)/cellSize),rowRadius:Math.ceil((2*padding+1/dpr)/cellHeight)}}repaintMatrixFocusCell(pos){this.withLabelCache(()=>this.paintMatrixFocusCell(pos))}paintMatrixFocusCell(pos){if(!pos||!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(pos.row<0||pos.row>=rows||pos.col<0||pos.col>=cols)return;const cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight),x=this.matrixPadLeft+pos.col*cellSize,y=this.matrixPadTop+pos.row*rowHeight,ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius,rowRadius}=this.focusRepaintBounds(ctx,x,y,cellSize,rowHeight),firstRow=Math.max(0,pos.row-rowRadius),lastRow=Math.min(rows-1,pos.row+rowRadius),firstCol=Math.max(0,pos.col-radius),lastCol=Math.min(cols-1,pos.col+radius),ramp=this.colorRamp(RAMP_STEPS,cs),noData=this.noDataFill(cs),scratch=rowHeight===cellSize?void 0:this.ownerDocument.createElement("canvas"),dpr=ctx.getTransform().a,scratchLeft=Math.floor((this.matrixPadLeft+firstCol*cellSize-RING_LINE_WIDTH-1)*dpr)/dpr,scratchTop=Math.floor((this.matrixPadTop+firstRow*rowHeight-RING_LINE_WIDTH-1)*dpr)/dpr;if(scratch){const right=Math.ceil((this.matrixPadLeft+(lastCol+1)*cellSize+RING_LINE_WIDTH+1)*dpr),bottom=Math.ceil((this.matrixPadTop+(lastRow+1)*rowHeight+RING_LINE_WIDTH+1)*dpr);scratch.width=right-Math.round(scratchLeft*dpr),scratch.height=bottom-Math.round(scratchTop*dpr)}const paintCtx=scratch?.getContext("2d")??ctx;if(scratch&&paintCtx===ctx){this.drawMatrix();return}paintCtx.save();try{scratch?paintCtx.setTransform(dpr,0,0,dpr,-scratchLeft*dpr,-scratchTop*dpr):(paintCtx.beginPath(),paintCtx.rect(left,top,width,height),paintCtx.clip(),paintCtx.clearRect(left,top,width,height));for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixCell(paintCtx,row,col,cellSize,rowHeight,shape,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixFocusOverlays(paintCtx,row,col,cellSize,rowHeight,shape,cs,state2);left<this.matrixPadLeft&&this.paintMatrixRowLabels(paintCtx,this.matrixPadLeft,this.matrixPadTop,rowHeight,cs,{top,bottom:top+height}),top<this.matrixPadTop&&this.paintMatrixColLabels(paintCtx,this.matrixPadLeft,this.matrixPadTop,cellSize,cs,{first:firstCol,last:lastCol})}finally{paintCtx.restore()}if(scratch){ctx.save();try{ctx.setTransform(1,0,0,1,0,0),ctx.clearRect(left*dpr,top*dpr,width*dpr,height*dpr),ctx.drawImage(scratch,Math.round((left-scratchLeft)*dpr),Math.round((top-scratchTop)*dpr),Math.round(width*dpr),Math.round(height*dpr),Math.round(left*dpr),Math.round(top*dpr),Math.round(width*dpr),Math.round(height*dpr))}finally{ctx.restore()}}}paintCalendarCell(ctx,week,weekday,cellSize,cs,ramp,noDataFill){const value=this.calendarValueAt(week,weekday),bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=ramp[this.rampBucket(value,lo,hi,ramp.length)]:ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,ramp.length)];this.fillCalendarCell(ctx,this.columnXFor(week),this.rowYFor(weekday),cellSize,this.calendarSpacing().radius)}fillCalendarCell(ctx,x,y,size,radius){radius===0?ctx.fillRect(x,y,size,size):(ctx.beginPath(),ctx.roundRect(x,y,size,size,radius),ctx.fill())}recordCalendarGeometry(spacing,weekCount){const next={padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H,cellSize:spacing.cellSize,cellWidth:spacing.cellSize,cellHeight:spacing.cellSize,cellGapX:spacing.gapX,cellGapY:spacing.gapY,cellRadius:spacing.radius,weekCount,firstDayOfWeek:this.normalizedFirstDayOfWeek},previous=this.lastPaintedCalendarGeometry;if(previous&&Object.keys(next).every(key=>previous[key]===next[key]))return!1;const frozen=Object.freeze(next);return this.lastPaintedCalendarGeometry=frozen,this.emit("lr-calendar-geometry-change",frozen),!0}paintCalendarFocusOverlays(ctx,week,weekday,cellSize,cs,state2){const date=this.calendarDateAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday);state2==="annotation"&&this.cachedCalendarCellsByDate.has(date)&&this.cachedCalendarAnnotationDates.has(date)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs)),state2==="selected"&&(this.multiple||this.cachedCalendarCellsByDate.has(date))&&this.isSelectedPos({week,weekday,date})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs)),state2==="focus"&&this.focusedCell&&"week"in this.focusedCell&&this.focusedCell.week===week&&this.focusedCell.weekday===weekday&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}repaintCalendarFocusCell(pos){this.withLabelCache(()=>this.paintCalendarFocusCell(pos))}paintCalendarFocusCell(pos){if(!pos||!this.canvas)return;const{weekCount,firstWeekStart}=this.cachedCalendarGrid;if(pos.week<0||pos.week>=weekCount||pos.weekday<0||pos.weekday>=7)return;const cellSize=this.calendarCellSize(),x=this.columnXFor(pos.week),y=this.rowYFor(pos.weekday),ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius}=this.focusRepaintBounds(ctx,x,y,cellSize),firstWeek=Math.max(0,pos.week-radius),lastWeek=Math.min(weekCount-1,pos.week+radius),firstDay=Math.max(0,pos.weekday-radius),lastDay=Math.min(6,pos.weekday+radius),ramp=this.colorRamp(normalizeBucketCount(this.bucketCount),cs).colors,noData=this.noDataFill(cs);ctx.save();try{ctx.beginPath(),ctx.rect(left,top,width,height),ctx.clip(),ctx.clearRect(left,top,width,height);for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarCell(ctx,week,day,cellSize,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarFocusOverlays(ctx,week,day,cellSize,cs,state2);this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,this.cachedCalendarGrid.monthLabels,top<CAL_LABEL_H,left<this.calendarPadLeft)}finally{ctx.restore()}}drawMatrix(){this.withLabelCache(()=>this.paintMatrix())}paintMatrix(){if(!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length,cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;this.rowLabelWidth==="auto"&&(this.resolvedRowLabelWidth=this.measureRowLabelWidth(cs)),this.colLabelHeight==="auto"&&(this.resolvedColLabelHeight=this.measureColLabelHeight(cs));const padLeft=this.matrixPadLeft,padTop=this.matrixPadTop,cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight),dimensions=shape.custom?{cellWidth:shape.w,cellHeight:shape.h,cellRadius:shape.radius}:{},previous=this.lastPaintedMatrixGeometry,geometry=previous&&previous.padLeft===padLeft&&previous.padTop===padTop&&previous.cellSize===cellSize&&previous.rowHeight===(rowHeight===cellSize?void 0:rowHeight)&&previous.cellWidth===dimensions.cellWidth&&previous.cellHeight===dimensions.cellHeight&&previous.cellRadius===dimensions.cellRadius?previous:Object.freeze({padLeft,padTop,cellSize,...rowHeight===cellSize?{}:{rowHeight},...dimensions});this.lastPaintedMatrixGeometry=geometry;const geometryChanged=geometry!==previous;geometryChanged&&this.emit("lr-matrix-geometry-change",geometry);const w=padLeft+cols*cellSize,h=padTop+rows*rowHeight,ctx=this.sizeCanvas(this.canvas,w,h);if(!ctx)return;ctx.clearRect(0,0,w,h);const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,rampData=this.colorRamp(RAMP_STEPS,cs),ramp=rampData.colors,{loRgb,hiRgb}=rampData,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();for(let r=0;r<rows;r++)for(let c=0;c<cols;c++){const v=this.matrixValues[r]?.[c]??Number.NaN,x=padLeft+c*cellSize,y=padTop+r*rowHeight,override=this.cellColor?.({row:r,col:c},v);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(v))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(v,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(v,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else{const t=this.rampAlpha(v,lo,hi);ctx.fillStyle=mixRgb(loRgb,hiRgb,t)}this.fillMatrixCell(ctx,x,y,shape)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.row==null||ann.col==null||ann.row<0||ann.row>=rows||ann.col<0||ann.col>=cols)continue;const x=padLeft+ann.col*cellSize,y=padTop+ann.row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs),shape)}for(const selected of this.selectedPaintPositions()){if(!("row"in selected))continue;const{row,col}=selected;if(row>=0&&row<rows&&col>=0&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs),shape)}}if(this.focusedCell&&"row"in this.focusedCell){const{row,col}=this.focusedCell;if(row<rows&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs),shape)}}this.paintMatrixRowLabels(ctx,padLeft,padTop,rowHeight,cs),this.paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs),this.paintFrozenLabelBands(padLeft,padTop,cellSize,rowHeight,w,h,ctx.getTransform().a,cs),this.canvasHasContent=!0,geometryChanged&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-matrix-accessible-geometry")}paintMatrixRowLabels(ctx,padLeft,padTop,cellSize,cs,dirty){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const rowLabelSpace=padLeft-ROW_LABEL_INSET*2;let first=0,last=this.matrixRowLabels.length-1;if(dirty){const{fontBoundingBoxAscent,fontBoundingBoxDescent}=ctx.measureText("M"),baseline=padTop+cellSize/2+3;first=Math.max(first,Math.floor((dirty.top-fontBoundingBoxDescent-baseline)/cellSize)),last=Math.min(last,Math.ceil((dirty.bottom+fontBoundingBoxAscent-baseline)/cellSize))}for(let r=first;r<=last;r++){const shown=this.ellipsize(ctx,this.matrixRowLabels[r],rowLabelSpace);shown&&ctx.fillText(shown,ROW_LABEL_INSET,padTop+r*cellSize+cellSize/2+3)}}paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs,columns){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const colRotation=this.effectiveColLabelRotation,interval=finiteInteger(this.colLabelInterval,1,1);if(colRotation===0){const cols=this.matrixColLabels.length;this.matrixColLabels.forEach((label,c)=>{if(c%interval!==0||columns&&(c<columns.first-interval+1||c>columns.last))return;const shown=this.ellipsize(ctx,label,Math.min(interval,cols-c)*cellSize-2);shown&&ctx.fillText(shown,padLeft+c*cellSize+2,padTop-COL_LABEL_INSET)});return}const radians=colRotation*Math.PI/180,previousAlign=ctx.textAlign;ctx.textAlign="right",this.matrixColLabels.forEach((label,c)=>{c%interval===0&&(ctx.save(),ctx.translate(padLeft+c*cellSize+cellSize/2,padTop-COL_LABEL_INSET),ctx.rotate(radians),ctx.fillText(label,0,0),ctx.restore())}),ctx.textAlign=previousAlign}paintFrozenLabelBands(padLeft,padTop,cellSize,rowHeight,width,height,scale,cs){if(this.effectiveStickyLabels==="none")return;const backdrop=this.stickyLabelBg(cs),rowBand=this.frozenBandCanvas("row-labels");rowBand&&this.paintFrozenBand(rowBand,padLeft,height,scale,backdrop,bandCtx=>this.paintMatrixRowLabels(bandCtx,padLeft,padTop,rowHeight,cs));const colBand=this.frozenBandCanvas("col-labels");colBand&&this.paintFrozenBand(colBand,width,padTop,scale,backdrop,bandCtx=>this.paintMatrixColLabels(bandCtx,padLeft,padTop,cellSize,cs))}frozenBandCanvas(part){return this.shadowRoot?.querySelector(`[part="${part}"]`)??null}sizeCanvas(canvas,width,height,desiredScale=this.ownerDocument.defaultView?.devicePixelRatio){const{pixelWidth,pixelHeight,scale}=resolveBoundedCanvasAllocation({cssWidth:width,cssHeight:height,desiredScale,maxDimension:MAX_CANVAS_DIMENSION,maxPixels:MAX_CANVAS_PIXELS});canvas.width=pixelWidth,canvas.height=pixelHeight,canvas.style.width=`${width}px`,canvas.style.height=`${height}px`;const ctx=canvas.getContext("2d");return ctx?.scale(scale,scale),ctx}paintFrozenBand(canvas,width,height,scale,backdrop,paint){const ctx=this.sizeCanvas(canvas,width,height,scale);ctx&&(ctx.clearRect(0,0,width,height),ctx.fillStyle=backdrop,ctx.fillRect(0,0,width,height),paint(ctx))}hitTest(x,y){return this.effectiveMode==="calendar"?this.hitTestCalendar(x,y):this.hitTestMatrix(x,y)}matrixNavigationGeometry(rows,cols){const painted=this.lastPaintedMatrixGeometry;if(painted)return{rows,cols,padLeft:painted.padLeft,padTop:painted.padTop,cellSize:painted.cellSize,rowHeight:painted.rowHeight??painted.cellSize,cellWidth:painted.cellWidth??painted.cellSize-1,cellHeight:painted.cellHeight??painted.cellSize-1,customShape:painted.cellWidth!==void 0};const cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight);return{rows,cols,padLeft:this.matrixPadLeft,padTop:this.matrixPadTop,cellSize,rowHeight,cellWidth:shape.w,cellHeight:shape.h,customShape:shape.custom}}calendarNavigationGeometry(){const cellSize=this.calendarCellSize(),columnPositions=this.calendarColumnPositions(),rowPositions=this.calendarRowPositions();return{weekCount:this.cachedCalendarGrid.weekCount,cellSize,columnPositions,rowPositions,padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H}}hitTestMatrix(x,y){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;return rows===0||cols===0?null:hitTestMatrixGrid(x,y,this.matrixNavigationGeometry(rows,cols),pos=>this.isCellInteractive(pos))}firstInteractiveMatrixCell(rows,cols){return findFirstInteractiveMatrixCell(rows,cols,pos=>this.isCellInteractive(pos))}nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols){return findNextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols,pos=>this.isCellInteractive(pos))}firstInteractiveCalendarCell(weekCount){return findFirstInteractiveCalendarCell(weekCount,(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount){return findNextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount,(nextWeek,nextWeekday)=>this.calendarPos(nextWeek,nextWeekday),pos=>this.isCellInteractive(pos))}hitTestCalendar(x,y){const weekCount=this.cachedCalendarGrid.weekCount;if(weekCount===0)return null;const columnPositions=this.calendarColumnPositions();return hitTestCalendarGrid(x,y,weekCount,columnPositions,()=>this.calendarCellSize(),()=>this.calendarRowPositions(),(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}calendarCellAt(pos){return readCalendarCell(pos.week,pos.weekday,this.cachedCalendarCellsByPos,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart,this.signedDomain)}calendarValueAt(week,weekday){return readCalendarValue(week,weekday,this.cachedCalendarCellsByPos,this.signedDomain)}calendarDateAt(week,weekday){return readCalendarDate(week,weekday,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart)}calendarPos(week,weekday){return{week,weekday,date:this.calendarDateAt(week,weekday)}}cellRect(pos){return"week"in pos?calendarCellRect(pos.week,pos.weekday,this.calendarNavigationGeometry()):matrixCellRect(pos,this.matrixNavigationGeometry(this.matrixRowLabels.length,this.matrixColLabels.length))}accessibleCellRect(pos){return"week"in pos||!this.lastPaintedMatrixGeometry?this.cellRect(pos):accessibleMatrixCellRect(pos,this.lastPaintedMatrixGeometry)}defaultCellText(pos){return"week"in pos?this.calendarCellText(pos):this.matrixCellText(pos)}matrixCellText(pos){const rowLabel=this.matrixRowLabels[pos.row]??this.localize("heatmapDefaultRowLabel",void 0,{n:this.formatCount(pos.row+1)}),colLabel=this.matrixColLabels[pos.col]??this.localize("heatmapDefaultColLabel",void 0,{n:this.formatCount(pos.col+1)}),v=this.matrixValues[pos.row]?.[pos.col],valueText=v==null||this.isNoData(v)?this.localize("heatmapNoDataValue"):this.formatNumericValue(v);return this.localize("heatmapMatrixCellLabel",void 0,{row:rowLabel,col:colLabel,value:valueText})}calendarCellText(pos){const{date,value}=this.calendarCellAt(pos),label=getDateTimeFormat(this.effectiveLocale||void 0,{month:"short",day:"numeric",timeZone:"UTC"}).format(parseIsoDate(date)),valueText=this.isNoData(value)?this.localize("heatmapNoDataValue"):this.formatNumericValue(value);return this.localize("heatmapCalendarCellLabel",void 0,{date:label,value:valueText})}valueAt(pos){return"week"in pos?this.calendarCellAt(pos).value:this.matrixValues[pos.row]?.[pos.col]??-1}resolveCellText(pos){return this.cellText?this.cellText(pos,this.valueAt(pos)):this.defaultCellText(pos)}isCellInteractive(pos){return this.cellInteractive?.(pos,this.valueAt(pos))??!0}announce(pos,isSelectedOverride){const text=this.resolveCellText(pos),announcement=isSelectedOverride??this.isSelectedPos(pos)?this.localize("heatmapSelectedCellLabel",void 0,{cell:text}):text;this.liveText=announcement,this.announcements.announcePolite(announcement)}emitCellClick(pos,source="pointer",select=!0){if(!this.isCellInteractive(pos))return;this.multiple&&select&&(this.selectionAnchor=pos,this.selectionRangeBase=void 0,this.toggleSelectionPositions([pos],source));let detail;if("week"in pos){const{date,value}=this.calendarCellAt(pos);detail={date,value}}else{const value=this.matrixValues[pos.row]?.[pos.col]??-1;detail={row:pos.row,col:pos.col,value}}this.emit("lr-cell-activate",{...detail})}get currentSelectedPositions(){return this.selectionPreview??this.selectedPositions}selectedPaintPositions(){if(this.multiple)return[...this.currentSelectedPositions.values()];const selected=this.selectedCell;if(!selected)return[];if(this.effectiveMode==="calendar"){const match=selected.date?this.cachedCalendarCellsByDate.get(selected.date):void 0;return match?[match]:[]}return selected.row!=null&&selected.col!=null?[{row:selected.row,col:selected.col}]:[]}rebuildSelectedPositions(){const positions=new Map,dates=this.effectiveMode==="calendar"?new Map(this.cachedAccessiblePositions.map(pos=>[this.accessibleCellIdentity(pos),pos])):void 0,input=Array.isArray(this.selectedCells)?this.selectedCells:[];for(const cell of input.slice(0,MAX_HEATMAP_CELLS)){if(!cell||typeof cell!="object")continue;const pos=dates?typeof cell.date=="string"?dates.get(cell.date):void 0:Number.isInteger(cell.row)&&Number.isInteger(cell.col)?this.cachedAccessiblePositionsByKey.get(`matrix-${cell.row}-${cell.col}`):void 0;pos&&positions.set(this.accessibleCellKey(pos),pos)}this.selectedPositions=positions}selectionCoordinates(pos){return"week"in pos?{row:pos.weekday,col:pos.week}:pos}proposeSelection(positions,source){if(positions.size===this.selectedPositions.size&&[...positions.keys()].every(key=>this.selectedPositions.has(key)))return;this.proposedSelectionKeys=new Set(positions.keys());const selectedCells=[...positions.values()].sort((a,b)=>{const first=this.selectionCoordinates(a),second=this.selectionCoordinates(b);return first.row-second.row||first.col-second.col}).map(pos=>"week"in pos?{date:pos.date}:{row:pos.row,col:pos.col});this.emit("lr-selection-change",{selectedCells,source})}toggleSelectionPositions(positions,source){if(!this.multiple||positions.length===0)return;const next=new Map(this.selectedPositions),remove=positions.every(pos=>next.has(this.accessibleCellKey(pos)));for(const pos of positions){const key=this.accessibleCellKey(pos);remove?next.delete(key):next.set(key,pos)}this.proposeSelection(next,source)}toggleSelectionAxis(index,row){!this.multiple||!Number.isInteger(index)||index<0||(this.cancelSelectionGesture(),this.selectionRangeBase=void 0,this.toggleSelectionPositions(this.cachedAccessiblePositions.filter(pos=>{const coordinates=this.selectionCoordinates(pos);return(row?coordinates.row:coordinates.col)===index}),row?"row":"column"))}selectionKeyDown(event,pos){if(!this.multiple)return!1;if(event.key==="Escape"&&this.selectionGesture)return event.preventDefault(),this.cancelSelectionGesture(),!0;if(event.key!==" "||!pos||!(event.shiftKey||event.ctrlKey||event.metaKey))return!1;event.preventDefault();const coordinates=this.selectionCoordinates(pos);return event.ctrlKey||event.metaKey?this.toggleColumnSelection(coordinates.col):this.toggleRowSelection(coordinates.row),!0}extendSelection(previous,next,range){if(!this.multiple)return;if(!range){this.selectionAnchor=next,this.selectionRangeBase=void 0;return}this.selectionAnchor??=previous??next,this.selectionRangeBase??=new Map(this.selectedPositions);const from=this.selectionCoordinates(this.selectionAnchor),to=this.selectionCoordinates(next),selected=new Map(this.selectionRangeBase);for(const pos of this.cachedAccessiblePositions){const{row,col}=this.selectionCoordinates(pos);row>=Math.min(from.row,to.row)&&row<=Math.max(from.row,to.row)&&col>=Math.min(from.col,to.col)&&col<=Math.max(from.col,to.col)&&selected.set(this.accessibleCellKey(pos),pos)}return this.proposeSelection(selected,"keyboard"),new Set(selected.keys())}selectionPointerPosition(event){if(!this.canvas)return null;const rect=this.canvas.getBoundingClientRect();return this.hitTest(event.clientX-rect.left,event.clientY-rect.top)}paintSelectionTo(pos){const gesture=this.selectionGesture;if(!gesture)return;this.samePos(pos,gesture.previous)||(gesture.moved=!0);const from=this.selectionCoordinates(gesture.previous),to=this.selectionCoordinates(pos),steps=Math.max(Math.abs(to.row-from.row),Math.abs(to.col-from.col),1),changed=[];for(let step=0;step<=steps;step++){const row=Math.round(from.row+(to.row-from.row)*step/steps),col=Math.round(from.col+(to.col-from.col)*step/steps),key=this.effectiveMode==="calendar"?`calendar-${col}-${row}`:`matrix-${row}-${col}`,candidate=this.cachedAccessiblePositionsByKey.get(key);candidate&&(gesture.cells.has(key)!==gesture.selecting&&changed.push(candidate),gesture.selecting?gesture.cells.set(key,candidate):gesture.cells.delete(key))}if(gesture.previous=pos,this.selectionPreview!==gesture.cells){this.selectionPreview=gesture.cells;return}this.requestUpdate(),(changed.length>16||!changed.every(cell=>this.repaintCell(cell)))&&this.requestDraw()}repaintCell(pos){return!this.canvasHasContent||!this.canvas||this.drawDirty?!1:("week"in pos?this.repaintCalendarFocusCell(pos):this.repaintMatrixFocusCell(pos),!0)}cancelSelectionGesture(){const gesture=this.selectionGesture;if(this.selectionGesture=void 0,this.selectionPreview=void 0,!!gesture){this.suppressSelectionClick=!0;try{gesture.target.hasPointerCapture(gesture.pointerId)&&gesture.target.releasePointerCapture(gesture.pointerId)}catch{}}}consumeSelectionClick(event){return!this.suppressSelectionClick||event.detail===0?!1:(this.suppressSelectionClick=!1,!0)}get gridScrollport(){return this.shadowRoot?.querySelector('[part="grid"]')??null}measureTooltip(){if(!this.gridScrollport)return;const tooltip=this.shadowRoot?.querySelector('[part="tooltip"]');if(!tooltip||tooltip.hidden)return;const view=this.ownerDocument.defaultView,gap=view?Math.abs(finiteNumber(Number.parseFloat(view.getComputedStyle(tooltip).marginBlockStart),0)):0,inline=tooltip.offsetWidth,block=tooltip.offsetHeight+gap;inline===this.tooltipSize.inline&&block===this.tooltipSize.block||(this.tooltipSize={inline,block},this.requestUpdate())}tooltipAnchor(pos){const rect=this.cellRect(pos),center=rect.x+rect.w/2,port=this.gridScrollport;if(!port)return{style:{left:`${center}px`,top:`${rect.y}px`},below:!1};const{inline,block}=this.tooltipSize,windowStart=port.scrollLeft+(this.freezesRowLabels?this.matrixPadLeft:0),windowEnd=port.scrollLeft+port.clientWidth,windowTop=port.scrollTop+(this.freezesColLabels?this.matrixPadTop:0),windowBottom=port.scrollTop+port.clientHeight,below=rect.y-block<windowTop&&rect.y+rect.h+block<=windowBottom;return{style:{left:`${Math.max(windowStart+inline/2,Math.min(center,windowEnd-inline/2))}px`,top:`${below?rect.y+rect.h:rect.y}px`},below}}scrollCellIntoView(pos){const port=this.gridScrollport;if(!port)return;const rect=this.cellRect(pos),bandInline=this.freezesRowLabels?this.matrixPadLeft:0,bandBlock=this.freezesColLabels?this.matrixPadTop:0,left=Math.min(Math.max(port.scrollLeft,rect.x+rect.w-port.clientWidth),rect.x-bandInline),top=Math.min(Math.max(port.scrollTop,rect.y+rect.h-port.clientHeight),rect.y-bandBlock);left!==port.scrollLeft&&(port.scrollLeft=left),top!==port.scrollTop&&(port.scrollTop=top)}samePos(a,b){return a===b?!0:!a||!b?!1:"week"in a&&"week"in b?a.week===b.week&&a.weekday===b.weekday:"row"in a&&"row"in b?a.row===b.row&&a.col===b.col:!1}edgeCell(e){if(e.key!=="Home"&&e.key!=="End")return null;const row=this.focusedCell&&!(e.ctrlKey||e.metaKey)?this.selectionCoordinates(this.focusedCell).row:void 0,cells=this.cachedAccessiblePositions.filter(pos=>row===void 0||this.selectionCoordinates(pos).row===row);return cells[e.key==="Home"?0:cells.length-1]??null}onMatrixKeyDown(e){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(rows===0||cols===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("row"in this.focusedCell)){const next2=this.firstInteractiveMatrixCell(rows,cols);if(!next2)return;this.focusedCell=next2,this.scrollCellIntoView(next2);return}const{row,col}=this.focusedCell;let dRow=0,dCol=0;e.key==="ArrowUp"?dRow=-1:e.key==="ArrowDown"?dRow=1:e.key==="ArrowLeft"?dCol=-1:e.key==="ArrowRight"&&(dCol=1);const next=this.nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols);this.focusedCell=next,this.scrollCellIntoView(next)}onCalendarKeyDown(e){const{weekCount}=this.cachedCalendarGrid;if(weekCount===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("week"in this.focusedCell)){const next2=this.firstInteractiveCalendarCell(weekCount);if(!next2)return;this.focusedCell=next2;return}const{week,weekday}=this.focusedCell;let dWeek=0,dWeekday=0;e.key==="ArrowUp"?dWeekday=-1:e.key==="ArrowDown"?dWeekday=1:e.key==="ArrowLeft"?dWeek=-1:e.key==="ArrowRight"&&(dWeek=1);const next=this.nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount);this.focusedCell=next}resolveCellColor(value,cs){let color=this.canvasColorCache.get(value);if(color===void 0){const ctx=SCOPED_COLOR.test(value)?null:getScratchCtx(this.ownerDocument);if(ctx){ctx.fillStyle="rgb(1, 2, 3)";const rejected=ctx.fillStyle;ctx.fillStyle=value,ctx.fillStyle!==rejected&&(color=ctx.fillStyle)}color??=resolveCanvasColor(this,value,this.noDataFill(cs)),this.canvasColorCache.set(value,color)}return color}rebuildAccessiblePositions(){const positions=[];if(this.effectiveMode==="calendar"){const{weekCount}=this.cachedCalendarGrid;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const pos=this.calendarPos(week,weekday);this.isCellInteractive(pos)&&positions.push(pos)}}else for(let row=0;row<this.matrixRowLabels.length;row++)for(let col=0;col<this.matrixColLabels.length;col++){const pos={row,col};this.isCellInteractive(pos)&&positions.push(pos)}this.cachedAccessiblePositions=positions,this.cachedAccessiblePositionsByKey=new Map(positions.map(position=>[this.accessibleCellKey(position),position])),this.cachedAccessiblePositionIndexByKey=new Map(positions.map((position,index)=>[this.accessibleCellKey(position),index]))}accessibleCellPositions(){return this.cachedAccessiblePositions}accessibleCellKey(pos){return"week"in pos?`calendar-${pos.week}-${pos.weekday}`:`matrix-${pos.row}-${pos.col}`}accessibleCellIdentity(pos){return"week"in pos?pos.date:this.accessibleCellKey(pos)}accessibleCellAtKey(key){return this.cachedAccessiblePositionsByKey.get(key)??null}focusAccessibleCell(pos){pos&&this.updateComplete.then(()=>{[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellKey===this.accessibleCellKey(pos))?.focus()})}renderAccessibleCells(){if(!this.accessibleCells)return html``;const positions=this.accessibleCellPositions(),tabStop=this.focusedCell??positions[0]??null,focusIndex=tabStop?this.cachedAccessiblePositionIndexByKey.get(this.accessibleCellKey(tabStop))??0:0,start=Math.max(0,Math.min(Math.max(0,positions.length-MAX_ACCESSIBLE_HEATMAP_CELLS),focusIndex-Math.floor(MAX_ACCESSIBLE_HEATMAP_CELLS/2))),renderedPositions=positions.slice(start,start+MAX_ACCESSIBLE_HEATMAP_CELLS),renderedRows=new Map;for(const pos of renderedPositions){const rowIndex="week"in pos?pos.weekday+1:pos.row+1,row=renderedRows.get(rowIndex);row?row.push(pos):renderedRows.set(rowIndex,[pos])}const rowCount=this.effectiveMode==="calendar"?7:this.matrixRowLabels.length,colCount=this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount:this.matrixColLabels.length,calendar=this.effectiveMode==="calendar"?this.calendarNavigationGeometry():void 0;return html`
23
+ `)}get matrixPadTop(){if(this.colLabelHeight==="auto")return this.resolvedColLabelHeight;if(typeof this.colLabelHeight!="number")return PAD_TOP;const resolved=finiteNumber(this.colLabelHeight,PAD_TOP);return resolved>=0?resolved:PAD_TOP}measureColLabelHeight(cs){const labels=this.matrixColLabels;if(labels.length===0)return PAD_TOP;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_TOP;ctx.font=this.labelFont(cs);let widest=0;const interval=finiteInteger(this.colLabelInterval,1,1);for(let index=0;index<labels.length;index+=interval)widest=Math.max(widest,this.labelWidth(ctx,labels[index]));const radians=this.effectiveColLabelRotation*Math.PI/180,projected=widest*Math.sin(radians);return Math.max(PAD_TOP,Math.min(Math.ceil(projected)+COL_LABEL_INSET,MAX_COL_LABEL_HEIGHT))}measureRowLabelWidth(cs){const labels=this.matrixRowLabels;if(labels.length===0)return PAD_LEFT;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of labels)widest=Math.max(widest,this.labelWidth(ctx,label));const hostWidth=this.clientWidth||0,cap=hostWidth>0?hostWidth*MAX_ROW_LABEL_FRACTION:Number.POSITIVE_INFINITY;return Math.min(Math.max(PAD_LEFT,Math.ceil(widest)+ROW_LABEL_INSET*2),cap)}withLabelCache(paint){const previous=this.labelCache;this.labelCache=new HeatmapLabelCache;try{paint()}finally{this.labelCache=previous}}labelWidth(ctx,label){return this.labelCache?.width(ctx,label)??ctx.measureText(label).width}ellipsize(ctx,label,maxWidth){return this.labelCache?.clip(ctx,label,maxWidth,()=>this.ellipsizeLabel(ctx,label,maxWidth))??this.ellipsizeLabel(ctx,label,maxWidth)}ellipsizeLabel(ctx,label,maxWidth){if(maxWidth<=0)return"";if(this.labelWidth(ctx,label)<=maxWidth)return label;const characters=[...label],shortened=kept=>`${characters.slice(0,kept).join("")}…`;let fits=0,most=characters.length-1;for(;fits<most;){const kept=fits+most+1>>1;this.labelWidth(ctx,shortened(kept))<=maxWidth?fits=kept:most=kept-1}return fits>0||this.labelWidth(ctx,"…")<=maxWidth?shortened(fits):""}get calendarPadLeft(){const requested=this.calendarWeekdayLabelWidth;return requested==="auto"?this.resolvedCalendarWeekdayLabelWidth:requested??CAL_PAD_LEFT}measureCalendarWeekdayLabelWidth(cs,firstWeekStart){const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return CAL_PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of this.weekdayLabels(firstWeekStart))label&&(widest=Math.max(widest,this.labelWidth(ctx,label)));const hostWidth=this.clientWidth||0,cap=hostWidth>0?Math.max(CAL_PAD_LEFT,hostWidth*MAX_ROW_LABEL_FRACTION):Number.POSITIVE_INFINITY;return Math.min(Math.max(CAL_PAD_LEFT,Math.ceil(widest)+CAL_WEEKDAY_LABEL_INSET*2),cap)}get matrixRowLabels(){return this.cachedMatrixData.rowLabels}get matrixColLabels(){return this.cachedMatrixData.colLabels}get matrixValues(){return this.cachedMatrixData.values}get calendarDays(){return this.data.kind==="calendar"?this.data.days:[]}get calendarData(){return this.data.kind==="calendar"?this.data:void 0}get cellSize(){return this._cellSize??(this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE)}set cellSize(value){const oldValue=this._cellSize;this._cellSize=value==null?void 0:finiteRange(value,this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE,1),this.requestUpdate("cellSize",oldValue)}get rowHeight(){return this._rowHeight}set rowHeight(value){const oldValue=this._rowHeight;this._rowHeight=value==null||!Number.isFinite(value)?void 0:finiteRange(value,1,1,MAX_MATRIX_ROW_HEIGHT),this.requestUpdate("rowHeight",oldValue)}get signedDomain(){return this.domain!==void 0||this.midpoint!==void 0}rampAlpha(value,lo,hi){const anchor=this.midpoint;return anchor===void 0?linearAlpha(value,lo,hi):midpointAlpha(value,lo,hi,anchor)}rampBucket(value,lo,hi,steps){const anchor=this.midpoint;return anchor===void 0?linearBucket(value,lo,hi,steps):midpointBucket(value,lo,hi,anchor,steps)}isNoData(value){return Number.isFinite(value)?value<0&&!this.signedDomain:!0}get maxCellSize(){return this._maxCellSize}set maxCellSize(value){const oldValue=this._maxCellSize;this._maxCellSize=normalizeCellSizeClamp(value),this.requestUpdate("maxCellSize",oldValue)}get minCellSize(){return this._minCellSize}set minCellSize(value){const oldValue=this._minCellSize;this._minCellSize=normalizeCellSizeClamp(value),this.requestUpdate("minCellSize",oldValue)}get normalizedFirstDayOfWeek(){return(finiteInteger(this.calendarData?.firstDayOfWeek??0,0)%7+7)%7}get bucketCount(){return this._bucketCount}set bucketCount(value){const oldValue=this._bucketCount;this._bucketCount=normalizeBucketCount(value),this.requestUpdate("bucketCount",oldValue)}toggleRowSelection(row){this.toggleSelectionAxis(row,!0)}toggleColumnSelection(col){this.toggleSelectionAxis(col,!1)}get calendarWeekdayLabelText(){return this.calendarData?.weekdayLabelText}get calendarWeekdayLabelWidth(){const value=this.calendarData?.weekdayLabelWidth;if(value==="auto")return value;if(typeof value!="number")return;const resolved=finiteNumber(value,CAL_PAD_LEFT);return resolved>=0?resolved:void 0}get calendarMonthLabelText(){return this.calendarData?.monthLabelText}get calendarColumnX(){return this.calendarData?.columnX}get calendarRowY(){return this.calendarData?.rowY}constructor(){super(),this.sourceInput=null,this.sourceViewportInput=null,this.sourceViewportInvalid=!1,this.matrixReducer="mean",this.sourceNeedsConfigure=!0,this.sourceViewportExplicit=!1,this.sourceWidth=0,this.sourceSelectionKey="",this.sourceSelectedCellsEpoch=-1,this.sourceSelectedKeys=new Set,this.sourceRevealIntent=0,this.sourceNavigationIntent=0,this.sourceFocusVersion=0,this.sourceRestoringFocus=!1,this.sourceHasSucceeded=!1,this.sourceFailureAnnounced=!1,this.sourceResult=0,this.sourceController=new HeatmapMatrixSourceController(this,()=>{this.sourceResult++},()=>this.effectiveLocale),this.sourceHovered=null,this.sourceHover=event=>{const viewport=this.sourceController.viewport;if(!viewport||this.sourceController.loading||this.sourceController.error)return;const bounds=event.currentTarget.getBoundingClientRect(),row=viewport.rowStart+Math.floor((event.clientY-bounds.top)/bounds.height*(viewport.rowEnd-viewport.rowStart)),col=viewport.columnStart+Math.floor((event.clientX-bounds.left)/bounds.width*(viewport.columnEnd-viewport.columnStart));this.sourceHovered=this.sourceTileAt(row,col)??null},this.sourceClick=event=>{const controller=this.sourceController,viewport=controller.viewport;if(!viewport||controller.loading||controller.error)return;const bounds=event.currentTarget.getBoundingClientRect(),row=Math.min(viewport.rowEnd-1,viewport.rowStart+Math.floor((event.clientY-bounds.top)/bounds.height*(viewport.rowEnd-viewport.rowStart))),col=Math.min(viewport.columnEnd-1,viewport.columnStart+Math.floor((event.clientX-bounds.left)/bounds.width*(viewport.columnEnd-viewport.columnStart))),tile=this.sourceTileAt(row,col);tile?.count===1?this.sourceActivate(row,col,"pointer"):tile&&this.sourceRange(tile)},this.sourceKeydown=async event=>{const controller=this.sourceController,viewport=controller.viewport,source=this.matrixSource,epoch=controller.requests.epoch,navigation=++this.sourceNavigationIntent;if(!source||!viewport||controller.error)return;const cursor=controller.cursor;let row=cursor?.row??viewport.rowStart,col=cursor?.col??viewport.columnStart;if(event.key==="Enter"||event.key===" "){if(event.preventDefault(),event.shiftKey){const tile=this.sourceTileAt(row,col);tile&&this.sourceRange(tile)}else await this.sourceActivate(row,col);return}let dr=0,dc=0;if(event.key==="ArrowDown")dr=1;else if(event.key==="ArrowUp")dr=-1;else if(event.key==="ArrowRight")dc=1;else if(event.key==="ArrowLeft")dc=-1;else if(event.key==="PageDown")dr=Math.min(20,controller.rows);else if(event.key==="PageUp")dr=-Math.min(20,controller.rows);else if(event.key==="Home")col=0,event.ctrlKey&&(row=0);else if(event.key==="End")col=controller.cols-1,event.ctrlKey&&(row=controller.rows-1);else return;event.preventDefault();for(let attempt=0;attempt<32;attempt++){row=Math.max(0,Math.min(controller.rows-1,row+dr)),col=Math.max(0,Math.min(controller.cols-1,col+dc));const reveal=this.revealSourceCell(row,col),intent=this.sourceRevealIntent;if(await reveal||navigation!==this.sourceNavigationIntent||intent!==this.sourceRevealIntent||!this.sourceCurrent(source,epoch)||!dr&&!dc)return}},this.data=DEFAULT_MATRIX_DATA,this.maxCells=1e4,this._stickyLabels="none",this.resolvedColLabelHeight=PAD_TOP,this.resolvedRowLabelWidth=PAD_LEFT,this.resolvedCalendarWeekdayLabelWidth=CAL_PAD_LEFT,this.withoutLegend=!1,this.scale="linear",this.cellGapX=1,this.cellGapY=1,this.cellRadius=0,this.colLabelInterval=1,this.fitToWidth=!1,this._bucketCount=DEFAULT_BUCKET_COUNT,this.annotations=[],this.selectedCell=null,this.multiple=!1,this.selectedCells=[],this.accessibleCells=!1,this.cachedValueRange=null,this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1},this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays),this.cachedCalendarSortedValues=[],this.cachedCalendarCellsByPos=new Map,this.cachedCalendarCellsByDate=new Map,this.cachedAnnotations=[],this.cachedLegendStops=[],this.cachedColorSteps=[],this.cachedCalendarAnnotationDates=new Set,this.cachedMatrixAnnotationPositions=new Set,this.decorationProjectionTruncated=!1,this.cachedCalendarDateByPos=[],this.cachedAccessiblePositions=[],this.cachedAccessiblePositionsByKey=new Map,this.cachedAccessiblePositionIndexByKey=new Map,this.cachedRamp=null,this.canvasHasContent=!1,this.canvasVisible=!0,this.drawDirty=!1,this.overlayRevision=0,this.hoverCell=null,this.focusedCell=null,this.liveText="",this.accessibleTargetSizePx=DEFAULT_ACCESSIBLE_TARGET_SIZE_PX,this.restoringAccessibleFocus=!1,this.accessibleFocusGeneration=0,this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.authorRole=null,this.authorAriaLabel=null,this.generatedAriaLabel="",this.syncingGeneratedSemantics=!1,this.hasSyncedDescribedByElements=!1,this.onDprChange=()=>{this.watchDpr(),this.requestDraw()},this.initialLimitUpdate=!0,this.lastLimitNotice="",this.scheduleDraw=()=>{if(this.drawFrameRequest)return;const owner=this.ownerDocument.defaultView;if(!owner||!this.isConnected)return;const request={owner,handle:0};request.handle=owner.requestAnimationFrame(()=>{this.drawFrameRequest===request&&(this.drawFrameRequest=void 0,this.isConnected&&this.ownerDocument.defaultView===owner&&this.requestDraw())}),this.drawFrameRequest=request},this.selectedPositions=new Map,this.selectionAnchor=null,this.suppressSelectionClick=!1,this.onSelectionPointerDown=event=>{if(!this.multiple||event.button!==0||!event.isPrimary||this.selectionGesture)return;const pos=this.selectionPointerPosition(event);if(!pos)return;event.preventDefault(),this.suppressSelectionClick=!1,this.selectionRangeBase=void 0,this.selectionAnchor=pos,this.focusedCell=pos,this.accessibleCells?this.focusAccessibleCell(pos):this.canvas?.focus();const target=event.currentTarget;this.selectionGesture={pointerId:event.pointerId,target,start:pos,previous:pos,moved:!1,selecting:!this.selectedPositions.has(this.accessibleCellKey(pos)),cells:new Map(this.selectedPositions)};try{target.setPointerCapture(event.pointerId)}catch{}this.paintSelectionTo(pos)},this.onSelectionPointerMove=event=>{if(this.selectionGesture?.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&!this.samePos(pos,this.selectionGesture.previous)&&this.paintSelectionTo(pos)},this.onSelectionPointerUp=event=>{const gesture=this.selectionGesture;if(!gesture||gesture.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&this.paintSelectionTo(pos),this.cancelSelectionGesture(),this.proposeSelection(gesture.cells,"pointer"),gesture.moved||this.emitCellClick(gesture.start,"pointer",!1)},this.onSelectionPointerCancel=event=>{this.selectionGesture?.pointerId===event.pointerId&&this.cancelSelectionGesture()},this.tooltipSize={inline:0,block:0},this.onPointerMove=e=>{const next=this.hitTest(e.offsetX,e.offsetY);this.samePos(this.hoverCell,next)||(this.hoverCell=next)},this.onPointerLeave=()=>{this.hoverCell=null},this.onCanvasClick=e=>{if(this.consumeSelectionClick(e))return;const pos=this.hitTest(e.offsetX,e.offsetY);pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos))},this.onKeyDown=e=>{if(this.selectionKeyDown(e,this.focusedCell))return;const previous=this.focusedCell,edge=this.edgeCell(e);if(edge?(e.preventDefault(),this.focusedCell=edge,this.scrollCellIntoView(edge)):this.effectiveMode==="calendar"?this.onCalendarKeyDown(e):this.onMatrixKeyDown(e),(edge||ARROW_KEYS.has(e.key))&&this.focusedCell){const proposedKeys=this.extendSelection(previous,this.focusedCell,e.shiftKey);this.announce(this.focusedCell,proposedKeys?.has(this.accessibleCellKey(this.focusedCell)))}},this.canvasColorCache=new Map,this.onAccessibleCellFocus=e=>{if(this.restoringAccessibleFocus)return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.samePos(pos,this.focusedCell)||(this.selectionAnchor=pos,this.selectionRangeBase=void 0),this.focusedCell=pos,this.announce(pos))},this.onAccessibleCellClick=e=>{if(this.consumeSelectionClick(e))return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos,e.detail===0?"keyboard":"pointer"))},this.onAccessibleCellKeyDown=e=>{const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.selectionKeyDown(e,pos)||GRID_KEYS.has(e.key)&&(e.preventDefault(),this.focusedCell=pos,this.onKeyDown(e),this.focusAccessibleCell(this.focusedCell)))},new ThemeWatcher(this,()=>this.onThemeSignal()),this.calendarSpacingTrackingArmed=!0}requestUpdate(name,oldValue,options){this.calendarSpacingTrackingArmed&&name!==void 0&&CALENDAR_SPACING_PROPERTIES.has(name)&&(this.explicitCalendarSpacingProperties??=new Set).add(name),this.sourceController&&name===void 0&&(this.sourceController.invalidate(),this.sourceNeedsConfigure=!0),super.requestUpdate(name,oldValue,options)}explicitCalendarSpacing(name){if(!this.explicitCalendarSpacingProperties?.has(name))return;const value=this[name];return value??void 0}warnOnLegendRampMismatch(){const rampColors=this.cachedColorSteps.map(color=>sanitizeCssColor(color)??color);if(rampColors.length===0)return;const legendColors=this.cachedLegendStops.filter(stop=>!!stop.color&&stop.partOfRamp!==!1).map(stop=>sanitizeCssColor(stop.color??"")??stop.color??"");legendColors.length===0||legendColors.length===rampColors.length&&legendColors.every((color,index)=>color===rampColors[index])||devWarnOnce("lyra-heatmap-legend-ramp-mismatch",`<${this.localName}>: legendStops describes ${legendColors.length} colour(s) that do not match the ${rampColors.length} colorSteps the cells are painted from, so the legend may misdescribe the ramp. Supply legendStops built from the same array as colorSteps, or omit it to keep the built-in gradient key.`)}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),!(oldValue===value||this.syncingGeneratedSemantics)&&(name==="role"&&(this.authorRole=value),name==="aria-label"&&(this.authorAriaLabel=value))}connectedCallback(){super.connectedCallback(),this.sourceNeedsConfigure=!0,this.refreshAccessibleTargetSize();const owner=this.ownerDocument.defaultView,ResizeObserverCtor=owner?.ResizeObserver;if(owner&&ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.resizeObserver!==observer||this.scheduleDraw()}),this.resizeObserver=observer,observer.observe(this)}const IntersectionObserverCtor=owner?.IntersectionObserver;if(this.canvasVisible=!0,owner&&IntersectionObserverCtor){let observer;observer=new IntersectionObserverCtor(entries=>{if(!this.isConnected||this.ownerDocument.defaultView!==owner||this.intersectionObserver!==observer)return;const entry=entries.find(candidate=>candidate.target===this);!entry||entry.isIntersecting===this.canvasVisible||(this.canvasVisible=entry.isIntersecting,this.canvasVisible&&this.drawDirty&&this.scheduleDraw())}),this.intersectionObserver=observer,observer.observe(this)}this.cachedRamp=null,this.resolvedStepsMemo=void 0,this.paintedTheme=void 0,this.canvasColorCache.clear(),this.watchDpr(),this.drawDirty&&!ResizeObserverCtor&&this.scheduleDraw()}disconnectedCallback(){super.disconnectedCallback(),this.sourceHovered=null,this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.accessibleFocusGeneration++,this.pendingAccessibleFocus=void 0,this.pendingAccessibleFocusOrigin=void 0,this.restoringAccessibleFocus=!1,this.hoverCell=null,this.focusedCell=null,this.liveText="",this.canvasHasContent=!1,this.drawDirty=!0,this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.canvasVisible=!0,this.clearDprWatcher(),this.cancelDrawFrame()}adoptedCallback(){super.adoptedCallback(),this.sourceController.requests.adopted(),this.sourceNeedsConfigure=!0,this.announcements.adopted()}watchDpr(){this.clearDprWatcher();const owner=this.ownerDocument.defaultView;if(!owner||typeof owner.matchMedia!="function")return;const query2=owner.matchMedia(`(resolution: ${owner.devicePixelRatio}dppx)`),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.dprQuery!==query2||this.onDprChange()};this.dprQuery=query2,this.dprChangeListener=listener,query2.addEventListener("change",listener)}clearDprWatcher(){this.dprQuery&&this.dprChangeListener&&this.dprQuery.removeEventListener("change",this.dprChangeListener),this.dprQuery=void 0,this.dprChangeListener=void 0}willUpdate(changed){if(super.willUpdate(changed),changed.has("matrixSource")&&!this.matrixSource&&changed.set("data",void 0),this.matrixSource){if((changed.has("locale")||changed.has("strings"))&&(this.sourceRevealIntent++,this.sourceNavigationIntent++,this.sourceController.cancelExact()),(changed.has("data")||changed.has("maxCells"))&&(this.sourceNeedsConfigure=!0),!["mean","min","max"].includes(this.matrixReducer)){this.sourceController.fail();return}if(changed.has("matrixReducer")&&this.sourceController.error&&(this.sourceNeedsConfigure=!0),this.configureSource(),this.sourceSelectedCellsInput!==this.selectedCells||this.sourceSelectedCellsEpoch!==this.sourceController.requests.epoch){this.sourceSelectedCellsInput=this.selectedCells,this.sourceSelectedCellsEpoch=this.sourceController.requests.epoch,this.sourceSelectedKeys.clear();for(let index=0;index<Math.min(this.selectedCells.length,MAX_HEATMAP_CELLS);index++){const cell=this.selectedCells[index];cell?.row!==void 0&&cell.col!==void 0&&this.sourceController.valid(cell.row,cell.col)&&this.sourceSelectedKeys.add(`${cell.row}:${cell.col}`)}}const domain=this.sourceController.domain;this.cachedValueRange=this.domain&&this.domain.length===2&&this.domain.every(Number.isFinite)&&this.domain[0]<=this.domain[1]?[this.domain[0],this.domain[1]]:domain?[domain.min,domain.max]:null,this.rebuildBoundedDecorations();const focused=shadowFocusTarget(this);if(focused?.dataset.sourceRow!==void 0&&!this.sourceController.cells.some(cell=>String(cell.row)===focused.dataset.sourceRow&&String(cell.col)===focused.dataset.sourceCol)){this.sourceRestoringFocus=!0;try{this.shadowRoot?.querySelector('[part="source-exact-window"]')?.focus()}finally{this.sourceRestoringFocus=!1}}return}(changed.size===0||[...changed.keys()].some(key=>!["hoverCell","focusedCell","liveText"].includes(String(key))))&&this.overlayRevision++,(changed.has("data")||changed.has("maxCells")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&this.rebuildCanonicalMatrixData(),(changed.has("annotations")||changed.has("legendStops")||changed.has("colorSteps")||!this.hasUpdated)&&this.rebuildBoundedDecorations();const accessibleModeChanged=changed.has("accessibleCells")&&this.hasUpdated,collectionChanged=changed.has("data")||changed.has("maxCells")||changed.has("cellInteractive"),activeRenderedControl=collectionChanged||accessibleModeChanged?shadowFocusTarget(this):null,activeAccessibleCell=activeRenderedControl?.matches('[part="cell"]')?activeRenderedControl:null,renderedAccessibleCells=activeAccessibleCell?.matches('[part="cell"]')?[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]]:[],accessibleFocusSnapshot=activeAccessibleCell?.matches('[part="cell"]')?{identity:activeAccessibleCell.dataset.cellIdentity,index:renderedAccessibleCells.indexOf(activeAccessibleCell)}:void 0;if(collectionChanged&&(this.focusedCell=null,this.hoverCell=null,this.liveText=""),changed.has("data")||changed.has("maxCells")||changed.has("locale")||!this.hasUpdated){this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays,this.normalizedFirstDayOfWeek,this.calendarMonthLabelText,this.effectiveLocale,this.cellBudget),this.cachedCalendarSortedValues=this.cachedCalendarGrid.cells.map(cell=>cell.value).filter(value=>!this.isNoData(value)).sort((a,b)=>a-b),this.cachedCalendarCellsByPos=new Map(this.cachedCalendarGrid.cells.map(cell=>[`${cell.week}:${cell.weekday}`,cell])),this.cachedCalendarCellsByDate=new Map(this.cachedCalendarGrid.cells.map(cell=>[cell.date,cell]));const{firstWeekStart,weekCount}=this.cachedCalendarGrid;this.cachedCalendarDateByPos=Array.from({length:weekCount*7},(_,index)=>isoDateAtOffset(firstWeekStart,index))}if(changed.has("colorSteps")||changed.has("withoutLegend")||!this.hasUpdated){const colorSteps=this.withoutLegend?[]:this.cachedColorSteps.map(sanitizeCssColor);colorSteps.length>=2&&colorSteps.every(color=>color!==void 0)?this.style.setProperty("--lr-heatmap-color-steps-gradient",`linear-gradient(to right, ${colorSteps.join(", ")})`):this.style.removeProperty("--lr-heatmap-color-steps-gradient")}if((changed.has("data")||changed.has("maxCells")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&(this.cachedValueRange=this.computeValueRange()),(collectionChanged||!this.hasUpdated)&&this.rebuildAccessiblePositions(),(collectionChanged||accessibleModeChanged||changed.has("multiple"))&&(this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.proposedSelectionKeys=void 0),collectionChanged||changed.has("selectedCells")||changed.has("multiple")||!this.hasUpdated){const previous=this.selectedPositions;if(this.rebuildSelectedPositions(),this.pendingSelectionRepaint=void 0,!collectionChanged&&changed.has("selectedCells")){const cells=[...previous].filter(([key])=>!this.selectedPositions.has(key)).map(([,pos])=>pos);for(const[key,pos]of this.selectedPositions)previous.has(key)||cells.push(pos);cells.length<=16&&(this.pendingSelectionRepaint=cells)}changed.has("selectedCells")&&this.selectionGesture&&this.cancelSelectionGesture(),changed.has("selectedCells")&&this.selectionRangeBase&&(this.proposedSelectionKeys?.size!==this.selectedPositions.size||[...this.selectedPositions.keys()].some(key=>!this.proposedSelectionKeys?.has(key)))&&(this.selectionAnchor=this.focusedCell,this.selectionRangeBase=void 0)}if(accessibleFocusSnapshot){const positions=this.accessibleCellPositions(),target=(accessibleFocusSnapshot.identity==null?void 0:positions.find(pos=>this.accessibleCellIdentity(pos)===accessibleFocusSnapshot.identity))??positions[Math.min(Math.max(accessibleFocusSnapshot.index,0),positions.length-1)]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeAccessibleCell??void 0,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}if(accessibleModeChanged){const previouslyAccessible=changed.get("accessibleCells")===!0;if(previouslyAccessible&&!this.accessibleCells&&activeAccessibleCell){const key=activeAccessibleCell.dataset.cellKey,target=key?this.accessibleCellAtKey(key):null;target&&(this.focusedCell=target,this.liveText=this.resolveCellText(target)),this.pendingAccessibleFocus="canvas",this.pendingAccessibleFocusOrigin=activeAccessibleCell,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}else if(!previouslyAccessible&&this.accessibleCells&&activeRenderedControl?.matches('[part="canvas"]')){const positions=this.accessibleCellPositions(),target=this.focusedCell?positions.find(pos=>this.samePos(pos,this.focusedCell))??positions[0]??null:positions[0]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeRenderedControl,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}}if(!this.hasUpdated||changed.size===0||[...changed.keys()].some(key=>!["hoverCell","focusedCell","liveText"].includes(String(key)))){const bounds=this.cachedValueRange,range=bounds?`${this.formatNumericValue(bounds[0])}–${this.formatNumericValue(bounds[1])}`:this.localize("heatmapNoDataValue"),valueLabel=this.localizedValueLabel();let label;if(this.effectiveMode==="calendar")label=this.localize("heatmapCalendarLabel",void 0,{days:this.formatCount(this.cachedCalendarGrid.cells.length),label:valueLabel,range});else{const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;label=this.localize("heatmapMatrixLabel",void 0,{rows:this.formatCount(rows),cols:this.formatCount(cols),label:valueLabel,range})}const selectedText=this.selectedCellDescription(),generatedAriaLabel=[label,selectedText,this.projectionDescription()].filter(Boolean).join(" ");this.generatedAriaLabel=generatedAriaLabel,this.syncingGeneratedSemantics=!0;try{this.authorRole===null&&this.getAttribute("role")!=="group"&&this.setAttribute("role","group"),this.authorAriaLabel===null&&this.getAttribute("aria-label")!==generatedAriaLabel&&this.setAttribute("aria-label",generatedAriaLabel)}finally{this.syncingGeneratedSemantics=!1}}}rebuildBoundedDecorations(){this.cachedAnnotations=this.annotations.slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>entry??{}),this.cachedLegendStops=(this.legendStops??[]).slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>entry??{}),this.cachedColorSteps=(this.colorSteps??[]).slice(0,MAX_HEATMAP_DECORATIONS),this.warnOnLegendRampMismatch(),this.cachedCalendarAnnotationDates=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.date==null?[]:[annotation.date])),this.cachedMatrixAnnotationPositions=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.row==null||annotation.col==null?[]:[`${annotation.row}:${annotation.col}`])),this.decorationProjectionTruncated=this.annotations.length>MAX_HEATMAP_DECORATIONS||(this.legendStops?.length??0)>MAX_HEATMAP_DECORATIONS||(this.colorSteps?.length??0)>MAX_HEATMAP_DECORATIONS}get ownedInputTruncated(){return["annotations","legendStops","colorSteps","selectedCells"].some(name=>publicCollectionTruncation(this,name)!==void 0)}get projectionTruncated(){return this.decorationProjectionTruncated||this.ownedInputTruncated||(this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated)}get cellProjectionTruncated(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated}projectedCellCount(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount*7:this.matrixRowLabels.length*this.matrixColLabels.length}projectionDescription(){const messages=[];return this.cellProjectionTruncated&&messages.push(this.localize("heatmapProjectionLimit",void 0,{count:this.formatCount(this.projectedCellCount())})),this.decorationProjectionTruncated&&messages.push(this.localize("heatmapDecorationLimit",void 0,{count:this.formatCount(MAX_HEATMAP_DECORATIONS)})),this.ownedInputTruncated&&messages.push(this.localize("heatmapInputLimit")),messages.join(" ")}rebuildCanonicalMatrixData(){if(this.data.kind!=="matrix"){this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1};return}const own=(value,key)=>{if(!value||typeof value!="object")return;const descriptor=getOwnDataDescriptor(value,key);return typeof descriptor=="object"?descriptor.value:void 0},rows=own(this.data,"rowLabels"),cols=own(this.data,"colLabels"),source=own(this.data,"values"),count=value=>{const length=own(value,"length");return finiteCount(typeof length=="number"?length:0,0)},colCount=Math.min(count(cols),this.cellBudget),rowLimit=colCount===0?this.cellBudget:Math.floor(this.cellBudget/colCount),rowCount=Math.min(count(rows),rowLimit),labels=(source2,length)=>{const result=new Array(length);if(!source2||typeof source2!="object")return result;for(let index=0;index<length;index++){const descriptor=getOwnDataDescriptor(source2,String(index));if(typeof descriptor!="object")continue;const value=descriptor.value;result[index]=value===null||typeof value!="object"&&typeof value!="function"?String(value):""}return result},rowLabels=labels(rows,rowCount),colLabels=labels(cols,colCount);let truncated=rowCount!==count(rows)||colCount!==count(cols)||count(source)>rowCount;const values=Array.from({length:rowCount},(_,row)=>{const input=own(source,String(row));return count(input)>colCount&&(truncated=!0),Array.from({length:colCount},(_2,col)=>{const value=own(input,String(col));return typeof value=="number"?value:this.signedDomain?Number.NaN:-1})});this.cachedMatrixData={rowLabels,colLabels,values,truncated}}selectedCellDescription(){if(this.multiple){const count=this.currentSelectedPositions.size;return count?this.localize("heatmapSelectedCount",void 0,{count:this.formatCount(count)}):""}if(!this.selectedCell)return"";if(this.effectiveMode==="calendar"){if(this.selectedCell.date==null)return"";const match=this.cachedCalendarCellsByDate.get(this.selectedCell.date);return match?this.localize("heatmapSelectedCellLabel",void 0,{cell:this.calendarCellText({week:match.week,weekday:match.weekday,date:match.date})}):""}const{row,col}=this.selectedCell;return row==null||col==null||row<0||row>=this.matrixRowLabels.length||col<0||col>=this.matrixColLabels.length?"":this.localize("heatmapSelectedCellLabel",void 0,{cell:this.matrixCellText({row,col})})}computeValueRange(){const pinned=this.domain;if(pinned){const[lo,hi]=pinned;if(Number.isFinite(lo)&&Number.isFinite(hi)&&lo!==hi)return lo<hi?[lo,hi]:[hi,lo]}const source=this.effectiveMode==="calendar"?this.cachedCalendarGrid.cells.map(cell=>cell.value):this.matrixValues.flat();return minMax(source.filter(v=>!this.isNoData(v)))}localizedValueLabel(){return this.valueLabel===void 0?this.localize("heatmapValueLabel"):this.valueLabel}formatNumericValue(value){return getNumberFormat(this.effectiveLocale||void 0).format(value)}syncExternalDescription(){const describedBy=this.getAttribute("aria-describedby");if(!describedBy&&!this.hasSyncedDescribedByElements)return;const control=this.accessibleCells?this.renderRoot.querySelector('[part="cells"]'):this.canvas;this.hasSyncedDescribedByElements=syncAriaDescribedByElements(this,control??void 0,describedBy)}updated(changed){if(super.updated(changed),this.matrixSource){this.sourceController.error?(this.sourceHasSucceeded&&!this.sourceFailureAnnounced&&this.announcements.announcePolite(this.localize("heatmapSourceError")),this.sourceFailureAnnounced=!0):this.sourceController.loading||(this.sourceHasSucceeded=!0,this.sourceFailureAnnounced=!1),this.paintSource();const selected=this.selectedCell,selectionKey=`${this.sourceController.requests.epoch}:${selected?.row}:${selected?.col}`;if(selectionKey!==this.sourceSelectionKey&&(this.sourceSelectionKey=selectionKey,this.sourceController.selected=null,selected?.row!==void 0&&selected.col!==void 0&&this.sourceController.valid(selected.row,selected.col))){const epoch=this.sourceController.requests.epoch,source=this.matrixSource;this.sourceController.exact(selected.row,selected.col).then(cell=>{cell&&this.sourceCurrent(source,epoch)&&this.sourceSelectionKey===selectionKey&&(this.sourceController.selected=cell,this.sourceResult++)})}if(this.accessibleCells&&this.sourceController.viewport&&!this.sourceController.error){const cursor=this.sourceController.cursor;this.sourceController.ensureWindow(cursor?.row??this.sourceController.viewport.rowStart,cursor?.col??this.sourceController.viewport.columnStart)}return}this.syncExternalDescription(),this.syncAccessibleTabStop();const notice=this.projectionDescription();if(!this.initialLimitUpdate&&notice&&notice!==this.lastLimitNotice&&this.announcements.announcePolite(notice),this.initialLimitUpdate=!1,this.lastLimitNotice=notice,this.hoverCell&&this.effectiveStickyLabels!=="none"&&this.scheduleAfterUpdate(()=>this.measureTooltip(),"heatmap-tooltip-metrics"),["data","maxCells","cellSize","rowHeight","cellGapX","cellGapY","cellRadius","colLabelInterval","maxCellSize","minCellSize","valueLabel","scale","domain","midpoint","fitToWidth","rowLabelWidth","colLabelHeight","colLabelRotation","bucketCount","annotations","focusedCell","colorSteps","cellColor","selectedCell","selectedCells","multiple","selectionPreview","legendStops","accessibleCells","accessibleTargetSizePx","locale","stickyLabels"].some(name=>changed.has(name))){if(changed.has("focusedCell")&&[...changed.keys()].every(key=>key==="focusedCell"||key==="liveText")&&this.repaintFocusRing(changed.get("focusedCell")))return;const smallSelection=this.pendingSelectionRepaint,onlySelectionAndFocus=[...changed.keys()].every(key=>["selectedCells","focusedCell","liveText"].includes(String(key))),repainted=smallSelection!==void 0&&onlySelectionAndFocus&&(!changed.has("focusedCell")||this.repaintFocusRing(changed.get("focusedCell")))&&smallSelection.every(pos=>this.repaintCell(pos));this.pendingSelectionRepaint=void 0,repainted||this.requestDraw()}const pending=this.pendingAccessibleFocus;if(pending===void 0)return;this.pendingAccessibleFocus=void 0;const origin=this.pendingAccessibleFocusOrigin;this.pendingAccessibleFocusOrigin=void 0;const generation=this.accessibleFocusGeneration;this.scheduleAfterUpdate(()=>{try{if(generation!==this.accessibleFocusGeneration||!this.isConnected)return;if(origin){const internalActive=shadowFocusTarget(this),documentActive=activeElementIn(this.ownerDocument),focusStayedAtOrigin=internalActive===origin,originWasRemovedWithoutReplacement=internalActive===null&&(documentActive===null||documentActive===this||documentActive===this.ownerDocument.body);if(!focusStayedAtOrigin&&!originWasRemovedWithoutReplacement)return}if(pending==="base"){this.shadowRoot?.querySelector('[part="base"]')?.focus();return}if(pending==="canvas"){this.shadowRoot?.querySelector('[part="canvas"]')?.focus();return}const identity=this.accessibleCellIdentity(pending);[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellIdentity===identity)?.focus()}finally{this.restoringAccessibleFocus=!1}},"heatmap-accessible-focus")}refreshTheme(){this.resolvedStepsMemo=void 0,this.cachedRamp=null,this.refreshAccessibleTargetSize()||this.requestDraw()}themeSignature(){const cs=this.ownerDocument.defaultView?.getComputedStyle(this);return cs?[...this.scaleEndpoints(cs),this.noDataFill(cs),this.labelColor(cs),this.labelFont(cs),this.focusRingColor(cs),this.annotationColor(cs),this.selectedColor(cs),this.stickyLabelBg(cs),...this.resolvedColorSteps()].join("\0"):""}onThemeSignal(){this.resolvedStepsMemo=void 0;const signature=this.themeSignature(),resized=this.refreshAccessibleTargetSize();signature===this.paintedTheme&&!this.cellColor||(this.paintedTheme=signature,this.cachedRamp=null,resized||this.scheduleDraw())}refreshAccessibleTargetSize(){const raw=this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue("--lr-icon-button-size").trim()??"",resolved=resolveCssTokenLength(raw,{host:this}),next=resolved!==void 0&&Number.isFinite(resolved)&&resolved>0?resolved:DEFAULT_ACCESSIBLE_TARGET_SIZE_PX;return next===this.accessibleTargetSizePx?!1:(this.accessibleTargetSizePx=next,!0)}scaleEndpoints(cs){const lo=cs.getPropertyValue("--lr-heatmap-scale-lo").trim()||cs.getPropertyValue("--_lr-heatmap-scale-lo").trim()||FALLBACK_SCALE_LO,hi=cs.getPropertyValue("--lr-heatmap-scale-hi").trim()||cs.getPropertyValue("--_lr-heatmap-scale-hi").trim()||FALLBACK_SCALE_HI;return[lo,hi]}labelColor(cs){return cs.getPropertyValue("--lr-color-text-quiet").trim()||"#6b7280"}labelFont(cs){return cs.getPropertyValue("--lr-heatmap-label-font").trim()||cs.getPropertyValue("--_lr-heatmap-label-font").trim()||FALLBACK_LABEL_FONT}stickyLabelBg(cs){const raw=cs.getPropertyValue("--lr-heatmap-sticky-label-bg").trim()||cs.getPropertyValue("--_lr-heatmap-sticky-label-bg").trim()||FALLBACK_STICKY_LABEL_BG;return formatRgb(resolveRgb(raw,FALLBACK_STICKY_LABEL_BG,this.ownerDocument))}noDataFill(cs){return cs.getPropertyValue("--lr-heatmap-no-data-fill").trim()||cs.getPropertyValue("--_lr-heatmap-no-data-fill").trim()||FALLBACK_NO_DATA_FILL}focusRingColor(cs){return cs.getPropertyValue("--lr-heatmap-focus-ring-color").trim()||cs.getPropertyValue("--_lr-heatmap-focus-ring-color").trim()||FALLBACK_FOCUS_RING_COLOR}annotationColor(cs){return cs.getPropertyValue("--lr-heatmap-annotation-color").trim()||cs.getPropertyValue("--_lr-heatmap-annotation-color").trim()||FALLBACK_ANNOTATION_COLOR}selectedColor(cs){return cs.getPropertyValue("--lr-heatmap-selected-color").trim()||cs.getPropertyValue("--_lr-heatmap-selected-color").trim()||FALLBACK_SELECTED_COLOR}strokeCellState(ctx,x,y,size,state2,color,paintedShape){const shape=paintedShape??(this.effectiveMode==="matrix"?this.matrixCellShape(size):this.calendarCellShape(size)),width=shape?.custom?shape.w:size,height=shape?.custom?shape.h:size;shape?.custom&&(ctx.save(),ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.clip());const inset=Math.min(state2==="annotation"?.5:state2==="selected"?3.5:6.5,Math.max(.5,(Math.min(width,height)-RING_LINE_WIDTH-1)/2)),w=Math.max(1,width-inset*2),h=Math.max(1,height-inset*2);ctx.lineWidth=RING_LINE_WIDTH,ctx.strokeStyle=color,ctx.setLineDash?.(state2==="annotation"?[]:state2==="selected"?[4,2]:[1,2]),shape?.custom&&shape.radius>0?(ctx.beginPath(),ctx.roundRect(x+inset,y+inset,w,h,Math.max(0,shape.radius-inset)),ctx.stroke()):ctx.strokeRect(x+inset,y+inset,w,h),ctx.setLineDash?.([]),shape?.custom&&ctx.restore()}isSelectedPos(pos){return this.multiple?this.currentSelectedPositions.has(this.accessibleCellKey(pos)):this.selectedCell?"week"in pos?this.selectedCell.date==null?!1:this.calendarCellAt(pos).date===this.selectedCell.date:this.selectedCell.row===pos.row&&this.selectedCell.col===pos.col:!1}draw(){if(this.matrixSource){this.paintSource();return}if(!this.canvasVisible){this.drawDirty=!0;return}this.syncDeferredFitFrame(!1),this.drawDirty=!1,this.canvasHasContent=!1,this.paintedTheme??=this.themeSignature(),this.effectiveMode==="calendar"?this.drawCalendar():this.drawMatrix()}requestDraw(){this.drawDirty=!0,this.isConnected&&(this.canvasVisible?this.draw():this.syncDeferredFitFrame(!0))}syncDeferredFitFrame(deferred){const base=this.shadowRoot?.querySelector('[part="base"]');if(!base)return;let contained=!1;deferred&&this.fitToWidth&&this.clientWidth>0&&(contained=(this.effectiveMode==="calendar"?this.columnXFor(Math.max(1,this.cachedCalendarGrid.weekCount)):this.matrixPadLeft+this.matrixColLabels.length*this.matrixCellSize(this.matrixColLabels.length))<=this.clientWidth),base.toggleAttribute("data-fit-frame-contained",contained)}repaintFocusRing(previous){if(!this.canvasHasContent||!this.canvas||this.drawDirty)return!1;const current=this.focusedCell;if(this.effectiveMode==="calendar"){if(previous&&!("week"in previous)||current&&!("week"in current))return!1;this.repaintCalendarFocusCell(previous&&"week"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintCalendarFocusCell(current)}else{if(previous&&!("row"in previous)||current&&!("row"in current))return!1;this.repaintMatrixFocusCell(previous&&"row"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintMatrixFocusCell(current)}return!0}cancelDrawFrame(){const request=this.drawFrameRequest;request&&request.owner.cancelAnimationFrame(request.handle),this.drawFrameRequest=void 0}resolveColorStep(color,fallback){const safe=sanitizeCssColor(color);if(!safe)return fallback;const ctx=SCOPED_COLOR.test(safe)?null:getScratchCtx(this.ownerDocument);return ctx?(ctx.fillStyle=safe,ctx.fillStyle):resolveCanvasColor(this,safe,fallback)}resolvedColorSteps(){const source=this.cachedColorSteps;return(this.resolvedStepsMemo?.source!==source||this.resolvedStepsMemo.document!==this.ownerDocument)&&(this.resolvedStepsMemo={source,document:this.ownerDocument,colors:source.map(step=>this.resolveColorStep(step,""))}),this.resolvedStepsMemo.colors}colorRamp(bucketCount,cs){const steps=this.cachedColorSteps;if(steps&&steps.length>=2){const key2=`steps ${steps.join(" ")}`;if(this.cachedRamp?.key===key2)return this.cachedRamp;const resolved=this.resolvedColorSteps().map((color,index)=>color||(index===steps.length-1?FALLBACK_SCALE_HI:FALLBACK_SCALE_LO)),colors2=resolved.map(color=>formatRgb(resolveRgb(color,FALLBACK_SCALE_LO,this.ownerDocument))),loRgb2=resolveRgb(resolved[0],FALLBACK_SCALE_LO,this.ownerDocument),hiRgb2=resolveRgb(resolved[resolved.length-1],FALLBACK_SCALE_HI,this.ownerDocument);return this.cachedRamp={key:key2,colors:colors2,loRgb:loRgb2,hiRgb:hiRgb2},this.cachedRamp}const[scaleLo,scaleHi]=this.scaleEndpoints(cs),normalizedBucketCount=normalizeBucketCount(bucketCount),key=`${scaleLo}\0${scaleHi}\0${normalizedBucketCount}`;if(this.cachedRamp?.key===key)return this.cachedRamp;const loRgb=resolveRgb(scaleLo,FALLBACK_SCALE_LO,this.ownerDocument),hiRgb=resolveRgb(scaleHi,FALLBACK_SCALE_HI,this.ownerDocument),colors=Array.from({length:normalizedBucketCount},(_,i)=>mixRgb(loRgb,hiRgb,i/(normalizedBucketCount-1)));return this.cachedRamp={key,colors,loRgb,hiRgb},this.cachedRamp}calendarCellSize(){return this.calendarSpacing().cellSize}calendarSpacing(){const{weekCount}=this.cachedCalendarGrid,rawGapX=this.explicitCalendarSpacing("cellGapX"),rawGapY=this.explicitCalendarSpacing("cellGapY"),rawRadius=this.explicitCalendarSpacing("cellRadius"),boundGap=(raw,size2)=>raw===void 0?CAL_GAP:finiteRange(raw,CAL_GAP,0,Math.max(0,size2-1));let size;if(this.fitToWidth&&weekCount>0){const fitGap=boundGap(rawGapX,this.cellSize),hostWidth=this.clientWidth||this.calendarPadLeft+weekCount*(this.cellSize+fitGap);size=this.clampFitCellSize((hostWidth-this.calendarPadLeft)/weekCount-fitGap)}else size=this.cellSize;return this.accessibleCells&&(size=Math.max(size,this.accessibleTargetSizePx)),{cellSize:size,gapX:boundGap(rawGapX,size),gapY:boundGap(rawGapY,size),radius:rawRadius===void 0?0:finiteRange(rawRadius,0,0,size/2)}}clampFitCellSize(size){const floored=finiteRange(size,FIT_MIN_CELL,Math.max(FIT_MIN_CELL,this.minCellSize??FIT_MIN_CELL));return this.maxCellSize==null?floored:Math.min(floored,this.maxCellSize)}columnXFor(week){return(this.calendarPaintColumns??this.calendarColumnPositions())[week]??this.calendarPadLeft}rowYFor(weekday){return(this.calendarPaintRows??this.calendarRowPositions())[weekday]??CAL_LABEL_H}calendarColumnPositions(spacing=this.calendarSpacing()){const{cellSize,gapX:gap}=spacing,weekCount=this.cachedCalendarGrid.weekCount,callback=this.calendarColumnX,padLeft=this.calendarPadLeft,cached=this.cachedColumnGeometry;if(cached!==void 0&&cached.callback===callback&&cached.padLeft===padLeft&&cached.cellSize===cellSize&&cached.gap===gap&&cached.weekCount===weekCount)return cached.positions;const positions=[];for(let index=0;index<=weekCount;index++){const fallback=index===0?padLeft:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedColumnGeometry={callback,padLeft,cellSize,gap,weekCount,positions},positions}calendarRowPositions(spacing=this.calendarSpacing()){const{cellSize,gapY:gap}=spacing,callback=this.calendarRowY,cached=this.cachedRowGeometry;if(cached!==void 0&&cached.callback===callback&&cached.cellSize===cellSize&&cached.gap===gap)return cached.positions;const positions=[];for(let index=0;index<=7;index++){const fallback=index===0?CAL_LABEL_H:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedRowGeometry={callback,cellSize,gap,positions},positions}weekdayLabels(firstWeekStart){const formatter=getDateTimeFormat(this.effectiveLocale||void 0,{weekday:"short",timeZone:"UTC"}),labels=["","","","","","",""];for(const weekday of[1,3,5]){const row=(weekday-this.normalizedFirstDayOfWeek+7)%7;labels[row]=this.calendarWeekdayLabelText?.(weekday)??formatter.format(new Date(firstWeekStart.getTime()+row*MS_PER_DAY))}return labels}paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels,months=!0,weekdays=!0){if(ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs),months){const canvasRight=this.columnXFor(Math.max(1,this.cachedCalendarGrid.weekCount)),placed=[];monthLabels.forEach((month,index)=>{const label=this.ellipsize(ctx,month.label,canvasRight);if(!label)return;const width=this.labelWidth(ctx,label),x=Math.max(0,Math.min(this.columnXFor(month.week),canvasRight-width)),nextWeek=monthLabels[index+1]?.week??Math.max(month.week+1,this.cachedCalendarGrid.weekCount),entry={label,x,end:x+width+CAL_MONTH_LABEL_GAP,span:nextWeek-month.week};let previous=placed[placed.length-1];for(;previous&&entry.x<previous.end&&entry.span>previous.span;)placed.pop(),previous=placed[placed.length-1];previous&&entry.x<previous.end||placed.push(entry)});for(const{label,x}of placed)ctx.fillText(label,x,CAL_LABEL_H-4)}if(weekdays){const available=this.calendarPadLeft-CAL_WEEKDAY_LABEL_INSET*2;this.weekdayLabels(firstWeekStart).forEach((label,weekday)=>{const shown=label?this.ellipsize(ctx,label,available):"";shown&&ctx.fillText(shown,CAL_WEEKDAY_LABEL_INSET,this.rowYFor(weekday)+cellSize-1)})}}drawCalendar(){try{this.withLabelCache(()=>this.paintCalendar())}finally{this.calendarPaintColumns=void 0,this.calendarPaintRows=void 0}}paintCalendar(){if(!this.canvas)return;const{weekCount,firstWeekStart,monthLabels}=this.cachedCalendarGrid,cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;this.calendarWeekdayLabelWidth==="auto"&&(this.resolvedCalendarWeekdayLabelWidth=this.measureCalendarWeekdayLabelWidth(cs,firstWeekStart));const spacing=this.calendarSpacing(),cellSize=spacing.cellSize;this.calendarPaintColumns=this.calendarColumnPositions(spacing),this.calendarPaintRows=this.calendarRowPositions(spacing);const w=this.columnXFor(Math.max(1,weekCount)),h=this.rowYFor(7),ctx=this.sizeCanvas(this.canvas,w,h);if(!ctx)return;ctx.clearRect(0,0,w,h);const buckets=normalizeBucketCount(this.bucketCount),ramp=this.colorRamp(buckets,cs).colors,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const value=this.calendarValueAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday),override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(value,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,buckets)];this.fillCalendarCell(ctx,x,y,cellSize,spacing.radius)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.date==null)continue;const match=this.cachedCalendarCellsByDate.get(ann.date);if(!match)continue;const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs))}for(const match of this.selectedPaintPositions())if("week"in match){const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs))}if(this.focusedCell&&"week"in this.focusedCell){const{week,weekday}=this.focusedCell;if(week<weekCount&&weekday<7){const x=this.columnXFor(week),y=this.rowYFor(weekday);this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}}this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels),this.canvasHasContent=!0,this.recordCalendarGeometry(spacing,weekCount)&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-calendar-accessible-geometry")}matrixCellSize(cols){let size;if(this.fitToWidth&&cols>0){const padLeft=this.matrixPadLeft,hostWidth=this.clientWidth||padLeft+cols*this.cellSize;size=this.clampFitCellSize((hostWidth-padLeft)/cols)}else size=this.cellSize;if(!this.accessibleCells)return size;const target=this.accessibleTargetSizePx,custom=finiteNumber(this.cellGapX,1)!==1||finiteNumber(this.cellGapY,1)!==1||finiteRange(this.cellRadius,0,0)>0,gap=this.rowHeight!==void 0?finiteRange(this.cellGapX,1,0,target):custom?Math.max(finiteRange(this.cellGapX,1,0,target),finiteRange(this.cellGapY,1,0,target)):0;return Math.max(size,target+gap)}matrixRowHeight(cellSize){if(this.rowHeight===void 0)return cellSize;const height=finiteRange(this.rowHeight,cellSize,1);if(!this.accessibleCells)return height;const target=this.accessibleTargetSizePx;return Math.max(height,target+finiteRange(this.cellGapY,1,0,target))}matrixCellShape(size,height=this.matrixRowHeight(size)){if(height===size&&finiteNumber(this.cellGapX,1)===1&&finiteNumber(this.cellGapY,1)===1&&finiteRange(this.cellRadius,0,0)===0)return{w:size-1,h:size-1,radius:0,custom:!1};const target=this.accessibleCells?this.accessibleTargetSizePx:1,w=size-finiteRange(this.cellGapX,1,0,Math.max(0,size-Math.min(size,target))),h=height-finiteRange(this.cellGapY,1,0,Math.max(0,height-Math.min(height,target))),radius=finiteRange(this.cellRadius,0,0,Math.min(w,h)/2);return{w,h,radius,custom:height!==size||w!==size-1||h!==size-1||radius!==0}}calendarCellShape(size){const radius=this.calendarSpacing().radius;return radius>0?{w:size,h:size,radius:Math.min(radius,size/2),custom:!0}:void 0}fillMatrixCell(ctx,x,y,shape){shape.radius===0?ctx.fillRect(x,y,shape.w,shape.h):(ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.fill())}paintMatrixCell(ctx,row,col,cellSize,rowHeight,shape,cs,rampData,noDataFill){const value=this.matrixValues[row]?.[col]??Number.NaN,bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.({row,col},value);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,rampData.colors.length);ctx.fillStyle=step<0?noDataFill:rampData.colors[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=rampData.colors[this.rampBucket(value,lo,hi,rampData.colors.length)]:ctx.fillStyle=mixRgb(rampData.loRgb,rampData.hiRgb,this.rampAlpha(value,lo,hi));this.fillMatrixCell(ctx,this.matrixPadLeft+col*cellSize,this.matrixPadTop+row*rowHeight,shape)}paintMatrixFocusOverlays(ctx,row,col,cellSize,rowHeight,shape,cs,state2){const x=this.matrixPadLeft+col*cellSize,y=this.matrixPadTop+row*rowHeight;state2==="annotation"&&this.cachedMatrixAnnotationPositions.has(`${row}:${col}`)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs),shape),state2==="selected"&&this.isSelectedPos({row,col})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs),shape),state2==="focus"&&this.focusedCell&&"row"in this.focusedCell&&this.focusedCell.row===row&&this.focusedCell.col===col&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs),shape)}focusRepaintBounds(ctx,x,y,cellSize,cellHeight=cellSize){const padding=RING_LINE_WIDTH+1,dpr=ctx.getTransform().a,left=Math.floor((x-padding)*dpr)/dpr,top=Math.floor((y-padding)*dpr)/dpr,right=Math.ceil((x+cellSize+padding)*dpr)/dpr,bottom=Math.ceil((y+cellHeight+padding)*dpr)/dpr;return{left,top,width:right-left,height:bottom-top,radius:Math.ceil((2*padding+1/dpr)/cellSize),rowRadius:Math.ceil((2*padding+1/dpr)/cellHeight)}}repaintMatrixFocusCell(pos){this.withLabelCache(()=>this.paintMatrixFocusCell(pos))}paintMatrixFocusCell(pos){if(!pos||!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(pos.row<0||pos.row>=rows||pos.col<0||pos.col>=cols)return;const cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight),x=this.matrixPadLeft+pos.col*cellSize,y=this.matrixPadTop+pos.row*rowHeight,ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius,rowRadius}=this.focusRepaintBounds(ctx,x,y,cellSize,rowHeight),firstRow=Math.max(0,pos.row-rowRadius),lastRow=Math.min(rows-1,pos.row+rowRadius),firstCol=Math.max(0,pos.col-radius),lastCol=Math.min(cols-1,pos.col+radius),ramp=this.colorRamp(RAMP_STEPS,cs),noData=this.noDataFill(cs),scratch=rowHeight===cellSize?void 0:this.ownerDocument.createElement("canvas"),dpr=ctx.getTransform().a,scratchLeft=Math.floor((this.matrixPadLeft+firstCol*cellSize-RING_LINE_WIDTH-1)*dpr)/dpr,scratchTop=Math.floor((this.matrixPadTop+firstRow*rowHeight-RING_LINE_WIDTH-1)*dpr)/dpr;if(scratch){const right=Math.ceil((this.matrixPadLeft+(lastCol+1)*cellSize+RING_LINE_WIDTH+1)*dpr),bottom=Math.ceil((this.matrixPadTop+(lastRow+1)*rowHeight+RING_LINE_WIDTH+1)*dpr);scratch.width=right-Math.round(scratchLeft*dpr),scratch.height=bottom-Math.round(scratchTop*dpr)}const paintCtx=scratch?.getContext("2d")??ctx;if(scratch&&paintCtx===ctx){this.drawMatrix();return}paintCtx.save();try{scratch?paintCtx.setTransform(dpr,0,0,dpr,-scratchLeft*dpr,-scratchTop*dpr):(paintCtx.beginPath(),paintCtx.rect(left,top,width,height),paintCtx.clip(),paintCtx.clearRect(left,top,width,height));for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixCell(paintCtx,row,col,cellSize,rowHeight,shape,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixFocusOverlays(paintCtx,row,col,cellSize,rowHeight,shape,cs,state2);left<this.matrixPadLeft&&this.paintMatrixRowLabels(paintCtx,this.matrixPadLeft,this.matrixPadTop,rowHeight,cs,{top,bottom:top+height}),top<this.matrixPadTop&&this.paintMatrixColLabels(paintCtx,this.matrixPadLeft,this.matrixPadTop,cellSize,cs,{first:firstCol,last:lastCol})}finally{paintCtx.restore()}if(scratch){ctx.save();try{ctx.setTransform(1,0,0,1,0,0),ctx.clearRect(left*dpr,top*dpr,width*dpr,height*dpr),ctx.drawImage(scratch,Math.round((left-scratchLeft)*dpr),Math.round((top-scratchTop)*dpr),Math.round(width*dpr),Math.round(height*dpr),Math.round(left*dpr),Math.round(top*dpr),Math.round(width*dpr),Math.round(height*dpr))}finally{ctx.restore()}}}paintCalendarCell(ctx,week,weekday,cellSize,cs,ramp,noDataFill){const value=this.calendarValueAt(week,weekday),bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=ramp[this.rampBucket(value,lo,hi,ramp.length)]:ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,ramp.length)];this.fillCalendarCell(ctx,this.columnXFor(week),this.rowYFor(weekday),cellSize,this.calendarSpacing().radius)}fillCalendarCell(ctx,x,y,size,radius){radius===0?ctx.fillRect(x,y,size,size):(ctx.beginPath(),ctx.roundRect(x,y,size,size,radius),ctx.fill())}recordCalendarGeometry(spacing,weekCount){const next={padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H,cellSize:spacing.cellSize,cellWidth:spacing.cellSize,cellHeight:spacing.cellSize,cellGapX:spacing.gapX,cellGapY:spacing.gapY,cellRadius:spacing.radius,weekCount,firstDayOfWeek:this.normalizedFirstDayOfWeek},previous=this.lastPaintedCalendarGeometry;if(previous&&Object.keys(next).every(key=>previous[key]===next[key]))return!1;const frozen=Object.freeze(next);return this.lastPaintedCalendarGeometry=frozen,this.emit("lr-calendar-geometry-change",frozen),!0}paintCalendarFocusOverlays(ctx,week,weekday,cellSize,cs,state2){const date=this.calendarDateAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday);state2==="annotation"&&this.cachedCalendarCellsByDate.has(date)&&this.cachedCalendarAnnotationDates.has(date)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs)),state2==="selected"&&(this.multiple||this.cachedCalendarCellsByDate.has(date))&&this.isSelectedPos({week,weekday,date})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs)),state2==="focus"&&this.focusedCell&&"week"in this.focusedCell&&this.focusedCell.week===week&&this.focusedCell.weekday===weekday&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}repaintCalendarFocusCell(pos){this.withLabelCache(()=>this.paintCalendarFocusCell(pos))}paintCalendarFocusCell(pos){if(!pos||!this.canvas)return;const{weekCount,firstWeekStart}=this.cachedCalendarGrid;if(pos.week<0||pos.week>=weekCount||pos.weekday<0||pos.weekday>=7)return;const cellSize=this.calendarCellSize(),x=this.columnXFor(pos.week),y=this.rowYFor(pos.weekday),ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius}=this.focusRepaintBounds(ctx,x,y,cellSize),firstWeek=Math.max(0,pos.week-radius),lastWeek=Math.min(weekCount-1,pos.week+radius),firstDay=Math.max(0,pos.weekday-radius),lastDay=Math.min(6,pos.weekday+radius),ramp=this.colorRamp(normalizeBucketCount(this.bucketCount),cs).colors,noData=this.noDataFill(cs);ctx.save();try{ctx.beginPath(),ctx.rect(left,top,width,height),ctx.clip(),ctx.clearRect(left,top,width,height);for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarCell(ctx,week,day,cellSize,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarFocusOverlays(ctx,week,day,cellSize,cs,state2);this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,this.cachedCalendarGrid.monthLabels,top<CAL_LABEL_H,left<this.calendarPadLeft)}finally{ctx.restore()}}drawMatrix(){this.withLabelCache(()=>this.paintMatrix())}paintMatrix(){if(!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length,cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;this.rowLabelWidth==="auto"&&(this.resolvedRowLabelWidth=this.measureRowLabelWidth(cs)),this.colLabelHeight==="auto"&&(this.resolvedColLabelHeight=this.measureColLabelHeight(cs));const padLeft=this.matrixPadLeft,padTop=this.matrixPadTop,cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight),dimensions=shape.custom?{cellWidth:shape.w,cellHeight:shape.h,cellRadius:shape.radius}:{},previous=this.lastPaintedMatrixGeometry,geometry=previous&&previous.padLeft===padLeft&&previous.padTop===padTop&&previous.cellSize===cellSize&&previous.rowHeight===(rowHeight===cellSize?void 0:rowHeight)&&previous.cellWidth===dimensions.cellWidth&&previous.cellHeight===dimensions.cellHeight&&previous.cellRadius===dimensions.cellRadius?previous:Object.freeze({padLeft,padTop,cellSize,...rowHeight===cellSize?{}:{rowHeight},...dimensions});this.lastPaintedMatrixGeometry=geometry;const geometryChanged=geometry!==previous;geometryChanged&&this.emit("lr-matrix-geometry-change",geometry);const w=padLeft+cols*cellSize,h=padTop+rows*rowHeight,ctx=this.sizeCanvas(this.canvas,w,h);if(!ctx)return;ctx.clearRect(0,0,w,h);const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,rampData=this.colorRamp(RAMP_STEPS,cs),ramp=rampData.colors,{loRgb,hiRgb}=rampData,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();for(let r=0;r<rows;r++)for(let c=0;c<cols;c++){const v=this.matrixValues[r]?.[c]??Number.NaN,x=padLeft+c*cellSize,y=padTop+r*rowHeight,override=this.cellColor?.({row:r,col:c},v);if(override!=null)ctx.fillStyle=this.resolveCellColor(override,cs);else if(this.isNoData(v))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(v,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(v,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else{const t=this.rampAlpha(v,lo,hi);ctx.fillStyle=mixRgb(loRgb,hiRgb,t)}this.fillMatrixCell(ctx,x,y,shape)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.row==null||ann.col==null||ann.row<0||ann.row>=rows||ann.col<0||ann.col>=cols)continue;const x=padLeft+ann.col*cellSize,y=padTop+ann.row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs),shape)}for(const selected of this.selectedPaintPositions()){if(!("row"in selected))continue;const{row,col}=selected;if(row>=0&&row<rows&&col>=0&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs),shape)}}if(this.focusedCell&&"row"in this.focusedCell){const{row,col}=this.focusedCell;if(row<rows&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs),shape)}}this.paintMatrixRowLabels(ctx,padLeft,padTop,rowHeight,cs),this.paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs),this.paintFrozenLabelBands(padLeft,padTop,cellSize,rowHeight,w,h,ctx.getTransform().a,cs),this.canvasHasContent=!0,geometryChanged&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-matrix-accessible-geometry")}paintMatrixRowLabels(ctx,padLeft,padTop,cellSize,cs,dirty){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const rowLabelSpace=padLeft-ROW_LABEL_INSET*2;let first=0,last=this.matrixRowLabels.length-1;if(dirty){const{fontBoundingBoxAscent,fontBoundingBoxDescent}=ctx.measureText("M"),baseline=padTop+cellSize/2+3;first=Math.max(first,Math.floor((dirty.top-fontBoundingBoxDescent-baseline)/cellSize)),last=Math.min(last,Math.ceil((dirty.bottom+fontBoundingBoxAscent-baseline)/cellSize))}for(let r=first;r<=last;r++){const shown=this.ellipsize(ctx,this.matrixRowLabels[r],rowLabelSpace);shown&&ctx.fillText(shown,ROW_LABEL_INSET,padTop+r*cellSize+cellSize/2+3)}}paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs,columns){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const colRotation=this.effectiveColLabelRotation,interval=finiteInteger(this.colLabelInterval,1,1);if(colRotation===0){const cols=this.matrixColLabels.length;this.matrixColLabels.forEach((label,c)=>{if(c%interval!==0||columns&&(c<columns.first-interval+1||c>columns.last))return;const shown=this.ellipsize(ctx,label,Math.min(interval,cols-c)*cellSize-2);shown&&ctx.fillText(shown,padLeft+c*cellSize+2,padTop-COL_LABEL_INSET)});return}const radians=colRotation*Math.PI/180,previousAlign=ctx.textAlign;ctx.textAlign="right",this.matrixColLabels.forEach((label,c)=>{c%interval===0&&(ctx.save(),ctx.translate(padLeft+c*cellSize+cellSize/2,padTop-COL_LABEL_INSET),ctx.rotate(radians),ctx.fillText(label,0,0),ctx.restore())}),ctx.textAlign=previousAlign}paintFrozenLabelBands(padLeft,padTop,cellSize,rowHeight,width,height,scale,cs){if(this.effectiveStickyLabels==="none")return;const backdrop=this.stickyLabelBg(cs),rowBand=this.frozenBandCanvas("row-labels");rowBand&&this.paintFrozenBand(rowBand,padLeft,height,scale,backdrop,bandCtx=>this.paintMatrixRowLabels(bandCtx,padLeft,padTop,rowHeight,cs));const colBand=this.frozenBandCanvas("col-labels");colBand&&this.paintFrozenBand(colBand,width,padTop,scale,backdrop,bandCtx=>this.paintMatrixColLabels(bandCtx,padLeft,padTop,cellSize,cs))}frozenBandCanvas(part){return this.shadowRoot?.querySelector(`[part="${part}"]`)??null}sizeCanvas(canvas,width,height,desiredScale=this.ownerDocument.defaultView?.devicePixelRatio){const{pixelWidth,pixelHeight,scale}=resolveBoundedCanvasAllocation({cssWidth:width,cssHeight:height,desiredScale,maxDimension:MAX_CANVAS_DIMENSION,maxPixels:MAX_CANVAS_PIXELS});canvas.width=pixelWidth,canvas.height=pixelHeight,canvas.style.width=`${width}px`,canvas.style.height=`${height}px`;const ctx=canvas.getContext("2d");return ctx?.scale(scale,scale),ctx}paintFrozenBand(canvas,width,height,scale,backdrop,paint){const ctx=this.sizeCanvas(canvas,width,height,scale);ctx&&(ctx.clearRect(0,0,width,height),ctx.fillStyle=backdrop,ctx.fillRect(0,0,width,height),paint(ctx))}hitTest(x,y){return this.effectiveMode==="calendar"?this.hitTestCalendar(x,y):this.hitTestMatrix(x,y)}matrixNavigationGeometry(rows,cols){const painted=this.lastPaintedMatrixGeometry;if(painted)return{rows,cols,padLeft:painted.padLeft,padTop:painted.padTop,cellSize:painted.cellSize,rowHeight:painted.rowHeight??painted.cellSize,cellWidth:painted.cellWidth??painted.cellSize-1,cellHeight:painted.cellHeight??painted.cellSize-1,customShape:painted.cellWidth!==void 0};const cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight);return{rows,cols,padLeft:this.matrixPadLeft,padTop:this.matrixPadTop,cellSize,rowHeight,cellWidth:shape.w,cellHeight:shape.h,customShape:shape.custom}}calendarNavigationGeometry(){const spacing=this.calendarSpacing(),cellSize=spacing.cellSize,columnPositions=this.calendarColumnPositions(spacing),rowPositions=this.calendarRowPositions(spacing);return{weekCount:this.cachedCalendarGrid.weekCount,cellSize,columnPositions,rowPositions,padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H}}hitTestMatrix(x,y){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;return rows===0||cols===0?null:hitTestMatrixGrid(x,y,this.matrixNavigationGeometry(rows,cols),pos=>this.isCellInteractive(pos))}firstInteractiveMatrixCell(rows,cols){return findFirstInteractiveMatrixCell(rows,cols,pos=>this.isCellInteractive(pos))}nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols){return findNextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols,pos=>this.isCellInteractive(pos))}firstInteractiveCalendarCell(weekCount){return findFirstInteractiveCalendarCell(weekCount,(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount){return findNextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount,(nextWeek,nextWeekday)=>this.calendarPos(nextWeek,nextWeekday),pos=>this.isCellInteractive(pos))}hitTestCalendar(x,y){const weekCount=this.cachedCalendarGrid.weekCount;if(weekCount===0)return null;const spacing=this.calendarSpacing(),columnPositions=this.calendarColumnPositions(spacing);return hitTestCalendarGrid(x,y,weekCount,columnPositions,()=>spacing.cellSize,()=>this.calendarRowPositions(spacing),(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}calendarCellAt(pos){return readCalendarCell(pos.week,pos.weekday,this.cachedCalendarCellsByPos,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart,this.signedDomain)}calendarValueAt(week,weekday){return readCalendarValue(week,weekday,this.cachedCalendarCellsByPos,this.signedDomain)}calendarDateAt(week,weekday){return readCalendarDate(week,weekday,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart)}calendarPos(week,weekday){return{week,weekday,date:this.calendarDateAt(week,weekday)}}cellRect(pos){return"week"in pos?calendarCellRect(pos.week,pos.weekday,this.calendarNavigationGeometry()):matrixCellRect(pos,this.matrixNavigationGeometry(this.matrixRowLabels.length,this.matrixColLabels.length))}accessibleCellRect(pos){return"week"in pos||!this.lastPaintedMatrixGeometry?this.cellRect(pos):accessibleMatrixCellRect(pos,this.lastPaintedMatrixGeometry)}defaultCellText(pos){return"week"in pos?this.calendarCellText(pos):this.matrixCellText(pos)}matrixCellText(pos){const rowLabel=this.matrixRowLabels[pos.row]??this.localize("heatmapDefaultRowLabel",void 0,{n:this.formatCount(pos.row+1)}),colLabel=this.matrixColLabels[pos.col]??this.localize("heatmapDefaultColLabel",void 0,{n:this.formatCount(pos.col+1)}),v=this.matrixValues[pos.row]?.[pos.col],valueText=v==null||this.isNoData(v)?this.localize("heatmapNoDataValue"):this.formatNumericValue(v);return this.localize("heatmapMatrixCellLabel",void 0,{row:rowLabel,col:colLabel,value:valueText})}calendarCellText(pos){const{date,value}=this.calendarCellAt(pos),label=getDateTimeFormat(this.effectiveLocale||void 0,{month:"short",day:"numeric",timeZone:"UTC"}).format(parseIsoDate(date)),valueText=this.isNoData(value)?this.localize("heatmapNoDataValue"):this.formatNumericValue(value);return this.localize("heatmapCalendarCellLabel",void 0,{date:label,value:valueText})}valueAt(pos){return"week"in pos?this.calendarCellAt(pos).value:this.matrixValues[pos.row]?.[pos.col]??-1}resolveCellText(pos){return this.cellText?this.cellText(pos,this.valueAt(pos)):this.defaultCellText(pos)}isCellInteractive(pos){return this.cellInteractive?.(pos,this.valueAt(pos))??!0}announce(pos,isSelectedOverride){const text=this.resolveCellText(pos),announcement=isSelectedOverride??this.isSelectedPos(pos)?this.localize("heatmapSelectedCellLabel",void 0,{cell:text}):text;this.liveText=announcement,this.announcements.announcePolite(announcement)}emitCellClick(pos,source="pointer",select=!0){if(!this.isCellInteractive(pos))return;this.multiple&&select&&(this.selectionAnchor=pos,this.selectionRangeBase=void 0,this.toggleSelectionPositions([pos],source));let detail;if("week"in pos){const{date,value}=this.calendarCellAt(pos);detail={date,value}}else{const value=this.matrixValues[pos.row]?.[pos.col]??-1;detail={row:pos.row,col:pos.col,value}}this.emit("lr-cell-activate",{...detail})}get currentSelectedPositions(){return this.selectionPreview??this.selectedPositions}selectedPaintPositions(){if(this.multiple)return[...this.currentSelectedPositions.values()];const selected=this.selectedCell;if(!selected)return[];if(this.effectiveMode==="calendar"){const match=selected.date?this.cachedCalendarCellsByDate.get(selected.date):void 0;return match?[match]:[]}return selected.row!=null&&selected.col!=null?[{row:selected.row,col:selected.col}]:[]}rebuildSelectedPositions(){const positions=new Map,dates=this.effectiveMode==="calendar"?new Map(this.cachedAccessiblePositions.map(pos=>[this.accessibleCellIdentity(pos),pos])):void 0,input=Array.isArray(this.selectedCells)?this.selectedCells:[];for(let index=0;index<Math.min(input.length,MAX_HEATMAP_CELLS);index++){const cell=input[index];if(!cell||typeof cell!="object")continue;const pos=dates?typeof cell.date=="string"?dates.get(cell.date):void 0:Number.isInteger(cell.row)&&Number.isInteger(cell.col)?this.cachedAccessiblePositionsByKey.get(`matrix-${cell.row}-${cell.col}`):void 0;pos&&positions.set(this.accessibleCellKey(pos),pos)}this.selectedPositions=positions}selectionCoordinates(pos){return"week"in pos?{row:pos.weekday,col:pos.week}:pos}proposeSelection(positions,source){if(positions.size===this.selectedPositions.size&&[...positions.keys()].every(key=>this.selectedPositions.has(key)))return;this.proposedSelectionKeys=new Set(positions.keys());const selectedCells=[...positions.values()].sort((a,b)=>{const first=this.selectionCoordinates(a),second=this.selectionCoordinates(b);return first.row-second.row||first.col-second.col}).map(pos=>"week"in pos?{date:pos.date}:{row:pos.row,col:pos.col});this.emit("lr-selection-change",{selectedCells,source})}toggleSelectionPositions(positions,source){if(!this.multiple||positions.length===0)return;const next=new Map(this.selectedPositions),remove=positions.every(pos=>next.has(this.accessibleCellKey(pos)));for(const pos of positions){const key=this.accessibleCellKey(pos);remove?next.delete(key):next.set(key,pos)}this.proposeSelection(next,source)}toggleSelectionAxis(index,row){!this.multiple||!Number.isInteger(index)||index<0||(this.cancelSelectionGesture(),this.selectionRangeBase=void 0,this.toggleSelectionPositions(this.cachedAccessiblePositions.filter(pos=>{const coordinates=this.selectionCoordinates(pos);return(row?coordinates.row:coordinates.col)===index}),row?"row":"column"))}selectionKeyDown(event,pos){if(!this.multiple)return!1;if(event.key==="Escape"&&this.selectionGesture)return event.preventDefault(),this.cancelSelectionGesture(),!0;if(event.key!==" "||!pos||!(event.shiftKey||event.ctrlKey||event.metaKey))return!1;event.preventDefault();const coordinates=this.selectionCoordinates(pos);return event.ctrlKey||event.metaKey?this.toggleColumnSelection(coordinates.col):this.toggleRowSelection(coordinates.row),!0}extendSelection(previous,next,range){if(!this.multiple)return;if(!range){this.selectionAnchor=next,this.selectionRangeBase=void 0;return}this.selectionAnchor??=previous??next,this.selectionRangeBase??=new Map(this.selectedPositions);const from=this.selectionCoordinates(this.selectionAnchor),to=this.selectionCoordinates(next),selected=new Map(this.selectionRangeBase);for(let row=Math.min(from.row,to.row);row<=Math.max(from.row,to.row);row++)for(let col=Math.min(from.col,to.col);col<=Math.max(from.col,to.col);col++){const key=this.effectiveMode==="calendar"?`calendar-${col}-${row}`:`matrix-${row}-${col}`,pos=this.cachedAccessiblePositionsByKey.get(key);pos&&selected.set(key,pos)}return this.proposeSelection(selected,"keyboard"),new Set(selected.keys())}selectionPointerPosition(event){if(!this.canvas)return null;const rect=this.canvas.getBoundingClientRect();return this.hitTest(event.clientX-rect.left,event.clientY-rect.top)}paintSelectionTo(pos){const gesture=this.selectionGesture;if(!gesture)return;this.samePos(pos,gesture.previous)||(gesture.moved=!0);const from=this.selectionCoordinates(gesture.previous),to=this.selectionCoordinates(pos),steps=Math.max(Math.abs(to.row-from.row),Math.abs(to.col-from.col),1),changed=[];for(let step=0;step<=steps;step++){const row=Math.round(from.row+(to.row-from.row)*step/steps),col=Math.round(from.col+(to.col-from.col)*step/steps),key=this.effectiveMode==="calendar"?`calendar-${col}-${row}`:`matrix-${row}-${col}`,candidate=this.cachedAccessiblePositionsByKey.get(key);candidate&&(gesture.cells.has(key)!==gesture.selecting&&changed.push(candidate),gesture.selecting?gesture.cells.set(key,candidate):gesture.cells.delete(key))}if(gesture.previous=pos,this.selectionPreview!==gesture.cells){this.selectionPreview=gesture.cells;return}this.requestUpdate(),(changed.length>16||!changed.every(cell=>this.repaintCell(cell)))&&this.requestDraw()}repaintCell(pos){return!this.canvasHasContent||!this.canvas||this.drawDirty?!1:("week"in pos?this.repaintCalendarFocusCell(pos):this.repaintMatrixFocusCell(pos),!0)}cancelSelectionGesture(){const gesture=this.selectionGesture;if(this.selectionGesture=void 0,this.selectionPreview=void 0,!!gesture){this.suppressSelectionClick=!0;try{gesture.target.hasPointerCapture(gesture.pointerId)&&gesture.target.releasePointerCapture(gesture.pointerId)}catch{}}}consumeSelectionClick(event){return!this.suppressSelectionClick||event.detail===0?!1:(this.suppressSelectionClick=!1,!0)}get gridScrollport(){return this.shadowRoot?.querySelector('[part="grid"]')??null}measureTooltip(){if(!this.gridScrollport)return;const tooltip=this.shadowRoot?.querySelector('[part="tooltip"]');if(!tooltip||tooltip.hidden)return;const view=this.ownerDocument.defaultView,gap=view?Math.abs(finiteNumber(Number.parseFloat(view.getComputedStyle(tooltip).marginBlockStart),0)):0,inline=tooltip.offsetWidth,block=tooltip.offsetHeight+gap;inline===this.tooltipSize.inline&&block===this.tooltipSize.block||(this.tooltipSize={inline,block},this.requestUpdate())}tooltipAnchor(pos){const rect=this.cellRect(pos),center=rect.x+rect.w/2,port=this.gridScrollport;if(!port)return{style:{left:`${center}px`,top:`${rect.y}px`},below:!1};const{inline,block}=this.tooltipSize,windowStart=port.scrollLeft+(this.freezesRowLabels?this.matrixPadLeft:0),windowEnd=port.scrollLeft+port.clientWidth,windowTop=port.scrollTop+(this.freezesColLabels?this.matrixPadTop:0),windowBottom=port.scrollTop+port.clientHeight,below=rect.y-block<windowTop&&rect.y+rect.h+block<=windowBottom;return{style:{left:`${Math.max(windowStart+inline/2,Math.min(center,windowEnd-inline/2))}px`,top:`${below?rect.y+rect.h:rect.y}px`},below}}scrollCellIntoView(pos){const port=this.gridScrollport;if(!port)return;const rect=this.cellRect(pos),bandInline=this.freezesRowLabels?this.matrixPadLeft:0,bandBlock=this.freezesColLabels?this.matrixPadTop:0,left=Math.min(Math.max(port.scrollLeft,rect.x+rect.w-port.clientWidth),rect.x-bandInline),top=Math.min(Math.max(port.scrollTop,rect.y+rect.h-port.clientHeight),rect.y-bandBlock);left!==port.scrollLeft&&(port.scrollLeft=left),top!==port.scrollTop&&(port.scrollTop=top)}samePos(a,b){return a===b?!0:!a||!b?!1:"week"in a&&"week"in b?a.week===b.week&&a.weekday===b.weekday:"row"in a&&"row"in b?a.row===b.row&&a.col===b.col:!1}edgeCell(e){if(e.key!=="Home"&&e.key!=="End")return null;const row=this.focusedCell&&!(e.ctrlKey||e.metaKey)?this.selectionCoordinates(this.focusedCell).row:void 0,cells=this.cachedAccessiblePositions.filter(pos=>row===void 0||this.selectionCoordinates(pos).row===row);return cells[e.key==="Home"?0:cells.length-1]??null}onMatrixKeyDown(e){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(rows===0||cols===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("row"in this.focusedCell)){const next2=this.firstInteractiveMatrixCell(rows,cols);if(!next2)return;this.focusedCell=next2,this.scrollCellIntoView(next2);return}const{row,col}=this.focusedCell;let dRow=0,dCol=0;e.key==="ArrowUp"?dRow=-1:e.key==="ArrowDown"?dRow=1:e.key==="ArrowLeft"?dCol=-1:e.key==="ArrowRight"&&(dCol=1);const next=this.nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols);this.focusedCell=next,this.scrollCellIntoView(next)}onCalendarKeyDown(e){const{weekCount}=this.cachedCalendarGrid;if(weekCount===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("week"in this.focusedCell)){const next2=this.firstInteractiveCalendarCell(weekCount);if(!next2)return;this.focusedCell=next2;return}const{week,weekday}=this.focusedCell;let dWeek=0,dWeekday=0;e.key==="ArrowUp"?dWeekday=-1:e.key==="ArrowDown"?dWeekday=1:e.key==="ArrowLeft"?dWeek=-1:e.key==="ArrowRight"&&(dWeek=1);const next=this.nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount);this.focusedCell=next}resolveCellColor(value,cs){let color=this.canvasColorCache.get(value);if(color===void 0){const ctx=SCOPED_COLOR.test(value)?null:getScratchCtx(this.ownerDocument);if(ctx){ctx.fillStyle="rgb(1, 2, 3)";const rejected=ctx.fillStyle;ctx.fillStyle=value,ctx.fillStyle!==rejected&&(color=ctx.fillStyle)}color??=resolveCanvasColor(this,value,this.noDataFill(cs)),this.canvasColorCache.set(value,color)}return color}rebuildAccessiblePositions(){const positions=[];if(this.effectiveMode==="calendar"){const{weekCount}=this.cachedCalendarGrid;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const pos=this.calendarPos(week,weekday);this.isCellInteractive(pos)&&positions.push(pos)}}else for(let row=0;row<this.matrixRowLabels.length;row++)for(let col=0;col<this.matrixColLabels.length;col++){const pos={row,col};this.isCellInteractive(pos)&&positions.push(pos)}this.cachedAccessiblePositions=positions,this.cachedAccessiblePositionsByKey=new Map(positions.map(position=>[this.accessibleCellKey(position),position])),this.cachedAccessiblePositionIndexByKey=new Map(positions.map((position,index)=>[this.accessibleCellKey(position),index]))}accessibleCellPositions(){return this.cachedAccessiblePositions}accessibleCellKey(pos){return"week"in pos?`calendar-${pos.week}-${pos.weekday}`:`matrix-${pos.row}-${pos.col}`}accessibleCellIdentity(pos){return"week"in pos?pos.date:this.accessibleCellKey(pos)}accessibleCellAtKey(key){return this.cachedAccessiblePositionsByKey.get(key)??null}focusAccessibleCell(pos){pos&&this.updateComplete.then(()=>{[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellKey===this.accessibleCellKey(pos))?.focus()})}accessibleWindowStart(){const positions=this.accessibleCellPositions(),focusIndex=this.focusedCell?this.cachedAccessiblePositionIndexByKey.get(this.accessibleCellKey(this.focusedCell))??0:0;return Math.max(0,Math.min(Math.max(0,positions.length-MAX_ACCESSIBLE_HEATMAP_CELLS),focusIndex-Math.floor(MAX_ACCESSIBLE_HEATMAP_CELLS/2)))}syncAccessibleTabStop(){if(!this.accessibleCells)return;const target=this.focusedCell??this.cachedAccessiblePositions[0],key=target?this.accessibleCellKey(target):void 0,previous=this.renderRoot.querySelector('[part="cell"][tabindex="0"]');previous?.dataset.cellKey!==key&&(previous?.setAttribute("tabindex","-1"),key&&this.renderRoot.querySelector(`[data-cell-key="${key}"]`)?.setAttribute("tabindex","0"))}renderAccessibleCells(){if(!this.accessibleCells)return html``;const positions=this.accessibleCellPositions(),tabStop=this.focusedCell??positions[0]??null,focusIndex=tabStop?this.cachedAccessiblePositionIndexByKey.get(this.accessibleCellKey(tabStop))??0:0,start=Math.max(0,Math.min(Math.max(0,positions.length-MAX_ACCESSIBLE_HEATMAP_CELLS),focusIndex-Math.floor(MAX_ACCESSIBLE_HEATMAP_CELLS/2))),renderedPositions=positions.slice(start,start+MAX_ACCESSIBLE_HEATMAP_CELLS),renderedRows=new Map;for(const pos of renderedPositions){const rowIndex="week"in pos?pos.weekday+1:pos.row+1,row=renderedRows.get(rowIndex);row?row.push(pos):renderedRows.set(rowIndex,[pos])}const rowCount=this.effectiveMode==="calendar"?7:this.matrixRowLabels.length,colCount=this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount:this.matrixColLabels.length,calendar=this.effectiveMode==="calendar"?this.calendarNavigationGeometry():void 0;return html`
4
24
  <div
5
25
  part="cells"
6
26
  role="grid"
@@ -62,7 +82,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
62
82
  @click=${this.onCanvasClick}
63
83
  @keydown=${this.onKeyDown}
64
84
  ></canvas>
65
- ${guard([this.overlayRevision],()=>this.renderAccessibleCells())}
85
+ ${guard([this.overlayRevision,this.accessibleWindowStart()],()=>this.renderAccessibleCells())}
66
86
  ${this.freezesRowLabels?html`<canvas part="row-labels" aria-hidden="true"></canvas>`:nothing}
67
87
  ${this.freezesColLabels?html`<canvas part="col-labels" aria-hidden="true"></canvas>`:nothing}
68
88
  `;return sticky==="none"?surface:html`<div part="grid">
@@ -81,7 +101,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
81
101
  ><span class="ring-swatch"></span>${a.label}</span
82
102
  >`)}
83
103
  <slot name="legend"></slot>
84
- </div>`}render(){const range=this.cachedValueRange,projectionDescription=this.projectionDescription();return html`
104
+ </div>`}render(){if(this.matrixSource)return this.renderSource();const range=this.cachedValueRange,projectionDescription=this.projectionDescription();return html`
85
105
  <div
86
106
  part="base"
87
107
  tabindex="-1"
@@ -107,6 +127,6 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
107
127
  aria-hidden="true"
108
128
  >${this.liveText}</div
109
129
  >
110
- ${this.withoutLegend?nothing:this.renderLegend(range)}
130
+ ${this.withoutLegend?nothing:guard([this.cachedAnnotations,this.cachedLegendStops,range,this.valueLabel,this.effectiveLocale,this.strings,lyraLocaleCatalogVersion(this.effectiveLocale)],()=>this.renderLegend(range))}
111
131
  </div>
112
- `}formatCount(value){return getNumberFormat(this.effectiveLocale).format(value)}}__decorate([property({attribute:!1})],LyraHeatmap.prototype,"data",void 0),__decorate([property({converter:labelExtentConverter,attribute:"row-label-width",reflect:!0})],LyraHeatmap.prototype,"rowLabelWidth",void 0),__decorate([property({converter:labelExtentConverter,attribute:"col-label-height"})],LyraHeatmap.prototype,"colLabelHeight",void 0),__decorate([property({type:Number,attribute:"col-label-rotation"})],LyraHeatmap.prototype,"colLabelRotation",void 0),__decorate([property({converter:STICKY_LABELS,attribute:"sticky-labels",reflect:!0})],LyraHeatmap.prototype,"stickyLabels",null),__decorate([property({type:Number,attribute:"cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"cellSize",null),__decorate([property({type:Number,attribute:"row-height",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"rowHeight",null),__decorate([property({attribute:"value-label"})],LyraHeatmap.prototype,"valueLabel",void 0),__decorate([property({type:Boolean,attribute:"without-legend",reflect:!0})],LyraHeatmap.prototype,"withoutLegend",void 0),__decorate([property()],LyraHeatmap.prototype,"scale",void 0),__decorate([property({type:Number,attribute:"cell-gap-x"})],LyraHeatmap.prototype,"cellGapX",void 0),__decorate([property({type:Number,attribute:"cell-gap-y"})],LyraHeatmap.prototype,"cellGapY",void 0),__decorate([property({type:Number,attribute:"cell-radius"})],LyraHeatmap.prototype,"cellRadius",void 0),__decorate([property({type:Number,attribute:"col-label-interval"})],LyraHeatmap.prototype,"colLabelInterval",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"domain",void 0),__decorate([property({type:Number})],LyraHeatmap.prototype,"midpoint",void 0),__decorate([property({type:Boolean,attribute:"fit-to-width"})],LyraHeatmap.prototype,"fitToWidth",void 0),__decorate([property({type:Number,attribute:"max-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"maxCellSize",null),__decorate([property({type:Number,attribute:"min-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"minCellSize",null),__decorate([property({attribute:"bucket-count",converter:bucketCountConverter})],LyraHeatmap.prototype,"bucketCount",null),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"annotations",void 0),__decorate([property({attribute:!1,hasChanged:legendStopsChanged})],LyraHeatmap.prototype,"legendStops",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCell",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraHeatmap.prototype,"multiple",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCells",void 0),__decorate([property({type:Boolean,attribute:"accessible-cells"})],LyraHeatmap.prototype,"accessibleCells",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellText",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellInteractive",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellColor",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"colorSteps",void 0),__decorate([query('[part="canvas"]')],LyraHeatmap.prototype,"canvas",void 0),__decorate([state()],LyraHeatmap.prototype,"hoverCell",void 0),__decorate([state()],LyraHeatmap.prototype,"focusedCell",void 0),__decorate([state()],LyraHeatmap.prototype,"liveText",void 0),__decorate([state()],LyraHeatmap.prototype,"accessibleTargetSizePx",void 0),__decorate([state()],LyraHeatmap.prototype,"selectionPreview",void 0);export{LyraHeatmap,MAX_ACCESSIBLE_HEATMAP_CELLS2 as MAX_ACCESSIBLE_HEATMAP_CELLS,MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS2 as MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS2 as MAX_HEATMAP_DECORATIONS,hexToRgb,normalizeBucketCount2 as normalizeBucketCount,resolveRgb2 as resolveRgb};
132
+ `}formatCount(value){return getNumberFormat(this.effectiveLocale).format(value)}}__decorate([property({attribute:!1,noAccessor:!0})],LyraHeatmap.prototype,"matrixSource",null),__decorate([property({attribute:!1,noAccessor:!0})],LyraHeatmap.prototype,"matrixViewport",null),__decorate([property({attribute:"matrix-reducer"})],LyraHeatmap.prototype,"matrixReducer",void 0),__decorate([state()],LyraHeatmap.prototype,"sourceResult",void 0),__decorate([state()],LyraHeatmap.prototype,"sourceHovered",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"data",void 0),__decorate([property({type:Number,attribute:"max-cells"})],LyraHeatmap.prototype,"maxCells",void 0),__decorate([property({converter:labelExtentConverter,attribute:"row-label-width",reflect:!0})],LyraHeatmap.prototype,"rowLabelWidth",void 0),__decorate([property({converter:labelExtentConverter,attribute:"col-label-height"})],LyraHeatmap.prototype,"colLabelHeight",void 0),__decorate([property({type:Number,attribute:"col-label-rotation"})],LyraHeatmap.prototype,"colLabelRotation",void 0),__decorate([property({converter:STICKY_LABELS,attribute:"sticky-labels",reflect:!0})],LyraHeatmap.prototype,"stickyLabels",null),__decorate([property({type:Number,attribute:"cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"cellSize",null),__decorate([property({type:Number,attribute:"row-height",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"rowHeight",null),__decorate([property({attribute:"value-label"})],LyraHeatmap.prototype,"valueLabel",void 0),__decorate([property({type:Boolean,attribute:"without-legend",reflect:!0})],LyraHeatmap.prototype,"withoutLegend",void 0),__decorate([property()],LyraHeatmap.prototype,"scale",void 0),__decorate([property({type:Number,attribute:"cell-gap-x"})],LyraHeatmap.prototype,"cellGapX",void 0),__decorate([property({type:Number,attribute:"cell-gap-y"})],LyraHeatmap.prototype,"cellGapY",void 0),__decorate([property({type:Number,attribute:"cell-radius"})],LyraHeatmap.prototype,"cellRadius",void 0),__decorate([property({type:Number,attribute:"col-label-interval"})],LyraHeatmap.prototype,"colLabelInterval",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"domain",void 0),__decorate([property({type:Number})],LyraHeatmap.prototype,"midpoint",void 0),__decorate([property({type:Boolean,attribute:"fit-to-width"})],LyraHeatmap.prototype,"fitToWidth",void 0),__decorate([property({type:Number,attribute:"max-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"maxCellSize",null),__decorate([property({type:Number,attribute:"min-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"minCellSize",null),__decorate([property({attribute:"bucket-count",converter:bucketCountConverter})],LyraHeatmap.prototype,"bucketCount",null),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"annotations",void 0),__decorate([property({attribute:!1,hasChanged:legendStopsChanged})],LyraHeatmap.prototype,"legendStops",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCell",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraHeatmap.prototype,"multiple",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCells",void 0),__decorate([property({type:Boolean,attribute:"accessible-cells"})],LyraHeatmap.prototype,"accessibleCells",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellText",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellInteractive",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellColor",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"colorSteps",void 0),__decorate([query('[part="canvas"]')],LyraHeatmap.prototype,"canvas",void 0),__decorate([state()],LyraHeatmap.prototype,"hoverCell",void 0),__decorate([state()],LyraHeatmap.prototype,"focusedCell",void 0),__decorate([state()],LyraHeatmap.prototype,"liveText",void 0),__decorate([state()],LyraHeatmap.prototype,"accessibleTargetSizePx",void 0),__decorate([state()],LyraHeatmap.prototype,"selectionPreview",void 0);export{LyraHeatmap,MAX_ACCESSIBLE_HEATMAP_CELLS2 as MAX_ACCESSIBLE_HEATMAP_CELLS,MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS2 as MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS2 as MAX_HEATMAP_DECORATIONS,hexToRgb,normalizeBucketCount2 as normalizeBucketCount,resolveRgb2 as resolveRgb};
@@ -1 +1 @@
1
- import{iconHitTarget}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { display: block; min-inline-size: 0; max-inline-size: 100%; --_lr-heatmap-scale-lo: var(--lr-color-brand-quiet); --_lr-heatmap-scale-hi: var(--lr-color-brand); --_lr-heatmap-no-data-fill: var(--lr-color-no-data); --_lr-heatmap-label-font: var(--lr-size-10px) var(--lr-font); --_lr-heatmap-tooltip-bg: var(--lr-color-surface); --_lr-heatmap-tooltip-color: var(--lr-color-text); --_lr-heatmap-focus-ring-color: var(--lr-focus-ring-color); --_lr-heatmap-annotation-color: var(--lr-color-danger); --_lr-heatmap-selected-color: var(--lr-color-success); --_lr-heatmap-sticky-label-bg: var(--lr-color-surface); } [part="base"] { position: relative; display: flex; flex-direction: column; gap: var(--lr-space-xs); min-inline-size: 0; max-inline-size: 100%; } [part="base"]:where([data-fit-frame-contained]) { overflow: clip; } [part="base"]:where([data-fit-frame-contained]) [part="canvas"] { max-inline-size: 100%; } canvas { display: block; inline-size: 100%; direction: ltr; cursor: pointer; } [part="canvas"]:hover { outline: var(--lr-border-width-thin) solid var(--lr-heatmap-hover-ring-color, var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color))); outline-offset: var(--lr-focus-ring-offset); } :host([multiple]) [part='canvas'], :host([multiple]) [part='cell'] { touch-action: none; user-select: none; } [part="canvas"]:active { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="cells"] { position: absolute; inset: 0; direction: ltr; pointer-events: none; } [part="grid"] { position: relative; overflow: auto; direction: ltr; min-inline-size: 0; max-inline-size: 100%; max-block-size: var(--lr-heatmap-grid-max-block-size, none); } .grid-stack { position: relative; display: grid; grid-template-areas: 'stack'; } .grid-stack > * { grid-area: stack; align-self: start; justify-self: start; } [part="row-labels"], [part="col-labels"] { position: sticky; display: block; pointer-events: none; z-index: var(--lr-layer-content); } [part="row-labels"] { inset-inline-start: 0; } [part="col-labels"] { inset-block-start: 0; } .cell-row { display: contents; } [part="cell"] { position: absolute; display: block; padding: 0; border: 0; border-radius: 0; background: transparent; color: transparent; cursor: pointer; pointer-events: auto; ${iconHitTarget} } [part="cell"]:hover { outline: var(--lr-border-width-thin) solid var(--lr-heatmap-hover-ring-color, var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color))); outline-offset: var(--lr-focus-ring-offset); } [part="cell"]:active { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="cell"]:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="canvas"]:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="tooltip"] { position: absolute; transform: translate(-50%, -100%); margin-block-start: var(--lr-size-neg-6px); padding: var(--lr-size-2px) var(--lr-size-6px); border-radius: var(--lr-radius); background: var(--lr-heatmap-tooltip-bg, var(--_lr-heatmap-tooltip-bg)); color: var( --lr-heatmap-tooltip-color, var(--_lr-heatmap-tooltip-color) ); font-size: var(--lr-font-size-xs); white-space: nowrap; box-shadow: var(--lr-shadow-m); pointer-events: none; z-index: var(--lr-layer-content); } [part="tooltip"], [part="legend-lo"], [part="legend-hi"], [part="legend-stop-label"] { unicode-bidi: plaintext; } [part="tooltip"].tooltip-below { transform: translate(-50%, 0); margin-block-start: var(--lr-size-6px); } [part="tooltip"][hidden] { display: none; } [part="legend"] { display: flex; flex-wrap: wrap; align-items: center; gap: var(--lr-space-xs); min-inline-size: 0; max-inline-size: 100%; font-size: var(--lr-font-size-xs); color: var(--lr-color-text-quiet); overflow-wrap: anywhere; } [part="legend"] .bar { flex: 0 1 var(--lr-size-6rem); min-inline-size: 0; inline-size: var(--lr-size-6rem); block-size: var(--lr-size-0-5rem); border-radius: var(--lr-size-2px); background: var( --lr-heatmap-color-steps-gradient, linear-gradient( to right, var(--lr-heatmap-scale-lo, var(--_lr-heatmap-scale-lo)), var(--lr-heatmap-scale-hi, var(--_lr-heatmap-scale-hi)) ) ); } :host(:dir(rtl)) [part="legend"] .bar { transform: scaleX(-1); } [part="legend-stop"] { display: inline-flex; align-items: center; gap: var(--lr-size-3px); min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; } [part="legend-swatch"] { flex: 0 0 auto; inline-size: var(--lr-size-0-6rem); block-size: var(--lr-size-0-6rem); border-radius: var(--lr-radius-xs); } [part="legend-stop-label"] { min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; } [part="legend-lo"], [part="legend-hi"], [part="legend-value-label"] { min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; } [part="legend-annotation"] { display: inline-flex; align-items: center; gap: var(--lr-size-3px); min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; } [part="legend-annotation"] .ring-swatch { flex: 0 0 auto; inline-size: var(--lr-size-0-6rem); block-size: var(--lr-size-0-6rem); border-radius: 50%; border: var(--lr-border-width-medium) solid var(--lr-heatmap-annotation-color, var(--_lr-heatmap-annotation-color)); } `;export{styles};
1
+ import{iconHitTarget}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` .source-axes { display: flex; justify-content: space-between; gap: var(--lr-space-xs); font-size: var(--lr-font-size-sm); } [part="source-exact-window"] { overflow: auto; max-inline-size: 100%; contain: inline-size; } [part="source-exact-window"] [role="row"] { display: flex; inline-size: max-content; } [part="source-exact-window"] [role="gridcell"] { flex: none; } [part="source-exact-window"] [part="cell"] { position: relative; inline-size: auto; block-size: auto; min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); padding: var(--lr-space-xs); white-space: nowrap; color: var(--lr-color-text); background: var(--lr-color-surface); border: var(--lr-border-width-thin) solid var(--lr-color-border); } :host { display: block; min-inline-size: 0; max-inline-size: 100%; --_lr-heatmap-scale-lo: var(--lr-color-brand-quiet); --_lr-heatmap-scale-hi: var(--lr-color-brand); --_lr-heatmap-no-data-fill: var(--lr-color-no-data); --_lr-heatmap-label-font: var(--lr-size-10px) var(--lr-font); --_lr-heatmap-tooltip-bg: var(--lr-color-surface); --_lr-heatmap-tooltip-color: var(--lr-color-text); --_lr-heatmap-focus-ring-color: var(--lr-focus-ring-color); --_lr-heatmap-annotation-color: var(--lr-color-danger); --_lr-heatmap-selected-color: var(--lr-color-success); --_lr-heatmap-sticky-label-bg: var(--lr-color-surface); } [part="base"] { position: relative; display: flex; flex-direction: column; gap: var(--lr-space-xs); min-inline-size: 0; max-inline-size: 100%; } [part="base"]:where([data-fit-frame-contained]) { overflow: clip; } [part="base"]:where([data-fit-frame-contained]) [part="canvas"] { max-inline-size: 100%; } canvas { display: block; inline-size: 100%; direction: ltr; cursor: pointer; } [part="canvas"]:hover { outline: var(--lr-border-width-thin) solid var(--lr-heatmap-hover-ring-color, var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color))); outline-offset: var(--lr-focus-ring-offset); } :host([multiple]) [part='canvas'], :host([multiple]) [part='cell'] { touch-action: none; user-select: none; } [part="canvas"]:active { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="cells"] { position: absolute; inset: 0; direction: ltr; pointer-events: none; } [part="grid"] { position: relative; overflow: auto; direction: ltr; min-inline-size: 0; max-inline-size: 100%; max-block-size: var(--lr-heatmap-grid-max-block-size, none); } .grid-stack { position: relative; display: grid; grid-template-areas: 'stack'; } .grid-stack > * { grid-area: stack; align-self: start; justify-self: start; } [part="row-labels"], [part="col-labels"] { position: sticky; display: block; pointer-events: none; z-index: var(--lr-layer-content); } [part="row-labels"] { inset-inline-start: 0; } [part="col-labels"] { inset-block-start: 0; } .cell-row { display: contents; } [part="cell"] { position: absolute; display: block; padding: 0; border: 0; border-radius: 0; background: transparent; color: transparent; cursor: pointer; pointer-events: auto; ${iconHitTarget} } [part="cell"]:hover { outline: var(--lr-border-width-thin) solid var(--lr-heatmap-hover-ring-color, var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color))); outline-offset: var(--lr-focus-ring-offset); } [part="cell"]:active { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="cell"]:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="canvas"]:focus-visible { outline: var(--lr-focus-ring-width) solid var(--lr-heatmap-focus-ring-color, var(--_lr-heatmap-focus-ring-color)); outline-offset: var(--lr-focus-ring-offset); } [part="tooltip"] { position: absolute; transform: translate(-50%, -100%); margin-block-start: var(--lr-size-neg-6px); padding: var(--lr-size-2px) var(--lr-size-6px); border-radius: var(--lr-radius); background: var(--lr-heatmap-tooltip-bg, var(--_lr-heatmap-tooltip-bg)); color: var( --lr-heatmap-tooltip-color, var(--_lr-heatmap-tooltip-color) ); font-size: var(--lr-font-size-xs); white-space: nowrap; box-shadow: var(--lr-shadow-m); pointer-events: none; z-index: var(--lr-layer-content); } [part="tooltip"], [part="legend-lo"], [part="legend-hi"], [part="legend-stop-label"] { unicode-bidi: plaintext; } [part="tooltip"].tooltip-below { transform: translate(-50%, 0); margin-block-start: var(--lr-size-6px); } [part="tooltip"][hidden] { display: none; } [part="legend"] { display: flex; flex-wrap: wrap; align-items: center; gap: var(--lr-space-xs); min-inline-size: 0; max-inline-size: 100%; font-size: var(--lr-font-size-xs); color: var(--lr-color-text-quiet); overflow-wrap: anywhere; } [part="legend"] .bar { flex: 0 1 var(--lr-size-6rem); min-inline-size: 0; inline-size: var(--lr-size-6rem); block-size: var(--lr-size-0-5rem); border-radius: var(--lr-size-2px); background: var( --lr-heatmap-color-steps-gradient, linear-gradient( to right, var(--lr-heatmap-scale-lo, var(--_lr-heatmap-scale-lo)), var(--lr-heatmap-scale-hi, var(--_lr-heatmap-scale-hi)) ) ); } :host(:dir(rtl)) [part="legend"] .bar { transform: scaleX(-1); } [part="legend-stop"] { display: inline-flex; align-items: center; gap: var(--lr-size-3px); min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; } [part="legend-swatch"] { flex: 0 0 auto; inline-size: var(--lr-size-0-6rem); block-size: var(--lr-size-0-6rem); border-radius: var(--lr-radius-xs); } [part="legend-stop-label"] { min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; } [part="legend-lo"], [part="legend-hi"], [part="legend-value-label"] { min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; } [part="legend-annotation"] { display: inline-flex; align-items: center; gap: var(--lr-size-3px); min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; } [part="legend-annotation"] .ring-swatch { flex: 0 0 auto; inline-size: var(--lr-size-0-6rem); block-size: var(--lr-size-0-6rem); border-radius: 50%; border: var(--lr-border-width-medium) solid var(--lr-heatmap-annotation-color, var(--_lr-heatmap-annotation-color)); } `;export{styles};