@flanksource/clicky-ui 0.3.1 → 0.3.3

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 (382) 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/FilterBar.cjs +13 -3
  100. package/dist/components/FilterBar.cjs.map +1 -1
  101. package/dist/components/FilterBar.js +13 -3
  102. package/dist/components/FilterBar.js.map +1 -1
  103. package/dist/components/JsonSchemaForm.cjs +20 -6
  104. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  105. package/dist/components/JsonSchemaForm.d.ts +1 -1
  106. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  107. package/dist/components/JsonSchemaForm.js +22 -8
  108. package/dist/components/JsonSchemaForm.js.map +1 -1
  109. package/dist/components/NamespacePicker.cjs +52 -0
  110. package/dist/components/NamespacePicker.cjs.map +1 -0
  111. package/dist/components/NamespacePicker.d.ts +17 -0
  112. package/dist/components/NamespacePicker.d.ts.map +1 -0
  113. package/dist/components/NamespacePicker.js +52 -0
  114. package/dist/components/NamespacePicker.js.map +1 -0
  115. package/dist/components/form-lookup-context.cjs +36 -0
  116. package/dist/components/form-lookup-context.cjs.map +1 -0
  117. package/dist/components/form-lookup-context.d.ts +9 -0
  118. package/dist/components/form-lookup-context.d.ts.map +1 -0
  119. package/dist/components/form-lookup-context.js +36 -0
  120. package/dist/components/form-lookup-context.js.map +1 -0
  121. package/dist/components/json-schema-form-discriminator.cjs +67 -0
  122. package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
  123. package/dist/components/json-schema-form-discriminator.d.ts +10 -0
  124. package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
  125. package/dist/components/json-schema-form-discriminator.js +67 -0
  126. package/dist/components/json-schema-form-discriminator.js.map +1 -0
  127. package/dist/components/json-schema-form-fields.cjs +66 -1
  128. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  129. package/dist/components/json-schema-form-fields.d.ts +7 -0
  130. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  131. package/dist/components/json-schema-form-fields.js +66 -1
  132. package/dist/components/json-schema-form-fields.js.map +1 -1
  133. package/dist/components/json-schema-form-grid.cjs +92 -0
  134. package/dist/components/json-schema-form-grid.cjs.map +1 -0
  135. package/dist/components/json-schema-form-grid.d.ts +9 -0
  136. package/dist/components/json-schema-form-grid.d.ts.map +1 -0
  137. package/dist/components/json-schema-form-grid.js +92 -0
  138. package/dist/components/json-schema-form-grid.js.map +1 -0
  139. package/dist/components/json-schema-form-render.cjs +20 -3
  140. package/dist/components/json-schema-form-render.cjs.map +1 -1
  141. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  142. package/dist/components/json-schema-form-render.js +22 -5
  143. package/dist/components/json-schema-form-render.js.map +1 -1
  144. package/dist/components/json-schema-form-resolve.cjs +24 -2
  145. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  146. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  147. package/dist/components/json-schema-form-resolve.js +24 -2
  148. package/dist/components/json-schema-form-resolve.js.map +1 -1
  149. package/dist/components/json-schema-form-types.d.ts +37 -2
  150. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  151. package/dist/components/json-schema-form-utils.cjs +8 -0
  152. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  153. package/dist/components/json-schema-form-utils.d.ts +1 -0
  154. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  155. package/dist/components/json-schema-form-utils.js +8 -0
  156. package/dist/components/json-schema-form-utils.js.map +1 -1
  157. package/dist/components/workload-picker-utils.cjs.map +1 -1
  158. package/dist/components/workload-picker-utils.d.ts +11 -1
  159. package/dist/components/workload-picker-utils.d.ts.map +1 -1
  160. package/dist/components/workload-picker-utils.js.map +1 -1
  161. package/dist/components.cjs +6 -0
  162. package/dist/components.cjs.map +1 -1
  163. package/dist/components.d.ts +4 -2
  164. package/dist/components.d.ts.map +1 -1
  165. package/dist/components.js +6 -0
  166. package/dist/components.js.map +1 -1
  167. package/dist/data/Clicky.cjs +225 -60
  168. package/dist/data/Clicky.cjs.map +1 -1
  169. package/dist/data/Clicky.d.ts +7 -1
  170. package/dist/data/Clicky.d.ts.map +1 -1
  171. package/dist/data/Clicky.fixtures.d.ts +3 -1
  172. package/dist/data/Clicky.fixtures.d.ts.map +1 -1
  173. package/dist/data/Clicky.js +226 -61
  174. package/dist/data/Clicky.js.map +1 -1
  175. package/dist/data/ExecutionTree.cjs +68 -0
  176. package/dist/data/ExecutionTree.cjs.map +1 -0
  177. package/dist/data/ExecutionTree.d.ts +40 -0
  178. package/dist/data/ExecutionTree.d.ts.map +1 -0
  179. package/dist/data/ExecutionTree.js +68 -0
  180. package/dist/data/ExecutionTree.js.map +1 -0
  181. package/dist/data/GaugeHoverCard.cjs +35 -0
  182. package/dist/data/GaugeHoverCard.cjs.map +1 -0
  183. package/dist/data/GaugeHoverCard.d.ts +25 -0
  184. package/dist/data/GaugeHoverCard.d.ts.map +1 -0
  185. package/dist/data/GaugeHoverCard.js +35 -0
  186. package/dist/data/GaugeHoverCard.js.map +1 -0
  187. package/dist/data/MarkdownEditor.cjs +616 -0
  188. package/dist/data/MarkdownEditor.cjs.map +1 -0
  189. package/dist/data/MarkdownEditor.d.ts +61 -0
  190. package/dist/data/MarkdownEditor.d.ts.map +1 -0
  191. package/dist/data/MarkdownEditor.js +616 -0
  192. package/dist/data/MarkdownEditor.js.map +1 -0
  193. package/dist/data/MarkdownEditor.model.cjs +27 -0
  194. package/dist/data/MarkdownEditor.model.cjs.map +1 -0
  195. package/dist/data/MarkdownEditor.model.d.ts +38 -0
  196. package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
  197. package/dist/data/MarkdownEditor.model.js +27 -0
  198. package/dist/data/MarkdownEditor.model.js.map +1 -0
  199. package/dist/data/ObjectGraph.cjs +44 -0
  200. package/dist/data/ObjectGraph.cjs.map +1 -0
  201. package/dist/data/ObjectGraph.d.ts +39 -0
  202. package/dist/data/ObjectGraph.d.ts.map +1 -0
  203. package/dist/data/ObjectGraph.js +44 -0
  204. package/dist/data/ObjectGraph.js.map +1 -0
  205. package/dist/data/SchemaViewer.cjs +152 -0
  206. package/dist/data/SchemaViewer.cjs.map +1 -0
  207. package/dist/data/SchemaViewer.d.ts +27 -0
  208. package/dist/data/SchemaViewer.d.ts.map +1 -0
  209. package/dist/data/SchemaViewer.js +152 -0
  210. package/dist/data/SchemaViewer.js.map +1 -0
  211. package/dist/data/TimeseriesCoreBars.cjs +51 -12
  212. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  213. package/dist/data/TimeseriesCoreBars.d.ts +32 -5
  214. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  215. package/dist/data/TimeseriesCoreBars.js +51 -12
  216. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  217. package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
  218. package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
  219. package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
  220. package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
  221. package/dist/data/TimeseriesCoreBars.model.js +5 -5
  222. package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
  223. package/dist/data/TimeseriesGauge.cjs +103 -65
  224. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  225. package/dist/data/TimeseriesGauge.d.ts +10 -1
  226. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  227. package/dist/data/TimeseriesGauge.js +104 -66
  228. package/dist/data/TimeseriesGauge.js.map +1 -1
  229. package/dist/data/WorkloadCard.cjs +4 -4
  230. package/dist/data/WorkloadCard.cjs.map +1 -1
  231. package/dist/data/WorkloadCard.d.ts +3 -2
  232. package/dist/data/WorkloadCard.d.ts.map +1 -1
  233. package/dist/data/WorkloadCard.js +4 -4
  234. package/dist/data/WorkloadCard.js.map +1 -1
  235. package/dist/data/ai/ChatWindow.cjs +11 -19
  236. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  237. package/dist/data/ai/ChatWindow.d.ts +1 -7
  238. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  239. package/dist/data/ai/ChatWindow.js +11 -19
  240. package/dist/data/ai/ChatWindow.js.map +1 -1
  241. package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
  242. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
  243. package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
  244. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
  245. package/dist/data/ai/ChatWindowRequestBody.js +20 -0
  246. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
  247. package/dist/data/chat/Chat.cjs +12 -0
  248. package/dist/data/chat/Chat.cjs.map +1 -1
  249. package/dist/data/chat/Chat.d.ts +8 -1
  250. package/dist/data/chat/Chat.d.ts.map +1 -1
  251. package/dist/data/chat/Chat.js +12 -0
  252. package/dist/data/chat/Chat.js.map +1 -1
  253. package/dist/data/gauge-stats.cjs +19 -0
  254. package/dist/data/gauge-stats.cjs.map +1 -0
  255. package/dist/data/gauge-stats.d.ts +15 -0
  256. package/dist/data/gauge-stats.d.ts.map +1 -0
  257. package/dist/data/gauge-stats.js +19 -0
  258. package/dist/data/gauge-stats.js.map +1 -0
  259. package/dist/data/schema-viewer-model.cjs +436 -0
  260. package/dist/data/schema-viewer-model.cjs.map +1 -0
  261. package/dist/data/schema-viewer-model.d.ts +64 -0
  262. package/dist/data/schema-viewer-model.d.ts.map +1 -0
  263. package/dist/data/schema-viewer-model.js +436 -0
  264. package/dist/data/schema-viewer-model.js.map +1 -0
  265. package/dist/data/version-info.cjs +2 -2
  266. package/dist/data/version-info.js +2 -2
  267. package/dist/data.cjs +23 -0
  268. package/dist/data.cjs.map +1 -1
  269. package/dist/data.d.ts +11 -3
  270. package/dist/data.d.ts.map +1 -1
  271. package/dist/data.js +23 -0
  272. package/dist/data.js.map +1 -1
  273. package/dist/index.cjs +87 -2
  274. package/dist/index.cjs.map +1 -1
  275. package/dist/index.d.ts +1 -0
  276. package/dist/index.d.ts.map +1 -1
  277. package/dist/index.js +87 -2
  278. package/dist/index.js.map +1 -1
  279. package/dist/rpc/EntityExplorerApp.cjs +102 -143
  280. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  281. package/dist/rpc/EntityExplorerApp.d.ts +34 -1
  282. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  283. package/dist/rpc/EntityExplorerApp.js +105 -146
  284. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  285. package/dist/rpc/OperationActionBar.cjs +135 -0
  286. package/dist/rpc/OperationActionBar.cjs.map +1 -0
  287. package/dist/rpc/OperationActionBar.d.ts +20 -0
  288. package/dist/rpc/OperationActionBar.d.ts.map +1 -0
  289. package/dist/rpc/OperationActionBar.js +135 -0
  290. package/dist/rpc/OperationActionBar.js.map +1 -0
  291. package/dist/rpc/OperationCatalog.cjs +79 -116
  292. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  293. package/dist/rpc/OperationCatalog.d.ts +8 -1
  294. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  295. package/dist/rpc/OperationCatalog.js +80 -117
  296. package/dist/rpc/OperationCatalog.js.map +1 -1
  297. package/dist/rpc/OperationCommandPage.cjs +134 -223
  298. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  299. package/dist/rpc/OperationCommandPage.d.ts +1 -1
  300. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  301. package/dist/rpc/OperationCommandPage.js +135 -224
  302. package/dist/rpc/OperationCommandPage.js.map +1 -1
  303. package/dist/rpc/OperationEntityPage.cjs +49 -100
  304. package/dist/rpc/OperationEntityPage.cjs.map +1 -1
  305. package/dist/rpc/OperationEntityPage.d.ts +6 -1
  306. package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
  307. package/dist/rpc/OperationEntityPage.js +50 -101
  308. package/dist/rpc/OperationEntityPage.js.map +1 -1
  309. package/dist/rpc/OperationResultView.cjs +43 -0
  310. package/dist/rpc/OperationResultView.cjs.map +1 -0
  311. package/dist/rpc/OperationResultView.d.ts +30 -0
  312. package/dist/rpc/OperationResultView.d.ts.map +1 -0
  313. package/dist/rpc/OperationResultView.js +43 -0
  314. package/dist/rpc/OperationResultView.js.map +1 -0
  315. package/dist/rpc/SchemaActionForm.cjs +102 -0
  316. package/dist/rpc/SchemaActionForm.cjs.map +1 -0
  317. package/dist/rpc/SchemaActionForm.d.ts +23 -0
  318. package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
  319. package/dist/rpc/SchemaActionForm.js +102 -0
  320. package/dist/rpc/SchemaActionForm.js.map +1 -0
  321. package/dist/rpc/accept-options.cjs.map +1 -1
  322. package/dist/rpc/accept-options.d.ts +0 -1
  323. package/dist/rpc/accept-options.d.ts.map +1 -1
  324. package/dist/rpc/accept-options.js.map +1 -1
  325. package/dist/rpc/apiClient.cjs +34 -2
  326. package/dist/rpc/apiClient.cjs.map +1 -1
  327. package/dist/rpc/apiClient.d.ts +4 -1
  328. package/dist/rpc/apiClient.d.ts.map +1 -1
  329. package/dist/rpc/apiClient.js +34 -2
  330. package/dist/rpc/apiClient.js.map +1 -1
  331. package/dist/rpc/clickyMetadata.cjs +4 -4
  332. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  333. package/dist/rpc/clickyMetadata.d.ts +0 -1
  334. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  335. package/dist/rpc/clickyMetadata.js +4 -4
  336. package/dist/rpc/clickyMetadata.js.map +1 -1
  337. package/dist/rpc/formMetadata.cjs +1 -0
  338. package/dist/rpc/formMetadata.cjs.map +1 -1
  339. package/dist/rpc/formMetadata.d.ts +6 -1
  340. package/dist/rpc/formMetadata.d.ts.map +1 -1
  341. package/dist/rpc/formMetadata.js +1 -0
  342. package/dist/rpc/formMetadata.js.map +1 -1
  343. package/dist/rpc/rowNavigation.cjs +86 -0
  344. package/dist/rpc/rowNavigation.cjs.map +1 -0
  345. package/dist/rpc/rowNavigation.d.ts +14 -0
  346. package/dist/rpc/rowNavigation.d.ts.map +1 -0
  347. package/dist/rpc/rowNavigation.js +86 -0
  348. package/dist/rpc/rowNavigation.js.map +1 -0
  349. package/dist/rpc/schemaActionPath.cjs +22 -0
  350. package/dist/rpc/schemaActionPath.cjs.map +1 -0
  351. package/dist/rpc/schemaActionPath.d.ts +4 -0
  352. package/dist/rpc/schemaActionPath.d.ts.map +1 -0
  353. package/dist/rpc/schemaActionPath.js +22 -0
  354. package/dist/rpc/schemaActionPath.js.map +1 -0
  355. package/dist/rpc/surfaceIconMap.cjs +35 -0
  356. package/dist/rpc/surfaceIconMap.cjs.map +1 -0
  357. package/dist/rpc/surfaceIconMap.d.ts +3 -0
  358. package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
  359. package/dist/rpc/surfaceIconMap.js +35 -0
  360. package/dist/rpc/surfaceIconMap.js.map +1 -0
  361. package/dist/rpc/types.cjs.map +1 -1
  362. package/dist/rpc/types.d.ts +2 -0
  363. package/dist/rpc/types.d.ts.map +1 -1
  364. package/dist/rpc/types.js.map +1 -1
  365. package/dist/rpc/useOperations.cjs.map +1 -1
  366. package/dist/rpc/useOperations.d.ts +4 -1
  367. package/dist/rpc/useOperations.d.ts.map +1 -1
  368. package/dist/rpc/useOperations.js.map +1 -1
  369. package/dist/rpc.cjs +4 -2
  370. package/dist/rpc.cjs.map +1 -1
  371. package/dist/rpc.d.ts +7 -6
  372. package/dist/rpc.d.ts.map +1 -1
  373. package/dist/rpc.js +4 -2
  374. package/dist/rpc.js.map +1 -1
  375. package/dist/styles.css +1 -1
  376. package/package.json +6 -1
  377. package/dist/rpc/AcceptPicker.cjs +0 -137
  378. package/dist/rpc/AcceptPicker.cjs.map +0 -1
  379. package/dist/rpc/AcceptPicker.d.ts +0 -12
  380. package/dist/rpc/AcceptPicker.d.ts.map +0 -1
  381. package/dist/rpc/AcceptPicker.js +0 -137
  382. package/dist/rpc/AcceptPicker.js.map +0 -1
@@ -0,0 +1,156 @@
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
+ function safeHref(href) {
7
+ const trimmed = href.trim();
8
+ if (!trimmed) return null;
9
+ if (/^(https?:|mailto:)/i.test(trimmed)) return trimmed;
10
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) return trimmed;
11
+ return null;
12
+ }
13
+ const INLINE_PATTERN = /(\*\*[^*\n]+\*\*|`[^`\n]+`|\[[^\]\n]+\]\(([^)\s]+)\)|https?:\/\/[^\s<)]+|\*[^*\n]+\*)/g;
14
+ function tokenizeInline(text) {
15
+ const tokens = [];
16
+ let last = 0;
17
+ for (const match of text.matchAll(INLINE_PATTERN)) {
18
+ const index = match.index ?? 0;
19
+ if (index > last)
20
+ tokens.push({ type: "text", text: text.slice(last, index) });
21
+ const value = match[0];
22
+ if (value.startsWith("**") && value.endsWith("**")) {
23
+ tokens.push({ type: "strong", text: value.slice(2, -2) });
24
+ } else if (value.startsWith("`") && value.endsWith("`")) {
25
+ tokens.push({ type: "code", text: value.slice(1, -1) });
26
+ } else if (value.startsWith("[")) {
27
+ const labelEnd = value.indexOf("](");
28
+ const href = safeHref(value.slice(labelEnd + 2, -1));
29
+ tokens.push(
30
+ href ? { type: "link", text: value.slice(1, labelEnd), href } : { type: "text", text: value }
31
+ );
32
+ } else if (/^https?:\/\//i.test(value)) {
33
+ const href = safeHref(value);
34
+ tokens.push(
35
+ href ? { type: "link", text: value, href } : { type: "text", text: value }
36
+ );
37
+ } else if (value.startsWith("*") && value.endsWith("*")) {
38
+ tokens.push({ type: "em", text: value.slice(1, -1) });
39
+ } else {
40
+ tokens.push({ type: "text", text: value });
41
+ }
42
+ last = index + value.length;
43
+ }
44
+ if (last < text.length) tokens.push({ type: "text", text: text.slice(last) });
45
+ return tokens;
46
+ }
47
+ function InlineText({ text }) {
48
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: tokenizeInline(text).map((token, index) => {
49
+ const key = `${token.type}-${index}`;
50
+ switch (token.type) {
51
+ case "strong":
52
+ return /* @__PURE__ */ jsxRuntime.jsx("strong", { className: "font-semibold", children: token.text }, key);
53
+ case "em":
54
+ return /* @__PURE__ */ jsxRuntime.jsx("em", { children: token.text }, key);
55
+ case "code":
56
+ return /* @__PURE__ */ jsxRuntime.jsx(
57
+ "code",
58
+ {
59
+ className: "rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]",
60
+ children: token.text
61
+ },
62
+ key
63
+ );
64
+ case "link":
65
+ return /* @__PURE__ */ jsxRuntime.jsx(
66
+ "a",
67
+ {
68
+ href: token.href,
69
+ target: "_blank",
70
+ rel: "noreferrer",
71
+ className: "text-primary underline underline-offset-2",
72
+ children: token.text
73
+ },
74
+ key
75
+ );
76
+ default:
77
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Fragment, { children: token.text }, key);
78
+ }
79
+ }) });
80
+ }
81
+ function renderParagraph(lines, key) {
82
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { children: lines.map((line, index) => /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
83
+ index > 0 && /* @__PURE__ */ jsxRuntime.jsx("br", {}),
84
+ /* @__PURE__ */ jsxRuntime.jsx(InlineText, { text: line })
85
+ ] }, index)) }, key);
86
+ }
87
+ function renderCode(lines, key) {
88
+ return /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "overflow-auto rounded bg-muted p-2 text-xs", children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: lines.join("\n") }) }, key);
89
+ }
90
+ function CommentMarkdown({ text, className }) {
91
+ const rawLines = String(text ?? "").replace(/\r\n?/g, "\n").split("\n");
92
+ const blocks = [];
93
+ let paragraph = [];
94
+ let list = [];
95
+ let code = null;
96
+ function flushParagraph() {
97
+ if (paragraph.length > 0) {
98
+ blocks.push(renderParagraph(paragraph, `p-${blocks.length}`));
99
+ paragraph = [];
100
+ }
101
+ }
102
+ function flushList() {
103
+ if (list.length > 0) {
104
+ blocks.push(
105
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "list-disc space-y-0.5 pl-4", children: list.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(InlineText, { text: item }) }, index)) }, `ul-${blocks.length}`)
106
+ );
107
+ list = [];
108
+ }
109
+ }
110
+ for (const line of rawLines) {
111
+ if (line.trim().startsWith("```")) {
112
+ flushParagraph();
113
+ flushList();
114
+ if (code) {
115
+ blocks.push(renderCode(code, `code-${blocks.length}`));
116
+ code = null;
117
+ } else {
118
+ code = [];
119
+ }
120
+ continue;
121
+ }
122
+ if (code) {
123
+ code.push(line);
124
+ continue;
125
+ }
126
+ const trimmed = line.trim();
127
+ if (!trimmed) {
128
+ flushParagraph();
129
+ flushList();
130
+ continue;
131
+ }
132
+ const bullet = trimmed.match(/^[-*]\s+(.+)$/);
133
+ if (bullet == null ? void 0 : bullet[1]) {
134
+ flushParagraph();
135
+ list.push(bullet[1]);
136
+ continue;
137
+ }
138
+ flushList();
139
+ paragraph.push(trimmed.replace(/^#{1,6}\s+/, ""));
140
+ }
141
+ flushParagraph();
142
+ flushList();
143
+ if (code) blocks.push(renderCode(code, `code-${blocks.length}`));
144
+ return /* @__PURE__ */ jsxRuntime.jsx(
145
+ "div",
146
+ {
147
+ className: utils.cn(
148
+ "space-y-2 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",
149
+ className
150
+ ),
151
+ children: blocks.length > 0 ? blocks : null
152
+ }
153
+ );
154
+ }
155
+ exports.CommentMarkdown = CommentMarkdown;
156
+ //# sourceMappingURL=CommentMarkdown.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentMarkdown.cjs","sources":["../../src/comments/CommentMarkdown.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type CommentMarkdownProps = {\n /** Raw comment body in lightweight markdown. */\n text: string;\n /** Classes applied to the rendered wrapper. */\n className?: string;\n};\n\ntype InlineToken =\n | { type: \"text\"; text: string }\n | { type: \"strong\"; text: string }\n | { type: \"em\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string };\n\nfunction safeHref(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed) return null;\n if (/^(https?:|mailto:)/i.test(trimmed)) return trimmed;\n if (trimmed.startsWith(\"/\") && !trimmed.startsWith(\"//\")) return trimmed;\n return null;\n}\n\nconst INLINE_PATTERN =\n /(\\*\\*[^*\\n]+\\*\\*|`[^`\\n]+`|\\[[^\\]\\n]+\\]\\(([^)\\s]+)\\)|https?:\\/\\/[^\\s<)]+|\\*[^*\\n]+\\*)/g;\n\nfunction tokenizeInline(text: string): InlineToken[] {\n const tokens: InlineToken[] = [];\n let last = 0;\n for (const match of text.matchAll(INLINE_PATTERN)) {\n const index = match.index ?? 0;\n if (index > last)\n tokens.push({ type: \"text\", text: text.slice(last, index) });\n const value = match[0];\n if (value.startsWith(\"**\") && value.endsWith(\"**\")) {\n tokens.push({ type: \"strong\", text: value.slice(2, -2) });\n } else if (value.startsWith(\"`\") && value.endsWith(\"`\")) {\n tokens.push({ type: \"code\", text: value.slice(1, -1) });\n } else if (value.startsWith(\"[\")) {\n const labelEnd = value.indexOf(\"](\");\n const href = safeHref(value.slice(labelEnd + 2, -1));\n tokens.push(\n href\n ? { type: \"link\", text: value.slice(1, labelEnd), href }\n : { type: \"text\", text: value },\n );\n } else if (/^https?:\\/\\//i.test(value)) {\n const href = safeHref(value);\n tokens.push(\n href\n ? { type: \"link\", text: value, href }\n : { type: \"text\", text: value },\n );\n } else if (value.startsWith(\"*\") && value.endsWith(\"*\")) {\n tokens.push({ type: \"em\", text: value.slice(1, -1) });\n } else {\n tokens.push({ type: \"text\", text: value });\n }\n last = index + value.length;\n }\n if (last < text.length) tokens.push({ type: \"text\", text: text.slice(last) });\n return tokens;\n}\n\nfunction InlineText({ text }: { text: string }) {\n return (\n <>\n {tokenizeInline(text).map((token, index) => {\n const key = `${token.type}-${index}`;\n switch (token.type) {\n case \"strong\":\n return (\n <strong key={key} className=\"font-semibold\">\n {token.text}\n </strong>\n );\n case \"em\":\n return <em key={key}>{token.text}</em>;\n case \"code\":\n return (\n <code\n key={key}\n className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]\"\n >\n {token.text}\n </code>\n );\n case \"link\":\n return (\n <a\n key={key}\n href={token.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-primary underline underline-offset-2\"\n >\n {token.text}\n </a>\n );\n default:\n return <Fragment key={key}>{token.text}</Fragment>;\n }\n })}\n </>\n );\n}\n\nfunction renderParagraph(lines: string[], key: string): ReactNode {\n return (\n <p key={key}>\n {lines.map((line, index) => (\n <Fragment key={index}>\n {index > 0 && <br />}\n <InlineText text={line} />\n </Fragment>\n ))}\n </p>\n );\n}\n\nfunction renderCode(lines: string[], key: string): ReactNode {\n return (\n <pre key={key} className=\"overflow-auto rounded bg-muted p-2 text-xs\">\n <code>{lines.join(\"\\n\")}</code>\n </pre>\n );\n}\n\n/**\n * Lightweight, dependency-free markdown for comment bodies: bold, italics,\n * inline code, safe links, bullet lists, and fenced code blocks. For richer\n * rendering pass a `renderBody` to the card instead.\n */\nexport function CommentMarkdown({ text, className }: CommentMarkdownProps) {\n const rawLines = String(text ?? \"\")\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\");\n const blocks: ReactNode[] = [];\n let paragraph: string[] = [];\n let list: string[] = [];\n let code: string[] | null = null;\n\n function flushParagraph() {\n if (paragraph.length > 0) {\n blocks.push(renderParagraph(paragraph, `p-${blocks.length}`));\n paragraph = [];\n }\n }\n\n function flushList() {\n if (list.length > 0) {\n blocks.push(\n <ul key={`ul-${blocks.length}`} className=\"list-disc space-y-0.5 pl-4\">\n {list.map((item, index) => (\n <li key={index}>\n <InlineText text={item} />\n </li>\n ))}\n </ul>,\n );\n list = [];\n }\n }\n\n for (const line of rawLines) {\n if (line.trim().startsWith(\"```\")) {\n flushParagraph();\n flushList();\n if (code) {\n blocks.push(renderCode(code, `code-${blocks.length}`));\n code = null;\n } else {\n code = [];\n }\n continue;\n }\n if (code) {\n code.push(line);\n continue;\n }\n\n const trimmed = line.trim();\n if (!trimmed) {\n flushParagraph();\n flushList();\n continue;\n }\n\n const bullet = trimmed.match(/^[-*]\\s+(.+)$/);\n if (bullet?.[1]) {\n flushParagraph();\n list.push(bullet[1]);\n continue;\n }\n\n flushList();\n paragraph.push(trimmed.replace(/^#{1,6}\\s+/, \"\"));\n }\n\n flushParagraph();\n flushList();\n if (code) blocks.push(renderCode(code, `code-${blocks.length}`));\n\n return (\n <div\n className={cn(\n \"space-y-2 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n className,\n )}\n >\n {blocks.length > 0 ? blocks : null}\n </div>\n );\n}\n"],"names":["jsx","Fragment","jsxs","cn"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type CommentMarkdownProps = {
2
+ /** Raw comment body in lightweight markdown. */
3
+ text: string;
4
+ /** Classes applied to the rendered wrapper. */
5
+ className?: string;
6
+ };
7
+ /**
8
+ * Lightweight, dependency-free markdown for comment bodies: bold, italics,
9
+ * inline code, safe links, bullet lists, and fenced code blocks. For richer
10
+ * rendering pass a `renderBody` to the card instead.
11
+ */
12
+ export declare function CommentMarkdown({ text, className }: CommentMarkdownProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=CommentMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentMarkdown.d.ts","sourceRoot":"","sources":["../../src/comments/CommentMarkdown.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,oBAAoB,GAAG;IACjC,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA0HF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAgFxE"}
@@ -0,0 +1,156 @@
1
+ import { jsx, jsxs, Fragment as Fragment$1 } from "react/jsx-runtime";
2
+ import { Fragment } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ function safeHref(href) {
5
+ const trimmed = href.trim();
6
+ if (!trimmed) return null;
7
+ if (/^(https?:|mailto:)/i.test(trimmed)) return trimmed;
8
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) return trimmed;
9
+ return null;
10
+ }
11
+ const INLINE_PATTERN = /(\*\*[^*\n]+\*\*|`[^`\n]+`|\[[^\]\n]+\]\(([^)\s]+)\)|https?:\/\/[^\s<)]+|\*[^*\n]+\*)/g;
12
+ function tokenizeInline(text) {
13
+ const tokens = [];
14
+ let last = 0;
15
+ for (const match of text.matchAll(INLINE_PATTERN)) {
16
+ const index = match.index ?? 0;
17
+ if (index > last)
18
+ tokens.push({ type: "text", text: text.slice(last, index) });
19
+ const value = match[0];
20
+ if (value.startsWith("**") && value.endsWith("**")) {
21
+ tokens.push({ type: "strong", text: value.slice(2, -2) });
22
+ } else if (value.startsWith("`") && value.endsWith("`")) {
23
+ tokens.push({ type: "code", text: value.slice(1, -1) });
24
+ } else if (value.startsWith("[")) {
25
+ const labelEnd = value.indexOf("](");
26
+ const href = safeHref(value.slice(labelEnd + 2, -1));
27
+ tokens.push(
28
+ href ? { type: "link", text: value.slice(1, labelEnd), href } : { type: "text", text: value }
29
+ );
30
+ } else if (/^https?:\/\//i.test(value)) {
31
+ const href = safeHref(value);
32
+ tokens.push(
33
+ href ? { type: "link", text: value, href } : { type: "text", text: value }
34
+ );
35
+ } else if (value.startsWith("*") && value.endsWith("*")) {
36
+ tokens.push({ type: "em", text: value.slice(1, -1) });
37
+ } else {
38
+ tokens.push({ type: "text", text: value });
39
+ }
40
+ last = index + value.length;
41
+ }
42
+ if (last < text.length) tokens.push({ type: "text", text: text.slice(last) });
43
+ return tokens;
44
+ }
45
+ function InlineText({ text }) {
46
+ return /* @__PURE__ */ jsx(Fragment$1, { children: tokenizeInline(text).map((token, index) => {
47
+ const key = `${token.type}-${index}`;
48
+ switch (token.type) {
49
+ case "strong":
50
+ return /* @__PURE__ */ jsx("strong", { className: "font-semibold", children: token.text }, key);
51
+ case "em":
52
+ return /* @__PURE__ */ jsx("em", { children: token.text }, key);
53
+ case "code":
54
+ return /* @__PURE__ */ jsx(
55
+ "code",
56
+ {
57
+ className: "rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]",
58
+ children: token.text
59
+ },
60
+ key
61
+ );
62
+ case "link":
63
+ return /* @__PURE__ */ jsx(
64
+ "a",
65
+ {
66
+ href: token.href,
67
+ target: "_blank",
68
+ rel: "noreferrer",
69
+ className: "text-primary underline underline-offset-2",
70
+ children: token.text
71
+ },
72
+ key
73
+ );
74
+ default:
75
+ return /* @__PURE__ */ jsx(Fragment, { children: token.text }, key);
76
+ }
77
+ }) });
78
+ }
79
+ function renderParagraph(lines, key) {
80
+ return /* @__PURE__ */ jsx("p", { children: lines.map((line, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
81
+ index > 0 && /* @__PURE__ */ jsx("br", {}),
82
+ /* @__PURE__ */ jsx(InlineText, { text: line })
83
+ ] }, index)) }, key);
84
+ }
85
+ function renderCode(lines, key) {
86
+ return /* @__PURE__ */ jsx("pre", { className: "overflow-auto rounded bg-muted p-2 text-xs", children: /* @__PURE__ */ jsx("code", { children: lines.join("\n") }) }, key);
87
+ }
88
+ function CommentMarkdown({ text, className }) {
89
+ const rawLines = String(text ?? "").replace(/\r\n?/g, "\n").split("\n");
90
+ const blocks = [];
91
+ let paragraph = [];
92
+ let list = [];
93
+ let code = null;
94
+ function flushParagraph() {
95
+ if (paragraph.length > 0) {
96
+ blocks.push(renderParagraph(paragraph, `p-${blocks.length}`));
97
+ paragraph = [];
98
+ }
99
+ }
100
+ function flushList() {
101
+ if (list.length > 0) {
102
+ blocks.push(
103
+ /* @__PURE__ */ jsx("ul", { className: "list-disc space-y-0.5 pl-4", children: list.map((item, index) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(InlineText, { text: item }) }, index)) }, `ul-${blocks.length}`)
104
+ );
105
+ list = [];
106
+ }
107
+ }
108
+ for (const line of rawLines) {
109
+ if (line.trim().startsWith("```")) {
110
+ flushParagraph();
111
+ flushList();
112
+ if (code) {
113
+ blocks.push(renderCode(code, `code-${blocks.length}`));
114
+ code = null;
115
+ } else {
116
+ code = [];
117
+ }
118
+ continue;
119
+ }
120
+ if (code) {
121
+ code.push(line);
122
+ continue;
123
+ }
124
+ const trimmed = line.trim();
125
+ if (!trimmed) {
126
+ flushParagraph();
127
+ flushList();
128
+ continue;
129
+ }
130
+ const bullet = trimmed.match(/^[-*]\s+(.+)$/);
131
+ if (bullet == null ? void 0 : bullet[1]) {
132
+ flushParagraph();
133
+ list.push(bullet[1]);
134
+ continue;
135
+ }
136
+ flushList();
137
+ paragraph.push(trimmed.replace(/^#{1,6}\s+/, ""));
138
+ }
139
+ flushParagraph();
140
+ flushList();
141
+ if (code) blocks.push(renderCode(code, `code-${blocks.length}`));
142
+ return /* @__PURE__ */ jsx(
143
+ "div",
144
+ {
145
+ className: cn(
146
+ "space-y-2 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",
147
+ className
148
+ ),
149
+ children: blocks.length > 0 ? blocks : null
150
+ }
151
+ );
152
+ }
153
+ export {
154
+ CommentMarkdown
155
+ };
156
+ //# sourceMappingURL=CommentMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentMarkdown.js","sources":["../../src/comments/CommentMarkdown.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type CommentMarkdownProps = {\n /** Raw comment body in lightweight markdown. */\n text: string;\n /** Classes applied to the rendered wrapper. */\n className?: string;\n};\n\ntype InlineToken =\n | { type: \"text\"; text: string }\n | { type: \"strong\"; text: string }\n | { type: \"em\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string };\n\nfunction safeHref(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed) return null;\n if (/^(https?:|mailto:)/i.test(trimmed)) return trimmed;\n if (trimmed.startsWith(\"/\") && !trimmed.startsWith(\"//\")) return trimmed;\n return null;\n}\n\nconst INLINE_PATTERN =\n /(\\*\\*[^*\\n]+\\*\\*|`[^`\\n]+`|\\[[^\\]\\n]+\\]\\(([^)\\s]+)\\)|https?:\\/\\/[^\\s<)]+|\\*[^*\\n]+\\*)/g;\n\nfunction tokenizeInline(text: string): InlineToken[] {\n const tokens: InlineToken[] = [];\n let last = 0;\n for (const match of text.matchAll(INLINE_PATTERN)) {\n const index = match.index ?? 0;\n if (index > last)\n tokens.push({ type: \"text\", text: text.slice(last, index) });\n const value = match[0];\n if (value.startsWith(\"**\") && value.endsWith(\"**\")) {\n tokens.push({ type: \"strong\", text: value.slice(2, -2) });\n } else if (value.startsWith(\"`\") && value.endsWith(\"`\")) {\n tokens.push({ type: \"code\", text: value.slice(1, -1) });\n } else if (value.startsWith(\"[\")) {\n const labelEnd = value.indexOf(\"](\");\n const href = safeHref(value.slice(labelEnd + 2, -1));\n tokens.push(\n href\n ? { type: \"link\", text: value.slice(1, labelEnd), href }\n : { type: \"text\", text: value },\n );\n } else if (/^https?:\\/\\//i.test(value)) {\n const href = safeHref(value);\n tokens.push(\n href\n ? { type: \"link\", text: value, href }\n : { type: \"text\", text: value },\n );\n } else if (value.startsWith(\"*\") && value.endsWith(\"*\")) {\n tokens.push({ type: \"em\", text: value.slice(1, -1) });\n } else {\n tokens.push({ type: \"text\", text: value });\n }\n last = index + value.length;\n }\n if (last < text.length) tokens.push({ type: \"text\", text: text.slice(last) });\n return tokens;\n}\n\nfunction InlineText({ text }: { text: string }) {\n return (\n <>\n {tokenizeInline(text).map((token, index) => {\n const key = `${token.type}-${index}`;\n switch (token.type) {\n case \"strong\":\n return (\n <strong key={key} className=\"font-semibold\">\n {token.text}\n </strong>\n );\n case \"em\":\n return <em key={key}>{token.text}</em>;\n case \"code\":\n return (\n <code\n key={key}\n className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]\"\n >\n {token.text}\n </code>\n );\n case \"link\":\n return (\n <a\n key={key}\n href={token.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-primary underline underline-offset-2\"\n >\n {token.text}\n </a>\n );\n default:\n return <Fragment key={key}>{token.text}</Fragment>;\n }\n })}\n </>\n );\n}\n\nfunction renderParagraph(lines: string[], key: string): ReactNode {\n return (\n <p key={key}>\n {lines.map((line, index) => (\n <Fragment key={index}>\n {index > 0 && <br />}\n <InlineText text={line} />\n </Fragment>\n ))}\n </p>\n );\n}\n\nfunction renderCode(lines: string[], key: string): ReactNode {\n return (\n <pre key={key} className=\"overflow-auto rounded bg-muted p-2 text-xs\">\n <code>{lines.join(\"\\n\")}</code>\n </pre>\n );\n}\n\n/**\n * Lightweight, dependency-free markdown for comment bodies: bold, italics,\n * inline code, safe links, bullet lists, and fenced code blocks. For richer\n * rendering pass a `renderBody` to the card instead.\n */\nexport function CommentMarkdown({ text, className }: CommentMarkdownProps) {\n const rawLines = String(text ?? \"\")\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\");\n const blocks: ReactNode[] = [];\n let paragraph: string[] = [];\n let list: string[] = [];\n let code: string[] | null = null;\n\n function flushParagraph() {\n if (paragraph.length > 0) {\n blocks.push(renderParagraph(paragraph, `p-${blocks.length}`));\n paragraph = [];\n }\n }\n\n function flushList() {\n if (list.length > 0) {\n blocks.push(\n <ul key={`ul-${blocks.length}`} className=\"list-disc space-y-0.5 pl-4\">\n {list.map((item, index) => (\n <li key={index}>\n <InlineText text={item} />\n </li>\n ))}\n </ul>,\n );\n list = [];\n }\n }\n\n for (const line of rawLines) {\n if (line.trim().startsWith(\"```\")) {\n flushParagraph();\n flushList();\n if (code) {\n blocks.push(renderCode(code, `code-${blocks.length}`));\n code = null;\n } else {\n code = [];\n }\n continue;\n }\n if (code) {\n code.push(line);\n continue;\n }\n\n const trimmed = line.trim();\n if (!trimmed) {\n flushParagraph();\n flushList();\n continue;\n }\n\n const bullet = trimmed.match(/^[-*]\\s+(.+)$/);\n if (bullet?.[1]) {\n flushParagraph();\n list.push(bullet[1]);\n continue;\n }\n\n flushList();\n paragraph.push(trimmed.replace(/^#{1,6}\\s+/, \"\"));\n }\n\n flushParagraph();\n flushList();\n if (code) blocks.push(renderCode(code, `code-${blocks.length}`));\n\n return (\n <div\n className={cn(\n \"space-y-2 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n className,\n )}\n >\n {blocks.length > 0 ? blocks : null}\n </div>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const utils = require("../lib/utils.cjs");
5
+ const Badge = require("../data/Badge.cjs");
6
+ const commentUtils = require("./comment-utils.cjs");
7
+ function countByStatus(comments) {
8
+ const counts = /* @__PURE__ */ new Map();
9
+ for (const root of commentUtils.getRoots(comments)) {
10
+ if (!root.status) continue;
11
+ counts.set(root.status, (counts.get(root.status) ?? 0) + 1);
12
+ }
13
+ return counts;
14
+ }
15
+ function CommentProgress({
16
+ comments,
17
+ config,
18
+ activeStatus,
19
+ onStatusClick,
20
+ className
21
+ }) {
22
+ const roots = commentUtils.getRoots(comments);
23
+ const total = roots.length;
24
+ const resolved = roots.filter((r) => !commentUtils.isUnresolved(config, r.status)).length;
25
+ const percent = total > 0 ? Math.round(resolved / total * 100) : 0;
26
+ const counts = countByStatus(comments);
27
+ if (total === 0) return null;
28
+ return /* @__PURE__ */ jsxRuntime.jsxs(
29
+ "div",
30
+ {
31
+ className: utils.cn("space-y-1.5", className),
32
+ "data-testid": "comment-progress",
33
+ children: [
34
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-[11px] text-muted-foreground", children: [
35
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
36
+ resolved,
37
+ " of ",
38
+ total,
39
+ " resolved"
40
+ ] }),
41
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
42
+ percent,
43
+ "%"
44
+ ] })
45
+ ] }),
46
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
47
+ "div",
48
+ {
49
+ className: "h-full rounded-full bg-primary transition-all",
50
+ style: { width: `${percent}%` }
51
+ }
52
+ ) }),
53
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 pt-0.5", children: config.statuses.map((status) => {
54
+ const count = counts.get(status.value) ?? 0;
55
+ if (count === 0) return null;
56
+ const active = activeStatus === status.value;
57
+ const chip = /* @__PURE__ */ jsxRuntime.jsxs(
58
+ Badge.Badge,
59
+ {
60
+ variant: active ? "solid" : "soft",
61
+ tone: commentUtils.toneToBadgeTone(status.tone),
62
+ size: "xs",
63
+ ...status.icon ? { icon: status.icon } : {},
64
+ children: [
65
+ status.label,
66
+ " ",
67
+ count
68
+ ]
69
+ }
70
+ );
71
+ return onStatusClick ? /* @__PURE__ */ jsxRuntime.jsx(
72
+ "button",
73
+ {
74
+ type: "button",
75
+ onClick: () => onStatusClick(status.value),
76
+ children: chip
77
+ },
78
+ status.value
79
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: chip }, status.value);
80
+ }) })
81
+ ]
82
+ }
83
+ );
84
+ }
85
+ exports.CommentProgress = CommentProgress;
86
+ //# sourceMappingURL=CommentProgress.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentProgress.cjs","sources":["../../src/comments/CommentProgress.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { Badge } from \"../data/Badge\";\nimport { getRoots, isUnresolved, toneToBadgeTone } from \"./comment-utils\";\nimport type { Comment, CommentConfig } from \"./comment-types\";\n\nexport type CommentProgressProps = {\n comments: Comment[];\n config: CommentConfig;\n /** Status whose chip is rendered as selected. */\n activeStatus?: string | null;\n /** Makes the status chips clickable. */\n onStatusClick?: (status: string) => void;\n className?: string;\n};\n\nfunction countByStatus(comments: Comment[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const root of getRoots(comments)) {\n if (!root.status) continue;\n counts.set(root.status, (counts.get(root.status) ?? 0) + 1);\n }\n return counts;\n}\n\n/**\n * A compact resolution summary for a comment set: a \"resolved of total\" bar plus\n * a clickable chip per status. Pure presentation derived from `comments`.\n */\nexport function CommentProgress({\n comments,\n config,\n activeStatus,\n onStatusClick,\n className,\n}: CommentProgressProps) {\n const roots = getRoots(comments);\n const total = roots.length;\n const resolved = roots.filter((r) => !isUnresolved(config, r.status)).length;\n const percent = total > 0 ? Math.round((resolved / total) * 100) : 0;\n const counts = countByStatus(comments);\n\n if (total === 0) return null;\n\n return (\n <div\n className={cn(\"space-y-1.5\", className)}\n data-testid=\"comment-progress\"\n >\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>\n {resolved} of {total} resolved\n </span>\n <span>{percent}%</span>\n </div>\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <div className=\"flex flex-wrap gap-1 pt-0.5\">\n {config.statuses.map((status) => {\n const count = counts.get(status.value) ?? 0;\n if (count === 0) return null;\n const active = activeStatus === status.value;\n const chip = (\n <Badge\n variant={active ? \"solid\" : \"soft\"}\n tone={toneToBadgeTone(status.tone)}\n size=\"xs\"\n {...(status.icon ? { icon: status.icon } : {})}\n >\n {status.label} {count}\n </Badge>\n );\n return onStatusClick ? (\n <button\n key={status.value}\n type=\"button\"\n onClick={() => onStatusClick(status.value)}\n >\n {chip}\n </button>\n ) : (\n <span key={status.value}>{chip}</span>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["getRoots","isUnresolved","jsxs","cn","jsx","Badge","toneToBadgeTone"],"mappings":";;;;;;AAeA,SAAS,cAAc,UAA0C;AAC/D,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQA,sBAAS,QAAQ,GAAG;AACrC,QAAI,CAAC,KAAK,OAAQ;AAClB,WAAO,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAMO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,QAAQA,aAAAA,SAAS,QAAQ;AAC/B,QAAM,QAAQ,MAAM;AACpB,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM,CAACC,aAAAA,aAAa,QAAQ,EAAE,MAAM,CAAC,EAAE;AACtE,QAAM,UAAU,QAAQ,IAAI,KAAK,MAAO,WAAW,QAAS,GAAG,IAAI;AACnE,QAAM,SAAS,cAAc,QAAQ;AAErC,MAAI,UAAU,EAAG,QAAO;AAExB,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA,GAAG,eAAe,SAAS;AAAA,MACtC,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,uEACb,UAAA;AAAA,UAAAA,gCAAC,QAAA,EACE,UAAA;AAAA,YAAA;AAAA,YAAS;AAAA,YAAK;AAAA,YAAM;AAAA,UAAA,GACvB;AAAA,0CACC,QAAA,EAAM,UAAA;AAAA,YAAA;AAAA,YAAQ;AAAA,UAAA,EAAA,CAAC;AAAA,QAAA,GAClB;AAAA,QACAE,2BAAAA,IAAC,OAAA,EAAI,WAAU,sDACb,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,GAAG,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA,GAElC;AAAA,QACAA,+BAAC,SAAI,WAAU,+BACZ,iBAAO,SAAS,IAAI,CAAC,WAAW;AAC/B,gBAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK;AAC1C,cAAI,UAAU,EAAG,QAAO;AACxB,gBAAM,SAAS,iBAAiB,OAAO;AACvC,gBAAM,OACJF,2BAAAA;AAAAA,YAACG,MAAAA;AAAAA,YAAA;AAAA,cACC,SAAS,SAAS,UAAU;AAAA,cAC5B,MAAMC,aAAAA,gBAAgB,OAAO,IAAI;AAAA,cACjC,MAAK;AAAA,cACJ,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,cAE1C,UAAA;AAAA,gBAAA,OAAO;AAAA,gBAAM;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAGpB,iBAAO,gBACLF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM,cAAc,OAAO,KAAK;AAAA,cAExC,UAAA;AAAA,YAAA;AAAA,YAJI,OAAO;AAAA,UAAA,IAOdA,2BAAAA,IAAC,QAAA,EAAyB,UAAA,KAAA,GAAf,OAAO,KAAa;AAAA,QAEnC,CAAC,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
@@ -0,0 +1,16 @@
1
+ import { Comment, CommentConfig } from './comment-types';
2
+ export type CommentProgressProps = {
3
+ comments: Comment[];
4
+ config: CommentConfig;
5
+ /** Status whose chip is rendered as selected. */
6
+ activeStatus?: string | null;
7
+ /** Makes the status chips clickable. */
8
+ onStatusClick?: (status: string) => void;
9
+ className?: string;
10
+ };
11
+ /**
12
+ * A compact resolution summary for a comment set: a "resolved of total" bar plus
13
+ * a clickable chip per status. Pure presentation derived from `comments`.
14
+ */
15
+ export declare function CommentProgress({ comments, config, activeStatus, onStatusClick, className, }: CommentProgressProps): import("react/jsx-runtime").JSX.Element | null;
16
+ //# sourceMappingURL=CommentProgress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentProgress.d.ts","sourceRoot":"","sources":["../../src/comments/CommentProgress.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wCAAwC;IACxC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAWF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,oBAAoB,kDAwDtB"}
@@ -0,0 +1,86 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ import { Badge } from "../data/Badge.js";
4
+ import { getRoots, isUnresolved, toneToBadgeTone } from "./comment-utils.js";
5
+ function countByStatus(comments) {
6
+ const counts = /* @__PURE__ */ new Map();
7
+ for (const root of getRoots(comments)) {
8
+ if (!root.status) continue;
9
+ counts.set(root.status, (counts.get(root.status) ?? 0) + 1);
10
+ }
11
+ return counts;
12
+ }
13
+ function CommentProgress({
14
+ comments,
15
+ config,
16
+ activeStatus,
17
+ onStatusClick,
18
+ className
19
+ }) {
20
+ const roots = getRoots(comments);
21
+ const total = roots.length;
22
+ const resolved = roots.filter((r) => !isUnresolved(config, r.status)).length;
23
+ const percent = total > 0 ? Math.round(resolved / total * 100) : 0;
24
+ const counts = countByStatus(comments);
25
+ if (total === 0) return null;
26
+ return /* @__PURE__ */ jsxs(
27
+ "div",
28
+ {
29
+ className: cn("space-y-1.5", className),
30
+ "data-testid": "comment-progress",
31
+ children: [
32
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-[11px] text-muted-foreground", children: [
33
+ /* @__PURE__ */ jsxs("span", { children: [
34
+ resolved,
35
+ " of ",
36
+ total,
37
+ " resolved"
38
+ ] }),
39
+ /* @__PURE__ */ jsxs("span", { children: [
40
+ percent,
41
+ "%"
42
+ ] })
43
+ ] }),
44
+ /* @__PURE__ */ jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx(
45
+ "div",
46
+ {
47
+ className: "h-full rounded-full bg-primary transition-all",
48
+ style: { width: `${percent}%` }
49
+ }
50
+ ) }),
51
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 pt-0.5", children: config.statuses.map((status) => {
52
+ const count = counts.get(status.value) ?? 0;
53
+ if (count === 0) return null;
54
+ const active = activeStatus === status.value;
55
+ const chip = /* @__PURE__ */ jsxs(
56
+ Badge,
57
+ {
58
+ variant: active ? "solid" : "soft",
59
+ tone: toneToBadgeTone(status.tone),
60
+ size: "xs",
61
+ ...status.icon ? { icon: status.icon } : {},
62
+ children: [
63
+ status.label,
64
+ " ",
65
+ count
66
+ ]
67
+ }
68
+ );
69
+ return onStatusClick ? /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ type: "button",
73
+ onClick: () => onStatusClick(status.value),
74
+ children: chip
75
+ },
76
+ status.value
77
+ ) : /* @__PURE__ */ jsx("span", { children: chip }, status.value);
78
+ }) })
79
+ ]
80
+ }
81
+ );
82
+ }
83
+ export {
84
+ CommentProgress
85
+ };
86
+ //# sourceMappingURL=CommentProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentProgress.js","sources":["../../src/comments/CommentProgress.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { Badge } from \"../data/Badge\";\nimport { getRoots, isUnresolved, toneToBadgeTone } from \"./comment-utils\";\nimport type { Comment, CommentConfig } from \"./comment-types\";\n\nexport type CommentProgressProps = {\n comments: Comment[];\n config: CommentConfig;\n /** Status whose chip is rendered as selected. */\n activeStatus?: string | null;\n /** Makes the status chips clickable. */\n onStatusClick?: (status: string) => void;\n className?: string;\n};\n\nfunction countByStatus(comments: Comment[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const root of getRoots(comments)) {\n if (!root.status) continue;\n counts.set(root.status, (counts.get(root.status) ?? 0) + 1);\n }\n return counts;\n}\n\n/**\n * A compact resolution summary for a comment set: a \"resolved of total\" bar plus\n * a clickable chip per status. Pure presentation derived from `comments`.\n */\nexport function CommentProgress({\n comments,\n config,\n activeStatus,\n onStatusClick,\n className,\n}: CommentProgressProps) {\n const roots = getRoots(comments);\n const total = roots.length;\n const resolved = roots.filter((r) => !isUnresolved(config, r.status)).length;\n const percent = total > 0 ? Math.round((resolved / total) * 100) : 0;\n const counts = countByStatus(comments);\n\n if (total === 0) return null;\n\n return (\n <div\n className={cn(\"space-y-1.5\", className)}\n data-testid=\"comment-progress\"\n >\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>\n {resolved} of {total} resolved\n </span>\n <span>{percent}%</span>\n </div>\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <div className=\"flex flex-wrap gap-1 pt-0.5\">\n {config.statuses.map((status) => {\n const count = counts.get(status.value) ?? 0;\n if (count === 0) return null;\n const active = activeStatus === status.value;\n const chip = (\n <Badge\n variant={active ? \"solid\" : \"soft\"}\n tone={toneToBadgeTone(status.tone)}\n size=\"xs\"\n {...(status.icon ? { icon: status.icon } : {})}\n >\n {status.label} {count}\n </Badge>\n );\n return onStatusClick ? (\n <button\n key={status.value}\n type=\"button\"\n onClick={() => onStatusClick(status.value)}\n >\n {chip}\n </button>\n ) : (\n <span key={status.value}>{chip}</span>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAeA,SAAS,cAAc,UAA0C;AAC/D,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQ,SAAS,QAAQ,GAAG;AACrC,QAAI,CAAC,KAAK,OAAQ;AAClB,WAAO,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAMO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,QAAQ,SAAS,QAAQ;AAC/B,QAAM,QAAQ,MAAM;AACpB,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,QAAQ,EAAE,MAAM,CAAC,EAAE;AACtE,QAAM,UAAU,QAAQ,IAAI,KAAK,MAAO,WAAW,QAAS,GAAG,IAAI;AACnE,QAAM,SAAS,cAAc,QAAQ;AAErC,MAAI,UAAU,EAAG,QAAO;AAExB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG,eAAe,SAAS;AAAA,MACtC,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,uEACb,UAAA;AAAA,UAAA,qBAAC,QAAA,EACE,UAAA;AAAA,YAAA;AAAA,YAAS;AAAA,YAAK;AAAA,YAAM;AAAA,UAAA,GACvB;AAAA,+BACC,QAAA,EAAM,UAAA;AAAA,YAAA;AAAA,YAAQ;AAAA,UAAA,EAAA,CAAC;AAAA,QAAA,GAClB;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,sDACb,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,GAAG,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA,GAElC;AAAA,QACA,oBAAC,SAAI,WAAU,+BACZ,iBAAO,SAAS,IAAI,CAAC,WAAW;AAC/B,gBAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK;AAC1C,cAAI,UAAU,EAAG,QAAO;AACxB,gBAAM,SAAS,iBAAiB,OAAO;AACvC,gBAAM,OACJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,SAAS,UAAU;AAAA,cAC5B,MAAM,gBAAgB,OAAO,IAAI;AAAA,cACjC,MAAK;AAAA,cACJ,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,cAE1C,UAAA;AAAA,gBAAA,OAAO;AAAA,gBAAM;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAGpB,iBAAO,gBACL;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM,cAAc,OAAO,KAAK;AAAA,cAExC,UAAA;AAAA,YAAA;AAAA,YAJI,OAAO;AAAA,UAAA,IAOd,oBAAC,QAAA,EAAyB,UAAA,KAAA,GAAf,OAAO,KAAa;AAAA,QAEnC,CAAC,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}