@pipe0/react 0.0.5 → 0.0.6

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 (307) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +58 -2
  3. package/dist/components/compound/pipe-catalog/active-filters.d.mts +7 -10
  4. package/dist/components/compound/pipe-catalog/active-filters.d.mts.map +1 -1
  5. package/dist/components/compound/pipe-catalog/active-filters.mjs +22 -18
  6. package/dist/components/compound/pipe-catalog/active-filters.mjs.map +1 -1
  7. package/dist/components/compound/pipe-catalog/card.d.mts +3 -12
  8. package/dist/components/compound/pipe-catalog/card.d.mts.map +1 -1
  9. package/dist/components/compound/pipe-catalog/card.mjs +28 -25
  10. package/dist/components/compound/pipe-catalog/card.mjs.map +1 -1
  11. package/dist/components/compound/pipe-catalog/category-filter.d.mts +6 -13
  12. package/dist/components/compound/pipe-catalog/category-filter.d.mts.map +1 -1
  13. package/dist/components/compound/pipe-catalog/category-filter.mjs +12 -13
  14. package/dist/components/compound/pipe-catalog/category-filter.mjs.map +1 -1
  15. package/dist/components/compound/pipe-catalog/column-filter.d.mts +6 -14
  16. package/dist/components/compound/pipe-catalog/column-filter.d.mts.map +1 -1
  17. package/dist/components/compound/pipe-catalog/column-filter.mjs +9 -9
  18. package/dist/components/compound/pipe-catalog/column-filter.mjs.map +1 -1
  19. package/dist/components/compound/pipe-catalog/empty.d.mts +5 -10
  20. package/dist/components/compound/pipe-catalog/empty.d.mts.map +1 -1
  21. package/dist/components/compound/pipe-catalog/empty.mjs +12 -14
  22. package/dist/components/compound/pipe-catalog/empty.mjs.map +1 -1
  23. package/dist/components/compound/pipe-catalog/index.d.mts +1 -1
  24. package/dist/components/compound/pipe-catalog/input-field-filter.d.mts +3 -3
  25. package/dist/components/compound/pipe-catalog/input-field-filter.d.mts.map +1 -1
  26. package/dist/components/compound/pipe-catalog/input-field-filter.mjs.map +1 -1
  27. package/dist/components/compound/pipe-catalog/list.d.mts +8 -25
  28. package/dist/components/compound/pipe-catalog/list.d.mts.map +1 -1
  29. package/dist/components/compound/pipe-catalog/list.mjs +14 -14
  30. package/dist/components/compound/pipe-catalog/list.mjs.map +1 -1
  31. package/dist/components/compound/pipe-catalog/output-field-filter.d.mts +3 -3
  32. package/dist/components/compound/pipe-catalog/output-field-filter.d.mts.map +1 -1
  33. package/dist/components/compound/pipe-catalog/output-field-filter.mjs.map +1 -1
  34. package/dist/components/compound/pipe-catalog/provider-filter.d.mts +3 -3
  35. package/dist/components/compound/pipe-catalog/provider-filter.d.mts.map +1 -1
  36. package/dist/components/compound/pipe-catalog/provider-filter.mjs.map +1 -1
  37. package/dist/components/compound/pipe-catalog/root.d.mts +6 -6
  38. package/dist/components/compound/pipe-catalog/root.d.mts.map +1 -1
  39. package/dist/components/compound/pipe-catalog/root.mjs +2 -2
  40. package/dist/components/compound/pipe-catalog/root.mjs.map +1 -1
  41. package/dist/components/compound/pipe-catalog/search-filter.d.mts +5 -9
  42. package/dist/components/compound/pipe-catalog/search-filter.d.mts.map +1 -1
  43. package/dist/components/compound/pipe-catalog/search-filter.mjs +9 -10
  44. package/dist/components/compound/pipe-catalog/search-filter.mjs.map +1 -1
  45. package/dist/components/compound/pipe-catalog/tag-filter.d.mts +3 -3
  46. package/dist/components/compound/pipe-catalog/tag-filter.d.mts.map +1 -1
  47. package/dist/components/compound/pipe-catalog/tag-filter.mjs.map +1 -1
  48. package/dist/components/compound/pipe-form/content.d.mts +6 -3
  49. package/dist/components/compound/pipe-form/content.d.mts.map +1 -1
  50. package/dist/components/compound/pipe-form/content.mjs +17 -25
  51. package/dist/components/compound/pipe-form/content.mjs.map +1 -1
  52. package/dist/components/compound/pipe-form/errors.d.mts +23 -0
  53. package/dist/components/compound/pipe-form/errors.d.mts.map +1 -0
  54. package/dist/components/compound/pipe-form/errors.mjs +40 -0
  55. package/dist/components/compound/pipe-form/errors.mjs.map +1 -0
  56. package/dist/components/compound/pipe-form/footer.d.mts +7 -7
  57. package/dist/components/compound/pipe-form/footer.d.mts.map +1 -1
  58. package/dist/components/compound/pipe-form/footer.mjs +11 -6
  59. package/dist/components/compound/pipe-form/footer.mjs.map +1 -1
  60. package/dist/components/compound/pipe-form/header.d.mts +7 -7
  61. package/dist/components/compound/pipe-form/header.d.mts.map +1 -1
  62. package/dist/components/compound/pipe-form/header.mjs +11 -6
  63. package/dist/components/compound/pipe-form/header.mjs.map +1 -1
  64. package/dist/components/compound/pipe-form/index.d.mts +2 -1
  65. package/dist/components/compound/pipe-form/root.d.mts +18 -11
  66. package/dist/components/compound/pipe-form/root.d.mts.map +1 -1
  67. package/dist/components/compound/pipe-form/root.mjs +21 -27
  68. package/dist/components/compound/pipe-form/root.mjs.map +1 -1
  69. package/dist/components/compound/pipe-form/submit-button.d.mts +15 -4
  70. package/dist/components/compound/pipe-form/submit-button.d.mts.map +1 -1
  71. package/dist/components/compound/pipe-form/submit-button.mjs +23 -8
  72. package/dist/components/compound/pipe-form/submit-button.mjs.map +1 -1
  73. package/dist/components/compound/pipe-form/title.d.mts +9 -8
  74. package/dist/components/compound/pipe-form/title.d.mts.map +1 -1
  75. package/dist/components/compound/pipe-form/title.mjs +11 -6
  76. package/dist/components/compound/pipe-form/title.mjs.map +1 -1
  77. package/dist/components/compound/search-catalog/active-filters.d.mts +7 -10
  78. package/dist/components/compound/search-catalog/active-filters.d.mts.map +1 -1
  79. package/dist/components/compound/search-catalog/active-filters.mjs +22 -18
  80. package/dist/components/compound/search-catalog/active-filters.mjs.map +1 -1
  81. package/dist/components/compound/search-catalog/card.d.mts +4 -13
  82. package/dist/components/compound/search-catalog/card.d.mts.map +1 -1
  83. package/dist/components/compound/search-catalog/card.mjs +31 -28
  84. package/dist/components/compound/search-catalog/card.mjs.map +1 -1
  85. package/dist/components/compound/search-catalog/category-filter.d.mts +7 -13
  86. package/dist/components/compound/search-catalog/category-filter.d.mts.map +1 -1
  87. package/dist/components/compound/search-catalog/category-filter.mjs +12 -13
  88. package/dist/components/compound/search-catalog/category-filter.mjs.map +1 -1
  89. package/dist/components/compound/search-catalog/column-filter.d.mts +6 -10
  90. package/dist/components/compound/search-catalog/column-filter.d.mts.map +1 -1
  91. package/dist/components/compound/search-catalog/column-filter.mjs +9 -9
  92. package/dist/components/compound/search-catalog/column-filter.mjs.map +1 -1
  93. package/dist/components/compound/search-catalog/empty.d.mts +5 -10
  94. package/dist/components/compound/search-catalog/empty.d.mts.map +1 -1
  95. package/dist/components/compound/search-catalog/empty.mjs +12 -14
  96. package/dist/components/compound/search-catalog/empty.mjs.map +1 -1
  97. package/dist/components/compound/search-catalog/index.d.mts +1 -1
  98. package/dist/components/compound/search-catalog/list.d.mts +8 -10
  99. package/dist/components/compound/search-catalog/list.d.mts.map +1 -1
  100. package/dist/components/compound/search-catalog/list.mjs +14 -14
  101. package/dist/components/compound/search-catalog/list.mjs.map +1 -1
  102. package/dist/components/compound/search-catalog/output-field-filter.d.mts +3 -3
  103. package/dist/components/compound/search-catalog/output-field-filter.d.mts.map +1 -1
  104. package/dist/components/compound/search-catalog/output-field-filter.mjs.map +1 -1
  105. package/dist/components/compound/search-catalog/provider-filter.d.mts +3 -3
  106. package/dist/components/compound/search-catalog/provider-filter.d.mts.map +1 -1
  107. package/dist/components/compound/search-catalog/provider-filter.mjs.map +1 -1
  108. package/dist/components/compound/search-catalog/root.d.mts +6 -6
  109. package/dist/components/compound/search-catalog/root.d.mts.map +1 -1
  110. package/dist/components/compound/search-catalog/root.mjs +2 -2
  111. package/dist/components/compound/search-catalog/root.mjs.map +1 -1
  112. package/dist/components/compound/search-catalog/search-filter.d.mts +5 -9
  113. package/dist/components/compound/search-catalog/search-filter.d.mts.map +1 -1
  114. package/dist/components/compound/search-catalog/search-filter.mjs +9 -10
  115. package/dist/components/compound/search-catalog/search-filter.mjs.map +1 -1
  116. package/dist/components/compound/search-catalog/tag-filter.d.mts +3 -3
  117. package/dist/components/compound/search-catalog/tag-filter.d.mts.map +1 -1
  118. package/dist/components/compound/search-catalog/tag-filter.mjs.map +1 -1
  119. package/dist/components/compound/search-form/content.d.mts +6 -3
  120. package/dist/components/compound/search-form/content.d.mts.map +1 -1
  121. package/dist/components/compound/search-form/content.mjs +17 -25
  122. package/dist/components/compound/search-form/content.mjs.map +1 -1
  123. package/dist/components/compound/search-form/errors.d.mts +23 -0
  124. package/dist/components/compound/search-form/errors.d.mts.map +1 -0
  125. package/dist/components/compound/search-form/errors.mjs +40 -0
  126. package/dist/components/compound/search-form/errors.mjs.map +1 -0
  127. package/dist/components/compound/search-form/footer.d.mts +7 -7
  128. package/dist/components/compound/search-form/footer.d.mts.map +1 -1
  129. package/dist/components/compound/search-form/footer.mjs +11 -6
  130. package/dist/components/compound/search-form/footer.mjs.map +1 -1
  131. package/dist/components/compound/search-form/header.d.mts +7 -7
  132. package/dist/components/compound/search-form/header.d.mts.map +1 -1
  133. package/dist/components/compound/search-form/header.mjs +11 -6
  134. package/dist/components/compound/search-form/header.mjs.map +1 -1
  135. package/dist/components/compound/search-form/index.d.mts +2 -1
  136. package/dist/components/compound/search-form/root.d.mts +19 -12
  137. package/dist/components/compound/search-form/root.d.mts.map +1 -1
  138. package/dist/components/compound/search-form/root.mjs +21 -27
  139. package/dist/components/compound/search-form/root.mjs.map +1 -1
  140. package/dist/components/compound/search-form/submit-button.d.mts +15 -4
  141. package/dist/components/compound/search-form/submit-button.d.mts.map +1 -1
  142. package/dist/components/compound/search-form/submit-button.mjs +23 -8
  143. package/dist/components/compound/search-form/submit-button.mjs.map +1 -1
  144. package/dist/components/compound/search-form/title.d.mts +9 -8
  145. package/dist/components/compound/search-form/title.d.mts.map +1 -1
  146. package/dist/components/compound/search-form/title.mjs +11 -6
  147. package/dist/components/compound/search-form/title.mjs.map +1 -1
  148. package/dist/components/compound/searches-catalog/active-filters.d.mts +7 -10
  149. package/dist/components/compound/searches-catalog/active-filters.d.mts.map +1 -1
  150. package/dist/components/compound/searches-catalog/active-filters.mjs +22 -18
  151. package/dist/components/compound/searches-catalog/active-filters.mjs.map +1 -1
  152. package/dist/components/compound/searches-catalog/card.d.mts +5 -6
  153. package/dist/components/compound/searches-catalog/card.d.mts.map +1 -1
  154. package/dist/components/compound/searches-catalog/card.mjs +38 -28
  155. package/dist/components/compound/searches-catalog/card.mjs.map +1 -1
  156. package/dist/components/compound/searches-catalog/category-filter.d.mts +7 -13
  157. package/dist/components/compound/searches-catalog/category-filter.d.mts.map +1 -1
  158. package/dist/components/compound/searches-catalog/category-filter.mjs +12 -13
  159. package/dist/components/compound/searches-catalog/category-filter.mjs.map +1 -1
  160. package/dist/components/compound/searches-catalog/column-filter.d.mts +6 -10
  161. package/dist/components/compound/searches-catalog/column-filter.d.mts.map +1 -1
  162. package/dist/components/compound/searches-catalog/column-filter.mjs +9 -9
  163. package/dist/components/compound/searches-catalog/column-filter.mjs.map +1 -1
  164. package/dist/components/compound/searches-catalog/empty.d.mts +5 -10
  165. package/dist/components/compound/searches-catalog/empty.d.mts.map +1 -1
  166. package/dist/components/compound/searches-catalog/empty.mjs +12 -14
  167. package/dist/components/compound/searches-catalog/empty.mjs.map +1 -1
  168. package/dist/components/compound/searches-catalog/index.d.mts +1 -1
  169. package/dist/components/compound/searches-catalog/list.d.mts +8 -10
  170. package/dist/components/compound/searches-catalog/list.d.mts.map +1 -1
  171. package/dist/components/compound/searches-catalog/list.mjs +14 -14
  172. package/dist/components/compound/searches-catalog/list.mjs.map +1 -1
  173. package/dist/components/compound/searches-catalog/output-field-filter.d.mts +3 -3
  174. package/dist/components/compound/searches-catalog/output-field-filter.d.mts.map +1 -1
  175. package/dist/components/compound/searches-catalog/output-field-filter.mjs.map +1 -1
  176. package/dist/components/compound/searches-catalog/provider-filter.d.mts +3 -3
  177. package/dist/components/compound/searches-catalog/provider-filter.d.mts.map +1 -1
  178. package/dist/components/compound/searches-catalog/provider-filter.mjs.map +1 -1
  179. package/dist/components/compound/searches-catalog/root.d.mts +6 -6
  180. package/dist/components/compound/searches-catalog/root.d.mts.map +1 -1
  181. package/dist/components/compound/searches-catalog/root.mjs +2 -2
  182. package/dist/components/compound/searches-catalog/root.mjs.map +1 -1
  183. package/dist/components/compound/searches-catalog/search-filter.d.mts +5 -9
  184. package/dist/components/compound/searches-catalog/search-filter.d.mts.map +1 -1
  185. package/dist/components/compound/searches-catalog/search-filter.mjs +9 -10
  186. package/dist/components/compound/searches-catalog/search-filter.mjs.map +1 -1
  187. package/dist/components/compound/searches-catalog/tag-filter.d.mts +3 -3
  188. package/dist/components/compound/searches-catalog/tag-filter.d.mts.map +1 -1
  189. package/dist/components/compound/searches-catalog/tag-filter.mjs.map +1 -1
  190. package/dist/components/defaults/adapters/index.mjs +2 -2
  191. package/dist/components/defaults/adapters/index.mjs.map +1 -1
  192. package/dist/components/defaults/adapters/json-extraction-input.mjs +291 -199
  193. package/dist/components/defaults/adapters/json-extraction-input.mjs.map +1 -1
  194. package/dist/components/defaults/adapters/{pipes-trigger-input.mjs → pipes-run-if-input.mjs} +32 -32
  195. package/dist/components/defaults/adapters/pipes-run-if-input.mjs.map +1 -0
  196. package/dist/components/defaults/adapters/providers-input.mjs +221 -13
  197. package/dist/components/defaults/adapters/providers-input.mjs.map +1 -1
  198. package/dist/components/defaults/catalog/card-primitives.d.mts +14 -24
  199. package/dist/components/defaults/catalog/card-primitives.d.mts.map +1 -1
  200. package/dist/components/defaults/catalog/card-primitives.mjs +19 -19
  201. package/dist/components/defaults/catalog/card-primitives.mjs.map +1 -1
  202. package/dist/components/defaults/catalog/layout.mjs +7 -10
  203. package/dist/components/defaults/catalog/layout.mjs.map +1 -1
  204. package/dist/components/defaults/layout/field-wrapper.d.mts +2 -2
  205. package/dist/components/defaults/layout/field-wrapper.d.mts.map +1 -1
  206. package/dist/components/defaults/layout/field-wrapper.mjs +5 -2
  207. package/dist/components/defaults/layout/field-wrapper.mjs.map +1 -1
  208. package/dist/components/defaults/layout/group.d.mts +4 -4
  209. package/dist/components/defaults/layout/group.d.mts.map +1 -1
  210. package/dist/components/defaults/layout/group.mjs +69 -54
  211. package/dist/components/defaults/layout/group.mjs.map +1 -1
  212. package/dist/components/defaults/layout/section.d.mts +9 -4
  213. package/dist/components/defaults/layout/section.d.mts.map +1 -1
  214. package/dist/components/defaults/layout/section.mjs +11 -13
  215. package/dist/components/defaults/layout/section.mjs.map +1 -1
  216. package/dist/components/field-renderer.d.mts.map +1 -1
  217. package/dist/components/field-renderer.mjs +1 -1
  218. package/dist/components/field-renderer.mjs.map +1 -1
  219. package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs +30 -15
  220. package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs.map +1 -1
  221. package/dist/components/internal/icons.mjs +36 -1
  222. package/dist/components/internal/icons.mjs.map +1 -1
  223. package/dist/components/internal/multi-select-popover-trigger.mjs +0 -1
  224. package/dist/components/internal/multi-select-popover-trigger.mjs.map +1 -1
  225. package/dist/components/internal/tag-chip-decoration.mjs +15 -0
  226. package/dist/components/internal/tag-chip-decoration.mjs.map +1 -1
  227. package/dist/components/ui/badge.mjs +1 -1
  228. package/dist/components/ui/button.d.mts +1 -1
  229. package/dist/components/ui/combobox.mjs +0 -1
  230. package/dist/components/ui/combobox.mjs.map +1 -1
  231. package/dist/context/pipe-catalog-card-context.d.mts +7 -0
  232. package/dist/context/pipe-catalog-card-context.d.mts.map +1 -1
  233. package/dist/context/pipe-catalog-card-context.mjs.map +1 -1
  234. package/dist/context/pipe-form-context.d.mts +17 -3
  235. package/dist/context/pipe-form-context.d.mts.map +1 -1
  236. package/dist/context/pipe-form-context.mjs.map +1 -1
  237. package/dist/context/search-catalog-card-context.d.mts +8 -0
  238. package/dist/context/search-catalog-card-context.d.mts.map +1 -1
  239. package/dist/context/search-catalog-card-context.mjs.map +1 -1
  240. package/dist/context/search-form-context.d.mts +17 -3
  241. package/dist/context/search-form-context.d.mts.map +1 -1
  242. package/dist/context/search-form-context.mjs.map +1 -1
  243. package/dist/context/searches-catalog-card-context.d.mts +8 -0
  244. package/dist/context/searches-catalog-card-context.d.mts.map +1 -1
  245. package/dist/context/searches-catalog-card-context.mjs.map +1 -1
  246. package/dist/hooks/use-field-error.d.mts +2 -2
  247. package/dist/hooks/use-field-error.d.mts.map +1 -1
  248. package/dist/hooks/use-field-error.mjs +7 -3
  249. package/dist/hooks/use-field-error.mjs.map +1 -1
  250. package/dist/hooks/use-form-core.d.mts +0 -3
  251. package/dist/hooks/use-form-core.d.mts.map +1 -1
  252. package/dist/hooks/use-form-core.mjs +36 -2
  253. package/dist/hooks/use-form-core.mjs.map +1 -1
  254. package/dist/hooks/use-pipe-catalog-table.d.mts +8 -8
  255. package/dist/hooks/use-pipe-form.d.mts +11 -0
  256. package/dist/hooks/use-pipe-form.d.mts.map +1 -1
  257. package/dist/hooks/use-pipe-form.mjs +35 -6
  258. package/dist/hooks/use-pipe-form.mjs.map +1 -1
  259. package/dist/hooks/use-search-catalog-table.d.mts +6 -6
  260. package/dist/hooks/use-search-form.d.mts +11 -0
  261. package/dist/hooks/use-search-form.d.mts.map +1 -1
  262. package/dist/hooks/use-search-form.mjs +35 -6
  263. package/dist/hooks/use-search-form.mjs.map +1 -1
  264. package/dist/index.d.mts +9 -8
  265. package/dist/index.mjs +3 -9
  266. package/dist/styles/pipe0-form.css +4116 -1
  267. package/dist/types/adapters.d.mts +6 -5
  268. package/dist/types/adapters.d.mts.map +1 -1
  269. package/dist/types/catalog-adapters.d.mts +2 -2
  270. package/dist/types/field-props.d.mts +4 -16
  271. package/dist/types/field-props.d.mts.map +1 -1
  272. package/dist/types/form-handle.d.mts +81 -1
  273. package/dist/types/form-handle.d.mts.map +1 -1
  274. package/dist/utils/build-section-handlers.mjs +6 -2
  275. package/dist/utils/build-section-handlers.mjs.map +1 -1
  276. package/dist/utils/internal-form.mjs +28 -0
  277. package/dist/utils/internal-form.mjs.map +1 -0
  278. package/dist/widgets/avatar-group.d.mts +4 -7
  279. package/dist/widgets/avatar-group.d.mts.map +1 -1
  280. package/dist/widgets/avatar-group.mjs +13 -12
  281. package/dist/widgets/avatar-group.mjs.map +1 -1
  282. package/package.json +70 -18
  283. package/dist/components/compound/pipe-catalog/index.mjs +0 -15
  284. package/dist/components/compound/pipe-form/index.mjs +0 -11
  285. package/dist/components/compound/search-catalog/index.mjs +0 -14
  286. package/dist/components/compound/search-form/index.mjs +0 -11
  287. package/dist/components/compound/searches-catalog/index.mjs +0 -14
  288. package/dist/components/defaults/adapters/pipes-trigger-input.mjs.map +0 -1
  289. package/dist/components/defaults/layout/submit-button.d.mts +0 -9
  290. package/dist/components/defaults/layout/submit-button.d.mts.map +0 -1
  291. package/dist/components/defaults/layout/submit-button.mjs +0 -23
  292. package/dist/components/defaults/layout/submit-button.mjs.map +0 -1
  293. package/dist/components/defaults/toggle-advanced-button.mjs +0 -29
  294. package/dist/components/defaults/toggle-advanced-button.mjs.map +0 -1
  295. package/dist/components/ui/input-group.mjs +0 -30
  296. package/dist/components/ui/input-group.mjs.map +0 -1
  297. package/dist/context/form-customization-context.d.mts +0 -71
  298. package/dist/context/form-customization-context.d.mts.map +0 -1
  299. package/dist/context/form-customization-context.mjs +0 -114
  300. package/dist/context/form-customization-context.mjs.map +0 -1
  301. package/dist/hooks/use-disclosure.mjs +0 -35
  302. package/dist/hooks/use-disclosure.mjs.map +0 -1
  303. package/dist/utils/render-slot.d.mts +0 -44
  304. package/dist/utils/render-slot.d.mts.map +0 -1
  305. package/dist/utils/render-slot.mjs +0 -30
  306. package/dist/utils/render-slot.mjs.map +0 -1
  307. package/dist/widgets/index.mjs +0 -11
@@ -30,10 +30,11 @@ import { GeneratedFormInputType } from "@pipe0/base";
30
30
  * (label, options, constraints, etc.).
31
31
  * - `field.error`, `field.touched`, `field.dirty`, `field.disabled`,
32
32
  * `field.disabledReason` — submit-gated UI state.
33
- * - `field.form` — the underlying `react-hook-form` `UseFormReturn`. Only
34
- * needed for advanced cases (multi-path resets, programmatic value
35
- * restoration). Custom adapters should rely on the typed surface above
36
- * when possible.
33
+ * - `field.form` — typed `FormHandle` for advanced cases (sub-path
34
+ * `setValue`/`resetField`, programmatic submit, sub-path errors via
35
+ * `useFieldError`). The library does not expose its underlying form
36
+ * library through this handle; rely on the methods documented on
37
+ * `FormHandle`.
37
38
  *
38
39
  * **Authoring tips.** Keep adapters pure — render directly from `field.*`,
39
40
  * derive in render or in event handlers. Don't `useEffect`-sync `field.value`
@@ -94,7 +95,7 @@ interface FormClassNames {
94
95
  templateEditor?: string;
95
96
  jsonSchemaInput?: string;
96
97
  jsonExtractionInput?: string;
97
- pipesTriggerInput?: string;
98
+ pipesRunIfInput?: string;
98
99
  connectorInput?: string;
99
100
  providersInput?: string;
100
101
  fieldsSelectInput?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.mts","names":[],"sources":["../../src/types/adapters.ts"],"mappings":";;;;;;;AA8CA;;;;;;;;;;;;;;;;AAsBA;;;;;;;;;;;;;;;;;;;;KAtBY,eAAA,WACJ,sBAAA,IAA0B,aAAA,CAAc,mBAAA,CAAoB,CAAA;;;;;;;;;;;;;;;UAqBnD,cAAA;EAEf,IAAA;EACA,OAAA;EACA,YAAA;EACA,kBAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EAGA,KAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;;EAEA,aAAA;;EAEA,cAAA;EAGA,SAAA;EACA,aAAA;EACA,WAAA;EACA,gBAAA;EACA,qBAAA;EACA,YAAA;EACA,oBAAA;EACA,QAAA;EACA,WAAA;EACA,UAAA;EACA,eAAA;EACA,cAAA;EACA,cAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EACA,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,cAAA;EACA,eAAA;EACA,mBAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;AAAA"}
1
+ {"version":3,"file":"adapters.d.mts","names":[],"sources":["../../src/types/adapters.ts"],"mappings":";;;;;;;AA+CA;;;;;;;;;;;;;;;;AAsBA;;;;;;;;;;;;;;;;;;;;;KAtBY,eAAA,WACJ,sBAAA,IAA0B,aAAA,CAAc,mBAAA,CAAoB,CAAA;;;;;;;;;;;;;;;UAqBnD,cAAA;EAEf,IAAA;EACA,OAAA;EACA,YAAA;EACA,kBAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EAGA,KAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;;EAEA,aAAA;;EAEA,cAAA;EAGA,SAAA;EACA,aAAA;EACA,WAAA;EACA,gBAAA;EACA,qBAAA;EACA,YAAA;EACA,oBAAA;EACA,QAAA;EACA,WAAA;EACA,UAAA;EACA,eAAA;EACA,cAAA;EACA,cAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EACA,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,cAAA;EACA,eAAA;EACA,mBAAA;EACA,eAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;AAAA"}
@@ -39,8 +39,8 @@ interface CatalogClassNames {
39
39
  type CostMode = "per_result" | "per_search" | "per_page";
40
40
  /**
41
41
  * Pre-computed display data for a pipe row. Exposed via `usePipeCatalogTable().cards`
42
- * and `<PipeCatalogList render={({ cards }) => …}>` so consumers can render
43
- * cards without re-deriving providers/cost/fields from raw entries.
42
+ * (or `usePipeCatalogContext().cards` inside a `<PipeCatalog>`) so consumers can
43
+ * render cards without re-deriving providers/cost/fields from raw entries.
44
44
  */
45
45
  interface PipeCardData {
46
46
  pipeId: PipeId;
@@ -1,6 +1,6 @@
1
+ import { FormHandle } from "./form-handle.mjs";
1
2
  import * as _$_pipe0_base0 from "@pipe0/base";
2
- import { FieldValueMap, GeneratedFormInputType, GeneratedInputMetaMap, PipePayload, SecretSuggestion } from "@pipe0/base";
3
- import { UseFormReturn } from "react-hook-form";
3
+ import { ConstantSuggestion, FieldValueMap, GeneratedFormInputType, GeneratedInputMetaMap, SecretSuggestion } from "@pipe0/base";
4
4
 
5
5
  //#region src/types/field-props.d.ts
6
6
  /**
@@ -22,7 +22,7 @@ type FieldMeta<K extends GeneratedFormInputType> = GeneratedInputMetaMap[K];
22
22
  interface BaseFieldProps<K extends GeneratedFormInputType> {
23
23
  kind: K;
24
24
  meta: GeneratedInputMetaMap[K];
25
- form: UseFormReturn<PipePayload>;
25
+ form: FormHandle;
26
26
  path: string;
27
27
  id: string;
28
28
  /**
@@ -283,24 +283,12 @@ interface FieldExtras {
283
283
  searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;
284
284
  };
285
285
  json_extraction_input: {};
286
- pipes_trigger_input: {};
286
+ pipes_run_if_input: {};
287
287
  connector_input: {};
288
288
  fields_select_input: {};
289
289
  json_schema_input: {};
290
290
  cursor_pagination_metadata: {};
291
291
  }
292
- /**
293
- * Forward-compat type for non-secret org-level constants. Mirrors
294
- * `SecretSuggestion` but without the masking concern. No runtime surface
295
- * exposes these yet — `LiquidEditor` accepts an empty array and the
296
- * unified `/` picker treats Constants as a third section once data lands.
297
- */
298
- interface ConstantSuggestion {
299
- publicId: string;
300
- label: string;
301
- ownershipLevel: "organization" | "team" | "user";
302
- description: string | null;
303
- }
304
292
  type GeneratedFieldProps<K extends GeneratedFormInputType> = BaseFieldProps<K> & FieldExtras[K];
305
293
  /** Union of all possible field props — used when the kind is not yet known. */
306
294
  type AnyFieldProps = { [K in GeneratedFormInputType]: GeneratedFieldProps<K> }[GeneratedFormInputType];
@@ -1 +1 @@
1
- {"version":3,"file":"field-props.d.mts","names":[],"sources":["../../src/types/field-props.ts"],"mappings":"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"}
1
+ {"version":3,"file":"field-props.d.mts","names":[],"sources":["../../src/types/field-props.ts"],"mappings":"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"}
@@ -11,6 +11,11 @@ interface FormGroupHandle {
11
11
  fields: AnyFieldProps[];
12
12
  errorCount: number;
13
13
  setCount: number;
14
+ /** Count of fields whose value differs from the default. Driven by RHF's
15
+ * per-field `isDirty`, so it reflects user edits within this session
16
+ * rather than "is the value non-empty". Used to surface "N modified" in
17
+ * group headers. */
18
+ dirtyCount: number;
14
19
  }
15
20
  interface FormSectionHandle {
16
21
  key: string;
@@ -18,6 +23,81 @@ interface FormSectionHandle {
18
23
  description?: string;
19
24
  groups: FormGroupHandle[];
20
25
  }
26
+ interface FormErrorEntry {
27
+ message?: string;
28
+ type?: string;
29
+ }
30
+ /** Recursive error tree, keyed by dot-segment. Leaves carry `message`/`type`. */
31
+ interface FormErrors {
32
+ [key: string]: FormErrorEntry | FormErrors | undefined;
33
+ }
34
+ interface FormSetValueOptions {
35
+ shouldDirty?: boolean;
36
+ shouldTouch?: boolean;
37
+ shouldValidate?: boolean;
38
+ }
39
+ interface FormResetFieldOptions {
40
+ defaultValue?: unknown;
41
+ keepError?: boolean;
42
+ keepDirty?: boolean;
43
+ keepTouched?: boolean;
44
+ keepIsValid?: boolean;
45
+ }
46
+ interface FormResetOptions {
47
+ keepErrors?: boolean;
48
+ keepDirty?: boolean;
49
+ keepValues?: boolean;
50
+ keepDefaultValues?: boolean;
51
+ keepIsSubmitted?: boolean;
52
+ keepTouched?: boolean;
53
+ keepIsValid?: boolean;
54
+ keepSubmitCount?: boolean;
55
+ }
56
+ interface FormFieldState {
57
+ invalid: boolean;
58
+ isTouched: boolean;
59
+ isDirty: boolean;
60
+ error?: FormErrorEntry;
61
+ }
62
+ interface FormStateSnapshot {
63
+ isSubmitted: boolean;
64
+ isSubmitting: boolean;
65
+ isValid: boolean;
66
+ isDirty: boolean;
67
+ submitCount: number;
68
+ errors: FormErrors;
69
+ }
70
+ /**
71
+ * Typed handle for the underlying form. Methods are declared with shorthand
72
+ * so structural assignment from the internal RHF return value is permitted
73
+ * via TypeScript method bivariance.
74
+ */
75
+ interface FormHandle<T = unknown> {
76
+ /** Read all values, or the value at a dot-notation path. */
77
+ getValues(): T;
78
+ getValues(path: string): unknown;
79
+ /** Write a value at a dot-notation path. */
80
+ setValue(path: string, value: unknown, options?: FormSetValueOptions): void;
81
+ /** Return a single field to its pristine baseline (clears value, dirty, touched, errors). */
82
+ resetField(path: string, options?: FormResetFieldOptions): void;
83
+ /** Reset the entire form. Pass `values` to seed new defaults. */
84
+ reset(values?: T, options?: FormResetOptions): void;
85
+ /** Subscribe to all values, or to a single dot-notation path. */
86
+ watch(): T;
87
+ watch(path: string): unknown;
88
+ /** Programmatically run validation. Returns `true` when valid. */
89
+ trigger(path?: string | string[]): Promise<boolean>;
90
+ /** Wrap an `onValid` handler in a submit-aware callback. */
91
+ handleSubmit(onValid: (values: T) => unknown | Promise<unknown>): (event?: unknown) => Promise<void>;
92
+ /** Set an error for a field (or `"root"` for a form-level error). */
93
+ setError(path: string, error: FormErrorEntry): void;
94
+ /** Clear errors for a path (or all errors when omitted). */
95
+ clearErrors(path?: string | string[]): void;
96
+ /** Read field-level state without subscribing to changes. */
97
+ getFieldState(path: string): FormFieldState;
98
+ /** Snapshot of submission, validation, and error state. */
99
+ formState: FormStateSnapshot;
100
+ }
21
101
  //#endregion
22
- export { FormGroupHandle, FormSectionHandle };
102
+ export { FormErrorEntry, FormErrors, FormFieldState, FormGroupHandle, FormHandle, FormResetFieldOptions, FormResetOptions, FormSectionHandle, FormSetValueOptions, FormStateSnapshot };
23
103
  //# sourceMappingURL=form-handle.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-handle.d.mts","names":[],"sources":["../../src/types/form-handle.ts"],"mappings":";;;;UAGiB,eAAA;EACf,GAAA;EACA,KAAA;EACA,WAAA;EACA,OAAA,GAAU,OAAA;EACV,aAAA;EACA,MAAA,EAAQ,aAAA;EACR,UAAA;EACA,QAAA;AAAA;AAAA,UAGe,iBAAA;EACf,GAAA;EACA,KAAA;EACA,WAAA;EACA,MAAA,EAAQ,eAAA;AAAA"}
1
+ {"version":3,"file":"form-handle.d.mts","names":[],"sources":["../../src/types/form-handle.ts"],"mappings":";;;;UAGiB,eAAA;EACf,GAAA;EACA,KAAA;EACA,WAAA;EACA,OAAA,GAAU,OAAA;EACV,aAAA;EACA,MAAA,EAAQ,aAAA;EACR,UAAA;EACA,QAAA;EAJA;;;;EASA,UAAA;AAAA;AAAA,UAGe,iBAAA;EACf,GAAA;EACA,KAAA;EACA,WAAA;EACA,MAAA,EAAQ,eAAA;AAAA;AAAA,UAcO,cAAA;EACf,OAAA;EACA,IAAA;AAAA;;UAIe,UAAA;EAAA,CACd,GAAA,WAAc,cAAA,GAAiB,UAAA;AAAA;AAAA,UAGjB,mBAAA;EACf,WAAA;EACA,WAAA;EACA,cAAA;AAAA;AAAA,UAGe,qBAAA;EACf,YAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,UAGe,gBAAA;EACf,UAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,eAAA;EACA,WAAA;EACA,WAAA;EACA,eAAA;AAAA;AAAA,UAGe,cAAA;EACf,OAAA;EACA,SAAA;EACA,OAAA;EACA,KAAA,GAAQ,cAAA;AAAA;AAAA,UAGO,iBAAA;EACf,WAAA;EACA,YAAA;EACA,OAAA;EACA,OAAA;EACA,WAAA;EACA,MAAA,EAAQ,UAAA;AAAA;;;;;;UAQO,UAAA;EA5Bf;EA8BA,SAAA,IAAa,CAAA;EACb,SAAA,CAAU,IAAA;EA5BV;EA+BA,QAAA,CAAS,IAAA,UAAc,KAAA,WAAgB,OAAA,GAAU,mBAAA;EA9BlC;EAiCf,UAAA,CAAW,IAAA,UAAc,OAAA,GAAU,qBAAA;EA9BpB;EAiCf,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAA,GAAU,gBAAA;;EAG5B,KAAA,IAAS,CAAA;EACT,KAAA,CAAM,IAAA;EAnCN;EAsCA,OAAA,CAAQ,IAAA,uBAA2B,OAAA;EApCnC;EAuCA,YAAA,CACE,OAAA,GAAU,MAAA,EAAQ,CAAA,eAAgB,OAAA,aAChC,KAAA,eAAoB,OAAA;EAzCF;EA4CtB,QAAA,CAAS,IAAA,UAAc,KAAA,EAAO,cAAA;EAzCf;EA4Cf,WAAA,CAAY,IAAA;;EAGZ,aAAA,CAAc,IAAA,WAAe,cAAA;EA9C7B;EAiDA,SAAA,EAAW,iBAAA;AAAA"}
@@ -353,6 +353,7 @@ function buildSectionHandles(formConfig, form, publicKey, loadingCtx) {
353
353
  const groupPathError = form.getFieldState(group.groupPath).error;
354
354
  const errorCount = hasSubmitted ? fields.filter((f) => f.error != null).length + (groupPathError ? 1 : 0) : 0;
355
355
  const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;
356
+ const dirtyCount = fields.filter((f) => f.dirty).length;
356
357
  return {
357
358
  key: group.groupPath,
358
359
  label: group.label,
@@ -361,7 +362,8 @@ function buildSectionHandles(formConfig, form, publicKey, loadingCtx) {
361
362
  defaultExpand: group.defaultExpand ?? false,
362
363
  fields,
363
364
  errorCount,
364
- setCount
365
+ setCount,
366
+ dirtyCount
365
367
  };
366
368
  });
367
369
  return {
@@ -405,11 +407,13 @@ function applyFormCustomization(sections, customization) {
405
407
  });
406
408
  const errorCount = group.errorCount > 0 ? fields.filter((f) => f.error != null).length : 0;
407
409
  const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;
410
+ const dirtyCount = fields.filter((f) => f.dirty).length;
408
411
  return {
409
412
  ...mergedGroup,
410
413
  fields,
411
414
  errorCount,
412
- setCount
415
+ setCount,
416
+ dirtyCount
413
417
  };
414
418
  }).filter((group) => group.fields.length > 0);
415
419
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"build-section-handlers.mjs","names":[],"sources":["../../src/utils/build-section-handlers.ts"],"sourcesContent":["import type { FormSection, GeneratedInputMeta, SecretSuggestion, SectionKeys } from \"@pipe0/base\";\nimport { inputGuards } from \"@pipe0/base\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FormCustomizationState } from \"../context/form-customization-context.js\";\nimport type { FieldLoadState } from \"../hooks/use-form-core.js\";\nimport type {\n AnyFieldProps,\n ConstantSuggestion,\n GeneratedFieldProps,\n} from \"../types/field-props.js\";\nimport type { FormGroupHandle, FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface FieldLoadingContext {\n /** Per-field load states for dynamic context_select_input fields, keyed by path. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /**\n * Curried per-keystroke secrets searcher. Bundles the form-level\n * `environment` / `scopes` / `teamId` so adapters only need to pass the\n * user's typed query. Returns `[]` when no `getSecrets` resolver is wired.\n */\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n /**\n * Curried per-keystroke constants searcher. Mirrors `searchSecrets`.\n * Returns `[]` when no `getConstants` resolver is wired.\n */\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n}\n\n/**\n * Builds a fully-typed `GeneratedFieldProps` from raw metadata + form state.\n *\n * The returned object includes:\n * - Base props (kind, meta, value, setValue, error, etc.)\n * - Kind-specific extras (inputProps, options, toggle, etc.)\n */\nexport function buildFieldProps<Meta extends GeneratedInputMeta>(\n meta: Meta,\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): GeneratedFieldProps<Meta[\"type\"]> {\n const path = meta.path;\n const fieldState = form.getFieldState(path as any);\n const value = form.getValues(path as any);\n const id = `p0-field-${path.replace(/\\./g, \"-\")}`;\n\n const setValue = (v: unknown) =>\n form.setValue(path as any, v, {\n shouldDirty: true,\n shouldTouch: true,\n shouldValidate: true,\n });\n\n // Match the submit-gated behavior used everywhere else (group errorCount,\n // `useFieldError`): don't surface the field's error until the user has\n // attempted a submit. Otherwise `setValue`-triggered validation would\n // flash errors the moment the form is interacted with.\n const hasSubmitted = form.formState.isSubmitted;\n\n const loadState = loadingCtx?.fieldLoadStates?.[path];\n\n const base = {\n kind: meta.type,\n meta,\n form,\n path,\n label: meta.label ?? \"\",\n description: meta.description,\n info: meta.info,\n error: hasSubmitted ? fieldState.error?.message : undefined,\n touched: fieldState.isTouched,\n dirty: fieldState.isDirty,\n id,\n value,\n setValue,\n reset: () => form.resetField(path as any),\n disabled: loadState?.disabled ?? false,\n disabledReason: loadState?.disabledReason,\n };\n\n const extras = buildExtras(meta, { path, id, value, setValue }, publicKey, loadingCtx);\n\n return { ...base, ...extras } as unknown as GeneratedFieldProps<Meta[\"type\"]>;\n}\n\n// Re-export under old name for backward compat\nexport { buildFieldProps as buildFieldHandle };\n\ntype OptionLike = {\n value: string;\n label: string;\n widgets?: Record<string, Record<string, unknown>>;\n};\n\nfunction withMergedWidgets<T extends OptionLike>(\n options: T[],\n staticWidgets: Record<string, Record<string, unknown>> | undefined,\n): T[] {\n if (!staticWidgets) return options;\n return options.map((o) => ({\n ...o,\n widgets: { ...staticWidgets, ...(o.widgets ?? {}) },\n }));\n}\n\nfunction buildExtras(\n meta: GeneratedInputMeta,\n base: {\n path: string;\n id: string;\n value: unknown;\n setValue: (v: unknown) => void;\n },\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): Record<string, unknown> {\n if (\n inputGuards.text_input(meta) ||\n inputGuards.int_input(meta) ||\n inputGuards.number_input(meta)\n ) {\n const isNumber = inputGuards.int_input(meta) || inputGuards.number_input(meta);\n return {\n inputProps: {\n type: isNumber ? \"number\" : (meta as any).inputType || \"text\",\n name: base.path,\n id: base.id,\n value: base.value != null ? String(base.value) : \"\",\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n base.setValue(isNumber ? (v === \"\" ? null : Number(v)) : v);\n },\n placeholder: meta.placeholder,\n step: inputGuards.number_input(meta) ? \"0.001\" : undefined,\n },\n };\n }\n\n if (inputGuards.textarea_input(meta)) {\n return {\n textareaProps: {\n name: base.path,\n id: base.id,\n value: (base.value as string) ?? \"\",\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => base.setValue(e.target.value),\n placeholder: meta.placeholder,\n rows: meta.rows,\n },\n };\n }\n\n if (inputGuards.select_input(meta)) {\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n };\n }\n\n if (inputGuards.context_select_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n };\n }\n\n if (inputGuards.tagged_text_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.providers_input(meta)) {\n return {\n options: meta.options ?? [],\n };\n }\n\n if (inputGuards.multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n options: meta.options ?? [],\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.async_multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n loadOptions: async (query: string) =>\n withMergedWidgets(\n await meta.optionsDef.options({ query, token: publicKey }),\n meta.optionsDef.widgets,\n ),\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.boolean_input(meta) || inputGuards.nullable_boolean_input(meta)) {\n return {\n checked: base.value === true,\n isNull: base.value === null || base.value === undefined,\n toggle: () => base.setValue(base.value === true ? false : true),\n clear: () => base.setValue(null),\n };\n }\n\n if (\n inputGuards.include_exclude_input(meta) ||\n inputGuards.include_exclude_select_input(meta) ||\n inputGuards.async_include_exclude_select_input(meta)\n ) {\n const current = (base.value as {\n include: string[];\n exclude: string[];\n }) ?? { include: [], exclude: [] };\n const result: Record<string, unknown> = {\n include: {\n value: current.include,\n add: (v: string) => base.setValue({ ...current, include: [...current.include, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n include: current.include.filter((i) => i !== v),\n }),\n },\n exclude: {\n value: current.exclude,\n add: (v: string) => base.setValue({ ...current, exclude: [...current.exclude, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n exclude: current.exclude.filter((i) => i !== v),\n }),\n },\n };\n const m = meta as any;\n if (m.optionsDef?.options && typeof m.optionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.optionsDef.options({ query, token: publicKey }),\n m.optionsDef.widgets,\n );\n } else if (m.optionsDef?.options) {\n result.options = withMergedWidgets(m.optionsDef.options, m.optionsDef.widgets);\n }\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.range_input(meta)) {\n const current = (base.value as {\n from: number | null;\n to: number | null;\n }) ?? { from: null, to: null };\n return {\n from: {\n value: current.from,\n set: (v: number | null) => base.setValue({ ...current, from: v }),\n },\n to: {\n value: current.to,\n set: (v: number | null) => base.setValue({ ...current, to: v }),\n },\n };\n }\n\n if (inputGuards.date_range_input(meta)) {\n const current = (base.value as Record<string, string>) ?? {};\n return {\n from: {\n value: current.gte ?? current.gt ?? \"\",\n set: (v: string) => base.setValue({ ...current, gte: v }),\n },\n to: {\n value: current.lte ?? current.lt ?? \"\",\n set: (v: string) => base.setValue({ ...current, lte: v }),\n },\n };\n }\n\n if (inputGuards.exact_range_input(meta)) {\n const current = (base.value as Record<string, number | null>) ?? {};\n return {\n greaterThan: {\n operator: current.gt != null ? \"gt\" : \"gte\",\n value: current.gt ?? current.gte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"gt\" ? \"gte\" : \"gt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.gt != null ? \"gt\" : \"gte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n lessThan: {\n operator: current.lt != null ? \"lt\" : \"lte\",\n value: current.lt ?? current.lte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"lt\" ? \"lte\" : \"lt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.lt != null ? \"lt\" : \"lte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n };\n }\n\n if (inputGuards.min_max_int_input(meta)) {\n const current = (base.value as {\n min: number | null;\n max: number | null;\n }) ?? { min: null, max: null };\n return {\n from: {\n value: current.min,\n set: (v: number | null) => base.setValue({ ...current, min: v }),\n },\n to: {\n value: current.max,\n set: (v: number | null) => base.setValue({ ...current, max: v }),\n },\n };\n }\n\n if (inputGuards.multi_create_input(meta) || inputGuards.ordered_multi_create_input(meta)) {\n const items = (base.value as string[]) ?? [];\n const result: Record<string, unknown> = {\n items,\n add: (v: string) => base.setValue([...items, v]),\n remove: (v: string) => base.setValue(items.filter((i) => i !== v)),\n };\n if (inputGuards.ordered_multi_create_input(meta)) {\n result.reorder = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n base.setValue(next);\n };\n }\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.key_value_list_input(meta)) {\n const rows = (base.value as Array<{ key: string; value: string }>) ?? [];\n return {\n rows,\n addRow: () => base.setValue([...rows, { key: \"\", value: \"\" }]),\n removeRow: (index: number) => base.setValue(rows.filter((_, i) => i !== index)),\n setKey: (index: number, key: string) =>\n base.setValue(rows.map((row, i) => (i === index ? { ...row, key } : row))),\n setValue: (index: number, value: string) =>\n base.setValue(rows.map((row, i) => (i === index ? { ...row, value } : row))),\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.prompt_input(meta) || inputGuards.template_input(meta)) {\n return {\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n // Remaining types need no extras beyond base\n return {};\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n if (value === null || typeof value === \"undefined\") return true;\n if (typeof value === \"string\") return value === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n if (keys.length === 0) return true;\n return keys.every((k) => isEmptyValue((value as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nexport function buildSectionHandles(\n formConfig: FormSection[],\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): FormSectionHandle[] {\n // In onSubmit validation mode, don't flag groups as invalid until the\n // user has actually attempted a submit. This matches RHF's own field-level\n // behavior where `formState.errors` is only populated after the first\n // submit (and updated reactively thereafter per `reValidateMode`).\n const hasSubmitted = form.formState.isSubmitted;\n\n return formConfig.map((section) => {\n const groups: FormGroupHandle[] = section.groups.map((group) => {\n const fields = group.fields.map((meta) =>\n buildFieldProps(meta, form, publicKey, loadingCtx),\n ) as AnyFieldProps[];\n\n const groupPathError = form.getFieldState(group.groupPath as any).error;\n const errorCount = hasSubmitted\n ? fields.filter((f) => f.error != null).length + (groupPathError ? 1 : 0)\n : 0;\n const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;\n\n return {\n key: group.groupPath,\n label: group.label,\n description: group.description,\n iconKey: group.iconKey,\n defaultExpand: group.defaultExpand ?? false,\n fields,\n errorCount,\n setCount,\n };\n });\n\n return {\n key: section.metadata.path,\n label: section.metadata.label,\n description: section.metadata.description,\n groups,\n };\n });\n}\n\nexport function applyFormCustomization(\n sections: FormSectionHandle[],\n customization: FormCustomizationState,\n): FormSectionHandle[] {\n const { sectionMap, groupMap, pathMap } = customization;\n\n const hasSectionOverrides = Object.keys(sectionMap).length > 0;\n const hasGroupOverrides = Object.keys(groupMap).length > 0;\n const hasPathOverrides = Object.keys(pathMap).length > 0;\n\n if (!hasSectionOverrides && !hasGroupOverrides && !hasPathOverrides) {\n return sections;\n }\n\n return sections\n .filter((section) => sectionMap[section.key as SectionKeys] !== null)\n .map((section) => {\n const sectionOverride = sectionMap[section.key as SectionKeys];\n const mergedSection = sectionOverride\n ? {\n ...section,\n label: sectionOverride.label ?? section.label,\n description: sectionOverride.description ?? section.description,\n }\n : section;\n\n const groups = mergedSection.groups\n .filter((group) => groupMap[group.key] !== null)\n .map((group) => {\n const groupOverride = groupMap[group.key];\n const mergedGroup = groupOverride\n ? {\n ...group,\n label: groupOverride.label ?? group.label,\n description: groupOverride.description ?? group.description,\n iconKey: groupOverride.iconKey ?? group.iconKey,\n defaultExpand: groupOverride.defaultExpand ?? group.defaultExpand,\n }\n : group;\n\n const fields = mergedGroup.fields\n .filter((field) => pathMap[field.path] !== null)\n .map((field) => {\n const fieldOverride = pathMap[field.path];\n if (!fieldOverride) return field;\n return {\n ...field,\n label: fieldOverride.label ?? field.label,\n description: fieldOverride.description ?? field.description,\n };\n });\n\n // Preserve the submit-gated error count from buildSectionHandles:\n // if the original group was not flagged, don't resurrect errors\n // here just because we recount post-filter.\n const errorCount =\n group.errorCount > 0 ? fields.filter((f) => f.error != null).length : 0;\n const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;\n\n return { ...mergedGroup, fields, errorCount, setCount };\n })\n .filter((group) => group.fields.length > 0);\n\n return { ...mergedSection, groups };\n })\n .filter((section) => section.groups.length > 0);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"build-section-handlers.mjs","names":[],"sources":["../../src/utils/build-section-handlers.ts"],"sourcesContent":["import type { FormSection, GeneratedInputMeta, SecretSuggestion, SectionKeys } from \"@pipe0/base\";\nimport { inputGuards } from \"@pipe0/base\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FieldLoadState } from \"../hooks/use-form-core.js\";\nimport type {\n AnyFieldProps,\n ConstantSuggestion,\n GeneratedFieldProps,\n} from \"../types/field-props.js\";\nimport type { FormCustomizationState } from \"../types/form-customization.js\";\nimport type { FormGroupHandle, FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface FieldLoadingContext {\n /** Per-field load states for dynamic context_select_input fields, keyed by path. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /**\n * Curried per-keystroke secrets searcher. Bundles the form-level\n * `environment` / `scopes` / `teamId` so adapters only need to pass the\n * user's typed query. Returns `[]` when no `getSecrets` resolver is wired.\n */\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n /**\n * Curried per-keystroke constants searcher. Mirrors `searchSecrets`.\n * Returns `[]` when no `getConstants` resolver is wired.\n */\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n}\n\n/**\n * Builds a fully-typed `GeneratedFieldProps` from raw metadata + form state.\n *\n * The returned object includes:\n * - Base props (kind, meta, value, setValue, error, etc.)\n * - Kind-specific extras (inputProps, options, toggle, etc.)\n */\nexport function buildFieldProps<Meta extends GeneratedInputMeta>(\n meta: Meta,\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): GeneratedFieldProps<Meta[\"type\"]> {\n const path = meta.path;\n const fieldState = form.getFieldState(path as any);\n const value = form.getValues(path as any);\n const id = `p0-field-${path.replace(/\\./g, \"-\")}`;\n\n const setValue = (v: unknown) =>\n form.setValue(path as any, v, {\n shouldDirty: true,\n shouldTouch: true,\n shouldValidate: true,\n });\n\n // Match the submit-gated behavior used everywhere else (group errorCount,\n // `useFieldError`): don't surface the field's error until the user has\n // attempted a submit. Otherwise `setValue`-triggered validation would\n // flash errors the moment the form is interacted with.\n const hasSubmitted = form.formState.isSubmitted;\n\n const loadState = loadingCtx?.fieldLoadStates?.[path];\n\n const base = {\n kind: meta.type,\n meta,\n form,\n path,\n label: meta.label ?? \"\",\n description: meta.description,\n info: meta.info,\n error: hasSubmitted ? fieldState.error?.message : undefined,\n touched: fieldState.isTouched,\n dirty: fieldState.isDirty,\n id,\n value,\n setValue,\n reset: () => form.resetField(path as any),\n disabled: loadState?.disabled ?? false,\n disabledReason: loadState?.disabledReason,\n };\n\n const extras = buildExtras(meta, { path, id, value, setValue }, publicKey, loadingCtx);\n\n return { ...base, ...extras } as unknown as GeneratedFieldProps<Meta[\"type\"]>;\n}\n\n// Re-export under old name for backward compat\nexport { buildFieldProps as buildFieldHandle };\n\ntype OptionLike = {\n value: string;\n label: string;\n widgets?: Record<string, Record<string, unknown>>;\n};\n\nfunction withMergedWidgets<T extends OptionLike>(\n options: T[],\n staticWidgets: Record<string, Record<string, unknown>> | undefined,\n): T[] {\n if (!staticWidgets) return options;\n return options.map((o) => ({\n ...o,\n widgets: { ...staticWidgets, ...(o.widgets ?? {}) },\n }));\n}\n\nfunction buildExtras(\n meta: GeneratedInputMeta,\n base: {\n path: string;\n id: string;\n value: unknown;\n setValue: (v: unknown) => void;\n },\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): Record<string, unknown> {\n if (\n inputGuards.text_input(meta) ||\n inputGuards.int_input(meta) ||\n inputGuards.number_input(meta)\n ) {\n const isNumber = inputGuards.int_input(meta) || inputGuards.number_input(meta);\n return {\n inputProps: {\n type: isNumber ? \"number\" : (meta as any).inputType || \"text\",\n name: base.path,\n id: base.id,\n value: base.value != null ? String(base.value) : \"\",\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n base.setValue(isNumber ? (v === \"\" ? null : Number(v)) : v);\n },\n placeholder: meta.placeholder,\n step: inputGuards.number_input(meta) ? \"0.001\" : undefined,\n },\n };\n }\n\n if (inputGuards.textarea_input(meta)) {\n return {\n textareaProps: {\n name: base.path,\n id: base.id,\n value: (base.value as string) ?? \"\",\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => base.setValue(e.target.value),\n placeholder: meta.placeholder,\n rows: meta.rows,\n },\n };\n }\n\n if (inputGuards.select_input(meta)) {\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n };\n }\n\n if (inputGuards.context_select_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n };\n }\n\n if (inputGuards.tagged_text_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.providers_input(meta)) {\n return {\n options: meta.options ?? [],\n };\n }\n\n if (inputGuards.multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n options: meta.options ?? [],\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.async_multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n loadOptions: async (query: string) =>\n withMergedWidgets(\n await meta.optionsDef.options({ query, token: publicKey }),\n meta.optionsDef.widgets,\n ),\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.boolean_input(meta) || inputGuards.nullable_boolean_input(meta)) {\n return {\n checked: base.value === true,\n isNull: base.value === null || base.value === undefined,\n toggle: () => base.setValue(base.value === true ? false : true),\n clear: () => base.setValue(null),\n };\n }\n\n if (\n inputGuards.include_exclude_input(meta) ||\n inputGuards.include_exclude_select_input(meta) ||\n inputGuards.async_include_exclude_select_input(meta)\n ) {\n const current = (base.value as {\n include: string[];\n exclude: string[];\n }) ?? { include: [], exclude: [] };\n const result: Record<string, unknown> = {\n include: {\n value: current.include,\n add: (v: string) => base.setValue({ ...current, include: [...current.include, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n include: current.include.filter((i) => i !== v),\n }),\n },\n exclude: {\n value: current.exclude,\n add: (v: string) => base.setValue({ ...current, exclude: [...current.exclude, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n exclude: current.exclude.filter((i) => i !== v),\n }),\n },\n };\n const m = meta as any;\n if (m.optionsDef?.options && typeof m.optionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.optionsDef.options({ query, token: publicKey }),\n m.optionsDef.widgets,\n );\n } else if (m.optionsDef?.options) {\n result.options = withMergedWidgets(m.optionsDef.options, m.optionsDef.widgets);\n }\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.range_input(meta)) {\n const current = (base.value as {\n from: number | null;\n to: number | null;\n }) ?? { from: null, to: null };\n return {\n from: {\n value: current.from,\n set: (v: number | null) => base.setValue({ ...current, from: v }),\n },\n to: {\n value: current.to,\n set: (v: number | null) => base.setValue({ ...current, to: v }),\n },\n };\n }\n\n if (inputGuards.date_range_input(meta)) {\n const current = (base.value as Record<string, string>) ?? {};\n return {\n from: {\n value: current.gte ?? current.gt ?? \"\",\n set: (v: string) => base.setValue({ ...current, gte: v }),\n },\n to: {\n value: current.lte ?? current.lt ?? \"\",\n set: (v: string) => base.setValue({ ...current, lte: v }),\n },\n };\n }\n\n if (inputGuards.exact_range_input(meta)) {\n const current = (base.value as Record<string, number | null>) ?? {};\n return {\n greaterThan: {\n operator: current.gt != null ? \"gt\" : \"gte\",\n value: current.gt ?? current.gte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"gt\" ? \"gte\" : \"gt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.gt != null ? \"gt\" : \"gte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n lessThan: {\n operator: current.lt != null ? \"lt\" : \"lte\",\n value: current.lt ?? current.lte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"lt\" ? \"lte\" : \"lt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.lt != null ? \"lt\" : \"lte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n };\n }\n\n if (inputGuards.min_max_int_input(meta)) {\n const current = (base.value as {\n min: number | null;\n max: number | null;\n }) ?? { min: null, max: null };\n return {\n from: {\n value: current.min,\n set: (v: number | null) => base.setValue({ ...current, min: v }),\n },\n to: {\n value: current.max,\n set: (v: number | null) => base.setValue({ ...current, max: v }),\n },\n };\n }\n\n if (inputGuards.multi_create_input(meta) || inputGuards.ordered_multi_create_input(meta)) {\n const items = (base.value as string[]) ?? [];\n const result: Record<string, unknown> = {\n items,\n add: (v: string) => base.setValue([...items, v]),\n remove: (v: string) => base.setValue(items.filter((i) => i !== v)),\n };\n if (inputGuards.ordered_multi_create_input(meta)) {\n result.reorder = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n base.setValue(next);\n };\n }\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.key_value_list_input(meta)) {\n const rows = (base.value as Array<{ key: string; value: string }>) ?? [];\n return {\n rows,\n addRow: () => base.setValue([...rows, { key: \"\", value: \"\" }]),\n removeRow: (index: number) => base.setValue(rows.filter((_, i) => i !== index)),\n setKey: (index: number, key: string) =>\n base.setValue(rows.map((row, i) => (i === index ? { ...row, key } : row))),\n setValue: (index: number, value: string) =>\n base.setValue(rows.map((row, i) => (i === index ? { ...row, value } : row))),\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.prompt_input(meta) || inputGuards.template_input(meta)) {\n return {\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n // Remaining types need no extras beyond base\n return {};\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n if (value === null || typeof value === \"undefined\") return true;\n if (typeof value === \"string\") return value === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n if (keys.length === 0) return true;\n return keys.every((k) => isEmptyValue((value as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nexport function buildSectionHandles(\n formConfig: FormSection[],\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): FormSectionHandle[] {\n // In onSubmit validation mode, don't flag groups as invalid until the\n // user has actually attempted a submit. This matches RHF's own field-level\n // behavior where `formState.errors` is only populated after the first\n // submit (and updated reactively thereafter per `reValidateMode`).\n const hasSubmitted = form.formState.isSubmitted;\n\n return formConfig.map((section) => {\n const groups: FormGroupHandle[] = section.groups.map((group) => {\n const fields = group.fields.map((meta) =>\n buildFieldProps(meta, form, publicKey, loadingCtx),\n ) as AnyFieldProps[];\n\n const groupPathError = form.getFieldState(group.groupPath as any).error;\n const errorCount = hasSubmitted\n ? fields.filter((f) => f.error != null).length + (groupPathError ? 1 : 0)\n : 0;\n const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;\n const dirtyCount = fields.filter((f) => f.dirty).length;\n\n return {\n key: group.groupPath,\n label: group.label,\n description: group.description,\n iconKey: group.iconKey,\n defaultExpand: group.defaultExpand ?? false,\n fields,\n errorCount,\n setCount,\n dirtyCount,\n };\n });\n\n return {\n key: section.metadata.path,\n label: section.metadata.label,\n description: section.metadata.description,\n groups,\n };\n });\n}\n\nexport function applyFormCustomization(\n sections: FormSectionHandle[],\n customization: FormCustomizationState,\n): FormSectionHandle[] {\n const { sectionMap, groupMap, pathMap } = customization;\n\n const hasSectionOverrides = Object.keys(sectionMap).length > 0;\n const hasGroupOverrides = Object.keys(groupMap).length > 0;\n const hasPathOverrides = Object.keys(pathMap).length > 0;\n\n if (!hasSectionOverrides && !hasGroupOverrides && !hasPathOverrides) {\n return sections;\n }\n\n return sections\n .filter((section) => sectionMap[section.key as SectionKeys] !== null)\n .map((section) => {\n const sectionOverride = sectionMap[section.key as SectionKeys];\n const mergedSection = sectionOverride\n ? {\n ...section,\n label: sectionOverride.label ?? section.label,\n description: sectionOverride.description ?? section.description,\n }\n : section;\n\n const groups = mergedSection.groups\n .filter((group) => groupMap[group.key] !== null)\n .map((group) => {\n const groupOverride = groupMap[group.key];\n const mergedGroup = groupOverride\n ? {\n ...group,\n label: groupOverride.label ?? group.label,\n description: groupOverride.description ?? group.description,\n iconKey: groupOverride.iconKey ?? group.iconKey,\n defaultExpand: groupOverride.defaultExpand ?? group.defaultExpand,\n }\n : group;\n\n const fields = mergedGroup.fields\n .filter((field) => pathMap[field.path] !== null)\n .map((field) => {\n const fieldOverride = pathMap[field.path];\n if (!fieldOverride) return field;\n return {\n ...field,\n label: fieldOverride.label ?? field.label,\n description: fieldOverride.description ?? field.description,\n };\n });\n\n // Preserve the submit-gated error count from buildSectionHandles:\n // if the original group was not flagged, don't resurrect errors\n // here just because we recount post-filter.\n const errorCount =\n group.errorCount > 0 ? fields.filter((f) => f.error != null).length : 0;\n const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;\n const dirtyCount = fields.filter((f) => f.dirty).length;\n\n return { ...mergedGroup, fields, errorCount, setCount, dirtyCount };\n })\n .filter((group) => group.fields.length > 0);\n\n return { ...mergedSection, groups };\n })\n .filter((section) => section.groups.length > 0);\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ //#region src/utils/internal-form.ts
2
+ /**
3
+ * INTERNAL — bridges between the underlying form library (`react-hook-form`)
4
+ * and the public `FormHandle<T>` surface.
5
+ *
6
+ * The library's public types intentionally hide RHF: integrators see
7
+ * `FormHandle<T>` on `PipeFormContext.form`, `SearchFormContext.form`, the
8
+ * field handle, and submit-handler ctxs. At runtime those are RHF's
9
+ * `UseFormReturn`, but the typed surface is narrower (and uses simple
10
+ * `string` paths rather than RHF's `Path<T>`-branded literals).
11
+ *
12
+ * The structural assignment in either direction does not type-check under
13
+ * `--strictFunctionTypes` because RHF declares its methods as function-typed
14
+ * properties (e.g. `trigger: UseFormTrigger<T>`), which forces strict
15
+ * contravariance. The two casts below are the only sanctioned places where
16
+ * we cross that boundary — every other call site should use the typed
17
+ * surface on the side it needs.
18
+ */
19
+ function asFormHandle(form) {
20
+ return form;
21
+ }
22
+ function asInternalForm(form) {
23
+ return form;
24
+ }
25
+
26
+ //#endregion
27
+ export { asFormHandle, asInternalForm };
28
+ //# sourceMappingURL=internal-form.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-form.mjs","names":[],"sources":["../../src/utils/internal-form.ts"],"sourcesContent":["import type { FieldValues, UseFormReturn } from \"react-hook-form\";\nimport type { FormHandle } from \"../types/form-handle.js\";\n\n/**\n * INTERNAL — bridges between the underlying form library (`react-hook-form`)\n * and the public `FormHandle<T>` surface.\n *\n * The library's public types intentionally hide RHF: integrators see\n * `FormHandle<T>` on `PipeFormContext.form`, `SearchFormContext.form`, the\n * field handle, and submit-handler ctxs. At runtime those are RHF's\n * `UseFormReturn`, but the typed surface is narrower (and uses simple\n * `string` paths rather than RHF's `Path<T>`-branded literals).\n *\n * The structural assignment in either direction does not type-check under\n * `--strictFunctionTypes` because RHF declares its methods as function-typed\n * properties (e.g. `trigger: UseFormTrigger<T>`), which forces strict\n * contravariance. The two casts below are the only sanctioned places where\n * we cross that boundary — every other call site should use the typed\n * surface on the side it needs.\n */\n\nexport function asFormHandle<T extends FieldValues>(form: UseFormReturn<T>): FormHandle<T> {\n return form as unknown as FormHandle<T>;\n}\n\nexport function asInternalForm<T extends FieldValues>(form: FormHandle<T>): UseFormReturn<T> {\n return form as unknown as UseFormReturn<T>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,SAAgB,aAAoC,MAAuC;AACzF,QAAO;;AAGT,SAAgB,eAAsC,MAAuC;AAC3F,QAAO"}
@@ -1,26 +1,23 @@
1
- import { RenderProp } from "../utils/render-slot.mjs";
1
+ import { useRender } from "@base-ui/react/use-render";
2
2
  import * as _$react from "react";
3
- import { ComponentProps } from "react";
4
3
  import { VariantProps } from "class-variance-authority";
5
4
  import { ProviderName } from "@pipe0/base";
6
5
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
7
6
 
8
7
  //#region src/widgets/avatar-group.d.ts
9
8
  declare const avatarGroupVariants: (props?: ({
10
- size?: "sm" | "md" | "lg" | null | undefined;
9
+ size?: "sm" | "lg" | "md" | null | undefined;
11
10
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
12
11
  interface AvatarGroupState {
13
- providers: readonly ProviderName[];
14
- shown: readonly ProviderName[];
12
+ overflows: boolean;
15
13
  remaining: number;
16
14
  }
17
- interface AvatarGroupProps extends Omit<ComponentProps<"div">, "children">, VariantProps<typeof avatarGroupVariants> {
15
+ interface AvatarGroupProps extends VariantProps<typeof avatarGroupVariants>, useRender.ComponentProps<"div", AvatarGroupState> {
18
16
  providers: readonly ProviderName[];
19
17
  /** Maximum tile slots before the overflow indicator. Default 4. */
20
18
  max?: number;
21
19
  /** Show the +N overflow tile when providers exceed `max`. Default true. */
22
20
  showCount?: boolean;
23
- render?: RenderProp<ComponentProps<"div">, AvatarGroupState>;
24
21
  }
25
22
  /**
26
23
  * Horizontal stack of provider tiles. Each tile is a brand-colored rectangle
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-group.d.mts","names":[],"sources":["../../src/widgets/avatar-group.tsx"],"mappings":";;;;;;;;cAMM,mBAAA,GAAmB,KAAA;;IASvB,iCAAA,CAAA,SAAA;AAAA,UA4Be,gBAAA;EACf,SAAA,WAAoB,YAAA;EACpB,KAAA,WAAgB,YAAA;EAChB,SAAA;AAAA;AAAA,UAGe,gBAAA,SACP,IAAA,CAAK,cAAA,sBACX,YAAA,QAAoB,mBAAA;EACtB,SAAA,WAAoB,YAAA;;EAEpB,GAAA;EAVA;EAYA,SAAA;EACA,MAAA,GAAS,UAAA,CAAW,cAAA,SAAuB,gBAAA;AAAA;;;;AAR7C;;;;;cAmBa,WAAA,EAAW,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,gBAAA,WAAA,OAAA,CAAA,aAAA,CAAA,cAAA"}
1
+ {"version":3,"file":"avatar-group.d.mts","names":[],"sources":["../../src/widgets/avatar-group.tsx"],"mappings":";;;;;;;cAOM,mBAAA,GAAmB,KAAA;;IASvB,iCAAA,CAAA,SAAA;AAAA,UA4Be,gBAAA;EACf,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,gBAAA,SACP,YAAA,QAAoB,mBAAA,GAC1B,SAAA,CAAU,cAAA,QAAsB,gBAAA;EAClC,SAAA,WAAoB,YAAA;EARW;EAU/B,GAAA;EATA;EAWA,SAAA;AAAA;;;;;;;;;cAWW,WAAA,EAAW,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,gBAAA,WAAA,OAAA,CAAA,aAAA,CAAA,cAAA"}
@@ -1,5 +1,6 @@
1
1
  import { cn } from "../lib/utils.mjs";
2
- import { renderSlot } from "../utils/render-slot.mjs";
2
+ import { mergeProps } from "@base-ui/react/merge-props";
3
+ import { useRender } from "@base-ui/react/use-render";
3
4
  import { forwardRef } from "react";
4
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
6
  import { cva } from "class-variance-authority";
@@ -44,22 +45,21 @@ const DEFAULT_MAX_TILES = 4;
44
45
  * `<CatalogProviderAvatars>`.
45
46
  */
46
47
  const AvatarGroup = forwardRef(function AvatarGroup({ providers, size, max = DEFAULT_MAX_TILES, showCount = true, className, render, ...rest }, ref) {
47
- if (!providers.length) return null;
48
48
  const sizeKey = size ?? "md";
49
- const renderOverflow = providers.length > max && showCount;
49
+ const overflows = providers.length > max;
50
+ const renderOverflow = overflows && showCount;
50
51
  const visibleSlots = renderOverflow ? max - 1 : max;
51
52
  const shown = providers.slice(0, visibleSlots);
52
53
  const remaining = providers.length - shown.length;
53
- return renderSlot({
54
+ const element = useRender({
55
+ ref,
54
56
  defaultTagName: "div",
55
57
  render,
56
58
  state: {
57
- providers,
58
- shown,
59
+ overflows,
59
60
  remaining
60
61
  },
61
- props: {
62
- "data-p0": "avatar-group",
62
+ props: mergeProps({
63
63
  className: cn(avatarGroupVariants({ size }), className),
64
64
  children: /* @__PURE__ */ jsxs(Fragment$1, { children: [shown.map((provider, i) => /* @__PURE__ */ jsx(ProviderTile, {
65
65
  provider,
@@ -69,11 +69,12 @@ const AvatarGroup = forwardRef(function AvatarGroup({ providers, size, max = DEF
69
69
  size: sizeKey,
70
70
  count: remaining,
71
71
  first: shown.length === 0
72
- }) : null] })
73
- },
74
- externalProps: rest,
75
- ref
72
+ }) : null] }),
73
+ "data-p0": "avatar-group"
74
+ }, rest)
76
75
  });
76
+ if (!providers.length) return null;
77
+ return element;
77
78
  });
78
79
  const tileBase = "pz:relative pz:flex pz:items-center pz:justify-center pz:rounded-md pz:overflow-hidden pz:ring-2 pz:ring-background pz:shrink-0";
79
80
  function ProviderTile({ provider, size, first }) {
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-group.mjs","names":[],"sources":["../../src/widgets/avatar-group.tsx"],"sourcesContent":["import { getProviderEntry, type ProviderName } from \"@pipe0/base\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { type ComponentProps, type CSSProperties, forwardRef } from \"react\";\nimport { cn } from \"../lib/utils.js\";\nimport { type RenderProp, renderSlot } from \"../utils/render-slot.js\";\n\nconst avatarGroupVariants = cva(\"pz:relative pz:inline-flex pz:items-center\", {\n variants: {\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nconst tileSize = {\n sm: \"pz:h-5 pz:w-5\",\n md: \"pz:h-8 pz:w-8\",\n lg: \"pz:h-12 pz:w-12\",\n} as const;\n\nconst tileLogoSize = {\n sm: \"pz:size-3\",\n md: \"pz:size-5\",\n lg: \"pz:size-7\",\n} as const;\n\nconst tileOverlap = {\n sm: \"pz:-ml-1\",\n md: \"pz:-ml-1.5\",\n lg: \"pz:-ml-2\",\n} as const;\n\nconst overflowText = {\n sm: \"pz:text-[9px]\",\n md: \"pz:text-xs\",\n lg: \"pz:text-sm\",\n} as const;\n\nconst DEFAULT_MAX_TILES = 4;\n\nexport interface AvatarGroupState {\n providers: readonly ProviderName[];\n shown: readonly ProviderName[];\n remaining: number;\n}\n\nexport interface AvatarGroupProps\n extends Omit<ComponentProps<\"div\">, \"children\">,\n VariantProps<typeof avatarGroupVariants> {\n providers: readonly ProviderName[];\n /** Maximum tile slots before the overflow indicator. Default 4. */\n max?: number;\n /** Show the +N overflow tile when providers exceed `max`. Default true. */\n showCount?: boolean;\n render?: RenderProp<ComponentProps<\"div\">, AvatarGroupState>;\n}\n\n/**\n * Horizontal stack of provider tiles. Each tile is a brand-colored rectangle\n * with the provider's logo on top; tiles overlap slightly to read as a group.\n * Defaults to a maximum of 4 tiles, then a \"+N\" overflow tile.\n *\n * Pure visual — no popover. For a hover-card with cost-per-provider, see\n * `<CatalogProviderAvatars>`.\n */\nexport const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(function AvatarGroup(\n { providers, size, max = DEFAULT_MAX_TILES, showCount = true, className, render, ...rest },\n ref,\n) {\n if (!providers.length) return null;\n\n const sizeKey = size ?? \"md\";\n const overflows = providers.length > max;\n const renderOverflow = overflows && showCount;\n const visibleSlots = renderOverflow ? max - 1 : max;\n const shown = providers.slice(0, visibleSlots);\n const remaining = providers.length - shown.length;\n\n const state: AvatarGroupState = { providers, shown, remaining };\n\n return renderSlot({\n defaultTagName: \"div\",\n render,\n state,\n props: {\n \"data-p0\": \"avatar-group\",\n className: cn(avatarGroupVariants({ size }), className),\n children: (\n <>\n {shown.map((provider, i) => (\n <ProviderTile key={provider} provider={provider} size={sizeKey} first={i === 0} />\n ))}\n {renderOverflow ? (\n <OverflowTile size={sizeKey} count={remaining} first={shown.length === 0} />\n ) : null}\n </>\n ),\n } as ComponentProps<\"div\">,\n externalProps: rest as Record<string, unknown>,\n ref,\n });\n});\n\nconst tileBase =\n \"pz:relative pz:flex pz:items-center pz:justify-center pz:rounded-md pz:overflow-hidden pz:ring-2 pz:ring-background pz:shrink-0\";\n\nfunction ProviderTile({\n provider,\n size,\n first,\n}: {\n provider: ProviderName;\n size: \"sm\" | \"md\" | \"lg\";\n first: boolean;\n}) {\n const entry = getProviderEntry(provider);\n const bg = entry?.background;\n return (\n <div\n data-p0=\"avatar-group-tile\"\n className={cn(tileBase, tileSize[size], first ? undefined : tileOverlap[size])}\n title={entry?.label ?? provider}\n >\n {bg ? (\n <>\n <div\n aria-hidden=\"true\"\n className=\"pz:absolute pz:inset-0 dark:pz:hidden\"\n style={{ backgroundColor: bg.light } as CSSProperties}\n />\n <div\n aria-hidden=\"true\"\n className=\"pz:absolute pz:inset-0 pz:hidden dark:pz:block\"\n style={{ backgroundColor: bg.dark } as CSSProperties}\n />\n </>\n ) : (\n <div aria-hidden=\"true\" className=\"pz:absolute pz:inset-0 pz:bg-muted\" />\n )}\n {entry?.logoUrl ? (\n <img\n src={entry.logoUrl}\n alt={entry.label ?? provider}\n className={cn(\"pz:relative pz:object-contain\", tileLogoSize[size])}\n />\n ) : null}\n </div>\n );\n}\n\nfunction OverflowTile({\n size,\n count,\n first,\n}: {\n size: \"sm\" | \"md\" | \"lg\";\n count: number;\n first: boolean;\n}) {\n return (\n <div\n data-p0=\"avatar-group-overflow\"\n className={cn(\n tileBase,\n \"pz:bg-muted pz:text-muted-foreground pz:font-medium\",\n tileSize[size],\n overflowText[size],\n first ? undefined : tileOverlap[size],\n )}\n >\n +{count}\n </div>\n );\n}\n\nexport { avatarGroupVariants, tileSize as avatarSize };\n"],"mappings":";;;;;;;;AAMA,MAAM,sBAAsB,IAAI,8CAA8C;CAC5E,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EAAE,MAAM,MAAM;CAChC,CAAC;AAEF,MAAM,WAAW;CACf,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,cAAc;CAClB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,oBAAoB;;;;;;;;;AA2B1B,MAAa,cAAc,WAA6C,SAAS,YAC/E,EAAE,WAAW,MAAM,MAAM,mBAAmB,YAAY,MAAM,WAAW,QAAQ,GAAG,QACpF,KACA;AACA,KAAI,CAAC,UAAU,OAAQ,QAAO;CAE9B,MAAM,UAAU,QAAQ;CAExB,MAAM,iBADY,UAAU,SAAS,OACD;CACpC,MAAM,eAAe,iBAAiB,MAAM,IAAI;CAChD,MAAM,QAAQ,UAAU,MAAM,GAAG,aAAa;CAC9C,MAAM,YAAY,UAAU,SAAS,MAAM;AAI3C,QAAO,WAAW;EAChB,gBAAgB;EAChB;EACA,OAL8B;GAAE;GAAW;GAAO;GAAW;EAM7D,OAAO;GACL,WAAW;GACX,WAAW,GAAG,oBAAoB,EAAE,MAAM,CAAC,EAAE,UAAU;GACvD,UACE,8CACG,MAAM,KAAK,UAAU,MACpB,oBAAC,cAAD;IAAuC;IAAU,MAAM;IAAS,OAAO,MAAM;IAAK,EAA/D,SAA+D,CAClF,EACD,iBACC,oBAAC,cAAD;IAAc,MAAM;IAAS,OAAO;IAAW,OAAO,MAAM,WAAW;IAAK,IAC1E,KACH;GAEN;EACD,eAAe;EACf;EACD,CAAC;EACF;AAEF,MAAM,WACJ;AAEF,SAAS,aAAa,EACpB,UACA,MACA,SAKC;CACD,MAAM,QAAQ,iBAAiB,SAAS;CACxC,MAAM,KAAK,OAAO;AAClB,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GAAG,UAAU,SAAS,OAAO,QAAQ,SAAY,YAAY,MAAM;EAC9E,OAAO,OAAO,SAAS;YAHzB,CAKG,KACC,8CACE,oBAAC,OAAD;GACE,eAAY;GACZ,WAAU;GACV,OAAO,EAAE,iBAAiB,GAAG,OAAO;GACpC,GACF,oBAAC,OAAD;GACE,eAAY;GACZ,WAAU;GACV,OAAO,EAAE,iBAAiB,GAAG,MAAM;GACnC,EACD,MAEH,oBAAC,OAAD;GAAK,eAAY;GAAO,WAAU;GAAuC,GAE1E,OAAO,UACN,oBAAC,OAAD;GACE,KAAK,MAAM;GACX,KAAK,MAAM,SAAS;GACpB,WAAW,GAAG,iCAAiC,aAAa,MAAM;GAClE,IACA,KACA;;;AAIV,SAAS,aAAa,EACpB,MACA,OACA,SAKC;AACD,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GACT,UACA,uDACA,SAAS,OACT,aAAa,OACb,QAAQ,SAAY,YAAY,MACjC;YARH,CASC,KACG,MACE"}
1
+ {"version":3,"file":"avatar-group.mjs","names":[],"sources":["../../src/widgets/avatar-group.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { getProviderEntry, type ProviderName } from \"@pipe0/base\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { type CSSProperties, forwardRef } from \"react\";\nimport { cn } from \"../lib/utils.js\";\n\nconst avatarGroupVariants = cva(\"pz:relative pz:inline-flex pz:items-center\", {\n variants: {\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nconst tileSize = {\n sm: \"pz:h-5 pz:w-5\",\n md: \"pz:h-8 pz:w-8\",\n lg: \"pz:h-12 pz:w-12\",\n} as const;\n\nconst tileLogoSize = {\n sm: \"pz:size-3\",\n md: \"pz:size-5\",\n lg: \"pz:size-7\",\n} as const;\n\nconst tileOverlap = {\n sm: \"pz:-ml-1\",\n md: \"pz:-ml-1.5\",\n lg: \"pz:-ml-2\",\n} as const;\n\nconst overflowText = {\n sm: \"pz:text-[9px]\",\n md: \"pz:text-xs\",\n lg: \"pz:text-sm\",\n} as const;\n\nconst DEFAULT_MAX_TILES = 4;\n\nexport interface AvatarGroupState {\n overflows: boolean;\n remaining: number;\n}\n\nexport interface AvatarGroupProps\n extends VariantProps<typeof avatarGroupVariants>,\n useRender.ComponentProps<\"div\", AvatarGroupState> {\n providers: readonly ProviderName[];\n /** Maximum tile slots before the overflow indicator. Default 4. */\n max?: number;\n /** Show the +N overflow tile when providers exceed `max`. Default true. */\n showCount?: boolean;\n}\n\n/**\n * Horizontal stack of provider tiles. Each tile is a brand-colored rectangle\n * with the provider's logo on top; tiles overlap slightly to read as a group.\n * Defaults to a maximum of 4 tiles, then a \"+N\" overflow tile.\n *\n * Pure visual — no popover. For a hover-card with cost-per-provider, see\n * `<CatalogProviderAvatars>`.\n */\nexport const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(function AvatarGroup(\n { providers, size, max = DEFAULT_MAX_TILES, showCount = true, className, render, ...rest },\n ref,\n) {\n const sizeKey = size ?? \"md\";\n const overflows = providers.length > max;\n const renderOverflow = overflows && showCount;\n const visibleSlots = renderOverflow ? max - 1 : max;\n const shown = providers.slice(0, visibleSlots);\n const remaining = providers.length - shown.length;\n\n const element = useRender({\n ref,\n defaultTagName: \"div\",\n render,\n state: { overflows, remaining },\n props: mergeProps<\"div\">(\n {\n className: cn(avatarGroupVariants({ size }), className),\n children: (\n <>\n {shown.map((provider, i) => (\n <ProviderTile key={provider} provider={provider} size={sizeKey} first={i === 0} />\n ))}\n {renderOverflow ? (\n <OverflowTile size={sizeKey} count={remaining} first={shown.length === 0} />\n ) : null}\n </>\n ),\n ...({ \"data-p0\": \"avatar-group\" } as Record<string, string>),\n },\n rest as Record<string, unknown>,\n ),\n });\n\n if (!providers.length) return null;\n return element;\n});\n\nconst tileBase =\n \"pz:relative pz:flex pz:items-center pz:justify-center pz:rounded-md pz:overflow-hidden pz:ring-2 pz:ring-background pz:shrink-0\";\n\nfunction ProviderTile({\n provider,\n size,\n first,\n}: {\n provider: ProviderName;\n size: \"sm\" | \"md\" | \"lg\";\n first: boolean;\n}) {\n const entry = getProviderEntry(provider);\n const bg = entry?.background;\n return (\n <div\n data-p0=\"avatar-group-tile\"\n className={cn(tileBase, tileSize[size], first ? undefined : tileOverlap[size])}\n title={entry?.label ?? provider}\n >\n {bg ? (\n <>\n <div\n aria-hidden=\"true\"\n className=\"pz:absolute pz:inset-0 dark:pz:hidden\"\n style={{ backgroundColor: bg.light } as CSSProperties}\n />\n <div\n aria-hidden=\"true\"\n className=\"pz:absolute pz:inset-0 pz:hidden dark:pz:block\"\n style={{ backgroundColor: bg.dark } as CSSProperties}\n />\n </>\n ) : (\n <div aria-hidden=\"true\" className=\"pz:absolute pz:inset-0 pz:bg-muted\" />\n )}\n {entry?.logoUrl ? (\n <img\n src={entry.logoUrl}\n alt={entry.label ?? provider}\n className={cn(\"pz:relative pz:object-contain\", tileLogoSize[size])}\n />\n ) : null}\n </div>\n );\n}\n\nfunction OverflowTile({\n size,\n count,\n first,\n}: {\n size: \"sm\" | \"md\" | \"lg\";\n count: number;\n first: boolean;\n}) {\n return (\n <div\n data-p0=\"avatar-group-overflow\"\n className={cn(\n tileBase,\n \"pz:bg-muted pz:text-muted-foreground pz:font-medium\",\n tileSize[size],\n overflowText[size],\n first ? undefined : tileOverlap[size],\n )}\n >\n +{count}\n </div>\n );\n}\n\nexport { avatarGroupVariants, tileSize as avatarSize };\n"],"mappings":";;;;;;;;;AAOA,MAAM,sBAAsB,IAAI,8CAA8C;CAC5E,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EAAE,MAAM,MAAM;CAChC,CAAC;AAEF,MAAM,WAAW;CACf,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,cAAc;CAClB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,MAAM,oBAAoB;;;;;;;;;AAyB1B,MAAa,cAAc,WAA6C,SAAS,YAC/E,EAAE,WAAW,MAAM,MAAM,mBAAmB,YAAY,MAAM,WAAW,QAAQ,GAAG,QACpF,KACA;CACA,MAAM,UAAU,QAAQ;CACxB,MAAM,YAAY,UAAU,SAAS;CACrC,MAAM,iBAAiB,aAAa;CACpC,MAAM,eAAe,iBAAiB,MAAM,IAAI;CAChD,MAAM,QAAQ,UAAU,MAAM,GAAG,aAAa;CAC9C,MAAM,YAAY,UAAU,SAAS,MAAM;CAE3C,MAAM,UAAU,UAAU;EACxB;EACA,gBAAgB;EAChB;EACA,OAAO;GAAE;GAAW;GAAW;EAC/B,OAAO,WACL;GACE,WAAW,GAAG,oBAAoB,EAAE,MAAM,CAAC,EAAE,UAAU;GACvD,UACE,8CACG,MAAM,KAAK,UAAU,MACpB,oBAAC,cAAD;IAAuC;IAAU,MAAM;IAAS,OAAO,MAAM;IAAK,EAA/D,SAA+D,CAClF,EACD,iBACC,oBAAC,cAAD;IAAc,MAAM;IAAS,OAAO;IAAW,OAAO,MAAM,WAAW;IAAK,IAC1E,KACH;GAEC,WAAW;GAClB,EACD,KACD;EACF,CAAC;AAEF,KAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,QAAO;EACP;AAEF,MAAM,WACJ;AAEF,SAAS,aAAa,EACpB,UACA,MACA,SAKC;CACD,MAAM,QAAQ,iBAAiB,SAAS;CACxC,MAAM,KAAK,OAAO;AAClB,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GAAG,UAAU,SAAS,OAAO,QAAQ,SAAY,YAAY,MAAM;EAC9E,OAAO,OAAO,SAAS;YAHzB,CAKG,KACC,8CACE,oBAAC,OAAD;GACE,eAAY;GACZ,WAAU;GACV,OAAO,EAAE,iBAAiB,GAAG,OAAO;GACpC,GACF,oBAAC,OAAD;GACE,eAAY;GACZ,WAAU;GACV,OAAO,EAAE,iBAAiB,GAAG,MAAM;GACnC,EACD,MAEH,oBAAC,OAAD;GAAK,eAAY;GAAO,WAAU;GAAuC,GAE1E,OAAO,UACN,oBAAC,OAAD;GACE,KAAK,MAAM;GACX,KAAK,MAAM,SAAS;GACpB,WAAW,GAAG,iCAAiC,aAAa,MAAM;GAClE,IACA,KACA;;;AAIV,SAAS,aAAa,EACpB,MACA,OACA,SAKC;AACD,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GACT,UACA,uDACA,SAAS,OACT,aAAa,OACb,QAAQ,SAAY,YAAY,MACjC;YARH,CASC,KACG,MACE"}