@flanksource/clicky-ui 0.3.40 → 0.3.42

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 (759) hide show
  1. package/README.md +24 -0
  2. package/dist/ai.cjs +14 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +14 -0
  5. package/dist/ai.js.map +1 -1
  6. package/dist/comments/CommentCard.cjs +3 -1
  7. package/dist/comments/CommentCard.cjs.map +1 -1
  8. package/dist/comments/CommentCard.d.ts.map +1 -1
  9. package/dist/comments/CommentCard.js +4 -2
  10. package/dist/comments/CommentCard.js.map +1 -1
  11. package/dist/comments/CommentCardParts.cjs +16 -0
  12. package/dist/comments/CommentCardParts.cjs.map +1 -1
  13. package/dist/comments/CommentCardParts.d.ts +4 -1
  14. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  15. package/dist/comments/CommentCardParts.js +16 -0
  16. package/dist/comments/CommentCardParts.js.map +1 -1
  17. package/dist/comments/comment-types.cjs.map +1 -1
  18. package/dist/comments/comment-types.d.ts +4 -0
  19. package/dist/comments/comment-types.d.ts.map +1 -1
  20. package/dist/comments/comment-types.js.map +1 -1
  21. package/dist/components/AccordionList.cjs +5 -1
  22. package/dist/components/AccordionList.cjs.map +1 -1
  23. package/dist/components/AccordionList.d.ts +3 -1
  24. package/dist/components/AccordionList.d.ts.map +1 -1
  25. package/dist/components/AccordionList.js +5 -1
  26. package/dist/components/AccordionList.js.map +1 -1
  27. package/dist/components/Combobox.cjs +54 -8
  28. package/dist/components/Combobox.cjs.map +1 -1
  29. package/dist/components/Combobox.d.ts.map +1 -1
  30. package/dist/components/Combobox.js +56 -10
  31. package/dist/components/Combobox.js.map +1 -1
  32. package/dist/components/ComboboxMenu.cjs +139 -113
  33. package/dist/components/ComboboxMenu.cjs.map +1 -1
  34. package/dist/components/ComboboxMenu.d.ts +3 -1
  35. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  36. package/dist/components/ComboboxMenu.js +139 -113
  37. package/dist/components/ComboboxMenu.js.map +1 -1
  38. package/dist/components/ComboboxMenuTrigger.cjs +87 -0
  39. package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
  40. package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
  41. package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
  42. package/dist/components/ComboboxMenuTrigger.js +87 -0
  43. package/dist/components/ComboboxMenuTrigger.js.map +1 -0
  44. package/dist/components/JsonSchemaForm.cjs +39 -11
  45. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  46. package/dist/components/JsonSchemaForm.d.ts +1 -1
  47. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  48. package/dist/components/JsonSchemaForm.js +38 -10
  49. package/dist/components/JsonSchemaForm.js.map +1 -1
  50. package/dist/components/SegmentedControl.cjs +20 -3
  51. package/dist/components/SegmentedControl.cjs.map +1 -1
  52. package/dist/components/SegmentedControl.d.ts +11 -0
  53. package/dist/components/SegmentedControl.d.ts.map +1 -1
  54. package/dist/components/SegmentedControl.js +21 -4
  55. package/dist/components/SegmentedControl.js.map +1 -1
  56. package/dist/components/combobox-types.d.ts +8 -0
  57. package/dist/components/combobox-types.d.ts.map +1 -1
  58. package/dist/components/json-schema-form-accordion-array.cjs +3 -1
  59. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  60. package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
  61. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  62. package/dist/components/json-schema-form-accordion-array.js +3 -1
  63. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  64. package/dist/components/json-schema-form-array-view.cjs +63 -0
  65. package/dist/components/json-schema-form-array-view.cjs.map +1 -0
  66. package/dist/components/json-schema-form-array-view.d.ts +21 -0
  67. package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
  68. package/dist/components/json-schema-form-array-view.js +63 -0
  69. package/dist/components/json-schema-form-array-view.js.map +1 -0
  70. package/dist/components/json-schema-form-array.cjs +3 -7
  71. package/dist/components/json-schema-form-array.cjs.map +1 -1
  72. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  73. package/dist/components/json-schema-form-array.js +3 -7
  74. package/dist/components/json-schema-form-array.js.map +1 -1
  75. package/dist/components/json-schema-form-conditionals.cjs +67 -0
  76. package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
  77. package/dist/components/json-schema-form-conditionals.d.ts +9 -0
  78. package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
  79. package/dist/components/json-schema-form-conditionals.js +67 -0
  80. package/dist/components/json-schema-form-conditionals.js.map +1 -0
  81. package/dist/components/json-schema-form-debug-badge.cjs +108 -0
  82. package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
  83. package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
  84. package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
  85. package/dist/components/json-schema-form-debug-badge.js +108 -0
  86. package/dist/components/json-schema-form-debug-badge.js.map +1 -0
  87. package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
  88. package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
  89. package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
  90. package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
  91. package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
  92. package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
  93. package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
  94. package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
  95. package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
  96. package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
  97. package/dist/components/json-schema-form-debug-glyph.js +13 -0
  98. package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
  99. package/dist/components/json-schema-form-debug-groups.cjs +56 -0
  100. package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
  101. package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
  102. package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
  103. package/dist/components/json-schema-form-debug-groups.js +56 -0
  104. package/dist/components/json-schema-form-debug-groups.js.map +1 -0
  105. package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
  106. package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
  107. package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
  108. package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
  109. package/dist/components/json-schema-form-debug-keywords.js +159 -0
  110. package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
  111. package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
  112. package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
  113. package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
  114. package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
  115. package/dist/components/json-schema-form-debug-listeners.js +102 -0
  116. package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
  117. package/dist/components/json-schema-form-debug.cjs +31 -0
  118. package/dist/components/json-schema-form-debug.cjs.map +1 -0
  119. package/dist/components/json-schema-form-debug.d.ts +11 -0
  120. package/dist/components/json-schema-form-debug.d.ts.map +1 -0
  121. package/dist/components/json-schema-form-debug.js +31 -0
  122. package/dist/components/json-schema-form-debug.js.map +1 -0
  123. package/dist/components/json-schema-form-defaults.cjs +68 -0
  124. package/dist/components/json-schema-form-defaults.cjs.map +1 -0
  125. package/dist/components/json-schema-form-defaults.d.ts +4 -0
  126. package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
  127. package/dist/components/json-schema-form-defaults.js +68 -0
  128. package/dist/components/json-schema-form-defaults.js.map +1 -0
  129. package/dist/components/json-schema-form-enum-choice.cjs +114 -0
  130. package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
  131. package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
  132. package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
  133. package/dist/components/json-schema-form-enum-choice.js +114 -0
  134. package/dist/components/json-schema-form-enum-choice.js.map +1 -0
  135. package/dist/components/json-schema-form-errors.cjs +49 -31
  136. package/dist/components/json-schema-form-errors.cjs.map +1 -1
  137. package/dist/components/json-schema-form-errors.d.ts +4 -2
  138. package/dist/components/json-schema-form-errors.d.ts.map +1 -1
  139. package/dist/components/json-schema-form-errors.js +51 -33
  140. package/dist/components/json-schema-form-errors.js.map +1 -1
  141. package/dist/components/json-schema-form-fields.cjs +3 -93
  142. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  143. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  144. package/dist/components/json-schema-form-fields.js +1 -91
  145. package/dist/components/json-schema-form-fields.js.map +1 -1
  146. package/dist/components/json-schema-form-filter.cjs +2 -1
  147. package/dist/components/json-schema-form-filter.cjs.map +1 -1
  148. package/dist/components/json-schema-form-filter.js +2 -1
  149. package/dist/components/json-schema-form-filter.js.map +1 -1
  150. package/dist/components/json-schema-form-item-summary.cjs +6 -2
  151. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  152. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  153. package/dist/components/json-schema-form-item-summary.js +6 -2
  154. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  155. package/dist/components/json-schema-form-layout.cjs +28 -19
  156. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  157. package/dist/components/json-schema-form-layout.d.ts +8 -6
  158. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  159. package/dist/components/json-schema-form-layout.js +29 -20
  160. package/dist/components/json-schema-form-layout.js.map +1 -1
  161. package/dist/components/json-schema-form-listener-paths.cjs +52 -0
  162. package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
  163. package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
  164. package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
  165. package/dist/components/json-schema-form-listener-paths.js +52 -0
  166. package/dist/components/json-schema-form-listener-paths.js.map +1 -0
  167. package/dist/components/json-schema-form-listener-types.d.ts +22 -0
  168. package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
  169. package/dist/components/json-schema-form-listeners.cjs +256 -0
  170. package/dist/components/json-schema-form-listeners.cjs.map +1 -0
  171. package/dist/components/json-schema-form-listeners.d.ts +13 -0
  172. package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
  173. package/dist/components/json-schema-form-listeners.js +256 -0
  174. package/dist/components/json-schema-form-listeners.js.map +1 -0
  175. package/dist/components/json-schema-form-object-array-view.cjs +62 -0
  176. package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
  177. package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
  178. package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
  179. package/dist/components/json-schema-form-object-array-view.js +62 -0
  180. package/dist/components/json-schema-form-object-array-view.js.map +1 -0
  181. package/dist/components/json-schema-form-object.cjs +3 -0
  182. package/dist/components/json-schema-form-object.cjs.map +1 -1
  183. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  184. package/dist/components/json-schema-form-object.js +3 -0
  185. package/dist/components/json-schema-form-object.js.map +1 -1
  186. package/dist/components/json-schema-form-preferences.cjs +1 -0
  187. package/dist/components/json-schema-form-preferences.cjs.map +1 -1
  188. package/dist/components/json-schema-form-preferences.d.ts +1 -0
  189. package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
  190. package/dist/components/json-schema-form-preferences.js +1 -0
  191. package/dist/components/json-schema-form-preferences.js.map +1 -1
  192. package/dist/components/json-schema-form-render.cjs +36 -12
  193. package/dist/components/json-schema-form-render.cjs.map +1 -1
  194. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  195. package/dist/components/json-schema-form-render.js +38 -14
  196. package/dist/components/json-schema-form-render.js.map +1 -1
  197. package/dist/components/json-schema-form-resolve.cjs +6 -99
  198. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  199. package/dist/components/json-schema-form-resolve.d.ts +1 -8
  200. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  201. package/dist/components/json-schema-form-resolve.js +5 -98
  202. package/dist/components/json-schema-form-resolve.js.map +1 -1
  203. package/dist/components/json-schema-form-runtime-types.d.ts +16 -0
  204. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
  205. package/dist/components/json-schema-form-table-array.cjs +67 -16
  206. package/dist/components/json-schema-form-table-array.cjs.map +1 -1
  207. package/dist/components/json-schema-form-table-array.d.ts +4 -1
  208. package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
  209. package/dist/components/json-schema-form-table-array.js +70 -19
  210. package/dist/components/json-schema-form-table-array.js.map +1 -1
  211. package/dist/components/json-schema-form-tone.cjs +12 -0
  212. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  213. package/dist/components/json-schema-form-tone.js +12 -0
  214. package/dist/components/json-schema-form-tone.js.map +1 -1
  215. package/dist/components/json-schema-form-types.d.ts +17 -0
  216. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  217. package/dist/components/json-schema-form-utils.cjs +7 -1
  218. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  219. package/dist/components/json-schema-form-utils.d.ts +2 -1
  220. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  221. package/dist/components/json-schema-form-utils.js +7 -1
  222. package/dist/components/json-schema-form-utils.js.map +1 -1
  223. package/dist/components.cjs +3 -2
  224. package/dist/components.cjs.map +1 -1
  225. package/dist/components.d.ts +3 -2
  226. package/dist/components.d.ts.map +1 -1
  227. package/dist/components.js +2 -1
  228. package/dist/components.js.map +1 -1
  229. package/dist/data/DataTable.cjs +9 -3
  230. package/dist/data/DataTable.cjs.map +1 -1
  231. package/dist/data/DataTable.d.ts +6 -0
  232. package/dist/data/DataTable.d.ts.map +1 -1
  233. package/dist/data/DataTable.js +9 -3
  234. package/dist/data/DataTable.js.map +1 -1
  235. package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
  236. package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
  237. package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
  238. package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
  239. package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
  240. package/dist/data/GraphDiagram.cjs +125 -138
  241. package/dist/data/GraphDiagram.cjs.map +1 -1
  242. package/dist/data/GraphDiagram.d.ts +30 -23
  243. package/dist/data/GraphDiagram.d.ts.map +1 -1
  244. package/dist/data/GraphDiagram.js +128 -141
  245. package/dist/data/GraphDiagram.js.map +1 -1
  246. package/dist/data/GraphDiagramEdges.cjs +208 -0
  247. package/dist/data/GraphDiagramEdges.cjs.map +1 -0
  248. package/dist/data/GraphDiagramEdges.d.ts +40 -0
  249. package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
  250. package/dist/data/GraphDiagramEdges.js +208 -0
  251. package/dist/data/GraphDiagramEdges.js.map +1 -0
  252. package/dist/data/GraphDiagramNodes.cjs +142 -0
  253. package/dist/data/GraphDiagramNodes.cjs.map +1 -0
  254. package/dist/data/GraphDiagramNodes.d.ts +22 -0
  255. package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
  256. package/dist/data/GraphDiagramNodes.js +142 -0
  257. package/dist/data/GraphDiagramNodes.js.map +1 -0
  258. package/dist/data/Tree.cjs +10 -2
  259. package/dist/data/Tree.cjs.map +1 -1
  260. package/dist/data/Tree.d.ts +6 -1
  261. package/dist/data/Tree.d.ts.map +1 -1
  262. package/dist/data/Tree.js +10 -2
  263. package/dist/data/Tree.js.map +1 -1
  264. package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
  265. package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
  266. package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
  267. package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
  268. package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
  269. package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
  270. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  271. package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
  272. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  273. package/dist/data/ai/PromptRunEditor/index.js +38 -44
  274. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  275. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
  276. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  277. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
  278. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  279. package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
  280. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  281. package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
  282. package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
  283. package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
  284. package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
  285. package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
  286. package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
  287. package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
  288. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  289. package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
  290. package/dist/data/ai/SessionInspector.approvals.js +26 -2
  291. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  292. package/dist/data/ai/SessionInspector.cjs +143 -167
  293. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  294. package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
  295. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
  296. package/dist/data/ai/SessionInspector.collection.cjs +18 -5
  297. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
  298. package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
  299. package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
  300. package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
  301. package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
  302. package/dist/data/ai/SessionInspector.collection.js +18 -5
  303. package/dist/data/ai/SessionInspector.collection.js.map +1 -1
  304. package/dist/data/ai/SessionInspector.d.ts +24 -2
  305. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  306. package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
  307. package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
  308. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
  309. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
  310. package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
  311. package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
  312. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  313. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  314. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  315. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  316. package/dist/data/ai/SessionInspector.js +144 -168
  317. package/dist/data/ai/SessionInspector.js.map +1 -1
  318. package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
  319. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
  320. package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
  321. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
  322. package/dist/data/ai/SessionInspector.legacy.js +116 -0
  323. package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
  324. package/dist/data/ai/SessionInspector.panels.cjs +3 -0
  325. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  326. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
  327. package/dist/data/ai/SessionInspector.panels.js +3 -0
  328. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  329. package/dist/data/ai/SessionInspector.plan.cjs +29 -12
  330. package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
  331. package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
  332. package/dist/data/ai/SessionInspector.plan.js +30 -13
  333. package/dist/data/ai/SessionInspector.plan.js.map +1 -1
  334. package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
  335. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
  336. package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
  337. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
  338. package/dist/data/ai/SessionInspector.remote-view.js +44 -0
  339. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
  340. package/dist/data/ai/SessionInspector.remote.cjs +275 -0
  341. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
  342. package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
  343. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
  344. package/dist/data/ai/SessionInspector.remote.js +275 -0
  345. package/dist/data/ai/SessionInspector.remote.js.map +1 -0
  346. package/dist/data/ai/SessionInspector.summary.cjs +9 -159
  347. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  348. package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
  349. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
  350. package/dist/data/ai/SessionInspector.summary.js +11 -161
  351. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  352. package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
  353. package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
  354. package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
  355. package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
  356. package/dist/data/ai/SessionInspector.tab-state.js +15 -0
  357. package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
  358. package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
  359. package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
  360. package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
  361. package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
  362. package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
  363. package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
  364. package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
  365. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  366. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  367. package/dist/data/ai/SessionInspector.transcript.js +4 -0
  368. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  369. package/dist/data/ai/SessionInspector.verification.cjs +53 -0
  370. package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
  371. package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
  372. package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
  373. package/dist/data/ai/SessionInspector.verification.js +53 -0
  374. package/dist/data/ai/SessionInspector.verification.js.map +1 -0
  375. package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
  376. package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
  377. package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
  378. package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
  379. package/dist/data/ai/SessionViewer.approval-body.js +146 -0
  380. package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
  381. package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
  382. package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
  383. package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
  384. package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
  385. package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
  386. package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
  387. package/dist/data/ai/SessionViewer.cjs +57 -20
  388. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  389. package/dist/data/ai/SessionViewer.d.ts +13 -3
  390. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  391. package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
  392. package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
  393. package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
  394. package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
  395. package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
  396. package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
  397. package/dist/data/ai/SessionViewer.decision.cjs +21 -0
  398. package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
  399. package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
  400. package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
  401. package/dist/data/ai/SessionViewer.decision.js +21 -0
  402. package/dist/data/ai/SessionViewer.decision.js.map +1 -0
  403. package/dist/data/ai/SessionViewer.input.cjs +14 -0
  404. package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
  405. package/dist/data/ai/SessionViewer.input.d.ts +5 -0
  406. package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
  407. package/dist/data/ai/SessionViewer.input.js +14 -0
  408. package/dist/data/ai/SessionViewer.input.js.map +1 -1
  409. package/dist/data/ai/SessionViewer.js +58 -21
  410. package/dist/data/ai/SessionViewer.js.map +1 -1
  411. package/dist/data/ai/SessionViewer.model.cjs +7 -1
  412. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  413. package/dist/data/ai/SessionViewer.model.d.ts +25 -3
  414. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  415. package/dist/data/ai/SessionViewer.model.js +7 -1
  416. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  417. package/dist/data/ai/SessionViewer.rows.cjs +6 -3
  418. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  419. package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
  420. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  421. package/dist/data/ai/SessionViewer.rows.js +6 -3
  422. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  423. package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
  424. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  425. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  426. package/dist/data/ai/SessionViewer.tool-row.js +27 -235
  427. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  428. package/dist/data/ai/SessionViewer.unified.d.ts +17 -0
  429. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  430. package/dist/data/ai/SessionViewerMenu.cjs +8 -2
  431. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  432. package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
  433. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  434. package/dist/data/ai/SessionViewerMenu.js +8 -2
  435. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  436. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
  437. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  438. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
  439. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  440. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
  441. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  442. package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
  443. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  444. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
  445. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  446. package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
  447. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  448. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
  449. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
  450. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  451. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
  452. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  453. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  454. package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
  455. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  456. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
  457. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  458. package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
  459. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  460. package/dist/data/ai/approval-request.cjs +75 -0
  461. package/dist/data/ai/approval-request.cjs.map +1 -0
  462. package/dist/data/ai/approval-request.d.ts +155 -0
  463. package/dist/data/ai/approval-request.d.ts.map +1 -0
  464. package/dist/data/ai/approval-request.js +75 -0
  465. package/dist/data/ai/approval-request.js.map +1 -0
  466. package/dist/data/ai/index.d.ts +6 -1
  467. package/dist/data/ai/index.d.ts.map +1 -1
  468. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
  469. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
  470. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
  471. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
  472. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
  473. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
  474. package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
  475. package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
  476. package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
  477. package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
  478. package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
  479. package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
  480. package/dist/data/ai/runtime-preset-menu/model.js +73 -0
  481. package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
  482. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
  483. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
  484. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
  485. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
  486. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
  487. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
  488. package/dist/data/ai/runtime-spec-fields.cjs +166 -0
  489. package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
  490. package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
  491. package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
  492. package/dist/data/ai/runtime-spec-fields.js +166 -0
  493. package/dist/data/ai/runtime-spec-fields.js.map +1 -0
  494. package/dist/data/ai/session-categories.cjs +4 -0
  495. package/dist/data/ai/session-categories.cjs.map +1 -1
  496. package/dist/data/ai/session-categories.d.ts +1 -0
  497. package/dist/data/ai/session-categories.d.ts.map +1 -1
  498. package/dist/data/ai/session-categories.js +4 -0
  499. package/dist/data/ai/session-categories.js.map +1 -1
  500. package/dist/data/ai/use-session-scroll.cjs +49 -21
  501. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  502. package/dist/data/ai/use-session-scroll.d.ts +2 -0
  503. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  504. package/dist/data/ai/use-session-scroll.js +49 -21
  505. package/dist/data/ai/use-session-scroll.js.map +1 -1
  506. package/dist/data/chat/Chat.runtime.cjs +1 -1
  507. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  508. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  509. package/dist/data/chat/Chat.runtime.js +1 -1
  510. package/dist/data/chat/Chat.runtime.js.map +1 -1
  511. package/dist/data/graph-columns-layout.cjs +216 -0
  512. package/dist/data/graph-columns-layout.cjs.map +1 -0
  513. package/dist/data/graph-columns-layout.d.ts +56 -0
  514. package/dist/data/graph-columns-layout.d.ts.map +1 -0
  515. package/dist/data/graph-columns-layout.js +216 -0
  516. package/dist/data/graph-columns-layout.js.map +1 -0
  517. package/dist/data/graph-diagram-model.cjs +73 -0
  518. package/dist/data/graph-diagram-model.cjs.map +1 -0
  519. package/dist/data/graph-diagram-model.d.ts +90 -0
  520. package/dist/data/graph-diagram-model.d.ts.map +1 -0
  521. package/dist/data/graph-diagram-model.js +73 -0
  522. package/dist/data/graph-diagram-model.js.map +1 -0
  523. package/dist/data/graph-edge-routing.cjs +235 -0
  524. package/dist/data/graph-edge-routing.cjs.map +1 -0
  525. package/dist/data/graph-edge-routing.d.ts +73 -0
  526. package/dist/data/graph-edge-routing.d.ts.map +1 -0
  527. package/dist/data/graph-edge-routing.js +235 -0
  528. package/dist/data/graph-edge-routing.js.map +1 -0
  529. package/dist/data/graph-layout.cjs +0 -82
  530. package/dist/data/graph-layout.cjs.map +1 -1
  531. package/dist/data/graph-layout.d.ts +1 -28
  532. package/dist/data/graph-layout.d.ts.map +1 -1
  533. package/dist/data/graph-layout.js +1 -83
  534. package/dist/data/graph-layout.js.map +1 -1
  535. package/dist/data/har/HarPanel.cjs +129 -33
  536. package/dist/data/har/HarPanel.cjs.map +1 -1
  537. package/dist/data/har/HarPanel.d.ts +13 -1
  538. package/dist/data/har/HarPanel.d.ts.map +1 -1
  539. package/dist/data/har/HarPanel.js +130 -34
  540. package/dist/data/har/HarPanel.js.map +1 -1
  541. package/dist/data/har/fixtures.d.ts +12 -0
  542. package/dist/data/har/fixtures.d.ts.map +1 -1
  543. package/dist/data/har/types.d.ts +12 -0
  544. package/dist/data/har/types.d.ts.map +1 -1
  545. package/dist/data/runtime/RuntimeBar.cjs +67 -84
  546. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  547. package/dist/data/runtime/RuntimeBar.d.ts +4 -5
  548. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  549. package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
  550. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
  551. package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
  552. package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
  553. package/dist/data/runtime/RuntimeBar.fields.js +170 -0
  554. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
  555. package/dist/data/runtime/RuntimeBar.js +70 -87
  556. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  557. package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
  558. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
  559. package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
  560. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
  561. package/dist/data/runtime/RuntimeBar.selection.js +56 -0
  562. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
  563. package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
  564. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  565. package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
  566. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  567. package/dist/data/runtime/RuntimeBarActions.js +10 -6
  568. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  569. package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
  570. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
  571. package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
  572. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
  573. package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
  574. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
  575. package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
  576. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
  577. package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
  578. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
  579. package/dist/data/runtime/RuntimeBarLayout.js +95 -0
  580. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
  581. package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
  582. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  583. package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
  584. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  585. package/dist/data/runtime/RuntimeBarSegment.js +25 -14
  586. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  587. package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
  588. package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
  589. package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
  590. package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
  591. package/dist/data/runtime/RuntimeLimitInput.js +41 -0
  592. package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
  593. package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
  594. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
  595. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
  596. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
  597. package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
  598. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
  599. package/dist/data/use-edge-focus.cjs +20 -0
  600. package/dist/data/use-edge-focus.cjs.map +1 -0
  601. package/dist/data/use-edge-focus.d.ts +23 -0
  602. package/dist/data/use-edge-focus.d.ts.map +1 -0
  603. package/dist/data/use-edge-focus.js +20 -0
  604. package/dist/data/use-edge-focus.js.map +1 -0
  605. package/dist/data/use-pan-zoom.cjs +159 -0
  606. package/dist/data/use-pan-zoom.cjs.map +1 -0
  607. package/dist/data/use-pan-zoom.d.ts +79 -0
  608. package/dist/data/use-pan-zoom.d.ts.map +1 -0
  609. package/dist/data/use-pan-zoom.js +159 -0
  610. package/dist/data/use-pan-zoom.js.map +1 -0
  611. package/dist/data/version-info.cjs +3 -3
  612. package/dist/data/version-info.js +3 -3
  613. package/dist/data.cjs +5 -1
  614. package/dist/data.cjs.map +1 -1
  615. package/dist/data.d.ts +4 -3
  616. package/dist/data.d.ts.map +1 -1
  617. package/dist/data.js +6 -2
  618. package/dist/data.js.map +1 -1
  619. package/dist/devtools/useDebugStream.cjs +5 -1
  620. package/dist/devtools/useDebugStream.cjs.map +1 -1
  621. package/dist/devtools/useDebugStream.d.ts.map +1 -1
  622. package/dist/devtools/useDebugStream.js +6 -2
  623. package/dist/devtools/useDebugStream.js.map +1 -1
  624. package/dist/hooks/event-source-provider.cjs +9 -0
  625. package/dist/hooks/event-source-provider.cjs.map +1 -0
  626. package/dist/hooks/event-source-provider.d.ts +15 -0
  627. package/dist/hooks/event-source-provider.d.ts.map +1 -0
  628. package/dist/hooks/event-source-provider.js +9 -0
  629. package/dist/hooks/event-source-provider.js.map +1 -0
  630. package/dist/hooks/event-source.cjs +11 -0
  631. package/dist/hooks/event-source.cjs.map +1 -0
  632. package/dist/hooks/event-source.d.ts +22 -0
  633. package/dist/hooks/event-source.d.ts.map +1 -0
  634. package/dist/hooks/event-source.js +11 -0
  635. package/dist/hooks/event-source.js.map +1 -0
  636. package/dist/hooks/use-log-tail.cjs +5 -1
  637. package/dist/hooks/use-log-tail.cjs.map +1 -1
  638. package/dist/hooks/use-log-tail.d.ts.map +1 -1
  639. package/dist/hooks/use-log-tail.js +5 -1
  640. package/dist/hooks/use-log-tail.js.map +1 -1
  641. package/dist/hooks/use-prompts.cjs +5 -1
  642. package/dist/hooks/use-prompts.cjs.map +1 -1
  643. package/dist/hooks/use-prompts.d.ts.map +1 -1
  644. package/dist/hooks/use-prompts.js +6 -2
  645. package/dist/hooks/use-prompts.js.map +1 -1
  646. package/dist/hooks/use-task-run.cjs +9 -2
  647. package/dist/hooks/use-task-run.cjs.map +1 -1
  648. package/dist/hooks/use-task-run.d.ts.map +1 -1
  649. package/dist/hooks/use-task-run.js +10 -3
  650. package/dist/hooks/use-task-run.js.map +1 -1
  651. package/dist/hooks.cjs +4 -0
  652. package/dist/hooks.cjs.map +1 -1
  653. package/dist/hooks.d.ts +2 -0
  654. package/dist/hooks.d.ts.map +1 -1
  655. package/dist/hooks.js +4 -0
  656. package/dist/hooks.js.map +1 -1
  657. package/dist/icons/programmingCatalog.cjs +34 -34
  658. package/dist/icons/programmingCatalog.cjs.map +1 -1
  659. package/dist/icons/programmingCatalog.js +34 -34
  660. package/dist/icons/programmingCatalog.js.map +1 -1
  661. package/dist/index.cjs +14 -3
  662. package/dist/index.cjs.map +1 -1
  663. package/dist/index.js +14 -3
  664. package/dist/index.js.map +1 -1
  665. package/dist/monaco/MonacoEditor.cjs +4 -1
  666. package/dist/monaco/MonacoEditor.cjs.map +1 -1
  667. package/dist/monaco/MonacoEditor.d.ts +1 -1
  668. package/dist/monaco/MonacoEditor.d.ts.map +1 -1
  669. package/dist/monaco/MonacoEditor.js +4 -1
  670. package/dist/monaco/MonacoEditor.js.map +1 -1
  671. package/dist/monaco/types.d.ts +2 -1
  672. package/dist/monaco/types.d.ts.map +1 -1
  673. package/dist/overlay/CommandPalette.cjs +14 -4
  674. package/dist/overlay/CommandPalette.cjs.map +1 -1
  675. package/dist/overlay/CommandPalette.d.ts +5 -1
  676. package/dist/overlay/CommandPalette.d.ts.map +1 -1
  677. package/dist/overlay/CommandPalette.js +14 -4
  678. package/dist/overlay/CommandPalette.js.map +1 -1
  679. package/dist/overlay/CommandPaletteList.cjs +5 -0
  680. package/dist/overlay/CommandPaletteList.cjs.map +1 -1
  681. package/dist/overlay/CommandPaletteList.d.ts +4 -2
  682. package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
  683. package/dist/overlay/CommandPaletteList.js +5 -0
  684. package/dist/overlay/CommandPaletteList.js.map +1 -1
  685. package/dist/overlay/DropdownMenu.cjs +2 -0
  686. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  687. package/dist/overlay/DropdownMenu.d.ts +4 -0
  688. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  689. package/dist/overlay/DropdownMenu.js +2 -0
  690. package/dist/overlay/DropdownMenu.js.map +1 -1
  691. package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
  692. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  693. package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
  694. package/dist/overlay/DropdownMenuSubmenu.js +31 -15
  695. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  696. package/dist/rpc/OperationCatalog.cjs +32 -27
  697. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  698. package/dist/rpc/OperationCatalog.d.ts +11 -1
  699. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  700. package/dist/rpc/OperationCatalog.js +32 -27
  701. package/dist/rpc/OperationCatalog.js.map +1 -1
  702. package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
  703. package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
  704. package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
  705. package/dist/rpc/OperationEntityContextPicker.js +64 -258
  706. package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
  707. package/dist/rpc/OperationEntityPicker.cjs +185 -0
  708. package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
  709. package/dist/rpc/OperationEntityPicker.d.ts +51 -0
  710. package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
  711. package/dist/rpc/OperationEntityPicker.js +185 -0
  712. package/dist/rpc/OperationEntityPicker.js.map +1 -0
  713. package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
  714. package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
  715. package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
  716. package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
  717. package/dist/rpc/OperationEntityPicker.model.js +39 -0
  718. package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
  719. package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
  720. package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
  721. package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
  722. package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
  723. package/dist/rpc/operationCatalogRowSelection.js +85 -0
  724. package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
  725. package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
  726. package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
  727. package/dist/rpc/useOperationPages.cjs +6 -1
  728. package/dist/rpc/useOperationPages.cjs.map +1 -1
  729. package/dist/rpc/useOperationPages.d.ts +3 -1
  730. package/dist/rpc/useOperationPages.d.ts.map +1 -1
  731. package/dist/rpc/useOperationPages.js +6 -1
  732. package/dist/rpc/useOperationPages.js.map +1 -1
  733. package/dist/rpc.cjs +2 -0
  734. package/dist/rpc.cjs.map +1 -1
  735. package/dist/rpc.d.ts +2 -0
  736. package/dist/rpc.d.ts.map +1 -1
  737. package/dist/rpc.js +2 -0
  738. package/dist/rpc.js.map +1 -1
  739. package/dist/styles.css +1 -1
  740. package/package.json +4 -1
  741. package/schemas/json-schema-form.schema.json +571 -0
  742. package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
  743. package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
  744. package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
  745. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
  746. package/dist/data/runtime/RuntimeBarCombo.js +0 -423
  747. package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
  748. package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
  749. package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
  750. package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
  751. package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
  752. package/dist/data/runtime/RuntimeBarLimits.js +0 -262
  753. package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
  754. package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
  755. package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
  756. package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
  757. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
  758. package/dist/data/runtime/RuntimeBarSegments.js +0 -346
  759. package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CommentCardParts.js","sources":["../../src/comments/CommentCardParts.tsx"],"sourcesContent":["import { Badge } from \"../data/Badge\";\nimport { cn } from \"../lib/utils\";\nimport { UiThumbsDown, UiThumbsUp } from \"../icons\";\nimport {\n resolveFacetOption,\n resolveStatusConfig,\n toneToBadgeTone,\n} from \"./comment-utils\";\nimport { resolveCommentStage } from \"../lib/comment-stage\";\nimport type { Comment, CommentConfig, CommentRating } from \"./comment-types\";\n\nexport function RatingChip({ rating }: { rating: CommentRating | undefined }) {\n if (!rating) return null;\n const positive = rating === \"positive\";\n return (\n <Badge\n variant=\"soft\"\n tone={positive ? \"success\" : \"danger\"}\n size=\"xs\"\n icon={positive ? UiThumbsUp : UiThumbsDown}\n >\n {positive ? \"Positive rating\" : \"Negative rating\"}\n </Badge>\n );\n}\n\nexport function StatusChip({\n comment,\n config,\n}: {\n comment: Comment;\n config: CommentConfig;\n}) {\n const status = resolveStatusConfig(config, comment.status);\n if (!status) return null;\n const closedBy =\n resolveCommentStage(config, comment.status) === \"closed\"\n ? comment.closedBy\n : undefined;\n return (\n <Badge\n variant=\"soft\"\n tone={toneToBadgeTone(status.tone)}\n size=\"xs\"\n {...(status.icon ? { icon: status.icon } : {})}\n {...(comment.closedAt\n ? { title: new Date(comment.closedAt).toLocaleString() }\n : {})}\n >\n {closedBy ? `Closed by ${closedBy.name}` : status.label}\n </Badge>\n );\n}\n\nexport function FacetBadges({\n comment,\n config,\n compact,\n}: {\n comment: Comment;\n config: CommentConfig;\n compact?: boolean;\n}) {\n const chips = (config.facets ?? []).flatMap((facet) => {\n const option = resolveFacetOption(facet, comment.facets?.[facet.key]);\n if (!option) return [];\n return [\n <Badge\n key={facet.key}\n variant=\"soft\"\n tone={toneToBadgeTone(option.tone)}\n size=\"xs\"\n >\n {compact ? (option.short ?? option.label) : option.label}\n </Badge>,\n ];\n });\n return chips.length > 0 ? <>{chips}</> : null;\n}\n\nexport function ChecklistChips({\n comment,\n onChecklistToggle,\n}: {\n comment: Comment;\n onChecklistToggle?: (index: number) => void;\n}) {\n if (!comment.checklist?.length) return null;\n return (\n <div className=\"flex flex-wrap gap-1\">\n {comment.checklist.map((item, index) => {\n const done = /done|complete|resolved/i.test(item.status);\n const active = /progress|doing/i.test(item.status);\n return (\n <button\n key={index}\n type=\"button\"\n onClick={() => onChecklistToggle?.(index)}\n disabled={!onChecklistToggle}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] transition-opacity\",\n onChecklistToggle && \"cursor-pointer hover:opacity-80\",\n done\n ? \"bg-green-100 text-green-800 line-through dark:bg-green-500/20 dark:text-green-300\"\n : active\n ? \"bg-yellow-100 text-yellow-800 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function RefChips({ comment }: { comment: Comment }) {\n if (!comment.refs?.length) return null;\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {comment.refs.map((group, index) => (\n <span\n key={index}\n className=\"inline-flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\"\n >\n <span className=\"font-medium\">{group.label}:</span>\n <span className={group.mono ? \"font-mono\" : undefined}>\n {group.items.join(\", \")}\n </span>\n </span>\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommentCardParts.js","sources":["../../src/comments/CommentCardParts.tsx"],"sourcesContent":["import { Badge } from \"../data/Badge\";\nimport { cn } from \"../lib/utils\";\nimport { UiThumbsDown, UiThumbsUp } from \"../icons\";\nimport {\n resolveFacetOption,\n resolveStatusConfig,\n toneToBadgeTone,\n} from \"./comment-utils\";\nimport { resolveCommentStage } from \"../lib/comment-stage\";\nimport type {\n Comment,\n CommentConfig,\n CommentRating,\n CommentReviewDecision,\n} from \"./comment-types\";\n\nexport function ReviewDecisionChip({\n decision,\n}: {\n decision: CommentReviewDecision | undefined;\n}) {\n if (!decision) return null;\n const label =\n decision === \"approved\"\n ? \"Approved\"\n : decision === \"rejected\"\n ? \"Rejected\"\n : \"Revision requested\";\n return (\n <Badge\n variant=\"soft\"\n tone={\n decision === \"approved\"\n ? \"success\"\n : decision === \"rejected\"\n ? \"danger\"\n : \"warning\"\n }\n size=\"xs\"\n >\n {label}\n </Badge>\n );\n}\n\nexport function RatingChip({ rating }: { rating: CommentRating | undefined }) {\n if (!rating) return null;\n const positive = rating === \"positive\";\n return (\n <Badge\n variant=\"soft\"\n tone={positive ? \"success\" : \"danger\"}\n size=\"xs\"\n icon={positive ? UiThumbsUp : UiThumbsDown}\n >\n {positive ? \"Positive rating\" : \"Negative rating\"}\n </Badge>\n );\n}\n\nexport function StatusChip({\n comment,\n config,\n}: {\n comment: Comment;\n config: CommentConfig;\n}) {\n const status = resolveStatusConfig(config, comment.status);\n if (!status) return null;\n const closedBy =\n resolveCommentStage(config, comment.status) === \"closed\"\n ? comment.closedBy\n : undefined;\n return (\n <Badge\n variant=\"soft\"\n tone={toneToBadgeTone(status.tone)}\n size=\"xs\"\n {...(status.icon ? { icon: status.icon } : {})}\n {...(comment.closedAt\n ? { title: new Date(comment.closedAt).toLocaleString() }\n : {})}\n >\n {closedBy ? `Closed by ${closedBy.name}` : status.label}\n </Badge>\n );\n}\n\nexport function FacetBadges({\n comment,\n config,\n compact,\n}: {\n comment: Comment;\n config: CommentConfig;\n compact?: boolean;\n}) {\n const chips = (config.facets ?? []).flatMap((facet) => {\n const option = resolveFacetOption(facet, comment.facets?.[facet.key]);\n if (!option) return [];\n return [\n <Badge\n key={facet.key}\n variant=\"soft\"\n tone={toneToBadgeTone(option.tone)}\n size=\"xs\"\n >\n {compact ? (option.short ?? option.label) : option.label}\n </Badge>,\n ];\n });\n return chips.length > 0 ? <>{chips}</> : null;\n}\n\nexport function ChecklistChips({\n comment,\n onChecklistToggle,\n}: {\n comment: Comment;\n onChecklistToggle?: (index: number) => void;\n}) {\n if (!comment.checklist?.length) return null;\n return (\n <div className=\"flex flex-wrap gap-1\">\n {comment.checklist.map((item, index) => {\n const done = /done|complete|resolved/i.test(item.status);\n const active = /progress|doing/i.test(item.status);\n return (\n <button\n key={index}\n type=\"button\"\n onClick={() => onChecklistToggle?.(index)}\n disabled={!onChecklistToggle}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] transition-opacity\",\n onChecklistToggle && \"cursor-pointer hover:opacity-80\",\n done\n ? \"bg-green-100 text-green-800 line-through dark:bg-green-500/20 dark:text-green-300\"\n : active\n ? \"bg-yellow-100 text-yellow-800 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function RefChips({ comment }: { comment: Comment }) {\n if (!comment.refs?.length) return null;\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {comment.refs.map((group, index) => (\n <span\n key={index}\n className=\"inline-flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\"\n >\n <span className=\"font-medium\">{group.label}:</span>\n <span className={group.mono ? \"font-mono\" : undefined}>\n {group.items.join(\", \")}\n </span>\n </span>\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-types.cjs","sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (input: CommentCreateInput, actionId?: string) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"names":[],"mappings":";;AA8GO,MAAM,kBAAkB;AAyGxB,MAAM,2BAAkD;AAAA,EAC7D;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,WAAW,OAAO,SAAA;AAC9D;AAGO,MAAM,0BAA0B,CAAC,QAAQ,eAAe,MAAM;;;;"}
1
+ {"version":3,"file":"comment-types.cjs","sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\nexport type CommentReviewDecision =\n | \"approved\"\n | \"rejected\"\n | \"revision_requested\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** Human decision on an opted-in playground review element; roots only. */\n reviewDecision?: CommentReviewDecision;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n reviewDecision?: CommentReviewDecision;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (\n input: CommentCreateInput,\n actionId?: string,\n ) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"names":[],"mappings":";;AAkHO,MAAM,kBAAkB;AA+GxB,MAAM,2BAAkD;AAAA,EAC7D;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,WAAW,OAAO,SAAA;AAC9D;AAGO,MAAM,0BAA0B,CAAC,QAAQ,eAAe,MAAM;;;;"}
@@ -87,6 +87,7 @@ export type CommentAuthor = {
87
87
  export type CommentAnchor = string;
88
88
  /** Binary review signal attached to a root comment. */
89
89
  export type CommentRating = "positive" | "negative";
90
+ export type CommentReviewDecision = "approved" | "rejected" | "revision_requested";
90
91
  /** Anchor key reserved for document-level (un-anchored) comments. */
91
92
  export declare const DOCUMENT_ANCHOR = "__document__";
92
93
  /** A single comment. Replies set `parentId`; roots leave it null. */
@@ -106,6 +107,8 @@ export type Comment = {
106
107
  anchor?: CommentAnchor | null;
107
108
  /** Optional positive/negative review signal; roots only. */
108
109
  rating?: CommentRating;
110
+ /** Human decision on an opted-in playground review element; roots only. */
111
+ reviewDecision?: CommentReviewDecision;
109
112
  /** ISO-8601 time when a human closed the resolved comment. */
110
113
  closedAt?: string;
111
114
  /** Human who closed the comment. */
@@ -120,6 +123,7 @@ export type CommentCreateInput = {
120
123
  body: string;
121
124
  anchor?: CommentAnchor | null;
122
125
  rating?: CommentRating;
126
+ reviewDecision?: CommentReviewDecision;
123
127
  facets?: Record<string, string>;
124
128
  mentions?: CommentMention[];
125
129
  };
@@ -1 +1 @@
1
- {"version":3,"file":"comment-types.d.ts","sourceRoot":"","sources":["../../src/comments/comment-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comment-types.d.ts","sourceRoot":"","sources":["../../src/comments/comment-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-types.js","sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (input: CommentCreateInput, actionId?: string) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"names":[],"mappings":"AA8GO,MAAM,kBAAkB;AAyGxB,MAAM,2BAAkD;AAAA,EAC7D;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,WAAW,OAAO,SAAA;AAC9D;AAGO,MAAM,0BAA0B,CAAC,QAAQ,eAAe,MAAM;"}
1
+ {"version":3,"file":"comment-types.js","sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\nexport type CommentReviewDecision =\n | \"approved\"\n | \"rejected\"\n | \"revision_requested\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** Human decision on an opted-in playground review element; roots only. */\n reviewDecision?: CommentReviewDecision;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n reviewDecision?: CommentReviewDecision;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (\n input: CommentCreateInput,\n actionId?: string,\n ) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"names":[],"mappings":"AAkHO,MAAM,kBAAkB;AA+GxB,MAAM,2BAAkD;AAAA,EAC7D;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,WAAW,OAAO,SAAA;AAC9D;AAGO,MAAM,0BAA0B,CAAC,QAAQ,eAAe,MAAM;"}
@@ -20,6 +20,7 @@ function AccordionList({
20
20
  renderActions,
21
21
  renderMeta,
22
22
  summary,
23
+ toolbar,
23
24
  itemLabel,
24
25
  allowReorder = false,
25
26
  allowDrag = false,
@@ -140,7 +141,10 @@ function AccordionList({
140
141
  else if (e.key === "End") focusAt(stops);
141
142
  }
142
143
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("flex flex-col gap-2", className), children: [
143
- summary !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: utils.cn("text-muted-foreground", jsonSchemaFormSize.labelSizeClass[size]), children: summary }),
144
+ (summary !== void 0 || toolbar !== void 0) && /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-accordion-summary": true, className: "flex items-center justify-between gap-2", children: [
145
+ summary !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: utils.cn("text-muted-foreground", jsonSchemaFormSize.labelSizeClass[size]), children: summary }),
146
+ toolbar !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex shrink-0 items-center", children: toolbar })
147
+ ] }),
144
148
  /* @__PURE__ */ jsxRuntime.jsxs(
145
149
  "div",
146
150
  {
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionList.cjs","sources":["../../src/components/AccordionList.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n type ReactNode,\n} from \"react\";\nimport { duplicateIndex, moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport type { SizeToken } from \"../lib/size\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronRight, UiDotsVertical } from \"../icons\";\nimport { ItemActions } from \"./ItemActions\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\n\n// AccordionList renders a list of items as one-line rows, expanding one at a\n// time into that item's own editor. It exists because a ten-field item stacked\n// in full costs ~700px of screen each, and a column of them says nothing about\n// which item is which.\n//\n// It knows nothing about what an item IS: `renderHeader` fills the collapsed\n// row, `renderBody` fills the open panel, and everything structural — the\n// disclosure, the aria pairing, roving arrow-key focus, the mutation buttons,\n// the add row — belongs to the list. Every editing capability is opt-in, so the\n// same component serves a read-only summary list and a full editor.\n//\n// \"Add\" is the list's own last row rather than a button beside it: the\n// affordance sits exactly where the next item will appear, and at zero items\n// that same row IS the empty state — one control, no separate screen.\n\n/** Handed to every slot, describing one row. */\nexport interface AccordionListItemContext<T> {\n item: T;\n index: number;\n open: boolean;\n /** Replaces this item in place, committing the whole list through `onChange`. */\n onChange: (next: T) => void;\n /** The ids the disclosure/panel pair is wired with. */\n headerId: string;\n panelId: string;\n}\n\nexport interface AccordionListProps<T> {\n items: T[];\n /** Receives the whole next list for every add, remove, duplicate, move or item edit. */\n onChange?: (next: T[]) => void;\n\n /** Row content, rendered inside the disclosure button after the chevron. */\n renderHeader: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Panel content. Rendered only while the row is open — never hidden with CSS. */\n renderBody: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Extra per-row actions, rendered before the built-in ones. */\n renderActions?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Persistent row metadata rendered between the disclosure and actions. */\n renderMeta?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Content above the list — typically the item count. */\n summary?: ReactNode;\n /** Names an item in its actions' accessible labels. Defaults to `Item <n>`. */\n itemLabel?: (ctx: { item: T; index: number }) => string;\n\n /** Offer the up/down reorder buttons. */\n allowReorder?: boolean;\n /**\n * Offer a grab handle at the head of every row, and drag-to-reorder across\n * the list. Arrow keys on a focused handle move the row too, so the gesture\n * is not mouse-only.\n */\n allowDrag?: boolean;\n /**\n * Whether a row takes part in dragging — as a source and as a destination.\n * Defaults to every row. A list holding rows that have no position of their\n * own (a filtered-out item, a soft-deleted one) says so here.\n */\n canDrag?: (ctx: { item: T; index: number }) => boolean;\n /**\n * Commits a completed drag or handle keypress. Defaults to the same move the\n * reorder buttons perform; a list whose order lives outside `items` (a\n * filtered view of a longer list) reorders the source through this instead.\n */\n onReorder?: (from: number, to: number) => void;\n /** Offer the duplicate button. */\n allowDuplicate?: boolean;\n /** Offer the remove button. */\n allowRemove?: boolean;\n /** Copy override for duplicate. Defaults to a one-level clone. */\n cloneItem?: (item: T) => T;\n /**\n * Reveal the per-row actions on hover/focus (the default). Pass false where an\n * action carries state the row has to show at rest — a visibility toggle whose\n * glyph says whether the item is hidden answers a question, not just offers a\n * click.\n */\n revealActions?: boolean;\n\n /** Seeds a new item. Supplying it is what adds the trailing add row. */\n onCreate?: () => T;\n /** Add-row text. Defaults to \"Add item\". */\n addLabel?: string;\n /** Add-row copy; grows into the empty state at zero items. */\n addDescription?: string;\n\n /** Controlled open row — an index, or null for none. */\n expanded?: number | null;\n /** Initially open row for uncontrolled usage. Defaults to none. */\n defaultExpanded?: number | null;\n onExpandedChange?: (index: number | null) => void;\n\n /** Hides the add row and every per-row action. Rows still open. */\n readOnly?: boolean;\n size?: SizeToken;\n /** Stem for the generated header/panel ids. */\n idPrefix?: string;\n /** Overrides the per-row id stem (e.g. with a JSON-Pointer instance path). */\n itemId?: (index: number) => string;\n /** Selector focused inside a freshly added row's panel. */\n focusSelector?: string;\n className?: string;\n listClassName?: string;\n rowClassName?: string;\n bodyClassName?: string;\n}\n\nconst DEFAULT_FOCUS_SELECTOR = \"[data-autofocus], input, select, textarea\";\n\nexport function AccordionList<T>({\n items,\n onChange,\n renderHeader,\n renderBody,\n renderActions,\n renderMeta,\n summary,\n itemLabel,\n allowReorder = false,\n allowDrag = false,\n canDrag,\n onReorder,\n allowDuplicate = false,\n allowRemove = false,\n revealActions = true,\n cloneItem,\n onCreate,\n addLabel = \"Add item\",\n addDescription,\n expanded: expandedProp,\n defaultExpanded = null,\n onExpandedChange,\n readOnly = false,\n size = \"md\",\n idPrefix = \"accordion\",\n itemId,\n focusSelector = DEFAULT_FOCUS_SELECTOR,\n className,\n listClassName,\n rowClassName,\n bodyClassName,\n}: AccordionListProps<T>) {\n // Which row is open is transient view state, deliberately local and never\n // persisted. The INDEX is the key, not the item: an editor typically replaces\n // the item object on every keystroke, so any identity-based map would die on\n // the first character typed. That makes it the mutators' job to keep this\n // pointing at the same row.\n const isControlled = expandedProp !== undefined;\n const [innerExpanded, setInnerExpanded] = useState<number | null>(defaultExpanded);\n const expanded = isControlled ? expandedProp : innerExpanded;\n\n // The in-flight drag: the row being dragged and the row the pointer is over.\n const [dragFrom, setDragFrom] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState<number | null>(null);\n\n const rowRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const addRef = useRef<HTMLButtonElement | null>(null);\n const pendingFocus = useRef<{ kind: \"panel\" | \"row\" | \"add\"; index: number } | null>(null);\n\n useEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n if (pending.kind === \"add\") {\n addRef.current?.focus();\n return;\n }\n const row = rowRefs.current[pending.index];\n if (pending.kind === \"row\") {\n row?.focus();\n return;\n }\n // Land in the new item's first editable control, so adding an item leaves\n // the caret where the author is about to type.\n const panel = document.getElementById(panelId(pending.index));\n (panel?.querySelector<HTMLElement>(focusSelector) ?? row)?.focus();\n });\n\n function rowId(index: number): string {\n return itemId ? itemId(index) : `${idPrefix}-${index}`;\n }\n function panelId(index: number): string {\n return `${rowId(index)}-panel`;\n }\n function headerId(index: number): string {\n return `${rowId(index)}-header`;\n }\n\n function expand(next: number | null) {\n if (!isControlled) setInnerExpanded(next);\n onExpandedChange?.(next);\n }\n // A mutator moves the open row without the caller having asked to expand\n // anything, so it maps the current index rather than setting an absolute one.\n function reindexExpanded(map: (open: number | null) => number | null) {\n const next = map(expanded);\n if (next !== expanded) expand(next);\n }\n\n function commit(next: T[]) {\n onChange?.(next);\n }\n\n function add() {\n if (!onCreate) return;\n pendingFocus.current = { kind: \"panel\", index: items.length };\n expand(items.length);\n commit([...items, onCreate()]);\n }\n\n function remove(index: number) {\n reindexExpanded((open) =>\n open === index ? null : open !== null && open > index ? open - 1 : open,\n );\n pendingFocus.current =\n items.length === 1\n ? { kind: \"add\", index: 0 }\n : { kind: \"row\", index: Math.max(index - 1, 0) };\n commit(removeIndex(items, index));\n }\n\n function duplicate(index: number) {\n reindexExpanded((open) => (open !== null && open > index ? open + 1 : open));\n pendingFocus.current = { kind: \"row\", index: index + 1 };\n commit(duplicateIndex(items, index, cloneItem));\n }\n\n /** Where a drag would land, so the row can draw the insertion line. */\n function dropEdge(index: number): \"top\" | \"bottom\" | null {\n if (dragFrom === null || dragOver !== index || dragFrom === index) return null;\n return dragFrom < index ? \"bottom\" : \"top\";\n }\n\n function endDrag() {\n setDragFrom(null);\n setDragOver(null);\n }\n\n function reorder(from: number, to: number) {\n if (from === to) return;\n if (onReorder) onReorder(from, to);\n else move(from, to);\n }\n\n function move(index: number, to: number) {\n if (to < 0 || to >= items.length) return;\n // Follow the item, not the slot — otherwise moving an open row silently\n // expands whichever row took its place.\n reindexExpanded((open) => (open === index ? to : open === to ? index : open));\n pendingFocus.current = { kind: \"row\", index: to };\n commit(moveItem(items, index, to));\n }\n\n // Roving focus across the headers, with the add row as the final stop.\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, index: number) {\n const stops = rowRefs.current.length;\n const focusAt = (i: number) => {\n e.preventDefault();\n (i >= stops ? addRef.current : rowRefs.current[i])?.focus();\n };\n if (e.key === \"ArrowDown\") focusAt(Math.min(index + 1, stops));\n else if (e.key === \"ArrowUp\" && index > 0) focusAt(index - 1);\n else if (e.key === \"Home\") focusAt(0);\n else if (e.key === \"End\") focusAt(stops);\n }\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {summary !== undefined && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[size])}>{summary}</p>\n )}\n <div\n className={cn(\"divide-y divide-border rounded-lg border border-border\", listClassName)}\n >\n {items.map((item, i) => {\n const open = expanded === i;\n const slotCtx: AccordionListItemContext<T> = {\n item,\n index: i,\n open,\n onChange: (next) => commit(setIndex(items, i, next)),\n headerId: headerId(i),\n panelId: panelId(i),\n };\n const label = itemLabel?.({ item, index: i }) ?? `Item ${i + 1}`;\n const actions = renderActions?.(slotCtx);\n const meta = renderMeta?.(slotCtx);\n const dragEnabled = allowDrag && !readOnly && (canDrag?.({ item, index: i }) ?? true);\n const droppable = dragEnabled && dragFrom !== null && dragFrom !== i;\n const edge = droppable ? dropEdge(i) : null;\n return (\n <div key={i} className=\"group\">\n {/* The row is a plain element, NOT a button: the actions beside it\n are buttons, and nesting interactive content is invalid DOM\n with undefined click targeting. Only the disclosure toggles. */}\n <div\n data-accordion-row\n data-drop-edge={edge ?? undefined}\n onDragOver={(e) => {\n if (!droppable) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOver(i);\n }}\n onDrop={(e) => {\n if (!droppable || dragFrom === null) return;\n e.preventDefault();\n reorder(dragFrom, i);\n endDrag();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 hover:bg-accent/40\",\n i % 2 === 0 ? \"bg-card\" : \"bg-muted/20\",\n open && \"bg-accent/30\",\n dragFrom === i && \"opacity-40\",\n edge === \"top\" && \"shadow-[inset_0_2px_0_0_var(--color-primary)]\",\n edge === \"bottom\" && \"shadow-[inset_0_-2px_0_0_var(--color-primary)]\",\n rowClassName,\n )}\n >\n {allowDrag && !readOnly && (\n <button\n type=\"button\"\n aria-label={`Reorder ${label}`}\n title={`Reorder ${label}`}\n disabled={!dragEnabled}\n draggable={dragEnabled}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(i));\n // Drag the row, not the handle glyph the pointer grabbed.\n const row = e.currentTarget.closest(\"[data-accordion-row]\");\n if (row instanceof HTMLElement) e.dataTransfer.setDragImage(row, 12, 12);\n setDragFrom(i);\n }}\n onDragEnd={endDrag}\n onKeyDown={(e) => {\n const to = e.key === \"ArrowUp\" ? i - 1 : e.key === \"ArrowDown\" ? i + 1 : i;\n if (to === i || to < 0 || to >= items.length) return;\n e.preventDefault();\n reorder(i, to);\n }}\n className=\"shrink-0 cursor-grab rounded text-muted-foreground hover:text-foreground active:cursor-grabbing disabled:cursor-default disabled:opacity-30\"\n >\n <Icon icon={UiDotsVertical} className=\"text-sm\" />\n </button>\n )}\n <button\n type=\"button\"\n id={headerId(i)}\n aria-expanded={open}\n aria-controls={panelId(i)}\n ref={(el) => {\n rowRefs.current[i] = el;\n }}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onClick={() => expand(open ? null : i)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"shrink-0 text-sm text-muted-foreground\"\n />\n {renderHeader(slotCtx)}\n </button>\n {meta}\n {!readOnly && (allowReorder || allowDuplicate || allowRemove || actions) && (\n <ItemActions\n label={label}\n index={i}\n count={items.length}\n size={size}\n reveal={revealActions}\n {...(actions ? { leading: actions } : {})}\n {...(allowReorder ? { onMove: (to: number) => move(i, to) } : {})}\n {...(allowDuplicate ? { onDuplicate: () => duplicate(i) } : {})}\n {...(allowRemove ? { onRemove: () => remove(i) } : {})}\n />\n )}\n </div>\n {open && (\n <div\n id={panelId(i)}\n role=\"region\"\n aria-labelledby={headerId(i)}\n className={cn(\"border-t border-border bg-muted/20 p-3\", bodyClassName)}\n >\n {renderBody(slotCtx)}\n </div>\n )}\n </div>\n );\n })}\n {!readOnly && onCreate && (\n <AddItemRow\n buttonRef={addRef}\n label={addLabel}\n empty={items.length === 0}\n onAdd={add}\n onKeyDown={(e) => handleKeyDown(e, items.length)}\n {...(addDescription ? { copy: addDescription } : {})}\n />\n )}\n </div>\n </div>\n );\n}\n\n// AddItemRow is the list's own final row. At zero items it grows to carry the\n// explanation of what an item is — so the empty state is the same control the\n// author will use, not a separate screen they have to leave.\nfunction AddItemRow({\n label,\n copy,\n empty,\n onAdd,\n onKeyDown,\n buttonRef,\n}: {\n label: string;\n copy?: string;\n empty: boolean;\n onAdd: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n buttonRef: MutableRefObject<HTMLButtonElement | null>;\n}) {\n return (\n <button\n type=\"button\"\n ref={(el) => {\n buttonRef.current = el;\n }}\n onClick={onAdd}\n onKeyDown={onKeyDown}\n className={cn(\n \"group/add flex w-full items-center gap-2 px-3 py-2 text-left text-muted-foreground hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n empty && \"items-start py-5\",\n )}\n >\n {/* Holds the chevron column, so this row lines up with the ones above it. */}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-sm opacity-0\" />\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md border border-dashed border-border text-foreground/60 group-hover/add:border-primary group-hover/add:text-primary\">\n <Icon icon={UiAdd} className=\"text-[13px]\" />\n </span>\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {copy && (\n <span className={cn(\"text-xs\", empty ? \"max-w-xl leading-snug\" : \"truncate\")}>{copy}</span>\n )}\n </span>\n </button>\n );\n}\n"],"names":["useState","useRef","useEffect","removeIndex","duplicateIndex","moveItem","cn","jsx","labelSizeClass","jsxs","setIndex","Icon","UiDotsVertical","UiChevronDown","UiChevronRight","ItemActions","UiAdd"],"mappings":"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"}
1
+ {"version":3,"file":"AccordionList.cjs","sources":["../../src/components/AccordionList.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n type ReactNode,\n} from \"react\";\nimport { duplicateIndex, moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport type { SizeToken } from \"../lib/size\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronRight, UiDotsVertical } from \"../icons\";\nimport { ItemActions } from \"./ItemActions\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\n\n// AccordionList renders a list of items as one-line rows, expanding one at a\n// time into that item's own editor. It exists because a ten-field item stacked\n// in full costs ~700px of screen each, and a column of them says nothing about\n// which item is which.\n//\n// It knows nothing about what an item IS: `renderHeader` fills the collapsed\n// row, `renderBody` fills the open panel, and everything structural — the\n// disclosure, the aria pairing, roving arrow-key focus, the mutation buttons,\n// the add row — belongs to the list. Every editing capability is opt-in, so the\n// same component serves a read-only summary list and a full editor.\n//\n// \"Add\" is the list's own last row rather than a button beside it: the\n// affordance sits exactly where the next item will appear, and at zero items\n// that same row IS the empty state — one control, no separate screen.\n\n/** Handed to every slot, describing one row. */\nexport interface AccordionListItemContext<T> {\n item: T;\n index: number;\n open: boolean;\n /** Replaces this item in place, committing the whole list through `onChange`. */\n onChange: (next: T) => void;\n /** The ids the disclosure/panel pair is wired with. */\n headerId: string;\n panelId: string;\n}\n\nexport interface AccordionListProps<T> {\n items: T[];\n /** Receives the whole next list for every add, remove, duplicate, move or item edit. */\n onChange?: (next: T[]) => void;\n\n /** Row content, rendered inside the disclosure button after the chevron. */\n renderHeader: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Panel content. Rendered only while the row is open — never hidden with CSS. */\n renderBody: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Extra per-row actions, rendered before the built-in ones. */\n renderActions?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Persistent row metadata rendered between the disclosure and actions. */\n renderMeta?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Content above the list — typically the item count. */\n summary?: ReactNode;\n /** List-level actions, right-aligned on the summary line (e.g. a view menu). */\n toolbar?: ReactNode;\n /** Names an item in its actions' accessible labels. Defaults to `Item <n>`. */\n itemLabel?: (ctx: { item: T; index: number }) => string;\n\n /** Offer the up/down reorder buttons. */\n allowReorder?: boolean;\n /**\n * Offer a grab handle at the head of every row, and drag-to-reorder across\n * the list. Arrow keys on a focused handle move the row too, so the gesture\n * is not mouse-only.\n */\n allowDrag?: boolean;\n /**\n * Whether a row takes part in dragging — as a source and as a destination.\n * Defaults to every row. A list holding rows that have no position of their\n * own (a filtered-out item, a soft-deleted one) says so here.\n */\n canDrag?: (ctx: { item: T; index: number }) => boolean;\n /**\n * Commits a completed drag or handle keypress. Defaults to the same move the\n * reorder buttons perform; a list whose order lives outside `items` (a\n * filtered view of a longer list) reorders the source through this instead.\n */\n onReorder?: (from: number, to: number) => void;\n /** Offer the duplicate button. */\n allowDuplicate?: boolean;\n /** Offer the remove button. */\n allowRemove?: boolean;\n /** Copy override for duplicate. Defaults to a one-level clone. */\n cloneItem?: (item: T) => T;\n /**\n * Reveal the per-row actions on hover/focus (the default). Pass false where an\n * action carries state the row has to show at rest — a visibility toggle whose\n * glyph says whether the item is hidden answers a question, not just offers a\n * click.\n */\n revealActions?: boolean;\n\n /** Seeds a new item. Supplying it is what adds the trailing add row. */\n onCreate?: () => T;\n /** Add-row text. Defaults to \"Add item\". */\n addLabel?: string;\n /** Add-row copy; grows into the empty state at zero items. */\n addDescription?: string;\n\n /** Controlled open row — an index, or null for none. */\n expanded?: number | null;\n /** Initially open row for uncontrolled usage. Defaults to none. */\n defaultExpanded?: number | null;\n onExpandedChange?: (index: number | null) => void;\n\n /** Hides the add row and every per-row action. Rows still open. */\n readOnly?: boolean;\n size?: SizeToken;\n /** Stem for the generated header/panel ids. */\n idPrefix?: string;\n /** Overrides the per-row id stem (e.g. with a JSON-Pointer instance path). */\n itemId?: (index: number) => string;\n /** Selector focused inside a freshly added row's panel. */\n focusSelector?: string;\n className?: string;\n listClassName?: string;\n rowClassName?: string;\n bodyClassName?: string;\n}\n\nconst DEFAULT_FOCUS_SELECTOR = \"[data-autofocus], input, select, textarea\";\n\nexport function AccordionList<T>({\n items,\n onChange,\n renderHeader,\n renderBody,\n renderActions,\n renderMeta,\n summary,\n toolbar,\n itemLabel,\n allowReorder = false,\n allowDrag = false,\n canDrag,\n onReorder,\n allowDuplicate = false,\n allowRemove = false,\n revealActions = true,\n cloneItem,\n onCreate,\n addLabel = \"Add item\",\n addDescription,\n expanded: expandedProp,\n defaultExpanded = null,\n onExpandedChange,\n readOnly = false,\n size = \"md\",\n idPrefix = \"accordion\",\n itemId,\n focusSelector = DEFAULT_FOCUS_SELECTOR,\n className,\n listClassName,\n rowClassName,\n bodyClassName,\n}: AccordionListProps<T>) {\n // Which row is open is transient view state, deliberately local and never\n // persisted. The INDEX is the key, not the item: an editor typically replaces\n // the item object on every keystroke, so any identity-based map would die on\n // the first character typed. That makes it the mutators' job to keep this\n // pointing at the same row.\n const isControlled = expandedProp !== undefined;\n const [innerExpanded, setInnerExpanded] = useState<number | null>(defaultExpanded);\n const expanded = isControlled ? expandedProp : innerExpanded;\n\n // The in-flight drag: the row being dragged and the row the pointer is over.\n const [dragFrom, setDragFrom] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState<number | null>(null);\n\n const rowRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const addRef = useRef<HTMLButtonElement | null>(null);\n const pendingFocus = useRef<{ kind: \"panel\" | \"row\" | \"add\"; index: number } | null>(null);\n\n useEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n if (pending.kind === \"add\") {\n addRef.current?.focus();\n return;\n }\n const row = rowRefs.current[pending.index];\n if (pending.kind === \"row\") {\n row?.focus();\n return;\n }\n // Land in the new item's first editable control, so adding an item leaves\n // the caret where the author is about to type.\n const panel = document.getElementById(panelId(pending.index));\n (panel?.querySelector<HTMLElement>(focusSelector) ?? row)?.focus();\n });\n\n function rowId(index: number): string {\n return itemId ? itemId(index) : `${idPrefix}-${index}`;\n }\n function panelId(index: number): string {\n return `${rowId(index)}-panel`;\n }\n function headerId(index: number): string {\n return `${rowId(index)}-header`;\n }\n\n function expand(next: number | null) {\n if (!isControlled) setInnerExpanded(next);\n onExpandedChange?.(next);\n }\n // A mutator moves the open row without the caller having asked to expand\n // anything, so it maps the current index rather than setting an absolute one.\n function reindexExpanded(map: (open: number | null) => number | null) {\n const next = map(expanded);\n if (next !== expanded) expand(next);\n }\n\n function commit(next: T[]) {\n onChange?.(next);\n }\n\n function add() {\n if (!onCreate) return;\n pendingFocus.current = { kind: \"panel\", index: items.length };\n expand(items.length);\n commit([...items, onCreate()]);\n }\n\n function remove(index: number) {\n reindexExpanded((open) =>\n open === index ? null : open !== null && open > index ? open - 1 : open,\n );\n pendingFocus.current =\n items.length === 1\n ? { kind: \"add\", index: 0 }\n : { kind: \"row\", index: Math.max(index - 1, 0) };\n commit(removeIndex(items, index));\n }\n\n function duplicate(index: number) {\n reindexExpanded((open) => (open !== null && open > index ? open + 1 : open));\n pendingFocus.current = { kind: \"row\", index: index + 1 };\n commit(duplicateIndex(items, index, cloneItem));\n }\n\n /** Where a drag would land, so the row can draw the insertion line. */\n function dropEdge(index: number): \"top\" | \"bottom\" | null {\n if (dragFrom === null || dragOver !== index || dragFrom === index) return null;\n return dragFrom < index ? \"bottom\" : \"top\";\n }\n\n function endDrag() {\n setDragFrom(null);\n setDragOver(null);\n }\n\n function reorder(from: number, to: number) {\n if (from === to) return;\n if (onReorder) onReorder(from, to);\n else move(from, to);\n }\n\n function move(index: number, to: number) {\n if (to < 0 || to >= items.length) return;\n // Follow the item, not the slot — otherwise moving an open row silently\n // expands whichever row took its place.\n reindexExpanded((open) => (open === index ? to : open === to ? index : open));\n pendingFocus.current = { kind: \"row\", index: to };\n commit(moveItem(items, index, to));\n }\n\n // Roving focus across the headers, with the add row as the final stop.\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, index: number) {\n const stops = rowRefs.current.length;\n const focusAt = (i: number) => {\n e.preventDefault();\n (i >= stops ? addRef.current : rowRefs.current[i])?.focus();\n };\n if (e.key === \"ArrowDown\") focusAt(Math.min(index + 1, stops));\n else if (e.key === \"ArrowUp\" && index > 0) focusAt(index - 1);\n else if (e.key === \"Home\") focusAt(0);\n else if (e.key === \"End\") focusAt(stops);\n }\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {(summary !== undefined || toolbar !== undefined) && (\n <div data-accordion-summary className=\"flex items-center justify-between gap-2\">\n {summary !== undefined && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[size])}>{summary}</p>\n )}\n {toolbar !== undefined && (\n <div className=\"ml-auto flex shrink-0 items-center\">{toolbar}</div>\n )}\n </div>\n )}\n <div\n className={cn(\"divide-y divide-border rounded-lg border border-border\", listClassName)}\n >\n {items.map((item, i) => {\n const open = expanded === i;\n const slotCtx: AccordionListItemContext<T> = {\n item,\n index: i,\n open,\n onChange: (next) => commit(setIndex(items, i, next)),\n headerId: headerId(i),\n panelId: panelId(i),\n };\n const label = itemLabel?.({ item, index: i }) ?? `Item ${i + 1}`;\n const actions = renderActions?.(slotCtx);\n const meta = renderMeta?.(slotCtx);\n const dragEnabled = allowDrag && !readOnly && (canDrag?.({ item, index: i }) ?? true);\n const droppable = dragEnabled && dragFrom !== null && dragFrom !== i;\n const edge = droppable ? dropEdge(i) : null;\n return (\n <div key={i} className=\"group\">\n {/* The row is a plain element, NOT a button: the actions beside it\n are buttons, and nesting interactive content is invalid DOM\n with undefined click targeting. Only the disclosure toggles. */}\n <div\n data-accordion-row\n data-drop-edge={edge ?? undefined}\n onDragOver={(e) => {\n if (!droppable) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOver(i);\n }}\n onDrop={(e) => {\n if (!droppable || dragFrom === null) return;\n e.preventDefault();\n reorder(dragFrom, i);\n endDrag();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 hover:bg-accent/40\",\n i % 2 === 0 ? \"bg-card\" : \"bg-muted/20\",\n open && \"bg-accent/30\",\n dragFrom === i && \"opacity-40\",\n edge === \"top\" && \"shadow-[inset_0_2px_0_0_var(--color-primary)]\",\n edge === \"bottom\" && \"shadow-[inset_0_-2px_0_0_var(--color-primary)]\",\n rowClassName,\n )}\n >\n {allowDrag && !readOnly && (\n <button\n type=\"button\"\n aria-label={`Reorder ${label}`}\n title={`Reorder ${label}`}\n disabled={!dragEnabled}\n draggable={dragEnabled}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(i));\n // Drag the row, not the handle glyph the pointer grabbed.\n const row = e.currentTarget.closest(\"[data-accordion-row]\");\n if (row instanceof HTMLElement) e.dataTransfer.setDragImage(row, 12, 12);\n setDragFrom(i);\n }}\n onDragEnd={endDrag}\n onKeyDown={(e) => {\n const to = e.key === \"ArrowUp\" ? i - 1 : e.key === \"ArrowDown\" ? i + 1 : i;\n if (to === i || to < 0 || to >= items.length) return;\n e.preventDefault();\n reorder(i, to);\n }}\n className=\"shrink-0 cursor-grab rounded text-muted-foreground hover:text-foreground active:cursor-grabbing disabled:cursor-default disabled:opacity-30\"\n >\n <Icon icon={UiDotsVertical} className=\"text-sm\" />\n </button>\n )}\n <button\n type=\"button\"\n id={headerId(i)}\n aria-expanded={open}\n aria-controls={panelId(i)}\n ref={(el) => {\n rowRefs.current[i] = el;\n }}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onClick={() => expand(open ? null : i)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"shrink-0 text-sm text-muted-foreground\"\n />\n {renderHeader(slotCtx)}\n </button>\n {meta}\n {!readOnly && (allowReorder || allowDuplicate || allowRemove || actions) && (\n <ItemActions\n label={label}\n index={i}\n count={items.length}\n size={size}\n reveal={revealActions}\n {...(actions ? { leading: actions } : {})}\n {...(allowReorder ? { onMove: (to: number) => move(i, to) } : {})}\n {...(allowDuplicate ? { onDuplicate: () => duplicate(i) } : {})}\n {...(allowRemove ? { onRemove: () => remove(i) } : {})}\n />\n )}\n </div>\n {open && (\n <div\n id={panelId(i)}\n role=\"region\"\n aria-labelledby={headerId(i)}\n className={cn(\"border-t border-border bg-muted/20 p-3\", bodyClassName)}\n >\n {renderBody(slotCtx)}\n </div>\n )}\n </div>\n );\n })}\n {!readOnly && onCreate && (\n <AddItemRow\n buttonRef={addRef}\n label={addLabel}\n empty={items.length === 0}\n onAdd={add}\n onKeyDown={(e) => handleKeyDown(e, items.length)}\n {...(addDescription ? { copy: addDescription } : {})}\n />\n )}\n </div>\n </div>\n );\n}\n\n// AddItemRow is the list's own final row. At zero items it grows to carry the\n// explanation of what an item is — so the empty state is the same control the\n// author will use, not a separate screen they have to leave.\nfunction AddItemRow({\n label,\n copy,\n empty,\n onAdd,\n onKeyDown,\n buttonRef,\n}: {\n label: string;\n copy?: string;\n empty: boolean;\n onAdd: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n buttonRef: MutableRefObject<HTMLButtonElement | null>;\n}) {\n return (\n <button\n type=\"button\"\n ref={(el) => {\n buttonRef.current = el;\n }}\n onClick={onAdd}\n onKeyDown={onKeyDown}\n className={cn(\n \"group/add flex w-full items-center gap-2 px-3 py-2 text-left text-muted-foreground hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n empty && \"items-start py-5\",\n )}\n >\n {/* Holds the chevron column, so this row lines up with the ones above it. */}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-sm opacity-0\" />\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md border border-dashed border-border text-foreground/60 group-hover/add:border-primary group-hover/add:text-primary\">\n <Icon icon={UiAdd} className=\"text-[13px]\" />\n </span>\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {copy && (\n <span className={cn(\"text-xs\", empty ? \"max-w-xl leading-snug\" : \"truncate\")}>{copy}</span>\n )}\n </span>\n </button>\n );\n}\n"],"names":["useState","useRef","useEffect","removeIndex","duplicateIndex","moveItem","cn","jsxs","jsx","labelSizeClass","setIndex","Icon","UiDotsVertical","UiChevronDown","UiChevronRight","ItemActions","UiAdd"],"mappings":"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"}
@@ -25,6 +25,8 @@ export interface AccordionListProps<T> {
25
25
  renderMeta?: (ctx: AccordionListItemContext<T>) => ReactNode;
26
26
  /** Content above the list — typically the item count. */
27
27
  summary?: ReactNode;
28
+ /** List-level actions, right-aligned on the summary line (e.g. a view menu). */
29
+ toolbar?: ReactNode;
28
30
  /** Names an item in its actions' accessible labels. Defaults to `Item <n>`. */
29
31
  itemLabel?: (ctx: {
30
32
  item: T;
@@ -91,5 +93,5 @@ export interface AccordionListProps<T> {
91
93
  rowClassName?: string;
92
94
  bodyClassName?: string;
93
95
  }
94
- export declare function AccordionList<T>({ items, onChange, renderHeader, renderBody, renderActions, renderMeta, summary, itemLabel, allowReorder, allowDrag, canDrag, onReorder, allowDuplicate, allowRemove, revealActions, cloneItem, onCreate, addLabel, addDescription, expanded: expandedProp, defaultExpanded, onExpandedChange, readOnly, size, idPrefix, itemId, focusSelector, className, listClassName, rowClassName, bodyClassName, }: AccordionListProps<T>): import("react").JSX.Element;
96
+ export declare function AccordionList<T>({ items, onChange, renderHeader, renderBody, renderActions, renderMeta, summary, toolbar, itemLabel, allowReorder, allowDrag, canDrag, onReorder, allowDuplicate, allowRemove, revealActions, cloneItem, onCreate, addLabel, addDescription, expanded: expandedProp, defaultExpanded, onExpandedChange, readOnly, size, idPrefix, itemId, focusSelector, className, listClassName, rowClassName, bodyClassName, }: AccordionListProps<T>): import("react").JSX.Element;
95
97
  //# sourceMappingURL=AccordionList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionList.d.ts","sourceRoot":"","sources":["../../src/components/AccordionList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccordionList.d.ts","sourceRoot":"","sources":["../../src/components/AccordionList.tsx"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ function AccordionList({
18
18
  renderActions,
19
19
  renderMeta,
20
20
  summary,
21
+ toolbar,
21
22
  itemLabel,
22
23
  allowReorder = false,
23
24
  allowDrag = false,
@@ -138,7 +139,10 @@ function AccordionList({
138
139
  else if (e.key === "End") focusAt(stops);
139
140
  }
140
141
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
141
- summary !== void 0 && /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground", labelSizeClass[size]), children: summary }),
142
+ (summary !== void 0 || toolbar !== void 0) && /* @__PURE__ */ jsxs("div", { "data-accordion-summary": true, className: "flex items-center justify-between gap-2", children: [
143
+ summary !== void 0 && /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground", labelSizeClass[size]), children: summary }),
144
+ toolbar !== void 0 && /* @__PURE__ */ jsx("div", { className: "ml-auto flex shrink-0 items-center", children: toolbar })
145
+ ] }),
142
146
  /* @__PURE__ */ jsxs(
143
147
  "div",
144
148
  {
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionList.js","sources":["../../src/components/AccordionList.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n type ReactNode,\n} from \"react\";\nimport { duplicateIndex, moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport type { SizeToken } from \"../lib/size\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronRight, UiDotsVertical } from \"../icons\";\nimport { ItemActions } from \"./ItemActions\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\n\n// AccordionList renders a list of items as one-line rows, expanding one at a\n// time into that item's own editor. It exists because a ten-field item stacked\n// in full costs ~700px of screen each, and a column of them says nothing about\n// which item is which.\n//\n// It knows nothing about what an item IS: `renderHeader` fills the collapsed\n// row, `renderBody` fills the open panel, and everything structural — the\n// disclosure, the aria pairing, roving arrow-key focus, the mutation buttons,\n// the add row — belongs to the list. Every editing capability is opt-in, so the\n// same component serves a read-only summary list and a full editor.\n//\n// \"Add\" is the list's own last row rather than a button beside it: the\n// affordance sits exactly where the next item will appear, and at zero items\n// that same row IS the empty state — one control, no separate screen.\n\n/** Handed to every slot, describing one row. */\nexport interface AccordionListItemContext<T> {\n item: T;\n index: number;\n open: boolean;\n /** Replaces this item in place, committing the whole list through `onChange`. */\n onChange: (next: T) => void;\n /** The ids the disclosure/panel pair is wired with. */\n headerId: string;\n panelId: string;\n}\n\nexport interface AccordionListProps<T> {\n items: T[];\n /** Receives the whole next list for every add, remove, duplicate, move or item edit. */\n onChange?: (next: T[]) => void;\n\n /** Row content, rendered inside the disclosure button after the chevron. */\n renderHeader: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Panel content. Rendered only while the row is open — never hidden with CSS. */\n renderBody: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Extra per-row actions, rendered before the built-in ones. */\n renderActions?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Persistent row metadata rendered between the disclosure and actions. */\n renderMeta?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Content above the list — typically the item count. */\n summary?: ReactNode;\n /** Names an item in its actions' accessible labels. Defaults to `Item <n>`. */\n itemLabel?: (ctx: { item: T; index: number }) => string;\n\n /** Offer the up/down reorder buttons. */\n allowReorder?: boolean;\n /**\n * Offer a grab handle at the head of every row, and drag-to-reorder across\n * the list. Arrow keys on a focused handle move the row too, so the gesture\n * is not mouse-only.\n */\n allowDrag?: boolean;\n /**\n * Whether a row takes part in dragging — as a source and as a destination.\n * Defaults to every row. A list holding rows that have no position of their\n * own (a filtered-out item, a soft-deleted one) says so here.\n */\n canDrag?: (ctx: { item: T; index: number }) => boolean;\n /**\n * Commits a completed drag or handle keypress. Defaults to the same move the\n * reorder buttons perform; a list whose order lives outside `items` (a\n * filtered view of a longer list) reorders the source through this instead.\n */\n onReorder?: (from: number, to: number) => void;\n /** Offer the duplicate button. */\n allowDuplicate?: boolean;\n /** Offer the remove button. */\n allowRemove?: boolean;\n /** Copy override for duplicate. Defaults to a one-level clone. */\n cloneItem?: (item: T) => T;\n /**\n * Reveal the per-row actions on hover/focus (the default). Pass false where an\n * action carries state the row has to show at rest — a visibility toggle whose\n * glyph says whether the item is hidden answers a question, not just offers a\n * click.\n */\n revealActions?: boolean;\n\n /** Seeds a new item. Supplying it is what adds the trailing add row. */\n onCreate?: () => T;\n /** Add-row text. Defaults to \"Add item\". */\n addLabel?: string;\n /** Add-row copy; grows into the empty state at zero items. */\n addDescription?: string;\n\n /** Controlled open row — an index, or null for none. */\n expanded?: number | null;\n /** Initially open row for uncontrolled usage. Defaults to none. */\n defaultExpanded?: number | null;\n onExpandedChange?: (index: number | null) => void;\n\n /** Hides the add row and every per-row action. Rows still open. */\n readOnly?: boolean;\n size?: SizeToken;\n /** Stem for the generated header/panel ids. */\n idPrefix?: string;\n /** Overrides the per-row id stem (e.g. with a JSON-Pointer instance path). */\n itemId?: (index: number) => string;\n /** Selector focused inside a freshly added row's panel. */\n focusSelector?: string;\n className?: string;\n listClassName?: string;\n rowClassName?: string;\n bodyClassName?: string;\n}\n\nconst DEFAULT_FOCUS_SELECTOR = \"[data-autofocus], input, select, textarea\";\n\nexport function AccordionList<T>({\n items,\n onChange,\n renderHeader,\n renderBody,\n renderActions,\n renderMeta,\n summary,\n itemLabel,\n allowReorder = false,\n allowDrag = false,\n canDrag,\n onReorder,\n allowDuplicate = false,\n allowRemove = false,\n revealActions = true,\n cloneItem,\n onCreate,\n addLabel = \"Add item\",\n addDescription,\n expanded: expandedProp,\n defaultExpanded = null,\n onExpandedChange,\n readOnly = false,\n size = \"md\",\n idPrefix = \"accordion\",\n itemId,\n focusSelector = DEFAULT_FOCUS_SELECTOR,\n className,\n listClassName,\n rowClassName,\n bodyClassName,\n}: AccordionListProps<T>) {\n // Which row is open is transient view state, deliberately local and never\n // persisted. The INDEX is the key, not the item: an editor typically replaces\n // the item object on every keystroke, so any identity-based map would die on\n // the first character typed. That makes it the mutators' job to keep this\n // pointing at the same row.\n const isControlled = expandedProp !== undefined;\n const [innerExpanded, setInnerExpanded] = useState<number | null>(defaultExpanded);\n const expanded = isControlled ? expandedProp : innerExpanded;\n\n // The in-flight drag: the row being dragged and the row the pointer is over.\n const [dragFrom, setDragFrom] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState<number | null>(null);\n\n const rowRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const addRef = useRef<HTMLButtonElement | null>(null);\n const pendingFocus = useRef<{ kind: \"panel\" | \"row\" | \"add\"; index: number } | null>(null);\n\n useEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n if (pending.kind === \"add\") {\n addRef.current?.focus();\n return;\n }\n const row = rowRefs.current[pending.index];\n if (pending.kind === \"row\") {\n row?.focus();\n return;\n }\n // Land in the new item's first editable control, so adding an item leaves\n // the caret where the author is about to type.\n const panel = document.getElementById(panelId(pending.index));\n (panel?.querySelector<HTMLElement>(focusSelector) ?? row)?.focus();\n });\n\n function rowId(index: number): string {\n return itemId ? itemId(index) : `${idPrefix}-${index}`;\n }\n function panelId(index: number): string {\n return `${rowId(index)}-panel`;\n }\n function headerId(index: number): string {\n return `${rowId(index)}-header`;\n }\n\n function expand(next: number | null) {\n if (!isControlled) setInnerExpanded(next);\n onExpandedChange?.(next);\n }\n // A mutator moves the open row without the caller having asked to expand\n // anything, so it maps the current index rather than setting an absolute one.\n function reindexExpanded(map: (open: number | null) => number | null) {\n const next = map(expanded);\n if (next !== expanded) expand(next);\n }\n\n function commit(next: T[]) {\n onChange?.(next);\n }\n\n function add() {\n if (!onCreate) return;\n pendingFocus.current = { kind: \"panel\", index: items.length };\n expand(items.length);\n commit([...items, onCreate()]);\n }\n\n function remove(index: number) {\n reindexExpanded((open) =>\n open === index ? null : open !== null && open > index ? open - 1 : open,\n );\n pendingFocus.current =\n items.length === 1\n ? { kind: \"add\", index: 0 }\n : { kind: \"row\", index: Math.max(index - 1, 0) };\n commit(removeIndex(items, index));\n }\n\n function duplicate(index: number) {\n reindexExpanded((open) => (open !== null && open > index ? open + 1 : open));\n pendingFocus.current = { kind: \"row\", index: index + 1 };\n commit(duplicateIndex(items, index, cloneItem));\n }\n\n /** Where a drag would land, so the row can draw the insertion line. */\n function dropEdge(index: number): \"top\" | \"bottom\" | null {\n if (dragFrom === null || dragOver !== index || dragFrom === index) return null;\n return dragFrom < index ? \"bottom\" : \"top\";\n }\n\n function endDrag() {\n setDragFrom(null);\n setDragOver(null);\n }\n\n function reorder(from: number, to: number) {\n if (from === to) return;\n if (onReorder) onReorder(from, to);\n else move(from, to);\n }\n\n function move(index: number, to: number) {\n if (to < 0 || to >= items.length) return;\n // Follow the item, not the slot — otherwise moving an open row silently\n // expands whichever row took its place.\n reindexExpanded((open) => (open === index ? to : open === to ? index : open));\n pendingFocus.current = { kind: \"row\", index: to };\n commit(moveItem(items, index, to));\n }\n\n // Roving focus across the headers, with the add row as the final stop.\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, index: number) {\n const stops = rowRefs.current.length;\n const focusAt = (i: number) => {\n e.preventDefault();\n (i >= stops ? addRef.current : rowRefs.current[i])?.focus();\n };\n if (e.key === \"ArrowDown\") focusAt(Math.min(index + 1, stops));\n else if (e.key === \"ArrowUp\" && index > 0) focusAt(index - 1);\n else if (e.key === \"Home\") focusAt(0);\n else if (e.key === \"End\") focusAt(stops);\n }\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {summary !== undefined && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[size])}>{summary}</p>\n )}\n <div\n className={cn(\"divide-y divide-border rounded-lg border border-border\", listClassName)}\n >\n {items.map((item, i) => {\n const open = expanded === i;\n const slotCtx: AccordionListItemContext<T> = {\n item,\n index: i,\n open,\n onChange: (next) => commit(setIndex(items, i, next)),\n headerId: headerId(i),\n panelId: panelId(i),\n };\n const label = itemLabel?.({ item, index: i }) ?? `Item ${i + 1}`;\n const actions = renderActions?.(slotCtx);\n const meta = renderMeta?.(slotCtx);\n const dragEnabled = allowDrag && !readOnly && (canDrag?.({ item, index: i }) ?? true);\n const droppable = dragEnabled && dragFrom !== null && dragFrom !== i;\n const edge = droppable ? dropEdge(i) : null;\n return (\n <div key={i} className=\"group\">\n {/* The row is a plain element, NOT a button: the actions beside it\n are buttons, and nesting interactive content is invalid DOM\n with undefined click targeting. Only the disclosure toggles. */}\n <div\n data-accordion-row\n data-drop-edge={edge ?? undefined}\n onDragOver={(e) => {\n if (!droppable) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOver(i);\n }}\n onDrop={(e) => {\n if (!droppable || dragFrom === null) return;\n e.preventDefault();\n reorder(dragFrom, i);\n endDrag();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 hover:bg-accent/40\",\n i % 2 === 0 ? \"bg-card\" : \"bg-muted/20\",\n open && \"bg-accent/30\",\n dragFrom === i && \"opacity-40\",\n edge === \"top\" && \"shadow-[inset_0_2px_0_0_var(--color-primary)]\",\n edge === \"bottom\" && \"shadow-[inset_0_-2px_0_0_var(--color-primary)]\",\n rowClassName,\n )}\n >\n {allowDrag && !readOnly && (\n <button\n type=\"button\"\n aria-label={`Reorder ${label}`}\n title={`Reorder ${label}`}\n disabled={!dragEnabled}\n draggable={dragEnabled}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(i));\n // Drag the row, not the handle glyph the pointer grabbed.\n const row = e.currentTarget.closest(\"[data-accordion-row]\");\n if (row instanceof HTMLElement) e.dataTransfer.setDragImage(row, 12, 12);\n setDragFrom(i);\n }}\n onDragEnd={endDrag}\n onKeyDown={(e) => {\n const to = e.key === \"ArrowUp\" ? i - 1 : e.key === \"ArrowDown\" ? i + 1 : i;\n if (to === i || to < 0 || to >= items.length) return;\n e.preventDefault();\n reorder(i, to);\n }}\n className=\"shrink-0 cursor-grab rounded text-muted-foreground hover:text-foreground active:cursor-grabbing disabled:cursor-default disabled:opacity-30\"\n >\n <Icon icon={UiDotsVertical} className=\"text-sm\" />\n </button>\n )}\n <button\n type=\"button\"\n id={headerId(i)}\n aria-expanded={open}\n aria-controls={panelId(i)}\n ref={(el) => {\n rowRefs.current[i] = el;\n }}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onClick={() => expand(open ? null : i)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"shrink-0 text-sm text-muted-foreground\"\n />\n {renderHeader(slotCtx)}\n </button>\n {meta}\n {!readOnly && (allowReorder || allowDuplicate || allowRemove || actions) && (\n <ItemActions\n label={label}\n index={i}\n count={items.length}\n size={size}\n reveal={revealActions}\n {...(actions ? { leading: actions } : {})}\n {...(allowReorder ? { onMove: (to: number) => move(i, to) } : {})}\n {...(allowDuplicate ? { onDuplicate: () => duplicate(i) } : {})}\n {...(allowRemove ? { onRemove: () => remove(i) } : {})}\n />\n )}\n </div>\n {open && (\n <div\n id={panelId(i)}\n role=\"region\"\n aria-labelledby={headerId(i)}\n className={cn(\"border-t border-border bg-muted/20 p-3\", bodyClassName)}\n >\n {renderBody(slotCtx)}\n </div>\n )}\n </div>\n );\n })}\n {!readOnly && onCreate && (\n <AddItemRow\n buttonRef={addRef}\n label={addLabel}\n empty={items.length === 0}\n onAdd={add}\n onKeyDown={(e) => handleKeyDown(e, items.length)}\n {...(addDescription ? { copy: addDescription } : {})}\n />\n )}\n </div>\n </div>\n );\n}\n\n// AddItemRow is the list's own final row. At zero items it grows to carry the\n// explanation of what an item is — so the empty state is the same control the\n// author will use, not a separate screen they have to leave.\nfunction AddItemRow({\n label,\n copy,\n empty,\n onAdd,\n onKeyDown,\n buttonRef,\n}: {\n label: string;\n copy?: string;\n empty: boolean;\n onAdd: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n buttonRef: MutableRefObject<HTMLButtonElement | null>;\n}) {\n return (\n <button\n type=\"button\"\n ref={(el) => {\n buttonRef.current = el;\n }}\n onClick={onAdd}\n onKeyDown={onKeyDown}\n className={cn(\n \"group/add flex w-full items-center gap-2 px-3 py-2 text-left text-muted-foreground hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n empty && \"items-start py-5\",\n )}\n >\n {/* Holds the chevron column, so this row lines up with the ones above it. */}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-sm opacity-0\" />\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md border border-dashed border-border text-foreground/60 group-hover/add:border-primary group-hover/add:text-primary\">\n <Icon icon={UiAdd} className=\"text-[13px]\" />\n </span>\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {copy && (\n <span className={cn(\"text-xs\", empty ? \"max-w-xl leading-snug\" : \"truncate\")}>{copy}</span>\n )}\n </span>\n </button>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccordionList.js","sources":["../../src/components/AccordionList.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n type ReactNode,\n} from \"react\";\nimport { duplicateIndex, moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport type { SizeToken } from \"../lib/size\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronRight, UiDotsVertical } from \"../icons\";\nimport { ItemActions } from \"./ItemActions\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\n\n// AccordionList renders a list of items as one-line rows, expanding one at a\n// time into that item's own editor. It exists because a ten-field item stacked\n// in full costs ~700px of screen each, and a column of them says nothing about\n// which item is which.\n//\n// It knows nothing about what an item IS: `renderHeader` fills the collapsed\n// row, `renderBody` fills the open panel, and everything structural — the\n// disclosure, the aria pairing, roving arrow-key focus, the mutation buttons,\n// the add row — belongs to the list. Every editing capability is opt-in, so the\n// same component serves a read-only summary list and a full editor.\n//\n// \"Add\" is the list's own last row rather than a button beside it: the\n// affordance sits exactly where the next item will appear, and at zero items\n// that same row IS the empty state — one control, no separate screen.\n\n/** Handed to every slot, describing one row. */\nexport interface AccordionListItemContext<T> {\n item: T;\n index: number;\n open: boolean;\n /** Replaces this item in place, committing the whole list through `onChange`. */\n onChange: (next: T) => void;\n /** The ids the disclosure/panel pair is wired with. */\n headerId: string;\n panelId: string;\n}\n\nexport interface AccordionListProps<T> {\n items: T[];\n /** Receives the whole next list for every add, remove, duplicate, move or item edit. */\n onChange?: (next: T[]) => void;\n\n /** Row content, rendered inside the disclosure button after the chevron. */\n renderHeader: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Panel content. Rendered only while the row is open — never hidden with CSS. */\n renderBody: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Extra per-row actions, rendered before the built-in ones. */\n renderActions?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Persistent row metadata rendered between the disclosure and actions. */\n renderMeta?: (ctx: AccordionListItemContext<T>) => ReactNode;\n /** Content above the list — typically the item count. */\n summary?: ReactNode;\n /** List-level actions, right-aligned on the summary line (e.g. a view menu). */\n toolbar?: ReactNode;\n /** Names an item in its actions' accessible labels. Defaults to `Item <n>`. */\n itemLabel?: (ctx: { item: T; index: number }) => string;\n\n /** Offer the up/down reorder buttons. */\n allowReorder?: boolean;\n /**\n * Offer a grab handle at the head of every row, and drag-to-reorder across\n * the list. Arrow keys on a focused handle move the row too, so the gesture\n * is not mouse-only.\n */\n allowDrag?: boolean;\n /**\n * Whether a row takes part in dragging — as a source and as a destination.\n * Defaults to every row. A list holding rows that have no position of their\n * own (a filtered-out item, a soft-deleted one) says so here.\n */\n canDrag?: (ctx: { item: T; index: number }) => boolean;\n /**\n * Commits a completed drag or handle keypress. Defaults to the same move the\n * reorder buttons perform; a list whose order lives outside `items` (a\n * filtered view of a longer list) reorders the source through this instead.\n */\n onReorder?: (from: number, to: number) => void;\n /** Offer the duplicate button. */\n allowDuplicate?: boolean;\n /** Offer the remove button. */\n allowRemove?: boolean;\n /** Copy override for duplicate. Defaults to a one-level clone. */\n cloneItem?: (item: T) => T;\n /**\n * Reveal the per-row actions on hover/focus (the default). Pass false where an\n * action carries state the row has to show at rest — a visibility toggle whose\n * glyph says whether the item is hidden answers a question, not just offers a\n * click.\n */\n revealActions?: boolean;\n\n /** Seeds a new item. Supplying it is what adds the trailing add row. */\n onCreate?: () => T;\n /** Add-row text. Defaults to \"Add item\". */\n addLabel?: string;\n /** Add-row copy; grows into the empty state at zero items. */\n addDescription?: string;\n\n /** Controlled open row — an index, or null for none. */\n expanded?: number | null;\n /** Initially open row for uncontrolled usage. Defaults to none. */\n defaultExpanded?: number | null;\n onExpandedChange?: (index: number | null) => void;\n\n /** Hides the add row and every per-row action. Rows still open. */\n readOnly?: boolean;\n size?: SizeToken;\n /** Stem for the generated header/panel ids. */\n idPrefix?: string;\n /** Overrides the per-row id stem (e.g. with a JSON-Pointer instance path). */\n itemId?: (index: number) => string;\n /** Selector focused inside a freshly added row's panel. */\n focusSelector?: string;\n className?: string;\n listClassName?: string;\n rowClassName?: string;\n bodyClassName?: string;\n}\n\nconst DEFAULT_FOCUS_SELECTOR = \"[data-autofocus], input, select, textarea\";\n\nexport function AccordionList<T>({\n items,\n onChange,\n renderHeader,\n renderBody,\n renderActions,\n renderMeta,\n summary,\n toolbar,\n itemLabel,\n allowReorder = false,\n allowDrag = false,\n canDrag,\n onReorder,\n allowDuplicate = false,\n allowRemove = false,\n revealActions = true,\n cloneItem,\n onCreate,\n addLabel = \"Add item\",\n addDescription,\n expanded: expandedProp,\n defaultExpanded = null,\n onExpandedChange,\n readOnly = false,\n size = \"md\",\n idPrefix = \"accordion\",\n itemId,\n focusSelector = DEFAULT_FOCUS_SELECTOR,\n className,\n listClassName,\n rowClassName,\n bodyClassName,\n}: AccordionListProps<T>) {\n // Which row is open is transient view state, deliberately local and never\n // persisted. The INDEX is the key, not the item: an editor typically replaces\n // the item object on every keystroke, so any identity-based map would die on\n // the first character typed. That makes it the mutators' job to keep this\n // pointing at the same row.\n const isControlled = expandedProp !== undefined;\n const [innerExpanded, setInnerExpanded] = useState<number | null>(defaultExpanded);\n const expanded = isControlled ? expandedProp : innerExpanded;\n\n // The in-flight drag: the row being dragged and the row the pointer is over.\n const [dragFrom, setDragFrom] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState<number | null>(null);\n\n const rowRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const addRef = useRef<HTMLButtonElement | null>(null);\n const pendingFocus = useRef<{ kind: \"panel\" | \"row\" | \"add\"; index: number } | null>(null);\n\n useEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n if (pending.kind === \"add\") {\n addRef.current?.focus();\n return;\n }\n const row = rowRefs.current[pending.index];\n if (pending.kind === \"row\") {\n row?.focus();\n return;\n }\n // Land in the new item's first editable control, so adding an item leaves\n // the caret where the author is about to type.\n const panel = document.getElementById(panelId(pending.index));\n (panel?.querySelector<HTMLElement>(focusSelector) ?? row)?.focus();\n });\n\n function rowId(index: number): string {\n return itemId ? itemId(index) : `${idPrefix}-${index}`;\n }\n function panelId(index: number): string {\n return `${rowId(index)}-panel`;\n }\n function headerId(index: number): string {\n return `${rowId(index)}-header`;\n }\n\n function expand(next: number | null) {\n if (!isControlled) setInnerExpanded(next);\n onExpandedChange?.(next);\n }\n // A mutator moves the open row without the caller having asked to expand\n // anything, so it maps the current index rather than setting an absolute one.\n function reindexExpanded(map: (open: number | null) => number | null) {\n const next = map(expanded);\n if (next !== expanded) expand(next);\n }\n\n function commit(next: T[]) {\n onChange?.(next);\n }\n\n function add() {\n if (!onCreate) return;\n pendingFocus.current = { kind: \"panel\", index: items.length };\n expand(items.length);\n commit([...items, onCreate()]);\n }\n\n function remove(index: number) {\n reindexExpanded((open) =>\n open === index ? null : open !== null && open > index ? open - 1 : open,\n );\n pendingFocus.current =\n items.length === 1\n ? { kind: \"add\", index: 0 }\n : { kind: \"row\", index: Math.max(index - 1, 0) };\n commit(removeIndex(items, index));\n }\n\n function duplicate(index: number) {\n reindexExpanded((open) => (open !== null && open > index ? open + 1 : open));\n pendingFocus.current = { kind: \"row\", index: index + 1 };\n commit(duplicateIndex(items, index, cloneItem));\n }\n\n /** Where a drag would land, so the row can draw the insertion line. */\n function dropEdge(index: number): \"top\" | \"bottom\" | null {\n if (dragFrom === null || dragOver !== index || dragFrom === index) return null;\n return dragFrom < index ? \"bottom\" : \"top\";\n }\n\n function endDrag() {\n setDragFrom(null);\n setDragOver(null);\n }\n\n function reorder(from: number, to: number) {\n if (from === to) return;\n if (onReorder) onReorder(from, to);\n else move(from, to);\n }\n\n function move(index: number, to: number) {\n if (to < 0 || to >= items.length) return;\n // Follow the item, not the slot — otherwise moving an open row silently\n // expands whichever row took its place.\n reindexExpanded((open) => (open === index ? to : open === to ? index : open));\n pendingFocus.current = { kind: \"row\", index: to };\n commit(moveItem(items, index, to));\n }\n\n // Roving focus across the headers, with the add row as the final stop.\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, index: number) {\n const stops = rowRefs.current.length;\n const focusAt = (i: number) => {\n e.preventDefault();\n (i >= stops ? addRef.current : rowRefs.current[i])?.focus();\n };\n if (e.key === \"ArrowDown\") focusAt(Math.min(index + 1, stops));\n else if (e.key === \"ArrowUp\" && index > 0) focusAt(index - 1);\n else if (e.key === \"Home\") focusAt(0);\n else if (e.key === \"End\") focusAt(stops);\n }\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {(summary !== undefined || toolbar !== undefined) && (\n <div data-accordion-summary className=\"flex items-center justify-between gap-2\">\n {summary !== undefined && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[size])}>{summary}</p>\n )}\n {toolbar !== undefined && (\n <div className=\"ml-auto flex shrink-0 items-center\">{toolbar}</div>\n )}\n </div>\n )}\n <div\n className={cn(\"divide-y divide-border rounded-lg border border-border\", listClassName)}\n >\n {items.map((item, i) => {\n const open = expanded === i;\n const slotCtx: AccordionListItemContext<T> = {\n item,\n index: i,\n open,\n onChange: (next) => commit(setIndex(items, i, next)),\n headerId: headerId(i),\n panelId: panelId(i),\n };\n const label = itemLabel?.({ item, index: i }) ?? `Item ${i + 1}`;\n const actions = renderActions?.(slotCtx);\n const meta = renderMeta?.(slotCtx);\n const dragEnabled = allowDrag && !readOnly && (canDrag?.({ item, index: i }) ?? true);\n const droppable = dragEnabled && dragFrom !== null && dragFrom !== i;\n const edge = droppable ? dropEdge(i) : null;\n return (\n <div key={i} className=\"group\">\n {/* The row is a plain element, NOT a button: the actions beside it\n are buttons, and nesting interactive content is invalid DOM\n with undefined click targeting. Only the disclosure toggles. */}\n <div\n data-accordion-row\n data-drop-edge={edge ?? undefined}\n onDragOver={(e) => {\n if (!droppable) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOver(i);\n }}\n onDrop={(e) => {\n if (!droppable || dragFrom === null) return;\n e.preventDefault();\n reorder(dragFrom, i);\n endDrag();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 hover:bg-accent/40\",\n i % 2 === 0 ? \"bg-card\" : \"bg-muted/20\",\n open && \"bg-accent/30\",\n dragFrom === i && \"opacity-40\",\n edge === \"top\" && \"shadow-[inset_0_2px_0_0_var(--color-primary)]\",\n edge === \"bottom\" && \"shadow-[inset_0_-2px_0_0_var(--color-primary)]\",\n rowClassName,\n )}\n >\n {allowDrag && !readOnly && (\n <button\n type=\"button\"\n aria-label={`Reorder ${label}`}\n title={`Reorder ${label}`}\n disabled={!dragEnabled}\n draggable={dragEnabled}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(i));\n // Drag the row, not the handle glyph the pointer grabbed.\n const row = e.currentTarget.closest(\"[data-accordion-row]\");\n if (row instanceof HTMLElement) e.dataTransfer.setDragImage(row, 12, 12);\n setDragFrom(i);\n }}\n onDragEnd={endDrag}\n onKeyDown={(e) => {\n const to = e.key === \"ArrowUp\" ? i - 1 : e.key === \"ArrowDown\" ? i + 1 : i;\n if (to === i || to < 0 || to >= items.length) return;\n e.preventDefault();\n reorder(i, to);\n }}\n className=\"shrink-0 cursor-grab rounded text-muted-foreground hover:text-foreground active:cursor-grabbing disabled:cursor-default disabled:opacity-30\"\n >\n <Icon icon={UiDotsVertical} className=\"text-sm\" />\n </button>\n )}\n <button\n type=\"button\"\n id={headerId(i)}\n aria-expanded={open}\n aria-controls={panelId(i)}\n ref={(el) => {\n rowRefs.current[i] = el;\n }}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onClick={() => expand(open ? null : i)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"shrink-0 text-sm text-muted-foreground\"\n />\n {renderHeader(slotCtx)}\n </button>\n {meta}\n {!readOnly && (allowReorder || allowDuplicate || allowRemove || actions) && (\n <ItemActions\n label={label}\n index={i}\n count={items.length}\n size={size}\n reveal={revealActions}\n {...(actions ? { leading: actions } : {})}\n {...(allowReorder ? { onMove: (to: number) => move(i, to) } : {})}\n {...(allowDuplicate ? { onDuplicate: () => duplicate(i) } : {})}\n {...(allowRemove ? { onRemove: () => remove(i) } : {})}\n />\n )}\n </div>\n {open && (\n <div\n id={panelId(i)}\n role=\"region\"\n aria-labelledby={headerId(i)}\n className={cn(\"border-t border-border bg-muted/20 p-3\", bodyClassName)}\n >\n {renderBody(slotCtx)}\n </div>\n )}\n </div>\n );\n })}\n {!readOnly && onCreate && (\n <AddItemRow\n buttonRef={addRef}\n label={addLabel}\n empty={items.length === 0}\n onAdd={add}\n onKeyDown={(e) => handleKeyDown(e, items.length)}\n {...(addDescription ? { copy: addDescription } : {})}\n />\n )}\n </div>\n </div>\n );\n}\n\n// AddItemRow is the list's own final row. At zero items it grows to carry the\n// explanation of what an item is — so the empty state is the same control the\n// author will use, not a separate screen they have to leave.\nfunction AddItemRow({\n label,\n copy,\n empty,\n onAdd,\n onKeyDown,\n buttonRef,\n}: {\n label: string;\n copy?: string;\n empty: boolean;\n onAdd: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n buttonRef: MutableRefObject<HTMLButtonElement | null>;\n}) {\n return (\n <button\n type=\"button\"\n ref={(el) => {\n buttonRef.current = el;\n }}\n onClick={onAdd}\n onKeyDown={onKeyDown}\n className={cn(\n \"group/add flex w-full items-center gap-2 px-3 py-2 text-left text-muted-foreground hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n empty && \"items-start py-5\",\n )}\n >\n {/* Holds the chevron column, so this row lines up with the ones above it. */}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-sm opacity-0\" />\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md border border-dashed border-border text-foreground/60 group-hover/add:border-primary group-hover/add:text-primary\">\n <Icon icon={UiAdd} className=\"text-[13px]\" />\n </span>\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {copy && (\n <span className={cn(\"text-xs\", empty ? \"max-w-xl leading-snug\" : \"truncate\")}>{copy}</span>\n )}\n </span>\n </button>\n );\n}\n"],"names":[],"mappings":"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"}