katecms 0.0.0-stage → 1.0.0-beta.1

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 (552) hide show
  1. package/README.md +5 -3
  2. package/dist/module.d.mts +93 -0
  3. package/dist/module.json +9 -0
  4. package/dist/module.mjs +579 -0
  5. package/dist/runtime/assets/img/katecms-logo.svg +17 -0
  6. package/dist/runtime/composables/getCollection.d.ts +62 -0
  7. package/dist/runtime/composables/getCollection.js +167 -0
  8. package/dist/runtime/composables/getOptions.d.ts +22 -0
  9. package/dist/runtime/composables/getOptions.js +22 -0
  10. package/dist/runtime/composables/getQueryCollection.d.ts +95 -0
  11. package/dist/runtime/composables/getQueryCollection.js +199 -0
  12. package/dist/runtime/composables/getTerms.d.ts +79 -0
  13. package/dist/runtime/composables/getTerms.js +148 -0
  14. package/dist/runtime/composables/useAuth.d.ts +14 -0
  15. package/dist/runtime/composables/useAuth.js +33 -0
  16. package/dist/runtime/composables/useAuthCooldown.d.ts +6 -0
  17. package/dist/runtime/composables/useAuthCooldown.js +44 -0
  18. package/dist/runtime/composables/useCmsPaths.d.ts +15 -0
  19. package/dist/runtime/composables/useCmsPaths.js +21 -0
  20. package/dist/runtime/composables/useKateCmsExtensions.d.ts +49 -0
  21. package/dist/runtime/composables/useKateCmsExtensions.js +29 -0
  22. package/dist/runtime/composables/useMediaLibrary.d.ts +84 -0
  23. package/dist/runtime/composables/useMediaLibrary.js +140 -0
  24. package/dist/runtime/composables/useMenuAccess.d.ts +8 -0
  25. package/dist/runtime/composables/useMenuAccess.js +16 -0
  26. package/dist/runtime/internal/admin/AdminHeader.d.vue.ts +24 -0
  27. package/dist/runtime/internal/admin/AdminHeader.vue +91 -0
  28. package/dist/runtime/internal/admin/AdminHeader.vue.d.ts +24 -0
  29. package/dist/runtime/internal/admin/AppMenu.d.vue.ts +3 -0
  30. package/dist/runtime/internal/admin/AppMenu.vue +244 -0
  31. package/dist/runtime/internal/admin/AppMenu.vue.d.ts +3 -0
  32. package/dist/runtime/internal/admin/AppUser.d.vue.ts +3 -0
  33. package/dist/runtime/internal/admin/AppUser.vue +227 -0
  34. package/dist/runtime/internal/admin/AppUser.vue.d.ts +3 -0
  35. package/dist/runtime/internal/admin/CollectionEntryForm.d.vue.ts +41 -0
  36. package/dist/runtime/internal/admin/CollectionEntryForm.vue +916 -0
  37. package/dist/runtime/internal/admin/CollectionEntryForm.vue.d.ts +41 -0
  38. package/dist/runtime/internal/admin/ConfirmDialog.d.vue.ts +28 -0
  39. package/dist/runtime/internal/admin/ConfirmDialog.vue +136 -0
  40. package/dist/runtime/internal/admin/ConfirmDialog.vue.d.ts +28 -0
  41. package/dist/runtime/internal/admin/DictionaryTermForm.d.vue.ts +33 -0
  42. package/dist/runtime/internal/admin/DictionaryTermForm.vue +328 -0
  43. package/dist/runtime/internal/admin/DictionaryTermForm.vue.d.ts +33 -0
  44. package/dist/runtime/internal/admin/EntryRevisions.d.vue.ts +15 -0
  45. package/dist/runtime/internal/admin/EntryRevisions.vue +125 -0
  46. package/dist/runtime/internal/admin/EntryRevisions.vue.d.ts +15 -0
  47. package/dist/runtime/internal/admin/MediaLibraryFilters.d.vue.ts +16 -0
  48. package/dist/runtime/internal/admin/MediaLibraryFilters.vue +153 -0
  49. package/dist/runtime/internal/admin/MediaLibraryFilters.vue.d.ts +16 -0
  50. package/dist/runtime/internal/admin/MediaLibraryModal.d.vue.ts +65 -0
  51. package/dist/runtime/internal/admin/MediaLibraryModal.vue +451 -0
  52. package/dist/runtime/internal/admin/MediaLibraryModal.vue.d.ts +65 -0
  53. package/dist/runtime/internal/admin/OptionPageForm.d.vue.ts +26 -0
  54. package/dist/runtime/internal/admin/OptionPageForm.vue +222 -0
  55. package/dist/runtime/internal/admin/OptionPageForm.vue.d.ts +26 -0
  56. package/dist/runtime/internal/admin/UserAvatarField.d.vue.ts +12 -0
  57. package/dist/runtime/internal/admin/UserAvatarField.vue +305 -0
  58. package/dist/runtime/internal/admin/UserAvatarField.vue.d.ts +12 -0
  59. package/dist/runtime/internal/fields/AccordionField.d.vue.ts +0 -0
  60. package/dist/runtime/internal/fields/AccordionField.vue +220 -0
  61. package/dist/runtime/internal/fields/AccordionField.vue.d.ts +0 -0
  62. package/dist/runtime/internal/fields/ButtonGroupField.d.vue.ts +0 -0
  63. package/dist/runtime/internal/fields/ButtonGroupField.vue +109 -0
  64. package/dist/runtime/internal/fields/ButtonGroupField.vue.d.ts +0 -0
  65. package/dist/runtime/internal/fields/CheckboxField.d.vue.ts +0 -0
  66. package/dist/runtime/internal/fields/CheckboxField.vue +190 -0
  67. package/dist/runtime/internal/fields/CheckboxField.vue.d.ts +0 -0
  68. package/dist/runtime/internal/fields/ColorPickerField.d.vue.ts +0 -0
  69. package/dist/runtime/internal/fields/ColorPickerField.vue +791 -0
  70. package/dist/runtime/internal/fields/ColorPickerField.vue.d.ts +0 -0
  71. package/dist/runtime/internal/fields/DatePickerField.d.vue.ts +0 -0
  72. package/dist/runtime/internal/fields/DatePickerField.vue +26 -0
  73. package/dist/runtime/internal/fields/DatePickerField.vue.d.ts +0 -0
  74. package/dist/runtime/internal/fields/DateTimePickerField.d.vue.ts +0 -0
  75. package/dist/runtime/internal/fields/DateTimePickerField.vue +26 -0
  76. package/dist/runtime/internal/fields/DateTimePickerField.vue.d.ts +0 -0
  77. package/dist/runtime/internal/fields/DictionaryField.d.vue.ts +0 -0
  78. package/dist/runtime/internal/fields/DictionaryField.vue +345 -0
  79. package/dist/runtime/internal/fields/DictionaryField.vue.d.ts +0 -0
  80. package/dist/runtime/internal/fields/EmailField.d.vue.ts +0 -0
  81. package/dist/runtime/internal/fields/EmailField.vue +21 -0
  82. package/dist/runtime/internal/fields/EmailField.vue.d.ts +0 -0
  83. package/dist/runtime/internal/fields/FileField.d.vue.ts +0 -0
  84. package/dist/runtime/internal/fields/FileField.vue +408 -0
  85. package/dist/runtime/internal/fields/FileField.vue.d.ts +0 -0
  86. package/dist/runtime/internal/fields/FlexibleContentField.d.vue.ts +0 -0
  87. package/dist/runtime/internal/fields/FlexibleContentField.vue +1114 -0
  88. package/dist/runtime/internal/fields/FlexibleContentField.vue.d.ts +0 -0
  89. package/dist/runtime/internal/fields/GalleryField.d.vue.ts +0 -0
  90. package/dist/runtime/internal/fields/GalleryField.vue +584 -0
  91. package/dist/runtime/internal/fields/GalleryField.vue.d.ts +0 -0
  92. package/dist/runtime/internal/fields/GroupField.d.vue.ts +0 -0
  93. package/dist/runtime/internal/fields/GroupField.vue +111 -0
  94. package/dist/runtime/internal/fields/GroupField.vue.d.ts +0 -0
  95. package/dist/runtime/internal/fields/ImageField.d.vue.ts +0 -0
  96. package/dist/runtime/internal/fields/ImageField.vue +638 -0
  97. package/dist/runtime/internal/fields/ImageField.vue.d.ts +0 -0
  98. package/dist/runtime/internal/fields/ImageSelectField.d.vue.ts +0 -0
  99. package/dist/runtime/internal/fields/ImageSelectField.vue +179 -0
  100. package/dist/runtime/internal/fields/ImageSelectField.vue.d.ts +0 -0
  101. package/dist/runtime/internal/fields/LinkField.d.vue.ts +0 -0
  102. package/dist/runtime/internal/fields/LinkField.vue +303 -0
  103. package/dist/runtime/internal/fields/LinkField.vue.d.ts +0 -0
  104. package/dist/runtime/internal/fields/NumberField.d.vue.ts +0 -0
  105. package/dist/runtime/internal/fields/NumberField.vue +25 -0
  106. package/dist/runtime/internal/fields/NumberField.vue.d.ts +0 -0
  107. package/dist/runtime/internal/fields/OembedField.d.vue.ts +0 -0
  108. package/dist/runtime/internal/fields/OembedField.vue +161 -0
  109. package/dist/runtime/internal/fields/OembedField.vue.d.ts +0 -0
  110. package/dist/runtime/internal/fields/OpenStreetMapField.d.vue.ts +0 -0
  111. package/dist/runtime/internal/fields/OpenStreetMapField.vue +1502 -0
  112. package/dist/runtime/internal/fields/OpenStreetMapField.vue.d.ts +0 -0
  113. package/dist/runtime/internal/fields/PageLinkField.d.vue.ts +0 -0
  114. package/dist/runtime/internal/fields/PageLinkField.vue +153 -0
  115. package/dist/runtime/internal/fields/PageLinkField.vue.d.ts +0 -0
  116. package/dist/runtime/internal/fields/PasswordField.d.vue.ts +0 -0
  117. package/dist/runtime/internal/fields/PasswordField.vue +108 -0
  118. package/dist/runtime/internal/fields/PasswordField.vue.d.ts +0 -0
  119. package/dist/runtime/internal/fields/PostObjectField.d.vue.ts +0 -0
  120. package/dist/runtime/internal/fields/PostObjectField.vue +151 -0
  121. package/dist/runtime/internal/fields/PostObjectField.vue.d.ts +0 -0
  122. package/dist/runtime/internal/fields/RadioField.d.vue.ts +0 -0
  123. package/dist/runtime/internal/fields/RadioField.vue +163 -0
  124. package/dist/runtime/internal/fields/RadioField.vue.d.ts +0 -0
  125. package/dist/runtime/internal/fields/RangeField.d.vue.ts +0 -0
  126. package/dist/runtime/internal/fields/RangeField.vue +48 -0
  127. package/dist/runtime/internal/fields/RangeField.vue.d.ts +0 -0
  128. package/dist/runtime/internal/fields/RelationshipField.d.vue.ts +0 -0
  129. package/dist/runtime/internal/fields/RelationshipField.vue +525 -0
  130. package/dist/runtime/internal/fields/RelationshipField.vue.d.ts +0 -0
  131. package/dist/runtime/internal/fields/RepeaterField.d.vue.ts +0 -0
  132. package/dist/runtime/internal/fields/RepeaterField.vue +856 -0
  133. package/dist/runtime/internal/fields/RepeaterField.vue.d.ts +0 -0
  134. package/dist/runtime/internal/fields/SelectField.d.vue.ts +21 -0
  135. package/dist/runtime/internal/fields/SelectField.vue +101 -0
  136. package/dist/runtime/internal/fields/SelectField.vue.d.ts +21 -0
  137. package/dist/runtime/internal/fields/SeparatorField.d.vue.ts +0 -0
  138. package/dist/runtime/internal/fields/SeparatorField.vue +63 -0
  139. package/dist/runtime/internal/fields/SeparatorField.vue.d.ts +0 -0
  140. package/dist/runtime/internal/fields/TabField.d.vue.ts +0 -0
  141. package/dist/runtime/internal/fields/TabField.vue +210 -0
  142. package/dist/runtime/internal/fields/TabField.vue.d.ts +0 -0
  143. package/dist/runtime/internal/fields/TextField.d.vue.ts +0 -0
  144. package/dist/runtime/internal/fields/TextField.vue +22 -0
  145. package/dist/runtime/internal/fields/TextField.vue.d.ts +0 -0
  146. package/dist/runtime/internal/fields/TextareaField.d.vue.ts +0 -0
  147. package/dist/runtime/internal/fields/TextareaField.vue +62 -0
  148. package/dist/runtime/internal/fields/TextareaField.vue.d.ts +0 -0
  149. package/dist/runtime/internal/fields/TimePickerField.d.vue.ts +0 -0
  150. package/dist/runtime/internal/fields/TimePickerField.vue +24 -0
  151. package/dist/runtime/internal/fields/TimePickerField.vue.d.ts +0 -0
  152. package/dist/runtime/internal/fields/TrueFalseField.d.vue.ts +0 -0
  153. package/dist/runtime/internal/fields/TrueFalseField.vue +151 -0
  154. package/dist/runtime/internal/fields/TrueFalseField.vue.d.ts +0 -0
  155. package/dist/runtime/internal/fields/UrlField.d.vue.ts +0 -0
  156. package/dist/runtime/internal/fields/UrlField.vue +21 -0
  157. package/dist/runtime/internal/fields/UrlField.vue.d.ts +0 -0
  158. package/dist/runtime/internal/fields/UserField.d.vue.ts +0 -0
  159. package/dist/runtime/internal/fields/UserField.vue +164 -0
  160. package/dist/runtime/internal/fields/UserField.vue.d.ts +0 -0
  161. package/dist/runtime/internal/fields/WysiwygField.d.vue.ts +0 -0
  162. package/dist/runtime/internal/fields/WysiwygField.vue +971 -0
  163. package/dist/runtime/internal/fields/WysiwygField.vue.d.ts +0 -0
  164. package/dist/runtime/internal/parts/DateTimeControl.d.vue.ts +90 -0
  165. package/dist/runtime/internal/parts/DateTimeControl.vue +568 -0
  166. package/dist/runtime/internal/parts/DateTimeControl.vue.d.ts +90 -0
  167. package/dist/runtime/internal/parts/FieldAddon.d.vue.ts +0 -0
  168. package/dist/runtime/internal/parts/FieldAddon.vue +43 -0
  169. package/dist/runtime/internal/parts/FieldAddon.vue.d.ts +0 -0
  170. package/dist/runtime/internal/parts/FieldInstructions.d.vue.ts +0 -0
  171. package/dist/runtime/internal/parts/FieldInstructions.vue +24 -0
  172. package/dist/runtime/internal/parts/FieldInstructions.vue.d.ts +0 -0
  173. package/dist/runtime/internal/parts/FieldLabel.d.vue.ts +0 -0
  174. package/dist/runtime/internal/parts/FieldLabel.vue +40 -0
  175. package/dist/runtime/internal/parts/FieldLabel.vue.d.ts +0 -0
  176. package/dist/runtime/internal/parts/FieldWrapper.d.vue.ts +0 -0
  177. package/dist/runtime/internal/parts/FieldWrapper.vue +47 -0
  178. package/dist/runtime/internal/parts/FieldWrapper.vue.d.ts +0 -0
  179. package/dist/runtime/internal/parts/ImageCropper.d.vue.ts +17 -0
  180. package/dist/runtime/internal/parts/ImageCropper.vue +363 -0
  181. package/dist/runtime/internal/parts/ImageCropper.vue.d.ts +17 -0
  182. package/dist/runtime/internal/parts/InputControl.d.vue.ts +0 -0
  183. package/dist/runtime/internal/parts/InputControl.vue +163 -0
  184. package/dist/runtime/internal/parts/InputControl.vue.d.ts +0 -0
  185. package/dist/runtime/internal/ui/UiButton.d.vue.ts +35 -0
  186. package/dist/runtime/internal/ui/UiButton.vue +204 -0
  187. package/dist/runtime/internal/ui/UiButton.vue.d.ts +35 -0
  188. package/dist/runtime/internal/ui/UiNotice.d.vue.ts +40 -0
  189. package/dist/runtime/internal/ui/UiNotice.vue +253 -0
  190. package/dist/runtime/internal/ui/UiNotice.vue.d.ts +40 -0
  191. package/dist/runtime/internal/ui/UiSelect.d.vue.ts +61 -0
  192. package/dist/runtime/internal/ui/UiSelect.vue +1212 -0
  193. package/dist/runtime/internal/ui/UiSelect.vue.d.ts +61 -0
  194. package/dist/runtime/middleware/auth-guard.d.ts +9 -0
  195. package/dist/runtime/middleware/auth-guard.js +37 -0
  196. package/dist/runtime/pages/admin/collections/[id].d.vue.ts +3 -0
  197. package/dist/runtime/pages/admin/collections/[id].vue +423 -0
  198. package/dist/runtime/pages/admin/collections/[id].vue.d.ts +3 -0
  199. package/dist/runtime/pages/admin/collections/create.d.vue.ts +3 -0
  200. package/dist/runtime/pages/admin/collections/create.vue +179 -0
  201. package/dist/runtime/pages/admin/collections/create.vue.d.ts +3 -0
  202. package/dist/runtime/pages/admin/collections/index.d.vue.ts +3 -0
  203. package/dist/runtime/pages/admin/collections/index.vue +828 -0
  204. package/dist/runtime/pages/admin/collections/index.vue.d.ts +3 -0
  205. package/dist/runtime/pages/admin/demo-fields.d.vue.ts +3 -0
  206. package/dist/runtime/pages/admin/demo-fields.vue +1327 -0
  207. package/dist/runtime/pages/admin/demo-fields.vue.d.ts +3 -0
  208. package/dist/runtime/pages/admin/dictionaries/[id].d.vue.ts +3 -0
  209. package/dist/runtime/pages/admin/dictionaries/[id].vue +213 -0
  210. package/dist/runtime/pages/admin/dictionaries/[id].vue.d.ts +3 -0
  211. package/dist/runtime/pages/admin/dictionaries/index.d.vue.ts +3 -0
  212. package/dist/runtime/pages/admin/dictionaries/index.vue +387 -0
  213. package/dist/runtime/pages/admin/dictionaries/index.vue.d.ts +3 -0
  214. package/dist/runtime/pages/admin/index.d.vue.ts +3 -0
  215. package/dist/runtime/pages/admin/index.vue +138 -0
  216. package/dist/runtime/pages/admin/index.vue.d.ts +3 -0
  217. package/dist/runtime/pages/admin/login.d.vue.ts +3 -0
  218. package/dist/runtime/pages/admin/login.vue +373 -0
  219. package/dist/runtime/pages/admin/login.vue.d.ts +3 -0
  220. package/dist/runtime/pages/admin/media.d.vue.ts +3 -0
  221. package/dist/runtime/pages/admin/media.vue +1054 -0
  222. package/dist/runtime/pages/admin/media.vue.d.ts +3 -0
  223. package/dist/runtime/pages/admin/options/[page].d.vue.ts +3 -0
  224. package/dist/runtime/pages/admin/options/[page].vue +151 -0
  225. package/dist/runtime/pages/admin/options/[page].vue.d.ts +3 -0
  226. package/dist/runtime/pages/admin/register.d.vue.ts +3 -0
  227. package/dist/runtime/pages/admin/register.vue +391 -0
  228. package/dist/runtime/pages/admin/register.vue.d.ts +3 -0
  229. package/dist/runtime/pages/admin/users/[id].d.vue.ts +3 -0
  230. package/dist/runtime/pages/admin/users/[id].vue +337 -0
  231. package/dist/runtime/pages/admin/users/[id].vue.d.ts +3 -0
  232. package/dist/runtime/pages/admin/users/create.d.vue.ts +3 -0
  233. package/dist/runtime/pages/admin/users/create.vue +201 -0
  234. package/dist/runtime/pages/admin/users/create.vue.d.ts +3 -0
  235. package/dist/runtime/pages/admin/users/index.d.vue.ts +3 -0
  236. package/dist/runtime/pages/admin/users/index.vue +329 -0
  237. package/dist/runtime/pages/admin/users/index.vue.d.ts +3 -0
  238. package/dist/runtime/pages/index.d.vue.ts +3 -0
  239. package/dist/runtime/pages/index.vue +399 -0
  240. package/dist/runtime/pages/index.vue.d.ts +3 -0
  241. package/dist/runtime/server/api/_katecms/auth/login.post.d.ts +5 -0
  242. package/dist/runtime/server/api/_katecms/auth/login.post.js +44 -0
  243. package/dist/runtime/server/api/_katecms/auth/logout.post.d.ts +4 -0
  244. package/dist/runtime/server/api/_katecms/auth/logout.post.js +6 -0
  245. package/dist/runtime/server/api/_katecms/auth/register.post.d.ts +19 -0
  246. package/dist/runtime/server/api/_katecms/auth/register.post.js +83 -0
  247. package/dist/runtime/server/api/_katecms/auth/state.get.d.ts +9 -0
  248. package/dist/runtime/server/api/_katecms/auth/state.get.js +12 -0
  249. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].delete.d.ts +15 -0
  250. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].delete.js +59 -0
  251. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].get.d.ts +4 -0
  252. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].get.js +50 -0
  253. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].patch.d.ts +4 -0
  254. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].patch.js +130 -0
  255. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions/[revisionId].post.d.ts +4 -0
  256. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions/[revisionId].post.js +123 -0
  257. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions.get.d.ts +6 -0
  258. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions.get.js +31 -0
  259. package/dist/runtime/server/api/_katecms/collections/[collection].get.d.ts +8 -0
  260. package/dist/runtime/server/api/_katecms/collections/[collection].get.js +135 -0
  261. package/dist/runtime/server/api/_katecms/collections/[collection].post.d.ts +4 -0
  262. package/dist/runtime/server/api/_katecms/collections/[collection].post.js +91 -0
  263. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].delete.d.ts +7 -0
  264. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].delete.js +31 -0
  265. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].get.d.ts +4 -0
  266. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].get.js +45 -0
  267. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].patch.d.ts +4 -0
  268. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].patch.js +83 -0
  269. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].get.d.ts +4 -0
  270. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].get.js +38 -0
  271. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].post.d.ts +4 -0
  272. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].post.js +64 -0
  273. package/dist/runtime/server/api/_katecms/media/[id]/regenerate.post.d.ts +8 -0
  274. package/dist/runtime/server/api/_katecms/media/[id]/regenerate.post.js +30 -0
  275. package/dist/runtime/server/api/_katecms/media/[id].delete.d.ts +7 -0
  276. package/dist/runtime/server/api/_katecms/media/[id].delete.js +22 -0
  277. package/dist/runtime/server/api/_katecms/media/[id].get.d.ts +9 -0
  278. package/dist/runtime/server/api/_katecms/media/[id].get.js +17 -0
  279. package/dist/runtime/server/api/_katecms/media/[id].patch.d.ts +6 -0
  280. package/dist/runtime/server/api/_katecms/media/[id].patch.js +48 -0
  281. package/dist/runtime/server/api/_katecms/media/index.get.d.ts +5 -0
  282. package/dist/runtime/server/api/_katecms/media/index.get.js +75 -0
  283. package/dist/runtime/server/api/_katecms/media/index.post.d.ts +9 -0
  284. package/dist/runtime/server/api/_katecms/media/index.post.js +84 -0
  285. package/dist/runtime/server/api/_katecms/media/regenerate.post.d.ts +7 -0
  286. package/dist/runtime/server/api/_katecms/media/regenerate.post.js +30 -0
  287. package/dist/runtime/server/api/_katecms/menu.get.d.ts +8 -0
  288. package/dist/runtime/server/api/_katecms/menu.get.js +14 -0
  289. package/dist/runtime/server/api/_katecms/oembed.get.d.ts +2 -0
  290. package/dist/runtime/server/api/_katecms/oembed.get.js +53 -0
  291. package/dist/runtime/server/api/_katecms/options/[page].get.d.ts +7 -0
  292. package/dist/runtime/server/api/_katecms/options/[page].get.js +28 -0
  293. package/dist/runtime/server/api/_katecms/options/[page].patch.d.ts +4 -0
  294. package/dist/runtime/server/api/_katecms/options/[page].patch.js +36 -0
  295. package/dist/runtime/server/api/_katecms/query.get.d.ts +24 -0
  296. package/dist/runtime/server/api/_katecms/query.get.js +270 -0
  297. package/dist/runtime/server/api/_katecms/relation/entries.get.d.ts +17 -0
  298. package/dist/runtime/server/api/_katecms/relation/entries.get.js +74 -0
  299. package/dist/runtime/server/api/_katecms/relation/terms.get.d.ts +17 -0
  300. package/dist/runtime/server/api/_katecms/relation/terms.get.js +51 -0
  301. package/dist/runtime/server/api/_katecms/resolve.get.d.ts +17 -0
  302. package/dist/runtime/server/api/_katecms/resolve.get.js +116 -0
  303. package/dist/runtime/server/api/_katecms/terms.get.d.ts +20 -0
  304. package/dist/runtime/server/api/_katecms/terms.get.js +201 -0
  305. package/dist/runtime/server/api/_katecms/users/[id].delete.d.ts +11 -0
  306. package/dist/runtime/server/api/_katecms/users/[id].delete.js +45 -0
  307. package/dist/runtime/server/api/_katecms/users/[id].patch.d.ts +19 -0
  308. package/dist/runtime/server/api/_katecms/users/[id].patch.js +129 -0
  309. package/dist/runtime/server/api/_katecms/users.get.d.ts +10 -0
  310. package/dist/runtime/server/api/_katecms/users.get.js +34 -0
  311. package/dist/runtime/server/api/_katecms/users.post.d.ts +10 -0
  312. package/dist/runtime/server/api/_katecms/users.post.js +62 -0
  313. package/dist/runtime/server/api/uploads/[...key].get.d.ts +3 -0
  314. package/dist/runtime/server/api/uploads/[...key].get.js +28 -0
  315. package/dist/runtime/server/kit.d.ts +5 -0
  316. package/dist/runtime/server/kit.js +5 -0
  317. package/dist/runtime/server/middleware/admin-headers.d.ts +3 -0
  318. package/dist/runtime/server/middleware/admin-headers.js +12 -0
  319. package/dist/runtime/server/plugins/auto-migrate.d.ts +2 -0
  320. package/dist/runtime/server/plugins/auto-migrate.js +45 -0
  321. package/dist/runtime/server/tsconfig.json +3 -0
  322. package/dist/runtime/server/utils/auth-attempts.d.ts +22 -0
  323. package/dist/runtime/server/utils/auth-attempts.js +42 -0
  324. package/dist/runtime/server/utils/auth-rate-limit.d.ts +11 -0
  325. package/dist/runtime/server/utils/auth-rate-limit.js +36 -0
  326. package/dist/runtime/server/utils/client-address.d.ts +16 -0
  327. package/dist/runtime/server/utils/client-address.js +23 -0
  328. package/dist/runtime/server/utils/collections.d.ts +42 -0
  329. package/dist/runtime/server/utils/collections.js +300 -0
  330. package/dist/runtime/server/utils/db.d.ts +3 -0
  331. package/dist/runtime/server/utils/db.js +25 -0
  332. package/dist/runtime/server/utils/dictionaries.d.ts +53 -0
  333. package/dist/runtime/server/utils/dictionaries.js +301 -0
  334. package/dist/runtime/server/utils/media-list.d.ts +18 -0
  335. package/dist/runtime/server/utils/media-list.js +84 -0
  336. package/dist/runtime/server/utils/media.d.ts +12 -0
  337. package/dist/runtime/server/utils/media.js +77 -0
  338. package/dist/runtime/server/utils/oembed-fetch.d.ts +4 -0
  339. package/dist/runtime/server/utils/oembed-fetch.js +142 -0
  340. package/dist/runtime/server/utils/options.d.ts +17 -0
  341. package/dist/runtime/server/utils/options.js +66 -0
  342. package/dist/runtime/server/utils/permissions.d.ts +13 -0
  343. package/dist/runtime/server/utils/permissions.js +20 -0
  344. package/dist/runtime/server/utils/public-fields-query.d.ts +6 -0
  345. package/dist/runtime/server/utils/public-fields-query.js +8 -0
  346. package/dist/runtime/server/utils/public-term.d.ts +8 -0
  347. package/dist/runtime/server/utils/public-term.js +80 -0
  348. package/dist/runtime/server/utils/regenerate.d.ts +12 -0
  349. package/dist/runtime/server/utils/regenerate.js +40 -0
  350. package/dist/runtime/server/utils/relation.d.ts +18 -0
  351. package/dist/runtime/server/utils/relation.js +77 -0
  352. package/dist/runtime/server/utils/request-address.d.ts +6 -0
  353. package/dist/runtime/server/utils/request-address.js +10 -0
  354. package/dist/runtime/server/utils/revisions.d.ts +20 -0
  355. package/dist/runtime/server/utils/revisions.js +172 -0
  356. package/dist/runtime/server/utils/session.d.ts +18 -0
  357. package/dist/runtime/server/utils/session.js +71 -0
  358. package/dist/runtime/server/utils/upload-headers.d.ts +2 -0
  359. package/dist/runtime/server/utils/upload-headers.js +30 -0
  360. package/dist/runtime/server/utils/users.d.ts +13 -0
  361. package/dist/runtime/server/utils/users.js +47 -0
  362. package/dist/runtime/utils/admin-users.d.ts +20 -0
  363. package/dist/runtime/utils/admin-users.js +19 -0
  364. package/dist/runtime/utils/auth-error.d.ts +6 -0
  365. package/dist/runtime/utils/auth-error.js +11 -0
  366. package/dist/runtime/utils/cms-paths.d.ts +5 -0
  367. package/dist/runtime/utils/cms-paths.js +13 -0
  368. package/dist/runtime/utils/collections.d.ts +176 -0
  369. package/dist/runtime/utils/collections.js +30 -0
  370. package/dist/runtime/utils/dictionaries.d.ts +65 -0
  371. package/dist/runtime/utils/dictionaries.js +14 -0
  372. package/dist/runtime/utils/field-errors.d.ts +4 -0
  373. package/dist/runtime/utils/field-errors.js +9 -0
  374. package/dist/runtime/utils/field-values.d.ts +19 -0
  375. package/dist/runtime/utils/field-values.js +82 -0
  376. package/dist/runtime/utils/helpers.d.ts +4 -0
  377. package/dist/runtime/utils/helpers.js +20 -0
  378. package/dist/runtime/utils/media-library-query.d.ts +54 -0
  379. package/dist/runtime/utils/media-library-query.js +190 -0
  380. package/dist/runtime/utils/options.d.ts +19 -0
  381. package/dist/runtime/utils/options.js +3 -0
  382. package/dist/runtime/utils/preview.d.ts +22 -0
  383. package/dist/runtime/utils/preview.js +33 -0
  384. package/dist/runtime/utils/relation.d.ts +33 -0
  385. package/dist/runtime/utils/relation.js +23 -0
  386. package/dist/runtime/utils/slugify.d.ts +2 -0
  387. package/dist/runtime/utils/slugify.js +4 -0
  388. package/dist/types.d.mts +7 -0
  389. package/package.json +84 -3
  390. package/src/admin-components.ts +124 -0
  391. package/src/module.ts +592 -0
  392. package/src/runtime/assets/img/katecms-logo.svg +17 -0
  393. package/src/runtime/assets/styles/_functions.scss +70 -0
  394. package/src/runtime/assets/styles/_index.scss +3 -0
  395. package/src/runtime/assets/styles/_mixins.scss +256 -0
  396. package/src/runtime/assets/styles/_variables.scss +35 -0
  397. package/src/runtime/composables/getCollection.ts +253 -0
  398. package/src/runtime/composables/getOptions.ts +42 -0
  399. package/src/runtime/composables/getQueryCollection.ts +325 -0
  400. package/src/runtime/composables/getTerms.ts +231 -0
  401. package/src/runtime/composables/useAuth.ts +43 -0
  402. package/src/runtime/composables/useAuthCooldown.ts +52 -0
  403. package/src/runtime/composables/useCmsPaths.ts +24 -0
  404. package/src/runtime/composables/useKateCmsExtensions.ts +81 -0
  405. package/src/runtime/composables/useMediaLibrary.ts +168 -0
  406. package/src/runtime/composables/useMenuAccess.ts +25 -0
  407. package/src/runtime/internal/admin/AdminHeader.vue +106 -0
  408. package/src/runtime/internal/admin/AppMenu.vue +290 -0
  409. package/src/runtime/internal/admin/AppUser.vue +260 -0
  410. package/src/runtime/internal/admin/CollectionEntryForm.vue +1044 -0
  411. package/src/runtime/internal/admin/ConfirmDialog.vue +164 -0
  412. package/src/runtime/internal/admin/DictionaryTermForm.vue +400 -0
  413. package/src/runtime/internal/admin/EntryRevisions.vue +145 -0
  414. package/src/runtime/internal/admin/MediaLibraryFilters.vue +186 -0
  415. package/src/runtime/internal/admin/MediaLibraryModal.vue +526 -0
  416. package/src/runtime/internal/admin/OptionPageForm.vue +277 -0
  417. package/src/runtime/internal/admin/UserAvatarField.vue +337 -0
  418. package/src/runtime/internal/fields/AccordionField.vue +258 -0
  419. package/src/runtime/internal/fields/ButtonGroupField.vue +144 -0
  420. package/src/runtime/internal/fields/CheckboxField.vue +228 -0
  421. package/src/runtime/internal/fields/ColorPickerField.vue +926 -0
  422. package/src/runtime/internal/fields/DatePickerField.vue +33 -0
  423. package/src/runtime/internal/fields/DateTimePickerField.vue +33 -0
  424. package/src/runtime/internal/fields/DictionaryField.vue +403 -0
  425. package/src/runtime/internal/fields/EmailField.vue +28 -0
  426. package/src/runtime/internal/fields/FileField.vue +480 -0
  427. package/src/runtime/internal/fields/FlexibleContentField.vue +1296 -0
  428. package/src/runtime/internal/fields/GalleryField.vue +677 -0
  429. package/src/runtime/internal/fields/GroupField.vue +136 -0
  430. package/src/runtime/internal/fields/ImageField.vue +730 -0
  431. package/src/runtime/internal/fields/ImageSelectField.vue +213 -0
  432. package/src/runtime/internal/fields/LinkField.vue +338 -0
  433. package/src/runtime/internal/fields/NumberField.vue +32 -0
  434. package/src/runtime/internal/fields/OembedField.vue +187 -0
  435. package/src/runtime/internal/fields/OpenStreetMapField.vue +1716 -0
  436. package/src/runtime/internal/fields/PageLinkField.vue +186 -0
  437. package/src/runtime/internal/fields/PasswordField.vue +127 -0
  438. package/src/runtime/internal/fields/PostObjectField.vue +187 -0
  439. package/src/runtime/internal/fields/RadioField.vue +195 -0
  440. package/src/runtime/internal/fields/RangeField.vue +62 -0
  441. package/src/runtime/internal/fields/RelationshipField.vue +604 -0
  442. package/src/runtime/internal/fields/RepeaterField.vue +999 -0
  443. package/src/runtime/internal/fields/SelectField.vue +118 -0
  444. package/src/runtime/internal/fields/SeparatorField.vue +77 -0
  445. package/src/runtime/internal/fields/TabField.vue +249 -0
  446. package/src/runtime/internal/fields/TextField.vue +29 -0
  447. package/src/runtime/internal/fields/TextareaField.vue +61 -0
  448. package/src/runtime/internal/fields/TimePickerField.vue +31 -0
  449. package/src/runtime/internal/fields/TrueFalseField.vue +181 -0
  450. package/src/runtime/internal/fields/UrlField.vue +28 -0
  451. package/src/runtime/internal/fields/UserField.vue +203 -0
  452. package/src/runtime/internal/fields/WysiwygField.vue +1061 -0
  453. package/src/runtime/internal/parts/DateTimeControl.vue +657 -0
  454. package/src/runtime/internal/parts/FieldAddon.vue +60 -0
  455. package/src/runtime/internal/parts/FieldInstructions.vue +38 -0
  456. package/src/runtime/internal/parts/FieldLabel.vue +56 -0
  457. package/src/runtime/internal/parts/FieldWrapper.vue +63 -0
  458. package/src/runtime/internal/parts/ImageCropper.vue +415 -0
  459. package/src/runtime/internal/parts/InputControl.vue +189 -0
  460. package/src/runtime/internal/ui/UiButton.vue +274 -0
  461. package/src/runtime/internal/ui/UiNotice.vue +302 -0
  462. package/src/runtime/internal/ui/UiSelect.vue +1420 -0
  463. package/src/runtime/middleware/auth-guard.ts +52 -0
  464. package/src/runtime/pages/admin/collections/[id].vue +486 -0
  465. package/src/runtime/pages/admin/collections/create.vue +208 -0
  466. package/src/runtime/pages/admin/collections/index.vue +955 -0
  467. package/src/runtime/pages/admin/demo-fields.vue +1354 -0
  468. package/src/runtime/pages/admin/dictionaries/[id].vue +246 -0
  469. package/src/runtime/pages/admin/dictionaries/index.vue +438 -0
  470. package/src/runtime/pages/admin/index.vue +155 -0
  471. package/src/runtime/pages/admin/login.vue +159 -0
  472. package/src/runtime/pages/admin/media.vue +1176 -0
  473. package/src/runtime/pages/admin/options/[page].vue +174 -0
  474. package/src/runtime/pages/admin/register.vue +179 -0
  475. package/src/runtime/pages/admin/users/[id].vue +382 -0
  476. package/src/runtime/pages/admin/users/create.vue +232 -0
  477. package/src/runtime/pages/admin/users/index.vue +374 -0
  478. package/src/runtime/pages/index.vue +265 -0
  479. package/src/runtime/server/api/_katecms/auth/login.post.ts +62 -0
  480. package/src/runtime/server/api/_katecms/auth/logout.post.ts +7 -0
  481. package/src/runtime/server/api/_katecms/auth/register.post.ts +112 -0
  482. package/src/runtime/server/api/_katecms/auth/state.get.ts +19 -0
  483. package/src/runtime/server/api/_katecms/collections/[collection]/[id].delete.ts +77 -0
  484. package/src/runtime/server/api/_katecms/collections/[collection]/[id].get.ts +57 -0
  485. package/src/runtime/server/api/_katecms/collections/[collection]/[id].patch.ts +157 -0
  486. package/src/runtime/server/api/_katecms/collections/[collection]/revisions/[revisionId].post.ts +133 -0
  487. package/src/runtime/server/api/_katecms/collections/[collection]/revisions.get.ts +35 -0
  488. package/src/runtime/server/api/_katecms/collections/[collection].get.ts +177 -0
  489. package/src/runtime/server/api/_katecms/collections/[collection].post.ts +111 -0
  490. package/src/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].delete.ts +37 -0
  491. package/src/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].get.ts +51 -0
  492. package/src/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].patch.ts +101 -0
  493. package/src/runtime/server/api/_katecms/dictionaries/[dictionary].get.ts +43 -0
  494. package/src/runtime/server/api/_katecms/dictionaries/[dictionary].post.ts +78 -0
  495. package/src/runtime/server/api/_katecms/media/[id]/regenerate.post.ts +39 -0
  496. package/src/runtime/server/api/_katecms/media/[id].delete.ts +28 -0
  497. package/src/runtime/server/api/_katecms/media/[id].get.ts +25 -0
  498. package/src/runtime/server/api/_katecms/media/[id].patch.ts +60 -0
  499. package/src/runtime/server/api/_katecms/media/index.get.ts +96 -0
  500. package/src/runtime/server/api/_katecms/media/index.post.ts +104 -0
  501. package/src/runtime/server/api/_katecms/media/regenerate.post.ts +38 -0
  502. package/src/runtime/server/api/_katecms/menu.get.ts +19 -0
  503. package/src/runtime/server/api/_katecms/oembed.get.ts +62 -0
  504. package/src/runtime/server/api/_katecms/options/[page].get.ts +35 -0
  505. package/src/runtime/server/api/_katecms/options/[page].patch.ts +46 -0
  506. package/src/runtime/server/api/_katecms/query.get.ts +332 -0
  507. package/src/runtime/server/api/_katecms/relation/entries.get.ts +98 -0
  508. package/src/runtime/server/api/_katecms/relation/terms.get.ts +61 -0
  509. package/src/runtime/server/api/_katecms/resolve.get.ts +148 -0
  510. package/src/runtime/server/api/_katecms/terms.get.ts +258 -0
  511. package/src/runtime/server/api/_katecms/users/[id].delete.ts +57 -0
  512. package/src/runtime/server/api/_katecms/users/[id].patch.ts +177 -0
  513. package/src/runtime/server/api/_katecms/users.get.ts +48 -0
  514. package/src/runtime/server/api/_katecms/users.post.ts +85 -0
  515. package/src/runtime/server/api/uploads/[...key].get.ts +33 -0
  516. package/src/runtime/server/kit.ts +5 -0
  517. package/src/runtime/server/middleware/admin-headers.ts +14 -0
  518. package/src/runtime/server/plugins/auto-migrate.ts +53 -0
  519. package/src/runtime/server/tsconfig.json +3 -0
  520. package/src/runtime/server/utils/auth-attempts.ts +71 -0
  521. package/src/runtime/server/utils/auth-rate-limit.ts +48 -0
  522. package/src/runtime/server/utils/client-address.ts +41 -0
  523. package/src/runtime/server/utils/collections.ts +381 -0
  524. package/src/runtime/server/utils/db.ts +36 -0
  525. package/src/runtime/server/utils/dictionaries.ts +397 -0
  526. package/src/runtime/server/utils/media-list.ts +131 -0
  527. package/src/runtime/server/utils/media.ts +94 -0
  528. package/src/runtime/server/utils/oembed-fetch.ts +157 -0
  529. package/src/runtime/server/utils/options.ts +86 -0
  530. package/src/runtime/server/utils/permissions.ts +44 -0
  531. package/src/runtime/server/utils/public-fields-query.ts +14 -0
  532. package/src/runtime/server/utils/public-term.ts +98 -0
  533. package/src/runtime/server/utils/regenerate.ts +56 -0
  534. package/src/runtime/server/utils/relation.ts +96 -0
  535. package/src/runtime/server/utils/request-address.ts +16 -0
  536. package/src/runtime/server/utils/revisions.ts +256 -0
  537. package/src/runtime/server/utils/session.ts +112 -0
  538. package/src/runtime/server/utils/upload-headers.ts +35 -0
  539. package/src/runtime/server/utils/users.ts +67 -0
  540. package/src/runtime/utils/admin-users.ts +43 -0
  541. package/src/runtime/utils/auth-error.ts +22 -0
  542. package/src/runtime/utils/cms-paths.ts +17 -0
  543. package/src/runtime/utils/collections.ts +228 -0
  544. package/src/runtime/utils/dictionaries.ts +89 -0
  545. package/src/runtime/utils/field-errors.ts +12 -0
  546. package/src/runtime/utils/field-values.ts +101 -0
  547. package/src/runtime/utils/helpers.ts +33 -0
  548. package/src/runtime/utils/media-library-query.ts +263 -0
  549. package/src/runtime/utils/options.ts +25 -0
  550. package/src/runtime/utils/preview.ts +56 -0
  551. package/src/runtime/utils/relation.ts +60 -0
  552. package/src/runtime/utils/slugify.ts +10 -0
@@ -0,0 +1,856 @@
1
+ <script setup>
2
+ import { computed, onBeforeUnmount, onMounted, ref, toRaw, watch } from "vue";
3
+ import {
4
+ createFieldDefault,
5
+ isLayoutOnlyFieldType,
6
+ isVisible,
7
+ ROW_COLLAPSED_KEY
8
+ } from "@katecms/core";
9
+ import { resolveField } from "../../utils/helpers";
10
+ const props = defineProps({
11
+ fieldKey: { type: String, required: true },
12
+ field: { type: Object, required: false, default: () => ({ type: "repeater", label: "", subFields: {} }) }
13
+ });
14
+ const model = defineModel({ type: Array, ...{ default: () => [] } });
15
+ const rootClass = "katecms-repeater-field";
16
+ const subFields = computed(() => {
17
+ const fields = props.field?.subFields ?? {};
18
+ if (!(ROW_COLLAPSED_KEY in fields)) {
19
+ return fields;
20
+ }
21
+ const { [ROW_COLLAPSED_KEY]: _conflict, ...rest } = fields;
22
+ return rest;
23
+ });
24
+ const minRows = computed(() => props.field?.min ?? 0);
25
+ const maxRows = computed(() => props.field?.max);
26
+ const buttonLabel = computed(() => props.field?.buttonLabel || "Add Row");
27
+ const collapsedKey = computed(() => resolveCollapsedKey(props.field));
28
+ const collapsible = computed(() => !!collapsedKey.value);
29
+ const rows = ref([]);
30
+ const canAdd = computed(() => maxRows.value == null || rows.value.length < maxRows.value);
31
+ const canRemove = computed(() => rows.value.length > minRows.value);
32
+ const allExpanded = computed(
33
+ () => rows.value.length > 0 && rows.value.every((row) => !isRowCollapsed(row))
34
+ );
35
+ const allCollapsed = computed(
36
+ () => rows.value.length > 0 && rows.value.every((row) => isRowCollapsed(row))
37
+ );
38
+ const showCollapseAll = computed(() => collapsible.value && rows.value.length > 0 && !allCollapsed.value);
39
+ const showExpandAll = computed(() => collapsible.value && rows.value.length > 0 && !allExpanded.value);
40
+ const draggingIndex = ref(null);
41
+ const isDragging = ref(false);
42
+ const dropTargetIndex = ref(0);
43
+ const dragOffset = ref({ x: 0, y: 0 });
44
+ const dragSize = ref({ width: 0, height: 0 });
45
+ const dragPosition = ref({ left: 0, top: 0 });
46
+ const rowsContainerRef = ref(null);
47
+ const rowRefs = ref([]);
48
+ watch(
49
+ () => props.field,
50
+ (field) => {
51
+ if (!field) {
52
+ return;
53
+ }
54
+ if (field.collapsed && !resolveCollapsedKey(field)) {
55
+ console.warn(
56
+ `[katecms] Repeater "${props.fieldKey}": option "collapsed" refers to unknown sub-field "${field.collapsed}". Collapsible mode is disabled.`
57
+ );
58
+ }
59
+ if (field.subFields && ROW_COLLAPSED_KEY in field.subFields) {
60
+ console.warn(
61
+ `[katecms] Repeater "${props.fieldKey}": sub-field name "${ROW_COLLAPSED_KEY}" is reserved and will be ignored.`
62
+ );
63
+ }
64
+ },
65
+ { immediate: true }
66
+ );
67
+ function resolveCollapsedKey(field) {
68
+ const key = field?.collapsed;
69
+ if (!key || key === ROW_COLLAPSED_KEY) {
70
+ return void 0;
71
+ }
72
+ return key in (field.subFields ?? {}) ? key : void 0;
73
+ }
74
+ function isRowCollapsed(row, field = props.field) {
75
+ if (!resolveCollapsedKey(field)) {
76
+ return false;
77
+ }
78
+ return row[ROW_COLLAPSED_KEY] === true;
79
+ }
80
+ const rowKeyMap = /* @__PURE__ */ new WeakMap();
81
+ let rowKeySeq = 0;
82
+ function keyForRow(row) {
83
+ const raw = toRaw(row);
84
+ let key = rowKeyMap.get(raw);
85
+ if (key === void 0) {
86
+ rowKeySeq += 1;
87
+ key = rowKeySeq;
88
+ rowKeyMap.set(raw, key);
89
+ }
90
+ return key;
91
+ }
92
+ function transferRowKey(from, to) {
93
+ const key = rowKeyMap.get(toRaw(from));
94
+ if (key !== void 0) {
95
+ rowKeyMap.set(toRaw(to), key);
96
+ }
97
+ }
98
+ function deepClone(value) {
99
+ const raw = toRaw(value);
100
+ if (raw === null || typeof raw !== "object") {
101
+ return raw;
102
+ }
103
+ if (Array.isArray(raw)) {
104
+ return raw.map((item) => deepClone(item));
105
+ }
106
+ if (raw instanceof Date) {
107
+ return new Date(raw.getTime());
108
+ }
109
+ const proto = Object.getPrototypeOf(raw);
110
+ if (proto === Object.prototype || proto === null) {
111
+ const result = {};
112
+ for (const [key, item] of Object.entries(raw)) {
113
+ result[key] = deepClone(item);
114
+ }
115
+ return result;
116
+ }
117
+ if (typeof structuredClone === "function") {
118
+ try {
119
+ return structuredClone(raw);
120
+ } catch {
121
+ }
122
+ }
123
+ return raw;
124
+ }
125
+ function createSubFieldDefault(subField) {
126
+ if (subField.type === "repeater") {
127
+ return createRepeaterRows(subField);
128
+ }
129
+ return deepClone(createFieldDefault(subField));
130
+ }
131
+ function createRowForRepeater(field, collapsed) {
132
+ const row = {};
133
+ for (const [key, subField] of Object.entries(field.subFields ?? {})) {
134
+ if (key === ROW_COLLAPSED_KEY || isLayoutOnlyFieldType(subField.type)) {
135
+ continue;
136
+ }
137
+ row[key] = createSubFieldDefault(subField);
138
+ }
139
+ row[ROW_COLLAPSED_KEY] = collapsed ?? false;
140
+ return row;
141
+ }
142
+ function createRepeaterRows(field) {
143
+ const count = field.min ?? 0;
144
+ const result = [];
145
+ while (result.length < count) {
146
+ result.push(createRowForRepeater(field));
147
+ }
148
+ return result;
149
+ }
150
+ function createRow() {
151
+ return createRowForRepeater(props.field, false);
152
+ }
153
+ function normalizeRow(row, field) {
154
+ if (!row || typeof row !== "object" || Array.isArray(row)) {
155
+ return createRowForRepeater(field);
156
+ }
157
+ const source = row;
158
+ let next = source;
159
+ const assign = (key, value) => {
160
+ if (next === source) {
161
+ next = { ...source };
162
+ transferRowKey(source, next);
163
+ }
164
+ next[key] = value;
165
+ };
166
+ for (const [key, subField] of Object.entries(field.subFields ?? {})) {
167
+ if (key === ROW_COLLAPSED_KEY || subField.type !== "repeater") {
168
+ continue;
169
+ }
170
+ const { rows: nestedRows, changed } = normalizeRepeaterValue(source[key], subField);
171
+ if (changed) {
172
+ assign(key, nestedRows);
173
+ }
174
+ }
175
+ const collapsedValue = source[ROW_COLLAPSED_KEY];
176
+ if (resolveCollapsedKey(field)) {
177
+ if (typeof collapsedValue !== "boolean") {
178
+ assign(ROW_COLLAPSED_KEY, false);
179
+ }
180
+ } else if (ROW_COLLAPSED_KEY in source && typeof collapsedValue !== "boolean") {
181
+ assign(ROW_COLLAPSED_KEY, collapsedValue === true);
182
+ }
183
+ return next;
184
+ }
185
+ function normalizeRepeaterValue(value, field) {
186
+ const source = Array.isArray(value) ? value : [];
187
+ let changed = !Array.isArray(value);
188
+ const normalized = source.map((row) => {
189
+ const next = normalizeRow(row, field);
190
+ if (next !== row) {
191
+ changed = true;
192
+ }
193
+ return next;
194
+ });
195
+ const min = field.min ?? 0;
196
+ while (normalized.length < min) {
197
+ normalized.push(createRowForRepeater(field));
198
+ changed = true;
199
+ }
200
+ return { rows: normalized, changed };
201
+ }
202
+ function commit(next) {
203
+ rows.value = next;
204
+ model.value = next;
205
+ }
206
+ function syncRowsFromModel() {
207
+ rows.value = normalizeRepeaterValue(model.value, props.field).rows;
208
+ }
209
+ function ensureModel() {
210
+ const { rows: normalized, changed } = normalizeRepeaterValue(model.value, props.field);
211
+ rows.value = normalized;
212
+ if (changed) {
213
+ model.value = normalized;
214
+ }
215
+ }
216
+ syncRowsFromModel();
217
+ onMounted(() => {
218
+ ensureModel();
219
+ watch(
220
+ [model, () => props.field],
221
+ () => {
222
+ ensureModel();
223
+ }
224
+ );
225
+ });
226
+ const rowViews = computed(
227
+ () => rows.value.map((row) => {
228
+ const expanded = !collapsible.value || !isRowCollapsed(row);
229
+ return {
230
+ row,
231
+ key: keyForRow(row),
232
+ expanded,
233
+ visibleSubFields: visibleSubFields(row, expanded)
234
+ };
235
+ })
236
+ );
237
+ function visibleSubFields(row, expanded) {
238
+ return Object.entries(subFields.value).filter(([key, subField]) => {
239
+ if (!isVisible(subField.conditionalLogic, row)) {
240
+ return false;
241
+ }
242
+ if (collapsible.value && !expanded) {
243
+ return key === collapsedKey.value;
244
+ }
245
+ return true;
246
+ });
247
+ }
248
+ function subFieldKey(index, key) {
249
+ return `${props.fieldKey}_${index}_${key}`;
250
+ }
251
+ function subFieldStyle(subField, expanded, subKey) {
252
+ if (collapsible.value && !expanded && subKey === collapsedKey.value) {
253
+ return { width: "100%" };
254
+ }
255
+ return subField.columnWidth ? { width: `${subField.columnWidth}%` } : void 0;
256
+ }
257
+ function patchRow(index, patch) {
258
+ commit(rows.value.map((row, rowIndex) => {
259
+ if (rowIndex !== index) {
260
+ return row;
261
+ }
262
+ const next = { ...row, ...patch };
263
+ transferRowKey(row, next);
264
+ return next;
265
+ }));
266
+ }
267
+ function updateRowValue(index, key, value) {
268
+ if (isLayoutOnlyFieldType(subFields.value[key]?.type ?? "")) {
269
+ return;
270
+ }
271
+ patchRow(index, { [key]: value });
272
+ }
273
+ function toggleRow(index) {
274
+ if (!collapsible.value) {
275
+ return;
276
+ }
277
+ const row = rows.value[index];
278
+ if (!row) {
279
+ return;
280
+ }
281
+ patchRow(index, { [ROW_COLLAPSED_KEY]: !isRowCollapsed(row) });
282
+ }
283
+ function collapseAllRows() {
284
+ commit(rows.value.map((row) => {
285
+ if (row[ROW_COLLAPSED_KEY] === true) {
286
+ return row;
287
+ }
288
+ const next = { ...row, [ROW_COLLAPSED_KEY]: true };
289
+ transferRowKey(row, next);
290
+ return next;
291
+ }));
292
+ }
293
+ function expandAllRows() {
294
+ commit(rows.value.map((row) => {
295
+ if (row[ROW_COLLAPSED_KEY] === false) {
296
+ return row;
297
+ }
298
+ const next = { ...row, [ROW_COLLAPSED_KEY]: false };
299
+ transferRowKey(row, next);
300
+ return next;
301
+ }));
302
+ }
303
+ function insertRowAt(index, row) {
304
+ if (!canAdd.value) {
305
+ return;
306
+ }
307
+ const rowToInsert = collapsible.value ? { ...row, [ROW_COLLAPSED_KEY]: false } : row;
308
+ const next = [...rows.value];
309
+ next.splice(index, 0, rowToInsert);
310
+ commit(next);
311
+ }
312
+ function addRowBefore(index) {
313
+ insertRowAt(index, createRow());
314
+ }
315
+ function addRow() {
316
+ insertRowAt(rows.value.length, createRow());
317
+ }
318
+ function duplicateRow(index) {
319
+ const source = rows.value[index];
320
+ if (!source) {
321
+ return;
322
+ }
323
+ const copy = deepClone(source);
324
+ insertRowAt(index + 1, copy);
325
+ }
326
+ function removeRow(index) {
327
+ if (!canRemove.value) {
328
+ return;
329
+ }
330
+ commit(rows.value.filter((_, rowIndex) => rowIndex !== index));
331
+ }
332
+ function reorderRows(fromIndex, toIndex) {
333
+ const length = rows.value.length;
334
+ if (fromIndex === toIndex || fromIndex < 0 || fromIndex >= length || toIndex < 0 || toIndex >= length) {
335
+ return;
336
+ }
337
+ const next = [...rows.value];
338
+ const [movedRow] = next.splice(fromIndex, 1);
339
+ if (movedRow === void 0) {
340
+ return;
341
+ }
342
+ next.splice(toIndex, 0, movedRow);
343
+ commit(next);
344
+ }
345
+ function reorderToInsert(from, insertAt) {
346
+ const length = rows.value.length;
347
+ if (from < 0 || from >= length || insertAt < 0 || insertAt > length || insertAt === from || insertAt === from + 1) {
348
+ return;
349
+ }
350
+ const next = [...rows.value];
351
+ const [movedRow] = next.splice(from, 1);
352
+ if (movedRow === void 0) {
353
+ return;
354
+ }
355
+ let target = insertAt;
356
+ if (from < insertAt) {
357
+ target -= 1;
358
+ }
359
+ next.splice(target, 0, movedRow);
360
+ commit(next);
361
+ }
362
+ function moveRow(index, direction) {
363
+ reorderRows(index, index + direction);
364
+ }
365
+ const dragPlaceholderStyle = computed(() => ({
366
+ width: `${dragSize.value.width}px`,
367
+ height: `${dragSize.value.height}px`
368
+ }));
369
+ function setRowRef(el, index) {
370
+ rowRefs.value[index] = el instanceof HTMLElement ? el : null;
371
+ }
372
+ function rowDragStyle(index) {
373
+ if (!isDragging.value || draggingIndex.value !== index) {
374
+ return void 0;
375
+ }
376
+ return {
377
+ position: "fixed",
378
+ left: `${dragPosition.value.left}px`,
379
+ top: `${dragPosition.value.top}px`,
380
+ width: `${dragSize.value.width}px`,
381
+ height: `${dragSize.value.height}px`,
382
+ zIndex: 1e3
383
+ };
384
+ }
385
+ function updateDropTargetFromPoint(clientY) {
386
+ const from = draggingIndex.value;
387
+ if (from === null) {
388
+ return;
389
+ }
390
+ let insertAt = rows.value.length;
391
+ for (let i = 0; i < rows.value.length; i++) {
392
+ if (i === from) {
393
+ continue;
394
+ }
395
+ const el = rowRefs.value[i];
396
+ if (!el) {
397
+ continue;
398
+ }
399
+ const rect = el.getBoundingClientRect();
400
+ if (clientY < rect.top + rect.height / 2) {
401
+ insertAt = i;
402
+ break;
403
+ }
404
+ insertAt = i + 1;
405
+ }
406
+ dropTargetIndex.value = Math.max(0, Math.min(insertAt, rows.value.length));
407
+ }
408
+ function onDocumentMouseMove(event) {
409
+ if (!isDragging.value) {
410
+ return;
411
+ }
412
+ dragPosition.value = {
413
+ left: event.clientX - dragOffset.value.x,
414
+ top: event.clientY - dragOffset.value.y
415
+ };
416
+ updateDropTargetFromPoint(event.clientY);
417
+ }
418
+ function onDocumentMouseUp() {
419
+ if (!isDragging.value || draggingIndex.value === null) {
420
+ return;
421
+ }
422
+ reorderToInsert(draggingIndex.value, dropTargetIndex.value);
423
+ resetDrag();
424
+ }
425
+ function onHandleMouseDown(index, event) {
426
+ if (event.button !== 0) {
427
+ return;
428
+ }
429
+ event.preventDefault();
430
+ event.stopPropagation();
431
+ const handle = event.currentTarget;
432
+ if (!(handle instanceof HTMLElement)) {
433
+ return;
434
+ }
435
+ const rowEl = handle.closest(`.${rootClass}__row`);
436
+ if (!rowEl) {
437
+ return;
438
+ }
439
+ const rect = rowEl.getBoundingClientRect();
440
+ draggingIndex.value = index;
441
+ dropTargetIndex.value = index;
442
+ dragOffset.value = {
443
+ x: event.clientX - rect.left,
444
+ y: event.clientY - rect.top
445
+ };
446
+ dragSize.value = {
447
+ width: rect.width,
448
+ height: rect.height
449
+ };
450
+ dragPosition.value = {
451
+ left: rect.left,
452
+ top: rect.top
453
+ };
454
+ isDragging.value = true;
455
+ document.body.style.userSelect = "none";
456
+ document.addEventListener("mousemove", onDocumentMouseMove);
457
+ document.addEventListener("mouseup", onDocumentMouseUp);
458
+ }
459
+ function resetDrag() {
460
+ isDragging.value = false;
461
+ draggingIndex.value = null;
462
+ dropTargetIndex.value = 0;
463
+ dragSize.value = { width: 0, height: 0 };
464
+ document.body.style.userSelect = "";
465
+ document.removeEventListener("mousemove", onDocumentMouseMove);
466
+ document.removeEventListener("mouseup", onDocumentMouseUp);
467
+ }
468
+ onBeforeUnmount(() => {
469
+ resetDrag();
470
+ });
471
+ </script>
472
+
473
+ <template>
474
+ <KateCmsFieldWrapper
475
+ :field-key="fieldKey"
476
+ :field="field"
477
+ label-tag="div"
478
+ >
479
+ <div :class="rootClass">
480
+ <div
481
+ v-if="!Object.keys(subFields).length"
482
+ :class="`${rootClass}__hint`"
483
+ >
484
+ No subfields defined.
485
+ </div>
486
+
487
+ <div
488
+ v-else
489
+ ref="rowsContainerRef"
490
+ :class="`${rootClass}__rows`"
491
+ >
492
+ <template
493
+ v-for="(view, index) in rowViews"
494
+ :key="view.key"
495
+ >
496
+ <div
497
+ v-if="isDragging && dropTargetIndex === index"
498
+ :class="`${rootClass}__drop-placeholder`"
499
+ :style="dragPlaceholderStyle"
500
+ />
501
+
502
+ <div
503
+ :ref="(el) => setRowRef(el, index)"
504
+ :class="[
505
+ `${rootClass}__row`,
506
+ { 'is-floating': isDragging && draggingIndex === index }
507
+ ]"
508
+ :style="rowDragStyle(index)"
509
+ >
510
+ <button
511
+ v-if="collapsible"
512
+ type="button"
513
+ :class="`${rootClass}__toggle`"
514
+ :aria-label="view.expanded ? 'Collapse row' : 'Expand row'"
515
+ :title="view.expanded ? 'Collapse row' : 'Expand row'"
516
+ :aria-expanded="view.expanded"
517
+ @click="toggleRow(index)"
518
+ >
519
+ <svg
520
+ xmlns="http://www.w3.org/2000/svg"
521
+ viewBox="0 0 640 640"
522
+ :class="[{ 'is-open': view.expanded }]"
523
+ >
524
+ <path
525
+ d="M297.4 470.6C309.9 483.1 330.2 483.1 342.7 470.6L534.7 278.6C547.2 266.1 547.2 245.8 534.7 233.3C522.2 220.8 501.9 220.8 489.4 233.3L320 402.7L150.6 233.4C138.1 220.9 117.8 220.9 105.3 233.4C92.8 245.9 92.8 266.2 105.3 278.7L297.3 470.7z"
526
+ />
527
+ </svg>
528
+ </button>
529
+
530
+ <button
531
+ :class="`${rootClass}__handle`"
532
+ type="button"
533
+ aria-label="Drag to reorder"
534
+ title="Drag to reorder"
535
+ @mousedown="onHandleMouseDown(index, $event)"
536
+ v-text="index + 1"
537
+ />
538
+
539
+ <div :class="`${rootClass}__row-wrap`">
540
+ <div
541
+ v-if="view.visibleSubFields.length"
542
+ :class="`${rootClass}__row-body`"
543
+ >
544
+ <div
545
+ v-for="[subKey, subField] in view.visibleSubFields"
546
+ :key="subKey"
547
+ :class="`${rootClass}__sub-field`"
548
+ :style="subFieldStyle(subField, view.expanded, subKey)"
549
+ >
550
+ <component
551
+ :is="resolveField(subField.type)"
552
+ :model-value="view.row[subKey]"
553
+ :field-key="subFieldKey(index, subKey)"
554
+ :field="subField"
555
+ @update:model-value="updateRowValue(index, subKey, $event)"
556
+ />
557
+ </div>
558
+ </div>
559
+ </div>
560
+
561
+ <div :class="`${rootClass}__row-options`">
562
+ <div :class="`${rootClass}__row-options-wrap`">
563
+ <button
564
+ type="button"
565
+ :class="`${rootClass}__btn`"
566
+ :disabled="!canAdd"
567
+ aria-label="Add row"
568
+ title="Add row"
569
+ @click="addRowBefore(index)"
570
+ >
571
+ <svg
572
+ xmlns="http://www.w3.org/2000/svg"
573
+ viewBox="0 0 640 640"
574
+ >
575
+ <path
576
+ d="M352 128C352 110.3 337.7 96 320 96C302.3 96 288 110.3 288 128L288 288L128 288C110.3 288 96 302.3 96 320C96 337.7 110.3 352 128 352L288 352L288 512C288 529.7 302.3 544 320 544C337.7 544 352 529.7 352 512L352 352L512 352C529.7 352 544 337.7 544 320C544 302.3 529.7 288 512 288L352 288L352 128z"
577
+ />
578
+ </svg>
579
+ </button>
580
+ <button
581
+ type="button"
582
+ :class="`${rootClass}__btn`"
583
+ :disabled="!canAdd"
584
+ aria-label="Duplicate row"
585
+ title="Duplicate row"
586
+ @click="duplicateRow(index)"
587
+ >
588
+ <svg
589
+ xmlns="http://www.w3.org/2000/svg"
590
+ viewBox="0 0 640 640"
591
+ >
592
+ <path
593
+ d="M352 528L128 528C119.2 528 112 520.8 112 512L112 288C112 279.2 119.2 272 128 272L176 272L176 224L128 224C92.7 224 64 252.7 64 288L64 512C64 547.3 92.7 576 128 576L352 576C387.3 576 416 547.3 416 512L416 464L368 464L368 512C368 520.8 360.8 528 352 528zM288 368C279.2 368 272 360.8 272 352L272 128C272 119.2 279.2 112 288 112L512 112C520.8 112 528 119.2 528 128L528 352C528 360.8 520.8 368 512 368L288 368zM224 352C224 387.3 252.7 416 288 416L512 416C547.3 416 576 387.3 576 352L576 128C576 92.7 547.3 64 512 64L288 64C252.7 64 224 92.7 224 128L224 352z"
594
+ />
595
+ </svg>
596
+ </button>
597
+ <button
598
+ type="button"
599
+ :class="`${rootClass}__btn`"
600
+ :disabled="index === 0"
601
+ aria-label="Move up"
602
+ title="Move up"
603
+ @click="moveRow(index, -1)"
604
+ >
605
+ <svg
606
+ xmlns="http://www.w3.org/2000/svg"
607
+ viewBox="0 0 640 640"
608
+ >
609
+ <path
610
+ d="M342.6 73.4C330.1 60.9 309.8 60.9 297.3 73.4L137.3 233.4C124.8 245.9 124.8 266.2 137.3 278.7C149.8 291.2 170.1 291.2 182.6 278.7L288 173.3L288 544C288 561.7 302.3 576 320 576C337.7 576 352 561.7 352 544L352 173.3L457.4 278.7C469.9 291.2 490.2 291.2 502.7 278.7C515.2 266.2 515.2 245.9 502.7 233.4L342.7 73.4z"
611
+ />
612
+ </svg>
613
+ </button>
614
+ <button
615
+ type="button"
616
+ :class="`${rootClass}__btn`"
617
+ :disabled="!canRemove"
618
+ aria-label="Remove row"
619
+ title="Remove row"
620
+ @click="removeRow(index)"
621
+ >
622
+ <svg
623
+ xmlns="http://www.w3.org/2000/svg"
624
+ viewBox="0 0 640 640"
625
+ >
626
+ <path
627
+ d="M183.1 137.4C170.6 124.9 150.3 124.9 137.8 137.4C125.3 149.9 125.3 170.2 137.8 182.7L275.2 320L137.9 457.4C125.4 469.9 125.4 490.2 137.9 502.7C150.4 515.2 170.7 515.2 183.2 502.7L320.5 365.3L457.9 502.6C470.4 515.1 490.7 515.1 503.2 502.6C515.7 490.1 515.7 469.8 503.2 457.3L365.8 320L503.1 182.6C515.6 170.1 515.6 149.8 503.1 137.3C490.6 124.8 470.3 124.8 457.8 137.3L320.5 274.7L183.1 137.4z"
628
+ />
629
+ </svg>
630
+ </button>
631
+ <button
632
+ type="button"
633
+ :class="`${rootClass}__btn`"
634
+ :disabled="index === rows.length - 1"
635
+ aria-label="Move down"
636
+ title="Move down"
637
+ @click="moveRow(index, 1)"
638
+ >
639
+ <svg
640
+ xmlns="http://www.w3.org/2000/svg"
641
+ viewBox="0 0 640 640"
642
+ >
643
+ <path
644
+ d="M297.4 566.6C309.9 579.1 330.2 579.1 342.7 566.6L502.7 406.6C515.2 394.1 515.2 373.8 502.7 361.3C490.2 348.8 469.9 348.8 457.4 361.3L352 466.7L352 96C352 78.3 337.7 64 320 64C302.3 64 288 78.3 288 96L288 466.7L182.6 361.3C170.1 348.8 149.8 348.8 137.3 361.3C124.8 373.8 124.8 394.1 137.3 406.6L297.3 566.6z"
645
+ />
646
+ </svg>
647
+ </button>
648
+ </div>
649
+ </div>
650
+ </div>
651
+ </template>
652
+
653
+ <div
654
+ v-if="isDragging && dropTargetIndex === rowViews.length"
655
+ :class="`${rootClass}__drop-placeholder`"
656
+ :style="dragPlaceholderStyle"
657
+ />
658
+ </div>
659
+
660
+ <div
661
+ v-if="Object.keys(subFields).length"
662
+ :class="`${rootClass}__toolbar`"
663
+ >
664
+ <div
665
+ v-if="showCollapseAll || showExpandAll"
666
+ :class="`${rootClass}__toggle-all-group`"
667
+ >
668
+ <KateCmsUiButton
669
+ v-if="showCollapseAll"
670
+ tag="button"
671
+ :variant="['secondary', 'small']"
672
+ @click="collapseAllRows"
673
+ >
674
+ Collapse all
675
+ </KateCmsUiButton>
676
+ <KateCmsUiButton
677
+ v-if="showExpandAll"
678
+ tag="button"
679
+ :variant="['secondary', 'small']"
680
+ @click="expandAllRows"
681
+ >
682
+ Expand all
683
+ </KateCmsUiButton>
684
+ </div>
685
+ <KateCmsUiButton
686
+ tag="button"
687
+ variant="small"
688
+ :disabled="!canAdd"
689
+ @click="addRow"
690
+ >
691
+ {{ buttonLabel }}
692
+ </KateCmsUiButton>
693
+ </div>
694
+ </div>
695
+ </KateCmsFieldWrapper>
696
+ </template>
697
+
698
+ <style scoped>
699
+ .katecms-repeater-field {
700
+ display: flex;
701
+ flex-direction: column;
702
+ gap: 0.75rem;
703
+ }
704
+ .katecms-repeater-field__hint {
705
+ margin: 0;
706
+ color: var(--katecms-color-muted);
707
+ }
708
+ .katecms-repeater-field__rows {
709
+ display: flex;
710
+ flex-direction: column;
711
+ gap: 0.625rem;
712
+ position: relative;
713
+ }
714
+ .katecms-repeater-field__drop-placeholder {
715
+ flex-shrink: 0;
716
+ box-sizing: border-box;
717
+ border: 1px dashed var(--katecms-color-border);
718
+ border-radius: var(--katecms-border-radius);
719
+ background-color: var(--katecms-color-bg);
720
+ }
721
+ .katecms-repeater-field__row {
722
+ position: relative;
723
+ display: flex;
724
+ flex-wrap: wrap;
725
+ column-gap: 0.25rem;
726
+ border: 1px solid var(--katecms-color-border);
727
+ border-radius: var(--katecms-border-radius);
728
+ background-color: var(--katecms-color-surface);
729
+ }
730
+ .katecms-repeater-field__row.is-floating {
731
+ box-shadow: var(--katecms-shadow-md);
732
+ }
733
+ .katecms-repeater-field__row-wrap {
734
+ flex-basis: 0;
735
+ flex-grow: 1;
736
+ max-width: 100%;
737
+ }
738
+ .katecms-repeater-field__row-options {
739
+ flex: 0 0 32px;
740
+ background-color: var(--katecms-color-bg);
741
+ border-left: 1px solid var(--katecms-color-border);
742
+ border-radius: 0 var(--katecms-border-radius) var(--katecms-border-radius) 0;
743
+ }
744
+ .katecms-repeater-field__row-options-wrap {
745
+ display: flex;
746
+ flex-direction: column;
747
+ height: 100%;
748
+ max-height: 90px;
749
+ position: sticky;
750
+ top: 0;
751
+ }
752
+ .katecms-repeater-field__row-options-wrap > .katecms-repeater-field__btn:first-child {
753
+ border-radius: 0 var(--katecms-border-radius-inter) 0 0;
754
+ }
755
+ .katecms-repeater-field__row-body {
756
+ display: flex;
757
+ flex-wrap: wrap;
758
+ gap: 1rem 0;
759
+ padding: 0.75rem 0.5rem;
760
+ margin-left: -0.5rem;
761
+ margin-right: -0.5rem;
762
+ }
763
+ .katecms-repeater-field__handle {
764
+ flex: 0 0 32px;
765
+ cursor: move;
766
+ background-color: var(--katecms-color-bg);
767
+ font-size: 0.875rem;
768
+ color: var(--katecms-color-muted);
769
+ display: flex;
770
+ justify-content: center;
771
+ align-items: center;
772
+ border: 0;
773
+ border-right: 1px solid var(--katecms-color-border);
774
+ padding: 0;
775
+ margin: 0;
776
+ border-radius: var(--katecms-border-radius-inter) 0 0 var(--katecms-border-radius-inter);
777
+ }
778
+ .katecms-repeater-field__btn {
779
+ display: flex;
780
+ align-items: center;
781
+ justify-content: center;
782
+ padding: 0;
783
+ margin: 0;
784
+ border-radius: 0;
785
+ border: none;
786
+ background-color: var(--katecms-color-bg);
787
+ flex-basis: 0;
788
+ flex-grow: 1;
789
+ cursor: pointer;
790
+ }
791
+ .katecms-repeater-field__btn:not(:last-child) {
792
+ border-bottom: 1px solid var(--katecms-color-border);
793
+ }
794
+ .katecms-repeater-field__btn[disabled] {
795
+ cursor: not-allowed;
796
+ }
797
+ .katecms-repeater-field__btn[disabled] svg {
798
+ opacity: 0.3;
799
+ }
800
+ .katecms-repeater-field__btn:not([disabled]):hover {
801
+ background-color: var(--katecms-color-accent-wash);
802
+ }
803
+ .katecms-repeater-field__btn svg {
804
+ width: 12px;
805
+ height: 12px;
806
+ fill: var(--katecms-color-ink);
807
+ }
808
+ .katecms-repeater-field__toggle {
809
+ position: absolute;
810
+ top: 0;
811
+ left: 0;
812
+ width: 32px;
813
+ height: 32px;
814
+ display: flex;
815
+ align-items: center;
816
+ justify-content: center;
817
+ padding: 0;
818
+ margin: 0;
819
+ border-radius: var(--katecms-border-radius-inter) 0 0 0;
820
+ border: 0;
821
+ border-bottom: 1px solid var(--katecms-color-border);
822
+ border-right: 1px solid var(--katecms-color-border);
823
+ background-color: var(--katecms-color-bg);
824
+ z-index: 5;
825
+ cursor: pointer;
826
+ }
827
+ .katecms-repeater-field__toggle:hover {
828
+ background-color: var(--katecms-color-accent-wash);
829
+ }
830
+ .katecms-repeater-field__toggle svg {
831
+ width: 12px;
832
+ height: 12px;
833
+ fill: var(--katecms-color-ink);
834
+ transition: transform 0.3s;
835
+ }
836
+ .katecms-repeater-field__toggle svg.is-open {
837
+ transform: rotate(-180deg);
838
+ }
839
+ .katecms-repeater-field__toggle-all-group {
840
+ display: flex;
841
+ flex-wrap: wrap;
842
+ gap: 0.5rem;
843
+ }
844
+ .katecms-repeater-field__sub-field {
845
+ padding-left: 0.5rem;
846
+ padding-right: 0.5rem;
847
+ width: 100%;
848
+ }
849
+ .katecms-repeater-field__toolbar {
850
+ display: flex;
851
+ flex-wrap: wrap;
852
+ align-items: center;
853
+ justify-content: space-between;
854
+ gap: 0.5rem;
855
+ }
856
+ </style>