@flanksource/clicky-ui 0.2.21 → 0.3.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 (522) hide show
  1. package/dist/comments/CommentAuthor.cjs +58 -0
  2. package/dist/comments/CommentAuthor.cjs.map +1 -0
  3. package/dist/comments/CommentAuthor.d.ts +17 -0
  4. package/dist/comments/CommentAuthor.d.ts.map +1 -0
  5. package/dist/comments/CommentAuthor.js +58 -0
  6. package/dist/comments/CommentAuthor.js.map +1 -0
  7. package/dist/comments/CommentCard.cjs +343 -0
  8. package/dist/comments/CommentCard.cjs.map +1 -0
  9. package/dist/comments/CommentCard.d.ts +27 -0
  10. package/dist/comments/CommentCard.d.ts.map +1 -0
  11. package/dist/comments/CommentCard.js +343 -0
  12. package/dist/comments/CommentCard.js.map +1 -0
  13. package/dist/comments/CommentComposer.cjs +207 -0
  14. package/dist/comments/CommentComposer.cjs.map +1 -0
  15. package/dist/comments/CommentComposer.d.ts +23 -0
  16. package/dist/comments/CommentComposer.d.ts.map +1 -0
  17. package/dist/comments/CommentComposer.js +207 -0
  18. package/dist/comments/CommentComposer.js.map +1 -0
  19. package/dist/comments/CommentFilterBar.cjs +145 -0
  20. package/dist/comments/CommentFilterBar.cjs.map +1 -0
  21. package/dist/comments/CommentFilterBar.d.ts +15 -0
  22. package/dist/comments/CommentFilterBar.d.ts.map +1 -0
  23. package/dist/comments/CommentFilterBar.js +145 -0
  24. package/dist/comments/CommentFilterBar.js.map +1 -0
  25. package/dist/comments/CommentMarkdown.cjs +156 -0
  26. package/dist/comments/CommentMarkdown.cjs.map +1 -0
  27. package/dist/comments/CommentMarkdown.d.ts +13 -0
  28. package/dist/comments/CommentMarkdown.d.ts.map +1 -0
  29. package/dist/comments/CommentMarkdown.js +156 -0
  30. package/dist/comments/CommentMarkdown.js.map +1 -0
  31. package/dist/comments/CommentProgress.cjs +86 -0
  32. package/dist/comments/CommentProgress.cjs.map +1 -0
  33. package/dist/comments/CommentProgress.d.ts +16 -0
  34. package/dist/comments/CommentProgress.d.ts.map +1 -0
  35. package/dist/comments/CommentProgress.js +86 -0
  36. package/dist/comments/CommentProgress.js.map +1 -0
  37. package/dist/comments/CommentProvider.cjs +99 -0
  38. package/dist/comments/CommentProvider.cjs.map +1 -0
  39. package/dist/comments/CommentProvider.d.ts +19 -0
  40. package/dist/comments/CommentProvider.d.ts.map +1 -0
  41. package/dist/comments/CommentProvider.js +99 -0
  42. package/dist/comments/CommentProvider.js.map +1 -0
  43. package/dist/comments/CommentSidePanel.cjs +219 -0
  44. package/dist/comments/CommentSidePanel.cjs.map +1 -0
  45. package/dist/comments/CommentSidePanel.d.ts +16 -0
  46. package/dist/comments/CommentSidePanel.d.ts.map +1 -0
  47. package/dist/comments/CommentSidePanel.js +219 -0
  48. package/dist/comments/CommentSidePanel.js.map +1 -0
  49. package/dist/comments/CommentThread.cjs +57 -0
  50. package/dist/comments/CommentThread.cjs.map +1 -0
  51. package/dist/comments/CommentThread.d.ts +24 -0
  52. package/dist/comments/CommentThread.d.ts.map +1 -0
  53. package/dist/comments/CommentThread.js +57 -0
  54. package/dist/comments/CommentThread.js.map +1 -0
  55. package/dist/comments/CommentThreadList.cjs +124 -0
  56. package/dist/comments/CommentThreadList.cjs.map +1 -0
  57. package/dist/comments/CommentThreadList.d.ts +25 -0
  58. package/dist/comments/CommentThreadList.d.ts.map +1 -0
  59. package/dist/comments/CommentThreadList.js +124 -0
  60. package/dist/comments/CommentThreadList.js.map +1 -0
  61. package/dist/comments/GroupedComments.cjs +74 -0
  62. package/dist/comments/GroupedComments.cjs.map +1 -0
  63. package/dist/comments/GroupedComments.d.ts +18 -0
  64. package/dist/comments/GroupedComments.d.ts.map +1 -0
  65. package/dist/comments/GroupedComments.js +74 -0
  66. package/dist/comments/GroupedComments.js.map +1 -0
  67. package/dist/comments/MentionTextarea.cjs +253 -0
  68. package/dist/comments/MentionTextarea.cjs.map +1 -0
  69. package/dist/comments/MentionTextarea.d.ts +28 -0
  70. package/dist/comments/MentionTextarea.d.ts.map +1 -0
  71. package/dist/comments/MentionTextarea.js +253 -0
  72. package/dist/comments/MentionTextarea.js.map +1 -0
  73. package/dist/comments/comment-context.cjs +33 -0
  74. package/dist/comments/comment-context.cjs.map +1 -0
  75. package/dist/comments/comment-context.d.ts +32 -0
  76. package/dist/comments/comment-context.d.ts.map +1 -0
  77. package/dist/comments/comment-context.js +33 -0
  78. package/dist/comments/comment-context.js.map +1 -0
  79. package/dist/comments/comment-fixtures.d.ts +11 -0
  80. package/dist/comments/comment-fixtures.d.ts.map +1 -0
  81. package/dist/comments/comment-types.cjs +19 -0
  82. package/dist/comments/comment-types.cjs.map +1 -0
  83. package/dist/comments/comment-types.d.ts +170 -0
  84. package/dist/comments/comment-types.d.ts.map +1 -0
  85. package/dist/comments/comment-types.js +19 -0
  86. package/dist/comments/comment-types.js.map +1 -0
  87. package/dist/comments/comment-utils.cjs +216 -0
  88. package/dist/comments/comment-utils.cjs.map +1 -0
  89. package/dist/comments/comment-utils.d.ts +59 -0
  90. package/dist/comments/comment-utils.d.ts.map +1 -0
  91. package/dist/comments/comment-utils.js +216 -0
  92. package/dist/comments/comment-utils.js.map +1 -0
  93. package/dist/comments.cjs +57 -0
  94. package/dist/comments.cjs.map +1 -0
  95. package/dist/comments.d.ts +16 -0
  96. package/dist/comments.d.ts.map +1 -0
  97. package/dist/comments.js +57 -0
  98. package/dist/comments.js.map +1 -0
  99. package/dist/components/Combobox.cjs +5 -2
  100. package/dist/components/Combobox.cjs.map +1 -1
  101. package/dist/components/Combobox.d.ts.map +1 -1
  102. package/dist/components/Combobox.js +5 -2
  103. package/dist/components/Combobox.js.map +1 -1
  104. package/dist/components/FilterBar.cjs +293 -256
  105. package/dist/components/FilterBar.cjs.map +1 -1
  106. package/dist/components/FilterBar.d.ts.map +1 -1
  107. package/dist/components/FilterBar.js +293 -256
  108. package/dist/components/FilterBar.js.map +1 -1
  109. package/dist/components/JsonSchemaForm.cjs +22 -6
  110. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  111. package/dist/components/JsonSchemaForm.d.ts +1 -1
  112. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  113. package/dist/components/JsonSchemaForm.js +25 -9
  114. package/dist/components/JsonSchemaForm.js.map +1 -1
  115. package/dist/components/MultiSelect.cjs +29 -32
  116. package/dist/components/MultiSelect.cjs.map +1 -1
  117. package/dist/components/MultiSelect.d.ts.map +1 -1
  118. package/dist/components/MultiSelect.js +30 -33
  119. package/dist/components/MultiSelect.js.map +1 -1
  120. package/dist/components/NamespacePicker.cjs +52 -0
  121. package/dist/components/NamespacePicker.cjs.map +1 -0
  122. package/dist/components/NamespacePicker.d.ts +17 -0
  123. package/dist/components/NamespacePicker.d.ts.map +1 -0
  124. package/dist/components/NamespacePicker.js +52 -0
  125. package/dist/components/NamespacePicker.js.map +1 -0
  126. package/dist/components/TimeRange.cjs +29 -37
  127. package/dist/components/TimeRange.cjs.map +1 -1
  128. package/dist/components/TimeRange.d.ts.map +1 -1
  129. package/dist/components/TimeRange.js +30 -38
  130. package/dist/components/TimeRange.js.map +1 -1
  131. package/dist/components/TreePickerField.cjs +6 -3
  132. package/dist/components/TreePickerField.cjs.map +1 -1
  133. package/dist/components/TreePickerField.d.ts.map +1 -1
  134. package/dist/components/TreePickerField.js +6 -3
  135. package/dist/components/TreePickerField.js.map +1 -1
  136. package/dist/components/form-lookup-context.cjs +36 -0
  137. package/dist/components/form-lookup-context.cjs.map +1 -0
  138. package/dist/components/form-lookup-context.d.ts +9 -0
  139. package/dist/components/form-lookup-context.d.ts.map +1 -0
  140. package/dist/components/form-lookup-context.js +36 -0
  141. package/dist/components/form-lookup-context.js.map +1 -0
  142. package/dist/components/icon-menu-picker.cjs +9 -3
  143. package/dist/components/icon-menu-picker.cjs.map +1 -1
  144. package/dist/components/icon-menu-picker.d.ts.map +1 -1
  145. package/dist/components/icon-menu-picker.js +9 -3
  146. package/dist/components/icon-menu-picker.js.map +1 -1
  147. package/dist/components/json-schema-form-discriminator.cjs +67 -0
  148. package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
  149. package/dist/components/json-schema-form-discriminator.d.ts +10 -0
  150. package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
  151. package/dist/components/json-schema-form-discriminator.js +67 -0
  152. package/dist/components/json-schema-form-discriminator.js.map +1 -0
  153. package/dist/components/json-schema-form-fields.cjs +146 -3
  154. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  155. package/dist/components/json-schema-form-fields.d.ts +22 -0
  156. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  157. package/dist/components/json-schema-form-fields.js +147 -4
  158. package/dist/components/json-schema-form-fields.js.map +1 -1
  159. package/dist/components/json-schema-form-grid.cjs +92 -0
  160. package/dist/components/json-schema-form-grid.cjs.map +1 -0
  161. package/dist/components/json-schema-form-grid.d.ts +9 -0
  162. package/dist/components/json-schema-form-grid.d.ts.map +1 -0
  163. package/dist/components/json-schema-form-grid.js +92 -0
  164. package/dist/components/json-schema-form-grid.js.map +1 -0
  165. package/dist/components/json-schema-form-refs.cjs +60 -0
  166. package/dist/components/json-schema-form-refs.cjs.map +1 -0
  167. package/dist/components/json-schema-form-refs.d.ts +3 -0
  168. package/dist/components/json-schema-form-refs.d.ts.map +1 -0
  169. package/dist/components/json-schema-form-refs.js +60 -0
  170. package/dist/components/json-schema-form-refs.js.map +1 -0
  171. package/dist/components/json-schema-form-render.cjs +34 -5
  172. package/dist/components/json-schema-form-render.cjs.map +1 -1
  173. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  174. package/dist/components/json-schema-form-render.js +36 -7
  175. package/dist/components/json-schema-form-render.js.map +1 -1
  176. package/dist/components/json-schema-form-resolve.cjs +29 -2
  177. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  178. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  179. package/dist/components/json-schema-form-resolve.js +29 -2
  180. package/dist/components/json-schema-form-resolve.js.map +1 -1
  181. package/dist/components/json-schema-form-template-menu.cjs +83 -0
  182. package/dist/components/json-schema-form-template-menu.cjs.map +1 -0
  183. package/dist/components/json-schema-form-template-menu.d.ts +15 -0
  184. package/dist/components/json-schema-form-template-menu.d.ts.map +1 -0
  185. package/dist/components/json-schema-form-template-menu.js +83 -0
  186. package/dist/components/json-schema-form-template-menu.js.map +1 -0
  187. package/dist/components/json-schema-form-template.cjs +18 -0
  188. package/dist/components/json-schema-form-template.cjs.map +1 -0
  189. package/dist/components/json-schema-form-template.d.ts +13 -0
  190. package/dist/components/json-schema-form-template.d.ts.map +1 -0
  191. package/dist/components/json-schema-form-template.js +18 -0
  192. package/dist/components/json-schema-form-template.js.map +1 -0
  193. package/dist/components/json-schema-form-types.d.ts +41 -2
  194. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  195. package/dist/components/json-schema-form-utils.cjs +8 -0
  196. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  197. package/dist/components/json-schema-form-utils.d.ts +1 -0
  198. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  199. package/dist/components/json-schema-form-utils.js +8 -0
  200. package/dist/components/json-schema-form-utils.js.map +1 -1
  201. package/dist/components/workload-picker-utils.cjs.map +1 -1
  202. package/dist/components/workload-picker-utils.d.ts +11 -1
  203. package/dist/components/workload-picker-utils.d.ts.map +1 -1
  204. package/dist/components/workload-picker-utils.js.map +1 -1
  205. package/dist/components.cjs +10 -0
  206. package/dist/components.cjs.map +1 -1
  207. package/dist/components.d.ts +7 -2
  208. package/dist/components.d.ts.map +1 -1
  209. package/dist/components.js +10 -0
  210. package/dist/components.js.map +1 -1
  211. package/dist/data/Clicky.cjs +231 -69
  212. package/dist/data/Clicky.cjs.map +1 -1
  213. package/dist/data/Clicky.d.ts +7 -1
  214. package/dist/data/Clicky.d.ts.map +1 -1
  215. package/dist/data/Clicky.fixtures.d.ts +3 -1
  216. package/dist/data/Clicky.fixtures.d.ts.map +1 -1
  217. package/dist/data/Clicky.js +232 -70
  218. package/dist/data/Clicky.js.map +1 -1
  219. package/dist/data/DataTable.cjs +23 -17
  220. package/dist/data/DataTable.cjs.map +1 -1
  221. package/dist/data/DataTable.d.ts +7 -1
  222. package/dist/data/DataTable.d.ts.map +1 -1
  223. package/dist/data/DataTable.js +24 -18
  224. package/dist/data/DataTable.js.map +1 -1
  225. package/dist/data/ExecutionTree.cjs +68 -0
  226. package/dist/data/ExecutionTree.cjs.map +1 -0
  227. package/dist/data/ExecutionTree.d.ts +40 -0
  228. package/dist/data/ExecutionTree.d.ts.map +1 -0
  229. package/dist/data/ExecutionTree.js +68 -0
  230. package/dist/data/ExecutionTree.js.map +1 -0
  231. package/dist/data/Gauge.cjs +37 -4
  232. package/dist/data/Gauge.cjs.map +1 -1
  233. package/dist/data/Gauge.d.ts +6 -1
  234. package/dist/data/Gauge.d.ts.map +1 -1
  235. package/dist/data/Gauge.js +37 -4
  236. package/dist/data/Gauge.js.map +1 -1
  237. package/dist/data/GaugeHoverCard.cjs +35 -0
  238. package/dist/data/GaugeHoverCard.cjs.map +1 -0
  239. package/dist/data/GaugeHoverCard.d.ts +25 -0
  240. package/dist/data/GaugeHoverCard.d.ts.map +1 -0
  241. package/dist/data/GaugeHoverCard.js +35 -0
  242. package/dist/data/GaugeHoverCard.js.map +1 -0
  243. package/dist/data/MarkdownEditor.cjs +616 -0
  244. package/dist/data/MarkdownEditor.cjs.map +1 -0
  245. package/dist/data/MarkdownEditor.d.ts +61 -0
  246. package/dist/data/MarkdownEditor.d.ts.map +1 -0
  247. package/dist/data/MarkdownEditor.js +616 -0
  248. package/dist/data/MarkdownEditor.js.map +1 -0
  249. package/dist/data/MarkdownEditor.model.cjs +27 -0
  250. package/dist/data/MarkdownEditor.model.cjs.map +1 -0
  251. package/dist/data/MarkdownEditor.model.d.ts +38 -0
  252. package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
  253. package/dist/data/MarkdownEditor.model.js +27 -0
  254. package/dist/data/MarkdownEditor.model.js.map +1 -0
  255. package/dist/data/ObjectGraph.cjs +44 -0
  256. package/dist/data/ObjectGraph.cjs.map +1 -0
  257. package/dist/data/ObjectGraph.d.ts +39 -0
  258. package/dist/data/ObjectGraph.d.ts.map +1 -0
  259. package/dist/data/ObjectGraph.js +44 -0
  260. package/dist/data/ObjectGraph.js.map +1 -0
  261. package/dist/data/SchemaViewer.cjs +152 -0
  262. package/dist/data/SchemaViewer.cjs.map +1 -0
  263. package/dist/data/SchemaViewer.d.ts +27 -0
  264. package/dist/data/SchemaViewer.d.ts.map +1 -0
  265. package/dist/data/SchemaViewer.js +152 -0
  266. package/dist/data/SchemaViewer.js.map +1 -0
  267. package/dist/data/TimeseriesCoreBars.cjs +169 -32
  268. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  269. package/dist/data/TimeseriesCoreBars.d.ts +42 -5
  270. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  271. package/dist/data/TimeseriesCoreBars.js +170 -33
  272. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  273. package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
  274. package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
  275. package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
  276. package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
  277. package/dist/data/TimeseriesCoreBars.model.js +5 -5
  278. package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
  279. package/dist/data/TimeseriesGauge.cjs +132 -36
  280. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  281. package/dist/data/TimeseriesGauge.d.ts +15 -1
  282. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  283. package/dist/data/TimeseriesGauge.js +133 -37
  284. package/dist/data/TimeseriesGauge.js.map +1 -1
  285. package/dist/data/WorkloadCard.cjs +371 -0
  286. package/dist/data/WorkloadCard.cjs.map +1 -0
  287. package/dist/data/WorkloadCard.d.ts +25 -0
  288. package/dist/data/WorkloadCard.d.ts.map +1 -0
  289. package/dist/data/WorkloadCard.js +371 -0
  290. package/dist/data/WorkloadCard.js.map +1 -0
  291. package/dist/data/WorkloadCard.model.cjs +51 -0
  292. package/dist/data/WorkloadCard.model.cjs.map +1 -0
  293. package/dist/data/WorkloadCard.model.d.ts +53 -0
  294. package/dist/data/WorkloadCard.model.d.ts.map +1 -0
  295. package/dist/data/WorkloadCard.model.js +51 -0
  296. package/dist/data/WorkloadCard.model.js.map +1 -0
  297. package/dist/data/ai/ChatFab.cjs +3 -1
  298. package/dist/data/ai/ChatFab.cjs.map +1 -1
  299. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  300. package/dist/data/ai/ChatFab.js +3 -1
  301. package/dist/data/ai/ChatFab.js.map +1 -1
  302. package/dist/data/ai/ChatWindow.cjs +19 -9
  303. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  304. package/dist/data/ai/ChatWindow.d.ts +4 -2
  305. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  306. package/dist/data/ai/ChatWindow.js +19 -9
  307. package/dist/data/ai/ChatWindow.js.map +1 -1
  308. package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
  309. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
  310. package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
  311. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
  312. package/dist/data/ai/ChatWindowRequestBody.js +20 -0
  313. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
  314. package/dist/data/ai/chat-window-context.cjs +2 -1
  315. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  316. package/dist/data/ai/chat-window-context.d.ts +1 -1
  317. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  318. package/dist/data/ai/chat-window-context.js +2 -1
  319. package/dist/data/ai/chat-window-context.js.map +1 -1
  320. package/dist/data/ai/context.cjs.map +1 -1
  321. package/dist/data/ai/context.d.ts +3 -0
  322. package/dist/data/ai/context.d.ts.map +1 -1
  323. package/dist/data/ai/context.js.map +1 -1
  324. package/dist/data/chat/Chat.cjs +21 -1
  325. package/dist/data/chat/Chat.cjs.map +1 -1
  326. package/dist/data/chat/Chat.d.ts +11 -2
  327. package/dist/data/chat/Chat.d.ts.map +1 -1
  328. package/dist/data/chat/Chat.js +22 -2
  329. package/dist/data/chat/Chat.js.map +1 -1
  330. package/dist/data/chat/Message.cjs +13 -4
  331. package/dist/data/chat/Message.cjs.map +1 -1
  332. package/dist/data/chat/Message.d.ts +4 -2
  333. package/dist/data/chat/Message.d.ts.map +1 -1
  334. package/dist/data/chat/Message.js +13 -4
  335. package/dist/data/chat/Message.js.map +1 -1
  336. package/dist/data/chat/ToolCall.cjs +9 -4
  337. package/dist/data/chat/ToolCall.cjs.map +1 -1
  338. package/dist/data/chat/ToolCall.d.ts +3 -2
  339. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  340. package/dist/data/chat/ToolCall.js +9 -4
  341. package/dist/data/chat/ToolCall.js.map +1 -1
  342. package/dist/data/chat/index.d.ts +1 -1
  343. package/dist/data/chat/index.d.ts.map +1 -1
  344. package/dist/data/chat/types.cjs.map +1 -1
  345. package/dist/data/chat/types.d.ts +7 -0
  346. package/dist/data/chat/types.d.ts.map +1 -1
  347. package/dist/data/chat/types.js.map +1 -1
  348. package/dist/data/gauge-stats.cjs +19 -0
  349. package/dist/data/gauge-stats.cjs.map +1 -0
  350. package/dist/data/gauge-stats.d.ts +15 -0
  351. package/dist/data/gauge-stats.d.ts.map +1 -0
  352. package/dist/data/gauge-stats.js +19 -0
  353. package/dist/data/gauge-stats.js.map +1 -0
  354. package/dist/data/schema-viewer-model.cjs +436 -0
  355. package/dist/data/schema-viewer-model.cjs.map +1 -0
  356. package/dist/data/schema-viewer-model.d.ts +64 -0
  357. package/dist/data/schema-viewer-model.d.ts.map +1 -0
  358. package/dist/data/schema-viewer-model.js +436 -0
  359. package/dist/data/schema-viewer-model.js.map +1 -0
  360. package/dist/data/version-info.cjs +2 -2
  361. package/dist/data/version-info.js +2 -2
  362. package/dist/data.cjs +30 -0
  363. package/dist/data.cjs.map +1 -1
  364. package/dist/data.d.ts +14 -4
  365. package/dist/data.d.ts.map +1 -1
  366. package/dist/data.js +31 -1
  367. package/dist/data.js.map +1 -1
  368. package/dist/hooks/use-sort.cjs +19 -10
  369. package/dist/hooks/use-sort.cjs.map +1 -1
  370. package/dist/hooks/use-sort.d.ts +3 -0
  371. package/dist/hooks/use-sort.d.ts.map +1 -1
  372. package/dist/hooks/use-sort.js +19 -10
  373. package/dist/hooks/use-sort.js.map +1 -1
  374. package/dist/index.cjs +98 -2
  375. package/dist/index.cjs.map +1 -1
  376. package/dist/index.d.ts +1 -0
  377. package/dist/index.d.ts.map +1 -1
  378. package/dist/index.js +98 -2
  379. package/dist/index.js.map +1 -1
  380. package/dist/layout/AppShell.cjs +6 -10
  381. package/dist/layout/AppShell.cjs.map +1 -1
  382. package/dist/layout/AppShell.d.ts +2 -0
  383. package/dist/layout/AppShell.d.ts.map +1 -1
  384. package/dist/layout/AppShell.js +6 -10
  385. package/dist/layout/AppShell.js.map +1 -1
  386. package/dist/overlay/DropdownMenu.cjs +50 -38
  387. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  388. package/dist/overlay/DropdownMenu.d.ts +5 -1
  389. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  390. package/dist/overlay/DropdownMenu.js +50 -38
  391. package/dist/overlay/DropdownMenu.js.map +1 -1
  392. package/dist/overlay/HoverCard.cjs +7 -2
  393. package/dist/overlay/HoverCard.cjs.map +1 -1
  394. package/dist/overlay/HoverCard.d.ts.map +1 -1
  395. package/dist/overlay/HoverCard.js +7 -2
  396. package/dist/overlay/HoverCard.js.map +1 -1
  397. package/dist/overlay/Modal.cjs +20 -17
  398. package/dist/overlay/Modal.cjs.map +1 -1
  399. package/dist/overlay/Modal.d.ts.map +1 -1
  400. package/dist/overlay/Modal.js +21 -18
  401. package/dist/overlay/Modal.js.map +1 -1
  402. package/dist/overlay/Toast.cjs +9 -1
  403. package/dist/overlay/Toast.cjs.map +1 -1
  404. package/dist/overlay/Toast.d.ts.map +1 -1
  405. package/dist/overlay/Toast.js +9 -1
  406. package/dist/overlay/Toast.js.map +1 -1
  407. package/dist/overlay/modalStack.cjs +53 -1
  408. package/dist/overlay/modalStack.cjs.map +1 -1
  409. package/dist/overlay/modalStack.d.ts +12 -0
  410. package/dist/overlay/modalStack.d.ts.map +1 -1
  411. package/dist/overlay/modalStack.js +54 -2
  412. package/dist/overlay/modalStack.js.map +1 -1
  413. package/dist/overlay/zIndex.cjs +20 -0
  414. package/dist/overlay/zIndex.cjs.map +1 -0
  415. package/dist/overlay/zIndex.d.ts +39 -0
  416. package/dist/overlay/zIndex.d.ts.map +1 -0
  417. package/dist/overlay/zIndex.js +20 -0
  418. package/dist/overlay/zIndex.js.map +1 -0
  419. package/dist/rpc/EntityExplorerApp.cjs +102 -143
  420. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  421. package/dist/rpc/EntityExplorerApp.d.ts +34 -1
  422. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  423. package/dist/rpc/EntityExplorerApp.js +105 -146
  424. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  425. package/dist/rpc/OperationActionBar.cjs +135 -0
  426. package/dist/rpc/OperationActionBar.cjs.map +1 -0
  427. package/dist/rpc/OperationActionBar.d.ts +20 -0
  428. package/dist/rpc/OperationActionBar.d.ts.map +1 -0
  429. package/dist/rpc/OperationActionBar.js +135 -0
  430. package/dist/rpc/OperationActionBar.js.map +1 -0
  431. package/dist/rpc/OperationCatalog.cjs +79 -116
  432. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  433. package/dist/rpc/OperationCatalog.d.ts +8 -1
  434. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  435. package/dist/rpc/OperationCatalog.js +80 -117
  436. package/dist/rpc/OperationCatalog.js.map +1 -1
  437. package/dist/rpc/OperationCommandPage.cjs +134 -223
  438. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  439. package/dist/rpc/OperationCommandPage.d.ts +1 -1
  440. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  441. package/dist/rpc/OperationCommandPage.js +135 -224
  442. package/dist/rpc/OperationCommandPage.js.map +1 -1
  443. package/dist/rpc/OperationEntityPage.cjs +49 -100
  444. package/dist/rpc/OperationEntityPage.cjs.map +1 -1
  445. package/dist/rpc/OperationEntityPage.d.ts +6 -1
  446. package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
  447. package/dist/rpc/OperationEntityPage.js +50 -101
  448. package/dist/rpc/OperationEntityPage.js.map +1 -1
  449. package/dist/rpc/OperationResultView.cjs +43 -0
  450. package/dist/rpc/OperationResultView.cjs.map +1 -0
  451. package/dist/rpc/OperationResultView.d.ts +30 -0
  452. package/dist/rpc/OperationResultView.d.ts.map +1 -0
  453. package/dist/rpc/OperationResultView.js +43 -0
  454. package/dist/rpc/OperationResultView.js.map +1 -0
  455. package/dist/rpc/SchemaActionForm.cjs +102 -0
  456. package/dist/rpc/SchemaActionForm.cjs.map +1 -0
  457. package/dist/rpc/SchemaActionForm.d.ts +23 -0
  458. package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
  459. package/dist/rpc/SchemaActionForm.js +102 -0
  460. package/dist/rpc/SchemaActionForm.js.map +1 -0
  461. package/dist/rpc/accept-options.cjs.map +1 -1
  462. package/dist/rpc/accept-options.d.ts +0 -1
  463. package/dist/rpc/accept-options.d.ts.map +1 -1
  464. package/dist/rpc/accept-options.js.map +1 -1
  465. package/dist/rpc/apiClient.cjs +34 -2
  466. package/dist/rpc/apiClient.cjs.map +1 -1
  467. package/dist/rpc/apiClient.d.ts +4 -1
  468. package/dist/rpc/apiClient.d.ts.map +1 -1
  469. package/dist/rpc/apiClient.js +34 -2
  470. package/dist/rpc/apiClient.js.map +1 -1
  471. package/dist/rpc/clickyMetadata.cjs +4 -4
  472. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  473. package/dist/rpc/clickyMetadata.d.ts +0 -1
  474. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  475. package/dist/rpc/clickyMetadata.js +4 -4
  476. package/dist/rpc/clickyMetadata.js.map +1 -1
  477. package/dist/rpc/formMetadata.cjs +1 -0
  478. package/dist/rpc/formMetadata.cjs.map +1 -1
  479. package/dist/rpc/formMetadata.d.ts +6 -1
  480. package/dist/rpc/formMetadata.d.ts.map +1 -1
  481. package/dist/rpc/formMetadata.js +1 -0
  482. package/dist/rpc/formMetadata.js.map +1 -1
  483. package/dist/rpc/rowNavigation.cjs +86 -0
  484. package/dist/rpc/rowNavigation.cjs.map +1 -0
  485. package/dist/rpc/rowNavigation.d.ts +14 -0
  486. package/dist/rpc/rowNavigation.d.ts.map +1 -0
  487. package/dist/rpc/rowNavigation.js +86 -0
  488. package/dist/rpc/rowNavigation.js.map +1 -0
  489. package/dist/rpc/schemaActionPath.cjs +22 -0
  490. package/dist/rpc/schemaActionPath.cjs.map +1 -0
  491. package/dist/rpc/schemaActionPath.d.ts +4 -0
  492. package/dist/rpc/schemaActionPath.d.ts.map +1 -0
  493. package/dist/rpc/schemaActionPath.js +22 -0
  494. package/dist/rpc/schemaActionPath.js.map +1 -0
  495. package/dist/rpc/surfaceIconMap.cjs +35 -0
  496. package/dist/rpc/surfaceIconMap.cjs.map +1 -0
  497. package/dist/rpc/surfaceIconMap.d.ts +3 -0
  498. package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
  499. package/dist/rpc/surfaceIconMap.js +35 -0
  500. package/dist/rpc/surfaceIconMap.js.map +1 -0
  501. package/dist/rpc/types.cjs.map +1 -1
  502. package/dist/rpc/types.d.ts +2 -0
  503. package/dist/rpc/types.d.ts.map +1 -1
  504. package/dist/rpc/types.js.map +1 -1
  505. package/dist/rpc/useOperations.cjs.map +1 -1
  506. package/dist/rpc/useOperations.d.ts +4 -1
  507. package/dist/rpc/useOperations.d.ts.map +1 -1
  508. package/dist/rpc/useOperations.js.map +1 -1
  509. package/dist/rpc.cjs +4 -2
  510. package/dist/rpc.cjs.map +1 -1
  511. package/dist/rpc.d.ts +7 -6
  512. package/dist/rpc.d.ts.map +1 -1
  513. package/dist/rpc.js +4 -2
  514. package/dist/rpc.js.map +1 -1
  515. package/dist/styles.css +1 -1
  516. package/package.json +6 -1
  517. package/dist/rpc/AcceptPicker.cjs +0 -135
  518. package/dist/rpc/AcceptPicker.cjs.map +0 -1
  519. package/dist/rpc/AcceptPicker.d.ts +0 -12
  520. package/dist/rpc/AcceptPicker.d.ts.map +0 -1
  521. package/dist/rpc/AcceptPicker.js +0 -135
  522. package/dist/rpc/AcceptPicker.js.map +0 -1
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const Tree = require("./Tree.cjs");
5
+ function ExecutionTree({
6
+ roots,
7
+ className,
8
+ empty,
9
+ showControls,
10
+ defaultOpenDepth = 1,
11
+ costThreshold,
12
+ renderRow,
13
+ loadChildren
14
+ }) {
15
+ return /* @__PURE__ */ jsxRuntime.jsx(
16
+ Tree.Tree,
17
+ {
18
+ roots,
19
+ getKey: (n) => n.id,
20
+ getChildren: (n) => n.children,
21
+ defaultOpen: (_n, depth) => depth < defaultOpenDepth,
22
+ ...className !== void 0 ? { className } : {},
23
+ ...empty !== void 0 ? { empty } : {},
24
+ ...showControls !== void 0 ? { showControls } : {},
25
+ ...loadChildren ? { loadChildren, hasMoreChildren: (n) => n.expandable === true } : {},
26
+ renderRow: ({ node }) => renderRow ? renderRow(node) : /* @__PURE__ */ jsxRuntime.jsx(DefaultExecutionRow, { node, costThreshold })
27
+ }
28
+ );
29
+ }
30
+ function DefaultExecutionRow({ node, costThreshold }) {
31
+ const slow = costThreshold != null && node.cost != null && node.cost >= costThreshold;
32
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-2 font-mono text-xs", children: [
33
+ node.status && /* @__PURE__ */ jsxRuntime.jsx(StatusDot, { status: node.status }),
34
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-foreground", children: node.label }),
35
+ node.cost != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: slow ? "text-red-600" : "text-muted-foreground", children: formatCost(node) }),
36
+ node.times != null && node.times > 1 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground/60", children: [
37
+ "×",
38
+ node.times
39
+ ] }),
40
+ node.className && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "break-all text-muted-foreground/60", children: [
41
+ node.className,
42
+ node.lineNumber != null && node.lineNumber > 0 ? `:${node.lineNumber}` : ""
43
+ ] }),
44
+ node.detail && Object.entries(node.detail).map(([k, v]) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground/60", children: [
45
+ k,
46
+ "=",
47
+ v
48
+ ] }, k))
49
+ ] });
50
+ }
51
+ function formatCost(node) {
52
+ const unit = node.unit || "ms";
53
+ const value = node.cost ?? 0;
54
+ return unit === "ms" ? `${value.toFixed(3)}ms` : `${value} ${unit}`;
55
+ }
56
+ const STATUS_COLOR = {
57
+ ok: "text-green-600",
58
+ success: "text-green-600",
59
+ error: "text-red-600",
60
+ warning: "text-amber-500",
61
+ running: "text-blue-600",
62
+ pending: "text-muted-foreground"
63
+ };
64
+ function StatusDot({ status }) {
65
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: `shrink-0 ${STATUS_COLOR[status] ?? "text-muted-foreground"}`, title: status, children: "●" });
66
+ }
67
+ exports.ExecutionTree = ExecutionTree;
68
+ //# sourceMappingURL=ExecutionTree.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionTree.cjs","sources":["../../src/data/ExecutionTree.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tree } from \"./Tree\";\n\n// ExecutionTree renders a generic, type-agnostic call/execution tree — a method\n// call tree, a span tree, an activity sequence — where each node carries a cost\n// and a status and may nest. It is the shared home for what used to be\n// per-feature call-tree renderers: any producer maps its data into\n// ExecutionNode and gets the same tree, timing, and status rendering.\n\nexport type ExecutionNode = {\n /** Stable unique key within the tree. */\n id: string;\n /** Display label (method/operation/step name). */\n label: string;\n /** Free-form node kind hint. */\n kind?: string;\n /** Outcome: ok | error | warning | running | pending. */\n status?: string;\n /** Numeric cost in `unit`. */\n cost?: number;\n /** Cost unit (default \"ms\"). */\n unit?: string;\n /** Aggregated invocation count (renders ×N when > 1). */\n times?: number;\n /** Owning class / file, rendered as a muted suffix. */\n className?: string;\n lineNumber?: number;\n /** Extra key/values rendered as muted chips. */\n detail?: Record<string, string>;\n /** Node can be expanded via loadChildren even with no inline children. */\n expandable?: boolean;\n children?: ExecutionNode[];\n};\n\nexport type ExecutionTreeProps<T extends ExecutionNode = ExecutionNode> = {\n roots: T[];\n className?: string;\n empty?: ReactNode;\n showControls?: boolean;\n /** Open nodes shallower than this depth on first render (default 1). */\n defaultOpenDepth?: number;\n /** Costs at or above this value render in red (slow-path highlight). */\n costThreshold?: number;\n /** Override the entire row rendering. */\n renderRow?: (node: T) => ReactNode;\n loadChildren?: (node: T) => Promise<T[]>;\n};\n\nexport function ExecutionTree<T extends ExecutionNode = ExecutionNode>({\n roots,\n className,\n empty,\n showControls,\n defaultOpenDepth = 1,\n costThreshold,\n renderRow,\n loadChildren,\n}: ExecutionTreeProps<T>) {\n return (\n <Tree<T>\n roots={roots}\n getKey={(n) => n.id}\n getChildren={(n) => n.children as T[] | undefined}\n defaultOpen={(_n, depth) => depth < defaultOpenDepth}\n {...(className !== undefined ? { className } : {})}\n {...(empty !== undefined ? { empty } : {})}\n {...(showControls !== undefined ? { showControls } : {})}\n {...(loadChildren ? { loadChildren, hasMoreChildren: (n: T) => n.expandable === true } : {})}\n renderRow={({ node }) =>\n renderRow ? renderRow(node) : <DefaultExecutionRow node={node} costThreshold={costThreshold} />\n }\n />\n );\n}\n\nfunction DefaultExecutionRow({ node, costThreshold }: { node: ExecutionNode; costThreshold: number | undefined }) {\n const slow = costThreshold != null && node.cost != null && node.cost >= costThreshold;\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2 font-mono text-xs\">\n {node.status && <StatusDot status={node.status} />}\n <span className=\"font-semibold text-foreground\">{node.label}</span>\n {node.cost != null && (\n <span className={slow ? \"text-red-600\" : \"text-muted-foreground\"}>{formatCost(node)}</span>\n )}\n {node.times != null && node.times > 1 && (\n <span className=\"text-muted-foreground/60\">×{node.times}</span>\n )}\n {node.className && (\n <span className=\"break-all text-muted-foreground/60\">\n {node.className}\n {node.lineNumber != null && node.lineNumber > 0 ? `:${node.lineNumber}` : \"\"}\n </span>\n )}\n {node.detail &&\n Object.entries(node.detail).map(([k, v]) => (\n <span key={k} className=\"text-muted-foreground/60\">\n {k}={v}\n </span>\n ))}\n </div>\n );\n}\n\nfunction formatCost(node: ExecutionNode): string {\n const unit = node.unit || \"ms\";\n const value = node.cost ?? 0;\n return unit === \"ms\" ? `${value.toFixed(3)}ms` : `${value} ${unit}`;\n}\n\nconst STATUS_COLOR: Record<string, string> = {\n ok: \"text-green-600\",\n success: \"text-green-600\",\n error: \"text-red-600\",\n warning: \"text-amber-500\",\n running: \"text-blue-600\",\n pending: \"text-muted-foreground\",\n};\n\nfunction StatusDot({ status }: { status: string }) {\n return (\n <span className={`shrink-0 ${STATUS_COLOR[status] ?? \"text-muted-foreground\"}`} title={status}>\n ●\n </span>\n );\n}\n"],"names":["jsx","Tree","jsxs"],"mappings":";;;;AAgDO,SAAS,cAAuD;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACEA,2BAAAA;AAAAA,IAACC,KAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAQ,CAAC,MAAM,EAAE;AAAA,MACjB,aAAa,CAAC,MAAM,EAAE;AAAA,MACtB,aAAa,CAAC,IAAI,UAAU,QAAQ;AAAA,MACnC,GAAI,cAAc,SAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAC9C,GAAI,UAAU,SAAY,EAAE,MAAA,IAAU,CAAA;AAAA,MACtC,GAAI,iBAAiB,SAAY,EAAE,aAAA,IAAiB,CAAA;AAAA,MACpD,GAAI,eAAe,EAAE,cAAc,iBAAiB,CAAC,MAAS,EAAE,eAAe,KAAA,IAAS,CAAA;AAAA,MACzF,WAAW,CAAC,EAAE,KAAA,MACZ,YAAY,UAAU,IAAI,IAAID,+BAAC,qBAAA,EAAoB,MAAY,cAAA,CAA8B;AAAA,IAAA;AAAA,EAAA;AAIrG;AAEA,SAAS,oBAAoB,EAAE,MAAM,iBAA6E;AAChH,QAAM,OAAO,iBAAiB,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AACxE,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAU,sEACZ,UAAA;AAAA,IAAA,KAAK,UAAUF,+BAAC,WAAA,EAAU,QAAQ,KAAK,QAAQ;AAAA,IAChDA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iCAAiC,eAAK,OAAM;AAAA,IAC3D,KAAK,QAAQ,QACZA,2BAAAA,IAAC,QAAA,EAAK,WAAW,OAAO,iBAAiB,yBAA0B,UAAA,WAAW,IAAI,EAAA,CAAE;AAAA,IAErF,KAAK,SAAS,QAAQ,KAAK,QAAQ,KAClCE,2BAAAA,KAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA;AAAA,MAAA;AAAA,MAAE,KAAK;AAAA,IAAA,GAAM;AAAA,IAEzD,KAAK,aACJA,gCAAC,QAAA,EAAK,WAAU,sCACb,UAAA;AAAA,MAAA,KAAK;AAAA,MACL,KAAK,cAAc,QAAQ,KAAK,aAAa,IAAI,IAAI,KAAK,UAAU,KAAK;AAAA,IAAA,GAC5E;AAAA,IAED,KAAK,UACJ,OAAO,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MACpCA,gCAAC,QAAA,EAAa,WAAU,4BACrB,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,MAAE;AAAA,IAAA,EAAA,GADI,CAEX,CACD;AAAA,EAAA,GACL;AAEJ;AAEA,SAAS,WAAW,MAA6B;AAC/C,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,QAAQ,KAAK,QAAQ;AAC3B,SAAO,SAAS,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,OAAO,GAAG,KAAK,IAAI,IAAI;AACnE;AAEA,MAAM,eAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEA,SAAS,UAAU,EAAE,UAA8B;AACjD,SACEF,2BAAAA,IAAC,QAAA,EAAK,WAAW,YAAY,aAAa,MAAM,KAAK,uBAAuB,IAAI,OAAO,QAAQ,UAAA,IAAA,CAE/F;AAEJ;;"}
@@ -0,0 +1,40 @@
1
+ import { ReactNode } from 'react';
2
+ export type ExecutionNode = {
3
+ /** Stable unique key within the tree. */
4
+ id: string;
5
+ /** Display label (method/operation/step name). */
6
+ label: string;
7
+ /** Free-form node kind hint. */
8
+ kind?: string;
9
+ /** Outcome: ok | error | warning | running | pending. */
10
+ status?: string;
11
+ /** Numeric cost in `unit`. */
12
+ cost?: number;
13
+ /** Cost unit (default "ms"). */
14
+ unit?: string;
15
+ /** Aggregated invocation count (renders ×N when > 1). */
16
+ times?: number;
17
+ /** Owning class / file, rendered as a muted suffix. */
18
+ className?: string;
19
+ lineNumber?: number;
20
+ /** Extra key/values rendered as muted chips. */
21
+ detail?: Record<string, string>;
22
+ /** Node can be expanded via loadChildren even with no inline children. */
23
+ expandable?: boolean;
24
+ children?: ExecutionNode[];
25
+ };
26
+ export type ExecutionTreeProps<T extends ExecutionNode = ExecutionNode> = {
27
+ roots: T[];
28
+ className?: string;
29
+ empty?: ReactNode;
30
+ showControls?: boolean;
31
+ /** Open nodes shallower than this depth on first render (default 1). */
32
+ defaultOpenDepth?: number;
33
+ /** Costs at or above this value render in red (slow-path highlight). */
34
+ costThreshold?: number;
35
+ /** Override the entire row rendering. */
36
+ renderRow?: (node: T) => ReactNode;
37
+ loadChildren?: (node: T) => Promise<T[]>;
38
+ };
39
+ export declare function ExecutionTree<T extends ExecutionNode = ExecutionNode>({ roots, className, empty, showControls, defaultOpenDepth, costThreshold, renderRow, loadChildren, }: ExecutionTreeProps<T>): import("react/jsx-runtime").JSX.Element;
40
+ //# sourceMappingURL=ExecutionTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionTree.d.ts","sourceRoot":"","sources":["../../src/data/ExecutionTree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAAI;IACxE,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC1C,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,EAAE,EACrE,KAAK,EACL,SAAS,EACT,KAAK,EACL,YAAY,EACZ,gBAAoB,EACpB,aAAa,EACb,SAAS,EACT,YAAY,GACb,EAAE,kBAAkB,CAAC,CAAC,CAAC,2CAgBvB"}
@@ -0,0 +1,68 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Tree } from "./Tree.js";
3
+ function ExecutionTree({
4
+ roots,
5
+ className,
6
+ empty,
7
+ showControls,
8
+ defaultOpenDepth = 1,
9
+ costThreshold,
10
+ renderRow,
11
+ loadChildren
12
+ }) {
13
+ return /* @__PURE__ */ jsx(
14
+ Tree,
15
+ {
16
+ roots,
17
+ getKey: (n) => n.id,
18
+ getChildren: (n) => n.children,
19
+ defaultOpen: (_n, depth) => depth < defaultOpenDepth,
20
+ ...className !== void 0 ? { className } : {},
21
+ ...empty !== void 0 ? { empty } : {},
22
+ ...showControls !== void 0 ? { showControls } : {},
23
+ ...loadChildren ? { loadChildren, hasMoreChildren: (n) => n.expandable === true } : {},
24
+ renderRow: ({ node }) => renderRow ? renderRow(node) : /* @__PURE__ */ jsx(DefaultExecutionRow, { node, costThreshold })
25
+ }
26
+ );
27
+ }
28
+ function DefaultExecutionRow({ node, costThreshold }) {
29
+ const slow = costThreshold != null && node.cost != null && node.cost >= costThreshold;
30
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-2 font-mono text-xs", children: [
31
+ node.status && /* @__PURE__ */ jsx(StatusDot, { status: node.status }),
32
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-foreground", children: node.label }),
33
+ node.cost != null && /* @__PURE__ */ jsx("span", { className: slow ? "text-red-600" : "text-muted-foreground", children: formatCost(node) }),
34
+ node.times != null && node.times > 1 && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground/60", children: [
35
+ "×",
36
+ node.times
37
+ ] }),
38
+ node.className && /* @__PURE__ */ jsxs("span", { className: "break-all text-muted-foreground/60", children: [
39
+ node.className,
40
+ node.lineNumber != null && node.lineNumber > 0 ? `:${node.lineNumber}` : ""
41
+ ] }),
42
+ node.detail && Object.entries(node.detail).map(([k, v]) => /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground/60", children: [
43
+ k,
44
+ "=",
45
+ v
46
+ ] }, k))
47
+ ] });
48
+ }
49
+ function formatCost(node) {
50
+ const unit = node.unit || "ms";
51
+ const value = node.cost ?? 0;
52
+ return unit === "ms" ? `${value.toFixed(3)}ms` : `${value} ${unit}`;
53
+ }
54
+ const STATUS_COLOR = {
55
+ ok: "text-green-600",
56
+ success: "text-green-600",
57
+ error: "text-red-600",
58
+ warning: "text-amber-500",
59
+ running: "text-blue-600",
60
+ pending: "text-muted-foreground"
61
+ };
62
+ function StatusDot({ status }) {
63
+ return /* @__PURE__ */ jsx("span", { className: `shrink-0 ${STATUS_COLOR[status] ?? "text-muted-foreground"}`, title: status, children: "●" });
64
+ }
65
+ export {
66
+ ExecutionTree
67
+ };
68
+ //# sourceMappingURL=ExecutionTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionTree.js","sources":["../../src/data/ExecutionTree.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tree } from \"./Tree\";\n\n// ExecutionTree renders a generic, type-agnostic call/execution tree — a method\n// call tree, a span tree, an activity sequence — where each node carries a cost\n// and a status and may nest. It is the shared home for what used to be\n// per-feature call-tree renderers: any producer maps its data into\n// ExecutionNode and gets the same tree, timing, and status rendering.\n\nexport type ExecutionNode = {\n /** Stable unique key within the tree. */\n id: string;\n /** Display label (method/operation/step name). */\n label: string;\n /** Free-form node kind hint. */\n kind?: string;\n /** Outcome: ok | error | warning | running | pending. */\n status?: string;\n /** Numeric cost in `unit`. */\n cost?: number;\n /** Cost unit (default \"ms\"). */\n unit?: string;\n /** Aggregated invocation count (renders ×N when > 1). */\n times?: number;\n /** Owning class / file, rendered as a muted suffix. */\n className?: string;\n lineNumber?: number;\n /** Extra key/values rendered as muted chips. */\n detail?: Record<string, string>;\n /** Node can be expanded via loadChildren even with no inline children. */\n expandable?: boolean;\n children?: ExecutionNode[];\n};\n\nexport type ExecutionTreeProps<T extends ExecutionNode = ExecutionNode> = {\n roots: T[];\n className?: string;\n empty?: ReactNode;\n showControls?: boolean;\n /** Open nodes shallower than this depth on first render (default 1). */\n defaultOpenDepth?: number;\n /** Costs at or above this value render in red (slow-path highlight). */\n costThreshold?: number;\n /** Override the entire row rendering. */\n renderRow?: (node: T) => ReactNode;\n loadChildren?: (node: T) => Promise<T[]>;\n};\n\nexport function ExecutionTree<T extends ExecutionNode = ExecutionNode>({\n roots,\n className,\n empty,\n showControls,\n defaultOpenDepth = 1,\n costThreshold,\n renderRow,\n loadChildren,\n}: ExecutionTreeProps<T>) {\n return (\n <Tree<T>\n roots={roots}\n getKey={(n) => n.id}\n getChildren={(n) => n.children as T[] | undefined}\n defaultOpen={(_n, depth) => depth < defaultOpenDepth}\n {...(className !== undefined ? { className } : {})}\n {...(empty !== undefined ? { empty } : {})}\n {...(showControls !== undefined ? { showControls } : {})}\n {...(loadChildren ? { loadChildren, hasMoreChildren: (n: T) => n.expandable === true } : {})}\n renderRow={({ node }) =>\n renderRow ? renderRow(node) : <DefaultExecutionRow node={node} costThreshold={costThreshold} />\n }\n />\n );\n}\n\nfunction DefaultExecutionRow({ node, costThreshold }: { node: ExecutionNode; costThreshold: number | undefined }) {\n const slow = costThreshold != null && node.cost != null && node.cost >= costThreshold;\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2 font-mono text-xs\">\n {node.status && <StatusDot status={node.status} />}\n <span className=\"font-semibold text-foreground\">{node.label}</span>\n {node.cost != null && (\n <span className={slow ? \"text-red-600\" : \"text-muted-foreground\"}>{formatCost(node)}</span>\n )}\n {node.times != null && node.times > 1 && (\n <span className=\"text-muted-foreground/60\">×{node.times}</span>\n )}\n {node.className && (\n <span className=\"break-all text-muted-foreground/60\">\n {node.className}\n {node.lineNumber != null && node.lineNumber > 0 ? `:${node.lineNumber}` : \"\"}\n </span>\n )}\n {node.detail &&\n Object.entries(node.detail).map(([k, v]) => (\n <span key={k} className=\"text-muted-foreground/60\">\n {k}={v}\n </span>\n ))}\n </div>\n );\n}\n\nfunction formatCost(node: ExecutionNode): string {\n const unit = node.unit || \"ms\";\n const value = node.cost ?? 0;\n return unit === \"ms\" ? `${value.toFixed(3)}ms` : `${value} ${unit}`;\n}\n\nconst STATUS_COLOR: Record<string, string> = {\n ok: \"text-green-600\",\n success: \"text-green-600\",\n error: \"text-red-600\",\n warning: \"text-amber-500\",\n running: \"text-blue-600\",\n pending: \"text-muted-foreground\",\n};\n\nfunction StatusDot({ status }: { status: string }) {\n return (\n <span className={`shrink-0 ${STATUS_COLOR[status] ?? \"text-muted-foreground\"}`} title={status}>\n ●\n </span>\n );\n}\n"],"names":[],"mappings":";;AAgDO,SAAS,cAAuD;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAQ,CAAC,MAAM,EAAE;AAAA,MACjB,aAAa,CAAC,MAAM,EAAE;AAAA,MACtB,aAAa,CAAC,IAAI,UAAU,QAAQ;AAAA,MACnC,GAAI,cAAc,SAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAC9C,GAAI,UAAU,SAAY,EAAE,MAAA,IAAU,CAAA;AAAA,MACtC,GAAI,iBAAiB,SAAY,EAAE,aAAA,IAAiB,CAAA;AAAA,MACpD,GAAI,eAAe,EAAE,cAAc,iBAAiB,CAAC,MAAS,EAAE,eAAe,KAAA,IAAS,CAAA;AAAA,MACzF,WAAW,CAAC,EAAE,KAAA,MACZ,YAAY,UAAU,IAAI,IAAI,oBAAC,qBAAA,EAAoB,MAAY,cAAA,CAA8B;AAAA,IAAA;AAAA,EAAA;AAIrG;AAEA,SAAS,oBAAoB,EAAE,MAAM,iBAA6E;AAChH,QAAM,OAAO,iBAAiB,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AACxE,SACE,qBAAC,OAAA,EAAI,WAAU,sEACZ,UAAA;AAAA,IAAA,KAAK,UAAU,oBAAC,WAAA,EAAU,QAAQ,KAAK,QAAQ;AAAA,IAChD,oBAAC,QAAA,EAAK,WAAU,iCAAiC,eAAK,OAAM;AAAA,IAC3D,KAAK,QAAQ,QACZ,oBAAC,QAAA,EAAK,WAAW,OAAO,iBAAiB,yBAA0B,UAAA,WAAW,IAAI,EAAA,CAAE;AAAA,IAErF,KAAK,SAAS,QAAQ,KAAK,QAAQ,KAClC,qBAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA;AAAA,MAAA;AAAA,MAAE,KAAK;AAAA,IAAA,GAAM;AAAA,IAEzD,KAAK,aACJ,qBAAC,QAAA,EAAK,WAAU,sCACb,UAAA;AAAA,MAAA,KAAK;AAAA,MACL,KAAK,cAAc,QAAQ,KAAK,aAAa,IAAI,IAAI,KAAK,UAAU,KAAK;AAAA,IAAA,GAC5E;AAAA,IAED,KAAK,UACJ,OAAO,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MACpC,qBAAC,QAAA,EAAa,WAAU,4BACrB,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,MAAE;AAAA,IAAA,EAAA,GADI,CAEX,CACD;AAAA,EAAA,GACL;AAEJ;AAEA,SAAS,WAAW,MAA6B;AAC/C,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,QAAQ,KAAK,QAAQ;AAC3B,SAAO,SAAS,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,OAAO,GAAG,KAAK,IAAI,IAAI;AACnE;AAEA,MAAM,eAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEA,SAAS,UAAU,EAAE,UAA8B;AACjD,SACE,oBAAC,QAAA,EAAK,WAAW,YAAY,aAAa,MAAM,KAAK,uBAAuB,IAAI,OAAO,QAAQ,UAAA,IAAA,CAE/F;AAEJ;"}
@@ -20,10 +20,37 @@ function Gauge({
20
20
  icon,
21
21
  subtitle,
22
22
  meta,
23
+ variant = "default",
24
+ showLabel = true,
23
25
  className
24
26
  }) {
25
27
  const pct = max > 0 ? Math.round(value / max * 100) : 0;
26
28
  const displayValue = max === 100 ? value : pct;
29
+ const labelText = typeof label === "string" || typeof label === "number" ? String(label) : void 0;
30
+ const valueNode = /* @__PURE__ */ jsxRuntime.jsxs("span", { className: utils.cn("font-semibold tabular-nums", toneClass[tone]), children: [
31
+ displayValue,
32
+ suffix ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-[0.85em] opacity-60", children: suffix }) : null
33
+ ] });
34
+ if (variant === "cell") {
35
+ return /* @__PURE__ */ jsxRuntime.jsxs(
36
+ "span",
37
+ {
38
+ className: utils.cn(
39
+ "inline-flex min-w-0 items-center gap-1.5 whitespace-nowrap align-middle text-xs",
40
+ className
41
+ ),
42
+ title: labelText,
43
+ "aria-label": !showLabel ? labelText : void 0,
44
+ children: [
45
+ icon ? /* @__PURE__ */ jsxRuntime.jsx(GaugeIcon, { icon }) : null,
46
+ showLabel ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate text-muted-foreground", children: label }) : null,
47
+ valueNode,
48
+ meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 truncate text-muted-foreground", children: meta }) : null
49
+ ]
50
+ }
51
+ );
52
+ }
53
+ const showHeader = icon || showLabel || meta;
27
54
  return /* @__PURE__ */ jsxRuntime.jsxs(
28
55
  "div",
29
56
  {
@@ -31,18 +58,24 @@ function Gauge({
31
58
  "flex min-h-28 w-[15.5rem] shrink-0 flex-col rounded-lg border border-border bg-card p-3",
32
59
  className
33
60
  ),
61
+ title: !showLabel ? labelText : void 0,
62
+ "aria-label": !showLabel ? labelText : void 0,
34
63
  children: [
35
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2 text-xs text-muted-foreground", children: [
64
+ showHeader ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2 text-xs text-muted-foreground", children: [
36
65
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex min-w-0 items-center gap-1.5", children: [
37
66
  icon ? /* @__PURE__ */ jsxRuntime.jsx(GaugeIcon, { icon }) : null,
38
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label })
67
+ showLabel ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }) : null
39
68
  ] }),
40
69
  meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 truncate", children: meta }) : null
41
- ] }),
70
+ ] }) : null,
42
71
  /* @__PURE__ */ jsxRuntime.jsxs(
43
72
  "span",
44
73
  {
45
- className: utils.cn("mt-2 text-2xl font-semibold tabular-nums tracking-tight", toneClass[tone]),
74
+ className: utils.cn(
75
+ showHeader && "mt-2",
76
+ "text-2xl font-semibold tabular-nums tracking-tight",
77
+ toneClass[tone]
78
+ ),
46
79
  children: [
47
80
  displayValue,
48
81
  suffix ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-sm opacity-60", children: suffix }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"Gauge.cjs","sources":["../../src/data/Gauge.tsx"],"sourcesContent":["import { isValidElement, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\n\nexport type GaugeTone = \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\";\n\nexport type GaugeProps = {\n label: ReactNode;\n value: number;\n max?: number;\n tone?: GaugeTone;\n suffix?: string;\n icon?: string | StaticIconComponent | ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n className?: string;\n};\n\nconst toneClass: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\nexport function Gauge({\n label,\n value,\n max = 100,\n tone = \"neutral\",\n suffix = \"%\",\n icon,\n subtitle,\n meta,\n className,\n}: GaugeProps) {\n const pct = max > 0 ? Math.round((value / max) * 100) : 0;\n const displayValue = max === 100 ? value : pct;\n return (\n <div\n className={cn(\n \"flex min-h-28 w-[15.5rem] shrink-0 flex-col rounded-lg border border-border bg-card p-3\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <GaugeIcon icon={icon} /> : null}\n <span className=\"truncate\">{label}</span>\n </span>\n {meta ? <span className=\"shrink-0 truncate\">{meta}</span> : null}\n </div>\n <span\n className={cn(\"mt-2 text-2xl font-semibold tabular-nums tracking-tight\", toneClass[tone])}\n >\n {displayValue}\n {suffix ? <span className=\"ml-0.5 text-sm opacity-60\">{suffix}</span> : null}\n </span>\n {subtitle ? (\n <span className=\"mt-1 truncate text-xs text-muted-foreground\">{subtitle}</span>\n ) : null}\n </div>\n );\n}\n\nfunction GaugeIcon({ icon }: { icon: string | StaticIconComponent | ReactNode }) {\n if (typeof icon === \"string\") {\n return <Icon name={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n }\n if (isValidElement(icon)) {\n return (\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground [&>svg]:h-4 [&>svg]:w-4\">\n {icon}\n </span>\n );\n }\n\n return (\n <Icon\n icon={icon as StaticIconComponent}\n width={16}\n height={16}\n className=\"text-muted-foreground\"\n />\n );\n}\n"],"names":["jsxs","cn","jsx","Icon","isValidElement"],"mappings":";;;;;;AAkBA,MAAM,YAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAe;AACb,QAAM,MAAM,MAAM,IAAI,KAAK,MAAO,QAAQ,MAAO,GAAG,IAAI;AACxD,QAAM,eAAe,QAAQ,MAAM,QAAQ;AAC3C,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,4CACb,UAAA;AAAA,YAAA,OAAOE,2BAAAA,IAAC,WAAA,EAAU,KAAA,CAAY,IAAK;AAAA,YACpCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,MAAA,CAAM;AAAA,UAAA,GACpC;AAAA,UACC,OAAOA,2BAAAA,IAAC,QAAA,EAAK,WAAU,qBAAqB,gBAAK,IAAU;AAAA,QAAA,GAC9D;AAAA,QACAF,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC,MAAAA,GAAG,2DAA2D,UAAU,IAAI,CAAC;AAAA,YAEvF,UAAA;AAAA,cAAA;AAAA,cACA,SAASC,2BAAAA,IAAC,QAAA,EAAK,WAAU,6BAA6B,kBAAO,IAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzE,WACCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,+CAA+C,oBAAS,IACtE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAAS,UAAU,EAAE,QAA4D;AAC/E,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAOA,+BAACC,KAAAA,QAAK,MAAM,MAAM,OAAO,IAAI,QAAQ,IAAI,WAAU,wBAAA,CAAwB;AAAA,EACpF;AACA,MAAIC,MAAAA,eAAe,IAAI,GAAG;AACxB,WACEF,2BAAAA,IAAC,QAAA,EAAK,WAAU,0GACb,UAAA,MACH;AAAA,EAEJ;AAEA,SACEA,2BAAAA;AAAAA,IAACC,KAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAU;AAAA,IAAA;AAAA,EAAA;AAGhB;;"}
1
+ {"version":3,"file":"Gauge.cjs","sources":["../../src/data/Gauge.tsx"],"sourcesContent":["import { isValidElement, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\n\nexport type GaugeTone = \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type GaugeVariant = \"default\" | \"cell\";\n\nexport type GaugeProps = {\n label: ReactNode;\n value: number;\n max?: number;\n tone?: GaugeTone;\n suffix?: string;\n icon?: string | StaticIconComponent | ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n /** Visual density/layout. `cell` is a compact inline form for table/grid cells. */\n variant?: GaugeVariant;\n /** Show the text label. Icons and values remain visible when false. */\n showLabel?: boolean;\n className?: string;\n};\n\nconst toneClass: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\nexport function Gauge({\n label,\n value,\n max = 100,\n tone = \"neutral\",\n suffix = \"%\",\n icon,\n subtitle,\n meta,\n variant = \"default\",\n showLabel = true,\n className,\n}: GaugeProps) {\n const pct = max > 0 ? Math.round((value / max) * 100) : 0;\n const displayValue = max === 100 ? value : pct;\n const labelText =\n typeof label === \"string\" || typeof label === \"number\" ? String(label) : undefined;\n const valueNode = (\n <span className={cn(\"font-semibold tabular-nums\", toneClass[tone])}>\n {displayValue}\n {suffix ? <span className=\"ml-0.5 text-[0.85em] opacity-60\">{suffix}</span> : null}\n </span>\n );\n\n if (variant === \"cell\") {\n return (\n <span\n className={cn(\n \"inline-flex min-w-0 items-center gap-1.5 whitespace-nowrap align-middle text-xs\",\n className,\n )}\n title={labelText}\n aria-label={!showLabel ? labelText : undefined}\n >\n {icon ? <GaugeIcon icon={icon} /> : null}\n {showLabel ? (\n <span className=\"min-w-0 truncate text-muted-foreground\">{label}</span>\n ) : null}\n {valueNode}\n {meta ? <span className=\"shrink-0 truncate text-muted-foreground\">{meta}</span> : null}\n </span>\n );\n }\n\n const showHeader = icon || showLabel || meta;\n\n return (\n <div\n className={cn(\n \"flex min-h-28 w-[15.5rem] shrink-0 flex-col rounded-lg border border-border bg-card p-3\",\n className,\n )}\n title={!showLabel ? labelText : undefined}\n aria-label={!showLabel ? labelText : undefined}\n >\n {showHeader ? (\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <GaugeIcon icon={icon} /> : null}\n {showLabel ? <span className=\"truncate\">{label}</span> : null}\n </span>\n {meta ? <span className=\"shrink-0 truncate\">{meta}</span> : null}\n </div>\n ) : null}\n <span\n className={cn(\n showHeader && \"mt-2\",\n \"text-2xl font-semibold tabular-nums tracking-tight\",\n toneClass[tone],\n )}\n >\n {displayValue}\n {suffix ? <span className=\"ml-0.5 text-sm opacity-60\">{suffix}</span> : null}\n </span>\n {subtitle ? (\n <span className=\"mt-1 truncate text-xs text-muted-foreground\">{subtitle}</span>\n ) : null}\n </div>\n );\n}\n\nfunction GaugeIcon({ icon }: { icon: string | StaticIconComponent | ReactNode }) {\n if (typeof icon === \"string\") {\n return <Icon name={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n }\n if (isValidElement(icon)) {\n return (\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground [&>svg]:h-4 [&>svg]:w-4\">\n {icon}\n </span>\n );\n }\n\n return (\n <Icon\n icon={icon as StaticIconComponent}\n width={16}\n height={16}\n className=\"text-muted-foreground\"\n />\n );\n}\n"],"names":["cn","jsx","jsxs","Icon","isValidElement"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { StaticIconComponent } from './Icon';
3
3
  export type GaugeTone = "neutral" | "success" | "warning" | "danger" | "info";
4
+ export type GaugeVariant = "default" | "cell";
4
5
  export type GaugeProps = {
5
6
  label: ReactNode;
6
7
  value: number;
@@ -10,7 +11,11 @@ export type GaugeProps = {
10
11
  icon?: string | StaticIconComponent | ReactNode;
11
12
  subtitle?: ReactNode;
12
13
  meta?: ReactNode;
14
+ /** Visual density/layout. `cell` is a compact inline form for table/grid cells. */
15
+ variant?: GaugeVariant;
16
+ /** Show the text label. Icons and values remain visible when false. */
17
+ showLabel?: boolean;
13
18
  className?: string;
14
19
  };
15
- export declare function Gauge({ label, value, max, tone, suffix, icon, subtitle, meta, className, }: GaugeProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function Gauge({ label, value, max, tone, suffix, icon, subtitle, meta, variant, showLabel, className, }: GaugeProps): import("react/jsx-runtime").JSX.Element;
16
21
  //# sourceMappingURL=Gauge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gauge.d.ts","sourceRoot":"","sources":["../../src/data/Gauge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,KAAK,EACL,GAAS,EACT,IAAgB,EAChB,MAAY,EACZ,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,SAAS,GACV,EAAE,UAAU,2CA4BZ"}
1
+ {"version":3,"file":"Gauge.d.ts","sourceRoot":"","sources":["../../src/data/Gauge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mFAAmF;IACnF,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,KAAK,EACL,GAAS,EACT,IAAgB,EAChB,MAAY,EACZ,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,OAAmB,EACnB,SAAgB,EAChB,SAAS,GACV,EAAE,UAAU,2CAmEZ"}
@@ -18,10 +18,37 @@ function Gauge({
18
18
  icon,
19
19
  subtitle,
20
20
  meta,
21
+ variant = "default",
22
+ showLabel = true,
21
23
  className
22
24
  }) {
23
25
  const pct = max > 0 ? Math.round(value / max * 100) : 0;
24
26
  const displayValue = max === 100 ? value : pct;
27
+ const labelText = typeof label === "string" || typeof label === "number" ? String(label) : void 0;
28
+ const valueNode = /* @__PURE__ */ jsxs("span", { className: cn("font-semibold tabular-nums", toneClass[tone]), children: [
29
+ displayValue,
30
+ suffix ? /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-[0.85em] opacity-60", children: suffix }) : null
31
+ ] });
32
+ if (variant === "cell") {
33
+ return /* @__PURE__ */ jsxs(
34
+ "span",
35
+ {
36
+ className: cn(
37
+ "inline-flex min-w-0 items-center gap-1.5 whitespace-nowrap align-middle text-xs",
38
+ className
39
+ ),
40
+ title: labelText,
41
+ "aria-label": !showLabel ? labelText : void 0,
42
+ children: [
43
+ icon ? /* @__PURE__ */ jsx(GaugeIcon, { icon }) : null,
44
+ showLabel ? /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-muted-foreground", children: label }) : null,
45
+ valueNode,
46
+ meta ? /* @__PURE__ */ jsx("span", { className: "shrink-0 truncate text-muted-foreground", children: meta }) : null
47
+ ]
48
+ }
49
+ );
50
+ }
51
+ const showHeader = icon || showLabel || meta;
25
52
  return /* @__PURE__ */ jsxs(
26
53
  "div",
27
54
  {
@@ -29,18 +56,24 @@ function Gauge({
29
56
  "flex min-h-28 w-[15.5rem] shrink-0 flex-col rounded-lg border border-border bg-card p-3",
30
57
  className
31
58
  ),
59
+ title: !showLabel ? labelText : void 0,
60
+ "aria-label": !showLabel ? labelText : void 0,
32
61
  children: [
33
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 text-xs text-muted-foreground", children: [
62
+ showHeader ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 text-xs text-muted-foreground", children: [
34
63
  /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-0 items-center gap-1.5", children: [
35
64
  icon ? /* @__PURE__ */ jsx(GaugeIcon, { icon }) : null,
36
- /* @__PURE__ */ jsx("span", { className: "truncate", children: label })
65
+ showLabel ? /* @__PURE__ */ jsx("span", { className: "truncate", children: label }) : null
37
66
  ] }),
38
67
  meta ? /* @__PURE__ */ jsx("span", { className: "shrink-0 truncate", children: meta }) : null
39
- ] }),
68
+ ] }) : null,
40
69
  /* @__PURE__ */ jsxs(
41
70
  "span",
42
71
  {
43
- className: cn("mt-2 text-2xl font-semibold tabular-nums tracking-tight", toneClass[tone]),
72
+ className: cn(
73
+ showHeader && "mt-2",
74
+ "text-2xl font-semibold tabular-nums tracking-tight",
75
+ toneClass[tone]
76
+ ),
44
77
  children: [
45
78
  displayValue,
46
79
  suffix ? /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-sm opacity-60", children: suffix }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"Gauge.js","sources":["../../src/data/Gauge.tsx"],"sourcesContent":["import { isValidElement, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\n\nexport type GaugeTone = \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\";\n\nexport type GaugeProps = {\n label: ReactNode;\n value: number;\n max?: number;\n tone?: GaugeTone;\n suffix?: string;\n icon?: string | StaticIconComponent | ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n className?: string;\n};\n\nconst toneClass: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\nexport function Gauge({\n label,\n value,\n max = 100,\n tone = \"neutral\",\n suffix = \"%\",\n icon,\n subtitle,\n meta,\n className,\n}: GaugeProps) {\n const pct = max > 0 ? Math.round((value / max) * 100) : 0;\n const displayValue = max === 100 ? value : pct;\n return (\n <div\n className={cn(\n \"flex min-h-28 w-[15.5rem] shrink-0 flex-col rounded-lg border border-border bg-card p-3\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <GaugeIcon icon={icon} /> : null}\n <span className=\"truncate\">{label}</span>\n </span>\n {meta ? <span className=\"shrink-0 truncate\">{meta}</span> : null}\n </div>\n <span\n className={cn(\"mt-2 text-2xl font-semibold tabular-nums tracking-tight\", toneClass[tone])}\n >\n {displayValue}\n {suffix ? <span className=\"ml-0.5 text-sm opacity-60\">{suffix}</span> : null}\n </span>\n {subtitle ? (\n <span className=\"mt-1 truncate text-xs text-muted-foreground\">{subtitle}</span>\n ) : null}\n </div>\n );\n}\n\nfunction GaugeIcon({ icon }: { icon: string | StaticIconComponent | ReactNode }) {\n if (typeof icon === \"string\") {\n return <Icon name={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n }\n if (isValidElement(icon)) {\n return (\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground [&>svg]:h-4 [&>svg]:w-4\">\n {icon}\n </span>\n );\n }\n\n return (\n <Icon\n icon={icon as StaticIconComponent}\n width={16}\n height={16}\n className=\"text-muted-foreground\"\n />\n );\n}\n"],"names":[],"mappings":";;;;AAkBA,MAAM,YAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAe;AACb,QAAM,MAAM,MAAM,IAAI,KAAK,MAAO,QAAQ,MAAO,GAAG,IAAI;AACxD,QAAM,eAAe,QAAQ,MAAM,QAAQ;AAC3C,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,4CACb,UAAA;AAAA,YAAA,OAAO,oBAAC,WAAA,EAAU,KAAA,CAAY,IAAK;AAAA,YACpC,oBAAC,QAAA,EAAK,WAAU,YAAY,UAAA,MAAA,CAAM;AAAA,UAAA,GACpC;AAAA,UACC,OAAO,oBAAC,QAAA,EAAK,WAAU,qBAAqB,gBAAK,IAAU;AAAA,QAAA,GAC9D;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,GAAG,2DAA2D,UAAU,IAAI,CAAC;AAAA,YAEvF,UAAA;AAAA,cAAA;AAAA,cACA,SAAS,oBAAC,QAAA,EAAK,WAAU,6BAA6B,kBAAO,IAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzE,WACC,oBAAC,QAAA,EAAK,WAAU,+CAA+C,oBAAS,IACtE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAAS,UAAU,EAAE,QAA4D;AAC/E,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,oBAAC,QAAK,MAAM,MAAM,OAAO,IAAI,QAAQ,IAAI,WAAU,wBAAA,CAAwB;AAAA,EACpF;AACA,MAAI,eAAe,IAAI,GAAG;AACxB,WACE,oBAAC,QAAA,EAAK,WAAU,0GACb,UAAA,MACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAU;AAAA,IAAA;AAAA,EAAA;AAGhB;"}
1
+ {"version":3,"file":"Gauge.js","sources":["../../src/data/Gauge.tsx"],"sourcesContent":["import { isValidElement, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\n\nexport type GaugeTone = \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type GaugeVariant = \"default\" | \"cell\";\n\nexport type GaugeProps = {\n label: ReactNode;\n value: number;\n max?: number;\n tone?: GaugeTone;\n suffix?: string;\n icon?: string | StaticIconComponent | ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n /** Visual density/layout. `cell` is a compact inline form for table/grid cells. */\n variant?: GaugeVariant;\n /** Show the text label. Icons and values remain visible when false. */\n showLabel?: boolean;\n className?: string;\n};\n\nconst toneClass: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\nexport function Gauge({\n label,\n value,\n max = 100,\n tone = \"neutral\",\n suffix = \"%\",\n icon,\n subtitle,\n meta,\n variant = \"default\",\n showLabel = true,\n className,\n}: GaugeProps) {\n const pct = max > 0 ? Math.round((value / max) * 100) : 0;\n const displayValue = max === 100 ? value : pct;\n const labelText =\n typeof label === \"string\" || typeof label === \"number\" ? String(label) : undefined;\n const valueNode = (\n <span className={cn(\"font-semibold tabular-nums\", toneClass[tone])}>\n {displayValue}\n {suffix ? <span className=\"ml-0.5 text-[0.85em] opacity-60\">{suffix}</span> : null}\n </span>\n );\n\n if (variant === \"cell\") {\n return (\n <span\n className={cn(\n \"inline-flex min-w-0 items-center gap-1.5 whitespace-nowrap align-middle text-xs\",\n className,\n )}\n title={labelText}\n aria-label={!showLabel ? labelText : undefined}\n >\n {icon ? <GaugeIcon icon={icon} /> : null}\n {showLabel ? (\n <span className=\"min-w-0 truncate text-muted-foreground\">{label}</span>\n ) : null}\n {valueNode}\n {meta ? <span className=\"shrink-0 truncate text-muted-foreground\">{meta}</span> : null}\n </span>\n );\n }\n\n const showHeader = icon || showLabel || meta;\n\n return (\n <div\n className={cn(\n \"flex min-h-28 w-[15.5rem] shrink-0 flex-col rounded-lg border border-border bg-card p-3\",\n className,\n )}\n title={!showLabel ? labelText : undefined}\n aria-label={!showLabel ? labelText : undefined}\n >\n {showHeader ? (\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <GaugeIcon icon={icon} /> : null}\n {showLabel ? <span className=\"truncate\">{label}</span> : null}\n </span>\n {meta ? <span className=\"shrink-0 truncate\">{meta}</span> : null}\n </div>\n ) : null}\n <span\n className={cn(\n showHeader && \"mt-2\",\n \"text-2xl font-semibold tabular-nums tracking-tight\",\n toneClass[tone],\n )}\n >\n {displayValue}\n {suffix ? <span className=\"ml-0.5 text-sm opacity-60\">{suffix}</span> : null}\n </span>\n {subtitle ? (\n <span className=\"mt-1 truncate text-xs text-muted-foreground\">{subtitle}</span>\n ) : null}\n </div>\n );\n}\n\nfunction GaugeIcon({ icon }: { icon: string | StaticIconComponent | ReactNode }) {\n if (typeof icon === \"string\") {\n return <Icon name={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n }\n if (isValidElement(icon)) {\n return (\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground [&>svg]:h-4 [&>svg]:w-4\">\n {icon}\n </span>\n );\n }\n\n return (\n <Icon\n icon={icon as StaticIconComponent}\n width={16}\n height={16}\n className=\"text-muted-foreground\"\n />\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const utils = require("../lib/utils.cjs");
6
+ const HoverCard = require("../overlay/HoverCard.cjs");
7
+ function GaugeHoverCard({
8
+ title,
9
+ rows,
10
+ footer,
11
+ trigger,
12
+ placement = "top",
13
+ className
14
+ }) {
15
+ return /* @__PURE__ */ jsxRuntime.jsx(
16
+ HoverCard.HoverCard,
17
+ {
18
+ placement,
19
+ delay: 150,
20
+ trigger,
21
+ cardClassName: "min-w-[9rem]",
22
+ ...className ? { className } : {},
23
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 text-[11px]", children: [
24
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-foreground", children: title }),
25
+ /* @__PURE__ */ jsxRuntime.jsx("dl", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5 tabular-nums", children: rows.map((r) => /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
26
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "text-muted-foreground", children: r.label }),
27
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: utils.cn("text-right font-medium text-foreground", r.tone), children: r.value })
28
+ ] }, r.label)) }),
29
+ footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 text-[10px] text-muted-foreground", children: footer }) : null
30
+ ] })
31
+ }
32
+ );
33
+ }
34
+ exports.GaugeHoverCard = GaugeHoverCard;
35
+ //# sourceMappingURL=GaugeHoverCard.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GaugeHoverCard.cjs","sources":["../../src/data/GaugeHoverCard.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { HoverCard, type HoverCardPlacement } from \"../overlay/HoverCard\";\n\nexport interface GaugeHoverRow {\n /** Row label, e.g. \"Current\", \"Min\", \"Capacity\". */\n label: string;\n /** Pre-formatted value (already unit-scaled by the caller). */\n value: string;\n /** Optional text-tone class for the value (e.g. a threshold colour). */\n tone?: string;\n}\n\nexport interface GaugeHoverCardProps {\n /** Card heading — the metric label. */\n title: string;\n /** Stat rows (current/min/max/…) rendered as a definition list. */\n rows: GaugeHoverRow[];\n /** Optional footer note, e.g. the look-back window. */\n footer?: ReactNode;\n /** The gauge visual that opens the card on hover/focus. */\n trigger: ReactNode;\n placement?: HoverCardPlacement;\n /** Classes for the HoverCard trigger wrapper (e.g. to keep a block gauge centred). */\n className?: string;\n}\n\n// GaugeHoverCard wraps a gauge's visual in a HoverCard whose body lists the\n// metric's label and its current/min/max/avg/capacity readings. Shared by\n// TimeseriesGauge and TimeseriesCoreBars so both surface the same hover summary.\nexport function GaugeHoverCard({\n title,\n rows,\n footer,\n trigger,\n placement = \"top\",\n className,\n}: GaugeHoverCardProps) {\n return (\n <HoverCard\n placement={placement}\n delay={150}\n trigger={trigger}\n cardClassName=\"min-w-[9rem]\"\n {...(className ? { className } : {})}\n >\n <div className=\"flex flex-col gap-1 text-[11px]\">\n <div className=\"font-medium text-foreground\">{title}</div>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5 tabular-nums\">\n {rows.map((r) => (\n <Fragment key={r.label}>\n <dt className=\"text-muted-foreground\">{r.label}</dt>\n <dd className={cn(\"text-right font-medium text-foreground\", r.tone)}>\n {r.value}\n </dd>\n </Fragment>\n ))}\n </dl>\n {footer ? (\n <div className=\"mt-0.5 text-[10px] text-muted-foreground\">{footer}</div>\n ) : null}\n </div>\n </HoverCard>\n );\n}\n"],"names":["jsx","HoverCard","jsxs","Fragment","cn"],"mappings":";;;;;;AA8BO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAwB;AACtB,SACEA,2BAAAA;AAAAA,IAACC,UAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAc;AAAA,MACb,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAEjC,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,+BAA+B,UAAA,OAAM;AAAA,QACpDA,2BAAAA,IAAC,QAAG,WAAU,4DACX,eAAK,IAAI,CAAC,MACTE,2BAAAA,KAACC,MAAAA,UAAA,EACC,UAAA;AAAA,UAAAH,2BAAAA,IAAC,MAAA,EAAG,WAAU,yBAAyB,UAAA,EAAE,OAAM;AAAA,UAC/CA,2BAAAA,IAAC,QAAG,WAAWI,SAAG,0CAA0C,EAAE,IAAI,GAC/D,UAAA,EAAE,MAAA,CACL;AAAA,QAAA,EAAA,GAJa,EAAE,KAKjB,CACD,GACH;AAAA,QACC,SACCJ,2BAAAA,IAAC,OAAA,EAAI,WAAU,4CAA4C,kBAAO,IAChE;AAAA,MAAA,EAAA,CACN;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
@@ -0,0 +1,25 @@
1
+ import { ReactNode } from 'react';
2
+ import { HoverCardPlacement } from '../overlay/HoverCard';
3
+ export interface GaugeHoverRow {
4
+ /** Row label, e.g. "Current", "Min", "Capacity". */
5
+ label: string;
6
+ /** Pre-formatted value (already unit-scaled by the caller). */
7
+ value: string;
8
+ /** Optional text-tone class for the value (e.g. a threshold colour). */
9
+ tone?: string;
10
+ }
11
+ export interface GaugeHoverCardProps {
12
+ /** Card heading — the metric label. */
13
+ title: string;
14
+ /** Stat rows (current/min/max/…) rendered as a definition list. */
15
+ rows: GaugeHoverRow[];
16
+ /** Optional footer note, e.g. the look-back window. */
17
+ footer?: ReactNode;
18
+ /** The gauge visual that opens the card on hover/focus. */
19
+ trigger: ReactNode;
20
+ placement?: HoverCardPlacement;
21
+ /** Classes for the HoverCard trigger wrapper (e.g. to keep a block gauge centred). */
22
+ className?: string;
23
+ }
24
+ export declare function GaugeHoverCard({ title, rows, footer, trigger, placement, className, }: GaugeHoverCardProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=GaugeHoverCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GaugeHoverCard.d.ts","sourceRoot":"","sources":["../../src/data/GaugeHoverCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAa,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,uDAAuD;IACvD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,2DAA2D;IAC3D,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,MAAM,EACN,OAAO,EACP,SAAiB,EACjB,SAAS,GACV,EAAE,mBAAmB,2CA2BrB"}
@@ -0,0 +1,35 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { HoverCard } from "../overlay/HoverCard.js";
5
+ function GaugeHoverCard({
6
+ title,
7
+ rows,
8
+ footer,
9
+ trigger,
10
+ placement = "top",
11
+ className
12
+ }) {
13
+ return /* @__PURE__ */ jsx(
14
+ HoverCard,
15
+ {
16
+ placement,
17
+ delay: 150,
18
+ trigger,
19
+ cardClassName: "min-w-[9rem]",
20
+ ...className ? { className } : {},
21
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 text-[11px]", children: [
22
+ /* @__PURE__ */ jsx("div", { className: "font-medium text-foreground", children: title }),
23
+ /* @__PURE__ */ jsx("dl", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5 tabular-nums", children: rows.map((r) => /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx("dt", { className: "text-muted-foreground", children: r.label }),
25
+ /* @__PURE__ */ jsx("dd", { className: cn("text-right font-medium text-foreground", r.tone), children: r.value })
26
+ ] }, r.label)) }),
27
+ footer ? /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-[10px] text-muted-foreground", children: footer }) : null
28
+ ] })
29
+ }
30
+ );
31
+ }
32
+ export {
33
+ GaugeHoverCard
34
+ };
35
+ //# sourceMappingURL=GaugeHoverCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GaugeHoverCard.js","sources":["../../src/data/GaugeHoverCard.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { HoverCard, type HoverCardPlacement } from \"../overlay/HoverCard\";\n\nexport interface GaugeHoverRow {\n /** Row label, e.g. \"Current\", \"Min\", \"Capacity\". */\n label: string;\n /** Pre-formatted value (already unit-scaled by the caller). */\n value: string;\n /** Optional text-tone class for the value (e.g. a threshold colour). */\n tone?: string;\n}\n\nexport interface GaugeHoverCardProps {\n /** Card heading — the metric label. */\n title: string;\n /** Stat rows (current/min/max/…) rendered as a definition list. */\n rows: GaugeHoverRow[];\n /** Optional footer note, e.g. the look-back window. */\n footer?: ReactNode;\n /** The gauge visual that opens the card on hover/focus. */\n trigger: ReactNode;\n placement?: HoverCardPlacement;\n /** Classes for the HoverCard trigger wrapper (e.g. to keep a block gauge centred). */\n className?: string;\n}\n\n// GaugeHoverCard wraps a gauge's visual in a HoverCard whose body lists the\n// metric's label and its current/min/max/avg/capacity readings. Shared by\n// TimeseriesGauge and TimeseriesCoreBars so both surface the same hover summary.\nexport function GaugeHoverCard({\n title,\n rows,\n footer,\n trigger,\n placement = \"top\",\n className,\n}: GaugeHoverCardProps) {\n return (\n <HoverCard\n placement={placement}\n delay={150}\n trigger={trigger}\n cardClassName=\"min-w-[9rem]\"\n {...(className ? { className } : {})}\n >\n <div className=\"flex flex-col gap-1 text-[11px]\">\n <div className=\"font-medium text-foreground\">{title}</div>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5 tabular-nums\">\n {rows.map((r) => (\n <Fragment key={r.label}>\n <dt className=\"text-muted-foreground\">{r.label}</dt>\n <dd className={cn(\"text-right font-medium text-foreground\", r.tone)}>\n {r.value}\n </dd>\n </Fragment>\n ))}\n </dl>\n {footer ? (\n <div className=\"mt-0.5 text-[10px] text-muted-foreground\">{footer}</div>\n ) : null}\n </div>\n </HoverCard>\n );\n}\n"],"names":[],"mappings":";;;;AA8BO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAwB;AACtB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAc;AAAA,MACb,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAEjC,UAAA,qBAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAU,+BAA+B,UAAA,OAAM;AAAA,QACpD,oBAAC,QAAG,WAAU,4DACX,eAAK,IAAI,CAAC,MACT,qBAAC,UAAA,EACC,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAG,WAAU,yBAAyB,UAAA,EAAE,OAAM;AAAA,UAC/C,oBAAC,QAAG,WAAW,GAAG,0CAA0C,EAAE,IAAI,GAC/D,UAAA,EAAE,MAAA,CACL;AAAA,QAAA,EAAA,GAJa,EAAE,KAKjB,CACD,GACH;AAAA,QACC,SACC,oBAAC,OAAA,EAAI,WAAU,4CAA4C,kBAAO,IAChE;AAAA,MAAA,EAAA,CACN;AAAA,IAAA;AAAA,EAAA;AAGN;"}