@aceshooting/lyra-ui 29.0.2 → 29.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +19 -26
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migrate-wa.mjs +2 -0
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +5 -3
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +4 -3
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
  8. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +21 -5
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +14 -11
  10. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +34 -7
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +25 -11
  14. package/dist/components/agent-tools/eval-result/eval-result-source.js +1 -0
  15. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +31 -11
  16. package/dist/components/agent-tools/eval-result/eval-result.class.js +29 -15
  17. package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -1
  18. package/dist/components/agent-tools/eval-result/eval-run-result.d.ts +10 -0
  19. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +26 -5
  20. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -6
  21. package/dist/components/agent-tools/span-waterfall/span-waterfall.d.ts +1 -1
  22. package/dist/components/agent-tools/span-waterfall/span-waterfall.js +1 -1
  23. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
  24. package/dist/components/agent-tools/task-list/task-list.class.d.ts +29 -6
  25. package/dist/components/agent-tools/task-list/task-list.class.js +13 -7
  26. package/dist/components/agent-tools/task-list/task-list.d.ts +1 -1
  27. package/dist/components/agent-tools/task-list/task-list.js +1 -1
  28. package/dist/components/agent-tools/task-list/task-list.styles.js +1 -1
  29. package/dist/components/agent-tools/terminal/terminal.class.d.ts +9 -5
  30. package/dist/components/agent-tools/terminal/terminal.class.js +8 -8
  31. package/dist/components/agent-tools/test-results/test-results.class.d.ts +16 -4
  32. package/dist/components/agent-tools/test-results/test-results.class.js +15 -6
  33. package/dist/components/agent-tools/test-results/test-results.d.ts +1 -0
  34. package/dist/components/agent-tools/test-results/test-results.js +1 -1
  35. package/dist/components/agent-tools/test-results/test-results.styles.js +1 -1
  36. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +7 -4
  37. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -1
  38. package/dist/components/agent-tools/trace-tree/span-projection.js +1 -0
  39. package/dist/components/agent-tools/trace-tree/span-shared.d.ts +29 -0
  40. package/dist/components/agent-tools/trace-tree/span-shared.js +1 -0
  41. package/dist/components/agent-tools/trace-tree/span.d.ts +5 -35
  42. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  43. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +27 -5
  44. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +19 -9
  45. package/dist/components/agent-tools/trace-tree/trace-tree.d.ts +1 -1
  46. package/dist/components/agent-tools/trace-tree/trace-tree.js +1 -1
  47. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
  48. package/dist/components/charts/chart/bar-chart.class.d.ts +5 -1
  49. package/dist/components/charts/chart/box-plot.class.d.ts +2 -2
  50. package/dist/components/charts/chart/box-plot.class.js +3 -3
  51. package/dist/components/charts/chart/bubble-chart.class.d.ts +5 -1
  52. package/dist/components/charts/chart/chart-prepared-data.d.ts +9 -0
  53. package/dist/components/charts/chart/chart-prepared-data.js +1 -0
  54. package/dist/components/charts/chart/chart-spatial-data.js +2 -0
  55. package/dist/components/charts/chart/chart-sync.js +1 -1
  56. package/dist/components/charts/chart/chart-table-sampling.js +1 -1
  57. package/dist/components/charts/chart/chart.class.d.ts +56 -6
  58. package/dist/components/charts/chart/chart.class.js +18 -8
  59. package/dist/components/charts/chart/chart.styles.js +1 -1
  60. package/dist/components/charts/chart/doughnut-chart.class.d.ts +5 -1
  61. package/dist/components/charts/chart/histogram-buckets.d.ts +1 -1
  62. package/dist/components/charts/chart/histogram-buckets.js +1 -1
  63. package/dist/components/charts/chart/histogram.class.d.ts +19 -4
  64. package/dist/components/charts/chart/histogram.class.js +1 -1
  65. package/dist/components/charts/chart/line-chart.class.d.ts +5 -1
  66. package/dist/components/charts/chart/lite-chart.class.d.ts +51 -11
  67. package/dist/components/charts/chart/lite-chart.class.js +33 -27
  68. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  69. package/dist/components/charts/chart/pie-chart.class.d.ts +5 -1
  70. package/dist/components/charts/chart/polar-area-chart.class.d.ts +5 -1
  71. package/dist/components/charts/chart/radar-chart.class.d.ts +5 -1
  72. package/dist/components/charts/chart/scatter-chart.class.d.ts +5 -1
  73. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +6 -3
  74. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +6 -5
  75. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -1
  76. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +8 -0
  77. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  78. package/dist/components/conversation/code-block/code-block-base.class.d.ts +5 -3
  79. package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
  80. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -1
  81. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  82. package/dist/components/conversation/code-block/code-block-shared.d.ts +6 -4
  83. package/dist/components/conversation/code-block/code-block-shared.js +3 -2
  84. package/dist/components/conversation/code-block/code-block.class.d.ts +11 -4
  85. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  86. package/dist/components/conversation/code-block/code-block.d.ts +1 -1
  87. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  88. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  89. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  90. package/dist/components/conversation/markdown/markdown-base.class.d.ts +6 -4
  91. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  92. package/dist/components/conversation/markdown/markdown-code-header.d.ts +2 -2
  93. package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
  94. package/dist/components/conversation/markdown/markdown-core.class.d.ts +8 -3
  95. package/dist/components/conversation/markdown/markdown-progressive.js +2 -2
  96. package/dist/components/conversation/markdown/markdown-shared.d.ts +5 -10
  97. package/dist/components/conversation/markdown/markdown-shared.js +5 -5
  98. package/dist/components/conversation/markdown/markdown-streaming-tail.js +1 -1
  99. package/dist/components/conversation/markdown/markdown.class.d.ts +17 -10
  100. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  101. package/dist/components/conversation/markdown/markdown.styles.js +1 -1
  102. package/dist/components/conversation/model-select/model-select.class.d.ts +4 -3
  103. package/dist/components/conversation/model-select/model-select.class.js +3 -2
  104. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  105. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +2 -1
  106. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
  107. package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +1 -1
  108. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -2
  109. package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -1
  110. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  111. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +10 -2
  112. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +15 -6
  113. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
  114. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +3 -1
  115. package/dist/components/conversation/realtime-session/realtime-session.class.js +2 -1
  116. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  117. package/dist/components/conversation/streaming-text/markdown-detection.d.ts +2 -0
  118. package/dist/components/conversation/streaming-text/markdown-detection.js +4 -1
  119. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +6 -2
  120. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +3 -3
  121. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -1
  122. package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
  123. package/dist/components/conversation/thread-list/thread-list.class.d.ts +34 -4
  124. package/dist/components/conversation/thread-list/thread-list.class.js +22 -15
  125. package/dist/components/conversation/thread-list/thread-list.d.ts +1 -1
  126. package/dist/components/conversation/thread-list/thread-list.js +1 -1
  127. package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
  128. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +6 -2
  129. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +3 -2
  130. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
  131. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +3 -2
  132. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -2
  133. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  134. package/dist/components/data/calendar/calendar.class.d.ts +5 -2
  135. package/dist/components/data/calendar/calendar.class.js +1 -1
  136. package/dist/components/data/data-grid/data-grid-processing.js +2 -2
  137. package/dist/components/data/data-grid/data-grid.class.d.ts +22 -8
  138. package/dist/components/data/data-grid/data-grid.class.js +20 -19
  139. package/dist/components/data/data-grid/data-grid.styles.js +1 -1
  140. package/dist/components/data/document-library/document-library.class.d.ts +31 -4
  141. package/dist/components/data/document-library/document-library.class.js +25 -12
  142. package/dist/components/data/document-library/document-library.styles.js +1 -1
  143. package/dist/components/data/file-tree/file-tree.class.d.ts +30 -6
  144. package/dist/components/data/file-tree/file-tree.class.js +4 -3
  145. package/dist/components/data/file-tree/file-tree.d.ts +1 -0
  146. package/dist/components/data/file-tree/file-tree.js +1 -1
  147. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +31 -6
  148. package/dist/components/data/flow-canvas/flow-canvas.class.js +40 -19
  149. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  150. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  151. package/dist/components/data/flow-canvas/flow-source.js +1 -0
  152. package/dist/components/data/flow-canvas/flow-types.d.ts +4 -2
  153. package/dist/components/data/flow-canvas/flow-viewport-index.js +1 -0
  154. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +9 -3
  155. package/dist/components/data/flow-minimap/flow-minimap.class.js +11 -2
  156. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  157. package/dist/components/data/funnel/funnel.class.d.ts +7 -3
  158. package/dist/components/data/funnel/funnel.class.js +2 -2
  159. package/dist/components/data/heatmap/calendar-grid.d.ts +1 -1
  160. package/dist/components/data/heatmap/calendar-grid.js +1 -1
  161. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
  162. package/dist/components/data/heatmap/heatmap-limits.d.ts +1 -1
  163. package/dist/components/data/heatmap/heatmap-matrix-source-controller.js +1 -0
  164. package/dist/components/data/heatmap/heatmap-matrix-source.d.ts +5 -0
  165. package/dist/components/data/heatmap/heatmap-matrix-source.js +1 -0
  166. package/dist/components/data/heatmap/heatmap-scale.d.ts +0 -16
  167. package/dist/components/data/heatmap/heatmap-scale.js +1 -1
  168. package/dist/components/data/heatmap/heatmap.class.d.ts +40 -11
  169. package/dist/components/data/heatmap/heatmap.class.js +26 -6
  170. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  171. package/dist/components/data/pagination/pagination.class.js +1 -1
  172. package/dist/components/data/sequence-strip/sequence-strip-item.d.ts +17 -0
  173. package/dist/components/data/sequence-strip/sequence-strip-source-controller.js +1 -0
  174. package/dist/components/data/sequence-strip/sequence-strip-source.d.ts +5 -0
  175. package/dist/components/data/sequence-strip/sequence-strip-source.js +1 -0
  176. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +24 -19
  177. package/dist/components/data/sequence-strip/sequence-strip.class.js +23 -4
  178. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  179. package/dist/components/data/sparkline/sparkline.class.d.ts +17 -4
  180. package/dist/components/data/sparkline/sparkline.class.js +3 -3
  181. package/dist/components/data/sparkline/sparkline.styles.js +1 -1
  182. package/dist/components/data/table/table.class.d.ts +14 -10
  183. package/dist/components/data/table/table.class.js +17 -16
  184. package/dist/components/data/timeline/timeline.class.d.ts +5 -2
  185. package/dist/components/data/timeline/timeline.class.js +1 -1
  186. package/dist/components/data/tree/tree-item.class.js +1 -1
  187. package/dist/components/data/tree/tree-owner-controller.js +1 -1
  188. package/dist/components/data/tree/tree.class.d.ts +28 -6
  189. package/dist/components/data/tree/tree.class.js +3 -3
  190. package/dist/components/data/tree/tree.d.ts +1 -0
  191. package/dist/components/data/tree/tree.js +1 -1
  192. package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -7
  193. package/dist/components/data/word-cloud/word-cloud.class.js +6 -4
  194. package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
  195. package/dist/components/forms/catalog-picker-base.d.ts +1 -1
  196. package/dist/components/forms/catalog-picker-base.js +6 -6
  197. package/dist/components/forms/catalog-picker-base.styles.js +1 -1
  198. package/dist/components/forms/combobox/combobox.class.d.ts +7 -3
  199. package/dist/components/forms/combobox/combobox.class.js +1 -1
  200. package/dist/components/forms/combobox/option.class.d.ts +4 -2
  201. package/dist/components/forms/combobox/option.class.js +2 -2
  202. package/dist/components/forms/country-picker/country-picker.class.d.ts +3 -1
  203. package/dist/components/forms/country-picker/country-picker.class.js +1 -1
  204. package/dist/components/forms/currency-picker/currency-picker.class.d.ts +2 -0
  205. package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
  206. package/dist/components/forms/currency-picker/currency-presentation.js +1 -1
  207. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +6 -2
  208. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -2
  209. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
  210. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +8 -2
  211. package/dist/components/forms/locale-picker/locale-picker.class.js +5 -4
  212. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  213. package/dist/components/forms/select/select.class.d.ts +11 -3
  214. package/dist/components/forms/select/select.class.js +4 -4
  215. package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +2 -0
  216. package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
  217. package/dist/components/forms/token-input/token-input.class.d.ts +6 -1
  218. package/dist/components/forms/token-input/token-input.class.js +15 -13
  219. package/dist/components/forms/unit-picker/unit-picker.class.d.ts +2 -0
  220. package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
  221. package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
  222. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  223. package/dist/components/layout/command-palette/command-palette.class.d.ts +5 -2
  224. package/dist/components/layout/command-palette/command-palette.class.js +2 -1
  225. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  226. package/dist/components/layout/menu/menu-item.class.d.ts +2 -2
  227. package/dist/components/layout/menu/menu-item.class.js +2 -2
  228. package/dist/components/layout/menu/menu.class.d.ts +1 -1
  229. package/dist/components/layout/menu/menu.class.js +1 -1
  230. package/dist/components/layout/menubar/menubar.class.d.ts +1 -1
  231. package/dist/components/layout/menubar/menubar.class.js +1 -1
  232. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -2
  233. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
  234. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
  235. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  236. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +13 -9
  237. package/dist/components/layout/virtual-list/virtual-list.class.js +21 -17
  238. package/dist/components/media/av-player/av-cue-index.js +1 -0
  239. package/dist/components/media/av-player/av-cue-source.d.ts +13 -0
  240. package/dist/components/media/av-player/av-cue-source.js +1 -0
  241. package/dist/components/media/av-player/av-metadata.d.ts +2 -2
  242. package/dist/components/media/av-player/av-metadata.js +1 -1
  243. package/dist/components/media/av-player/av-player-cue-source-controller.js +1 -0
  244. package/dist/components/media/av-player/av-player.class.d.ts +34 -12
  245. package/dist/components/media/av-player/av-player.class.js +15 -10
  246. package/dist/components/media/flag/flag.class.js +1 -1
  247. package/dist/components/media/flag/language-map.js +1 -1
  248. package/dist/components/media/lightbox/lightbox-source.js +1 -0
  249. package/dist/components/media/lightbox/lightbox-types.d.ts +15 -0
  250. package/dist/components/media/lightbox/lightbox.class.d.ts +22 -21
  251. package/dist/components/media/lightbox/lightbox.class.js +6 -4
  252. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  253. package/dist/components/media/map/map-geojson-diff.d.ts +6 -6
  254. package/dist/components/media/map/map-geojson-diff.js +1 -1
  255. package/dist/components/media/map/map-loader.d.ts +5 -1
  256. package/dist/components/media/map/map.class.d.ts +24 -6
  257. package/dist/components/media/map/map.class.js +2 -2
  258. package/dist/components/media/map/map.styles.js +1 -1
  259. package/dist/components/media/video-playlist/video-playlist.class.d.ts +2 -1
  260. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  261. package/dist/components/overlays/chip/chip.class.d.ts +1 -1
  262. package/dist/components/overlays/chip/chip.class.js +1 -1
  263. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +30 -8
  264. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +22 -8
  265. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
  266. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  267. package/dist/components/retrieval/graph/graph-source-composition.js +1 -0
  268. package/dist/components/retrieval/graph/graph-source-controller.js +1 -0
  269. package/dist/components/retrieval/graph/graph-spatial-controller.js +2 -2
  270. package/dist/components/retrieval/graph/graph-spatial-model.js +1 -0
  271. package/dist/components/retrieval/graph/graph-spatial.js +1 -1
  272. package/dist/components/retrieval/graph/graph.class.d.ts +31 -6
  273. package/dist/components/retrieval/graph/graph.class.js +26 -5
  274. package/dist/components/retrieval/graph/graph.d.ts +1 -1
  275. package/dist/components/retrieval/graph/graph.js +1 -1
  276. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  277. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +33 -4
  278. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +27 -17
  279. package/dist/components/retrieval/ingestion-queue/ingestion-queue.d.ts +1 -1
  280. package/dist/components/retrieval/ingestion-queue/ingestion-queue.js +1 -1
  281. package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +1 -1
  282. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +27 -4
  283. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +29 -14
  284. package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
  285. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +17 -3
  286. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +15 -10
  287. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -1
  288. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -5
  289. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +17 -10
  290. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.d.ts +1 -1
  291. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.js +1 -1
  292. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  293. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  294. package/dist/components/retrieval/mind-map/mind-map-model.js +1 -0
  295. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +27 -4
  296. package/dist/components/retrieval/mind-map/mind-map.class.js +11 -7
  297. package/dist/components/retrieval/mind-map/mind-map.d.ts +1 -0
  298. package/dist/components/retrieval/mind-map/mind-map.js +1 -1
  299. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  300. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +24 -2
  301. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +17 -3
  302. package/dist/components/retrieval/neighbor-list/neighbor-list.d.ts +1 -1
  303. package/dist/components/retrieval/neighbor-list/neighbor-list.js +1 -1
  304. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
  305. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +8 -4
  306. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +11 -7
  307. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
  308. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +12 -6
  309. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +30 -17
  310. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
  311. package/dist/components/retrieval/retrieval-results/retrieval-results-model.js +1 -0
  312. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +46 -5
  313. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +31 -9
  314. package/dist/components/retrieval/retrieval-results/retrieval-results.d.ts +1 -1
  315. package/dist/components/retrieval/retrieval-results/retrieval-results.js +1 -1
  316. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +1 -1
  317. package/dist/components/utility/diff-view/diff-view.class.d.ts +16 -8
  318. package/dist/components/utility/diff-view/diff-view.class.js +3 -2
  319. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  320. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +31 -3
  321. package/dist/components/utility/json-viewer/json-viewer.class.js +13 -4
  322. package/dist/components/utility/json-viewer/json-viewer.d.ts +1 -0
  323. package/dist/components/utility/json-viewer/json-viewer.js +1 -1
  324. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  325. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +6 -4
  326. package/dist/components/utility/mention-popover/mention-popover.class.js +6 -5
  327. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +34 -7
  328. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +9 -7
  329. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +28 -4
  330. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +12 -11
  331. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -1
  332. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +17 -16
  333. package/dist/components/viewers/geojson-view/geojson-viewer.d.ts +1 -1
  334. package/dist/components/viewers/geojson-view/geojson-viewer.js +1 -1
  335. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +31 -5
  336. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +11 -8
  337. package/dist/components/viewers/table-viewer-shared.js +19 -3
  338. package/dist/components/viewers/viewer-search-limits.js +1 -1
  339. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +35 -3
  340. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +20 -5
  341. package/dist/components/viewers/xml-viewer/xml-viewer.d.ts +1 -1
  342. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  343. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  344. package/dist/countries.js +1 -1
  345. package/dist/data-sources.d.ts +34 -0
  346. package/dist/data-sources.js +1 -0
  347. package/dist/events.d.ts +51 -7
  348. package/dist/framework-types.d.ts +1 -1
  349. package/dist/internal/accessibility-visibility.d.ts +4 -2
  350. package/dist/internal/accessibility-visibility.js +1 -1
  351. package/dist/internal/accessible-text-controller.js +1 -1
  352. package/dist/internal/anchor-target.js +2 -2
  353. package/dist/internal/catalog-picker.d.ts +1 -7
  354. package/dist/internal/catalog-picker.js +1 -1
  355. package/dist/internal/collection-snapshot.js +1 -1
  356. package/dist/internal/default-strings/agent-tools.generated.js +1 -1
  357. package/dist/internal/default-strings/charts.generated.js +1 -1
  358. package/dist/internal/default-strings/conversation.generated.js +1 -1
  359. package/dist/internal/default-strings/data.generated.js +1 -1
  360. package/dist/internal/default-strings/forms.generated.js +1 -1
  361. package/dist/internal/default-strings/layout.generated.js +1 -1
  362. package/dist/internal/default-strings/media.generated.js +1 -1
  363. package/dist/internal/default-strings/retrieval.generated.js +1 -1
  364. package/dist/internal/default-strings/shared.generated.js +1 -1
  365. package/dist/internal/default-strings/utility.generated.js +1 -1
  366. package/dist/internal/delimited-data.js +1 -1
  367. package/dist/internal/fixed-containing-block.js +1 -1
  368. package/dist/internal/flow-scene-envelope.js +1 -0
  369. package/dist/internal/graph-scene-controller.js +1 -0
  370. package/dist/internal/hierarchy-source-controller.js +1 -0
  371. package/dist/internal/hierarchy-source-view.js +29 -0
  372. package/dist/internal/hierarchy-source-view.styles.js +1 -0
  373. package/dist/internal/inherited-attribute-hub.d.ts +6 -0
  374. package/dist/internal/inherited-attribute-hub.js +1 -1
  375. package/dist/internal/intl-cache.js +1 -1
  376. package/dist/internal/keyed-index.js +1 -0
  377. package/dist/internal/localization-types.d.ts +1 -1
  378. package/dist/internal/localization.js +2 -2
  379. package/dist/internal/lyra-element.d.ts +2 -2
  380. package/dist/internal/lyra-element.js +3 -2
  381. package/dist/internal/native-modal-context.js +1 -1
  382. package/dist/internal/option-selection.js +1 -1
  383. package/dist/internal/package-metadata.js +1 -1
  384. package/dist/internal/positioner.js +1 -1
  385. package/dist/internal/resource-loader.d.ts +2 -0
  386. package/dist/internal/resource-loader.js +1 -1
  387. package/dist/internal/scoped-definitions.generated.js +1 -1
  388. package/dist/internal/search-haystack.js +1 -0
  389. package/dist/internal/selection-catalog.d.ts +5 -0
  390. package/dist/internal/selection-catalog.js +1 -1
  391. package/dist/internal/shiki-language-sources.js +1 -0
  392. package/dist/internal/source-page-controller.js +1 -0
  393. package/dist/internal/source-page-scope.js +1 -0
  394. package/dist/internal/source-request-controller.js +1 -0
  395. package/dist/internal/source-window-controller.js +1 -0
  396. package/dist/internal/spatial-source-controller.js +1 -0
  397. package/dist/internal/text-quote.d.ts +2 -6
  398. package/dist/internal/text-quote.js +1 -1
  399. package/dist/internal/theme-watcher.js +1 -1
  400. package/dist/internal/virtual-list-composition.js +1 -0
  401. package/dist/lyra.d.ts +1 -1
  402. package/dist/lyra.js +1 -1
  403. package/dist/testing/interaction-drivers.js +1 -1
  404. package/dist/testing/lyra-tag-event-map.js +1 -1
  405. package/dist/units.js +1 -1
  406. package/dist/utilities/data-preparation.d.ts +56 -0
  407. package/dist/utilities/data-preparation.js +1 -0
  408. package/dist/utilities/data-spatial.d.ts +26 -0
  409. package/dist/utilities/data-spatial.js +1 -0
  410. package/dist/utilities/index.d.ts +1 -1
  411. package/dist/utilities/index.js +1 -1
  412. package/llms/components/lr-activity-feed.md +7 -2
  413. package/llms/components/lr-agent-trace.md +49 -9
  414. package/llms/components/lr-agent-workspace.md +15 -8
  415. package/llms/components/lr-av-player.md +180 -10
  416. package/llms/components/lr-bar-chart.md +1 -1
  417. package/llms/components/lr-box-plot.md +8 -0
  418. package/llms/components/lr-bubble-chart.md +1 -1
  419. package/llms/components/lr-calendar.md +26 -3
  420. package/llms/components/lr-chart.md +310 -23
  421. package/llms/components/lr-chat-viewport.md +6 -0
  422. package/llms/components/lr-code-block-core.md +12 -7
  423. package/llms/components/lr-code-block.md +23 -9
  424. package/llms/components/lr-combobox.md +27 -15
  425. package/llms/components/lr-command-palette.md +16 -3
  426. package/llms/components/lr-country-picker.md +23 -6
  427. package/llms/components/lr-csv-viewer.md +95 -12
  428. package/llms/components/lr-currency-picker.md +23 -3
  429. package/llms/components/lr-data-grid.md +24 -6
  430. package/llms/components/lr-dataset-viewer.md +92 -11
  431. package/llms/components/lr-dialog.md +1 -1
  432. package/llms/components/lr-diff-view.md +19 -6
  433. package/llms/components/lr-document-library.md +60 -5
  434. package/llms/components/lr-doughnut-chart.md +1 -1
  435. package/llms/components/lr-embedding-explorer.md +89 -9
  436. package/llms/components/lr-emoji-picker.md +7 -2
  437. package/llms/components/lr-eval-dataset.md +56 -7
  438. package/llms/components/lr-eval-result.md +89 -4
  439. package/llms/components/lr-export-button.md +1 -1
  440. package/llms/components/lr-file-tree.md +60 -6
  441. package/llms/components/lr-flag.md +5 -2
  442. package/llms/components/lr-flow-canvas.md +152 -14
  443. package/llms/components/lr-flow-minimap.md +32 -4
  444. package/llms/components/lr-funnel.md +14 -0
  445. package/llms/components/lr-geojson-viewer.md +27 -10
  446. package/llms/components/lr-graph.md +43 -7
  447. package/llms/components/lr-heatmap.md +161 -5
  448. package/llms/components/lr-histogram.md +55 -9
  449. package/llms/components/lr-ingestion-queue.md +54 -3
  450. package/llms/components/lr-json-viewer.md +87 -7
  451. package/llms/components/lr-knowledge-base-admin.md +60 -4
  452. package/llms/components/lr-knowledge-base.md +121 -9
  453. package/llms/components/lr-knowledge-graph-explorer.md +106 -11
  454. package/llms/components/lr-lightbox.md +42 -6
  455. package/llms/components/lr-line-chart.md +28 -5
  456. package/llms/components/lr-lite-chart.md +96 -31
  457. package/llms/components/lr-locale-picker.md +6 -4
  458. package/llms/components/lr-map.md +67 -8
  459. package/llms/components/lr-markdown-core.md +10 -5
  460. package/llms/components/lr-markdown.md +23 -6
  461. package/llms/components/lr-mention-popover.md +11 -6
  462. package/llms/components/lr-mind-map.md +91 -10
  463. package/llms/components/lr-model-select.md +8 -4
  464. package/llms/components/lr-model-settings-panel.md +10 -2
  465. package/llms/components/lr-navigation-menu.md +1 -1
  466. package/llms/components/lr-neighbor-list.md +69 -2
  467. package/llms/components/lr-pie-chart.md +1 -1
  468. package/llms/components/lr-polar-area-chart.md +1 -1
  469. package/llms/components/lr-prompt-input.md +9 -2
  470. package/llms/components/lr-prompt-queue.md +11 -3
  471. package/llms/components/lr-radar-chart.md +1 -1
  472. package/llms/components/lr-rag-eval-dashboard.md +9 -2
  473. package/llms/components/lr-realtime-session.md +6 -2
  474. package/llms/components/lr-reorder-list.md +4 -0
  475. package/llms/components/lr-retrieval-compare.md +9 -4
  476. package/llms/components/lr-retrieval-results.md +104 -6
  477. package/llms/components/lr-scatter-chart.md +1 -1
  478. package/llms/components/lr-select.md +20 -10
  479. package/llms/components/lr-sequence-strip.md +92 -2
  480. package/llms/components/lr-span-waterfall.md +78 -8
  481. package/llms/components/lr-sparkline.md +42 -11
  482. package/llms/components/lr-spreadsheet-viewer.md +109 -14
  483. package/llms/components/lr-streaming-text-core.md +4 -2
  484. package/llms/components/lr-streaming-text.md +5 -1
  485. package/llms/components/lr-table.md +96 -115
  486. package/llms/components/lr-task-list.md +93 -9
  487. package/llms/components/lr-terminal.md +9 -0
  488. package/llms/components/lr-test-results.md +77 -3
  489. package/llms/components/lr-thread-list.md +86 -1
  490. package/llms/components/lr-time-zone-picker.md +8 -3
  491. package/llms/components/lr-timeline.md +5 -0
  492. package/llms/components/lr-token-input.md +7 -2
  493. package/llms/components/lr-tool-timeline.md +13 -4
  494. package/llms/components/lr-trace-tree.md +96 -10
  495. package/llms/components/lr-transcript-feed.md +9 -2
  496. package/llms/components/lr-tree.md +87 -15
  497. package/llms/components/lr-unit-picker.md +8 -3
  498. package/llms/components/lr-video-playlist.md +2 -0
  499. package/llms/components/lr-virtual-list.md +17 -8
  500. package/llms/components/lr-voice-picker.md +8 -3
  501. package/llms/components/lr-word-cloud.md +128 -12
  502. package/llms/components/lr-xml-viewer.md +106 -9
  503. package/llms/index.md +1 -1
  504. package/llms/peers.md +1 -1
  505. package/llms/shared/events-and-types.md +725 -264
  506. package/llms/shared/forms-and-accessibility.md +3 -17
  507. package/llms/shared/imports-and-registration.md +3 -17
  508. package/llms/shared/localization-and-rtl.md +0 -2
  509. package/llms/shared/styles-and-tokens.md +27 -36
  510. package/llms/shared/testing-and-utilities.md +4 -5
  511. package/llms/shared.md +770 -349
  512. package/llms.txt +1 -2
  513. package/locales.json +139 -139
  514. package/package.json +13 -4
  515. package/registrations.json +1 -1
  516. package/skills/compose-lyra-interfaces/SKILL.md +6 -8
  517. package/skills/lyra-ui/SKILL.md +20 -51
  518. package/skills/lyra-ui/commands/review.md +16 -33
  519. package/skills/lyra-ui/commands/update.md +6 -5
  520. package/skills/lyra-ui/online-api.md +15 -0
  521. package/skills/lyra-ui/reporting.md +2 -1
@@ -1,4 +1,28 @@
1
- import{__decorate}from"tslib";import{collectionSupport,publicCollectionTruncation}from"../../../internal/collection-snapshot.js";import{html,nothing,svg}from"lit";import{property,state,query}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{fitTransform}from"../../../internal/fit-transform.js";import{specialistTokens}from"../../../internal/specialist-host-tokens.styles.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{isRtl}from"../../../internal/rtl.js";import{literalSetConverter}from"../../../internal/converters.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{styles}from"./graph.styles.js";import{loadD3}from"./graph-loader.js";import{convexHull,hullPathD,hullCentroidX,hullTopY}from"./graph-hull.js";import{EXPAND_BADGE_OFFSET,EXPAND_BADGE_R,drawGraphScene,drawPickingScene,pickColorToIndex,shapeHalfSide}from"./graph-canvas.js";import{GraphSpatialController}from"./graph-spatial-controller.js";import{normalizeGraphCamera}from"./graph-spatial.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{finiteNumber,finiteRange,finiteInteger,extent}from"../../../internal/numbers.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{devWarnOnce}from"../../../internal/dev-warning.js";import{copyGraphLinkIdentity,graphLengthConverter,graphLinkIdentity,normalizeGraphModel}from"./graph-model.js";import{canonicalIdentityList}from"../retrieval-identity.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_graphCommunity,LYRA_DEFAULT_graphDataList,LYRA_DEFAULT_graphDataListLimit,LYRA_DEFAULT_graphDiagram,LYRA_DEFAULT_graphEdgeLimit,LYRA_DEFAULT_graphExpandableItem,LYRA_DEFAULT_graphFit,LYRA_DEFAULT_graphItemAnnouncement,LYRA_DEFAULT_graphLink,LYRA_DEFAULT_graphMissingLibrary,LYRA_DEFAULT_graphNode,LYRA_DEFAULT_graphNodeFocused,LYRA_DEFAULT_graphNodeLimit,LYRA_DEFAULT_graphNodesHidden,LYRA_DEFAULT_graphOrbitDown,LYRA_DEFAULT_graphOrbitLeft,LYRA_DEFAULT_graphOrbitRight,LYRA_DEFAULT_graphOrbitUp,LYRA_DEFAULT_graphSelectionCount,LYRA_DEFAULT_graphSpatialControls,LYRA_DEFAULT_graphSpatialInstructions,LYRA_DEFAULT_graphSpatialPage,LYRA_DEFAULT_graphSpatialUnavailable,LYRA_DEFAULT_graphTypedNode,LYRA_DEFAULT_graphView3d,LYRA_DEFAULT_graphViewList}from"../../../internal/default-strings/retrieval.generated.js";import{LYRA_DEFAULT_loading,LYRA_DEFAULT_next,LYRA_DEFAULT_noData,LYRA_DEFAULT_previous,LYRA_DEFAULT_zoomIn,LYRA_DEFAULT_zoomOut}from"../../../internal/default-strings/shared.generated.js";const GRAPH_LAYOUT=literalSetConverter(["force","layered"],"force"),GRAPH_VIEW=literalSetConverter(["2d","3d","list"],"2d"),STUB_OFFSET_PX=14,EDGE_LABEL_OFFSET_PX=4,DEFAULT_EDGE_LABEL_FONT_PX=10,EDGE_LABEL_LENGTH_GATE_RATIO=.85,EDGE_LABEL_WIDTH_CACHE_MAX=512,EXPAND_KEY_INTERVAL_MS=500,FOCUS_HALO_PADDING=6,HULL_PADDING=24,NODE_LABEL_MIN_ZOOM=.5,NODE_HIT_SEGMENT_HALF=.5;function ownGraphText(value,property2){const descriptor=getOwnDataDescriptor(value,property2);return descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof descriptor.value!="string"?void 0:descriptor.value}function ownGraphValue(value,property2){const descriptor=getOwnDataDescriptor(value,property2);return descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR?void 0:descriptor.value}function mulberry32(seed){let a=seed>>>0;return()=>{a=a+1831565813|0;let t=Math.imul(a^a>>>15,a|1);return t=t+Math.imul(t^t>>>7,t|61)^t,((t^t>>>14)>>>0)/4294967296}}function hashNodeSeed(seed,id){let h=seed>>>0;for(let i=0;i<id.length;i++)h=Math.imul(h^id.charCodeAt(i),2654435761),h^=h>>>15;return h>>>0}const MIN_RADIUS=6,MAX_RADIUS=24;function sanitizeNodeColor(color){return sanitizeCssColor(color)}function normalizeLinkDash(dash){if(!(!dash?.length||dash.some(value=>!Number.isFinite(value)||value<0)))return dash.join(" ")}function categoricalPaletteColor(index){return`var(--lr-graph-cat-${index%8+1})`}function squarePath(r){const s=shapeHalfSide(r);return`M ${-s} ${-s} L ${s} ${-s} L ${s} ${s} L ${-s} ${s} Z`}function diamondPath(r){const d=shapeHalfSide(r)*Math.SQRT2;return`M 0 ${-d} L ${d} 0 L 0 ${d} L ${-d} 0 Z`}function sameIds(a,b){return a===b?!0:!a||!b||a.length!==b.length?!1:a.every((id,index)=>id===b[index])}const identitySets=new WeakMap;function identitySet(values){const ids=canonicalIdentityList(values);let set=identitySets.get(ids);return set||identitySets.set(ids,set=new Set(ids)),set}class LyraGraph extends LyraElement{static{this.defaultStrings={...super.defaultStrings,graphCommunity:LYRA_DEFAULT_graphCommunity,graphDataList:LYRA_DEFAULT_graphDataList,graphDataListLimit:LYRA_DEFAULT_graphDataListLimit,graphDiagram:LYRA_DEFAULT_graphDiagram,graphEdgeLimit:LYRA_DEFAULT_graphEdgeLimit,graphExpandableItem:LYRA_DEFAULT_graphExpandableItem,graphFit:LYRA_DEFAULT_graphFit,graphItemAnnouncement:LYRA_DEFAULT_graphItemAnnouncement,graphLink:LYRA_DEFAULT_graphLink,graphMissingLibrary:LYRA_DEFAULT_graphMissingLibrary,graphNode:LYRA_DEFAULT_graphNode,graphNodeFocused:LYRA_DEFAULT_graphNodeFocused,graphNodeLimit:LYRA_DEFAULT_graphNodeLimit,graphNodesHidden:LYRA_DEFAULT_graphNodesHidden,graphOrbitDown:LYRA_DEFAULT_graphOrbitDown,graphOrbitLeft:LYRA_DEFAULT_graphOrbitLeft,graphOrbitRight:LYRA_DEFAULT_graphOrbitRight,graphOrbitUp:LYRA_DEFAULT_graphOrbitUp,graphSelectionCount:LYRA_DEFAULT_graphSelectionCount,graphSpatialControls:LYRA_DEFAULT_graphSpatialControls,graphSpatialInstructions:LYRA_DEFAULT_graphSpatialInstructions,graphSpatialPage:LYRA_DEFAULT_graphSpatialPage,graphSpatialUnavailable:LYRA_DEFAULT_graphSpatialUnavailable,graphTypedNode:LYRA_DEFAULT_graphTypedNode,graphView3d:LYRA_DEFAULT_graphView3d,graphViewList:LYRA_DEFAULT_graphViewList,loading:LYRA_DEFAULT_loading,next:LYRA_DEFAULT_next,noData:LYRA_DEFAULT_noData,previous:LYRA_DEFAULT_previous,zoomIn:LYRA_DEFAULT_zoomIn,zoomOut:LYRA_DEFAULT_zoomOut}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["nodes","edges","nodeTypes","hiddenTypes","communities","selectedNodeIds","selectedEdgeIds","dimmedNodeIds","dimmedEdgeIds"])}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}static{this.styles=[LyraElement.styles,specialistTokens,styles,srOnly]}static{this.immutableEventDetails=Object.freeze(["lr-selection-change"])}get graphModel(){const sources=this.normalizedGraphSources;return(!sources||sources[0]!==this.nodes||sources[1]!==this.edges||sources[2]!==this.nodeTypes||sources[3]!==this.communities)&&(this.normalizedGraphSources=[this.nodes,this.edges,this.nodeTypes,this.communities],this.normalizedGraphModel=normalizeGraphModel(this.nodes,this.edges,this.nodeTypes,this.communities)),this.normalizedGraphModel}get view(){return this._view}set view(value){const next=GRAPH_VIEW.normalize(value),old=this._view;next!==old&&(this._view=next,this.requestUpdate("view",old))}get camera(){return this._camera}set camera(value){const old=this._camera;this._camera=value==null?void 0:normalizeGraphCamera(value,{yaw:0,pitch:0,distance:500,target:{x:0,y:0,z:0}}),this.requestUpdate("camera",old)}get layout(){return this._layout}set layout(next){const normalized=GRAPH_LAYOUT.normalize(next),old=this._layout;old!==normalized&&(this._layout=normalized,this.requestUpdate("layout",old))}spatialMessages(){return{controls:this.localize("graphSpatialControls"),view3d:this.localize("graphView3d"),viewList:this.localize("graphViewList"),fit:this.localize("graphFit"),left:this.localize("graphOrbitLeft"),right:this.localize("graphOrbitRight"),up:this.localize("graphOrbitUp"),down:this.localize("graphOrbitDown"),instructions:this.localize("graphSpatialInstructions"),unavailable:this.localize("graphSpatialUnavailable"),zoomIn:this.localize("zoomIn"),zoomOut:this.localize("zoomOut"),previous:this.localize("previous"),next:this.localize("next"),dataList:this.localize("graphDataList"),noData:this.localize("noData")}}constructor(){super(),this.nodes=[],this.edges=[],this.nodeTypes=[],this.hiddenTypes=[],this.communities=[],this._view="2d",this._layout="force",this.renderer="svg",this.fitTo="none",this.width=800,this.height=600,this.chargeStrength=-300,this.edgeDistance=100,this.minZoom=.1,this.maxZoom=8,this.label=null,this.accessibleLabel=null,this.withEdgeLabels=!1,this.edgeLabelMinZoom=.6,this.focusNodeId=null,this.selectionMode="none",this.selectedNodeIds=[],this.selectedEdgeIds=[],this.dimmedNodeIds=[],this.dimmedEdgeIds=[],this.arrowMarkerId=nextId("graph-arrow"),this.loading=!0,this.loadFailed=!1,this.loadLibrary=loadD3,this.loadGeneration=0,this.containerSize=null,this.simNodes=[],this.simLinks=[],this.simNodeById=new Map,this.danglingLinks=[],this.lastPositionById=new Map,this.lastHiddenNodeCount=0,this.activeGraphItem=0,this.graphLiveText="",this.announcements=new AnnouncementSinkController(this,{eager:["polite","assertive"]}),this.graphAnnouncementsReady=!1,this.isMounting=!0,this.authorRole=null,this.syncingGraphHostRole=!1,this.detachedGraphChanges=new Map,this.boundNodeEls=new WeakSet,this.nodeEls=[],this.nodeHitEls=[],this.nodeLabelEls=[],this.expandIndicatorEls=[],this.lastKeyActivateIndex=null,this.lastKeyActivateTime=0,this.lastAppliedFocusNodeId=null,this.communityHullEls=[],this.communityHullHitEls=[],this.communityLabelEls=[],this.visible=!0,this.canvasDrawPending=!1,this.pickDirty=!0,this.canvasCamera={k:1,x:0,y:0},this.pickItems=[],this.canvasSceneHasEdgeLabels=!1,this.isCameraTweening=!1,this.linkEls=[],this.linkHitEls=[],this.linkLabelEls=[],this.linkLabelHiddenByLength=[],this.edgeLabelWidthCache=new Map,this.danglingLinkEls=[],this.linkPaintVisibilityCache=new Map,this.resolvedCssColorCache=new Map,this.reducedMotion=!1,this.spatial=new GraphSpatialController(this,{model:()=>this.graphModel,locale:()=>this.effectiveLocale,direction:()=>this.effectiveDirection,pageText:values=>this.localize("graphSpatialPage",void 0,values),viewport:()=>({width:this.safeWidth,height:this.safeHeight}),messages:()=>this.spatialMessages(),communityText:values=>this.localize("graphCommunity",void 0,values),nodeText:node=>this.nodeAccessibleText(node),edgeText:edge=>this.linkAccessibleText(edge),nodeTooltip:node=>this.nodeTooltipText(node),edgeTooltip:edge=>this.linkTooltipText(edge),nodeShape:node=>this.nodeShape(node),paint:(nodes,edges)=>this.withCanvasColorResolver(resolve=>{const css=this.computedStyle(),nodeDefault=css.getPropertyValue("--lr-graph-node-fill").trim()||css.getPropertyValue("--lr-color-brand").trim(),edgeDefault=css.getPropertyValue("--lr-graph-edge-color").trim()||css.getPropertyValue("--lr-color-border").trim();return{nodes:new Map(nodes.map(({node})=>[node.id,resolve(this.nodeFill(node)??nodeDefault)])),edges:new Map(edges.map(edge=>[graphLinkIdentity(edge),resolve(sanitizeNodeColor(edge.color)??edgeDefault)])),visibleEdges:new Set(edges.filter(edge=>this.isInteractiveLink(edge,resolve,edgeDefault)).map(graphLinkIdentity)),text:resolve(css.getPropertyValue("--lr-color-text").trim()),selected:resolve(css.getPropertyValue("--lr-graph-selected-color").trim()||css.getPropertyValue("--lr-color-success").trim()),font:css.getPropertyValue("--lr-font").trim()||css.fontFamily,fontSize:this.edgeLabelFontPx(),dimmedOpacity:finiteRange(Number(css.getPropertyValue("--lr-graph-dimmed-opacity").trim()||.35),.35,0,1)}}),activate:(hit,event)=>{if(hit.kind==="node"){const position=this.spatial.position(hit.id);if(!position)return;this.emit("lr-node-activate",{nodeId:hit.id,...position}),this.emitSelectionIntent("node",hit.id,event.ctrlKey||event.metaKey)}else this.onLinkClick(hit.edge,event)},expand:nodeId=>this.emit("lr-node-expand",{nodeId}),hover:(previous,next)=>{previous?.kind==="node"?this.emit("lr-node-leave",{nodeId:previous.id}):previous?.kind==="link"&&this.emitEdgeHover("leave",this.linkHoverDetail(previous.edge)),next?.kind==="node"?this.emit("lr-node-enter",{nodeId:next.id}):next?.kind==="link"&&this.emitEdgeHover("enter",this.linkHoverDetail(next.edge))},community:community=>this.onCommunityClick(community),cameraChanged:camera=>this.emit("lr-camera-change",{camera}),viewChanged:()=>this.emit("lr-view-change",{view:this.view}),unavailable:()=>this.announcements.announceAssertive(this.localize("graphSpatialUnavailable")),clearSelection:()=>this.clearSelection(),afterUpdate:(callback,key)=>this.scheduleAfterUpdate(callback,key)}),this.isApplyingZoomTransform=!1,this.onCanvasDprChange=()=>{this.watchCanvasDpr(),this.markCanvasDirty()},this.onCanvasPointerDown=e=>{if(e.button!==0||(this.canvasPointerDownAt={x:e.clientX,y:e.clientY},this.canvasPointerDownId=e.pointerId,this.layout==="layered"))return;const hit=this.hitTest(e.clientX,e.clientY);if(hit?.kind==="node"){this.canvasDragNode=hit.node,this.canvasPointerId=e.pointerId;try{this.canvasEl.setPointerCapture(e.pointerId)}catch{}hit.node.fx=hit.node.x,hit.node.fy=hit.node.y,this.simulation?.alphaTarget(.3).restart()}},this.onCanvasPointerMove=e=>{if(this.canvasDragNode&&this.canvasPointerId===e.pointerId){const node=this.simNodeById.get(this.canvasDragNode.id);if(node){const rect=this.canvasEl.getBoundingClientRect();node.fx=(e.clientX-rect.left-this.canvasCamera.x)/this.canvasCamera.k,node.fy=(e.clientY-rect.top-this.canvasCamera.y)/this.canvasCamera.k,this.markCanvasDirty()}return}if(this.pendingHover={x:e.clientX,y:e.clientY},this.hoverRafId!=null)return;const frameOwner=this.ownerWindow;frameOwner&&(this.hoverRafOwner=frameOwner,this.hoverRafId=frameOwner.requestAnimationFrame(()=>{if(this.hoverRafId=void 0,this.hoverRafOwner=void 0,!this.isConnected||this.ownerWindow!==frameOwner)return;const pending=this.pendingHover;if(this.pendingHover=void 0,!pending||this.canvasHoverSuppressed()||this.pickDirty&&this.simulationIsTicking())return;const hit=this.hitTest(pending.x,pending.y);this.updateCanvasTooltip(hit,pending.x,pending.y),this.updateCanvasHover(hit)}))},this.onCanvasPointerUp=e=>{this.finishCanvasNodeDrag(e.pointerId);const down=this.takeCanvasPointerDown(e.pointerId);if(!down||Math.hypot(e.clientX-down.x,e.clientY-down.y)>5)return;const hit=this.hitTest(e.clientX,e.clientY);if(!hit){this.clearSelection();return}hit.kind==="node"?this.onNodeClick(hit.node,e):hit.kind==="link"?this.onLinkClick(hit.link,e):this.onCommunityClick(hit.entry.community)},this.onCanvasPointerCancel=e=>{this.finishCanvasNodeDrag(e.pointerId),this.takeCanvasPointerDown(e.pointerId)},this.onCanvasLostPointerCapture=e=>{this.finishCanvasNodeDrag(e.pointerId,!1),this.takeCanvasPointerDown(e.pointerId)},this.onCanvasPointerLeave=()=>{this.pendingHover=void 0,this.hoverRafId!=null&&(this.hoverRafOwner?.cancelAnimationFrame(this.hoverRafId),this.hoverRafId=void 0,this.hoverRafOwner=void 0),this.updateCanvasTooltip(void 0,0,0),this.canvasHoverSuppressed()?this.canvasHover=void 0:this.updateCanvasHover(void 0)},this.onCanvasDblClick=e=>{const hit=this.hitTest(e.clientX,e.clientY),node=hit?.kind==="node"?hit.node:this.nodeAtCanvasPoint(e.clientX,e.clientY);node&&(e.stopImmediatePropagation(),this.emit("lr-node-expand",{nodeId:node.id}))},this.isDragging=!1,this.isPanning=!1,new ThemeWatcher(this,()=>{const reduced=prefersReducedMotion(this);reduced!==this.reducedMotion&&(this.reducedMotion=reduced,reduced?this.simulation?.stop():this.view==="2d"&&this.safeSeed==null&&this.simulation?.restart()),this.linkPaintVisibilityCache.clear(),this.resolvedCssColorCache.clear(),this.view!=="2d"?this.spatial.invalidate():this.renderer==="canvas"&&this.markCanvasDirty()},["(prefers-reduced-motion: reduce)"])}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),name==="role"&&oldValue!==value&&!this.syncingGraphHostRole&&(this.authorRole=value)}hostOwnsGraphSemantics(){return this.hasAttribute("aria-label")}syncGraphHostRole(){if(this.authorRole===null){this.syncingGraphHostRole=!0;try{this.hostOwnsGraphSemantics()?this.setAttribute("role","group"):this.removeAttribute("role")}finally{this.syncingGraphHostRole=!1}}}get ownerWindow(){return this.ownerDocument.defaultView??void 0}computedStyle(element=this){const view=this.ownerWindow;return view?view.getComputedStyle(element):"style"in element?element.style:this.style}connectedCallback(){if(super.connectedCallback(),this.detachedGraphChanges.size){for(const[key,previous]of this.detachedGraphChanges)this.requestUpdate(key,previous);this.detachedGraphChanges.clear(),this.requestUpdate()}this.reducedMotion=prefersReducedMotion(this);const IntersectionObserverCtor=this.ownerWindow?.IntersectionObserver;this.view==="2d"&&IntersectionObserverCtor&&(this.intersectionObserver=new IntersectionObserverCtor(entries=>{const wasVisible=this.visible;this.visible=entries[0]?.isIntersecting??!0,this.visible&&!wasVisible&&this.canvasDrawPending&&(this.canvasDrawPending=!1,this.scheduleCanvasDraw())}),this.intersectionObserver.observe(this)),this.fitTo==="container"&&(this.syncHostResizeObserver(),this.measureHostBox()),this.view==="2d"?this.connect2d():(this.loading=!1,this.requestUpdate())}connect2d(){const Observer=this.ownerWindow?.IntersectionObserver;if(!this.intersectionObserver&&Observer&&(this.intersectionObserver=new Observer(entries=>{const wasVisible=this.visible;this.visible=entries[0]?.isIntersecting??!0,this.visible&&!wasVisible&&this.canvasDrawPending&&(this.canvasDrawPending=!1,this.scheduleCanvasDraw())}),this.intersectionObserver.observe(this)),this.d3){!this.reducedMotion&&this.safeSeed==null&&this.simulation?.restart(),this.renderer==="canvas"&&this.canvasEl&&this.canvasEl===this.zoomedEl&&(this.ensureCanvasOwnerRealm(),this.syncHostResizeObserver(),this.watchCanvasDpr(),this.markCanvasDirty());return}const generation=++this.loadGeneration;this.loadLibrary().then(async mods=>{try{await this.updateComplete}catch{return}if(await new Promise(resolve=>this.updateBrowserDerivedState(resolve)),!(generation!==this.loadGeneration||!this.isConnected)){if(this.loading=!1,!mods){this.loadFailed=!0;return}this.loadFailed=!1,this.d3=mods,this.rebuildSimulation()}})}disconnectedCallback(){super.disconnectedCallback(),this.spatial.disconnect(),this.loadGeneration+=1,this.simulation?.stop(),this.finishCanvasNodeDrag(void 0,!0,!1),this.takeCanvasPointerDown(),this.cancelCameraTween(),this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.hostResizeObserver?.disconnect(),this.hostResizeObserver=void 0,this.hostResizeObserverDocument=void 0,this.canvasDprQuery?.removeEventListener("change",this.onCanvasDprChange),this.canvasDprQuery=void 0,this.canvasDrawRafId!=null&&(this.canvasDrawRafOwner?.cancelAnimationFrame(this.canvasDrawRafId),this.canvasDrawRafId=void 0,this.canvasDrawRafOwner=void 0),this.hoverRafId!=null&&(this.hoverRafOwner?.cancelAnimationFrame(this.hoverRafId),this.hoverRafId=void 0,this.hoverRafOwner=void 0),this.pendingHover=void 0,this.canvasHover=void 0,this.canvasTooltipEl?.setAttribute("hidden",""),this.pendingGraphItemFocus=void 0,this.viewportChangeRafId!=null&&(this.viewportChangeRafOwner?.cancelAnimationFrame(this.viewportChangeRafId),this.viewportChangeRafId=void 0,this.viewportChangeRafOwner=void 0)}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.ensureCanvasOwnerRealm()}scheduleViewportChange(){if(this.view!=="2d"||this.viewportChangeRafId!=null)return;const frameOwner=this.ownerWindow;frameOwner&&(this.viewportChangeRafOwner=frameOwner,this.viewportChangeRafId=frameOwner.requestAnimationFrame(()=>{if(this.viewportChangeRafId=void 0,this.viewportChangeRafOwner=void 0,!this.isConnected||this.ownerWindow!==frameOwner)return;const transform=this.renderer==="canvas"||!this.d3||!this.zoomedEl?this.canvasCamera:this.d3.zoomTransform(this.zoomedEl);this.emit("lr-viewport-change",{zoom:transform.k,x:transform.x,y:transform.y,k:transform.k})}))}nodeRadius(n){const r=n.radius??(MIN_RADIUS+MAX_RADIUS)/2;return Number.isFinite(r)?Math.min(MAX_RADIUS,Math.max(MIN_RADIUS,r)):(MIN_RADIUS+MAX_RADIUS)/2}safeLinkWidth(link){return finiteRange(link.width??1.5,1.5,0)}isInteractiveLink(link,resolveColor,defaultPaint){if(this.safeLinkWidth(link)<=0)return!1;const effectivePaint=sanitizeNodeColor(link.color)??defaultPaint,color=effectivePaint?resolveColor(effectivePaint).trim().toLowerCase():void 0;if(!color)return!0;if(color==="transparent"||/^#[\da-f]{4}$/.test(color)&&color.endsWith("0")||/^#[\da-f]{8}$/.test(color)&&color.endsWith("00")||/\/\s*0(?:\.0+)?%?\s*\)$/.test(color)||/^(?:rgba|hsla)\(/.test(color)&&/,\s*0(?:\.0+)?\s*\)$/.test(color))return!1;const cached=this.linkPaintVisibilityCache.get(color);if(cached!==void 0)return cached;this.linkPaintProbe??=this.ownerDocument.createElement("canvas"),this.linkPaintProbe.width=1,this.linkPaintProbe.height=1;const context=this.linkPaintProbe.getContext("2d",{willReadFrequently:!0});if(!context)return!0;let visible=!0;try{context.clearRect(0,0,1,1),context.fillStyle="rgb(1 2 3)",context.fillStyle=color,context.fillRect(0,0,1,1),visible=context.getImageData(0,0,1,1).data[3]!==0}catch{visible=!0}return this.linkPaintVisibilityCache.set(color,visible),visible}navigableLinks(){return this.navigableLinksCache||(this.navigableLinksCache=this.simLinks.length?this.withCanvasColorResolver(resolveColor=>{const computed=this.computedStyle(),defaultPaint=computed.getPropertyValue("--lr-graph-edge-color").trim()||computed.getPropertyValue("--lr-color-border").trim();return this.simLinks.filter(link=>this.isInteractiveLink(link,resolveColor,defaultPaint))}):[]),this.navigableLinksCache}lengthInPixels(value){return typeof value=="string"?resolveCssTokenLength(value,{host:this})??Number.NaN:value}get requestedWidth(){return finiteRange(this.lengthInPixels(this.width),800,1)}get requestedHeight(){return finiteRange(this.lengthInPixels(this.height),600,1)}get safeWidth(){const requested=this.requestedWidth,measured=this.fitTo==="container"&&this.containerSize;return measured?finiteRange(measured.width,requested,1):requested}get safeHeight(){const requested=this.requestedHeight,measured=this.fitTo==="container"&&this.containerSize;return measured?finiteRange(measured.height,requested,1):requested}recordContainerSize(width,height){const w=Math.round(finiteRange(width,0,0)),h=Math.round(finiteRange(height,0,0));return w<=0||h<=0||this.containerSize?.width===w&&this.containerSize?.height===h?!1:(this.containerSize={width:w,height:h},!0)}measureHostBox(){return this.isConnected?(this.syncRequestedHeightVar(),this.recordContainerSize(this.clientWidth,this.clientHeight)):!1}syncRequestedHeightVar(){this.style.setProperty("--_lr-graph-requested-height",`${this.requestedHeight}px`)}get safeMinZoom(){return finiteRange(this.minZoom,.1,.001,1e3)}get safeMaxZoom(){return finiteRange(this.maxZoom,8,.001,1e3)}get effectiveZoomBounds(){const min=this.safeMinZoom,max=this.safeMaxZoom;return Object.freeze({min:Math.min(min,max),max:Math.max(min,max)})}get safeEdgeLabelMinZoom(){return finiteRange(this.edgeLabelMinZoom,.6,.001,1e3)}get resolvedNodeLabelsMode(){return this.nodeLabels??(this.renderer==="canvas"?"zoom":"always")}canvasNodeLabelsVisible(){const mode=this.resolvedNodeLabelsMode;return mode==="none"?!1:mode==="zoom"?this.canvasCamera.k>=NODE_LABEL_MIN_ZOOM:!0}get safeSeed(){return this.seed==null?void 0:finiteInteger(this.seed,0)}get safeChargeStrength(){return finiteNumber(this.chargeStrength,-300)}get safeLinkDistance(){return finiteRange(this.edgeDistance,100,0)}nodeTypeEntry(node){const types=this.graphModel.nodeTypes;if(this.nodeTypeIndex?.[0]!==types){const labeled=this.labeledNodeTypes();this.nodeTypeIndex=[types,new Map(types.map((type,index)=>{const slot=labeled.indexOf(type);return[type.id,[type,slot<0?index:slot]]}))]}return node.type==null?void 0:this.nodeTypeIndex[1].get(node.type)}resolveNodeType(node){return this.nodeTypeEntry(node)?.[0]}nodeShape(node){return this.resolveNodeType(node)?.shape??"circle"}labeledNodeTypes(){return this.graphModel.nodeTypes.filter(candidate=>typeof candidate?.label=="string"&&candidate.label.trim().length>0)}nodeFill(node){const ownColor=sanitizeNodeColor(node.color);if(ownColor)return ownColor;const entry=this.nodeTypeEntry(node);if(entry)return sanitizeNodeColor(entry[0].color)||categoricalPaletteColor(entry[1])}visibleNodes(){const hiddenTypes=canonicalIdentityList(this.hiddenTypes);if(!hiddenTypes.length)return this.graphModel.nodes;const hidden=new Set(hiddenTypes);return this.graphModel.nodes.filter(n=>n.type==null||!hidden.has(n.type))}resolveLinksAgainst(byId){const nodeExists=new Set(this.graphModel.nodes.map(n=>n.id)),resolved=[],dangling=[];for(const l of this.graphModel.links){const source=byId.get(l.source);if(!source)continue;const target=byId.get(l.target);target?resolved.push(copyGraphLinkIdentity(l,{...l,source,target})):nodeExists.has(l.target)||dangling.push(copyGraphLinkIdentity(l,{...l,source,target:{id:l.target,x:source.x,y:source.y},dangling:!0}))}return{resolved,dangling}}communityMembers(community){const idSet=new Set(community.memberIds);return this.simNodes.filter(n=>idSet.has(n.id)||n.communityId===community.id)}visibleCommunities(){return this.visibleCommunitiesCache||(this.visibleCommunitiesCache=this.graphModel.communities.map(community=>({community,members:this.communityMembers(community)})).filter(entry=>entry.members.length>0)),this.visibleCommunitiesCache}communityHull(members){return convexHull(members.map(n=>({x:n.x??0,y:n.y??0})))}onCommunityClick(community){this.emit("lr-community-activate",{communityId:community.id})}cameraTransitionMs(){const parsed=parseFloat(this.computedStyle().getPropertyValue("--lr-transition-base"));return Number.isFinite(parsed)?parsed:180}cancelCameraTween(){this.cameraTweenId!=null&&(this.cameraTweenFrameOwner?.cancelAnimationFrame(this.cameraTweenId),this.cameraTweenId=void 0,this.cameraTweenFrameOwner=void 0),this.isCameraTweening=!1;const resolve=this.cameraTweenResolve;resolve&&(this.cameraTweenResolve=void 0,resolve(!1))}applyZoomTransform(transform){if(!(!this.d3||!this.zoomedEl||!this.zoomBehavior)){this.isApplyingZoomTransform=!0;try{this.zoomBehavior.transform(this.d3.select(this.zoomedEl),transform)}finally{this.isApplyingZoomTransform=!1}}}tweenCamera(computeTarget){return new Promise(resolve=>{if(!this.d3||!this.zoomedEl||!this.zoomBehavior){resolve(!1);return}this.cancelCameraTween(),this.cameraTweenResolve=resolve,this.isCameraTweening=!0;const frameOwner=this.ownerWindow;if(!frameOwner){this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!1);return}if(prefersReducedMotion(this)){this.applyZoomTransform(computeTarget()),this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!0);return}const current=this.d3.zoomTransform(this.zoomedEl),duration=this.cameraTransitionMs(),start=frameOwner.performance.now(),startK=current.k,startX=current.x,startY=current.y,step=now=>{if(this.cameraTweenResolve!==resolve)return;if(!this.isConnected||this.ownerWindow!==frameOwner){this.cameraTweenId=void 0,this.cameraTweenFrameOwner=void 0,this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!1);return}const t=!prefersReducedMotion(this)&&duration>0?Math.min(1,(now-start)/duration):1,target=computeTarget(),targetK=target.k,targetX=target.x,targetY=target.y;this.applyZoomTransform(this.d3.zoomIdentity.translate(startX+(targetX-startX)*t,startY+(targetY-startY)*t).scale(startK+(targetK-startK)*t)),t<1?(this.cameraTweenFrameOwner=frameOwner,this.cameraTweenId=frameOwner.requestAnimationFrame(step)):(this.cameraTweenId=void 0,this.cameraTweenFrameOwner=void 0,this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!0))};this.cameraTweenFrameOwner=frameOwner,this.cameraTweenId=frameOwner.requestAnimationFrame(step)})}async focusNode(id,options){if(this.view!=="2d"){if(!this.isConnected)return!1;const focused=this.spatial.focusNode(id,options?.zoom);if(focused){const node2=this.graphModel.nodes.find(candidate=>candidate.id===id);node2&&this.announcements.announcePolite(this.localize("graphNodeFocused",void 0,{label:this.nodeAccessibleText(node2)}))}return focused}const node=this.simNodes.find(n=>n.id===id);if(!node||!this.d3||!this.zoomedEl||!this.zoomBehavior)return!1;const current=this.d3.zoomTransform(this.zoomedEl),bounds=this.effectiveZoomBounds,k=finiteRange(options?.zoom??current.k,current.k,bounds.min,bounds.max),arrived=await this.tweenCamera(()=>this.d3.zoomIdentity.translate(this.safeWidth/2-k*(node.x??0),this.safeHeight/2-k*(node.y??0)).scale(k));return arrived&&(this.graphLiveText=this.localize("graphNodeFocused",void 0,{label:this.nodeAccessibleText(node)})),arrived}fit(options){if(this.view!=="2d"){this.isConnected&&this.spatial.fit(options?.padding);return}if(!this.d3||!this.zoomedEl||!this.zoomBehavior||!this.simNodes.length)return;const padding=finiteRange(options?.padding??24,24,0);this.tweenCamera(()=>{const fitPoints=[];for(const n of this.simNodes){const r=this.nodeRadius(n);fitPoints.push({x:(n.x??0)-r,y:(n.y??0)-r}),fitPoints.push({x:(n.x??0)+r,y:(n.y??0)+r})}for(const entry of this.visibleCommunities())for(const p of this.communityHull(entry.members))fitPoints.push({x:p.x-HULL_PADDING,y:p.y-HULL_PADDING}),fitPoints.push({x:p.x+HULL_PADDING,y:p.y+HULL_PADDING});const{minX,maxX,minY,maxY}=extent(fitPoints,point=>point.x,point=>point.y),bounds=this.effectiveZoomBounds,transform=fitTransform({minX,minY,maxX,maxY},{width:this.safeWidth,height:this.safeHeight},padding,bounds);return this.d3.zoomIdentity.translate(transform.x,transform.y).scale(transform.zoom)})}updateFocusHalo(){if(!this.focusHaloEl)return;const node=this.focusNodeId!=null?this.simNodes.find(n=>n.id===this.focusNodeId):void 0;node?(this.focusHaloEl.setAttribute("cx",String(node.x??0)),this.focusHaloEl.setAttribute("cy",String(node.y??0)),this.focusHaloEl.setAttribute("r",String(this.nodeRadius(node)+FOCUS_HALO_PADDING)),this.focusHaloEl.removeAttribute("hidden")):this.focusHaloEl.setAttribute("hidden","")}setUpCanvasSurface(){this.canvasCtx=this.canvasEl.getContext("2d")??void 0,this.ensureCanvasOwnerRealm(),this.syncHostResizeObserver(),this.watchCanvasDpr(),this.canvasTooltipEl=this.renderRoot.querySelector('[part="tooltip"]')??void 0,this.bindCanvasPointer(),this.bindCanvasZoom()}ensureCanvasOwnerRealm(){const ownerDocument=this.ownerDocument;this.edgeLabelMeasureCanvas?.ownerDocument!==ownerDocument&&(this.edgeLabelMeasureCanvas=void 0,this.edgeLabelMeasureCtx=void 0,this.edgeLabelWidthCache.clear()),!(!this.pickCanvas&&this.renderer!=="canvas")&&this.pickCanvas?.ownerDocument!==ownerDocument&&(this.pickCanvas=ownerDocument.createElement("canvas"),this.pickCtx=this.pickCanvas.getContext("2d",{willReadFrequently:!0}),this.pickDirty=!0)}syncHostResizeObserver(){if(this.view!=="2d"||this.renderer!=="canvas"&&this.fitTo!=="container"){this.hostResizeObserver?.disconnect(),this.hostResizeObserver=void 0,this.hostResizeObserverDocument=void 0;return}this.hostResizeObserver&&this.hostResizeObserverDocument===this.ownerDocument||this.watchHostResize()}watchHostResize(){this.hostResizeObserver?.disconnect();const ResizeObserverCtor=this.ownerWindow?.ResizeObserver;if(!ResizeObserverCtor){this.hostResizeObserver=void 0,this.hostResizeObserverDocument=void 0;return}this.hostResizeObserver=new ResizeObserverCtor(entries=>{const box=entries[entries.length-1]?.contentRect;this.fitTo==="container"&&box&&this.recordContainerSize(box.width,box.height),this.renderer==="canvas"&&this.canvasEl&&this.markCanvasDirty()}),this.hostResizeObserverDocument=this.ownerDocument,this.hostResizeObserver.observe(this)}watchCanvasDpr(){this.canvasDprQuery?.removeEventListener("change",this.onCanvasDprChange);const view=this.ownerWindow;if(!view?.matchMedia){this.canvasDprQuery=void 0;return}this.canvasDprQuery=view.matchMedia(`(resolution: ${view.devicePixelRatio}dppx)`),this.canvasDprQuery.addEventListener("change",this.onCanvasDprChange)}markCanvasDirty(){this.canvasScene=void 0,this.pickDirty=!0,this.scheduleCanvasDraw()}markCanvasCameraDirty(){this.pickDirty=!0,this.scheduleCanvasDraw()}scheduleCanvasDraw(){if(this.view!=="2d")return;if(!this.visible){this.canvasDrawPending=!0;return}if(this.canvasDrawRafId!=null)return;const frameOwner=this.ownerWindow;frameOwner&&(this.canvasDrawRafOwner=frameOwner,this.canvasDrawRafId=frameOwner.requestAnimationFrame(()=>{this.canvasDrawRafId=void 0,this.canvasDrawRafOwner=void 0,!(!this.isConnected||this.ownerWindow!==frameOwner)&&this.drawCanvas()}))}resolveCssColorWithProbe(value,probe){const cached=this.resolvedCssColorCache.get(value);if(cached!==void 0)return cached;probe.style.color="",probe.style.color=value;const result=getComputedStyle(probe).color.trim()||getComputedStyle(this).color||"transparent";return this.resolvedCssColorCache.set(value,result),result}createCanvasColorProbe(){const probe=this.ownerDocument.createElement("span");return probe.setAttribute("aria-hidden","true"),probe.style.position="absolute",probe.style.inlineSize="0",probe.style.blockSize="0",probe.style.overflow="hidden",probe.style.visibility="hidden",probe.style.pointerEvents="none",this.renderRoot.append(probe),probe}withCanvasColorResolver(callback){let probe;try{return callback(value=>{const cached=this.resolvedCssColorCache.get(value);return cached!==void 0?cached:(probe??=this.createCanvasColorProbe(),this.resolveCssColorWithProbe(value,probe))})}finally{probe?.remove()}}buildCanvasScene(cs){return this.withCanvasColorResolver(resolveColor=>{const hullFillDefault=cs.getPropertyValue("--lr-graph-hull-fill").trim()||cs.getPropertyValue("--lr-color-brand").trim(),hulls=this.visibleCommunities().map(entry=>({d:hullPathD(this.communityHull(entry.members)),fill:resolveColor(sanitizeNodeColor(entry.community.color)??hullFillDefault)})),linkColorDefault=cs.getPropertyValue("--lr-graph-edge-color").trim()||cs.getPropertyValue("--lr-color-border").trim(),links=this.simLinks.map(l=>{const coords=this.linkCoordinates(l),own=sanitizeNodeColor(l.color);return{x1:coords.x1,y1:coords.y1,x2:coords.x2,y2:coords.y2,color:resolveColor(own??linkColorDefault),width:this.safeLinkWidth(l),dash:l.dash,directed:l.directed,selected:this.isSelected("link",this.linkKey(l)),dimmed:this.isDimmed("link",this.linkKey(l))}}),edgeLabels=this.withEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom?this.simLinks.flatMap(l=>{const label=ownGraphText(l,"label");if(!label)return[];const pos=this.edgeLabelPosition(l),coords=this.linkCoordinates(l),edgeLength=Math.hypot(coords.x2-coords.x1,coords.y2-coords.y1);return this.edgeLabelWidth(label)>edgeLength*EDGE_LABEL_LENGTH_GATE_RATIO?[]:[{x:pos.x,y:pos.y,text:label}]}):[],nodeFillDefault=cs.getPropertyValue("--lr-graph-node-fill").trim()||cs.getPropertyValue("--lr-color-brand").trim(),nodes=this.simNodes.map(n=>{const fill=this.nodeFill(n);return{x:n.x??0,y:n.y??0,r:this.nodeRadius(n),shape:this.nodeShape(n),fill:resolveColor(fill??nodeFillDefault),selected:this.isSelected("node",n.id),dimmed:this.isDimmed("node",n.id)}}),nodeLabels=this.simNodes.flatMap(n=>{const label=ownGraphText(n,"label");return label?[{x:(n.x??0)+this.nodeRadius(n)+2,y:n.y??0,text:label}]:[]}),expandIndicators=this.simNodes.filter(n=>n.expandable).map(n=>({x:n.x??0,y:n.y??0,r:this.nodeRadius(n)})),focusNode=this.focusNodeId!=null?this.simNodes.find(n=>n.id===this.focusNodeId):void 0,scene={hulls,links,edgeLabels,nodes,nodeLabels,expandIndicators,focusHalo:focusNode?{x:focusNode.x??0,y:focusNode.y??0,r:this.nodeRadius(focusNode)+FOCUS_HALO_PADDING}:void 0,showNodeLabels:this.canvasNodeLabelsVisible(),haloColor:resolveColor(this.ownerWindow?.matchMedia?.("(forced-colors: active)").matches?"CanvasText":cs.getPropertyValue("--lr-graph-focus-halo-color").trim()||cs.getPropertyValue("--lr-color-brand").trim()),selectedColor:resolveColor(cs.getPropertyValue("--lr-graph-selected-color").trim()||cs.getPropertyValue("--lr-color-success").trim()),dimmedOpacity:(()=>{const value=Number(cs.getPropertyValue("--lr-graph-dimmed-opacity").trim());return Number.isFinite(value)?Math.min(1,Math.max(0,value)):.35})(),hullOpacity:(()=>{const value=Number(cs.getPropertyValue("--lr-graph-hull-opacity").trim());return Number.isFinite(value)?Math.min(1,Math.max(0,value)):.12})(),labelColor:resolveColor(cs.getPropertyValue("--lr-color-text").trim()),labelHaloColor:resolveColor(cs.getPropertyValue("--lr-graph-edge-label-halo").trim()||cs.getPropertyValue("--lr-color-surface").trim()),expandBadgeFill:resolveColor(cs.getPropertyValue("--lr-color-surface").trim()),expandBadgeStroke:resolveColor(cs.getPropertyValue("--lr-color-border-strong").trim()),font:`${this.edgeLabelFontPx()}px ${cs.getPropertyValue("--lr-font").trim()||"sans-serif"}`,borderWidths:["thin","medium","thick"].map((size,index)=>resolveCssTokenLength(cs.getPropertyValue(`--lr-border-width-${size}`).trim(),{host:this})??index+1)};return this.updateCanvasFocus(scene),scene})}updateCanvasFocus(scene){const index=shadowFocusTarget(this)?.getAttribute("part")==="cursor-item"?this.normalizedGraphItem():-1,node=index>=0&&index<this.linkIndexBase()?this.simNodes[index]:void 0,link=index>=this.linkIndexBase()&&index<this.communityIndexBase()?this.navigableLinks()[index-this.linkIndexBase()]:void 0,community=index>=this.communityIndexBase()?this.visibleCommunities()[index-this.communityIndexBase()]:void 0;scene.keyboardFocusRing=node?{x:node.x??0,y:node.y??0,r:this.nodeRadius(node)+4}:void 0,scene.keyboardFocusLink=link?{...this.linkCoordinates(link),width:this.safeLinkWidth(link)}:void 0,scene.keyboardFocusHull=community?{d:hullPathD(this.communityHull(community.members))}:void 0}drawCanvas(){if(!this.canvasEl||!this.canvasCtx)return;const dpr=this.ownerWindow?.devicePixelRatio||1,w=this.canvasEl.clientWidth||this.safeWidth,h=this.canvasEl.clientHeight||this.safeHeight,backingW=Math.round(w*dpr),backingH=Math.round(h*dpr);(this.canvasEl.width!==backingW||this.canvasEl.height!==backingH)&&(this.canvasEl.width=backingW,this.canvasEl.height=backingH);const ctx=this.canvasCtx;ctx.setTransform(dpr,0,0,dpr,0,0),ctx.clearRect(0,0,w,h);const edgeLabelsVisible=this.withEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom,nodeLabelsVisible=this.canvasNodeLabelsVisible();(!this.canvasScene||this.canvasScene.showNodeLabels!==nodeLabelsVisible||this.canvasSceneHasEdgeLabels!==edgeLabelsVisible)&&(this.canvasScene=this.buildCanvasScene(this.computedStyle()),this.canvasSceneHasEdgeLabels=edgeLabelsVisible),this.updateCanvasFocus(this.canvasScene),drawGraphScene(ctx,this.canvasCamera,this.canvasScene)}rebuildPickItems(){this.pickItems=[...this.visibleCommunities().map(entry=>({kind:"hull",entry})),...this.navigableLinks().map(link=>({kind:"link",link})),...this.simNodes.map(node=>({kind:"node",node}))]}redrawPickCanvas(){if(!this.pickCtx||!this.canvasEl||!this.pickCanvas)return;(this.pickCanvas.width!==this.canvasEl.width||this.pickCanvas.height!==this.canvasEl.height)&&(this.pickCanvas.width=this.canvasEl.width,this.pickCanvas.height=this.canvasEl.height),this.rebuildPickItems();const dpr=this.ownerWindow?.devicePixelRatio||1;this.pickCtx.setTransform(dpr,0,0,dpr,0,0),drawPickingScene(this.pickCtx,this.canvasCamera,{hulls:this.pickItems.filter(i=>i.kind==="hull").map(i=>({d:hullPathD(this.communityHull(i.entry.members))})),links:this.pickItems.filter(i=>i.kind==="link").map(i=>{const c=this.linkCoordinates(i.link);return{x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,width:this.safeLinkWidth(i.link)}}),nodes:this.pickItems.filter(i=>i.kind==="node").map(i=>({x:i.node.x??0,y:i.node.y??0,r:this.nodeRadius(i.node)+2,shape:this.nodeShape(i.node)}))}),this.pickDirty=!1}hitTest(clientX,clientY){if(!this.canvasEl||!this.pickCtx)return;this.pickDirty&&this.redrawPickCanvas();const rect=this.canvasEl.getBoundingClientRect(),dpr=this.ownerWindow?.devicePixelRatio||1,px=Math.round((clientX-rect.left)*dpr),py=Math.round((clientY-rect.top)*dpr);if(px<0||py<0||px>=this.pickCtx.canvas.width||py>=this.pickCtx.canvas.height)return;const data=this.pickCtx.getImageData(px,py,1,1).data,index=pickColorToIndex(data[0],data[1],data[2]);return index>=0?this.pickItems[index]:void 0}bindCanvasZoom(){if(!this.d3||!this.canvasEl)return;const bounds=this.effectiveZoomBounds,zoomBehavior=this.d3.zoom().scaleExtent([bounds.min,bounds.max]).on("start",()=>{this.isApplyingZoomTransform||(this.isPanning=!0,this.cancelCameraTween())}).on("zoom",event=>{this.canvasCamera={k:event.transform.k,x:event.transform.x,y:event.transform.y},this.markCanvasCameraDirty(),this.scheduleViewportChange()}).on("end",()=>{this.isPanning=!1});this.zoomBehavior=zoomBehavior,this.d3.select(this.canvasEl).call(zoomBehavior)}bindCanvasPointer(){const canvas=this.canvasEl;canvas.addEventListener("pointerdown",this.onCanvasPointerDown),canvas.addEventListener("pointermove",this.onCanvasPointerMove),canvas.addEventListener("pointerup",this.onCanvasPointerUp),canvas.addEventListener("pointercancel",this.onCanvasPointerCancel),canvas.addEventListener("lostpointercapture",this.onCanvasLostPointerCapture),canvas.addEventListener("pointerleave",this.onCanvasPointerLeave),canvas.addEventListener("dblclick",this.onCanvasDblClick)}simulationIsTicking(){return this.simulation!=null&&this.simulation.alpha()>this.simulation.alphaMin()}finishCanvasNodeDrag(pointerId,releaseCapture=!0,redraw=!0){const activePointerId=this.canvasPointerId;if(activePointerId==null||pointerId!=null&&pointerId!==activePointerId)return;const node=this.canvasDragNode&&this.simNodeById.get(this.canvasDragNode.id);if(this.canvasDragNode=void 0,this.canvasPointerId=void 0,this.simulation?.alphaTarget(0),node&&(node.fx=null,node.fy=null),releaseCapture&&this.canvasEl)try{this.canvasEl.releasePointerCapture(activePointerId)}catch{}redraw?this.markCanvasDirty():(this.canvasScene=void 0,this.pickDirty=!0)}takeCanvasPointerDown(pointerId){if(pointerId!=null&&this.canvasPointerDownId!==pointerId)return;const down=this.canvasPointerDownAt;return this.canvasPointerDownAt=void 0,this.canvasPointerDownId=void 0,down}canvasHoverSuppressed(){return!!this.canvasDragNode||this.isDragging||this.isPanning||this.isCameraTweening}updateCanvasHover(hit){const next=hit?.kind==="node"?{kind:"node",id:hit.node.id}:hit?.kind==="link"?{kind:"link",id:this.linkKey(hit.link),detail:this.linkHoverDetail(hit.link)}:void 0,previous=this.canvasHover;previous?.kind===next?.kind&&previous?.id===next?.id||(this.canvasHover=next,previous?.kind==="node"?this.emit("lr-node-leave",{nodeId:previous.id}):previous?.kind==="link"&&this.emitEdgeHover("leave",previous.detail),!(!this.isConnected||this.renderer!=="canvas"||this.canvasHover!==next)&&(next?.kind==="node"?this.emit("lr-node-enter",{nodeId:next.id}):next?.kind==="link"&&this.emitEdgeHover("enter",next.detail)))}nodeAtCanvasPoint(clientX,clientY){if(!this.canvasEl)return;const rect=this.canvasEl.getBoundingClientRect(),worldX=(clientX-rect.left-this.canvasCamera.x)/this.canvasCamera.k,worldY=(clientY-rect.top-this.canvasCamera.y)/this.canvasCamera.k;let closest,closestDistance=1/0;for(const node of this.simNodes){const distance=Math.hypot((node.x??0)-worldX,(node.y??0)-worldY);distance<=this.nodeRadius(node)+2/this.canvasCamera.k&&distance<closestDistance&&(closest=node,closestDistance=distance)}return closest}updateCanvasTooltip(hit,clientX,clientY){if(!this.canvasTooltipEl)return;if(!hit||hit.kind==="hull"){this.canvasTooltipEl.setAttribute("hidden","");return}const rect=this.canvasEl.getBoundingClientRect();this.canvasTooltipEl.textContent=hit.kind==="node"?this.nodeTooltipText(hit.node):this.linkTooltipText(hit.link);let left=clientX-rect.left,top=clientY-rect.top;this.canvasTooltipEl.style.left=`${left}px`,this.canvasTooltipEl.style.top=`${top}px`,this.canvasTooltipEl.removeAttribute("hidden");const tooltipRect=this.canvasTooltipEl.getBoundingClientRect(),view=this.ownerWindow;if(!view)return;const minLeft=Math.max(0,rect.left),maxRight=Math.min(view.innerWidth,rect.right),minTop=Math.max(0,rect.top),maxBottom=Math.min(view.innerHeight,rect.bottom);tooltipRect.right>maxRight&&(left-=tooltipRect.right-maxRight),tooltipRect.left<minLeft&&(left+=minLeft-tooltipRect.left),tooltipRect.bottom>maxBottom&&(top-=tooltipRect.bottom-maxBottom),tooltipRect.top<minTop&&(top+=minTop-tooltipRect.top),this.canvasTooltipEl.style.left=`${left}px`,this.canvasTooltipEl.style.top=`${top}px`}isSelected(kind,id){return identitySet(kind==="node"?this.selectedNodeIds:this.selectedEdgeIds).has(id)}paintedCurrent(kind,id){return this.selectionMode==="none"&&this.isSelected(kind,id)?"true":nothing}isDimmed(kind,id){return identitySet(kind==="node"?this.dimmedNodeIds:this.dimmedEdgeIds).has(id)}linkKey(link){return graphLinkIdentity(link)}emitSelectionIntent(kind,id,toggle){if(this.selectionMode==="none")return;const selected=this.isSelected(kind,id),time=this.ownerWindow?.performance.now()??0,repeat=this.lastActivation?.id===id&&time-this.lastActivation.time<=EXPAND_KEY_INTERVAL_MS;if(this.lastActivation={id,time},this.selectionMode==="single"||!toggle){if(this.selectionMode==="single"&&selected){repeat||this.emit("lr-selection-change",{selectedNodeIds:[],selectedEdgeIds:[]});return}this.emit("lr-selection-change",kind==="node"?{selectedNodeIds:[id],selectedEdgeIds:[]}:{selectedNodeIds:[],selectedEdgeIds:[id]});return}const selectedNodeIds=canonicalIdentityList(this.selectedNodeIds),selectedLinkIds=canonicalIdentityList(this.selectedEdgeIds),nodeIds=kind==="node"?selected?selectedNodeIds.filter(x=>x!==id):[...selectedNodeIds,id]:selectedNodeIds,linkIds=kind==="link"?selected?selectedLinkIds.filter(x=>x!==id):[...selectedLinkIds,id]:selectedLinkIds;this.emit("lr-selection-change",{selectedNodeIds:nodeIds,selectedEdgeIds:linkIds})}clearSelection(){this.selectionMode!=="none"&&(!canonicalIdentityList(this.selectedNodeIds).length&&!canonicalIdentityList(this.selectedEdgeIds).length||this.emit("lr-selection-change",{selectedNodeIds:[],selectedEdgeIds:[]}))}willUpdate(changed){super.willUpdate(changed),changed.has("view")&&this.isConnected&&(this.view!=="2d"?(this.loadGeneration+=1,this.simulation?.stop(),this.cancelCameraTween(),this.finishCanvasNodeDrag(void 0,!0,!1),this.takeCanvasPointerDown(),this.canvasDrawRafId!=null&&this.canvasDrawRafOwner?.cancelAnimationFrame(this.canvasDrawRafId),this.canvasDrawRafId=void 0,this.canvasDrawRafOwner=void 0,this.hoverRafId!=null&&this.hoverRafOwner?.cancelAnimationFrame(this.hoverRafId),this.hoverRafId=void 0,this.hoverRafOwner=void 0,this.pendingHover=void 0,this.viewportChangeRafId!=null&&this.viewportChangeRafOwner?.cancelAnimationFrame(this.viewportChangeRafId),this.viewportChangeRafId=void 0,this.viewportChangeRafOwner=void 0,this.canvasDprQuery?.removeEventListener("change",this.onCanvasDprChange),this.canvasDprQuery=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.loading=!1,this.loadFailed=!1,this.zoomedEl=void 0,this.gEl=void 0,this.boundNodeEls=new WeakSet,this.syncHostResizeObserver()):changed.get("view")!==void 0&&(this.spatial.disconnect(),this.loading=!this.d3,this.connect2d(),this.d3&&this.rebuildSimulation())),changed.has("height")&&this.syncRequestedHeightVar(),changed.has("fitTo")&&this.fitTo!=="container"&&(this.containerSize=null),this.fitTo==="container"&&!this.containerSize&&this.measureHostBox();const cursorOnly=changed.size>0&&[...changed.keys()].every(key=>key==="activeGraphItem"||key==="graphLiveText");if(cursorOnly||this.resolvedCssColorCache.clear(),cursorOnly||(this.navigableLinksCache=void 0),this.syncGraphHostRole(),this.view!=="2d"){this.spatial.prepare(),this.focusNodeId==null?this.lastAppliedFocusNodeId=null:this.focusNodeId!==this.lastAppliedFocusNodeId&&this.spatial.focusNode(this.focusNodeId)&&(this.lastAppliedFocusNodeId=this.focusNodeId),this.isMounting=!1;return}const wasMounting=this.isMounting;this.isMounting=!1;const hiddenTypesChanged=changed.has("hiddenTypes")&&!sameIds(canonicalIdentityList(changed.get("hiddenTypes")??[]),canonicalIdentityList(this.hiddenTypes)),structureChanged=this.d3&&(changed.has("nodes")||changed.has("edges")||hiddenTypesChanged||changed.has("layout")||this.layout==="layered"&&changed.has("edgeDistance")),graphItemsChanged=!!(structureChanged||changed.has("simNodes")||changed.has("communities")),activePart=shadowFocusTarget(this)?.getAttribute("part")??"",hadGraphItemFocus=graphItemsChanged&&["node","link","hull","cursor-item"].includes(activePart),previousIndex=this.normalizedGraphItem(),previousIdentity=graphItemsChanged?this.graphItemIdentity(previousIndex):void 0;if(structureChanged&&this.isConnected){this.rebuildSimulation(),this.renderer==="svg"&&this.simNodes.length+this.simLinks.length>1e3&&devWarnOnce("lr-graph-svg-scale",'<lr-graph>: renderer="svg" draws every node and link as DOM; use renderer="canvas" above about 1,000 of them.');const hovered=this.svgHoverNodeId;hovered!=null&&!this.simNodeById.has(hovered)&&(this.svgHoverNodeId=void 0,this.emit("lr-node-leave",{nodeId:hovered})),this.canvasHover?.kind==="node"&&!this.simNodeById.has(this.canvasHover.id)&&this.updateCanvasHover(void 0),this.navigableLinksCache=void 0}if(graphItemsChanged){this.visibleCommunitiesCache=void 0;const retainedIndex=previousIdentity?this.graphItemIndex(previousIdentity):-1,nextIndex=retainedIndex>=0?retainedIndex:this.normalizedGraphItem(previousIndex);this.activeGraphItem=nextIndex>=0?nextIndex:0,hadGraphItemFocus&&(this.pendingGraphItemFocus=nextIndex>=0?nextIndex:"base",nextIndex>=0&&(this.graphLiveText=this.graphItemAnnouncement(nextIndex)))}const selectedNodeIdsChanged=changed.has("selectedNodeIds")&&!sameIds(changed.get("selectedNodeIds"),this.selectedNodeIds),selectedLinkIdsChanged=changed.has("selectedEdgeIds")&&!sameIds(changed.get("selectedEdgeIds"),this.selectedEdgeIds);(selectedNodeIdsChanged||selectedLinkIdsChanged)&&!wasMounting&&(this.graphLiveText=this.localize("graphSelectionCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(canonicalIdentityList(this.selectedNodeIds).length+canonicalIdentityList(this.selectedEdgeIds).length)}))}updated(changed){if(super.updated(changed),!this.isConnected){for(const[key,previous]of changed)this.detachedGraphChanges.has(key)||this.detachedGraphChanges.set(key,previous);return}if(this.view!=="2d"){this.setAttribute("aria-busy","false"),this.spatial.update();return}this.setAttribute("aria-busy",String(this.loading));const announceGraphText=this.graphAnnouncementsReady&&changed.has("graphLiveText")&&this.graphLiveText!=="";if(!this.loading&&!this.loadFailed&&(this.graphAnnouncementsReady=!0),announceGraphText&&this.announcements.announcePolite(this.graphLiveText),changed.has("loadFailed")&&changed.get("loadFailed")!==void 0&&this.loadFailed&&this.announcements.announceAssertive(this.localize("graphMissingLibrary")),(changed.has("fitTo")||changed.has("renderer"))&&this.syncHostResizeObserver(),!this.d3)return;!changed.has("nodes")&&!changed.has("edges")&&!changed.has("hiddenTypes")&&((changed.has("width")||changed.has("height")||changed.has("containerSize")||changed.has("fitTo"))&&(this.simulation?.force("center",this.d3.forceCenter(this.safeWidth/2,this.safeHeight/2)),this.simulation?.alpha(.1).restart()),(changed.has("chargeStrength")||changed.has("edgeDistance"))&&(changed.has("chargeStrength")&&this.chargeForce?.strength(this.safeChargeStrength),changed.has("edgeDistance")&&this.linkForce?.distance(this.safeLinkDistance),this.simulation?.alpha(.3).restart())),this.applyInteractions(changed);const cursorOnly=changed.size>0&&[...changed.keys()].every(key=>key==="activeGraphItem"||key==="graphLiveText");this.renderer==="canvas"&&cursorOnly?this.scheduleCanvasDraw():this.applyCanvasInteractions(),this.focusNodeId==null?this.lastAppliedFocusNodeId=null:this.focusNodeId!==this.lastAppliedFocusNodeId&&this.simNodes.some(n=>n.id===this.focusNodeId)&&(this.lastAppliedFocusNodeId=this.focusNodeId,this.focusNode(this.focusNodeId)),this.updateFocusHalo();const pendingFocus=this.pendingGraphItemFocus;pendingFocus!==void 0&&(this.pendingGraphItemFocus=void 0,pendingFocus==="base"?this.renderRoot.querySelector('[part="canvas"], [part="svg"]')?.focus():this.focusGraphItemElement(pendingFocus))}applyInteractions(changed){if(!this.d3||this.renderer!=="svg")return;const svgEl=this.renderRoot.querySelector("svg"),reboundSurface=svgEl&&svgEl!==this.zoomedEl;if(svgEl&&reboundSurface){this.syncHostResizeObserver(),this.canvasHover=void 0,this.zoomedEl=svgEl,this.gEl=this.renderRoot.querySelector("g"),this.focusHaloEl=this.renderRoot.querySelector('[part="focus-halo"]');const bounds=this.effectiveZoomBounds,zoomBehavior=this.d3.zoom().scaleExtent([bounds.min,bounds.max]).on("start",()=>{this.isApplyingZoomTransform||(this.isPanning=!0,this.cancelCameraTween())}).on("zoom",event=>{this.gEl?.setAttribute("transform",event.transform.toString()),this.updateHitAreaZoomScale(event.transform.k),this.updateEdgeLabelZoomGate(event.transform.k),this.updateNodeLabelZoomGate(event.transform.k),this.scheduleViewportChange()}).on("end",()=>{this.isPanning=!1});this.zoomBehavior=zoomBehavior,this.d3.select(svgEl).call(zoomBehavior),this.updateHitAreaZoomScale(1),this.updateEdgeLabelZoomGate(1),this.updateNodeLabelZoomGate(1)}else if(this.zoomBehavior&&(changed.has("minZoom")||changed.has("maxZoom"))){const bounds=this.effectiveZoomBounds;this.zoomBehavior.scaleExtent([bounds.min,bounds.max])}if(changed.has("nodeLabels")&&this.zoomedEl&&this.updateNodeLabelZoomGate(this.d3.zoomTransform(this.zoomedEl).k),!(reboundSurface||changed.has("simNodes")||changed.has("simLinks")||changed.has("nodeTypes")||changed.has("withEdgeLabels")||changed.has("nodeLabels")||changed.has("communities")))return;const nodeEls=Array.from(this.renderRoot.querySelectorAll('[part="node"]'));this.nodeEls=nodeEls,this.nodeHitEls=Array.from(this.renderRoot.querySelectorAll('[data-hit-area="node"]')),this.nodeLabelEls=nodeEls.map(el=>el.parentElement?.querySelector('[part="label"]')??null),this.expandIndicatorEls=nodeEls.map(el=>el.parentElement?.querySelector('[part="expand-indicator"]')??null),this.linkEls=Array.from(this.renderRoot.querySelectorAll('[part="link"]:not([data-dangling])')),this.linkHitEls=Array.from(this.renderRoot.querySelectorAll('[data-hit-area="link"]')),this.linkLabelEls=this.linkEls.map(el=>el.parentElement?.querySelector('[part="link-label"]')??null),this.linkLabelHiddenByLength=[],this.danglingLinkEls=Array.from(this.renderRoot.querySelectorAll('[part="link"][data-dangling]')),this.communityHullEls=Array.from(this.renderRoot.querySelectorAll('[part="hull"]')),this.communityHullHitEls=Array.from(this.renderRoot.querySelectorAll('[data-hit-area="hull"]')),this.communityLabelEls=Array.from(this.renderRoot.querySelectorAll('[part="community-label"]')),this.layout!=="layered"&&nodeEls.forEach((el,i)=>{const id=this.simNodes[i]?.id;if(id!=null)for(const dragTarget of[el,this.nodeHitEls[i]])!dragTarget||this.boundNodeEls.has(dragTarget)||(this.boundNodeEls.add(dragTarget),this.d3.select(dragTarget).call(this.d3.drag().on("start",event=>{this.isDragging=!0,event.sourceEvent?.stopPropagation(),event.active||this.simulation?.alphaTarget(.3).restart();const n=this.simNodeById.get(id);n&&(n.fx=n.x,n.fy=n.y)}).on("drag",event=>{const n=this.simNodeById.get(id);n&&(n.fx=event.x,n.fy=event.y)}).on("end",event=>{this.isDragging=!1,event.active||this.simulation?.alphaTarget(0);const n=this.simNodeById.get(id);n&&(n.fx=null,n.fy=null)})))})}updateHitAreaZoomScale(zoom){const safeZoom=finiteRange(zoom,1,Number.EPSILON);this.gEl?.style.setProperty("--_lr-graph-hit-area-scale",String(1/safeZoom))}applyCanvasInteractions(){if(this.renderer!=="canvas"||!this.canvasEl)return;this.canvasEl!==this.zoomedEl&&(this.zoomedEl=this.canvasEl,this.setUpCanvasSurface());const bounds=this.effectiveZoomBounds;this.zoomBehavior?.scaleExtent([bounds.min,bounds.max]),this.markCanvasDirty()}onTick(){for(const l of this.danglingLinks){const source=l.source,target=l.target;target.x=(source.x??0)+STUB_OFFSET_PX,target.y=(source.y??0)+STUB_OFFSET_PX}for(const n of this.simNodes)n.x!=null&&n.y!=null&&this.lastPositionById.set(n.id,{x:n.x,y:n.y});this.simNodes.forEach((n,i)=>{const el=this.nodeEls[i];el&&(el.tagName==="circle"?(el.setAttribute("cx",String(n.x??0)),el.setAttribute("cy",String(n.y??0))):el.setAttribute("transform",`translate(${n.x??0},${n.y??0})`));const hit=this.nodeHitEls[i];hit&&(hit.setAttribute("x1",String((n.x??0)-NODE_HIT_SEGMENT_HALF)),hit.setAttribute("y1",String(n.y??0)),hit.setAttribute("x2",String((n.x??0)+NODE_HIT_SEGMENT_HALF)),hit.setAttribute("y2",String(n.y??0)));const label=this.nodeLabelEls[i];label&&(label.setAttribute("x",String((n.x??0)+this.nodeRadius(n)+2)),label.setAttribute("y",String(n.y??0)))}),this.simLinks.forEach((l,i)=>{const line=this.linkEls[i],coordinates=this.linkCoordinates(l);for(const target of[line,this.linkHitEls[i]])target&&(target.setAttribute("x1",String(coordinates.x1)),target.setAttribute("y1",String(coordinates.y1)),target.setAttribute("x2",String(coordinates.x2)),target.setAttribute("y2",String(coordinates.y2)))}),this.withEdgeLabels&&this.simLinks.forEach((l,i)=>{const labelEl=this.linkLabelEls[i];if(!labelEl)return;const label=ownGraphText(l,"label"),pos=this.edgeLabelPosition(l);labelEl.setAttribute("x",String(pos.x)),labelEl.setAttribute("y",String(pos.y));const{x1,y1,x2,y2}=this.linkCoordinates(l),edgeLength=Math.hypot(x2-x1,y2-y1),tooLong=this.edgeLabelWidth(label??"")>edgeLength*EDGE_LABEL_LENGTH_GATE_RATIO;this.linkLabelHiddenByLength[i]!==tooLong&&(this.linkLabelHiddenByLength[i]=tooLong,labelEl.setAttribute("visibility",tooLong?"hidden":"visible"))}),this.simNodes.forEach((n,i)=>{const indicator=this.expandIndicatorEls[i];indicator&&indicator.setAttribute("transform",`translate(${n.x??0},${n.y??0})`)}),this.danglingLinks.forEach((l,i)=>{const line=this.danglingLinkEls[i];if(!line)return;const coordinates=this.linkCoordinates(l);line.setAttribute("x1",String(coordinates.x1)),line.setAttribute("y1",String(coordinates.y1)),line.setAttribute("x2",String(coordinates.x2)),line.setAttribute("y2",String(coordinates.y2))}),this.updateFocusHalo(),this.visibleCommunities().forEach((entry,i)=>{const hullEl=this.communityHullEls[i],hullHitEl=this.communityHullHitEls[i],labelEl=this.communityLabelEls[i];if(!hullEl&&!hullHitEl&&!labelEl)return;const hull=this.communityHull(entry.members);hullEl&&hullEl.setAttribute("d",hullPathD(hull)),hullHitEl&&hullHitEl.setAttribute("d",hullPathD(hull)),labelEl&&(labelEl.setAttribute("x",String(hullCentroidX(hull))),labelEl.setAttribute("y",String(hullTopY(hull)-HULL_PADDING)))}),this.renderer==="canvas"&&this.markCanvasDirty(),this.scheduleViewportChange()}rebuildSimulation(){if(this.view!=="2d"||!this.d3)return;this.simulation?.stop(),this.boundNodeEls=new WeakSet;const liveIds=new Set(this.graphModel.nodes.map(n=>n.id));for(const id of this.lastPositionById.keys())liveIds.has(id)||this.lastPositionById.delete(id);const visible=this.visibleNodes();if(this.layout==="layered"){this.rebuildLayeredLayout(visible);return}const prevById=new Map(this.simNodes.map(n=>[n.id,n])),nodes=visible.map(n=>{const prev=prevById.get(n.id);if(prev)return{...prev,...n};const remembered=this.lastPositionById.get(n.id);return remembered?{...n,x:remembered.x,y:remembered.y}:{...n}}),byId=new Map(nodes.map(n=>[n.id,n])),{resolved:resolvedLinks,dangling:danglingLinks}=this.resolveLinksAgainst(byId),links=resolvedLinks;this.danglingLinks=danglingLinks;const seedForSpawn=this.safeSeed,incidentLinks=new Map;if(nodes.some(n=>n.x!=null))for(const l of resolvedLinks)for(const id of new Set([l.source.id,l.target.id])){const incident=incidentLinks.get(id);incident?incident.push(l):incidentLinks.set(id,[l])}for(const n of nodes){if(n.x!=null&&n.y!=null)continue;const neighborLink=incidentLinks.get(n.id)?.find(l=>{const source2=l.source,target2=l.target;return source2.id===n.id&&target2.x!=null||target2.id===n.id&&source2.x!=null});if(!neighborLink)continue;const source=neighborLink.source,target=neighborLink.target,neighbor=source.id===n.id?target:source,jitterRadius=this.safeLinkDistance/2,angle=seedForSpawn!=null?hashNodeSeed(seedForSpawn,n.id)/4294967296*Math.PI*2:Math.random()*Math.PI*2;n.x=(neighbor.x??0)+Math.cos(angle)*jitterRadius,n.y=(neighbor.y??0)+Math.sin(angle)*jitterRadius}if(seedForSpawn!=null)for(const n of nodes){if(n.x!=null&&n.y!=null)continue;const rng=mulberry32(hashNodeSeed(seedForSpawn,n.id));n.x=rng()*this.safeWidth,n.y=rng()*this.safeHeight}this.linkForce=this.d3.forceLink(links).distance(this.safeLinkDistance),this.chargeForce=this.d3.forceManyBody().strength(this.safeChargeStrength);const simulation=this.d3.forceSimulation(nodes).force("link",this.linkForce).force("charge",this.chargeForce).force("center",this.d3.forceCenter(this.safeWidth/2,this.safeHeight/2)).force("collide",this.d3.forceCollide().radius(n=>this.nodeRadius(n)+10)).on("tick",()=>this.onTick());if(this.simulation=simulation,prefersReducedMotion(this)||this.safeSeed!=null){const pinnedForSettle=new Set;for(const n of nodes)(prevById.has(n.id)||this.lastPositionById.has(n.id))&&n.x!=null&&n.y!=null&&n.fx==null&&n.fy==null&&(n.fx=n.x,n.fy=n.y,pinnedForSettle.add(n.id));for(simulation.stop();simulation.alpha()>simulation.alphaMin();)simulation.tick();for(const n of nodes)pinnedForSettle.has(n.id)&&(n.fx=null,n.fy=null)}this.simNodes=nodes,this.simNodeById=byId,this.simLinks=links;for(const n of nodes)n.x!=null&&n.y!=null&&this.lastPositionById.set(n.id,{x:n.x,y:n.y});this.announceHiddenNodeCount(nodes.length)}announceHiddenNodeCount(visibleNodeCount){const totalNodeCount=this.graphModel.nodes.length,hiddenNodeCount=totalNodeCount-visibleNodeCount;totalNodeCount>0&&(hiddenNodeCount>0||this.lastHiddenNodeCount>0)&&(this.graphLiveText=this.localize("graphNodesHidden",void 0,{hidden:getNumberFormat(this.effectiveLocale).format(hiddenNodeCount),total:getNumberFormat(this.effectiveLocale).format(totalNodeCount)})),this.lastHiddenNodeCount=hiddenNodeCount}rebuildLayeredLayout(visible){const boxes=visible.map(n=>{const r=this.nodeRadius(n);return{id:n.id,width:r*2,height:r*2}}),visibleIds=new Set(visible.map(n=>n.id)),edges=this.graphModel.links.filter(l=>visibleIds.has(l.source)&&visibleIds.has(l.target)).map(l=>({source:l.source,target:l.target})),{positions:raw}=layeredLayout({nodes:boxes,edges,options:{gapX:12,gapY:this.safeLinkDistance}}),bounds=extent(raw.values(),point=>point.x,point=>point.y),offsetX=raw.size?this.safeWidth/2-(bounds.minX+(bounds.maxX-bounds.minX)/2):this.safeWidth/2,offsetY=raw.size?this.safeHeight/2-(bounds.minY+(bounds.maxY-bounds.minY)/2):this.safeHeight/2,nodes=visible.map(n=>{const p=raw.get(n.id);return{...n,x:p.x+offsetX,y:p.y+offsetY}}),byId=new Map(nodes.map(n=>[n.id,n])),{resolved,dangling}=this.resolveLinksAgainst(byId);this.danglingLinks=dangling,this.simulation=void 0,this.simNodes=nodes,this.simNodeById=byId,this.simLinks=resolved;for(const n of nodes)n.x!=null&&n.y!=null&&this.lastPositionById.set(n.id,{x:n.x,y:n.y});this.announceHiddenNodeCount(nodes.length)}onNodeClick(node,e){const detail={nodeId:node.id,x:node.x??0,y:node.y??0};this.emit("lr-node-activate",{...detail}),this.emitSelectionIntent("node",node.id,!!(e?.ctrlKey||e?.metaKey))}getNodePosition(id){if(this.view!=="2d"){const position=this.spatial.position(id);return position?{x:position.x,y:position.y}:void 0}const node=this.simNodes.find(candidate=>candidate.id===id);if(!(!node||!Number.isFinite(node.x)||!Number.isFinite(node.y)))return{x:node.x,y:node.y}}getNodePosition3d(id){return this.view==="2d"?void 0:this.spatial.position(id)}getNodeScreenPosition(id){if(this.view!=="2d")return this.spatial.screenPosition(id);const position=this.getNodePosition(id);if(!position||!this.zoomedEl||!this.d3)return;const hostRect=this.getBoundingClientRect(),rect=this.zoomedEl.getBoundingClientRect(),camera=this.d3.zoomTransform(this.zoomedEl),x=position.x*camera.k+camera.x,y=position.y*camera.k+camera.y;if("getScreenCTM"in this.zoomedEl){const matrix=this.zoomedEl.getScreenCTM();return matrix?{x:matrix.a*x+matrix.c*y+matrix.e-hostRect.left,y:matrix.b*x+matrix.d*y+matrix.f-hostRect.top}:void 0}return{x:rect.left-hostRect.left+x,y:rect.top-hostRect.top+y}}onLinkClick(link,e){const source=typeof link.source=="object"?link.source.id:String(link.source),target=typeof link.target=="object"?link.target.id:String(link.target);this.emit("lr-edge-activate",{sourceNodeId:source,targetNodeId:target,...link.id?{edgeId:link.id}:{}}),this.emitSelectionIntent("link",this.linkKey(link),!!(e?.ctrlKey||e?.metaKey))}onNodeEnter(node,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.setAttribute("data-hovered",""),this.svgHoverNodeId=node.id,this.emit("lr-node-enter",{nodeId:node.id}))}onNodeLeave(node,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),this.svgHoverNodeId=void 0,this.emit("lr-node-leave",{nodeId:node.id}))}onNodeDblClick(node,e){e.stopPropagation(),this.emit("lr-node-expand",{nodeId:node.id})}onLinkEnter(link,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.setAttribute("data-hovered",""),this.emitEdgeHover("enter",this.linkHoverDetail(link)))}linkHoverDetail(link){const source=typeof link.source=="object"?link.source.id:String(link.source),target=typeof link.target=="object"?link.target.id:String(link.target);return{sourceNodeId:source,targetNodeId:target,...link.id?{edgeId:link.id}:{}}}onLinkLeave(link,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),this.emitEdgeHover("leave",this.linkHoverDetail(link)))}emitEdgeHover(phase,detail){this.emit(phase==="enter"?"lr-edge-enter":"lr-edge-leave",{...detail})}nodeAccessibleText(node){let text=ownGraphText(node,"accessibleLabel")||ownGraphText(node,"label")||node.id;const type=this.resolveNodeType(node),typeLabel=type?ownGraphText(type,"label"):void 0;return typeLabel!==void 0&&(text=this.localize("graphTypedNode",void 0,{label:text,type:typeLabel})),node.expandable&&(text=this.localize("graphExpandableItem",void 0,{item:text})),text}boundedGraphText(value){if(typeof value!="string")return"";const normalized=value.replace(/\s+/g," ").trim();return normalized.length>512?`${normalized.slice(0,512)}…`:normalized}nodeTooltipText(node){return this.boundedGraphText(ownGraphText(node,"description")||ownGraphText(node,"label")||ownGraphText(node,"accessibleLabel")||node.id)}linkAccessibleText(link){const accessibleLabel=ownGraphText(link,"accessibleLabel");if(accessibleLabel)return accessibleLabel;const sourceValue=ownGraphValue(link,"source"),targetValue=ownGraphValue(link,"target"),source=sourceValue!==null&&typeof sourceValue=="object"?this.nodeAccessibleText(sourceValue):typeof sourceValue=="string"?sourceValue:"",target=targetValue!==null&&typeof targetValue=="object"?this.nodeAccessibleText(targetValue):typeof targetValue=="string"?targetValue:"";return ownGraphText(link,"label")||this.localize("graphLink",void 0,{source,target})}linkTooltipText(link){return this.boundedGraphText(ownGraphText(link,"description")||ownGraphText(link,"label")||ownGraphText(link,"accessibleLabel")||this.linkAccessibleText(link))}linkCoordinates(link){const source=link.source,target=link.target,x1=source.x??0,y1=source.y??0,targetX=target.x??0,targetY=target.y??0;if(!link.directed||link.dangling)return{x1,y1,x2:targetX,y2:targetY};const dx=targetX-x1,dy=targetY-y1,distance=Math.hypot(dx,dy);if(distance===0)return{x1,y1,x2:targetX,y2:targetY};const inset=Math.min(this.nodeRadius(target),distance);return{x1,y1,x2:targetX-dx/distance*inset,y2:targetY-dy/distance*inset}}edgeLabelPosition(link){const{x1,y1,x2,y2}=this.linkCoordinates(link),dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy),mx=(x1+x2)/2,my=(y1+y2)/2;return len===0?{x:mx,y:my}:{x:mx+-dy/len*EDGE_LABEL_OFFSET_PX,y:my+dx/len*EDGE_LABEL_OFFSET_PX}}edgeLabelFontPx(){const raw=this.computedStyle().getPropertyValue("--lr-font-size-2xs").trim();return resolveCssTokenLength(raw,{host:this})??DEFAULT_EDGE_LABEL_FONT_PX}edgeLabelContext(){return this.edgeLabelMeasureCanvas?.ownerDocument!==this.ownerDocument&&(this.edgeLabelMeasureCanvas=this.ownerDocument.createElement("canvas"),this.edgeLabelMeasureCtx=this.edgeLabelMeasureCanvas.getContext("2d")),this.edgeLabelMeasureCtx??null}edgeLabelWidth(text){const cached=this.edgeLabelWidthCache.get(text);if(cached!=null)return cached;const ctx=this.edgeLabelContext();let width;if(ctx){const fontFamily=this.computedStyle().getPropertyValue("--lr-font").trim()||"sans-serif";ctx.font=`${this.edgeLabelFontPx()}px ${fontFamily}`,width=ctx.measureText(text).width}else width=text.length*this.edgeLabelFontPx()*.6;if(this.edgeLabelWidthCache.size>=EDGE_LABEL_WIDTH_CACHE_MAX){const oldest=this.edgeLabelWidthCache.keys().next().value;oldest!==void 0&&this.edgeLabelWidthCache.delete(oldest)}return this.edgeLabelWidthCache.set(text,width),width}updateEdgeLabelZoomGate(k){this.gEl&&(k<this.safeEdgeLabelMinZoom?this.gEl.setAttribute("data-edge-labels-hidden",""):this.gEl.removeAttribute("data-edge-labels-hidden"))}updateNodeLabelZoomGate(k){this.gEl&&(this.resolvedNodeLabelsMode==="zoom"&&k<NODE_LABEL_MIN_ZOOM?this.gEl.setAttribute("data-node-labels-hidden",""):this.gEl.removeAttribute("data-node-labels-hidden"))}linkIndexBase(){return this.simNodes.length}communityIndexBase(){return this.linkIndexBase()+this.navigableLinks().length}graphItemCount(){return this.communityIndexBase()+this.visibleCommunities().length}normalizedGraphItem(index=this.activeGraphItem){const count=this.graphItemCount();return count?Math.min(Math.max(index,0),count-1):-1}graphItemIdentity(index){if(index<0)return;if(index<this.linkIndexBase()){const node=this.simNodes[index];return node?{kind:"node",id:node.id}:void 0}if(index<this.communityIndexBase()){const link=this.navigableLinks()[index-this.linkIndexBase()];return link?{kind:"link",id:this.linkKey(link)}:void 0}const community=this.visibleCommunities()[index-this.communityIndexBase()]?.community;return community?{kind:"community",id:community.id}:void 0}graphItemIndex(identity){if(identity.kind==="node")return this.simNodes.findIndex(node=>node.id===identity.id);if(identity.kind==="link"){const index2=this.navigableLinks().findIndex(link=>this.linkKey(link)===identity.id);return index2<0?-1:this.linkIndexBase()+index2}const index=this.visibleCommunities().findIndex(entry=>entry.community.id===identity.id);return index<0?-1:this.communityIndexBase()+index}communityText(community){return ownGraphText(community,"label")??community.id}graphItemText(index){if(index<this.linkIndexBase()){const node=this.simNodes[index];return node?this.localize("graphNode",void 0,{label:this.nodeTooltipText(node)}):""}if(index<this.communityIndexBase()){const link=this.navigableLinks()[index-this.linkIndexBase()];return link?this.linkTooltipText(link):""}const entry=this.visibleCommunities()[index-this.communityIndexBase()];return entry?this.localize("graphCommunity",void 0,{label:this.communityText(entry.community),count:getNumberFormat(this.effectiveLocale).format(entry.members.length)}):""}graphItemAnnouncement(index){return this.localize("graphItemAnnouncement",void 0,{item:this.graphItemText(index),index:getNumberFormat(this.effectiveLocale).format(index+1),total:getNumberFormat(this.effectiveLocale).format(this.graphItemCount())})}onGraphItemFocus(index){this.normalizedGraphItem(index)<0||(this.activeGraphItem=index,this.graphLiveText=this.graphItemAnnouncement(index))}focusGraphItem(index){const normalized=this.normalizedGraphItem(index);normalized<0||(this.activeGraphItem=normalized,this.graphLiveText=this.graphItemAnnouncement(normalized),this.updateComplete.then(()=>this.focusGraphItemElement(normalized)))}focusGraphItemElement(index){if(this.renderer==="canvas"){this.renderRoot.querySelector('[part="cursor-item"]')?.focus(),this.scheduleCanvasDraw();return}[...this.renderRoot.querySelectorAll('[part="node"]'),...this.renderRoot.querySelectorAll('[part="link"][tabindex]'),...this.renderRoot.querySelectorAll('[part="hull"]')][index]?.focus()}onGraphKeyDown(e,index,activate){if(e.key==="Enter"||e.key===" "){if(e.preventDefault(),e.repeat)return;if(this.onGraphItemFocus(index),activate(e),index<this.simNodes.length){const now=this.ownerWindow?.performance.now()??0;if(this.lastKeyActivateIndex===index&&now-this.lastKeyActivateTime<=EXPAND_KEY_INTERVAL_MS){const node=this.simNodes[index];node&&this.emit("lr-node-expand",{nodeId:node.id}),this.lastKeyActivateIndex=null}else this.lastKeyActivateIndex=index,this.lastKeyActivateTime=now}return}const count=this.graphItemCount();if(!count)return;const rtl=isRtl(this),forwardKey=rtl?"ArrowLeft":"ArrowRight",backwardKey=rtl?"ArrowRight":"ArrowLeft";let next=index;if(e.key===forwardKey||e.key==="ArrowDown")next=Math.min(count-1,index+1);else if(e.key===backwardKey||e.key==="ArrowUp")next=Math.max(0,index-1);else if(e.key==="Home")next=0;else if(e.key==="End")next=count-1;else return;e.preventDefault(),this.focusGraphItem(next)}render(){const nodeLimit=publicCollectionTruncation(this,"nodes"),edgeLimit=publicCollectionTruncation(this,"edges"),limitNotices=html`${nodeLimit?html`<p part="limit" role="note">${this.localize("graphNodeLimit",void 0,{shown:getNumberFormat(this.effectiveLocale).format(nodeLimit.retained),total:getNumberFormat(this.effectiveLocale).format(nodeLimit.source)})}</p>`:nothing}${edgeLimit?html`<p part="limit" role="note">${this.localize("graphEdgeLimit",void 0,{shown:getNumberFormat(this.effectiveLocale).format(edgeLimit.retained),total:getNumberFormat(this.effectiveLocale).format(edgeLimit.source)})}</p>`:nothing}`;if(this.view!=="2d")return this.spatial.render(limitNotices);if(this.loading)return html`
1
+ import{__decorate}from"tslib";import{GraphSourceCompositionController}from"./graph-source-composition.js";import{tag}from"../../../internal/prefix.js";import{GraphSourceController}from"./graph-source-controller.js";import{SourcePageController}from"../../../internal/source-page-controller.js";import{sourceCount,sourceRevision}from"../../../internal/source-request-controller.js";import"../../data/pagination/pagination.class.js";import{collectionSupport,publicCollectionTruncation}from"../../../internal/collection-snapshot.js";import{html,nothing,svg}from"lit";import{property,state,query}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{fitTransform}from"../../../internal/fit-transform.js";import{specialistTokens}from"../../../internal/specialist-host-tokens.styles.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{isRtl}from"../../../internal/rtl.js";import{literalSetConverter}from"../../../internal/converters.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{styles}from"./graph.styles.js";import{loadD3}from"./graph-loader.js";import{convexHull,hullPathD,hullCentroidX,hullTopY}from"./graph-hull.js";import{EXPAND_BADGE_OFFSET,EXPAND_BADGE_R,drawGraphScene,drawPickingScene,pickColorToIndex,shapeHalfSide}from"./graph-canvas.js";import{normalizeGraphCamera,spatialNodePosition}from"./graph-spatial-model.js";import{finiteNumber,finiteRange,finiteInteger,extent}from"../../../internal/numbers.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{devWarnOnce}from"../../../internal/dev-warning.js";import{copyGraphLinkIdentity,graphLengthConverter,graphLinkIdentity,normalizeGraphModel}from"./graph-model.js";import{canonicalIdentityList}from"../retrieval-identity.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_graphCommunity,LYRA_DEFAULT_graphDataList,LYRA_DEFAULT_graphDataListLimit,LYRA_DEFAULT_graphDiagram,LYRA_DEFAULT_graphEdgeLimit,LYRA_DEFAULT_graphExpandableItem,LYRA_DEFAULT_graphFit,LYRA_DEFAULT_graphItemAnnouncement,LYRA_DEFAULT_graphLink,LYRA_DEFAULT_graphMissingLibrary,LYRA_DEFAULT_graphNode,LYRA_DEFAULT_graphNodeFocused,LYRA_DEFAULT_graphNodeLimit,LYRA_DEFAULT_graphNodesHidden,LYRA_DEFAULT_graphOrbitDown,LYRA_DEFAULT_graphOrbitLeft,LYRA_DEFAULT_graphOrbitRight,LYRA_DEFAULT_graphOrbitUp,LYRA_DEFAULT_graphSelectionCount,LYRA_DEFAULT_graphSpatialControls,LYRA_DEFAULT_graphSpatialInstructions,LYRA_DEFAULT_graphSpatialPage,LYRA_DEFAULT_graphSpatialUnavailable,LYRA_DEFAULT_graphTypedNode,LYRA_DEFAULT_graphView3d,LYRA_DEFAULT_graphViewList}from"../../../internal/default-strings/retrieval.generated.js";import{LYRA_DEFAULT_graphSourceAllRecords,LYRA_DEFAULT_graphSourceBothDirections,LYRA_DEFAULT_graphSourceCoverageAggregate,LYRA_DEFAULT_graphSourceCoverageComplete,LYRA_DEFAULT_graphSourceCoverageNeighborhood,LYRA_DEFAULT_graphSourceDirection,LYRA_DEFAULT_graphSourceEdges,LYRA_DEFAULT_graphSourceIncidentEdges,LYRA_DEFAULT_graphSourceNodes,LYRA_DEFAULT_graphSourceRecordMissing,LYRA_DEFAULT_graphSourceRecords,LYRA_DEFAULT_graphSourceRecordsError,LYRA_DEFAULT_graphSourceSceneError,LYRA_DEFAULT_graphSourceTotals,LYRA_DEFAULT_loading,LYRA_DEFAULT_neighborDirectionIn,LYRA_DEFAULT_neighborDirectionOut,LYRA_DEFAULT_next,LYRA_DEFAULT_noData,LYRA_DEFAULT_previous,LYRA_DEFAULT_retry,LYRA_DEFAULT_search,LYRA_DEFAULT_zoomIn,LYRA_DEFAULT_zoomOut}from"../../../internal/default-strings/shared.generated.js";const EMPTY_SOURCE_QUERY=Object.freeze({kind:"nodes",search:"",centerKey:null,direction:"both",nodeTypes:Object.freeze([])});function graphSourceField(value,key){if(value===null||typeof value!="object")throw new TypeError("Invalid graph record");const descriptor=Object.getOwnPropertyDescriptor(value,key);if(descriptor&&!("value"in descriptor))throw new TypeError("Accessor graph record");return descriptor?.value}function graphSourceRows(raw,limit){if(!Array.isArray(raw))throw new TypeError("Invalid graph records");const length=sourceCount(graphSourceField(raw,"length"));if(length>limit)throw new RangeError("Graph record limit exceeded");let units=0;const text=(value,required=!1)=>{if(!(value===void 0&&!required)){if(typeof value!="string"||required&&!value.length||value.length>65536||(units+=value.length)>2e6)throw new TypeError("Invalid graph record text");return value}},rows=[];for(let index=0;index<length;index++){const entry=graphSourceField(raw,index),key=text(graphSourceField(entry,"key"),!0),order=sourceCount(graphSourceField(entry,"order")),record=graphSourceField(entry,"value"),kind=graphSourceField(record,"kind");if(kind!=="node"&&kind!=="edge")throw new TypeError("Invalid graph record kind");const rawValue=graphSourceField(record,"value"),id=text(graphSourceField(rawValue,"id"),!0);if(key!==`${kind}:${id}`)throw new TypeError("Invalid graph record identity");const label=text(graphSourceField(rawValue,"label")),accessibleLabel=text(graphSourceField(rawValue,"accessibleLabel")),description=text(graphSourceField(rawValue,"description")),fields={id,...label===void 0?{}:{label},...accessibleLabel===void 0?{}:{accessibleLabel},...description===void 0?{}:{description}},value=Object.freeze(kind==="node"?{kind,value:Object.freeze({...fields,type:text(graphSourceField(rawValue,"type")),communityId:text(graphSourceField(rawValue,"communityId"))})}:{kind,value:Object.freeze({...fields,source:text(graphSourceField(rawValue,"source"),!0),target:text(graphSourceField(rawValue,"target"),!0)})});rows.push(Object.freeze({key,order,value}))}return Object.freeze(rows)}function graphSourceSummary(raw){return Object.freeze({nodes:sourceCount(graphSourceField(raw,"nodes")),edges:sourceCount(graphSourceField(raw,"edges"))})}const GRAPH_LAYOUT=literalSetConverter(["force","layered"],"force"),GRAPH_VIEW=literalSetConverter(["2d","3d","list"],"2d"),STUB_OFFSET_PX=14,EDGE_LABEL_OFFSET_PX=4,DEFAULT_EDGE_LABEL_FONT_PX=10,EDGE_LABEL_LENGTH_GATE_RATIO=.85,EDGE_LABEL_WIDTH_CACHE_MAX=512,EXPAND_KEY_INTERVAL_MS=500,FOCUS_HALO_PADDING=6,HULL_PADDING=24,NODE_LABEL_MIN_ZOOM=.5,NODE_HIT_SEGMENT_HALF=.5;function ownGraphText(value,property2){const descriptor=getOwnDataDescriptor(value,property2);return descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof descriptor.value!="string"?void 0:descriptor.value}function ownGraphValue(value,property2){const descriptor=getOwnDataDescriptor(value,property2);return descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR?void 0:descriptor.value}function mulberry32(seed){let a=seed>>>0;return()=>{a=a+1831565813|0;let t=Math.imul(a^a>>>15,a|1);return t=t+Math.imul(t^t>>>7,t|61)^t,((t^t>>>14)>>>0)/4294967296}}function hashNodeSeed(seed,id){let h=seed>>>0;for(let i=0;i<id.length;i++)h=Math.imul(h^id.charCodeAt(i),2654435761),h^=h>>>15;return h>>>0}const MIN_RADIUS=6,MAX_RADIUS=24;function sanitizeNodeColor(color){return sanitizeCssColor(color)}function normalizeLinkDash(dash){if(!(!dash?.length||dash.some(value=>!Number.isFinite(value)||value<0)))return dash.join(" ")}function categoricalPaletteColor(index){return`var(--lr-graph-cat-${index%8+1})`}function squarePath(r){const s=shapeHalfSide(r);return`M ${-s} ${-s} L ${s} ${-s} L ${s} ${s} L ${-s} ${s} Z`}function diamondPath(r){const d=shapeHalfSide(r)*Math.SQRT2;return`M 0 ${-d} L ${d} 0 L 0 ${d} L ${-d} 0 Z`}function sameIds(a,b){return a===b?!0:!a||!b||a.length!==b.length?!1:a.every((id,index)=>id===b[index])}const identitySets=new WeakMap;function identitySet(values){const ids=canonicalIdentityList(values);let set=identitySets.get(ids);return set||identitySets.set(ids,set=new Set(ids)),set}class LyraGraph extends LyraElement{static{this.defaultStrings={...super.defaultStrings,graphCommunity:LYRA_DEFAULT_graphCommunity,graphDataList:LYRA_DEFAULT_graphDataList,graphDataListLimit:LYRA_DEFAULT_graphDataListLimit,graphDiagram:LYRA_DEFAULT_graphDiagram,graphEdgeLimit:LYRA_DEFAULT_graphEdgeLimit,graphExpandableItem:LYRA_DEFAULT_graphExpandableItem,graphFit:LYRA_DEFAULT_graphFit,graphItemAnnouncement:LYRA_DEFAULT_graphItemAnnouncement,graphLink:LYRA_DEFAULT_graphLink,graphMissingLibrary:LYRA_DEFAULT_graphMissingLibrary,graphNode:LYRA_DEFAULT_graphNode,graphNodeFocused:LYRA_DEFAULT_graphNodeFocused,graphNodeLimit:LYRA_DEFAULT_graphNodeLimit,graphNodesHidden:LYRA_DEFAULT_graphNodesHidden,graphOrbitDown:LYRA_DEFAULT_graphOrbitDown,graphOrbitLeft:LYRA_DEFAULT_graphOrbitLeft,graphOrbitRight:LYRA_DEFAULT_graphOrbitRight,graphOrbitUp:LYRA_DEFAULT_graphOrbitUp,graphSelectionCount:LYRA_DEFAULT_graphSelectionCount,graphSourceAllRecords:LYRA_DEFAULT_graphSourceAllRecords,graphSourceBothDirections:LYRA_DEFAULT_graphSourceBothDirections,graphSourceCoverageAggregate:LYRA_DEFAULT_graphSourceCoverageAggregate,graphSourceCoverageComplete:LYRA_DEFAULT_graphSourceCoverageComplete,graphSourceCoverageNeighborhood:LYRA_DEFAULT_graphSourceCoverageNeighborhood,graphSourceDirection:LYRA_DEFAULT_graphSourceDirection,graphSourceEdges:LYRA_DEFAULT_graphSourceEdges,graphSourceIncidentEdges:LYRA_DEFAULT_graphSourceIncidentEdges,graphSourceNodes:LYRA_DEFAULT_graphSourceNodes,graphSourceRecordMissing:LYRA_DEFAULT_graphSourceRecordMissing,graphSourceRecords:LYRA_DEFAULT_graphSourceRecords,graphSourceRecordsError:LYRA_DEFAULT_graphSourceRecordsError,graphSourceSceneError:LYRA_DEFAULT_graphSourceSceneError,graphSourceTotals:LYRA_DEFAULT_graphSourceTotals,graphSpatialControls:LYRA_DEFAULT_graphSpatialControls,graphSpatialInstructions:LYRA_DEFAULT_graphSpatialInstructions,graphSpatialPage:LYRA_DEFAULT_graphSpatialPage,graphSpatialUnavailable:LYRA_DEFAULT_graphSpatialUnavailable,graphTypedNode:LYRA_DEFAULT_graphTypedNode,graphView3d:LYRA_DEFAULT_graphView3d,graphViewList:LYRA_DEFAULT_graphViewList,loading:LYRA_DEFAULT_loading,neighborDirectionIn:LYRA_DEFAULT_neighborDirectionIn,neighborDirectionOut:LYRA_DEFAULT_neighborDirectionOut,next:LYRA_DEFAULT_next,noData:LYRA_DEFAULT_noData,previous:LYRA_DEFAULT_previous,retry:LYRA_DEFAULT_retry,search:LYRA_DEFAULT_search,zoomIn:LYRA_DEFAULT_zoomIn,zoomOut:LYRA_DEFAULT_zoomOut}}static{this.collectionSupport=collectionSupport}static{this.identityCollectionObjectProperties=Object.freeze(["graphSource"])}static{this.ownedCollectionProperties=Object.freeze(["nodes","edges","nodeTypes","hiddenTypes","communities","selectedNodeIds","selectedEdgeIds","dimmedNodeIds","dimmedEdgeIds"])}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}static{this.styles=[LyraElement.styles,specialistTokens,styles,srOnly]}static{this.immutableEventDetails=Object.freeze(["lr-selection-change"])}publishSourceComposition(){const profile=this.sourceComposition.profile;if(!profile||!this.sourceMode)return;const state2=this.sourcePages.state,signature=[profile,state2,this.sourceQuery,this.sourcePage,this.sourceEpoch,this.sourceBindingError];if(this.compositionPublished&&signature.every((value,index)=>value===this.compositionPublished[index]))return;this.compositionPublished=signature;const currentSource=this.sourceAuthority(),current=()=>currentSource()&&this.sourceComposition.profile===profile&&this.sourcePages.state===state2;current()&&profile.accepted(Object.freeze({query:this.sourceQuery,page:finiteInteger(this.sourcePage,0,0,Number.MAX_SAFE_INTEGER),pageSize:finiteInteger(this.sourcePageSize,100,1,500),total:this.sourceTotal,current}))}get graphSource(){return this._graphSource}set graphSource(value){const previous=this._graphSource;this._graphSource=value,this.sourceEpoch++,this.sourceNavigation++,this.requestUpdate("graphSource",previous)}get sourceTotal(){return this.sourceMode&&this.sourceComposition.profile?.empty?0:this.sourceMode&&!this.sourceBindingError?this.sourcePages.state.result?.total??null:null}get sourceMode(){return this.graphSource!==void 0}get sourceList(){return this.sourceMode&&this.view==="list"}get sourceRows(){return this.sourceBindingError?[]:this.sourcePages.state.result?.rows??[]}get sourceDiagramBlocked(){return this.sourceMode&&(!!this.sourceBindingError||!this.sourceScene.state.scene)}paintGraph(){this.sourcePaint++}assertSourceTotals(summary){const scene=this.sourceScene.state.scene;if(scene&&(scene.total.nodes!==summary.nodes||scene.total.edges!==summary.edges))throw new TypeError("Inconsistent graph totals")}syncGraphSource(){if(!this.sourcePages||!this.sourceScene||this.sourceSyncing)return;this.sourceSyncing=!0;const epoch=this.sourceEpoch;try{if(!this.sourceMode||this.sourceComposition.profile?.empty){this.sourceInputs&&(this.sourcePages.bind(void 0),this.sourceScene.bind(void 0),this.sourceInputs=void 0,this.sourcePageInputs=void 0,this.sourceModel=void 0,this.sourceModelScene=void 0,this.sourceBindingError=void 0,this.sourceModelVersion++,this.lastPositionById.clear());return}const source=this.graphSource;if(!source||typeof source!="object")throw new TypeError("Invalid graph source");const revision=sourceRevision(source.revision),records=source.records;if(!records||sourceRevision(records.revision)!==revision)throw new TypeError("Invalid graph records source");const locale=this.effectiveLocale;if(epoch!==this.sourceEpoch||source!==this.graphSource)return;const inputs=[source,revision,records,epoch,locale];if(!this.sourceInputs||inputs.some((value,index)=>value!==this.sourceInputs[index])){this.sourceNavigation++,this.cancelCameraTween(),this.simulation?.stop(),this.sourceBindingError=void 0,this.sourceMissing=!1,this.sourcePageInputs=void 0;const current=()=>this.sourceEpoch===epoch&&this.graphSource===source&&source.revision===revision&&source.records===records&&records.revision===revision,check=()=>{if(!current())throw new Error("Graph source revoked")},wrapped={revision,query:async request=>{const raw=await records.query(request);if(check(),graphSourceField(raw,"groups")!==void 0||graphSourceField(raw,"tags")!==void 0)throw new TypeError("Unexpected graph metadata");const result={rows:graphSourceRows(graphSourceField(raw,"rows"),request.pageSize),total:sourceCount(graphSourceField(raw,"total")),summary:graphSourceSummary(graphSourceField(raw,"summary"))};return check(),result},lookup:async(keys,context)=>{if(keys.length>32)throw new RangeError("Graph reservation limit exceeded");const raw=await records.lookup(keys,context);check();const rows=graphSourceRows(raw,keys.length);return check(),rows},locate:async(key,query2,context)=>{const result=await records.locate(key,query2,context);return check(),result}};if(!this.sourceScene.bind({source,epoch,locale})||epoch!==this.sourceEpoch||source!==this.graphSource||(this.sourcePages.bind({source:wrapped,revision,epoch,locale}),epoch!==this.sourceEpoch||source!==this.graphSource))return;this.sourceInputs=inputs,this.lastPositionById.clear(),this.sourceModel=void 0,this.sourceModelScene=void 0,this.sourceModelVersion++,this.view!=="list"&&this.sourceScene.request({mode:"neighborhood",centerKey:this.sourceCenter,bounds:null,includeKeys:this.sourceKeys})}const size=finiteInteger(this.sourcePageSize,100,1,500);let page=finiteInteger(this.sourcePage,0,0,Math.floor(Number.MAX_SAFE_INTEGER/size));this.sourcePageInputs&&this.sourcePageInputs[1]!==size&&(page=0,this.sourcePage=0);const pageInputs=[page,size,this.sourceQuery];(!this.sourcePageInputs||pageInputs.some((value,index)=>value!==this.sourcePageInputs[index]))&&(this.sourcePageInputs=pageInputs,this.sourceMissing=!1,this.sourcePagePromise=this.sourcePages.request(this.sourceQuery,page,size))}catch(error){epoch===this.sourceEpoch&&(this.sourcePages.bind(void 0),this.sourceScene.bind(void 0),epoch===this.sourceEpoch&&(this.sourceBindingError=error,this.sourceInputs=void 0,this.sourceState++))}finally{this.sourceSyncing=!1,epoch!==this.sourceEpoch&&queueMicrotask(()=>{this.isConnected&&this.sourceState++})}}sourceAuthority(){const source=this.graphSource,epoch=this.sourceEpoch,owner=this.ownerDocument,navigation=this.sourceNavigation,revision=source?.revision;return()=>source?.revision===revision&&this.isConnected&&this.ownerDocument===owner&&this.graphSource===source&&this.sourceEpoch===epoch&&this.sourceNavigation===navigation}setSourceQuery(query2){this.sourceNavigation++,this.sourceQuery=Object.freeze({...query2,nodeTypes:Object.freeze([...query2.nodeTypes])}),this.sourceSyncing=!0,this.sourcePage=0,this.sourceSyncing=!1,this.sourcePageInputs=void 0,this.syncGraphSource(),this.sourceState++}async revealSourceKey(key){return this.revealSourceRecord(key,!0)}async revealSourceRecord(key,focus){if(!this.sourceMode||typeof key!="string"||key.length>65536||!/^(node|edge):.+/s.test(key))return!1;this.setSourceQuery({...EMPTY_SOURCE_QUERY,kind:key.startsWith("node:")?"nodes":"edges"});const current=this.sourceAuthority();if(await this.sourcePagePromise,!current())return!1;const index=await this.sourcePages.locate(key);if(!current())return!1;if(index===null)return this.sourceMissing=!0,this.sourceState++,!1;if(this.sourceSyncing=!0,this.sourcePage=Math.floor(index/finiteInteger(this.sourcePageSize,100,1,500)),this.sourceSyncing=!1,this.syncGraphSource(),await this.sourcePagePromise,!current()||(this.sourceRovingKey=key,this.sourceRestoreFocus=!1,this.sourceState++,await this.updateComplete,!current()))return!1;const target=[...this.renderRoot.querySelectorAll("[data-source-key]")].find(row=>row.dataset.sourceKey===key);return target?(target.scrollIntoView({block:"nearest"}),focus&&target.focus(),!0):!1}async ensureSourceScene(key,current){const records=await this.sourcePages.resolveSelection([key]);if(!current()||!records)return;const record=records.find(row=>row.key===key);if(!record){this.sourceMissing=!0,this.sourceState++;return}const keys=new Set([key]);record.value.kind==="edge"?(keys.add(`node:${record.value.value.source}`),keys.add(`node:${record.value.value.target}`),this.sourceCenter=`node:${record.value.value.source}`):this.sourceCenter=key;for(const id of canonicalIdentityList(this.selectedNodeIds)){if(keys.size===32)break;keys.add(`node:${id}`)}for(const id of canonicalIdentityList(this.selectedEdgeIds)){if(keys.size===32)break;keys.add(`edge:${id}`)}if(this.sourceKeys=Object.freeze([...keys]),!await this.sourceScene.request({mode:"neighborhood",centerKey:this.sourceCenter,bounds:null,includeKeys:this.sourceKeys})||!current())return;const scene=this.sourceScene.state.scene;if((record.value.kind==="node"?scene.nodes:scene.edges).some(item=>item.key===key))return this.sourceState++,await this.updateComplete,current()?record:void 0}async activateSourceRecord(record,event){if(!this.sourceRows.includes(record)||this.sourcePages.state.pending||this.sourceBindingError)return;this.sourceNavigation++;const current=this.sourceAuthority(),nodes=this.selectedNodeIds,edges=this.selectedEdgeIds,toggle=event.ctrlKey||event.metaKey,accepted=await this.ensureSourceScene(record.key,current);if(!(!accepted||!current()||nodes!==this.selectedNodeIds||edges!==this.selectedEdgeIds))if(accepted.value.kind==="node"){const value=accepted.value.value,position=this.sourceScene.state.scene?.nodes.find(node=>node.key===record.key)?.value.position??{x:0,y:0,z:0};this.emit("lr-node-activate",{nodeId:value.id,...position}),current()&&nodes===this.selectedNodeIds&&edges===this.selectedEdgeIds&&this.emitSelectionIntent("node",value.id,toggle)}else{const value=accepted.value.value;this.emit("lr-edge-activate",{sourceNodeId:value.source,targetNodeId:value.target,edgeId:value.id}),current()&&nodes===this.selectedNodeIds&&edges===this.selectedEdgeIds&&this.emitSelectionIntent("link",value.id,toggle)}}onSourceRowKey(event){const rows=[...this.renderRoot.querySelectorAll("[data-source-key]")],index=rows.indexOf(event.currentTarget),forward=this.effectiveDirection==="rtl"?"ArrowLeft":"ArrowRight",backward=this.effectiveDirection==="rtl"?"ArrowRight":"ArrowLeft",next=event.key==="Home"?0:event.key==="End"?rows.length-1:event.key==="ArrowDown"||event.key===forward?Math.min(rows.length-1,index+1):event.key==="ArrowUp"||event.key===backward?Math.max(0,index-1):-1;next<0||rows[next]?.disabled||rows[next]?.closest("[inert]")||(event.preventDefault(),this.sourceRovingKey=rows[next].dataset.sourceKey,this.sourceState++,rows[next].focus())}renderSourceNavigator(){const state2=this.sourcePages.state,current=this.sourceAuthority(),bindingError=this.sourceBindingError,currentPage=()=>current()&&this.sourcePages.state===state2&&this.sourceBindingError===bindingError,failed=!!this.sourceBindingError||!!state2.error||!!state2.selectionError,rows=this.sourceRows,active=rows.some(row=>row.key===this.sourceRovingKey)?this.sourceRovingKey:rows[0]?.key,summary=state2.result?.summary,scene=this.sourceScene.state.scene,format=value=>getNumberFormat(this.effectiveLocale,{useGrouping:!1}).format(value),values=summary?{nodes:format(summary.nodes),edges:format(summary.edges),shownNodes:format(scene?.nodes.length??0),shownEdges:format(scene?.edges.length??0)}:void 0,stop=event=>event.stopPropagation();return html`<section part="source-navigator" aria-label=${this.accessibleLabel??this.label??this.localize("graphSourceRecords")} aria-busy=${state2.pending?"true":"false"} tabindex="-1">
2
+ <div class="source-toolbar">
3
+ <select data-source-kind aria-label=${this.localize("graphSourceRecords")} .value=${this.sourceQuery.kind} @change=${event=>this.setSourceQuery({...this.sourceQuery,kind:event.target.value==="edges"?"edges":"nodes"})}>
4
+ <option value="nodes">${this.localize("graphSourceNodes")}</option><option value="edges">${this.localize("graphSourceEdges")}</option>
5
+ </select>
6
+ ${this.sourceComposition.profile?nothing:html`<input data-source-search type="search" aria-label=${this.localize("search")} .value=${this.sourceQuery.search} @input=${event=>this.setSourceQuery({...this.sourceQuery,search:event.target.value.slice(0,65536)})}>`}
7
+ ${this.sourceQuery.centerKey?html`<button type="button" @click=${()=>this.setSourceQuery({...this.sourceQuery,centerKey:null,direction:"both"})}>${this.localize("graphSourceAllRecords")}</button>
8
+ <select aria-label=${this.localize("graphSourceDirection")} .value=${this.sourceQuery.direction} @change=${event=>{const value=event.target.value;this.setSourceQuery({...this.sourceQuery,direction:value==="in"||value==="out"?value:"both"})}}>
9
+ <option value="both">${this.localize("graphSourceBothDirections")}</option><option value="in">${this.localize("neighborDirectionIn")}</option><option value="out">${this.localize("neighborDirectionOut")}</option>
10
+ </select>`:nothing}
11
+ </div>
12
+ ${values?html`<p part="source-coverage">${this.localize(scene?scene.coverage==="complete"?"graphSourceCoverageComplete":scene.coverage==="aggregate"?"graphSourceCoverageAggregate":"graphSourceCoverageNeighborhood":"graphSourceTotals",void 0,values)}</p>`:nothing}
13
+ ${failed||state2.pending||this.sourceMissing?html`<p part="source-status">${this.localize(failed?"graphSourceRecordsError":state2.pending?"loading":"graphSourceRecordMissing")}</p>`:nothing}
14
+ ${failed?html`<button type="button" @click=${()=>{currentPage()&&this.requestUpdate()}}>${this.localize("retry")}</button>`:nothing}
15
+ ${!failed&&!state2.pending?html`<ul class="source-rows">${rows.length?rows.map(record=>{const value=record.value.value,label=value.accessibleLabel||value.label||value.id,selected=this.isSelected(record.value.kind==="node"?"node":"link",value.id);return html`<li><button type="button" part=${`source-row${active===record.key?" source-row-active":""}`} data-source-key=${record.key}
16
+ tabindex=${active===record.key?"0":"-1"} aria-pressed=${this.selectionMode==="none"?nothing:selected?"true":"false"}
17
+ @keydown=${this.onSourceRowKey} @click=${event=>this.activateSourceRecord(record,event)}>${label}</button>
18
+ ${record.value.kind==="node"?html`<button type="button" data-source-incident=${record.key} aria-label=${this.localize("graphSourceIncidentEdges",void 0,{label})}
19
+ @click=${()=>{currentPage()&&!state2.pending&&!bindingError&&this.sourceRows.includes(record)&&this.setSourceQuery({...EMPTY_SOURCE_QUERY,kind:"edges",centerKey:record.key})}}>${this.localize("graphSourceIncidentEdges",void 0,{label})}</button>`:nothing}</li>`}):html`<li>${this.localize("noData")}</li>`}</ul>`:nothing}
20
+ <lr-pagination format="compact" with-edges .page=${finiteInteger(this.sourcePage,0,0,Number.MAX_SAFE_INTEGER-1)+1}
21
+ .pageSize=${finiteInteger(this.sourcePageSize,100,1,500)} .total=${this.sourceTotal??-1} .disabled=${failed||state2.pending||this.sourceTotal===null}
22
+ .strings=${this.strings} @lr-page-change=${event=>{event.stopPropagation(),this.sourcePage=event.detail.page-1}}
23
+ @lr-before-page-change=${stop} @lr-activate=${stop} @focus=${stop} @blur=${stop}></lr-pagination>
24
+ </section>`}get graphModel(){if(this.sourceMode){if(!this.sourceModel){const scene=this.sourceBindingError?void 0:this.sourceScene.state.scene,nodes=Object.freeze(scene?.nodes.map(entry=>entry.value)??[]),ids=new Set(nodes.map(node=>node.id));this.sourceModel=Object.freeze({nodes,links:Object.freeze(scene?.edges.map(entry=>entry.value)??[]),nodeTypes:this.nodeTypes,communities:Object.freeze(this.communities.map(community=>Object.freeze({...community,memberIds:Object.freeze(community.memberIds.filter(id=>ids.has(id)))})))})}return this.sourceModel}const sources=this.normalizedGraphSources;return(!sources||sources[0]!==this.nodes||sources[1]!==this.edges||sources[2]!==this.nodeTypes||sources[3]!==this.communities)&&(this.normalizedGraphSources=[this.nodes,this.edges,this.nodeTypes,this.communities],this.normalizedGraphModel=normalizeGraphModel(this.nodes,this.edges,this.nodeTypes,this.communities)),this.normalizedGraphModel}get view(){return this._view}set view(value){const next=GRAPH_VIEW.normalize(value),old=this._view;next!==old&&(this._view=next,this.requestUpdate("view",old))}get camera(){return this._camera}set camera(value){const old=this._camera;this._camera=value==null?void 0:normalizeGraphCamera(value,{yaw:0,pitch:0,distance:500,target:{x:0,y:0,z:0}}),this.requestUpdate("camera",old)}get layout(){return this._layout}set layout(next){const normalized=GRAPH_LAYOUT.normalize(next),old=this._layout;old!==normalized&&(this._layout=normalized,this.requestUpdate("layout",old))}loadSpatialController(){return import("./graph-spatial-controller.js")}loadLayeredLayout(){return import("../../../internal/layered-layout.js")}ensureSpatial(){if(this.spatial||!this.isConnected||this.view==="2d"||this.sourceList)return Promise.resolve();if(this.spatialLoad)return this.spatialLoad;const generation=++this.spatialGeneration,pending=this.loadSpatialController().then(({GraphSpatialController})=>{generation!==this.spatialGeneration||!this.isConnected||this.view==="2d"||this.sourceList||(this.spatial=this.createSpatial(GraphSpatialController),this.optionalLoadFailure=void 0,this.loadFailed=!1,this.paintGraph())},()=>{generation===this.spatialGeneration&&this.isConnected&&this.view!=="2d"&&(this.optionalLoadFailure="spatial",this.loadFailed=!0,this.announcements.announceAssertive(this.localize("graphSpatialUnavailable")),this.paintGraph())}).finally(()=>{this.spatialLoad===pending&&(this.spatialLoad=void 0)});return this.spatialLoad=pending,pending}ensureLayered(){if(this.layeredEngine||!this.isConnected||this.view!=="2d"||this.layout!=="layered")return Promise.resolve();if(this.layeredLoad)return this.layeredLoad;const generation=++this.layeredGeneration;this.loading=!0;const pending=this.loadLayeredLayout().then(({layeredLayout})=>{generation!==this.layeredGeneration||!this.isConnected||this.view!=="2d"||this.layout!=="layered"||(this.layeredEngine=layeredLayout,this.optionalLoadFailure=void 0,this.loading=!this.d3,this.loadFailed=!1,this.d3&&this.rebuildSimulation(),this.paintGraph())},()=>{generation===this.layeredGeneration&&this.isConnected&&this.layout==="layered"&&(this.optionalLoadFailure="layered",this.loading=!1,this.loadFailed=!0)}).finally(()=>{this.layeredLoad===pending&&(this.layeredLoad=void 0)});return this.layeredLoad=pending,pending}async getUpdateComplete(){const complete=await super.getUpdateComplete(),pending=this.view!=="2d"?this.spatialLoad:this.layout==="layered"?this.layeredLoad:void 0;return pending&&(await pending,this.isUpdatePending)?super.getUpdateComplete():complete}createSpatial(Controller){return new Controller(this,{repaint:()=>this.paintGraph(),model:()=>this.graphModel,locale:()=>this.effectiveLocale,direction:()=>this.effectiveDirection,pageText:values=>this.localize("graphSpatialPage",void 0,values),viewport:()=>({width:this.safeWidth,height:this.safeHeight}),messages:()=>this.spatialMessages(),communityText:values=>this.localize("graphCommunity",void 0,values),nodeText:node=>this.nodeAccessibleText(node),edgeText:edge=>this.linkAccessibleText(edge),nodeTooltip:node=>this.nodeTooltipText(node),edgeTooltip:edge=>this.linkTooltipText(edge),nodeShape:node=>this.nodeShape(node),paint:(nodes,edges)=>this.withCanvasColorResolver(resolve=>{const css=this.computedStyle(),nodeDefault=css.getPropertyValue("--lr-graph-node-fill").trim()||css.getPropertyValue("--lr-color-brand").trim(),edgeDefault=css.getPropertyValue("--lr-graph-edge-color").trim()||css.getPropertyValue("--lr-color-border").trim();return{nodes:new Map(nodes.map(({node})=>[node.id,resolve(this.nodeFill(node)??nodeDefault)])),edges:new Map(edges.map(edge=>[graphLinkIdentity(edge),resolve(sanitizeNodeColor(edge.color)??edgeDefault)])),visibleEdges:new Set(edges.filter(edge=>this.isInteractiveLink(edge,resolve,edgeDefault)).map(graphLinkIdentity)),text:resolve(css.getPropertyValue("--lr-color-text").trim()),selected:resolve(css.getPropertyValue("--lr-graph-selected-color").trim()||css.getPropertyValue("--lr-color-success").trim()),font:css.getPropertyValue("--lr-font").trim()||css.fontFamily,fontSize:this.edgeLabelFontPx(),dimmedOpacity:finiteRange(Number(css.getPropertyValue("--lr-graph-dimmed-opacity").trim()||.35),.35,0,1)}}),activate:(hit,event)=>{if(!this.sourceDiagramBlocked)if(hit.kind==="node"){const position=this.spatial?.position(hit.id);if(!position)return;const current=this.selectionActionAuthority();this.emit("lr-node-activate",{nodeId:hit.id,...position}),current()&&this.emitSelectionIntent("node",hit.id,event.ctrlKey||event.metaKey)}else this.onLinkClick(hit.edge,event)},expand:nodeId=>this.emit("lr-node-expand",{nodeId}),hover:(previous,next)=>{previous?.kind==="node"?this.emit("lr-node-leave",{nodeId:previous.id}):previous?.kind==="link"&&this.emitEdgeHover("leave",this.linkHoverDetail(previous.edge)),next?.kind==="node"?this.emit("lr-node-enter",{nodeId:next.id}):next?.kind==="link"&&this.emitEdgeHover("enter",this.linkHoverDetail(next.edge))},community:community=>this.onCommunityClick(community),cameraChanged:camera=>this.emit("lr-camera-change",{camera}),viewChanged:()=>this.emit("lr-view-change",{view:this.view}),unavailable:()=>this.announcements.announceAssertive(this.localize("graphSpatialUnavailable")),clearSelection:()=>this.clearSelection(),afterUpdate:(callback,key)=>this.scheduleAfterUpdate(callback,key)})}spatialMessages(){return{controls:this.localize("graphSpatialControls"),view3d:this.localize("graphView3d"),viewList:this.localize("graphViewList"),fit:this.localize("graphFit"),left:this.localize("graphOrbitLeft"),right:this.localize("graphOrbitRight"),up:this.localize("graphOrbitUp"),down:this.localize("graphOrbitDown"),instructions:this.localize("graphSpatialInstructions"),unavailable:this.localize("graphSpatialUnavailable"),zoomIn:this.localize("zoomIn"),zoomOut:this.localize("zoomOut"),previous:this.localize("previous"),next:this.localize("next"),dataList:this.localize("graphDataList"),noData:this.localize("noData")}}constructor(){super(),this.sourceEpoch=0,this.sourceNavigation=0,this.sourceSyncing=!1,this.sourceQuery=EMPTY_SOURCE_QUERY,this.sourceCenter=null,this.sourceKeys=[],this.sourceMissing=!1,this.sourceRestoreFocus=!1,this.sourceRestorePager=!1,this.sourcePagePromise=Promise.resolve(!1),this.sourceState=0,this.sourceModelVersion=0,this.sourcePaint=0,this.sourceScene=new GraphSourceController(this,{onChange:()=>{this.sourceState++}}),this.sourcePages=new SourcePageController(this,{normalizeRecord:record=>record,normalizeSummary:value=>graphSourceSummary(value),validateMetadata:(result,query2)=>{const count=result.summary[query2.kind];if(result.total>count||!query2.search&&query2.centerKey===null&&!query2.nodeTypes.length&&result.total!==count||result.rows.some(row=>row.value.kind!==(query2.kind==="nodes"?"node":"edge")))throw new TypeError("Invalid global graph count or kind");this.assertSourceTotals(result.summary)},onChange:()=>{this.sourceState++}}),this.sourceComposition=new GraphSourceCompositionController(this,()=>{const profile=this.sourceComposition.profile;profile&&this.setSourceQuery({...EMPTY_SOURCE_QUERY,search:profile.search,nodeTypes:profile.nodeTypes}),this.sourceState++},async keys=>{if(!this.sourceMode||this.sourceComposition.profile?.empty)return;const profile=this.sourceComposition.profile,currentSource=this.sourceAuthority(),current=()=>currentSource()&&this.sourceComposition.profile===profile,records=await this.sourcePages.resolveSelection(keys);return records&&current()?Object.freeze({records,current}):void 0},async key=>{if(!this.sourceMode||this.sourceComposition.profile?.empty)return;const source=this.graphSource,epoch=this.sourceEpoch,profile=this.sourceComposition.profile;this.sourceNavigation++;const current=this.sourceAuthority();if((this.sourceScene.state.pending||!this.sourceScene.state.scene?.nodes.some(node=>node.key===key))&&(!await this.ensureSourceScene(key,current)||!current()))return;if(this.sourceList){if(![...this.renderRoot.querySelectorAll("[data-source-key]")].some(row=>row.dataset.sourceKey===key)&&!await this.revealSourceRecord(key,!1))return}else if(!await this.focusSceneNode(key.slice(5),void 0,current))return;const finalCurrent=this.sourceAuthority(),accepted=()=>finalCurrent()&&this.graphSource===source&&this.sourceEpoch===epoch&&this.sourceComposition.profile===profile;return accepted()?accepted:void 0}),this.sourcePage=0,this.sourcePageSize=100,this.nodes=[],this.edges=[],this.nodeTypes=[],this.hiddenTypes=[],this.communities=[],this._view="2d",this._layout="force",this.renderer="svg",this.fitTo="none",this.width=800,this.height=600,this.chargeStrength=-300,this.edgeDistance=100,this.minZoom=.1,this.maxZoom=8,this.label=null,this.accessibleLabel=null,this.withEdgeLabels=!1,this.edgeLabelMinZoom=.6,this.focusNodeId=null,this.selectionMode="none",this.selectedNodeIds=[],this.selectedEdgeIds=[],this.dimmedNodeIds=[],this.dimmedEdgeIds=[],this.arrowMarkerId=nextId("graph-arrow"),this.loading=!0,this.loadFailed=!1,this.loadLibrary=loadD3,this.loadGeneration=0,this.containerSize=null,this.simNodes=[],this.simLinks=[],this.simNodeById=new Map,this.danglingLinks=[],this.lastPositionById=new Map,this.lastHiddenNodeCount=0,this.activeGraphItem=0,this.graphLiveText="",this.announcements=new AnnouncementSinkController(this,{eager:["polite","assertive"]}),this.graphAnnouncementsReady=!1,this.isMounting=!0,this.authorRole=null,this.syncingGraphHostRole=!1,this.detachedGraphChanges=new Map,this.boundNodeEls=new WeakSet,this.nodeEls=[],this.nodeHitEls=[],this.nodeLabelEls=[],this.expandIndicatorEls=[],this.lastKeyActivateIndex=null,this.lastKeyActivateTime=0,this.lastAppliedFocusNodeId=null,this.communityHullEls=[],this.communityHullHitEls=[],this.communityLabelEls=[],this.visible=!0,this.canvasDrawPending=!1,this.pickDirty=!0,this.canvasCamera={k:1,x:0,y:0},this.pickItems=[],this.canvasDragGeneration=0,this.canvasSceneHasEdgeLabels=!1,this.isCameraTweening=!1,this.linkEls=[],this.linkHitEls=[],this.linkLabelEls=[],this.linkLabelHiddenByLength=[],this.edgeLabelWidthCache=new Map,this.danglingLinkEls=[],this.linkPaintVisibilityCache=new Map,this.resolvedCssColorCache=new Map,this.reducedMotion=!1,this.spatialGeneration=0,this.layeredGeneration=0,this.d3LoadFailed=!1,this.isApplyingZoomTransform=!1,this.onCanvasDprChange=()=>{this.watchCanvasDpr(),this.markCanvasDirty()},this.canvasNodesById=new Map,this.canvasLinksById=new Map,this.canvasLabelNodes=[],this.canvasExpandableNodes=[],this.onCanvasPointerDown=e=>{if(e.button!==0||(this.canvasPointerDownAt={x:e.clientX,y:e.clientY},this.canvasPointerDownId=e.pointerId,this.layout==="layered"))return;const hit=this.hitTest(e.clientX,e.clientY);if(hit?.kind==="node"){this.canvasDragNode=hit.node,this.canvasPointerId=e.pointerId;try{this.canvasEl.setPointerCapture(e.pointerId)}catch{}hit.node.fx=hit.node.x,hit.node.fy=hit.node.y,this.simulation?.alphaTarget(.3).restart()}},this.onCanvasPointerMove=e=>{if(this.canvasDragNode&&this.canvasPointerId===e.pointerId){if(this.pendingCanvasDrag={x:e.clientX,y:e.clientY},this.canvasDragFrame===void 0){const owner=this.ownerWindow;if(owner){const generation=this.canvasDragGeneration;this.canvasDragFrameOwner=owner,this.canvasDragFrame=owner.requestAnimationFrame(()=>{generation===this.canvasDragGeneration&&this.flushCanvasDrag()})}}return}if(this.pendingHover={x:e.clientX,y:e.clientY},this.hoverRafId!=null)return;const frameOwner=this.ownerWindow;frameOwner&&(this.hoverRafOwner=frameOwner,this.hoverRafId=frameOwner.requestAnimationFrame(()=>{if(this.hoverRafId=void 0,this.hoverRafOwner=void 0,!this.isConnected||this.ownerWindow!==frameOwner)return;const pending=this.pendingHover;if(this.pendingHover=void 0,!pending||this.canvasHoverSuppressed()||this.pickDirty&&this.simulationIsTicking())return;const hit=this.hitTest(pending.x,pending.y);this.updateCanvasTooltip(hit,pending.x,pending.y),this.updateCanvasHover(hit)}))},this.onCanvasPointerUp=e=>{this.finishCanvasNodeDrag(e.pointerId);const down=this.takeCanvasPointerDown(e.pointerId);if(!down||Math.hypot(e.clientX-down.x,e.clientY-down.y)>5)return;const hit=this.hitTest(e.clientX,e.clientY);if(!hit){this.clearSelection();return}hit.kind==="node"?this.onNodeClick(hit.node,e):hit.kind==="link"?this.onLinkClick(hit.link,e):this.onCommunityClick(hit.entry.community)},this.onCanvasPointerCancel=e=>{this.finishCanvasNodeDrag(e.pointerId),this.takeCanvasPointerDown(e.pointerId)},this.onCanvasLostPointerCapture=e=>{this.finishCanvasNodeDrag(e.pointerId,!1),this.takeCanvasPointerDown(e.pointerId)},this.onCanvasPointerLeave=()=>{this.pendingHover=void 0,this.hoverRafId!=null&&(this.hoverRafOwner?.cancelAnimationFrame(this.hoverRafId),this.hoverRafId=void 0,this.hoverRafOwner=void 0),this.updateCanvasTooltip(void 0,0,0),this.canvasHoverSuppressed()?this.canvasHover=void 0:this.updateCanvasHover(void 0)},this.onCanvasDblClick=e=>{const hit=this.hitTest(e.clientX,e.clientY),node=hit?.kind==="node"?hit.node:this.nodeAtCanvasPoint(e.clientX,e.clientY);node&&(e.stopImmediatePropagation(),this.emit("lr-node-expand",{nodeId:node.id}))},this.explicitRefresh=!1,this.cursorUpdate=!1,this.paintUpdate=!0,this.svgCursorItems=[],this.isDragging=!1,this.isPanning=!1,new ThemeWatcher(this,()=>{const reduced=prefersReducedMotion(this);reduced!==this.reducedMotion&&(this.reducedMotion=reduced,reduced?this.simulation?.stop():this.visible&&this.view==="2d"&&this.safeSeed==null&&this.simulation?.restart()),this.linkPaintVisibilityCache.clear(),this.resolvedCssColorCache.clear(),this.view!=="2d"?this.spatial?.invalidate():this.renderer==="canvas"&&this.markCanvasDirty()},["(prefers-reduced-motion: reduce)"])}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),name==="role"&&oldValue!==value&&!this.syncingGraphHostRole&&(this.authorRole=value)}hostOwnsGraphSemantics(){return this.hasAttribute("aria-label")}syncGraphHostRole(){if(this.authorRole===null){this.syncingGraphHostRole=!0;try{this.hostOwnsGraphSemantics()?this.setAttribute("role","group"):this.removeAttribute("role")}finally{this.syncingGraphHostRole=!1}}}get ownerWindow(){return this.ownerDocument.defaultView??void 0}computedStyle(element=this){const view=this.ownerWindow;return view?view.getComputedStyle(element):"style"in element?element.style:this.style}connectedCallback(){if(super.connectedCallback(),this.sourceInputs=void 0,this.syncGraphSource(),this.detachedGraphChanges.size){for(const[key,previous]of this.detachedGraphChanges)this.requestUpdate(key,previous);this.detachedGraphChanges.clear(),this.paintGraph()}this.reducedMotion=prefersReducedMotion(this);const IntersectionObserverCtor=this.ownerWindow?.IntersectionObserver;this.view==="2d"&&IntersectionObserverCtor&&(this.intersectionObserver=new IntersectionObserverCtor(entries=>{this.setGraphVisibility(entries[0]?.isIntersecting??!0)}),this.intersectionObserver.observe(this)),this.fitTo==="container"&&(this.syncHostResizeObserver(),this.measureHostBox()),this.view==="2d"?this.connect2d():(this.loading=!1,this.ensureSpatial(),this.paintGraph())}setGraphVisibility(visible){const wasVisible=this.visible;this.visible=visible,visible?wasVisible||(!this.reducedMotion&&this.safeSeed==null&&this.view==="2d"&&this.simulation&&this.simulation.alpha()>this.simulation.alphaMin()&&this.simulation.restart(),this.canvasDrawPending&&(this.canvasDrawPending=!1,this.scheduleCanvasDraw())):this.simulation?.stop()}connect2d(){const Observer=this.ownerWindow?.IntersectionObserver;if(!this.intersectionObserver&&Observer&&(this.intersectionObserver=new Observer(entries=>{this.setGraphVisibility(entries[0]?.isIntersecting??!0)}),this.intersectionObserver.observe(this)),this.d3){this.visible&&!this.reducedMotion&&this.safeSeed==null&&this.simulation?.restart(),this.renderer==="canvas"&&this.canvasEl&&this.canvasEl===this.zoomedEl&&(this.ensureCanvasOwnerRealm(),this.syncHostResizeObserver(),this.watchCanvasDpr(),this.markCanvasDirty());return}const generation=++this.loadGeneration;this.loadLibrary().then(async mods=>{try{await super.getUpdateComplete()}catch{return}if(await new Promise(resolve=>this.updateBrowserDerivedState(resolve)),!(generation!==this.loadGeneration||!this.isConnected)){if(this.loading=!1,!mods){this.d3LoadFailed=!0,this.loadFailed=!0;return}this.d3LoadFailed=!1,this.loadFailed=!1,this.d3=mods,this.rebuildSimulation()}})}disconnectedCallback(){this.sourceNavigation++,this.sourceEpoch++,this.sourceInputs=void 0,this.sourcePageInputs=void 0,super.disconnectedCallback(),this.spatialGeneration++,this.layeredGeneration++,this.spatialLoad=void 0,this.layeredLoad=void 0,this.spatial?.disconnect(),this.loadGeneration+=1,this.simulation?.stop(),this.finishCanvasNodeDrag(void 0,!0,!1),this.takeCanvasPointerDown(),this.cancelCameraTween(),this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.hostResizeObserver?.disconnect(),this.hostResizeObserver=void 0,this.hostResizeObserverDocument=void 0,this.canvasDprQuery?.removeEventListener("change",this.onCanvasDprChange),this.canvasDprQuery=void 0,this.canvasDrawRafId!=null&&(this.canvasDrawRafOwner?.cancelAnimationFrame(this.canvasDrawRafId),this.canvasDrawRafId=void 0,this.canvasDrawRafOwner=void 0),this.hoverRafId!=null&&(this.hoverRafOwner?.cancelAnimationFrame(this.hoverRafId),this.hoverRafId=void 0,this.hoverRafOwner=void 0),this.pendingHover=void 0,this.canvasHover=void 0,this.canvasTooltipEl?.setAttribute("hidden",""),this.pendingGraphItemFocus=void 0,this.viewportChangeRafId!=null&&(this.viewportChangeRafOwner?.cancelAnimationFrame(this.viewportChangeRafId),this.viewportChangeRafId=void 0,this.viewportChangeRafOwner=void 0)}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted(),this.sourceEpoch++,this.sourceNavigation++,this.sourceInputs=void 0,this.sourceScene.adopted(),this.sourcePages.adopted(),this.sourceState++,this.ensureCanvasOwnerRealm()}scheduleViewportChange(){if(this.view!=="2d"||this.viewportChangeRafId!=null)return;const frameOwner=this.ownerWindow;frameOwner&&(this.viewportChangeRafOwner=frameOwner,this.viewportChangeRafId=frameOwner.requestAnimationFrame(()=>{if(this.viewportChangeRafId=void 0,this.viewportChangeRafOwner=void 0,!this.isConnected||this.ownerWindow!==frameOwner)return;const transform=this.renderer==="canvas"||!this.d3||!this.zoomedEl?this.canvasCamera:this.d3.zoomTransform(this.zoomedEl);this.emit("lr-viewport-change",{zoom:transform.k,x:transform.x,y:transform.y,k:transform.k})}))}nodeRadius(n){const r=n.radius??(MIN_RADIUS+MAX_RADIUS)/2;return Number.isFinite(r)?Math.min(MAX_RADIUS,Math.max(MIN_RADIUS,r)):(MIN_RADIUS+MAX_RADIUS)/2}safeLinkWidth(link){return finiteRange(link.width??1.5,1.5,0)}isInteractiveLink(link,resolveColor,defaultPaint){if(this.safeLinkWidth(link)<=0)return!1;const effectivePaint=sanitizeNodeColor(link.color)??defaultPaint,color=effectivePaint?resolveColor(effectivePaint).trim().toLowerCase():void 0;if(!color)return!0;if(color==="transparent"||/^#[\da-f]{4}$/.test(color)&&color.endsWith("0")||/^#[\da-f]{8}$/.test(color)&&color.endsWith("00")||/\/\s*0(?:\.0+)?%?\s*\)$/.test(color)||/^(?:rgba|hsla)\(/.test(color)&&/,\s*0(?:\.0+)?\s*\)$/.test(color))return!1;const cached=this.linkPaintVisibilityCache.get(color);if(cached!==void 0)return cached;this.linkPaintProbe??=this.ownerDocument.createElement("canvas"),this.linkPaintProbe.width=1,this.linkPaintProbe.height=1;const context=this.linkPaintProbe.getContext("2d",{willReadFrequently:!0});if(!context)return!0;let visible=!0;try{context.clearRect(0,0,1,1),context.fillStyle="rgb(1 2 3)",context.fillStyle=color,context.fillRect(0,0,1,1),visible=context.getImageData(0,0,1,1).data[3]!==0}catch{visible=!0}return this.linkPaintVisibilityCache.set(color,visible),visible}navigableLinks(){return this.navigableLinksCache||(this.navigableLinksCache=this.simLinks.length?this.withCanvasColorResolver(resolveColor=>{const computed=this.computedStyle(),defaultPaint=computed.getPropertyValue("--lr-graph-edge-color").trim()||computed.getPropertyValue("--lr-color-border").trim();return this.simLinks.filter(link=>this.isInteractiveLink(link,resolveColor,defaultPaint))}):[]),this.navigableLinksCache}lengthInPixels(value){return typeof value=="string"?resolveCssTokenLength(value,{host:this})??Number.NaN:value}get requestedWidth(){return finiteRange(this.lengthInPixels(this.width),800,1)}get requestedHeight(){return finiteRange(this.lengthInPixels(this.height),600,1)}get safeWidth(){const requested=this.requestedWidth,measured=this.fitTo==="container"&&this.containerSize;return measured?finiteRange(measured.width,requested,1):requested}get safeHeight(){const requested=this.requestedHeight,measured=this.fitTo==="container"&&this.containerSize;return measured?finiteRange(measured.height,requested,1):requested}recordContainerSize(width,height){const w=Math.round(finiteRange(width,0,0)),h=Math.round(finiteRange(height,0,0));return w<=0||h<=0||this.containerSize?.width===w&&this.containerSize?.height===h?!1:(this.containerSize={width:w,height:h},!0)}measureHostBox(){return this.isConnected?(this.syncRequestedHeightVar(),this.recordContainerSize(this.clientWidth,this.clientHeight)):!1}syncRequestedHeightVar(){this.style.setProperty("--_lr-graph-requested-height",`${this.requestedHeight}px`)}get safeMinZoom(){return finiteRange(this.minZoom,.1,.001,1e3)}get safeMaxZoom(){return finiteRange(this.maxZoom,8,.001,1e3)}get effectiveZoomBounds(){const min=this.safeMinZoom,max=this.safeMaxZoom;return Object.freeze({min:Math.min(min,max),max:Math.max(min,max)})}get safeEdgeLabelMinZoom(){return finiteRange(this.edgeLabelMinZoom,.6,.001,1e3)}get resolvedNodeLabelsMode(){return this.nodeLabels??(this.renderer==="canvas"?"zoom":"always")}canvasNodeLabelsVisible(){const mode=this.resolvedNodeLabelsMode;return mode==="none"?!1:mode==="zoom"?this.canvasCamera.k>=NODE_LABEL_MIN_ZOOM:!0}get safeSeed(){return this.seed==null?void 0:finiteInteger(this.seed,0)}get safeChargeStrength(){return finiteNumber(this.chargeStrength,-300)}get safeLinkDistance(){return finiteRange(this.edgeDistance,100,0)}nodeTypeEntry(node){const types=this.graphModel.nodeTypes;if(this.nodeTypeIndex?.[0]!==types){const labeled=this.labeledNodeTypes();this.nodeTypeIndex=[types,new Map(types.map((type,index)=>{const slot=labeled.indexOf(type);return[type.id,[type,slot<0?index:slot]]}))]}return node.type==null?void 0:this.nodeTypeIndex[1].get(node.type)}resolveNodeType(node){return this.nodeTypeEntry(node)?.[0]}nodeShape(node){return this.resolveNodeType(node)?.shape??"circle"}labeledNodeTypes(){return this.graphModel.nodeTypes.filter(candidate=>typeof candidate?.label=="string"&&candidate.label.trim().length>0)}nodeFill(node){const ownColor=sanitizeNodeColor(node.color);if(ownColor)return ownColor;const entry=this.nodeTypeEntry(node);if(entry)return sanitizeNodeColor(entry[0].color)||categoricalPaletteColor(entry[1])}visibleNodes(){const hiddenTypes=canonicalIdentityList(this.hiddenTypes);if(!hiddenTypes.length)return this.graphModel.nodes;const hidden=new Set(hiddenTypes);return this.graphModel.nodes.filter(n=>n.type==null||!hidden.has(n.type))}resolveLinksAgainst(byId){const nodeExists=new Set(this.graphModel.nodes.map(n=>n.id)),resolved=[],dangling=[];for(const l of this.graphModel.links){const source=byId.get(l.source);if(!source)continue;const target=byId.get(l.target);target?resolved.push(copyGraphLinkIdentity(l,{...l,source,target})):nodeExists.has(l.target)||dangling.push(copyGraphLinkIdentity(l,{...l,source,target:{id:l.target,x:source.x,y:source.y},dangling:!0}))}return{resolved,dangling}}visibleCommunities(){if(!this.visibleCommunitiesCache){const byCommunity=new Map,positions=new Map;this.simNodes.forEach((node,index)=>{if(positions.set(node.id,index),node.communityId!=null){const members=byCommunity.get(node.communityId);members?members.push(node):byCommunity.set(node.communityId,[node])}}),this.visibleCommunitiesCache=this.graphModel.communities.flatMap(community=>{const members=new Map;for(const node of byCommunity.get(community.id)??[])members.set(node.id,node);for(const id of community.memberIds??[]){const node=this.simNodeById.get(id);node&&members.set(id,node)}const ordered=[...members.values()].sort((a,b)=>positions.get(a.id)-positions.get(b.id));return ordered.length?[{community,members:ordered}]:[]})}return this.visibleCommunitiesCache}communityHull(members){return convexHull(members.map(n=>({x:n.x??0,y:n.y??0})))}onCommunityClick(community){this.emit("lr-community-activate",{communityId:community.id})}cameraTransitionMs(){const parsed=parseFloat(this.computedStyle().getPropertyValue("--lr-transition-base"));return Number.isFinite(parsed)?parsed:180}cancelCameraTween(){this.cameraTweenId!=null&&(this.cameraTweenFrameOwner?.cancelAnimationFrame(this.cameraTweenId),this.cameraTweenId=void 0,this.cameraTweenFrameOwner=void 0),this.isCameraTweening=!1;const resolve=this.cameraTweenResolve;resolve&&(this.cameraTweenResolve=void 0,resolve(!1))}applyZoomTransform(transform){if(!(!this.d3||!this.zoomedEl||!this.zoomBehavior)){this.isApplyingZoomTransform=!0;try{this.zoomBehavior.transform(this.d3.select(this.zoomedEl),transform)}finally{this.isApplyingZoomTransform=!1}}}tweenCamera(computeTarget){return new Promise(resolve=>{if(!this.d3||!this.zoomedEl||!this.zoomBehavior){resolve(!1);return}this.cancelCameraTween(),this.cameraTweenResolve=resolve,this.isCameraTweening=!0;const frameOwner=this.ownerWindow;if(!frameOwner){this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!1);return}if(prefersReducedMotion(this)){this.applyZoomTransform(computeTarget()),this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!0);return}const current=this.d3.zoomTransform(this.zoomedEl),duration=this.cameraTransitionMs(),start=frameOwner.performance.now(),startK=current.k,startX=current.x,startY=current.y,step=now=>{if(this.cameraTweenResolve!==resolve)return;if(!this.isConnected||this.ownerWindow!==frameOwner){this.cameraTweenId=void 0,this.cameraTweenFrameOwner=void 0,this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!1);return}const t=!prefersReducedMotion(this)&&duration>0?Math.min(1,(now-start)/duration):1,target=computeTarget(),targetK=target.k,targetX=target.x,targetY=target.y;this.applyZoomTransform(this.d3.zoomIdentity.translate(startX+(targetX-startX)*t,startY+(targetY-startY)*t).scale(startK+(targetK-startK)*t)),t<1?(this.cameraTweenFrameOwner=frameOwner,this.cameraTweenId=frameOwner.requestAnimationFrame(step)):(this.cameraTweenId=void 0,this.cameraTweenFrameOwner=void 0,this.isCameraTweening=!1,this.cameraTweenResolve=void 0,resolve(!0))};this.cameraTweenFrameOwner=frameOwner,this.cameraTweenId=frameOwner.requestAnimationFrame(step)})}async focusNode(id,options){if(this.sourceMode){if(typeof id!="string"||!id.length||id.length+5>65536)return!1;if(this.sourceList)return this.revealSourceRecord(`node:${id}`,!1);this.sourceNavigation++;const current=this.sourceAuthority();return!await this.ensureSourceScene(`node:${id}`,current)||!current()?!1:this.focusSceneNode(id,options,current)}return this.focusSceneNode(id,options)}async focusSceneNode(id,options,currentSource=()=>!0){if(this.view!=="2d"){if(!this.isConnected||(await this.ensureSpatial(),!this.isConnected||this._view==="2d"||!currentSource()))return!1;const focused=this.spatial?.focusNode(id,options?.zoom);if(focused){const node2=this.graphModel.nodes.find(candidate=>candidate.id===id);node2&&this.announcements.announcePolite(this.localize("graphNodeFocused",void 0,{label:this.nodeAccessibleText(node2)}))}return focused??!1}const node=this.simNodes.find(n=>n.id===id);if(!node||!this.d3||!this.zoomedEl||!this.zoomBehavior)return!1;const current=this.d3.zoomTransform(this.zoomedEl),bounds=this.effectiveZoomBounds,k=finiteRange(options?.zoom??current.k,current.k,bounds.min,bounds.max),arrived=await this.tweenCamera(()=>this.d3.zoomIdentity.translate(this.safeWidth/2-k*(node.x??0),this.safeHeight/2-k*(node.y??0)).scale(k));return arrived&&currentSource()&&(this.graphLiveText=this.localize("graphNodeFocused",void 0,{label:this.nodeAccessibleText(node)})),arrived&&currentSource()}fit(options){if(this.view!=="2d"){this.spatial?this.spatial.fit(options?.padding):this.isConnected&&this.ensureSpatial().then(()=>{this.isConnected&&this.view!=="2d"&&this.spatial?.fit(options?.padding)});return}if(!this.d3||!this.zoomedEl||!this.zoomBehavior||!this.simNodes.length)return;const padding=finiteRange(options?.padding??24,24,0);this.tweenCamera(()=>{const fitPoints=[];for(const n of this.simNodes){const r=this.nodeRadius(n);fitPoints.push({x:(n.x??0)-r,y:(n.y??0)-r}),fitPoints.push({x:(n.x??0)+r,y:(n.y??0)+r})}for(const entry of this.visibleCommunities())for(const p of this.communityHull(entry.members))fitPoints.push({x:p.x-HULL_PADDING,y:p.y-HULL_PADDING}),fitPoints.push({x:p.x+HULL_PADDING,y:p.y+HULL_PADDING});const{minX,maxX,minY,maxY}=extent(fitPoints,point=>point.x,point=>point.y),bounds=this.effectiveZoomBounds,transform=fitTransform({minX,minY,maxX,maxY},{width:this.safeWidth,height:this.safeHeight},padding,bounds);return this.d3.zoomIdentity.translate(transform.x,transform.y).scale(transform.zoom)})}updateFocusHalo(){if(!this.focusHaloEl)return;const node=this.focusNodeId!=null?this.simNodeById.get(this.focusNodeId):void 0;node?(this.focusHaloEl.setAttribute("cx",String(node.x??0)),this.focusHaloEl.setAttribute("cy",String(node.y??0)),this.focusHaloEl.setAttribute("r",String(this.nodeRadius(node)+FOCUS_HALO_PADDING)),this.focusHaloEl.removeAttribute("hidden")):this.focusHaloEl.setAttribute("hidden","")}setUpCanvasSurface(){this.canvasCtx=this.canvasEl.getContext("2d")??void 0,this.ensureCanvasOwnerRealm(),this.syncHostResizeObserver(),this.watchCanvasDpr(),this.canvasTooltipEl=this.renderRoot.querySelector('[part="tooltip"]')??void 0,this.bindCanvasPointer(),this.bindCanvasZoom()}ensureCanvasOwnerRealm(){const ownerDocument=this.ownerDocument;this.edgeLabelMeasureCanvas?.ownerDocument!==ownerDocument&&(this.edgeLabelMeasureCanvas=void 0,this.edgeLabelMeasureCtx=void 0,this.edgeLabelWidthCache.clear()),!(!this.pickCanvas&&this.renderer!=="canvas")&&this.pickCanvas?.ownerDocument!==ownerDocument&&(this.pickCanvas=ownerDocument.createElement("canvas"),this.pickCtx=this.pickCanvas.getContext("2d",{willReadFrequently:!0}),this.pickDirty=!0)}syncHostResizeObserver(){if(this.view!=="2d"||this.renderer!=="canvas"&&this.fitTo!=="container"){this.hostResizeObserver?.disconnect(),this.hostResizeObserver=void 0,this.hostResizeObserverDocument=void 0;return}this.hostResizeObserver&&this.hostResizeObserverDocument===this.ownerDocument||this.watchHostResize()}watchHostResize(){this.hostResizeObserver?.disconnect();const ResizeObserverCtor=this.ownerWindow?.ResizeObserver;if(!ResizeObserverCtor){this.hostResizeObserver=void 0,this.hostResizeObserverDocument=void 0;return}this.hostResizeObserver=new ResizeObserverCtor(entries=>{const box=entries[entries.length-1]?.contentRect;this.fitTo==="container"&&box&&this.recordContainerSize(box.width,box.height),this.renderer==="canvas"&&this.canvasEl&&this.markCanvasDirty()}),this.hostResizeObserverDocument=this.ownerDocument,this.hostResizeObserver.observe(this)}watchCanvasDpr(){this.canvasDprQuery?.removeEventListener("change",this.onCanvasDprChange);const view=this.ownerWindow;if(!view?.matchMedia){this.canvasDprQuery=void 0;return}this.canvasDprQuery=view.matchMedia(`(resolution: ${view.devicePixelRatio}dppx)`),this.canvasDprQuery.addEventListener("change",this.onCanvasDprChange)}markCanvasDirty(){this.canvasScene=void 0,this.pickDirty=!0,this.scheduleCanvasDraw()}markCanvasCameraDirty(){this.pickDirty=!0,this.scheduleCanvasDraw()}scheduleCanvasDraw(){if(this.view!=="2d")return;if(!this.visible){this.canvasDrawPending=!0;return}if(this.canvasDrawRafId!=null)return;const frameOwner=this.ownerWindow;frameOwner&&(this.canvasDrawRafOwner=frameOwner,this.canvasDrawRafId=frameOwner.requestAnimationFrame(()=>{this.canvasDrawRafId=void 0,this.canvasDrawRafOwner=void 0,!(!this.isConnected||this.ownerWindow!==frameOwner)&&this.drawCanvas()}))}resolveCssColorWithProbe(value,probe){const cached=this.resolvedCssColorCache.get(value);if(cached!==void 0)return cached;probe.style.color="",probe.style.color=value;const result=getComputedStyle(probe).color.trim()||getComputedStyle(this).color||"transparent";return this.resolvedCssColorCache.set(value,result),result}createCanvasColorProbe(){const probe=this.ownerDocument.createElement("span");return probe.setAttribute("aria-hidden","true"),probe.style.position="absolute",probe.style.inlineSize="0",probe.style.blockSize="0",probe.style.overflow="hidden",probe.style.visibility="hidden",probe.style.pointerEvents="none",this.renderRoot.append(probe),probe}withCanvasColorResolver(callback){let probe;try{return callback(value=>{const cached=this.resolvedCssColorCache.get(value);return cached!==void 0?cached:(probe??=this.createCanvasColorProbe(),this.resolveCssColorWithProbe(value,probe))})}finally{probe?.remove()}}refreshCanvasGeometry(scene){for(let i=0;i<this.simNodes.length;i++){const node=this.simNodes[i];scene.nodes[i].x=node.x??0,scene.nodes[i].y=node.y??0}for(let i=0;i<this.simLinks.length;i++)Object.assign(scene.links[i],this.linkCoordinates(this.simLinks[i]));for(let i=0;i<this.canvasLabelNodes.length;i++){const node=this.canvasLabelNodes[i];scene.nodeLabels[i].x=(node.x??0)+this.nodeRadius(node)+2,scene.nodeLabels[i].y=node.y??0}for(let i=0;i<this.canvasExpandableNodes.length;i++){const node=this.canvasExpandableNodes[i],indicator=scene.expandIndicators[i];indicator.x=node.x??0,indicator.y=node.y??0}const communities=this.visibleCommunities();for(let i=0;i<communities.length;i++)scene.hulls[i].d=hullPathD(this.communityHull(communities[i].members));const focus=this.focusNodeId==null?void 0:this.simNodeById.get(this.focusNodeId);if(focus&&scene.focusHalo&&(scene.focusHalo.x=focus.x??0,scene.focusHalo.y=focus.y??0),scene.edgeLabels.length=0,this.withEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom)for(const link of this.simLinks){const label=ownGraphText(link,"label");if(!label)continue;const coordinates=this.linkCoordinates(link);this.edgeLabelWidth(label)>Math.hypot(coordinates.x2-coordinates.x1,coordinates.y2-coordinates.y1)*EDGE_LABEL_LENGTH_GATE_RATIO||scene.edgeLabels.push({...this.edgeLabelPosition(link),text:label})}}buildCanvasScene(cs){return this.canvasLabelNodes=this.simNodes.filter(node=>!!ownGraphText(node,"label")),this.canvasExpandableNodes=this.simNodes.filter(node=>node.expandable),this.withCanvasColorResolver(resolveColor=>{const hullFillDefault=cs.getPropertyValue("--lr-graph-hull-fill").trim()||cs.getPropertyValue("--lr-color-brand").trim(),hulls=this.visibleCommunities().map(entry=>({d:hullPathD(this.communityHull(entry.members)),fill:resolveColor(sanitizeNodeColor(entry.community.color)??hullFillDefault)})),linkColorDefault=cs.getPropertyValue("--lr-graph-edge-color").trim()||cs.getPropertyValue("--lr-color-border").trim(),links=this.simLinks.map(l=>{const coords=this.linkCoordinates(l),own=sanitizeNodeColor(l.color);return{x1:coords.x1,y1:coords.y1,x2:coords.x2,y2:coords.y2,color:resolveColor(own??linkColorDefault),width:this.safeLinkWidth(l),dash:l.dash,directed:l.directed,selected:this.isSelected("link",this.linkKey(l)),dimmed:this.isDimmed("link",this.linkKey(l))}}),edgeLabels=this.withEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom?this.simLinks.flatMap(l=>{const label=ownGraphText(l,"label");if(!label)return[];const pos=this.edgeLabelPosition(l),coords=this.linkCoordinates(l),edgeLength=Math.hypot(coords.x2-coords.x1,coords.y2-coords.y1);return this.edgeLabelWidth(label)>edgeLength*EDGE_LABEL_LENGTH_GATE_RATIO?[]:[{x:pos.x,y:pos.y,text:label}]}):[],nodeFillDefault=cs.getPropertyValue("--lr-graph-node-fill").trim()||cs.getPropertyValue("--lr-color-brand").trim(),nodes=this.simNodes.map(n=>{const fill=this.nodeFill(n);return{x:n.x??0,y:n.y??0,r:this.nodeRadius(n),shape:this.nodeShape(n),fill:resolveColor(fill??nodeFillDefault),selected:this.isSelected("node",n.id),dimmed:this.isDimmed("node",n.id)}}),nodeLabels=this.simNodes.flatMap(n=>{const label=ownGraphText(n,"label");return label?[{x:(n.x??0)+this.nodeRadius(n)+2,y:n.y??0,text:label}]:[]}),expandIndicators=this.simNodes.filter(n=>n.expandable).map(n=>({x:n.x??0,y:n.y??0,r:this.nodeRadius(n)})),focusNode=this.focusNodeId!=null?this.simNodeById.get(this.focusNodeId):void 0,scene={hulls,links,edgeLabels,nodes,nodeLabels,expandIndicators,focusHalo:focusNode?{x:focusNode.x??0,y:focusNode.y??0,r:this.nodeRadius(focusNode)+FOCUS_HALO_PADDING}:void 0,showNodeLabels:this.canvasNodeLabelsVisible(),haloColor:resolveColor(this.ownerWindow?.matchMedia?.("(forced-colors: active)").matches?"CanvasText":cs.getPropertyValue("--lr-graph-focus-halo-color").trim()||cs.getPropertyValue("--lr-color-brand").trim()),selectedColor:resolveColor(cs.getPropertyValue("--lr-graph-selected-color").trim()||cs.getPropertyValue("--lr-color-success").trim()),dimmedOpacity:(()=>{const value=Number(cs.getPropertyValue("--lr-graph-dimmed-opacity").trim());return Number.isFinite(value)?Math.min(1,Math.max(0,value)):.35})(),hullOpacity:(()=>{const value=Number(cs.getPropertyValue("--lr-graph-hull-opacity").trim());return Number.isFinite(value)?Math.min(1,Math.max(0,value)):.12})(),labelColor:resolveColor(cs.getPropertyValue("--lr-color-text").trim()),labelHaloColor:resolveColor(cs.getPropertyValue("--lr-graph-edge-label-halo").trim()||cs.getPropertyValue("--lr-color-surface").trim()),expandBadgeFill:resolveColor(cs.getPropertyValue("--lr-color-surface").trim()),expandBadgeStroke:resolveColor(cs.getPropertyValue("--lr-color-border-strong").trim()),font:`${this.edgeLabelFontPx()}px ${cs.getPropertyValue("--lr-font").trim()||"sans-serif"}`,borderWidths:["thin","medium","thick"].map((size,index)=>resolveCssTokenLength(cs.getPropertyValue(`--lr-border-width-${size}`).trim(),{host:this})??index+1)};return this.canvasNodesById=new Map(this.simNodes.map((node,index)=>[node.id,scene.nodes[index]])),this.canvasLinksById=new Map(this.simLinks.map((link,index)=>[this.linkKey(link),scene.links[index]])),this.updateCanvasFocus(scene),scene})}updateCanvasFocus(scene){const index=shadowFocusTarget(this)?.getAttribute("part")==="cursor-item"?this.normalizedGraphItem():-1,node=index>=0&&index<this.linkIndexBase()?this.simNodes[index]:void 0,link=index>=this.linkIndexBase()&&index<this.communityIndexBase()?this.navigableLinks()[index-this.linkIndexBase()]:void 0,community=index>=this.communityIndexBase()?this.visibleCommunities()[index-this.communityIndexBase()]:void 0;scene.keyboardFocusRing=node?{x:node.x??0,y:node.y??0,r:this.nodeRadius(node)+4}:void 0,scene.keyboardFocusLink=link?{...this.linkCoordinates(link),width:this.safeLinkWidth(link)}:void 0,scene.keyboardFocusHull=community?{d:hullPathD(this.communityHull(community.members))}:void 0}drawCanvas(){if(!this.canvasEl||!this.canvasCtx)return;const dpr=this.ownerWindow?.devicePixelRatio||1,w=this.canvasEl.clientWidth||this.safeWidth,h=this.canvasEl.clientHeight||this.safeHeight,backingW=Math.round(w*dpr),backingH=Math.round(h*dpr);(this.canvasEl.width!==backingW||this.canvasEl.height!==backingH)&&(this.canvasEl.width=backingW,this.canvasEl.height=backingH);const ctx=this.canvasCtx;ctx.setTransform(dpr,0,0,dpr,0,0),ctx.clearRect(0,0,w,h);const edgeLabelsVisible=this.withEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom,nodeLabelsVisible=this.canvasNodeLabelsVisible();(!this.canvasScene||this.canvasScene.showNodeLabels!==nodeLabelsVisible||this.canvasSceneHasEdgeLabels!==edgeLabelsVisible)&&(this.canvasScene=this.buildCanvasScene(this.computedStyle()),this.canvasSceneHasEdgeLabels=edgeLabelsVisible),this.updateCanvasFocus(this.canvasScene),drawGraphScene(ctx,this.canvasCamera,this.canvasScene,{width:w,height:h})}rebuildPickItems(){this.pickItems=[...this.visibleCommunities().map(entry=>({kind:"hull",entry})),...this.navigableLinks().map(link=>({kind:"link",link})),...this.simNodes.map(node=>({kind:"node",node}))]}redrawPickCanvas(){if(!this.pickCtx||!this.canvasEl||!this.pickCanvas)return;(this.pickCanvas.width!==this.canvasEl.width||this.pickCanvas.height!==this.canvasEl.height)&&(this.pickCanvas.width=this.canvasEl.width,this.pickCanvas.height=this.canvasEl.height),this.rebuildPickItems();const dpr=this.ownerWindow?.devicePixelRatio||1;this.pickCtx.setTransform(dpr,0,0,dpr,0,0),drawPickingScene(this.pickCtx,this.canvasCamera,{hulls:this.pickItems.filter(i=>i.kind==="hull").map(i=>({d:hullPathD(this.communityHull(i.entry.members))})),links:this.pickItems.filter(i=>i.kind==="link").map(i=>{const c=this.linkCoordinates(i.link);return{x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,width:this.safeLinkWidth(i.link)}}),nodes:this.pickItems.filter(i=>i.kind==="node").map(i=>({x:i.node.x??0,y:i.node.y??0,r:this.nodeRadius(i.node)+2,shape:this.nodeShape(i.node)}))}),this.pickDirty=!1}hitTest(clientX,clientY){if(!this.canvasEl||!this.pickCtx)return;this.pickDirty&&this.redrawPickCanvas();const rect=this.canvasEl.getBoundingClientRect(),dpr=this.ownerWindow?.devicePixelRatio||1,px=Math.round((clientX-rect.left)*dpr),py=Math.round((clientY-rect.top)*dpr);if(px<0||py<0||px>=this.pickCtx.canvas.width||py>=this.pickCtx.canvas.height)return;const data=this.pickCtx.getImageData(px,py,1,1).data,index=pickColorToIndex(data[0],data[1],data[2]);return index>=0?this.pickItems[index]:void 0}bindCanvasZoom(){if(!this.d3||!this.canvasEl)return;const bounds=this.effectiveZoomBounds,zoomBehavior=this.d3.zoom().scaleExtent([bounds.min,bounds.max]).on("start",()=>{this.isApplyingZoomTransform||(this.isPanning=!0,this.cancelCameraTween())}).on("zoom",event=>{this.canvasCamera={k:event.transform.k,x:event.transform.x,y:event.transform.y},this.markCanvasCameraDirty(),this.scheduleViewportChange()}).on("end",()=>{this.isPanning=!1});this.zoomBehavior=zoomBehavior,this.d3.select(this.canvasEl).call(zoomBehavior)}bindCanvasPointer(){const canvas=this.canvasEl;canvas.addEventListener("pointerdown",this.onCanvasPointerDown),canvas.addEventListener("pointermove",this.onCanvasPointerMove),canvas.addEventListener("pointerup",this.onCanvasPointerUp),canvas.addEventListener("pointercancel",this.onCanvasPointerCancel),canvas.addEventListener("lostpointercapture",this.onCanvasLostPointerCapture),canvas.addEventListener("pointerleave",this.onCanvasPointerLeave),canvas.addEventListener("dblclick",this.onCanvasDblClick)}simulationIsTicking(){return this.simulation!=null&&this.simulation.alpha()>this.simulation.alphaMin()}flushCanvasDrag(redraw=!0){this.canvasDragGeneration++,this.canvasDragFrame!==void 0&&this.canvasDragFrameOwner?.cancelAnimationFrame(this.canvasDragFrame),this.canvasDragFrame=void 0,this.canvasDragFrameOwner=void 0;const pending=this.pendingCanvasDrag;if(this.pendingCanvasDrag=void 0,!pending||!redraw||!this.isConnected||!this.canvasEl)return;const node=this.canvasDragNode&&this.simNodeById.get(this.canvasDragNode.id);if(!node)return;const rect=this.canvasEl.getBoundingClientRect();node.fx=(pending.x-rect.left-this.canvasCamera.x)/this.canvasCamera.k,node.fy=(pending.y-rect.top-this.canvasCamera.y)/this.canvasCamera.k,this.markCanvasCameraDirty()}finishCanvasNodeDrag(pointerId,releaseCapture=!0,redraw=!0){const activePointerId=this.canvasPointerId;if(activePointerId==null||pointerId!=null&&pointerId!==activePointerId)return;this.flushCanvasDrag(redraw);const node=this.canvasDragNode&&this.simNodeById.get(this.canvasDragNode.id);if(this.canvasDragNode=void 0,this.canvasPointerId=void 0,this.simulation?.alphaTarget(0),node){if(redraw&&this.isConnected&&node.fx!=null&&node.fy!=null){node.x=node.fx,node.y=node.fy,node.vx=0,node.vy=0;const position=this.lastPositionById.get(node.id);position&&(position.x=node.x,position.y=node.y)}node.fx=null,node.fy=null}if(releaseCapture&&this.canvasEl)try{this.canvasEl.releasePointerCapture(activePointerId)}catch{}redraw?this.markCanvasDirty():(this.canvasScene=void 0,this.pickDirty=!0)}takeCanvasPointerDown(pointerId){if(pointerId!=null&&this.canvasPointerDownId!==pointerId)return;const down=this.canvasPointerDownAt;return this.canvasPointerDownAt=void 0,this.canvasPointerDownId=void 0,down}canvasHoverSuppressed(){return!!this.canvasDragNode||this.isDragging||this.isPanning||this.isCameraTweening}updateCanvasHover(hit){const next=hit?.kind==="node"?{kind:"node",id:hit.node.id}:hit?.kind==="link"?{kind:"link",id:this.linkKey(hit.link),detail:this.linkHoverDetail(hit.link)}:void 0,previous=this.canvasHover;previous?.kind===next?.kind&&previous?.id===next?.id||(this.canvasHover=next,previous?.kind==="node"?this.emit("lr-node-leave",{nodeId:previous.id}):previous?.kind==="link"&&this.emitEdgeHover("leave",previous.detail),!(!this.isConnected||this.renderer!=="canvas"||this.canvasHover!==next)&&(next?.kind==="node"?this.emit("lr-node-enter",{nodeId:next.id}):next?.kind==="link"&&this.emitEdgeHover("enter",next.detail)))}nodeAtCanvasPoint(clientX,clientY){if(!this.canvasEl)return;const rect=this.canvasEl.getBoundingClientRect(),worldX=(clientX-rect.left-this.canvasCamera.x)/this.canvasCamera.k,worldY=(clientY-rect.top-this.canvasCamera.y)/this.canvasCamera.k;let closest,closestDistance=1/0;for(const node of this.simNodes){const distance=Math.hypot((node.x??0)-worldX,(node.y??0)-worldY);distance<=this.nodeRadius(node)+2/this.canvasCamera.k&&distance<closestDistance&&(closest=node,closestDistance=distance)}return closest}updateCanvasTooltip(hit,clientX,clientY){if(!this.canvasTooltipEl)return;if(!hit||hit.kind==="hull"){this.canvasTooltipEl.setAttribute("hidden","");return}const rect=this.canvasEl.getBoundingClientRect();this.canvasTooltipEl.textContent=hit.kind==="node"?this.nodeTooltipText(hit.node):this.linkTooltipText(hit.link);let left=clientX-rect.left,top=clientY-rect.top;this.canvasTooltipEl.style.left=`${left}px`,this.canvasTooltipEl.style.top=`${top}px`,this.canvasTooltipEl.removeAttribute("hidden");const tooltipRect=this.canvasTooltipEl.getBoundingClientRect(),view=this.ownerWindow;if(!view)return;const minLeft=Math.max(0,rect.left),maxRight=Math.min(view.innerWidth,rect.right),minTop=Math.max(0,rect.top),maxBottom=Math.min(view.innerHeight,rect.bottom);tooltipRect.right>maxRight&&(left-=tooltipRect.right-maxRight),tooltipRect.left<minLeft&&(left+=minLeft-tooltipRect.left),tooltipRect.bottom>maxBottom&&(top-=tooltipRect.bottom-maxBottom),tooltipRect.top<minTop&&(top+=minTop-tooltipRect.top),this.canvasTooltipEl.style.left=`${left}px`,this.canvasTooltipEl.style.top=`${top}px`}isSelected(kind,id){return identitySet(kind==="node"?this.selectedNodeIds:this.selectedEdgeIds).has(id)}paintedCurrent(kind,id){return this.selectionMode==="none"&&this.isSelected(kind,id)?"true":nothing}isDimmed(kind,id){return identitySet(kind==="node"?this.dimmedNodeIds:this.dimmedEdgeIds).has(id)}linkKey(link){return graphLinkIdentity(link)}emitSelectionIntent(kind,id,toggle){if(this.selectionMode==="none")return;const selected=this.isSelected(kind,id),time=this.ownerWindow?.performance.now()??0,repeat=this.lastActivation?.id===id&&time-this.lastActivation.time<=EXPAND_KEY_INTERVAL_MS;if(this.lastActivation={id,time},this.selectionMode==="single"||!toggle){if(this.selectionMode==="single"&&selected){repeat||this.emit("lr-selection-change",{selectedNodeIds:[],selectedEdgeIds:[]});return}this.emit("lr-selection-change",kind==="node"?{selectedNodeIds:[id],selectedEdgeIds:[]}:{selectedNodeIds:[],selectedEdgeIds:[id]});return}const selectedNodeIds=canonicalIdentityList(this.selectedNodeIds),selectedLinkIds=canonicalIdentityList(this.selectedEdgeIds),nodeIds=kind==="node"?selected?selectedNodeIds.filter(x=>x!==id):[...selectedNodeIds,id]:selectedNodeIds,linkIds=kind==="link"?selected?selectedLinkIds.filter(x=>x!==id):[...selectedLinkIds,id]:selectedLinkIds;this.emit("lr-selection-change",{selectedNodeIds:nodeIds,selectedEdgeIds:linkIds})}clearSelection(){this.selectionMode!=="none"&&(!canonicalIdentityList(this.selectedNodeIds).length&&!canonicalIdentityList(this.selectedEdgeIds).length||this.emit("lr-selection-change",{selectedNodeIds:[],selectedEdgeIds:[]}))}requestUpdate(...args){if(args[0]===void 0&&(this.explicitRefresh=!0,this.sourceEpoch=(this.sourceEpoch??0)+1,this.sourceNavigation=(this.sourceNavigation??0)+1),!this.sourceSyncing&&["sourcePage","sourcePageSize"].includes(String(args[0]))){this.sourceNavigation=(this.sourceNavigation??0)+1;const active=this.shadowRoot?.activeElement;this.sourceRestoreFocus=!!active&&!!this.shadowRoot?.querySelector('[part="source-navigator"]')?.contains(active),this.sourceRestorePager=active===this.shadowRoot?.querySelector(tag("pagination"))}(args[0]===void 0||["graphSource","sourcePage","sourcePageSize"].includes(String(args[0])))&&this.syncGraphSource(),super.requestUpdate(...args)}willUpdate(changed){this.syncGraphSource();const acceptedScene=this.sourceScene.state.scene,sourceSceneChanged=this.sourceMode&&(this.sourceModelScene!==acceptedScene||changed.has("graphSource")||changed.has("nodeTypes")||changed.has("communities"));if(sourceSceneChanged&&(this.sourceModelScene=acceptedScene,this.sourceModel=void 0,this.sourceModelVersion++),this.sourceMode&&this.sourcePages.state.result){try{this.assertSourceTotals(this.sourcePages.state.result.summary)}catch(error){this.sourceBindingError=error,this.sourceModel=void 0}this.sourcePage!==this.sourcePages.state.page&&(this.sourceSyncing=!0,this.sourcePage=this.sourcePages.state.page,this.sourceSyncing=!1,this.sourcePageInputs&&(this.sourcePageInputs=[this.sourcePage,...this.sourcePageInputs.slice(1)]))}if(this.sourceMode){const records=this.sourcePages.state,recordStatus=this.sourceBindingError||records.error||records.selectionError?"error":records.pending?"loading":"ready";this.announcements.transition("source-records",recordStatus,recordStatus==="error"?this.localize("graphSourceRecordsError"):recordStatus==="loading"?this.localize("loading"):"");const scene=this.sourceScene.state,sceneStatus=this.sourceBindingError||scene.error?"error":scene.pending?"loading":"ready";this.announcements.transition("source-scene",sceneStatus,sceneStatus==="error"?this.localize("graphSourceSceneError"):sceneStatus==="loading"?this.localize("loading"):"")}this.sourceMode&&!this.sourceComposition.profile?.empty&&changed.has("view")&&this.view!=="list"&&!this.sourceScene.state.scene&&!this.sourceScene.state.pending&&!this.sourceBindingError&&this.sourceScene.request({mode:"neighborhood",centerKey:this.sourceCenter,bounds:null,includeKeys:this.sourceKeys}),changed.has("view")&&(this.spatialGeneration++,this.spatialLoad=void 0,this.view!=="2d"&&(this.layeredGeneration++,this.layeredLoad=void 0)),(this.optionalLoadFailure==="spatial"&&this.view==="2d"||this.optionalLoadFailure==="layered"&&(this.view!=="2d"||this.layout!=="layered"))&&(this.optionalLoadFailure=void 0),this.loadFailed=this.view!=="2d"?this.optionalLoadFailure==="spatial":this.d3LoadFailed||this.layout==="layered"&&this.optionalLoadFailure==="layered",changed.has("layout")&&this.layout!=="layered"&&(this.layeredGeneration++,this.layeredLoad=void 0,this.view==="2d"&&(this.loading=!this.d3&&!this.loadFailed)),this.view!=="2d"&&!this.loadFailed&&!this.sourceList&&this.ensureSpatial(),this.view==="2d"&&this.layout==="layered"&&!this.loadFailed&&this.ensureLayered(),super.willUpdate(changed),changed.has("view")&&this.isConnected&&(this.view!=="2d"?(this.loadGeneration+=1,this.simulation?.stop(),this.cancelCameraTween(),this.finishCanvasNodeDrag(void 0,!0,!1),this.takeCanvasPointerDown(),this.canvasDrawRafId!=null&&this.canvasDrawRafOwner?.cancelAnimationFrame(this.canvasDrawRafId),this.canvasDrawRafId=void 0,this.canvasDrawRafOwner=void 0,this.hoverRafId!=null&&this.hoverRafOwner?.cancelAnimationFrame(this.hoverRafId),this.hoverRafId=void 0,this.hoverRafOwner=void 0,this.pendingHover=void 0,this.viewportChangeRafId!=null&&this.viewportChangeRafOwner?.cancelAnimationFrame(this.viewportChangeRafId),this.viewportChangeRafId=void 0,this.viewportChangeRafOwner=void 0,this.canvasDprQuery?.removeEventListener("change",this.onCanvasDprChange),this.canvasDprQuery=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.zoomedEl=void 0,this.gEl=void 0,this.boundNodeEls=new WeakSet,this.syncHostResizeObserver()):changed.get("view")!==void 0&&(this.spatial?.disconnect(),this.connect2d(),this.d3&&this.rebuildSimulation())),this.loading=this.view==="2d"&&!this.loadFailed&&(!this.d3||this.layout==="layered"&&!this.layeredEngine),changed.has("height")&&this.syncRequestedHeightVar(),changed.has("fitTo")&&this.fitTo!=="container"&&(this.containerSize=null),this.fitTo==="container"&&!this.containerSize&&this.measureHostBox();const cursorOnly=!this.explicitRefresh&&changed.size>0&&[...changed.keys()].every(key=>key==="activeGraphItem"||key==="graphLiveText");if(this.paintUpdate=this.explicitRefresh||![...changed.keys()].every(key=>["activeGraphItem","graphLiveText","selectedNodeIds","selectedEdgeIds","dimmedNodeIds","dimmedEdgeIds","minZoom","maxZoom","camera","focusNodeId","selectionMode"].includes(String(key))),this.cursorUpdate=cursorOnly,this.paintUpdate)if(!this.explicitRefresh&&[...changed.keys()].every(key=>["width","height","containerSize","fitTo"].includes(String(key))))for(const value of this.resolvedCssColorCache.keys())/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\([\d\s.,%+/-]+\))$/i.test(value)||this.resolvedCssColorCache.delete(value);else this.resolvedCssColorCache.clear();if(this.explicitRefresh=!1,this.paintUpdate&&(this.navigableLinksCache=void 0),this.syncGraphHostRole(),this.view!=="2d"){this.spatial?.prepare(),this.focusNodeId==null?this.lastAppliedFocusNodeId=null:!this.sourceMode&&this.focusNodeId!==this.lastAppliedFocusNodeId&&this.spatial?.focusNode(this.focusNodeId)&&(this.lastAppliedFocusNodeId=this.focusNodeId),this.isMounting=!1;return}const wasMounting=this.isMounting;this.isMounting=!1;const hiddenTypesChanged=changed.has("hiddenTypes")&&!sameIds(canonicalIdentityList(changed.get("hiddenTypes")??[]),canonicalIdentityList(this.hiddenTypes)),structureChanged=this.d3&&(sourceSceneChanged||changed.has("sourceModelVersion")||!this.sourceMode&&(changed.has("nodes")||changed.has("edges"))||hiddenTypesChanged||changed.has("layout")||this.layout==="layered"&&changed.has("edgeDistance")),graphItemsChanged=!!(structureChanged||changed.has("simNodes")||changed.has("communities")),activePart=shadowFocusTarget(this)?.getAttribute("part")??"",hadGraphItemFocus=graphItemsChanged&&["node","link","hull","cursor-item"].includes(activePart),previousIndex=this.normalizedGraphItem(),previousIdentity=graphItemsChanged?this.graphItemIdentity(previousIndex):void 0;if(structureChanged&&this.isConnected){this.rebuildSimulation(),this.renderer==="svg"&&this.simNodes.length+this.simLinks.length>1e3&&devWarnOnce("lr-graph-svg-scale",'<lr-graph>: renderer="svg" draws every node and link as DOM; use renderer="canvas" above about 1,000 of them.');const hovered=this.svgHoverNodeId;hovered!=null&&!this.simNodeById.has(hovered)&&(this.svgHoverNodeId=void 0,this.emit("lr-node-leave",{nodeId:hovered})),this.canvasHover?.kind==="node"&&!this.simNodeById.has(this.canvasHover.id)&&this.updateCanvasHover(void 0),this.navigableLinksCache=void 0}if(graphItemsChanged){this.visibleCommunitiesCache=void 0;const retainedIndex=previousIdentity?this.graphItemIndex(previousIdentity):-1,nextIndex=retainedIndex>=0?retainedIndex:this.normalizedGraphItem(previousIndex);this.activeGraphItem=nextIndex>=0?nextIndex:0,hadGraphItemFocus&&(this.pendingGraphItemFocus=nextIndex>=0?nextIndex:"base",nextIndex>=0&&(this.graphLiveText=this.graphItemAnnouncement(nextIndex)))}const selectedNodeIdsChanged=changed.has("selectedNodeIds")&&!sameIds(changed.get("selectedNodeIds"),this.selectedNodeIds),selectedLinkIdsChanged=changed.has("selectedEdgeIds")&&!sameIds(changed.get("selectedEdgeIds"),this.selectedEdgeIds);(selectedNodeIdsChanged||selectedLinkIdsChanged)&&!wasMounting&&(this.graphLiveText=this.localize("graphSelectionCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(canonicalIdentityList(this.selectedNodeIds).length+canonicalIdentityList(this.selectedEdgeIds).length)}))}updated(changed){if(super.updated(changed),this.publishSourceComposition(),this.sourceMode&&!this.sourcePages.state.pending&&this.sourceRestoreFocus){this.sourceRestoreFocus=!1;const target=this.sourceRestorePager?this.renderRoot.querySelector(tag("pagination")):void 0;if(this.sourceRestorePager=!1,target){const current=this.sourceAuthority();target.updateComplete.then(()=>{current()&&target.focus()})}else(this.renderRoot.querySelector("[data-source-key]")??this.renderRoot.querySelector('[part="source-navigator"]'))?.focus()}if(this.sourceMode&&this.focusNodeId&&this.focusNodeId!==this.lastAppliedFocusNodeId&&(!this.loading||this.view!=="2d")&&(this.lastAppliedFocusNodeId=this.focusNodeId,this.focusNode(this.focusNodeId)),!this.isConnected){for(const[key,previous]of changed)this.detachedGraphChanges.has(key)||this.detachedGraphChanges.set(key,previous);return}if(this.view!=="2d"){this.setAttribute("aria-busy","false"),this.spatial?.update(this.paintUpdate);return}this.setAttribute("aria-busy",String(this.loading));const announceGraphText=this.graphAnnouncementsReady&&changed.has("graphLiveText")&&this.graphLiveText!=="";if(!this.loading&&!this.loadFailed&&(this.graphAnnouncementsReady=!0),announceGraphText&&this.announcements.announcePolite(this.graphLiveText),changed.has("loadFailed")&&changed.get("loadFailed")!==void 0&&this.loadFailed&&this.announcements.announceAssertive(this.localize("graphMissingLibrary")),(changed.has("fitTo")||changed.has("renderer"))&&this.syncHostResizeObserver(),!this.d3)return;!changed.has("nodes")&&!changed.has("edges")&&!changed.has("hiddenTypes")&&((changed.has("width")||changed.has("height")||changed.has("containerSize")||changed.has("fitTo"))&&(this.simulation?.force("center",this.d3.forceCenter(this.safeWidth/2,this.safeHeight/2)),this.simulation?.alpha(.1).restart()),(changed.has("chargeStrength")||changed.has("edgeDistance"))&&(changed.has("chargeStrength")&&this.chargeForce?.strength(this.safeChargeStrength),changed.has("edgeDistance")&&this.linkForce?.distance(this.safeLinkDistance),this.simulation?.alpha(.3).restart())),this.applyInteractions(changed);const cursorOnly=this.cursorUpdate;if(this.renderer==="svg"){cursorOnly||(this.svgCursorItems=[...this.renderRoot.querySelectorAll('[part="node"]'),...this.renderRoot.querySelectorAll('[part="link"][tabindex]'),...this.renderRoot.querySelectorAll('[part="hull"]')]);const next=this.svgCursorItems[this.normalizedGraphItem()];this.svgCursorElement!==next&&this.svgCursorElement?.setAttribute("tabindex","-1"),next?.setAttribute("tabindex","0"),this.svgCursorElement=next}this.renderer==="canvas"&&cursorOnly?this.scheduleCanvasDraw():this.applyCanvasInteractions(changed),this.focusNodeId==null?this.lastAppliedFocusNodeId=null:!this.sourceMode&&this.focusNodeId!==this.lastAppliedFocusNodeId&&this.simNodeById.has(this.focusNodeId)&&(this.lastAppliedFocusNodeId=this.focusNodeId,this.focusNode(this.focusNodeId)),this.visible||this.simulation?.stop(),this.updateFocusHalo();const pendingFocus=this.pendingGraphItemFocus;pendingFocus!==void 0&&(this.pendingGraphItemFocus=void 0,pendingFocus==="base"?this.renderRoot.querySelector('[part="canvas"], [part="svg"]')?.focus():this.focusGraphItemElement(pendingFocus))}applyInteractions(changed){if(!this.d3||this.renderer!=="svg")return;const svgEl=this.renderRoot.querySelector("svg"),reboundSurface=svgEl&&svgEl!==this.zoomedEl;if(svgEl&&reboundSurface){this.syncHostResizeObserver(),this.canvasHover=void 0,this.zoomedEl=svgEl,this.gEl=this.renderRoot.querySelector("g"),this.focusHaloEl=this.renderRoot.querySelector('[part="focus-halo"]');const bounds=this.effectiveZoomBounds,zoomBehavior=this.d3.zoom().scaleExtent([bounds.min,bounds.max]).on("start",()=>{this.isApplyingZoomTransform||(this.isPanning=!0,this.cancelCameraTween())}).on("zoom",event=>{this.gEl?.setAttribute("transform",event.transform.toString()),this.updateHitAreaZoomScale(event.transform.k),this.updateEdgeLabelZoomGate(event.transform.k),this.updateNodeLabelZoomGate(event.transform.k),this.scheduleViewportChange()}).on("end",()=>{this.isPanning=!1});this.zoomBehavior=zoomBehavior,this.d3.select(svgEl).call(zoomBehavior),this.updateHitAreaZoomScale(1),this.updateEdgeLabelZoomGate(1),this.updateNodeLabelZoomGate(1)}else if(this.zoomBehavior&&(changed.has("minZoom")||changed.has("maxZoom"))){const bounds=this.effectiveZoomBounds;this.zoomBehavior.scaleExtent([bounds.min,bounds.max])}if(changed.has("nodeLabels")&&this.zoomedEl&&this.updateNodeLabelZoomGate(this.d3.zoomTransform(this.zoomedEl).k),!(reboundSurface||changed.has("simNodes")||changed.has("simLinks")||changed.has("nodeTypes")||changed.has("withEdgeLabels")||changed.has("nodeLabels")||changed.has("communities")))return;const nodeEls=Array.from(this.renderRoot.querySelectorAll('[part="node"]'));this.nodeEls=nodeEls,this.nodeHitEls=Array.from(this.renderRoot.querySelectorAll('[data-hit-area="node"]')),this.nodeLabelEls=nodeEls.map(el=>el.parentElement?.querySelector('[part="label"]')??null),this.expandIndicatorEls=nodeEls.map(el=>el.parentElement?.querySelector('[part="expand-indicator"]')??null),this.linkEls=Array.from(this.renderRoot.querySelectorAll('[part="link"]:not([data-dangling])')),this.linkHitEls=Array.from(this.renderRoot.querySelectorAll('[data-hit-area="link"]')),this.linkLabelEls=this.linkEls.map(el=>el.parentElement?.querySelector('[part="link-label"]')??null),this.linkLabelHiddenByLength=[],this.danglingLinkEls=Array.from(this.renderRoot.querySelectorAll('[part="link"][data-dangling]')),this.communityHullEls=Array.from(this.renderRoot.querySelectorAll('[part="hull"]')),this.communityHullHitEls=Array.from(this.renderRoot.querySelectorAll('[data-hit-area="hull"]')),this.communityLabelEls=Array.from(this.renderRoot.querySelectorAll('[part="community-label"]')),this.layout!=="layered"&&nodeEls.forEach((el,i)=>{const id=this.simNodes[i]?.id;if(id!=null)for(const dragTarget of[el,this.nodeHitEls[i]])!dragTarget||this.boundNodeEls.has(dragTarget)||(this.boundNodeEls.add(dragTarget),this.d3.select(dragTarget).call(this.d3.drag().on("start",event=>{this.isDragging=!0,event.sourceEvent?.stopPropagation(),event.active||this.simulation?.alphaTarget(.3).restart();const n=this.simNodeById.get(id);n&&(n.fx=n.x,n.fy=n.y)}).on("drag",event=>{const n=this.simNodeById.get(id);n&&(n.fx=event.x,n.fy=event.y)}).on("end",event=>{this.isDragging=!1,event.active||this.simulation?.alphaTarget(0);const n=this.simNodeById.get(id);n&&(n.fx=null,n.fy=null)})))})}updateHitAreaZoomScale(zoom){const safeZoom=finiteRange(zoom,1,Number.EPSILON);this.gEl?.style.setProperty("--_lr-graph-hit-area-scale",String(1/safeZoom))}applyCanvasInteractions(changed){if(this.renderer!=="canvas"||!this.canvasEl)return;this.canvasEl!==this.zoomedEl&&(this.zoomedEl=this.canvasEl,this.setUpCanvasSurface());const bounds=this.effectiveZoomBounds;if(this.zoomBehavior?.scaleExtent([bounds.min,bounds.max]),!this.paintUpdate&&this.canvasScene){for(const[property2,map,flag]of[["selectedNodeIds",this.canvasNodesById,"selected"],["selectedEdgeIds",this.canvasLinksById,"selected"],["dimmedNodeIds",this.canvasNodesById,"dimmed"],["dimmedEdgeIds",this.canvasLinksById,"dimmed"]]){if(!changed.has(property2))continue;const before=identitySet(changed.get(property2)??[]),after=identitySet(this[property2]);for(const id of before){const item=map.get(id);item&&(item[flag]=after.has(id))}for(const id of after){const item=map.get(id);item&&(item[flag]=!0)}}if(changed.has("focusNodeId")){const node=this.focusNodeId==null?void 0:this.simNodeById.get(this.focusNodeId);this.canvasScene.focusHalo=node?{x:node.x??0,y:node.y??0,r:this.nodeRadius(node)+FOCUS_HALO_PADDING}:void 0}this.scheduleCanvasDraw()}else this.markCanvasDirty()}onTick(){for(const l of this.danglingLinks){const source=l.source,target=l.target;target.x=(source.x??0)+STUB_OFFSET_PX,target.y=(source.y??0)+STUB_OFFSET_PX}for(const n of this.simNodes)if(n.x!=null&&n.y!=null){const position=this.lastPositionById.get(n.id);position?(position.x=n.x,position.y=n.y):this.lastPositionById.set(n.id,{x:n.x,y:n.y})}if(this.renderer==="canvas"){this.canvasScene&&this.refreshCanvasGeometry(this.canvasScene),this.markCanvasCameraDirty(),this.scheduleViewportChange();return}this.simNodes.forEach((n,i)=>{const el=this.nodeEls[i];el&&(el.tagName==="circle"?(el.setAttribute("cx",String(n.x??0)),el.setAttribute("cy",String(n.y??0))):el.setAttribute("transform",`translate(${n.x??0},${n.y??0})`));const hit=this.nodeHitEls[i];hit&&(hit.setAttribute("x1",String((n.x??0)-NODE_HIT_SEGMENT_HALF)),hit.setAttribute("y1",String(n.y??0)),hit.setAttribute("x2",String((n.x??0)+NODE_HIT_SEGMENT_HALF)),hit.setAttribute("y2",String(n.y??0)));const label=this.nodeLabelEls[i];label&&(label.setAttribute("x",String((n.x??0)+this.nodeRadius(n)+2)),label.setAttribute("y",String(n.y??0)))}),this.simLinks.forEach((l,i)=>{const line=this.linkEls[i],coordinates=this.linkCoordinates(l);for(const target of[line,this.linkHitEls[i]])target&&(target.setAttribute("x1",String(coordinates.x1)),target.setAttribute("y1",String(coordinates.y1)),target.setAttribute("x2",String(coordinates.x2)),target.setAttribute("y2",String(coordinates.y2)))}),this.withEdgeLabels&&this.simLinks.forEach((l,i)=>{const labelEl=this.linkLabelEls[i];if(!labelEl)return;const label=ownGraphText(l,"label"),pos=this.edgeLabelPosition(l);labelEl.setAttribute("x",String(pos.x)),labelEl.setAttribute("y",String(pos.y));const{x1,y1,x2,y2}=this.linkCoordinates(l),edgeLength=Math.hypot(x2-x1,y2-y1),tooLong=this.edgeLabelWidth(label??"")>edgeLength*EDGE_LABEL_LENGTH_GATE_RATIO;this.linkLabelHiddenByLength[i]!==tooLong&&(this.linkLabelHiddenByLength[i]=tooLong,labelEl.setAttribute("visibility",tooLong?"hidden":"visible"))}),this.simNodes.forEach((n,i)=>{const indicator=this.expandIndicatorEls[i];indicator&&indicator.setAttribute("transform",`translate(${n.x??0},${n.y??0})`)}),this.danglingLinks.forEach((l,i)=>{const line=this.danglingLinkEls[i];if(!line)return;const coordinates=this.linkCoordinates(l);line.setAttribute("x1",String(coordinates.x1)),line.setAttribute("y1",String(coordinates.y1)),line.setAttribute("x2",String(coordinates.x2)),line.setAttribute("y2",String(coordinates.y2))}),this.updateFocusHalo(),this.visibleCommunities().forEach((entry,i)=>{const hullEl=this.communityHullEls[i],hullHitEl=this.communityHullHitEls[i],labelEl=this.communityLabelEls[i];if(!hullEl&&!hullHitEl&&!labelEl)return;const hull=this.communityHull(entry.members);hullEl&&hullEl.setAttribute("d",hullPathD(hull)),hullHitEl&&hullHitEl.setAttribute("d",hullPathD(hull)),labelEl&&(labelEl.setAttribute("x",String(hullCentroidX(hull))),labelEl.setAttribute("y",String(hullTopY(hull)-HULL_PADDING)))}),this.scheduleViewportChange()}rebuildSimulation(){if(this.view!=="2d"||!this.d3)return;this.simulation?.stop(),this.boundNodeEls=new WeakSet;const liveIds=new Set(this.graphModel.nodes.map(n=>n.id));for(const id of this.lastPositionById.keys())liveIds.has(id)||this.lastPositionById.delete(id);const visible=this.visibleNodes();if(this.layout==="layered"){if(!this.layeredEngine){this.ensureLayered();return}this.rebuildLayeredLayout(visible);return}const prevById=new Map(this.simNodes.map(n=>[n.id,n])),nodes=visible.map(n=>{const prev=prevById.get(n.id);if(prev)return{...prev,...n};const remembered=this.lastPositionById.get(n.id);return remembered?{...n,x:remembered.x,y:remembered.y}:{...n}}),byId=new Map(nodes.map(n=>[n.id,n])),{resolved:resolvedLinks,dangling:danglingLinks}=this.resolveLinksAgainst(byId),links=resolvedLinks;this.danglingLinks=danglingLinks;const seedForSpawn=this.safeSeed,incidentLinks=new Map;if(nodes.some(n=>n.x!=null))for(const l of resolvedLinks)for(const id of new Set([l.source.id,l.target.id])){const incident=incidentLinks.get(id);incident?incident.push(l):incidentLinks.set(id,[l])}for(const n of nodes){if(n.x!=null&&n.y!=null)continue;const neighborLink=incidentLinks.get(n.id)?.find(l=>{const source2=l.source,target2=l.target;return source2.id===n.id&&target2.x!=null||target2.id===n.id&&source2.x!=null});if(!neighborLink)continue;const source=neighborLink.source,target=neighborLink.target,neighbor=source.id===n.id?target:source,jitterRadius=this.safeLinkDistance/2,angle=seedForSpawn!=null?hashNodeSeed(seedForSpawn,n.id)/4294967296*Math.PI*2:Math.random()*Math.PI*2;n.x=(neighbor.x??0)+Math.cos(angle)*jitterRadius,n.y=(neighbor.y??0)+Math.sin(angle)*jitterRadius}if(seedForSpawn!=null)for(const n of nodes){if(n.x!=null&&n.y!=null)continue;const rng=mulberry32(hashNodeSeed(seedForSpawn,n.id));n.x=rng()*this.safeWidth,n.y=rng()*this.safeHeight}this.linkForce=this.d3.forceLink(links).distance(this.safeLinkDistance),this.chargeForce=this.d3.forceManyBody().strength(this.safeChargeStrength);const simulation=this.d3.forceSimulation(nodes).force("link",this.linkForce).force("charge",this.chargeForce).force("center",this.d3.forceCenter(this.safeWidth/2,this.safeHeight/2)).force("collide",this.d3.forceCollide().radius(n=>this.nodeRadius(n)+10)).on("tick",()=>this.onTick());if(this.simulation=simulation,this.visible||simulation.stop(),prefersReducedMotion(this)||this.safeSeed!=null){const pinnedForSettle=new Set;for(const n of nodes)(prevById.has(n.id)||this.lastPositionById.has(n.id))&&n.x!=null&&n.y!=null&&n.fx==null&&n.fy==null&&(n.fx=n.x,n.fy=n.y,pinnedForSettle.add(n.id));for(simulation.stop();simulation.alpha()>simulation.alphaMin();)simulation.tick();for(const n of nodes)pinnedForSettle.has(n.id)&&(n.fx=null,n.fy=null)}this.simNodes=nodes,this.simNodeById=byId,this.simLinks=links;for(const n of nodes)n.x!=null&&n.y!=null&&this.lastPositionById.set(n.id,{x:n.x,y:n.y});this.announceHiddenNodeCount(nodes.length)}announceHiddenNodeCount(visibleNodeCount){const totalNodeCount=this.graphModel.nodes.length,hiddenNodeCount=totalNodeCount-visibleNodeCount;totalNodeCount>0&&(hiddenNodeCount>0||this.lastHiddenNodeCount>0)&&(this.graphLiveText=this.localize("graphNodesHidden",void 0,{hidden:getNumberFormat(this.effectiveLocale).format(hiddenNodeCount),total:getNumberFormat(this.effectiveLocale).format(totalNodeCount)})),this.lastHiddenNodeCount=hiddenNodeCount}rebuildLayeredLayout(visible){const boxes=visible.map(n=>{const r=this.nodeRadius(n);return{id:n.id,width:r*2,height:r*2}}),visibleIds=new Set(visible.map(n=>n.id)),edges=this.graphModel.links.filter(l=>visibleIds.has(l.source)&&visibleIds.has(l.target)).map(l=>({source:l.source,target:l.target})),{positions:raw}=this.layeredEngine({nodes:boxes,edges,options:{gapX:12,gapY:this.safeLinkDistance}}),bounds=extent(raw.values(),point=>point.x,point=>point.y),offsetX=raw.size?this.safeWidth/2-(bounds.minX+(bounds.maxX-bounds.minX)/2):this.safeWidth/2,offsetY=raw.size?this.safeHeight/2-(bounds.minY+(bounds.maxY-bounds.minY)/2):this.safeHeight/2,nodes=visible.map(n=>{const p=raw.get(n.id);return{...n,x:p.x+offsetX,y:p.y+offsetY}}),byId=new Map(nodes.map(n=>[n.id,n])),{resolved,dangling}=this.resolveLinksAgainst(byId);this.danglingLinks=dangling,this.simulation=void 0,this.simNodes=nodes,this.simNodeById=byId,this.simLinks=resolved;for(const n of nodes)n.x!=null&&n.y!=null&&this.lastPositionById.set(n.id,{x:n.x,y:n.y});this.announceHiddenNodeCount(nodes.length)}selectionActionAuthority(){if(!this.sourceMode)return()=>!0;const current=this.sourceAuthority(),nodes=this.selectedNodeIds,edges=this.selectedEdgeIds;return()=>current()&&nodes===this.selectedNodeIds&&edges===this.selectedEdgeIds}onNodeClick(node,e){if(this.sourceDiagramBlocked)return;const current=this.selectionActionAuthority(),detail={nodeId:node.id,x:node.x??0,y:node.y??0};this.emit("lr-node-activate",{...detail}),current()&&this.emitSelectionIntent("node",node.id,!!(e?.ctrlKey||e?.metaKey))}getNodePosition(id){if(this.view!=="2d"){const position=this.getNodePosition3d(id);return position?{x:position.x,y:position.y}:void 0}const node=this.simNodes.find(candidate=>candidate.id===id);if(!(!node||!Number.isFinite(node.x)||!Number.isFinite(node.y)))return{x:node.x,y:node.y}}getNodePosition3d(id){if(this.view==="2d")return;if(this.spatial)return this.spatial.position(id);const node=this.visibleNodes().find(candidate=>candidate.id===id);return node?spatialNodePosition(node):void 0}getNodeScreenPosition(id){if(this.view!=="2d")return this.spatial?.screenPosition(id);const position=this.getNodePosition(id);if(!position||!this.zoomedEl||!this.d3)return;const hostRect=this.getBoundingClientRect(),rect=this.zoomedEl.getBoundingClientRect(),camera=this.d3.zoomTransform(this.zoomedEl),x=position.x*camera.k+camera.x,y=position.y*camera.k+camera.y;if("getScreenCTM"in this.zoomedEl){const matrix=this.zoomedEl.getScreenCTM();return matrix?{x:matrix.a*x+matrix.c*y+matrix.e-hostRect.left,y:matrix.b*x+matrix.d*y+matrix.f-hostRect.top}:void 0}return{x:rect.left-hostRect.left+x,y:rect.top-hostRect.top+y}}onLinkClick(link,e){if(this.sourceDiagramBlocked)return;const source=typeof link.source=="object"?link.source.id:String(link.source),target=typeof link.target=="object"?link.target.id:String(link.target),current=this.selectionActionAuthority();this.emit("lr-edge-activate",{sourceNodeId:source,targetNodeId:target,...link.id?{edgeId:link.id}:{}}),current()&&this.emitSelectionIntent("link",this.linkKey(link),!!(e?.ctrlKey||e?.metaKey))}onNodeEnter(node,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.setAttribute("data-hovered",""),this.svgHoverNodeId=node.id,this.emit("lr-node-enter",{nodeId:node.id}))}onNodeLeave(node,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),this.svgHoverNodeId=void 0,this.emit("lr-node-leave",{nodeId:node.id}))}onNodeDblClick(node,e){e.stopPropagation(),this.emit("lr-node-expand",{nodeId:node.id})}onLinkEnter(link,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.setAttribute("data-hovered",""),this.emitEdgeHover("enter",this.linkHoverDetail(link)))}linkHoverDetail(link){const source=typeof link.source=="object"?link.source.id:String(link.source),target=typeof link.target=="object"?link.target.id:String(link.target);return{sourceNodeId:source,targetNodeId:target,...link.id?{edgeId:link.id}:{}}}onLinkLeave(link,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),this.emitEdgeHover("leave",this.linkHoverDetail(link)))}emitEdgeHover(phase,detail){this.emit(phase==="enter"?"lr-edge-enter":"lr-edge-leave",{...detail})}nodeAccessibleText(node){let text=ownGraphText(node,"accessibleLabel")||ownGraphText(node,"label")||node.id;const type=this.resolveNodeType(node),typeLabel=type?ownGraphText(type,"label"):void 0;return typeLabel!==void 0&&(text=this.localize("graphTypedNode",void 0,{label:text,type:typeLabel})),node.expandable&&(text=this.localize("graphExpandableItem",void 0,{item:text})),text}boundedGraphText(value){if(typeof value!="string")return"";const normalized=value.replace(/\s+/g," ").trim();return normalized.length>512?`${normalized.slice(0,512)}…`:normalized}nodeTooltipText(node){return this.boundedGraphText(ownGraphText(node,"description")||ownGraphText(node,"label")||ownGraphText(node,"accessibleLabel")||node.id)}linkAccessibleText(link){const accessibleLabel=ownGraphText(link,"accessibleLabel");if(accessibleLabel)return accessibleLabel;const sourceValue=ownGraphValue(link,"source"),targetValue=ownGraphValue(link,"target"),source=sourceValue!==null&&typeof sourceValue=="object"?this.nodeAccessibleText(sourceValue):typeof sourceValue=="string"?sourceValue:"",target=targetValue!==null&&typeof targetValue=="object"?this.nodeAccessibleText(targetValue):typeof targetValue=="string"?targetValue:"";return ownGraphText(link,"label")||this.localize("graphLink",void 0,{source,target})}linkTooltipText(link){return this.boundedGraphText(ownGraphText(link,"description")||ownGraphText(link,"label")||ownGraphText(link,"accessibleLabel")||this.linkAccessibleText(link))}linkCoordinates(link){const source=link.source,target=link.target,x1=source.x??0,y1=source.y??0,targetX=target.x??0,targetY=target.y??0;if(!link.directed||link.dangling)return{x1,y1,x2:targetX,y2:targetY};const dx=targetX-x1,dy=targetY-y1,distance=Math.hypot(dx,dy);if(distance===0)return{x1,y1,x2:targetX,y2:targetY};const inset=Math.min(this.nodeRadius(target),distance);return{x1,y1,x2:targetX-dx/distance*inset,y2:targetY-dy/distance*inset}}edgeLabelPosition(link){const{x1,y1,x2,y2}=this.linkCoordinates(link),dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy),mx=(x1+x2)/2,my=(y1+y2)/2;return len===0?{x:mx,y:my}:{x:mx+-dy/len*EDGE_LABEL_OFFSET_PX,y:my+dx/len*EDGE_LABEL_OFFSET_PX}}edgeLabelFontPx(){const raw=this.computedStyle().getPropertyValue("--lr-font-size-2xs").trim();return resolveCssTokenLength(raw,{host:this})??DEFAULT_EDGE_LABEL_FONT_PX}edgeLabelContext(){return this.edgeLabelMeasureCanvas?.ownerDocument!==this.ownerDocument&&(this.edgeLabelMeasureCanvas=this.ownerDocument.createElement("canvas"),this.edgeLabelMeasureCtx=this.edgeLabelMeasureCanvas.getContext("2d")),this.edgeLabelMeasureCtx??null}edgeLabelWidth(text){const cached=this.edgeLabelWidthCache.get(text);if(cached!=null)return cached;const ctx=this.edgeLabelContext();let width;if(ctx){const fontFamily=this.computedStyle().getPropertyValue("--lr-font").trim()||"sans-serif";ctx.font=`${this.edgeLabelFontPx()}px ${fontFamily}`,width=ctx.measureText(text).width}else width=text.length*this.edgeLabelFontPx()*.6;if(this.edgeLabelWidthCache.size>=EDGE_LABEL_WIDTH_CACHE_MAX){const oldest=this.edgeLabelWidthCache.keys().next().value;oldest!==void 0&&this.edgeLabelWidthCache.delete(oldest)}return this.edgeLabelWidthCache.set(text,width),width}updateEdgeLabelZoomGate(k){this.gEl&&(k<this.safeEdgeLabelMinZoom?this.gEl.setAttribute("data-edge-labels-hidden",""):this.gEl.removeAttribute("data-edge-labels-hidden"))}updateNodeLabelZoomGate(k){this.gEl&&(this.resolvedNodeLabelsMode==="zoom"&&k<NODE_LABEL_MIN_ZOOM?this.gEl.setAttribute("data-node-labels-hidden",""):this.gEl.removeAttribute("data-node-labels-hidden"))}linkIndexBase(){return this.simNodes.length}communityIndexBase(){return this.linkIndexBase()+this.navigableLinks().length}graphItemCount(){return this.communityIndexBase()+this.visibleCommunities().length}normalizedGraphItem(index=this.activeGraphItem){const count=this.graphItemCount();return count?Math.min(Math.max(index,0),count-1):-1}graphItemIdentity(index){if(index<0)return;if(index<this.linkIndexBase()){const node=this.simNodes[index];return node?{kind:"node",id:node.id}:void 0}if(index<this.communityIndexBase()){const link=this.navigableLinks()[index-this.linkIndexBase()];return link?{kind:"link",id:this.linkKey(link)}:void 0}const community=this.visibleCommunities()[index-this.communityIndexBase()]?.community;return community?{kind:"community",id:community.id}:void 0}graphItemIndex(identity){if(identity.kind==="node")return this.simNodes.findIndex(node=>node.id===identity.id);if(identity.kind==="link"){const index2=this.navigableLinks().findIndex(link=>this.linkKey(link)===identity.id);return index2<0?-1:this.linkIndexBase()+index2}const index=this.visibleCommunities().findIndex(entry=>entry.community.id===identity.id);return index<0?-1:this.communityIndexBase()+index}communityText(community){return ownGraphText(community,"label")??community.id}graphItemText(index){if(index<this.linkIndexBase()){const node=this.simNodes[index];return node?this.localize("graphNode",void 0,{label:this.nodeTooltipText(node)}):""}if(index<this.communityIndexBase()){const link=this.navigableLinks()[index-this.linkIndexBase()];return link?this.linkTooltipText(link):""}const entry=this.visibleCommunities()[index-this.communityIndexBase()];return entry?this.localize("graphCommunity",void 0,{label:this.communityText(entry.community),count:getNumberFormat(this.effectiveLocale).format(entry.members.length)}):""}graphItemAnnouncement(index){return this.localize("graphItemAnnouncement",void 0,{item:this.graphItemText(index),index:getNumberFormat(this.effectiveLocale).format(index+1),total:getNumberFormat(this.effectiveLocale).format(this.graphItemCount())})}onGraphItemFocus(index){this.normalizedGraphItem(index)<0||(this.activeGraphItem=index,this.graphLiveText=this.graphItemAnnouncement(index))}focusGraphItem(index){const normalized=this.normalizedGraphItem(index);normalized<0||(this.activeGraphItem=normalized,this.graphLiveText=this.graphItemAnnouncement(normalized),this.updateComplete.then(()=>this.focusGraphItemElement(normalized)))}focusGraphItemElement(index){if(this.renderer==="canvas"){this.renderRoot.querySelector('[part="cursor-item"]')?.focus(),this.scheduleCanvasDraw();return}this.svgCursorItems[index]?.focus()}onGraphKeyDown(e,index,activate){if(e.key==="Enter"||e.key===" "){if(e.preventDefault(),e.repeat)return;if(this.onGraphItemFocus(index),activate(e),index<this.simNodes.length){const now=this.ownerWindow?.performance.now()??0;if(this.lastKeyActivateIndex===index&&now-this.lastKeyActivateTime<=EXPAND_KEY_INTERVAL_MS){const node=this.simNodes[index];node&&this.emit("lr-node-expand",{nodeId:node.id}),this.lastKeyActivateIndex=null}else this.lastKeyActivateIndex=index,this.lastKeyActivateTime=now}return}const count=this.graphItemCount();if(!count)return;const rtl=isRtl(this),forwardKey=rtl?"ArrowLeft":"ArrowRight",backwardKey=rtl?"ArrowRight":"ArrowLeft";let next=index;if(e.key===forwardKey||e.key==="ArrowDown")next=Math.min(count-1,index+1);else if(e.key===backwardKey||e.key==="ArrowUp")next=Math.max(0,index-1);else if(e.key==="Home")next=0;else if(e.key==="End")next=count-1;else return;e.preventDefault(),this.focusGraphItem(next)}render(){if(this.sourceList||this.sourceMode&&this.sourceComposition.profile?.empty)return html`<div class="source-layout source-list">${this.renderSourceNavigator()}</div>`;const svg2=this.view==="2d"&&this.renderer==="svg",result=svg2&&this.cursorUpdate&&this.svgTemplate?this.svgTemplate:this.renderGraph();this.svgTemplate=svg2?result:void 0;const sceneState=this.sourceScene.state,bindingError=this.sourceBindingError,current=this.sourceAuthority(),retryScene=()=>{current()&&this.sourceScene.state===sceneState&&this.sourceBindingError===bindingError&&!sceneState.pending&&(sceneState.error||bindingError)&&this.requestUpdate()},diagram=this.sourceMode&&(this.sourceScene.state.pending||this.sourceScene.state.error||this.sourceBindingError)?html`<div part="source-status" aria-busy=${this.sourceScene.state.pending?"true":"false"}>${this.localize(this.sourceScene.state.pending?"loading":"graphSourceSceneError")}
25
+ ${this.sourceScene.state.pending?nothing:html`<button type="button" @click=${retryScene}>${this.localize("retry")}</button>`}</div>`:result,content=this.sourceMode?html`<div class="source-layout"><div class="source-diagram">${diagram}</div>${this.renderSourceNavigator()}</div>`:result;return html`${content}${svg2?html`<div part="live-region" class="sr-only" aria-hidden="true">${this.graphLiveText||(this.normalizedGraphItem()>=0?this.graphItemAnnouncement(this.normalizedGraphItem()):"")}</div>`:nothing}`}renderGraph(){const nodeLimit=this.sourceMode?void 0:publicCollectionTruncation(this,"nodes"),edgeLimit=this.sourceMode?void 0:publicCollectionTruncation(this,"edges"),limitNotices=html`${nodeLimit?html`<p part="limit" role="note">${this.localize("graphNodeLimit",void 0,{shown:getNumberFormat(this.effectiveLocale).format(nodeLimit.retained),total:getNumberFormat(this.effectiveLocale).format(nodeLimit.source)})}</p>`:nothing}${edgeLimit?html`<p part="limit" role="note">${this.localize("graphEdgeLimit",void 0,{shown:getNumberFormat(this.effectiveLocale).format(edgeLimit.retained),total:getNumberFormat(this.effectiveLocale).format(edgeLimit.source)})}</p>`:nothing}`;if(this.view!=="2d"&&this.spatial)return this.spatial.render(limitNotices);if(this.view!=="2d")return html`<div part="base"><span part=${this.loadFailed?"error":"loading"}>${this.localize(this.loadFailed?"graphSpatialUnavailable":"loading")}</span>${limitNotices}</div>`;if(this.loading)return html`
2
26
  <div part="base">
3
27
  <lr-skeleton
4
28
  shape="rect"
@@ -213,9 +237,6 @@ import{__decorate}from"tslib";import{collectionSupport,publicCollectionTruncatio
213
237
  ></circle>
214
238
  </g>
215
239
  </svg>
216
- <div part="live-region" class="sr-only" aria-hidden="true">
217
- ${this.graphLiveText||(this.normalizedGraphItem()>=0?this.graphItemAnnouncement(this.normalizedGraphItem()):"")}
218
- </div>
219
240
  <ul
220
241
  part="data-list"
221
242
  class="sr-only"
@@ -231,4 +252,4 @@ import{__decorate}from"tslib";import{collectionSupport,publicCollectionTruncatio
231
252
  </ul>
232
253
  ${limitNotices}
233
254
  </div>
234
- `}}__decorate([property({attribute:!1})],LyraGraph.prototype,"nodes",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"edges",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"nodeTypes",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"hiddenTypes",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"communities",void 0),__decorate([property({converter:GRAPH_VIEW})],LyraGraph.prototype,"view",null),__decorate([property({attribute:!1})],LyraGraph.prototype,"camera",null),__decorate([property({converter:GRAPH_LAYOUT})],LyraGraph.prototype,"layout",null),__decorate([property()],LyraGraph.prototype,"renderer",void 0),__decorate([property({attribute:"fit-to"})],LyraGraph.prototype,"fitTo",void 0),__decorate([property({converter:graphLengthConverter})],LyraGraph.prototype,"width",void 0),__decorate([property({converter:graphLengthConverter})],LyraGraph.prototype,"height",void 0),__decorate([property({type:Number,attribute:"charge-strength"})],LyraGraph.prototype,"chargeStrength",void 0),__decorate([property({type:Number,attribute:"edge-distance"})],LyraGraph.prototype,"edgeDistance",void 0),__decorate([property({type:Number,attribute:"min-zoom"})],LyraGraph.prototype,"minZoom",void 0),__decorate([property({type:Number,attribute:"max-zoom"})],LyraGraph.prototype,"maxZoom",void 0),__decorate([property()],LyraGraph.prototype,"label",void 0),__decorate([property({attribute:"aria-label"})],LyraGraph.prototype,"accessibleLabel",void 0),__decorate([property({type:Number})],LyraGraph.prototype,"seed",void 0),__decorate([property({type:Boolean,attribute:"with-edge-labels"})],LyraGraph.prototype,"withEdgeLabels",void 0),__decorate([property({type:Number,attribute:"edge-label-min-zoom"})],LyraGraph.prototype,"edgeLabelMinZoom",void 0),__decorate([property({attribute:"node-labels"})],LyraGraph.prototype,"nodeLabels",void 0),__decorate([property({attribute:"focus-node-id"})],LyraGraph.prototype,"focusNodeId",void 0),__decorate([property({attribute:"selection-mode"})],LyraGraph.prototype,"selectionMode",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"selectedNodeIds",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"selectedEdgeIds",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"dimmedNodeIds",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"dimmedEdgeIds",void 0),__decorate([state()],LyraGraph.prototype,"loading",void 0),__decorate([state()],LyraGraph.prototype,"loadFailed",void 0),__decorate([state()],LyraGraph.prototype,"containerSize",void 0),__decorate([state()],LyraGraph.prototype,"simNodes",void 0),__decorate([state()],LyraGraph.prototype,"simLinks",void 0),__decorate([state()],LyraGraph.prototype,"activeGraphItem",void 0),__decorate([state()],LyraGraph.prototype,"graphLiveText",void 0),__decorate([query('[part="canvas"]')],LyraGraph.prototype,"canvasEl",void 0);export{LyraGraph};
255
+ `}}__decorate([state()],LyraGraph.prototype,"sourceState",void 0),__decorate([state()],LyraGraph.prototype,"sourceModelVersion",void 0),__decorate([state()],LyraGraph.prototype,"sourcePaint",void 0),__decorate([property({attribute:!1,noAccessor:!0,hasChanged:()=>!0})],LyraGraph.prototype,"graphSource",null),__decorate([property({type:Number,attribute:"source-page"})],LyraGraph.prototype,"sourcePage",void 0),__decorate([property({type:Number,attribute:"source-page-size"})],LyraGraph.prototype,"sourcePageSize",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"nodes",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"edges",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"nodeTypes",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"hiddenTypes",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"communities",void 0),__decorate([property({converter:GRAPH_VIEW})],LyraGraph.prototype,"view",null),__decorate([property({attribute:!1})],LyraGraph.prototype,"camera",null),__decorate([property({converter:GRAPH_LAYOUT})],LyraGraph.prototype,"layout",null),__decorate([property()],LyraGraph.prototype,"renderer",void 0),__decorate([property({attribute:"fit-to"})],LyraGraph.prototype,"fitTo",void 0),__decorate([property({converter:graphLengthConverter})],LyraGraph.prototype,"width",void 0),__decorate([property({converter:graphLengthConverter})],LyraGraph.prototype,"height",void 0),__decorate([property({type:Number,attribute:"charge-strength"})],LyraGraph.prototype,"chargeStrength",void 0),__decorate([property({type:Number,attribute:"edge-distance"})],LyraGraph.prototype,"edgeDistance",void 0),__decorate([property({type:Number,attribute:"min-zoom"})],LyraGraph.prototype,"minZoom",void 0),__decorate([property({type:Number,attribute:"max-zoom"})],LyraGraph.prototype,"maxZoom",void 0),__decorate([property()],LyraGraph.prototype,"label",void 0),__decorate([property({attribute:"aria-label"})],LyraGraph.prototype,"accessibleLabel",void 0),__decorate([property({type:Number})],LyraGraph.prototype,"seed",void 0),__decorate([property({type:Boolean,attribute:"with-edge-labels"})],LyraGraph.prototype,"withEdgeLabels",void 0),__decorate([property({type:Number,attribute:"edge-label-min-zoom"})],LyraGraph.prototype,"edgeLabelMinZoom",void 0),__decorate([property({attribute:"node-labels"})],LyraGraph.prototype,"nodeLabels",void 0),__decorate([property({attribute:"focus-node-id"})],LyraGraph.prototype,"focusNodeId",void 0),__decorate([property({attribute:"selection-mode"})],LyraGraph.prototype,"selectionMode",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"selectedNodeIds",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"selectedEdgeIds",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"dimmedNodeIds",void 0),__decorate([property({attribute:!1})],LyraGraph.prototype,"dimmedEdgeIds",void 0),__decorate([state()],LyraGraph.prototype,"loading",void 0),__decorate([state()],LyraGraph.prototype,"loadFailed",void 0),__decorate([state()],LyraGraph.prototype,"containerSize",void 0),__decorate([state()],LyraGraph.prototype,"simNodes",void 0),__decorate([state()],LyraGraph.prototype,"simLinks",void 0),__decorate([state()],LyraGraph.prototype,"activeGraphItem",void 0),__decorate([state()],LyraGraph.prototype,"graphLiveText",void 0),__decorate([query('[part="canvas"]')],LyraGraph.prototype,"canvasEl",void 0);export{LyraGraph};
@@ -1,2 +1,2 @@
1
1
  /** @deprecated Import @aceshooting/lyra-ui/components/lr-graph.js to register this component. */
2
- export*from'./graph.class.js';import'../../overlays/skeleton/skeleton.js';
2
+ export*from'./graph.class.js';import'../../overlays/skeleton/skeleton.js';import'../../data/pagination/pagination.js';
@@ -1 +1 @@
1
- export*from"./graph.class.js";import{LyraGraph}from"./graph.class.js";import{defineElement}from"../../../internal/prefix.js";import"../../overlays/skeleton/skeleton.js";defineElement("graph",LyraGraph);
1
+ export*from"./graph.class.js";import{LyraGraph}from"./graph.class.js";import{defineElement}from"../../../internal/prefix.js";import"../../overlays/skeleton/skeleton.js";import"../../data/pagination/pagination.js";defineElement("graph",LyraGraph);
@@ -1 +1 @@
1
- import{focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { display: block; block-size: var( --lr-canvas-reserved-height, var(--_lr-graph-requested-height, var(--lr-size-24rem)) ); } [part="base"] { position: relative; inline-size: 100%; block-size: 100%; } .spatial-base { display: flex; flex-direction: column; min-inline-size: 0; overflow: hidden; } [part="spatial-toolbar"], [part="spatial-pagination"] { display: flex; flex-wrap: wrap; gap: var(--lr-space-s); padding: var(--lr-space-s); } [part="spatial-control"], [part="spatial-list-item"] { --_lr-spatial-fill: var(--lr-color-neutral-fill-quiet); min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); padding: var(--lr-space-s) var(--lr-space-m); border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius-xs); background: var(--_lr-spatial-fill); color: var(--lr-color-text); font: inherit; cursor: pointer; transition: var(--lr-transition-interactive); overflow-wrap: anywhere; } [part="spatial-control"]:where([aria-pressed="true"]), [part="spatial-list-item"]:where([aria-pressed="true"], [aria-current="true"]) { --_lr-spatial-fill: var(--lr-color-brand-fill-quiet); } [part="spatial-control"]:hover:where(:not(:disabled)), [part="spatial-list-item"]:hover { background: color-mix(in oklab, var(--_lr-spatial-fill), var(--lr-color-mix-partner) var(--lr-color-mix-hover)); } [part="spatial-control"]:active:where(:not(:disabled)), [part="spatial-list-item"]:active { background: color-mix(in oklab, var(--_lr-spatial-fill), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part="spatial-control"]:focus-visible, [part="spatial-list-item"]:focus-visible, [part="spatial-canvas"]:focus-visible { ${focusRing} } [part="spatial-control"]:disabled { cursor: default; opacity: var(--lr-opacity-disabled); } [part="spatial-instructions"], [part="spatial-page-count"] { margin: 0; padding: var(--lr-space-s); font-size: var(--lr-font-size-sm); overflow-wrap: anywhere; } [part="spatial-canvas"] { min-inline-size: var(--lr-icon-button-size); display: block; flex: 1 1 auto; inline-size: 100%; block-size: 0; min-block-size: var(--lr-icon-button-size); touch-action: none; transition: var(--lr-transition-interactive); } [part="spatial-list"] { min-block-size: 0; overflow: auto; padding: var(--lr-space-s); } [part="spatial-list"] ul { list-style: none; margin: 0; padding: 0; } [part="spatial-list-item"] { inline-size: 100%; text-align: start; margin-block-end: var(--lr-space-xs); } svg { display: block; inline-size: 100%; block-size: 100%; } [part="canvas"] { display: block; inline-size: 100%; block-size: 100%; touch-action: none; transition: background-color var(--lr-transition-fast); } [part="canvas"]:focus-visible { ${focusRing} } [part="canvas"]:hover, [part="spatial-canvas"]:hover { background: color-mix( in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="tooltip"] { position: absolute; left: 0; top: 0; pointer-events: none; background: var(--lr-color-surface); color: var(--lr-color-text); font-size: var(--lr-font-size-2xs); font-family: var(--lr-font); padding-block: var(--lr-size-2px); padding-inline: var(--lr-size-6px); border-radius: var(--lr-radius-xs); border: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); z-index: var(--lr-layer-content); transform: translate(var(--lr-size-6px), calc(-100% - var(--lr-size-6px))); max-inline-size: min( calc(100% - var(--lr-size-0-75rem)), calc(100vw - var(--lr-size-0-75rem)) ); overflow-wrap: anywhere; white-space: normal; } [part="tooltip"][hidden] { display: none; } [part="link"] { stroke: var(--lr-graph-edge-color, var(--lr-color-border)); fill: none; cursor: pointer; } [data-hit-area] { fill: none; stroke: var(--lr-color-text); stroke-opacity: 0.001; stroke-width: calc( var(--lr-size-24px) * var(--_lr-graph-hit-area-scale, 1) ); cursor: pointer; } [data-hit-area="node"], [data-hit-area="link"] { stroke-linecap: round; pointer-events: stroke; } [data-hit-area="hull"] { fill: transparent; stroke-linecap: round; stroke-linejoin: round; pointer-events: all; } [part="link"]:hover { stroke: color-mix( in oklab, var(--lr-graph-edge-color, var(--lr-color-border)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="link"]:active { stroke: color-mix( in oklab, var(--lr-graph-edge-color, var(--lr-color-border)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part="arrowhead"] { fill: context-stroke; } [part="link"]:focus-visible { ${focusRing} } [part="link"][data-dangling] { stroke-dasharray: var(--lr-size-2px) var(--lr-size-2px); opacity: var(--lr-opacity-disabled); } [part="node"] { fill: var(--lr-graph-node-fill, var(--lr-color-brand)); cursor: pointer; } [part="node"]:hover { fill: color-mix( in oklab, var(--lr-graph-node-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="node"]:active { fill: color-mix( in oklab, var(--lr-graph-node-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part="node"]:focus-visible { ${focusRing} } [part="label"] { font-size: var(--lr-font-size-2xs); fill: var(--lr-color-text); font-family: var(--lr-font); pointer-events: none; } [part="link-label"] { font-size: var(--lr-font-size-2xs); fill: var(--lr-color-text); font-family: var(--lr-font); pointer-events: none; paint-order: stroke; stroke: var(--lr-graph-edge-label-halo, var(--lr-color-surface)); stroke-width: var(--lr-border-width-thick); } g[data-edge-labels-hidden] [part="link-label"], g[data-edge-labels-hidden] [part="community-label"] { display: none; } g[data-node-labels-hidden] [part="label"] { display: none; } [part="empty"] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-md-sm); } [part="error"] { margin: 0; padding: var(--lr-space-l); color: var(--lr-color-danger); font-size: var(--lr-font-size-md-sm); text-align: center; } [part="expand-indicator"] circle { fill: var(--lr-color-surface); stroke: var(--lr-color-border-strong); stroke-width: var(--lr-border-width-thin); } [part="expand-indicator"] path { stroke: var(--lr-color-text); stroke-width: var(--lr-border-width-thin); fill: none; } [part="focus-halo"] { fill: none; stroke: var(--lr-graph-focus-halo-color, var(--lr-color-brand)); stroke-width: var(--lr-border-width-medium); pointer-events: none; } [part="node"][data-selected] { stroke: var(--lr-graph-selected-color, var(--lr-color-success)); stroke-width: var(--lr-border-width-medium); } [part="link"][data-selected] { stroke: var(--lr-graph-selected-color, var(--lr-color-success)) !important; stroke-width: var(--lr-border-width-thick); } [part="link"][data-selected]:hover { stroke: color-mix( in oklab, var(--lr-graph-selected-color, var(--lr-color-success)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ) !important; } [part="link"][data-selected]:active { stroke: color-mix( in oklab, var(--lr-graph-selected-color, var(--lr-color-success)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ) !important; } [part="node"][data-dimmed] { opacity: var(--lr-graph-dimmed-opacity, 0.35); } [part="link"][data-dimmed] { opacity: var(--lr-graph-dimmed-opacity, 0.35); } [data-hit-area="link"][data-inert] { pointer-events: none; } [part="hull"] { fill: var(--lr-graph-hull-fill, var(--lr-color-brand)); stroke: var(--lr-graph-hull-fill, var(--lr-color-brand)); stroke-width: calc(var(--lr-size-24px) * 2); stroke-linejoin: round; stroke-linecap: round; opacity: var(--lr-graph-hull-opacity, 0.12); cursor: pointer; } [part="hull"]:hover { fill: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); stroke: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="hull"]:active { fill: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); stroke: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part="hull"]:focus-visible { ${focusRing} } [part="community-label"] { font-size: var(--lr-font-size-2xs); fill: var(--lr-color-text); font-family: var(--lr-font); text-anchor: middle; pointer-events: none; paint-order: stroke; stroke: var(--lr-graph-edge-label-halo, var(--lr-color-surface)); stroke-width: var(--lr-border-width-thick); } `;export{styles};
1
+ import{focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { display: block; block-size: var( --lr-canvas-reserved-height, var(--_lr-graph-requested-height, var(--lr-size-24rem)) ); } .source-layout { display: flex; flex-direction: column; block-size: 100%; min-inline-size: 0; min-block-size: 0; } .source-diagram { flex: 1 1 50%; min-block-size: 0; } [part="source-navigator"] { flex: 0 1 50%; min-block-size: 0; min-inline-size: 0; overflow: auto; padding: var(--lr-space-s); border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border); } .source-list [part="source-navigator"] { flex: 1 1 auto; } .source-toolbar { display: flex; flex-wrap: wrap; gap: var(--lr-space-s); } .source-toolbar input { flex: 1 1 auto; min-inline-size: 0; } .source-rows { list-style: none; padding: 0; margin-block: var(--lr-space-s); } .source-rows li { display: flex; flex-wrap: wrap; gap: var(--lr-space-xs); margin-block: var(--lr-space-xs); } [part="source-navigator"] :where(button, input, select), [part="source-status"] button { --_lr-source-fill: var(--lr-color-neutral-fill-quiet); min-block-size: var(--lr-icon-button-size); min-inline-size: var(--lr-icon-button-size); max-inline-size: 100%; padding: var(--lr-space-xs) var(--lr-space-s); border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius-xs); font: inherit; color: var(--lr-color-text); background: var(--_lr-source-fill); transition: var(--lr-transition-interactive); overflow-wrap: anywhere; } [part~="source-row"] { flex: 1 1 auto; text-align: start; } [part~="source-row"]:where([aria-pressed="true"]) { --_lr-source-fill: var(--lr-color-brand-fill-quiet); } [part="source-navigator"] button, [part="source-status"] button { cursor: pointer; } [part="source-navigator"] :where(button, input, select):hover, [part="source-status"] button:hover { background: color-mix(in oklab, var(--_lr-source-fill), var(--lr-color-mix-partner) var(--lr-color-mix-hover)); } [part="source-navigator"] button:active, [part="source-status"] button:active { background: color-mix(in oklab, var(--_lr-source-fill), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part="source-navigator"] :where(button, input, select):focus-visible, [part="source-status"] button:focus-visible { ${focusRing} } [part="source-status"], [part="source-coverage"] { overflow-wrap: anywhere; margin-block: var(--lr-space-s); } [part="base"] { position: relative; inline-size: 100%; block-size: 100%; } .spatial-base { display: flex; flex-direction: column; min-inline-size: 0; overflow: hidden; } [part="spatial-toolbar"], [part="spatial-pagination"] { display: flex; flex-wrap: wrap; gap: var(--lr-space-s); padding: var(--lr-space-s); } [part="spatial-control"], [part="spatial-list-item"] { --_lr-spatial-fill: var(--lr-color-neutral-fill-quiet); min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); padding: var(--lr-space-s) var(--lr-space-m); border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius-xs); background: var(--_lr-spatial-fill); color: var(--lr-color-text); font: inherit; cursor: pointer; transition: var(--lr-transition-interactive); overflow-wrap: anywhere; } [part="spatial-control"]:where([aria-pressed="true"]), [part="spatial-list-item"]:where([aria-pressed="true"], [aria-current="true"]) { --_lr-spatial-fill: var(--lr-color-brand-fill-quiet); } [part="spatial-control"]:hover:where(:not(:disabled)), [part="spatial-list-item"]:hover { background: color-mix(in oklab, var(--_lr-spatial-fill), var(--lr-color-mix-partner) var(--lr-color-mix-hover)); } [part="spatial-control"]:active:where(:not(:disabled)), [part="spatial-list-item"]:active { background: color-mix(in oklab, var(--_lr-spatial-fill), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part="spatial-control"]:focus-visible, [part="spatial-list-item"]:focus-visible, [part="spatial-canvas"]:focus-visible { ${focusRing} } [part="spatial-control"]:disabled { cursor: default; opacity: var(--lr-opacity-disabled); } [part="spatial-instructions"], [part="spatial-page-count"] { margin: 0; padding: var(--lr-space-s); font-size: var(--lr-font-size-sm); overflow-wrap: anywhere; } [part="spatial-canvas"] { min-inline-size: var(--lr-icon-button-size); display: block; flex: 1 1 auto; inline-size: 100%; block-size: 0; min-block-size: var(--lr-icon-button-size); touch-action: none; transition: var(--lr-transition-interactive); } [part="spatial-list"] { min-block-size: 0; overflow: auto; padding: var(--lr-space-s); } [part="spatial-list"] ul { list-style: none; margin: 0; padding: 0; } [part="spatial-list-item"] { inline-size: 100%; text-align: start; margin-block-end: var(--lr-space-xs); } svg { display: block; inline-size: 100%; block-size: 100%; } [part="canvas"] { display: block; inline-size: 100%; block-size: 100%; touch-action: none; transition: background-color var(--lr-transition-fast); } [part="canvas"]:focus-visible { ${focusRing} } [part="canvas"]:hover, [part="spatial-canvas"]:hover { background: color-mix( in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="tooltip"] { position: absolute; left: 0; top: 0; pointer-events: none; background: var(--lr-color-surface); color: var(--lr-color-text); font-size: var(--lr-font-size-2xs); font-family: var(--lr-font); padding-block: var(--lr-size-2px); padding-inline: var(--lr-size-6px); border-radius: var(--lr-radius-xs); border: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); z-index: var(--lr-layer-content); transform: translate(var(--lr-size-6px), calc(-100% - var(--lr-size-6px))); max-inline-size: min( calc(100% - var(--lr-size-0-75rem)), calc(100vw - var(--lr-size-0-75rem)) ); overflow-wrap: anywhere; white-space: normal; } [part="tooltip"][hidden] { display: none; } [part="link"] { stroke: var(--lr-graph-edge-color, var(--lr-color-border)); fill: none; cursor: pointer; } [data-hit-area] { fill: none; stroke: var(--lr-color-text); stroke-opacity: 0.001; stroke-width: calc( var(--lr-size-24px) * var(--_lr-graph-hit-area-scale, 1) ); cursor: pointer; } [data-hit-area="node"], [data-hit-area="link"] { stroke-linecap: round; pointer-events: stroke; } [data-hit-area="hull"] { fill: transparent; stroke-linecap: round; stroke-linejoin: round; pointer-events: all; } [part="link"]:hover { stroke: color-mix( in oklab, var(--lr-graph-edge-color, var(--lr-color-border)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="link"]:active { stroke: color-mix( in oklab, var(--lr-graph-edge-color, var(--lr-color-border)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part="arrowhead"] { fill: context-stroke; } [part="link"]:focus-visible { ${focusRing} } [part="link"][data-dangling] { stroke-dasharray: var(--lr-size-2px) var(--lr-size-2px); opacity: var(--lr-opacity-disabled); } [part="node"] { fill: var(--lr-graph-node-fill, var(--lr-color-brand)); cursor: pointer; } [part="node"]:hover { fill: color-mix( in oklab, var(--lr-graph-node-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="node"]:active { fill: color-mix( in oklab, var(--lr-graph-node-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part="node"]:focus-visible { ${focusRing} } [part="label"] { font-size: var(--lr-font-size-2xs); fill: var(--lr-color-text); font-family: var(--lr-font); pointer-events: none; } [part="link-label"] { font-size: var(--lr-font-size-2xs); fill: var(--lr-color-text); font-family: var(--lr-font); pointer-events: none; paint-order: stroke; stroke: var(--lr-graph-edge-label-halo, var(--lr-color-surface)); stroke-width: var(--lr-border-width-thick); } g[data-edge-labels-hidden] [part="link-label"], g[data-edge-labels-hidden] [part="community-label"] { display: none; } g[data-node-labels-hidden] [part="label"] { display: none; } [part="empty"] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-md-sm); } [part="error"] { margin: 0; padding: var(--lr-space-l); color: var(--lr-color-danger); font-size: var(--lr-font-size-md-sm); text-align: center; } [part="expand-indicator"] circle { fill: var(--lr-color-surface); stroke: var(--lr-color-border-strong); stroke-width: var(--lr-border-width-thin); } [part="expand-indicator"] path { stroke: var(--lr-color-text); stroke-width: var(--lr-border-width-thin); fill: none; } [part="focus-halo"] { fill: none; stroke: var(--lr-graph-focus-halo-color, var(--lr-color-brand)); stroke-width: var(--lr-border-width-medium); pointer-events: none; } [part="node"][data-selected] { stroke: var(--lr-graph-selected-color, var(--lr-color-success)); stroke-width: var(--lr-border-width-medium); } [part="link"][data-selected] { stroke: var(--lr-graph-selected-color, var(--lr-color-success)) !important; stroke-width: var(--lr-border-width-thick); } [part="link"][data-selected]:hover { stroke: color-mix( in oklab, var(--lr-graph-selected-color, var(--lr-color-success)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ) !important; } [part="link"][data-selected]:active { stroke: color-mix( in oklab, var(--lr-graph-selected-color, var(--lr-color-success)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ) !important; } [part="node"][data-dimmed] { opacity: var(--lr-graph-dimmed-opacity, 0.35); } [part="link"][data-dimmed] { opacity: var(--lr-graph-dimmed-opacity, 0.35); } [data-hit-area="link"][data-inert] { pointer-events: none; } [part="hull"] { fill: var(--lr-graph-hull-fill, var(--lr-color-brand)); stroke: var(--lr-graph-hull-fill, var(--lr-color-brand)); stroke-width: calc(var(--lr-size-24px) * 2); stroke-linejoin: round; stroke-linecap: round; opacity: var(--lr-graph-hull-opacity, 0.12); cursor: pointer; } [part="hull"]:hover { fill: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); stroke: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-hover) ); } [part="hull"]:active { fill: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); stroke: color-mix( in oklab, var(--lr-graph-hull-fill, var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active) ); } [part="hull"]:focus-visible { ${focusRing} } [part="community-label"] { font-size: var(--lr-font-size-2xs); fill: var(--lr-color-text); font-family: var(--lr-font); text-anchor: middle; pointer-events: none; paint-order: stroke; stroke: var(--lr-graph-edge-label-halo, var(--lr-color-surface)); stroke-width: var(--lr-border-width-thick); } `;export{styles};