@byline/ui 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +17 -0
  3. package/dist/admin/components/admin-account/change-password.d.ts +9 -0
  4. package/dist/admin/components/admin-account/change-password.d.ts.map +1 -0
  5. package/dist/admin/components/admin-account/change-password.js +192 -0
  6. package/dist/admin/components/admin-account/change-password.module.js +8 -0
  7. package/dist/admin/components/admin-account/change-password_module.css +27 -0
  8. package/dist/admin/components/admin-account/container.d.ts +30 -0
  9. package/dist/admin/components/admin-account/container.d.ts.map +1 -0
  10. package/dist/admin/components/admin-account/container.js +299 -0
  11. package/dist/admin/components/admin-account/container.module.js +28 -0
  12. package/dist/admin/components/admin-account/container_module.css +106 -0
  13. package/dist/admin/components/admin-account/update.d.ts +9 -0
  14. package/dist/admin/components/admin-account/update.d.ts.map +1 -0
  15. package/dist/admin/components/admin-account/update.js +207 -0
  16. package/dist/admin/components/admin-account/update.module.js +8 -0
  17. package/dist/admin/components/admin-account/update_module.css +27 -0
  18. package/dist/admin/components/admin-permissions/inspector.d.ts +5 -0
  19. package/dist/admin/components/admin-permissions/inspector.d.ts.map +1 -0
  20. package/dist/admin/components/admin-permissions/inspector.js +284 -0
  21. package/dist/admin/components/admin-permissions/inspector.module.js +56 -0
  22. package/dist/admin/components/admin-permissions/inspector_module.css +238 -0
  23. package/dist/admin/components/admin-roles/create.d.ts +8 -0
  24. package/dist/admin/components/admin-roles/create.d.ts.map +1 -0
  25. package/dist/admin/components/admin-roles/create.js +177 -0
  26. package/dist/admin/components/admin-roles/create.module.js +8 -0
  27. package/dist/admin/components/admin-roles/create_module.css +27 -0
  28. package/dist/admin/components/admin-roles/permissions.d.ts +11 -0
  29. package/dist/admin/components/admin-roles/permissions.d.ts.map +1 -0
  30. package/dist/admin/components/admin-roles/permissions.js +303 -0
  31. package/dist/admin/components/admin-roles/permissions.module.js +44 -0
  32. package/dist/admin/components/admin-roles/permissions_module.css +192 -0
  33. package/dist/admin/components/admin-roles/update.d.ts +9 -0
  34. package/dist/admin/components/admin-roles/update.d.ts.map +1 -0
  35. package/dist/admin/components/admin-roles/update.js +166 -0
  36. package/dist/admin/components/admin-roles/update.module.js +8 -0
  37. package/dist/admin/components/admin-roles/update_module.css +27 -0
  38. package/dist/admin/components/admin-users/create.d.ts +9 -0
  39. package/dist/admin/components/admin-users/create.d.ts.map +1 -0
  40. package/dist/admin/components/admin-users/create.js +268 -0
  41. package/dist/admin/components/admin-users/create.module.js +10 -0
  42. package/dist/admin/components/admin-users/create_module.css +45 -0
  43. package/dist/admin/components/admin-users/roles.d.ts +12 -0
  44. package/dist/admin/components/admin-users/roles.d.ts.map +1 -0
  45. package/dist/admin/components/admin-users/roles.js +148 -0
  46. package/dist/admin/components/admin-users/roles.module.js +18 -0
  47. package/dist/admin/components/admin-users/roles_module.css +75 -0
  48. package/dist/admin/components/admin-users/set-password.d.ts +9 -0
  49. package/dist/admin/components/admin-users/set-password.d.ts.map +1 -0
  50. package/dist/admin/components/admin-users/set-password.js +170 -0
  51. package/dist/admin/components/admin-users/set-password.module.js +9 -0
  52. package/dist/admin/components/admin-users/set-password_module.css +31 -0
  53. package/dist/admin/components/admin-users/update.d.ts +9 -0
  54. package/dist/admin/components/admin-users/update.d.ts.map +1 -0
  55. package/dist/admin/components/admin-users/update.js +254 -0
  56. package/dist/admin/components/admin-users/update.module.js +9 -0
  57. package/dist/admin/components/admin-users/update_module.css +34 -0
  58. package/dist/admin/components/auth/sign-in-form.d.ts +14 -0
  59. package/dist/admin/components/auth/sign-in-form.d.ts.map +1 -0
  60. package/dist/admin/components/auth/sign-in-form.js +107 -0
  61. package/dist/admin/components/auth/sign-in-form.module.js +10 -0
  62. package/dist/admin/components/auth/sign-in-form_module.css +35 -0
  63. package/dist/admin/components/collections/diff-modal.d.ts +23 -0
  64. package/dist/admin/components/collections/diff-modal.d.ts.map +1 -0
  65. package/dist/admin/components/collections/diff-modal.js +147 -0
  66. package/dist/admin/components/collections/diff-modal.module.js +14 -0
  67. package/dist/admin/components/collections/diff-modal_module.css +56 -0
  68. package/dist/admin/components/collections/status-badge.d.ts +26 -0
  69. package/dist/admin/components/collections/status-badge.d.ts.map +1 -0
  70. package/dist/admin/components/collections/status-badge.js +35 -0
  71. package/dist/admin/components/collections/status-badge.module.js +7 -0
  72. package/dist/admin/components/collections/status-badge_module.css +20 -0
  73. package/dist/admin/group.d.ts +28 -0
  74. package/dist/admin/group.d.ts.map +1 -0
  75. package/dist/admin/group.js +14 -0
  76. package/dist/admin/group.module.js +6 -0
  77. package/dist/admin/group_module.css +19 -0
  78. package/dist/admin/row.d.ts +26 -0
  79. package/dist/admin/row.d.ts.map +1 -0
  80. package/dist/admin/row.js +8 -0
  81. package/dist/admin/row.module.js +5 -0
  82. package/dist/admin/row_module.css +18 -0
  83. package/dist/admin/tabs.d.ts +33 -0
  84. package/dist/admin/tabs.d.ts.map +1 -0
  85. package/dist/admin/tabs.js +34 -0
  86. package/dist/admin/tabs.module.js +10 -0
  87. package/dist/admin/tabs_module.css +68 -0
  88. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.js +105 -0
  89. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.module.js +12 -0
  90. package/dist/dnd/draggable-sortable/demo/draggable-list-demo_module.css +39 -0
  91. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts +19 -0
  92. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts.map +1 -0
  93. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.js +27 -0
  94. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts +25 -0
  95. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts.map +1 -0
  96. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.js +1 -0
  97. package/dist/dnd/draggable-sortable/draggable-sortable.d.ts +17 -0
  98. package/dist/dnd/draggable-sortable/draggable-sortable.d.ts.map +1 -0
  99. package/dist/dnd/draggable-sortable/draggable-sortable.js +46 -0
  100. package/dist/dnd/draggable-sortable/index.d.ts +5 -0
  101. package/dist/dnd/draggable-sortable/index.d.ts.map +1 -0
  102. package/dist/dnd/draggable-sortable/index.js +4 -0
  103. package/dist/dnd/draggable-sortable/types.d.ts +26 -0
  104. package/dist/dnd/draggable-sortable/types.d.ts.map +1 -0
  105. package/dist/dnd/draggable-sortable/types.js +1 -0
  106. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts +16 -0
  107. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts.map +1 -0
  108. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.js +28 -0
  109. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts +23 -0
  110. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts.map +1 -0
  111. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.js +1 -0
  112. package/dist/dnd/draggable-sortable/utils.d.ts +14 -0
  113. package/dist/dnd/draggable-sortable/utils.d.ts.map +1 -0
  114. package/dist/dnd/draggable-sortable/utils.js +10 -0
  115. package/dist/fields/array/array-field.d.ts +15 -0
  116. package/dist/fields/array/array-field.d.ts.map +1 -0
  117. package/dist/fields/array/array-field.js +176 -0
  118. package/dist/fields/array/array-field.module.js +11 -0
  119. package/dist/fields/array/array-field_module.css +32 -0
  120. package/dist/fields/blocks/blocks-field.d.ts +14 -0
  121. package/dist/fields/blocks/blocks-field.d.ts.map +1 -0
  122. package/dist/fields/blocks/blocks-field.js +244 -0
  123. package/dist/fields/blocks/blocks-field.module.js +26 -0
  124. package/dist/fields/blocks/blocks-field_module.css +107 -0
  125. package/dist/fields/checkbox/checkbox-field.d.ts +17 -0
  126. package/dist/fields/checkbox/checkbox-field.d.ts.map +1 -0
  127. package/dist/fields/checkbox/checkbox-field.js +27 -0
  128. package/dist/fields/column-formatter.d.ts +21 -0
  129. package/dist/fields/column-formatter.d.ts.map +1 -0
  130. package/dist/fields/column-formatter.js +15 -0
  131. package/dist/fields/date-time-formatter.d.ts +17 -0
  132. package/dist/fields/date-time-formatter.d.ts.map +1 -0
  133. package/dist/fields/date-time-formatter.js +8 -0
  134. package/dist/fields/datetime/datetime-field.d.ts +17 -0
  135. package/dist/fields/datetime/datetime-field.d.ts.map +1 -0
  136. package/dist/fields/datetime/datetime-field.js +37 -0
  137. package/dist/fields/datetime/datetime-field.module.js +5 -0
  138. package/dist/fields/datetime/datetime-field_module.css +4 -0
  139. package/dist/fields/draggable-context-menu.d.ts +7 -0
  140. package/dist/fields/draggable-context-menu.d.ts.map +1 -0
  141. package/dist/fields/draggable-context-menu.js +83 -0
  142. package/dist/fields/draggable-context-menu.module.js +15 -0
  143. package/dist/fields/draggable-context-menu_module.css +91 -0
  144. package/dist/fields/field-helpers.d.ts +27 -0
  145. package/dist/fields/field-helpers.d.ts.map +1 -0
  146. package/dist/fields/field-helpers.js +48 -0
  147. package/dist/fields/field-renderer.d.ts +31 -0
  148. package/dist/fields/field-renderer.d.ts.map +1 -0
  149. package/dist/fields/field-renderer.js +189 -0
  150. package/dist/fields/field-renderer.module.js +8 -0
  151. package/dist/fields/field-renderer_module.css +11 -0
  152. package/dist/fields/file/file-field.d.ts +18 -0
  153. package/dist/fields/file/file-field.d.ts.map +1 -0
  154. package/dist/fields/file/file-field.js +125 -0
  155. package/dist/fields/file/file-field.module.js +13 -0
  156. package/dist/fields/file/file-field_module.css +64 -0
  157. package/dist/fields/group/group-field.d.ts +16 -0
  158. package/dist/fields/group/group-field.d.ts.map +1 -0
  159. package/dist/fields/group/group-field.js +59 -0
  160. package/dist/fields/group/group-field.module.js +9 -0
  161. package/dist/fields/group/group-field_module.css +27 -0
  162. package/dist/fields/image/image-field.d.ts +20 -0
  163. package/dist/fields/image/image-field.d.ts.map +1 -0
  164. package/dist/fields/image/image-field.js +198 -0
  165. package/dist/fields/image/image-field.module.js +21 -0
  166. package/dist/fields/image/image-field_module.css +96 -0
  167. package/dist/fields/image/image-upload-field.d.ts +22 -0
  168. package/dist/fields/image/image-upload-field.d.ts.map +1 -0
  169. package/dist/fields/image/image-upload-field.js +187 -0
  170. package/dist/fields/image/image-upload-field.module.js +19 -0
  171. package/dist/fields/image/image-upload-field_module.css +92 -0
  172. package/dist/fields/local-date-time.d.ts +28 -0
  173. package/dist/fields/local-date-time.d.ts.map +1 -0
  174. package/dist/fields/local-date-time.js +49 -0
  175. package/dist/fields/locale-badge.d.ts +19 -0
  176. package/dist/fields/locale-badge.d.ts.map +1 -0
  177. package/dist/fields/locale-badge.js +10 -0
  178. package/dist/fields/locale-badge.module.js +5 -0
  179. package/dist/fields/locale-badge_module.css +27 -0
  180. package/dist/fields/numerical/numerical-field.d.ts +19 -0
  181. package/dist/fields/numerical/numerical-field.d.ts.map +1 -0
  182. package/dist/fields/numerical/numerical-field.js +73 -0
  183. package/dist/fields/relation/relation-display.d.ts +41 -0
  184. package/dist/fields/relation/relation-display.d.ts.map +1 -0
  185. package/dist/fields/relation/relation-display.js +58 -0
  186. package/dist/fields/relation/relation-display.module.js +9 -0
  187. package/dist/fields/relation/relation-display_module.css +21 -0
  188. package/dist/fields/relation/relation-field.d.ts +19 -0
  189. package/dist/fields/relation/relation-field.d.ts.map +1 -0
  190. package/dist/fields/relation/relation-field.js +133 -0
  191. package/dist/fields/relation/relation-field.module.js +13 -0
  192. package/dist/fields/relation/relation-field_module.css +62 -0
  193. package/dist/fields/relation/relation-picker.d.ts +50 -0
  194. package/dist/fields/relation/relation-picker.d.ts.map +1 -0
  195. package/dist/fields/relation/relation-picker.js +233 -0
  196. package/dist/fields/relation/relation-picker.module.js +26 -0
  197. package/dist/fields/relation/relation-picker_module.css +124 -0
  198. package/dist/fields/relation/relation-summary.d.ts +32 -0
  199. package/dist/fields/relation/relation-summary.d.ts.map +1 -0
  200. package/dist/fields/relation/relation-summary.js +50 -0
  201. package/dist/fields/relation/relation-summary.module.js +11 -0
  202. package/dist/fields/relation/relation-summary_module.css +37 -0
  203. package/dist/fields/select/select-field.d.ts +17 -0
  204. package/dist/fields/select/select-field.d.ts.map +1 -0
  205. package/dist/fields/select/select-field.js +42 -0
  206. package/dist/fields/select/select-field.module.js +5 -0
  207. package/dist/fields/select/select-field_module.css +4 -0
  208. package/dist/fields/sortable-item.d.ts +16 -0
  209. package/dist/fields/sortable-item.d.ts.map +1 -0
  210. package/dist/fields/sortable-item.js +80 -0
  211. package/dist/fields/sortable-item.module.js +22 -0
  212. package/dist/fields/sortable-item_module.css +124 -0
  213. package/dist/fields/text/text-field.d.ts +21 -0
  214. package/dist/fields/text/text-field.d.ts.map +1 -0
  215. package/dist/fields/text/text-field.js +104 -0
  216. package/dist/fields/text/text-field.module.js +6 -0
  217. package/dist/fields/text/text-field_module.css +5 -0
  218. package/dist/fields/text-area/text-area-field.d.ts +21 -0
  219. package/dist/fields/text-area/text-area-field.d.ts.map +1 -0
  220. package/dist/fields/text-area/text-area-field.js +105 -0
  221. package/dist/fields/text-area/text-area-field.module.js +6 -0
  222. package/dist/fields/text-area/text-area-field_module.css +5 -0
  223. package/dist/fields/use-field-change-handler.d.ts +24 -0
  224. package/dist/fields/use-field-change-handler.d.ts.map +1 -0
  225. package/dist/fields/use-field-change-handler.js +52 -0
  226. package/dist/forms/document-actions.d.ts +14 -0
  227. package/dist/forms/document-actions.d.ts.map +1 -0
  228. package/dist/forms/document-actions.js +153 -0
  229. package/dist/forms/document-actions.module.js +18 -0
  230. package/dist/forms/document-actions_module.css +66 -0
  231. package/dist/forms/form-context.d.ts +78 -0
  232. package/dist/forms/form-context.d.ts.map +1 -0
  233. package/dist/forms/form-context.js +420 -0
  234. package/dist/forms/form-renderer.d.ts +66 -0
  235. package/dist/forms/form-renderer.d.ts.map +1 -0
  236. package/dist/forms/form-renderer.js +555 -0
  237. package/dist/forms/form-renderer.module.js +46 -0
  238. package/dist/forms/form-renderer_module.css +242 -0
  239. package/dist/forms/navigation-guard.d.ts +55 -0
  240. package/dist/forms/navigation-guard.d.ts.map +1 -0
  241. package/dist/forms/navigation-guard.js +22 -0
  242. package/dist/forms/path-widget.d.ts +33 -0
  243. package/dist/forms/path-widget.d.ts.map +1 -0
  244. package/dist/forms/path-widget.js +101 -0
  245. package/dist/forms/path-widget.module.js +8 -0
  246. package/dist/forms/path-widget_module.css +29 -0
  247. package/dist/forms/upload-executor.d.ts +58 -0
  248. package/dist/forms/upload-executor.d.ts.map +1 -0
  249. package/dist/forms/upload-executor.js +92 -0
  250. package/dist/react.d.ts +55 -0
  251. package/dist/react.d.ts.map +1 -0
  252. package/dist/react.js +48 -0
  253. package/dist/services/admin-services-context.d.ts +17 -0
  254. package/dist/services/admin-services-context.d.ts.map +1 -0
  255. package/dist/services/admin-services-context.js +13 -0
  256. package/dist/services/admin-services-types.d.ts +130 -0
  257. package/dist/services/admin-services-types.d.ts.map +1 -0
  258. package/dist/services/admin-services-types.js +1 -0
  259. package/dist/services/field-services-context.d.ts +17 -0
  260. package/dist/services/field-services-context.d.ts.map +1 -0
  261. package/dist/services/field-services-context.js +13 -0
  262. package/dist/services/field-services-types.d.ts +64 -0
  263. package/dist/services/field-services-types.d.ts.map +1 -0
  264. package/dist/services/field-services-types.js +1 -0
  265. package/package.json +133 -0
  266. package/src/admin/components/admin-account/change-password.module.css +40 -0
  267. package/src/admin/components/admin-account/change-password.tsx +232 -0
  268. package/src/admin/components/admin-account/container.module.css +158 -0
  269. package/src/admin/components/admin-account/container.tsx +230 -0
  270. package/src/admin/components/admin-account/update.module.css +40 -0
  271. package/src/admin/components/admin-account/update.tsx +263 -0
  272. package/src/admin/components/admin-permissions/inspector.module.css +326 -0
  273. package/src/admin/components/admin-permissions/inspector.tsx +298 -0
  274. package/src/admin/components/admin-roles/create.module.css +40 -0
  275. package/src/admin/components/admin-roles/create.tsx +218 -0
  276. package/src/admin/components/admin-roles/permissions.module.css +279 -0
  277. package/src/admin/components/admin-roles/permissions.tsx +396 -0
  278. package/src/admin/components/admin-roles/update.module.css +40 -0
  279. package/src/admin/components/admin-roles/update.tsx +218 -0
  280. package/src/admin/components/admin-users/create.module.css +63 -0
  281. package/src/admin/components/admin-users/create.tsx +323 -0
  282. package/src/admin/components/admin-users/roles.module.css +119 -0
  283. package/src/admin/components/admin-users/roles.tsx +172 -0
  284. package/src/admin/components/admin-users/set-password.module.css +46 -0
  285. package/src/admin/components/admin-users/set-password.tsx +199 -0
  286. package/src/admin/components/admin-users/update.module.css +49 -0
  287. package/src/admin/components/admin-users/update.tsx +328 -0
  288. package/src/admin/components/auth/sign-in-form.module.css +53 -0
  289. package/src/admin/components/auth/sign-in-form.tsx +118 -0
  290. package/src/admin/components/collections/diff-modal.module.css +79 -0
  291. package/src/admin/components/collections/diff-modal.tsx +171 -0
  292. package/src/admin/components/collections/status-badge.module.css +31 -0
  293. package/src/admin/components/collections/status-badge.tsx +69 -0
  294. package/src/admin/group.module.css +41 -0
  295. package/src/admin/group.tsx +40 -0
  296. package/src/admin/row.module.css +32 -0
  297. package/src/admin/row.tsx +33 -0
  298. package/src/admin/tabs.module.css +107 -0
  299. package/src/admin/tabs.tsx +74 -0
  300. package/src/declarations.d.ts +4 -0
  301. package/src/dnd/draggable-sortable/demo/draggable-list-demo.module.css +65 -0
  302. package/src/dnd/draggable-sortable/demo/draggable-list-demo.tsx +117 -0
  303. package/src/dnd/draggable-sortable/draggable-sortable-item/index.tsx +54 -0
  304. package/src/dnd/draggable-sortable/draggable-sortable-item/types.ts +30 -0
  305. package/src/dnd/draggable-sortable/draggable-sortable.tsx +86 -0
  306. package/src/dnd/draggable-sortable/index.ts +5 -0
  307. package/src/dnd/draggable-sortable/types.ts +24 -0
  308. package/src/dnd/draggable-sortable/use-draggable-sortable/index.tsx +50 -0
  309. package/src/dnd/draggable-sortable/use-draggable-sortable/types.ts +25 -0
  310. package/src/dnd/draggable-sortable/utils.ts +29 -0
  311. package/src/fields/array/array-field.module.css +48 -0
  312. package/src/fields/array/array-field.tsx +266 -0
  313. package/src/fields/blocks/blocks-field.module.css +148 -0
  314. package/src/fields/blocks/blocks-field.tsx +312 -0
  315. package/src/fields/checkbox/checkbox-field.tsx +53 -0
  316. package/src/fields/column-formatter.tsx +31 -0
  317. package/src/fields/date-time-formatter.tsx +22 -0
  318. package/src/fields/datetime/datetime-field.module.css +13 -0
  319. package/src/fields/datetime/datetime-field.tsx +54 -0
  320. package/src/fields/draggable-context-menu.module.css +127 -0
  321. package/src/fields/draggable-context-menu.tsx +85 -0
  322. package/src/fields/field-helpers.ts +66 -0
  323. package/src/fields/field-renderer.module.css +22 -0
  324. package/src/fields/field-renderer.tsx +255 -0
  325. package/src/fields/file/file-field.module.css +88 -0
  326. package/src/fields/file/file-field.tsx +107 -0
  327. package/src/fields/group/group-field.module.css +43 -0
  328. package/src/fields/group/group-field.tsx +84 -0
  329. package/src/fields/image/image-field.module.css +129 -0
  330. package/src/fields/image/image-field.tsx +212 -0
  331. package/src/fields/image/image-upload-field.module.css +123 -0
  332. package/src/fields/image/image-upload-field.tsx +270 -0
  333. package/src/fields/local-date-time.tsx +88 -0
  334. package/src/fields/locale-badge.module.css +37 -0
  335. package/src/fields/locale-badge.tsx +32 -0
  336. package/src/fields/numerical/numerical-field.tsx +112 -0
  337. package/src/fields/relation/relation-display.module.css +36 -0
  338. package/src/fields/relation/relation-display.tsx +130 -0
  339. package/src/fields/relation/relation-field.module.css +83 -0
  340. package/src/fields/relation/relation-field.tsx +202 -0
  341. package/src/fields/relation/relation-picker.module.css +168 -0
  342. package/src/fields/relation/relation-picker.tsx +325 -0
  343. package/src/fields/relation/relation-summary.module.css +55 -0
  344. package/src/fields/relation/relation-summary.tsx +123 -0
  345. package/src/fields/select/select-field.module.css +13 -0
  346. package/src/fields/select/select-field.tsx +56 -0
  347. package/src/fields/sortable-item.module.css +167 -0
  348. package/src/fields/sortable-item.tsx +101 -0
  349. package/src/fields/text/text-field.module.css +13 -0
  350. package/src/fields/text/text-field.tsx +146 -0
  351. package/src/fields/text-area/text-area-field.module.css +13 -0
  352. package/src/fields/text-area/text-area-field.tsx +147 -0
  353. package/src/fields/use-field-change-handler.ts +112 -0
  354. package/src/forms/document-actions.module.css +94 -0
  355. package/src/forms/document-actions.tsx +149 -0
  356. package/src/forms/form-context.tsx +620 -0
  357. package/src/forms/form-renderer.module.css +318 -0
  358. package/src/forms/form-renderer.tsx +786 -0
  359. package/src/forms/navigation-guard.tsx +98 -0
  360. package/src/forms/path-widget.module.css +41 -0
  361. package/src/forms/path-widget.test.tsx +217 -0
  362. package/src/forms/path-widget.tsx +141 -0
  363. package/src/forms/upload-executor.ts +190 -0
  364. package/src/react.ts +79 -0
  365. package/src/services/admin-services-context.tsx +35 -0
  366. package/src/services/admin-services-types.ts +177 -0
  367. package/src/services/field-services-context.tsx +35 -0
  368. package/src/services/field-services-types.ts +68 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ import type React from 'react';
9
+ import type { Field } from '@byline/core';
10
+ import type { DocumentPatch } from '@byline/core/patches';
11
+ interface FormError {
12
+ field: string;
13
+ message: string;
14
+ }
15
+ /**
16
+ * Represents a file that has been selected but not yet uploaded.
17
+ * The file is held locally until form submission.
18
+ */
19
+ export interface PendingUpload {
20
+ /** The actual File object to upload */
21
+ file: File;
22
+ /** Blob URL for local preview (must be revoked on cleanup) */
23
+ previewUrl: string;
24
+ /** The collection path for the upload endpoint */
25
+ collectionPath: string;
26
+ }
27
+ type FieldListener = (value: any) => void;
28
+ type ErrorsListener = (errors: FormError[]) => void;
29
+ type MetaListener = () => void;
30
+ type SystemPathListener = (value: string | null) => void;
31
+ interface FormContextType {
32
+ setFieldValue: (name: string, value: any) => void;
33
+ setFieldStore: (name: string, value: any) => void;
34
+ getFieldValue: (name: string) => any;
35
+ getFieldValues: () => Record<string, any>;
36
+ getPatches: () => DocumentPatch[];
37
+ appendPatch: (patch: DocumentPatch) => void;
38
+ resetPatches: () => void;
39
+ hasChanges: () => boolean;
40
+ resetHasChanges: () => void;
41
+ runFieldHooks: (fields: Field[]) => Promise<FormError[]>;
42
+ validateForm: (fields: Field[]) => FormError[];
43
+ errors: FormError[];
44
+ clearErrors: () => void;
45
+ setFieldError: (field: string, message: string) => void;
46
+ clearFieldError: (field: string) => void;
47
+ isDirty: (fieldName: string) => boolean;
48
+ subscribeField: (name: string, listener: FieldListener) => () => void;
49
+ subscribeErrors: (listener: ErrorsListener) => () => void;
50
+ subscribeMeta: (listener: MetaListener) => () => void;
51
+ addPendingUpload: (fieldPath: string, upload: PendingUpload) => void;
52
+ removePendingUpload: (fieldPath: string) => void;
53
+ getPendingUploads: () => Map<string, PendingUpload>;
54
+ hasPendingUploads: () => boolean;
55
+ clearPendingUploads: () => void;
56
+ getSystemPath: () => string | null;
57
+ setSystemPath: (value: string | null) => void;
58
+ subscribeSystemPath: (listener: SystemPathListener) => () => void;
59
+ }
60
+ export declare const useFormContext: () => FormContextType;
61
+ export declare const FormProvider: ({ children, initialData, }: {
62
+ children: React.ReactNode;
63
+ initialData?: Record<string, any>;
64
+ }) => React.JSX.Element;
65
+ /**
66
+ * Subscribe to the system `path` slot edited by the path widget.
67
+ * Returns the current value (or `null` when no override is set).
68
+ */
69
+ export declare const useSystemPath: () => string | null;
70
+ export declare const useFormStore: () => FormContextType;
71
+ export declare const useFieldError: (name: string) => string | undefined;
72
+ export declare const useFormMeta: () => {
73
+ hasChanges: boolean;
74
+ };
75
+ export declare const useIsDirty: (name: string) => boolean;
76
+ export declare const useFieldValue: <T = any>(name: string) => T | undefined;
77
+ export {};
78
+ //# sourceMappingURL=form-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-context.d.ts","sourceRoot":"","sources":["../../src/forms/form-context.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,420 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useRef, useState } from "react";
3
+ import { normalizeHooks } from "@byline/core";
4
+ import { get, set } from "lodash-es";
5
+ const FormContext = /*#__PURE__*/ createContext(null);
6
+ const useFormContext = ()=>{
7
+ const context = useContext(FormContext);
8
+ if (null == context) throw new Error('useFormContext must be used within a FormProvider');
9
+ return context;
10
+ };
11
+ const FormProvider = ({ children, initialData = {} })=>{
12
+ const fieldValues = useRef(JSON.parse(JSON.stringify(initialData?.fields ?? initialData)));
13
+ const initialValues = useRef(initialData?.fields ?? initialData);
14
+ const errorsRef = useRef([]);
15
+ const dirtyFields = useRef(new Set());
16
+ const patchesRef = useRef([]);
17
+ const pendingUploadsRef = useRef(new Map());
18
+ const fieldListeners = useRef(new Map());
19
+ const errorListeners = useRef(new Set());
20
+ const metaListeners = useRef(new Set());
21
+ const systemPathRef = useRef('string' == typeof initialData?.path && initialData.path.length > 0 ? initialData.path : null);
22
+ const initialSystemPath = useRef(systemPathRef.current);
23
+ const systemPathListeners = useRef(new Set());
24
+ const subscribeField = useCallback((name, listener)=>{
25
+ if (!fieldListeners.current.has(name)) fieldListeners.current.set(name, new Set());
26
+ fieldListeners.current.get(name)?.add(listener);
27
+ return ()=>{
28
+ const listeners = fieldListeners.current.get(name);
29
+ if (listeners) {
30
+ listeners.delete(listener);
31
+ if (0 === listeners.size) fieldListeners.current.delete(name);
32
+ }
33
+ };
34
+ }, []);
35
+ const subscribeErrors = useCallback((listener)=>{
36
+ errorListeners.current.add(listener);
37
+ return ()=>{
38
+ errorListeners.current.delete(listener);
39
+ };
40
+ }, []);
41
+ const subscribeMeta = useCallback((listener)=>{
42
+ metaListeners.current.add(listener);
43
+ return ()=>{
44
+ metaListeners.current.delete(listener);
45
+ };
46
+ }, []);
47
+ const notifyFieldListeners = useCallback((name, value)=>{
48
+ const listeners = fieldListeners.current.get(name);
49
+ if (listeners) listeners.forEach((listener)=>{
50
+ listener(value);
51
+ });
52
+ }, []);
53
+ const notifyErrorListeners = useCallback(()=>{
54
+ errorListeners.current.forEach((listener)=>{
55
+ listener(errorsRef.current);
56
+ });
57
+ }, []);
58
+ const notifyMetaListeners = useCallback(()=>{
59
+ metaListeners.current.forEach((listener)=>{
60
+ listener();
61
+ });
62
+ }, []);
63
+ const updateFieldStoreInternal = useCallback((name, value)=>{
64
+ const newFieldValues = {
65
+ ...fieldValues.current
66
+ };
67
+ set(newFieldValues, name, value);
68
+ fieldValues.current = newFieldValues;
69
+ dirtyFields.current.add(name);
70
+ notifyFieldListeners(name, value);
71
+ notifyMetaListeners();
72
+ }, [
73
+ notifyFieldListeners,
74
+ notifyMetaListeners
75
+ ]);
76
+ const setFieldStore = useCallback((name, value)=>{
77
+ updateFieldStoreInternal(name, value);
78
+ }, [
79
+ updateFieldStoreInternal
80
+ ]);
81
+ const setFieldValue = useCallback((name, value)=>{
82
+ updateFieldStoreInternal(name, value);
83
+ const patch = {
84
+ kind: 'field.set',
85
+ path: name,
86
+ value
87
+ };
88
+ const lastPatch = patchesRef.current[patchesRef.current.length - 1];
89
+ if (lastPatch && 'field.set' === lastPatch.kind && lastPatch.path === name) {
90
+ const newPatches = [
91
+ ...patchesRef.current
92
+ ];
93
+ newPatches[newPatches.length - 1] = patch;
94
+ patchesRef.current = newPatches;
95
+ } else patchesRef.current = [
96
+ ...patchesRef.current,
97
+ patch
98
+ ];
99
+ if (errorsRef.current.some((error)=>error.field === name)) {
100
+ errorsRef.current = errorsRef.current.filter((error)=>error.field !== name);
101
+ notifyErrorListeners();
102
+ }
103
+ }, [
104
+ updateFieldStoreInternal,
105
+ notifyErrorListeners
106
+ ]);
107
+ const getFieldValues = useCallback(()=>fieldValues.current, []);
108
+ const getPatches = useCallback(()=>patchesRef.current, []);
109
+ const appendPatch = useCallback((patch)=>{
110
+ patchesRef.current = [
111
+ ...patchesRef.current,
112
+ patch
113
+ ];
114
+ dirtyFields.current.add('__patch__');
115
+ notifyMetaListeners();
116
+ if ('production' !== process.env.NODE_ENV) console.debug('FormContext.appendPatch', {
117
+ patch,
118
+ dirtyCount: dirtyFields.current.size
119
+ });
120
+ }, [
121
+ notifyMetaListeners
122
+ ]);
123
+ const getFieldValue = useCallback((name)=>{
124
+ const dirty = dirtyFields.current.has(name);
125
+ const currentValue = get(fieldValues.current, name);
126
+ if (void 0 !== currentValue) return currentValue;
127
+ if (!dirty) return get(initialValues.current, name);
128
+ }, []);
129
+ const hasChanges = useCallback(()=>dirtyFields.current.size > 0, []);
130
+ const resetHasChanges = useCallback(()=>{
131
+ dirtyFields.current.clear();
132
+ patchesRef.current = [];
133
+ initialSystemPath.current = systemPathRef.current;
134
+ notifyMetaListeners();
135
+ }, [
136
+ notifyMetaListeners
137
+ ]);
138
+ const isDirty = useCallback((fieldName)=>dirtyFields.current.has(fieldName), []);
139
+ const getSystemPath = useCallback(()=>systemPathRef.current, []);
140
+ const setSystemPath = useCallback((value)=>{
141
+ systemPathRef.current = value;
142
+ if (value !== initialSystemPath.current) dirtyFields.current.add('__systemPath__');
143
+ else dirtyFields.current.delete('__systemPath__');
144
+ systemPathListeners.current.forEach((listener)=>{
145
+ listener(value);
146
+ });
147
+ notifyMetaListeners();
148
+ }, [
149
+ notifyMetaListeners
150
+ ]);
151
+ const subscribeSystemPath = useCallback((listener)=>{
152
+ systemPathListeners.current.add(listener);
153
+ return ()=>{
154
+ systemPathListeners.current.delete(listener);
155
+ };
156
+ }, []);
157
+ const addPendingUpload = useCallback((fieldPath, upload)=>{
158
+ const existing = pendingUploadsRef.current.get(fieldPath);
159
+ if (existing) URL.revokeObjectURL(existing.previewUrl);
160
+ pendingUploadsRef.current.set(fieldPath, upload);
161
+ dirtyFields.current.add(fieldPath);
162
+ notifyMetaListeners();
163
+ }, [
164
+ notifyMetaListeners
165
+ ]);
166
+ const removePendingUpload = useCallback((fieldPath)=>{
167
+ const existing = pendingUploadsRef.current.get(fieldPath);
168
+ if (existing) {
169
+ URL.revokeObjectURL(existing.previewUrl);
170
+ pendingUploadsRef.current.delete(fieldPath);
171
+ notifyMetaListeners();
172
+ }
173
+ }, [
174
+ notifyMetaListeners
175
+ ]);
176
+ const getPendingUploads = useCallback(()=>new Map(pendingUploadsRef.current), []);
177
+ const hasPendingUploads = useCallback(()=>pendingUploadsRef.current.size > 0, []);
178
+ const clearPendingUploads = useCallback(()=>{
179
+ for (const upload of pendingUploadsRef.current.values())URL.revokeObjectURL(upload.previewUrl);
180
+ pendingUploadsRef.current.clear();
181
+ }, []);
182
+ useEffect(()=>()=>{
183
+ for (const upload of pendingUploadsRef.current.values())URL.revokeObjectURL(upload.previewUrl);
184
+ }, []);
185
+ const validateForm = useCallback((fields)=>{
186
+ const formErrors = [];
187
+ const data = getFieldValues();
188
+ for (const field of fields){
189
+ const value = getFieldValue(field.name);
190
+ if (!field.optional && (null == value || '' === value)) formErrors.push({
191
+ field: field.name,
192
+ message: `${field.label} is required`
193
+ });
194
+ if (null != value && '' !== value) switch(field.type){
195
+ case 'text':
196
+ if ('string' != typeof value) formErrors.push({
197
+ field: field.name,
198
+ message: `${field.label} must be text`
199
+ });
200
+ break;
201
+ case 'checkbox':
202
+ if ('boolean' != typeof value) formErrors.push({
203
+ field: field.name,
204
+ message: `${field.label} must be true or false`
205
+ });
206
+ break;
207
+ case 'select':
208
+ if ('options' in field && field.options) {
209
+ const validValues = field.options.map((opt)=>opt.value);
210
+ if (!validValues.includes(value)) formErrors.push({
211
+ field: field.name,
212
+ message: `${field.label} must be one of: ${validValues.join(', ')}`
213
+ });
214
+ }
215
+ break;
216
+ case 'datetime':
217
+ if (value instanceof Date === false && 'string' != typeof value) formErrors.push({
218
+ field: field.name,
219
+ message: `${field.label} must be a valid date`
220
+ });
221
+ break;
222
+ }
223
+ if (field.validate) {
224
+ const error = field.validate(value, data);
225
+ if (error) formErrors.push({
226
+ field: field.name,
227
+ message: error
228
+ });
229
+ }
230
+ }
231
+ errorsRef.current = formErrors;
232
+ notifyErrorListeners();
233
+ return formErrors;
234
+ }, [
235
+ getFieldValue,
236
+ getFieldValues,
237
+ notifyErrorListeners
238
+ ]);
239
+ const clearErrors = useCallback(()=>{
240
+ errorsRef.current = [];
241
+ notifyErrorListeners();
242
+ }, [
243
+ notifyErrorListeners
244
+ ]);
245
+ const setFieldError = useCallback((field, message)=>{
246
+ const filtered = errorsRef.current.filter((e)=>e.field !== field);
247
+ filtered.push({
248
+ field,
249
+ message
250
+ });
251
+ errorsRef.current = filtered;
252
+ notifyErrorListeners();
253
+ }, [
254
+ notifyErrorListeners
255
+ ]);
256
+ const clearFieldError = useCallback((field)=>{
257
+ if (errorsRef.current.some((e)=>e.field === field)) {
258
+ errorsRef.current = errorsRef.current.filter((e)=>e.field !== field);
259
+ notifyErrorListeners();
260
+ }
261
+ }, [
262
+ notifyErrorListeners
263
+ ]);
264
+ const runFieldHooks = useCallback(async (fields)=>{
265
+ const hookErrors = [];
266
+ const data = {
267
+ ...fieldValues.current
268
+ };
269
+ for (const field of fields){
270
+ const fns = normalizeHooks(field.hooks?.beforeValidate);
271
+ if (0 === fns.length) continue;
272
+ const path = field.name;
273
+ const value = getFieldValue(path);
274
+ const ctx = {
275
+ value,
276
+ previousValue: value,
277
+ data,
278
+ path,
279
+ field,
280
+ operation: 'submit'
281
+ };
282
+ try {
283
+ for (const fn of fns){
284
+ const result = await fn(ctx);
285
+ if (result?.error) hookErrors.push({
286
+ field: path,
287
+ message: result.error
288
+ });
289
+ if (result?.value !== void 0) {
290
+ setFieldValue(path, result.value);
291
+ ctx.value = result.value;
292
+ data[path] = result.value;
293
+ }
294
+ }
295
+ } catch (err) {
296
+ const message = err instanceof Error ? err.message : 'Unexpected hook error';
297
+ hookErrors.push({
298
+ field: path,
299
+ message
300
+ });
301
+ }
302
+ }
303
+ if (hookErrors.length > 0) {
304
+ errorsRef.current = [
305
+ ...errorsRef.current,
306
+ ...hookErrors
307
+ ];
308
+ notifyErrorListeners();
309
+ }
310
+ return hookErrors;
311
+ }, [
312
+ getFieldValue,
313
+ setFieldValue,
314
+ notifyErrorListeners
315
+ ]);
316
+ return /*#__PURE__*/ jsx(FormContext.Provider, {
317
+ value: {
318
+ setFieldValue,
319
+ setFieldStore,
320
+ getFieldValue,
321
+ getFieldValues,
322
+ getPatches,
323
+ appendPatch,
324
+ resetPatches: ()=>{
325
+ patchesRef.current = [];
326
+ },
327
+ hasChanges,
328
+ resetHasChanges,
329
+ runFieldHooks,
330
+ validateForm,
331
+ errors: errorsRef.current,
332
+ clearErrors,
333
+ setFieldError,
334
+ clearFieldError,
335
+ isDirty,
336
+ subscribeField,
337
+ subscribeErrors,
338
+ subscribeMeta,
339
+ addPendingUpload,
340
+ removePendingUpload,
341
+ getPendingUploads,
342
+ hasPendingUploads,
343
+ clearPendingUploads,
344
+ getSystemPath,
345
+ setSystemPath,
346
+ subscribeSystemPath
347
+ },
348
+ children: children
349
+ });
350
+ };
351
+ const useSystemPath = ()=>{
352
+ const { getSystemPath, subscribeSystemPath } = useFormContext();
353
+ const [value, setValue] = useState(()=>getSystemPath());
354
+ useEffect(()=>subscribeSystemPath((next)=>setValue(next)), [
355
+ subscribeSystemPath
356
+ ]);
357
+ return value;
358
+ };
359
+ const useFormStore = ()=>useFormContext();
360
+ const useFieldError = (name)=>{
361
+ const { errors, subscribeErrors } = useFormContext();
362
+ const [error, setError] = useState(errors.find((e)=>e.field === name)?.message);
363
+ useEffect(()=>{
364
+ const unsubscribe = subscribeErrors((currentErrors)=>{
365
+ const fieldError = currentErrors.find((e)=>e.field === name);
366
+ setError(fieldError?.message);
367
+ });
368
+ return unsubscribe;
369
+ }, [
370
+ subscribeErrors,
371
+ name
372
+ ]);
373
+ return error;
374
+ };
375
+ const useFormMeta = ()=>{
376
+ const { hasChanges, subscribeMeta } = useFormContext();
377
+ const [hasChangesValue, setHasChangesValue] = useState(hasChanges());
378
+ useEffect(()=>{
379
+ const unsubscribe = subscribeMeta(()=>{
380
+ setHasChangesValue(hasChanges());
381
+ });
382
+ return unsubscribe;
383
+ }, [
384
+ subscribeMeta,
385
+ hasChanges
386
+ ]);
387
+ return {
388
+ hasChanges: hasChangesValue
389
+ };
390
+ };
391
+ const useIsDirty = (name)=>{
392
+ const { isDirty, subscribeMeta } = useFormContext();
393
+ const [dirty, setDirty] = useState(isDirty(name));
394
+ useEffect(()=>{
395
+ const unsubscribe = subscribeMeta(()=>{
396
+ setDirty(isDirty(name));
397
+ });
398
+ return unsubscribe;
399
+ }, [
400
+ subscribeMeta,
401
+ isDirty,
402
+ name
403
+ ]);
404
+ return dirty;
405
+ };
406
+ const useFieldValue = (name)=>{
407
+ const { getFieldValue, subscribeField } = useFormContext();
408
+ const [value, setValue] = useState(()=>getFieldValue(name));
409
+ useEffect(()=>{
410
+ const unsubscribe = subscribeField(name, (nextValue)=>{
411
+ setValue(nextValue);
412
+ });
413
+ return unsubscribe;
414
+ }, [
415
+ subscribeField,
416
+ name
417
+ ]);
418
+ return value;
419
+ };
420
+ export { FormProvider, useFieldError, useFieldValue, useFormContext, useFormMeta, useFormStore, useIsDirty, useSystemPath };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ import { type ReactNode } from 'react';
9
+ import type { CollectionAdminConfig, Field, WorkflowStatus } from '@byline/core';
10
+ import type { UseNavigationGuard } from './navigation-guard';
11
+ /** Metadata about a previously published version that is still live. */
12
+ export interface PublishedVersionInfo {
13
+ id: string;
14
+ versionId: string;
15
+ status: string;
16
+ createdAt: string | Date;
17
+ updatedAt: string | Date;
18
+ }
19
+ /** Props shared by both the public FormRenderer and its internal FormContent component. */
20
+ export interface FormRendererProps {
21
+ mode: 'create' | 'edit';
22
+ fields: Field[];
23
+ onSubmit: (data: any) => void;
24
+ onCancel: () => void;
25
+ onStatusChange?: (nextStatus: string) => Promise<void>;
26
+ onUnpublish?: () => Promise<void>;
27
+ onDelete?: () => Promise<void>;
28
+ nextStatus?: WorkflowStatus;
29
+ workflowStatuses?: WorkflowStatus[];
30
+ publishedVersion?: PublishedVersionInfo | null;
31
+ initialData?: Record<string, any>;
32
+ adminConfig?: CollectionAdminConfig;
33
+ /**
34
+ * Name of the schema field to render as the live form heading.
35
+ * Sourced from `CollectionDefinition.useAsTitle` by the caller.
36
+ */
37
+ useAsTitle?: string;
38
+ /**
39
+ * Name of the schema field that initialises the system path.
40
+ * Sourced from `CollectionDefinition.useAsPath` by the caller. When
41
+ * present the path widget renders in the sidebar.
42
+ */
43
+ useAsPath?: string;
44
+ headingLabel?: string;
45
+ headerSlot?: ReactNode;
46
+ /** Collection path forwarded to upload-capable fields (e.g. `'media'`). */
47
+ collectionPath?: string;
48
+ /** The active content locale — initialised from the route query string. */
49
+ initialLocale?: string;
50
+ /** Called when the user picks a different content locale. */
51
+ onLocaleChange?: (locale: string) => void;
52
+ /**
53
+ * Default content locale used when no `initialLocale` is supplied and as the
54
+ * fallback inside `PathWidget`. Hosts typically pass their app-wide
55
+ * `i18n.content.defaultLocale`. Defaults to `'en'`.
56
+ */
57
+ defaultLocale?: string;
58
+ /**
59
+ * Framework-specific navigation guard hook.
60
+ * When provided, this overrides the adapter from `NavigationGuardProvider` context.
61
+ * If neither is set, a no-op `beforeunload`-only guard is used.
62
+ */
63
+ useNavigationGuard?: UseNavigationGuard;
64
+ }
65
+ export declare const FormRenderer: ({ mode, fields, onSubmit, onCancel, onStatusChange, onUnpublish, onDelete, nextStatus, workflowStatuses, publishedVersion, initialData, adminConfig, useAsTitle, useAsPath, headingLabel, headerSlot, collectionPath, initialLocale, onLocaleChange, defaultLocale, useNavigationGuard, }: FormRendererProps) => import("react").JSX.Element;
66
+ //# sourceMappingURL=form-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-renderer.d.ts","sourceRoot":"","sources":["../../src/forms/form-renderer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAEzF,OAAO,KAAK,EACV,qBAAqB,EACrB,KAAK,EAIL,cAAc,EACf,MAAM,cAAc,CAAA;AAgBrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,2FAA2F;AAC3F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAA;IACnC,gBAAgB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,qBAAqB,CAAA;IACnC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;AA2nBD,eAAO,MAAM,YAAY,GAAI,2RAsB1B,iBAAiB,gCAuCnB,CAAA"}