@mastra/playground-ui 69.0.0-alpha.0 → 69.0.0-alpha.2

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 (842) hide show
  1. package/components.css +6 -0
  2. package/dist/{CodeEditor-ZoBu3Gjw.js → CodeEditor-BqAM9L7t.js} +5 -2
  3. package/dist/{CodeEditor-ZoBu3Gjw.js.map → CodeEditor-BqAM9L7t.js.map} +1 -1
  4. package/dist/{CodeEditor-DHIDfP5g.cjs → CodeEditor-zMSUzPdX.cjs} +5 -2
  5. package/dist/{CodeEditor-DHIDfP5g.cjs.map → CodeEditor-zMSUzPdX.cjs.map} +1 -1
  6. package/dist/{Comment-rQxuMDQv.cjs → Comment-A07IvOt2.cjs} +3 -3
  7. package/dist/{Comment-rQxuMDQv.cjs.map → Comment-A07IvOt2.cjs.map} +1 -1
  8. package/dist/{Comment-2q9SomE2.js → Comment-D_gSx7oM.js} +3 -3
  9. package/dist/{Comment-2q9SomE2.js.map → Comment-D_gSx7oM.js.map} +1 -1
  10. package/dist/{Composer-u1K6edoZ.cjs → Composer-D2BqRyb5.cjs} +2 -2
  11. package/dist/Composer-D2BqRyb5.cjs.map +1 -0
  12. package/dist/{Composer-bVE8qK52.js → Composer-kjwmlIgL.js} +2 -2
  13. package/dist/Composer-kjwmlIgL.js.map +1 -0
  14. package/dist/{DataCodeSection-CTodi9wg.js → DataCodeSection-CcX8Z68Y.js} +2 -2
  15. package/dist/{DataCodeSection-CTodi9wg.js.map → DataCodeSection-CcX8Z68Y.js.map} +1 -1
  16. package/dist/{DataCodeSection-7SvRJj6f.cjs → DataCodeSection-JPGTWLcL.cjs} +2 -2
  17. package/dist/{DataCodeSection-7SvRJj6f.cjs.map → DataCodeSection-JPGTWLcL.cjs.map} +1 -1
  18. package/dist/{DataDetailsPanel-BDoD6pxx.cjs → DataDetailsPanel-DCMlaG7j.cjs} +2 -2
  19. package/dist/{DataDetailsPanel-BDoD6pxx.cjs.map → DataDetailsPanel-DCMlaG7j.cjs.map} +1 -1
  20. package/dist/{DataDetailsPanel-BU05psHL.js → DataDetailsPanel-mTfbbQho.js} +2 -2
  21. package/dist/{DataDetailsPanel-BU05psHL.js.map → DataDetailsPanel-mTfbbQho.js.map} +1 -1
  22. package/dist/{DataPanel-BRRAvWYQ.cjs → DataPanel-LfExjFpP.cjs} +2 -2
  23. package/dist/{DataPanel-BRRAvWYQ.cjs.map → DataPanel-LfExjFpP.cjs.map} +1 -1
  24. package/dist/{DataPanel-pVr5LVaK.js → DataPanel-Rv5Mb_pf.js} +2 -2
  25. package/dist/{DataPanel-pVr5LVaK.js.map → DataPanel-Rv5Mb_pf.js.map} +1 -1
  26. package/dist/{FilterBar-Kmn6gMgO.js → FilterBar-DgHNtsDI.js} +5 -5
  27. package/dist/FilterBar-DgHNtsDI.js.map +1 -0
  28. package/dist/{FilterBar-jBz6yaNu.cjs → FilterBar-O8SYau_Q.cjs} +5 -5
  29. package/dist/FilterBar-O8SYau_Q.cjs.map +1 -0
  30. package/dist/KnowledgePageGraph.css +1 -3
  31. package/dist/{MarkdownRenderer-CY8LGt-l.js → MarkdownRenderer-BSGb65Ze.js} +2 -2
  32. package/dist/{MarkdownRenderer-CY8LGt-l.js.map → MarkdownRenderer-BSGb65Ze.js.map} +1 -1
  33. package/dist/{MarkdownRenderer-CUYpmuPh.cjs → MarkdownRenderer-CDwlvw0Y.cjs} +2 -2
  34. package/dist/{MarkdownRenderer-CUYpmuPh.cjs.map → MarkdownRenderer-CDwlvw0Y.cjs.map} +1 -1
  35. package/dist/{MetricsCard-DojbLiEx.cjs → MetricsCard-CSJ4TsNq.cjs} +3 -3
  36. package/dist/MetricsCard-CSJ4TsNq.cjs.map +1 -0
  37. package/dist/{MetricsCard-kAqSCPPe.js → MetricsCard-D6bQfynP.js} +3 -3
  38. package/dist/MetricsCard-D6bQfynP.js.map +1 -0
  39. package/dist/{Tree-Caz4FTCU.cjs → Tree-6pubDJLQ.cjs} +4 -3
  40. package/dist/Tree-6pubDJLQ.cjs.map +1 -0
  41. package/dist/{Tree-od43gLMO.js → Tree-DpRLmis3.js} +4 -3
  42. package/dist/Tree-DpRLmis3.js.map +1 -0
  43. package/dist/{Workflow-mIbUYdv0.js → Workflow-BVVYys0W.js} +3 -3
  44. package/dist/{Workflow-mIbUYdv0.js.map → Workflow-BVVYys0W.js.map} +1 -1
  45. package/dist/{Workflow-XR5L-3cJ.cjs → Workflow-CwIjxwC6.cjs} +3 -3
  46. package/dist/{Workflow-XR5L-3cJ.cjs.map → Workflow-CwIjxwC6.cjs.map} +1 -1
  47. package/dist/{activity-ClFChYfl.js → activity-BH_eegMA.js} +2 -2
  48. package/dist/{activity-ClFChYfl.js.map → activity-BH_eegMA.js.map} +1 -1
  49. package/dist/{activity-BprmG6yH.cjs → activity-Ciolopq8.cjs} +2 -2
  50. package/dist/{activity-BprmG6yH.cjs.map → activity-Ciolopq8.cjs.map} +1 -1
  51. package/dist/{ask-user-D4ezQ6pt.js → ask-user-CqzPUD9E.js} +2 -2
  52. package/dist/{ask-user-D4ezQ6pt.js.map → ask-user-CqzPUD9E.js.map} +1 -1
  53. package/dist/{ask-user-DcnUNMM5.cjs → ask-user-DIYcPkoX.cjs} +2 -2
  54. package/dist/{ask-user-DcnUNMM5.cjs.map → ask-user-DIYcPkoX.cjs.map} +1 -1
  55. package/dist/{combobox-lbSxWRMl.js → combobox-DLdInLYm.js} +2 -2
  56. package/dist/{combobox-lbSxWRMl.js.map → combobox-DLdInLYm.js.map} +1 -1
  57. package/dist/{combobox-i723LxeC.cjs → combobox-DU2jsrGa.cjs} +2 -2
  58. package/dist/{combobox-i723LxeC.cjs.map → combobox-DU2jsrGa.cjs.map} +1 -1
  59. package/dist/{combobox-parts-BeNqgCbj.cjs → combobox-parts-C236ZHtn.cjs} +2 -2
  60. package/dist/combobox-parts-C236ZHtn.cjs.map +1 -0
  61. package/dist/{combobox-parts-C9o4UfH_.js → combobox-parts-_m3Qgmci.js} +2 -2
  62. package/dist/combobox-parts-_m3Qgmci.js.map +1 -0
  63. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  64. package/dist/components/Breadcrumb.es.js.map +1 -1
  65. package/dist/components/CodeBlock.cjs.js +1 -1
  66. package/dist/components/CodeBlock.es.js +1 -1
  67. package/dist/components/CodeEditor.cjs.js +1 -1
  68. package/dist/components/CodeEditor.es.js +1 -1
  69. package/dist/components/Combobox.cjs.js +2 -2
  70. package/dist/components/Combobox.es.js +2 -2
  71. package/dist/components/Command.cjs.js +1 -1
  72. package/dist/components/Command.cjs.js.map +1 -1
  73. package/dist/components/Command.es.js +1 -1
  74. package/dist/components/Command.es.js.map +1 -1
  75. package/dist/components/Comment.cjs.js +1 -1
  76. package/dist/components/Comment.es.js +1 -1
  77. package/dist/components/Composer.cjs.js +1 -1
  78. package/dist/components/Composer.es.js +1 -1
  79. package/dist/components/DataCodeSection.cjs.js +1 -1
  80. package/dist/components/DataCodeSection.es.js +1 -1
  81. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  82. package/dist/components/DataDetailsPanel.es.js +1 -1
  83. package/dist/components/DataList.cjs.js +1 -1
  84. package/dist/components/DataList.es.js +1 -1
  85. package/dist/components/DataPanel.cjs.js +1 -1
  86. package/dist/components/DataPanel.es.js +1 -1
  87. package/dist/components/DateTimePicker.cjs.js +1 -1
  88. package/dist/components/DateTimePicker.es.js +1 -1
  89. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  90. package/dist/components/DateTimeRangePicker.es.js +1 -1
  91. package/dist/components/DropdownMenu.cjs.js +1 -1
  92. package/dist/components/DropdownMenu.es.js +1 -1
  93. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  94. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  95. package/dist/components/FilterBar.cjs.js +3 -3
  96. package/dist/components/FilterBar.es.js +3 -3
  97. package/dist/components/FormFieldBlocks.cjs.js +1 -1
  98. package/dist/components/FormFieldBlocks.es.js +1 -1
  99. package/dist/components/Input.cjs.js +1 -1
  100. package/dist/components/Input.es.js +1 -1
  101. package/dist/components/InputGroup.cjs.js +1 -1
  102. package/dist/components/InputGroup.es.js +1 -1
  103. package/dist/components/InputNumber.cjs.js +1 -1
  104. package/dist/components/InputNumber.es.js +1 -1
  105. package/dist/components/JSONSchemaForm.cjs.js +1 -1
  106. package/dist/components/JSONSchemaForm.es.js +1 -1
  107. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  108. package/dist/components/MarkdownRenderer.es.js +1 -1
  109. package/dist/components/MetricsCard.cjs.js +1 -1
  110. package/dist/components/MetricsCard.es.js +1 -1
  111. package/dist/components/PropertyFilter.cjs.js +2 -2
  112. package/dist/components/PropertyFilter.es.js +2 -2
  113. package/dist/components/RuleBuilder.cjs.js +1 -1
  114. package/dist/components/RuleBuilder.es.js +1 -1
  115. package/dist/components/SavedViews.cjs.js +3 -3
  116. package/dist/components/SavedViews.cjs.js.map +1 -1
  117. package/dist/components/SavedViews.es.js +3 -3
  118. package/dist/components/SavedViews.es.js.map +1 -1
  119. package/dist/components/SearchInput.cjs.js +1 -1
  120. package/dist/components/SearchInput.es.js +1 -1
  121. package/dist/components/SideDialog.cjs.js +1 -1
  122. package/dist/components/SideDialog.es.js +1 -1
  123. package/dist/components/Sidebar.cjs.js +1 -1
  124. package/dist/components/Sidebar.es.js +1 -1
  125. package/dist/components/Tabs.cjs.js +2 -2
  126. package/dist/components/Tabs.es.js +2 -2
  127. package/dist/components/Textarea.cjs.js +1 -1
  128. package/dist/components/Textarea.cjs.js.map +1 -1
  129. package/dist/components/Textarea.es.js +1 -1
  130. package/dist/components/Textarea.es.js.map +1 -1
  131. package/dist/components/ThreadRail.cjs.js +2 -0
  132. package/dist/components/ThreadRail.cjs.js.map +1 -1
  133. package/dist/components/ThreadRail.es.js +2 -0
  134. package/dist/components/ThreadRail.es.js.map +1 -1
  135. package/dist/components/Tree.cjs.js +1 -1
  136. package/dist/components/Tree.es.js +1 -1
  137. package/dist/components/Workflow.cjs.js +1 -1
  138. package/dist/components/Workflow.es.js +1 -1
  139. package/dist/components/ai/activity.cjs.js +1 -1
  140. package/dist/components/ai/activity.es.js +1 -1
  141. package/dist/components/ai/ask-user.cjs.js +1 -1
  142. package/dist/components/ai/ask-user.es.js +1 -1
  143. package/dist/components/ai/plan.cjs.js +1 -1
  144. package/dist/components/ai/plan.es.js +1 -1
  145. package/dist/components/ai/tool-approval.cjs.js +1 -1
  146. package/dist/components/ai/tool-approval.es.js +1 -1
  147. package/dist/components/ai/tool-call.cjs.js +1 -1
  148. package/dist/components/ai/tool-call.es.js +1 -1
  149. package/dist/{date-time-range-picker-DdNgKD87.js → date-time-range-picker-CJyhcug7.js} +3 -3
  150. package/dist/{date-time-range-picker-DdNgKD87.js.map → date-time-range-picker-CJyhcug7.js.map} +1 -1
  151. package/dist/{date-time-range-picker-Bq-8IPtS.cjs → date-time-range-picker-Dhnuwa-U.cjs} +3 -3
  152. package/dist/{date-time-range-picker-Bq-8IPtS.cjs.map → date-time-range-picker-Dhnuwa-U.cjs.map} +1 -1
  153. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  154. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  155. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  156. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  157. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  158. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  159. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  160. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  161. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  162. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  163. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  164. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  165. package/dist/domains/chat/activity/model/activity-words.cjs.js +1 -1
  166. package/dist/domains/chat/activity/model/activity-words.es.js +1 -1
  167. package/dist/domains/chat/attachments/composer-attachment-list.cjs.js +1 -1
  168. package/dist/domains/chat/attachments/composer-attachment-list.es.js +1 -1
  169. package/dist/domains/chat/attachments/split-message-attachments.cjs.js +4 -1
  170. package/dist/domains/chat/attachments/split-message-attachments.cjs.js.map +1 -1
  171. package/dist/domains/chat/attachments/split-message-attachments.es.js +4 -1
  172. package/dist/domains/chat/attachments/split-message-attachments.es.js.map +1 -1
  173. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  174. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  175. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
  176. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
  177. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +1 -1
  178. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +1 -1
  179. package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
  180. package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
  181. package/dist/domains/chat/messages/message-row.cjs.js +2 -2
  182. package/dist/domains/chat/messages/message-row.es.js +2 -2
  183. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  184. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  185. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  186. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  187. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  188. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  189. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  190. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  191. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  192. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  193. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  194. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  195. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  196. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  197. package/dist/domains/chat/messages/tripwire-notice.cjs.js +5 -10
  198. package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
  199. package/dist/domains/chat/messages/tripwire-notice.es.js +5 -10
  200. package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
  201. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  202. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  203. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  204. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  205. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  206. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  207. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +1 -1
  208. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +1 -1
  209. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
  210. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
  211. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
  212. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
  213. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +2 -2
  214. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +2 -2
  215. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  216. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  217. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  218. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  219. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  220. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  221. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
  222. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
  223. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  224. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  225. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +2 -2
  226. package/dist/domains/chat/tools/badges/tool-badge.es.js +2 -2
  227. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
  228. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
  229. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +2 -2
  230. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +2 -2
  231. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  232. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  233. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  234. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  235. package/dist/domains/dashboards/components/connected-widget.cjs.js +55 -0
  236. package/dist/domains/dashboards/components/connected-widget.cjs.js.map +1 -0
  237. package/dist/domains/dashboards/components/connected-widget.d.ts +1 -0
  238. package/dist/domains/dashboards/components/connected-widget.es.js +54 -0
  239. package/dist/domains/dashboards/components/connected-widget.es.js.map +1 -0
  240. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +13 -8
  241. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  242. package/dist/domains/dashboards/components/dashboard-renderer.es.js +13 -8
  243. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  244. package/dist/domains/dashboards/components/stateless-widget.cjs.js +30 -0
  245. package/dist/domains/dashboards/components/stateless-widget.cjs.js.map +1 -0
  246. package/dist/domains/dashboards/components/stateless-widget.d.ts +1 -0
  247. package/dist/domains/dashboards/components/stateless-widget.es.js +29 -0
  248. package/dist/domains/dashboards/components/stateless-widget.es.js.map +1 -0
  249. package/dist/domains/dashboards/components/view-gate.cjs.js +18 -40
  250. package/dist/domains/dashboards/components/view-gate.cjs.js.map +1 -1
  251. package/dist/domains/dashboards/components/view-gate.es.js +18 -40
  252. package/dist/domains/dashboards/components/view-gate.es.js.map +1 -1
  253. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  254. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  255. package/dist/domains/dashboards/components/widget-controls.cjs.js +106 -0
  256. package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -1
  257. package/dist/domains/dashboards/components/widget-controls.es.js +107 -3
  258. package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -1
  259. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  260. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  261. package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js +55 -0
  262. package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js.map +1 -0
  263. package/dist/domains/dashboards/hooks/use-dashboard-environment.d.ts +1 -0
  264. package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js +53 -0
  265. package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js.map +1 -0
  266. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js +24 -0
  267. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js.map +1 -1
  268. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js +23 -1
  269. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js.map +1 -1
  270. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +10 -6
  271. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  272. package/dist/domains/dashboards/hooks/use-widget-views.es.js +10 -7
  273. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  274. package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js +11 -0
  275. package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js.map +1 -0
  276. package/dist/domains/dashboards/kinds/kpis/kpis-plan.d.ts +1 -0
  277. package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js +9 -0
  278. package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js.map +1 -0
  279. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +18 -19
  280. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -1
  281. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +18 -19
  282. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -1
  283. package/dist/domains/dashboards/kinds/kpis.cjs.js +3 -0
  284. package/dist/domains/dashboards/kinds/kpis.cjs.js.map +1 -1
  285. package/dist/domains/dashboards/kinds/kpis.es.js +3 -0
  286. package/dist/domains/dashboards/kinds/kpis.es.js.map +1 -1
  287. package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js +27 -0
  288. package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js.map +1 -0
  289. package/dist/domains/dashboards/kinds/scores/scores-plan.d.ts +1 -0
  290. package/dist/domains/dashboards/kinds/scores/scores-plan.es.js +24 -0
  291. package/dist/domains/dashboards/kinds/scores/scores-plan.es.js.map +1 -0
  292. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +25 -32
  293. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  294. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +26 -33
  295. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  296. package/dist/domains/dashboards/kinds/scores.cjs.js +4 -0
  297. package/dist/domains/dashboards/kinds/scores.cjs.js.map +1 -1
  298. package/dist/domains/dashboards/kinds/scores.es.js +4 -0
  299. package/dist/domains/dashboards/kinds/scores.es.js.map +1 -1
  300. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +2 -6
  301. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js.map +1 -1
  302. package/dist/domains/dashboards/kinds/table/table-cells.es.js +2 -6
  303. package/dist/domains/dashboards/kinds/table/table-cells.es.js.map +1 -1
  304. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js +5 -3
  305. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js.map +1 -1
  306. package/dist/domains/dashboards/kinds/table/table-columns.es.js +5 -3
  307. package/dist/domains/dashboards/kinds/table/table-columns.es.js.map +1 -1
  308. package/dist/domains/dashboards/kinds/table/table-plan.cjs.js +47 -0
  309. package/dist/domains/dashboards/kinds/table/table-plan.cjs.js.map +1 -0
  310. package/dist/domains/dashboards/kinds/table/table-plan.d.ts +1 -0
  311. package/dist/domains/dashboards/kinds/table/table-plan.es.js +44 -0
  312. package/dist/domains/dashboards/kinds/table/table-plan.es.js.map +1 -0
  313. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +20 -26
  314. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -1
  315. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +22 -28
  316. package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -1
  317. package/dist/domains/dashboards/kinds/table/table-view.cjs.js +13 -13
  318. package/dist/domains/dashboards/kinds/table/table-view.cjs.js.map +1 -1
  319. package/dist/domains/dashboards/kinds/table/table-view.es.js +14 -14
  320. package/dist/domains/dashboards/kinds/table/table-view.es.js.map +1 -1
  321. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +13 -17
  322. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -1
  323. package/dist/domains/dashboards/kinds/table/table-widget.es.js +13 -17
  324. package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -1
  325. package/dist/domains/dashboards/kinds/table.cjs.js +4 -0
  326. package/dist/domains/dashboards/kinds/table.cjs.js.map +1 -1
  327. package/dist/domains/dashboards/kinds/table.es.js +4 -0
  328. package/dist/domains/dashboards/kinds/table.es.js.map +1 -1
  329. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js +18 -0
  330. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js.map +1 -0
  331. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +1 -0
  332. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js +16 -0
  333. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js.map +1 -0
  334. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +22 -22
  335. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  336. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +25 -25
  337. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  338. package/dist/domains/dashboards/kinds/timeseries.cjs.js +3 -0
  339. package/dist/domains/dashboards/kinds/timeseries.cjs.js.map +1 -1
  340. package/dist/domains/dashboards/kinds/timeseries.es.js +3 -0
  341. package/dist/domains/dashboards/kinds/timeseries.es.js.map +1 -1
  342. package/dist/domains/dashboards/lib/alert-actions.cjs.js +123 -0
  343. package/dist/domains/dashboards/lib/alert-actions.cjs.js.map +1 -0
  344. package/dist/domains/dashboards/lib/alert-actions.d.ts +1 -0
  345. package/dist/domains/dashboards/lib/alert-actions.es.js +118 -0
  346. package/dist/domains/dashboards/lib/alert-actions.es.js.map +1 -0
  347. package/dist/domains/dashboards/lib/gate.cjs.js +62 -0
  348. package/dist/domains/dashboards/lib/gate.cjs.js.map +1 -0
  349. package/dist/domains/dashboards/lib/gate.d.ts +1 -0
  350. package/dist/domains/dashboards/lib/gate.es.js +60 -0
  351. package/dist/domains/dashboards/lib/gate.es.js.map +1 -0
  352. package/dist/domains/dashboards/lib/plan-widget.cjs.js +41 -0
  353. package/dist/domains/dashboards/lib/plan-widget.cjs.js.map +1 -0
  354. package/dist/domains/dashboards/lib/plan-widget.d.ts +1 -0
  355. package/dist/domains/dashboards/lib/plan-widget.es.js +38 -0
  356. package/dist/domains/dashboards/lib/plan-widget.es.js.map +1 -0
  357. package/dist/domains/dashboards/lib/requests.cjs.js +47 -0
  358. package/dist/domains/dashboards/lib/requests.cjs.js.map +1 -1
  359. package/dist/domains/dashboards/lib/requests.es.js +46 -1
  360. package/dist/domains/dashboards/lib/requests.es.js.map +1 -1
  361. package/dist/domains/dashboards/lib/scores.cjs.js +32 -0
  362. package/dist/domains/dashboards/lib/scores.cjs.js.map +1 -1
  363. package/dist/domains/dashboards/lib/scores.es.js +31 -1
  364. package/dist/domains/dashboards/lib/scores.es.js.map +1 -1
  365. package/dist/domains/dashboards/lib/timeseries.cjs.js +17 -0
  366. package/dist/domains/dashboards/lib/timeseries.cjs.js.map +1 -1
  367. package/dist/domains/dashboards/lib/timeseries.es.js +17 -1
  368. package/dist/domains/dashboards/lib/timeseries.es.js.map +1 -1
  369. package/dist/domains/dashboards/lib/values.cjs.js.map +1 -1
  370. package/dist/domains/dashboards/lib/values.es.js.map +1 -1
  371. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  372. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  373. package/dist/domains/dashboards.cjs.js +19 -2
  374. package/dist/domains/dashboards.es.js +9 -5
  375. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +1 -1
  376. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +1 -1
  377. package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.cjs.js +2 -2
  378. package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +2 -2
  379. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +2 -2
  380. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +2 -2
  381. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +186 -212
  382. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  383. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +188 -215
  384. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  385. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +620 -268
  386. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  387. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +622 -270
  388. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  389. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +544 -454
  390. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  391. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +548 -458
  392. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  393. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +21 -12
  394. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  395. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +22 -13
  396. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  397. package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js +16 -0
  398. package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js.map +1 -0
  399. package/dist/domains/knowledge/components/KnowledgeSourceIcon.d.ts +1 -0
  400. package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js +15 -0
  401. package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js.map +1 -0
  402. package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js +10 -0
  403. package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js.map +1 -0
  404. package/dist/domains/knowledge/components/KnowledgeTooltip.d.ts +1 -0
  405. package/dist/domains/knowledge/components/KnowledgeTooltip.es.js +9 -0
  406. package/dist/domains/knowledge/components/KnowledgeTooltip.es.js.map +1 -0
  407. package/dist/domains/knowledge/lib/fitViewport.cjs.js +22 -8
  408. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -1
  409. package/dist/domains/knowledge/lib/fitViewport.es.js +22 -9
  410. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -1
  411. package/dist/domains/knowledge/lib/pageAddress.cjs.js +51 -0
  412. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -1
  413. package/dist/domains/knowledge/lib/pageAddress.es.js +50 -1
  414. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -1
  415. package/dist/domains/knowledge/lib/pageRefs.cjs.js +43 -2
  416. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -1
  417. package/dist/domains/knowledge/lib/pageRefs.es.js +43 -3
  418. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -1
  419. package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js +10 -0
  420. package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js.map +1 -0
  421. package/dist/domains/knowledge/lib/pagesByRefContext.d.ts +1 -0
  422. package/dist/domains/knowledge/lib/pagesByRefContext.es.js +10 -0
  423. package/dist/domains/knowledge/lib/pagesByRefContext.es.js.map +1 -0
  424. package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
  425. package/dist/domains/logs/components/log-data-panel.es.js +1 -1
  426. package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
  427. package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
  428. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  429. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  430. package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js +28 -3
  431. package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js.map +1 -1
  432. package/dist/domains/mcps/components/mcp-app-tool-result.es.js +27 -2
  433. package/dist/domains/mcps/components/mcp-app-tool-result.es.js.map +1 -1
  434. package/dist/domains/mcps/components/mcp-app-viewer.cjs.js +163 -2
  435. package/dist/domains/mcps/components/mcp-app-viewer.cjs.js.map +1 -0
  436. package/dist/domains/mcps/components/mcp-app-viewer.es.js +163 -1
  437. package/dist/domains/mcps/components/mcp-app-viewer.es.js.map +1 -0
  438. package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js +11 -0
  439. package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js.map +1 -0
  440. package/dist/domains/mcps/context/mcp-app-host-context-value.d.ts +1 -0
  441. package/dist/domains/mcps/context/mcp-app-host-context-value.es.js +9 -0
  442. package/dist/domains/mcps/context/mcp-app-host-context-value.es.js.map +1 -0
  443. package/dist/domains/mcps/context/mcp-app-host-context.cjs.js +14 -0
  444. package/dist/domains/mcps/context/mcp-app-host-context.cjs.js.map +1 -0
  445. package/dist/domains/mcps/context/mcp-app-host-context.d.ts +1 -0
  446. package/dist/domains/mcps/context/mcp-app-host-context.es.js +13 -0
  447. package/dist/domains/mcps/context/mcp-app-host-context.es.js.map +1 -0
  448. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js +2 -1
  449. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js.map +1 -1
  450. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js +2 -1
  451. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js.map +1 -1
  452. package/dist/domains/mcps.cjs.js +5 -0
  453. package/dist/domains/mcps.d.ts +1 -0
  454. package/dist/domains/mcps.es.js +3 -0
  455. package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
  456. package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
  457. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  458. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  459. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  460. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  461. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  462. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  463. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  464. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  465. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  466. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  467. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  468. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  469. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +1 -1
  470. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +1 -1
  471. package/dist/domains/metrics/components/failure-rate-card.cjs.js +1 -1
  472. package/dist/domains/metrics/components/failure-rate-card.es.js +1 -1
  473. package/dist/domains/metrics/components/latency-card.cjs.js +1 -1
  474. package/dist/domains/metrics/components/latency-card.es.js +1 -1
  475. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  476. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  477. package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
  478. package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
  479. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  480. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  481. package/dist/domains/metrics.cjs.js +3 -3
  482. package/dist/domains/metrics.es.js +3 -3
  483. package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
  484. package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
  485. package/dist/domains/observability/saved-views.cjs.js +1 -1
  486. package/dist/domains/observability/saved-views.es.js +1 -1
  487. package/dist/domains/observability.cjs.js +1 -1
  488. package/dist/domains/observability.es.js +1 -1
  489. package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
  490. package/dist/domains/scores/components/score-data-panel.es.js +1 -1
  491. package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
  492. package/dist/domains/scores/components/span-scoring.es.js +1 -1
  493. package/dist/domains/scores/components/trace-scores-list.cjs.js +1 -1
  494. package/dist/domains/scores/components/trace-scores-list.es.js +1 -1
  495. package/dist/domains/skills/skill-simple-form.cjs.js +3 -3
  496. package/dist/domains/skills/skill-simple-form.es.js +3 -3
  497. package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
  498. package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
  499. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  500. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  501. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  502. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  503. package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
  504. package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
  505. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  506. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  507. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  508. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  509. package/dist/domains/traces/components/feedback-options.cjs.js +0 -0
  510. package/dist/domains/traces/components/feedback-options.d.ts +1 -0
  511. package/dist/domains/traces/components/feedback-options.es.js +0 -0
  512. package/dist/domains/traces/components/feedback-thread.cjs.js +10 -4
  513. package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
  514. package/dist/domains/traces/components/feedback-thread.es.js +10 -4
  515. package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
  516. package/dist/domains/traces/components/span-data-panel-view.cjs.js +2 -2
  517. package/dist/domains/traces/components/span-data-panel-view.es.js +2 -2
  518. package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
  519. package/dist/domains/traces/components/span-details-view.es.js +1 -1
  520. package/dist/domains/traces/components/span-feedback-tab.cjs.js +8 -5
  521. package/dist/domains/traces/components/span-feedback-tab.cjs.js.map +1 -1
  522. package/dist/domains/traces/components/span-feedback-tab.es.js +8 -5
  523. package/dist/domains/traces/components/span-feedback-tab.es.js.map +1 -1
  524. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  525. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  526. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  527. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  528. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  529. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  530. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
  531. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
  532. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  533. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  534. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  535. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  536. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  537. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  538. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  539. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  540. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  541. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  542. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  543. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  544. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  545. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  546. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  547. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  548. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +2 -2
  549. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +2 -2
  550. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  551. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  552. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +5 -3
  553. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  554. package/dist/domains/traces/components/thread-view-by-trace.es.js +5 -3
  555. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  556. package/dist/domains/traces/components/trace-columns-menu.cjs.js +2 -2
  557. package/dist/domains/traces/components/trace-columns-menu.es.js +2 -2
  558. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  559. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  560. package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
  561. package/dist/domains/traces/components/trace-details-view.es.js +1 -1
  562. package/dist/domains/traces/components/trace-feedback-tab.cjs.js +9 -4
  563. package/dist/domains/traces/components/trace-feedback-tab.cjs.js.map +1 -1
  564. package/dist/domains/traces/components/trace-feedback-tab.es.js +9 -4
  565. package/dist/domains/traces/components/trace-feedback-tab.es.js.map +1 -1
  566. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  567. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  568. package/dist/domains/traces/components/trace-span-panel.cjs.js +2 -1
  569. package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
  570. package/dist/domains/traces/components/trace-span-panel.es.js +2 -1
  571. package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
  572. package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
  573. package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
  574. package/dist/domains/traces/components/trace-thread-panel.cjs.js +3 -2
  575. package/dist/domains/traces/components/trace-thread-panel.cjs.js.map +1 -1
  576. package/dist/domains/traces/components/trace-thread-panel.es.js +3 -2
  577. package/dist/domains/traces/components/trace-thread-panel.es.js.map +1 -1
  578. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
  579. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
  580. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  581. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  582. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +8 -3
  583. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
  584. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +8 -3
  585. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
  586. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +14 -1
  587. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
  588. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +14 -1
  589. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
  590. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
  591. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
  592. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  593. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  594. package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
  595. package/dist/domains/traces/components/traces-explorer.es.js.map +1 -1
  596. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  597. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  598. package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
  599. package/dist/domains/traces/components/traces-list-view.es.js +1 -1
  600. package/dist/domains/traces/components/traces-spans-switch.cjs.js +1 -1
  601. package/dist/domains/traces/components/traces-spans-switch.es.js +1 -1
  602. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  603. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  604. package/dist/domains/workflows/components/workflow-layout.cjs.js +1 -1
  605. package/dist/domains/workflows/components/workflow-layout.es.js +1 -1
  606. package/dist/domains/workflows/components/workflow-step-detail.cjs.js +2 -2
  607. package/dist/domains/workflows/components/workflow-step-detail.es.js +2 -2
  608. package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
  609. package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
  610. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +1 -1
  611. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +1 -1
  612. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
  613. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
  614. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
  615. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
  616. package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
  617. package/dist/domains/workflows/workflow/utils.es.js +1 -1
  618. package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
  619. package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
  620. package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
  621. package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
  622. package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
  623. package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
  624. package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
  625. package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
  626. package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
  627. package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
  628. package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
  629. package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
  630. package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
  631. package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
  632. package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +1 -1
  633. package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
  634. package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
  635. package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
  636. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +3 -3
  637. package/dist/domains/workflows/workflow/workflow-run-data.es.js +3 -3
  638. package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
  639. package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
  640. package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +1 -1
  641. package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
  642. package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
  643. package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
  644. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +1 -1
  645. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
  646. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
  647. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
  648. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  649. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  650. package/dist/domains/workspace/components/workspace-create-directory.cjs.js +1 -1
  651. package/dist/domains/workspace/components/workspace-create-directory.es.js +1 -1
  652. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  653. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  654. package/dist/domains/workspace/components/workspace-search.cjs.js +1 -1
  655. package/dist/domains/workspace/components/workspace-search.es.js +1 -1
  656. package/dist/domains/workspace/components/workspace-tree.cjs.js +1 -1
  657. package/dist/domains/workspace/components/workspace-tree.es.js +1 -1
  658. package/dist/{dropdown-menu-Dx-jCOIv.cjs → dropdown-menu-D3D8USIY.cjs} +9 -1
  659. package/dist/dropdown-menu-D3D8USIY.cjs.map +1 -0
  660. package/dist/{dropdown-menu-DKoWI8kD.js → dropdown-menu-jsf9D-J_.js} +9 -1
  661. package/dist/dropdown-menu-jsf9D-J_.js.map +1 -0
  662. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  663. package/dist/ee/signals/sankey-signals.es.js +1 -1
  664. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
  665. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
  666. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
  667. package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
  668. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  669. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  670. package/dist/{filter-bar-chip-NBtfDca9.js → filter-bar-chip-Cz5GYBWP.js} +2 -2
  671. package/dist/{filter-bar-chip-NBtfDca9.js.map → filter-bar-chip-Cz5GYBWP.js.map} +1 -1
  672. package/dist/{filter-bar-chip-DFsbUZ-V.cjs → filter-bar-chip-q2Zr-cnY.cjs} +2 -2
  673. package/dist/{filter-bar-chip-DFsbUZ-V.cjs.map → filter-bar-chip-q2Zr-cnY.cjs.map} +1 -1
  674. package/dist/{filter-bar-time-range-DlVNjw43.cjs → filter-bar-time-range-D4C3kU0J.cjs} +3 -3
  675. package/dist/{filter-bar-time-range-DlVNjw43.cjs.map → filter-bar-time-range-D4C3kU0J.cjs.map} +1 -1
  676. package/dist/{filter-bar-time-range-D9SnzR2J.js → filter-bar-time-range-ao2YiYEJ.js} +3 -3
  677. package/dist/{filter-bar-time-range-D9SnzR2J.js.map → filter-bar-time-range-ao2YiYEJ.js.map} +1 -1
  678. package/dist/icons/ConfluenceIcon.cjs.js +18 -0
  679. package/dist/icons/ConfluenceIcon.cjs.js.map +1 -0
  680. package/dist/icons/ConfluenceIcon.d.ts +1 -0
  681. package/dist/icons/ConfluenceIcon.es.js +15 -0
  682. package/dist/icons/ConfluenceIcon.es.js.map +1 -0
  683. package/dist/icons/NotionIcon.cjs.js +18 -0
  684. package/dist/icons/NotionIcon.cjs.js.map +1 -0
  685. package/dist/icons/NotionIcon.d.ts +1 -0
  686. package/dist/icons/NotionIcon.es.js +15 -0
  687. package/dist/icons/NotionIcon.es.js.map +1 -0
  688. package/dist/icons/ZendeskIcon.cjs.js +18 -0
  689. package/dist/icons/ZendeskIcon.cjs.js.map +1 -0
  690. package/dist/icons/ZendeskIcon.d.ts +1 -0
  691. package/dist/icons/ZendeskIcon.es.js +15 -0
  692. package/dist/icons/ZendeskIcon.es.js.map +1 -0
  693. package/dist/{input-Cyit5ZSc.js → input-BNykbvOz.js} +2 -2
  694. package/dist/input-BNykbvOz.js.map +1 -0
  695. package/dist/{input-BpnUsQSt.cjs → input-D_V0m95F.cjs} +2 -2
  696. package/dist/input-D_V0m95F.cjs.map +1 -0
  697. package/dist/{input-group-NV4ZzKOk.js → input-group-CCSyY4J5.js} +3 -3
  698. package/dist/{input-group-NV4ZzKOk.js.map → input-group-CCSyY4J5.js.map} +1 -1
  699. package/dist/{input-group-DBCilXjT.cjs → input-group-Da8HBo30.cjs} +3 -3
  700. package/dist/{input-group-DBCilXjT.cjs.map → input-group-Da8HBo30.cjs.map} +1 -1
  701. package/dist/layout/tabbed-container.cjs.js +1 -1
  702. package/dist/layout/tabbed-container.es.js +1 -1
  703. package/dist/lib/form/components/number-field.cjs.js +1 -1
  704. package/dist/lib/form/components/number-field.es.js +1 -1
  705. package/dist/lib/form/components/record-field.cjs.js +1 -1
  706. package/dist/lib/form/components/record-field.es.js +1 -1
  707. package/dist/{observability-saved-views-DgABvgat.cjs → observability-saved-views-CzRPN_9m.cjs} +4 -4
  708. package/dist/{observability-saved-views-DgABvgat.cjs.map → observability-saved-views-CzRPN_9m.cjs.map} +1 -1
  709. package/dist/{observability-saved-views-Ch53fh5_.js → observability-saved-views-hu_hkXVY.js} +4 -4
  710. package/dist/{observability-saved-views-Ch53fh5_.js.map → observability-saved-views-hu_hkXVY.js.map} +1 -1
  711. package/dist/primitives/menu-item.cjs.js +1 -1
  712. package/dist/primitives/menu-item.cjs.js.map +1 -1
  713. package/dist/primitives/menu-item.es.js +1 -1
  714. package/dist/primitives/menu-item.es.js.map +1 -1
  715. package/dist/{property-filter-applied-DuyL4S_K.cjs → property-filter-applied-ML84st6J.cjs} +3 -3
  716. package/dist/{property-filter-applied-DuyL4S_K.cjs.map → property-filter-applied-ML84st6J.cjs.map} +1 -1
  717. package/dist/{property-filter-applied-DoxQHG09.js → property-filter-applied-PaJ7sLsM.js} +3 -3
  718. package/dist/{property-filter-applied-DoxQHG09.js.map → property-filter-applied-PaJ7sLsM.js.map} +1 -1
  719. package/dist/{span-payload-primitives-D2NWznGy.cjs → span-payload-primitives-CL3hlirm.cjs} +3 -3
  720. package/dist/{span-payload-primitives-D2NWznGy.cjs.map → span-payload-primitives-CL3hlirm.cjs.map} +1 -1
  721. package/dist/{span-payload-primitives-BKkRpVVO.js → span-payload-primitives-KxqoXspn.js} +3 -3
  722. package/dist/{span-payload-primitives-BKkRpVVO.js.map → span-payload-primitives-KxqoXspn.js.map} +1 -1
  723. package/dist/src/domains/dashboards/components/connected-widget.d.ts +9 -0
  724. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +9 -2
  725. package/dist/src/domains/dashboards/components/stateless-widget.d.ts +40 -0
  726. package/dist/src/domains/dashboards/components/view-gate.d.ts +2 -10
  727. package/dist/src/domains/dashboards/components/widget-controls.d.ts +25 -1
  728. package/dist/src/domains/dashboards/hooks/use-dashboard-environment.d.ts +8 -0
  729. package/dist/src/domains/dashboards/hooks/use-dashboard-requests.d.ts +11 -1
  730. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +8 -2
  731. package/dist/src/domains/dashboards/index.d.ts +14 -6
  732. package/dist/src/domains/dashboards/kinds/kpis/kpis-plan.d.ts +355 -0
  733. package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -1
  734. package/dist/src/domains/dashboards/kinds/scores/scores-plan.d.ts +358 -0
  735. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  736. package/dist/src/domains/dashboards/kinds/table/table-cells.d.ts +6 -2
  737. package/dist/src/domains/dashboards/kinds/table/table-columns.d.ts +2 -1
  738. package/dist/src/domains/dashboards/kinds/table/table-plan.d.ts +18 -0
  739. package/dist/src/domains/dashboards/kinds/table/table-tabs.d.ts +1 -1
  740. package/dist/src/domains/dashboards/kinds/table/table-view.d.ts +1 -0
  741. package/dist/src/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +355 -0
  742. package/dist/src/domains/dashboards/lib/alert-actions.d.ts +36 -0
  743. package/dist/src/domains/dashboards/lib/gate.d.ts +65 -0
  744. package/dist/src/domains/dashboards/lib/plan-widget.d.ts +390 -0
  745. package/dist/src/domains/dashboards/lib/requests.d.ts +22 -0
  746. package/dist/src/domains/dashboards/lib/scores.d.ts +11 -1
  747. package/dist/src/domains/dashboards/lib/timeseries.d.ts +6 -1
  748. package/dist/src/domains/dashboards/lib/values.d.ts +5 -0
  749. package/dist/src/domains/dashboards/widget-kind.d.ts +105 -2
  750. package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +7 -1
  751. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +4 -1
  752. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +3 -0
  753. package/dist/src/domains/knowledge/components/KnowledgeSourceIcon.d.ts +5 -0
  754. package/dist/src/domains/knowledge/components/KnowledgeTooltip.d.ts +5 -0
  755. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +9 -2
  756. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +10 -0
  757. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +12 -1
  758. package/dist/src/domains/knowledge/lib/pagesByRefContext.d.ts +6 -0
  759. package/dist/src/domains/mcps/components/mcp-app-tool-result.d.ts +3 -1
  760. package/dist/src/domains/mcps/components/mcp-app-viewer.d.ts +6 -1
  761. package/dist/src/domains/mcps/context/mcp-app-host-context-value.d.ts +23 -0
  762. package/dist/src/domains/mcps/context/mcp-app-host-context.d.ts +7 -0
  763. package/dist/src/domains/mcps/index.d.ts +3 -0
  764. package/dist/src/domains/traces/components/feedback-options.d.ts +8 -0
  765. package/dist/src/domains/traces/components/feedback-thread.d.ts +2 -1
  766. package/dist/src/domains/traces/components/span-feedback-tab.d.ts +4 -2
  767. package/dist/src/domains/traces/components/thread-view-by-trace.d.ts +4 -1
  768. package/dist/src/domains/traces/components/trace-feedback-tab.d.ts +4 -2
  769. package/dist/src/domains/traces/components/trace-span-panel.d.ts +3 -1
  770. package/dist/src/domains/traces/components/trace-thread-panel.d.ts +3 -1
  771. package/dist/src/domains/traces/components/traces-explorer/index.d.ts +1 -0
  772. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
  773. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-root.d.ts +4 -1
  774. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -0
  775. package/dist/src/ds/components/DropdownMenu/dropdown-menu.d.ts +3 -0
  776. package/dist/src/ds/components/Tree/tree-label.d.ts +1 -1
  777. package/dist/src/ds/icons/ConfluenceIcon.d.ts +2 -0
  778. package/dist/src/ds/icons/NotionIcon.d.ts +2 -0
  779. package/dist/src/ds/icons/ZendeskIcon.d.ts +2 -0
  780. package/dist/src/ds/icons/index.d.ts +3 -0
  781. package/dist/src/utils/mcp-app-context.d.ts +6 -0
  782. package/dist/style.css +85 -35
  783. package/dist/{tabbed-container-Bhfi-DWr.cjs → tabbed-container-BMLD6mvc.cjs} +4 -4
  784. package/dist/{tabbed-container-Bhfi-DWr.cjs.map → tabbed-container-BMLD6mvc.cjs.map} +1 -1
  785. package/dist/{tabbed-container-DOkHshha.js → tabbed-container-CaS8cZCS.js} +4 -4
  786. package/dist/{tabbed-container-DOkHshha.js.map → tabbed-container-CaS8cZCS.js.map} +1 -1
  787. package/dist/{tabs-content-DwU_eA-a.js → tabs-content-BGkPZ5EQ.js} +2 -2
  788. package/dist/{tabs-content-DwU_eA-a.js.map → tabs-content-BGkPZ5EQ.js.map} +1 -1
  789. package/dist/{tabs-content-BACwMrMG.cjs → tabs-content-D_ic2ZqI.cjs} +2 -2
  790. package/dist/{tabs-content-BACwMrMG.cjs.map → tabs-content-D_ic2ZqI.cjs.map} +1 -1
  791. package/dist/{tabs-tab-BHs639jL.js → tabs-tab-CJVS0WED.js} +2 -2
  792. package/dist/{tabs-tab-BHs639jL.js.map → tabs-tab-CJVS0WED.js.map} +1 -1
  793. package/dist/{tabs-tab-CANh2eAD.cjs → tabs-tab-Dj2huH5T.cjs} +2 -2
  794. package/dist/{tabs-tab-CANh2eAD.cjs.map → tabs-tab-Dj2huH5T.cjs.map} +1 -1
  795. package/dist/{tool-approval-CguPaikn.cjs → tool-approval-C4WNL8VD.cjs} +3 -3
  796. package/dist/{tool-approval-CguPaikn.cjs.map → tool-approval-C4WNL8VD.cjs.map} +1 -1
  797. package/dist/{tool-approval-Cjz0yAzw.js → tool-approval-ZfL3-Vvi.js} +3 -3
  798. package/dist/{tool-approval-Cjz0yAzw.js.map → tool-approval-ZfL3-Vvi.js.map} +1 -1
  799. package/dist/{tool-call-ChJKYCfu.js → tool-call-BLzYTI-x.js} +2 -2
  800. package/dist/{tool-call-ChJKYCfu.js.map → tool-call-BLzYTI-x.js.map} +1 -1
  801. package/dist/{tool-call-BqDI9mrY.cjs → tool-call-C4TBpJ6Y.cjs} +2 -2
  802. package/dist/{tool-call-BqDI9mrY.cjs.map → tool-call-C4TBpJ6Y.cjs.map} +1 -1
  803. package/dist/{tool-card-GSiCfxMz.js → tool-card-CM0aHG3p.js} +4 -3
  804. package/dist/{tool-card-GSiCfxMz.js.map → tool-card-CM0aHG3p.js.map} +1 -1
  805. package/dist/{tool-card-Dg4VOYV6.cjs → tool-card-xDlCD0m6.cjs} +4 -3
  806. package/dist/{tool-card-Dg4VOYV6.cjs.map → tool-card-xDlCD0m6.cjs.map} +1 -1
  807. package/dist/{mcp-app-viewer-BV7FI498.js → types-BwdKiX24.js} +2 -144
  808. package/dist/types-BwdKiX24.js.map +1 -0
  809. package/dist/{mcp-app-viewer-M3-pqAlo.cjs → types-KjLUPShK.cjs} +8 -144
  810. package/dist/types-KjLUPShK.cjs.map +1 -0
  811. package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs → use-workflow-graph-runtime-DEJA9rk4.cjs} +2 -2
  812. package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs.map → use-workflow-graph-runtime-DEJA9rk4.cjs.map} +1 -1
  813. package/dist/{use-workflow-graph-runtime-B3VUuhUE.js → use-workflow-graph-runtime-DHOsA1DM.js} +2 -2
  814. package/dist/{use-workflow-graph-runtime-B3VUuhUE.js.map → use-workflow-graph-runtime-DHOsA1DM.js.map} +1 -1
  815. package/dist/utils/mcp-app-context.cjs.js +17 -0
  816. package/dist/utils/mcp-app-context.cjs.js.map +1 -0
  817. package/dist/utils/mcp-app-context.d.ts +1 -0
  818. package/dist/utils/mcp-app-context.es.js +15 -0
  819. package/dist/utils/mcp-app-context.es.js.map +1 -0
  820. package/package.json +8 -8
  821. package/dist/Composer-bVE8qK52.js.map +0 -1
  822. package/dist/Composer-u1K6edoZ.cjs.map +0 -1
  823. package/dist/FilterBar-Kmn6gMgO.js.map +0 -1
  824. package/dist/FilterBar-jBz6yaNu.cjs.map +0 -1
  825. package/dist/MetricsCard-DojbLiEx.cjs.map +0 -1
  826. package/dist/MetricsCard-kAqSCPPe.js.map +0 -1
  827. package/dist/Tree-Caz4FTCU.cjs.map +0 -1
  828. package/dist/Tree-od43gLMO.js.map +0 -1
  829. package/dist/combobox-parts-BeNqgCbj.cjs.map +0 -1
  830. package/dist/combobox-parts-C9o4UfH_.js.map +0 -1
  831. package/dist/domains/dashboards/hooks/use-scorers.cjs.js +0 -41
  832. package/dist/domains/dashboards/hooks/use-scorers.cjs.js.map +0 -1
  833. package/dist/domains/dashboards/hooks/use-scorers.d.ts +0 -1
  834. package/dist/domains/dashboards/hooks/use-scorers.es.js +0 -40
  835. package/dist/domains/dashboards/hooks/use-scorers.es.js.map +0 -1
  836. package/dist/dropdown-menu-DKoWI8kD.js.map +0 -1
  837. package/dist/dropdown-menu-Dx-jCOIv.cjs.map +0 -1
  838. package/dist/input-BpnUsQSt.cjs.map +0 -1
  839. package/dist/input-Cyit5ZSc.js.map +0 -1
  840. package/dist/mcp-app-viewer-BV7FI498.js.map +0 -1
  841. package/dist/mcp-app-viewer-M3-pqAlo.cjs.map +0 -1
  842. package/dist/src/domains/dashboards/hooks/use-scorers.d.ts +0 -66
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgePageTree.cjs.js","names":["useMemo","buildPageTree","useState","useRef","pageAncestorIds","visiblePageRows","prefersMotion","Fragment","cn","ChevronRight","childCountLabel","Pin"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageTree.tsx"],"sourcesContent":["import { ChevronRight, Pin } from 'lucide-react';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { buildPageTree, childCountLabel, pageAncestorIds, visiblePageRows } from '../lib/pageTree';\nimport { prefersMotion } from '../lib/useLeavingNodes';\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nimport { cn } from '@/utils/cn';\n\n/**\n * The box of the nearest ancestor (or the element itself) that really scrolls vertically. The tree sets\n * `overflow-y: auto` itself but, as tall as its rows, never overflows; a parent is what scrolls, so a\n * node counts only when its content is taller than it is.\n */\nfunction scrollingBox(element: HTMLElement | null): DOMRect | undefined {\n let overflowing: HTMLElement | undefined;\n for (let node = element; node; node = node.parentElement) {\n const { overflowY } = getComputedStyle(node);\n if (overflowY !== 'auto' && overflowY !== 'scroll' && overflowY !== 'overlay') continue;\n if (node.scrollHeight > node.clientHeight) return node.getBoundingClientRect();\n overflowing ??= node;\n }\n return (overflowing ?? element)?.getBoundingClientRect();\n}\n\n/** Where in the scroller a row focused from elsewhere lands, as a fraction of its height from the top. */\nconst SCROLL_ROW_AT = 1 / 3;\n/** A row between these fractions of the scroller is comfortably in view and is not moved. */\nconst COMFORT_TOP = 0.1;\nconst COMFORT_BOTTOM = 0.7;\n\n/** The key {@link KnowledgePageTree}'s `loadMore` uses for the root level. */\nexport const KNOWLEDGE_TREE_ROOT = '';\n\n/**\n * The Knowledge page tree: scopes and pages nested by parent, siblings in\n * stored order. Selecting a page from elsewhere (graph, search) opens the path\n * to it. Keyboard follows the WAI-ARIA tree pattern: Up/Down move, Right opens\n * or enters, Left closes or goes to the parent, Enter/Space selects.\n *\n * A host that loads the tree a level at a time passes `mayHaveChildren` (so unloaded pages still offer\n * a chevron), listens to `onExpandedChange` to load the opened levels, and passes `loadMore` for\n * levels with more children to fetch. A page's `childCount`, when the server sends one, shows beside\n * its name. Selecting a page with children also opens it.\n */\nexport function KnowledgePageTree({\n pages,\n pinnedIds,\n selectedPageId,\n onSelect,\n initiallyExpanded,\n mayHaveChildren,\n onExpandedChange,\n loadMore,\n 'aria-label': ariaLabel = 'Knowledge pages',\n}: {\n pages: KnowledgePagePayload[];\n pinnedIds?: readonly string[];\n selectedPageId?: string | null;\n onSelect: (page: KnowledgePagePayload) => void;\n /** Ids open on first render; defaults to every root. */\n initiallyExpanded?: string[];\n /** True for a page whose children are not loaded yet, so it can still be opened. */\n mayHaveChildren?: (page: KnowledgePagePayload) => boolean;\n onExpandedChange?: (expanded: ReadonlySet<string>) => void;\n /** Parent id ({@link KNOWLEDGE_TREE_ROOT} for the roots) to a loader for its next children. */\n loadMore?: ReadonlyMap<string, () => void>;\n 'aria-label'?: string;\n}) {\n const roots = useMemo(() => buildPageTree(pages), [pages]);\n const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);\n const [expanded, setExpanded] = useState<Set<string>>(\n () => new Set(initiallyExpanded ?? roots.map(root => root.page.id)),\n );\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const itemRefs = useRef(new Map<string, HTMLDivElement>());\n\n // Open the path to a selection once. Later renders with the same selection and path (a refetch, a\n // level loading) leave it alone, so a parent the user collapses over the selection stays collapsed.\n const revealed = useRef<string | null>(null);\n useEffect(() => {\n if (!selectedPageId) {\n // Forget the last reveal, so picking the same page again after a clear opens its path.\n revealed.current = null;\n return;\n }\n const path = pageAncestorIds(pages, selectedPageId);\n const key = [selectedPageId, ...path].join('/');\n if (revealed.current === key) return;\n revealed.current = key;\n setExpanded(current => (path.every(id => current.has(id)) ? current : new Set([...current, ...path])));\n }, [pages, selectedPageId]);\n\n useEffect(() => {\n onExpandedChange?.(expanded);\n }, [expanded, onExpandedChange]);\n\n const rows = useMemo(\n () =>\n visiblePageRows(roots, expanded).map(row =>\n !row.hasChildren && mayHaveChildren?.(row.page) ? { ...row, hasChildren: true } : row,\n ),\n [roots, expanded, mayHaveChildren],\n );\n // Bring the selected row into view when it is selected, as soon as it exists, and again if rows that load\n // later push it out of view (a deep page's levels arrive one after another). Once the user scrolls, presses a key or\n // a pointer in the tree it is left alone. The row goes a third of the way down the scroller, middle-top, not\n // hard against its bottom edge; keyboard focus is not moved.\n const scroller = useRef<HTMLDivElement>(null);\n const scrolledTo = useRef<string | null>(null);\n const userScrolled = useRef(false);\n useEffect(() => {\n if (!selectedPageId) {\n scrolledTo.current = null;\n return;\n }\n const element = itemRefs.current.get(selectedPageId);\n if (!element) return;\n const first = scrolledTo.current !== selectedPageId;\n if (first) {\n scrolledTo.current = selectedPageId;\n userScrolled.current = false;\n } else if (userScrolled.current) return;\n const box = scrollingBox(scroller.current);\n const at = element.getBoundingClientRect();\n if (!first && !box) return;\n if (!first && box && box.height === 0 && at.top >= box.top && at.bottom <= box.bottom) return;\n if (box && box.height > 0) {\n // A row already well inside the scroller stays where it is.\n const inView = at.top >= box.top + box.height * COMFORT_TOP && at.bottom <= box.top + box.height * COMFORT_BOTTOM;\n if (inView) return;\n // Otherwise it lands a third of the way down; the browser clamps this at the top and bottom of the list.\n element.style.scrollMarginTop = `${box.height * SCROLL_ROW_AT}px`;\n }\n element.scrollIntoView?.({ block: 'start', behavior: first && prefersMotion() ? 'smooth' : 'auto' });\n // The margin only steers this scroll; left on, focus() scrolls and a resized pane would keep a stale gap.\n element.style.scrollMarginTop = '';\n }, [rows, selectedPageId]);\n const activeId =\n focusedId && rows.some(row => row.page.id === focusedId)\n ? focusedId\n : (rows.find(row => row.page.id === selectedPageId)?.page.id ?? rows[0]?.page.id);\n\n const toggle = (id: string, open: boolean) =>\n setExpanded(current => {\n if (current.has(id) === open) return current;\n const next = new Set(current);\n if (open) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const focus = (id: string | undefined) => {\n if (!id) return;\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>, index: number) => {\n const row = rows[index];\n if (!row) return;\n switch (event.key) {\n case 'ArrowDown':\n focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowUp':\n focus(rows[index - 1]?.page.id);\n break;\n case 'ArrowRight':\n if (row.hasChildren && !row.expanded) toggle(row.page.id, true);\n else if (row.expanded) focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowLeft':\n if (row.expanded) toggle(row.page.id, false);\n else focus(rows.slice(0, index).findLast(candidate => candidate.depth < row.depth)?.page.id);\n break;\n case 'Enter':\n case ' ':\n onSelect(row.page);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n if (rows.length === 0) {\n return <p className=\"px-3 py-2 text-body text-muted-foreground\">No pages yet.</p>;\n }\n\n const ancestorAt: string[] = [];\n return (\n <div\n ref={scroller}\n role=\"tree\"\n aria-label={ariaLabel}\n className=\"min-h-0 overflow-y-auto py-1\"\n onWheel={() => (userScrolled.current = true)}\n onTouchMove={() => (userScrolled.current = true)}\n onPointerDown={() => (userScrolled.current = true)}\n onKeyDown={() => (userScrolled.current = true)}\n >\n {rows.map((row, index) => {\n const selected = row.page.id === selectedPageId;\n ancestorAt[row.depth] = row.page.id;\n // Levels whose last loaded child is this row's subtree end here: offer their next children.\n const nextDepth = rows[index + 1]?.depth ?? -1;\n const closing: Array<{ parentId: string; depth: number }> = [];\n for (let depth = row.depth - 1; depth >= nextDepth; depth--) {\n const parentId = depth < 0 ? KNOWLEDGE_TREE_ROOT : ancestorAt[depth];\n if (parentId !== undefined) closing.push({ parentId, depth: depth + 1 });\n }\n if (row.expanded && rows[index + 1]?.depth !== row.depth + 1)\n closing.unshift({ parentId: row.page.id, depth: row.depth + 1 });\n return (\n <Fragment key={row.page.id}>\n <div\n ref={element => {\n if (element) itemRefs.current.set(row.page.id, element);\n else itemRefs.current.delete(row.page.id);\n }}\n role=\"treeitem\"\n aria-level={row.depth + 1}\n aria-selected={selected}\n aria-expanded={row.hasChildren ? row.expanded : undefined}\n tabIndex={row.page.id === activeId ? 0 : -1}\n onFocus={() => setFocusedId(row.page.id)}\n onKeyDown={event => onKeyDown(event, index)}\n onClick={() => {\n onSelect(row.page);\n // Selecting a page with children opens it too, which loads them in a lazily loaded tree.\n if (row.hasChildren) toggle(row.page.id, true);\n }}\n className={cn(\n 'flex min-h-8 cursor-pointer items-center gap-1 rounded-md pr-2 outline-none focus-visible:ring-1 focus-visible:ring-border-focus',\n selected ? 'bg-fill text-foreground' : 'text-foreground hover:bg-fill',\n )}\n style={{ paddingLeft: `${row.depth * 16 + 4}px` }}\n >\n {row.hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={row.expanded ? `Collapse ${row.page.name}` : `Expand ${row.page.name}`}\n className=\"flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n onClick={event => {\n event.stopPropagation();\n toggle(row.page.id, !row.expanded);\n }}\n >\n <ChevronRight size={14} className={cn('transition-transform', row.expanded && 'rotate-90')} />\n </button>\n ) : (\n <span className=\"size-5 shrink-0\" aria-hidden />\n )}\n <span className={cn('min-w-0 flex-1 truncate text-body', row.page.isScope && 'font-medium')}>\n {row.page.name}\n </span>\n {row.page.childCount ? (\n <span\n data-testid=\"knowledge-tree-count\"\n aria-label={`${childCountLabel(row.page)} below`}\n className=\"shrink-0 text-caption text-muted-foreground tabular-nums\"\n >\n {childCountLabel(row.page)}\n </span>\n ) : null}\n {pinned.has(row.page.id) ? (\n <Pin size={12} className=\"shrink-0 text-badge-amber-indicator\" aria-label=\"Pinned\" />\n ) : null}\n {row.page.isScope && row.page.address && row.page.address !== row.page.name ? (\n <span\n data-testid=\"knowledge-tree-address\"\n className=\"max-w-1/2 min-w-0 truncate text-caption text-muted-foreground\"\n >\n {row.page.address}\n </span>\n ) : null}\n </div>\n {closing.map(({ parentId, depth }) => {\n const more = loadMore?.get(parentId);\n return more ? (\n <button\n key={`more-${parentId}`}\n type=\"button\"\n className=\"flex min-h-7 w-full items-center text-left text-caption text-muted-foreground hover:text-foreground\"\n style={{ paddingLeft: `${depth * 16 + 28}px` }}\n onClick={more}\n >\n Load more\n </button>\n ) : null;\n })}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"KnowledgePageTree.cjs.js","names":["useMemo","buildPageTree","useState","useRef","pageAncestorIds","visiblePageRows","prefersMotion","Fragment","cn","DisclosureChevron","scopeTitle","KnowledgeSourceIcon","Folder","FileText","childCountLabel","Pin"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageTree.tsx"],"sourcesContent":["import { FileText, Folder, Pin } from 'lucide-react';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { scopeTitle } from '../lib/pageAddress';\nimport { buildPageTree, childCountLabel, pageAncestorIds, visiblePageRows } from '../lib/pageTree';\nimport { prefersMotion } from '../lib/useLeavingNodes';\nimport type { KnowledgePagePayload } from '../pageTypes';\nimport { KnowledgeSourceIcon } from './KnowledgeSourceIcon';\n\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { cn } from '@/utils/cn';\n\n/**\n * The box of the nearest ancestor (or the element itself) that really scrolls vertically. The tree sets\n * `overflow-y: auto` itself but, as tall as its rows, never overflows; a parent is what scrolls, so a\n * node counts only when its content is taller than it is.\n */\nfunction scrollingBox(element: HTMLElement | null): DOMRect | undefined {\n let overflowing: HTMLElement | undefined;\n for (let node = element; node; node = node.parentElement) {\n const { overflowY } = getComputedStyle(node);\n if (overflowY !== 'auto' && overflowY !== 'scroll' && overflowY !== 'overlay') continue;\n if (node.scrollHeight > node.clientHeight) return node.getBoundingClientRect();\n overflowing ??= node;\n }\n return (overflowing ?? element)?.getBoundingClientRect();\n}\n\n/** Where in the scroller a row focused from elsewhere lands, as a fraction of its height from the top. */\nconst SCROLL_ROW_AT = 1 / 3;\n/** A row between these fractions of the scroller is comfortably in view and is not moved. */\nconst COMFORT_TOP = 0.1;\nconst COMFORT_BOTTOM = 0.7;\n\n/** The key {@link KnowledgePageTree}'s `loadMore` uses for the root level. */\nexport const KNOWLEDGE_TREE_ROOT = '';\n\n/**\n * The Knowledge page tree: scopes and pages nested by parent, siblings in\n * stored order. Selecting a page from elsewhere (graph, search) opens the path\n * to it. Keyboard follows the WAI-ARIA tree pattern: Up/Down move, Right opens\n * or enters, Left closes or goes to the parent, Enter/Space selects.\n *\n * A host that loads the tree a level at a time passes `mayHaveChildren` (so unloaded pages still offer\n * a chevron), listens to `onExpandedChange` to load the opened levels, and passes `loadMore` for\n * levels with more children to fetch. A page's `childCount`, when the server sends one, shows beside\n * its name. Selecting a page with children also opens it.\n */\nexport function KnowledgePageTree({\n pages,\n pinnedIds,\n selectedPageId,\n onSelect,\n initiallyExpanded,\n mayHaveChildren,\n onExpandedChange,\n loadMore,\n 'aria-label': ariaLabel = 'Knowledge pages',\n}: {\n pages: KnowledgePagePayload[];\n pinnedIds?: readonly string[];\n selectedPageId?: string | null;\n onSelect: (page: KnowledgePagePayload) => void;\n /** Ids open on first render; defaults to every root. */\n initiallyExpanded?: string[];\n /** True for a page whose children are not loaded yet, so it can still be opened. */\n mayHaveChildren?: (page: KnowledgePagePayload) => boolean;\n onExpandedChange?: (expanded: ReadonlySet<string>) => void;\n /** Parent id ({@link KNOWLEDGE_TREE_ROOT} for the roots) to a loader for its next children. */\n loadMore?: ReadonlyMap<string, () => void>;\n 'aria-label'?: string;\n}) {\n const roots = useMemo(() => buildPageTree(pages), [pages]);\n const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);\n const [expanded, setExpanded] = useState<Set<string>>(\n () => new Set(initiallyExpanded ?? roots.map(root => root.page.id)),\n );\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const itemRefs = useRef(new Map<string, HTMLDivElement>());\n\n // Open the path to a selection once. Later renders with the same selection and path (a refetch, a\n // level loading) leave it alone, so a parent the user collapses over the selection stays collapsed.\n const revealed = useRef<string | null>(null);\n useEffect(() => {\n if (!selectedPageId) {\n // Forget the last reveal, so picking the same page again after a clear opens its path.\n revealed.current = null;\n return;\n }\n const path = pageAncestorIds(pages, selectedPageId);\n const key = [selectedPageId, ...path].join('/');\n if (revealed.current === key) return;\n revealed.current = key;\n setExpanded(current => (path.every(id => current.has(id)) ? current : new Set([...current, ...path])));\n }, [pages, selectedPageId]);\n\n useEffect(() => {\n onExpandedChange?.(expanded);\n }, [expanded, onExpandedChange]);\n\n const rows = useMemo(\n () =>\n visiblePageRows(roots, expanded).map(row =>\n !row.hasChildren && mayHaveChildren?.(row.page) ? { ...row, hasChildren: true } : row,\n ),\n [roots, expanded, mayHaveChildren],\n );\n // Bring the selected row into view when it is selected, as soon as it exists, and again if rows that load\n // later push it out of view (a deep page's levels arrive one after another). Once the user scrolls, presses a key or\n // a pointer in the tree it is left alone. The row goes a third of the way down the scroller, middle-top, not\n // hard against its bottom edge; keyboard focus is not moved.\n const scroller = useRef<HTMLDivElement>(null);\n const scrolledTo = useRef<string | null>(null);\n const userScrolled = useRef(false);\n useEffect(() => {\n if (!selectedPageId) {\n scrolledTo.current = null;\n return;\n }\n const element = itemRefs.current.get(selectedPageId);\n if (!element) return;\n const first = scrolledTo.current !== selectedPageId;\n if (first) {\n scrolledTo.current = selectedPageId;\n userScrolled.current = false;\n } else if (userScrolled.current) return;\n const box = scrollingBox(scroller.current);\n const at = element.getBoundingClientRect();\n if (!first && !box) return;\n if (!first && box && box.height === 0 && at.top >= box.top && at.bottom <= box.bottom) return;\n if (box && box.height > 0) {\n // A row already well inside the scroller stays where it is.\n const inView = at.top >= box.top + box.height * COMFORT_TOP && at.bottom <= box.top + box.height * COMFORT_BOTTOM;\n if (inView) return;\n // Otherwise it lands a third of the way down; the browser clamps this at the top and bottom of the list.\n element.style.scrollMarginTop = `${box.height * SCROLL_ROW_AT}px`;\n }\n element.scrollIntoView?.({ block: 'start', behavior: first && prefersMotion() ? 'smooth' : 'auto' });\n // The margin only steers this scroll; left on, focus() scrolls and a resized pane would keep a stale gap.\n element.style.scrollMarginTop = '';\n }, [rows, selectedPageId]);\n const activeId =\n focusedId && rows.some(row => row.page.id === focusedId)\n ? focusedId\n : (rows.find(row => row.page.id === selectedPageId)?.page.id ?? rows[0]?.page.id);\n\n const toggle = (id: string, open: boolean) =>\n setExpanded(current => {\n if (current.has(id) === open) return current;\n const next = new Set(current);\n if (open) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const focus = (id: string | undefined) => {\n if (!id) return;\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>, index: number) => {\n const row = rows[index];\n if (!row) return;\n switch (event.key) {\n case 'ArrowDown':\n focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowUp':\n focus(rows[index - 1]?.page.id);\n break;\n case 'ArrowRight':\n if (row.hasChildren && !row.expanded) toggle(row.page.id, true);\n else if (row.expanded) focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowLeft':\n if (row.expanded) toggle(row.page.id, false);\n else focus(rows.slice(0, index).findLast(candidate => candidate.depth < row.depth)?.page.id);\n break;\n case 'Enter':\n case ' ':\n onSelect(row.page);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n if (rows.length === 0) {\n return <p className=\"px-3 py-2 text-body text-muted-foreground\">No pages yet.</p>;\n }\n\n const ancestorAt: string[] = [];\n return (\n <div\n ref={scroller}\n role=\"tree\"\n aria-label={ariaLabel}\n className=\"min-h-0 overflow-y-auto py-1\"\n onWheel={() => (userScrolled.current = true)}\n onTouchMove={() => (userScrolled.current = true)}\n onPointerDown={() => (userScrolled.current = true)}\n onKeyDown={() => (userScrolled.current = true)}\n >\n {rows.map((row, index) => {\n const selected = row.page.id === selectedPageId;\n ancestorAt[row.depth] = row.page.id;\n // Levels whose last loaded child is this row's subtree end here: offer their next children.\n const nextDepth = rows[index + 1]?.depth ?? -1;\n const closing: Array<{ parentId: string; depth: number }> = [];\n for (let depth = row.depth - 1; depth >= nextDepth; depth--) {\n const parentId = depth < 0 ? KNOWLEDGE_TREE_ROOT : ancestorAt[depth];\n if (parentId !== undefined) closing.push({ parentId, depth: depth + 1 });\n }\n if (row.expanded && rows[index + 1]?.depth !== row.depth + 1)\n closing.unshift({ parentId: row.page.id, depth: row.depth + 1 });\n return (\n <Fragment key={row.page.id}>\n <div\n ref={element => {\n if (element) itemRefs.current.set(row.page.id, element);\n else itemRefs.current.delete(row.page.id);\n }}\n role=\"treeitem\"\n aria-level={row.depth + 1}\n aria-selected={selected}\n aria-expanded={row.hasChildren ? row.expanded : undefined}\n tabIndex={row.page.id === activeId ? 0 : -1}\n onFocus={() => setFocusedId(row.page.id)}\n onKeyDown={event => onKeyDown(event, index)}\n onClick={() => {\n onSelect(row.page);\n // Selecting a page with children opens it too, which loads them in a lazily loaded tree.\n if (row.hasChildren) toggle(row.page.id, true);\n }}\n className={cn(\n 'flex h-8 cursor-pointer items-center gap-2 rounded-md pr-2 text-body-sm text-foreground outline-none focus-visible:bg-fill-subtle',\n selected ? 'bg-fill-hover' : 'hover:bg-fill-subtle',\n )}\n style={{ paddingLeft: `${row.depth * 12 + 4}px` }}\n >\n {row.hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={row.expanded ? `Collapse ${row.page.name}` : `Expand ${row.page.name}`}\n className=\"flex size-3 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground\"\n onClick={event => {\n event.stopPropagation();\n toggle(row.page.id, !row.expanded);\n }}\n >\n <DisclosureChevron direction=\"right\" open={row.expanded} className=\"size-3\" />\n </button>\n ) : (\n <span className=\"size-3 shrink-0\" aria-hidden />\n )}\n <span className=\"flex shrink-0 items-center text-muted-foreground [&>svg]:size-3.5\" aria-hidden>\n {row.page.isScope && scopeTitle(row.page) !== row.page.name ? (\n <KnowledgeSourceIcon page={row.page} />\n ) : row.hasChildren ? (\n <Folder />\n ) : (\n <FileText />\n )}\n </span>\n <span className={cn('min-w-0 flex-1 truncate', row.page.isScope && 'font-medium')}>\n {scopeTitle(row.page)}\n </span>\n {row.page.childCount ? (\n <span\n data-testid=\"knowledge-tree-count\"\n aria-label={`${childCountLabel(row.page)} below`}\n className=\"shrink-0 text-caption text-placeholder tabular-nums\"\n >\n {childCountLabel(row.page)}\n </span>\n ) : null}\n {pinned.has(row.page.id) ? (\n <Pin size={12} className=\"shrink-0 text-badge-amber-indicator\" aria-label=\"Pinned\" />\n ) : null}\n {row.page.isScope && row.page.address && row.page.address !== row.page.name ? (\n <span\n data-testid=\"knowledge-tree-address\"\n className=\"max-w-1/2 min-w-0 truncate text-caption text-muted-foreground\"\n >\n {row.page.address}\n </span>\n ) : null}\n </div>\n {closing.map(({ parentId, depth }) => {\n const more = loadMore?.get(parentId);\n return more ? (\n <button\n key={`more-${parentId}`}\n type=\"button\"\n className=\"flex h-8 w-full items-center text-left text-caption text-muted-foreground hover:text-foreground\"\n style={{ paddingLeft: `${depth * 12 + 42}px` }}\n onClick={more}\n >\n Load more\n </button>\n ) : null;\n })}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
+ import { scopeTitle } from "../lib/pageAddress.es.js";
1
2
  import { buildPageTree, childCountLabel, pageAncestorIds, visiblePageRows } from "../lib/pageTree.es.js";
2
3
  import { prefersMotion } from "../lib/useLeavingNodes.es.js";
4
+ import { KnowledgeSourceIcon } from "./KnowledgeSourceIcon.es.js";
5
+ import { DisclosureChevron } from "../../../components/DisclosureChevron.es.js";
3
6
  import { t as cn } from "../../../utils-DQx8TpNT.js";
4
7
  import { Fragment, useEffect, useMemo, useRef, useState } from "react";
5
8
  import { jsx, jsxs } from "react/jsx-runtime";
6
- import { ChevronRight, Pin } from "lucide-react";
9
+ import { FileText, Folder, Pin } from "lucide-react";
7
10
  // src/domains/knowledge/components/KnowledgePageTree.tsx
8
11
  /**
9
12
  * The box of the nearest ancestor (or the element itself) that really scrolls vertically. The tree sets
@@ -181,34 +184,40 @@ function KnowledgePageTree({ pages, pinnedIds, selectedPageId, onSelect, initial
181
184
  onSelect(row.page);
182
185
  if (row.hasChildren) toggle(row.page.id, true);
183
186
  },
184
- className: cn("flex min-h-8 cursor-pointer items-center gap-1 rounded-md pr-2 outline-none focus-visible:ring-1 focus-visible:ring-border-focus", selected ? "bg-fill text-foreground" : "text-foreground hover:bg-fill"),
185
- style: { paddingLeft: `${row.depth * 16 + 4}px` },
187
+ className: cn("flex h-8 cursor-pointer items-center gap-2 rounded-md pr-2 text-body-sm text-foreground outline-none focus-visible:bg-fill-subtle", selected ? "bg-fill-hover" : "hover:bg-fill-subtle"),
188
+ style: { paddingLeft: `${row.depth * 12 + 4}px` },
186
189
  children: [
187
190
  row.hasChildren ? /* @__PURE__ */ jsx("button", {
188
191
  type: "button",
189
192
  tabIndex: -1,
190
193
  "aria-label": row.expanded ? `Collapse ${row.page.name}` : `Expand ${row.page.name}`,
191
- className: "flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground hover:text-foreground",
194
+ className: "flex size-3 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground",
192
195
  onClick: (event) => {
193
196
  event.stopPropagation();
194
197
  toggle(row.page.id, !row.expanded);
195
198
  },
196
- children: /* @__PURE__ */ jsx(ChevronRight, {
197
- size: 14,
198
- className: cn("transition-transform", row.expanded && "rotate-90")
199
+ children: /* @__PURE__ */ jsx(DisclosureChevron, {
200
+ direction: "right",
201
+ open: row.expanded,
202
+ className: "size-3"
199
203
  })
200
204
  }) : /* @__PURE__ */ jsx("span", {
201
- className: "size-5 shrink-0",
205
+ className: "size-3 shrink-0",
202
206
  "aria-hidden": true
203
207
  }),
204
208
  /* @__PURE__ */ jsx("span", {
205
- className: cn("min-w-0 flex-1 truncate text-body", row.page.isScope && "font-medium"),
206
- children: row.page.name
209
+ className: "flex shrink-0 items-center text-muted-foreground [&>svg]:size-3.5",
210
+ "aria-hidden": true,
211
+ children: row.page.isScope && scopeTitle(row.page) !== row.page.name ? /* @__PURE__ */ jsx(KnowledgeSourceIcon, { page: row.page }) : row.hasChildren ? /* @__PURE__ */ jsx(Folder, {}) : /* @__PURE__ */ jsx(FileText, {})
212
+ }),
213
+ /* @__PURE__ */ jsx("span", {
214
+ className: cn("min-w-0 flex-1 truncate", row.page.isScope && "font-medium"),
215
+ children: scopeTitle(row.page)
207
216
  }),
208
217
  row.page.childCount ? /* @__PURE__ */ jsx("span", {
209
218
  "data-testid": "knowledge-tree-count",
210
219
  "aria-label": `${childCountLabel(row.page)} below`,
211
- className: "shrink-0 text-caption text-muted-foreground tabular-nums",
220
+ className: "shrink-0 text-caption text-placeholder tabular-nums",
212
221
  children: childCountLabel(row.page)
213
222
  }) : null,
214
223
  pinned.has(row.page.id) ? /* @__PURE__ */ jsx(Pin, {
@@ -226,8 +235,8 @@ function KnowledgePageTree({ pages, pinnedIds, selectedPageId, onSelect, initial
226
235
  const more = loadMore?.get(parentId);
227
236
  return more ? /* @__PURE__ */ jsx("button", {
228
237
  type: "button",
229
- className: "flex min-h-7 w-full items-center text-left text-caption text-muted-foreground hover:text-foreground",
230
- style: { paddingLeft: `${depth * 16 + 28}px` },
238
+ className: "flex h-8 w-full items-center text-left text-caption text-muted-foreground hover:text-foreground",
239
+ style: { paddingLeft: `${depth * 12 + 42}px` },
231
240
  onClick: more,
232
241
  children: "Load more"
233
242
  }, `more-${parentId}`) : null;
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgePageTree.es.js","names":[],"sources":["../../../../src/domains/knowledge/components/KnowledgePageTree.tsx"],"sourcesContent":["import { ChevronRight, Pin } from 'lucide-react';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { buildPageTree, childCountLabel, pageAncestorIds, visiblePageRows } from '../lib/pageTree';\nimport { prefersMotion } from '../lib/useLeavingNodes';\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nimport { cn } from '@/utils/cn';\n\n/**\n * The box of the nearest ancestor (or the element itself) that really scrolls vertically. The tree sets\n * `overflow-y: auto` itself but, as tall as its rows, never overflows; a parent is what scrolls, so a\n * node counts only when its content is taller than it is.\n */\nfunction scrollingBox(element: HTMLElement | null): DOMRect | undefined {\n let overflowing: HTMLElement | undefined;\n for (let node = element; node; node = node.parentElement) {\n const { overflowY } = getComputedStyle(node);\n if (overflowY !== 'auto' && overflowY !== 'scroll' && overflowY !== 'overlay') continue;\n if (node.scrollHeight > node.clientHeight) return node.getBoundingClientRect();\n overflowing ??= node;\n }\n return (overflowing ?? element)?.getBoundingClientRect();\n}\n\n/** Where in the scroller a row focused from elsewhere lands, as a fraction of its height from the top. */\nconst SCROLL_ROW_AT = 1 / 3;\n/** A row between these fractions of the scroller is comfortably in view and is not moved. */\nconst COMFORT_TOP = 0.1;\nconst COMFORT_BOTTOM = 0.7;\n\n/** The key {@link KnowledgePageTree}'s `loadMore` uses for the root level. */\nexport const KNOWLEDGE_TREE_ROOT = '';\n\n/**\n * The Knowledge page tree: scopes and pages nested by parent, siblings in\n * stored order. Selecting a page from elsewhere (graph, search) opens the path\n * to it. Keyboard follows the WAI-ARIA tree pattern: Up/Down move, Right opens\n * or enters, Left closes or goes to the parent, Enter/Space selects.\n *\n * A host that loads the tree a level at a time passes `mayHaveChildren` (so unloaded pages still offer\n * a chevron), listens to `onExpandedChange` to load the opened levels, and passes `loadMore` for\n * levels with more children to fetch. A page's `childCount`, when the server sends one, shows beside\n * its name. Selecting a page with children also opens it.\n */\nexport function KnowledgePageTree({\n pages,\n pinnedIds,\n selectedPageId,\n onSelect,\n initiallyExpanded,\n mayHaveChildren,\n onExpandedChange,\n loadMore,\n 'aria-label': ariaLabel = 'Knowledge pages',\n}: {\n pages: KnowledgePagePayload[];\n pinnedIds?: readonly string[];\n selectedPageId?: string | null;\n onSelect: (page: KnowledgePagePayload) => void;\n /** Ids open on first render; defaults to every root. */\n initiallyExpanded?: string[];\n /** True for a page whose children are not loaded yet, so it can still be opened. */\n mayHaveChildren?: (page: KnowledgePagePayload) => boolean;\n onExpandedChange?: (expanded: ReadonlySet<string>) => void;\n /** Parent id ({@link KNOWLEDGE_TREE_ROOT} for the roots) to a loader for its next children. */\n loadMore?: ReadonlyMap<string, () => void>;\n 'aria-label'?: string;\n}) {\n const roots = useMemo(() => buildPageTree(pages), [pages]);\n const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);\n const [expanded, setExpanded] = useState<Set<string>>(\n () => new Set(initiallyExpanded ?? roots.map(root => root.page.id)),\n );\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const itemRefs = useRef(new Map<string, HTMLDivElement>());\n\n // Open the path to a selection once. Later renders with the same selection and path (a refetch, a\n // level loading) leave it alone, so a parent the user collapses over the selection stays collapsed.\n const revealed = useRef<string | null>(null);\n useEffect(() => {\n if (!selectedPageId) {\n // Forget the last reveal, so picking the same page again after a clear opens its path.\n revealed.current = null;\n return;\n }\n const path = pageAncestorIds(pages, selectedPageId);\n const key = [selectedPageId, ...path].join('/');\n if (revealed.current === key) return;\n revealed.current = key;\n setExpanded(current => (path.every(id => current.has(id)) ? current : new Set([...current, ...path])));\n }, [pages, selectedPageId]);\n\n useEffect(() => {\n onExpandedChange?.(expanded);\n }, [expanded, onExpandedChange]);\n\n const rows = useMemo(\n () =>\n visiblePageRows(roots, expanded).map(row =>\n !row.hasChildren && mayHaveChildren?.(row.page) ? { ...row, hasChildren: true } : row,\n ),\n [roots, expanded, mayHaveChildren],\n );\n // Bring the selected row into view when it is selected, as soon as it exists, and again if rows that load\n // later push it out of view (a deep page's levels arrive one after another). Once the user scrolls, presses a key or\n // a pointer in the tree it is left alone. The row goes a third of the way down the scroller, middle-top, not\n // hard against its bottom edge; keyboard focus is not moved.\n const scroller = useRef<HTMLDivElement>(null);\n const scrolledTo = useRef<string | null>(null);\n const userScrolled = useRef(false);\n useEffect(() => {\n if (!selectedPageId) {\n scrolledTo.current = null;\n return;\n }\n const element = itemRefs.current.get(selectedPageId);\n if (!element) return;\n const first = scrolledTo.current !== selectedPageId;\n if (first) {\n scrolledTo.current = selectedPageId;\n userScrolled.current = false;\n } else if (userScrolled.current) return;\n const box = scrollingBox(scroller.current);\n const at = element.getBoundingClientRect();\n if (!first && !box) return;\n if (!first && box && box.height === 0 && at.top >= box.top && at.bottom <= box.bottom) return;\n if (box && box.height > 0) {\n // A row already well inside the scroller stays where it is.\n const inView = at.top >= box.top + box.height * COMFORT_TOP && at.bottom <= box.top + box.height * COMFORT_BOTTOM;\n if (inView) return;\n // Otherwise it lands a third of the way down; the browser clamps this at the top and bottom of the list.\n element.style.scrollMarginTop = `${box.height * SCROLL_ROW_AT}px`;\n }\n element.scrollIntoView?.({ block: 'start', behavior: first && prefersMotion() ? 'smooth' : 'auto' });\n // The margin only steers this scroll; left on, focus() scrolls and a resized pane would keep a stale gap.\n element.style.scrollMarginTop = '';\n }, [rows, selectedPageId]);\n const activeId =\n focusedId && rows.some(row => row.page.id === focusedId)\n ? focusedId\n : (rows.find(row => row.page.id === selectedPageId)?.page.id ?? rows[0]?.page.id);\n\n const toggle = (id: string, open: boolean) =>\n setExpanded(current => {\n if (current.has(id) === open) return current;\n const next = new Set(current);\n if (open) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const focus = (id: string | undefined) => {\n if (!id) return;\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>, index: number) => {\n const row = rows[index];\n if (!row) return;\n switch (event.key) {\n case 'ArrowDown':\n focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowUp':\n focus(rows[index - 1]?.page.id);\n break;\n case 'ArrowRight':\n if (row.hasChildren && !row.expanded) toggle(row.page.id, true);\n else if (row.expanded) focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowLeft':\n if (row.expanded) toggle(row.page.id, false);\n else focus(rows.slice(0, index).findLast(candidate => candidate.depth < row.depth)?.page.id);\n break;\n case 'Enter':\n case ' ':\n onSelect(row.page);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n if (rows.length === 0) {\n return <p className=\"px-3 py-2 text-body text-muted-foreground\">No pages yet.</p>;\n }\n\n const ancestorAt: string[] = [];\n return (\n <div\n ref={scroller}\n role=\"tree\"\n aria-label={ariaLabel}\n className=\"min-h-0 overflow-y-auto py-1\"\n onWheel={() => (userScrolled.current = true)}\n onTouchMove={() => (userScrolled.current = true)}\n onPointerDown={() => (userScrolled.current = true)}\n onKeyDown={() => (userScrolled.current = true)}\n >\n {rows.map((row, index) => {\n const selected = row.page.id === selectedPageId;\n ancestorAt[row.depth] = row.page.id;\n // Levels whose last loaded child is this row's subtree end here: offer their next children.\n const nextDepth = rows[index + 1]?.depth ?? -1;\n const closing: Array<{ parentId: string; depth: number }> = [];\n for (let depth = row.depth - 1; depth >= nextDepth; depth--) {\n const parentId = depth < 0 ? KNOWLEDGE_TREE_ROOT : ancestorAt[depth];\n if (parentId !== undefined) closing.push({ parentId, depth: depth + 1 });\n }\n if (row.expanded && rows[index + 1]?.depth !== row.depth + 1)\n closing.unshift({ parentId: row.page.id, depth: row.depth + 1 });\n return (\n <Fragment key={row.page.id}>\n <div\n ref={element => {\n if (element) itemRefs.current.set(row.page.id, element);\n else itemRefs.current.delete(row.page.id);\n }}\n role=\"treeitem\"\n aria-level={row.depth + 1}\n aria-selected={selected}\n aria-expanded={row.hasChildren ? row.expanded : undefined}\n tabIndex={row.page.id === activeId ? 0 : -1}\n onFocus={() => setFocusedId(row.page.id)}\n onKeyDown={event => onKeyDown(event, index)}\n onClick={() => {\n onSelect(row.page);\n // Selecting a page with children opens it too, which loads them in a lazily loaded tree.\n if (row.hasChildren) toggle(row.page.id, true);\n }}\n className={cn(\n 'flex min-h-8 cursor-pointer items-center gap-1 rounded-md pr-2 outline-none focus-visible:ring-1 focus-visible:ring-border-focus',\n selected ? 'bg-fill text-foreground' : 'text-foreground hover:bg-fill',\n )}\n style={{ paddingLeft: `${row.depth * 16 + 4}px` }}\n >\n {row.hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={row.expanded ? `Collapse ${row.page.name}` : `Expand ${row.page.name}`}\n className=\"flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n onClick={event => {\n event.stopPropagation();\n toggle(row.page.id, !row.expanded);\n }}\n >\n <ChevronRight size={14} className={cn('transition-transform', row.expanded && 'rotate-90')} />\n </button>\n ) : (\n <span className=\"size-5 shrink-0\" aria-hidden />\n )}\n <span className={cn('min-w-0 flex-1 truncate text-body', row.page.isScope && 'font-medium')}>\n {row.page.name}\n </span>\n {row.page.childCount ? (\n <span\n data-testid=\"knowledge-tree-count\"\n aria-label={`${childCountLabel(row.page)} below`}\n className=\"shrink-0 text-caption text-muted-foreground tabular-nums\"\n >\n {childCountLabel(row.page)}\n </span>\n ) : null}\n {pinned.has(row.page.id) ? (\n <Pin size={12} className=\"shrink-0 text-badge-amber-indicator\" aria-label=\"Pinned\" />\n ) : null}\n {row.page.isScope && row.page.address && row.page.address !== row.page.name ? (\n <span\n data-testid=\"knowledge-tree-address\"\n className=\"max-w-1/2 min-w-0 truncate text-caption text-muted-foreground\"\n >\n {row.page.address}\n </span>\n ) : null}\n </div>\n {closing.map(({ parentId, depth }) => {\n const more = loadMore?.get(parentId);\n return more ? (\n <button\n key={`more-${parentId}`}\n type=\"button\"\n className=\"flex min-h-7 w-full items-center text-left text-caption text-muted-foreground hover:text-foreground\"\n style={{ paddingLeft: `${depth * 16 + 28}px` }}\n onClick={more}\n >\n Load more\n </button>\n ) : null;\n })}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAS,aAAa,SAAkD;CACtE,IAAI;CACJ,KAAK,IAAI,OAAO,SAAS,MAAM,OAAO,KAAK,eAAe;EACxD,MAAM,EAAE,cAAc,iBAAiB,IAAI;EAC3C,IAAI,cAAc,UAAU,cAAc,YAAY,cAAc,WAAW;EAC/E,IAAI,KAAK,eAAe,KAAK,cAAc,OAAO,KAAK,sBAAsB;EAC7E,gBAAgB;CAClB;CACA,QAAQ,eAAe,QAAA,EAAU,sBAAsB;AACzD;;AAGA,IAAM,gBAAgB,IAAI;;AAE1B,IAAM,cAAc;AACpB,IAAM,iBAAiB;;AAGvB,IAAa,sBAAsB;;;;;;;;;;;;AAanC,SAAgB,kBAAkB,EAChC,OACA,WACA,gBACA,UACA,mBACA,iBACA,kBACA,UACA,cAAc,YAAY,qBAczB;CACD,MAAM,QAAQ,cAAc,cAAc,KAAK,GAAG,CAAC,KAAK,CAAC;CACzD,MAAM,SAAS,cAAc,IAAI,IAAI,SAAS,GAAG,CAAC,SAAS,CAAC;CAC5D,MAAM,CAAC,UAAU,eAAe,eACxB,IAAI,IAAI,qBAAqB,MAAM,KAAI,SAAQ,KAAK,KAAK,EAAE,CAAC,CACpE;CACA,MAAM,CAAC,WAAW,gBAAgB,SAAwB,IAAI;CAC9D,MAAM,WAAW,uBAAO,IAAI,IAA4B,CAAC;CAIzD,MAAM,WAAW,OAAsB,IAAI;CAC3C,gBAAgB;EACd,IAAI,CAAC,gBAAgB;GAEnB,SAAS,UAAU;GACnB;EACF;EACA,MAAM,OAAO,gBAAgB,OAAO,cAAc;EAClD,MAAM,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;EAC9C,IAAI,SAAS,YAAY,KAAK;EAC9B,SAAS,UAAU;EACnB,aAAY,YAAY,KAAK,OAAM,OAAM,QAAQ,IAAI,EAAE,CAAC,IAAI,0BAAU,IAAI,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,CAAE;CACvG,GAAG,CAAC,OAAO,cAAc,CAAC;CAE1B,gBAAgB;EACd,mBAAmB,QAAQ;CAC7B,GAAG,CAAC,UAAU,gBAAgB,CAAC;CAE/B,MAAM,OAAO,cAET,gBAAgB,OAAO,QAAQ,CAAC,CAAC,KAAI,QACnC,CAAC,IAAI,eAAe,kBAAkB,IAAI,IAAI,IAAI;EAAE,GAAG;EAAK,aAAa;CAAK,IAAI,GACpF,GACF;EAAC;EAAO;EAAU;CAAe,CACnC;CAKA,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,aAAa,OAAsB,IAAI;CAC7C,MAAM,eAAe,OAAO,KAAK;CACjC,gBAAgB;EACd,IAAI,CAAC,gBAAgB;GACnB,WAAW,UAAU;GACrB;EACF;EACA,MAAM,UAAU,SAAS,QAAQ,IAAI,cAAc;EACnD,IAAI,CAAC,SAAS;EACd,MAAM,QAAQ,WAAW,YAAY;EACrC,IAAI,OAAO;GACT,WAAW,UAAU;GACrB,aAAa,UAAU;EACzB,OAAO,IAAI,aAAa,SAAS;EACjC,MAAM,MAAM,aAAa,SAAS,OAAO;EACzC,MAAM,KAAK,QAAQ,sBAAsB;EACzC,IAAI,CAAC,SAAS,CAAC,KAAK;EACpB,IAAI,CAAC,SAAS,OAAO,IAAI,WAAW,KAAK,GAAG,OAAO,IAAI,OAAO,GAAG,UAAU,IAAI,QAAQ;EACvF,IAAI,OAAO,IAAI,SAAS,GAAG;GAGzB,IADe,GAAG,OAAO,IAAI,MAAM,IAAI,SAAS,eAAe,GAAG,UAAU,IAAI,MAAM,IAAI,SAAS,gBACvF;GAEZ,QAAQ,MAAM,kBAAkB,GAAG,IAAI,SAAS,cAAc;EAChE;EACA,QAAQ,iBAAiB;GAAE,OAAO;GAAS,UAAU,SAAS,cAAc,IAAI,WAAW;EAAO,CAAC;EAEnG,QAAQ,MAAM,kBAAkB;CAClC,GAAG,CAAC,MAAM,cAAc,CAAC;CACzB,MAAM,WACJ,aAAa,KAAK,MAAK,QAAO,IAAI,KAAK,OAAO,SAAS,IACnD,YACC,KAAK,MAAK,QAAO,IAAI,KAAK,OAAO,cAAc,CAAC,EAAE,KAAK,MAAM,KAAK,EAAE,EAAE,KAAK;CAElF,MAAM,UAAU,IAAY,SAC1B,aAAY,YAAW;EACrB,IAAI,QAAQ,IAAI,EAAE,MAAM,MAAM,OAAO;EACrC,MAAM,OAAO,IAAI,IAAI,OAAO;EAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;OAChB,KAAK,OAAO,EAAE;EACnB,OAAO;CACT,CAAC;CAEH,MAAM,SAAS,OAA2B;EACxC,IAAI,CAAC,IAAI;EACT,aAAa,EAAE;EACf,SAAS,QAAQ,IAAI,EAAE,CAAC,EAAE,MAAM;CAClC;CAEA,MAAM,aAAa,OAAsC,UAAkB;EACzE,MAAM,MAAM,KAAK;EACjB,IAAI,CAAC,KAAK;EACV,QAAQ,MAAM,KAAd;GACE,KAAK;IACH,MAAM,KAAK,QAAQ,EAAE,EAAE,KAAK,EAAE;IAC9B;GACF,KAAK;IACH,MAAM,KAAK,QAAQ,EAAE,EAAE,KAAK,EAAE;IAC9B;GACF,KAAK;IACH,IAAI,IAAI,eAAe,CAAC,IAAI,UAAU,OAAO,IAAI,KAAK,IAAI,IAAI;SACzD,IAAI,IAAI,UAAU,MAAM,KAAK,QAAQ,EAAE,EAAE,KAAK,EAAE;IACrD;GACF,KAAK;IACH,IAAI,IAAI,UAAU,OAAO,IAAI,KAAK,IAAI,KAAK;SACtC,MAAM,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,UAAS,cAAa,UAAU,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE;IAC3F;GACF,KAAK;GACL,KAAK;IACH,SAAS,IAAI,IAAI;IACjB;GACF,SACE;EACJ;EACA,MAAM,eAAe;CACvB;CAEA,IAAI,KAAK,WAAW,GAClB,OAAO,oBAAC,KAAD;EAAG,WAAU;EAA4C,UAAA;CAAgB,CAAA;CAGlF,MAAM,aAAuB,CAAC;CAC9B,OACE,oBAAC,OAAD;EACE,KAAK;EACL,MAAK;EACL,cAAY;EACZ,WAAU;EACV,eAAgB,aAAa,UAAU;EACvC,mBAAoB,aAAa,UAAU;EAC3C,qBAAsB,aAAa,UAAU;EAC7C,iBAAkB,aAAa,UAAU;EAExC,UAAA,KAAK,KAAK,KAAK,UAAU;GACxB,MAAM,WAAW,IAAI,KAAK,OAAO;GACjC,WAAW,IAAI,SAAS,IAAI,KAAK;GAEjC,MAAM,YAAY,KAAK,QAAQ,EAAE,EAAE,SAAS;GAC5C,MAAM,UAAsD,CAAC;GAC7D,KAAK,IAAI,QAAQ,IAAI,QAAQ,GAAG,SAAS,WAAW,SAAS;IAC3D,MAAM,WAAW,QAAQ,IAAA,KAA0B,WAAW;IAC9D,IAAI,aAAa,KAAA,GAAW,QAAQ,KAAK;KAAE;KAAU,OAAO,QAAQ;IAAE,CAAC;GACzE;GACA,IAAI,IAAI,YAAY,KAAK,QAAQ,EAAE,EAAE,UAAU,IAAI,QAAQ,GACzD,QAAQ,QAAQ;IAAE,UAAU,IAAI,KAAK;IAAI,OAAO,IAAI,QAAQ;GAAE,CAAC;GACjE,OACE,qBAAC,UAAD,EAAA,UAAA,CACE,qBAAC,OAAD;IACE,MAAK,YAAW;KACd,IAAI,SAAS,SAAS,QAAQ,IAAI,IAAI,KAAK,IAAI,OAAO;UACjD,SAAS,QAAQ,OAAO,IAAI,KAAK,EAAE;IAC1C;IACA,MAAK;IACL,cAAY,IAAI,QAAQ;IACxB,iBAAe;IACf,iBAAe,IAAI,cAAc,IAAI,WAAW,KAAA;IAChD,UAAU,IAAI,KAAK,OAAO,WAAW,IAAI;IACzC,eAAe,aAAa,IAAI,KAAK,EAAE;IACvC,YAAW,UAAS,UAAU,OAAO,KAAK;IAC1C,eAAe;KACb,SAAS,IAAI,IAAI;KAEjB,IAAI,IAAI,aAAa,OAAO,IAAI,KAAK,IAAI,IAAI;IAC/C;IACA,WAAW,GACT,oIACA,WAAW,4BAA4B,+BACzC;IACA,OAAO,EAAE,aAAa,GAAG,IAAI,QAAQ,KAAK,EAAE,IAAI;IArBlD,UAAA;KAuBG,IAAI,cACH,oBAAC,UAAD;MACE,MAAK;MACL,UAAU;MACV,cAAY,IAAI,WAAW,YAAY,IAAI,KAAK,SAAS,UAAU,IAAI,KAAK;MAC5E,WAAU;MACV,UAAS,UAAS;OAChB,MAAM,gBAAgB;OACtB,OAAO,IAAI,KAAK,IAAI,CAAC,IAAI,QAAQ;MACnC;MAEA,UAAA,oBAAC,cAAD;OAAc,MAAM;OAAI,WAAW,GAAG,wBAAwB,IAAI,YAAY,WAAW;MAAI,CAAA;KACvF,CAAA,IAER,oBAAC,QAAD;MAAM,WAAU;MAAkB,eAAA;KAAa,CAAA;KAEjD,oBAAC,QAAD;MAAM,WAAW,GAAG,qCAAqC,IAAI,KAAK,WAAW,aAAa;MACvF,UAAA,IAAI,KAAK;KACN,CAAA;KACL,IAAI,KAAK,aACR,oBAAC,QAAD;MACE,eAAY;MACZ,cAAY,GAAG,gBAAgB,IAAI,IAAI,EAAE;MACzC,WAAU;MAET,UAAA,gBAAgB,IAAI,IAAI;KACrB,CAAA,IACJ;KACH,OAAO,IAAI,IAAI,KAAK,EAAE,IACrB,oBAAC,KAAD;MAAK,MAAM;MAAI,WAAU;MAAsC,cAAW;KAAU,CAAA,IAClF;KACH,IAAI,KAAK,WAAW,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,KAAK,OACrE,oBAAC,QAAD;MACE,eAAY;MACZ,WAAU;MAET,UAAA,IAAI,KAAK;KACN,CAAA,IACJ;IACD;GACJ,CAAA,GAAA,QAAQ,KAAK,EAAE,UAAU,YAAY;IACpC,MAAM,OAAO,UAAU,IAAI,QAAQ;IACnC,OAAO,OACL,oBAAC,UAAD;KAEE,MAAK;KACL,WAAU;KACV,OAAO,EAAE,aAAa,GAAG,QAAQ,KAAK,GAAG,IAAI;KAC7C,SAAS;KACV,UAAA;IAEO,GAPD,QAAQ,UAOP,IACN;GACN,CAAC,CACO,EAAA,GA9EK,IAAI,KAAK,EA8Ed;EAEd,CAAC;CACE,CAAA;AAET"}
1
+ {"version":3,"file":"KnowledgePageTree.es.js","names":[],"sources":["../../../../src/domains/knowledge/components/KnowledgePageTree.tsx"],"sourcesContent":["import { FileText, Folder, Pin } from 'lucide-react';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nimport { scopeTitle } from '../lib/pageAddress';\nimport { buildPageTree, childCountLabel, pageAncestorIds, visiblePageRows } from '../lib/pageTree';\nimport { prefersMotion } from '../lib/useLeavingNodes';\nimport type { KnowledgePagePayload } from '../pageTypes';\nimport { KnowledgeSourceIcon } from './KnowledgeSourceIcon';\n\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { cn } from '@/utils/cn';\n\n/**\n * The box of the nearest ancestor (or the element itself) that really scrolls vertically. The tree sets\n * `overflow-y: auto` itself but, as tall as its rows, never overflows; a parent is what scrolls, so a\n * node counts only when its content is taller than it is.\n */\nfunction scrollingBox(element: HTMLElement | null): DOMRect | undefined {\n let overflowing: HTMLElement | undefined;\n for (let node = element; node; node = node.parentElement) {\n const { overflowY } = getComputedStyle(node);\n if (overflowY !== 'auto' && overflowY !== 'scroll' && overflowY !== 'overlay') continue;\n if (node.scrollHeight > node.clientHeight) return node.getBoundingClientRect();\n overflowing ??= node;\n }\n return (overflowing ?? element)?.getBoundingClientRect();\n}\n\n/** Where in the scroller a row focused from elsewhere lands, as a fraction of its height from the top. */\nconst SCROLL_ROW_AT = 1 / 3;\n/** A row between these fractions of the scroller is comfortably in view and is not moved. */\nconst COMFORT_TOP = 0.1;\nconst COMFORT_BOTTOM = 0.7;\n\n/** The key {@link KnowledgePageTree}'s `loadMore` uses for the root level. */\nexport const KNOWLEDGE_TREE_ROOT = '';\n\n/**\n * The Knowledge page tree: scopes and pages nested by parent, siblings in\n * stored order. Selecting a page from elsewhere (graph, search) opens the path\n * to it. Keyboard follows the WAI-ARIA tree pattern: Up/Down move, Right opens\n * or enters, Left closes or goes to the parent, Enter/Space selects.\n *\n * A host that loads the tree a level at a time passes `mayHaveChildren` (so unloaded pages still offer\n * a chevron), listens to `onExpandedChange` to load the opened levels, and passes `loadMore` for\n * levels with more children to fetch. A page's `childCount`, when the server sends one, shows beside\n * its name. Selecting a page with children also opens it.\n */\nexport function KnowledgePageTree({\n pages,\n pinnedIds,\n selectedPageId,\n onSelect,\n initiallyExpanded,\n mayHaveChildren,\n onExpandedChange,\n loadMore,\n 'aria-label': ariaLabel = 'Knowledge pages',\n}: {\n pages: KnowledgePagePayload[];\n pinnedIds?: readonly string[];\n selectedPageId?: string | null;\n onSelect: (page: KnowledgePagePayload) => void;\n /** Ids open on first render; defaults to every root. */\n initiallyExpanded?: string[];\n /** True for a page whose children are not loaded yet, so it can still be opened. */\n mayHaveChildren?: (page: KnowledgePagePayload) => boolean;\n onExpandedChange?: (expanded: ReadonlySet<string>) => void;\n /** Parent id ({@link KNOWLEDGE_TREE_ROOT} for the roots) to a loader for its next children. */\n loadMore?: ReadonlyMap<string, () => void>;\n 'aria-label'?: string;\n}) {\n const roots = useMemo(() => buildPageTree(pages), [pages]);\n const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);\n const [expanded, setExpanded] = useState<Set<string>>(\n () => new Set(initiallyExpanded ?? roots.map(root => root.page.id)),\n );\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const itemRefs = useRef(new Map<string, HTMLDivElement>());\n\n // Open the path to a selection once. Later renders with the same selection and path (a refetch, a\n // level loading) leave it alone, so a parent the user collapses over the selection stays collapsed.\n const revealed = useRef<string | null>(null);\n useEffect(() => {\n if (!selectedPageId) {\n // Forget the last reveal, so picking the same page again after a clear opens its path.\n revealed.current = null;\n return;\n }\n const path = pageAncestorIds(pages, selectedPageId);\n const key = [selectedPageId, ...path].join('/');\n if (revealed.current === key) return;\n revealed.current = key;\n setExpanded(current => (path.every(id => current.has(id)) ? current : new Set([...current, ...path])));\n }, [pages, selectedPageId]);\n\n useEffect(() => {\n onExpandedChange?.(expanded);\n }, [expanded, onExpandedChange]);\n\n const rows = useMemo(\n () =>\n visiblePageRows(roots, expanded).map(row =>\n !row.hasChildren && mayHaveChildren?.(row.page) ? { ...row, hasChildren: true } : row,\n ),\n [roots, expanded, mayHaveChildren],\n );\n // Bring the selected row into view when it is selected, as soon as it exists, and again if rows that load\n // later push it out of view (a deep page's levels arrive one after another). Once the user scrolls, presses a key or\n // a pointer in the tree it is left alone. The row goes a third of the way down the scroller, middle-top, not\n // hard against its bottom edge; keyboard focus is not moved.\n const scroller = useRef<HTMLDivElement>(null);\n const scrolledTo = useRef<string | null>(null);\n const userScrolled = useRef(false);\n useEffect(() => {\n if (!selectedPageId) {\n scrolledTo.current = null;\n return;\n }\n const element = itemRefs.current.get(selectedPageId);\n if (!element) return;\n const first = scrolledTo.current !== selectedPageId;\n if (first) {\n scrolledTo.current = selectedPageId;\n userScrolled.current = false;\n } else if (userScrolled.current) return;\n const box = scrollingBox(scroller.current);\n const at = element.getBoundingClientRect();\n if (!first && !box) return;\n if (!first && box && box.height === 0 && at.top >= box.top && at.bottom <= box.bottom) return;\n if (box && box.height > 0) {\n // A row already well inside the scroller stays where it is.\n const inView = at.top >= box.top + box.height * COMFORT_TOP && at.bottom <= box.top + box.height * COMFORT_BOTTOM;\n if (inView) return;\n // Otherwise it lands a third of the way down; the browser clamps this at the top and bottom of the list.\n element.style.scrollMarginTop = `${box.height * SCROLL_ROW_AT}px`;\n }\n element.scrollIntoView?.({ block: 'start', behavior: first && prefersMotion() ? 'smooth' : 'auto' });\n // The margin only steers this scroll; left on, focus() scrolls and a resized pane would keep a stale gap.\n element.style.scrollMarginTop = '';\n }, [rows, selectedPageId]);\n const activeId =\n focusedId && rows.some(row => row.page.id === focusedId)\n ? focusedId\n : (rows.find(row => row.page.id === selectedPageId)?.page.id ?? rows[0]?.page.id);\n\n const toggle = (id: string, open: boolean) =>\n setExpanded(current => {\n if (current.has(id) === open) return current;\n const next = new Set(current);\n if (open) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const focus = (id: string | undefined) => {\n if (!id) return;\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>, index: number) => {\n const row = rows[index];\n if (!row) return;\n switch (event.key) {\n case 'ArrowDown':\n focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowUp':\n focus(rows[index - 1]?.page.id);\n break;\n case 'ArrowRight':\n if (row.hasChildren && !row.expanded) toggle(row.page.id, true);\n else if (row.expanded) focus(rows[index + 1]?.page.id);\n break;\n case 'ArrowLeft':\n if (row.expanded) toggle(row.page.id, false);\n else focus(rows.slice(0, index).findLast(candidate => candidate.depth < row.depth)?.page.id);\n break;\n case 'Enter':\n case ' ':\n onSelect(row.page);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n if (rows.length === 0) {\n return <p className=\"px-3 py-2 text-body text-muted-foreground\">No pages yet.</p>;\n }\n\n const ancestorAt: string[] = [];\n return (\n <div\n ref={scroller}\n role=\"tree\"\n aria-label={ariaLabel}\n className=\"min-h-0 overflow-y-auto py-1\"\n onWheel={() => (userScrolled.current = true)}\n onTouchMove={() => (userScrolled.current = true)}\n onPointerDown={() => (userScrolled.current = true)}\n onKeyDown={() => (userScrolled.current = true)}\n >\n {rows.map((row, index) => {\n const selected = row.page.id === selectedPageId;\n ancestorAt[row.depth] = row.page.id;\n // Levels whose last loaded child is this row's subtree end here: offer their next children.\n const nextDepth = rows[index + 1]?.depth ?? -1;\n const closing: Array<{ parentId: string; depth: number }> = [];\n for (let depth = row.depth - 1; depth >= nextDepth; depth--) {\n const parentId = depth < 0 ? KNOWLEDGE_TREE_ROOT : ancestorAt[depth];\n if (parentId !== undefined) closing.push({ parentId, depth: depth + 1 });\n }\n if (row.expanded && rows[index + 1]?.depth !== row.depth + 1)\n closing.unshift({ parentId: row.page.id, depth: row.depth + 1 });\n return (\n <Fragment key={row.page.id}>\n <div\n ref={element => {\n if (element) itemRefs.current.set(row.page.id, element);\n else itemRefs.current.delete(row.page.id);\n }}\n role=\"treeitem\"\n aria-level={row.depth + 1}\n aria-selected={selected}\n aria-expanded={row.hasChildren ? row.expanded : undefined}\n tabIndex={row.page.id === activeId ? 0 : -1}\n onFocus={() => setFocusedId(row.page.id)}\n onKeyDown={event => onKeyDown(event, index)}\n onClick={() => {\n onSelect(row.page);\n // Selecting a page with children opens it too, which loads them in a lazily loaded tree.\n if (row.hasChildren) toggle(row.page.id, true);\n }}\n className={cn(\n 'flex h-8 cursor-pointer items-center gap-2 rounded-md pr-2 text-body-sm text-foreground outline-none focus-visible:bg-fill-subtle',\n selected ? 'bg-fill-hover' : 'hover:bg-fill-subtle',\n )}\n style={{ paddingLeft: `${row.depth * 12 + 4}px` }}\n >\n {row.hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={row.expanded ? `Collapse ${row.page.name}` : `Expand ${row.page.name}`}\n className=\"flex size-3 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground\"\n onClick={event => {\n event.stopPropagation();\n toggle(row.page.id, !row.expanded);\n }}\n >\n <DisclosureChevron direction=\"right\" open={row.expanded} className=\"size-3\" />\n </button>\n ) : (\n <span className=\"size-3 shrink-0\" aria-hidden />\n )}\n <span className=\"flex shrink-0 items-center text-muted-foreground [&>svg]:size-3.5\" aria-hidden>\n {row.page.isScope && scopeTitle(row.page) !== row.page.name ? (\n <KnowledgeSourceIcon page={row.page} />\n ) : row.hasChildren ? (\n <Folder />\n ) : (\n <FileText />\n )}\n </span>\n <span className={cn('min-w-0 flex-1 truncate', row.page.isScope && 'font-medium')}>\n {scopeTitle(row.page)}\n </span>\n {row.page.childCount ? (\n <span\n data-testid=\"knowledge-tree-count\"\n aria-label={`${childCountLabel(row.page)} below`}\n className=\"shrink-0 text-caption text-placeholder tabular-nums\"\n >\n {childCountLabel(row.page)}\n </span>\n ) : null}\n {pinned.has(row.page.id) ? (\n <Pin size={12} className=\"shrink-0 text-badge-amber-indicator\" aria-label=\"Pinned\" />\n ) : null}\n {row.page.isScope && row.page.address && row.page.address !== row.page.name ? (\n <span\n data-testid=\"knowledge-tree-address\"\n className=\"max-w-1/2 min-w-0 truncate text-caption text-muted-foreground\"\n >\n {row.page.address}\n </span>\n ) : null}\n </div>\n {closing.map(({ parentId, depth }) => {\n const more = loadMore?.get(parentId);\n return more ? (\n <button\n key={`more-${parentId}`}\n type=\"button\"\n className=\"flex h-8 w-full items-center text-left text-caption text-muted-foreground hover:text-foreground\"\n style={{ paddingLeft: `${depth * 12 + 42}px` }}\n onClick={more}\n >\n Load more\n </button>\n ) : null;\n })}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_domains_knowledge_lib_pageAddress = require("../lib/pageAddress.cjs.js");
3
+ const require_utils = require("../../../utils-uDc1ofX1.cjs");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ // src/domains/knowledge/components/KnowledgeSourceIcon.tsx
6
+ function KnowledgeSourceIcon({ page, className }) {
7
+ const SourceIcon = require_domains_knowledge_lib_pageAddress.scopeSource(page)?.icon;
8
+ if (!SourceIcon) return null;
9
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SourceIcon, {
10
+ "aria-hidden": true,
11
+ className: require_utils.cn("shrink-0 text-foreground", className)
12
+ });
13
+ }
14
+ exports.KnowledgeSourceIcon = KnowledgeSourceIcon;
15
+
16
+ //# sourceMappingURL=KnowledgeSourceIcon.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeSourceIcon.cjs.js","names":["scopeSource","cn"],"sources":["../../../../src/domains/knowledge/components/KnowledgeSourceIcon.tsx"],"sourcesContent":["import { scopeSource } from '../lib/pageAddress';\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nimport { cn } from '@/lib/utils';\n\nexport function KnowledgeSourceIcon({ page, className }: { page: KnowledgePagePayload; className?: string }) {\n const SourceIcon = scopeSource(page)?.icon;\n if (!SourceIcon) return null;\n return <SourceIcon aria-hidden className={cn('shrink-0 text-foreground', className)} />;\n}\n"],"mappings":";;;;;AAKA,SAAgB,oBAAoB,EAAE,MAAM,aAAiE;CAC3G,MAAM,aAAaA,0CAAAA,YAAY,IAAI,CAAC,EAAE;CACtC,IAAI,CAAC,YAAY,OAAO;CACxB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;EAAY,eAAA;EAAY,WAAWC,cAAAA,GAAG,4BAA4B,SAAS;CAAI,CAAA;AACxF"}
@@ -0,0 +1 @@
1
+ export * from '../../../src/domains/knowledge/components/KnowledgeSourceIcon';
@@ -0,0 +1,15 @@
1
+ import { scopeSource } from "../lib/pageAddress.es.js";
2
+ import { t as cn } from "../../../utils-DQx8TpNT.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ // src/domains/knowledge/components/KnowledgeSourceIcon.tsx
5
+ function KnowledgeSourceIcon({ page, className }) {
6
+ const SourceIcon = scopeSource(page)?.icon;
7
+ if (!SourceIcon) return null;
8
+ return /* @__PURE__ */ jsx(SourceIcon, {
9
+ "aria-hidden": true,
10
+ className: cn("shrink-0 text-foreground", className)
11
+ });
12
+ }
13
+ export { KnowledgeSourceIcon };
14
+
15
+ //# sourceMappingURL=KnowledgeSourceIcon.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeSourceIcon.es.js","names":[],"sources":["../../../../src/domains/knowledge/components/KnowledgeSourceIcon.tsx"],"sourcesContent":["import { scopeSource } from '../lib/pageAddress';\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nimport { cn } from '@/lib/utils';\n\nexport function KnowledgeSourceIcon({ page, className }: { page: KnowledgePagePayload; className?: string }) {\n const SourceIcon = scopeSource(page)?.icon;\n if (!SourceIcon) return null;\n return <SourceIcon aria-hidden className={cn('shrink-0 text-foreground', className)} />;\n}\n"],"mappings":";;;;AAKA,SAAgB,oBAAoB,EAAE,MAAM,aAAiE;CAC3G,MAAM,aAAa,YAAY,IAAI,CAAC,EAAE;CACtC,IAAI,CAAC,YAAY,OAAO;CACxB,OAAO,oBAAC,YAAD;EAAY,eAAA;EAAY,WAAW,GAAG,4BAA4B,SAAS;CAAI,CAAA;AACxF"}
@@ -0,0 +1,10 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_tooltip = require("../../../tooltip-BsExuMO8.cjs");
3
+ let react_jsx_runtime = require("react/jsx-runtime");
4
+ // src/domains/knowledge/components/KnowledgeTooltip.tsx
5
+ function KnowledgeTooltip({ label, children }) {
6
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_tooltip.Tooltip, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tooltip.TooltipTrigger, { render: children }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tooltip.TooltipContent, { children: label })] });
7
+ }
8
+ exports.KnowledgeTooltip = KnowledgeTooltip;
9
+
10
+ //# sourceMappingURL=KnowledgeTooltip.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeTooltip.cjs.js","names":["Tooltip","TooltipTrigger","TooltipContent"],"sources":["../../../../src/domains/knowledge/components/KnowledgeTooltip.tsx"],"sourcesContent":["import type { ReactElement, ReactNode } from 'react';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip/tooltip';\n\nexport function KnowledgeTooltip({ label, children }: { label: ReactNode; children: ReactElement }) {\n return (\n <Tooltip>\n <TooltipTrigger render={children} />\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n"],"mappings":";;;;AAIA,SAAgB,iBAAiB,EAAE,OAAO,YAA0D;CAClG,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACA,gBAAAA,SAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,gBAAD,EAAgB,QAAQ,SAAW,CAAA,GACnC,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,gBAAD,EAAA,UAAiB,MAAsB,CAAA,CAChC,EAAA,CAAA;AAEb"}
@@ -0,0 +1 @@
1
+ export * from '../../../src/domains/knowledge/components/KnowledgeTooltip';
@@ -0,0 +1,9 @@
1
+ import { i as TooltipTrigger, n as TooltipContent, t as Tooltip } from "../../../tooltip-DJcze2VZ.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/domains/knowledge/components/KnowledgeTooltip.tsx
4
+ function KnowledgeTooltip({ label, children }) {
5
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: children }), /* @__PURE__ */ jsx(TooltipContent, { children: label })] });
6
+ }
7
+ export { KnowledgeTooltip };
8
+
9
+ //# sourceMappingURL=KnowledgeTooltip.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeTooltip.es.js","names":[],"sources":["../../../../src/domains/knowledge/components/KnowledgeTooltip.tsx"],"sourcesContent":["import type { ReactElement, ReactNode } from 'react';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip/tooltip';\n\nexport function KnowledgeTooltip({ label, children }: { label: ReactNode; children: ReactElement }) {\n return (\n <Tooltip>\n <TooltipTrigger render={children} />\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n"],"mappings":";;;AAIA,SAAgB,iBAAiB,EAAE,OAAO,YAA0D;CAClG,OACE,qBAAC,SAAD,EAAA,UAAA,CACE,oBAAC,gBAAD,EAAgB,QAAQ,SAAW,CAAA,GACnC,oBAAC,gBAAD,EAAA,UAAiB,MAAsB,CAAA,CAChC,EAAA,CAAA;AAEb"}
@@ -5,23 +5,35 @@ let _xyflow_react = require("@xyflow/react");
5
5
  // src/domains/knowledge/lib/fitViewport.ts
6
6
  /** How far Fit view may zoom out to frame a ring of linked pages, which the readable floor would crop. */
7
7
  var RING_MIN_ZOOM = .15;
8
+ var NO_INSETS = {
9
+ left: 0,
10
+ right: 0
11
+ };
12
+ function uncoveredInsets(width, insets) {
13
+ return width - insets.left - insets.right > 0 ? insets : NO_INSETS;
14
+ }
8
15
  /**
9
16
  * The viewport that frames `bounds`. Zoom stops at the readable floor, so what is cropped is the edge, not
10
17
  * the page being looked at; only Fit view, with an outer ring, goes lower so the whole ring shows.
11
18
  */
12
- function fitViewport({ bounds, width, height, ring, anchor }) {
19
+ function fitViewport({ bounds, width, height, ring, anchor, insets: drawers = NO_INSETS }) {
20
+ const insets = uncoveredInsets(width, drawers);
13
21
  const floor = ring ? RING_MIN_ZOOM : require_domains_knowledge_lib_graphShape.READABLE_MIN_ZOOM;
14
- const viewport = (0, _xyflow_react.getViewportForBounds)(bounds, width, height, floor, 2, .1);
22
+ const visible = width - insets.left - insets.right;
23
+ const viewport = (0, _xyflow_react.getViewportForBounds)(bounds, visible, height, floor, 2, .1);
15
24
  if (anchor && viewport.zoom <= floor) {
16
25
  const cx = anchor.position.x + (anchor.width ?? 0) / 2;
17
26
  const cy = anchor.position.y + (anchor.height ?? 0) / 2;
18
27
  return {
19
28
  zoom: viewport.zoom,
20
- x: width / 2 - cx * viewport.zoom,
29
+ x: insets.left + visible / 2 - cx * viewport.zoom,
21
30
  y: height / 2 - cy * viewport.zoom
22
31
  };
23
32
  }
24
- return viewport;
33
+ return {
34
+ ...viewport,
35
+ x: viewport.x + insets.left
36
+ };
25
37
  }
26
38
  /** Margin around the drawn nodes on the first view, as a share of the pane. */
27
39
  var INITIAL_FIT_PADDING = .05;
@@ -35,16 +47,17 @@ var INITIAL_SETTLE_MS = 3e3;
35
47
  * fit would put a node under the legend, the pane is fitted again beside it or below it, whichever keeps
36
48
  * the pages larger.
37
49
  */
38
- function fitAllViewport({ bounds, nodes, width, height, legend }) {
50
+ function fitAllViewport({ bounds, nodes, width, height, legend, insets: drawers = NO_INSETS }) {
51
+ const insets = uncoveredInsets(width, drawers);
39
52
  const fitIn = (left, top) => {
40
- const view = (0, _xyflow_react.getViewportForBounds)(bounds, width - left, height - top, RING_MIN_ZOOM, 1, INITIAL_FIT_PADDING);
53
+ const view = (0, _xyflow_react.getViewportForBounds)(bounds, width - left - insets.right, height - top, RING_MIN_ZOOM, 1, INITIAL_FIT_PADDING);
41
54
  return {
42
55
  zoom: view.zoom,
43
56
  x: view.x + left,
44
57
  y: view.y + top
45
58
  };
46
59
  };
47
- const plain = fitIn(0, 0);
60
+ const plain = fitIn(insets.left, 0);
48
61
  if (!legend) return plain;
49
62
  if (!nodes.some((node) => {
50
63
  const left = node.x * plain.zoom + plain.x;
@@ -52,7 +65,7 @@ function fitAllViewport({ bounds, nodes, width, height, legend }) {
52
65
  return left < legend.right && top < legend.bottom;
53
66
  })) return plain;
54
67
  const beside = fitIn(legend.right, 0);
55
- const below = fitIn(0, legend.bottom);
68
+ const below = fitIn(insets.left, legend.bottom);
56
69
  return beside.zoom >= below.zoom ? beside : below;
57
70
  }
58
71
  /** How long a view change animates: the same as the layout's own transition, and none under reduced motion. */
@@ -78,5 +91,6 @@ exports.fitAllViewport = fitAllViewport;
78
91
  exports.fitDuration = fitDuration;
79
92
  exports.fitViewport = fitViewport;
80
93
  exports.nudgeAxis = nudgeAxis;
94
+ exports.uncoveredInsets = uncoveredInsets;
81
95
 
82
96
  //# sourceMappingURL=fitViewport.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitViewport.cjs.js","names":["READABLE_MIN_ZOOM","getViewportForBounds"],"sources":["../../../../src/domains/knowledge/lib/fitViewport.ts"],"sourcesContent":["import { getViewportForBounds } from '@xyflow/react';\nimport type { Viewport } from '@xyflow/react';\n\nimport { READABLE_MIN_ZOOM } from './graphShape';\nimport { KNOWLEDGE_GRAPH_TRANSITION_MS } from './useLeavingNodes';\n\n/** How far Fit view may zoom out to frame a ring of linked pages, which the readable floor would crop. */\nexport const RING_MIN_ZOOM = 0.15;\n\ninterface FitInput {\n bounds: { x: number; y: number; width: number; height: number };\n width: number;\n height: number;\n /** Fit view on a focus with an outer ring of linked pages: frame all of it, below the readable floor if need be. */\n ring?: boolean;\n /** The focus (or the layout's centre): what stays centred when a floor stops the fit. */\n anchor?: { position: { x: number; y: number }; width?: number; height?: number };\n}\n\n/**\n * The viewport that frames `bounds`. Zoom stops at the readable floor, so what is cropped is the edge, not\n * the page being looked at; only Fit view, with an outer ring, goes lower so the whole ring shows.\n */\nexport function fitViewport({ bounds, width, height, ring, anchor }: FitInput): Viewport {\n const floor = ring ? RING_MIN_ZOOM : READABLE_MIN_ZOOM;\n const viewport = getViewportForBounds(bounds, width, height, floor, 2, 0.1);\n if (anchor && viewport.zoom <= floor) {\n const cx = anchor.position.x + (anchor.width ?? 0) / 2;\n const cy = anchor.position.y + (anchor.height ?? 0) / 2;\n return { zoom: viewport.zoom, x: width / 2 - cx * viewport.zoom, y: height / 2 - cy * viewport.zoom };\n }\n return viewport;\n}\n\n/** Margin around the drawn nodes on the first view, as a share of the pane. */\nexport const INITIAL_FIT_PADDING = 0.05;\n/** The first view never zooms in past the pages' own size, however few there are. */\nexport const INITIAL_FIT_MAX_ZOOM = 1;\n/** How long after the first view the graph keeps refitting as pages arrive, unless the user acts first. */\nexport const INITIAL_SETTLE_MS = 3000;\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/**\n * The first view of a graph: every drawn node in the pane with a small margin, never zoomed in past what\n * fits, and clear of `legend` (the box, in pane pixels, an overlay covers at the top left). When the plain\n * fit would put a node under the legend, the pane is fitted again beside it or below it, whichever keeps\n * the pages larger.\n */\nexport function fitAllViewport({\n bounds,\n nodes,\n width,\n height,\n legend,\n}: {\n bounds: Rect;\n nodes: Rect[];\n width: number;\n height: number;\n legend?: { right: number; bottom: number };\n}): Viewport {\n const fitIn = (left: number, top: number): Viewport => {\n const view = getViewportForBounds(\n bounds,\n width - left,\n height - top,\n RING_MIN_ZOOM,\n INITIAL_FIT_MAX_ZOOM,\n INITIAL_FIT_PADDING,\n );\n return { zoom: view.zoom, x: view.x + left, y: view.y + top };\n };\n const plain = fitIn(0, 0);\n if (!legend) return plain;\n const covered = nodes.some(node => {\n const left = node.x * plain.zoom + plain.x;\n const top = node.y * plain.zoom + plain.y;\n return left < legend.right && top < legend.bottom;\n });\n if (!covered) return plain;\n const beside = fitIn(legend.right, 0);\n const below = fitIn(0, legend.bottom);\n return beside.zoom >= below.zoom ? beside : below;\n}\n\n/** How long a view change animates: the same as the layout's own transition, and none under reduced motion. */\nexport const fitDuration = (motion: boolean) => (motion ? KNOWLEDGE_GRAPH_TRANSITION_MS : 0);\n\n/** How close to the pane's edge a refocused page may sit before the view moves to bring it in. */\nexport const NUDGE_PADDING = 24;\n\n/**\n * How far to move the view along one axis so a page at `start` (screen position) of `size` stays inside a\n * pane of `extent`, with padding. Zero when it already is; centred when it can't fit with the padding.\n */\nexport function nudgeAxis(start: number, size: number, extent: number): number {\n if (size + NUDGE_PADDING * 2 > extent) return extent / 2 - (start + size / 2);\n if (start < NUDGE_PADDING) return NUDGE_PADDING - start;\n const overflow = start + size - (extent - NUDGE_PADDING);\n return overflow > 0 ? -overflow : 0;\n}\n"],"mappings":";;;;;;AAOA,IAAa,gBAAgB;;;;;AAgB7B,SAAgB,YAAY,EAAE,QAAQ,OAAO,QAAQ,MAAM,UAA8B;CACvF,MAAM,QAAQ,OAAO,gBAAgBA,yCAAAA;CACrC,MAAM,YAAA,GAAWC,cAAAA,qBAAAA,CAAqB,QAAQ,OAAO,QAAQ,OAAO,GAAG,EAAG;CAC1E,IAAI,UAAU,SAAS,QAAQ,OAAO;EACpC,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK;EACrD,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU,KAAK;EACtD,OAAO;GAAE,MAAM,SAAS;GAAM,GAAG,QAAQ,IAAI,KAAK,SAAS;GAAM,GAAG,SAAS,IAAI,KAAK,SAAS;EAAK;CACtG;CACA,OAAO;AACT;;AAGA,IAAa,sBAAsB;;AAEnC,IAAa,uBAAuB;;AAEpC,IAAa,oBAAoB;;;;;;;AAUjC,SAAgB,eAAe,EAC7B,QACA,OACA,OACA,QACA,UAOW;CACX,MAAM,SAAS,MAAc,QAA0B;EACrD,MAAM,QAAA,GAAOA,cAAAA,qBAAAA,CACX,QACA,QAAQ,MACR,SAAS,KACT,eAAA,GAEA,mBACF;EACA,OAAO;GAAE,MAAM,KAAK;GAAM,GAAG,KAAK,IAAI;GAAM,GAAG,KAAK,IAAI;EAAI;CAC9D;CACA,MAAM,QAAQ,MAAM,GAAG,CAAC;CACxB,IAAI,CAAC,QAAQ,OAAO;CAMpB,IAAI,CALY,MAAM,MAAK,SAAQ;EACjC,MAAM,OAAO,KAAK,IAAI,MAAM,OAAO,MAAM;EACzC,MAAM,MAAM,KAAK,IAAI,MAAM,OAAO,MAAM;EACxC,OAAO,OAAO,OAAO,SAAS,MAAM,OAAO;CAC7C,CACK,GAAS,OAAO;CACrB,MAAM,SAAS,MAAM,OAAO,OAAO,CAAC;CACpC,MAAM,QAAQ,MAAM,GAAG,OAAO,MAAM;CACpC,OAAO,OAAO,QAAQ,MAAM,OAAO,SAAS;AAC9C;;AAGA,IAAa,eAAe,WAAqB,SAAA,MAAyC;;AAG1F,IAAa,gBAAgB;;;;;AAM7B,SAAgB,UAAU,OAAe,MAAc,QAAwB;CAC7E,IAAI,OAAO,KAAoB,QAAQ,OAAO,SAAS,KAAK,QAAQ,OAAO;CAC3E,IAAI,QAAA,IAAuB,OAAA,KAAuB;CAClD,MAAM,WAAW,QAAQ,QAAQ,SAAA;CACjC,OAAO,WAAW,IAAI,CAAC,WAAW;AACpC"}
1
+ {"version":3,"file":"fitViewport.cjs.js","names":["READABLE_MIN_ZOOM","getViewportForBounds"],"sources":["../../../../src/domains/knowledge/lib/fitViewport.ts"],"sourcesContent":["import { getViewportForBounds } from '@xyflow/react';\nimport type { Viewport } from '@xyflow/react';\n\nimport { READABLE_MIN_ZOOM } from './graphShape';\nimport { KNOWLEDGE_GRAPH_TRANSITION_MS } from './useLeavingNodes';\n\n/** How far Fit view may zoom out to frame a ring of linked pages, which the readable floor would crop. */\nexport const RING_MIN_ZOOM = 0.15;\n\ninterface FitInput {\n bounds: { x: number; y: number; width: number; height: number };\n width: number;\n height: number;\n /** Fit view on a focus with an outer ring of linked pages: frame all of it, below the readable floor if need be. */\n ring?: boolean;\n /** The focus (or the layout's centre): what stays centred when a floor stops the fit. */\n anchor?: { position: { x: number; y: number }; width?: number; height?: number };\n insets?: PaneInsets;\n}\n\nexport interface PaneInsets {\n left: number;\n right: number;\n}\n\nconst NO_INSETS: PaneInsets = { left: 0, right: 0 };\n\nexport function uncoveredInsets(width: number, insets: PaneInsets): PaneInsets {\n return width - insets.left - insets.right > 0 ? insets : NO_INSETS;\n}\n\n/**\n * The viewport that frames `bounds`. Zoom stops at the readable floor, so what is cropped is the edge, not\n * the page being looked at; only Fit view, with an outer ring, goes lower so the whole ring shows.\n */\nexport function fitViewport({ bounds, width, height, ring, anchor, insets: drawers = NO_INSETS }: FitInput): Viewport {\n const insets = uncoveredInsets(width, drawers);\n const floor = ring ? RING_MIN_ZOOM : READABLE_MIN_ZOOM;\n const visible = width - insets.left - insets.right;\n const viewport = getViewportForBounds(bounds, visible, height, floor, 2, 0.1);\n if (anchor && viewport.zoom <= floor) {\n const cx = anchor.position.x + (anchor.width ?? 0) / 2;\n const cy = anchor.position.y + (anchor.height ?? 0) / 2;\n return {\n zoom: viewport.zoom,\n x: insets.left + visible / 2 - cx * viewport.zoom,\n y: height / 2 - cy * viewport.zoom,\n };\n }\n return { ...viewport, x: viewport.x + insets.left };\n}\n\n/** Margin around the drawn nodes on the first view, as a share of the pane. */\nexport const INITIAL_FIT_PADDING = 0.05;\n/** The first view never zooms in past the pages' own size, however few there are. */\nexport const INITIAL_FIT_MAX_ZOOM = 1;\n/** How long after the first view the graph keeps refitting as pages arrive, unless the user acts first. */\nexport const INITIAL_SETTLE_MS = 3000;\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/**\n * The first view of a graph: every drawn node in the pane with a small margin, never zoomed in past what\n * fits, and clear of `legend` (the box, in pane pixels, an overlay covers at the top left). When the plain\n * fit would put a node under the legend, the pane is fitted again beside it or below it, whichever keeps\n * the pages larger.\n */\nexport function fitAllViewport({\n bounds,\n nodes,\n width,\n height,\n legend,\n insets: drawers = NO_INSETS,\n}: {\n bounds: Rect;\n nodes: Rect[];\n width: number;\n height: number;\n legend?: { right: number; bottom: number };\n insets?: PaneInsets;\n}): Viewport {\n const insets = uncoveredInsets(width, drawers);\n const fitIn = (left: number, top: number): Viewport => {\n const view = getViewportForBounds(\n bounds,\n width - left - insets.right,\n height - top,\n RING_MIN_ZOOM,\n INITIAL_FIT_MAX_ZOOM,\n INITIAL_FIT_PADDING,\n );\n return { zoom: view.zoom, x: view.x + left, y: view.y + top };\n };\n const plain = fitIn(insets.left, 0);\n if (!legend) return plain;\n const covered = nodes.some(node => {\n const left = node.x * plain.zoom + plain.x;\n const top = node.y * plain.zoom + plain.y;\n return left < legend.right && top < legend.bottom;\n });\n if (!covered) return plain;\n const beside = fitIn(legend.right, 0);\n const below = fitIn(insets.left, legend.bottom);\n return beside.zoom >= below.zoom ? beside : below;\n}\n\n/** How long a view change animates: the same as the layout's own transition, and none under reduced motion. */\nexport const fitDuration = (motion: boolean) => (motion ? KNOWLEDGE_GRAPH_TRANSITION_MS : 0);\n\n/** How close to the pane's edge a refocused page may sit before the view moves to bring it in. */\nexport const NUDGE_PADDING = 24;\n\n/**\n * How far to move the view along one axis so a page at `start` (screen position) of `size` stays inside a\n * pane of `extent`, with padding. Zero when it already is; centred when it can't fit with the padding.\n */\nexport function nudgeAxis(start: number, size: number, extent: number): number {\n if (size + NUDGE_PADDING * 2 > extent) return extent / 2 - (start + size / 2);\n if (start < NUDGE_PADDING) return NUDGE_PADDING - start;\n const overflow = start + size - (extent - NUDGE_PADDING);\n return overflow > 0 ? -overflow : 0;\n}\n"],"mappings":";;;;;;AAOA,IAAa,gBAAgB;AAkB7B,IAAM,YAAwB;CAAE,MAAM;CAAG,OAAO;AAAE;AAElD,SAAgB,gBAAgB,OAAe,QAAgC;CAC7E,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,IAAI,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,EAAE,QAAQ,OAAO,QAAQ,MAAM,QAAQ,QAAQ,UAAU,aAAiC;CACpH,MAAM,SAAS,gBAAgB,OAAO,OAAO;CAC7C,MAAM,QAAQ,OAAO,gBAAgBA,yCAAAA;CACrC,MAAM,UAAU,QAAQ,OAAO,OAAO,OAAO;CAC7C,MAAM,YAAA,GAAWC,cAAAA,qBAAAA,CAAqB,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAG;CAC5E,IAAI,UAAU,SAAS,QAAQ,OAAO;EACpC,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK;EACrD,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU,KAAK;EACtD,OAAO;GACL,MAAM,SAAS;GACf,GAAG,OAAO,OAAO,UAAU,IAAI,KAAK,SAAS;GAC7C,GAAG,SAAS,IAAI,KAAK,SAAS;EAChC;CACF;CACA,OAAO;EAAE,GAAG;EAAU,GAAG,SAAS,IAAI,OAAO;CAAK;AACpD;;AAGA,IAAa,sBAAsB;;AAEnC,IAAa,uBAAuB;;AAEpC,IAAa,oBAAoB;;;;;;;AAUjC,SAAgB,eAAe,EAC7B,QACA,OACA,OACA,QACA,QACA,QAAQ,UAAU,aAQP;CACX,MAAM,SAAS,gBAAgB,OAAO,OAAO;CAC7C,MAAM,SAAS,MAAc,QAA0B;EACrD,MAAM,QAAA,GAAOA,cAAAA,qBAAAA,CACX,QACA,QAAQ,OAAO,OAAO,OACtB,SAAS,KACT,eAAA,GAEA,mBACF;EACA,OAAO;GAAE,MAAM,KAAK;GAAM,GAAG,KAAK,IAAI;GAAM,GAAG,KAAK,IAAI;EAAI;CAC9D;CACA,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC;CAClC,IAAI,CAAC,QAAQ,OAAO;CAMpB,IAAI,CALY,MAAM,MAAK,SAAQ;EACjC,MAAM,OAAO,KAAK,IAAI,MAAM,OAAO,MAAM;EACzC,MAAM,MAAM,KAAK,IAAI,MAAM,OAAO,MAAM;EACxC,OAAO,OAAO,OAAO,SAAS,MAAM,OAAO;CAC7C,CACK,GAAS,OAAO;CACrB,MAAM,SAAS,MAAM,OAAO,OAAO,CAAC;CACpC,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM;CAC9C,OAAO,OAAO,QAAQ,MAAM,OAAO,SAAS;AAC9C;;AAGA,IAAa,eAAe,WAAqB,SAAA,MAAyC;;AAG1F,IAAa,gBAAgB;;;;;AAM7B,SAAgB,UAAU,OAAe,MAAc,QAAwB;CAC7E,IAAI,OAAO,KAAoB,QAAQ,OAAO,SAAS,KAAK,QAAQ,OAAO;CAC3E,IAAI,QAAA,IAAuB,OAAA,KAAuB;CAClD,MAAM,WAAW,QAAQ,QAAQ,SAAA;CACjC,OAAO,WAAW,IAAI,CAAC,WAAW;AACpC"}
@@ -4,23 +4,35 @@ import { getViewportForBounds } from "@xyflow/react";
4
4
  // src/domains/knowledge/lib/fitViewport.ts
5
5
  /** How far Fit view may zoom out to frame a ring of linked pages, which the readable floor would crop. */
6
6
  var RING_MIN_ZOOM = .15;
7
+ var NO_INSETS = {
8
+ left: 0,
9
+ right: 0
10
+ };
11
+ function uncoveredInsets(width, insets) {
12
+ return width - insets.left - insets.right > 0 ? insets : NO_INSETS;
13
+ }
7
14
  /**
8
15
  * The viewport that frames `bounds`. Zoom stops at the readable floor, so what is cropped is the edge, not
9
16
  * the page being looked at; only Fit view, with an outer ring, goes lower so the whole ring shows.
10
17
  */
11
- function fitViewport({ bounds, width, height, ring, anchor }) {
18
+ function fitViewport({ bounds, width, height, ring, anchor, insets: drawers = NO_INSETS }) {
19
+ const insets = uncoveredInsets(width, drawers);
12
20
  const floor = ring ? RING_MIN_ZOOM : READABLE_MIN_ZOOM;
13
- const viewport = getViewportForBounds(bounds, width, height, floor, 2, .1);
21
+ const visible = width - insets.left - insets.right;
22
+ const viewport = getViewportForBounds(bounds, visible, height, floor, 2, .1);
14
23
  if (anchor && viewport.zoom <= floor) {
15
24
  const cx = anchor.position.x + (anchor.width ?? 0) / 2;
16
25
  const cy = anchor.position.y + (anchor.height ?? 0) / 2;
17
26
  return {
18
27
  zoom: viewport.zoom,
19
- x: width / 2 - cx * viewport.zoom,
28
+ x: insets.left + visible / 2 - cx * viewport.zoom,
20
29
  y: height / 2 - cy * viewport.zoom
21
30
  };
22
31
  }
23
- return viewport;
32
+ return {
33
+ ...viewport,
34
+ x: viewport.x + insets.left
35
+ };
24
36
  }
25
37
  /** Margin around the drawn nodes on the first view, as a share of the pane. */
26
38
  var INITIAL_FIT_PADDING = .05;
@@ -34,16 +46,17 @@ var INITIAL_SETTLE_MS = 3e3;
34
46
  * fit would put a node under the legend, the pane is fitted again beside it or below it, whichever keeps
35
47
  * the pages larger.
36
48
  */
37
- function fitAllViewport({ bounds, nodes, width, height, legend }) {
49
+ function fitAllViewport({ bounds, nodes, width, height, legend, insets: drawers = NO_INSETS }) {
50
+ const insets = uncoveredInsets(width, drawers);
38
51
  const fitIn = (left, top) => {
39
- const view = getViewportForBounds(bounds, width - left, height - top, RING_MIN_ZOOM, 1, INITIAL_FIT_PADDING);
52
+ const view = getViewportForBounds(bounds, width - left - insets.right, height - top, RING_MIN_ZOOM, 1, INITIAL_FIT_PADDING);
40
53
  return {
41
54
  zoom: view.zoom,
42
55
  x: view.x + left,
43
56
  y: view.y + top
44
57
  };
45
58
  };
46
- const plain = fitIn(0, 0);
59
+ const plain = fitIn(insets.left, 0);
47
60
  if (!legend) return plain;
48
61
  if (!nodes.some((node) => {
49
62
  const left = node.x * plain.zoom + plain.x;
@@ -51,7 +64,7 @@ function fitAllViewport({ bounds, nodes, width, height, legend }) {
51
64
  return left < legend.right && top < legend.bottom;
52
65
  })) return plain;
53
66
  const beside = fitIn(legend.right, 0);
54
- const below = fitIn(0, legend.bottom);
67
+ const below = fitIn(insets.left, legend.bottom);
55
68
  return beside.zoom >= below.zoom ? beside : below;
56
69
  }
57
70
  /** How long a view change animates: the same as the layout's own transition, and none under reduced motion. */
@@ -68,6 +81,6 @@ function nudgeAxis(start, size, extent) {
68
81
  const overflow = start + size - (extent - 24);
69
82
  return overflow > 0 ? -overflow : 0;
70
83
  }
71
- export { INITIAL_FIT_MAX_ZOOM, INITIAL_FIT_PADDING, INITIAL_SETTLE_MS, NUDGE_PADDING, RING_MIN_ZOOM, fitAllViewport, fitDuration, fitViewport, nudgeAxis };
84
+ export { INITIAL_FIT_MAX_ZOOM, INITIAL_FIT_PADDING, INITIAL_SETTLE_MS, NUDGE_PADDING, RING_MIN_ZOOM, fitAllViewport, fitDuration, fitViewport, nudgeAxis, uncoveredInsets };
72
85
 
73
86
  //# sourceMappingURL=fitViewport.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitViewport.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/fitViewport.ts"],"sourcesContent":["import { getViewportForBounds } from '@xyflow/react';\nimport type { Viewport } from '@xyflow/react';\n\nimport { READABLE_MIN_ZOOM } from './graphShape';\nimport { KNOWLEDGE_GRAPH_TRANSITION_MS } from './useLeavingNodes';\n\n/** How far Fit view may zoom out to frame a ring of linked pages, which the readable floor would crop. */\nexport const RING_MIN_ZOOM = 0.15;\n\ninterface FitInput {\n bounds: { x: number; y: number; width: number; height: number };\n width: number;\n height: number;\n /** Fit view on a focus with an outer ring of linked pages: frame all of it, below the readable floor if need be. */\n ring?: boolean;\n /** The focus (or the layout's centre): what stays centred when a floor stops the fit. */\n anchor?: { position: { x: number; y: number }; width?: number; height?: number };\n}\n\n/**\n * The viewport that frames `bounds`. Zoom stops at the readable floor, so what is cropped is the edge, not\n * the page being looked at; only Fit view, with an outer ring, goes lower so the whole ring shows.\n */\nexport function fitViewport({ bounds, width, height, ring, anchor }: FitInput): Viewport {\n const floor = ring ? RING_MIN_ZOOM : READABLE_MIN_ZOOM;\n const viewport = getViewportForBounds(bounds, width, height, floor, 2, 0.1);\n if (anchor && viewport.zoom <= floor) {\n const cx = anchor.position.x + (anchor.width ?? 0) / 2;\n const cy = anchor.position.y + (anchor.height ?? 0) / 2;\n return { zoom: viewport.zoom, x: width / 2 - cx * viewport.zoom, y: height / 2 - cy * viewport.zoom };\n }\n return viewport;\n}\n\n/** Margin around the drawn nodes on the first view, as a share of the pane. */\nexport const INITIAL_FIT_PADDING = 0.05;\n/** The first view never zooms in past the pages' own size, however few there are. */\nexport const INITIAL_FIT_MAX_ZOOM = 1;\n/** How long after the first view the graph keeps refitting as pages arrive, unless the user acts first. */\nexport const INITIAL_SETTLE_MS = 3000;\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/**\n * The first view of a graph: every drawn node in the pane with a small margin, never zoomed in past what\n * fits, and clear of `legend` (the box, in pane pixels, an overlay covers at the top left). When the plain\n * fit would put a node under the legend, the pane is fitted again beside it or below it, whichever keeps\n * the pages larger.\n */\nexport function fitAllViewport({\n bounds,\n nodes,\n width,\n height,\n legend,\n}: {\n bounds: Rect;\n nodes: Rect[];\n width: number;\n height: number;\n legend?: { right: number; bottom: number };\n}): Viewport {\n const fitIn = (left: number, top: number): Viewport => {\n const view = getViewportForBounds(\n bounds,\n width - left,\n height - top,\n RING_MIN_ZOOM,\n INITIAL_FIT_MAX_ZOOM,\n INITIAL_FIT_PADDING,\n );\n return { zoom: view.zoom, x: view.x + left, y: view.y + top };\n };\n const plain = fitIn(0, 0);\n if (!legend) return plain;\n const covered = nodes.some(node => {\n const left = node.x * plain.zoom + plain.x;\n const top = node.y * plain.zoom + plain.y;\n return left < legend.right && top < legend.bottom;\n });\n if (!covered) return plain;\n const beside = fitIn(legend.right, 0);\n const below = fitIn(0, legend.bottom);\n return beside.zoom >= below.zoom ? beside : below;\n}\n\n/** How long a view change animates: the same as the layout's own transition, and none under reduced motion. */\nexport const fitDuration = (motion: boolean) => (motion ? KNOWLEDGE_GRAPH_TRANSITION_MS : 0);\n\n/** How close to the pane's edge a refocused page may sit before the view moves to bring it in. */\nexport const NUDGE_PADDING = 24;\n\n/**\n * How far to move the view along one axis so a page at `start` (screen position) of `size` stays inside a\n * pane of `extent`, with padding. Zero when it already is; centred when it can't fit with the padding.\n */\nexport function nudgeAxis(start: number, size: number, extent: number): number {\n if (size + NUDGE_PADDING * 2 > extent) return extent / 2 - (start + size / 2);\n if (start < NUDGE_PADDING) return NUDGE_PADDING - start;\n const overflow = start + size - (extent - NUDGE_PADDING);\n return overflow > 0 ? -overflow : 0;\n}\n"],"mappings":";;;;;AAOA,IAAa,gBAAgB;;;;;AAgB7B,SAAgB,YAAY,EAAE,QAAQ,OAAO,QAAQ,MAAM,UAA8B;CACvF,MAAM,QAAQ,OAAO,gBAAgB;CACrC,MAAM,WAAW,qBAAqB,QAAQ,OAAO,QAAQ,OAAO,GAAG,EAAG;CAC1E,IAAI,UAAU,SAAS,QAAQ,OAAO;EACpC,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK;EACrD,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU,KAAK;EACtD,OAAO;GAAE,MAAM,SAAS;GAAM,GAAG,QAAQ,IAAI,KAAK,SAAS;GAAM,GAAG,SAAS,IAAI,KAAK,SAAS;EAAK;CACtG;CACA,OAAO;AACT;;AAGA,IAAa,sBAAsB;;AAEnC,IAAa,uBAAuB;;AAEpC,IAAa,oBAAoB;;;;;;;AAUjC,SAAgB,eAAe,EAC7B,QACA,OACA,OACA,QACA,UAOW;CACX,MAAM,SAAS,MAAc,QAA0B;EACrD,MAAM,OAAO,qBACX,QACA,QAAQ,MACR,SAAS,KACT,eAAA,GAEA,mBACF;EACA,OAAO;GAAE,MAAM,KAAK;GAAM,GAAG,KAAK,IAAI;GAAM,GAAG,KAAK,IAAI;EAAI;CAC9D;CACA,MAAM,QAAQ,MAAM,GAAG,CAAC;CACxB,IAAI,CAAC,QAAQ,OAAO;CAMpB,IAAI,CALY,MAAM,MAAK,SAAQ;EACjC,MAAM,OAAO,KAAK,IAAI,MAAM,OAAO,MAAM;EACzC,MAAM,MAAM,KAAK,IAAI,MAAM,OAAO,MAAM;EACxC,OAAO,OAAO,OAAO,SAAS,MAAM,OAAO;CAC7C,CACK,GAAS,OAAO;CACrB,MAAM,SAAS,MAAM,OAAO,OAAO,CAAC;CACpC,MAAM,QAAQ,MAAM,GAAG,OAAO,MAAM;CACpC,OAAO,OAAO,QAAQ,MAAM,OAAO,SAAS;AAC9C;;AAGA,IAAa,eAAe,WAAqB,SAAA,MAAyC;;AAG1F,IAAa,gBAAgB;;;;;AAM7B,SAAgB,UAAU,OAAe,MAAc,QAAwB;CAC7E,IAAI,OAAO,KAAoB,QAAQ,OAAO,SAAS,KAAK,QAAQ,OAAO;CAC3E,IAAI,QAAA,IAAuB,OAAA,KAAuB;CAClD,MAAM,WAAW,QAAQ,QAAQ,SAAA;CACjC,OAAO,WAAW,IAAI,CAAC,WAAW;AACpC"}
1
+ {"version":3,"file":"fitViewport.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/fitViewport.ts"],"sourcesContent":["import { getViewportForBounds } from '@xyflow/react';\nimport type { Viewport } from '@xyflow/react';\n\nimport { READABLE_MIN_ZOOM } from './graphShape';\nimport { KNOWLEDGE_GRAPH_TRANSITION_MS } from './useLeavingNodes';\n\n/** How far Fit view may zoom out to frame a ring of linked pages, which the readable floor would crop. */\nexport const RING_MIN_ZOOM = 0.15;\n\ninterface FitInput {\n bounds: { x: number; y: number; width: number; height: number };\n width: number;\n height: number;\n /** Fit view on a focus with an outer ring of linked pages: frame all of it, below the readable floor if need be. */\n ring?: boolean;\n /** The focus (or the layout's centre): what stays centred when a floor stops the fit. */\n anchor?: { position: { x: number; y: number }; width?: number; height?: number };\n insets?: PaneInsets;\n}\n\nexport interface PaneInsets {\n left: number;\n right: number;\n}\n\nconst NO_INSETS: PaneInsets = { left: 0, right: 0 };\n\nexport function uncoveredInsets(width: number, insets: PaneInsets): PaneInsets {\n return width - insets.left - insets.right > 0 ? insets : NO_INSETS;\n}\n\n/**\n * The viewport that frames `bounds`. Zoom stops at the readable floor, so what is cropped is the edge, not\n * the page being looked at; only Fit view, with an outer ring, goes lower so the whole ring shows.\n */\nexport function fitViewport({ bounds, width, height, ring, anchor, insets: drawers = NO_INSETS }: FitInput): Viewport {\n const insets = uncoveredInsets(width, drawers);\n const floor = ring ? RING_MIN_ZOOM : READABLE_MIN_ZOOM;\n const visible = width - insets.left - insets.right;\n const viewport = getViewportForBounds(bounds, visible, height, floor, 2, 0.1);\n if (anchor && viewport.zoom <= floor) {\n const cx = anchor.position.x + (anchor.width ?? 0) / 2;\n const cy = anchor.position.y + (anchor.height ?? 0) / 2;\n return {\n zoom: viewport.zoom,\n x: insets.left + visible / 2 - cx * viewport.zoom,\n y: height / 2 - cy * viewport.zoom,\n };\n }\n return { ...viewport, x: viewport.x + insets.left };\n}\n\n/** Margin around the drawn nodes on the first view, as a share of the pane. */\nexport const INITIAL_FIT_PADDING = 0.05;\n/** The first view never zooms in past the pages' own size, however few there are. */\nexport const INITIAL_FIT_MAX_ZOOM = 1;\n/** How long after the first view the graph keeps refitting as pages arrive, unless the user acts first. */\nexport const INITIAL_SETTLE_MS = 3000;\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/**\n * The first view of a graph: every drawn node in the pane with a small margin, never zoomed in past what\n * fits, and clear of `legend` (the box, in pane pixels, an overlay covers at the top left). When the plain\n * fit would put a node under the legend, the pane is fitted again beside it or below it, whichever keeps\n * the pages larger.\n */\nexport function fitAllViewport({\n bounds,\n nodes,\n width,\n height,\n legend,\n insets: drawers = NO_INSETS,\n}: {\n bounds: Rect;\n nodes: Rect[];\n width: number;\n height: number;\n legend?: { right: number; bottom: number };\n insets?: PaneInsets;\n}): Viewport {\n const insets = uncoveredInsets(width, drawers);\n const fitIn = (left: number, top: number): Viewport => {\n const view = getViewportForBounds(\n bounds,\n width - left - insets.right,\n height - top,\n RING_MIN_ZOOM,\n INITIAL_FIT_MAX_ZOOM,\n INITIAL_FIT_PADDING,\n );\n return { zoom: view.zoom, x: view.x + left, y: view.y + top };\n };\n const plain = fitIn(insets.left, 0);\n if (!legend) return plain;\n const covered = nodes.some(node => {\n const left = node.x * plain.zoom + plain.x;\n const top = node.y * plain.zoom + plain.y;\n return left < legend.right && top < legend.bottom;\n });\n if (!covered) return plain;\n const beside = fitIn(legend.right, 0);\n const below = fitIn(insets.left, legend.bottom);\n return beside.zoom >= below.zoom ? beside : below;\n}\n\n/** How long a view change animates: the same as the layout's own transition, and none under reduced motion. */\nexport const fitDuration = (motion: boolean) => (motion ? KNOWLEDGE_GRAPH_TRANSITION_MS : 0);\n\n/** How close to the pane's edge a refocused page may sit before the view moves to bring it in. */\nexport const NUDGE_PADDING = 24;\n\n/**\n * How far to move the view along one axis so a page at `start` (screen position) of `size` stays inside a\n * pane of `extent`, with padding. Zero when it already is; centred when it can't fit with the padding.\n */\nexport function nudgeAxis(start: number, size: number, extent: number): number {\n if (size + NUDGE_PADDING * 2 > extent) return extent / 2 - (start + size / 2);\n if (start < NUDGE_PADDING) return NUDGE_PADDING - start;\n const overflow = start + size - (extent - NUDGE_PADDING);\n return overflow > 0 ? -overflow : 0;\n}\n"],"mappings":";;;;;AAOA,IAAa,gBAAgB;AAkB7B,IAAM,YAAwB;CAAE,MAAM;CAAG,OAAO;AAAE;AAElD,SAAgB,gBAAgB,OAAe,QAAgC;CAC7E,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,IAAI,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,EAAE,QAAQ,OAAO,QAAQ,MAAM,QAAQ,QAAQ,UAAU,aAAiC;CACpH,MAAM,SAAS,gBAAgB,OAAO,OAAO;CAC7C,MAAM,QAAQ,OAAO,gBAAgB;CACrC,MAAM,UAAU,QAAQ,OAAO,OAAO,OAAO;CAC7C,MAAM,WAAW,qBAAqB,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAG;CAC5E,IAAI,UAAU,SAAS,QAAQ,OAAO;EACpC,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK;EACrD,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU,KAAK;EACtD,OAAO;GACL,MAAM,SAAS;GACf,GAAG,OAAO,OAAO,UAAU,IAAI,KAAK,SAAS;GAC7C,GAAG,SAAS,IAAI,KAAK,SAAS;EAChC;CACF;CACA,OAAO;EAAE,GAAG;EAAU,GAAG,SAAS,IAAI,OAAO;CAAK;AACpD;;AAGA,IAAa,sBAAsB;;AAEnC,IAAa,uBAAuB;;AAEpC,IAAa,oBAAoB;;;;;;;AAUjC,SAAgB,eAAe,EAC7B,QACA,OACA,OACA,QACA,QACA,QAAQ,UAAU,aAQP;CACX,MAAM,SAAS,gBAAgB,OAAO,OAAO;CAC7C,MAAM,SAAS,MAAc,QAA0B;EACrD,MAAM,OAAO,qBACX,QACA,QAAQ,OAAO,OAAO,OACtB,SAAS,KACT,eAAA,GAEA,mBACF;EACA,OAAO;GAAE,MAAM,KAAK;GAAM,GAAG,KAAK,IAAI;GAAM,GAAG,KAAK,IAAI;EAAI;CAC9D;CACA,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC;CAClC,IAAI,CAAC,QAAQ,OAAO;CAMpB,IAAI,CALY,MAAM,MAAK,SAAQ;EACjC,MAAM,OAAO,KAAK,IAAI,MAAM,OAAO,MAAM;EACzC,MAAM,MAAM,KAAK,IAAI,MAAM,OAAO,MAAM;EACxC,OAAO,OAAO,OAAO,SAAS,MAAM,OAAO;CAC7C,CACK,GAAS,OAAO;CACrB,MAAM,SAAS,MAAM,OAAO,OAAO,CAAC;CACpC,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM;CAC9C,OAAO,OAAO,QAAQ,MAAM,OAAO,SAAS;AAC9C;;AAGA,IAAa,eAAe,WAAqB,SAAA,MAAyC;;AAG1F,IAAa,gBAAgB;;;;;AAM7B,SAAgB,UAAU,OAAe,MAAc,QAAwB;CAC7E,IAAI,OAAO,KAAoB,QAAQ,OAAO,SAAS,KAAK,QAAQ,OAAO;CAC3E,IAAI,QAAA,IAAuB,OAAA,KAAuB;CAClD,MAAM,WAAW,QAAQ,QAAQ,SAAA;CACjC,OAAO,WAAW,IAAI,CAAC,WAAW;AACpC"}