@flanksource/clicky-ui 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +29 -2
  2. package/dist/api-explorer.d.ts +5 -0
  3. package/dist/api-explorer.d.ts.map +1 -0
  4. package/dist/api-explorer.js +25 -0
  5. package/dist/api-explorer.js.map +1 -0
  6. package/dist/clicky.d.ts +2 -0
  7. package/dist/clicky.d.ts.map +1 -0
  8. package/dist/clicky.js +5 -0
  9. package/dist/clicky.js.map +1 -0
  10. package/dist/components/DatePicker.d.ts +18 -0
  11. package/dist/components/DatePicker.d.ts.map +1 -0
  12. package/dist/components/DatePicker.js +63 -0
  13. package/dist/components/DatePicker.js.map +1 -0
  14. package/dist/components/DateTimePicker.d.ts +18 -0
  15. package/dist/components/DateTimePicker.d.ts.map +1 -0
  16. package/dist/components/DateTimePicker.js +84 -0
  17. package/dist/components/DateTimePicker.js.map +1 -0
  18. package/dist/components/FilterBar.d.ts +180 -0
  19. package/dist/components/FilterBar.d.ts.map +1 -0
  20. package/dist/components/FilterBar.js +1685 -0
  21. package/dist/components/FilterBar.js.map +1 -0
  22. package/dist/components/MultiSelect.d.ts +19 -0
  23. package/dist/components/MultiSelect.d.ts.map +1 -0
  24. package/dist/components/MultiSelect.js +143 -0
  25. package/dist/components/MultiSelect.js.map +1 -0
  26. package/dist/components/RangeSlider.d.ts +16 -0
  27. package/dist/components/RangeSlider.d.ts.map +1 -0
  28. package/dist/components/RangeSlider.js +92 -0
  29. package/dist/components/RangeSlider.js.map +1 -0
  30. package/dist/components/button.d.ts +21 -0
  31. package/dist/components/button.d.ts.map +1 -0
  32. package/dist/components/button.js +126 -0
  33. package/dist/components/button.js.map +1 -0
  34. package/dist/components/density-switcher.d.ts +7 -0
  35. package/dist/components/density-switcher.d.ts.map +1 -0
  36. package/dist/components/density-switcher.js +32 -0
  37. package/dist/components/density-switcher.js.map +1 -0
  38. package/dist/components/icon-menu-picker.d.ts +22 -0
  39. package/dist/components/icon-menu-picker.d.ts.map +1 -0
  40. package/dist/components/icon-menu-picker.js +181 -0
  41. package/dist/components/icon-menu-picker.js.map +1 -0
  42. package/dist/components/select.d.ts +15 -0
  43. package/dist/components/select.d.ts.map +1 -0
  44. package/dist/components/select.js +39 -0
  45. package/dist/components/select.js.map +1 -0
  46. package/dist/components/theme-switcher.d.ts +7 -0
  47. package/dist/components/theme-switcher.d.ts.map +1 -0
  48. package/dist/components/theme-switcher.js +42 -0
  49. package/dist/components/theme-switcher.js.map +1 -0
  50. package/dist/components.d.ts +14 -0
  51. package/dist/components.d.ts.map +1 -0
  52. package/dist/components.js +31 -0
  53. package/dist/components.js.map +1 -0
  54. package/dist/data/AnsiHtml.d.ts +7 -0
  55. package/dist/data/AnsiHtml.d.ts.map +1 -0
  56. package/dist/data/AnsiHtml.js +71 -0
  57. package/dist/data/AnsiHtml.js.map +1 -0
  58. package/dist/data/Avatar.d.ts +32 -0
  59. package/dist/data/Avatar.d.ts.map +1 -0
  60. package/dist/data/Avatar.js +201 -0
  61. package/dist/data/Avatar.js.map +1 -0
  62. package/dist/data/AvatarBadge.d.ts +26 -0
  63. package/dist/data/AvatarBadge.d.ts.map +1 -0
  64. package/dist/data/AvatarBadge.js +104 -0
  65. package/dist/data/AvatarBadge.js.map +1 -0
  66. package/dist/data/Badge.d.ts +44 -0
  67. package/dist/data/Badge.d.ts.map +1 -0
  68. package/dist/data/Badge.js +667 -0
  69. package/dist/data/Badge.js.map +1 -0
  70. package/dist/data/Clicky.d.ts +147 -0
  71. package/dist/data/Clicky.d.ts.map +1 -0
  72. package/dist/data/Clicky.fixtures.d.ts +3 -0
  73. package/dist/data/Clicky.fixtures.d.ts.map +1 -0
  74. package/dist/data/Clicky.js +1960 -0
  75. package/dist/data/Clicky.js.map +1 -0
  76. package/dist/data/DataTable.d.ts +95 -0
  77. package/dist/data/DataTable.d.ts.map +1 -0
  78. package/dist/data/DataTable.js +1464 -0
  79. package/dist/data/DataTable.js.map +1 -0
  80. package/dist/data/FilterPill.d.ts +29 -0
  81. package/dist/data/FilterPill.d.ts.map +1 -0
  82. package/dist/data/FilterPill.js +153 -0
  83. package/dist/data/FilterPill.js.map +1 -0
  84. package/dist/data/Gauge.d.ts +15 -0
  85. package/dist/data/Gauge.d.ts.map +1 -0
  86. package/dist/data/Gauge.js +63 -0
  87. package/dist/data/Gauge.js.map +1 -0
  88. package/dist/data/Icon.d.ts +53 -0
  89. package/dist/data/Icon.d.ts.map +1 -0
  90. package/dist/data/Icon.js +115 -0
  91. package/dist/data/Icon.js.map +1 -0
  92. package/dist/data/JsonView.d.ts +8 -0
  93. package/dist/data/JsonView.d.ts.map +1 -0
  94. package/dist/data/JsonView.js +74 -0
  95. package/dist/data/JsonView.js.map +1 -0
  96. package/dist/data/KeyValueList.d.ts +17 -0
  97. package/dist/data/KeyValueList.d.ts.map +1 -0
  98. package/dist/data/KeyValueList.js +33 -0
  99. package/dist/data/KeyValueList.js.map +1 -0
  100. package/dist/data/LogViewer.d.ts +10 -0
  101. package/dist/data/LogViewer.d.ts.map +1 -0
  102. package/dist/data/LogViewer.js +46 -0
  103. package/dist/data/LogViewer.js.map +1 -0
  104. package/dist/data/LogsTable.d.ts +27 -0
  105. package/dist/data/LogsTable.d.ts.map +1 -0
  106. package/dist/data/LogsTable.js +580 -0
  107. package/dist/data/LogsTable.js.map +1 -0
  108. package/dist/data/Markdown.d.ts +6 -0
  109. package/dist/data/Markdown.d.ts.map +1 -0
  110. package/dist/data/Markdown.js +59 -0
  111. package/dist/data/Markdown.js.map +1 -0
  112. package/dist/data/MatrixTable.d.ts +22 -0
  113. package/dist/data/MatrixTable.d.ts.map +1 -0
  114. package/dist/data/MatrixTable.js +164 -0
  115. package/dist/data/MatrixTable.js.map +1 -0
  116. package/dist/data/MethodBadge.d.ts +6 -0
  117. package/dist/data/MethodBadge.d.ts.map +1 -0
  118. package/dist/data/MethodBadge.js +18 -0
  119. package/dist/data/MethodBadge.js.map +1 -0
  120. package/dist/data/ProgressBar.d.ts +13 -0
  121. package/dist/data/ProgressBar.d.ts.map +1 -0
  122. package/dist/data/ProgressBar.js +34 -0
  123. package/dist/data/ProgressBar.js.map +1 -0
  124. package/dist/data/SortableHeader.d.ts +12 -0
  125. package/dist/data/SortableHeader.d.ts.map +1 -0
  126. package/dist/data/SortableHeader.js +33 -0
  127. package/dist/data/SortableHeader.js.map +1 -0
  128. package/dist/data/TabButton.d.ts +12 -0
  129. package/dist/data/TabButton.d.ts.map +1 -0
  130. package/dist/data/TabButton.js +45 -0
  131. package/dist/data/TabButton.js.map +1 -0
  132. package/dist/data/Tree.d.ts +35 -0
  133. package/dist/data/Tree.d.ts.map +1 -0
  134. package/dist/data/Tree.js +236 -0
  135. package/dist/data/Tree.js.map +1 -0
  136. package/dist/data/TreeGroupHeader.d.ts +11 -0
  137. package/dist/data/TreeGroupHeader.d.ts.map +1 -0
  138. package/dist/data/TreeGroupHeader.js +41 -0
  139. package/dist/data/TreeGroupHeader.js.map +1 -0
  140. package/dist/data/TreeNode.d.ts +43 -0
  141. package/dist/data/TreeNode.d.ts.map +1 -0
  142. package/dist/data/TreeNode.js +100 -0
  143. package/dist/data/TreeNode.js.map +1 -0
  144. package/dist/data/cells/StatusDot.d.ts +11 -0
  145. package/dist/data/cells/StatusDot.d.ts.map +1 -0
  146. package/dist/data/cells/StatusDot.js +38 -0
  147. package/dist/data/cells/StatusDot.js.map +1 -0
  148. package/dist/data/cells/TagList.d.ts +59 -0
  149. package/dist/data/cells/TagList.d.ts.map +1 -0
  150. package/dist/data/cells/TagList.js +257 -0
  151. package/dist/data/cells/TagList.js.map +1 -0
  152. package/dist/data/cells/Timestamp.d.ts +46 -0
  153. package/dist/data/cells/Timestamp.d.ts.map +1 -0
  154. package/dist/data/cells/Timestamp.js +146 -0
  155. package/dist/data/cells/Timestamp.js.map +1 -0
  156. package/dist/data/cells/status-mapping.d.ts +8 -0
  157. package/dist/data/cells/status-mapping.d.ts.map +1 -0
  158. package/dist/data/cells/status-mapping.js +44 -0
  159. package/dist/data/cells/status-mapping.js.map +1 -0
  160. package/dist/data/code-highlight.d.ts +12 -0
  161. package/dist/data/code-highlight.d.ts.map +1 -0
  162. package/dist/data/code-highlight.js +28 -0
  163. package/dist/data/code-highlight.js.map +1 -0
  164. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
  165. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
  166. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
  167. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
  168. package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
  169. package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
  170. package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
  171. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
  172. package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
  173. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
  174. package/dist/data/diagnostics/ErrorDetails.js +157 -0
  175. package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
  176. package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
  177. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
  178. package/dist/data/diagnostics/GoroutineCard.js +75 -0
  179. package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
  180. package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
  181. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
  182. package/dist/data/diagnostics/JvmStackTrace.js +26 -0
  183. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
  184. package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
  185. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
  186. package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
  187. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
  188. package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
  189. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
  190. package/dist/data/diagnostics/ThreadCard.js +78 -0
  191. package/dist/data/diagnostics/ThreadCard.js.map +1 -0
  192. package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
  193. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
  194. package/dist/data/diagnostics/error-diagnostics.js +108 -0
  195. package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
  196. package/dist/data/diagnostics/fixtures.d.ts +3 -0
  197. package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
  198. package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
  199. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
  200. package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
  201. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
  202. package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
  203. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
  204. package/dist/data/diagnostics/stacktrace-parse.js +87 -0
  205. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
  206. package/dist/data/diagnostics/stacktrace.d.ts +38 -0
  207. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
  208. package/dist/data/diagnostics/stacktrace.js +119 -0
  209. package/dist/data/diagnostics/stacktrace.js.map +1 -0
  210. package/dist/data/diagnostics/types.d.ts +30 -0
  211. package/dist/data/diagnostics/types.d.ts.map +1 -0
  212. package/dist/data/diagnostics/utils.d.ts +8 -0
  213. package/dist/data/diagnostics/utils.d.ts.map +1 -0
  214. package/dist/data/diagnostics/utils.js +59 -0
  215. package/dist/data/diagnostics/utils.js.map +1 -0
  216. package/dist/data/har/HarPanel.d.ts +9 -0
  217. package/dist/data/har/HarPanel.d.ts.map +1 -0
  218. package/dist/data/har/HarPanel.js +175 -0
  219. package/dist/data/har/HarPanel.js.map +1 -0
  220. package/dist/data/har/fixtures.d.ts +3 -0
  221. package/dist/data/har/fixtures.d.ts.map +1 -0
  222. package/dist/data/har/types.d.ts +47 -0
  223. package/dist/data/har/types.d.ts.map +1 -0
  224. package/dist/data.d.ts +39 -0
  225. package/dist/data.d.ts.map +1 -0
  226. package/dist/data.js +109 -0
  227. package/dist/data.js.map +1 -0
  228. package/dist/hooks/use-density.d.ts +22 -0
  229. package/dist/hooks/use-density.d.ts.map +1 -0
  230. package/dist/hooks/use-density.js +54 -0
  231. package/dist/hooks/use-density.js.map +1 -0
  232. package/dist/hooks/use-history-route.d.ts +6 -0
  233. package/dist/hooks/use-history-route.d.ts.map +1 -0
  234. package/dist/hooks/use-history-route.js +31 -0
  235. package/dist/hooks/use-history-route.js.map +1 -0
  236. package/dist/hooks/use-sort.d.ts +17 -0
  237. package/dist/hooks/use-sort.d.ts.map +1 -0
  238. package/dist/hooks/use-sort.js +42 -0
  239. package/dist/hooks/use-sort.js.map +1 -0
  240. package/dist/hooks/use-theme.d.ts +17 -0
  241. package/dist/hooks/use-theme.d.ts.map +1 -0
  242. package/dist/hooks/use-theme.js +68 -0
  243. package/dist/hooks/use-theme.js.map +1 -0
  244. package/dist/hooks.d.ts +5 -0
  245. package/dist/hooks.d.ts.map +1 -0
  246. package/dist/hooks.js +14 -0
  247. package/dist/hooks.js.map +1 -0
  248. package/dist/index.d.ts +7 -0
  249. package/dist/index.d.ts.map +1 -0
  250. package/dist/index.js +193 -0
  251. package/dist/index.js.map +1 -0
  252. package/dist/layout/Section.d.ts +23 -0
  253. package/dist/layout/Section.d.ts.map +1 -0
  254. package/dist/layout/Section.js +73 -0
  255. package/dist/layout/Section.js.map +1 -0
  256. package/dist/layout/SplitPane.d.ts +13 -0
  257. package/dist/layout/SplitPane.d.ts.map +1 -0
  258. package/dist/layout/SplitPane.js +72 -0
  259. package/dist/layout/SplitPane.js.map +1 -0
  260. package/dist/lib/palette.d.ts +4 -0
  261. package/dist/lib/palette.d.ts.map +1 -0
  262. package/dist/lib/palette.js +35 -0
  263. package/dist/lib/palette.js.map +1 -0
  264. package/dist/lib/size.d.ts +6 -0
  265. package/dist/lib/size.d.ts.map +1 -0
  266. package/dist/lib/size.js +14 -0
  267. package/dist/lib/size.js.map +1 -0
  268. package/dist/lib/utils.d.ts +3 -0
  269. package/dist/lib/utils.d.ts.map +1 -0
  270. package/dist/lib/utils.js +9 -0
  271. package/dist/lib/utils.js.map +1 -0
  272. package/dist/overlay/HoverCard.d.ts +13 -0
  273. package/dist/overlay/HoverCard.d.ts.map +1 -0
  274. package/dist/overlay/HoverCard.js +170 -0
  275. package/dist/overlay/HoverCard.js.map +1 -0
  276. package/dist/overlay/Modal.d.ts +17 -0
  277. package/dist/overlay/Modal.d.ts.map +1 -0
  278. package/dist/overlay/Modal.js +91 -0
  279. package/dist/overlay/Modal.js.map +1 -0
  280. package/dist/rpc/AcceptPicker.d.ts +52 -0
  281. package/dist/rpc/AcceptPicker.d.ts.map +1 -0
  282. package/dist/rpc/AcceptPicker.js +126 -0
  283. package/dist/rpc/AcceptPicker.js.map +1 -0
  284. package/dist/rpc/ApiExplorer.d.ts +11 -0
  285. package/dist/rpc/ApiExplorer.d.ts.map +1 -0
  286. package/dist/rpc/ApiExplorer.js +37 -0
  287. package/dist/rpc/ApiExplorer.js.map +1 -0
  288. package/dist/rpc/CommandForm.d.ts +15 -0
  289. package/dist/rpc/CommandForm.d.ts.map +1 -0
  290. package/dist/rpc/CommandForm.js +356 -0
  291. package/dist/rpc/CommandForm.js.map +1 -0
  292. package/dist/rpc/CommandOutput.d.ts +11 -0
  293. package/dist/rpc/CommandOutput.d.ts.map +1 -0
  294. package/dist/rpc/CommandOutput.js +195 -0
  295. package/dist/rpc/CommandOutput.js.map +1 -0
  296. package/dist/rpc/EndpointList.d.ts +18 -0
  297. package/dist/rpc/EndpointList.d.ts.map +1 -0
  298. package/dist/rpc/EndpointList.js +56 -0
  299. package/dist/rpc/EndpointList.js.map +1 -0
  300. package/dist/rpc/EntityExplorerApp.d.ts +15 -0
  301. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
  302. package/dist/rpc/EntityExplorerApp.js +282 -0
  303. package/dist/rpc/EntityExplorerApp.js.map +1 -0
  304. package/dist/rpc/ExecutionResult.d.ts +14 -0
  305. package/dist/rpc/ExecutionResult.d.ts.map +1 -0
  306. package/dist/rpc/ExecutionResult.js +51 -0
  307. package/dist/rpc/ExecutionResult.js.map +1 -0
  308. package/dist/rpc/FilterForm.d.ts +22 -0
  309. package/dist/rpc/FilterForm.d.ts.map +1 -0
  310. package/dist/rpc/FilterForm.js +392 -0
  311. package/dist/rpc/FilterForm.js.map +1 -0
  312. package/dist/rpc/InlineError.d.ts +7 -0
  313. package/dist/rpc/InlineError.d.ts.map +1 -0
  314. package/dist/rpc/InlineError.js +54 -0
  315. package/dist/rpc/InlineError.js.map +1 -0
  316. package/dist/rpc/OperationActionDialog.d.ts +12 -0
  317. package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
  318. package/dist/rpc/OperationActionDialog.js +105 -0
  319. package/dist/rpc/OperationActionDialog.js.map +1 -0
  320. package/dist/rpc/OperationCatalog.d.ts +21 -0
  321. package/dist/rpc/OperationCatalog.d.ts.map +1 -0
  322. package/dist/rpc/OperationCatalog.js +339 -0
  323. package/dist/rpc/OperationCatalog.js.map +1 -0
  324. package/dist/rpc/OperationCommandPage.d.ts +22 -0
  325. package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
  326. package/dist/rpc/OperationCommandPage.js +484 -0
  327. package/dist/rpc/OperationCommandPage.js.map +1 -0
  328. package/dist/rpc/OperationEntityPage.d.ts +23 -0
  329. package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
  330. package/dist/rpc/OperationEntityPage.js +218 -0
  331. package/dist/rpc/OperationEntityPage.js.map +1 -0
  332. package/dist/rpc/classify.d.ts +8 -0
  333. package/dist/rpc/classify.d.ts.map +1 -0
  334. package/dist/rpc/classify.js +76 -0
  335. package/dist/rpc/classify.js.map +1 -0
  336. package/dist/rpc/clickyMetadata.d.ts +12 -0
  337. package/dist/rpc/clickyMetadata.d.ts.map +1 -0
  338. package/dist/rpc/clickyMetadata.js +71 -0
  339. package/dist/rpc/clickyMetadata.js.map +1 -0
  340. package/dist/rpc/formMetadata.d.ts +27 -0
  341. package/dist/rpc/formMetadata.d.ts.map +1 -0
  342. package/dist/rpc/formMetadata.js +250 -0
  343. package/dist/rpc/formMetadata.js.map +1 -0
  344. package/dist/rpc/types.d.ts +109 -0
  345. package/dist/rpc/types.d.ts.map +1 -0
  346. package/dist/rpc/types.js +8 -0
  347. package/dist/rpc/types.js.map +1 -0
  348. package/dist/rpc/useOperations.d.ts +346 -0
  349. package/dist/rpc/useOperations.d.ts.map +1 -0
  350. package/dist/rpc/useOperations.js +31 -0
  351. package/dist/rpc/useOperations.js.map +1 -0
  352. package/dist/rpc.d.ts +14 -0
  353. package/dist/rpc.d.ts.map +1 -0
  354. package/dist/rpc.js +37 -0
  355. package/dist/rpc.js.map +1 -0
  356. package/dist/styles.css +2 -0
  357. package/dist/styles.d.ts +1 -0
  358. package/dist/styles.d.ts.map +1 -0
  359. package/dist/styles.js +2 -0
  360. package/dist/styles.js.map +1 -0
  361. package/dist/tailwind-preset.d.ts +4 -0
  362. package/dist/tailwind-preset.d.ts.map +1 -0
  363. package/dist/tailwind-preset.js +69 -0
  364. package/dist/tailwind-preset.js.map +1 -0
  365. package/dist/utils.d.ts +4 -0
  366. package/dist/utils.d.ts.map +1 -0
  367. package/dist/utils.js +12 -0
  368. package/dist/utils.js.map +1 -0
  369. package/package.json +83 -40
  370. package/dist/index.d.mts +0 -834
  371. package/dist/index.d.mts.map +0 -1
  372. package/dist/index.mjs +0 -2918
  373. package/dist/index.mjs.map +0 -1
  374. package/dist/tailwind-preset.d.mts +0 -7
  375. package/dist/tailwind-preset.d.mts.map +0 -1
  376. package/dist/tailwind-preset.mjs +0 -64
  377. package/dist/tailwind-preset.mjs.map +0 -1
  378. package/src/styles/tokens.css +0 -78
@@ -0,0 +1,257 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useContext, createContext, useMemo } from "react";
3
+ import { Badge } from "../Badge.js";
4
+ import { HoverCard } from "../../overlay/HoverCard.js";
5
+ import { Icon } from "../Icon.js";
6
+ import { cn } from "../../lib/utils.js";
7
+ function normalizeTags(value, separator = "=") {
8
+ if (value == null) return [];
9
+ if (Array.isArray(value)) {
10
+ return value.map((entry) => normalizeOne(entry, separator)).filter((tag) => tag.value !== "");
11
+ }
12
+ if (typeof value === "object") {
13
+ return Object.entries(value).map(([key, raw]) => {
14
+ if (raw == null) return null;
15
+ const valueStr = String(raw).trim();
16
+ if (!valueStr) return null;
17
+ return {
18
+ key,
19
+ value: valueStr,
20
+ display: `${key}${separator}${valueStr}`,
21
+ token: `${key}${separator}${valueStr}`
22
+ };
23
+ }).filter((tag) => tag !== null);
24
+ }
25
+ return [];
26
+ }
27
+ function normalizeOne(entry, separator) {
28
+ if (typeof entry === "string") {
29
+ const trimmed = entry.trim();
30
+ const eq = trimmed.indexOf("=");
31
+ const colon = trimmed.indexOf(":");
32
+ const splitAt = eq >= 0 && (colon < 0 || eq < colon) ? eq : colon >= 0 && colon < trimmed.length - 1 ? colon : -1;
33
+ if (splitAt > 0) {
34
+ const key2 = trimmed.slice(0, splitAt);
35
+ const value2 = trimmed.slice(splitAt + 1);
36
+ return {
37
+ key: key2,
38
+ value: value2,
39
+ display: `${key2}${separator}${value2}`,
40
+ token: `${key2}${separator}${value2}`
41
+ };
42
+ }
43
+ return { value: trimmed, display: trimmed, token: trimmed };
44
+ }
45
+ const key = "key" in entry && typeof entry.key === "string" ? entry.key : "name" in entry && typeof entry.name === "string" ? entry.name : void 0;
46
+ const value = String(entry.value ?? "").trim();
47
+ if (key) {
48
+ return {
49
+ key,
50
+ value,
51
+ display: `${key}${separator}${value}`,
52
+ token: `${key}${separator}${value}`
53
+ };
54
+ }
55
+ return { value, display: value, token: value };
56
+ }
57
+ function tagFilterTokens(value, separator = "=") {
58
+ return normalizeTags(value, separator).map((tag) => tag.token);
59
+ }
60
+ function splitTagToken(token, separator = "=") {
61
+ const idx = token.indexOf(separator);
62
+ if (idx <= 0) return { key: "", value: token };
63
+ return { key: token.slice(0, idx), value: token.slice(idx + separator.length) };
64
+ }
65
+ const noop = {
66
+ getMode: () => "neutral",
67
+ toggleInclude: () => {
68
+ },
69
+ toggleExclude: () => {
70
+ }
71
+ };
72
+ const TagActionsContext = createContext(noop);
73
+ function TagActionsProvider({
74
+ value,
75
+ children
76
+ }) {
77
+ return /* @__PURE__ */ jsx(TagActionsContext.Provider, { value, children });
78
+ }
79
+ function useTagActions() {
80
+ return useContext(TagActionsContext);
81
+ }
82
+ function copyToClipboard(text) {
83
+ var _a;
84
+ if (typeof navigator !== "undefined" && ((_a = navigator.clipboard) == null ? void 0 : _a.writeText)) {
85
+ navigator.clipboard.writeText(text).catch(() => void 0);
86
+ }
87
+ }
88
+ function TagBadge({
89
+ tag,
90
+ actions: actionMode
91
+ }) {
92
+ const actions = useTagActions();
93
+ const mode = actions.getMode(tag.token);
94
+ const onPlus = useCallback(
95
+ (event) => {
96
+ event.stopPropagation();
97
+ actions.toggleInclude(tag.token);
98
+ },
99
+ [actions, tag.token]
100
+ );
101
+ const onMinus = useCallback(
102
+ (event) => {
103
+ event.stopPropagation();
104
+ actions.toggleExclude(tag.token);
105
+ },
106
+ [actions, tag.token]
107
+ );
108
+ const onCopy = useCallback(
109
+ (event) => {
110
+ event.stopPropagation();
111
+ copyToClipboard(tag.value);
112
+ },
113
+ [tag.value]
114
+ );
115
+ const includeActive = mode === "include";
116
+ const excludeActive = mode === "exclude";
117
+ const badge = /* @__PURE__ */ jsx(
118
+ "span",
119
+ {
120
+ className: cn(
121
+ "inline-flex items-center rounded-md border bg-background align-middle",
122
+ includeActive ? "border-green-500/50 bg-green-500/5" : excludeActive ? "border-red-500/50 bg-red-500/5" : "border-border"
123
+ ),
124
+ children: tag.key ? /* @__PURE__ */ jsx(
125
+ Badge,
126
+ {
127
+ size: "xs",
128
+ variant: "label",
129
+ tone: "neutral",
130
+ label: tag.key,
131
+ value: tag.value,
132
+ maxWidth: 32,
133
+ truncate: "auto",
134
+ clickToCopy: false,
135
+ className: "border-transparent shadow-none"
136
+ }
137
+ ) : /* @__PURE__ */ jsx(
138
+ Badge,
139
+ {
140
+ size: "xs",
141
+ variant: "soft",
142
+ tone: "neutral",
143
+ maxWidth: 32,
144
+ truncate: "auto",
145
+ clickToCopy: false,
146
+ children: tag.value
147
+ }
148
+ )
149
+ }
150
+ );
151
+ const toolbar = /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-0.5", children: [
152
+ /* @__PURE__ */ jsx(
153
+ TagActionButton,
154
+ {
155
+ ariaLabel: `Include ${tag.display}`,
156
+ onClick: onPlus,
157
+ active: includeActive,
158
+ activeClassName: "bg-green-500/20 text-green-700 dark:text-green-400",
159
+ icon: "lucide:zoom-in"
160
+ }
161
+ ),
162
+ /* @__PURE__ */ jsx(
163
+ TagActionButton,
164
+ {
165
+ ariaLabel: `Exclude ${tag.display}`,
166
+ onClick: onMinus,
167
+ active: excludeActive,
168
+ activeClassName: "bg-red-500/20 text-red-700 dark:text-red-400",
169
+ icon: "lucide:zoom-out"
170
+ }
171
+ ),
172
+ /* @__PURE__ */ jsx(TagActionButton, { ariaLabel: `Copy ${tag.display}`, onClick: onCopy, icon: "lucide:copy" })
173
+ ] });
174
+ if (actionMode === "inline") {
175
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-0.5 rounded-md border border-border bg-background pr-0.5", children: [
176
+ badge,
177
+ toolbar
178
+ ] });
179
+ }
180
+ return /* @__PURE__ */ jsx(HoverCard, { placement: "top", delay: 120, arrow: false, trigger: badge, cardClassName: "!p-1", children: toolbar });
181
+ }
182
+ function TagActionButton({
183
+ ariaLabel,
184
+ onClick,
185
+ active,
186
+ activeClassName,
187
+ icon
188
+ }) {
189
+ return /* @__PURE__ */ jsx(
190
+ "button",
191
+ {
192
+ type: "button",
193
+ "aria-label": ariaLabel,
194
+ title: ariaLabel,
195
+ onClick,
196
+ className: cn(
197
+ "inline-flex h-5 w-5 items-center justify-center rounded text-muted-foreground",
198
+ "hover:bg-accent hover:text-foreground",
199
+ active && activeClassName
200
+ ),
201
+ children: /* @__PURE__ */ jsx(Icon, { name: icon, className: "text-xs" })
202
+ }
203
+ );
204
+ }
205
+ function TagList({ tags, maxVisible = 3, className, actions = "hover" }) {
206
+ if (tags.length === 0) {
207
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "—" });
208
+ }
209
+ const visible = tags.slice(0, maxVisible);
210
+ const overflow = tags.slice(maxVisible);
211
+ return /* @__PURE__ */ jsxs("span", { className: cn("inline-flex flex-wrap items-center gap-1", className), children: [
212
+ visible.map((tag, index) => /* @__PURE__ */ jsx(TagBadge, { tag, actions }, `${tag.display}-${index}`)),
213
+ overflow.length > 0 && /* @__PURE__ */ jsx(
214
+ HoverCard,
215
+ {
216
+ placement: "top",
217
+ trigger: /* @__PURE__ */ jsxs(Badge, { size: "xs", variant: "outlined", tone: "neutral", clickToCopy: false, children: [
218
+ "+",
219
+ overflow.length
220
+ ] }),
221
+ cardClassName: "max-w-xs whitespace-normal",
222
+ children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: overflow.map((tag, index) => /* @__PURE__ */ jsx(TagBadge, { tag, actions }, `${tag.display}-${index}`)) })
223
+ }
224
+ )
225
+ ] });
226
+ }
227
+ function tagActionsFromRecord(value, onChange) {
228
+ return {
229
+ getMode: (token) => value[token] ?? "neutral",
230
+ toggleInclude: (token) => {
231
+ const next = { ...value };
232
+ if (next[token] === "include") delete next[token];
233
+ else next[token] = "include";
234
+ onChange(next);
235
+ },
236
+ toggleExclude: (token) => {
237
+ const next = { ...value };
238
+ if (next[token] === "exclude") delete next[token];
239
+ else next[token] = "exclude";
240
+ onChange(next);
241
+ }
242
+ };
243
+ }
244
+ function useTagActionsValue(value, onChange) {
245
+ return useMemo(() => tagActionsFromRecord(value, onChange), [value, onChange]);
246
+ }
247
+ export {
248
+ TagActionsProvider,
249
+ TagList,
250
+ normalizeTags,
251
+ splitTagToken,
252
+ tagActionsFromRecord,
253
+ tagFilterTokens,
254
+ useTagActions,
255
+ useTagActionsValue
256
+ };
257
+ //# sourceMappingURL=TagList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagList.js","sources":["../../../src/data/cells/TagList.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo } from \"react\";\nimport { Badge } from \"../Badge\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport { Icon } from \"../Icon\";\nimport { cn } from \"../../lib/utils\";\nimport type { FilterMode } from \"../FilterPill\";\n\nexport type TagInput = string | { key: string; value: string } | { name: string; value: string };\n\nexport type NormalizedTag = {\n key?: string;\n value: string;\n display: string;\n token: string;\n};\n\nexport type TagsValue =\n | TagInput[]\n | Record<string, string | number | boolean | null>\n | null\n | undefined;\n\nexport type TagsOptions = {\n maxVisible?: number;\n separator?: string;\n};\n\nexport function normalizeTags(value: TagsValue, separator = \"=\"): NormalizedTag[] {\n if (value == null) return [];\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeOne(entry, separator)).filter((tag) => tag.value !== \"\");\n }\n\n if (typeof value === \"object\") {\n return Object.entries(value)\n .map(([key, raw]): NormalizedTag | null => {\n if (raw == null) return null;\n const valueStr = String(raw).trim();\n if (!valueStr) return null;\n return {\n key,\n value: valueStr,\n display: `${key}${separator}${valueStr}`,\n token: `${key}${separator}${valueStr}`,\n } satisfies NormalizedTag;\n })\n .filter((tag): tag is NormalizedTag => tag !== null);\n }\n\n return [];\n}\n\nfunction normalizeOne(entry: TagInput, separator: string): NormalizedTag {\n if (typeof entry === \"string\") {\n const trimmed = entry.trim();\n const eq = trimmed.indexOf(\"=\");\n const colon = trimmed.indexOf(\":\");\n const splitAt =\n eq >= 0 && (colon < 0 || eq < colon)\n ? eq\n : colon >= 0 && colon < trimmed.length - 1\n ? colon\n : -1;\n\n if (splitAt > 0) {\n const key = trimmed.slice(0, splitAt);\n const value = trimmed.slice(splitAt + 1);\n return {\n key,\n value,\n display: `${key}${separator}${value}`,\n token: `${key}${separator}${value}`,\n };\n }\n\n return { value: trimmed, display: trimmed, token: trimmed };\n }\n\n const key =\n \"key\" in entry && typeof entry.key === \"string\"\n ? entry.key\n : \"name\" in entry && typeof entry.name === \"string\"\n ? entry.name\n : undefined;\n const value = String(entry.value ?? \"\").trim();\n\n if (key) {\n return {\n key,\n value,\n display: `${key}${separator}${value}`,\n token: `${key}${separator}${value}`,\n };\n }\n return { value, display: value, token: value };\n}\n\nexport function tagFilterTokens(value: TagsValue, separator = \"=\"): string[] {\n return normalizeTags(value, separator).map((tag) => tag.token);\n}\n\n/**\n * Splits a token previously produced by `normalizeTags`/`tagFilterTokens`\n * back into its key and value parts using the same separator. Tokens\n * without a separator (bare tags) return `{ key: \"\", value: token }`.\n */\nexport function splitTagToken(token: string, separator = \"=\"): { key: string; value: string } {\n const idx = token.indexOf(separator);\n if (idx <= 0) return { key: \"\", value: token };\n return { key: token.slice(0, idx), value: token.slice(idx + separator.length) };\n}\n\n// Filter mode mapping (re-using FilterPill's tri-state vocabulary so the wire\n// shape matches DataTable's existing multiFilters state).\nexport type TagFilterMode = Extract<FilterMode, \"include\" | \"exclude\">;\n\nexport type TagActionsContextValue = {\n /** Returns the current mode for a token; \"neutral\" if the user hasn't acted on it. */\n getMode: (token: string) => FilterMode;\n /** Toggle include for this token (off → include → off). */\n toggleInclude: (token: string) => void;\n /** Toggle exclude for this token (off → exclude → off). */\n toggleExclude: (token: string) => void;\n};\n\nconst noop: TagActionsContextValue = {\n getMode: () => \"neutral\",\n toggleInclude: () => {},\n toggleExclude: () => {},\n};\n\nconst TagActionsContext = createContext<TagActionsContextValue>(noop);\n\nexport function TagActionsProvider({\n value,\n children,\n}: {\n value: TagActionsContextValue;\n children: React.ReactNode;\n}) {\n return <TagActionsContext.Provider value={value}>{children}</TagActionsContext.Provider>;\n}\n\nexport function useTagActions(): TagActionsContextValue {\n return useContext(TagActionsContext);\n}\n\nexport type TagListProps = {\n tags: NormalizedTag[];\n maxVisible?: number;\n className?: string;\n actions?: \"hover\" | \"inline\";\n};\n\nfunction copyToClipboard(text: string) {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(text).catch(() => undefined);\n }\n}\n\nfunction TagBadge({\n tag,\n actions: actionMode,\n}: {\n tag: NormalizedTag;\n actions: \"hover\" | \"inline\";\n}) {\n const actions = useTagActions();\n const mode = actions.getMode(tag.token);\n\n const onPlus = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n actions.toggleInclude(tag.token);\n },\n [actions, tag.token],\n );\n const onMinus = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n actions.toggleExclude(tag.token);\n },\n [actions, tag.token],\n );\n const onCopy = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n copyToClipboard(tag.value);\n },\n [tag.value],\n );\n\n // Active state colors mirror FilterPill: include = green, exclude = red.\n const includeActive = mode === \"include\";\n const excludeActive = mode === \"exclude\";\n\n const badge = (\n <span\n className={cn(\n \"inline-flex items-center rounded-md border bg-background align-middle\",\n includeActive\n ? \"border-green-500/50 bg-green-500/5\"\n : excludeActive\n ? \"border-red-500/50 bg-red-500/5\"\n : \"border-border\",\n )}\n >\n {tag.key ? (\n <Badge\n size=\"xs\"\n variant=\"label\"\n tone=\"neutral\"\n label={tag.key}\n value={tag.value}\n maxWidth={32}\n truncate=\"auto\"\n clickToCopy={false}\n className=\"border-transparent shadow-none\"\n />\n ) : (\n <Badge\n size=\"xs\"\n variant=\"soft\"\n tone=\"neutral\"\n maxWidth={32}\n truncate=\"auto\"\n clickToCopy={false}\n >\n {tag.value}\n </Badge>\n )}\n </span>\n );\n\n const toolbar = (\n <span className=\"inline-flex items-center gap-0.5\">\n <TagActionButton\n ariaLabel={`Include ${tag.display}`}\n onClick={onPlus}\n active={includeActive}\n activeClassName=\"bg-green-500/20 text-green-700 dark:text-green-400\"\n icon=\"lucide:zoom-in\"\n />\n <TagActionButton\n ariaLabel={`Exclude ${tag.display}`}\n onClick={onMinus}\n active={excludeActive}\n activeClassName=\"bg-red-500/20 text-red-700 dark:text-red-400\"\n icon=\"lucide:zoom-out\"\n />\n <TagActionButton ariaLabel={`Copy ${tag.display}`} onClick={onCopy} icon=\"lucide:copy\" />\n </span>\n );\n\n if (actionMode === \"inline\") {\n return (\n <span className=\"inline-flex items-center gap-0.5 rounded-md border border-border bg-background pr-0.5\">\n {badge}\n {toolbar}\n </span>\n );\n }\n\n // Action icons live in a hover popover above the tag — the cell stays\n // clean, and hovering reveals the magnifier-plus / magnifier-minus / copy\n // toolbar.\n return (\n <HoverCard placement=\"top\" delay={120} arrow={false} trigger={badge} cardClassName=\"!p-1\">\n {toolbar}\n </HoverCard>\n );\n}\n\nfunction TagActionButton({\n ariaLabel,\n onClick,\n active,\n activeClassName,\n icon,\n}: {\n ariaLabel: string;\n onClick: (event: React.MouseEvent) => void;\n active?: boolean;\n activeClassName?: string;\n icon: string;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n onClick={onClick}\n className={cn(\n \"inline-flex h-5 w-5 items-center justify-center rounded text-muted-foreground\",\n \"hover:bg-accent hover:text-foreground\",\n active && activeClassName,\n )}\n >\n <Icon name={icon} className=\"text-xs\" />\n </button>\n );\n}\n\nexport function TagList({ tags, maxVisible = 3, className, actions = \"hover\" }: TagListProps) {\n if (tags.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n\n const visible = tags.slice(0, maxVisible);\n const overflow = tags.slice(maxVisible);\n\n return (\n <span className={cn(\"inline-flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag, index) => (\n <TagBadge key={`${tag.display}-${index}`} tag={tag} actions={actions} />\n ))}\n {overflow.length > 0 && (\n <HoverCard\n placement=\"top\"\n trigger={\n <Badge size=\"xs\" variant=\"outlined\" tone=\"neutral\" clickToCopy={false}>\n +{overflow.length}\n </Badge>\n }\n cardClassName=\"max-w-xs whitespace-normal\"\n >\n <div className=\"flex flex-wrap gap-1\">\n {overflow.map((tag, index) => (\n <TagBadge key={`${tag.display}-${index}`} tag={tag} actions={actions} />\n ))}\n </div>\n </HoverCard>\n )}\n </span>\n );\n}\n\n/**\n * Builds a TagActionsContextValue from a flat record-of-modes (the same\n * shape used by FilterBar's multi/nested-multi filters). Useful when\n * connecting DataTable's multiFilters state to the in-cell + / − buttons.\n */\nexport function tagActionsFromRecord(\n value: Record<string, TagFilterMode>,\n onChange: (next: Record<string, TagFilterMode>) => void,\n): TagActionsContextValue {\n return {\n getMode: (token) => value[token] ?? \"neutral\",\n toggleInclude: (token) => {\n const next = { ...value };\n if (next[token] === \"include\") delete next[token];\n else next[token] = \"include\";\n onChange(next);\n },\n toggleExclude: (token) => {\n const next = { ...value };\n if (next[token] === \"exclude\") delete next[token];\n else next[token] = \"exclude\";\n onChange(next);\n },\n };\n}\n\n// Memoizing the context value avoids re-rendering every TagList cell on\n// unrelated state changes.\nexport function useTagActionsValue(\n value: Record<string, TagFilterMode>,\n onChange: (next: Record<string, TagFilterMode>) => void,\n): TagActionsContextValue {\n return useMemo(() => tagActionsFromRecord(value, onChange), [value, onChange]);\n}\n"],"names":["key","value"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export type TimestampMode = "auto" | "absolute" | "relative" | "time";
2
+ export type TimestampFormat = "relative" | "time" | "short" | "iso";
3
+ export type TimestampOptions = {
4
+ mode?: TimestampMode;
5
+ alwaysShowFullOnHover?: boolean;
6
+ /**
7
+ * When the column is on a DataTable with `autoFilter`, DataTable mounts a
8
+ * "Time range" picker (matching the trace UI) and filters rows whose
9
+ * timestamp falls outside the selected range. Set `false` to suppress.
10
+ */
11
+ autoRangeFilter?: boolean;
12
+ /** Override the trace-style preset list ("Last 15 minutes", etc.). */
13
+ rangePresets?: Array<{
14
+ label: string;
15
+ from: string;
16
+ to: string;
17
+ }>;
18
+ /**
19
+ * Default range applied on first render. Either side may use date-math
20
+ * (`now-24h`, `now`) or any value parseable by `parseTimestamp`.
21
+ */
22
+ defaultRange?: {
23
+ from?: string;
24
+ to?: string;
25
+ };
26
+ };
27
+ export declare function parseTimestamp(value: unknown): Date | null;
28
+ /**
29
+ * Resolves date-math strings to an absolute Date. Recognised forms:
30
+ * - "now"
31
+ * - "now-15m", "now-1h", "now+30s", "now-7d", "now-2w" (units: s/m/h/d/w)
32
+ * - any value parseable by `parseTimestamp` (ISO, epoch ms/s, Date)
33
+ * Returns null for unparseable input.
34
+ */
35
+ export declare function resolveDateMath(value: unknown, now?: Date): Date | null;
36
+ export declare function chooseTimestampFormat(values: Date[]): TimestampFormat;
37
+ export declare function formatTimestamp(date: Date, format: TimestampFormat, now?: Date): string;
38
+ export declare function modeToFormat(mode: TimestampMode, dataFormat: TimestampFormat): TimestampFormat;
39
+ export type TimestampProps = {
40
+ value: unknown;
41
+ format: TimestampFormat;
42
+ showTitleOnHover?: boolean;
43
+ className?: string;
44
+ };
45
+ export declare function Timestamp({ value, format, showTitleOnHover, className }: TimestampProps): import("react/jsx-runtime").JSX.Element;
46
+ //# sourceMappingURL=Timestamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timestamp.d.ts","sourceRoot":"","sources":["../../../src/data/cells/Timestamp.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE;;;OAGG;IACH,YAAY,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAkB1D;AAYD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,GAAG,IAAI,CAoBnF;AAKD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CA8BrE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,eAAe,EACvB,GAAG,GAAE,IAAiB,GACrB,MAAM,CAqBR;AA4BD,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,GAAG,eAAe,CAY9F;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAuB,EAAE,SAAS,EAAE,EAAE,cAAc,2CAe9F"}
@@ -0,0 +1,146 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ function parseTimestamp(value) {
4
+ if (value == null) return null;
5
+ if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;
6
+ if (typeof value === "number") {
7
+ const ms = value < 1e12 ? value * 1e3 : value;
8
+ const d = new Date(ms);
9
+ return Number.isNaN(d.getTime()) ? null : d;
10
+ }
11
+ if (typeof value === "string") {
12
+ const trimmed = value.trim();
13
+ if (!trimmed) return null;
14
+ const d = new Date(trimmed);
15
+ return Number.isNaN(d.getTime()) ? null : d;
16
+ }
17
+ return null;
18
+ }
19
+ const UNIT_MS = {
20
+ s: 1e3,
21
+ m: 6e4,
22
+ h: 36e5,
23
+ d: 864e5,
24
+ w: 6048e5
25
+ };
26
+ const RELATIVE_PATTERN = /^now\s*([+-])\s*(\d+)\s*([smhdw])$/i;
27
+ function resolveDateMath(value, now = /* @__PURE__ */ new Date()) {
28
+ if (value == null) return null;
29
+ if (typeof value === "string") {
30
+ const trimmed = value.trim();
31
+ if (!trimmed) return null;
32
+ if (trimmed.toLowerCase() === "now") return new Date(now.getTime());
33
+ const match = trimmed.match(RELATIVE_PATTERN);
34
+ if (match) {
35
+ const [, sign, amount, unit] = match;
36
+ const unitMs = UNIT_MS[unit.toLowerCase()];
37
+ if (!unitMs) return null;
38
+ const delta = Number(amount) * unitMs * (sign === "-" ? -1 : 1);
39
+ return new Date(now.getTime() + delta);
40
+ }
41
+ }
42
+ return parseTimestamp(value);
43
+ }
44
+ const MS_PER_MINUTE = 6e4;
45
+ const MS_PER_DAY = 864e5;
46
+ function chooseTimestampFormat(values) {
47
+ if (values.length === 0) return "iso";
48
+ let min = Infinity;
49
+ let max = -Infinity;
50
+ for (const d of values) {
51
+ const t = d.getTime();
52
+ if (t < min) min = t;
53
+ if (t > max) max = t;
54
+ }
55
+ const span = max - min;
56
+ if (span <= MS_PER_MINUTE) return "relative";
57
+ const minDate = new Date(min);
58
+ const maxDate = new Date(max);
59
+ if (minDate.getFullYear() === maxDate.getFullYear() && minDate.getMonth() === maxDate.getMonth() && minDate.getDate() === maxDate.getDate()) {
60
+ return "time";
61
+ }
62
+ if (minDate.getFullYear() === maxDate.getFullYear() && span <= MS_PER_DAY * 365) {
63
+ return "short";
64
+ }
65
+ return "iso";
66
+ }
67
+ function formatTimestamp(date, format, now = /* @__PURE__ */ new Date()) {
68
+ switch (format) {
69
+ case "relative":
70
+ return formatRelative(date, now);
71
+ case "time":
72
+ return date.toLocaleTimeString(void 0, {
73
+ hour: "2-digit",
74
+ minute: "2-digit",
75
+ second: "2-digit"
76
+ });
77
+ case "short":
78
+ return date.toLocaleString(void 0, {
79
+ month: "short",
80
+ day: "numeric",
81
+ hour: "2-digit",
82
+ minute: "2-digit"
83
+ });
84
+ case "iso":
85
+ default:
86
+ return formatIso(date);
87
+ }
88
+ }
89
+ function formatIso(date) {
90
+ const yyyy = date.getFullYear();
91
+ const mm = String(date.getMonth() + 1).padStart(2, "0");
92
+ const dd = String(date.getDate()).padStart(2, "0");
93
+ const hh = String(date.getHours()).padStart(2, "0");
94
+ const min = String(date.getMinutes()).padStart(2, "0");
95
+ return `${yyyy}-${mm}-${dd} ${hh}:${min}`;
96
+ }
97
+ function formatRelative(date, now) {
98
+ const diffMs = now.getTime() - date.getTime();
99
+ const future = diffMs < 0;
100
+ const abs = Math.abs(diffMs);
101
+ const sec = Math.round(abs / 1e3);
102
+ let value;
103
+ if (sec < 1) value = "just now";
104
+ else if (sec < 60) value = `${sec}s`;
105
+ else if (sec < 3600) value = `${Math.round(sec / 60)}m`;
106
+ else if (sec < 86400) value = `${Math.round(sec / 3600)}h`;
107
+ else value = `${Math.round(sec / 86400)}d`;
108
+ if (value === "just now") return value;
109
+ return future ? `in ${value}` : `${value} ago`;
110
+ }
111
+ function modeToFormat(mode, dataFormat) {
112
+ switch (mode) {
113
+ case "absolute":
114
+ return "iso";
115
+ case "relative":
116
+ return "relative";
117
+ case "time":
118
+ return "time";
119
+ case "auto":
120
+ default:
121
+ return dataFormat;
122
+ }
123
+ }
124
+ function Timestamp({ value, format, showTitleOnHover = true, className }) {
125
+ const parsed = parseTimestamp(value);
126
+ if (!parsed) return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground", className), children: "—" });
127
+ const display = formatTimestamp(parsed, format);
128
+ const title = showTitleOnHover ? parsed.toISOString() : void 0;
129
+ return /* @__PURE__ */ jsx(
130
+ "span",
131
+ {
132
+ className: cn("tabular-nums whitespace-nowrap text-muted-foreground", className),
133
+ title,
134
+ children: display
135
+ }
136
+ );
137
+ }
138
+ export {
139
+ Timestamp,
140
+ chooseTimestampFormat,
141
+ formatTimestamp,
142
+ modeToFormat,
143
+ parseTimestamp,
144
+ resolveDateMath
145
+ };
146
+ //# sourceMappingURL=Timestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timestamp.js","sources":["../../../src/data/cells/Timestamp.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\n\nexport type TimestampMode = \"auto\" | \"absolute\" | \"relative\" | \"time\";\n\nexport type TimestampFormat = \"relative\" | \"time\" | \"short\" | \"iso\";\n\nexport type TimestampOptions = {\n mode?: TimestampMode;\n alwaysShowFullOnHover?: boolean;\n /**\n * When the column is on a DataTable with `autoFilter`, DataTable mounts a\n * \"Time range\" picker (matching the trace UI) and filters rows whose\n * timestamp falls outside the selected range. Set `false` to suppress.\n */\n autoRangeFilter?: boolean;\n /** Override the trace-style preset list (\"Last 15 minutes\", etc.). */\n rangePresets?: Array<{ label: string; from: string; to: string }>;\n /**\n * Default range applied on first render. Either side may use date-math\n * (`now-24h`, `now`) or any value parseable by `parseTimestamp`.\n */\n defaultRange?: { from?: string; to?: string };\n};\n\nexport function parseTimestamp(value: unknown): Date | null {\n if (value == null) return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n\n if (typeof value === \"number\") {\n const ms = value < 1e12 ? value * 1000 : value;\n const d = new Date(ms);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return null;\n const d = new Date(trimmed);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n return null;\n}\n\nconst UNIT_MS: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n};\n\nconst RELATIVE_PATTERN = /^now\\s*([+-])\\s*(\\d+)\\s*([smhdw])$/i;\n\n/**\n * Resolves date-math strings to an absolute Date. Recognised forms:\n * - \"now\"\n * - \"now-15m\", \"now-1h\", \"now+30s\", \"now-7d\", \"now-2w\" (units: s/m/h/d/w)\n * - any value parseable by `parseTimestamp` (ISO, epoch ms/s, Date)\n * Returns null for unparseable input.\n */\nexport function resolveDateMath(value: unknown, now: Date = new Date()): Date | null {\n if (value == null) return null;\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n if (trimmed.toLowerCase() === \"now\") return new Date(now.getTime());\n\n const match = trimmed.match(RELATIVE_PATTERN);\n if (match) {\n const [, sign, amount, unit] = match;\n const unitMs = UNIT_MS[unit!.toLowerCase()];\n if (!unitMs) return null;\n const delta = Number(amount) * unitMs * (sign === \"-\" ? -1 : 1);\n return new Date(now.getTime() + delta);\n }\n }\n\n return parseTimestamp(value);\n}\n\nconst MS_PER_MINUTE = 60_000;\nconst MS_PER_DAY = 86_400_000;\n\nexport function chooseTimestampFormat(values: Date[]): TimestampFormat {\n if (values.length === 0) return \"iso\";\n\n let min = Infinity;\n let max = -Infinity;\n for (const d of values) {\n const t = d.getTime();\n if (t < min) min = t;\n if (t > max) max = t;\n }\n const span = max - min;\n\n if (span <= MS_PER_MINUTE) return \"relative\";\n\n const minDate = new Date(min);\n const maxDate = new Date(max);\n\n if (\n minDate.getFullYear() === maxDate.getFullYear() &&\n minDate.getMonth() === maxDate.getMonth() &&\n minDate.getDate() === maxDate.getDate()\n ) {\n return \"time\";\n }\n\n if (minDate.getFullYear() === maxDate.getFullYear() && span <= MS_PER_DAY * 365) {\n return \"short\";\n }\n\n return \"iso\";\n}\n\nexport function formatTimestamp(\n date: Date,\n format: TimestampFormat,\n now: Date = new Date(),\n): string {\n switch (format) {\n case \"relative\":\n return formatRelative(date, now);\n case \"time\":\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n case \"short\":\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n case \"iso\":\n default:\n return formatIso(date);\n }\n}\n\nfunction formatIso(date: Date): string {\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n}\n\nfunction formatRelative(date: Date, now: Date): string {\n const diffMs = now.getTime() - date.getTime();\n const future = diffMs < 0;\n const abs = Math.abs(diffMs);\n const sec = Math.round(abs / 1000);\n\n let value: string;\n if (sec < 1) value = \"just now\";\n else if (sec < 60) value = `${sec}s`;\n else if (sec < 3600) value = `${Math.round(sec / 60)}m`;\n else if (sec < 86400) value = `${Math.round(sec / 3600)}h`;\n else value = `${Math.round(sec / 86400)}d`;\n\n if (value === \"just now\") return value;\n return future ? `in ${value}` : `${value} ago`;\n}\n\nexport function modeToFormat(mode: TimestampMode, dataFormat: TimestampFormat): TimestampFormat {\n switch (mode) {\n case \"absolute\":\n return \"iso\";\n case \"relative\":\n return \"relative\";\n case \"time\":\n return \"time\";\n case \"auto\":\n default:\n return dataFormat;\n }\n}\n\nexport type TimestampProps = {\n value: unknown;\n format: TimestampFormat;\n showTitleOnHover?: boolean;\n className?: string;\n};\n\nexport function Timestamp({ value, format, showTitleOnHover = true, className }: TimestampProps) {\n const parsed = parseTimestamp(value);\n if (!parsed) return <span className={cn(\"text-muted-foreground\", className)}>—</span>;\n\n const display = formatTimestamp(parsed, format);\n const title = showTitleOnHover ? parsed.toISOString() : undefined;\n\n return (\n <span\n className={cn(\"tabular-nums whitespace-nowrap text-muted-foreground\", className)}\n title={title}\n >\n {display}\n </span>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BadgeStatus } from '../Badge';
2
+ export declare function normalizeStatus(raw: unknown): BadgeStatus | null;
3
+ export declare const STATUS_TOKEN_GROUPS: {
4
+ readonly error: Set<string>;
5
+ readonly warning: Set<string>;
6
+ readonly success: Set<string>;
7
+ };
8
+ //# sourceMappingURL=status-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-mapping.d.ts","sourceRoot":"","sources":["../../../src/data/cells/status-mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA6B5C,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAahE;AAED,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC"}
@@ -0,0 +1,44 @@
1
+ const ERROR_TOKENS = /* @__PURE__ */ new Set([
2
+ "error",
3
+ "err",
4
+ "fatal",
5
+ "critical",
6
+ "crit",
7
+ "panic",
8
+ "failed",
9
+ "fail",
10
+ "down",
11
+ "unhealthy"
12
+ ]);
13
+ const WARN_TOKENS = /* @__PURE__ */ new Set(["warn", "warning", "degraded", "slow", "stale"]);
14
+ const OK_TOKENS = /* @__PURE__ */ new Set([
15
+ "ok",
16
+ "healthy",
17
+ "success",
18
+ "info",
19
+ "debug",
20
+ "trace",
21
+ "up",
22
+ "running",
23
+ "ready"
24
+ ]);
25
+ function normalizeStatus(raw) {
26
+ if (raw == null) return null;
27
+ if (typeof raw === "boolean") return raw ? "success" : "error";
28
+ const token = String(raw).toLowerCase().trim();
29
+ if (!token) return null;
30
+ if (ERROR_TOKENS.has(token)) return "error";
31
+ if (WARN_TOKENS.has(token)) return "warning";
32
+ if (OK_TOKENS.has(token)) return "success";
33
+ return null;
34
+ }
35
+ const STATUS_TOKEN_GROUPS = {
36
+ error: ERROR_TOKENS,
37
+ warning: WARN_TOKENS,
38
+ success: OK_TOKENS
39
+ };
40
+ export {
41
+ STATUS_TOKEN_GROUPS,
42
+ normalizeStatus
43
+ };
44
+ //# sourceMappingURL=status-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-mapping.js","sources":["../../../src/data/cells/status-mapping.ts"],"sourcesContent":["import type { BadgeStatus } from \"../Badge\";\n\nconst ERROR_TOKENS = new Set([\n \"error\",\n \"err\",\n \"fatal\",\n \"critical\",\n \"crit\",\n \"panic\",\n \"failed\",\n \"fail\",\n \"down\",\n \"unhealthy\",\n]);\n\nconst WARN_TOKENS = new Set([\"warn\", \"warning\", \"degraded\", \"slow\", \"stale\"]);\n\nconst OK_TOKENS = new Set([\n \"ok\",\n \"healthy\",\n \"success\",\n \"info\",\n \"debug\",\n \"trace\",\n \"up\",\n \"running\",\n \"ready\",\n]);\n\nexport function normalizeStatus(raw: unknown): BadgeStatus | null {\n if (raw == null) return null;\n\n if (typeof raw === \"boolean\") return raw ? \"success\" : \"error\";\n\n const token = String(raw).toLowerCase().trim();\n if (!token) return null;\n\n if (ERROR_TOKENS.has(token)) return \"error\";\n if (WARN_TOKENS.has(token)) return \"warning\";\n if (OK_TOKENS.has(token)) return \"success\";\n\n return null;\n}\n\nexport const STATUS_TOKEN_GROUPS = {\n error: ERROR_TOKENS,\n warning: WARN_TOKENS,\n success: OK_TOKENS,\n} as const;\n"],"names":[],"mappings":"AAEA,MAAM,mCAAmB,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,kCAAkB,IAAI,CAAC,QAAQ,WAAW,YAAY,QAAQ,OAAO,CAAC;AAE5E,MAAM,gCAAgB,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,gBAAgB,KAAkC;AAChE,MAAI,OAAO,KAAM,QAAO;AAExB,MAAI,OAAO,QAAQ,UAAW,QAAO,MAAM,YAAY;AAEvD,QAAM,QAAQ,OAAO,GAAG,EAAE,YAAA,EAAc,KAAA;AACxC,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,aAAa,IAAI,KAAK,EAAG,QAAO;AACpC,MAAI,YAAY,IAAI,KAAK,EAAG,QAAO;AACnC,MAAI,UAAU,IAAI,KAAK,EAAG,QAAO;AAEjC,SAAO;AACT;AAEO,MAAM,sBAAsB;AAAA,EACjC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AACX;"}
@@ -0,0 +1,12 @@
1
+ type ShikiModule = typeof import("shiki");
2
+ type ShikiTransformersModule = typeof import("@shikijs/transformers");
3
+ type ShikiTransformer = NonNullable<Parameters<ShikiModule["codeToHtml"]>[1]["transformers"]>[number];
4
+ export declare function loadShikiTransformers(): Promise<ShikiTransformersModule>;
5
+ export type HighlightOptions = {
6
+ lang: string;
7
+ theme?: string;
8
+ transformers?: ShikiTransformer[];
9
+ };
10
+ export declare function highlightCode(source: string, opts: HighlightOptions): Promise<string | null>;
11
+ export {};
12
+ //# sourceMappingURL=code-highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-highlight.d.ts","sourceRoot":"","sources":["../../src/data/code-highlight.ts"],"names":[],"mappings":"AAMA,KAAK,WAAW,GAAG,cAAc,OAAO,CAAC,CAAC;AAC1C,KAAK,uBAAuB,GAAG,cAAc,uBAAuB,CAAC,CAAC;AACtE,KAAK,gBAAgB,GAAG,WAAW,CACjC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CACzD,CAAC,MAAM,CAAC,CAAC;AAUV,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAGxE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
@@ -0,0 +1,28 @@
1
+ let shikiLoad = null;
2
+ let transformersLoad = null;
3
+ function loadShiki() {
4
+ shikiLoad ?? (shikiLoad = import("shiki"));
5
+ return shikiLoad;
6
+ }
7
+ function loadShikiTransformers() {
8
+ transformersLoad ?? (transformersLoad = import("@shikijs/transformers"));
9
+ return transformersLoad;
10
+ }
11
+ async function highlightCode(source, opts) {
12
+ if (!source || !opts.lang) return null;
13
+ try {
14
+ const { codeToHtml } = await loadShiki();
15
+ return await codeToHtml(source, {
16
+ lang: opts.lang,
17
+ theme: opts.theme ?? "github-light",
18
+ ...opts.transformers ? { transformers: opts.transformers } : {}
19
+ });
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ export {
25
+ highlightCode,
26
+ loadShikiTransformers
27
+ };
28
+ //# sourceMappingURL=code-highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-highlight.js","sources":["../../src/data/code-highlight.ts"],"sourcesContent":["// Lazy-loaded wrapper around Shiki's `codeToHtml` shorthand\n// (https://shiki.style/guide/shorthands). The shorthand handles per-language\n// and per-theme grammar loading and in-memory caching itself, so this module\n// only owns the singleton imports of `shiki` and `@shikijs/transformers` so\n// we don't pay them more than once.\n\ntype ShikiModule = typeof import(\"shiki\");\ntype ShikiTransformersModule = typeof import(\"@shikijs/transformers\");\ntype ShikiTransformer = NonNullable<\n Parameters<ShikiModule[\"codeToHtml\"]>[1][\"transformers\"]\n>[number];\n\nlet shikiLoad: Promise<ShikiModule> | null = null;\nlet transformersLoad: Promise<ShikiTransformersModule> | null = null;\n\nfunction loadShiki(): Promise<ShikiModule> {\n shikiLoad ??= import(\"shiki\");\n return shikiLoad;\n}\n\nexport function loadShikiTransformers(): Promise<ShikiTransformersModule> {\n transformersLoad ??= import(\"@shikijs/transformers\");\n return transformersLoad;\n}\n\nexport type HighlightOptions = {\n lang: string;\n theme?: string;\n transformers?: ShikiTransformer[];\n};\n\nexport async function highlightCode(\n source: string,\n opts: HighlightOptions,\n): Promise<string | null> {\n if (!source || !opts.lang) return null;\n try {\n const { codeToHtml } = await loadShiki();\n return await codeToHtml(source, {\n lang: opts.lang,\n theme: opts.theme ?? \"github-light\",\n ...(opts.transformers ? { transformers: opts.transformers } : {}),\n });\n } catch {\n return null;\n }\n}\n"],"names":[],"mappings":"AAYA,IAAI,YAAyC;AAC7C,IAAI,mBAA4D;AAEhE,SAAS,YAAkC;AACzC,4BAAc,OAAO,OAAO;AAC5B,SAAO;AACT;AAEO,SAAS,wBAA0D;AACxE,0CAAqB,OAAO,uBAAuB;AACnD,SAAO;AACT;AAQA,eAAsB,cACpB,QACA,MACwB;AACxB,MAAI,CAAC,UAAU,CAAC,KAAK,KAAM,QAAO;AAClC,MAAI;AACF,UAAM,EAAE,eAAe,MAAM,UAAA;AAC7B,WAAO,MAAM,WAAW,QAAQ;AAAA,MAC9B,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,SAAS;AAAA,MACrB,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,aAAA,IAAiB,CAAA;AAAA,IAAC,CAChE;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
@@ -0,0 +1,9 @@
1
+ import { ProcessNode, RunMeta } from './types';
2
+ export type DiagnosticsDetailPanelProps = {
3
+ process: ProcessNode | null;
4
+ collectBusy?: boolean;
5
+ onCollectStack?: (pid: number) => void | Promise<void>;
6
+ runMeta?: RunMeta;
7
+ };
8
+ export declare function DiagnosticsDetailPanel({ process, collectBusy, onCollectStack, runMeta, }: DiagnosticsDetailPanelProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=DiagnosticsDetailPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsDetailPanel.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAyBpD,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,WAAW,EACX,cAAc,EACd,OAAO,GACR,EAAE,2BAA2B,2CAyE7B"}