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,186 @@
1
+ <script setup lang="ts">
2
+ import { computed, onBeforeUnmount, ref, watch } from 'vue'
3
+ import type { SelectModelValue } from '@katecms/core'
4
+ import {
5
+ MEDIA_SORT_CHOICES,
6
+ MEDIA_TYPE_CHOICES,
7
+ isMediaSort,
8
+ isMediaTypeFilter,
9
+ monthLabel,
10
+ searchNeedle,
11
+ } from '../../utils/media-library-query'
12
+ import type { MediaLibraryFilterState, MediaSort, MediaTypeFilter } from '../../utils/media-library-query'
13
+
14
+ const props = withDefaults(defineProps<{
15
+ filters: MediaLibraryFilterState
16
+ months?: string[]
17
+ idPrefix?: string
18
+ }>(), {
19
+ months: () => [],
20
+ idPrefix: 'media',
21
+ })
22
+
23
+ const emit = defineEmits<{
24
+ 'update:filters': [filters: MediaLibraryFilterState]
25
+ }>()
26
+
27
+ const rootClass = 'katecms-media-filters'
28
+ const searchDraft = ref(props.filters.search)
29
+ let searchTimer: ReturnType<typeof setTimeout> | undefined
30
+
31
+ const typeChoices = MEDIA_TYPE_CHOICES
32
+
33
+ const monthChoices = computed(() => {
34
+ const values = [...props.months]
35
+ if (props.filters.month !== 'all' && !values.includes(props.filters.month)) {
36
+ values.push(props.filters.month)
37
+ }
38
+ values.sort((a, b) => b.localeCompare(a))
39
+ return [
40
+ { val: 'all', lbl: 'All dates' },
41
+ ...values.map(value => ({ val: value, lbl: monthLabel(value) })),
42
+ ]
43
+ })
44
+
45
+ const typeModel = computed({
46
+ get(): SelectModelValue {
47
+ return props.filters.type
48
+ },
49
+ set(value: SelectModelValue) {
50
+ const raw = typeof value === 'string' ? value : 'all'
51
+ const type: MediaTypeFilter = isMediaTypeFilter(raw) ? raw : 'all'
52
+ emitChange({ ...props.filters, type, search: searchDraft.value })
53
+ },
54
+ })
55
+
56
+ const monthModel = computed({
57
+ get(): SelectModelValue {
58
+ return props.filters.month
59
+ },
60
+ set(value: SelectModelValue) {
61
+ const raw = typeof value === 'string' ? value : 'all'
62
+ const month = raw === 'all' || /^\d{4}-(0[1-9]|1[0-2])$/.test(raw) ? raw : 'all'
63
+ emitChange({ ...props.filters, month, search: searchDraft.value })
64
+ },
65
+ })
66
+
67
+ const sortModel = computed({
68
+ get(): SelectModelValue {
69
+ return isMediaSort(props.filters.sort) ? props.filters.sort : 'date-desc'
70
+ },
71
+ set(value: SelectModelValue) {
72
+ const raw = typeof value === 'string' ? value : 'date-desc'
73
+ const sort: MediaSort = isMediaSort(raw) ? raw : 'date-desc'
74
+ emitChange({ ...props.filters, sort, search: searchDraft.value })
75
+ },
76
+ })
77
+
78
+ watch(() => props.filters.search, (value) => {
79
+ searchDraft.value = value
80
+ })
81
+
82
+ watch(searchDraft, (value) => {
83
+ if (searchNeedle(value) === searchNeedle(props.filters.search) && value.trim() === props.filters.search.trim()) {
84
+ return
85
+ }
86
+ window.clearTimeout(searchTimer)
87
+ searchTimer = setTimeout(() => {
88
+ emitChange({ ...props.filters, search: value })
89
+ }, 300)
90
+ })
91
+
92
+ onBeforeUnmount(() => {
93
+ window.clearTimeout(searchTimer)
94
+ })
95
+
96
+ function emitChange(next: MediaLibraryFilterState) {
97
+ if (
98
+ next.type === props.filters.type
99
+ && next.month === props.filters.month
100
+ && next.search === props.filters.search
101
+ && next.sort === props.filters.sort
102
+ ) {
103
+ return
104
+ }
105
+ emit('update:filters', next)
106
+ }
107
+
108
+ function flushSearch() {
109
+ window.clearTimeout(searchTimer)
110
+ emitChange({ ...props.filters, search: searchDraft.value })
111
+ }
112
+ </script>
113
+
114
+ <template>
115
+ <div :class="rootClass">
116
+ <div :class="`${rootClass}__field`">
117
+ <KateCmsUiSelect
118
+ :id="`${idPrefix}-type`"
119
+ v-model="typeModel"
120
+ :choices="typeChoices"
121
+ aria-label="Media type"
122
+ />
123
+ </div>
124
+ <div :class="`${rootClass}__field`">
125
+ <KateCmsUiSelect
126
+ :id="`${idPrefix}-month`"
127
+ v-model="monthModel"
128
+ :choices="monthChoices"
129
+ aria-label="Date"
130
+ />
131
+ </div>
132
+ <div :class="[`${rootClass}__field`, `${rootClass}__field--sort`]">
133
+ <KateCmsUiSelect
134
+ :id="`${idPrefix}-sort`"
135
+ v-model="sortModel"
136
+ :choices="MEDIA_SORT_CHOICES"
137
+ aria-label="Sort"
138
+ max-height="400px"
139
+ />
140
+ </div>
141
+ <form
142
+ :class="`${rootClass}__search`"
143
+ @submit.prevent="flushSearch"
144
+ >
145
+ <KateCmsInputControl
146
+ v-model="searchDraft"
147
+ :field-key="`${idPrefix}-search`"
148
+ :field="{ placeholder: 'Search media' }"
149
+ />
150
+ </form>
151
+ </div>
152
+ </template>
153
+
154
+ <style scoped lang="scss">
155
+ @use "../../assets/styles" as *;
156
+
157
+ $root: '.katecms-media-filters';
158
+
159
+ #{$root} {
160
+ display: flex;
161
+ flex-shrink: 0;
162
+ flex-wrap: wrap;
163
+ align-items: center;
164
+ gap: math-rem(8);
165
+
166
+ &__field {
167
+ flex: 1 1 math-rem(200);
168
+ min-width: math-rem(180);
169
+ max-width: math-rem(260);
170
+
171
+ &--sort {
172
+ max-width: math-rem(280);
173
+ }
174
+ }
175
+
176
+ &__search {
177
+ flex: 1 1 math-rem(220);
178
+ min-width: math-rem(180);
179
+ max-width: math-rem(360);
180
+
181
+ :deep(.katecms-input-control) {
182
+ width: 100%;
183
+ }
184
+ }
185
+ }
186
+ </style>
@@ -0,0 +1,526 @@
1
+ <script setup lang="ts">
2
+ import { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'
3
+ import type { MediaItem } from '@katecms/core'
4
+ import { isImageMedia as isImage } from '@katecms/core'
5
+ import { defaultMediaLibraryFilters, mediaFiltersActive } from '../../utils/media-library-query'
6
+ import type { MediaLibraryFilterState } from '../../utils/media-library-query'
7
+
8
+ const props = withDefaults(defineProps<{
9
+ open?: boolean
10
+ mediaKind?: 'file' | 'image'
11
+ libraryEnabled?: boolean
12
+ library?: MediaItem[]
13
+ selectedId?: number
14
+ selectedIds?: number[]
15
+ multiple?: boolean
16
+ loading?: boolean
17
+ loadingMore?: boolean
18
+ hasMore?: boolean
19
+ filters?: MediaLibraryFilterState
20
+ months?: string[]
21
+ error?: string | null
22
+ uploading?: boolean
23
+ processing?: boolean
24
+ cropping?: boolean
25
+ }>(), {
26
+ open: false,
27
+ mediaKind: 'file',
28
+ libraryEnabled: true,
29
+ library: () => [],
30
+ selectedIds: () => [],
31
+ multiple: false,
32
+ loading: false,
33
+ loadingMore: false,
34
+ hasMore: false,
35
+ filters: () => defaultMediaLibraryFilters(),
36
+ months: () => [],
37
+ error: null,
38
+ uploading: false,
39
+ processing: false,
40
+ cropping: false,
41
+ })
42
+
43
+ const emit = defineEmits<{
44
+ close: []
45
+ choose: [item: MediaItem]
46
+ confirm: [items: MediaItem[]]
47
+ upload: []
48
+ loadMore: []
49
+ 'update:filters': [filters: MediaLibraryFilterState]
50
+ }>()
51
+
52
+ const rootClass = 'katecms-media-modal'
53
+ const pendingIds = ref<number[]>([])
54
+ const body = ref<HTMLElement | null>(null)
55
+ const sentinel = ref<HTMLElement | null>(null)
56
+ let loadObserver: IntersectionObserver | null = null
57
+
58
+ function stopLoadObserver() {
59
+ loadObserver?.disconnect()
60
+ loadObserver = null
61
+ }
62
+
63
+ function startLoadObserver() {
64
+ stopLoadObserver()
65
+ const root = body.value
66
+ const target = sentinel.value
67
+ if (!props.open || !root || !target || !props.hasMore) {
68
+ return
69
+ }
70
+ loadObserver = new IntersectionObserver((entries) => {
71
+ if (entries.some(entry => entry.isIntersecting)) {
72
+ emit('loadMore')
73
+ }
74
+ }, { root, rootMargin: '160px' })
75
+ loadObserver.observe(target)
76
+ }
77
+
78
+ watch([() => props.open, body, sentinel, () => props.hasMore], () => {
79
+ void nextTick(startLoadObserver)
80
+ })
81
+
82
+ watch(() => props.loadingMore, (busy) => {
83
+ if (busy || !props.open || !props.hasMore) {
84
+ return
85
+ }
86
+ void nextTick(() => {
87
+ const root = body.value
88
+ const target = sentinel.value
89
+ if (!root || !target) {
90
+ return
91
+ }
92
+ const rootRect = root.getBoundingClientRect()
93
+ const targetRect = target.getBoundingClientRect()
94
+ if (targetRect.top <= rootRect.bottom + 160) {
95
+ emit('loadMore')
96
+ }
97
+ })
98
+ })
99
+
100
+ onBeforeUnmount(stopLoadObserver)
101
+
102
+ watch(() => props.open, (isOpen) => {
103
+ if (isOpen && props.multiple) {
104
+ pendingIds.value = []
105
+ }
106
+ })
107
+
108
+ const isImageKind = computed(() => props.mediaKind === 'image')
109
+
110
+ const title = computed(() => {
111
+ if (props.libraryEnabled) {
112
+ return 'Media library'
113
+ }
114
+ return isImageKind.value ? 'Upload image' : 'Upload file'
115
+ })
116
+
117
+ const processingText = computed(() =>
118
+ isImageKind.value ? 'Processing image…' : 'Processing file…',
119
+ )
120
+
121
+ const noLibraryHint = computed(() =>
122
+ isImageKind.value
123
+ ? 'Picking from the library is disabled. Upload a new image.'
124
+ : 'Picking from the library is disabled. Upload a new file.',
125
+ )
126
+
127
+ const emptyLibraryHint = computed(() =>
128
+ mediaFiltersActive(props.filters)
129
+ ? 'No files match.'
130
+ : 'The library is empty. Upload the first file.',
131
+ )
132
+
133
+ const pendingCount = computed(() => pendingIds.value.length)
134
+
135
+ const confirmLabel = computed(() => `Add (${pendingCount.value})`)
136
+
137
+ function thumbUrl(item: MediaItem) {
138
+ const variant = item.variants?.find(v => v.size === 'thumbnail')
139
+ return variant ? variant.url : item.url
140
+ }
141
+
142
+ function fileLabel(item: MediaItem): string {
143
+ return item.filename || item.url.split('/').pop() || 'File'
144
+ }
145
+
146
+ function isAlreadySelected(id: number): boolean {
147
+ return props.selectedIds.includes(id)
148
+ }
149
+
150
+ function isPending(id: number): boolean {
151
+ return pendingIds.value.includes(id)
152
+ }
153
+
154
+ function isHighlighted(item: MediaItem): boolean {
155
+ if (props.multiple) {
156
+ return isPending(item.id) || isAlreadySelected(item.id)
157
+ }
158
+ return props.selectedId === item.id
159
+ }
160
+
161
+ function onItemClick(item: MediaItem) {
162
+ if (!props.multiple) {
163
+ emit('choose', item)
164
+ return
165
+ }
166
+ if (isAlreadySelected(item.id)) {
167
+ return
168
+ }
169
+ if (isPending(item.id)) {
170
+ pendingIds.value = pendingIds.value.filter(id => id !== item.id)
171
+ return
172
+ }
173
+ pendingIds.value = [...pendingIds.value, item.id]
174
+ }
175
+
176
+ function confirmSelection() {
177
+ const items = props.library.filter(item => pendingIds.value.includes(item.id))
178
+ emit('confirm', items)
179
+ pendingIds.value = []
180
+ }
181
+ </script>
182
+
183
+ <template>
184
+ <Teleport to="body">
185
+ <div
186
+ v-if="open"
187
+ :class="rootClass"
188
+ @click.self="emit('close')"
189
+ >
190
+ <div :class="`${rootClass}__dialog`">
191
+ <div :class="`${rootClass}__dialog-head`">
192
+ <span :class="`${rootClass}__dialog-title`">
193
+ {{ title }}
194
+ </span>
195
+ <KateCmsUiButton
196
+ tag="button"
197
+ :variant="['tertiary', 'small', 'icon']"
198
+ aria-label="Close"
199
+ @click="emit('close')"
200
+ >
201
+ <svg
202
+ xmlns="http://www.w3.org/2000/svg"
203
+ viewBox="0 0 640 640"
204
+ fill="currentColor"
205
+ >
206
+ <path
207
+ 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"
208
+ />
209
+ </svg>
210
+ </KateCmsUiButton>
211
+ </div>
212
+
213
+ <KateCmsMediaLibraryFilters
214
+ v-if="libraryEnabled && !cropping && !processing"
215
+ :filters="filters"
216
+ :months="months"
217
+ id-prefix="picker"
218
+ :class="`${rootClass}__filters`"
219
+ @update:filters="emit('update:filters', $event)"
220
+ />
221
+
222
+ <div
223
+ ref="body"
224
+ :class="`${rootClass}__dialog-body`"
225
+ >
226
+ <div
227
+ v-if="error"
228
+ :class="`${rootClass}__error`"
229
+ >
230
+ {{ error }}
231
+ </div>
232
+
233
+ <div
234
+ v-if="processing"
235
+ :class="`${rootClass}__processing`"
236
+ >
237
+ <span :class="`${rootClass}__spinner`" />
238
+ <span :class="`${rootClass}__processing-text`">{{ processingText }}</span>
239
+ </div>
240
+
241
+ <template v-else-if="cropping">
242
+ <slot />
243
+ </template>
244
+
245
+ <template v-else>
246
+ <div
247
+ v-if="uploading"
248
+ :class="`${rootClass}__hint`"
249
+ >
250
+ Uploading…
251
+ </div>
252
+
253
+ <template v-if="libraryEnabled">
254
+ <div
255
+ v-if="loading && !library.length"
256
+ :class="`${rootClass}__hint`"
257
+ >
258
+ Loading…
259
+ </div>
260
+ <div
261
+ v-else-if="!library.length && !hasMore"
262
+ :class="`${rootClass}__hint`"
263
+ >
264
+ {{ emptyLibraryHint }}
265
+ </div>
266
+ <template v-else>
267
+ <div :class="`${rootClass}__grid`">
268
+ <button
269
+ v-for="item in library"
270
+ :key="item.id"
271
+ type="button"
272
+ :class="[
273
+ `${rootClass}__grid-item`,
274
+ {
275
+ 'is-selected': isHighlighted(item),
276
+ 'is-disabled': multiple && isAlreadySelected(item.id),
277
+ },
278
+ ]"
279
+ :disabled="multiple && isAlreadySelected(item.id)"
280
+ @click="onItemClick(item)"
281
+ >
282
+ <img
283
+ v-if="isImage(item)"
284
+ :src="thumbUrl(item)"
285
+ :alt="item.alt || ''"
286
+ :class="`${rootClass}__grid-image`"
287
+ >
288
+ <span
289
+ v-else
290
+ :class="`${rootClass}__grid-file`"
291
+ >
292
+ <span
293
+ :class="`${rootClass}__grid-file-icon`"
294
+ aria-hidden="true"
295
+ >
296
+ <svg
297
+ xmlns="http://www.w3.org/2000/svg"
298
+ viewBox="0 0 640 640"
299
+ >
300
+ <path
301
+ d="M304 112L192 112C183.2 112 176 119.2 176 128L176 512C176 520.8 183.2 528 192 528L448 528C456.8 528 464 520.8 464 512L464 272L376 272C336.2 272 304 239.8 304 200L304 112zM444.1 224L352 131.9L352 200C352 213.3 362.7 224 376 224L444.1 224zM128 128C128 92.7 156.7 64 192 64L325.5 64C342.5 64 358.8 70.7 370.8 82.7L493.3 205.3C505.3 217.3 512 233.6 512 250.6L512 512C512 547.3 483.3 576 448 576L192 576C156.7 576 128 547.3 128 512L128 128z"
302
+ />
303
+ </svg>
304
+ </span>
305
+ <span :class="`${rootClass}__grid-file-name`">{{ fileLabel(item) }}</span>
306
+ </span>
307
+ </button>
308
+ </div>
309
+ <div
310
+ v-if="hasMore"
311
+ ref="sentinel"
312
+ :class="`${rootClass}__hint`"
313
+ >
314
+ {{ loadingMore ? 'Loading…' : '' }}
315
+ </div>
316
+ </template>
317
+ </template>
318
+
319
+ <div
320
+ v-else
321
+ :class="`${rootClass}__hint`"
322
+ >
323
+ {{ noLibraryHint }}
324
+ </div>
325
+ </template>
326
+ </div>
327
+
328
+ <div
329
+ v-if="!cropping && !processing"
330
+ :class="`${rootClass}__dialog-foot`"
331
+ >
332
+ <KateCmsUiButton
333
+ tag="button"
334
+ variant="secondary"
335
+ :disabled="uploading"
336
+ @click="emit('upload')"
337
+ >
338
+ {{ uploading ? 'Uploading…' : (isImageKind ? 'Upload image' : 'Upload file') }}
339
+ </KateCmsUiButton>
340
+
341
+ <KateCmsUiButton
342
+ v-if="multiple && pendingCount"
343
+ tag="button"
344
+ :disabled="uploading"
345
+ @click="confirmSelection"
346
+ >
347
+ {{ confirmLabel }}
348
+ </KateCmsUiButton>
349
+
350
+ <KateCmsUiButton
351
+ tag="button"
352
+ :variant="multiple ? 'secondary' : undefined"
353
+ @click="emit('close')"
354
+ >
355
+ Close
356
+ </KateCmsUiButton>
357
+ </div>
358
+ </div>
359
+ </div>
360
+ </Teleport>
361
+ </template>
362
+
363
+ <style scoped lang="scss">
364
+ @use "../../assets/styles" as *;
365
+
366
+ $root: '.katecms-media-modal';
367
+
368
+ #{$root} {
369
+ position: fixed;
370
+ inset: 0;
371
+ z-index: 1000;
372
+ display: flex;
373
+ padding: math-rem(20);
374
+ background-color: $color-overlay;
375
+
376
+ &__dialog {
377
+ display: flex;
378
+ flex-direction: column;
379
+ width: 100%;
380
+ height: 100%;
381
+ background-color: $color-surface;
382
+ border-radius: $border-radius;
383
+ box-shadow: $shadow-md;
384
+ overflow: hidden;
385
+
386
+ &-head {
387
+ display: flex;
388
+ align-items: center;
389
+ justify-content: space-between;
390
+ padding: math-rem(14) math-rem(16);
391
+ border-bottom: 1px solid $color-border;
392
+ }
393
+
394
+ &-title {
395
+ font-weight: 600;
396
+ color: $color-ink;
397
+ }
398
+
399
+ &-body {
400
+ flex: 1;
401
+ overflow-y: auto;
402
+ }
403
+
404
+ &-foot {
405
+ display: flex;
406
+ justify-content: flex-end;
407
+ gap: math-rem(8);
408
+ padding: math-rem(14) math-rem(16);
409
+ border-top: 1px solid $color-border;
410
+ }
411
+ }
412
+
413
+ &__filters {
414
+ position: relative;
415
+ z-index: 2;
416
+ padding: math-rem(12) math-rem(16);
417
+ border-bottom: 1px solid $color-border;
418
+ }
419
+
420
+ &__grid {
421
+ display: grid;
422
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
423
+ gap: math-rem(10);
424
+ padding: math-rem(16);
425
+
426
+ &-item {
427
+ aspect-ratio: 1 / 1;
428
+ padding: 0;
429
+ border: 2px solid transparent;
430
+ border-radius: $border-radius;
431
+ overflow: hidden;
432
+ background-color: $color-bg;
433
+ cursor: pointer;
434
+
435
+ &.is-selected {
436
+ border-color: $color-accent;
437
+ }
438
+
439
+ &.is-disabled {
440
+ opacity: .45;
441
+ cursor: default;
442
+ }
443
+ }
444
+
445
+ &-image {
446
+ display: block;
447
+ width: 100%;
448
+ height: 100%;
449
+ object-fit: cover;
450
+ }
451
+
452
+ &-file {
453
+ display: flex;
454
+ flex-direction: column;
455
+ align-items: center;
456
+ justify-content: center;
457
+ gap: math-rem(8);
458
+ width: 100%;
459
+ height: 100%;
460
+ padding: math-rem(10);
461
+ text-align: center;
462
+
463
+ &-icon {
464
+ display: block;
465
+ width: 28px;
466
+ height: 28px;
467
+
468
+ svg {
469
+ display: block;
470
+ width: 100%;
471
+ height: 100%;
472
+ fill: $color-muted;
473
+ }
474
+ }
475
+
476
+ &-name {
477
+ font-size: math-rem(11);
478
+ color: $color-ink;
479
+ word-break: break-all;
480
+ display: -webkit-box;
481
+ -webkit-line-clamp: 3;
482
+ -webkit-box-orient: vertical;
483
+ overflow: hidden;
484
+ }
485
+ }
486
+ }
487
+
488
+ &__hint {
489
+ margin: 0;
490
+ padding: math-rem(16);
491
+ color: $color-muted;
492
+ }
493
+
494
+ &__processing {
495
+ display: flex;
496
+ flex-direction: column;
497
+ align-items: center;
498
+ justify-content: center;
499
+ gap: math-rem(12);
500
+ height: 100%;
501
+ padding: math-rem(40);
502
+ color: $color-muted;
503
+ }
504
+
505
+ &__spinner {
506
+ width: 36px;
507
+ height: 36px;
508
+ border: 3px solid $color-border;
509
+ border-top-color: $color-accent;
510
+ border-radius: 50%;
511
+ animation: katecms-media-modal-spin 0.8s linear infinite;
512
+ }
513
+
514
+ &__error {
515
+ margin: 0;
516
+ padding: math-rem(12) math-rem(16);
517
+ color: $color-danger;
518
+ }
519
+ }
520
+
521
+ @keyframes katecms-media-modal-spin {
522
+ to {
523
+ transform: rotate(360deg);
524
+ }
525
+ }
526
+ </style>