@aceshooting/lyra-ui 9.1.0 → 10.0.1

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 (622) hide show
  1. package/CHANGELOG.md +843 -0
  2. package/README.md +7 -0
  3. package/custom-elements.json +1 -1
  4. package/dist/cli/migrate-wa.mjs +52 -0
  5. package/dist/cli/migration-contract.json +1 -1
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +2 -2
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +0 -16
  8. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +1 -1
  9. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +9 -7
  10. package/dist/components/agent-tools/agent-run/agent-run.class.js +2 -2
  11. package/dist/components/agent-tools/agent-run/agent-run.styles.js +0 -13
  12. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +1 -1
  13. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +7 -4
  14. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +7 -5
  15. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +0 -3
  16. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +1 -1
  17. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +3 -5
  18. package/dist/components/agent-tools/commit-card/commit-card.class.js +1 -1
  19. package/dist/components/agent-tools/commit-card/commit-card.styles.js +0 -10
  20. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +11 -6
  21. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  22. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +0 -46
  23. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +1 -1
  24. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +0 -7
  25. package/dist/components/agent-tools/eval-result/eval-result.class.js +1 -1
  26. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +2 -2
  27. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +1 -1
  28. package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js +0 -15
  29. package/dist/components/agent-tools/result-card/result-card.styles.js +0 -7
  30. package/dist/components/agent-tools/result-card/result-field.styles.js +0 -5
  31. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +2 -5
  32. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
  33. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +0 -15
  34. package/dist/components/agent-tools/stack-trace/stack-trace.styles.js +0 -20
  35. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +2 -2
  36. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -4
  37. package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
  38. package/dist/components/agent-tools/task-list/task-list.styles.js +0 -15
  39. package/dist/components/agent-tools/terminal/terminal.class.d.ts +11 -6
  40. package/dist/components/agent-tools/terminal/terminal.class.js +4 -4
  41. package/dist/components/agent-tools/terminal/terminal.styles.js +0 -46
  42. package/dist/components/agent-tools/test-results/test-results.class.js +2 -2
  43. package/dist/components/agent-tools/test-results/test-results.styles.js +0 -5
  44. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +1 -1
  45. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +0 -41
  46. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js +0 -41
  47. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
  48. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js +0 -30
  49. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +6 -6
  50. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +0 -5
  51. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  52. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +0 -20
  53. package/dist/components/agent-tools/tool-result-view/tool-result-view.styles.js +0 -4
  54. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +0 -21
  55. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +2 -2
  56. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +7 -31
  57. package/dist/components/charts/chart/bar-chart.class.js +1 -1
  58. package/dist/components/charts/chart/box-plot.styles.js +0 -20
  59. package/dist/components/charts/chart/bubble-chart.class.js +1 -1
  60. package/dist/components/charts/chart/chart-colors.d.ts +1 -1
  61. package/dist/components/charts/chart/chart-colors.js +1 -1
  62. package/dist/components/charts/chart/chart-core-loader.d.ts +1 -0
  63. package/dist/components/charts/chart/chart-core-loader.js +1 -1
  64. package/dist/components/charts/chart/chart-feature-loader.d.ts +35 -0
  65. package/dist/components/charts/chart/chart-feature-loader.js +1 -1
  66. package/dist/components/charts/chart/chart.class.d.ts +93 -0
  67. package/dist/components/charts/chart/chart.class.js +3 -3
  68. package/dist/components/charts/chart/chart.styles.js +0 -27
  69. package/dist/components/charts/chart/doughnut-chart.class.js +1 -1
  70. package/dist/components/charts/chart/histogram.class.js +1 -1
  71. package/dist/components/charts/chart/line-chart.class.js +1 -1
  72. package/dist/components/charts/chart/lite-chart.class.d.ts +20 -1
  73. package/dist/components/charts/chart/lite-chart.class.js +4 -4
  74. package/dist/components/charts/chart/lite-chart.styles.js +0 -27
  75. package/dist/components/charts/chart/pie-chart.class.js +1 -1
  76. package/dist/components/charts/chart/polar-area-chart.class.js +1 -1
  77. package/dist/components/charts/chart/radar-chart.class.js +1 -1
  78. package/dist/components/charts/chart/scatter-chart.class.js +1 -1
  79. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +20 -0
  80. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +3 -1
  81. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +3 -0
  82. package/dist/components/conversation/audio-visualizer/audio-visualizer.styles.js +0 -7
  83. package/dist/components/conversation/branch-picker/branch-picker.styles.js +0 -3
  84. package/dist/components/conversation/chat-composer/chat-composer.styles.js +0 -51
  85. package/dist/components/conversation/chat-message/chat-message.class.js +2 -2
  86. package/dist/components/conversation/chat-message/chat-message.styles.js +13 -35
  87. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  88. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +0 -33
  89. package/dist/components/conversation/checkpoint/checkpoint.class.js +1 -1
  90. package/dist/components/conversation/checkpoint/checkpoint.styles.js +0 -3
  91. package/dist/components/conversation/code-block/code-block-shared.d.ts +5 -2
  92. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  93. package/dist/components/conversation/code-block/code-block.styles.js +4 -95
  94. package/dist/components/conversation/code-block/code-loader.d.ts +11 -0
  95. package/dist/components/conversation/code-block/code-loader.js +1 -1
  96. package/dist/components/conversation/code-block/shiki-types.d.ts +12 -0
  97. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  98. package/dist/components/conversation/conversation-item/conversation-item.styles.js +8 -54
  99. package/dist/components/conversation/generation-metrics/generation-metrics.class.js +2 -2
  100. package/dist/components/conversation/generation-metrics/generation-metrics.styles.js +0 -17
  101. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  102. package/dist/components/conversation/markdown/markdown.styles.js +0 -41
  103. package/dist/components/conversation/message-actions/message-actions.styles.js +0 -3
  104. package/dist/components/conversation/message-feedback/message-feedback.styles.js +0 -35
  105. package/dist/components/conversation/message-parts/message-parts.class.d.ts +1 -1
  106. package/dist/components/conversation/message-parts/message-parts.styles.js +0 -5
  107. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  108. package/dist/components/conversation/model-select/model-select.styles.js +12 -47
  109. package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +0 -6
  110. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -0
  111. package/dist/components/conversation/prompt-input/prompt-input.styles.js +0 -10
  112. package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +0 -8
  113. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  114. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +1 -11
  115. package/dist/components/conversation/stream-status/stream-status.styles.js +0 -16
  116. package/dist/components/conversation/streaming-text/streaming-text.styles.js +0 -15
  117. package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +0 -5
  118. package/dist/components/conversation/thread-list/thread-list.styles.js +5 -19
  119. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +16 -4
  120. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  121. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +0 -1
  122. package/dist/components/conversation/typing-indicator/typing-indicator.styles.js +0 -23
  123. package/dist/components/conversation/usage-badge/usage-badge.class.js +1 -1
  124. package/dist/components/conversation/usage-badge/usage-badge.styles.js +0 -3
  125. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -3
  126. package/dist/components/conversation/voice-picker/voice-picker.styles.js +9 -29
  127. package/dist/components/conversation/widget-renderer/resolve.d.ts +2 -0
  128. package/dist/components/conversation/widget-renderer/resolve.js +1 -1
  129. package/dist/components/data/calendar/calendar.class.d.ts +15 -2
  130. package/dist/components/data/calendar/calendar.class.js +2 -2
  131. package/dist/components/data/calendar/calendar.styles.js +2 -28
  132. package/dist/components/data/condition-builder/condition-builder.class.d.ts +10 -6
  133. package/dist/components/data/condition-builder/condition-builder.class.js +2 -2
  134. package/dist/components/data/condition-builder/condition-builder.styles.js +0 -6
  135. package/dist/components/data/context-meter/context-meter.styles.js +0 -24
  136. package/dist/components/data/data-grid/data-grid.class.js +3 -3
  137. package/dist/components/data/data-grid/data-grid.styles.js +0 -22
  138. package/dist/components/data/document-library/document-library.class.js +2 -2
  139. package/dist/components/data/document-library/document-library.styles.js +0 -4
  140. package/dist/components/data/env-list/env-list.class.js +1 -1
  141. package/dist/components/data/env-list/env-list.styles.js +7 -4
  142. package/dist/components/data/file-tree/file-tree.class.d.ts +12 -0
  143. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  144. package/dist/components/data/flow-canvas/flow-canvas.styles.js +12 -19
  145. package/dist/components/data/flow-controls/flow-controls.class.js +2 -2
  146. package/dist/components/data/flow-controls/flow-controls.styles.js +3 -36
  147. package/dist/components/data/flow-minimap/flow-minimap.class.js +1 -1
  148. package/dist/components/data/flow-minimap/flow-minimap.styles.js +0 -9
  149. package/dist/components/data/flow-node/flow-node.styles.js +0 -23
  150. package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
  151. package/dist/components/data/flow-run-status/flow-run-status.styles.js +0 -7
  152. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +0 -7
  153. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  154. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +0 -10
  155. package/dist/components/data/heatmap/heatmap-scale.d.ts +20 -0
  156. package/dist/components/data/heatmap/heatmap-scale.js +1 -1
  157. package/dist/components/data/heatmap/heatmap.class.d.ts +85 -2
  158. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  159. package/dist/components/data/heatmap/heatmap.styles.js +0 -54
  160. package/dist/components/data/pagination/pagination.class.js +1 -1
  161. package/dist/components/data/pagination/pagination.styles.js +23 -46
  162. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +34 -1
  163. package/dist/components/data/sequence-strip/sequence-strip.class.js +5 -2
  164. package/dist/components/data/sequence-strip/sequence-strip.styles.js +14 -20
  165. package/dist/components/data/sparkline/sparkline.class.js +1 -1
  166. package/dist/components/data/stat/stat.styles.js +0 -67
  167. package/dist/components/data/table/table.class.d.ts +42 -3
  168. package/dist/components/data/table/table.class.js +4 -4
  169. package/dist/components/data/table/table.styles.js +20 -91
  170. package/dist/components/data/timeline/timeline-item.styles.js +0 -30
  171. package/dist/components/data/timeline/timeline.class.d.ts +89 -1
  172. package/dist/components/data/timeline/timeline.class.js +2 -2
  173. package/dist/components/data/timeline/timeline.styles.js +111 -31
  174. package/dist/components/data/tree/tree-item.styles.js +1 -28
  175. package/dist/components/data/tree/tree.class.js +2 -2
  176. package/dist/components/data/tree/tree.styles.js +0 -6
  177. package/dist/components/data/word-cloud/word-cloud.styles.js +0 -5
  178. package/dist/components/forms/button/button.class.js +1 -1
  179. package/dist/components/forms/button/button.styles.js +1 -106
  180. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  181. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  182. package/dist/components/forms/checkbox/checkbox.styles.js +0 -39
  183. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +21 -2
  184. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  185. package/dist/components/forms/checkbox-group/checkbox-group.styles.js +0 -18
  186. package/dist/components/forms/code-editor/code-editor.styles.js +0 -30
  187. package/dist/components/forms/color-picker/color-picker.class.js +2 -2
  188. package/dist/components/forms/color-picker/color-picker.styles.js +0 -69
  189. package/dist/components/forms/combobox/combobox.class.js +2 -2
  190. package/dist/components/forms/combobox/combobox.styles.js +22 -111
  191. package/dist/components/forms/combobox/option.styles.js +7 -1
  192. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  193. package/dist/components/forms/date-picker/date-input.styles.js +12 -67
  194. package/dist/components/forms/date-picker/date-picker.class.d.ts +1 -0
  195. package/dist/components/forms/date-picker/date-picker.class.js +22 -20
  196. package/dist/components/forms/date-picker/date-picker.styles.js +36 -29
  197. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +6 -3
  198. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  199. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +8 -1
  200. package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
  201. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +3 -41
  202. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  203. package/dist/components/forms/icon-button/icon-button.styles.js +0 -16
  204. package/dist/components/forms/input/input.styles.js +0 -54
  205. package/dist/components/forms/input/number-input.styles.d.ts +4 -5
  206. package/dist/components/forms/input/number-input.styles.js +0 -11
  207. package/dist/components/forms/input/time-input-shared.d.ts +11 -0
  208. package/dist/components/forms/input/time-input-shared.js +1 -1
  209. package/dist/components/forms/input/time-input.class.d.ts +11 -2
  210. package/dist/components/forms/input/time-input.class.js +1 -1
  211. package/dist/components/forms/input/time-input.styles.js +0 -6
  212. package/dist/components/forms/locale-picker/locale-picker.class.js +2 -2
  213. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -26
  214. package/dist/components/forms/otp-input/otp-input.class.js +3 -3
  215. package/dist/components/forms/otp-input/otp-input.styles.js +0 -16
  216. package/dist/components/forms/phone-input/phone-input.class.d.ts +9 -1
  217. package/dist/components/forms/phone-input/phone-input.class.js +2 -2
  218. package/dist/components/forms/phone-input/phone-input.styles.js +0 -37
  219. package/dist/components/forms/radio/radio-button.styles.js +1 -30
  220. package/dist/components/forms/radio/radio-group.styles.js +0 -4
  221. package/dist/components/forms/radio/radio.styles.js +0 -44
  222. package/dist/components/forms/rubric-form/rubric-form.styles.js +0 -5
  223. package/dist/components/forms/select/select.class.js +1 -1
  224. package/dist/components/forms/select/select.styles.js +14 -114
  225. package/dist/components/forms/slider/slider.styles.js +0 -55
  226. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +0 -11
  227. package/dist/components/forms/swatch-picker/swatch-picker.class.js +2 -2
  228. package/dist/components/forms/swatch-picker/swatch-picker.styles.js +0 -77
  229. package/dist/components/forms/switch/switch.class.d.ts +3 -0
  230. package/dist/components/forms/switch/switch.class.js +1 -1
  231. package/dist/components/forms/switch/switch.styles.js +3 -38
  232. package/dist/components/forms/textarea/textarea.styles.js +0 -28
  233. package/dist/components/forms/time-range/time-range.styles.js +12 -84
  234. package/dist/components/forms/token-input/token-input.class.d.ts +23 -9
  235. package/dist/components/forms/token-input/token-input.class.js +1 -1
  236. package/dist/components/forms/token-input/token-input.styles.js +1 -54
  237. package/dist/components/layout/app-rail/app-rail-item.class.js +2 -2
  238. package/dist/components/layout/app-rail/app-rail-item.styles.js +0 -13
  239. package/dist/components/layout/app-rail/app-rail.class.d.ts +5 -0
  240. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  241. package/dist/components/layout/app-rail/app-rail.styles.js +0 -46
  242. package/dist/components/layout/button-group/button-group.styles.js +0 -6
  243. package/dist/components/layout/card/card.class.d.ts +12 -0
  244. package/dist/components/layout/card/card.styles.js +5 -13
  245. package/dist/components/layout/carousel/carousel.styles.js +0 -1
  246. package/dist/components/layout/command-palette/command-palette.class.d.ts +8 -0
  247. package/dist/components/layout/command-palette/command-palette.class.js +3 -1
  248. package/dist/components/layout/command-palette/command-palette.styles.js +1 -13
  249. package/dist/components/layout/control-group/control-group.styles.js +0 -7
  250. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  251. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +6 -25
  252. package/dist/components/layout/details/accordion.class.d.ts +13 -0
  253. package/dist/components/layout/details/accordion.class.js +1 -1
  254. package/dist/components/layout/details/details.class.js +1 -1
  255. package/dist/components/layout/details/details.styles.js +0 -12
  256. package/dist/components/layout/dock-panel/dock-panel.styles.js +0 -45
  257. package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts +2 -0
  258. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +2 -2
  259. package/dist/components/layout/drilldown-panel/drilldown-panel.styles.js +0 -4
  260. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  261. package/dist/components/layout/filter-bar/filter-bar.styles.js +0 -9
  262. package/dist/components/layout/menu/menu-item.class.d.ts +5 -0
  263. package/dist/components/layout/menu/menu-item.class.js +1 -1
  264. package/dist/components/layout/menu/menu-item.styles.js +0 -49
  265. package/dist/components/layout/menu/menu-label.styles.js +0 -2
  266. package/dist/components/layout/menu/menu.styles.js +0 -18
  267. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  268. package/dist/components/layout/multi-split/multi-split.styles.js +8 -51
  269. package/dist/components/layout/page/page.class.d.ts +4 -0
  270. package/dist/components/layout/page/page.class.js +1 -1
  271. package/dist/components/layout/reorder-list/reorder-item.styles.js +0 -4
  272. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +0 -27
  273. package/dist/components/layout/scroller/scroller.styles.js +0 -20
  274. package/dist/components/layout/segmented/segmented.class.d.ts +7 -1
  275. package/dist/components/layout/segmented/segmented.class.js +1 -1
  276. package/dist/components/layout/segmented/segmented.styles.js +69 -37
  277. package/dist/components/layout/split-panel/split-panel.styles.js +1 -7
  278. package/dist/components/layout/stepper/stepper.class.d.ts +8 -1
  279. package/dist/components/layout/stepper/stepper.class.js +1 -1
  280. package/dist/components/layout/stepper/stepper.styles.js +140 -41
  281. package/dist/components/layout/tab-group/tab-group.class.d.ts +4 -1
  282. package/dist/components/layout/tab-group/tab-group.styles.js +9 -75
  283. package/dist/components/layout/tab-group/tab.styles.js +0 -2
  284. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +4 -4
  285. package/dist/components/layout/virtual-list/virtual-list.class.js +1 -1
  286. package/dist/components/layout/virtual-list/virtual-list.styles.js +0 -68
  287. package/dist/components/layout/widget/widget.class.d.ts +5 -1
  288. package/dist/components/layout/widget/widget.class.js +1 -1
  289. package/dist/components/layout/widget/widget.styles.js +97 -40
  290. package/dist/components/media/animated-image/animated-image.class.d.ts +3 -0
  291. package/dist/components/media/animated-image/animated-image.class.js +1 -1
  292. package/dist/components/media/animated-image/animated-image.styles.js +0 -28
  293. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +1 -1
  294. package/dist/components/media/attachment-chip/attachment-chip.class.js +2 -2
  295. package/dist/components/media/attachment-chip/attachment-chip.styles.js +0 -31
  296. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +1 -1
  297. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +4 -4
  298. package/dist/components/media/attachment-trigger/attachment-trigger.styles.js +0 -40
  299. package/dist/components/media/av-player/av-player.class.d.ts +5 -6
  300. package/dist/components/media/av-player/av-player.class.js +1 -1
  301. package/dist/components/media/av-player/av-player.styles.js +0 -45
  302. package/dist/components/media/avatar/avatar.styles.js +3 -16
  303. package/dist/components/media/file-icon/file-icon.class.d.ts +1 -2
  304. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  305. package/dist/components/media/file-input/file-input.class.d.ts +12 -0
  306. package/dist/components/media/file-input/file-input.class.js +1 -1
  307. package/dist/components/media/file-input/file-input.styles.js +3 -24
  308. package/dist/components/media/flag/flag.class.d.ts +20 -0
  309. package/dist/components/media/flag/flag.class.js +4 -2
  310. package/dist/components/media/flag/flag.styles.js +7 -1
  311. package/dist/components/media/flag/language-map.d.ts +10 -0
  312. package/dist/components/media/flag/language-map.js +1 -1
  313. package/dist/components/media/image-comparer/image-comparer.styles.js +4 -33
  314. package/dist/components/media/image-viewer/image-viewer.class.js +0 -2
  315. package/dist/components/media/image-viewer/image-viewer.styles.js +7 -27
  316. package/dist/components/media/lightbox/lightbox.class.js +0 -2
  317. package/dist/components/media/lightbox/lightbox.styles.js +2 -21
  318. package/dist/components/media/map/map-loader.d.ts +19 -1
  319. package/dist/components/media/map/map-loader.js +1 -1
  320. package/dist/components/media/map/map.class.d.ts +141 -1
  321. package/dist/components/media/map/map.class.js +15 -3
  322. package/dist/components/media/map/map.styles.js +20 -17
  323. package/dist/components/media/media-card/media-card.class.d.ts +14 -3
  324. package/dist/components/media/media-card/media-card.class.js +1 -1
  325. package/dist/components/media/media-card/media-card.styles.js +2 -28
  326. package/dist/components/media/pan-zoom/pan-zoom.styles.js +0 -3
  327. package/dist/components/media/qr-code/qr-code.class.d.ts +3 -2
  328. package/dist/components/media/qr-code/qr-code.class.js +2 -2
  329. package/dist/components/media/qr-code/qr-code.styles.js +0 -3
  330. package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +2 -0
  331. package/dist/components/media/sequence-playback/sequence-playback.class.js +2 -1
  332. package/dist/components/media/sequence-playback/sequence-playback.styles.js +0 -19
  333. package/dist/components/media/video/video.class.d.ts +23 -2
  334. package/dist/components/media/video/video.class.js +3 -3
  335. package/dist/components/media/video/video.styles.js +4 -2
  336. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -2
  337. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
  338. package/dist/components/media/zoomable-frame/zoomable-frame.styles.js +0 -5
  339. package/dist/components/overlays/alert/alert.styles.js +4 -2
  340. package/dist/components/overlays/badge/badge.styles.js +4 -48
  341. package/dist/components/overlays/badge/tag.styles.js +0 -14
  342. package/dist/components/overlays/callout/callout.styles.js +2 -13
  343. package/dist/components/overlays/chip/chip-group.styles.js +0 -18
  344. package/dist/components/overlays/chip/chip.styles.js +6 -69
  345. package/dist/components/overlays/dialog/confirm.d.ts +1 -4
  346. package/dist/components/overlays/dialog/confirm.js +1 -1
  347. package/dist/components/overlays/dialog/dialog.class.d.ts +12 -9
  348. package/dist/components/overlays/dialog/dialog.class.js +1 -1
  349. package/dist/components/overlays/dialog/dialog.styles.js +0 -43
  350. package/dist/components/overlays/drawer/drawer.class.d.ts +2 -2
  351. package/dist/components/overlays/drawer/drawer.styles.js +0 -9
  352. package/dist/components/overlays/empty/empty.styles.js +0 -12
  353. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  354. package/dist/components/overlays/kbd/kbd.styles.js +0 -8
  355. package/dist/components/overlays/overlay/dropdown.class.d.ts +1 -6
  356. package/dist/components/overlays/overlay/dropdown.class.js +2 -2
  357. package/dist/components/overlays/overlay/overlay.styles.js +0 -28
  358. package/dist/components/overlays/overlay/popover.class.d.ts +9 -1
  359. package/dist/components/overlays/overlay/popover.class.js +2 -2
  360. package/dist/components/overlays/overlay/tooltip.class.d.ts +10 -0
  361. package/dist/components/overlays/overlay/tooltip.class.js +2 -2
  362. package/dist/components/overlays/popup/popup.class.d.ts +1 -0
  363. package/dist/components/overlays/popup/popup.class.js +2 -2
  364. package/dist/components/overlays/popup/popup.styles.js +0 -15
  365. package/dist/components/overlays/progress/progress-ring.class.d.ts +9 -1
  366. package/dist/components/overlays/progress/progress-ring.class.js +3 -3
  367. package/dist/components/overlays/progress/progress.styles.js +0 -21
  368. package/dist/components/overlays/rating/rating.styles.js +0 -25
  369. package/dist/components/overlays/skeleton/skeleton.styles.js +0 -4
  370. package/dist/components/overlays/spinner/spinner.styles.js +2 -5
  371. package/dist/components/overlays/toast/toast-item.styles.js +3 -45
  372. package/dist/components/retrieval/chunk-inspector/chunk-inspector.styles.js +0 -35
  373. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +2 -2
  374. package/dist/components/retrieval/citation-badge/citation-badge.class.js +3 -3
  375. package/dist/components/retrieval/citation-badge/citation-badge.styles.js +0 -20
  376. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +1 -1
  377. package/dist/components/retrieval/claim-evidence/claim-evidence.styles.js +0 -8
  378. package/dist/components/retrieval/community-card/community-card.class.d.ts +1 -0
  379. package/dist/components/retrieval/community-card/community-card.styles.js +0 -6
  380. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +8 -12
  381. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +4 -3
  382. package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
  383. package/dist/components/retrieval/entity-card/entity-card.styles.js +0 -12
  384. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +10 -4
  385. package/dist/components/retrieval/entity-chip/entity-chip.class.js +3 -3
  386. package/dist/components/retrieval/entity-chip/entity-chip.styles.js +6 -9
  387. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts +19 -5
  388. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +1 -1
  389. package/dist/components/retrieval/graph/graph.class.d.ts +5 -0
  390. package/dist/components/retrieval/graph/graph.class.js +1 -1
  391. package/dist/components/retrieval/graph/graph.styles.js +0 -30
  392. package/dist/components/retrieval/graph-legend/graph-legend.styles.js +0 -3
  393. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +2 -2
  394. package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +0 -25
  395. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +2 -0
  396. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +0 -7
  397. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +20 -6
  398. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +2 -2
  399. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +6 -11
  400. package/dist/components/retrieval/memory-panel/memory-panel.class.js +1 -1
  401. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +5 -3
  402. package/dist/components/retrieval/mind-map/mind-map.class.js +1 -1
  403. package/dist/components/retrieval/mind-map/mind-map.styles.js +0 -2
  404. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -2
  405. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
  406. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +0 -30
  407. package/dist/components/retrieval/node-palette/node-palette.styles.js +0 -11
  408. package/dist/components/retrieval/path-strip/path-strip.styles.js +0 -10
  409. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +12 -3
  410. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js +1 -1
  411. package/dist/components/retrieval/provenance-panel/provenance-panel.styles.js +0 -2
  412. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +3 -2
  413. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +2 -2
  414. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +0 -28
  415. package/dist/components/retrieval/retrieval-search/retrieval-search.styles.js +0 -4
  416. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  417. package/dist/components/retrieval/retrieval-trace/retrieval-trace.styles.js +0 -2
  418. package/dist/components/retrieval/source-card/source-card.styles.js +0 -13
  419. package/dist/components/retrieval/source-list/source-list.styles.js +0 -7
  420. package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
  421. package/dist/components/retrieval/source-picker/source-picker.styles.js +0 -7
  422. package/dist/components/utility/copy-button/copy-button.styles.js +0 -10
  423. package/dist/components/utility/diff-view/diff-view.styles.js +0 -14
  424. package/dist/components/utility/export-button/export-button.styles.js +0 -22
  425. package/dist/components/utility/icon/icon.styles.js +0 -6
  426. package/dist/components/utility/json-viewer/json-viewer.styles.js +2 -48
  427. package/dist/components/utility/known-date/known-date.class.d.ts +7 -3
  428. package/dist/components/utility/known-date/known-date.styles.js +10 -51
  429. package/dist/components/utility/live-region/live-region.styles.js +0 -4
  430. package/dist/components/utility/mention-popover/mention-popover.styles.js +0 -25
  431. package/dist/components/utility/poll-status/poll-status.styles.js +0 -4
  432. package/dist/components/utility/random-content/random-content.class.d.ts +22 -0
  433. package/dist/components/utility/random-content/random-content.class.js +3 -2
  434. package/dist/components/utility/random-content/random-content.styles.js +6 -13
  435. package/dist/components/utility/tour/tour.class.d.ts +4 -2
  436. package/dist/components/utility/tour/tour.class.js +3 -3
  437. package/dist/components/utility/tour/tour.styles.js +0 -13
  438. package/dist/components/utility/visually-hidden/visually-hidden.styles.js +0 -5
  439. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
  440. package/dist/components/viewers/archive-viewer/archive-viewer.styles.d.ts +2 -2
  441. package/dist/components/viewers/archive-viewer/archive-viewer.styles.js +0 -10
  442. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +1 -1
  443. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +1 -1
  444. package/dist/components/viewers/csv-viewer/csv-viewer.styles.js +0 -19
  445. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +1 -1
  446. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +0 -15
  447. package/dist/components/viewers/document-compare/document-compare.class.js +1 -1
  448. package/dist/components/viewers/document-compare/document-compare.styles.js +0 -3
  449. package/dist/components/viewers/document-preview/document-preview.styles.js +0 -25
  450. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +2 -1
  451. package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -1
  452. package/dist/components/viewers/document-viewer/document-viewer.styles.js +0 -5
  453. package/dist/components/viewers/docx-viewer/docx-viewer.styles.js +0 -17
  454. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  455. package/dist/components/viewers/ebook-viewer/ebook-viewer.styles.js +0 -4
  456. package/dist/components/viewers/email-viewer/email-viewer.styles.js +0 -7
  457. package/dist/components/viewers/geojson-view/geojson-view.styles.js +0 -5
  458. package/dist/components/viewers/highlight-layer/highlight-layer.styles.js +0 -3
  459. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  460. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +0 -38
  461. package/dist/components/viewers/page-rail/page-rail.class.js +1 -1
  462. package/dist/components/viewers/page-rail/page-rail.styles.js +0 -13
  463. package/dist/components/viewers/pdf-viewer/pdf-loader.d.ts +13 -2
  464. package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
  465. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +32 -2
  466. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +4 -4
  467. package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.js +1 -27
  468. package/dist/components/viewers/pptx-viewer/pptx-viewer.styles.js +0 -3
  469. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +1 -1
  470. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.js +0 -14
  471. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +0 -7
  472. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +2 -24
  473. package/dist/custom-elements-jsx.d.ts +56 -37
  474. package/dist/events.d.ts +43 -33
  475. package/dist/internal/agent-status-variants.d.ts +18 -0
  476. package/dist/internal/agent-status-variants.js +1 -0
  477. package/dist/internal/announcer.d.ts +8 -3
  478. package/dist/internal/announcer.js +1 -1
  479. package/dist/internal/autoloader-manifest.js +1 -1
  480. package/dist/internal/canvas-color.d.ts +16 -0
  481. package/dist/internal/canvas-color.js +1 -1
  482. package/dist/internal/catalog-picker.d.ts +0 -1
  483. package/dist/internal/catalog-picker.js +1 -1
  484. package/dist/internal/default-strings.generated.d.ts +1 -0
  485. package/dist/internal/default-strings.generated.js +1 -1
  486. package/dist/internal/dev-mode-attribute-warning.d.ts +30 -0
  487. package/dist/internal/dev-mode-attribute-warning.js +1 -0
  488. package/dist/internal/localization-runtime.js +1 -1
  489. package/dist/internal/localization-types.d.ts +1 -1
  490. package/dist/internal/localization.js +1 -1
  491. package/dist/internal/lyra-element.d.ts +13 -0
  492. package/dist/internal/lyra-element.js +1 -1
  493. package/dist/internal/media-controller.js +1 -1
  494. package/dist/internal/package-metadata.d.ts +1 -1
  495. package/dist/internal/package-metadata.js +1 -1
  496. package/dist/internal/scroll-overflow.d.ts +35 -13
  497. package/dist/internal/scroll-overflow.js +1 -1
  498. package/dist/internal/sizes.styles.js +0 -2
  499. package/dist/internal/specialist-tokens.styles.js +6 -11
  500. package/dist/internal/text-highlights.d.ts +4 -1
  501. package/dist/internal/text-highlights.js +1 -1
  502. package/dist/internal/tokens/palette.styles.js +0 -15
  503. package/dist/internal/tokens.styles.js +19 -113
  504. package/dist/lyra.d.ts +8 -5
  505. package/dist/styles/reservations.css +82 -0
  506. package/dist/svelte.d.ts +56 -37
  507. package/dist/translations/ar.js +1 -1
  508. package/dist/translations/de.js +1 -1
  509. package/dist/translations/es.js +1 -1
  510. package/dist/translations/fa.js +1 -1
  511. package/dist/translations/fr.js +1 -1
  512. package/dist/translations/he.js +1 -1
  513. package/dist/translations/ja.js +1 -1
  514. package/dist/translations/pt-BR.js +1 -1
  515. package/dist/translations/ru.js +1 -1
  516. package/dist/translations/zh-CN.js +1 -1
  517. package/dist/vue.d.ts +56 -37
  518. package/llms/components/lr-accordion-item.md +12 -3
  519. package/llms/components/lr-accordion.md +11 -2
  520. package/llms/components/lr-agent-eval-dashboard.md +1 -1
  521. package/llms/components/lr-agent-trace.md +3 -1
  522. package/llms/components/lr-agent-workspace.md +20 -0
  523. package/llms/components/lr-artifact-panel.md +10 -4
  524. package/llms/components/lr-attachment-chip.md +7 -4
  525. package/llms/components/lr-attachment-trigger.md +9 -6
  526. package/llms/components/lr-av-player.md +3 -1
  527. package/llms/components/lr-avatar.md +6 -6
  528. package/llms/components/lr-bar-chart.md +4 -3
  529. package/llms/components/lr-box-plot.md +1 -1
  530. package/llms/components/lr-browser-frame.md +7 -3
  531. package/llms/components/lr-bubble-chart.md +4 -3
  532. package/llms/components/lr-calendar.md +9 -2
  533. package/llms/components/lr-card.md +24 -0
  534. package/llms/components/lr-chart.md +32 -8
  535. package/llms/components/lr-chat-viewport.md +7 -2
  536. package/llms/components/lr-checkbox-group.md +13 -5
  537. package/llms/components/lr-checkbox.md +5 -2
  538. package/llms/components/lr-checkpoint.md +6 -2
  539. package/llms/components/lr-combobox.md +5 -2
  540. package/llms/components/lr-command-palette.md +4 -1
  541. package/llms/components/lr-confirm-bar.md +7 -3
  542. package/llms/components/lr-context-meter.md +12 -11
  543. package/llms/components/lr-conversation-item.md +7 -4
  544. package/llms/components/lr-details.md +11 -2
  545. package/llms/components/lr-dialog.md +15 -10
  546. package/llms/components/lr-dock-panel.md +7 -10
  547. package/llms/components/lr-document-preview.md +6 -1
  548. package/llms/components/lr-document-viewer.md +3 -2
  549. package/llms/components/lr-doughnut-chart.md +4 -3
  550. package/llms/components/lr-drawer.md +3 -3
  551. package/llms/components/lr-entity-card.md +3 -3
  552. package/llms/components/lr-entity-chip.md +1 -1
  553. package/llms/components/lr-entity-dossier.md +4 -1
  554. package/llms/components/lr-file-input.md +2 -2
  555. package/llms/components/lr-flag.md +20 -5
  556. package/llms/components/lr-heatmap.md +29 -1
  557. package/llms/components/lr-histogram.md +3 -1
  558. package/llms/components/lr-icon.md +1 -1
  559. package/llms/components/lr-json-schema-viewer.md +2 -1
  560. package/llms/components/lr-knowledge-graph-explorer.md +8 -3
  561. package/llms/components/lr-known-date.md +4 -2
  562. package/llms/components/lr-line-chart.md +4 -3
  563. package/llms/components/lr-lite-chart.md +16 -6
  564. package/llms/components/lr-map.md +72 -8
  565. package/llms/components/lr-markdown-core.md +3 -2
  566. package/llms/components/lr-media-card.md +28 -12
  567. package/llms/components/lr-message-parts.md +2 -1
  568. package/llms/components/lr-model-select.md +9 -10
  569. package/llms/components/lr-model-settings-panel.md +9 -9
  570. package/llms/components/lr-neighbor-list.md +1 -1
  571. package/llms/components/lr-notebook-viewer.md +6 -3
  572. package/llms/components/lr-option.md +5 -2
  573. package/llms/components/lr-pdf-viewer.md +62 -2
  574. package/llms/components/lr-pie-chart.md +4 -3
  575. package/llms/components/lr-polar-area-chart.md +4 -3
  576. package/llms/components/lr-popover.md +5 -0
  577. package/llms/components/lr-progress-ring.md +8 -1
  578. package/llms/components/lr-prompt-studio.md +1 -1
  579. package/llms/components/lr-provenance-panel.md +4 -2
  580. package/llms/components/lr-qr-code.md +1 -1
  581. package/llms/components/lr-radar-chart.md +4 -3
  582. package/llms/components/lr-rag-eval-dashboard.md +2 -2
  583. package/llms/components/lr-random-content.md +13 -0
  584. package/llms/components/lr-reorder-item.md +6 -1
  585. package/llms/components/lr-reorder-list.md +6 -1
  586. package/llms/components/lr-responsive-panel.md +11 -7
  587. package/llms/components/lr-scatter-chart.md +4 -3
  588. package/llms/components/lr-sequence-strip.md +16 -2
  589. package/llms/components/lr-slider.md +12 -5
  590. package/llms/components/lr-sparkline.md +1 -1
  591. package/llms/components/lr-suggestion-chips.md +7 -2
  592. package/llms/components/lr-swatch-picker.md +5 -5
  593. package/llms/components/lr-switch.md +5 -2
  594. package/llms/components/lr-table.md +30 -4
  595. package/llms/components/lr-terminal.md +3 -1
  596. package/llms/components/lr-thread-list.md +8 -8
  597. package/llms/components/lr-time-input.md +6 -1
  598. package/llms/components/lr-timeline-item.md +24 -0
  599. package/llms/components/lr-timeline.md +25 -1
  600. package/llms/components/lr-token-input.md +7 -2
  601. package/llms/components/lr-tool-approval-dialog.md +7 -8
  602. package/llms/components/lr-tool-call-chip.md +5 -1
  603. package/llms/components/lr-tool-param-form.md +14 -12
  604. package/llms/components/lr-tool-result-dialog.md +11 -9
  605. package/llms/components/lr-tool-result-view.md +7 -6
  606. package/llms/components/lr-tool-select-dialog.md +18 -16
  607. package/llms/components/lr-trace-tree.md +3 -1
  608. package/llms/components/lr-usage-badge.md +4 -1
  609. package/llms/components/lr-video-playlist.md +1 -1
  610. package/llms/components/lr-virtual-list.md +22 -14
  611. package/llms/components/lr-voice-picker.md +8 -5
  612. package/llms/components/lr-widget-renderer.md +3 -3
  613. package/llms/components/lr-widget.md +1 -1
  614. package/llms/components/lr-word-cloud.md +6 -2
  615. package/llms/index.md +1 -1
  616. package/llms/peers.md +13 -3
  617. package/llms/shared.md +83 -2
  618. package/llms-full.txt +1159 -288
  619. package/package.json +19 -7
  620. package/vscode-css-data.json +37 -2
  621. package/vscode-html-data.json +402 -45
  622. package/web-types.json +300 -56
@@ -73,6 +73,8 @@ import{css}from"lit";const styles=css`
73
73
  inset-block-start: 0;
74
74
  inset-inline-start: 0;
75
75
  will-change: transform;
76
+ min-inline-size: var(--lr-size-1-5rem);
77
+ min-block-size: var(--lr-size-1-5rem);
76
78
  }
77
79
  [part='node-control'] {
78
80
  min-inline-size: var(--lr-icon-button-size);
@@ -207,10 +209,6 @@ import{css}from"lit";const styles=css`
207
209
  :host([orientation='horizontal']:dir(rtl)) [part='node'] ::slotted(*) {
208
210
  transform: scaleX(-1);
209
211
  }
210
- /* MUST stay before :hover/:active below: all three resolve to the same specificity (0,2,0),
211
- so whichever is declared last always wins regardless of which states are actually active on
212
- the element. Declaring the static selected ring first lets the pointer-feedback rules below
213
- still read on top of it when a selected node is hovered or press-dragged. */
214
212
  [part='node'][data-selected] {
215
213
  outline: var(--lr-size-2px) solid
216
214
  var(--lr-flow-canvas-node-selected-outline-color, var(--lr-color-brand));
@@ -222,23 +220,20 @@ import{css}from"lit";const styles=css`
222
220
  var(--lr-flow-canvas-node-hover-outline-color, var(--lr-color-border-strong));
223
221
  outline-offset: var(--lr-size-2px);
224
222
  }
225
- /* A node is pressed for two different gestures -- a click that selects it and a pointerdown that
226
- starts a drag -- and both need to read immediately. The pointer-feedback colour is shared with
227
- the hover rule above (one knob for "the pointer is on this node"); only the weight steps up, so
228
- the pressed ring is unmistakably heavier than the hovered one without introducing a second
229
- colour that would then have to stay in sync with it. */
230
223
  [part='node']:active {
231
224
  outline: var(--lr-size-2px) solid
232
225
  var(--lr-flow-canvas-node-hover-outline-color, var(--lr-color-border-strong));
233
226
  outline-offset: var(--lr-size-2px);
234
227
  }
235
- [part='edge']:hover {
228
+ [part='edge'][aria-pressed='true'] {
229
+ stroke-width: 2.5;
230
+ }
231
+ [part='edge']:hover,
232
+ [part='edge-hit-area']:hover + [part='edge'] {
236
233
  stroke-width: 2.5;
237
234
  }
238
- /* Stroke weight is the only channel an edge has: its stroke colour is the tone the consumer
239
- assigned it (see the [data-tone] rules above), so tinting it on press would read as a tone
240
- change rather than as feedback. 3.5 also clears the 2.5 an already-selected edge carries. */
241
- [part='edge']:active {
235
+ [part='edge']:active,
236
+ [part='edge-hit-area']:active + [part='edge'] {
242
237
  stroke-width: 3.5;
243
238
  }
244
239
  [part='node']:has([part='node-control']:focus-visible),
@@ -246,9 +241,6 @@ import{css}from"lit";const styles=css`
246
241
  outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);
247
242
  outline-offset: var(--lr-focus-ring-offset);
248
243
  }
249
- [part='edge'][aria-pressed='true'] {
250
- stroke-width: 2.5;
251
- }
252
244
  [part='connection-line'] {
253
245
  fill: none;
254
246
  stroke: var(--lr-color-brand);
@@ -268,6 +260,9 @@ import{css}from"lit";const styles=css`
268
260
  outline: var(--lr-size-2px) dashed var(--lr-flow-canvas-drop-active-outline-color, var(--lr-color-brand));
269
261
  outline-offset: calc(-1 * var(--lr-size-2px));
270
262
  }
263
+ [part='viewport'][data-drop-active]:focus-visible {
264
+ box-shadow: inset 0 0 0 var(--lr-focus-ring-width) var(--lr-focus-ring-color);
265
+ }
271
266
  [part='edge'][data-running] {
272
267
  stroke-dasharray: 6 4;
273
268
  animation: lr-flow-canvas-march var(--lr-flow-canvas-march-duration, var(--lr-duration-ambient)) linear infinite;
@@ -275,8 +270,6 @@ import{css}from"lit";const styles=css`
275
270
  [part='edge'][data-running-static] {
276
271
  stroke-dasharray: 6 4;
277
272
  }
278
- /* The JS gate only evaluates the preference at render time; this CSS branch also covers a
279
- preference change while an already-rendered edge is still marching. */
280
273
  @media (prefers-reduced-motion: reduce) {
281
274
  [part='edge'][data-running] {
282
275
  animation: none;
@@ -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}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-controls.styles.js";import{LYRA_DEFAULT_flowControlsLabel,LYRA_DEFAULT_flowLockCanvas,LYRA_DEFAULT_zoomIn,LYRA_DEFAULT_zoomOut,LYRA_DEFAULT_zoomToFit}from"../../../internal/default-strings.generated.js";function isFlowCanvasLike(element){const candidate=element;return typeof candidate.registerCompanion=="function"&&typeof candidate.zoomIn=="function"&&typeof candidate.zoomOut=="function"&&typeof candidate.fit=="function"&&typeof candidate.locked=="boolean"}const GLYPH_VIEW_BOX="0 0 24 24",GLYPH_STROKE_WIDTH="1.75";function glyphSvg(inner){return svg`<svg
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}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-controls.styles.js";import{LYRA_DEFAULT_flowControlsLabel,LYRA_DEFAULT_flowLockCanvas,LYRA_DEFAULT_zoomIn,LYRA_DEFAULT_zoomOut,LYRA_DEFAULT_zoomToFit}from"../../../internal/default-strings.generated.js";function isFlowCanvasLike(element){const candidate=element;return typeof candidate.registerCompanion=="function"&&typeof candidate.zoomIn=="function"&&typeof candidate.zoomOut=="function"&&typeof candidate.fit=="function"&&typeof candidate.locked=="boolean"}const GLYPH_VIEW_BOX="0 0 24 24",GLYPH_STROKE_WIDTH="1.75";function glyphSvg(inner){return svg`<svg
2
2
  width="1em"
3
3
  height="1em"
4
4
  viewBox=${GLYPH_VIEW_BOX}
@@ -17,7 +17,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
17
17
  `),lockClosedGlyph=()=>glyphSvg(svg`<rect x="4" y="11" width="16" height="9" rx="2"></rect><path d="M8 11V7a4 4 0 0 1 8 0v4"></path>`),lockOpenGlyph=()=>glyphSvg(svg`<rect x="4" y="11" width="16" height="9" rx="2"></rect><path d="M8 11V7a4 4 0 0 1 7.4-2"></path>`);class LyraFlowControls extends LyraElement{constructor(){super(...arguments),this.for="",this._orientation="vertical",this.hideLock=!1,this.frame="card",this.snapshot=null,this.locked=!1,this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.toggleLock=()=>{if(!this.canvasEl)return;const locked=!this.canvasEl.locked;this.canvasEl.locked=locked,this.locked=locked}}static{this.defaultStrings={...super.defaultStrings,flowControlsLabel:LYRA_DEFAULT_flowControlsLabel,flowLockCanvas:LYRA_DEFAULT_flowLockCanvas,zoomIn:LYRA_DEFAULT_zoomIn,zoomOut:LYRA_DEFAULT_zoomOut,zoomToFit:LYRA_DEFAULT_zoomToFit}}static{this.styles=[LyraElement.styles,styles]}get orientation(){return this._orientation}set orientation(value){const previous=this._orientation,next=value==="horizontal"?"horizontal":"vertical";this._orientation=next,(next!==previous||value!==next)&&this.requestUpdate("orientation",previous)}connectedCallback(){super.connectedCallback(),this.companionController.connect()}disconnectedCallback(){super.disconnectedCallback(),this.companionController.disconnect()}adoptedCallback(){super.adoptedCallback(),this.companionController.adopt()}willUpdate(changed){super.willUpdate(changed),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged()}attachCanvas(canvas){this.unsubscribe?.(),this.unsubscribe=void 0,this.snapshot=null,this.locked=!1,this.canvasEl=canvas??void 0,canvas&&(this.locked=canvas.locked,this.unsubscribe=canvas.registerCompanion(snapshot=>{!this.isConnected||this.canvasEl!==canvas||(this.snapshot=snapshot,this.locked=snapshot.locked)}))}render(){const disabled=!this.canvasEl,viewport=this.snapshot?.viewport,atMin=viewport?viewport.zoom<=viewport.minZoom:!1,atMax=viewport?viewport.zoom>=viewport.maxZoom:!1;return html`<div
18
18
  part="base"
19
19
  role="group"
20
- aria-label=${this.getAttribute("aria-label")||this.localize("flowControlsLabel")}
20
+ aria-label=${hostAriaLabel(this)??this.localize("flowControlsLabel")}
21
21
  >
22
22
  <button
23
23
  part="zoom-in"
@@ -16,26 +16,12 @@ import{css}from"lit";const styles=css`
16
16
  border: var(--lr-border-width-thin) solid var(--lr-color-border);
17
17
  border-radius: var(--lr-radius);
18
18
  background: var(--lr-color-surface);
19
- /* Overlay step: this cluster's job is to float over a flow canvas as a toolbar, which is why the
20
- plain escape below strips the whole surface treatment when it is embedded in real chrome. */
21
19
  box-shadow: var(--lr-shadow-m);
22
20
  }
23
21
  :host([orientation='vertical']) [part='base'] {
24
22
  flex-direction: column;
25
23
  flex-wrap: nowrap;
26
24
  }
27
- /* Chrome-less escape, mirroring the shared LyraFrame vocabulary's frame="plain" (and lr-callout's [inline]): the
28
- cluster is often placed directly inside a host toolbar or panel that already draws its own
29
- border/background, where this floating-surface chrome doubles the frame. The box-shadow goes
30
- with the rest of the box decoration, exactly as lr-flow-run-status's plain does -- a lift
31
- shadow with no surface under it reads as a stray smudge. Only the decoration goes: the flex
32
- layout, the gap, every button's --lr-icon-button-size hit-area floor, and their hover/focus
33
- affordances all stay.
34
-
35
- MUST stay after :host([orientation='vertical']) [part='base']: both are :host([x])
36
- [part='base'], i.e. equal specificity, so source order alone decides. Only flex-direction vs.
37
- box decoration is set today, so nothing collides -- keeping this last preserves plain as the
38
- stronger statement ("no chrome at all") if either rule grows. */
39
25
  :host([frame='plain']) [part='base'] {
40
26
  padding: 0;
41
27
  border: 0;
@@ -43,11 +29,6 @@ import{css}from"lit";const styles=css`
43
29
  background: transparent;
44
30
  box-shadow: none;
45
31
  }
46
- /* Enumerated by part (rather than the previous bare "[part='base'] button"
47
- tag selector) so each control resolves to the shared minimum tappable
48
- size (--lr-icon-button-size) directly off its own [part='...'] --
49
- the floating toolbar already has the room, this doesn't change the
50
- rendered box, just how it's declared. */
51
32
  [part='zoom-in'],
52
33
  [part='zoom-out'],
53
34
  [part='fit'],
@@ -64,18 +45,9 @@ import{css}from"lit";const styles=css`
64
45
  color: var(--lr-color-text);
65
46
  cursor: pointer;
66
47
  }
67
- /* :where() zeroes the wrapped selectors' specificity contribution, leaving only :hover itself
68
- -- (0,1,0) total, functionally identical selection to \`[part='base'] button:hover:not(:disabled)\`
69
- ((0,3,1)) but now losing (on the pseudo-element tiebreak) to a consumer's own
70
- \`::part(zoom-in):hover\` override ((0,1,1)) without that consumer needing !important. Mirrors
71
- lr-attachment-trigger's identical fix for the same over-specific shape. */
72
48
  :where([part='base'] button):hover:where(:not(:disabled)) {
73
49
  background: var(--lr-color-surface-hover, var(--lr-color-border));
74
50
  }
75
- /* Same shape as the hover rule, so it inherits the same (0,1,0) specificity and a consumer's
76
- ::part(zoom-in):active override still wins. The fill is the hovered one carried further toward
77
- --lr-color-mix-partner (the text colour), which moves in whichever direction the surface needs
78
- rather than always lightening. */
79
51
  :where([part='base'] button):active:where(:not(:disabled)) {
80
52
  background: color-mix(
81
53
  in oklab,
@@ -94,14 +66,6 @@ import{css}from"lit";const styles=css`
94
66
  [part='lock'][aria-pressed='true'] {
95
67
  color: var(--lr-flow-controls-lock-active-color, var(--lr-color-brand));
96
68
  }
97
- /* The default slot's own contract: a consumer's button joins the cluster and is "styled by the
98
- same group". None of the rules above can deliver that -- every one of them is either a
99
- [part='...'] selector (a light-DOM button carries no part attribute) or a descendant selector
100
- inside a shadow stylesheet, and per CSS Scoping neither form ever matches slotted content
101
- wherever it visually renders. ::slotted() is the only selector that crosses that boundary, and
102
- it takes a COMPOUND argument, so each state goes inside the parentheses rather than after
103
- them. It matches only the slotted element itself, never its descendants, which is exactly the
104
- scope wanted here: the button's box, not the consumer's own icon markup inside it. */
105
69
  ::slotted(button) {
106
70
  display: inline-flex;
107
71
  align-items: center;
@@ -119,6 +83,9 @@ import{css}from"lit";const styles=css`
119
83
  overflow-wrap: anywhere;
120
84
  cursor: pointer;
121
85
  }
86
+ ::slotted([hidden]:not([hidden='until-found' i])) {
87
+ display: none;
88
+ }
122
89
  ::slotted(button:hover:not(:disabled)) {
123
90
  background: var(--lr-color-surface-hover, var(--lr-color-border));
124
91
  }
@@ -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,svg,nothing}from"lit";import{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{resolveCssLength}from"../../../internal/css-length.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-minimap.styles.js";import{LYRA_DEFAULT_flowMinimapInstructions,LYRA_DEFAULT_flowMinimapLabel,LYRA_DEFAULT_flowMinimapViewport,LYRA_DEFAULT_flowMinimapViewportChanged}from"../../../internal/default-strings.generated.js";function isFlowCanvasLike(element){const candidate=element;return typeof candidate.registerCompanion=="function"&&typeof candidate.setViewport=="function"&&typeof candidate.zoomIn=="function"&&typeof candidate.zoomOut=="function"&&typeof candidate.fit=="function"&&typeof candidate.locked=="boolean"}const DEFAULT_VIEWPORT_MIN_SIZE_PX=40;class LyraFlowMinimap extends LyraElement{constructor(){super(...arguments),this.for="",this.label="",this.snapshot=null,this.liveText="",this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.viewportMinSizePx=DEFAULT_VIEWPORT_MIN_SIZE_PX,this.baseBorderPx=0,this.instructionsId=nextId("flow-minimap-instructions"),this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.onMapClick=e=>{if(this.justDraggedViewport){this.justDraggedViewport=!1;return}if(!this.canvasEl||!this.snapshot||this.canvasEl.locked)return;const point=this.clientToContentPoint(e.currentTarget,e.clientX,e.clientY),{zoom,width,height}=this.snapshot.viewport;this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:width/2-point.x*zoom,y:height/2-point.y*zoom,zoom})},this.onMapWheel=e=>{!this.canvasEl||this.canvasEl.locked||(e.preventDefault(),this.announceNextSnapshot=!0,e.deltaY<0?this.canvasEl.zoomIn():this.canvasEl.zoomOut())},this.onViewportPointerDown=e=>{const dragEventWindow=this.ownerDocument.defaultView;!this.canvasEl||!this.snapshot||!dragEventWindow||this.canvasEl.locked||(e.stopPropagation(),this.detachViewportDragListeners(),this.justDraggedViewport=!1,this.dragState={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startViewport:{...this.snapshot.viewport},moved:!1},e.target.setPointerCapture?.(e.pointerId),this.dragEventWindow=dragEventWindow,dragEventWindow.addEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.addEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.addEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.addEventListener("lostpointercapture",this.onViewportPointerUp))},this.onViewportPointerMove=e=>{const drag=this.dragState;if(!drag||e.pointerId!==drag.pointerId)return;if(!this.canvasEl||this.canvasEl.locked){this.cancelViewportDrag();return}const ctm=this.renderRoot.querySelector('[part="map"]')?.getScreenCTM();if(!ctm)return;const scale=ctm.a||1,dxContent=(e.clientX-drag.startClientX)/scale,dyContent=(e.clientY-drag.startClientY)/scale;dxContent===0&&dyContent===0||(drag.moved=!0,drag.latestViewport={x:drag.startViewport.x-dxContent*drag.startViewport.zoom,y:drag.startViewport.y-dyContent*drag.startViewport.zoom,zoom:drag.startViewport.zoom},this.canvasEl.setViewport(drag.latestViewport))},this.onViewportPointerUp=e=>{const drag=this.dragState;!drag||e.pointerId!==drag.pointerId||(this.justDraggedViewport=e.type==="pointerup"&&drag.moved,this.justDraggedViewport&&drag.latestViewport&&!this.canvasEl?.locked&&this.announceViewport(drag.latestViewport),this.dragState=void 0,this.detachViewportDragListeners())},this.onViewportKeyDown=e=>{if(!this.canvasEl||!this.snapshot||this.canvasEl.locked)return;if(e.key==="+"||e.key==="="){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.zoomIn();return}if(e.key==="-"||e.key==="_"){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.zoomOut();return}if(e.key==="Enter"||e.key==="Home"){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.fit();return}const{x,y,zoom,width,height}=this.snapshot.viewport,stepX=width*.1,stepY=height*.1;e.key==="ArrowRight"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:x-stepX,y,zoom})):e.key==="ArrowLeft"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:x+stepX,y,zoom})):e.key==="ArrowDown"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x,y:y-stepY,zoom})):e.key==="ArrowUp"&&(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x,y:y+stepY,zoom}))}}static{this.defaultStrings={...super.defaultStrings,flowMinimapInstructions:LYRA_DEFAULT_flowMinimapInstructions,flowMinimapLabel:LYRA_DEFAULT_flowMinimapLabel,flowMinimapViewport:LYRA_DEFAULT_flowMinimapViewport,flowMinimapViewportChanged:LYRA_DEFAULT_flowMinimapViewportChanged}}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink(),this.companionController.connect()}refreshViewportMetrics(){const view=this.ownerDocument?.defaultView;if(!view||!this.isConnected)return;const computed=view.getComputedStyle(this),minSize=resolveCssLength(computed.getPropertyValue("--lr-flow-minimap-viewport-min-size").trim()||computed.getPropertyValue("--lr-icon-button-size").trim(),{host:this});this.viewportMinSizePx=minSize!==void 0&&Number.isFinite(minSize)&&minSize>=0?minSize:DEFAULT_VIEWPORT_MIN_SIZE_PX;const border=resolveCssLength(computed.getPropertyValue("--lr-border-width-thin").trim(),{host:this});this.baseBorderPx=border!==void 0&&Number.isFinite(border)&&border>=0?border:0}disconnectedCallback(){super.disconnectedCallback(),this.releaseAnnouncementSink(),this.announceNextSnapshot=!1,this.liveText="",this.companionController.disconnect()}adoptedCallback(){super.adoptedCallback(),this.syncAnnouncementSink(),this.companionController.adopt()}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}announceViewport(viewport){const number=getNumberFormat(this.effectiveLocale,{maximumFractionDigits:0}),percent=getNumberFormat(this.effectiveLocale,{style:"percent",maximumFractionDigits:1}),text=this.localize("flowMinimapViewportChanged",void 0,{x:number.format(viewport.x),y:number.format(viewport.y),zoom:percent.format(viewport.zoom)});this.liveText=text,this.announcementSink?.announce(text)}willUpdate(changed){super.willUpdate(changed),this.refreshViewportMetrics(),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged()}attachCanvas(canvas){this.cancelViewportDrag(),this.unsubscribe?.(),this.unsubscribe=void 0,this.snapshot=null,this.canvasEl=canvas??void 0,canvas&&(this.unsubscribe=canvas.registerCompanion(snapshot=>{!this.isConnected||this.canvasEl!==canvas||(this.snapshot=snapshot,snapshot.locked&&this.cancelViewportDrag(),this.announceNextSnapshot&&(this.announceNextSnapshot=!1,this.announceViewport(snapshot.viewport)))}))}cancelViewportDrag(){this.dragState=void 0,this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.detachViewportDragListeners()}contentBounds(){const nodes=this.snapshot?.nodes??[];if(nodes.length===0)return{minX:0,minY:0,maxX:1,maxY:1};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const n of nodes)minX=Math.min(minX,n.x),minY=Math.min(minY,n.y),maxX=Math.max(maxX,n.x+n.width),maxY=Math.max(maxY,n.y+n.height);return{minX,minY,maxX,maxY}}mapSizePx(){const inset=2*this.baseBorderPx;return{width:Math.max(0,this.clientWidth-inset),height:Math.max(0,this.clientHeight-inset)}}viewportRectContent(viewBoxWidth,viewBoxHeight,minimumPhysicalSize=this.viewportMinSizePx){const vp=this.snapshot?.viewport;if(!vp||vp.zoom===0)return{x:0,y:0,width:0,height:0};const x=-vp.x/vp.zoom,y=-vp.y/vp.zoom,width=vp.width/vp.zoom,height=vp.height/vp.zoom,map=this.mapSizePx(),scale=map.width>0&&map.height>0&&viewBoxWidth>0&&viewBoxHeight>0?Math.min(map.width/viewBoxWidth,map.height/viewBoxHeight):0,floor=scale>0?minimumPhysicalSize/scale:0;if(!Number.isFinite(floor)||floor<=0)return{x,y,width,height};const flooredWidth=Math.max(width,floor),flooredHeight=Math.max(height,floor);return{x:x-(flooredWidth-width)/2,y:y-(flooredHeight-height)/2,width:flooredWidth,height:flooredHeight}}clientToContentPoint(svgEl,clientX,clientY){const ctm=svgEl.getScreenCTM();if(!ctm)return{x:0,y:0};const pt=svgEl.createSVGPoint();pt.x=clientX,pt.y=clientY;const transformed=pt.matrixTransform(ctm.inverse());return{x:transformed.x,y:transformed.y}}detachViewportDragListeners(){const dragEventWindow=this.dragEventWindow;dragEventWindow&&(dragEventWindow.removeEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.removeEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.removeEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.removeEventListener("lostpointercapture",this.onViewportPointerUp),this.dragEventWindow=void 0)}renderNodes(){return svg`${(this.snapshot?.nodes??[]).map(n=>svg`<rect part="node" data-status=${n.status??nothing} x=${n.x} y=${n.y} width=${n.width} height=${n.height} rx="2"></rect>`)}`}render(){const label=this.getAttribute("aria-label")||this.label||this.localize("flowMinimapLabel");if(!this.canvasEl||!this.snapshot)return html`<div part="base" aria-hidden="true"></div>`;const bounds=this.contentBounds(),padding=20,vbX=bounds.minX-padding,vbY=bounds.minY-padding,vbW=Math.max(1,bounds.maxX-bounds.minX+padding*2),vbH=Math.max(1,bounds.maxY-bounds.minY+padding*2),viewportRect=this.viewportRectContent(vbW,vbH,0),viewportHitRect=this.viewportRectContent(vbW,vbH),locked=this.snapshot.locked||this.canvasEl.locked;return html`<div
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,svg,nothing}from"lit";import{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel,nextId,srOnly}from"../../../internal/a11y.js";import{resolveCssLength}from"../../../internal/css-length.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-minimap.styles.js";import{LYRA_DEFAULT_flowMinimapInstructions,LYRA_DEFAULT_flowMinimapLabel,LYRA_DEFAULT_flowMinimapViewport,LYRA_DEFAULT_flowMinimapViewportChanged}from"../../../internal/default-strings.generated.js";function isFlowCanvasLike(element){const candidate=element;return typeof candidate.registerCompanion=="function"&&typeof candidate.setViewport=="function"&&typeof candidate.zoomIn=="function"&&typeof candidate.zoomOut=="function"&&typeof candidate.fit=="function"&&typeof candidate.locked=="boolean"}const DEFAULT_VIEWPORT_MIN_SIZE_PX=40;class LyraFlowMinimap extends LyraElement{constructor(){super(...arguments),this.for="",this.label="",this.snapshot=null,this.liveText="",this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.viewportMinSizePx=DEFAULT_VIEWPORT_MIN_SIZE_PX,this.baseBorderPx=0,this.instructionsId=nextId("flow-minimap-instructions"),this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.onMapClick=e=>{if(this.justDraggedViewport){this.justDraggedViewport=!1;return}if(!this.canvasEl||!this.snapshot||this.canvasEl.locked)return;const point=this.clientToContentPoint(e.currentTarget,e.clientX,e.clientY),{zoom,width,height}=this.snapshot.viewport;this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:width/2-point.x*zoom,y:height/2-point.y*zoom,zoom})},this.onMapWheel=e=>{!this.canvasEl||this.canvasEl.locked||(e.preventDefault(),this.announceNextSnapshot=!0,e.deltaY<0?this.canvasEl.zoomIn():this.canvasEl.zoomOut())},this.onViewportPointerDown=e=>{const dragEventWindow=this.ownerDocument.defaultView;!this.canvasEl||!this.snapshot||!dragEventWindow||this.canvasEl.locked||(e.stopPropagation(),this.detachViewportDragListeners(),this.justDraggedViewport=!1,this.dragState={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startViewport:{...this.snapshot.viewport},moved:!1},e.target.setPointerCapture?.(e.pointerId),this.dragEventWindow=dragEventWindow,dragEventWindow.addEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.addEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.addEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.addEventListener("lostpointercapture",this.onViewportPointerUp))},this.onViewportPointerMove=e=>{const drag=this.dragState;if(!drag||e.pointerId!==drag.pointerId)return;if(!this.canvasEl||this.canvasEl.locked){this.cancelViewportDrag();return}const ctm=this.renderRoot.querySelector('[part="map"]')?.getScreenCTM();if(!ctm)return;const scale=ctm.a||1,dxContent=(e.clientX-drag.startClientX)/scale,dyContent=(e.clientY-drag.startClientY)/scale;dxContent===0&&dyContent===0||(drag.moved=!0,drag.latestViewport={x:drag.startViewport.x-dxContent*drag.startViewport.zoom,y:drag.startViewport.y-dyContent*drag.startViewport.zoom,zoom:drag.startViewport.zoom},this.canvasEl.setViewport(drag.latestViewport))},this.onViewportPointerUp=e=>{const drag=this.dragState;!drag||e.pointerId!==drag.pointerId||(this.justDraggedViewport=e.type==="pointerup"&&drag.moved,this.justDraggedViewport&&drag.latestViewport&&!this.canvasEl?.locked&&this.announceViewport(drag.latestViewport),this.dragState=void 0,this.detachViewportDragListeners())},this.onViewportKeyDown=e=>{if(!this.canvasEl||!this.snapshot||this.canvasEl.locked)return;if(e.key==="+"||e.key==="="){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.zoomIn();return}if(e.key==="-"||e.key==="_"){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.zoomOut();return}if(e.key==="Enter"||e.key==="Home"){e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.fit();return}const{x,y,zoom,width,height}=this.snapshot.viewport,stepX=width*.1,stepY=height*.1;e.key==="ArrowRight"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:x-stepX,y,zoom})):e.key==="ArrowLeft"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x:x+stepX,y,zoom})):e.key==="ArrowDown"?(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x,y:y-stepY,zoom})):e.key==="ArrowUp"&&(e.preventDefault(),this.announceNextSnapshot=!0,this.canvasEl.setViewport({x,y:y+stepY,zoom}))}}static{this.defaultStrings={...super.defaultStrings,flowMinimapInstructions:LYRA_DEFAULT_flowMinimapInstructions,flowMinimapLabel:LYRA_DEFAULT_flowMinimapLabel,flowMinimapViewport:LYRA_DEFAULT_flowMinimapViewport,flowMinimapViewportChanged:LYRA_DEFAULT_flowMinimapViewportChanged}}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink(),this.companionController.connect()}refreshViewportMetrics(){const view=this.ownerDocument?.defaultView;if(!view||!this.isConnected)return;const computed=view.getComputedStyle(this),minSize=resolveCssLength(computed.getPropertyValue("--lr-flow-minimap-viewport-min-size").trim()||computed.getPropertyValue("--lr-icon-button-size").trim(),{host:this});this.viewportMinSizePx=minSize!==void 0&&Number.isFinite(minSize)&&minSize>=0?minSize:DEFAULT_VIEWPORT_MIN_SIZE_PX;const border=resolveCssLength(computed.getPropertyValue("--lr-border-width-thin").trim(),{host:this});this.baseBorderPx=border!==void 0&&Number.isFinite(border)&&border>=0?border:0}disconnectedCallback(){super.disconnectedCallback(),this.releaseAnnouncementSink(),this.announceNextSnapshot=!1,this.liveText="",this.companionController.disconnect()}adoptedCallback(){super.adoptedCallback(),this.syncAnnouncementSink(),this.companionController.adopt()}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}announceViewport(viewport){const number=getNumberFormat(this.effectiveLocale,{maximumFractionDigits:0}),percent=getNumberFormat(this.effectiveLocale,{style:"percent",maximumFractionDigits:1}),text=this.localize("flowMinimapViewportChanged",void 0,{x:number.format(viewport.x),y:number.format(viewport.y),zoom:percent.format(viewport.zoom)});this.liveText=text,this.announcementSink?.announce(text)}willUpdate(changed){super.willUpdate(changed),this.refreshViewportMetrics(),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged()}attachCanvas(canvas){this.cancelViewportDrag(),this.unsubscribe?.(),this.unsubscribe=void 0,this.snapshot=null,this.canvasEl=canvas??void 0,canvas&&(this.unsubscribe=canvas.registerCompanion(snapshot=>{!this.isConnected||this.canvasEl!==canvas||(this.snapshot=snapshot,snapshot.locked&&this.cancelViewportDrag(),this.announceNextSnapshot&&(this.announceNextSnapshot=!1,this.announceViewport(snapshot.viewport)))}))}cancelViewportDrag(){this.dragState=void 0,this.justDraggedViewport=!1,this.announceNextSnapshot=!1,this.detachViewportDragListeners()}contentBounds(){const nodes=this.snapshot?.nodes??[];if(nodes.length===0)return{minX:0,minY:0,maxX:1,maxY:1};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const n of nodes)minX=Math.min(minX,n.x),minY=Math.min(minY,n.y),maxX=Math.max(maxX,n.x+n.width),maxY=Math.max(maxY,n.y+n.height);return{minX,minY,maxX,maxY}}mapSizePx(){const inset=2*this.baseBorderPx;return{width:Math.max(0,this.clientWidth-inset),height:Math.max(0,this.clientHeight-inset)}}viewportRectContent(viewBoxWidth,viewBoxHeight,minimumPhysicalSize=this.viewportMinSizePx){const vp=this.snapshot?.viewport;if(!vp||vp.zoom===0)return{x:0,y:0,width:0,height:0};const x=-vp.x/vp.zoom,y=-vp.y/vp.zoom,width=vp.width/vp.zoom,height=vp.height/vp.zoom,map=this.mapSizePx(),scale=map.width>0&&map.height>0&&viewBoxWidth>0&&viewBoxHeight>0?Math.min(map.width/viewBoxWidth,map.height/viewBoxHeight):0,floor=scale>0?minimumPhysicalSize/scale:0;if(!Number.isFinite(floor)||floor<=0)return{x,y,width,height};const flooredWidth=Math.max(width,floor),flooredHeight=Math.max(height,floor);return{x:x-(flooredWidth-width)/2,y:y-(flooredHeight-height)/2,width:flooredWidth,height:flooredHeight}}clientToContentPoint(svgEl,clientX,clientY){const ctm=svgEl.getScreenCTM();if(!ctm)return{x:0,y:0};const pt=svgEl.createSVGPoint();pt.x=clientX,pt.y=clientY;const transformed=pt.matrixTransform(ctm.inverse());return{x:transformed.x,y:transformed.y}}detachViewportDragListeners(){const dragEventWindow=this.dragEventWindow;dragEventWindow&&(dragEventWindow.removeEventListener("pointermove",this.onViewportPointerMove),dragEventWindow.removeEventListener("pointerup",this.onViewportPointerUp),dragEventWindow.removeEventListener("pointercancel",this.onViewportPointerUp),dragEventWindow.removeEventListener("lostpointercapture",this.onViewportPointerUp),this.dragEventWindow=void 0)}renderNodes(){return svg`${(this.snapshot?.nodes??[]).map(n=>svg`<rect part="node" data-status=${n.status??nothing} x=${n.x} y=${n.y} width=${n.width} height=${n.height} rx="2"></rect>`)}`}render(){const label=hostAriaLabel(this)??(this.label||this.localize("flowMinimapLabel"));if(!this.canvasEl||!this.snapshot)return html`<div part="base" aria-hidden="true"></div>`;const bounds=this.contentBounds(),padding=20,vbX=bounds.minX-padding,vbY=bounds.minY-padding,vbW=Math.max(1,bounds.maxX-bounds.minX+padding*2),vbH=Math.max(1,bounds.maxY-bounds.minY+padding*2),viewportRect=this.viewportRectContent(vbW,vbH,0),viewportHitRect=this.viewportRectContent(vbW,vbH),locked=this.snapshot.locked||this.canvasEl.locked;return html`<div
2
2
  part="base"
3
3
  role="region"
4
4
  aria-label=${label}
@@ -18,15 +18,9 @@ import{css}from"lit";const styles=css`
18
18
  block-size: 100%;
19
19
  cursor: pointer;
20
20
  }
21
- /* Mouse-hover cue matching the cursor: pointer affordance above -- mirrors the reveal-button/
22
- copy-button/sources-summary brand-quiet hover tint used across the library for a clickable
23
- surface with no dedicated icon of its own. */
24
21
  [part='map']:hover {
25
22
  background: var(--lr-color-brand-quiet);
26
23
  }
27
- /* Clicking the map recenters the canvas viewport, and that jump is the only confirmation the user
28
- gets -- the pressed fill is what says the click landed on the map rather than on the viewport
29
- rect drawn over it. */
30
24
  [part='map']:active {
31
25
  background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active));
32
26
  }
@@ -71,9 +65,6 @@ import{css}from"lit";const styles=css`
71
65
  fill: color-mix(in srgb, var(--lr-color-brand) 25%, transparent);
72
66
  stroke-width: 3;
73
67
  }
74
- /* The rect is a grab handle, so its pressed state is also its dragging state -- it stays applied
75
- for the whole gesture. Both channels step past the hovered values, and the cursor flips to
76
- grabbing, matching the [data-panning] treatment lr-flow-canvas gives its own background. */
77
68
  [data-viewport-control]:has([part='viewport-hit-area']:active) [part='viewport'] {
78
69
  fill: color-mix(in srgb, var(--lr-color-brand) 40%, transparent);
79
70
  stroke-width: 4;
@@ -37,10 +37,6 @@ import{css}from"lit";const styles=css`
37
37
  }
38
38
  .card {
39
39
  flex: 1 1 auto;
40
- /* The single source of the card's minimum width -- a second min-inline-size declaration later
41
- in this same rule would win outright and make --lr-flow-node-min-inline-size dead, which is
42
- exactly what a stray "min-inline-size: 0" here used to do. The host caps itself at
43
- max-inline-size: 100%, so a narrow allocation still wraps rather than overflowing. */
44
40
  min-inline-size: var(--lr-flow-node-min-inline-size, calc(var(--lr-size-10rem) + var(--lr-size-1rem)));
45
41
  display: flex;
46
42
  flex-direction: column;
@@ -49,21 +45,8 @@ import{css}from"lit";const styles=css`
49
45
  border: var(--lr-border-width-thin) solid var(--lr-color-border);
50
46
  border-radius: var(--lr-radius);
51
47
  background: var(--lr-color-surface);
52
- /* Resting chrome: a node card sits on the canvas, so it takes a card step -- s rather than xs
53
- because it has to separate from a patterned/gridded canvas background, not a flat panel. */
54
48
  box-shadow: var(--lr-shadow-s);
55
49
  }
56
- /* Density escape -- same convention as lr-source-card's compact. The tuned values sit behind
57
- inline var() fallbacks (rather than a :host declaration, which every instance re-declares and
58
- so shadows any ancestor value) so a canvas or palette can retune every card at once from the
59
- outside; the fallbacks are the pre-existing values scaled down one step, so an unset card
60
- renders unchanged.
61
-
62
- Deliberately placed BEFORE the :host([selected]) and :host([status='running']) rules below:
63
- all three are :host([x]) .card, i.e. equal specificity, so source order alone decides. They
64
- carry the state treatments (border-color, the run-state ring) while this one carries only
65
- density (padding/gap), so nothing collides today -- keeping the state rules last means a
66
- future border/shadow tweak here still can't silently win over selection or run state. */
67
50
  :host([compact]) .card {
68
51
  padding: var(--lr-flow-node-compact-padding, var(--lr-space-xs));
69
52
  gap: var(--lr-flow-node-compact-gap, var(--lr-space-2xs));
@@ -129,10 +112,6 @@ import{css}from"lit";const styles=css`
129
112
  justify-content: flex-end;
130
113
  opacity: 0;
131
114
  }
132
- /* no-pressed-state: the toolbar is not a target -- it is the container the consumer slots the
133
- node's own action buttons into, and hovering/focusing the CARD is what reveals it. Pressing it
134
- means pressing one of those buttons, which carries its own pressed state; a pressed treatment
135
- on the container would fire for every one of them and say nothing about which. */
136
115
  :host(:hover) [part='toolbar'],
137
116
  :host(:focus-within) [part='toolbar'] {
138
117
  opacity: 1;
@@ -144,8 +123,6 @@ import{css}from"lit";const styles=css`
144
123
  border-color: var(--lr-flow-node-running-border, var(--lr-color-brand));
145
124
  box-shadow: 0 0 0 var(--lr-size-2px) var(--lr-flow-node-running-glow, var(--lr-color-brand-quiet));
146
125
  }
147
- /* The JS gate only evaluates the preference at render time; this CSS branch also covers a
148
- preference change while an already-rendered card is still pulsing. */
149
126
  @media (prefers-reduced-motion: reduce) {
150
127
  .card[data-pulse] {
151
128
  animation: none;
@@ -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}from"lit";import{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{Announcer,acquireAnnouncementSink}from"../../../internal/announcer.js";import{getListFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{snapshotFlowDecorations}from"../flow-canvas/flow-model.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-run-status.styles.js";import{LYRA_DEFAULT_flowRunStatusCount,LYRA_DEFAULT_flowRunStatusLabel,LYRA_DEFAULT_flowRunStepStatus,LYRA_DEFAULT_flowRunSummary,LYRA_DEFAULT_statusDenied,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusPending,LYRA_DEFAULT_statusRunning,LYRA_DEFAULT_statusSuccess}from"../../../internal/default-strings.generated.js";const ALL_STATUSES=["pending","running","success","error","denied"],DONE_STATUSES=new Set(["success","error","denied"]);function isFlowCanvasLike(element){const candidate=element;return"decorations"in candidate&&Array.isArray(candidate.nodes)}class LyraFlowRunStatus extends LyraElement{constructor(){super(...arguments),this.for="",this._decorations=Object.freeze({}),this.hideSummary=!1,this.label="",this.frame="card",this.liveText="",this.announcer=new Announcer({onFlush:text=>{this.sink?.announce(text),this.liveText=text}}),this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.lastWrittenDecorations=null}static{this.defaultStrings={...super.defaultStrings,flowRunStatusCount:LYRA_DEFAULT_flowRunStatusCount,flowRunStatusLabel:LYRA_DEFAULT_flowRunStatusLabel,flowRunStepStatus:LYRA_DEFAULT_flowRunStepStatus,flowRunSummary:LYRA_DEFAULT_flowRunSummary,statusDenied:LYRA_DEFAULT_statusDenied,statusError:LYRA_DEFAULT_statusError,statusPending:LYRA_DEFAULT_statusPending,statusRunning:LYRA_DEFAULT_statusRunning,statusSuccess:LYRA_DEFAULT_statusSuccess}}static{this.styles=[LyraElement.styles,styles,srOnly]}get decorations(){return this._decorations}set decorations(value){const previous=this._decorations;this._decorations=snapshotFlowDecorations(value),this.requestUpdate("decorations",previous)}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.syncSink(),this.companionController.connect()}disconnectedCallback(){super.disconnectedCallback(),this.companionController.disconnect(),this.announcer.cancel(),this.sink?.release(),this.sink=void 0}adoptedCallback(){super.adoptedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.syncSink(),this.companionController.adopt()}syncSink(){this.sink?.element.ownerDocument!==this.ownerDocument&&(this.sink?.release(),this.sink=this.isConnected?acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}):void 0)}willUpdate(changed){super.willUpdate(changed),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged(),changed.has("decorations")&&this.announceTransitions(changed.get("decorations"))}updated(changed){super.updated(changed),changed.has("decorations")&&this.applyDecorations()}attachCanvas(next){this.canvasEl&&this.canvasEl.decorations===this.lastWrittenDecorations&&(this.canvasEl.decorations=null),this.canvasEl=next??void 0,this.lastWrittenDecorations=null,this.applyDecorations()}applyDecorations(){if(!this.canvasEl)return;const current=this.canvasEl.decorations;this.lastWrittenDecorations!==null&&current!==null&&current!==this.lastWrittenDecorations&&console.warn("<lr-flow-run-status> is overwriting <lr-flow-canvas>.decorations set by something else; mixing this element with direct decorations writes is unsupported."),this.canvasEl.decorations=this.decorations,this.lastWrittenDecorations=this.canvasEl.decorations}statusLabel(status){return status==="pending"?this.localize("statusPending"):status==="running"?this.localize("statusRunning"):status==="success"?this.localize("statusSuccess"):status==="error"?this.localize("statusError"):this.localize("statusDenied")}announceTransitions(previous){if(!previous)return;const messages=[];for(const[id,decoration]of Object.entries(this.decorations)){if(previous[id]?.status===decoration.status)continue;const node=this.canvasEl?.nodes.find(n=>n.id===id),label=typeof node?.data?.label=="string"?node.data.label:id;messages.push(this.localize("flowRunStepStatus",void 0,{label,status:this.statusLabel(decoration.status)}))}messages.length>0&&this.announcer.announce(getListFormat(this.effectiveLocale,{type:"conjunction",style:"long"}).format(messages),{force:!0})}summary(){const counts={pending:0,running:0,success:0,error:0,denied:0};let total=0,done=0;for(const decoration of Object.values(this.decorations))total++,counts[decoration.status]++,DONE_STATUSES.has(decoration.status)&&done++;return{done,total,counts}}render(){const label=this.label||this.localize("flowRunStatusLabel"),ariaLabel=this.getAttribute("aria-label")||label,{done,total,counts}=this.summary(),number=getNumberFormat(this.effectiveLocale);return html`<div part="base" role="group" aria-label=${ariaLabel}>
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}from"lit";import{property,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel,srOnly}from"../../../internal/a11y.js";import{Announcer,acquireAnnouncementSink}from"../../../internal/announcer.js";import{getListFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{snapshotFlowDecorations}from"../flow-canvas/flow-model.js";import{FlowCanvasCompanionController}from"../flow-canvas/flow-companion-controller.js";import{styles}from"./flow-run-status.styles.js";import{LYRA_DEFAULT_flowRunStatusCount,LYRA_DEFAULT_flowRunStatusLabel,LYRA_DEFAULT_flowRunStepStatus,LYRA_DEFAULT_flowRunSummary,LYRA_DEFAULT_statusDenied,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusPending,LYRA_DEFAULT_statusRunning,LYRA_DEFAULT_statusSuccess}from"../../../internal/default-strings.generated.js";const ALL_STATUSES=["pending","running","success","error","denied"],DONE_STATUSES=new Set(["success","error","denied"]);function isFlowCanvasLike(element){const candidate=element;return"decorations"in candidate&&Array.isArray(candidate.nodes)}class LyraFlowRunStatus extends LyraElement{constructor(){super(...arguments),this.for="",this._decorations=Object.freeze({}),this.hideSummary=!1,this.label="",this.frame="card",this.liveText="",this.announcer=new Announcer({onFlush:text=>{this.sink?.announce(text),this.liveText=text}}),this.companionController=new FlowCanvasCompanionController(this,isFlowCanvasLike,next=>this.attachCanvas(next)),this.lastWrittenDecorations=null}static{this.defaultStrings={...super.defaultStrings,flowRunStatusCount:LYRA_DEFAULT_flowRunStatusCount,flowRunStatusLabel:LYRA_DEFAULT_flowRunStatusLabel,flowRunStepStatus:LYRA_DEFAULT_flowRunStepStatus,flowRunSummary:LYRA_DEFAULT_flowRunSummary,statusDenied:LYRA_DEFAULT_statusDenied,statusError:LYRA_DEFAULT_statusError,statusPending:LYRA_DEFAULT_statusPending,statusRunning:LYRA_DEFAULT_statusRunning,statusSuccess:LYRA_DEFAULT_statusSuccess}}static{this.styles=[LyraElement.styles,styles,srOnly]}get decorations(){return this._decorations}set decorations(value){const previous=this._decorations;this._decorations=snapshotFlowDecorations(value),this.requestUpdate("decorations",previous)}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.syncSink(),this.companionController.connect()}disconnectedCallback(){super.disconnectedCallback(),this.companionController.disconnect(),this.announcer.cancel(),this.sink?.release(),this.sink=void 0}adoptedCallback(){super.adoptedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.syncSink(),this.companionController.adopt()}syncSink(){this.sink?.element.ownerDocument!==this.ownerDocument&&(this.sink?.release(),this.sink=this.isConnected?acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}):void 0)}willUpdate(changed){super.willUpdate(changed),this.hasUpdated&&changed.has("for")&&this.companionController.targetIdChanged(),changed.has("decorations")&&this.announceTransitions(changed.get("decorations"))}updated(changed){super.updated(changed),changed.has("decorations")&&this.applyDecorations()}attachCanvas(next){this.canvasEl&&this.canvasEl.decorations===this.lastWrittenDecorations&&(this.canvasEl.decorations=null),this.canvasEl=next??void 0,this.lastWrittenDecorations=null,this.applyDecorations()}applyDecorations(){if(!this.canvasEl)return;const current=this.canvasEl.decorations;this.lastWrittenDecorations!==null&&current!==null&&current!==this.lastWrittenDecorations&&console.warn("<lr-flow-run-status> is overwriting <lr-flow-canvas>.decorations set by something else; mixing this element with direct decorations writes is unsupported."),this.canvasEl.decorations=this.decorations,this.lastWrittenDecorations=this.canvasEl.decorations}statusLabel(status){return status==="pending"?this.localize("statusPending"):status==="running"?this.localize("statusRunning"):status==="success"?this.localize("statusSuccess"):status==="error"?this.localize("statusError"):this.localize("statusDenied")}announceTransitions(previous){if(!previous)return;const messages=[];for(const[id,decoration]of Object.entries(this.decorations)){if(previous[id]?.status===decoration.status)continue;const node=this.canvasEl?.nodes.find(n=>n.id===id),label=typeof node?.data?.label=="string"?node.data.label:id;messages.push(this.localize("flowRunStepStatus",void 0,{label,status:this.statusLabel(decoration.status)}))}messages.length>0&&this.announcer.announce(getListFormat(this.effectiveLocale,{type:"conjunction",style:"long"}).format(messages),{force:!0})}summary(){const counts={pending:0,running:0,success:0,error:0,denied:0};let total=0,done=0;for(const decoration of Object.values(this.decorations))total++,counts[decoration.status]++,DONE_STATUSES.has(decoration.status)&&done++;return{done,total,counts}}render(){const label=this.label||this.localize("flowRunStatusLabel"),ariaLabel=hostAriaLabel(this)??label,{done,total,counts}=this.summary(),number=getNumberFormat(this.effectiveLocale);return html`<div part="base" role="group" aria-label=${ariaLabel}>
2
2
  ${this.hideSummary?"":html`
3
3
  <div part="summary">${this.localize("flowRunSummary",void 0,{done:number.format(done),total:number.format(total)})}</div>
4
4
  ${ALL_STATUSES.filter(s=>counts[s]>0).map(s=>html`<span part="count" data-status=${s}><span class="tone-dot"></span>${this.localize("flowRunStatusCount",void 0,{status:this.statusLabel(s),count:number.format(counts[s])})}</span>`)}
@@ -14,18 +14,11 @@ import{css}from"lit";const styles=css`
14
14
  border: var(--lr-border-width-thin) solid var(--lr-color-border);
15
15
  border-radius: var(--lr-radius);
16
16
  background: var(--lr-color-surface);
17
- /* Resting chrome, despite the element's name: this is an in-flow status strip (the host is a
18
- plain display:block box with no positioning of its own, and it is usually dropped into a
19
- toolbar next to the canvas), not a layer floating above the page. */
20
17
  box-shadow: var(--lr-shadow-s);
21
18
  font-size: var(--lr-font-size-xs);
22
19
  min-inline-size: 0;
23
20
  max-inline-size: 100%;
24
21
  }
25
- /* Chrome-less escape, mirroring the shared LyraFrame vocabulary's frame="plain" (and lr-callout's [inline]): the
26
- summary strip is often placed directly inside a host toolbar that already draws its own
27
- border/background, where this floating-surface chrome doubles the frame. Only the box
28
- decoration goes -- the flex layout, gap and the per-status count dots stay. */
29
22
  :host([frame='plain']) [part='base'] {
30
23
  padding: 0;
31
24
  border: 0;
@@ -305,13 +305,6 @@ export declare class LyraGraphQueryBuilder extends LyraElement<LyraGraphQueryBui
305
305
  private removalFocusGeneration;
306
306
  constructor();
307
307
  disconnectedCallback(): void;
308
- /** `attachInternals()` throws in any environment without a real `ElementInternals`
309
- * implementation (e.g. a downstream consumer's happy-dom test suite) -- merely constructing
310
- * (or importing) this component must not hard-crash there. Falls back to an inert stand-in:
311
- * form participation and validity reporting are unavailable in that environment (there is no
312
- * polyfillable substitute), but rendering and every non-form-associated feature keep working. */
313
- private safeAttachInternals;
314
- private inertInternals;
315
308
  get form(): HTMLFormElement | null;
316
309
  set form(owner: FormOwnerValue);
317
310
  getForm(): HTMLFormElement | null;
@@ -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{LyraElement}from"../../../internal/lyra-element.js";import{closeIcon}from"../../../internal/icons.js";import{AnchoredValidityController,VALIDITY_ANCHOR}from"../../../internal/anchored-validity.js";import{syncValidityStates}from"../../../internal/custom-states.js";import{finiteInteger}from"../../../internal/numbers.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{nextId}from"../../../internal/a11y.js";import{deepActiveElementIn}from"../../../internal/active-element.js";import{styles}from"./graph-query-builder.styles.js";import{getFormOwner,installCustomErrorProperty,isBarredFromValidation,setFormOwner}from"../../../internal/form-associated.js";import{installInvalidEventAlias}from"../../../internal/invalid-event-alias.js";import{LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_graphQueryBuilderLabel,LYRA_DEFAULT_graphQueryDeleteWithContext,LYRA_DEFAULT_graphQueryDirectionLabel,LYRA_DEFAULT_graphQueryEndLabel,LYRA_DEFAULT_graphQueryHopRangeInvalid,LYRA_DEFAULT_graphQueryLoadWithContext,LYRA_DEFAULT_graphQueryMaxHopsLabel,LYRA_DEFAULT_graphQueryMinHopsLabel,LYRA_DEFAULT_graphQueryNodeTypeLabel,LYRA_DEFAULT_graphQueryRelationshipTypeLabel,LYRA_DEFAULT_graphQueryRun,LYRA_DEFAULT_graphQuerySaveButton,LYRA_DEFAULT_graphQuerySaveNameLabel,LYRA_DEFAULT_graphQuerySavedQueriesLabel,LYRA_DEFAULT_graphQueryStartLabel,LYRA_DEFAULT_neighborDirectionBoth,LYRA_DEFAULT_neighborDirectionIn,LYRA_DEFAULT_neighborDirectionOut,LYRA_DEFAULT_noData,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";const MAX_TYPES=500,MAX_SAVED_QUERIES=200,MAX_TEXT=256,EMPTY_STRINGS=Object.freeze([]),EMPTY_VALUE=Object.freeze({startId:"",endId:"",relationshipTypes:EMPTY_STRINGS,nodeTypes:EMPTY_STRINGS,direction:"both",minHops:1,maxHops:1}),EMPTY_OPTIONS=Object.freeze([]),EMPTY_SAVED=Object.freeze([]);function ownValue(record,key){try{const descriptor=Object.getOwnPropertyDescriptor(record,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}catch{return}}function boundedString(value){return typeof value=="string"?value.slice(0,MAX_TEXT):""}function stringArray(value){return Array.isArray(value)?Object.freeze([...new Set(value.slice(0,MAX_TYPES).filter(entry=>typeof entry=="string").map(entry=>boundedString(entry)).filter(Boolean))]):EMPTY_STRINGS}function normalizeGraphQuery(value){const record=value!==null&&typeof value=="object"&&!Array.isArray(value)?value:EMPTY_VALUE,direction=ownValue(record,"direction");return Object.freeze({startId:boundedString(ownValue(record,"startId")),endId:boundedString(ownValue(record,"endId")),relationshipTypes:stringArray(ownValue(record,"relationshipTypes")),nodeTypes:stringArray(ownValue(record,"nodeTypes")),direction:direction==="out"||direction==="in"||direction==="both"?direction:"both",minHops:finiteInteger(typeof ownValue(record,"minHops")=="number"?ownValue(record,"minHops"):EMPTY_VALUE.minHops,EMPTY_VALUE.minHops,1,20),maxHops:finiteInteger(typeof ownValue(record,"maxHops")=="number"?ownValue(record,"maxHops"):EMPTY_VALUE.maxHops,EMPTY_VALUE.maxHops,1,20)})}function normalizeTypeOptions(value){if(!Array.isArray(value))return EMPTY_OPTIONS;const values=new Set,result=[];for(const candidate of value.slice(0,MAX_TYPES)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const optionValue=boundedString(ownValue(candidate,"value"));if(optionValue.trim().length===0||values.has(optionValue))continue;values.add(optionValue);const label=boundedString(ownValue(candidate,"label"));result.push(Object.freeze({value:optionValue,...label?{label}:{}}))}return Object.freeze(result)}function normalizeSavedQueries(value){if(!Array.isArray(value))return EMPTY_SAVED;const ids=new Set,result=[];for(const candidate of value.slice(0,MAX_SAVED_QUERIES)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const id=boundedString(ownValue(candidate,"id"));id.trim().length===0||ids.has(id)||(ids.add(id),result.push(Object.freeze({id,name:boundedString(ownValue(candidate,"name")),query:normalizeGraphQuery(ownValue(candidate,"query"))})))}return Object.freeze(result)}class LyraGraphQueryBuilder extends LyraElement{static{this.defaultStrings={...super.defaultStrings,fieldRequired:LYRA_DEFAULT_fieldRequired,graphQueryBuilderLabel:LYRA_DEFAULT_graphQueryBuilderLabel,graphQueryDeleteWithContext:LYRA_DEFAULT_graphQueryDeleteWithContext,graphQueryDirectionLabel:LYRA_DEFAULT_graphQueryDirectionLabel,graphQueryEndLabel:LYRA_DEFAULT_graphQueryEndLabel,graphQueryHopRangeInvalid:LYRA_DEFAULT_graphQueryHopRangeInvalid,graphQueryLoadWithContext:LYRA_DEFAULT_graphQueryLoadWithContext,graphQueryMaxHopsLabel:LYRA_DEFAULT_graphQueryMaxHopsLabel,graphQueryMinHopsLabel:LYRA_DEFAULT_graphQueryMinHopsLabel,graphQueryNodeTypeLabel:LYRA_DEFAULT_graphQueryNodeTypeLabel,graphQueryRelationshipTypeLabel:LYRA_DEFAULT_graphQueryRelationshipTypeLabel,graphQueryRun:LYRA_DEFAULT_graphQueryRun,graphQuerySaveButton:LYRA_DEFAULT_graphQuerySaveButton,graphQuerySaveNameLabel:LYRA_DEFAULT_graphQuerySaveNameLabel,graphQuerySavedQueriesLabel:LYRA_DEFAULT_graphQuerySavedQueriesLabel,graphQueryStartLabel:LYRA_DEFAULT_graphQueryStartLabel,neighborDirectionBoth:LYRA_DEFAULT_neighborDirectionBoth,neighborDirectionIn:LYRA_DEFAULT_neighborDirectionIn,neighborDirectionOut:LYRA_DEFAULT_neighborDirectionOut,noData:LYRA_DEFAULT_noData,select:LYRA_DEFAULT_select}}static{this.formAssociated=!0}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-input","lr-before-query-run","lr-query-run","lr-before-query-save","lr-query-save","lr-before-query-load","lr-query-load"])}static{this.properties={customError:{attribute:"custom-error",reflect:!0,noAccessor:!0},name:{reflect:!0,noAccessor:!0},value:{attribute:!1,noAccessor:!0},disabled:{type:Boolean,reflect:!0,noAccessor:!0}}}get relationshipTypeOptions(){return this._relationshipTypeOptions}set relationshipTypeOptions(value){const previous=this._relationshipTypeOptions;this._relationshipTypeOptions=normalizeTypeOptions(value),this.requestUpdate("relationshipTypeOptions",previous)}get nodeTypeOptions(){return this._nodeTypeOptions}set nodeTypeOptions(value){const previous=this._nodeTypeOptions;this._nodeTypeOptions=normalizeTypeOptions(value),this.requestUpdate("nodeTypeOptions",previous)}get savedQueries(){return this._savedQueries}set savedQueries(value){const previous=this._savedQueries;this._savedQueries=normalizeSavedQueries(value),this.requestUpdate("savedQueries",previous)}constructor(){super(),this._relationshipTypeOptions=EMPTY_OPTIONS,this._nodeTypeOptions=EMPTY_OPTIONS,this._savedQueries=EMPTY_SAVED,this.hopLimit=6,this.label="",this.hint="",this.errorText="",this._errors={},this.touchedFields=new Set,this.saveName="",this.hasHintSlot=!1,this.hasErrorSlot=!1,this.labelId=nextId("graph-query-builder-label"),this.hintId=nextId("graph-query-builder-hint"),this.errorId=nextId("graph-query-builder-error"),this._fieldsetDisabled=!1,this._name="",this._value=EMPTY_VALUE,this.defaultValue=normalizeGraphQuery(EMPTY_VALUE),this.defaultValueCaptured=!1,this._disabled=!1,this.hasInteracted=!1,this.removalFocusGeneration=0,this.onChromeSlotChange=event=>{const slot=event.currentTarget,hasContent=slot.assignedNodes({flatten:!0}).some(node=>node.nodeType===Node.TEXT_NODE?!!node.textContent?.trim():!0);slot.name==="hint"?this.hasHintSlot=hasContent:slot.name==="error"&&(this.hasErrorSlot=hasContent)},this.internals=this.safeAttachInternals(),this.validityController=new AnchoredValidityController(this,this.internals,()=>this[VALIDITY_ANCHOR]()),installCustomErrorProperty(this,()=>this.validityController.customValidityMessage),installInvalidEventAlias(this,init=>this.emit("lr-invalid",null,init)),this.syncFormState()}disconnectedCallback(){this.removalFocusGeneration++,this.pendingRemovalFocus=void 0,super.disconnectedCallback()}safeAttachInternals(){if(typeof globalThis.ElementInternals>"u")return this.inertInternals();try{return this.attachInternals()}catch{return this.inertInternals()}}inertInternals(){return{form:null,labels:[],validity:{},validationMessage:"",willValidate:!1,setFormValue:()=>{},setValidity:()=>{},checkValidity:()=>!0,reportValidity:()=>!0,states:new Set}}get form(){return getFormOwner(this.internals)}set form(owner){setFormOwner(this,owner)}getForm(){return getFormOwner(this.internals)}get labels(){return this.internals.labels}get validity(){return this.internals.validity}get validationMessage(){return this.internals.validationMessage}get willValidate(){return this.internals.willValidate}get value(){return this._value}set value(next){const old=this._value;this._value=normalizeGraphQuery(next),this.syncFormState(),this.requestUpdate("value",old)}get name(){return this._name}set name(next){const old=this._name;this._name=next??"",this._name?this.setAttribute("name",this._name):this.removeAttribute("name"),this.requestUpdate("name",old)}get disabled(){return this._disabled}set disabled(next){const old=this._disabled;this._disabled=!!next,this.toggleAttribute("disabled",this._disabled),this.validityController&&this.syncFormState(),this.requestUpdate("disabled",old)}get effectiveDisabled(){return this.disabled||this._fieldsetDisabled}get errors(){return this.publicValidityErrors()}publicValidityErrors(){const errors={...this._errors};return this.willValidate&&this.validity.customError&&(errors.base=this.validationMessage),Object.freeze(errors)}publishValiditySnapshot(){if(!this.isConnected)return;const valid=!this.willValidate||this.validity.valid,errors=valid?Object.freeze({}):this.publicValidityErrors(),key=JSON.stringify({valid,errors});key!==this.lastValidityKey&&(this.lastValidityKey=key,this.emit("lr-validity-change",Object.freeze({valid,errors})))}[VALIDITY_ANCHOR](){const firstInvalidPart=Object.keys(this._errors)[0];if(!(!firstInvalidPart||!this.renderRoot))return this.renderRoot.querySelector(`[part="${firstInvalidPart}"]`)??void 0}computeValidation(){const errors={},flags={};return this._value.startId.trim()||(errors["start-input"]=this.localize("fieldRequired"),flags.valueMissing=!0),this._value.minHops>this._value.maxHops&&(errors["max-hops"]=this.localize("graphQueryHopRangeInvalid"),flags.rangeUnderflow=!0),{errors,flags}}syncFormState(){const{errors,flags}=this.computeValidation();this._errors=errors;let formValue=null;try{formValue=JSON.stringify(this._value)}catch{formValue=null}if(this.internals.setFormValue(formValue,formValue),this.barredFromValidation||Object.keys(flags).length===0)this.validityController.setValidity({});else{const message=Object.values(errors)[0]??"";this.validityController.setValidity(flags,message)}this.syncValidityCustomStates(),this.publishValiditySnapshot()}get barredFromValidation(){return isBarredFromValidation(this,this.internals)}syncValidityCustomStates(){syncValidityStates(this.internals,{required:!0,hasInteracted:this.hasInteracted,barred:this.barredFromValidation})}checkValidity(){return this.syncFormState(),this.internals.checkValidity()}reportValidity(){return this.hasInteracted=!0,this.syncFormState(),Object.keys(this._errors).length>0&&(this.touchedFields=new Set([...this.touchedFields,...Object.keys(this._errors)])),this.internals.reportValidity()}setCustomValidity(message){this.validityController.setCustomValidity(message??""),this.syncValidityCustomStates(),this.publishValiditySnapshot()}formResetCallback(){this.hasInteracted=!1,this.captureDefaultValue(),this.value=this.defaultValue,this.touchedFields=new Set,this.saveName=""}captureDefaultValue(){this.defaultValueCaptured||(this.defaultValue=normalizeGraphQuery(this._value),this.defaultValueCaptured=!0)}formStateRestoreCallback(state2,_mode){let restored=EMPTY_VALUE;if(typeof state2=="string")try{const parsed=JSON.parse(state2);parsed!==null&&typeof parsed=="object"&&!Array.isArray(parsed)&&(restored=normalizeGraphQuery(parsed))}catch{}this.value=restored}formDisabledCallback(disabled){this._fieldsetDisabled=disabled,this.syncFormState(),this.requestUpdate()}get liveDisabled(){return this.effectiveDisabled||this.matches(":disabled")}focusFirstControl(options){if(!this.renderRoot||this.liveDisabled)return;(this.renderRoot.querySelector('[part="start-input"]')||this.renderRoot.querySelector('[part="end-input"]')||this.renderRoot.querySelector('[part="min-hops"]')||this.renderRoot.querySelector('[part="max-hops"]')||this.renderRoot.querySelector('[part="direction"]')||this.renderRoot.querySelector('[part="save-name-input"]'))?.focus(options)}focus(options){this.focusFirstControl(options)}blur(){const active=deepActiveElementIn(this.shadowRoot);active&&typeof active.blur=="function"&&active.blur()}click(){this.focusFirstControl()}setValue(next){this.effectiveDisabled||(this.hasInteracted=!0,this.value=next,this.emit("lr-input",Object.freeze({value:this._value})))}addRelationshipType(type){!type||this._value.relationshipTypes.includes(type)||this.setValue({...this._value,relationshipTypes:[...this._value.relationshipTypes,type]})}removeRelationshipType(type){this.captureChipRemovalFocus("relationship",type,this._value.relationshipTypes),this.setValue({...this._value,relationshipTypes:this._value.relationshipTypes.filter(t=>t!==type)})}addNodeType(type){!type||this._value.nodeTypes.includes(type)||this.setValue({...this._value,nodeTypes:[...this._value.nodeTypes,type]})}removeNodeType(type){this.captureChipRemovalFocus("node-type",type,this._value.nodeTypes),this.setValue({...this._value,nodeTypes:this._value.nodeTypes.filter(t=>t!==type)})}captureChipRemovalFocus(group,value,selected){const active=this.shadowRoot?.activeElement,expectedPart=group==="relationship"?"relationship-chips":"node-type-chips";if(active?.localName!=="lr-chip"||active.getAttribute("value")!==value||active.closest("lr-chip-group")?.getAttribute("part")!==expectedPart)return;const index=selected.indexOf(value),survivors=selected.filter(candidate=>candidate!==value),targetValue=survivors[Math.min(Math.max(index,0),survivors.length-1)];this.pendingRemovalFocus={kind:"chip",group,targetValue},this.removalFocusGeneration++}markTouched(part){this.hasInteracted=!0,this.syncValidityCustomStates(),!this.touchedFields.has(part)&&(this.touchedFields=new Set(this.touchedFields).add(part))}runQuery(){if(this.effectiveDisabled||!this.reportValidity())return;const detail=()=>Object.freeze({query:normalizeGraphQuery(this._value)});this.emit("lr-before-query-run",detail(),{cancelable:!0}).defaultPrevented||this.emit("lr-query-run",detail())}saveQuery(){if(this.effectiveDisabled)return;const name=this.saveName.trim();if(!name)return;const detail=()=>Object.freeze({name,query:normalizeGraphQuery(this._value)});this.emit("lr-before-query-save",detail(),{cancelable:!0}).defaultPrevented||(this.saveName="",this.emit("lr-query-save",detail()))}loadQuery(item){if(this.effectiveDisabled)return;const detail=()=>Object.freeze({queryId:item.id,query:normalizeGraphQuery(item.query)});this.emit("lr-before-query-load",detail(),{cancelable:!0}).defaultPrevented||(this.setValue({...EMPTY_VALUE,...item.query}),this.emit("lr-query-load",detail()))}deleteQuery(item){if(this.effectiveDisabled)return;const detail=()=>Object.freeze({queryId:item.id});this.emit("lr-before-query-delete",detail(),{cancelable:!0}).defaultPrevented||this.emit("lr-query-delete",detail())}willUpdate(changed){if(super.willUpdate(changed),this.hasUpdated||this.captureDefaultValue(),!changed.has("savedQueries"))return;const active=this.shadowRoot?.activeElement;if(active?.getAttribute("part")!=="saved-delete-button")return;const focusedId=active.closest("[data-query-id]")?.dataset.queryId;if(!focusedId||this.savedQueries.some(item=>item.id===focusedId))return;const index=(changed.get("savedQueries")??[]).findIndex(item=>item.id===focusedId),target=this.savedQueries[Math.min(Math.max(index,0),this.savedQueries.length-1)];this.pendingRemovalFocus={kind:"saved",targetId:target?.id},this.removalFocusGeneration++}updated(changed){super.updated(changed),this.publishValiditySnapshot();const pending=this.pendingRemovalFocus;if(!pending)return;this.pendingRemovalFocus=void 0;const generation=this.removalFocusGeneration;this.scheduleAfterUpdate(()=>{if(!(generation!==this.removalFocusGeneration||!this.isConnected)){if(pending.kind==="chip"){if(pending.targetValue){const part=pending.group==="relationship"?"relationship-chips":"node-type-chips",chip=[...this.shadowRoot?.querySelectorAll(`[part="${part}"] lr-chip`)??[]].find(candidate=>candidate.getAttribute("value")===pending.targetValue);if(chip){chip.focus();return}}const pickerPart=pending.group==="relationship"?"relationship-picker":"node-type-picker";this.shadowRoot?.querySelector(`[part="${pickerPart}"]`)?.focus();return}if(pending.targetId){const action=[...this.shadowRoot?.querySelectorAll("[data-query-id]")??[]].find(candidate=>candidate.dataset.queryId===pending.targetId)?.querySelector('[part="saved-delete-button"]');if(action){action.focus();return}}this.shadowRoot?.querySelector('[part="save-name-input"]')?.focus()}},"graph-query-removal-focus")}hopOptions(){const limit=finiteInteger(this.hopLimit,6,1,20),options=new Set(Array.from({length:limit},(_,i)=>i+1));return options.add(this._value.minHops),options.add(this._value.maxHops),[...options].sort((a,b)=>a-b)}labelForType(options,value){return options.find(o=>o.value===value)?.label??value}renderTypeFilter(kind,options,selected,add,remove,disabled){const pickerPart=kind==="relationship"?"relationship-picker":"node-type-picker",chipsPart=kind==="relationship"?"relationship-chips":"node-type-chips",pickerLabel=kind==="relationship"?this.localize("graphQueryRelationshipTypeLabel"):this.localize("graphQueryNodeTypeLabel"),available=options.filter(o=>!selected.includes(o.value));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{LyraElement}from"../../../internal/lyra-element.js";import{closeIcon}from"../../../internal/icons.js";import{AnchoredValidityController,VALIDITY_ANCHOR}from"../../../internal/anchored-validity.js";import{syncValidityStates}from"../../../internal/custom-states.js";import{finiteInteger}from"../../../internal/numbers.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{nextId}from"../../../internal/a11y.js";import{deepActiveElementIn}from"../../../internal/active-element.js";import{styles}from"./graph-query-builder.styles.js";import{attachInternalsSafely}from"../../../internal/element-internals.js";import{getFormOwner,installCustomErrorProperty,isBarredFromValidation,setFormOwner}from"../../../internal/form-associated.js";import{installInvalidEventAlias}from"../../../internal/invalid-event-alias.js";import{LYRA_DEFAULT_fieldRequired,LYRA_DEFAULT_graphQueryBuilderLabel,LYRA_DEFAULT_graphQueryDeleteWithContext,LYRA_DEFAULT_graphQueryDirectionLabel,LYRA_DEFAULT_graphQueryEndLabel,LYRA_DEFAULT_graphQueryHopRangeInvalid,LYRA_DEFAULT_graphQueryLoadWithContext,LYRA_DEFAULT_graphQueryMaxHopsLabel,LYRA_DEFAULT_graphQueryMinHopsLabel,LYRA_DEFAULT_graphQueryNodeTypeLabel,LYRA_DEFAULT_graphQueryRelationshipTypeLabel,LYRA_DEFAULT_graphQueryRun,LYRA_DEFAULT_graphQuerySaveButton,LYRA_DEFAULT_graphQuerySaveNameLabel,LYRA_DEFAULT_graphQuerySavedQueriesLabel,LYRA_DEFAULT_graphQueryStartLabel,LYRA_DEFAULT_neighborDirectionBoth,LYRA_DEFAULT_neighborDirectionIn,LYRA_DEFAULT_neighborDirectionOut,LYRA_DEFAULT_noData,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";const MAX_TYPES=500,MAX_SAVED_QUERIES=200,MAX_TEXT=256,EMPTY_STRINGS=Object.freeze([]),EMPTY_VALUE=Object.freeze({startId:"",endId:"",relationshipTypes:EMPTY_STRINGS,nodeTypes:EMPTY_STRINGS,direction:"both",minHops:1,maxHops:1}),EMPTY_OPTIONS=Object.freeze([]),EMPTY_SAVED=Object.freeze([]);function ownValue(record,key){try{const descriptor=Object.getOwnPropertyDescriptor(record,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}catch{return}}function boundedString(value){return typeof value=="string"?value.slice(0,MAX_TEXT):""}function stringArray(value){return Array.isArray(value)?Object.freeze([...new Set(value.slice(0,MAX_TYPES).filter(entry=>typeof entry=="string").map(entry=>boundedString(entry)).filter(Boolean))]):EMPTY_STRINGS}function normalizeGraphQuery(value){const record=value!==null&&typeof value=="object"&&!Array.isArray(value)?value:EMPTY_VALUE,direction=ownValue(record,"direction");return Object.freeze({startId:boundedString(ownValue(record,"startId")),endId:boundedString(ownValue(record,"endId")),relationshipTypes:stringArray(ownValue(record,"relationshipTypes")),nodeTypes:stringArray(ownValue(record,"nodeTypes")),direction:direction==="out"||direction==="in"||direction==="both"?direction:"both",minHops:finiteInteger(typeof ownValue(record,"minHops")=="number"?ownValue(record,"minHops"):EMPTY_VALUE.minHops,EMPTY_VALUE.minHops,1,20),maxHops:finiteInteger(typeof ownValue(record,"maxHops")=="number"?ownValue(record,"maxHops"):EMPTY_VALUE.maxHops,EMPTY_VALUE.maxHops,1,20)})}function normalizeTypeOptions(value){if(!Array.isArray(value))return EMPTY_OPTIONS;const values=new Set,result=[];for(const candidate of value.slice(0,MAX_TYPES)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const optionValue=boundedString(ownValue(candidate,"value"));if(optionValue.trim().length===0||values.has(optionValue))continue;values.add(optionValue);const label=boundedString(ownValue(candidate,"label"));result.push(Object.freeze({value:optionValue,...label?{label}:{}}))}return Object.freeze(result)}function normalizeSavedQueries(value){if(!Array.isArray(value))return EMPTY_SAVED;const ids=new Set,result=[];for(const candidate of value.slice(0,MAX_SAVED_QUERIES)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const id=boundedString(ownValue(candidate,"id"));id.trim().length===0||ids.has(id)||(ids.add(id),result.push(Object.freeze({id,name:boundedString(ownValue(candidate,"name")),query:normalizeGraphQuery(ownValue(candidate,"query"))})))}return Object.freeze(result)}class LyraGraphQueryBuilder extends LyraElement{static{this.defaultStrings={...super.defaultStrings,fieldRequired:LYRA_DEFAULT_fieldRequired,graphQueryBuilderLabel:LYRA_DEFAULT_graphQueryBuilderLabel,graphQueryDeleteWithContext:LYRA_DEFAULT_graphQueryDeleteWithContext,graphQueryDirectionLabel:LYRA_DEFAULT_graphQueryDirectionLabel,graphQueryEndLabel:LYRA_DEFAULT_graphQueryEndLabel,graphQueryHopRangeInvalid:LYRA_DEFAULT_graphQueryHopRangeInvalid,graphQueryLoadWithContext:LYRA_DEFAULT_graphQueryLoadWithContext,graphQueryMaxHopsLabel:LYRA_DEFAULT_graphQueryMaxHopsLabel,graphQueryMinHopsLabel:LYRA_DEFAULT_graphQueryMinHopsLabel,graphQueryNodeTypeLabel:LYRA_DEFAULT_graphQueryNodeTypeLabel,graphQueryRelationshipTypeLabel:LYRA_DEFAULT_graphQueryRelationshipTypeLabel,graphQueryRun:LYRA_DEFAULT_graphQueryRun,graphQuerySaveButton:LYRA_DEFAULT_graphQuerySaveButton,graphQuerySaveNameLabel:LYRA_DEFAULT_graphQuerySaveNameLabel,graphQuerySavedQueriesLabel:LYRA_DEFAULT_graphQuerySavedQueriesLabel,graphQueryStartLabel:LYRA_DEFAULT_graphQueryStartLabel,neighborDirectionBoth:LYRA_DEFAULT_neighborDirectionBoth,neighborDirectionIn:LYRA_DEFAULT_neighborDirectionIn,neighborDirectionOut:LYRA_DEFAULT_neighborDirectionOut,noData:LYRA_DEFAULT_noData,select:LYRA_DEFAULT_select}}static{this.formAssociated=!0}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-input","lr-before-query-run","lr-query-run","lr-before-query-save","lr-query-save","lr-before-query-load","lr-query-load"])}static{this.properties={customError:{attribute:"custom-error",reflect:!0,noAccessor:!0},name:{reflect:!0,noAccessor:!0},value:{attribute:!1,noAccessor:!0},disabled:{type:Boolean,reflect:!0,noAccessor:!0}}}get relationshipTypeOptions(){return this._relationshipTypeOptions}set relationshipTypeOptions(value){const previous=this._relationshipTypeOptions;this._relationshipTypeOptions=normalizeTypeOptions(value),this.requestUpdate("relationshipTypeOptions",previous)}get nodeTypeOptions(){return this._nodeTypeOptions}set nodeTypeOptions(value){const previous=this._nodeTypeOptions;this._nodeTypeOptions=normalizeTypeOptions(value),this.requestUpdate("nodeTypeOptions",previous)}get savedQueries(){return this._savedQueries}set savedQueries(value){const previous=this._savedQueries;this._savedQueries=normalizeSavedQueries(value),this.requestUpdate("savedQueries",previous)}constructor(){super(),this._relationshipTypeOptions=EMPTY_OPTIONS,this._nodeTypeOptions=EMPTY_OPTIONS,this._savedQueries=EMPTY_SAVED,this.hopLimit=6,this.label="",this.hint="",this.errorText="",this._errors={},this.touchedFields=new Set,this.saveName="",this.hasHintSlot=!1,this.hasErrorSlot=!1,this.labelId=nextId("graph-query-builder-label"),this.hintId=nextId("graph-query-builder-hint"),this.errorId=nextId("graph-query-builder-error"),this._fieldsetDisabled=!1,this._name="",this._value=EMPTY_VALUE,this.defaultValue=normalizeGraphQuery(EMPTY_VALUE),this.defaultValueCaptured=!1,this._disabled=!1,this.hasInteracted=!1,this.removalFocusGeneration=0,this.onChromeSlotChange=event=>{const slot=event.currentTarget,hasContent=slot.assignedNodes({flatten:!0}).some(node=>node.nodeType===Node.TEXT_NODE?!!node.textContent?.trim():!0);slot.name==="hint"?this.hasHintSlot=hasContent:slot.name==="error"&&(this.hasErrorSlot=hasContent)},this.internals=attachInternalsSafely(this),this.validityController=new AnchoredValidityController(this,this.internals,()=>this[VALIDITY_ANCHOR]()),installCustomErrorProperty(this,()=>this.validityController.customValidityMessage),installInvalidEventAlias(this,init=>this.emit("lr-invalid",null,init)),this.syncFormState()}disconnectedCallback(){this.removalFocusGeneration++,this.pendingRemovalFocus=void 0,super.disconnectedCallback()}get form(){return getFormOwner(this.internals)}set form(owner){setFormOwner(this,owner)}getForm(){return getFormOwner(this.internals)}get labels(){return this.internals.labels}get validity(){return this.internals.validity}get validationMessage(){return this.internals.validationMessage}get willValidate(){return this.internals.willValidate}get value(){return this._value}set value(next){const old=this._value;this._value=normalizeGraphQuery(next),this.syncFormState(),this.requestUpdate("value",old)}get name(){return this._name}set name(next){const old=this._name;this._name=next??"",this._name?this.setAttribute("name",this._name):this.removeAttribute("name"),this.requestUpdate("name",old)}get disabled(){return this._disabled}set disabled(next){const old=this._disabled;this._disabled=!!next,this.toggleAttribute("disabled",this._disabled),this.validityController&&this.syncFormState(),this.requestUpdate("disabled",old)}get effectiveDisabled(){return this.disabled||this._fieldsetDisabled}get errors(){return this.publicValidityErrors()}publicValidityErrors(){const errors={...this._errors};return this.willValidate&&this.validity.customError&&(errors.base=this.validationMessage),Object.freeze(errors)}publishValiditySnapshot(){if(!this.isConnected)return;const valid=!this.willValidate||this.validity.valid,errors=valid?Object.freeze({}):this.publicValidityErrors(),key=JSON.stringify({valid,errors});key!==this.lastValidityKey&&(this.lastValidityKey=key,this.emit("lr-validity-change",Object.freeze({valid,errors})))}[VALIDITY_ANCHOR](){const firstInvalidPart=Object.keys(this._errors)[0];if(!(!firstInvalidPart||!this.renderRoot))return this.renderRoot.querySelector(`[part="${firstInvalidPart}"]`)??void 0}computeValidation(){const errors={},flags={};return this._value.startId.trim()||(errors["start-input"]=this.localize("fieldRequired"),flags.valueMissing=!0),this._value.minHops>this._value.maxHops&&(errors["max-hops"]=this.localize("graphQueryHopRangeInvalid"),flags.rangeUnderflow=!0),{errors,flags}}syncFormState(){const{errors,flags}=this.computeValidation();this._errors=errors;let formValue=null;try{formValue=JSON.stringify(this._value)}catch{formValue=null}if(this.internals.setFormValue(formValue,formValue),this.barredFromValidation||Object.keys(flags).length===0)this.validityController.setValidity({});else{const message=Object.values(errors)[0]??"";this.validityController.setValidity(flags,message)}this.syncValidityCustomStates(),this.publishValiditySnapshot()}get barredFromValidation(){return isBarredFromValidation(this,this.internals)}syncValidityCustomStates(){syncValidityStates(this.internals,{required:!0,hasInteracted:this.hasInteracted,barred:this.barredFromValidation})}checkValidity(){return this.syncFormState(),this.internals.checkValidity()}reportValidity(){return this.hasInteracted=!0,this.syncFormState(),Object.keys(this._errors).length>0&&(this.touchedFields=new Set([...this.touchedFields,...Object.keys(this._errors)])),this.internals.reportValidity()}setCustomValidity(message){this.validityController.setCustomValidity(message??""),this.syncValidityCustomStates(),this.publishValiditySnapshot()}formResetCallback(){this.hasInteracted=!1,this.captureDefaultValue(),this.value=this.defaultValue,this.touchedFields=new Set,this.saveName=""}captureDefaultValue(){this.defaultValueCaptured||(this.defaultValue=normalizeGraphQuery(this._value),this.defaultValueCaptured=!0)}formStateRestoreCallback(state2,_mode){let restored=EMPTY_VALUE;if(typeof state2=="string")try{const parsed=JSON.parse(state2);parsed!==null&&typeof parsed=="object"&&!Array.isArray(parsed)&&(restored=normalizeGraphQuery(parsed))}catch{}this.value=restored}formDisabledCallback(disabled){this._fieldsetDisabled=disabled,this.syncFormState(),this.requestUpdate()}get liveDisabled(){return this.effectiveDisabled||this.matches(":disabled")}focusFirstControl(options){if(!this.renderRoot||this.liveDisabled)return;(this.renderRoot.querySelector('[part="start-input"]')||this.renderRoot.querySelector('[part="end-input"]')||this.renderRoot.querySelector('[part="min-hops"]')||this.renderRoot.querySelector('[part="max-hops"]')||this.renderRoot.querySelector('[part="direction"]')||this.renderRoot.querySelector('[part="save-name-input"]'))?.focus(options)}focus(options){this.focusFirstControl(options)}blur(){const active=deepActiveElementIn(this.shadowRoot);active&&typeof active.blur=="function"&&active.blur()}click(){this.focusFirstControl()}setValue(next){this.effectiveDisabled||(this.hasInteracted=!0,this.value=next,this.emit("lr-input",Object.freeze({value:this._value})))}addRelationshipType(type){!type||this._value.relationshipTypes.includes(type)||this.setValue({...this._value,relationshipTypes:[...this._value.relationshipTypes,type]})}removeRelationshipType(type){this.captureChipRemovalFocus("relationship",type,this._value.relationshipTypes),this.setValue({...this._value,relationshipTypes:this._value.relationshipTypes.filter(t=>t!==type)})}addNodeType(type){!type||this._value.nodeTypes.includes(type)||this.setValue({...this._value,nodeTypes:[...this._value.nodeTypes,type]})}removeNodeType(type){this.captureChipRemovalFocus("node-type",type,this._value.nodeTypes),this.setValue({...this._value,nodeTypes:this._value.nodeTypes.filter(t=>t!==type)})}captureChipRemovalFocus(group,value,selected){const active=this.shadowRoot?.activeElement,expectedPart=group==="relationship"?"relationship-chips":"node-type-chips";if(active?.localName!=="lr-chip"||active.getAttribute("value")!==value||active.closest("lr-chip-group")?.getAttribute("part")!==expectedPart)return;const index=selected.indexOf(value),survivors=selected.filter(candidate=>candidate!==value),targetValue=survivors[Math.min(Math.max(index,0),survivors.length-1)];this.pendingRemovalFocus={kind:"chip",group,targetValue},this.removalFocusGeneration++}markTouched(part){this.hasInteracted=!0,this.syncValidityCustomStates(),!this.touchedFields.has(part)&&(this.touchedFields=new Set(this.touchedFields).add(part))}runQuery(){if(this.effectiveDisabled||!this.reportValidity())return;const detail=()=>Object.freeze({query:normalizeGraphQuery(this._value)});this.emit("lr-before-query-run",detail(),{cancelable:!0}).defaultPrevented||this.emit("lr-query-run",detail())}saveQuery(){if(this.effectiveDisabled)return;const name=this.saveName.trim();if(!name)return;const detail=()=>Object.freeze({name,query:normalizeGraphQuery(this._value)});this.emit("lr-before-query-save",detail(),{cancelable:!0}).defaultPrevented||(this.saveName="",this.emit("lr-query-save",detail()))}loadQuery(item){if(this.effectiveDisabled)return;const detail=()=>Object.freeze({queryId:item.id,query:normalizeGraphQuery(item.query)});this.emit("lr-before-query-load",detail(),{cancelable:!0}).defaultPrevented||(this.setValue({...EMPTY_VALUE,...item.query}),this.emit("lr-query-load",detail()))}deleteQuery(item){if(this.effectiveDisabled)return;const detail=()=>Object.freeze({queryId:item.id});this.emit("lr-before-query-delete",detail(),{cancelable:!0}).defaultPrevented||this.emit("lr-query-delete",detail())}willUpdate(changed){if(super.willUpdate(changed),this.hasUpdated||this.captureDefaultValue(),!changed.has("savedQueries"))return;const active=this.shadowRoot?.activeElement;if(active?.getAttribute("part")!=="saved-delete-button")return;const focusedId=active.closest("[data-query-id]")?.dataset.queryId;if(!focusedId||this.savedQueries.some(item=>item.id===focusedId))return;const index=(changed.get("savedQueries")??[]).findIndex(item=>item.id===focusedId),target=this.savedQueries[Math.min(Math.max(index,0),this.savedQueries.length-1)];this.pendingRemovalFocus={kind:"saved",targetId:target?.id},this.removalFocusGeneration++}updated(changed){super.updated(changed),this.publishValiditySnapshot();const pending=this.pendingRemovalFocus;if(!pending)return;this.pendingRemovalFocus=void 0;const generation=this.removalFocusGeneration;this.scheduleAfterUpdate(()=>{if(!(generation!==this.removalFocusGeneration||!this.isConnected)){if(pending.kind==="chip"){if(pending.targetValue){const part=pending.group==="relationship"?"relationship-chips":"node-type-chips",chip=[...this.shadowRoot?.querySelectorAll(`[part="${part}"] lr-chip`)??[]].find(candidate=>candidate.getAttribute("value")===pending.targetValue);if(chip){chip.focus();return}}const pickerPart=pending.group==="relationship"?"relationship-picker":"node-type-picker";this.shadowRoot?.querySelector(`[part="${pickerPart}"]`)?.focus();return}if(pending.targetId){const action=[...this.shadowRoot?.querySelectorAll("[data-query-id]")??[]].find(candidate=>candidate.dataset.queryId===pending.targetId)?.querySelector('[part="saved-delete-button"]');if(action){action.focus();return}}this.shadowRoot?.querySelector('[part="save-name-input"]')?.focus()}},"graph-query-removal-focus")}hopOptions(){const limit=finiteInteger(this.hopLimit,6,1,20),options=new Set(Array.from({length:limit},(_,i)=>i+1));return options.add(this._value.minHops),options.add(this._value.maxHops),[...options].sort((a,b)=>a-b)}labelForType(options,value){return options.find(o=>o.value===value)?.label??value}renderTypeFilter(kind,options,selected,add,remove,disabled){const pickerPart=kind==="relationship"?"relationship-picker":"node-type-picker",chipsPart=kind==="relationship"?"relationship-chips":"node-type-chips",pickerLabel=kind==="relationship"?this.localize("graphQueryRelationshipTypeLabel"):this.localize("graphQueryNodeTypeLabel"),available=options.filter(o=>!selected.includes(o.value));return html`
2
2
  <div part="filter-group" data-kind=${kind}>
3
3
  <lr-select
4
4
  part=${pickerPart}
@@ -87,10 +87,6 @@ import{css}from"lit";const styles=css`
87
87
  border-color: var(--lr-graph-query-builder-save-border-color, var(--lr-color-border));
88
88
  color: var(--lr-graph-query-builder-save-color, var(--lr-color-text));
89
89
  }
90
- /* Mixing the resting fill toward --lr-color-mix-partner (which follows the text colour) rather
91
- than multiplying every channel with filter: brightness(): a filter lightens a dark brand and
92
- darkens a light one only by accident, does nothing at all to a pure white or pure black one,
93
- and -- because it applies to the whole subtree -- shifted this button's label with it. */
94
90
  [part='run-button']:hover {
95
91
  background: var(
96
92
  --lr-graph-query-builder-run-hover-bg,
@@ -188,9 +184,6 @@ import{css}from"lit";const styles=css`
188
184
  [part='saved-load-button']:hover {
189
185
  text-decoration: underline;
190
186
  }
191
- /* The row this button fills has the surface fill, so that -- not the button's own transparent
192
- background -- is the base the pressed tint mixes from; an underline alone cannot get "more
193
- underlined", and loading a saved query replaces the whole form, which is worth acknowledging. */
194
187
  [part='saved-load-button']:active {
195
188
  background: var(
196
189
  --lr-graph-query-builder-saved-load-active-bg,
@@ -221,9 +214,6 @@ import{css}from"lit";const styles=css`
221
214
  [part='saved-delete-button']:hover {
222
215
  color: var(--lr-graph-query-builder-saved-delete-hover-color, var(--lr-color-danger));
223
216
  }
224
- /* Pressed adds the quiet danger fill behind the already-red glyph rather than only deepening the
225
- glyph itself: a colour step on an icon this small is easy to miss, and this is the destructive
226
- control in the row. */
227
217
  [part='saved-delete-button']:active {
228
218
  color: var(
229
219
  --lr-graph-query-builder-saved-delete-active-color,
@@ -32,3 +32,23 @@ export declare function sqrtStep(count: number, max: number, steps: number): num
32
32
  * scale case (the `'sqrt'` scale already has its own discrete `sqrtStep()`).
33
33
  */
34
34
  export declare function linearBucket(value: number, lo: number, hi: number, steps: number): number;
35
+ /**
36
+ * Normalizes `value` to `[0, 1]` around an anchored `midpoint` rather than the plain `lo`-`hi`
37
+ * span, so a diverging ramp's neutral color lands exactly on `midpoint` instead of wherever the
38
+ * data's own midpoint happens to fall.
39
+ *
40
+ * The two halves are scaled independently: `lo`->0, `midpoint`->0.5, `hi`->1. That deliberately
41
+ * does NOT preserve a single units-per-pixel ratio across the whole range — with data running
42
+ * -4.93 to +28.8 around a zero midpoint, an equal color distance means "equally far from
43
+ * neutral in its own direction", which is the entire point of a diverging ramp. A caller wanting
44
+ * a symmetric ramp passes a symmetric `domain` (e.g. `[-28.8, 28.8]`).
45
+ *
46
+ * Falls back to `finiteRatio`'s plain normalization when `midpoint` sits outside `[lo, hi]` or
47
+ * any input is non-finite, so a mis-set midpoint degrades to today's behavior rather than
48
+ * producing a a division by zero.
49
+ */
50
+ export declare function midpointRatio(value: number, lo: number, hi: number, midpoint: number): number;
51
+ /** `linearAlpha`'s midpoint-anchored twin, keeping the same 0.1-1.0 floor. */
52
+ export declare function midpointAlpha(value: number, lo: number, hi: number, midpoint: number): number;
53
+ /** `linearBucket`'s midpoint-anchored twin. */
54
+ export declare function midpointBucket(value: number, lo: number, hi: number, midpoint: number, steps: number): number;
@@ -1 +1 @@
1
- import{finiteRatio}from"../../../internal/numbers.js";function linearAlpha(value,lo,hi){return .1+.9*finiteRatio(value,lo,hi)}function minMax(values){if(values.length===0)return null;let lo=values[0],hi=values[0];for(let i=1;i<values.length;i++){const v=values[i];v<lo&&(lo=v),v>hi&&(hi=v)}return[lo,hi]}function sqrtStep(count,max,steps){if(count<0)return-1;if(max<=0)return 0;const ratio=Math.sqrt(count)/Math.sqrt(max);return Math.min(steps-1,Math.floor(ratio*steps))}function linearBucket(value,lo,hi,steps){const t=finiteRatio(value,lo,hi);return Math.min(steps-1,Math.floor(t*steps))}export{linearAlpha,linearBucket,minMax,sqrtStep};
1
+ import{finiteRatio}from"../../../internal/numbers.js";function linearAlpha(value,lo,hi){return .1+.9*finiteRatio(value,lo,hi)}function minMax(values){if(values.length===0)return null;let lo=values[0],hi=values[0];for(let i=1;i<values.length;i++){const v=values[i];v<lo&&(lo=v),v>hi&&(hi=v)}return[lo,hi]}function sqrtStep(count,max,steps){if(count<0)return-1;if(max<=0)return 0;const ratio=Math.sqrt(count)/Math.sqrt(max);return Math.min(steps-1,Math.floor(ratio*steps))}function linearBucket(value,lo,hi,steps){const t=finiteRatio(value,lo,hi);return Math.min(steps-1,Math.floor(t*steps))}function midpointRatio(value,lo,hi,midpoint){return!Number.isFinite(value)||!Number.isFinite(midpoint)?finiteRatio(value,lo,hi):!Number.isFinite(lo)||!Number.isFinite(hi)?finiteRatio(value,lo,hi):!(midpoint>lo)||!(midpoint<hi)?finiteRatio(value,lo,hi):value<=lo?0:value>=hi?1:value<=midpoint?.5*((value-lo)/(midpoint-lo)):.5+.5*((value-midpoint)/(hi-midpoint))}function midpointAlpha(value,lo,hi,midpoint){return .1+.9*midpointRatio(value,lo,hi,midpoint)}function midpointBucket(value,lo,hi,midpoint,steps){const t=midpointRatio(value,lo,hi,midpoint);return Math.min(steps-1,Math.floor(t*steps))}export{linearAlpha,linearBucket,midpointAlpha,midpointBucket,midpointRatio,minMax,sqrtStep};