@aceshooting/lyra-ui 14.3.1 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/custom-elements.json +1 -1
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migration-contract.json +1 -1
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +4 -0
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +3 -3
  7. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +3 -2
  8. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +1 -1
  9. package/dist/components/agent-tools/commit-card/commit-card.styles.js +1 -1
  10. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +8 -3
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +3 -1
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +10 -1
  14. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +1 -1
  15. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
  16. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts +19 -1
  17. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +4 -4
  18. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  19. package/dist/components/agent-tools/task-list/task-list.class.d.ts +5 -0
  20. package/dist/components/agent-tools/task-list/task-list.class.js +3 -3
  21. package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -1
  22. package/dist/components/agent-tools/terminal/terminal.styles.js +1 -1
  23. package/dist/components/agent-tools/test-results/test-results.class.js +1 -1
  24. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +10 -7
  25. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +15 -14
  26. package/dist/components/agent-tools/tool-param-form/tool-param-form.d.ts +1 -1
  27. package/dist/components/agent-tools/tool-param-form/tool-param-form.js +1 -1
  28. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +1 -1
  29. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts +5 -2
  30. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +1 -1
  31. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +3 -1
  32. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +9 -1
  33. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +1 -1
  34. package/dist/components/charts/chart/box-plot.class.d.ts +64 -4
  35. package/dist/components/charts/chart/box-plot.class.js +5 -5
  36. package/dist/components/charts/chart/chart-colors.d.ts +10 -0
  37. package/dist/components/charts/chart/chart-colors.js +1 -1
  38. package/dist/components/charts/chart/chart.class.d.ts +35 -10
  39. package/dist/components/charts/chart/chart.class.js +4 -4
  40. package/dist/components/charts/chart/lite-chart.class.d.ts +10 -2
  41. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  42. package/dist/components/conversation/markdown/markdown.class.d.ts +9 -1
  43. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  44. package/dist/components/conversation/message-parts/message-parts.class.d.ts +18 -1
  45. package/dist/components/conversation/message-parts/message-parts.class.js +4 -4
  46. package/dist/components/conversation/model-select/model-select.class.d.ts +6 -2
  47. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  48. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  49. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +5 -1
  50. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  51. package/dist/components/data/calendar/calendar.class.js +2 -2
  52. package/dist/components/data/context-meter/context-meter.styles.js +1 -1
  53. package/dist/components/data/data-grid/data-grid-types.d.ts +8 -2
  54. package/dist/components/data/data-grid/data-grid.class.d.ts +16 -3
  55. package/dist/components/data/data-grid/data-grid.class.js +3 -2
  56. package/dist/components/data/env-list/env-list.styles.js +1 -1
  57. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +22 -2
  58. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  59. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +12 -4
  60. package/dist/components/data/flow-minimap/flow-minimap.class.js +2 -2
  61. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  62. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +5 -1
  63. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  64. package/dist/components/data/heatmap/heatmap.class.d.ts +12 -1
  65. package/dist/components/data/heatmap/heatmap.class.js +3 -3
  66. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  67. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  68. package/dist/components/forms/combobox/combobox.class.js +1 -1
  69. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  70. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  71. package/dist/components/forms/date-picker/date-picker.class.d.ts +12 -1
  72. package/dist/components/forms/date-picker/date-picker.class.js +1 -1
  73. package/dist/components/forms/icon-button/icon-button.class.d.ts +27 -5
  74. package/dist/components/forms/icon-button/icon-button.class.js +7 -3
  75. package/dist/components/forms/input/input.styles.js +1 -1
  76. package/dist/components/forms/input/time-input.class.d.ts +13 -2
  77. package/dist/components/forms/input/time-input.class.js +1 -1
  78. package/dist/components/forms/otp-input/otp-input.class.d.ts +8 -1
  79. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  80. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +1 -1
  81. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
  82. package/dist/components/forms/select/select.class.d.ts +1 -1
  83. package/dist/components/forms/select/select.class.js +1 -1
  84. package/dist/components/forms/slider/slider.class.d.ts +4 -1
  85. package/dist/components/forms/slider/slider.class.js +1 -1
  86. package/dist/components/forms/textarea/textarea.class.d.ts +9 -4
  87. package/dist/components/forms/textarea/textarea.class.js +1 -1
  88. package/dist/components/forms/time-range/time-range.class.js +1 -1
  89. package/dist/components/layout/app-rail/app-rail.class.d.ts +7 -2
  90. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  91. package/dist/components/layout/card/card.class.js +2 -2
  92. package/dist/components/layout/card/card.styles.js +1 -1
  93. package/dist/components/layout/control-group/control-group.class.js +1 -1
  94. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +1 -1
  95. package/dist/components/layout/details/details.styles.js +1 -1
  96. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +13 -3
  97. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  98. package/dist/components/layout/menu/dropdown-item.class.d.ts +2 -0
  99. package/dist/components/layout/menu/menu-item.class.d.ts +28 -1
  100. package/dist/components/layout/menu/menu-item.class.js +45 -35
  101. package/dist/components/layout/menu/menu-item.styles.js +1 -1
  102. package/dist/components/layout/menu/menu.class.js +1 -1
  103. package/dist/components/layout/multi-split/multi-split.class.d.ts +12 -2
  104. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  105. package/dist/components/layout/page/page.class.js +2 -1
  106. package/dist/components/layout/page/page.styles.js +1 -1
  107. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +6 -4
  108. package/dist/components/layout/responsive-panel/responsive-panel.class.js +2 -2
  109. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +1 -1
  110. package/dist/components/layout/stepper/stepper.class.js +2 -2
  111. package/dist/components/layout/tab-group/tab-group.class.js +1 -1
  112. package/dist/components/layout/virtual-list/virtual-list.class.js +2 -2
  113. package/dist/components/layout/widget/widget.class.d.ts +12 -2
  114. package/dist/components/layout/widget/widget.class.js +2 -2
  115. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +1 -1
  116. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +3 -3
  117. package/dist/components/media/file-icon/file-icon.class.d.ts +3 -1
  118. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  119. package/dist/components/media/file-input/file-input.class.d.ts +1 -1
  120. package/dist/components/media/file-input/file-input.class.js +1 -1
  121. package/dist/components/media/flag/flag.styles.js +1 -1
  122. package/dist/components/media/image-comparer/image-comparer.class.d.ts +5 -5
  123. package/dist/components/media/image-comparer/image-comparer.class.js +1 -1
  124. package/dist/components/media/image-comparer/image-comparer.styles.js +1 -1
  125. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  126. package/dist/components/media/map/map.styles.js +1 -1
  127. package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
  128. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  129. package/dist/components/media/video-playlist/video-playlist.styles.js +1 -1
  130. package/dist/components/overlays/alert/alert.class.d.ts +6 -0
  131. package/dist/components/overlays/alert/alert.styles.js +1 -1
  132. package/dist/components/overlays/badge/tag.class.js +1 -1
  133. package/dist/components/overlays/chip/chip.class.js +1 -1
  134. package/dist/components/overlays/empty/empty.class.js +2 -2
  135. package/dist/components/overlays/kbd/kbd.styles.js +1 -1
  136. package/dist/components/overlays/progress/progress-ring.class.d.ts +4 -1
  137. package/dist/components/overlays/progress/progress.styles.js +1 -1
  138. package/dist/components/overlays/toast/toast.styles.js +1 -1
  139. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  140. package/dist/components/retrieval/graph/graph.class.d.ts +10 -3
  141. package/dist/components/retrieval/graph/graph.class.js +1 -1
  142. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  143. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +1 -1
  144. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +6 -6
  145. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +2 -2
  146. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  147. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -3
  148. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +3 -3
  149. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +7 -1
  150. package/dist/components/retrieval/node-palette/node-palette.class.js +23 -13
  151. package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
  152. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +4 -1
  153. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +1 -1
  154. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +1 -1
  155. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +4 -3
  156. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  157. package/dist/components/retrieval/source-list/source-list.class.d.ts +7 -1
  158. package/dist/components/retrieval/source-list/source-list.class.js +1 -1
  159. package/dist/components/utility/export-button/export-button.class.d.ts +14 -2
  160. package/dist/components/utility/export-button/export-button.class.js +3 -3
  161. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  162. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  163. package/dist/components/utility/known-date/known-date.class.js +1 -1
  164. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +4 -2
  165. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  166. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +9 -1
  167. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +4 -4
  168. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +1 -1
  169. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +4 -4
  170. package/dist/components/viewers/document-compare/document-compare.class.d.ts +5 -0
  171. package/dist/components/viewers/document-compare/document-compare.class.js +9 -4
  172. package/dist/components/viewers/document-compare/document-compare.styles.js +1 -1
  173. package/dist/components/viewers/document-preview/document-preview.class.d.ts +9 -1
  174. package/dist/components/viewers/document-preview/document-preview.class.js +2 -1
  175. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +5 -0
  176. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  177. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +5 -0
  178. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +1 -1
  179. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +3 -3
  180. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  181. package/dist/custom-elements-jsx.d.ts +1 -1
  182. package/dist/events.d.ts +5 -4
  183. package/dist/internal/accessibility-visibility.d.ts +13 -2
  184. package/dist/internal/accessibility-visibility.js +1 -1
  185. package/dist/internal/package-metadata.d.ts +1 -1
  186. package/dist/internal/package-metadata.js +1 -1
  187. package/dist/lyra.d.ts +1 -1
  188. package/dist/svelte.d.ts +1 -1
  189. package/dist/vue.d.ts +1 -1
  190. package/llms/components/lr-alert.md +11 -3
  191. package/llms/components/lr-box-plot.md +21 -4
  192. package/llms/components/lr-chart.md +13 -4
  193. package/llms/components/lr-code-block.md +5 -4
  194. package/llms/components/lr-data-grid.md +24 -10
  195. package/llms/components/lr-document-compare.md +5 -0
  196. package/llms/components/lr-dropdown-item.md +31 -0
  197. package/llms/components/lr-eval-dataset.md +5 -4
  198. package/llms/components/lr-export-button.md +10 -5
  199. package/llms/components/lr-filter-bar.md +4 -1
  200. package/llms/components/lr-flow-minimap.md +7 -1
  201. package/llms/components/lr-icon-button.md +6 -1
  202. package/llms/components/lr-lite-chart.md +2 -1
  203. package/llms/components/lr-markdown.md +2 -2
  204. package/llms/components/lr-menu-item.md +31 -0
  205. package/llms/components/lr-menu.md +31 -0
  206. package/llms/components/lr-message-parts.md +7 -0
  207. package/llms/components/lr-model-settings-panel.md +4 -1
  208. package/llms/components/lr-node-palette.md +5 -4
  209. package/llms/components/lr-pdf-viewer.md +7 -0
  210. package/llms/components/lr-responsive-panel.md +2 -2
  211. package/llms/components/lr-subagent-panel.md +17 -2
  212. package/llms/components/lr-thinking-panel.md +4 -0
  213. package/llms/components/lr-timeline-item.md +1 -1
  214. package/llms/components/lr-timeline.md +1 -1
  215. package/llms/components/lr-tool-select-dialog.md +4 -3
  216. package/llms/components/lr-virtual-list.md +11 -11
  217. package/llms-full.txt +212 -59
  218. package/package.json +3 -3
  219. package/vscode-css-data.json +1 -1
  220. package/vscode-html-data.json +1 -1
  221. package/web-types.json +1 -1
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{bindAccessibleTextObserver,composedAccessibilityText,isAccessibilitySubtreeExcluded}from"../../../internal/accessibility-visibility.js";import{composedParentElement}from"../../../internal/active-element.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets}from"../../../internal/focus-navigation.js";import{renderInertPresentation}from"../../../internal/inert-presentation.js";import{LyraElement}from"../../../internal/lyra-element.js";import{closeIcon}from"../../../internal/icons.js";import{literalSetConverter}from"../../../internal/converters.js";import{variants}from"../../../internal/variants.styles.js";import{styles}from"./chip.styles.js";import{LYRA_DEFAULT_remove,LYRA_DEFAULT_removeWithContext,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";const CHIP_SIZE=literalSetConverter(["3xs","2xs","xs","s","m","l","xl","small","medium","large"],"m"),CHIP_VARIANT=literalSetConverter(["neutral","brand","success","warning","danger"],"neutral");function isComposedWithin(owner,candidate){let current=candidate;for(;current;){if(current===owner)return!0;current=composedParentElement(current)}return!1}function nearestExternalFocusTarget(owner){const targets=collectComposedFocusTargets(owner.ownerDocument.documentElement,{mode:"programmatic"}).elements,owned=targets.map((target,index)=>isComposedWithin(owner,target)?index:-1).filter(index=>index>=0);if(owned.length===0)return null;const first=owned[0],last=owned[owned.length-1];return targets.slice(last+1).find(target=>!isComposedWithin(owner,target))??targets.slice(0,first).reverse().find(target=>!isComposedWithin(owner,target))??null}function sourceParent(node){if(node.parentElement)return node.parentElement;const root=node.getRootNode();return"host"in root?root.host:null}function isClosedSourceDetailsBranch(details,branch){return details.localName!=="details"||details.hasAttribute("open")||branch===null?!1:Array.from(details.children).find(child=>child.localName==="summary")!==branch}function isSourceLabelAvailable(node){const target=node.nodeType===1?node:sourceParent(node);if(!target?.isConnected)return!1;let branch=target,current=sourceParent(target);if(isAccessibilitySubtreeExcluded(target))return!1;for(;current;){if(isAccessibilitySubtreeExcluded(current)||isClosedSourceDetailsBranch(current,branch))return!1;branch=current,current=sourceParent(current)}return!0}class LyraChip extends LyraElement{constructor(){super(...arguments),this._size="m",this._variant="neutral",this.removable=!1,this.disabled=!1,this.pill=!1,this.selected=!1,this.toggleable=!1,this.hasStartSlot=!1,this.hasEndSlot=!1,this.cachedLabelText="",this.managedActionGroupRole=!1,this.onLabelSlotChange=event=>{const target=event.target;target?.nodeType!==1||target.localName!=="slot"||this.tracksActionLabel&&(this.bindLabelObserverTargets(),this.updateBrowserDerivedState(()=>this.recomputeLabelText()))},this.onStartSlotChange=e=>{const slot=e.target,update=()=>{this.isConnected&&(this.hasStartSlot=slot.assignedElements({flatten:!0}).length>0)};this.updateBrowserDerivedState(update)},this.onEndSlotChange=e=>{const slot=e.target,update=()=>{this.isConnected&&(this.hasEndSlot=slot.assignedElements({flatten:!0}).length>0)};this.updateBrowserDerivedState(update)},this.onRemoveClick=()=>{if(this.disabled)return;const repair=captureComposedFocusRepair(this,nearestExternalFocusTarget(this));this.emit("lr-remove",{value:this.value}),repair&&(!this.isConnected||!this.removable)&&applyComposedFocusRepair(repair)},this.onToggleClick=()=>{if(this.disabled)return;const selected=!this.selected;this.emit("lr-chip-select",{value:this.value,selected},{cancelable:!0}).defaultPrevented||(this.selected=selected)}}static{this.defaultStrings={...super.defaultStrings,remove:LYRA_DEFAULT_remove,removeWithContext:LYRA_DEFAULT_removeWithContext,select:LYRA_DEFAULT_select}}static{this.styles=[LyraElement.styles,variants,styles]}get size(){return this._size}set size(next){const normalized=CHIP_SIZE.normalizeReflected(this,"size",next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}get variant(){return this._variant}set variant(next){const normalized=CHIP_VARIANT.normalizeReflected(this,"variant",next),old=this._variant;old!==normalized&&(this._variant=normalized,this.requestUpdate("variant",old))}connectedCallback(){super.connectedCallback(),this.addEventListener("slotchange",this.onLabelSlotChange),this.syncLabelObservation();const sampleBrowserState=()=>{this.recomputeHasStartSlot(),this.recomputeHasEndSlot(),this.tracksActionLabel&&this.recomputeLabelText(!0,!0)};this.hasUpdated?(sampleBrowserState(),this.ownerDocument.defaultView?.queueMicrotask(()=>{this.isConnected&&this.tracksActionLabel&&this.recomputeLabelText()})):this.seedFirstRenderState(sampleBrowserState)}get tracksActionLabel(){return this.toggleable||this.removable}syncLabelObservation(){if(this.labelObserver?.disconnect(),this.labelObserver=void 0,!this.isConnected||!this.tracksActionLabel)return;const MutationObserverCtor=this.ownerDocument?.defaultView?.MutationObserver;this.labelObserver=MutationObserverCtor?new MutationObserverCtor(()=>{this.bindLabelObserverTargets(),this.syncHostActionRole(),this.updateBrowserDerivedState(()=>this.recomputeLabelText())}):void 0,this.bindLabelObserverTargets()}bindLabelObserverTargets(){bindAccessibleTextObserver(this.labelObserver,this,["slot","role"])}disconnectedCallback(){this.removeEventListener("slotchange",this.onLabelSlotChange),this.labelObserver?.disconnect(),this.labelObserver=void 0,this.releaseHostActionRole(),this.pendingControlFocusRepair=void 0,super.disconnectedCallback()}recomputeHasStartSlot(){const children=this.children;children&&(this.hasStartSlot=Array.from(children).some(el=>el.getAttribute("slot")==="start"))}recomputeHasEndSlot(){const children=this.children;children&&(this.hasEndSlot=Array.from(children).some(el=>el.getAttribute("slot")==="end"))}computeLabelText(preferLightDom=!1){const slot=this.renderRoot?.querySelector("slot:not([name])"),lightDomNodes=this.childNodes,assigned=slot?.assignedNodes({flatten:!0})??[],direct=Array.from(lightDomNodes??[]).filter(node=>node.nodeType!==1||(node.getAttribute("slot")??"")==="");return(!preferLightDom&&assigned.length>0?assigned:direct).map(node=>composedAccessibilityText(node,{ancestorBoundary:this,isSubtreeExcluded:element=>element.getRootNode()===this.renderRoot&&element.getAttribute("part")?.split(/\s+/).includes("label")?!1:isAccessibilitySubtreeExcluded(element),requireRendered:preferLightDom?!1:node.nodeType!==1||node.localName!=="slot",shouldPruneNode:candidate=>!this.contains(candidate)&&!isSourceLabelAvailable(candidate)})).join(" ").replace(/\s+/g," ").trim()}recomputeLabelText(request=!0,preferLightDom=!1){const next=this.computeLabelText(preferLightDom);next!==this.cachedLabelText&&(this.cachedLabelText=next,request&&this.requestUpdate())}get accessibleToggleLabel(){return this.cachedLabelText||this.localize("select")}get accessibleRemoveLabel(){const text=this.cachedLabelText;return text?this.localize("removeWithContext",void 0,{label:text}):this.localize("remove")}get primaryControl(){return this.renderRoot.querySelector(this.removable?'[part="remove-button"]':'[part="toggle-button"]')}focus(options){this.primaryControl?.focus(options)}blur(){this.primaryControl?.blur()}click(){const control=this.primaryControl;control?control.click():super.click()}willUpdate(changed){if(super.willUpdate(changed),(changed.has("removable")||changed.has("toggleable"))&&(this.syncLabelObservation(),this.hasUpdated&&(this.tracksActionLabel?this.recomputeLabelText(!1):this.cachedLabelText="")),this.pendingControlFocusRepair)return;const oldRemovable=changed.get("removable")??this.removable,oldToggleable=changed.get("toggleable")??this.toggleable,oldDisabled=changed.get("disabled")??this.disabled,oldMode=oldRemovable?"remove":oldToggleable?"toggle":"passive",newMode=this.removable?"remove":this.toggleable?"toggle":"passive";oldMode===newMode&&!(oldDisabled===!1&&this.disabled)||(this.pendingControlFocusRepair=captureComposedFocusRepair(this,nearestExternalFocusTarget(this)??this.renderRoot.querySelector('[part="remove-button"], [part="toggle-button"]'))??void 0)}updated(changed){super.updated(changed),this.syncHostActionRole();const repair=this.pendingControlFocusRepair;if(this.pendingControlFocusRepair=void 0,!repair)return;const replacement=this.disabled?null:this.primaryControl;applyComposedFocusRepair(repair,replacement??repair.candidate)}syncHostActionRole(){const needsGroup=this.tracksActionLabel&&this.hasAttribute("aria-label");needsGroup&&!this.hasAttribute("role")?(this.setAttribute("role","group"),this.managedActionGroupRole=!0):needsGroup||this.releaseHostActionRole()}releaseHostActionRole(){this.managedActionGroupRole&&this.getAttribute("role")==="group"&&this.removeAttribute("role"),this.managedActionGroupRole=!1}render(){const toggleMode=this.toggleable&&!this.removable,pressed=this.selected&&!this.removable;return html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{bindAccessibleTextObserver,composedAccessibilityText,isAccessibilitySubtreeExcluded}from"../../../internal/accessibility-visibility.js";import{composedParentElement}from"../../../internal/active-element.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets}from"../../../internal/focus-navigation.js";import{renderInertPresentation}from"../../../internal/inert-presentation.js";import{LyraElement}from"../../../internal/lyra-element.js";import{closeIcon}from"../../../internal/icons.js";import{literalSetConverter}from"../../../internal/converters.js";import{variants}from"../../../internal/variants.styles.js";import{styles}from"./chip.styles.js";import{LYRA_DEFAULT_remove,LYRA_DEFAULT_removeWithContext,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";const CHIP_SIZE=literalSetConverter(["3xs","2xs","xs","s","m","l","xl","small","medium","large"],"m"),CHIP_VARIANT=literalSetConverter(["neutral","brand","success","warning","danger"],"neutral");function isComposedWithin(owner,candidate){let current=candidate;for(;current;){if(current===owner)return!0;current=composedParentElement(current)}return!1}function nearestExternalFocusTarget(owner){const targets=collectComposedFocusTargets(owner.ownerDocument.documentElement,{mode:"programmatic"}).elements,owned=targets.map((target,index)=>isComposedWithin(owner,target)?index:-1).filter(index=>index>=0);if(owned.length===0)return null;const first=owned[0],last=owned[owned.length-1];return targets.slice(last+1).find(target=>!isComposedWithin(owner,target))??targets.slice(0,first).reverse().find(target=>!isComposedWithin(owner,target))??null}function sourceParent(node){if(node.parentElement)return node.parentElement;const root=node.getRootNode();return"host"in root?root.host:null}function isClosedSourceDetailsBranch(details,branch){return details.localName!=="details"||details.hasAttribute("open")||branch===null?!1:Array.from(details.children).find(child=>child.localName==="summary")!==branch}function isSourceLabelAvailable(node){const target=node.nodeType===1?node:sourceParent(node);if(!target?.isConnected)return!1;let branch=target,current=sourceParent(target);if(isAccessibilitySubtreeExcluded(target))return!1;for(;current;){if(isAccessibilitySubtreeExcluded(current)||isClosedSourceDetailsBranch(current,branch))return!1;branch=current,current=sourceParent(current)}return!0}class LyraChip extends LyraElement{constructor(){super(...arguments),this._size="m",this._variant="neutral",this.removable=!1,this.disabled=!1,this.pill=!1,this.selected=!1,this.toggleable=!1,this.hasStartSlot=!1,this.hasEndSlot=!1,this.cachedLabelText="",this.managedActionGroupRole=!1,this.onLabelSlotChange=event=>{const target=event.target;target?.nodeType!==1||target.localName!=="slot"||this.tracksActionLabel&&(this.bindLabelObserverTargets(),this.updateBrowserDerivedState(()=>this.recomputeLabelText()))},this.onStartSlotChange=e=>{const slot=e.target,update=()=>{this.isConnected&&(this.hasStartSlot=slot.assignedElements({flatten:!0}).length>0)};this.updateBrowserDerivedState(update)},this.onEndSlotChange=e=>{const slot=e.target,update=()=>{this.isConnected&&(this.hasEndSlot=slot.assignedElements({flatten:!0}).length>0)};this.updateBrowserDerivedState(update)},this.onRemoveClick=()=>{if(this.disabled)return;const repair=captureComposedFocusRepair(this,nearestExternalFocusTarget(this));this.emit("lr-remove",{value:this.value}),repair&&(!this.isConnected||!this.removable)&&applyComposedFocusRepair(repair)},this.onToggleClick=()=>{if(this.disabled)return;const selected=!this.selected;this.emit("lr-chip-select",{value:this.value,selected},{cancelable:!0}).defaultPrevented||(this.selected=selected)}}static{this.defaultStrings={...super.defaultStrings,remove:LYRA_DEFAULT_remove,removeWithContext:LYRA_DEFAULT_removeWithContext,select:LYRA_DEFAULT_select}}static{this.styles=[LyraElement.styles,variants,styles]}get size(){return this._size}set size(next){const normalized=CHIP_SIZE.normalizeReflected(this,"size",next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}get variant(){return this._variant}set variant(next){const normalized=CHIP_VARIANT.normalizeReflected(this,"variant",next),old=this._variant;old!==normalized&&(this._variant=normalized,this.requestUpdate("variant",old))}connectedCallback(){super.connectedCallback(),this.addEventListener("slotchange",this.onLabelSlotChange),this.syncLabelObservation();const sampleBrowserState=()=>{this.recomputeHasStartSlot(),this.recomputeHasEndSlot(),this.tracksActionLabel&&this.recomputeLabelText(!0,!0)};this.hasUpdated?(sampleBrowserState(),this.ownerDocument.defaultView?.queueMicrotask(()=>{this.isConnected&&this.tracksActionLabel&&this.recomputeLabelText()})):this.seedFirstRenderState(sampleBrowserState)}get tracksActionLabel(){return this.toggleable||this.removable}syncLabelObservation(){if(this.labelObserver?.disconnect(),this.labelObserver=void 0,!this.isConnected||!this.tracksActionLabel)return;const MutationObserverCtor=this.ownerDocument?.defaultView?.MutationObserver;this.labelObserver=MutationObserverCtor?new MutationObserverCtor(()=>{this.bindLabelObserverTargets(),this.syncHostActionRole(),this.updateBrowserDerivedState(()=>this.recomputeLabelText())}):void 0,this.bindLabelObserverTargets()}bindLabelObserverTargets(){bindAccessibleTextObserver(this.labelObserver,this,["slot","role"])}disconnectedCallback(){this.removeEventListener("slotchange",this.onLabelSlotChange),this.labelObserver?.disconnect(),this.labelObserver=void 0,this.releaseHostActionRole(),this.pendingControlFocusRepair=void 0,super.disconnectedCallback()}recomputeHasStartSlot(){const children=this.children;children&&(this.hasStartSlot=Array.from(children).some(el=>el.getAttribute("slot")==="start"))}recomputeHasEndSlot(){const children=this.children;children&&(this.hasEndSlot=Array.from(children).some(el=>el.getAttribute("slot")==="end"))}computeLabelText(preferLightDom=!1){const slot=this.renderRoot?.querySelector("slot:not([name])"),lightDomNodes=this.childNodes,assigned=slot?.assignedNodes({flatten:!0})??[],direct=Array.from(lightDomNodes??[]).filter(node=>node.nodeType!==1||(node.getAttribute("slot")??"")==="");return(!preferLightDom&&assigned.length>0?assigned:direct).map(node=>composedAccessibilityText(node,{ancestorBoundary:this,isSubtreeExcluded:element=>element.getRootNode()===this.renderRoot&&element.getAttribute("part")?.split(/\s+/).includes("label")?!1:isAccessibilitySubtreeExcluded(element),requireRendered:preferLightDom?!1:node.nodeType!==1||node.localName!=="slot",shouldPruneNode:candidate=>!this.contains(candidate)&&!isSourceLabelAvailable(candidate),ignoreInheritedVisibility:!0})).join(" ").replace(/\s+/g," ").trim()}recomputeLabelText(request=!0,preferLightDom=!1){const next=this.computeLabelText(preferLightDom);next!==this.cachedLabelText&&(this.cachedLabelText=next,request&&this.requestUpdate())}get accessibleToggleLabel(){return this.cachedLabelText||this.localize("select")}get accessibleRemoveLabel(){const text=this.cachedLabelText;return text?this.localize("removeWithContext",void 0,{label:text}):this.localize("remove")}get primaryControl(){return this.renderRoot.querySelector(this.removable?'[part="remove-button"]':'[part="toggle-button"]')}focus(options){this.primaryControl?.focus(options)}blur(){this.primaryControl?.blur()}click(){const control=this.primaryControl;control?control.click():super.click()}willUpdate(changed){if(super.willUpdate(changed),(changed.has("removable")||changed.has("toggleable"))&&(this.syncLabelObservation(),this.hasUpdated&&(this.tracksActionLabel?this.recomputeLabelText(!1):this.cachedLabelText="")),this.pendingControlFocusRepair)return;const oldRemovable=changed.get("removable")??this.removable,oldToggleable=changed.get("toggleable")??this.toggleable,oldDisabled=changed.get("disabled")??this.disabled,oldMode=oldRemovable?"remove":oldToggleable?"toggle":"passive",newMode=this.removable?"remove":this.toggleable?"toggle":"passive";oldMode===newMode&&!(oldDisabled===!1&&this.disabled)||(this.pendingControlFocusRepair=captureComposedFocusRepair(this,nearestExternalFocusTarget(this)??this.renderRoot.querySelector('[part="remove-button"], [part="toggle-button"]'))??void 0)}updated(changed){super.updated(changed),this.syncHostActionRole();const repair=this.pendingControlFocusRepair;if(this.pendingControlFocusRepair=void 0,!repair)return;const replacement=this.disabled?null:this.primaryControl;applyComposedFocusRepair(repair,replacement??repair.candidate)}syncHostActionRole(){const needsGroup=this.tracksActionLabel&&this.hasAttribute("aria-label");needsGroup&&!this.hasAttribute("role")?(this.setAttribute("role","group"),this.managedActionGroupRole=!0):needsGroup||this.releaseHostActionRole()}releaseHostActionRole(){this.managedActionGroupRole&&this.getAttribute("role")==="group"&&this.removeAttribute("role"),this.managedActionGroupRole=!1}render(){const toggleMode=this.toggleable&&!this.removable,pressed=this.selected&&!this.removable;return html`
2
2
  <span part="base">
3
3
  ${renderInertPresentation(html`<slot
4
4
  name="start"
@@ -1,6 +1,6 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{isAccessibilityVisible}from"../../../internal/accessibility-visibility.js";import{composedAccessibilityText}from"../../../internal/announcement-text.js";import{LyraElement}from"../../../internal/lyra-element.js";import{resolveHeadingLevel}from"../../../internal/heading-level.js";import{SlotPresenceController}from"../../../internal/slot-presence-controller.js";import{hasRealContent}from"../../../internal/a11y.js";import{styles}from"./empty.styles.js";class LyraEmpty extends LyraElement{constructor(){super(...arguments),this.heading="",this.headingLevel="3",this.description="",this.compact=!1,this.slotPresence=new SlotPresenceController(this),this.announcementsArmed=!1,this.announcementGeneration=0,this.lastAnnouncementText="",this.onForwardedSlotChange=event=>{const slot=event.target;this.announcementForwardingSlots().includes(slot)&&(this.observeAnnouncementContent(),this.scheduleAnnouncement())}}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.addEventListener("slotchange",this.onForwardedSlotChange),this.announcementSink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.announcementsArmed=!1,this.lastAnnouncementText="";const generation=++this.announcementGeneration,MutationObserverCtor=this.ownerDocument.defaultView?.MutationObserver;MutationObserverCtor&&(this.contentObserver=new MutationObserverCtor(()=>{this.observeAnnouncementContent(),this.scheduleAnnouncement()}),this.observeAnnouncementContent()),this.updateComplete.then(()=>{!this.isConnected||generation!==this.announcementGeneration||(this.lastAnnouncementText=this.announcementText(),this.announcementsArmed=!0)})}disconnectedCallback(){this.announcementGeneration+=1,this.contentObserver?.disconnect(),this.contentObserver=void 0,this.removeEventListener("slotchange",this.onForwardedSlotChange),this.announcementSink?.release(),this.announcementSink=void 0,this.announcementsArmed=!1,this.lastAnnouncementText="",super.disconnectedCallback()}updated(changed){super.updated(changed),this.announcementsArmed&&(changed.has("heading")||changed.has("description"))&&this.announceCurrentContent()}firstUpdated(changed){super.firstUpdated(changed),this.updateBrowserDerivedState(()=>{this.reconcileSlotHidden(this.shadowRoot.querySelector("slot:not([name])"),this.shadowRoot.querySelector('[part="icon"]')),this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="actions"]'),this.shadowRoot.querySelector('[part="actions"]')),this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="heading"]'),this.shadowRoot.querySelector('[part="heading"]'),this.heading.length>0),this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="description"]'),this.shadowRoot.querySelector('[part="description"]'),this.description.length>0)})}reconcileSlotHidden(slot,wrapper,hasFallbackContent=!1){wrapper.toggleAttribute("hidden",!hasFallbackContent&&!hasRealContent(slot.assignedNodes({flatten:!0})))}announcementObservationOptions(){return{attributes:!0,attributeFilter:["alt","aria-hidden","aria-label","class","hidden","inert","open","slot","style"],childList:!0,characterData:!0,subtree:!0}}announcementForwardingSlots(){return Array.from(this.querySelectorAll("slot")).filter(slot=>{let top=slot;for(;top.parentNode&&top.parentNode!==this;)top=top.parentNode;if(top.parentNode!==this||top.nodeType!==1)return!1;const slotName=top.getAttribute("slot");return slotName==="heading"||slotName==="description"})}observeAnnouncementContent(){const observer=this.contentObserver;if(!observer)return;observer.disconnect();const options=this.announcementObservationOptions();observer.observe(this,options);for(const slot of this.announcementForwardingSlots())if(slot.assignedNodes().length!==0)for(const assigned of slot.assignedNodes({flatten:!0}))observer.observe(assigned,options)}scheduleAnnouncement(){if(!this.announcementsArmed)return;const headingSlot=this.shadowRoot?.querySelector('slot[name="heading"]'),headingWrapper=this.shadowRoot?.querySelector('[part="heading"]');headingSlot&&headingWrapper&&this.reconcileSlotHidden(headingSlot,headingWrapper,this.heading.length>0);const descriptionSlot=this.shadowRoot?.querySelector('slot[name="description"]'),descriptionWrapper=this.shadowRoot?.querySelector('[part="description"]');descriptionSlot&&descriptionWrapper&&this.reconcileSlotHidden(descriptionSlot,descriptionWrapper,this.description.length>0),this.announceCurrentContent()}slotContent(name){const selector=name?`slot[name="${name}"]`:"slot:not([name])",slot=this.shadowRoot?.querySelector(selector);return{assigned:(slot?.assignedNodes()??[]).length>0,text:(slot?.assignedNodes({flatten:!0})??[]).map(node=>composedAccessibilityText(node)).join(" ")}}announcementText(){if(!isAccessibilityVisible(this))return"";const headingSlot=this.slotContent("heading"),descriptionSlot=this.slotContent("description");return[headingSlot.assigned?headingSlot.text:this.heading,descriptionSlot.assigned?descriptionSlot.text:this.description].join(" ").replace(/\s+/g," ").trim()}announceCurrentContent(){if(!this.announcementsArmed||!this.isConnected)return;const text=this.announcementText();text!==this.lastAnnouncementText&&(this.lastAnnouncementText=text,text&&this.announcementSink?.announce(text))}render(){const hasHeading=this.slotPresence.has("heading")||(this.heading??"").length>0,hasDescription=this.slotPresence.has("description")||(this.description??"").length>0,headingLevel=resolveHeadingLevel(this.headingLevel);return html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{renderInertPresentation}from"../../../internal/inert-presentation.js";import{isAccessibilityVisible}from"../../../internal/accessibility-visibility.js";import{composedAccessibilityText}from"../../../internal/announcement-text.js";import{LyraElement}from"../../../internal/lyra-element.js";import{resolveHeadingLevel}from"../../../internal/heading-level.js";import{SlotPresenceController}from"../../../internal/slot-presence-controller.js";import{hasRealContent}from"../../../internal/a11y.js";import{styles}from"./empty.styles.js";class LyraEmpty extends LyraElement{constructor(){super(...arguments),this.heading="",this.headingLevel="3",this.description="",this.compact=!1,this.slotPresence=new SlotPresenceController(this),this.announcementsArmed=!1,this.announcementGeneration=0,this.lastAnnouncementText="",this.onForwardedSlotChange=event=>{const slot=event.target;this.announcementForwardingSlots().includes(slot)&&(this.observeAnnouncementContent(),this.scheduleAnnouncement())}}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.addEventListener("slotchange",this.onForwardedSlotChange),this.announcementSink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.announcementsArmed=!1,this.lastAnnouncementText="";const generation=++this.announcementGeneration,MutationObserverCtor=this.ownerDocument.defaultView?.MutationObserver;MutationObserverCtor&&(this.contentObserver=new MutationObserverCtor(()=>{this.observeAnnouncementContent(),this.scheduleAnnouncement()}),this.observeAnnouncementContent()),this.updateComplete.then(()=>{!this.isConnected||generation!==this.announcementGeneration||(this.lastAnnouncementText=this.announcementText(),this.announcementsArmed=!0)})}disconnectedCallback(){this.announcementGeneration+=1,this.contentObserver?.disconnect(),this.contentObserver=void 0,this.removeEventListener("slotchange",this.onForwardedSlotChange),this.announcementSink?.release(),this.announcementSink=void 0,this.announcementsArmed=!1,this.lastAnnouncementText="",super.disconnectedCallback()}updated(changed){super.updated(changed),this.announcementsArmed&&(changed.has("heading")||changed.has("description"))&&this.announceCurrentContent()}firstUpdated(changed){super.firstUpdated(changed),this.updateBrowserDerivedState(()=>{this.reconcileSlotHidden(this.shadowRoot.querySelector("slot:not([name])"),this.shadowRoot.querySelector('[part="icon"]')),this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="actions"]'),this.shadowRoot.querySelector('[part="actions"]')),this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="heading"]'),this.shadowRoot.querySelector('[part="heading"]'),this.heading.length>0),this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="description"]'),this.shadowRoot.querySelector('[part="description"]'),this.description.length>0)})}reconcileSlotHidden(slot,wrapper,hasFallbackContent=!1){wrapper.toggleAttribute("hidden",!hasFallbackContent&&!hasRealContent(slot.assignedNodes({flatten:!0})))}announcementObservationOptions(){return{attributes:!0,attributeFilter:["alt","aria-hidden","aria-label","class","hidden","inert","open","slot","style"],childList:!0,characterData:!0,subtree:!0}}announcementForwardingSlots(){return Array.from(this.querySelectorAll("slot")).filter(slot=>{let top=slot;for(;top.parentNode&&top.parentNode!==this;)top=top.parentNode;if(top.parentNode!==this||top.nodeType!==1)return!1;const slotName=top.getAttribute("slot");return slotName==="heading"||slotName==="description"})}observeAnnouncementContent(){const observer=this.contentObserver;if(!observer)return;observer.disconnect();const options=this.announcementObservationOptions();observer.observe(this,options);for(const slot of this.announcementForwardingSlots())if(slot.assignedNodes().length!==0)for(const assigned of slot.assignedNodes({flatten:!0}))observer.observe(assigned,options)}scheduleAnnouncement(){if(!this.announcementsArmed)return;const headingSlot=this.shadowRoot?.querySelector('slot[name="heading"]'),headingWrapper=this.shadowRoot?.querySelector('[part="heading"]');headingSlot&&headingWrapper&&this.reconcileSlotHidden(headingSlot,headingWrapper,this.heading.length>0);const descriptionSlot=this.shadowRoot?.querySelector('slot[name="description"]'),descriptionWrapper=this.shadowRoot?.querySelector('[part="description"]');descriptionSlot&&descriptionWrapper&&this.reconcileSlotHidden(descriptionSlot,descriptionWrapper,this.description.length>0),this.announceCurrentContent()}slotContent(name){const selector=name?`slot[name="${name}"]`:"slot:not([name])",slot=this.shadowRoot?.querySelector(selector);return{assigned:(slot?.assignedNodes()??[]).length>0,text:(slot?.assignedNodes({flatten:!0})??[]).map(node=>composedAccessibilityText(node)).join(" ")}}announcementText(){if(!isAccessibilityVisible(this))return"";const headingSlot=this.slotContent("heading"),descriptionSlot=this.slotContent("description");return[headingSlot.assigned?headingSlot.text:this.heading,descriptionSlot.assigned?descriptionSlot.text:this.description].join(" ").replace(/\s+/g," ").trim()}announceCurrentContent(){if(!this.announcementsArmed||!this.isConnected)return;const text=this.announcementText();text!==this.lastAnnouncementText&&(this.lastAnnouncementText=text,text&&this.announcementSink?.announce(text))}render(){const hasHeading=this.slotPresence.has("heading")||(this.heading??"").length>0,hasDescription=this.slotPresence.has("description")||(this.description??"").length>0,headingLevel=resolveHeadingLevel(this.headingLevel);return html`
2
2
  <div part="base">
3
- <div part="icon" ?hidden=${!this.slotPresence.has()}><slot></slot></div>
3
+ ${renderInertPresentation(html`<slot></slot>`,{part:"icon",hidden:!this.slotPresence.has()})}
4
4
  <p
5
5
  part="heading"
6
6
  role=${headingLevel?"heading":nothing}
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{vertical-align:middle;max-inline-size:100%;display:inline-flex}[part=base]{overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%;font-family:var(--lr-font);font-size:var(--lr-font-size-sm);line-height:var(--lr-line-height-snug);color:var(--lr-color-text-quiet);flex-wrap:wrap;align-items:center;display:inline-flex}[part=key]{box-sizing:border-box;min-inline-size:var(--lr-size-1-5em);overflow-wrap:anywhere;max-inline-size:100%;padding:var(--lr-size-0-0625rem) var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:calc(var(--lr-radius) * .6);background:var(--lr-color-surface);color:var(--lr-color-text);font-weight:var(--lr-font-weight-medium);box-shadow:inset 0 var(--lr-size-neg-1px) 0 var(--lr-color-border);justify-content:center;align-items:center;display:inline-flex}.sep{margin-inline:var(--lr-size-0-1875rem);color:var(--lr-color-text-quiet);font-size:var(--lr-size-0-75em);user-select:none}::slotted(*){overflow-wrap:anywhere;vertical-align:middle;min-inline-size:0;max-inline-size:100%}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{vertical-align:middle;max-inline-size:100%;display:inline-flex}[part=base]{overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%;font-family:var(--lr-font);font-size:var(--lr-font-size-sm);line-height:var(--lr-line-height-snug);color:var(--lr-color-text-quiet);flex-wrap:wrap;align-items:center;display:inline-flex}[part=key]{box-sizing:border-box;min-inline-size:var(--lr-size-1-5em);overflow-wrap:anywhere;max-inline-size:100%;padding:var(--lr-size-0-0625rem) var(--lr-space-xs);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:calc(var(--lr-radius) * .6);background:var(--lr-color-surface);color:var(--lr-color-text);font-weight:var(--lr-font-weight-medium);box-shadow:inset 0 calc(-1 * var(--lr-border-width-thin)) 0 var(--lr-color-border);justify-content:center;align-items:center;display:inline-flex}.sep{margin-inline:var(--lr-size-0-1875rem);color:var(--lr-color-text-quiet);font-size:var(--lr-size-0-75em);user-select:none}::slotted(*){overflow-wrap:anywhere;vertical-align:middle;min-inline-size:0;max-inline-size:100%}`;export{styles};
@@ -17,7 +17,10 @@ import{type TemplateResult}from'lit';import{LyraElement}from'../../../internal/l
17
17
  * @csspart indicator - The SVG indicator.
18
18
  * @csspart label - The center label.
19
19
  * @cssprop [--lr-progress-ring-size=var(--lr-size-2-5rem)] - Outer diameter of the ring.
20
- * @cssprop [--lr-progress-ring-track-width=var(--lr-size-4px)] - Track stroke width.
20
+ * @cssprop [--lr-progress-ring-track-width=var(--lr-theme-border-width-thick,var(--lr-size-4px))] - Track stroke
21
+ * width. Bridges the shared border-width theme input directly (not the `--lr-border-width-*`
22
+ * alias, whose own literal default is a different value) so retuning it moves this ring's
23
+ * stroke the same way it moves every other bordered/ringed surface in the family.
21
24
  * @cssprop [--lr-progress-ring-track-color=var(--lr-color-brand-quiet)] - Track stroke color.
22
25
  * @cssprop [--lr-progress-ring-indicator-width=var(--lr-progress-ring-track-width)] - Indicator stroke width.
23
26
  * @cssprop [--lr-progress-ring-indicator-color=var(--lr-progress-ring-indicator-variant-color)] -
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{color:var(--lr-color-brand);--_lr-progress-indicator-variant-color:var(--lr-color-brand);display:block}:host([variant]){--_lr-progress-indicator-variant-color:var(--lr-color-fill-loud)}[part~=base]{display:block}[part=track]{inline-size:100%;block-size:var(--lr-progress-track-height,var(--lr-progress-height,var(--track-height,var(--height,var(--lr-size-1rem)))));border-radius:var(--lr-radius-pill);background:var(--lr-progress-track-color,var(--track-color,var(--lr-color-brand-quiet)));overflow:hidden}[part=indicator]{border-radius:inherit;background:var(--lr-progress-indicator-color,var(--indicator-color,var(--lr-progress-indicator-variant-color,var(--_lr-progress-indicator-variant-color))));block-size:100%;transition:inline-size var(--lr-transition-base)}:host([indeterminate]) [part=indicator]{animation:lr-progress-slide var(--lr-progress-duration,var(--lr-transition-ambient)) infinite alternate}[part=label]{justify-content:space-between;gap:var(--lr-space-s);overflow-wrap:anywhere;min-inline-size:0;color:var(--lr-progress-label-color,var(--label-color,var(--lr-color-text)));font-size:var(--lr-font-size-sm);flex-wrap:wrap;margin-block-end:var(--lr-space-xs);display:flex}[part=label][hidden]{display:none}@keyframes lr-progress-slide{0%{transform:translate(-100%)}to{transform:translate(250%)}}:host([indeterminate]:dir(rtl)) [part=indicator]{animation-name:lr-progress-slide-rtl}@keyframes lr-progress-slide-rtl{0%{transform:translate(100%)}to{transform:translate(-250%)}}@media (prefers-reduced-motion:reduce){[part=indicator]{transition:none;animation:none!important}}`,ringStyles=css`:host{color:var(--lr-color-brand);--_lr-progress-ring-indicator-variant-color:var(--lr-color-brand);display:inline-block}:host([variant]){--_lr-progress-ring-indicator-variant-color:var(--lr-color-fill-loud)}[part~=base]{inline-size:var(--lr-progress-ring-size,var(--size,var(--lr-size-2-5rem)));block-size:var(--lr-progress-ring-size,var(--size,var(--lr-size-2-5rem)));justify-content:center;align-items:center;display:inline-flex;position:relative}svg{block-size:100%;inline-size:100%;transform:rotate(-90deg)}circle{fill:none;stroke-linecap:round}[part=track]{stroke:var(--lr-progress-ring-track-color,var(--track-color,var(--lr-color-brand-quiet)));stroke-width:var(--lr-progress-ring-track-width,var(--track-width,var(--lr-size-4px)))}[part=indicator]{stroke:var(--lr-progress-ring-indicator-color,var(--indicator-color,var(--lr-progress-ring-indicator-variant-color,var(--_lr-progress-ring-indicator-variant-color))));stroke-width:var(--lr-progress-ring-indicator-width,var(--indicator-width,var(--lr-progress-ring-track-width,var(--track-width,var(--lr-size-4px)))));transition:stroke-dashoffset var(--lr-progress-ring-indicator-transition-duration,var(--indicator-transition-duration,var(--lr-transition-base)))}:host([indeterminate]) [part=indicator]{transform-box:fill-box;transform-origin:50%;animation:lr-progress-ring-spin var(--lr-progress-duration,var(--lr-transition-ambient)) infinite}[part=label]{padding-inline:var(--lr-space-2xs);text-align:center;text-overflow:ellipsis;white-space:nowrap;color:var(--lr-color-text);font-size:var(--lr-font-size-sm);position:absolute;inset-inline:0;overflow:hidden}@keyframes lr-progress-ring-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){[part=indicator]{transition:none;animation:none!important}}`;export{ringStyles,styles};
1
+ import{css}from"lit";const styles=css`:host{color:var(--lr-color-brand);--_lr-progress-indicator-variant-color:var(--lr-color-brand);display:block}:host([variant]){--_lr-progress-indicator-variant-color:var(--lr-color-fill-loud)}[part~=base]{display:block}[part=track]{inline-size:100%;block-size:var(--lr-progress-track-height,var(--lr-progress-height,var(--track-height,var(--height,var(--lr-size-1rem)))));border-radius:var(--lr-radius-pill);background:var(--lr-progress-track-color,var(--track-color,var(--lr-color-brand-quiet)));overflow:hidden}[part=indicator]{border-radius:inherit;background:var(--lr-progress-indicator-color,var(--indicator-color,var(--lr-progress-indicator-variant-color,var(--_lr-progress-indicator-variant-color))));block-size:100%;transition:inline-size var(--lr-transition-base)}:host([indeterminate]) [part=indicator]{animation:lr-progress-slide var(--lr-progress-duration,var(--lr-transition-ambient)) infinite alternate}[part=label]{justify-content:space-between;gap:var(--lr-space-s);overflow-wrap:anywhere;min-inline-size:0;color:var(--lr-progress-label-color,var(--label-color,var(--lr-color-text)));font-size:var(--lr-font-size-sm);flex-wrap:wrap;margin-block-end:var(--lr-space-xs);display:flex}[part=label][hidden]{display:none}@keyframes lr-progress-slide{0%{transform:translate(-100%)}to{transform:translate(250%)}}:host([indeterminate]:dir(rtl)) [part=indicator]{animation-name:lr-progress-slide-rtl}@keyframes lr-progress-slide-rtl{0%{transform:translate(100%)}to{transform:translate(-250%)}}@media (prefers-reduced-motion:reduce){[part=indicator]{transition:none;animation:none!important}}`,ringStyles=css`:host{color:var(--lr-color-brand);--_lr-progress-ring-indicator-variant-color:var(--lr-color-brand);display:inline-block}:host([variant]){--_lr-progress-ring-indicator-variant-color:var(--lr-color-fill-loud)}[part~=base]{inline-size:var(--lr-progress-ring-size,var(--size,var(--lr-size-2-5rem)));block-size:var(--lr-progress-ring-size,var(--size,var(--lr-size-2-5rem)));justify-content:center;align-items:center;display:inline-flex;position:relative}svg{block-size:100%;inline-size:100%;transform:rotate(-90deg)}circle{fill:none;stroke-linecap:round}[part=track]{stroke:var(--lr-progress-ring-track-color,var(--track-color,var(--lr-color-brand-quiet)));stroke-width:var(--lr-progress-ring-track-width,var(--track-width,var(--lr-theme-border-width-thick,var(--lr-size-4px))))}[part=indicator]{stroke:var(--lr-progress-ring-indicator-color,var(--indicator-color,var(--lr-progress-ring-indicator-variant-color,var(--_lr-progress-ring-indicator-variant-color))));stroke-width:var(--lr-progress-ring-indicator-width,var(--indicator-width,var(--lr-progress-ring-track-width,var(--track-width,var(--lr-theme-border-width-thick,var(--lr-size-4px))))));transition:stroke-dashoffset var(--lr-progress-ring-indicator-transition-duration,var(--indicator-transition-duration,var(--lr-transition-base)))}:host([indeterminate]) [part=indicator]{transform-box:fill-box;transform-origin:50%;animation:lr-progress-ring-spin var(--lr-progress-duration,var(--lr-transition-ambient)) infinite}[part=label]{padding-inline:var(--lr-space-2xs);text-align:center;text-overflow:ellipsis;white-space:nowrap;color:var(--lr-color-text);font-size:var(--lr-font-size-sm);position:absolute;inset-inline:0;overflow:hidden}@keyframes lr-progress-ring-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){[part=indicator]{transition:none;animation:none!important}}`;export{ringStyles,styles};
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{z-index:var(--lr-layer-toast);--_lr-toast-gap:var(--gap,var(--lr-space-s));--_lr-toast-width:var(--width,var(--lr-size-28rem));pointer-events:none;display:grid;position:fixed;inset-block-start:max(var(--lr-space-l), var(--lr-safe-area-top));inset-block-end:max(var(--lr-space-l), var(--lr-safe-area-bottom));inset-inline-start:max(var(--lr-space-l), var(--lr-safe-area-inline-start));inset-inline-end:max(var(--lr-space-l), var(--lr-safe-area-inline-end))}[part=stack]{gap:var(--lr-toast-gap,var(--_lr-toast-gap));inline-size:min(var(--lr-toast-width,var(--_lr-toast-width)), 100%);overscroll-behavior:contain;flex-direction:column;min-block-size:0;max-block-size:100%;max-inline-size:100%;display:flex;overflow-y:auto}::slotted(*){pointer-events:auto}::slotted([data-toast-queued]){pointer-events:none;display:none!important}:host([placement^=top]) [part=stack]{align-self:start}:host([placement^=bottom]) [part=stack]{flex-direction:column-reverse;align-self:end}:host([placement$=start]) [part=stack]{justify-self:start}:host([placement$=center]) [part=stack]{justify-self:center}:host([placement$=end]) [part=stack]{justify-self:end}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{z-index:var(--lr-layer-toast);--_lr-toast-gap:var(--gap,var(--lr-space-s));--_lr-toast-width:var(--width,var(--lr-size-28rem));pointer-events:none;display:grid;position:fixed;inset-block-start:max(var(--lr-space-l), var(--lr-safe-area-top));inset-block-end:max(var(--lr-space-l), var(--lr-safe-area-bottom));inset-inline-start:max(var(--lr-space-l), var(--lr-safe-area-inline-start));inset-inline-end:max(var(--lr-space-l), var(--lr-safe-area-inline-end))}[part=stack]{gap:var(--lr-toast-gap,var(--_lr-toast-gap));inline-size:min(var(--lr-toast-width,var(--_lr-toast-width)), 100%);overscroll-behavior:contain;flex-direction:column;min-block-size:0;max-block-size:100%;max-inline-size:100%;display:flex;overflow:hidden auto}::slotted(*){pointer-events:auto}::slotted([data-toast-queued]){pointer-events:none;display:none!important}:host([placement^=top]) [part=stack]{align-self:start}:host([placement^=bottom]) [part=stack]{flex-direction:column-reverse;align-self:end}:host([placement$=start]) [part=stack]{justify-self:start}:host([placement$=center]) [part=stack]{justify-self:center}:host([placement$=end]) [part=stack]{justify-self:end}`;export{styles};
@@ -1 +1 @@
1
- const HULL_STROKE_WIDTH=48,MIN_PICK_TARGET_PX=24,PICK_RASTER_GUARD_PX=2,LABEL_HALO_WIDTH=3,EXPAND_BADGE_R=5,EXPAND_BADGE_OFFSET=Math.SQRT1_2;function pathForShape(x,y,r,shape){const path=new Path2D;if(shape==="circle")return path.arc(x,y,r,0,Math.PI*2),path;const s=r*Math.sqrt(Math.PI)/2;if(shape==="square")return path.rect(x-s,y-s,s*2,s*2),path;const d=s*Math.SQRT2;return path.moveTo(x,y-d),path.lineTo(x+d,y),path.lineTo(x,y+d),path.lineTo(x-d,y),path.closePath(),path}function drawArrowhead(ctx,link){const dx=link.x2-link.x1,dy=link.y2-link.y1,len=Math.hypot(dx,dy)||1,ux=dx/len,uy=dy/len,size=Math.max(6,link.width*3),bx=link.x2-ux*size,by=link.y2-uy*size,px=-uy,py=ux;ctx.beginPath(),ctx.moveTo(link.x2,link.y2),ctx.lineTo(bx+px*size*.4,by+py*size*.4),ctx.lineTo(bx-px*size*.4,by-py*size*.4),ctx.closePath(),ctx.fillStyle=ctx.strokeStyle,ctx.fill()}function drawRing(ctx,ring,color){ctx.strokeStyle=color,ctx.lineWidth=2,ctx.beginPath(),ctx.arc(ring.x,ring.y,ring.r,0,Math.PI*2),ctx.stroke()}function drawKeyboardFocusCue(ctx,scene){if(ctx.strokeStyle=scene.haloColor,ctx.setLineDash([4,3]),scene.keyboardFocusLink){const link=scene.keyboardFocusLink;ctx.lineWidth=Math.max(4,link.width+4),ctx.beginPath(),ctx.moveTo(link.x1,link.y1),ctx.lineTo(link.x2,link.y2),ctx.stroke()}scene.keyboardFocusHull&&(ctx.lineWidth=4,ctx.stroke(new Path2D(scene.keyboardFocusHull.d))),ctx.setLineDash([]),scene.keyboardFocusRing&&drawRing(ctx,scene.keyboardFocusRing,scene.haloColor)}function drawGraphScene(ctx,camera,scene){ctx.save(),ctx.transform(camera.k,0,0,camera.k,camera.x,camera.y);const hullOpacity=scene.hullOpacity??.12;for(const hull of scene.hulls){const path=new Path2D(hull.d);ctx.globalAlpha=hullOpacity,ctx.fillStyle=hull.fill,ctx.strokeStyle=hull.fill,ctx.lineWidth=48,ctx.lineJoin="round",ctx.lineCap="round",ctx.fill(path),ctx.stroke(path),ctx.globalAlpha=1}const dimmedOpacity=scene.dimmedOpacity??1;for(const link of scene.links)link.width<=0||(ctx.strokeStyle=link.selected?scene.selectedColor:link.color,ctx.lineWidth=link.width,ctx.setLineDash(link.dash?[...link.dash]:[]),ctx.globalAlpha=link.dimmed?dimmedOpacity:1,ctx.beginPath(),ctx.moveTo(link.x1,link.y1),ctx.lineTo(link.x2,link.y2),ctx.stroke(),link.directed&&drawArrowhead(ctx,link));if(ctx.globalAlpha=1,ctx.setLineDash([]),scene.edgeLabels.length){ctx.font=scene.font,ctx.textAlign="center",ctx.textBaseline="middle",ctx.lineWidth=3;for(const label of scene.edgeLabels)ctx.strokeStyle=scene.labelHaloColor,ctx.strokeText(label.text,label.x,label.y),ctx.fillStyle=scene.labelColor,ctx.fillText(label.text,label.x,label.y)}for(const node of scene.nodes){const path=pathForShape(node.x,node.y,node.r,node.shape);ctx.globalAlpha=node.dimmed?dimmedOpacity:1,ctx.fillStyle=node.fill,ctx.fill(path),node.selected&&(ctx.strokeStyle=scene.selectedColor,ctx.lineWidth=2,ctx.stroke(path))}if(ctx.globalAlpha=1,scene.showNodeLabels&&scene.nodeLabels.length){ctx.font=scene.font,ctx.textAlign="left",ctx.textBaseline="middle",ctx.fillStyle=scene.labelColor;for(const label of scene.nodeLabels)ctx.fillText(label.text,label.x,label.y)}const expandIndicators=scene.expandIndicators??[];if(expandIndicators.length){ctx.lineWidth=1;for(const indicator of expandIndicators){const bx=indicator.x+indicator.r*EXPAND_BADGE_OFFSET,by=indicator.y-indicator.r*EXPAND_BADGE_OFFSET,path=new Path2D;path.arc(bx,by,5,0,Math.PI*2),ctx.fillStyle=scene.expandBadgeFill??"",ctx.fill(path),ctx.strokeStyle=scene.expandBadgeStroke??"",ctx.stroke(path),ctx.strokeStyle=scene.labelColor,ctx.beginPath(),ctx.moveTo(bx-5/2,by),ctx.lineTo(bx+5/2,by),ctx.moveTo(bx,by-5/2),ctx.lineTo(bx,by+5/2),ctx.stroke()}}scene.focusHalo&&drawRing(ctx,scene.focusHalo,scene.haloColor),drawKeyboardFocusCue(ctx,scene),ctx.restore()}function indexToPickColor(index){const v=index+1;return`rgb(${v>>16&255},${v>>8&255},${v&255})`}function pickColorToIndex(r,g,b){return(r<<16|g<<8|b)-1}function drawPickingScene(ctx,camera,scene){ctx.imageSmoothingEnabled=!1,ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height),ctx.save(),ctx.transform(camera.k,0,0,camera.k,camera.x,camera.y);const minimumWorldStroke=26/(Number.isFinite(camera.k)&&Math.abs(camera.k)>0?Math.abs(camera.k):1);let idx=0;for(const hull of scene.hulls){const color=indexToPickColor(idx++),path=new Path2D(hull.d);ctx.fillStyle=color,ctx.strokeStyle=color,ctx.lineWidth=Math.max(48,minimumWorldStroke),ctx.lineJoin="round",ctx.lineCap="round",ctx.fill(path),ctx.stroke(path)}for(const link of scene.links)ctx.strokeStyle=indexToPickColor(idx++),ctx.lineWidth=Math.max(link.width+6,8,minimumWorldStroke),ctx.lineCap="round",ctx.beginPath(),ctx.moveTo(link.x1,link.y1),ctx.lineTo(link.x2,link.y2),ctx.stroke();for(const node of scene.nodes)ctx.fillStyle=indexToPickColor(idx++),ctx.fill(pathForShape(node.x,node.y,Math.max(node.r,minimumWorldStroke/2),node.shape));ctx.restore()}export{drawGraphScene,drawPickingScene,indexToPickColor,pickColorToIndex};
1
+ const HULL_STROKE_WIDTH=48,MIN_PICK_TARGET_PX=24,PICK_RASTER_GUARD_PX=2,LABEL_HALO_WIDTH=3,SELECTED_LINK_STROKE_WIDTH=3,EXPAND_BADGE_R=5,EXPAND_BADGE_OFFSET=Math.SQRT1_2;function pathForShape(x,y,r,shape){const path=new Path2D;if(shape==="circle")return path.arc(x,y,r,0,Math.PI*2),path;const s=r*Math.sqrt(Math.PI)/2;if(shape==="square")return path.rect(x-s,y-s,s*2,s*2),path;const d=s*Math.SQRT2;return path.moveTo(x,y-d),path.lineTo(x+d,y),path.lineTo(x,y+d),path.lineTo(x-d,y),path.closePath(),path}function drawArrowhead(ctx,link){const dx=link.x2-link.x1,dy=link.y2-link.y1,len=Math.hypot(dx,dy)||1,ux=dx/len,uy=dy/len,size=Math.max(6,link.width*3),bx=link.x2-ux*size,by=link.y2-uy*size,px=-uy,py=ux;ctx.beginPath(),ctx.moveTo(link.x2,link.y2),ctx.lineTo(bx+px*size*.4,by+py*size*.4),ctx.lineTo(bx-px*size*.4,by-py*size*.4),ctx.closePath(),ctx.fillStyle=ctx.strokeStyle,ctx.fill()}function drawRing(ctx,ring,color){ctx.strokeStyle=color,ctx.lineWidth=2,ctx.beginPath(),ctx.arc(ring.x,ring.y,ring.r,0,Math.PI*2),ctx.stroke()}function drawKeyboardFocusCue(ctx,scene){if(ctx.strokeStyle=scene.haloColor,ctx.setLineDash([4,3]),scene.keyboardFocusLink){const link=scene.keyboardFocusLink;ctx.lineWidth=Math.max(4,link.width+4),ctx.beginPath(),ctx.moveTo(link.x1,link.y1),ctx.lineTo(link.x2,link.y2),ctx.stroke()}scene.keyboardFocusHull&&(ctx.lineWidth=4,ctx.stroke(new Path2D(scene.keyboardFocusHull.d))),ctx.setLineDash([]),scene.keyboardFocusRing&&drawRing(ctx,scene.keyboardFocusRing,scene.haloColor)}function drawGraphScene(ctx,camera,scene){ctx.save(),ctx.transform(camera.k,0,0,camera.k,camera.x,camera.y);const hullOpacity=scene.hullOpacity??.12;for(const hull of scene.hulls){const path=new Path2D(hull.d);ctx.globalAlpha=hullOpacity,ctx.fillStyle=hull.fill,ctx.strokeStyle=hull.fill,ctx.lineWidth=48,ctx.lineJoin="round",ctx.lineCap="round",ctx.fill(path),ctx.stroke(path),ctx.globalAlpha=1}const dimmedOpacity=scene.dimmedOpacity??1;for(const link of scene.links)link.width<=0||(ctx.strokeStyle=link.selected?scene.selectedColor:link.color,ctx.lineWidth=link.selected?3:link.width,ctx.setLineDash(link.dash?[...link.dash]:[]),ctx.globalAlpha=link.dimmed?dimmedOpacity:1,ctx.beginPath(),ctx.moveTo(link.x1,link.y1),ctx.lineTo(link.x2,link.y2),ctx.stroke(),link.directed&&drawArrowhead(ctx,link));if(ctx.globalAlpha=1,ctx.setLineDash([]),scene.edgeLabels.length){ctx.font=scene.font,ctx.textAlign="center",ctx.textBaseline="middle",ctx.lineWidth=3;for(const label of scene.edgeLabels)ctx.strokeStyle=scene.labelHaloColor,ctx.strokeText(label.text,label.x,label.y),ctx.fillStyle=scene.labelColor,ctx.fillText(label.text,label.x,label.y)}for(const node of scene.nodes){const path=pathForShape(node.x,node.y,node.r,node.shape);ctx.globalAlpha=node.dimmed?dimmedOpacity:1,ctx.fillStyle=node.fill,ctx.fill(path),node.selected&&(ctx.strokeStyle=scene.selectedColor,ctx.lineWidth=2,ctx.stroke(path))}if(ctx.globalAlpha=1,scene.showNodeLabels&&scene.nodeLabels.length){ctx.font=scene.font,ctx.textAlign="left",ctx.textBaseline="middle",ctx.fillStyle=scene.labelColor;for(const label of scene.nodeLabels)ctx.fillText(label.text,label.x,label.y)}const expandIndicators=scene.expandIndicators??[];if(expandIndicators.length){ctx.lineWidth=1;for(const indicator of expandIndicators){const bx=indicator.x+indicator.r*EXPAND_BADGE_OFFSET,by=indicator.y-indicator.r*EXPAND_BADGE_OFFSET,path=new Path2D;path.arc(bx,by,5,0,Math.PI*2),ctx.fillStyle=scene.expandBadgeFill??"",ctx.fill(path),ctx.strokeStyle=scene.expandBadgeStroke??"",ctx.stroke(path),ctx.strokeStyle=scene.labelColor,ctx.beginPath(),ctx.moveTo(bx-5/2,by),ctx.lineTo(bx+5/2,by),ctx.moveTo(bx,by-5/2),ctx.lineTo(bx,by+5/2),ctx.stroke()}}scene.focusHalo&&drawRing(ctx,scene.focusHalo,scene.haloColor),drawKeyboardFocusCue(ctx,scene),ctx.restore()}function indexToPickColor(index){const v=index+1;return`rgb(${v>>16&255},${v>>8&255},${v&255})`}function pickColorToIndex(r,g,b){return(r<<16|g<<8|b)-1}function drawPickingScene(ctx,camera,scene){ctx.imageSmoothingEnabled=!1,ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height),ctx.save(),ctx.transform(camera.k,0,0,camera.k,camera.x,camera.y);const minimumWorldStroke=26/(Number.isFinite(camera.k)&&Math.abs(camera.k)>0?Math.abs(camera.k):1);let idx=0;for(const hull of scene.hulls){const color=indexToPickColor(idx++),path=new Path2D(hull.d);ctx.fillStyle=color,ctx.strokeStyle=color,ctx.lineWidth=Math.max(48,minimumWorldStroke),ctx.lineJoin="round",ctx.lineCap="round",ctx.fill(path),ctx.stroke(path)}for(const link of scene.links)ctx.strokeStyle=indexToPickColor(idx++),ctx.lineWidth=Math.max(link.width+6,8,minimumWorldStroke),ctx.lineCap="round",ctx.beginPath(),ctx.moveTo(link.x1,link.y1),ctx.lineTo(link.x2,link.y2),ctx.stroke();for(const node of scene.nodes)ctx.fillStyle=indexToPickColor(idx++),ctx.fill(pathForShape(node.x,node.y,Math.max(node.r,minimumWorldStroke/2),node.shape));ctx.restore()}export{drawGraphScene,drawPickingScene,indexToPickColor,pickColorToIndex};
@@ -406,10 +406,17 @@ private get safeChargeStrength();
406
406
  * `distance()`, the layered layout's `gapY`, and the neighbor-jitter spawn radius, none of
407
407
  * which have a sane meaning for a negative/non-finite value. */
408
408
  private get safeLinkDistance();private resolveNodeType;private nodeShape;
409
+ /** `nodeTypes` filtered to a non-blank `label`, in the same order `lr-graph-legend` renders its
410
+ * rows in (its `render()` applies an identical filter before assigning a row its palette
411
+ * index). Keeping this filter in sync here is what keeps a node's categorical fallback color
412
+ * matching the swatch color a paired legend shows for the same type. */
413
+ private labeledNodeTypes;
409
414
  /** Resolution precedence: `node.color` (existing, most specific) > matched `LyraNodeTypeStyle.color`
410
- * > the ordered categorical fallback palette by the type's index in `nodeTypes` > (returns
411
- * `undefined`, letting the untyped `--lr-node-fill` token default apply). Both data-driven
412
- * color sources pass the existing `sanitizeNodeColor()`. */
415
+ * > the ordered categorical fallback palette by the type's index among label-bearing `nodeTypes`
416
+ * entries, matching `lr-graph-legend`'s own row order > (returns `undefined`, letting the
417
+ * untyped `--lr-node-fill` token default apply). Both data-driven color sources pass the
418
+ * existing `sanitizeNodeColor()`. A blank-label type itself (never shown as its own legend row)
419
+ * falls back to its raw `nodeTypes` position, since there is no legend row to stay in sync with. */
413
420
  private nodeFill;
414
421
  /** `this.nodes` filtered down to the ids `hiddenTypes` doesn't hide -- an untyped node (`type ==
415
422
  * null`) is never hidden, regardless of `hiddenTypes`' contents. */
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,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{specialistTokens}from"../../../internal/specialist-tokens.styles.js";import{hostAriaLabel,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{resolveCssLength}from"../../../internal/css-length.js";import{styles}from"./graph.styles.js";import{loadD3}from"./graph-loader.js";import{convexHull,hullPathD,hullCentroidX,hullTopY}from"./graph-hull.js";import{drawGraphScene,drawPickingScene,pickColorToIndex}from"./graph-canvas.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{finiteNumber,finiteRange,finiteInteger}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{activeElementIn}from"../../../internal/active-element.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{copyGraphLinkIdentity,graphLinkIdentity,normalizeGraphModel}from"./graph-model.js";import{canonicalIdentityList}from"../retrieval-identity.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_graphCommunity,LYRA_DEFAULT_graphDataList,LYRA_DEFAULT_graphDiagram,LYRA_DEFAULT_graphExpandableItem,LYRA_DEFAULT_graphItemAnnouncement,LYRA_DEFAULT_graphLink,LYRA_DEFAULT_graphMissingLibrary,LYRA_DEFAULT_graphNode,LYRA_DEFAULT_graphNodeFocused,LYRA_DEFAULT_graphNodesHidden,LYRA_DEFAULT_graphSelectionCount,LYRA_DEFAULT_graphTypedNode,LYRA_DEFAULT_loading,LYRA_DEFAULT_noData}from"../../../internal/default-strings.generated.js";const GRAPH_LAYOUT=literalSetConverter(["force","layered"],"force"),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,EXPAND_BADGE_R=5,EXPAND_BADGE_OFFSET=Math.SQRT1_2,FOCUS_HALO_PADDING=6,HULL_PADDING=24,CANVAS_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 shapeHalfSide(r){return r*Math.sqrt(Math.PI)/2}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])}class LyraGraph extends LyraElement{static{this.defaultStrings={...super.defaultStrings,graphCommunity:LYRA_DEFAULT_graphCommunity,graphDataList:LYRA_DEFAULT_graphDataList,graphDiagram:LYRA_DEFAULT_graphDiagram,graphExpandableItem:LYRA_DEFAULT_graphExpandableItem,graphItemAnnouncement:LYRA_DEFAULT_graphItemAnnouncement,graphLink:LYRA_DEFAULT_graphLink,graphMissingLibrary:LYRA_DEFAULT_graphMissingLibrary,graphNode:LYRA_DEFAULT_graphNode,graphNodeFocused:LYRA_DEFAULT_graphNodeFocused,graphNodesHidden:LYRA_DEFAULT_graphNodesHidden,graphSelectionCount:LYRA_DEFAULT_graphSelectionCount,graphTypedNode:LYRA_DEFAULT_graphTypedNode,loading:LYRA_DEFAULT_loading,noData:LYRA_DEFAULT_noData}}static{this.ownedCollectionProperties=Object.freeze(["nodes","links","nodeTypes","hiddenTypes","communities","selectedNodeIds","selectedLinkIds","dimmedNodeIds","dimmedLinkIds"])}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.links||sources[2]!==this.nodeTypes||sources[3]!==this.communities)&&(this.normalizedGraphSources=[this.nodes,this.links,this.nodeTypes,this.communities],this.normalizedGraphModel=normalizeGraphModel(this.nodes,this.links,this.nodeTypes,this.communities)),this.normalizedGraphModel}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))}constructor(){super(),this.nodes=[],this.links=[],this.nodeTypes=[],this.hiddenTypes=[],this.communities=[],this._layout="force",this.renderer="svg",this.width=800,this.height=600,this.chargeStrength=-300,this.linkDistance=100,this.minZoom=.1,this.maxZoom=8,this.accessibleLabel=null,this.showEdgeLabels=!1,this.edgeLabelMinZoom=.6,this.focusNodeId=null,this.selectionMode="none",this.selectedNodeIds=[],this.selectedLinkIds=[],this.dimmedNodeIds=[],this.dimmedLinkIds=[],this.arrowMarkerId=nextId("graph-arrow"),this.loading=!0,this.loadFailed=!1,this.loadLibrary=loadD3,this.loadGeneration=0,this.simNodes=[],this.simLinks=[],this.danglingLinks=[],this.lastPositionById=new Map,this.lastHiddenNodeCount=0,this.activeGraphItem=0,this.graphLiveText="",this.graphAnnouncementsReady=!1,this.isMounting=!0,this.authorRole=null,this.syncingGraphHostRole=!1,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.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 rect=this.canvasEl.getBoundingClientRect();this.canvasDragNode.fx=(e.clientX-rect.left-this.canvasCamera.x)/this.canvasCamera.k,this.canvasDragNode.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,()=>{this.linkPaintVisibilityCache.clear(),this.resolvedCssColorCache.clear(),this.renderer==="canvas"&&this.markCanvasDirty()})}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),name==="role"&&oldValue!==value&&!this.syncingGraphHostRole&&(this.authorRole=value)}hostOwnsGraphSemantics(){return hostAriaLabel(this)!==null}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(){super.connectedCallback(),this.syncAnnouncementSinks();const IntersectionObserverCtor=this.ownerWindow?.IntersectionObserver;if(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.d3){this.simulation?.restart(),this.renderer==="canvas"&&this.canvasEl&&this.canvasEl===this.zoomedEl&&(this.ensureCanvasOwnerRealm(),this.watchCanvasResize(),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.releaseAnnouncementSinks(),this.loadGeneration+=1,this.simulation?.stop(),this.finishCanvasNodeDrag(void 0,!0,!1),this.takeCanvasPointerDown(),this.cancelCameraTween(),this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.canvasResizeObserver?.disconnect(),this.canvasResizeObserver=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.releaseAnnouncementSinks(),this.syncAnnouncementSinks(),this.ensureCanvasOwnerRealm()}syncAnnouncementSinks(){!this.isConnected||this.politeAnnouncementSink?.element.ownerDocument===this.ownerDocument&&this.assertiveAnnouncementSink?.element.ownerDocument===this.ownerDocument||(this.releaseAnnouncementSinks(),this.politeAnnouncementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.assertiveAnnouncementSink=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}))}releaseAnnouncementSinks(){this.politeAnnouncementSink?.release(),this.politeAnnouncementSink=void 0,this.assertiveAnnouncementSink?.release(),this.assertiveAnnouncementSink=void 0}scheduleViewportChange(){if(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",{k:transform.k,x:transform.x,y:transform.y})}))}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){if(this.safeLinkWidth(link)<=0)return!1;const computed=this.computedStyle(),effectivePaint=sanitizeNodeColor(link.color)??(computed.getPropertyValue("--lr-link-color").trim()||computed.getPropertyValue("--lr-color-border").trim()),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=>this.simLinks.filter(link=>this.isInteractiveLink(link,resolveColor))):[]),this.navigableLinksCache}get safeWidth(){return finiteRange(this.width,800,1)}get safeHeight(){return finiteRange(this.height,600,1)}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 safeSeed(){return this.seed==null?void 0:finiteInteger(this.seed,0)}get safeChargeStrength(){return finiteNumber(this.chargeStrength,-300)}get safeLinkDistance(){return finiteRange(this.linkDistance,100,0)}resolveNodeType(node){return node.type!=null?this.graphModel.nodeTypes.find(t=>t.id===node.type):void 0}nodeShape(node){return this.resolveNodeType(node)?.shape??"circle"}nodeFill(node){const ownColor=sanitizeNodeColor(node.color);if(ownColor)return ownColor;const type=this.resolveNodeType(node);if(!type)return;const typeColor=sanitizeNodeColor(type.color);return typeColor||categoricalPaletteColor(this.graphModel.nodeTypes.indexOf(type))}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-click",{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(frameOwner)){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=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){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.d3||!this.zoomedEl||!this.zoomBehavior||!this.simNodes.length)return;const padding=finiteRange(options?.padding??24,24,0);this.tweenCamera(()=>{let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const n of this.simNodes){const r=this.nodeRadius(n);minX=Math.min(minX,(n.x??0)-r),maxX=Math.max(maxX,(n.x??0)+r),minY=Math.min(minY,(n.y??0)-r),maxY=Math.max(maxY,(n.y??0)+r)}for(const entry of this.visibleCommunities())for(const p of this.communityHull(entry.members))minX=Math.min(minX,p.x-HULL_PADDING),maxX=Math.max(maxX,p.x+HULL_PADDING),minY=Math.min(minY,p.y-HULL_PADDING),maxY=Math.max(maxY,p.y+HULL_PADDING);const boxW=Math.max(1,maxX-minX),boxH=Math.max(1,maxY-minY),availW=Math.max(1,this.safeWidth-padding*2),availH=Math.max(1,this.safeHeight-padding*2),bounds=this.effectiveZoomBounds,k=finiteRange(Math.min(availW/boxW,availH/boxH),bounds.min,bounds.min,bounds.max),cx=(minX+maxX)/2,cy=(minY+maxY)/2;return this.d3.zoomIdentity.translate(this.safeWidth/2-k*cx,this.safeHeight/2-k*cy).scale(k)})}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.watchCanvasResize(),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)}watchCanvasResize(){this.canvasResizeObserver?.disconnect();const ResizeObserverCtor=this.ownerWindow?.ResizeObserver;if(!ResizeObserverCtor){this.canvasResizeObserver=void 0;return}this.canvasResizeObserver=new ResizeObserverCtor(()=>this.markCanvasDirty()),this.canvasResizeObserver.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.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){const probe=this.createCanvasColorProbe();try{return callback(value=>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-link-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.showEdgeLabels&&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-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,activeIdentity=(activeElementIn(this.shadowRoot)?.getAttribute("part")?.split(/\s+/)??[]).includes("cursor-item")?this.graphItemIdentity(this.normalizedGraphItem()):void 0,activeNode=activeIdentity?.kind==="node"?this.simNodes.find(node=>node.id===activeIdentity.id):void 0,activeLink=activeIdentity?.kind==="link"?this.navigableLinks().find(link=>this.linkKey(link)===activeIdentity.id):void 0,activeCommunity=activeIdentity?.kind==="community"?this.visibleCommunities().find(entry=>entry.community.id===activeIdentity.id):void 0,activeLinkCoordinates=activeLink?this.linkCoordinates(activeLink):void 0;return{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,keyboardFocusRing:activeNode?{x:activeNode.x??0,y:activeNode.y??0,r:this.nodeRadius(activeNode)+4}:void 0,keyboardFocusLink:activeLink&&activeLinkCoordinates?{...activeLinkCoordinates,width:this.safeLinkWidth(activeLink)}:void 0,keyboardFocusHull:activeCommunity?{d:hullPathD(this.communityHull(activeCommunity.members))}:void 0,showNodeLabels:this.canvasCamera.k>=CANVAS_NODE_LABEL_MIN_ZOOM,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"}`}})}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.showEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom,nodeLabelsVisible=this.canvasCamera.k>=CANVAS_NODE_LABEL_MIN_ZOOM;(!this.canvasScene||this.canvasScene.showNodeLabels!==nodeLabelsVisible||this.canvasSceneHasEdgeLabels!==edgeLabelsVisible)&&(this.canvasScene=this.buildCanvasScene(this.computedStyle()),this.canvasSceneHasEdgeLabels=edgeLabelsVisible),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;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.emit("lr-link-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.emit("lr-link-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 kind==="node"?canonicalIdentityList(this.selectedNodeIds).includes(id):canonicalIdentityList(this.selectedLinkIds).includes(id)}isDimmed(kind,id){return kind==="node"?canonicalIdentityList(this.dimmedNodeIds).includes(id):canonicalIdentityList(this.dimmedLinkIds).includes(id)}linkKey(link){return graphLinkIdentity(link)}emitSelectionIntent(kind,id,toggle){if(this.selectionMode==="none")return;const selected=this.isSelected(kind,id);if(this.selectionMode==="single"||!toggle){if(this.selectionMode==="single"&&selected){this.emit("lr-selection-change",{nodeIds:[],linkIds:[]});return}this.emit("lr-selection-change",kind==="node"?{nodeIds:[id],linkIds:[]}:{nodeIds:[],linkIds:[id]});return}const selectedNodeIds=canonicalIdentityList(this.selectedNodeIds),selectedLinkIds=canonicalIdentityList(this.selectedLinkIds),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",{nodeIds,linkIds})}clearSelection(){this.selectionMode!=="none"&&(!canonicalIdentityList(this.selectedNodeIds).length&&!canonicalIdentityList(this.selectedLinkIds).length||this.emit("lr-selection-change",{nodeIds:[],linkIds:[]}))}willUpdate(changed){super.willUpdate(changed),this.resolvedCssColorCache.clear(),this.navigableLinksCache=void 0,this.syncGraphHostRole();const wasMounting=this.isMounting;this.isMounting=!1;const structureChanged=this.d3&&(changed.has("nodes")||changed.has("links")||changed.has("hiddenTypes")||changed.has("layout")||this.layout==="layered"&&changed.has("linkDistance")),graphItemsChanged=!!(structureChanged||changed.has("simNodes")||changed.has("communities")),activePart=activeElementIn(this.shadowRoot)?.getAttribute("part")??"",hadGraphItemFocus=graphItemsChanged&&["node","link","hull","cursor-item"].includes(activePart),previousIndex=this.normalizedGraphItem(),previousIdentity=graphItemsChanged?this.graphItemIdentity(previousIndex):void 0;if(structureChanged&&(this.rebuildSimulation(),this.navigableLinksCache=void 0),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("selectedLinkIds")&&!sameIds(changed.get("selectedLinkIds"),this.selectedLinkIds);(selectedNodeIdsChanged||selectedLinkIdsChanged)&&!wasMounting&&(this.graphLiveText=this.localize("graphSelectionCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(canonicalIdentityList(this.selectedNodeIds).length+canonicalIdentityList(this.selectedLinkIds).length)}))}updated(changed){super.updated(changed),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.politeAnnouncementSink?.announce(this.graphLiveText),changed.has("loadFailed")&&changed.get("loadFailed")!==void 0&&this.loadFailed&&this.assertiveAnnouncementSink?.announce(this.localize("graphMissingLibrary")),!this.d3)return;!changed.has("nodes")&&!changed.has("links")&&!changed.has("hiddenTypes")&&((changed.has("width")||changed.has("height"))&&(this.simulation?.force("center",this.d3.forceCenter(this.safeWidth/2,this.safeHeight/2)),this.simulation?.alpha(.1).restart()),(changed.has("chargeStrength")||changed.has("linkDistance"))&&(changed.has("chargeStrength")&&this.chargeForce?.strength(this.safeChargeStrength),changed.has("linkDistance")&&this.linkForce?.distance(this.safeLinkDistance),this.simulation?.alpha(.3).restart())),this.applyInteractions(changed),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");if(svgEl&&svgEl!==this.zoomedEl){this.canvasResizeObserver?.disconnect(),this.canvasResizeObserver=void 0,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.scheduleViewportChange()}).on("end",()=>{this.isPanning=!1});this.zoomBehavior=zoomBehavior,this.d3.select(svgEl).call(zoomBehavior),this.updateHitAreaZoomScale(1),this.updateEdgeLabelZoomGate(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("simNodes")||changed.has("simLinks")||changed.has("nodeTypes")||changed.has("showEdgeLabels")||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 n=this.simNodes[i];if(n)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(),n.fx=n.x,n.fy=n.y}).on("drag",event=>{n.fx=event.x,n.fy=event.y}).on("end",event=>{this.isDragging=!1,event.active||this.simulation?.alphaTarget(0),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.showEdgeLabels&&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.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;for(const n of nodes){if(n.x!=null&&n.y!=null)continue;const neighborLink=resolvedLinks.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.ownerWindow)||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.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}});let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const p of raw.values())minX=Math.min(minX,p.x),maxX=Math.max(maxX,p.x),minY=Math.min(minY,p.y),maxY=Math.max(maxY,p.y);const offsetX=raw.size?this.safeWidth/2-(minX+(maxX-minX)/2):this.safeWidth/2,offsetY=raw.size?this.safeHeight/2-(minY+(maxY-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.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){this.emit("lr-node-click",{nodeId:node.id,x:node.x??0,y:node.y??0}),this.emitSelectionIntent("node",node.id,!!(e?.ctrlKey||e?.metaKey))}getNodePosition(id){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}}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-link-click",{sourceNodeId:source,targetNodeId:target,...link.id?{linkId: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.emit("lr-node-enter",{nodeId:node.id}))}onNodeLeave(node,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),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.emit("lr-link-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?{linkId:link.id}:{}}}onLinkLeave(link,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),this.emit("lr-link-leave",this.linkHoverDetail(link)))}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 resolveCssLength(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"))}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){(this.renderer==="canvas"?Array.from(this.renderRoot.querySelectorAll('[part="cursor-item"]')):[...Array.from(this.renderRoot.querySelectorAll('[part="node"]')),...Array.from(this.renderRoot.querySelectorAll('[part="link"][tabindex]')),...Array.from(this.renderRoot.querySelectorAll('[part="hull"]'))])[index]?.focus()}onGraphKeyDown(e,index,activate){if(e.key==="Enter"||e.key===" "){if(e.preventDefault(),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.loading)return html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,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{specialistTokens}from"../../../internal/specialist-tokens.styles.js";import{hostAriaLabel,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{resolveCssLength}from"../../../internal/css-length.js";import{styles}from"./graph.styles.js";import{loadD3}from"./graph-loader.js";import{convexHull,hullPathD,hullCentroidX,hullTopY}from"./graph-hull.js";import{drawGraphScene,drawPickingScene,pickColorToIndex}from"./graph-canvas.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{finiteNumber,finiteRange,finiteInteger}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{activeElementIn}from"../../../internal/active-element.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{copyGraphLinkIdentity,graphLinkIdentity,normalizeGraphModel}from"./graph-model.js";import{canonicalIdentityList}from"../retrieval-identity.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_graphCommunity,LYRA_DEFAULT_graphDataList,LYRA_DEFAULT_graphDiagram,LYRA_DEFAULT_graphExpandableItem,LYRA_DEFAULT_graphItemAnnouncement,LYRA_DEFAULT_graphLink,LYRA_DEFAULT_graphMissingLibrary,LYRA_DEFAULT_graphNode,LYRA_DEFAULT_graphNodeFocused,LYRA_DEFAULT_graphNodesHidden,LYRA_DEFAULT_graphSelectionCount,LYRA_DEFAULT_graphTypedNode,LYRA_DEFAULT_loading,LYRA_DEFAULT_noData}from"../../../internal/default-strings.generated.js";const GRAPH_LAYOUT=literalSetConverter(["force","layered"],"force"),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,EXPAND_BADGE_R=5,EXPAND_BADGE_OFFSET=Math.SQRT1_2,FOCUS_HALO_PADDING=6,HULL_PADDING=24,CANVAS_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 shapeHalfSide(r){return r*Math.sqrt(Math.PI)/2}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])}class LyraGraph extends LyraElement{static{this.defaultStrings={...super.defaultStrings,graphCommunity:LYRA_DEFAULT_graphCommunity,graphDataList:LYRA_DEFAULT_graphDataList,graphDiagram:LYRA_DEFAULT_graphDiagram,graphExpandableItem:LYRA_DEFAULT_graphExpandableItem,graphItemAnnouncement:LYRA_DEFAULT_graphItemAnnouncement,graphLink:LYRA_DEFAULT_graphLink,graphMissingLibrary:LYRA_DEFAULT_graphMissingLibrary,graphNode:LYRA_DEFAULT_graphNode,graphNodeFocused:LYRA_DEFAULT_graphNodeFocused,graphNodesHidden:LYRA_DEFAULT_graphNodesHidden,graphSelectionCount:LYRA_DEFAULT_graphSelectionCount,graphTypedNode:LYRA_DEFAULT_graphTypedNode,loading:LYRA_DEFAULT_loading,noData:LYRA_DEFAULT_noData}}static{this.ownedCollectionProperties=Object.freeze(["nodes","links","nodeTypes","hiddenTypes","communities","selectedNodeIds","selectedLinkIds","dimmedNodeIds","dimmedLinkIds"])}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.links||sources[2]!==this.nodeTypes||sources[3]!==this.communities)&&(this.normalizedGraphSources=[this.nodes,this.links,this.nodeTypes,this.communities],this.normalizedGraphModel=normalizeGraphModel(this.nodes,this.links,this.nodeTypes,this.communities)),this.normalizedGraphModel}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))}constructor(){super(),this.nodes=[],this.links=[],this.nodeTypes=[],this.hiddenTypes=[],this.communities=[],this._layout="force",this.renderer="svg",this.width=800,this.height=600,this.chargeStrength=-300,this.linkDistance=100,this.minZoom=.1,this.maxZoom=8,this.accessibleLabel=null,this.showEdgeLabels=!1,this.edgeLabelMinZoom=.6,this.focusNodeId=null,this.selectionMode="none",this.selectedNodeIds=[],this.selectedLinkIds=[],this.dimmedNodeIds=[],this.dimmedLinkIds=[],this.arrowMarkerId=nextId("graph-arrow"),this.loading=!0,this.loadFailed=!1,this.loadLibrary=loadD3,this.loadGeneration=0,this.simNodes=[],this.simLinks=[],this.danglingLinks=[],this.lastPositionById=new Map,this.lastHiddenNodeCount=0,this.activeGraphItem=0,this.graphLiveText="",this.graphAnnouncementsReady=!1,this.isMounting=!0,this.authorRole=null,this.syncingGraphHostRole=!1,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.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 rect=this.canvasEl.getBoundingClientRect();this.canvasDragNode.fx=(e.clientX-rect.left-this.canvasCamera.x)/this.canvasCamera.k,this.canvasDragNode.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,()=>{this.linkPaintVisibilityCache.clear(),this.resolvedCssColorCache.clear(),this.renderer==="canvas"&&this.markCanvasDirty()})}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),name==="role"&&oldValue!==value&&!this.syncingGraphHostRole&&(this.authorRole=value)}hostOwnsGraphSemantics(){return hostAriaLabel(this)!==null}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(){super.connectedCallback(),this.syncAnnouncementSinks();const IntersectionObserverCtor=this.ownerWindow?.IntersectionObserver;if(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.d3){this.simulation?.restart(),this.renderer==="canvas"&&this.canvasEl&&this.canvasEl===this.zoomedEl&&(this.ensureCanvasOwnerRealm(),this.watchCanvasResize(),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.releaseAnnouncementSinks(),this.loadGeneration+=1,this.simulation?.stop(),this.finishCanvasNodeDrag(void 0,!0,!1),this.takeCanvasPointerDown(),this.cancelCameraTween(),this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.canvasResizeObserver?.disconnect(),this.canvasResizeObserver=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.releaseAnnouncementSinks(),this.syncAnnouncementSinks(),this.ensureCanvasOwnerRealm()}syncAnnouncementSinks(){!this.isConnected||this.politeAnnouncementSink?.element.ownerDocument===this.ownerDocument&&this.assertiveAnnouncementSink?.element.ownerDocument===this.ownerDocument||(this.releaseAnnouncementSinks(),this.politeAnnouncementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.assertiveAnnouncementSink=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}))}releaseAnnouncementSinks(){this.politeAnnouncementSink?.release(),this.politeAnnouncementSink=void 0,this.assertiveAnnouncementSink?.release(),this.assertiveAnnouncementSink=void 0}scheduleViewportChange(){if(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",{k:transform.k,x:transform.x,y:transform.y})}))}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){if(this.safeLinkWidth(link)<=0)return!1;const computed=this.computedStyle(),effectivePaint=sanitizeNodeColor(link.color)??(computed.getPropertyValue("--lr-link-color").trim()||computed.getPropertyValue("--lr-color-border").trim()),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=>this.simLinks.filter(link=>this.isInteractiveLink(link,resolveColor))):[]),this.navigableLinksCache}get safeWidth(){return finiteRange(this.width,800,1)}get safeHeight(){return finiteRange(this.height,600,1)}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 safeSeed(){return this.seed==null?void 0:finiteInteger(this.seed,0)}get safeChargeStrength(){return finiteNumber(this.chargeStrength,-300)}get safeLinkDistance(){return finiteRange(this.linkDistance,100,0)}resolveNodeType(node){return node.type!=null?this.graphModel.nodeTypes.find(t=>t.id===node.type):void 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 type=this.resolveNodeType(node);if(!type)return;const typeColor=sanitizeNodeColor(type.color);if(typeColor)return typeColor;const labeledIndex=this.labeledNodeTypes().indexOf(type);return categoricalPaletteColor(labeledIndex===-1?this.graphModel.nodeTypes.indexOf(type):labeledIndex)}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-click",{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(frameOwner)){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=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){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.d3||!this.zoomedEl||!this.zoomBehavior||!this.simNodes.length)return;const padding=finiteRange(options?.padding??24,24,0);this.tweenCamera(()=>{let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const n of this.simNodes){const r=this.nodeRadius(n);minX=Math.min(minX,(n.x??0)-r),maxX=Math.max(maxX,(n.x??0)+r),minY=Math.min(minY,(n.y??0)-r),maxY=Math.max(maxY,(n.y??0)+r)}for(const entry of this.visibleCommunities())for(const p of this.communityHull(entry.members))minX=Math.min(minX,p.x-HULL_PADDING),maxX=Math.max(maxX,p.x+HULL_PADDING),minY=Math.min(minY,p.y-HULL_PADDING),maxY=Math.max(maxY,p.y+HULL_PADDING);const boxW=Math.max(1,maxX-minX),boxH=Math.max(1,maxY-minY),availW=Math.max(1,this.safeWidth-padding*2),availH=Math.max(1,this.safeHeight-padding*2),bounds=this.effectiveZoomBounds,k=finiteRange(Math.min(availW/boxW,availH/boxH),bounds.min,bounds.min,bounds.max),cx=(minX+maxX)/2,cy=(minY+maxY)/2;return this.d3.zoomIdentity.translate(this.safeWidth/2-k*cx,this.safeHeight/2-k*cy).scale(k)})}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.watchCanvasResize(),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)}watchCanvasResize(){this.canvasResizeObserver?.disconnect();const ResizeObserverCtor=this.ownerWindow?.ResizeObserver;if(!ResizeObserverCtor){this.canvasResizeObserver=void 0;return}this.canvasResizeObserver=new ResizeObserverCtor(()=>this.markCanvasDirty()),this.canvasResizeObserver.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.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){const probe=this.createCanvasColorProbe();try{return callback(value=>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-link-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.showEdgeLabels&&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-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,activeIdentity=(activeElementIn(this.shadowRoot)?.getAttribute("part")?.split(/\s+/)??[]).includes("cursor-item")?this.graphItemIdentity(this.normalizedGraphItem()):void 0,activeNode=activeIdentity?.kind==="node"?this.simNodes.find(node=>node.id===activeIdentity.id):void 0,activeLink=activeIdentity?.kind==="link"?this.navigableLinks().find(link=>this.linkKey(link)===activeIdentity.id):void 0,activeCommunity=activeIdentity?.kind==="community"?this.visibleCommunities().find(entry=>entry.community.id===activeIdentity.id):void 0,activeLinkCoordinates=activeLink?this.linkCoordinates(activeLink):void 0;return{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,keyboardFocusRing:activeNode?{x:activeNode.x??0,y:activeNode.y??0,r:this.nodeRadius(activeNode)+4}:void 0,keyboardFocusLink:activeLink&&activeLinkCoordinates?{...activeLinkCoordinates,width:this.safeLinkWidth(activeLink)}:void 0,keyboardFocusHull:activeCommunity?{d:hullPathD(this.communityHull(activeCommunity.members))}:void 0,showNodeLabels:this.canvasCamera.k>=CANVAS_NODE_LABEL_MIN_ZOOM,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"}`}})}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.showEdgeLabels&&this.canvasCamera.k>=this.safeEdgeLabelMinZoom,nodeLabelsVisible=this.canvasCamera.k>=CANVAS_NODE_LABEL_MIN_ZOOM;(!this.canvasScene||this.canvasScene.showNodeLabels!==nodeLabelsVisible||this.canvasSceneHasEdgeLabels!==edgeLabelsVisible)&&(this.canvasScene=this.buildCanvasScene(this.computedStyle()),this.canvasSceneHasEdgeLabels=edgeLabelsVisible),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;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.emit("lr-link-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.emit("lr-link-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 kind==="node"?canonicalIdentityList(this.selectedNodeIds).includes(id):canonicalIdentityList(this.selectedLinkIds).includes(id)}isDimmed(kind,id){return kind==="node"?canonicalIdentityList(this.dimmedNodeIds).includes(id):canonicalIdentityList(this.dimmedLinkIds).includes(id)}linkKey(link){return graphLinkIdentity(link)}emitSelectionIntent(kind,id,toggle){if(this.selectionMode==="none")return;const selected=this.isSelected(kind,id);if(this.selectionMode==="single"||!toggle){if(this.selectionMode==="single"&&selected){this.emit("lr-selection-change",{nodeIds:[],linkIds:[]});return}this.emit("lr-selection-change",kind==="node"?{nodeIds:[id],linkIds:[]}:{nodeIds:[],linkIds:[id]});return}const selectedNodeIds=canonicalIdentityList(this.selectedNodeIds),selectedLinkIds=canonicalIdentityList(this.selectedLinkIds),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",{nodeIds,linkIds})}clearSelection(){this.selectionMode!=="none"&&(!canonicalIdentityList(this.selectedNodeIds).length&&!canonicalIdentityList(this.selectedLinkIds).length||this.emit("lr-selection-change",{nodeIds:[],linkIds:[]}))}willUpdate(changed){super.willUpdate(changed),this.resolvedCssColorCache.clear(),this.navigableLinksCache=void 0,this.syncGraphHostRole();const wasMounting=this.isMounting;this.isMounting=!1;const structureChanged=this.d3&&(changed.has("nodes")||changed.has("links")||changed.has("hiddenTypes")||changed.has("layout")||this.layout==="layered"&&changed.has("linkDistance")),graphItemsChanged=!!(structureChanged||changed.has("simNodes")||changed.has("communities")),activePart=activeElementIn(this.shadowRoot)?.getAttribute("part")??"",hadGraphItemFocus=graphItemsChanged&&["node","link","hull","cursor-item"].includes(activePart),previousIndex=this.normalizedGraphItem(),previousIdentity=graphItemsChanged?this.graphItemIdentity(previousIndex):void 0;if(structureChanged&&(this.rebuildSimulation(),this.navigableLinksCache=void 0),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("selectedLinkIds")&&!sameIds(changed.get("selectedLinkIds"),this.selectedLinkIds);(selectedNodeIdsChanged||selectedLinkIdsChanged)&&!wasMounting&&(this.graphLiveText=this.localize("graphSelectionCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(canonicalIdentityList(this.selectedNodeIds).length+canonicalIdentityList(this.selectedLinkIds).length)}))}updated(changed){super.updated(changed),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.politeAnnouncementSink?.announce(this.graphLiveText),changed.has("loadFailed")&&changed.get("loadFailed")!==void 0&&this.loadFailed&&this.assertiveAnnouncementSink?.announce(this.localize("graphMissingLibrary")),!this.d3)return;!changed.has("nodes")&&!changed.has("links")&&!changed.has("hiddenTypes")&&((changed.has("width")||changed.has("height"))&&(this.simulation?.force("center",this.d3.forceCenter(this.safeWidth/2,this.safeHeight/2)),this.simulation?.alpha(.1).restart()),(changed.has("chargeStrength")||changed.has("linkDistance"))&&(changed.has("chargeStrength")&&this.chargeForce?.strength(this.safeChargeStrength),changed.has("linkDistance")&&this.linkForce?.distance(this.safeLinkDistance),this.simulation?.alpha(.3).restart())),this.applyInteractions(changed),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");if(svgEl&&svgEl!==this.zoomedEl){this.canvasResizeObserver?.disconnect(),this.canvasResizeObserver=void 0,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.scheduleViewportChange()}).on("end",()=>{this.isPanning=!1});this.zoomBehavior=zoomBehavior,this.d3.select(svgEl).call(zoomBehavior),this.updateHitAreaZoomScale(1),this.updateEdgeLabelZoomGate(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("simNodes")||changed.has("simLinks")||changed.has("nodeTypes")||changed.has("showEdgeLabels")||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 n=this.simNodes[i];if(n)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(),n.fx=n.x,n.fy=n.y}).on("drag",event=>{n.fx=event.x,n.fy=event.y}).on("end",event=>{this.isDragging=!1,event.active||this.simulation?.alphaTarget(0),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.showEdgeLabels&&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.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;for(const n of nodes){if(n.x!=null&&n.y!=null)continue;const neighborLink=resolvedLinks.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.ownerWindow)||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.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}});let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const p of raw.values())minX=Math.min(minX,p.x),maxX=Math.max(maxX,p.x),minY=Math.min(minY,p.y),maxY=Math.max(maxY,p.y);const offsetX=raw.size?this.safeWidth/2-(minX+(maxX-minX)/2):this.safeWidth/2,offsetY=raw.size?this.safeHeight/2-(minY+(maxY-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.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){this.emit("lr-node-click",{nodeId:node.id,x:node.x??0,y:node.y??0}),this.emitSelectionIntent("node",node.id,!!(e?.ctrlKey||e?.metaKey))}getNodePosition(id){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}}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-link-click",{sourceNodeId:source,targetNodeId:target,...link.id?{linkId: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.emit("lr-node-enter",{nodeId:node.id}))}onNodeLeave(node,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),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.emit("lr-link-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?{linkId:link.id}:{}}}onLinkLeave(link,e){this.isDragging||this.isPanning||this.isCameraTweening||(e.currentTarget.removeAttribute("data-hovered"),this.emit("lr-link-leave",this.linkHoverDetail(link)))}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 resolveCssLength(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"))}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){(this.renderer==="canvas"?Array.from(this.renderRoot.querySelectorAll('[part="cursor-item"]')):[...Array.from(this.renderRoot.querySelectorAll('[part="node"]')),...Array.from(this.renderRoot.querySelectorAll('[part="link"][tabindex]')),...Array.from(this.renderRoot.querySelectorAll('[part="hull"]'))])[index]?.focus()}onGraphKeyDown(e,index,activate){if(e.key==="Enter"||e.key===" "){if(e.preventDefault(),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.loading)return html`
2
2
  <div part="base">
3
3
  <lr-skeleton
4
4
  shape="rect"
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{block-size:var(--lr-canvas-reserved-height,var(--lr-size-24rem));display:block}[part=base]{block-size:100%;inline-size:100%;position:relative}svg{block-size:100%;inline-size:100%;display:block}[part=canvas]{touch-action:none;block-size:100%;inline-size:100%;display:block}[part=canvas]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=canvas]:hover{background:color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover))}[part=tooltip]{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-size-1px) solid var(--lr-color-border);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;position:absolute;top:0;left:0}[part=tooltip][hidden]{display:none}[part=link]{stroke:var(--lr-link-color,var(--lr-color-border));fill:none;cursor:pointer}[data-hit-area]{fill:none;stroke:var(--lr-color-text);stroke-opacity:.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:#0000;stroke-linecap:round;stroke-linejoin:round;pointer-events:all}[part=link]:hover{stroke:color-mix(in oklab, var(--lr-link-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-link-color,var(--lr-color-border)), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=arrowhead]{fill:context-stroke}[part=link]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=link][data-dangling]{stroke-dasharray:var(--lr-size-2px) var(--lr-size-2px);opacity:var(--lr-opacity-disabled)}[part=node]{fill:var(--lr-node-fill,var(--lr-color-brand));cursor:pointer}[part=node]:hover{fill:color-mix(in oklab, var(--lr-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-node-fill,var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=node]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[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-size-3px)}g[data-edge-labels-hidden] [part=link-label],g[data-edge-labels-hidden] [part=community-label]{display:none}[part=empty]{color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-md-sm)}[part=error]{padding:var(--lr-space-l);color:var(--lr-color-danger);font-size:var(--lr-font-size-md-sm);text-align:center;margin:0}[part=expand-indicator] circle{fill:var(--lr-color-surface);stroke:var(--lr-color-border-strong);stroke-width:var(--lr-size-1px)}[part=expand-indicator] path{stroke:var(--lr-color-text);stroke-width:var(--lr-size-1px);fill:none}[part=focus-halo]{fill:none;stroke:var(--lr-graph-focus-halo-color,var(--lr-color-brand));stroke-width:var(--lr-size-2px);pointer-events:none}[part=node][data-selected]{stroke:var(--lr-graph-selected-color,var(--lr-color-success));stroke-width:var(--lr-size-2px)}[part=link][data-selected]{stroke-width:var(--lr-size-3px);stroke:var(--lr-graph-selected-color,var(--lr-color-success))!important}[part=node][data-dimmed],[part=link][data-dimmed]{opacity:var(--lr-graph-dimmed-opacity,.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,.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{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[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-size-3px)}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{block-size:var(--lr-canvas-reserved-height,var(--lr-size-24rem));display:block}[part=base]{block-size:100%;inline-size:100%;position:relative}svg{block-size:100%;inline-size:100%;display:block}[part=canvas]{touch-action:none;block-size:100%;inline-size:100%;display:block}[part=canvas]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=canvas]:hover{background:color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover))}[part=tooltip]{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);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;position:absolute;top:0;left:0}[part=tooltip][hidden]{display:none}[part=link]{stroke:var(--lr-link-color,var(--lr-color-border));fill:none;cursor:pointer}[data-hit-area]{fill:none;stroke:var(--lr-color-text);stroke-opacity:.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:#0000;stroke-linecap:round;stroke-linejoin:round;pointer-events:all}[part=link]:hover{stroke:color-mix(in oklab, var(--lr-link-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-link-color,var(--lr-color-border)), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=arrowhead]{fill:context-stroke}[part=link]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=link][data-dangling]{stroke-dasharray:var(--lr-size-2px) var(--lr-size-2px);opacity:var(--lr-opacity-disabled)}[part=node]{fill:var(--lr-node-fill,var(--lr-color-brand));cursor:pointer}[part=node]:hover{fill:color-mix(in oklab, var(--lr-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-node-fill,var(--lr-color-brand)), var(--lr-color-mix-partner) var(--lr-color-mix-active))}[part=node]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[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}[part=empty]{color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-md-sm)}[part=error]{padding:var(--lr-space-l);color:var(--lr-color-danger);font-size:var(--lr-font-size-md-sm);text-align:center;margin:0}[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-width:var(--lr-border-width-thick);stroke:var(--lr-graph-selected-color,var(--lr-color-success))!important}[part=node][data-dimmed],[part=link][data-dimmed]{opacity:var(--lr-graph-dimmed-opacity,.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,.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{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[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};
@@ -118,4 +118,4 @@ private sink?;
118
118
  * own default) -- a raw `NaN` (e.g. an invalid `virtualize-at` attribute) would otherwise make
119
119
  * `items.length > virtualizeAt` always false, silently disabling virtualization instead of
120
120
  * falling back to the default threshold. */
121
- private get effectiveVirtualizeAt();private normalizeItems;private get normalizedItems();connectedCallback():void;disconnectedCallback():void;protected willUpdate(changed:PropertyValues):void;private stageLabel;private chunkCountText;private normalizedAttempts;private onRetryClick;private onCancelClick;private itemTemplate;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-ingestion-queue':LyraIngestionQueue;}}
121
+ private get effectiveVirtualizeAt();private normalizeItems;private normalizedItemsCache?;private get normalizedItems();private readonly renderVirtualItem;private readonly ingestionItemKey;connectedCallback():void;disconnectedCallback():void;protected willUpdate(changed:PropertyValues):void;private stageLabel;private chunkCountText;private normalizedAttempts;private onRetryClick;private onCancelClick;private itemTemplate;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-ingestion-queue':LyraIngestionQueue;}}