@flanksource/clicky-ui 0.2.21 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/dist/comments/CommentAuthor.cjs +58 -0
  2. package/dist/comments/CommentAuthor.cjs.map +1 -0
  3. package/dist/comments/CommentAuthor.d.ts +17 -0
  4. package/dist/comments/CommentAuthor.d.ts.map +1 -0
  5. package/dist/comments/CommentAuthor.js +58 -0
  6. package/dist/comments/CommentAuthor.js.map +1 -0
  7. package/dist/comments/CommentCard.cjs +343 -0
  8. package/dist/comments/CommentCard.cjs.map +1 -0
  9. package/dist/comments/CommentCard.d.ts +27 -0
  10. package/dist/comments/CommentCard.d.ts.map +1 -0
  11. package/dist/comments/CommentCard.js +343 -0
  12. package/dist/comments/CommentCard.js.map +1 -0
  13. package/dist/comments/CommentComposer.cjs +207 -0
  14. package/dist/comments/CommentComposer.cjs.map +1 -0
  15. package/dist/comments/CommentComposer.d.ts +23 -0
  16. package/dist/comments/CommentComposer.d.ts.map +1 -0
  17. package/dist/comments/CommentComposer.js +207 -0
  18. package/dist/comments/CommentComposer.js.map +1 -0
  19. package/dist/comments/CommentFilterBar.cjs +145 -0
  20. package/dist/comments/CommentFilterBar.cjs.map +1 -0
  21. package/dist/comments/CommentFilterBar.d.ts +15 -0
  22. package/dist/comments/CommentFilterBar.d.ts.map +1 -0
  23. package/dist/comments/CommentFilterBar.js +145 -0
  24. package/dist/comments/CommentFilterBar.js.map +1 -0
  25. package/dist/comments/CommentMarkdown.cjs +156 -0
  26. package/dist/comments/CommentMarkdown.cjs.map +1 -0
  27. package/dist/comments/CommentMarkdown.d.ts +13 -0
  28. package/dist/comments/CommentMarkdown.d.ts.map +1 -0
  29. package/dist/comments/CommentMarkdown.js +156 -0
  30. package/dist/comments/CommentMarkdown.js.map +1 -0
  31. package/dist/comments/CommentProgress.cjs +86 -0
  32. package/dist/comments/CommentProgress.cjs.map +1 -0
  33. package/dist/comments/CommentProgress.d.ts +16 -0
  34. package/dist/comments/CommentProgress.d.ts.map +1 -0
  35. package/dist/comments/CommentProgress.js +86 -0
  36. package/dist/comments/CommentProgress.js.map +1 -0
  37. package/dist/comments/CommentProvider.cjs +99 -0
  38. package/dist/comments/CommentProvider.cjs.map +1 -0
  39. package/dist/comments/CommentProvider.d.ts +19 -0
  40. package/dist/comments/CommentProvider.d.ts.map +1 -0
  41. package/dist/comments/CommentProvider.js +99 -0
  42. package/dist/comments/CommentProvider.js.map +1 -0
  43. package/dist/comments/CommentSidePanel.cjs +219 -0
  44. package/dist/comments/CommentSidePanel.cjs.map +1 -0
  45. package/dist/comments/CommentSidePanel.d.ts +16 -0
  46. package/dist/comments/CommentSidePanel.d.ts.map +1 -0
  47. package/dist/comments/CommentSidePanel.js +219 -0
  48. package/dist/comments/CommentSidePanel.js.map +1 -0
  49. package/dist/comments/CommentThread.cjs +57 -0
  50. package/dist/comments/CommentThread.cjs.map +1 -0
  51. package/dist/comments/CommentThread.d.ts +24 -0
  52. package/dist/comments/CommentThread.d.ts.map +1 -0
  53. package/dist/comments/CommentThread.js +57 -0
  54. package/dist/comments/CommentThread.js.map +1 -0
  55. package/dist/comments/CommentThreadList.cjs +124 -0
  56. package/dist/comments/CommentThreadList.cjs.map +1 -0
  57. package/dist/comments/CommentThreadList.d.ts +25 -0
  58. package/dist/comments/CommentThreadList.d.ts.map +1 -0
  59. package/dist/comments/CommentThreadList.js +124 -0
  60. package/dist/comments/CommentThreadList.js.map +1 -0
  61. package/dist/comments/GroupedComments.cjs +74 -0
  62. package/dist/comments/GroupedComments.cjs.map +1 -0
  63. package/dist/comments/GroupedComments.d.ts +18 -0
  64. package/dist/comments/GroupedComments.d.ts.map +1 -0
  65. package/dist/comments/GroupedComments.js +74 -0
  66. package/dist/comments/GroupedComments.js.map +1 -0
  67. package/dist/comments/MentionTextarea.cjs +253 -0
  68. package/dist/comments/MentionTextarea.cjs.map +1 -0
  69. package/dist/comments/MentionTextarea.d.ts +28 -0
  70. package/dist/comments/MentionTextarea.d.ts.map +1 -0
  71. package/dist/comments/MentionTextarea.js +253 -0
  72. package/dist/comments/MentionTextarea.js.map +1 -0
  73. package/dist/comments/comment-context.cjs +33 -0
  74. package/dist/comments/comment-context.cjs.map +1 -0
  75. package/dist/comments/comment-context.d.ts +32 -0
  76. package/dist/comments/comment-context.d.ts.map +1 -0
  77. package/dist/comments/comment-context.js +33 -0
  78. package/dist/comments/comment-context.js.map +1 -0
  79. package/dist/comments/comment-fixtures.d.ts +11 -0
  80. package/dist/comments/comment-fixtures.d.ts.map +1 -0
  81. package/dist/comments/comment-types.cjs +19 -0
  82. package/dist/comments/comment-types.cjs.map +1 -0
  83. package/dist/comments/comment-types.d.ts +170 -0
  84. package/dist/comments/comment-types.d.ts.map +1 -0
  85. package/dist/comments/comment-types.js +19 -0
  86. package/dist/comments/comment-types.js.map +1 -0
  87. package/dist/comments/comment-utils.cjs +216 -0
  88. package/dist/comments/comment-utils.cjs.map +1 -0
  89. package/dist/comments/comment-utils.d.ts +59 -0
  90. package/dist/comments/comment-utils.d.ts.map +1 -0
  91. package/dist/comments/comment-utils.js +216 -0
  92. package/dist/comments/comment-utils.js.map +1 -0
  93. package/dist/comments.cjs +57 -0
  94. package/dist/comments.cjs.map +1 -0
  95. package/dist/comments.d.ts +16 -0
  96. package/dist/comments.d.ts.map +1 -0
  97. package/dist/comments.js +57 -0
  98. package/dist/comments.js.map +1 -0
  99. package/dist/components/Combobox.cjs +5 -2
  100. package/dist/components/Combobox.cjs.map +1 -1
  101. package/dist/components/Combobox.d.ts.map +1 -1
  102. package/dist/components/Combobox.js +5 -2
  103. package/dist/components/Combobox.js.map +1 -1
  104. package/dist/components/FilterBar.cjs +293 -256
  105. package/dist/components/FilterBar.cjs.map +1 -1
  106. package/dist/components/FilterBar.d.ts.map +1 -1
  107. package/dist/components/FilterBar.js +293 -256
  108. package/dist/components/FilterBar.js.map +1 -1
  109. package/dist/components/JsonSchemaForm.cjs +22 -6
  110. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  111. package/dist/components/JsonSchemaForm.d.ts +1 -1
  112. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  113. package/dist/components/JsonSchemaForm.js +25 -9
  114. package/dist/components/JsonSchemaForm.js.map +1 -1
  115. package/dist/components/MultiSelect.cjs +29 -32
  116. package/dist/components/MultiSelect.cjs.map +1 -1
  117. package/dist/components/MultiSelect.d.ts.map +1 -1
  118. package/dist/components/MultiSelect.js +30 -33
  119. package/dist/components/MultiSelect.js.map +1 -1
  120. package/dist/components/NamespacePicker.cjs +52 -0
  121. package/dist/components/NamespacePicker.cjs.map +1 -0
  122. package/dist/components/NamespacePicker.d.ts +17 -0
  123. package/dist/components/NamespacePicker.d.ts.map +1 -0
  124. package/dist/components/NamespacePicker.js +52 -0
  125. package/dist/components/NamespacePicker.js.map +1 -0
  126. package/dist/components/TimeRange.cjs +29 -37
  127. package/dist/components/TimeRange.cjs.map +1 -1
  128. package/dist/components/TimeRange.d.ts.map +1 -1
  129. package/dist/components/TimeRange.js +30 -38
  130. package/dist/components/TimeRange.js.map +1 -1
  131. package/dist/components/TreePickerField.cjs +6 -3
  132. package/dist/components/TreePickerField.cjs.map +1 -1
  133. package/dist/components/TreePickerField.d.ts.map +1 -1
  134. package/dist/components/TreePickerField.js +6 -3
  135. package/dist/components/TreePickerField.js.map +1 -1
  136. package/dist/components/form-lookup-context.cjs +36 -0
  137. package/dist/components/form-lookup-context.cjs.map +1 -0
  138. package/dist/components/form-lookup-context.d.ts +9 -0
  139. package/dist/components/form-lookup-context.d.ts.map +1 -0
  140. package/dist/components/form-lookup-context.js +36 -0
  141. package/dist/components/form-lookup-context.js.map +1 -0
  142. package/dist/components/icon-menu-picker.cjs +9 -3
  143. package/dist/components/icon-menu-picker.cjs.map +1 -1
  144. package/dist/components/icon-menu-picker.d.ts.map +1 -1
  145. package/dist/components/icon-menu-picker.js +9 -3
  146. package/dist/components/icon-menu-picker.js.map +1 -1
  147. package/dist/components/json-schema-form-discriminator.cjs +67 -0
  148. package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
  149. package/dist/components/json-schema-form-discriminator.d.ts +10 -0
  150. package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
  151. package/dist/components/json-schema-form-discriminator.js +67 -0
  152. package/dist/components/json-schema-form-discriminator.js.map +1 -0
  153. package/dist/components/json-schema-form-fields.cjs +146 -3
  154. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  155. package/dist/components/json-schema-form-fields.d.ts +22 -0
  156. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  157. package/dist/components/json-schema-form-fields.js +147 -4
  158. package/dist/components/json-schema-form-fields.js.map +1 -1
  159. package/dist/components/json-schema-form-grid.cjs +92 -0
  160. package/dist/components/json-schema-form-grid.cjs.map +1 -0
  161. package/dist/components/json-schema-form-grid.d.ts +9 -0
  162. package/dist/components/json-schema-form-grid.d.ts.map +1 -0
  163. package/dist/components/json-schema-form-grid.js +92 -0
  164. package/dist/components/json-schema-form-grid.js.map +1 -0
  165. package/dist/components/json-schema-form-refs.cjs +60 -0
  166. package/dist/components/json-schema-form-refs.cjs.map +1 -0
  167. package/dist/components/json-schema-form-refs.d.ts +3 -0
  168. package/dist/components/json-schema-form-refs.d.ts.map +1 -0
  169. package/dist/components/json-schema-form-refs.js +60 -0
  170. package/dist/components/json-schema-form-refs.js.map +1 -0
  171. package/dist/components/json-schema-form-render.cjs +34 -5
  172. package/dist/components/json-schema-form-render.cjs.map +1 -1
  173. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  174. package/dist/components/json-schema-form-render.js +36 -7
  175. package/dist/components/json-schema-form-render.js.map +1 -1
  176. package/dist/components/json-schema-form-resolve.cjs +29 -2
  177. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  178. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  179. package/dist/components/json-schema-form-resolve.js +29 -2
  180. package/dist/components/json-schema-form-resolve.js.map +1 -1
  181. package/dist/components/json-schema-form-template-menu.cjs +83 -0
  182. package/dist/components/json-schema-form-template-menu.cjs.map +1 -0
  183. package/dist/components/json-schema-form-template-menu.d.ts +15 -0
  184. package/dist/components/json-schema-form-template-menu.d.ts.map +1 -0
  185. package/dist/components/json-schema-form-template-menu.js +83 -0
  186. package/dist/components/json-schema-form-template-menu.js.map +1 -0
  187. package/dist/components/json-schema-form-template.cjs +18 -0
  188. package/dist/components/json-schema-form-template.cjs.map +1 -0
  189. package/dist/components/json-schema-form-template.d.ts +13 -0
  190. package/dist/components/json-schema-form-template.d.ts.map +1 -0
  191. package/dist/components/json-schema-form-template.js +18 -0
  192. package/dist/components/json-schema-form-template.js.map +1 -0
  193. package/dist/components/json-schema-form-types.d.ts +41 -2
  194. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  195. package/dist/components/json-schema-form-utils.cjs +8 -0
  196. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  197. package/dist/components/json-schema-form-utils.d.ts +1 -0
  198. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  199. package/dist/components/json-schema-form-utils.js +8 -0
  200. package/dist/components/json-schema-form-utils.js.map +1 -1
  201. package/dist/components/workload-picker-utils.cjs.map +1 -1
  202. package/dist/components/workload-picker-utils.d.ts +11 -1
  203. package/dist/components/workload-picker-utils.d.ts.map +1 -1
  204. package/dist/components/workload-picker-utils.js.map +1 -1
  205. package/dist/components.cjs +10 -0
  206. package/dist/components.cjs.map +1 -1
  207. package/dist/components.d.ts +7 -2
  208. package/dist/components.d.ts.map +1 -1
  209. package/dist/components.js +10 -0
  210. package/dist/components.js.map +1 -1
  211. package/dist/data/Clicky.cjs +231 -69
  212. package/dist/data/Clicky.cjs.map +1 -1
  213. package/dist/data/Clicky.d.ts +7 -1
  214. package/dist/data/Clicky.d.ts.map +1 -1
  215. package/dist/data/Clicky.fixtures.d.ts +3 -1
  216. package/dist/data/Clicky.fixtures.d.ts.map +1 -1
  217. package/dist/data/Clicky.js +232 -70
  218. package/dist/data/Clicky.js.map +1 -1
  219. package/dist/data/DataTable.cjs +23 -17
  220. package/dist/data/DataTable.cjs.map +1 -1
  221. package/dist/data/DataTable.d.ts +7 -1
  222. package/dist/data/DataTable.d.ts.map +1 -1
  223. package/dist/data/DataTable.js +24 -18
  224. package/dist/data/DataTable.js.map +1 -1
  225. package/dist/data/ExecutionTree.cjs +68 -0
  226. package/dist/data/ExecutionTree.cjs.map +1 -0
  227. package/dist/data/ExecutionTree.d.ts +40 -0
  228. package/dist/data/ExecutionTree.d.ts.map +1 -0
  229. package/dist/data/ExecutionTree.js +68 -0
  230. package/dist/data/ExecutionTree.js.map +1 -0
  231. package/dist/data/Gauge.cjs +37 -4
  232. package/dist/data/Gauge.cjs.map +1 -1
  233. package/dist/data/Gauge.d.ts +6 -1
  234. package/dist/data/Gauge.d.ts.map +1 -1
  235. package/dist/data/Gauge.js +37 -4
  236. package/dist/data/Gauge.js.map +1 -1
  237. package/dist/data/GaugeHoverCard.cjs +35 -0
  238. package/dist/data/GaugeHoverCard.cjs.map +1 -0
  239. package/dist/data/GaugeHoverCard.d.ts +25 -0
  240. package/dist/data/GaugeHoverCard.d.ts.map +1 -0
  241. package/dist/data/GaugeHoverCard.js +35 -0
  242. package/dist/data/GaugeHoverCard.js.map +1 -0
  243. package/dist/data/MarkdownEditor.cjs +616 -0
  244. package/dist/data/MarkdownEditor.cjs.map +1 -0
  245. package/dist/data/MarkdownEditor.d.ts +61 -0
  246. package/dist/data/MarkdownEditor.d.ts.map +1 -0
  247. package/dist/data/MarkdownEditor.js +616 -0
  248. package/dist/data/MarkdownEditor.js.map +1 -0
  249. package/dist/data/MarkdownEditor.model.cjs +27 -0
  250. package/dist/data/MarkdownEditor.model.cjs.map +1 -0
  251. package/dist/data/MarkdownEditor.model.d.ts +38 -0
  252. package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
  253. package/dist/data/MarkdownEditor.model.js +27 -0
  254. package/dist/data/MarkdownEditor.model.js.map +1 -0
  255. package/dist/data/ObjectGraph.cjs +44 -0
  256. package/dist/data/ObjectGraph.cjs.map +1 -0
  257. package/dist/data/ObjectGraph.d.ts +39 -0
  258. package/dist/data/ObjectGraph.d.ts.map +1 -0
  259. package/dist/data/ObjectGraph.js +44 -0
  260. package/dist/data/ObjectGraph.js.map +1 -0
  261. package/dist/data/SchemaViewer.cjs +152 -0
  262. package/dist/data/SchemaViewer.cjs.map +1 -0
  263. package/dist/data/SchemaViewer.d.ts +27 -0
  264. package/dist/data/SchemaViewer.d.ts.map +1 -0
  265. package/dist/data/SchemaViewer.js +152 -0
  266. package/dist/data/SchemaViewer.js.map +1 -0
  267. package/dist/data/TimeseriesCoreBars.cjs +169 -32
  268. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  269. package/dist/data/TimeseriesCoreBars.d.ts +42 -5
  270. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  271. package/dist/data/TimeseriesCoreBars.js +170 -33
  272. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  273. package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
  274. package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
  275. package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
  276. package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
  277. package/dist/data/TimeseriesCoreBars.model.js +5 -5
  278. package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
  279. package/dist/data/TimeseriesGauge.cjs +132 -36
  280. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  281. package/dist/data/TimeseriesGauge.d.ts +15 -1
  282. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  283. package/dist/data/TimeseriesGauge.js +133 -37
  284. package/dist/data/TimeseriesGauge.js.map +1 -1
  285. package/dist/data/WorkloadCard.cjs +371 -0
  286. package/dist/data/WorkloadCard.cjs.map +1 -0
  287. package/dist/data/WorkloadCard.d.ts +25 -0
  288. package/dist/data/WorkloadCard.d.ts.map +1 -0
  289. package/dist/data/WorkloadCard.js +371 -0
  290. package/dist/data/WorkloadCard.js.map +1 -0
  291. package/dist/data/WorkloadCard.model.cjs +51 -0
  292. package/dist/data/WorkloadCard.model.cjs.map +1 -0
  293. package/dist/data/WorkloadCard.model.d.ts +53 -0
  294. package/dist/data/WorkloadCard.model.d.ts.map +1 -0
  295. package/dist/data/WorkloadCard.model.js +51 -0
  296. package/dist/data/WorkloadCard.model.js.map +1 -0
  297. package/dist/data/ai/ChatFab.cjs +3 -1
  298. package/dist/data/ai/ChatFab.cjs.map +1 -1
  299. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  300. package/dist/data/ai/ChatFab.js +3 -1
  301. package/dist/data/ai/ChatFab.js.map +1 -1
  302. package/dist/data/ai/ChatWindow.cjs +19 -9
  303. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  304. package/dist/data/ai/ChatWindow.d.ts +4 -2
  305. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  306. package/dist/data/ai/ChatWindow.js +19 -9
  307. package/dist/data/ai/ChatWindow.js.map +1 -1
  308. package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
  309. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
  310. package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
  311. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
  312. package/dist/data/ai/ChatWindowRequestBody.js +20 -0
  313. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
  314. package/dist/data/ai/chat-window-context.cjs +2 -1
  315. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  316. package/dist/data/ai/chat-window-context.d.ts +1 -1
  317. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  318. package/dist/data/ai/chat-window-context.js +2 -1
  319. package/dist/data/ai/chat-window-context.js.map +1 -1
  320. package/dist/data/ai/context.cjs.map +1 -1
  321. package/dist/data/ai/context.d.ts +3 -0
  322. package/dist/data/ai/context.d.ts.map +1 -1
  323. package/dist/data/ai/context.js.map +1 -1
  324. package/dist/data/chat/Chat.cjs +21 -1
  325. package/dist/data/chat/Chat.cjs.map +1 -1
  326. package/dist/data/chat/Chat.d.ts +11 -2
  327. package/dist/data/chat/Chat.d.ts.map +1 -1
  328. package/dist/data/chat/Chat.js +22 -2
  329. package/dist/data/chat/Chat.js.map +1 -1
  330. package/dist/data/chat/Message.cjs +13 -4
  331. package/dist/data/chat/Message.cjs.map +1 -1
  332. package/dist/data/chat/Message.d.ts +4 -2
  333. package/dist/data/chat/Message.d.ts.map +1 -1
  334. package/dist/data/chat/Message.js +13 -4
  335. package/dist/data/chat/Message.js.map +1 -1
  336. package/dist/data/chat/ToolCall.cjs +9 -4
  337. package/dist/data/chat/ToolCall.cjs.map +1 -1
  338. package/dist/data/chat/ToolCall.d.ts +3 -2
  339. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  340. package/dist/data/chat/ToolCall.js +9 -4
  341. package/dist/data/chat/ToolCall.js.map +1 -1
  342. package/dist/data/chat/index.d.ts +1 -1
  343. package/dist/data/chat/index.d.ts.map +1 -1
  344. package/dist/data/chat/types.cjs.map +1 -1
  345. package/dist/data/chat/types.d.ts +7 -0
  346. package/dist/data/chat/types.d.ts.map +1 -1
  347. package/dist/data/chat/types.js.map +1 -1
  348. package/dist/data/gauge-stats.cjs +19 -0
  349. package/dist/data/gauge-stats.cjs.map +1 -0
  350. package/dist/data/gauge-stats.d.ts +15 -0
  351. package/dist/data/gauge-stats.d.ts.map +1 -0
  352. package/dist/data/gauge-stats.js +19 -0
  353. package/dist/data/gauge-stats.js.map +1 -0
  354. package/dist/data/schema-viewer-model.cjs +436 -0
  355. package/dist/data/schema-viewer-model.cjs.map +1 -0
  356. package/dist/data/schema-viewer-model.d.ts +64 -0
  357. package/dist/data/schema-viewer-model.d.ts.map +1 -0
  358. package/dist/data/schema-viewer-model.js +436 -0
  359. package/dist/data/schema-viewer-model.js.map +1 -0
  360. package/dist/data/version-info.cjs +2 -2
  361. package/dist/data/version-info.js +2 -2
  362. package/dist/data.cjs +30 -0
  363. package/dist/data.cjs.map +1 -1
  364. package/dist/data.d.ts +14 -4
  365. package/dist/data.d.ts.map +1 -1
  366. package/dist/data.js +31 -1
  367. package/dist/data.js.map +1 -1
  368. package/dist/hooks/use-sort.cjs +19 -10
  369. package/dist/hooks/use-sort.cjs.map +1 -1
  370. package/dist/hooks/use-sort.d.ts +3 -0
  371. package/dist/hooks/use-sort.d.ts.map +1 -1
  372. package/dist/hooks/use-sort.js +19 -10
  373. package/dist/hooks/use-sort.js.map +1 -1
  374. package/dist/index.cjs +98 -2
  375. package/dist/index.cjs.map +1 -1
  376. package/dist/index.d.ts +1 -0
  377. package/dist/index.d.ts.map +1 -1
  378. package/dist/index.js +98 -2
  379. package/dist/index.js.map +1 -1
  380. package/dist/layout/AppShell.cjs +6 -10
  381. package/dist/layout/AppShell.cjs.map +1 -1
  382. package/dist/layout/AppShell.d.ts +2 -0
  383. package/dist/layout/AppShell.d.ts.map +1 -1
  384. package/dist/layout/AppShell.js +6 -10
  385. package/dist/layout/AppShell.js.map +1 -1
  386. package/dist/overlay/DropdownMenu.cjs +50 -38
  387. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  388. package/dist/overlay/DropdownMenu.d.ts +5 -1
  389. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  390. package/dist/overlay/DropdownMenu.js +50 -38
  391. package/dist/overlay/DropdownMenu.js.map +1 -1
  392. package/dist/overlay/HoverCard.cjs +7 -2
  393. package/dist/overlay/HoverCard.cjs.map +1 -1
  394. package/dist/overlay/HoverCard.d.ts.map +1 -1
  395. package/dist/overlay/HoverCard.js +7 -2
  396. package/dist/overlay/HoverCard.js.map +1 -1
  397. package/dist/overlay/Modal.cjs +20 -17
  398. package/dist/overlay/Modal.cjs.map +1 -1
  399. package/dist/overlay/Modal.d.ts.map +1 -1
  400. package/dist/overlay/Modal.js +21 -18
  401. package/dist/overlay/Modal.js.map +1 -1
  402. package/dist/overlay/Toast.cjs +9 -1
  403. package/dist/overlay/Toast.cjs.map +1 -1
  404. package/dist/overlay/Toast.d.ts.map +1 -1
  405. package/dist/overlay/Toast.js +9 -1
  406. package/dist/overlay/Toast.js.map +1 -1
  407. package/dist/overlay/modalStack.cjs +53 -1
  408. package/dist/overlay/modalStack.cjs.map +1 -1
  409. package/dist/overlay/modalStack.d.ts +12 -0
  410. package/dist/overlay/modalStack.d.ts.map +1 -1
  411. package/dist/overlay/modalStack.js +54 -2
  412. package/dist/overlay/modalStack.js.map +1 -1
  413. package/dist/overlay/zIndex.cjs +20 -0
  414. package/dist/overlay/zIndex.cjs.map +1 -0
  415. package/dist/overlay/zIndex.d.ts +39 -0
  416. package/dist/overlay/zIndex.d.ts.map +1 -0
  417. package/dist/overlay/zIndex.js +20 -0
  418. package/dist/overlay/zIndex.js.map +1 -0
  419. package/dist/rpc/EntityExplorerApp.cjs +102 -143
  420. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  421. package/dist/rpc/EntityExplorerApp.d.ts +34 -1
  422. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  423. package/dist/rpc/EntityExplorerApp.js +105 -146
  424. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  425. package/dist/rpc/OperationActionBar.cjs +135 -0
  426. package/dist/rpc/OperationActionBar.cjs.map +1 -0
  427. package/dist/rpc/OperationActionBar.d.ts +20 -0
  428. package/dist/rpc/OperationActionBar.d.ts.map +1 -0
  429. package/dist/rpc/OperationActionBar.js +135 -0
  430. package/dist/rpc/OperationActionBar.js.map +1 -0
  431. package/dist/rpc/OperationCatalog.cjs +79 -116
  432. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  433. package/dist/rpc/OperationCatalog.d.ts +8 -1
  434. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  435. package/dist/rpc/OperationCatalog.js +80 -117
  436. package/dist/rpc/OperationCatalog.js.map +1 -1
  437. package/dist/rpc/OperationCommandPage.cjs +134 -223
  438. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  439. package/dist/rpc/OperationCommandPage.d.ts +1 -1
  440. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  441. package/dist/rpc/OperationCommandPage.js +135 -224
  442. package/dist/rpc/OperationCommandPage.js.map +1 -1
  443. package/dist/rpc/OperationEntityPage.cjs +49 -100
  444. package/dist/rpc/OperationEntityPage.cjs.map +1 -1
  445. package/dist/rpc/OperationEntityPage.d.ts +6 -1
  446. package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
  447. package/dist/rpc/OperationEntityPage.js +50 -101
  448. package/dist/rpc/OperationEntityPage.js.map +1 -1
  449. package/dist/rpc/OperationResultView.cjs +43 -0
  450. package/dist/rpc/OperationResultView.cjs.map +1 -0
  451. package/dist/rpc/OperationResultView.d.ts +30 -0
  452. package/dist/rpc/OperationResultView.d.ts.map +1 -0
  453. package/dist/rpc/OperationResultView.js +43 -0
  454. package/dist/rpc/OperationResultView.js.map +1 -0
  455. package/dist/rpc/SchemaActionForm.cjs +102 -0
  456. package/dist/rpc/SchemaActionForm.cjs.map +1 -0
  457. package/dist/rpc/SchemaActionForm.d.ts +23 -0
  458. package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
  459. package/dist/rpc/SchemaActionForm.js +102 -0
  460. package/dist/rpc/SchemaActionForm.js.map +1 -0
  461. package/dist/rpc/accept-options.cjs.map +1 -1
  462. package/dist/rpc/accept-options.d.ts +0 -1
  463. package/dist/rpc/accept-options.d.ts.map +1 -1
  464. package/dist/rpc/accept-options.js.map +1 -1
  465. package/dist/rpc/apiClient.cjs +34 -2
  466. package/dist/rpc/apiClient.cjs.map +1 -1
  467. package/dist/rpc/apiClient.d.ts +4 -1
  468. package/dist/rpc/apiClient.d.ts.map +1 -1
  469. package/dist/rpc/apiClient.js +34 -2
  470. package/dist/rpc/apiClient.js.map +1 -1
  471. package/dist/rpc/clickyMetadata.cjs +4 -4
  472. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  473. package/dist/rpc/clickyMetadata.d.ts +0 -1
  474. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  475. package/dist/rpc/clickyMetadata.js +4 -4
  476. package/dist/rpc/clickyMetadata.js.map +1 -1
  477. package/dist/rpc/formMetadata.cjs +1 -0
  478. package/dist/rpc/formMetadata.cjs.map +1 -1
  479. package/dist/rpc/formMetadata.d.ts +6 -1
  480. package/dist/rpc/formMetadata.d.ts.map +1 -1
  481. package/dist/rpc/formMetadata.js +1 -0
  482. package/dist/rpc/formMetadata.js.map +1 -1
  483. package/dist/rpc/rowNavigation.cjs +86 -0
  484. package/dist/rpc/rowNavigation.cjs.map +1 -0
  485. package/dist/rpc/rowNavigation.d.ts +14 -0
  486. package/dist/rpc/rowNavigation.d.ts.map +1 -0
  487. package/dist/rpc/rowNavigation.js +86 -0
  488. package/dist/rpc/rowNavigation.js.map +1 -0
  489. package/dist/rpc/schemaActionPath.cjs +22 -0
  490. package/dist/rpc/schemaActionPath.cjs.map +1 -0
  491. package/dist/rpc/schemaActionPath.d.ts +4 -0
  492. package/dist/rpc/schemaActionPath.d.ts.map +1 -0
  493. package/dist/rpc/schemaActionPath.js +22 -0
  494. package/dist/rpc/schemaActionPath.js.map +1 -0
  495. package/dist/rpc/surfaceIconMap.cjs +35 -0
  496. package/dist/rpc/surfaceIconMap.cjs.map +1 -0
  497. package/dist/rpc/surfaceIconMap.d.ts +3 -0
  498. package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
  499. package/dist/rpc/surfaceIconMap.js +35 -0
  500. package/dist/rpc/surfaceIconMap.js.map +1 -0
  501. package/dist/rpc/types.cjs.map +1 -1
  502. package/dist/rpc/types.d.ts +2 -0
  503. package/dist/rpc/types.d.ts.map +1 -1
  504. package/dist/rpc/types.js.map +1 -1
  505. package/dist/rpc/useOperations.cjs.map +1 -1
  506. package/dist/rpc/useOperations.d.ts +4 -1
  507. package/dist/rpc/useOperations.d.ts.map +1 -1
  508. package/dist/rpc/useOperations.js.map +1 -1
  509. package/dist/rpc.cjs +4 -2
  510. package/dist/rpc.cjs.map +1 -1
  511. package/dist/rpc.d.ts +7 -6
  512. package/dist/rpc.d.ts.map +1 -1
  513. package/dist/rpc.js +4 -2
  514. package/dist/rpc.js.map +1 -1
  515. package/dist/styles.css +1 -1
  516. package/package.json +6 -1
  517. package/dist/rpc/AcceptPicker.cjs +0 -135
  518. package/dist/rpc/AcceptPicker.cjs.map +0 -1
  519. package/dist/rpc/AcceptPicker.d.ts +0 -12
  520. package/dist/rpc/AcceptPicker.d.ts.map +0 -1
  521. package/dist/rpc/AcceptPicker.js +0 -135
  522. package/dist/rpc/AcceptPicker.js.map +0 -1
@@ -0,0 +1,207 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ import { DropdownMenu } from "../overlay/DropdownMenu.js";
6
+ import { MentionTextarea } from "./MentionTextarea.js";
7
+ import { toneToBadgeTone } from "./comment-utils.js";
8
+ import { UiClose } from "../icons/components/UiClose.js";
9
+ import { UiArrowUp } from "../icons/components/UiArrowUp.js";
10
+ const FACET_DOT_CLASS = {
11
+ neutral: "bg-muted-foreground",
12
+ success: "bg-green-500",
13
+ danger: "bg-red-500",
14
+ warning: "bg-yellow-500",
15
+ info: "bg-blue-500"
16
+ };
17
+ function FacetPicker({
18
+ facet,
19
+ value,
20
+ onChange
21
+ }) {
22
+ const selected = facet.options.find((o) => o.value === value);
23
+ return /* @__PURE__ */ jsx(
24
+ DropdownMenu,
25
+ {
26
+ align: "left",
27
+ menuClassName: "min-w-[150px]",
28
+ trigger: /* @__PURE__ */ jsxs(
29
+ "span",
30
+ {
31
+ role: "button",
32
+ tabIndex: 0,
33
+ className: cn(
34
+ "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium transition-colors",
35
+ selected ? "bg-muted text-foreground" : "text-muted-foreground hover:bg-muted/60"
36
+ ),
37
+ children: [
38
+ selected ? selected.label : facet.label,
39
+ selected && /* @__PURE__ */ jsx(
40
+ "span",
41
+ {
42
+ role: "presentation",
43
+ className: "ml-0.5 cursor-pointer hover:text-foreground",
44
+ onClick: (e) => {
45
+ e.stopPropagation();
46
+ onChange(void 0);
47
+ },
48
+ children: "×"
49
+ }
50
+ )
51
+ ]
52
+ }
53
+ ),
54
+ children: (close) => /* @__PURE__ */ jsx("div", { className: "py-1", children: facet.options.map((option) => /* @__PURE__ */ jsxs(
55
+ "button",
56
+ {
57
+ type: "button",
58
+ onClick: () => {
59
+ onChange(option.value === value ? void 0 : option.value);
60
+ close();
61
+ },
62
+ className: cn(
63
+ "flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-popover-foreground hover:bg-accent hover:text-accent-foreground",
64
+ option.value === value && "bg-muted font-semibold"
65
+ ),
66
+ children: [
67
+ /* @__PURE__ */ jsx(
68
+ "span",
69
+ {
70
+ className: cn(
71
+ "inline-block size-2 rounded-full",
72
+ FACET_DOT_CLASS[toneToBadgeTone(option.tone)]
73
+ )
74
+ }
75
+ ),
76
+ option.label
77
+ ]
78
+ },
79
+ option.value
80
+ )) })
81
+ }
82
+ );
83
+ }
84
+ function CommentComposer({
85
+ config,
86
+ anchor,
87
+ collapsible = true,
88
+ autoFocus = false,
89
+ placeholder = "Add a comment…",
90
+ onCreate,
91
+ onMention
92
+ }) {
93
+ const [open, setOpen] = useState(!collapsible || autoFocus);
94
+ const [body, setBody] = useState("");
95
+ const [facets, setFacets] = useState({});
96
+ const mentionsRef = useRef(/* @__PURE__ */ new Map());
97
+ const inputRef = useRef(null);
98
+ function reset() {
99
+ setBody("");
100
+ setFacets({});
101
+ mentionsRef.current.clear();
102
+ }
103
+ function setFacet(key, value) {
104
+ setFacets((prev) => {
105
+ if (value === void 0) {
106
+ const { [key]: _drop, ...rest } = prev;
107
+ return rest;
108
+ }
109
+ return { ...prev, [key]: value };
110
+ });
111
+ }
112
+ async function submit() {
113
+ const text = body.trim();
114
+ if (!text) return;
115
+ const mentions = [...mentionsRef.current.values()].filter(
116
+ (m) => body.toLowerCase().includes(`@${m.name.toLowerCase()}`)
117
+ );
118
+ await (onCreate == null ? void 0 : onCreate({
119
+ body: text,
120
+ anchor: anchor ?? null,
121
+ ...Object.keys(facets).length > 0 ? { facets } : {},
122
+ ...mentions.length > 0 ? { mentions } : {}
123
+ }));
124
+ for (const mention of mentions) onMention == null ? void 0 : onMention(mention, { body: text });
125
+ reset();
126
+ if (collapsible) setOpen(false);
127
+ }
128
+ if (!open && body.trim().length === 0) {
129
+ return /* @__PURE__ */ jsx(
130
+ "button",
131
+ {
132
+ type: "button",
133
+ onClick: () => setOpen(true),
134
+ className: "w-full rounded-full border border-border bg-muted/25 px-4 py-2 text-left text-sm text-muted-foreground/70 shadow-sm transition-colors hover:border-primary/30 hover:bg-muted/40",
135
+ children: placeholder
136
+ }
137
+ );
138
+ }
139
+ return /* @__PURE__ */ jsxs(
140
+ "div",
141
+ {
142
+ "data-testid": "comment-compose-box",
143
+ className: "relative rounded-2xl border border-border bg-muted/25 px-3 pt-3 pb-10 shadow-sm transition-[border-color,box-shadow] focus-within:border-primary/40 focus-within:shadow-md",
144
+ children: [
145
+ /* @__PURE__ */ jsx(
146
+ MentionTextarea,
147
+ {
148
+ ref: inputRef,
149
+ value: body,
150
+ onChange: setBody,
151
+ mentionables: config.mentionables ?? [],
152
+ onMentionSelect: (m) => mentionsRef.current.set(m.id, m),
153
+ onSubmit: () => void submit(),
154
+ onCancel: () => {
155
+ reset();
156
+ if (collapsible) setOpen(false);
157
+ },
158
+ placeholder,
159
+ autoFocus: autoFocus || open,
160
+ "data-testid": "comment-compose-input",
161
+ className: "min-h-[48px] pr-10"
162
+ }
163
+ ),
164
+ collapsible && /* @__PURE__ */ jsx(
165
+ "button",
166
+ {
167
+ type: "button",
168
+ onClick: () => {
169
+ reset();
170
+ setOpen(false);
171
+ },
172
+ "aria-label": "Close composer",
173
+ className: "absolute right-3 top-3 rounded-full p-1 text-muted-foreground hover:bg-muted hover:text-foreground",
174
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "text-xs" })
175
+ }
176
+ ),
177
+ /* @__PURE__ */ jsxs("div", { className: "absolute inset-x-3 bottom-2.5 flex items-center gap-1.5", children: [
178
+ (config.facets ?? []).map((facet) => /* @__PURE__ */ jsx(
179
+ FacetPicker,
180
+ {
181
+ facet,
182
+ value: facets[facet.key],
183
+ onChange: (value) => setFacet(facet.key, value)
184
+ },
185
+ facet.key
186
+ )),
187
+ /* @__PURE__ */ jsx(
188
+ "button",
189
+ {
190
+ type: "button",
191
+ "data-testid": "comment-compose-send",
192
+ "aria-label": "Post comment",
193
+ onClick: () => void submit(),
194
+ disabled: !body.trim(),
195
+ className: "ml-auto inline-flex size-7 items-center justify-center rounded-full bg-primary text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground",
196
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiArrowUp, className: "text-xs" })
197
+ }
198
+ )
199
+ ] })
200
+ ]
201
+ }
202
+ );
203
+ }
204
+ export {
205
+ CommentComposer
206
+ };
207
+ //# sourceMappingURL=CommentComposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentComposer.js","sources":["../../src/comments/CommentComposer.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { UiArrowUp, UiClose } from \"../icons\";\nimport type { BadgeTone } from \"../data/Badge\";\nimport { MentionTextarea } from \"./MentionTextarea\";\nimport { toneToBadgeTone } from \"./comment-utils\";\nimport type {\n CommentAnchor,\n CommentConfig,\n CommentCreateInput,\n CommentFacet,\n CommentMention,\n} from \"./comment-types\";\n\n// Static literals so Tailwind's source scanner emits these utilities.\nconst FACET_DOT_CLASS: Record<BadgeTone, string> = {\n neutral: \"bg-muted-foreground\",\n success: \"bg-green-500\",\n danger: \"bg-red-500\",\n warning: \"bg-yellow-500\",\n info: \"bg-blue-500\",\n};\n\nexport type CommentComposerProps = {\n config: CommentConfig;\n /** Anchor stamped onto created comments. */\n anchor?: CommentAnchor | null;\n /** Start collapsed as an \"Add a comment…\" pill until clicked. */\n collapsible?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n /** Create a new root comment. */\n onCreate?: (input: CommentCreateInput) => void | Promise<void>;\n /** Fired once per mention referenced by a posted comment. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\nfunction FacetPicker({\n facet,\n value,\n onChange,\n}: {\n facet: CommentFacet;\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n}) {\n const selected = facet.options.find((o) => o.value === value);\n return (\n <DropdownMenu\n align=\"left\"\n menuClassName=\"min-w-[150px]\"\n trigger={\n <span\n role=\"button\"\n tabIndex={0}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium transition-colors\",\n selected\n ? \"bg-muted text-foreground\"\n : \"text-muted-foreground hover:bg-muted/60\",\n )}\n >\n {selected ? selected.label : facet.label}\n {selected && (\n <span\n role=\"presentation\"\n className=\"ml-0.5 cursor-pointer hover:text-foreground\"\n onClick={(e) => {\n e.stopPropagation();\n onChange(undefined);\n }}\n >\n ×\n </span>\n )}\n </span>\n }\n >\n {(close) => (\n <div className=\"py-1\">\n {facet.options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => {\n onChange(option.value === value ? undefined : option.value);\n close();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-popover-foreground hover:bg-accent hover:text-accent-foreground\",\n option.value === value && \"bg-muted font-semibold\",\n )}\n >\n <span\n className={cn(\n \"inline-block size-2 rounded-full\",\n FACET_DOT_CLASS[toneToBadgeTone(option.tone)],\n )}\n />\n {option.label}\n </button>\n ))}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\n/**\n * The new-comment composer: a mention-aware textarea, one picker per configured\n * facet, and a send button. Starts as a pill when `collapsible`. Owns only its\n * own draft state; posting is delegated to `onCreate`.\n */\nexport function CommentComposer({\n config,\n anchor,\n collapsible = true,\n autoFocus = false,\n placeholder = \"Add a comment…\",\n onCreate,\n onMention,\n}: CommentComposerProps) {\n const [open, setOpen] = useState(!collapsible || autoFocus);\n const [body, setBody] = useState(\"\");\n const [facets, setFacets] = useState<Record<string, string>>({});\n const mentionsRef = useRef<Map<string, CommentMention>>(new Map());\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n function reset() {\n setBody(\"\");\n setFacets({});\n mentionsRef.current.clear();\n }\n\n function setFacet(key: string, value: string | undefined) {\n setFacets((prev) => {\n if (value === undefined) {\n const { [key]: _drop, ...rest } = prev;\n return rest;\n }\n return { ...prev, [key]: value };\n });\n }\n\n async function submit() {\n const text = body.trim();\n if (!text) return;\n const mentions = [...mentionsRef.current.values()].filter((m) =>\n body.toLowerCase().includes(`@${m.name.toLowerCase()}`),\n );\n await onCreate?.({\n body: text,\n anchor: anchor ?? null,\n ...(Object.keys(facets).length > 0 ? { facets } : {}),\n ...(mentions.length > 0 ? { mentions } : {}),\n });\n for (const mention of mentions) onMention?.(mention, { body: text });\n reset();\n if (collapsible) setOpen(false);\n }\n\n if (!open && body.trim().length === 0) {\n return (\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"w-full rounded-full border border-border bg-muted/25 px-4 py-2 text-left text-sm text-muted-foreground/70 shadow-sm transition-colors hover:border-primary/30 hover:bg-muted/40\"\n >\n {placeholder}\n </button>\n );\n }\n\n return (\n <div\n data-testid=\"comment-compose-box\"\n className=\"relative rounded-2xl border border-border bg-muted/25 px-3 pt-3 pb-10 shadow-sm transition-[border-color,box-shadow] focus-within:border-primary/40 focus-within:shadow-md\"\n >\n <MentionTextarea\n ref={inputRef}\n value={body}\n onChange={setBody}\n mentionables={config.mentionables ?? []}\n onMentionSelect={(m) => mentionsRef.current.set(m.id, m)}\n onSubmit={() => void submit()}\n onCancel={() => {\n reset();\n if (collapsible) setOpen(false);\n }}\n placeholder={placeholder}\n autoFocus={autoFocus || open}\n data-testid=\"comment-compose-input\"\n className=\"min-h-[48px] pr-10\"\n />\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => {\n reset();\n setOpen(false);\n }}\n aria-label=\"Close composer\"\n className=\"absolute right-3 top-3 rounded-full p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Icon icon={UiClose} className=\"text-xs\" />\n </button>\n )}\n <div className=\"absolute inset-x-3 bottom-2.5 flex items-center gap-1.5\">\n {(config.facets ?? []).map((facet) => (\n <FacetPicker\n key={facet.key}\n facet={facet}\n value={facets[facet.key]}\n onChange={(value) => setFacet(facet.key, value)}\n />\n ))}\n <button\n type=\"button\"\n data-testid=\"comment-compose-send\"\n aria-label=\"Post comment\"\n onClick={() => void submit()}\n disabled={!body.trim()}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-full bg-primary text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground\"\n >\n <Icon icon={UiArrowUp} className=\"text-xs\" />\n </button>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAiBA,MAAM,kBAA6C;AAAA,EACjD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR;AAgBA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AAC5D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,eAAc;AAAA,MACd,SACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,WAAW;AAAA,YACT;AAAA,YACA,WACI,6BACA;AAAA,UAAA;AAAA,UAGL,UAAA;AAAA,YAAA,WAAW,SAAS,QAAQ,MAAM;AAAA,YAClC,YACC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAA;AACF,2BAAS,MAAS;AAAA,gBACpB;AAAA,gBACD,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED;AAAA,QAAA;AAAA,MAAA;AAAA,MAKL,UAAA,CAAC,UACA,oBAAC,OAAA,EAAI,WAAU,QACZ,UAAA,MAAM,QAAQ,IAAI,CAAC,WAClB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,SAAS,MAAM;AACb,qBAAS,OAAO,UAAU,QAAQ,SAAY,OAAO,KAAK;AAC1D,kBAAA;AAAA,UACF;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA,OAAO,UAAU,SAAS;AAAA,UAAA;AAAA,UAG5B,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,gBAAgB,gBAAgB,OAAO,IAAI,CAAC;AAAA,gBAAA;AAAA,cAC9C;AAAA,YAAA;AAAA,YAED,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAjBH,OAAO;AAAA,MAAA,CAmBf,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR;AAOO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC,eAAe,SAAS;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE;AACnC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiC,CAAA,CAAE;AAC/D,QAAM,cAAc,OAAoC,oBAAI,KAAK;AACjE,QAAM,WAAW,OAA4B,IAAI;AAEjD,WAAS,QAAQ;AACf,YAAQ,EAAE;AACV,cAAU,CAAA,CAAE;AACZ,gBAAY,QAAQ,MAAA;AAAA,EACtB;AAEA,WAAS,SAAS,KAAa,OAA2B;AACxD,cAAU,CAAC,SAAS;AAClB,UAAI,UAAU,QAAW;AACvB,cAAM,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,SAAS;AAClC,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAA;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,iBAAe,SAAS;AACtB,UAAM,OAAO,KAAK,KAAA;AAClB,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,CAAC,GAAG,YAAY,QAAQ,OAAA,CAAQ,EAAE;AAAA,MAAO,CAAC,MACzD,KAAK,YAAA,EAAc,SAAS,IAAI,EAAE,KAAK,YAAA,CAAa,EAAE;AAAA,IAAA;AAExD,WAAM,qCAAW;AAAA,MACf,MAAM;AAAA,MACN,QAAQ,UAAU;AAAA,MAClB,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAA,IAAW,CAAA;AAAA,MAClD,GAAI,SAAS,SAAS,IAAI,EAAE,SAAA,IAAa,CAAA;AAAA,IAAC;AAE5C,eAAW,WAAW,SAAU,wCAAY,SAAS,EAAE,MAAM;AAC7D,UAAA;AACA,QAAI,qBAAqB,KAAK;AAAA,EAChC;AAEA,MAAI,CAAC,QAAQ,KAAK,KAAA,EAAO,WAAW,GAAG;AACrC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,QAAQ,IAAI;AAAA,QAC3B,WAAU;AAAA,QAET,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,cAAc,OAAO,gBAAgB,CAAA;AAAA,YACrC,iBAAiB,CAAC,MAAM,YAAY,QAAQ,IAAI,EAAE,IAAI,CAAC;AAAA,YACvD,UAAU,MAAM,KAAK,OAAA;AAAA,YACrB,UAAU,MAAM;AACd,oBAAA;AACA,kBAAI,qBAAqB,KAAK;AAAA,YAChC;AAAA,YACA;AAAA,YACA,WAAW,aAAa;AAAA,YACxB,eAAY;AAAA,YACZ,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAEX,eACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,oBAAA;AACA,sBAAQ,KAAK;AAAA,YACf;AAAA,YACA,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,UAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAG7C,qBAAC,OAAA,EAAI,WAAU,2DACX,UAAA;AAAA,WAAA,OAAO,UAAU,CAAA,GAAI,IAAI,CAAC,UAC1B;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC;AAAA,cACA,OAAO,OAAO,MAAM,GAAG;AAAA,cACvB,UAAU,CAAC,UAAU,SAAS,MAAM,KAAK,KAAK;AAAA,YAAA;AAAA,YAHzC,MAAM;AAAA,UAAA,CAKd;AAAA,UACD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,eAAY;AAAA,cACZ,cAAW;AAAA,cACX,SAAS,MAAM,KAAK,OAAA;AAAA,cACpB,UAAU,CAAC,KAAK,KAAA;AAAA,cAChB,WAAU;AAAA,cAEV,UAAA,oBAAC,MAAA,EAAK,MAAM,WAAW,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7C,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,145 @@
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 DropdownMenu = require("../overlay/DropdownMenu.cjs");
6
+ const Icon = require("../data/Icon.cjs");
7
+ const commentUtils = require("./comment-utils.cjs");
8
+ const UiClose = require("../icons/components/UiClose.cjs");
9
+ const UiCheck = require("../icons/components/UiCheck.cjs");
10
+ function toggleInSet(set, value) {
11
+ const next = new Set(set);
12
+ if (next.has(value)) next.delete(value);
13
+ else next.add(value);
14
+ return next;
15
+ }
16
+ function StatusToggle({
17
+ value,
18
+ active,
19
+ config,
20
+ count,
21
+ onClick
22
+ }) {
23
+ const cfg = commentUtils.resolveStatusConfig(config, value);
24
+ if (!cfg) return null;
25
+ return /* @__PURE__ */ jsxRuntime.jsxs(
26
+ "button",
27
+ {
28
+ type: "button",
29
+ onClick,
30
+ "aria-pressed": active,
31
+ className: utils.cn(
32
+ "inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-colors",
33
+ active ? "border-primary bg-primary/10 text-foreground" : "border-border bg-background text-muted-foreground hover:text-foreground"
34
+ ),
35
+ children: [
36
+ cfg.icon && /* @__PURE__ */ jsxRuntime.jsx(
37
+ Icon.Icon,
38
+ {
39
+ ...typeof cfg.icon === "string" ? { name: cfg.icon } : { icon: cfg.icon },
40
+ className: "text-[10px]"
41
+ }
42
+ ),
43
+ cfg.label,
44
+ count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: count })
45
+ ]
46
+ }
47
+ );
48
+ }
49
+ function FacetFilter({
50
+ facet,
51
+ selected,
52
+ onChange
53
+ }) {
54
+ const label = selected.size > 0 ? `${facet.label} (${selected.size})` : facet.label;
55
+ return /* @__PURE__ */ jsxRuntime.jsx(
56
+ DropdownMenu.DropdownMenu,
57
+ {
58
+ label,
59
+ size: "sm",
60
+ variant: selected.size > 0 ? "secondary" : "outline",
61
+ menuClassName: "min-w-[170px]",
62
+ children: () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-1", children: facet.options.map((option) => {
63
+ const checked = selected.has(option.value);
64
+ return /* @__PURE__ */ jsxRuntime.jsxs(
65
+ "button",
66
+ {
67
+ type: "button",
68
+ onClick: () => onChange(toggleInSet(selected, option.value)),
69
+ className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-popover-foreground hover:bg-accent hover:text-accent-foreground",
70
+ children: [
71
+ /* @__PURE__ */ jsxRuntime.jsx(
72
+ "span",
73
+ {
74
+ className: utils.cn(
75
+ "inline-flex size-3.5 items-center justify-center rounded border",
76
+ checked ? "border-primary bg-primary text-primary-foreground" : "border-border"
77
+ ),
78
+ children: checked && /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck, className: "text-[9px]" })
79
+ }
80
+ ),
81
+ option.label
82
+ ]
83
+ },
84
+ option.value
85
+ );
86
+ }) })
87
+ }
88
+ );
89
+ }
90
+ function CommentFilterBar({
91
+ config,
92
+ filters,
93
+ onChange,
94
+ statusCounts
95
+ }) {
96
+ function setStatuses(next) {
97
+ onChange({ ...filters, statuses: next });
98
+ }
99
+ function setFacet(key, next) {
100
+ onChange({ ...filters, facets: { ...filters.facets, [key]: next } });
101
+ }
102
+ return /* @__PURE__ */ jsxRuntime.jsxs(
103
+ "div",
104
+ {
105
+ className: "flex flex-wrap items-center gap-1.5",
106
+ "data-testid": "comment-filter-bar",
107
+ children: [
108
+ config.statuses.map((status) => /* @__PURE__ */ jsxRuntime.jsx(
109
+ StatusToggle,
110
+ {
111
+ value: status.value,
112
+ active: filters.statuses.has(status.value),
113
+ config,
114
+ ...(statusCounts == null ? void 0 : statusCounts[status.value]) !== void 0 ? { count: statusCounts[status.value] } : {},
115
+ onClick: () => setStatuses(toggleInSet(filters.statuses, status.value))
116
+ },
117
+ status.value
118
+ )),
119
+ (config.facets ?? []).map((facet) => /* @__PURE__ */ jsxRuntime.jsx(
120
+ FacetFilter,
121
+ {
122
+ facet,
123
+ selected: filters.facets[facet.key] ?? /* @__PURE__ */ new Set(),
124
+ onChange: (next) => setFacet(facet.key, next)
125
+ },
126
+ facet.key
127
+ )),
128
+ commentUtils.hasActiveFilters(filters) && /* @__PURE__ */ jsxRuntime.jsxs(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ onClick: () => onChange({ statuses: /* @__PURE__ */ new Set(), facets: {}, authorKind: "all" }),
133
+ className: "inline-flex items-center gap-1 rounded-full px-2 py-1 text-[11px] text-muted-foreground hover:text-foreground",
134
+ children: [
135
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose, className: "text-[10px]" }),
136
+ " Clear"
137
+ ]
138
+ }
139
+ )
140
+ ]
141
+ }
142
+ );
143
+ }
144
+ exports.CommentFilterBar = CommentFilterBar;
145
+ //# sourceMappingURL=CommentFilterBar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentFilterBar.cjs","sources":["../../src/comments/CommentFilterBar.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiClose } from \"../icons\";\nimport { hasActiveFilters, resolveStatusConfig } from \"./comment-utils\";\nimport type {\n CommentConfig,\n CommentFacet,\n CommentFilters,\n} from \"./comment-types\";\n\nexport type CommentFilterBarProps = {\n config: CommentConfig;\n filters: CommentFilters;\n onChange: (filters: CommentFilters) => void;\n /** Optional per-status counts shown on the toggles. */\n statusCounts?: Record<string, number>;\n};\n\nfunction toggleInSet(set: Set<string>, value: string): Set<string> {\n const next = new Set(set);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n}\n\nfunction StatusToggle({\n value,\n active,\n config,\n count,\n onClick,\n}: {\n value: string;\n active: boolean;\n config: CommentConfig;\n count?: number;\n onClick: () => void;\n}) {\n const cfg = resolveStatusConfig(config, value);\n if (!cfg) return null;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-colors\",\n active\n ? \"border-primary bg-primary/10 text-foreground\"\n : \"border-border bg-background text-muted-foreground hover:text-foreground\",\n )}\n >\n {cfg.icon && (\n <Icon\n {...(typeof cfg.icon === \"string\"\n ? { name: cfg.icon }\n : { icon: cfg.icon })}\n className=\"text-[10px]\"\n />\n )}\n {cfg.label}\n {count !== undefined && (\n <span className=\"text-muted-foreground\">{count}</span>\n )}\n </button>\n );\n}\n\nfunction FacetFilter({\n facet,\n selected,\n onChange,\n}: {\n facet: CommentFacet;\n selected: Set<string>;\n onChange: (next: Set<string>) => void;\n}) {\n const label =\n selected.size > 0 ? `${facet.label} (${selected.size})` : facet.label;\n return (\n <DropdownMenu\n label={label}\n size=\"sm\"\n variant={selected.size > 0 ? \"secondary\" : \"outline\"}\n menuClassName=\"min-w-[170px]\"\n >\n {() => (\n <div className=\"py-1\">\n {facet.options.map((option) => {\n const checked = selected.has(option.value);\n return (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onChange(toggleInSet(selected, option.value))}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <span\n className={cn(\n \"inline-flex size-3.5 items-center justify-center rounded border\",\n checked\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border\",\n )}\n >\n {checked && <Icon icon={UiCheck} className=\"text-[9px]\" />}\n </span>\n {option.label}\n </button>\n );\n })}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\n/**\n * Filter controls for a comment list: status toggle pills, a multi-select per\n * configured facet, and a clear action. Fully controlled via `filters` /\n * `onChange`; pair with `applyCommentFilters` to filter the data.\n */\nexport function CommentFilterBar({\n config,\n filters,\n onChange,\n statusCounts,\n}: CommentFilterBarProps) {\n function setStatuses(next: Set<string>) {\n onChange({ ...filters, statuses: next });\n }\n function setFacet(key: string, next: Set<string>) {\n onChange({ ...filters, facets: { ...filters.facets, [key]: next } });\n }\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1.5\"\n data-testid=\"comment-filter-bar\"\n >\n {config.statuses.map((status) => (\n <StatusToggle\n key={status.value}\n value={status.value}\n active={filters.statuses.has(status.value)}\n config={config}\n {...(statusCounts?.[status.value] !== undefined\n ? { count: statusCounts[status.value] }\n : {})}\n onClick={() =>\n setStatuses(toggleInSet(filters.statuses, status.value))\n }\n />\n ))}\n {(config.facets ?? []).map((facet) => (\n <FacetFilter\n key={facet.key}\n facet={facet}\n selected={filters.facets[facet.key] ?? new Set()}\n onChange={(next) => setFacet(facet.key, next)}\n />\n ))}\n {hasActiveFilters(filters) && (\n <button\n type=\"button\"\n onClick={() =>\n onChange({ statuses: new Set(), facets: {}, authorKind: \"all\" })\n }\n className=\"inline-flex items-center gap-1 rounded-full px-2 py-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <Icon icon={UiClose} className=\"text-[10px]\" /> Clear\n </button>\n )}\n </div>\n );\n}\n"],"names":["resolveStatusConfig","jsxs","cn","jsx","Icon","DropdownMenu","UiCheck","hasActiveFilters","UiClose"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { CommentConfig, CommentFilters } from './comment-types';
2
+ export type CommentFilterBarProps = {
3
+ config: CommentConfig;
4
+ filters: CommentFilters;
5
+ onChange: (filters: CommentFilters) => void;
6
+ /** Optional per-status counts shown on the toggles. */
7
+ statusCounts?: Record<string, number>;
8
+ };
9
+ /**
10
+ * Filter controls for a comment list: status toggle pills, a multi-select per
11
+ * configured facet, and a clear action. Fully controlled via `filters` /
12
+ * `onChange`; pair with `applyCommentFilters` to filter the data.
13
+ */
14
+ export declare function CommentFilterBar({ config, filters, onChange, statusCounts, }: CommentFilterBarProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=CommentFilterBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentFilterBar.d.ts","sourceRoot":"","sources":["../../src/comments/CommentFilterBar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC5C,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAAC;AAqGF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,YAAY,GACb,EAAE,qBAAqB,2CAgDvB"}
@@ -0,0 +1,145 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ import { DropdownMenu } from "../overlay/DropdownMenu.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ import { hasActiveFilters, resolveStatusConfig } from "./comment-utils.js";
6
+ import { UiClose } from "../icons/components/UiClose.js";
7
+ import { UiCheck } from "../icons/components/UiCheck.js";
8
+ function toggleInSet(set, value) {
9
+ const next = new Set(set);
10
+ if (next.has(value)) next.delete(value);
11
+ else next.add(value);
12
+ return next;
13
+ }
14
+ function StatusToggle({
15
+ value,
16
+ active,
17
+ config,
18
+ count,
19
+ onClick
20
+ }) {
21
+ const cfg = resolveStatusConfig(config, value);
22
+ if (!cfg) return null;
23
+ return /* @__PURE__ */ jsxs(
24
+ "button",
25
+ {
26
+ type: "button",
27
+ onClick,
28
+ "aria-pressed": active,
29
+ className: cn(
30
+ "inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-colors",
31
+ active ? "border-primary bg-primary/10 text-foreground" : "border-border bg-background text-muted-foreground hover:text-foreground"
32
+ ),
33
+ children: [
34
+ cfg.icon && /* @__PURE__ */ jsx(
35
+ Icon,
36
+ {
37
+ ...typeof cfg.icon === "string" ? { name: cfg.icon } : { icon: cfg.icon },
38
+ className: "text-[10px]"
39
+ }
40
+ ),
41
+ cfg.label,
42
+ count !== void 0 && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: count })
43
+ ]
44
+ }
45
+ );
46
+ }
47
+ function FacetFilter({
48
+ facet,
49
+ selected,
50
+ onChange
51
+ }) {
52
+ const label = selected.size > 0 ? `${facet.label} (${selected.size})` : facet.label;
53
+ return /* @__PURE__ */ jsx(
54
+ DropdownMenu,
55
+ {
56
+ label,
57
+ size: "sm",
58
+ variant: selected.size > 0 ? "secondary" : "outline",
59
+ menuClassName: "min-w-[170px]",
60
+ children: () => /* @__PURE__ */ jsx("div", { className: "py-1", children: facet.options.map((option) => {
61
+ const checked = selected.has(option.value);
62
+ return /* @__PURE__ */ jsxs(
63
+ "button",
64
+ {
65
+ type: "button",
66
+ onClick: () => onChange(toggleInSet(selected, option.value)),
67
+ className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-popover-foreground hover:bg-accent hover:text-accent-foreground",
68
+ children: [
69
+ /* @__PURE__ */ jsx(
70
+ "span",
71
+ {
72
+ className: cn(
73
+ "inline-flex size-3.5 items-center justify-center rounded border",
74
+ checked ? "border-primary bg-primary text-primary-foreground" : "border-border"
75
+ ),
76
+ children: checked && /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "text-[9px]" })
77
+ }
78
+ ),
79
+ option.label
80
+ ]
81
+ },
82
+ option.value
83
+ );
84
+ }) })
85
+ }
86
+ );
87
+ }
88
+ function CommentFilterBar({
89
+ config,
90
+ filters,
91
+ onChange,
92
+ statusCounts
93
+ }) {
94
+ function setStatuses(next) {
95
+ onChange({ ...filters, statuses: next });
96
+ }
97
+ function setFacet(key, next) {
98
+ onChange({ ...filters, facets: { ...filters.facets, [key]: next } });
99
+ }
100
+ return /* @__PURE__ */ jsxs(
101
+ "div",
102
+ {
103
+ className: "flex flex-wrap items-center gap-1.5",
104
+ "data-testid": "comment-filter-bar",
105
+ children: [
106
+ config.statuses.map((status) => /* @__PURE__ */ jsx(
107
+ StatusToggle,
108
+ {
109
+ value: status.value,
110
+ active: filters.statuses.has(status.value),
111
+ config,
112
+ ...(statusCounts == null ? void 0 : statusCounts[status.value]) !== void 0 ? { count: statusCounts[status.value] } : {},
113
+ onClick: () => setStatuses(toggleInSet(filters.statuses, status.value))
114
+ },
115
+ status.value
116
+ )),
117
+ (config.facets ?? []).map((facet) => /* @__PURE__ */ jsx(
118
+ FacetFilter,
119
+ {
120
+ facet,
121
+ selected: filters.facets[facet.key] ?? /* @__PURE__ */ new Set(),
122
+ onChange: (next) => setFacet(facet.key, next)
123
+ },
124
+ facet.key
125
+ )),
126
+ hasActiveFilters(filters) && /* @__PURE__ */ jsxs(
127
+ "button",
128
+ {
129
+ type: "button",
130
+ onClick: () => onChange({ statuses: /* @__PURE__ */ new Set(), facets: {}, authorKind: "all" }),
131
+ className: "inline-flex items-center gap-1 rounded-full px-2 py-1 text-[11px] text-muted-foreground hover:text-foreground",
132
+ children: [
133
+ /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "text-[10px]" }),
134
+ " Clear"
135
+ ]
136
+ }
137
+ )
138
+ ]
139
+ }
140
+ );
141
+ }
142
+ export {
143
+ CommentFilterBar
144
+ };
145
+ //# sourceMappingURL=CommentFilterBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentFilterBar.js","sources":["../../src/comments/CommentFilterBar.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiClose } from \"../icons\";\nimport { hasActiveFilters, resolveStatusConfig } from \"./comment-utils\";\nimport type {\n CommentConfig,\n CommentFacet,\n CommentFilters,\n} from \"./comment-types\";\n\nexport type CommentFilterBarProps = {\n config: CommentConfig;\n filters: CommentFilters;\n onChange: (filters: CommentFilters) => void;\n /** Optional per-status counts shown on the toggles. */\n statusCounts?: Record<string, number>;\n};\n\nfunction toggleInSet(set: Set<string>, value: string): Set<string> {\n const next = new Set(set);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n}\n\nfunction StatusToggle({\n value,\n active,\n config,\n count,\n onClick,\n}: {\n value: string;\n active: boolean;\n config: CommentConfig;\n count?: number;\n onClick: () => void;\n}) {\n const cfg = resolveStatusConfig(config, value);\n if (!cfg) return null;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-colors\",\n active\n ? \"border-primary bg-primary/10 text-foreground\"\n : \"border-border bg-background text-muted-foreground hover:text-foreground\",\n )}\n >\n {cfg.icon && (\n <Icon\n {...(typeof cfg.icon === \"string\"\n ? { name: cfg.icon }\n : { icon: cfg.icon })}\n className=\"text-[10px]\"\n />\n )}\n {cfg.label}\n {count !== undefined && (\n <span className=\"text-muted-foreground\">{count}</span>\n )}\n </button>\n );\n}\n\nfunction FacetFilter({\n facet,\n selected,\n onChange,\n}: {\n facet: CommentFacet;\n selected: Set<string>;\n onChange: (next: Set<string>) => void;\n}) {\n const label =\n selected.size > 0 ? `${facet.label} (${selected.size})` : facet.label;\n return (\n <DropdownMenu\n label={label}\n size=\"sm\"\n variant={selected.size > 0 ? \"secondary\" : \"outline\"}\n menuClassName=\"min-w-[170px]\"\n >\n {() => (\n <div className=\"py-1\">\n {facet.options.map((option) => {\n const checked = selected.has(option.value);\n return (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onChange(toggleInSet(selected, option.value))}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-[11px] text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <span\n className={cn(\n \"inline-flex size-3.5 items-center justify-center rounded border\",\n checked\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border\",\n )}\n >\n {checked && <Icon icon={UiCheck} className=\"text-[9px]\" />}\n </span>\n {option.label}\n </button>\n );\n })}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\n/**\n * Filter controls for a comment list: status toggle pills, a multi-select per\n * configured facet, and a clear action. Fully controlled via `filters` /\n * `onChange`; pair with `applyCommentFilters` to filter the data.\n */\nexport function CommentFilterBar({\n config,\n filters,\n onChange,\n statusCounts,\n}: CommentFilterBarProps) {\n function setStatuses(next: Set<string>) {\n onChange({ ...filters, statuses: next });\n }\n function setFacet(key: string, next: Set<string>) {\n onChange({ ...filters, facets: { ...filters.facets, [key]: next } });\n }\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1.5\"\n data-testid=\"comment-filter-bar\"\n >\n {config.statuses.map((status) => (\n <StatusToggle\n key={status.value}\n value={status.value}\n active={filters.statuses.has(status.value)}\n config={config}\n {...(statusCounts?.[status.value] !== undefined\n ? { count: statusCounts[status.value] }\n : {})}\n onClick={() =>\n setStatuses(toggleInSet(filters.statuses, status.value))\n }\n />\n ))}\n {(config.facets ?? []).map((facet) => (\n <FacetFilter\n key={facet.key}\n facet={facet}\n selected={filters.facets[facet.key] ?? new Set()}\n onChange={(next) => setFacet(facet.key, next)}\n />\n ))}\n {hasActiveFilters(filters) && (\n <button\n type=\"button\"\n onClick={() =>\n onChange({ statuses: new Set(), facets: {}, authorKind: \"all\" })\n }\n className=\"inline-flex items-center gap-1 rounded-full px-2 py-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <Icon icon={UiClose} className=\"text-[10px]\" /> Clear\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}