@pipe0/react 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +172 -0
  3. package/dist/components/compound/pipe-catalog/active-filters.d.mts +26 -0
  4. package/dist/components/compound/pipe-catalog/active-filters.d.mts.map +1 -0
  5. package/dist/components/compound/pipe-catalog/active-filters.mjs +47 -0
  6. package/dist/components/compound/pipe-catalog/active-filters.mjs.map +1 -0
  7. package/dist/components/compound/pipe-catalog/card.d.mts +30 -0
  8. package/dist/components/compound/pipe-catalog/card.d.mts.map +1 -0
  9. package/dist/components/compound/pipe-catalog/card.mjs +77 -0
  10. package/dist/components/compound/pipe-catalog/card.mjs.map +1 -0
  11. package/dist/components/compound/pipe-catalog/category-filter.d.mts +30 -0
  12. package/dist/components/compound/pipe-catalog/category-filter.d.mts.map +1 -0
  13. package/dist/components/compound/pipe-catalog/category-filter.mjs +56 -0
  14. package/dist/components/compound/pipe-catalog/category-filter.mjs.map +1 -0
  15. package/dist/components/compound/pipe-catalog/column-filter.d.mts +40 -0
  16. package/dist/components/compound/pipe-catalog/column-filter.d.mts.map +1 -0
  17. package/dist/components/compound/pipe-catalog/column-filter.mjs +66 -0
  18. package/dist/components/compound/pipe-catalog/column-filter.mjs.map +1 -0
  19. package/dist/components/compound/pipe-catalog/column-filters.d.mts +16 -0
  20. package/dist/components/compound/pipe-catalog/column-filters.d.mts.map +1 -0
  21. package/dist/components/compound/pipe-catalog/column-filters.mjs +21 -0
  22. package/dist/components/compound/pipe-catalog/column-filters.mjs.map +1 -0
  23. package/dist/components/compound/pipe-catalog/empty.d.mts +22 -0
  24. package/dist/components/compound/pipe-catalog/empty.d.mts.map +1 -0
  25. package/dist/components/compound/pipe-catalog/empty.mjs +31 -0
  26. package/dist/components/compound/pipe-catalog/empty.mjs.map +1 -0
  27. package/dist/components/compound/pipe-catalog/index.d.mts +13 -0
  28. package/dist/components/compound/pipe-catalog/index.mjs +15 -0
  29. package/dist/components/compound/pipe-catalog/input-field-filter.d.mts +22 -0
  30. package/dist/components/compound/pipe-catalog/input-field-filter.d.mts.map +1 -0
  31. package/dist/components/compound/pipe-catalog/input-field-filter.mjs +22 -0
  32. package/dist/components/compound/pipe-catalog/input-field-filter.mjs.map +1 -0
  33. package/dist/components/compound/pipe-catalog/list.d.mts +34 -0
  34. package/dist/components/compound/pipe-catalog/list.d.mts.map +1 -0
  35. package/dist/components/compound/pipe-catalog/list.mjs +29 -0
  36. package/dist/components/compound/pipe-catalog/list.mjs.map +1 -0
  37. package/dist/components/compound/pipe-catalog/output-field-filter.d.mts +22 -0
  38. package/dist/components/compound/pipe-catalog/output-field-filter.d.mts.map +1 -0
  39. package/dist/components/compound/pipe-catalog/output-field-filter.mjs +22 -0
  40. package/dist/components/compound/pipe-catalog/output-field-filter.mjs.map +1 -0
  41. package/dist/components/compound/pipe-catalog/provider-filter.d.mts +22 -0
  42. package/dist/components/compound/pipe-catalog/provider-filter.d.mts.map +1 -0
  43. package/dist/components/compound/pipe-catalog/provider-filter.mjs +29 -0
  44. package/dist/components/compound/pipe-catalog/provider-filter.mjs.map +1 -0
  45. package/dist/components/compound/pipe-catalog/root.d.mts +47 -0
  46. package/dist/components/compound/pipe-catalog/root.d.mts.map +1 -0
  47. package/dist/components/compound/pipe-catalog/root.mjs +85 -0
  48. package/dist/components/compound/pipe-catalog/root.mjs.map +1 -0
  49. package/dist/components/compound/pipe-catalog/search-filter.d.mts +24 -0
  50. package/dist/components/compound/pipe-catalog/search-filter.d.mts.map +1 -0
  51. package/dist/components/compound/pipe-catalog/search-filter.mjs +46 -0
  52. package/dist/components/compound/pipe-catalog/search-filter.mjs.map +1 -0
  53. package/dist/components/compound/pipe-catalog/tag-filter.d.mts +22 -0
  54. package/dist/components/compound/pipe-catalog/tag-filter.d.mts.map +1 -0
  55. package/dist/components/compound/pipe-catalog/tag-filter.mjs +22 -0
  56. package/dist/components/compound/pipe-catalog/tag-filter.mjs.map +1 -0
  57. package/dist/components/compound/pipe-form/content.d.mts +18 -0
  58. package/dist/components/compound/pipe-form/content.d.mts.map +1 -0
  59. package/dist/components/compound/pipe-form/content.mjs +45 -0
  60. package/dist/components/compound/pipe-form/content.mjs.map +1 -0
  61. package/dist/components/compound/pipe-form/field.d.mts +17 -0
  62. package/dist/components/compound/pipe-form/field.d.mts.map +1 -0
  63. package/dist/components/compound/pipe-form/field.mjs +21 -0
  64. package/dist/components/compound/pipe-form/field.mjs.map +1 -0
  65. package/dist/components/compound/pipe-form/footer.d.mts +14 -0
  66. package/dist/components/compound/pipe-form/footer.d.mts.map +1 -0
  67. package/dist/components/compound/pipe-form/footer.mjs +14 -0
  68. package/dist/components/compound/pipe-form/footer.mjs.map +1 -0
  69. package/dist/components/compound/pipe-form/group.d.mts +13 -0
  70. package/dist/components/compound/pipe-form/group.d.mts.map +1 -0
  71. package/dist/components/compound/pipe-form/group.mjs +17 -0
  72. package/dist/components/compound/pipe-form/group.mjs.map +1 -0
  73. package/dist/components/compound/pipe-form/header.d.mts +14 -0
  74. package/dist/components/compound/pipe-form/header.d.mts.map +1 -0
  75. package/dist/components/compound/pipe-form/header.mjs +14 -0
  76. package/dist/components/compound/pipe-form/header.mjs.map +1 -0
  77. package/dist/components/compound/pipe-form/index.d.mts +9 -0
  78. package/dist/components/compound/pipe-form/index.mjs +11 -0
  79. package/dist/components/compound/pipe-form/root.d.mts +56 -0
  80. package/dist/components/compound/pipe-form/root.d.mts.map +1 -0
  81. package/dist/components/compound/pipe-form/root.mjs +98 -0
  82. package/dist/components/compound/pipe-form/root.mjs.map +1 -0
  83. package/dist/components/compound/pipe-form/section.d.mts +13 -0
  84. package/dist/components/compound/pipe-form/section.d.mts.map +1 -0
  85. package/dist/components/compound/pipe-form/section.mjs +17 -0
  86. package/dist/components/compound/pipe-form/section.mjs.map +1 -0
  87. package/dist/components/compound/pipe-form/submit-button.d.mts +9 -0
  88. package/dist/components/compound/pipe-form/submit-button.d.mts.map +1 -0
  89. package/dist/components/compound/pipe-form/submit-button.mjs +17 -0
  90. package/dist/components/compound/pipe-form/submit-button.mjs.map +1 -0
  91. package/dist/components/compound/pipe-form/title.d.mts +16 -0
  92. package/dist/components/compound/pipe-form/title.d.mts.map +1 -0
  93. package/dist/components/compound/pipe-form/title.mjs +14 -0
  94. package/dist/components/compound/pipe-form/title.mjs.map +1 -0
  95. package/dist/components/compound/search-catalog/active-filters.d.mts +26 -0
  96. package/dist/components/compound/search-catalog/active-filters.d.mts.map +1 -0
  97. package/dist/components/compound/search-catalog/active-filters.mjs +46 -0
  98. package/dist/components/compound/search-catalog/active-filters.mjs.map +1 -0
  99. package/dist/components/compound/search-catalog/card.d.mts +30 -0
  100. package/dist/components/compound/search-catalog/card.d.mts.map +1 -0
  101. package/dist/components/compound/search-catalog/card.mjs +77 -0
  102. package/dist/components/compound/search-catalog/card.mjs.map +1 -0
  103. package/dist/components/compound/search-catalog/category-filter.d.mts +29 -0
  104. package/dist/components/compound/search-catalog/category-filter.d.mts.map +1 -0
  105. package/dist/components/compound/search-catalog/category-filter.mjs +51 -0
  106. package/dist/components/compound/search-catalog/category-filter.mjs.map +1 -0
  107. package/dist/components/compound/search-catalog/column-filter.d.mts +40 -0
  108. package/dist/components/compound/search-catalog/column-filter.d.mts.map +1 -0
  109. package/dist/components/compound/search-catalog/column-filter.mjs +63 -0
  110. package/dist/components/compound/search-catalog/column-filter.mjs.map +1 -0
  111. package/dist/components/compound/search-catalog/column-filters.d.mts +15 -0
  112. package/dist/components/compound/search-catalog/column-filters.d.mts.map +1 -0
  113. package/dist/components/compound/search-catalog/column-filters.mjs +16 -0
  114. package/dist/components/compound/search-catalog/column-filters.mjs.map +1 -0
  115. package/dist/components/compound/search-catalog/empty.d.mts +22 -0
  116. package/dist/components/compound/search-catalog/empty.d.mts.map +1 -0
  117. package/dist/components/compound/search-catalog/empty.mjs +31 -0
  118. package/dist/components/compound/search-catalog/empty.mjs.map +1 -0
  119. package/dist/components/compound/search-catalog/index.d.mts +12 -0
  120. package/dist/components/compound/search-catalog/index.mjs +14 -0
  121. package/dist/components/compound/search-catalog/list.d.mts +19 -0
  122. package/dist/components/compound/search-catalog/list.d.mts.map +1 -0
  123. package/dist/components/compound/search-catalog/list.mjs +29 -0
  124. package/dist/components/compound/search-catalog/list.mjs.map +1 -0
  125. package/dist/components/compound/search-catalog/output-field-filter.d.mts +22 -0
  126. package/dist/components/compound/search-catalog/output-field-filter.d.mts.map +1 -0
  127. package/dist/components/compound/search-catalog/output-field-filter.mjs +22 -0
  128. package/dist/components/compound/search-catalog/output-field-filter.mjs.map +1 -0
  129. package/dist/components/compound/search-catalog/provider-filter.d.mts +22 -0
  130. package/dist/components/compound/search-catalog/provider-filter.d.mts.map +1 -0
  131. package/dist/components/compound/search-catalog/provider-filter.mjs +29 -0
  132. package/dist/components/compound/search-catalog/provider-filter.mjs.map +1 -0
  133. package/dist/components/compound/search-catalog/root.d.mts +33 -0
  134. package/dist/components/compound/search-catalog/root.d.mts.map +1 -0
  135. package/dist/components/compound/search-catalog/root.mjs +74 -0
  136. package/dist/components/compound/search-catalog/root.mjs.map +1 -0
  137. package/dist/components/compound/search-catalog/search-filter.d.mts +24 -0
  138. package/dist/components/compound/search-catalog/search-filter.d.mts.map +1 -0
  139. package/dist/components/compound/search-catalog/search-filter.mjs +46 -0
  140. package/dist/components/compound/search-catalog/search-filter.mjs.map +1 -0
  141. package/dist/components/compound/search-catalog/tag-filter.d.mts +22 -0
  142. package/dist/components/compound/search-catalog/tag-filter.d.mts.map +1 -0
  143. package/dist/components/compound/search-catalog/tag-filter.mjs +22 -0
  144. package/dist/components/compound/search-catalog/tag-filter.mjs.map +1 -0
  145. package/dist/components/compound/search-form/content.d.mts +18 -0
  146. package/dist/components/compound/search-form/content.d.mts.map +1 -0
  147. package/dist/components/compound/search-form/content.mjs +45 -0
  148. package/dist/components/compound/search-form/content.mjs.map +1 -0
  149. package/dist/components/compound/search-form/field.d.mts +17 -0
  150. package/dist/components/compound/search-form/field.d.mts.map +1 -0
  151. package/dist/components/compound/search-form/field.mjs +21 -0
  152. package/dist/components/compound/search-form/field.mjs.map +1 -0
  153. package/dist/components/compound/search-form/footer.d.mts +14 -0
  154. package/dist/components/compound/search-form/footer.d.mts.map +1 -0
  155. package/dist/components/compound/search-form/footer.mjs +14 -0
  156. package/dist/components/compound/search-form/footer.mjs.map +1 -0
  157. package/dist/components/compound/search-form/group.d.mts +13 -0
  158. package/dist/components/compound/search-form/group.d.mts.map +1 -0
  159. package/dist/components/compound/search-form/group.mjs +17 -0
  160. package/dist/components/compound/search-form/group.mjs.map +1 -0
  161. package/dist/components/compound/search-form/header.d.mts +14 -0
  162. package/dist/components/compound/search-form/header.d.mts.map +1 -0
  163. package/dist/components/compound/search-form/header.mjs +14 -0
  164. package/dist/components/compound/search-form/header.mjs.map +1 -0
  165. package/dist/components/compound/search-form/index.d.mts +9 -0
  166. package/dist/components/compound/search-form/index.mjs +11 -0
  167. package/dist/components/compound/search-form/root.d.mts +45 -0
  168. package/dist/components/compound/search-form/root.d.mts.map +1 -0
  169. package/dist/components/compound/search-form/root.mjs +90 -0
  170. package/dist/components/compound/search-form/root.mjs.map +1 -0
  171. package/dist/components/compound/search-form/section.d.mts +13 -0
  172. package/dist/components/compound/search-form/section.d.mts.map +1 -0
  173. package/dist/components/compound/search-form/section.mjs +17 -0
  174. package/dist/components/compound/search-form/section.mjs.map +1 -0
  175. package/dist/components/compound/search-form/submit-button.d.mts +9 -0
  176. package/dist/components/compound/search-form/submit-button.d.mts.map +1 -0
  177. package/dist/components/compound/search-form/submit-button.mjs +17 -0
  178. package/dist/components/compound/search-form/submit-button.mjs.map +1 -0
  179. package/dist/components/compound/search-form/title.d.mts +16 -0
  180. package/dist/components/compound/search-form/title.d.mts.map +1 -0
  181. package/dist/components/compound/search-form/title.mjs +14 -0
  182. package/dist/components/compound/search-form/title.mjs.map +1 -0
  183. package/dist/components/compound/searches-catalog/active-filters.d.mts +26 -0
  184. package/dist/components/compound/searches-catalog/active-filters.d.mts.map +1 -0
  185. package/dist/components/compound/searches-catalog/active-filters.mjs +46 -0
  186. package/dist/components/compound/searches-catalog/active-filters.mjs.map +1 -0
  187. package/dist/components/compound/searches-catalog/card.d.mts +22 -0
  188. package/dist/components/compound/searches-catalog/card.d.mts.map +1 -0
  189. package/dist/components/compound/searches-catalog/card.mjs +70 -0
  190. package/dist/components/compound/searches-catalog/card.mjs.map +1 -0
  191. package/dist/components/compound/searches-catalog/category-filter.d.mts +29 -0
  192. package/dist/components/compound/searches-catalog/category-filter.d.mts.map +1 -0
  193. package/dist/components/compound/searches-catalog/category-filter.mjs +51 -0
  194. package/dist/components/compound/searches-catalog/category-filter.mjs.map +1 -0
  195. package/dist/components/compound/searches-catalog/column-filter.d.mts +31 -0
  196. package/dist/components/compound/searches-catalog/column-filter.d.mts.map +1 -0
  197. package/dist/components/compound/searches-catalog/column-filter.mjs +58 -0
  198. package/dist/components/compound/searches-catalog/column-filter.mjs.map +1 -0
  199. package/dist/components/compound/searches-catalog/column-filters.d.mts +15 -0
  200. package/dist/components/compound/searches-catalog/column-filters.d.mts.map +1 -0
  201. package/dist/components/compound/searches-catalog/column-filters.mjs +16 -0
  202. package/dist/components/compound/searches-catalog/column-filters.mjs.map +1 -0
  203. package/dist/components/compound/searches-catalog/empty.d.mts +22 -0
  204. package/dist/components/compound/searches-catalog/empty.d.mts.map +1 -0
  205. package/dist/components/compound/searches-catalog/empty.mjs +31 -0
  206. package/dist/components/compound/searches-catalog/empty.mjs.map +1 -0
  207. package/dist/components/compound/searches-catalog/index.d.mts +12 -0
  208. package/dist/components/compound/searches-catalog/index.mjs +14 -0
  209. package/dist/components/compound/searches-catalog/list.d.mts +19 -0
  210. package/dist/components/compound/searches-catalog/list.d.mts.map +1 -0
  211. package/dist/components/compound/searches-catalog/list.mjs +29 -0
  212. package/dist/components/compound/searches-catalog/list.mjs.map +1 -0
  213. package/dist/components/compound/searches-catalog/output-field-filter.d.mts +22 -0
  214. package/dist/components/compound/searches-catalog/output-field-filter.d.mts.map +1 -0
  215. package/dist/components/compound/searches-catalog/output-field-filter.mjs +22 -0
  216. package/dist/components/compound/searches-catalog/output-field-filter.mjs.map +1 -0
  217. package/dist/components/compound/searches-catalog/provider-filter.d.mts +22 -0
  218. package/dist/components/compound/searches-catalog/provider-filter.d.mts.map +1 -0
  219. package/dist/components/compound/searches-catalog/provider-filter.mjs +29 -0
  220. package/dist/components/compound/searches-catalog/provider-filter.mjs.map +1 -0
  221. package/dist/components/compound/searches-catalog/root.d.mts +33 -0
  222. package/dist/components/compound/searches-catalog/root.d.mts.map +1 -0
  223. package/dist/components/compound/searches-catalog/root.mjs +74 -0
  224. package/dist/components/compound/searches-catalog/root.mjs.map +1 -0
  225. package/dist/components/compound/searches-catalog/search-filter.d.mts +24 -0
  226. package/dist/components/compound/searches-catalog/search-filter.d.mts.map +1 -0
  227. package/dist/components/compound/searches-catalog/search-filter.mjs +46 -0
  228. package/dist/components/compound/searches-catalog/search-filter.mjs.map +1 -0
  229. package/dist/components/compound/searches-catalog/tag-filter.d.mts +22 -0
  230. package/dist/components/compound/searches-catalog/tag-filter.d.mts.map +1 -0
  231. package/dist/components/compound/searches-catalog/tag-filter.mjs +22 -0
  232. package/dist/components/compound/searches-catalog/tag-filter.mjs.map +1 -0
  233. package/dist/components/defaults/adapters/async-include-exclude-select-input.mjs +32 -0
  234. package/dist/components/defaults/adapters/async-include-exclude-select-input.mjs.map +1 -0
  235. package/dist/components/defaults/adapters/async-multi-select-input.mjs +26 -0
  236. package/dist/components/defaults/adapters/async-multi-select-input.mjs.map +1 -0
  237. package/dist/components/defaults/adapters/boolean-input.mjs +82 -0
  238. package/dist/components/defaults/adapters/boolean-input.mjs.map +1 -0
  239. package/dist/components/defaults/adapters/connector-input.mjs +94 -0
  240. package/dist/components/defaults/adapters/connector-input.mjs.map +1 -0
  241. package/dist/components/defaults/adapters/context-select-input.mjs +74 -0
  242. package/dist/components/defaults/adapters/context-select-input.mjs.map +1 -0
  243. package/dist/components/defaults/adapters/cursor-pagination-input.mjs +29 -0
  244. package/dist/components/defaults/adapters/cursor-pagination-input.mjs.map +1 -0
  245. package/dist/components/defaults/adapters/date-range-input.mjs +53 -0
  246. package/dist/components/defaults/adapters/date-range-input.mjs.map +1 -0
  247. package/dist/components/defaults/adapters/exact-range-input.mjs +75 -0
  248. package/dist/components/defaults/adapters/exact-range-input.mjs.map +1 -0
  249. package/dist/components/defaults/adapters/fields-select-input.mjs +25 -0
  250. package/dist/components/defaults/adapters/fields-select-input.mjs.map +1 -0
  251. package/dist/components/defaults/adapters/include-exclude-input.mjs +33 -0
  252. package/dist/components/defaults/adapters/include-exclude-input.mjs.map +1 -0
  253. package/dist/components/defaults/adapters/include-exclude-select-input.mjs +36 -0
  254. package/dist/components/defaults/adapters/include-exclude-select-input.mjs.map +1 -0
  255. package/dist/components/defaults/adapters/index.d.mts +11 -0
  256. package/dist/components/defaults/adapters/index.d.mts.map +1 -0
  257. package/dist/components/defaults/adapters/index.mjs +73 -0
  258. package/dist/components/defaults/adapters/index.mjs.map +1 -0
  259. package/dist/components/defaults/adapters/int-input.mjs +16 -0
  260. package/dist/components/defaults/adapters/int-input.mjs.map +1 -0
  261. package/dist/components/defaults/adapters/json-extraction-input.mjs +333 -0
  262. package/dist/components/defaults/adapters/json-extraction-input.mjs.map +1 -0
  263. package/dist/components/defaults/adapters/json-schema-input.mjs +30 -0
  264. package/dist/components/defaults/adapters/json-schema-input.mjs.map +1 -0
  265. package/dist/components/defaults/adapters/key-value-list-input.mjs +100 -0
  266. package/dist/components/defaults/adapters/key-value-list-input.mjs.map +1 -0
  267. package/dist/components/defaults/adapters/min-max-int-input.mjs +65 -0
  268. package/dist/components/defaults/adapters/min-max-int-input.mjs.map +1 -0
  269. package/dist/components/defaults/adapters/multi-create-input.mjs +32 -0
  270. package/dist/components/defaults/adapters/multi-create-input.mjs.map +1 -0
  271. package/dist/components/defaults/adapters/multi-select-input.mjs +26 -0
  272. package/dist/components/defaults/adapters/multi-select-input.mjs.map +1 -0
  273. package/dist/components/defaults/adapters/number-input.mjs +15 -0
  274. package/dist/components/defaults/adapters/number-input.mjs.map +1 -0
  275. package/dist/components/defaults/adapters/ordered-multi-create-input.mjs +43 -0
  276. package/dist/components/defaults/adapters/ordered-multi-create-input.mjs.map +1 -0
  277. package/dist/components/defaults/adapters/output-field-input.mjs +37 -0
  278. package/dist/components/defaults/adapters/output-field-input.mjs.map +1 -0
  279. package/dist/components/defaults/adapters/pipes-trigger-input.mjs +381 -0
  280. package/dist/components/defaults/adapters/pipes-trigger-input.mjs.map +1 -0
  281. package/dist/components/defaults/adapters/prompt-input.mjs +208 -0
  282. package/dist/components/defaults/adapters/prompt-input.mjs.map +1 -0
  283. package/dist/components/defaults/adapters/providers-input.mjs +23 -0
  284. package/dist/components/defaults/adapters/providers-input.mjs.map +1 -0
  285. package/dist/components/defaults/adapters/range-input.mjs +61 -0
  286. package/dist/components/defaults/adapters/range-input.mjs.map +1 -0
  287. package/dist/components/defaults/adapters/select-input.mjs +54 -0
  288. package/dist/components/defaults/adapters/select-input.mjs.map +1 -0
  289. package/dist/components/defaults/adapters/tagged-text-input.mjs +154 -0
  290. package/dist/components/defaults/adapters/tagged-text-input.mjs.map +1 -0
  291. package/dist/components/defaults/adapters/template-input.mjs +34 -0
  292. package/dist/components/defaults/adapters/template-input.mjs.map +1 -0
  293. package/dist/components/defaults/adapters/text-input.mjs +18 -0
  294. package/dist/components/defaults/adapters/text-input.mjs.map +1 -0
  295. package/dist/components/defaults/adapters/textarea-input.mjs +17 -0
  296. package/dist/components/defaults/adapters/textarea-input.mjs.map +1 -0
  297. package/dist/components/defaults/catalog/active-filter-pill.mjs +30 -0
  298. package/dist/components/defaults/catalog/active-filter-pill.mjs.map +1 -0
  299. package/dist/components/defaults/catalog/card-derived.d.mts +98 -0
  300. package/dist/components/defaults/catalog/card-derived.d.mts.map +1 -0
  301. package/dist/components/defaults/catalog/card-derived.mjs +172 -0
  302. package/dist/components/defaults/catalog/card-derived.mjs.map +1 -0
  303. package/dist/components/defaults/catalog/card-primitives.d.mts +81 -0
  304. package/dist/components/defaults/catalog/card-primitives.d.mts.map +1 -0
  305. package/dist/components/defaults/catalog/card-primitives.mjs +108 -0
  306. package/dist/components/defaults/catalog/card-primitives.mjs.map +1 -0
  307. package/dist/components/defaults/catalog/category-filter.d.mts +13 -0
  308. package/dist/components/defaults/catalog/category-filter.d.mts.map +1 -0
  309. package/dist/components/defaults/catalog/category-filter.mjs +28 -0
  310. package/dist/components/defaults/catalog/category-filter.mjs.map +1 -0
  311. package/dist/components/defaults/catalog/category-section.d.mts +39 -0
  312. package/dist/components/defaults/catalog/category-section.d.mts.map +1 -0
  313. package/dist/components/defaults/catalog/category-section.mjs +59 -0
  314. package/dist/components/defaults/catalog/category-section.mjs.map +1 -0
  315. package/dist/components/defaults/catalog/empty-state.mjs +20 -0
  316. package/dist/components/defaults/catalog/empty-state.mjs.map +1 -0
  317. package/dist/components/defaults/catalog/filter-select.d.mts +13 -0
  318. package/dist/components/defaults/catalog/filter-select.d.mts.map +1 -0
  319. package/dist/components/defaults/catalog/filter-select.mjs +45 -0
  320. package/dist/components/defaults/catalog/filter-select.mjs.map +1 -0
  321. package/dist/components/defaults/catalog/layout.mjs +53 -0
  322. package/dist/components/defaults/catalog/layout.mjs.map +1 -0
  323. package/dist/components/defaults/catalog/provider-avatars.d.mts +37 -0
  324. package/dist/components/defaults/catalog/provider-avatars.d.mts.map +1 -0
  325. package/dist/components/defaults/catalog/provider-avatars.mjs +98 -0
  326. package/dist/components/defaults/catalog/provider-avatars.mjs.map +1 -0
  327. package/dist/components/defaults/field-section-enumeration.mjs +32 -0
  328. package/dist/components/defaults/field-section-enumeration.mjs.map +1 -0
  329. package/dist/components/defaults/layout/field-wrapper.d.mts +13 -0
  330. package/dist/components/defaults/layout/field-wrapper.d.mts.map +1 -0
  331. package/dist/components/defaults/layout/field-wrapper.mjs +67 -0
  332. package/dist/components/defaults/layout/field-wrapper.mjs.map +1 -0
  333. package/dist/components/defaults/layout/form.mjs +21 -0
  334. package/dist/components/defaults/layout/form.mjs.map +1 -0
  335. package/dist/components/defaults/layout/group.d.mts +16 -0
  336. package/dist/components/defaults/layout/group.d.mts.map +1 -0
  337. package/dist/components/defaults/layout/group.mjs +87 -0
  338. package/dist/components/defaults/layout/group.mjs.map +1 -0
  339. package/dist/components/defaults/layout/section.d.mts +14 -0
  340. package/dist/components/defaults/layout/section.d.mts.map +1 -0
  341. package/dist/components/defaults/layout/section.mjs +39 -0
  342. package/dist/components/defaults/layout/section.mjs.map +1 -0
  343. package/dist/components/defaults/layout/submit-button.d.mts +9 -0
  344. package/dist/components/defaults/layout/submit-button.d.mts.map +1 -0
  345. package/dist/components/defaults/layout/submit-button.mjs +23 -0
  346. package/dist/components/defaults/layout/submit-button.mjs.map +1 -0
  347. package/dist/components/defaults/toggle-advanced-button.mjs +29 -0
  348. package/dist/components/defaults/toggle-advanced-button.mjs.map +1 -0
  349. package/dist/components/field-renderer.d.mts +14 -0
  350. package/dist/components/field-renderer.d.mts.map +1 -0
  351. package/dist/components/field-renderer.mjs +21 -0
  352. package/dist/components/field-renderer.mjs.map +1 -0
  353. package/dist/components/hover-info.mjs +30 -0
  354. package/dist/components/hover-info.mjs.map +1 -0
  355. package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs +319 -0
  356. package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs.map +1 -0
  357. package/dist/components/internal/LiquidEditor/LiquidEditor.mjs +208 -0
  358. package/dist/components/internal/LiquidEditor/LiquidEditor.mjs.map +1 -0
  359. package/dist/components/internal/LiquidEditor/UnifiedReferencePicker.mjs +240 -0
  360. package/dist/components/internal/LiquidEditor/UnifiedReferencePicker.mjs.map +1 -0
  361. package/dist/components/internal/combobox/include-exclude-combobox.mjs +368 -0
  362. package/dist/components/internal/combobox/include-exclude-combobox.mjs.map +1 -0
  363. package/dist/components/internal/combobox/suggest-combobox.mjs +294 -0
  364. package/dist/components/internal/combobox/suggest-combobox.mjs.map +1 -0
  365. package/dist/components/internal/field-legend.mjs +37 -0
  366. package/dist/components/internal/field-legend.mjs.map +1 -0
  367. package/dist/components/internal/form-level-errors.mjs +71 -0
  368. package/dist/components/internal/form-level-errors.mjs.map +1 -0
  369. package/dist/components/internal/icons.mjs +131 -0
  370. package/dist/components/internal/icons.mjs.map +1 -0
  371. package/dist/components/internal/multi-select-popover-trigger.mjs +26 -0
  372. package/dist/components/internal/multi-select-popover-trigger.mjs.map +1 -0
  373. package/dist/components/internal/schema-editor/SchemaEditor.mjs +468 -0
  374. package/dist/components/internal/schema-editor/SchemaEditor.mjs.map +1 -0
  375. package/dist/components/internal/schema-editor/generate-schema-rows.mjs +374 -0
  376. package/dist/components/internal/schema-editor/generate-schema-rows.mjs.map +1 -0
  377. package/dist/components/internal/schema-editor/schema-editor-context.mjs +32 -0
  378. package/dist/components/internal/schema-editor/schema-editor-context.mjs.map +1 -0
  379. package/dist/components/internal/schema-editor/schema-utils.mjs +249 -0
  380. package/dist/components/internal/schema-editor/schema-utils.mjs.map +1 -0
  381. package/dist/components/internal/suggestion-menu/suggestion-menu-utils.mjs +12 -0
  382. package/dist/components/internal/suggestion-menu/suggestion-menu-utils.mjs.map +1 -0
  383. package/dist/components/internal/suggestion-menu/suggestion-menu.mjs +151 -0
  384. package/dist/components/internal/suggestion-menu/suggestion-menu.mjs.map +1 -0
  385. package/dist/components/internal/tag-chip-decoration.mjs +180 -0
  386. package/dist/components/internal/tag-chip-decoration.mjs.map +1 -0
  387. package/dist/components/rich-text.mjs +42 -0
  388. package/dist/components/rich-text.mjs.map +1 -0
  389. package/dist/components/ui/badge.mjs +32 -0
  390. package/dist/components/ui/badge.mjs.map +1 -0
  391. package/dist/components/ui/button.d.mts +19 -0
  392. package/dist/components/ui/button.d.mts.map +1 -0
  393. package/dist/components/ui/button.mjs +47 -0
  394. package/dist/components/ui/button.mjs.map +1 -0
  395. package/dist/components/ui/combobox.mjs +103 -0
  396. package/dist/components/ui/combobox.mjs.map +1 -0
  397. package/dist/components/ui/input-group.mjs +30 -0
  398. package/dist/components/ui/input-group.mjs.map +1 -0
  399. package/dist/components/ui/input.mjs +17 -0
  400. package/dist/components/ui/input.mjs.map +1 -0
  401. package/dist/components/ui/label.mjs +17 -0
  402. package/dist/components/ui/label.mjs.map +1 -0
  403. package/dist/components/ui/popover.mjs +40 -0
  404. package/dist/components/ui/popover.mjs.map +1 -0
  405. package/dist/components/ui/select.mjs +92 -0
  406. package/dist/components/ui/select.mjs.map +1 -0
  407. package/dist/components/ui/switch.mjs +21 -0
  408. package/dist/components/ui/switch.mjs.map +1 -0
  409. package/dist/components/ui/table.mjs +56 -0
  410. package/dist/components/ui/table.mjs.map +1 -0
  411. package/dist/components/ui/textarea.mjs +15 -0
  412. package/dist/components/ui/textarea.mjs.map +1 -0
  413. package/dist/components/ui/tooltip.mjs +48 -0
  414. package/dist/components/ui/tooltip.mjs.map +1 -0
  415. package/dist/context/catalog-card-context.mjs +31 -0
  416. package/dist/context/catalog-card-context.mjs.map +1 -0
  417. package/dist/context/catalog-config-context.d.mts +43 -0
  418. package/dist/context/catalog-config-context.d.mts.map +1 -0
  419. package/dist/context/catalog-config-context.mjs +48 -0
  420. package/dist/context/catalog-config-context.mjs.map +1 -0
  421. package/dist/context/form-context.mjs +11 -0
  422. package/dist/context/form-context.mjs.map +1 -0
  423. package/dist/context/form-customization-context.d.mts +71 -0
  424. package/dist/context/form-customization-context.d.mts.map +1 -0
  425. package/dist/context/form-customization-context.mjs +114 -0
  426. package/dist/context/form-customization-context.mjs.map +1 -0
  427. package/dist/context/form-provider.d.mts +41 -0
  428. package/dist/context/form-provider.d.mts.map +1 -0
  429. package/dist/context/form-provider.mjs +53 -0
  430. package/dist/context/form-provider.mjs.map +1 -0
  431. package/dist/context/pipe-catalog-card-context.d.mts +17 -0
  432. package/dist/context/pipe-catalog-card-context.d.mts.map +1 -0
  433. package/dist/context/pipe-catalog-card-context.mjs +13 -0
  434. package/dist/context/pipe-catalog-card-context.mjs.map +1 -0
  435. package/dist/context/pipe-catalog-context.d.mts +26 -0
  436. package/dist/context/pipe-catalog-context.d.mts.map +1 -0
  437. package/dist/context/pipe-catalog-context.mjs +13 -0
  438. package/dist/context/pipe-catalog-context.mjs.map +1 -0
  439. package/dist/context/pipe-form-context.d.mts +25 -0
  440. package/dist/context/pipe-form-context.d.mts.map +1 -0
  441. package/dist/context/pipe-form-context.mjs +13 -0
  442. package/dist/context/pipe-form-context.mjs.map +1 -0
  443. package/dist/context/portal-container-context.d.mts +5 -0
  444. package/dist/context/portal-container-context.d.mts.map +1 -0
  445. package/dist/context/portal-container-context.mjs +15 -0
  446. package/dist/context/portal-container-context.mjs.map +1 -0
  447. package/dist/context/search-catalog-card-context.d.mts +16 -0
  448. package/dist/context/search-catalog-card-context.d.mts.map +1 -0
  449. package/dist/context/search-catalog-card-context.mjs +13 -0
  450. package/dist/context/search-catalog-card-context.mjs.map +1 -0
  451. package/dist/context/search-catalog-context.d.mts +20 -0
  452. package/dist/context/search-catalog-context.d.mts.map +1 -0
  453. package/dist/context/search-catalog-context.mjs +13 -0
  454. package/dist/context/search-catalog-context.mjs.map +1 -0
  455. package/dist/context/search-form-context.d.mts +25 -0
  456. package/dist/context/search-form-context.d.mts.map +1 -0
  457. package/dist/context/search-form-context.mjs +13 -0
  458. package/dist/context/search-form-context.mjs.map +1 -0
  459. package/dist/context/searches-catalog-card-context.d.mts +16 -0
  460. package/dist/context/searches-catalog-card-context.d.mts.map +1 -0
  461. package/dist/context/searches-catalog-card-context.mjs +13 -0
  462. package/dist/context/searches-catalog-card-context.mjs.map +1 -0
  463. package/dist/context/searches-catalog-context.d.mts +20 -0
  464. package/dist/context/searches-catalog-context.d.mts.map +1 -0
  465. package/dist/context/searches-catalog-context.mjs +13 -0
  466. package/dist/context/searches-catalog-context.mjs.map +1 -0
  467. package/dist/hooks/use-debounce.mjs +28 -0
  468. package/dist/hooks/use-debounce.mjs.map +1 -0
  469. package/dist/hooks/use-debounced-fn.mjs +47 -0
  470. package/dist/hooks/use-debounced-fn.mjs.map +1 -0
  471. package/dist/hooks/use-disclosure.mjs +35 -0
  472. package/dist/hooks/use-disclosure.mjs.map +1 -0
  473. package/dist/hooks/use-field-error.d.mts +11 -0
  474. package/dist/hooks/use-field-error.d.mts.map +1 -0
  475. package/dist/hooks/use-field-error.mjs +23 -0
  476. package/dist/hooks/use-field-error.mjs.map +1 -0
  477. package/dist/hooks/use-floating-element.mjs +45 -0
  478. package/dist/hooks/use-floating-element.mjs.map +1 -0
  479. package/dist/hooks/use-form-core.d.mts +16 -0
  480. package/dist/hooks/use-form-core.d.mts.map +1 -0
  481. package/dist/hooks/use-form-core.mjs +241 -0
  482. package/dist/hooks/use-form-core.mjs.map +1 -0
  483. package/dist/hooks/use-jsonata-preview.mjs +38 -0
  484. package/dist/hooks/use-jsonata-preview.mjs.map +1 -0
  485. package/dist/hooks/use-menu-navigation.mjs +86 -0
  486. package/dist/hooks/use-menu-navigation.mjs.map +1 -0
  487. package/dist/hooks/use-pipe-catalog-table.d.mts +47 -0
  488. package/dist/hooks/use-pipe-catalog-table.d.mts.map +1 -0
  489. package/dist/hooks/use-pipe-catalog-table.mjs +170 -0
  490. package/dist/hooks/use-pipe-catalog-table.mjs.map +1 -0
  491. package/dist/hooks/use-pipe-form.d.mts +31 -0
  492. package/dist/hooks/use-pipe-form.d.mts.map +1 -0
  493. package/dist/hooks/use-pipe-form.mjs +65 -0
  494. package/dist/hooks/use-pipe-form.mjs.map +1 -0
  495. package/dist/hooks/use-search-catalog-table.d.mts +40 -0
  496. package/dist/hooks/use-search-catalog-table.d.mts.map +1 -0
  497. package/dist/hooks/use-search-catalog-table.mjs +161 -0
  498. package/dist/hooks/use-search-catalog-table.mjs.map +1 -0
  499. package/dist/hooks/use-search-form.d.mts +17 -0
  500. package/dist/hooks/use-search-form.d.mts.map +1 -0
  501. package/dist/hooks/use-search-form.mjs +58 -0
  502. package/dist/hooks/use-search-form.mjs.map +1 -0
  503. package/dist/hooks/use-searches-catalog-table.d.mts +40 -0
  504. package/dist/hooks/use-searches-catalog-table.d.mts.map +1 -0
  505. package/dist/hooks/use-searches-catalog-table.mjs +161 -0
  506. package/dist/hooks/use-searches-catalog-table.mjs.map +1 -0
  507. package/dist/index.d.mts +96 -0
  508. package/dist/index.mjs +98 -0
  509. package/dist/lib/utils.mjs +11 -0
  510. package/dist/lib/utils.mjs.map +1 -0
  511. package/dist/styles/pipe0-form.css +3785 -0
  512. package/dist/types/adapters.d.mts +107 -0
  513. package/dist/types/adapters.d.mts.map +1 -0
  514. package/dist/types/catalog-adapters.d.mts +122 -0
  515. package/dist/types/catalog-adapters.d.mts.map +1 -0
  516. package/dist/types/field-handle.d.mts +3 -0
  517. package/dist/types/field-props.d.mts +285 -0
  518. package/dist/types/field-props.d.mts.map +1 -0
  519. package/dist/types/form-customization.d.mts +25 -0
  520. package/dist/types/form-customization.d.mts.map +1 -0
  521. package/dist/types/form-handle.d.mts +23 -0
  522. package/dist/types/form-handle.d.mts.map +1 -0
  523. package/dist/utils/build-section-handlers.mjs +419 -0
  524. package/dist/utils/build-section-handlers.mjs.map +1 -0
  525. package/dist/utils/catalog-helpers.d.mts +12 -0
  526. package/dist/utils/catalog-helpers.d.mts.map +1 -0
  527. package/dist/utils/catalog-helpers.mjs +35 -0
  528. package/dist/utils/catalog-helpers.mjs.map +1 -0
  529. package/dist/utils/generate-random-string.mjs +11 -0
  530. package/dist/utils/generate-random-string.mjs.map +1 -0
  531. package/dist/utils/merge-form-stores.mjs +14 -0
  532. package/dist/utils/merge-form-stores.mjs.map +1 -0
  533. package/dist/utils/object-path.mjs +72 -0
  534. package/dist/utils/object-path.mjs.map +1 -0
  535. package/dist/utils/render-slot.d.mts +44 -0
  536. package/dist/utils/render-slot.d.mts.map +1 -0
  537. package/dist/utils/render-slot.mjs +30 -0
  538. package/dist/utils/render-slot.mjs.map +1 -0
  539. package/dist/widgets/avatar-group.d.mts +36 -0
  540. package/dist/widgets/avatar-group.d.mts.map +1 -0
  541. package/dist/widgets/avatar-group.mjs +114 -0
  542. package/dist/widgets/avatar-group.mjs.map +1 -0
  543. package/dist/widgets/emoji-glyph.d.mts +11 -0
  544. package/dist/widgets/emoji-glyph.d.mts.map +1 -0
  545. package/dist/widgets/emoji-glyph.mjs +13 -0
  546. package/dist/widgets/emoji-glyph.mjs.map +1 -0
  547. package/dist/widgets/field-type-badge.d.mts +13 -0
  548. package/dist/widgets/field-type-badge.d.mts.map +1 -0
  549. package/dist/widgets/field-type-badge.mjs +30 -0
  550. package/dist/widgets/field-type-badge.mjs.map +1 -0
  551. package/dist/widgets/icon-glyph.d.mts +16 -0
  552. package/dist/widgets/icon-glyph.d.mts.map +1 -0
  553. package/dist/widgets/icon-glyph.mjs +59 -0
  554. package/dist/widgets/icon-glyph.mjs.map +1 -0
  555. package/dist/widgets/index.d.mts +9 -0
  556. package/dist/widgets/index.mjs +11 -0
  557. package/dist/widgets/logo-url.d.mts +17 -0
  558. package/dist/widgets/logo-url.d.mts.map +1 -0
  559. package/dist/widgets/logo-url.mjs +17 -0
  560. package/dist/widgets/logo-url.mjs.map +1 -0
  561. package/dist/widgets/pricing-badge.d.mts +11 -0
  562. package/dist/widgets/pricing-badge.d.mts.map +1 -0
  563. package/dist/widgets/pricing-badge.mjs +13 -0
  564. package/dist/widgets/pricing-badge.mjs.map +1 -0
  565. package/dist/widgets/provider-logo.d.mts +16 -0
  566. package/dist/widgets/provider-logo.d.mts.map +1 -0
  567. package/dist/widgets/provider-logo.mjs +20 -0
  568. package/dist/widgets/provider-logo.mjs.map +1 -0
  569. package/dist/widgets/widget-strip.d.mts +16 -0
  570. package/dist/widgets/widget-strip.d.mts.map +1 -0
  571. package/dist/widgets/widget-strip.mjs +42 -0
  572. package/dist/widgets/widget-strip.mjs.map +1 -0
  573. package/dist/widgets/widget-view.d.mts +14 -0
  574. package/dist/widgets/widget-view.d.mts.map +1 -0
  575. package/dist/widgets/widget-view.mjs +36 -0
  576. package/dist/widgets/widget-view.mjs.map +1 -0
  577. package/package.json +82 -0
@@ -0,0 +1,249 @@
1
+ import { getByPath, setByPath, setWithObjects, unsetByPath } from "../../../utils/object-path.mjs";
2
+
3
+ //#region src/components/internal/schema-editor/schema-utils.ts
4
+ const schemaInputRegex = {
5
+ parameterName: {
6
+ expression: /^[a-zA-Z0-9_\-$()]+$/,
7
+ message: "Parameter names cannot contain special characters or spaces"
8
+ },
9
+ propertyName: {
10
+ expression: /^[a-zA-Z0-9_-]+$/,
11
+ message: "Property names cannot contain special characters or spaces"
12
+ },
13
+ genericUrl: {
14
+ expression: /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/,
15
+ message: "Enter a valid url like: https://api.example.com/v1."
16
+ },
17
+ urlPath: {
18
+ expression: /^(?=.+)(\/([a-z0-9_.-]+|(\{[a-zA-Z0-9_.-]+\})))*\/?$/,
19
+ message: "Invalid url path. Example: /{variable}/foo. Special characters are not allowed. URL path must be lower case."
20
+ },
21
+ modelName: {
22
+ expression: /^[a-zA-Z0-9]+$/,
23
+ message: "Schema names cannot contain spaces or special characters."
24
+ }
25
+ };
26
+ const EDITOR_PLACEHOLDER_TOKEN = "%%%";
27
+ function generatePlaceholderId() {
28
+ return `${"%%%"}${crypto.randomUUID().substring(0, 4)}`;
29
+ }
30
+ function typedIncludes(coll, el) {
31
+ return coll.includes(el);
32
+ }
33
+ function findComposedKey(schema) {
34
+ if (schema.oneOf) return "oneOf";
35
+ if (schema.anyOf) return "anyOf";
36
+ return "allOf";
37
+ }
38
+ function isArraySchema(schema) {
39
+ return schema.type === "array";
40
+ }
41
+ function isSimpleSchema(schema) {
42
+ return typedIncludes(simplePropertyTypes, schema.type);
43
+ }
44
+ function isObjectSchema(schema) {
45
+ if (Array.isArray(schema.type)) return false;
46
+ if (schema.type && schema.type === "object") return true;
47
+ return !!schema.properties;
48
+ }
49
+ function isComposedSchema(schema) {
50
+ return Boolean(schema.allOf || schema.oneOf || schema.anyOf);
51
+ }
52
+ const simplePropertyTypes = [
53
+ "integer",
54
+ "number",
55
+ "string",
56
+ "boolean",
57
+ "null"
58
+ ];
59
+ const propertyTypes = [
60
+ ...simplePropertyTypes,
61
+ "array",
62
+ "object"
63
+ ];
64
+ const composedPropertyTypes = [
65
+ "allOf",
66
+ "anyOf",
67
+ "oneOf"
68
+ ];
69
+ const allPropertyTypes = [...propertyTypes, ...composedPropertyTypes];
70
+ function moveUpLevel(path) {
71
+ const match = path.match(/^(.*)(\.[\w\d_%&-]+|\[\d+\])$/);
72
+ return match ? match[1] : "";
73
+ }
74
+ function removePathFromSchema(schema, path) {
75
+ const cp = structuredClone(schema);
76
+ const parentPath = moveUpLevel(path);
77
+ const parentProperty = getByPath(cp, parentPath);
78
+ if (Array.isArray(parentProperty)) {
79
+ const match = path.match(/.*\[(\d+)\]$/);
80
+ if (match == null || !match[1]) throw new Error("Could not find index to splice");
81
+ parentProperty.splice(Number(match[1]), 1);
82
+ setByPath(cp, parentPath, parentProperty);
83
+ } else unsetByPath(cp, path);
84
+ return cp;
85
+ }
86
+ function getPathProperty(schema, path) {
87
+ if (path === "") return schema;
88
+ const currentProperty = getByPath(schema, path);
89
+ if (!currentProperty) throw new Error("No current property");
90
+ return currentProperty;
91
+ }
92
+ function getLastPathSegment(path) {
93
+ const split = path.split(".");
94
+ return split[split.length - 1] || "";
95
+ }
96
+ function findNearestObject(schema, path) {
97
+ let currentPath = path;
98
+ while (currentPath) {
99
+ currentPath = moveUpLevel(currentPath);
100
+ const currentProperty = getPathProperty(schema, currentPath);
101
+ if ("properties" in currentProperty && currentProperty.type === "object") return currentProperty;
102
+ }
103
+ }
104
+ function doesPathEndOnPropertyName(path) {
105
+ return /properties\.[^.]+$/.test(path);
106
+ }
107
+ function removeRequiredForProperty(schema, path) {
108
+ const cp = structuredClone(schema);
109
+ if (doesPathEndOnPropertyName(path) === false) return cp;
110
+ const nearestObject = findNearestObject(cp, path);
111
+ if (!nearestObject) return cp;
112
+ if (!Array.isArray(nearestObject.required)) return cp;
113
+ const propertyName = getLastPathSegment(path);
114
+ nearestObject.required = nearestObject.required.filter((e) => e !== propertyName);
115
+ return cp;
116
+ }
117
+ function addRequiredToProperty(rootSchema, path) {
118
+ const cp = structuredClone(rootSchema);
119
+ if (doesPathEndOnPropertyName(path) === false) throw new Error("Can only toggle required for object");
120
+ const nearestObject = findNearestObject(cp, path);
121
+ if (!nearestObject) throw new Error("Unable to find wrapping object");
122
+ const requiredArr = nearestObject.required || [];
123
+ const propertyName = getLastPathSegment(path);
124
+ if (propertyName) {
125
+ if (requiredArr.some((e) => e === propertyName)) throw new Error("Property is already required");
126
+ else requiredArr.push(propertyName);
127
+ nearestObject.required = requiredArr;
128
+ }
129
+ return cp;
130
+ }
131
+ function insertAtPath(schema, path, newSchema) {
132
+ if (path === "") return structuredClone(newSchema);
133
+ const cp = structuredClone(schema);
134
+ setByPath(cp, path, newSchema);
135
+ return cp;
136
+ }
137
+ function getPristineType(type) {
138
+ switch (type) {
139
+ case "boolean":
140
+ case "integer":
141
+ case "number":
142
+ case "string": return { type };
143
+ case "array": return {
144
+ type: "array",
145
+ items: { type: "string" }
146
+ };
147
+ case "object": return { type: "object" };
148
+ case "null": return { type: "null" };
149
+ case "oneOf": return { oneOf: [{
150
+ type: "object",
151
+ properties: {}
152
+ }] };
153
+ case "anyOf": return { anyOf: [{
154
+ type: "object",
155
+ properties: {}
156
+ }] };
157
+ case "allOf": return { allOf: [{
158
+ type: "object",
159
+ properties: {}
160
+ }] };
161
+ default: throw new Error("Trying to change to unknown type");
162
+ }
163
+ }
164
+ function changeType(schema, path, newType) {
165
+ const placeholderSchema = getPristineType(newType) || getPristineType("object");
166
+ if (path === "") return placeholderSchema;
167
+ return insertAtPath(schema, path, placeholderSchema);
168
+ }
169
+ function isDirectAncestorOfComposedProperty(rootSchema, path) {
170
+ const parentProperty = getByPath(rootSchema, moveUpLevel(path));
171
+ return Array.isArray(parentProperty);
172
+ }
173
+ /**
174
+ * Rules for available types.
175
+ *
176
+ * TOP LEVEL REFERENCES
177
+ * dtos + schemas: Schemas and DTOs cannot have top-level references
178
+ *
179
+ * DIRECT ANCESTOR OF COMPOSED TYPE
180
+ * schemaTypes: cannot be composes types as well: allof.allof is forbidden
181
+ */
182
+ function getTypeOptions({ schema, rootSchema, path }) {
183
+ let propertyTypes = [...allPropertyTypes];
184
+ const isComposed = isDirectAncestorOfComposedProperty(rootSchema, path);
185
+ const isArraySchema = schema.type === "array";
186
+ if (isComposed) propertyTypes = [...propertyTypes];
187
+ const innerArrayTypeOptions = isArraySchema ? { propertyTypes: [...allPropertyTypes] } : void 0;
188
+ return {
189
+ propertyTypes,
190
+ innerArrayTypeOptions
191
+ };
192
+ }
193
+ function isNonArraySchemaObject(schema) {
194
+ if (schema.type === "array" || Array.isArray(schema.type)) return false;
195
+ return true;
196
+ }
197
+ function addPlaceholderToPath(rootSchema, path) {
198
+ const property = getPathProperty(rootSchema, path);
199
+ const cp = structuredClone(property);
200
+ if (Array.isArray(cp)) throw new Error("Can't add placeholder to array");
201
+ if ("$ref" in cp) throw new Error("Can't add placeholder to ref schema");
202
+ if ((cp.oneOf || cp.allOf || cp.anyOf) && isNonArraySchemaObject(cp)) {
203
+ cp[findComposedKey(cp)]?.push({
204
+ type: "object",
205
+ properties: {}
206
+ });
207
+ return [insertAtPath(rootSchema, path, cp), void 0];
208
+ }
209
+ if ("type" in cp && cp.type === "object") {
210
+ const placeholderId = generatePlaceholderId();
211
+ if (!cp.properties) cp.properties = {};
212
+ return [insertAtPath(rootSchema, `${path}${path === "" ? "properties" : ".properties"}`, {
213
+ ...cp.properties,
214
+ [placeholderId]: { type: "string" }
215
+ }), placeholderId];
216
+ }
217
+ throw new Error("Can't add placeholder to invalid type");
218
+ }
219
+ function changePropertyName(schema, path, newPropertyName) {
220
+ if (doesPathEndOnPropertyName(path) === false) throw new Error("Path must end on property name");
221
+ let cp = structuredClone(schema);
222
+ const oldPropertyName = getLastPathSegment(path);
223
+ const parentPath = moveUpLevel(path);
224
+ const nearestObject = findNearestObject(cp, path);
225
+ const newPath = `${parentPath}.${newPropertyName}`;
226
+ const property = getPathProperty(cp, path);
227
+ const isRequired = (nearestObject?.required || []).some((e) => e === oldPropertyName);
228
+ if (isRequired) cp = removeRequiredForProperty(cp, path);
229
+ unsetByPath(cp, path);
230
+ setWithObjects(cp, newPath, property);
231
+ if (isRequired) cp = addRequiredToProperty(cp, newPath);
232
+ return cp;
233
+ }
234
+ const addPlaceholderToSchema = ({ schema, path }) => {
235
+ let newSchema = structuredClone(schema);
236
+ const property = getPathProperty(schema, path);
237
+ if (!isNonArraySchemaObject(property)) throw new Error("Schema is not of type NonArray");
238
+ if (Object.keys(property.properties || {}).some((k) => k.startsWith("%%%"))) throw new Error("There is an existing placeholder");
239
+ const placeholderValues = addPlaceholderToPath(newSchema, path);
240
+ newSchema = placeholderValues[0];
241
+ return {
242
+ schema: newSchema,
243
+ placeholderId: placeholderValues[1]
244
+ };
245
+ };
246
+
247
+ //#endregion
248
+ export { addPlaceholderToPath, addPlaceholderToSchema, addRequiredToProperty, changePropertyName, changeType, findComposedKey, getPathProperty, getTypeOptions, isArraySchema, isComposedSchema, isNonArraySchemaObject, isObjectSchema, isSimpleSchema, moveUpLevel, removePathFromSchema, removeRequiredForProperty, schemaInputRegex, simplePropertyTypes };
249
+ //# sourceMappingURL=schema-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-utils.mjs","names":[],"sources":["../../../../src/components/internal/schema-editor/schema-utils.ts"],"sourcesContent":["import type { JSONSchema } from \"zod/v4/core\";\nimport { getByPath, setByPath, setWithObjects, unsetByPath } from \"../../../utils/object-path.js\";\n\nexport const schemaInputRegex = {\n parameterName: {\n expression: /^[a-zA-Z0-9_\\-$()]+$/,\n message: \"Parameter names cannot contain special characters or spaces\",\n },\n propertyName: {\n expression: /^[a-zA-Z0-9_-]+$/,\n message: \"Property names cannot contain special characters or spaces\",\n },\n genericUrl: {\n expression:\n /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/,\n message: \"Enter a valid url like: https://api.example.com/v1.\",\n },\n urlPath: {\n expression: /^(?=.+)(\\/([a-z0-9_.-]+|(\\{[a-zA-Z0-9_.-]+\\})))*\\/?$/,\n message:\n \"Invalid url path. Example: /{variable}/foo. Special characters are not allowed. URL path must be lower case.\",\n },\n modelName: {\n expression: /^[a-zA-Z0-9]+$/,\n message: \"Schema names cannot contain spaces or special characters.\",\n },\n};\n\nexport const EDITOR_PLACEHOLDER_TOKEN = \"%%%\";\n\nfunction generatePlaceholderId() {\n return `${EDITOR_PLACEHOLDER_TOKEN}${crypto.randomUUID().substring(0, 4)}`;\n}\n\nexport type NonArraySchemaObject =\n | JSONSchema.BooleanSchema\n | JSONSchema.IntegerSchema\n | JSONSchema.NullSchema\n | JSONSchema.NumberSchema\n | JSONSchema.ObjectSchema\n | JSONSchema.StringSchema;\n\nfunction typedIncludes<T extends U, U>(coll: ReadonlyArray<T>, el: U): el is T {\n return coll.includes(el as T);\n}\n\nexport function findComposedKey(schema: NonArraySchemaObject) {\n if (schema.oneOf) return \"oneOf\";\n if (schema.anyOf) return \"anyOf\";\n return \"allOf\";\n}\n\nexport function isArraySchema(schema: JSONSchema.BaseSchema): schema is JSONSchema.ArraySchema {\n return schema.type === \"array\";\n}\n\nexport function isSimpleSchema(schema: JSONSchema.BaseSchema): schema is NonArraySchemaObject {\n return typedIncludes(simplePropertyTypes, schema.type);\n}\n\nexport function isObjectSchema(schema: JSONSchema.BaseSchema): schema is JSONSchema.ObjectSchema {\n if (Array.isArray(schema.type)) return false;\n if (schema.type && schema.type === \"object\") return true;\n return !!schema.properties;\n}\n\nexport function isComposedSchema(schema: JSONSchema.BaseSchema): schema is NonArraySchemaObject {\n return Boolean(schema.allOf || schema.oneOf || schema.anyOf);\n}\n\nexport const simplePropertyTypes = [\"integer\", \"number\", \"string\", \"boolean\", \"null\"] as const;\nexport type SimplePropertyTypes = (typeof simplePropertyTypes)[number];\n\nconst propertyTypes = [...simplePropertyTypes, \"array\", \"object\"] as const;\n\nconst composedPropertyTypes = [\"allOf\", \"anyOf\", \"oneOf\"] as const;\ntype ComposedPropertyTypes = (typeof composedPropertyTypes)[number];\n\nconst allPropertyTypes = [...propertyTypes, ...composedPropertyTypes] as const;\nexport type AllPropertyTypes = (typeof allPropertyTypes)[number];\n\nexport type ReadableTypeNames = AllPropertyTypes | \"mixed\" | \"not\" | \"any\";\n\nexport function moveUpLevel(path: string) {\n const match = path.match(/^(.*)(\\.[\\w\\d_%&-]+|\\[\\d+\\])$/);\n return match ? match[1] : \"\";\n}\n\nexport function splitObjectPath(path: string) {\n return path.split(/(\\.|)/);\n}\n\nexport function removePathFromSchema(schema: JSONSchema.BaseSchema, path: string) {\n const cp = structuredClone(schema);\n const parentPath = moveUpLevel(path);\n const parentProperty = getByPath(cp, parentPath) as JSONSchema.BaseSchema;\n if (Array.isArray(parentProperty)) {\n const match = path.match(/.*\\[(\\d+)\\]$/);\n if (match == null || !match[1]) throw new Error(\"Could not find index to splice\");\n parentProperty.splice(Number(match[1]), 1);\n setByPath(cp, parentPath, parentProperty);\n } else {\n unsetByPath(cp, path);\n }\n return cp;\n}\n\nexport function getPathProperty(\n schema: JSONSchema.BaseSchema,\n path: string,\n): JSONSchema.BaseSchema {\n if (path === \"\") return schema;\n const currentProperty = getByPath(schema, path) as JSONSchema.BaseSchema;\n if (!currentProperty) throw new Error(\"No current property\");\n return currentProperty;\n}\n\nfunction getLastPathSegment(path: string) {\n const split = path.split(\".\");\n return split[split.length - 1] || \"\";\n}\n\nexport function findNearestObject(\n schema: JSONSchema.BaseSchema,\n path: string,\n): NonArraySchemaObject | undefined {\n let currentPath = path;\n while (currentPath) {\n currentPath = moveUpLevel(currentPath);\n const currentProperty = getPathProperty(schema, currentPath);\n if (\"properties\" in currentProperty && currentProperty.type === \"object\") {\n return currentProperty as NonArraySchemaObject;\n }\n }\n}\n\nfunction doesPathEndOnPropertyName(path: string) {\n return /properties\\.[^.]+$/.test(path);\n}\n\nexport function removeRequiredForProperty(schema: JSONSchema.BaseSchema, path: string) {\n const cp = structuredClone(schema);\n if (doesPathEndOnPropertyName(path) === false) return cp;\n const nearestObject = findNearestObject(cp, path);\n if (!nearestObject) return cp;\n if (!Array.isArray(nearestObject.required)) return cp;\n const propertyName = getLastPathSegment(path);\n nearestObject.required = nearestObject.required.filter((e) => e !== propertyName);\n return cp;\n}\n\nexport function addRequiredToProperty(rootSchema: JSONSchema.BaseSchema, path: string) {\n const cp = structuredClone(rootSchema);\n if (doesPathEndOnPropertyName(path) === false)\n throw new Error(\"Can only toggle required for object\");\n const nearestObject = findNearestObject(cp, path);\n if (!nearestObject) throw new Error(\"Unable to find wrapping object\");\n const requiredArr = nearestObject.required || [];\n const propertyName = getLastPathSegment(path);\n if (propertyName) {\n if (requiredArr.some((e) => e === propertyName)) {\n throw new Error(\"Property is already required\");\n } else {\n requiredArr.push(propertyName);\n }\n nearestObject.required = requiredArr;\n }\n return cp;\n}\n\nexport function insertAtPath<T extends object = JSONSchema.BaseSchema>(\n schema: T,\n path: string,\n newSchema: JSONSchema.BaseSchema,\n): T {\n if (path === \"\") return structuredClone(newSchema) as T;\n const cp = structuredClone(schema);\n setByPath(cp, path, newSchema);\n return cp;\n}\n\nexport function changeStringPropertyMetaData({\n rootSchema,\n schema,\n path,\n propertyMetaData,\n}: {\n rootSchema: JSONSchema.BaseSchema;\n schema: JSONSchema.BaseSchema;\n path: string;\n propertyMetaData: {\n description: string | undefined;\n default: string | undefined;\n enum: string[] | undefined;\n examples: string[] | undefined;\n };\n}) {\n const cp = structuredClone(schema);\n cp.description = propertyMetaData.description;\n cp.examples = propertyMetaData.examples;\n cp.default = propertyMetaData.default;\n if (\n propertyMetaData.default != null &&\n !propertyMetaData.enum?.includes(propertyMetaData.default)\n ) {\n throw new Error(\"Default must be included in enum values\");\n }\n cp.enum = propertyMetaData.enum;\n return insertAtPath(rootSchema, path, JSON.parse(JSON.stringify(cp)));\n}\n\nexport function changeNumberPropertyMetaData({\n rootSchema,\n schema,\n path,\n propertyMetaData,\n}: {\n rootSchema: JSONSchema.BaseSchema;\n schema: JSONSchema.BaseSchema;\n path: string;\n propertyMetaData: {\n description: string | undefined;\n format: \"float\" | \"double\" | undefined;\n minimum: number | undefined;\n maximum: number | undefined;\n examples: number[] | undefined;\n };\n}) {\n const cp = structuredClone(schema);\n cp.description = propertyMetaData.description;\n cp.minimum = propertyMetaData.minimum;\n cp.maximum = propertyMetaData.maximum;\n cp.format = propertyMetaData.format;\n cp.examples = propertyMetaData.examples;\n return insertAtPath(rootSchema, path, JSON.parse(JSON.stringify(cp)));\n}\n\nexport function changeGenericMetaData({\n rootSchema,\n schema,\n path,\n propertyMetaData,\n}: {\n rootSchema: JSONSchema.BaseSchema;\n schema: JSONSchema.BaseSchema;\n path: string;\n propertyMetaData: { description: string | undefined };\n}) {\n if (isComposedSchema(schema)) throw new Error(\"Metadata cannot be changed on composed types\");\n const cp = structuredClone(schema);\n if (propertyMetaData.description !== undefined) {\n cp.description = propertyMetaData.description;\n }\n return insertAtPath(rootSchema, path, JSON.parse(JSON.stringify(cp)));\n}\n\nexport function changeBooleanMetaData({\n rootSchema,\n schema,\n path,\n propertyMetaData,\n}: {\n rootSchema: JSONSchema.BaseSchema;\n schema: JSONSchema.BaseSchema;\n path: string;\n propertyMetaData: {\n description: string | undefined;\n examples: boolean[] | undefined;\n };\n}) {\n if (isComposedSchema(schema)) throw new Error(\"Metadata cannot be changed on composed types\");\n const cp = structuredClone(schema);\n if (propertyMetaData.description !== undefined) {\n cp.description = propertyMetaData.description;\n cp.examples = propertyMetaData.examples;\n }\n return insertAtPath(rootSchema, path, JSON.parse(JSON.stringify(cp)));\n}\n\nexport function changeIntegerPropertyMetaData({\n rootSchema,\n schema,\n path,\n propertyMetaData,\n}: {\n rootSchema: JSONSchema.BaseSchema;\n schema: JSONSchema.BaseSchema;\n path: string;\n propertyMetaData: {\n description: string | undefined;\n format: \"int32\" | \"int64\" | undefined;\n minimum: number | undefined;\n maximum: number | undefined;\n examples: number[] | undefined;\n };\n}) {\n const cp = structuredClone(schema);\n cp.description = propertyMetaData.description;\n cp.minimum = propertyMetaData.minimum;\n cp.maximum = propertyMetaData.maximum;\n cp.format = propertyMetaData.format;\n cp.examples = propertyMetaData.examples;\n return insertAtPath(rootSchema, path, JSON.parse(JSON.stringify(cp)));\n}\n\nexport function getPristineType(\n type: JSONSchema.BaseSchema[\"type\"] | ComposedPropertyTypes,\n): JSONSchema.BaseSchema {\n switch (type) {\n case \"boolean\":\n case \"integer\":\n case \"number\":\n case \"string\":\n return { type };\n case \"array\":\n return { type: \"array\", items: { type: \"string\" } };\n case \"object\":\n return { type: \"object\" };\n case \"null\":\n return { type: \"null\" };\n case \"oneOf\":\n return { oneOf: [{ type: \"object\", properties: {} }] };\n case \"anyOf\":\n return { anyOf: [{ type: \"object\", properties: {} }] };\n case \"allOf\":\n return { allOf: [{ type: \"object\", properties: {} }] };\n default:\n throw new Error(\"Trying to change to unknown type\");\n }\n}\n\nexport function changeType(schema: JSONSchema.BaseSchema, path: string, newType: AllPropertyTypes) {\n const placeholderSchema = getPristineType(newType) || getPristineType(\"object\");\n if (path === \"\") return placeholderSchema;\n return insertAtPath(schema, path, placeholderSchema);\n}\n\nfunction isDirectAncestorOfComposedProperty(rootSchema: JSONSchema.BaseSchema, path: string) {\n const parentPath = moveUpLevel(path);\n const parentProperty = getByPath(rootSchema, parentPath) as JSONSchema.BaseSchema;\n return Array.isArray(parentProperty);\n}\n\ntype BaseTypeOptions = {\n propertyTypes: readonly AllPropertyTypes[];\n};\n\nexport type TypeOptions = ReturnType<typeof getTypeOptions>;\n/**\n * Rules for available types.\n *\n * TOP LEVEL REFERENCES\n * dtos + schemas: Schemas and DTOs cannot have top-level references\n *\n * DIRECT ANCESTOR OF COMPOSED TYPE\n * schemaTypes: cannot be composes types as well: allof.allof is forbidden\n */\nexport function getTypeOptions({\n schema,\n rootSchema,\n path,\n}: {\n rootSchema: JSONSchema.BaseSchema;\n schema: JSONSchema.BaseSchema;\n path: string;\n}): BaseTypeOptions & { innerArrayTypeOptions: BaseTypeOptions | undefined } {\n let propertyTypes: Array<AllPropertyTypes> = [...allPropertyTypes];\n\n // flags for modification\n const isComposed = isDirectAncestorOfComposedProperty(rootSchema, path);\n const isArraySchema = schema.type === \"array\";\n\n // filter\n if (isComposed) {\n propertyTypes = [...propertyTypes];\n }\n\n const innerArrayTypeOptions = isArraySchema\n ? {\n propertyTypes: [...allPropertyTypes],\n }\n : undefined;\n return {\n propertyTypes,\n innerArrayTypeOptions,\n };\n}\n\nexport function isNonArraySchemaObject(\n schema: JSONSchema.BaseSchema,\n): schema is NonArraySchemaObject {\n if (schema.type === \"array\" || Array.isArray(schema.type)) return false;\n return true;\n}\n\nexport function addPlaceholderToPath(\n rootSchema: JSONSchema.BaseSchema,\n path: string,\n): [schema: JSONSchema.BaseSchema, placeholderId: string | undefined] {\n const property = getPathProperty(rootSchema, path);\n const cp = structuredClone(property);\n\n if (Array.isArray(cp)) throw new Error(\"Can't add placeholder to array\");\n if (\"$ref\" in cp) throw new Error(\"Can't add placeholder to ref schema\");\n\n if ((cp.oneOf || cp.allOf || cp.anyOf) && isNonArraySchemaObject(cp)) {\n const composedKey = findComposedKey(cp);\n cp[composedKey]?.push({ type: \"object\", properties: {} });\n const newSchema = insertAtPath(rootSchema, path, cp);\n return [newSchema, undefined];\n }\n if (\"type\" in cp && cp.type === \"object\") {\n const placeholderId = generatePlaceholderId();\n if (!cp.properties) cp.properties = {};\n const newSchema = insertAtPath(\n rootSchema,\n `${path}${path === \"\" ? \"properties\" : \".properties\"}`,\n { ...cp.properties, [placeholderId]: { type: \"string\" } },\n );\n return [newSchema, placeholderId];\n }\n throw new Error(\"Can't add placeholder to invalid type\");\n}\n\nexport function changePropertyName(\n schema: JSONSchema.BaseSchema,\n path: string,\n newPropertyName: string,\n) {\n if (doesPathEndOnPropertyName(path) === false) throw new Error(\"Path must end on property name\");\n\n let cp = structuredClone(schema);\n const oldPropertyName = getLastPathSegment(path);\n const parentPath = moveUpLevel(path);\n const nearestObject = findNearestObject(cp, path);\n const newPath = `${parentPath}.${newPropertyName}`;\n const property = getPathProperty(cp, path);\n const isRequired = (nearestObject?.required || []).some((e) => e === oldPropertyName);\n\n if (isRequired) cp = removeRequiredForProperty(cp, path);\n unsetByPath(cp, path);\n setWithObjects(cp, newPath, property);\n if (isRequired) cp = addRequiredToProperty(cp, newPath);\n\n return cp;\n}\n\nexport function wrapSchemaInArray(schema: NonArraySchemaObject): JSONSchema.BaseSchema {\n return { type: \"array\", items: schema };\n}\n\nexport function unwrapSchemaFromArray(schema: JSONSchema.ArraySchema) {\n return schema.items;\n}\n\nexport function wrapPathSchemaInArray(schema: JSONSchema.BaseSchema, path: string) {\n const cp = structuredClone(schema);\n const property = getPathProperty(cp, path);\n if (isArraySchema(property)) {\n throw new Error(\"Unable to wrap schema in array\");\n }\n const newProperty = wrapSchemaInArray(property as NonArraySchemaObject);\n return insertAtPath(cp, path, newProperty);\n}\n\nexport function unwrapPathSchemaFromArray(schema: JSONSchema.BaseSchema, path: string) {\n const cp = structuredClone(schema);\n const property = getPathProperty(cp, path);\n if (!isArraySchema(property)) {\n throw new Error(\"Unable to unwrap schema. Schema is not of type array\");\n }\n const newProperty = unwrapSchemaFromArray(property);\n return insertAtPath(cp, path, newProperty as JSONSchema.BaseSchema);\n}\n\nexport const addPlaceholderToSchema = ({\n schema,\n path,\n}: {\n schema: JSONSchema.BaseSchema;\n path: string;\n}) => {\n let newSchema = structuredClone(schema);\n const property = getPathProperty(schema, path);\n if (!isNonArraySchemaObject(property)) throw new Error(\"Schema is not of type NonArray\");\n const existingKeys = Object.keys(property.properties || {});\n\n if (existingKeys.some((k) => k.startsWith(\"%%%\"))) {\n throw new Error(\"There is an existing placeholder\");\n }\n\n const placeholderValues = addPlaceholderToPath(newSchema, path);\n newSchema = placeholderValues[0];\n return { schema: newSchema, placeholderId: placeholderValues[1] };\n};\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ //#region src/components/internal/suggestion-menu/suggestion-menu-utils.ts
2
+ function calculateStartPosition(cursorPosition, previousNode, triggerChar) {
3
+ if (!previousNode?.text || !triggerChar) return cursorPosition;
4
+ const commandText = previousNode.text;
5
+ const triggerCharIndex = commandText.lastIndexOf(triggerChar);
6
+ if (triggerCharIndex === -1) return cursorPosition;
7
+ return cursorPosition - commandText.substring(triggerCharIndex).length;
8
+ }
9
+
10
+ //#endregion
11
+ export { calculateStartPosition };
12
+ //# sourceMappingURL=suggestion-menu-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestion-menu-utils.mjs","names":[],"sources":["../../../../src/components/internal/suggestion-menu/suggestion-menu-utils.ts"],"sourcesContent":["import type { Node } from \"@tiptap/pm/model\";\nimport type { SuggestionItem } from \"./suggestion-menu-types.js\";\n\nexport function calculateStartPosition(\n cursorPosition: number,\n previousNode: Node | null,\n triggerChar?: string,\n): number {\n if (!previousNode?.text || !triggerChar) {\n return cursorPosition;\n }\n\n const commandText = previousNode.text;\n const triggerCharIndex = commandText.lastIndexOf(triggerChar);\n\n if (triggerCharIndex === -1) {\n return cursorPosition;\n }\n\n const textLength = commandText.substring(triggerCharIndex).length;\n return cursorPosition - textLength;\n}\n\nexport function filterSuggestionItems(items: SuggestionItem[], query: string) {\n const normalizedQuery = query.trim().toLowerCase();\n\n if (!normalizedQuery) {\n return items;\n }\n\n return items\n .filter((item) => {\n if (item.title.toLowerCase().includes(normalizedQuery)) return true;\n if (item.subtext?.toLowerCase().includes(normalizedQuery)) return true;\n if (item.keywords?.some((kw) => kw.toLowerCase().includes(normalizedQuery))) return true;\n return false;\n })\n .sort((a, b) => {\n const aTitle = a.title.toLowerCase();\n const bTitle = b.title.toLowerCase();\n\n if (aTitle === normalizedQuery && bTitle !== normalizedQuery) return -1;\n if (bTitle === normalizedQuery && aTitle !== normalizedQuery) return 1;\n if (aTitle.startsWith(normalizedQuery) && !bTitle.startsWith(normalizedQuery)) return -1;\n if (bTitle.startsWith(normalizedQuery) && !aTitle.startsWith(normalizedQuery)) return 1;\n return 0;\n });\n}\n"],"mappings":";AAGA,SAAgB,uBACd,gBACA,cACA,aACQ;AACR,KAAI,CAAC,cAAc,QAAQ,CAAC,YAC1B,QAAO;CAGT,MAAM,cAAc,aAAa;CACjC,MAAM,mBAAmB,YAAY,YAAY,YAAY;AAE7D,KAAI,qBAAqB,GACvB,QAAO;AAIT,QAAO,iBADY,YAAY,UAAU,iBAAiB,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { useFloatingElement } from "../../../hooks/use-floating-element.mjs";
2
+ import { useMenuNavigation } from "../../../hooks/use-menu-navigation.mjs";
3
+ import { calculateStartPosition } from "./suggestion-menu-utils.mjs";
4
+ import { useCallback, useEffect, useRef, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { flip, offset, shift, size } from "@floating-ui/react";
7
+ import { PluginKey } from "@tiptap/pm/state";
8
+ import { Suggestion, SuggestionPluginKey } from "@tiptap/suggestion";
9
+
10
+ //#region src/components/internal/suggestion-menu/suggestion-menu.tsx
11
+ const SuggestionMenu = ({ editor: providedEditor, floatingOptions, selector = "tiptap-suggestion-menu", children, maxHeight = 384, pluginKey = SuggestionPluginKey, ...internalSuggestionProps }) => {
12
+ const editor = providedEditor ?? null;
13
+ const [show, setShow] = useState(false);
14
+ const [internalClientRect, setInternalClientRect] = useState(null);
15
+ const [internalCommand, setInternalCommand] = useState(null);
16
+ const [internalItems, setInternalItems] = useState([]);
17
+ const [internalQuery, setInternalQuery] = useState("");
18
+ const [, setInternalRange] = useState(null);
19
+ const { ref, style, getFloatingProps, isMounted } = useFloatingElement(show, internalClientRect, 1e3, {
20
+ placement: "bottom-start",
21
+ middleware: [
22
+ offset(10),
23
+ flip({
24
+ mainAxis: true,
25
+ crossAxis: false
26
+ }),
27
+ shift(),
28
+ size({ apply({ availableHeight, elements }) {
29
+ if (elements.floating) {
30
+ const maxHeightValue = maxHeight ? Math.min(maxHeight, availableHeight) : availableHeight;
31
+ elements.floating.style.setProperty("--suggestion-menu-max-height", `${maxHeightValue}px`);
32
+ }
33
+ } })
34
+ ],
35
+ onOpenChange(open) {
36
+ if (!open) setShow(false);
37
+ },
38
+ ...floatingOptions
39
+ });
40
+ const internalSuggestionPropsRef = useRef(internalSuggestionProps);
41
+ useEffect(() => {
42
+ internalSuggestionPropsRef.current = internalSuggestionProps;
43
+ }, [internalSuggestionProps]);
44
+ const closePopup = useCallback(() => {
45
+ setShow(false);
46
+ }, []);
47
+ useEffect(() => {
48
+ if (!editor || editor.isDestroyed) return;
49
+ if (editor.state.plugins.find((plugin) => plugin.spec.key === pluginKey)) editor.unregisterPlugin(pluginKey);
50
+ const suggestion = Suggestion({
51
+ pluginKey: pluginKey instanceof PluginKey ? pluginKey : new PluginKey(pluginKey),
52
+ editor,
53
+ command({ editor, range, props }) {
54
+ if (!range) return;
55
+ const { view, state } = editor;
56
+ const { selection } = state;
57
+ if (!editor.extensionManager.extensions.some((extension) => extension.name === "mention" && extension.options?.suggestion?.char === internalSuggestionPropsRef.current.char)) {
58
+ const cursorPosition = selection.$from.pos;
59
+ const previousNode = selection.$head?.nodeBefore;
60
+ const startPosition = previousNode ? calculateStartPosition(cursorPosition, previousNode, internalSuggestionPropsRef.current.char) : selection.$from.start();
61
+ const transaction = state.tr.deleteRange(startPosition, cursorPosition);
62
+ view.dispatch(transaction);
63
+ }
64
+ const overrideSpace = view.state.selection.$to.nodeAfter?.text?.startsWith(" ");
65
+ const rangeToUse = { ...range };
66
+ if (overrideSpace) rangeToUse.to += 1;
67
+ props.onSelect({
68
+ editor,
69
+ range: rangeToUse,
70
+ context: props.context
71
+ });
72
+ },
73
+ render: () => ({
74
+ onStart: (props) => {
75
+ setInternalCommand(() => props.command);
76
+ setInternalItems(props.items);
77
+ setInternalQuery(props.query);
78
+ setInternalRange(props.range);
79
+ setInternalClientRect(props.clientRect?.() ?? null);
80
+ setShow(true);
81
+ },
82
+ onUpdate: (props) => {
83
+ setInternalCommand(() => props.command);
84
+ setInternalItems(props.items);
85
+ setInternalQuery(props.query);
86
+ setInternalRange(props.range);
87
+ setInternalClientRect(props.clientRect?.() ?? null);
88
+ },
89
+ onKeyDown: (props) => {
90
+ if (props.event.key === "Escape") {
91
+ closePopup();
92
+ return true;
93
+ }
94
+ return false;
95
+ },
96
+ onExit: () => {
97
+ setInternalCommand(null);
98
+ setInternalItems([]);
99
+ setInternalQuery("");
100
+ setInternalRange(null);
101
+ setInternalClientRect(null);
102
+ setShow(false);
103
+ }
104
+ }),
105
+ ...internalSuggestionPropsRef.current,
106
+ items: ((args) => {
107
+ const fn = internalSuggestionPropsRef.current.items;
108
+ return fn ? fn(args) : [];
109
+ })
110
+ });
111
+ editor.registerPlugin(suggestion);
112
+ return () => {
113
+ if (!editor.isDestroyed) editor.unregisterPlugin(pluginKey);
114
+ };
115
+ }, [
116
+ editor,
117
+ pluginKey,
118
+ closePopup
119
+ ]);
120
+ const onSelect = useCallback((item) => {
121
+ closePopup();
122
+ if (internalCommand) internalCommand(item);
123
+ }, [closePopup, internalCommand]);
124
+ const { selectedIndex } = useMenuNavigation({
125
+ editor,
126
+ query: internalQuery,
127
+ items: internalItems,
128
+ onSelect
129
+ });
130
+ if (!isMounted || !show || !editor) return null;
131
+ return /* @__PURE__ */ jsx("div", {
132
+ ref,
133
+ style,
134
+ ...getFloatingProps(),
135
+ "data-selector": selector,
136
+ className: "pz:z-50 pz:overflow-hidden pz:rounded-md pz:border pz:border-input pz:bg-popover pz:text-popover-foreground pz:shadow-md",
137
+ role: "listbox",
138
+ "aria-label": "Suggestions",
139
+ onPointerDown: (e) => e.preventDefault(),
140
+ children: children({
141
+ items: internalItems,
142
+ selectedIndex,
143
+ onSelect,
144
+ query: internalQuery
145
+ })
146
+ });
147
+ };
148
+
149
+ //#endregion
150
+ export { SuggestionMenu };
151
+ //# sourceMappingURL=suggestion-menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestion-menu.mjs","names":[],"sources":["../../../../src/components/internal/suggestion-menu/suggestion-menu.tsx"],"sourcesContent":["import { flip, offset, shift, size } from \"@floating-ui/react\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport type { Range } from \"@tiptap/react\";\nimport {\n Suggestion,\n type SuggestionKeyDownProps,\n SuggestionPluginKey,\n type SuggestionProps,\n} from \"@tiptap/suggestion\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useFloatingElement } from \"../../../hooks/use-floating-element.js\";\nimport { useMenuNavigation } from \"../../../hooks/use-menu-navigation.js\";\nimport type { SuggestionItem, SuggestionMenuProps } from \"./suggestion-menu-types.js\";\nimport { calculateStartPosition } from \"./suggestion-menu-utils.js\";\n\nexport const SuggestionMenu = ({\n editor: providedEditor,\n floatingOptions,\n selector = \"tiptap-suggestion-menu\",\n children,\n maxHeight = 384,\n pluginKey = SuggestionPluginKey,\n ...internalSuggestionProps\n}: SuggestionMenuProps) => {\n const editor = providedEditor ?? null;\n\n const [show, setShow] = useState<boolean>(false);\n const [internalClientRect, setInternalClientRect] = useState<DOMRect | null>(null);\n const [internalCommand, setInternalCommand] = useState<((item: SuggestionItem) => void) | null>(\n null,\n );\n const [internalItems, setInternalItems] = useState<SuggestionItem[]>([]);\n const [internalQuery, setInternalQuery] = useState<string>(\"\");\n const [, setInternalRange] = useState<Range | null>(null);\n\n const { ref, style, getFloatingProps, isMounted } = useFloatingElement(\n show,\n internalClientRect,\n 1000,\n {\n placement: \"bottom-start\",\n middleware: [\n offset(10),\n flip({ mainAxis: true, crossAxis: false }),\n shift(),\n size({\n apply({ availableHeight, elements }) {\n if (elements.floating) {\n const maxHeightValue = maxHeight\n ? Math.min(maxHeight, availableHeight)\n : availableHeight;\n elements.floating.style.setProperty(\n \"--suggestion-menu-max-height\",\n `${maxHeightValue}px`,\n );\n }\n },\n }),\n ],\n onOpenChange(open) {\n if (!open) setShow(false);\n },\n ...floatingOptions,\n },\n );\n\n const internalSuggestionPropsRef = useRef(internalSuggestionProps);\n\n useEffect(() => {\n internalSuggestionPropsRef.current = internalSuggestionProps;\n }, [internalSuggestionProps]);\n\n const closePopup = useCallback(() => {\n setShow(false);\n }, []);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n\n const existingPlugin = editor.state.plugins.find((plugin) => plugin.spec.key === pluginKey);\n if (existingPlugin) {\n editor.unregisterPlugin(pluginKey);\n }\n\n type ItemsFn = NonNullable<typeof internalSuggestionPropsRef.current.items>;\n type ItemsArgs = Parameters<ItemsFn>[0];\n type ItemsReturn = ReturnType<ItemsFn>;\n\n const suggestion = Suggestion({\n pluginKey: pluginKey instanceof PluginKey ? pluginKey : new PluginKey(pluginKey),\n editor,\n\n command({ editor, range, props }) {\n if (!range) return;\n\n const { view, state } = editor;\n const { selection } = state;\n\n const isMention = editor.extensionManager.extensions.some(\n (extension) =>\n extension.name === \"mention\" &&\n extension.options?.suggestion?.char === internalSuggestionPropsRef.current.char,\n );\n\n if (!isMention) {\n const cursorPosition = selection.$from.pos;\n const previousNode = selection.$head?.nodeBefore;\n\n const startPosition = previousNode\n ? calculateStartPosition(\n cursorPosition,\n previousNode,\n internalSuggestionPropsRef.current.char,\n )\n : selection.$from.start();\n\n const transaction = state.tr.deleteRange(startPosition, cursorPosition);\n view.dispatch(transaction);\n }\n\n const nodeAfter = view.state.selection.$to.nodeAfter;\n const overrideSpace = nodeAfter?.text?.startsWith(\" \");\n const rangeToUse = { ...range };\n if (overrideSpace) rangeToUse.to += 1;\n\n props.onSelect({ editor, range: rangeToUse, context: props.context });\n },\n\n render: () => ({\n onStart: (props: SuggestionProps<SuggestionItem>) => {\n setInternalCommand(() => props.command);\n setInternalItems(props.items);\n setInternalQuery(props.query);\n setInternalRange(props.range);\n setInternalClientRect(props.clientRect?.() ?? null);\n setShow(true);\n },\n onUpdate: (props: SuggestionProps<SuggestionItem>) => {\n setInternalCommand(() => props.command);\n setInternalItems(props.items);\n setInternalQuery(props.query);\n setInternalRange(props.range);\n setInternalClientRect(props.clientRect?.() ?? null);\n },\n onKeyDown: (props: SuggestionKeyDownProps) => {\n if (props.event.key === \"Escape\") {\n closePopup();\n return true;\n }\n return false;\n },\n onExit: () => {\n setInternalCommand(null);\n setInternalItems([]);\n setInternalQuery(\"\");\n setInternalRange(null);\n setInternalClientRect(null);\n setShow(false);\n },\n }),\n ...internalSuggestionPropsRef.current,\n // Override `items` to always read from the live ref. The Suggestion\n // plugin captures its options once at registration, but parents update\n // `items` asynchronously (e.g. when `getSecrets` resolves). Without\n // this delegation, items computed after registration never reach the\n // menu and the user sees an empty list.\n items: ((args: ItemsArgs): ItemsReturn => {\n const fn = internalSuggestionPropsRef.current.items;\n return (fn ? fn(args) : ([] as unknown as ItemsReturn)) as ItemsReturn;\n }) as ItemsFn,\n });\n\n editor.registerPlugin(suggestion);\n\n return () => {\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(pluginKey);\n }\n };\n }, [editor, pluginKey, closePopup]);\n\n const onSelect = useCallback(\n (item: SuggestionItem) => {\n closePopup();\n if (internalCommand) internalCommand(item);\n },\n [closePopup, internalCommand],\n );\n\n const { selectedIndex } = useMenuNavigation({\n editor,\n query: internalQuery,\n items: internalItems,\n onSelect,\n });\n\n if (!isMounted || !show || !editor) return null;\n\n return (\n <div\n ref={ref}\n style={style}\n {...getFloatingProps()}\n data-selector={selector}\n className=\"pz:z-50 pz:overflow-hidden pz:rounded-md pz:border pz:border-input pz:bg-popover pz:text-popover-foreground pz:shadow-md\"\n role=\"listbox\"\n aria-label=\"Suggestions\"\n onPointerDown={(e) => e.preventDefault()}\n >\n {children({ items: internalItems, selectedIndex, onSelect, query: internalQuery })}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ import { Extension } from "@tiptap/react";
2
+ import { Plugin, PluginKey } from "@tiptap/pm/state";
3
+ import { Decoration, DecorationSet } from "@tiptap/pm/view";
4
+
5
+ //#region src/components/internal/tag-chip-decoration.ts
6
+ const SECRET_REGEX = /\{\{\s*SECRETS\.([A-Z][A-Z0-9_]*)\s*\}\}/g;
7
+ const FIELD_REGEX = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_.]*(?:\s*\|\s*[^}]+)?)\s*\}\}/g;
8
+ const BLOCK_REGEX = /\{%[\s\S]*?%\}/g;
9
+ const FIELD_CLASS = "pz-tag-chip-field pz:inline-flex pz:items-center pz:rounded-sm pz:bg-sky-100 pz:px-1 pz:text-sky-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
10
+ const SECRET_CLASS = "pz-tag-chip-secret pz:inline-flex pz:items-center pz:rounded-sm pz:bg-amber-100 pz:px-1 pz:text-amber-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
11
+ const BLOCK_CLASS = "pz-tag-chip-block pz:inline-flex pz:items-center pz:rounded-sm pz:bg-violet-100 pz:px-1 pz:text-violet-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
12
+ /**
13
+ * Builds the DecorationSet for a given ProseMirror document. Walks every
14
+ * text node, then in order:
15
+ * 1. `{% … %}` Liquid block tags (e.g. `{% output %}`, `{% if %}`).
16
+ * 2. `{{ SECRETS.<ID> }}` secret references.
17
+ * 3. `{{ … }}` Liquid Outputs (fields, with optional dotted access and
18
+ * filter chains) over positions not already claimed by a secret match.
19
+ * Each match becomes an inline Decoration that styles the substring as a
20
+ * chip without touching the underlying text — copy/paste, cursor
21
+ * navigation, and `editor.getText` keep their flat-text behavior.
22
+ */
23
+ function buildDecorations(doc) {
24
+ const decorations = [];
25
+ doc.descendants((node, pos) => {
26
+ if (!node.isText || node.text == null) return;
27
+ const text = node.text;
28
+ const claimed = [];
29
+ BLOCK_REGEX.lastIndex = 0;
30
+ for (const m of text.matchAll(BLOCK_REGEX)) {
31
+ const start = pos + (m.index ?? 0);
32
+ const end = start + m[0].length;
33
+ claimed.push([start, end]);
34
+ decorations.push(Decoration.inline(start, end, {
35
+ class: BLOCK_CLASS,
36
+ "data-tag-chip": "block",
37
+ "data-tag-chip-text": m[0],
38
+ role: "button",
39
+ tabindex: "0"
40
+ }));
41
+ }
42
+ SECRET_REGEX.lastIndex = 0;
43
+ for (const m of text.matchAll(SECRET_REGEX)) {
44
+ const start = pos + (m.index ?? 0);
45
+ const end = start + m[0].length;
46
+ claimed.push([start, end]);
47
+ decorations.push(Decoration.inline(start, end, {
48
+ class: SECRET_CLASS,
49
+ "data-tag-chip": "secret",
50
+ "data-tag-chip-text": m[0],
51
+ role: "button",
52
+ tabindex: "0"
53
+ }));
54
+ }
55
+ FIELD_REGEX.lastIndex = 0;
56
+ for (const m of text.matchAll(FIELD_REGEX)) {
57
+ const start = pos + (m.index ?? 0);
58
+ const end = start + m[0].length;
59
+ if (claimed.some(([s, e]) => start < e && end > s)) continue;
60
+ decorations.push(Decoration.inline(start, end, {
61
+ class: FIELD_CLASS,
62
+ "data-tag-chip": "field",
63
+ "data-tag-chip-text": m[0],
64
+ role: "button",
65
+ tabindex: "0"
66
+ }));
67
+ }
68
+ });
69
+ return DecorationSet.create(doc, decorations);
70
+ }
71
+ const tagChipPluginKey = new PluginKey("tagChipDecoration");
72
+ const tagChipInteractionKey = new PluginKey("tagChipInteraction");
73
+ function chipHitFromTarget(target) {
74
+ if (!(target instanceof Element)) return null;
75
+ const el = target.closest("[data-tag-chip]");
76
+ if (!el) return null;
77
+ const kind = el.getAttribute("data-tag-chip");
78
+ const raw = el.getAttribute("data-tag-chip-text");
79
+ if (!kind || raw == null) return null;
80
+ return {
81
+ el,
82
+ hit: {
83
+ kind,
84
+ raw,
85
+ from: -1,
86
+ to: -1
87
+ }
88
+ };
89
+ }
90
+ /**
91
+ * Tiptap extension that renders Liquid syntax as inline pills:
92
+ * `{{ <name> }}` (fields, with optional dotted access and filter chains),
93
+ * `{{ SECRETS.<ID> }}`, and `{% … %}` block tags (e.g. `{% output %}`).
94
+ * Purely visual — the underlying text is unchanged so the persisted value
95
+ * is identical to what the user typed.
96
+ *
97
+ * Configure with `onChipClick` / `onChipHover` to wire interactive
98
+ * popovers and tooltips in the host editor without converting the
99
+ * decorations to widgets (which would break the flat-text invariant).
100
+ */
101
+ const TagChipDecoration = Extension.create({
102
+ name: "tagChipDecoration",
103
+ addOptions() {
104
+ return {
105
+ onChipClick: void 0,
106
+ onChipHover: void 0
107
+ };
108
+ },
109
+ addProseMirrorPlugins() {
110
+ const options = this.options;
111
+ return [new Plugin({
112
+ key: tagChipPluginKey,
113
+ state: {
114
+ init: (_, { doc }) => buildDecorations(doc),
115
+ apply: (tr, old) => tr.docChanged ? buildDecorations(tr.doc) : old
116
+ },
117
+ props: { decorations(state) {
118
+ return this.getState(state) ?? null;
119
+ } }
120
+ }), new Plugin({
121
+ key: tagChipInteractionKey,
122
+ props: { handleDOMEvents: {
123
+ mousedown(view, event) {
124
+ if (!options.onChipClick) return false;
125
+ const found = chipHitFromTarget(event.target);
126
+ if (!found) return false;
127
+ const pos = view.posAtDOM(found.el, 0);
128
+ const raw = found.hit.raw;
129
+ const from = pos;
130
+ const to = pos + raw.length;
131
+ event.preventDefault();
132
+ options.onChipClick({
133
+ ...found.hit,
134
+ from,
135
+ to
136
+ }, found.el);
137
+ return true;
138
+ },
139
+ keydown(view, event) {
140
+ if (!options.onChipClick) return false;
141
+ if (event.key !== "Enter" && event.key !== " ") return false;
142
+ const active = document.activeElement;
143
+ if (!(active instanceof HTMLElement)) return false;
144
+ if (!active.matches("[data-tag-chip]")) return false;
145
+ const kind = active.getAttribute("data-tag-chip");
146
+ const raw = active.getAttribute("data-tag-chip-text");
147
+ if (!kind || raw == null) return false;
148
+ const pos = view.posAtDOM(active, 0);
149
+ event.preventDefault();
150
+ options.onChipClick({
151
+ kind,
152
+ raw,
153
+ from: pos,
154
+ to: pos + raw.length
155
+ }, active);
156
+ return true;
157
+ },
158
+ mouseover(_view, event) {
159
+ if (!options.onChipHover) return false;
160
+ const found = chipHitFromTarget(event.target);
161
+ if (!found) {
162
+ options.onChipHover(null, null);
163
+ return false;
164
+ }
165
+ options.onChipHover(found.hit, found.el);
166
+ return false;
167
+ },
168
+ mouseout(_view, event) {
169
+ if (!options.onChipHover) return false;
170
+ if (chipHitFromTarget(event.target)) options.onChipHover(null, null);
171
+ return false;
172
+ }
173
+ } }
174
+ })];
175
+ }
176
+ });
177
+
178
+ //#endregion
179
+ export { TagChipDecoration };
180
+ //# sourceMappingURL=tag-chip-decoration.mjs.map