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,2 @@
1
+ /** Headers for a stored upload. SVG and similar types are downloads, not pages. */
2
+ export declare function uploadResponseHeaders(key: string): Record<string, string>;
@@ -0,0 +1,30 @@
1
+ import { extname } from "node:path";
2
+ const MIME_BY_EXT = {
3
+ ".jpg": "image/jpeg",
4
+ ".jpeg": "image/jpeg",
5
+ ".png": "image/png",
6
+ ".webp": "image/webp",
7
+ ".gif": "image/gif",
8
+ ".svg": "image/svg+xml",
9
+ ".avif": "image/avif",
10
+ ".pdf": "application/pdf",
11
+ ".mp4": "video/mp4",
12
+ ".mp3": "audio/mpeg"
13
+ };
14
+ const DOWNLOAD_EXTS = /* @__PURE__ */ new Set([".svg", ".html", ".htm", ".xhtml", ".xml", ".pdf"]);
15
+ function downloadName(key) {
16
+ const base = key.split(/[/\\]/).pop() || "download";
17
+ return base.replace(/[\r\n"]/g, "") || "download";
18
+ }
19
+ export function uploadResponseHeaders(key) {
20
+ const ext = extname(key).toLowerCase();
21
+ const mime = MIME_BY_EXT[ext] || "application/octet-stream";
22
+ const disposition = DOWNLOAD_EXTS.has(ext) || mime === "application/octet-stream" ? "attachment" : "inline";
23
+ return {
24
+ "X-Content-Type-Options": "nosniff",
25
+ "Content-Security-Policy": "sandbox; default-src 'none'",
26
+ "Content-Disposition": `${disposition}; filename="${downloadName(key)}"`,
27
+ "Content-Type": mime,
28
+ "Cache-Control": "public, max-age=31536000, immutable"
29
+ };
30
+ }
@@ -0,0 +1,13 @@
1
+ import type { MediaItem, RoleMap, User } from '@katecms/core';
2
+ import type { AdminUser, RoleOption } from '../../utils/admin-users.js';
3
+ export declare function fail(statusCode: number, message: string): never;
4
+ export declare function toAdminUser(user: User): AdminUser;
5
+ export declare function roleOptions(roles: RoleMap): RoleOption[];
6
+ /** Role assigned when the create payload omits `role`. */
7
+ export declare function defaultAssignableRole(roles: RoleMap): string;
8
+ export declare function readName(value: unknown): string | null;
9
+ /**
10
+ * Parse an optional avatar payload: a media item, or null to clear.
11
+ * Empty / missing values become null; malformed payloads are rejected.
12
+ */
13
+ export declare function readAvatar(value: unknown): MediaItem | null;
@@ -0,0 +1,47 @@
1
+ import { createError } from "h3";
2
+ import {
3
+ ADMIN_ROLE,
4
+ isImageMedia,
5
+ isMediaItem,
6
+ isValidRole,
7
+ SUBSCRIBER_ROLE,
8
+ toUserFieldValue
9
+ } from "@katecms/core";
10
+ const STATUS_PHRASE = {
11
+ 400: "Bad Request",
12
+ 403: "Forbidden",
13
+ 404: "Not Found",
14
+ 409: "Conflict",
15
+ 422: "Unprocessable Entity"
16
+ };
17
+ export function fail(statusCode, message) {
18
+ throw createError({
19
+ statusCode,
20
+ statusMessage: STATUS_PHRASE[statusCode] ?? "Error",
21
+ message
22
+ });
23
+ }
24
+ export function toAdminUser(user) {
25
+ return toUserFieldValue(user);
26
+ }
27
+ export function roleOptions(roles) {
28
+ return Object.values(roles).map((role) => ({ slug: role.slug, label: role.label }));
29
+ }
30
+ export function defaultAssignableRole(roles) {
31
+ if (isValidRole(roles, SUBSCRIBER_ROLE)) {
32
+ return SUBSCRIBER_ROLE;
33
+ }
34
+ return ADMIN_ROLE;
35
+ }
36
+ export function readName(value) {
37
+ return typeof value === "string" && value.trim().length ? value.trim() : null;
38
+ }
39
+ export function readAvatar(value) {
40
+ if (value === null || value === void 0) {
41
+ return null;
42
+ }
43
+ if (!isMediaItem(value) || !isImageMedia(value) || !Number.isInteger(value.id) || value.id <= 0 || !value.filename) {
44
+ fail(422, "Invalid avatar.");
45
+ }
46
+ return value;
47
+ }
@@ -0,0 +1,20 @@
1
+ import type { MediaItem, UserFieldValue } from '@katecms/core';
2
+ /** A user row in the admin UI. Same shape as a stored `user` field value. */
3
+ export type AdminUser = UserFieldValue;
4
+ /** A role option (slug + label) for pickers and table labels. */
5
+ export interface RoleOption {
6
+ slug: string;
7
+ label: string;
8
+ }
9
+ /** Response of `GET /api/_katecms/users`. */
10
+ export interface UsersResponse {
11
+ users: AdminUser[];
12
+ roles: RoleOption[];
13
+ currentUserId: number;
14
+ canCreate: boolean;
15
+ canUpdate: boolean;
16
+ canDelete: boolean;
17
+ }
18
+ /** Prefer a compact image variant for avatars, then the original URL. */
19
+ export declare function avatarSrc(avatar: MediaItem | null | undefined): string | null;
20
+ export declare function userInitials(user: Pick<AdminUser, 'name' | 'email'>): string;
@@ -0,0 +1,19 @@
1
+ import { isImageMedia } from "@katecms/core";
2
+ export function avatarSrc(avatar) {
3
+ if (!avatar || !isImageMedia(avatar)) {
4
+ return null;
5
+ }
6
+ const preferred = avatar.variants?.find((variant) => variant.size === "thumbnail") ?? avatar.variants?.find((variant) => variant.size === "medium");
7
+ return preferred?.url || avatar.url || null;
8
+ }
9
+ export function userInitials(user) {
10
+ const name = user.name?.trim();
11
+ if (name) {
12
+ const parts = name.split(/\s+/).filter(Boolean);
13
+ if (parts.length >= 2) {
14
+ return `${parts[0][0]}${parts[1][0]}`.toUpperCase();
15
+ }
16
+ return name.slice(0, 2).toUpperCase();
17
+ }
18
+ return (user.email[0] || "?").toUpperCase();
19
+ }
@@ -0,0 +1,6 @@
1
+ export interface AuthClientError {
2
+ message: string;
3
+ retryAfterMs: number;
4
+ }
5
+ /** Pull statusMessage / retryAfterMs out of a `$fetch` / h3 error payload. */
6
+ export declare function parseAuthError(err: unknown, fallback: string): AuthClientError;
@@ -0,0 +1,11 @@
1
+ function asRecord(value) {
2
+ return value && typeof value === "object" ? value : {};
3
+ }
4
+ export function parseAuthError(err, fallback) {
5
+ const root = asRecord(err);
6
+ const data = asRecord(root.data);
7
+ const inner = asRecord(data.data);
8
+ const message = [inner.message, data.message, inner.statusMessage, data.statusMessage, root.statusMessage].find((value) => typeof value === "string" && value.length > 0) ?? fallback;
9
+ const retryAfterMs = [inner.retryAfterMs, data.retryAfterMs].find((value) => typeof value === "number" && value > 0) ?? 0;
10
+ return { message, retryAfterMs };
11
+ }
@@ -0,0 +1,5 @@
1
+ /** Normalise a config path segment into an absolute route (`admin` → `/admin`). */
2
+ export declare function cmsRoutePath(segment: string): string;
3
+ /** Child of the admin route (`admin` + `login` → `/admin/login`). */
4
+ export declare function cmsAdminChildPath(adminPath: string, segment: string): string;
5
+ export declare function isCmsAdminPath(path: string, adminPath: string): boolean;
@@ -0,0 +1,13 @@
1
+ export function cmsRoutePath(segment) {
2
+ const trimmed = String(segment ?? "").replace(/^\/+|\/+$/g, "");
3
+ return `/${trimmed}`;
4
+ }
5
+ export function cmsAdminChildPath(adminPath, segment) {
6
+ const root = cmsRoutePath(adminPath).replace(/\/$/, "");
7
+ const child = String(segment ?? "").replace(/^\/+|\/+$/g, "");
8
+ return child ? `${root}/${child}` : root;
9
+ }
10
+ export function isCmsAdminPath(path, adminPath) {
11
+ const root = cmsRoutePath(adminPath);
12
+ return path === root || path.startsWith(`${root}/`);
13
+ }
@@ -0,0 +1,176 @@
1
+ import type { CollectionStatus, CollectionStatusCounts, Fields } from '@katecms/core';
2
+ /** Collection definition exposed to the admin UI (from CMS config). */
3
+ export interface AdminCollectionMeta {
4
+ slug: string;
5
+ labels: {
6
+ name: string;
7
+ singularName: string;
8
+ };
9
+ hierarchical: boolean;
10
+ autosave: boolean;
11
+ /** `false` only when the collection config sets `revisions: false`. */
12
+ revisions: boolean;
13
+ public: boolean;
14
+ has_archive: boolean | string;
15
+ perPage: number;
16
+ rewrite?: string;
17
+ fields: Fields;
18
+ }
19
+ /** Assigned dictionary term on a public collection entry. */
20
+ export interface PublicDictionaryTerm {
21
+ id: number;
22
+ type: string;
23
+ slug: string;
24
+ slugPath: string;
25
+ title: string;
26
+ fields: Record<string, unknown>;
27
+ parentId: number | null;
28
+ }
29
+ /** A collection entry as shown in the admin UI and public resolve. */
30
+ export interface AdminEntry {
31
+ id: number;
32
+ type: string;
33
+ status: CollectionStatus;
34
+ slug: string;
35
+ slugPath: string;
36
+ title: string;
37
+ fields: Record<string, unknown>;
38
+ parentId: number | null;
39
+ /** Nesting level in a hierarchical list (0 = top-level). */
40
+ depth?: number;
41
+ menuOrder: number;
42
+ authorId: number | null;
43
+ /** Display name for the list (name, else email). Null when unknown. */
44
+ authorName?: string | null;
45
+ createdAt: string;
46
+ updatedAt: string;
47
+ publishedAt: string | null;
48
+ canUpdate?: boolean;
49
+ canDelete?: boolean;
50
+ /** Selected term ids keyed by dictionary slug. */
51
+ dictionaryIds?: Record<string, number[]>;
52
+ /** Assigned terms keyed by dictionary slug (public resolve). */
53
+ dictionaries?: Record<string, PublicDictionaryTerm[]>;
54
+ }
55
+ /** One saved version of a collection entry, without the field payload. */
56
+ export interface EntryRevisionItem {
57
+ id: number;
58
+ createdAt: string;
59
+ authorName: string;
60
+ title: string;
61
+ status: CollectionStatus;
62
+ }
63
+ export interface ParentOption {
64
+ id: number;
65
+ title: string;
66
+ slug: string;
67
+ parentId: number | null;
68
+ slugPath: string;
69
+ depth: number;
70
+ }
71
+ /** Dictionary attached to a collection, with terms for the entry sidebar picker. */
72
+ export interface CollectionDictionaryPicker {
73
+ slug: string;
74
+ labels: {
75
+ name: string;
76
+ singularName: string;
77
+ };
78
+ multiple: boolean;
79
+ terms: ParentOption[];
80
+ }
81
+ export interface CollectionListResponse {
82
+ collection: AdminCollectionMeta;
83
+ entries: AdminEntry[];
84
+ counts: CollectionStatusCounts;
85
+ /** `YYYY-MM` months that contain entries for the current status and search. */
86
+ months?: string[];
87
+ page: number;
88
+ perPage: number;
89
+ total: number;
90
+ canCreate: boolean;
91
+ canUpdate: boolean;
92
+ canDelete: boolean;
93
+ parents?: ParentOption[];
94
+ dictionaries?: CollectionDictionaryPicker[];
95
+ }
96
+ export interface CollectionEntryResponse {
97
+ collection: AdminCollectionMeta;
98
+ entry: AdminEntry;
99
+ canUpdate: boolean;
100
+ canDelete: boolean;
101
+ parents?: ParentOption[];
102
+ dictionaries?: CollectionDictionaryPicker[];
103
+ }
104
+ export interface ResolveEntryResponse {
105
+ kind: 'entry';
106
+ collection: AdminCollectionMeta;
107
+ entry: AdminEntry;
108
+ /** True when unpublished statuses were actually allowed for this request. */
109
+ preview: boolean;
110
+ }
111
+ export interface ResolveArchiveResponse {
112
+ kind: 'archive';
113
+ collection: AdminCollectionMeta;
114
+ entries: AdminEntry[];
115
+ /** True when unpublished statuses were actually allowed for this request. */
116
+ preview: boolean;
117
+ page: number;
118
+ perPage: number;
119
+ total: number;
120
+ }
121
+ export interface PublicTermEntry {
122
+ id: number;
123
+ title: string;
124
+ path: string;
125
+ }
126
+ export interface ResolveTermResponse {
127
+ kind: 'term';
128
+ dictionary: {
129
+ slug: string;
130
+ labels: {
131
+ name: string;
132
+ singularName: string;
133
+ };
134
+ };
135
+ term: PublicDictionaryTerm;
136
+ entries: PublicTermEntry[];
137
+ path: string;
138
+ }
139
+ export type ResolveResponse = ResolveEntryResponse | ResolveArchiveResponse | ResolveTermResponse;
140
+ /** Public list from `/api/_katecms/query`. */
141
+ export interface QueryCollectionResponse {
142
+ entries: AdminEntry[];
143
+ collections: AdminCollectionMeta[];
144
+ /** True when unpublished statuses were actually allowed for this request. */
145
+ preview: boolean;
146
+ page: number;
147
+ perPage: number;
148
+ total: number;
149
+ }
150
+ export interface CollectionEntryFormModel {
151
+ title: string;
152
+ slug: string;
153
+ status: CollectionStatus;
154
+ parentId: number | null;
155
+ menuOrder: number;
156
+ publishedAt: string | null;
157
+ authorId: number | null;
158
+ fields: Record<string, unknown>;
159
+ /** Single: `number | null`. Multiple: `number[]`. */
160
+ dictionaryIds: Record<string, number | number[] | null>;
161
+ }
162
+ export type CollectionListFilter = 'all' | CollectionStatus;
163
+ export declare function collectionApi(slug: string, id?: number | 'trash'): string;
164
+ export declare function collectionStatusLabel(status: CollectionStatus): string;
165
+ export declare function emptyDictionarySelection(pickers: CollectionDictionaryPicker[]): Record<string, number | number[] | null>;
166
+ export declare function formDictionarySelection(pickers: CollectionDictionaryPicker[], ids: Record<string, number[]> | undefined): Record<string, number | number[] | null>;
167
+ /** Slim collection descriptors sent on `public.katecms.collections` (sidebar). */
168
+ export interface PublicCollectionNav {
169
+ labels: {
170
+ name: string;
171
+ singularName: string;
172
+ };
173
+ icon?: string;
174
+ public?: boolean;
175
+ has_archive?: boolean | string;
176
+ }
@@ -0,0 +1,30 @@
1
+ export function collectionApi(slug, id) {
2
+ const base = `/api/_katecms/collections/${encodeURIComponent(slug)}`;
3
+ if (id == null) {
4
+ return base;
5
+ }
6
+ return `${base}/${id}`;
7
+ }
8
+ export function collectionStatusLabel(status) {
9
+ if (status === "published") {
10
+ return "Published";
11
+ }
12
+ if (status === "draft") {
13
+ return "Draft";
14
+ }
15
+ return "Trash";
16
+ }
17
+ export function emptyDictionarySelection(pickers) {
18
+ return Object.fromEntries(
19
+ pickers.map((picker) => [picker.slug, picker.multiple ? [] : null])
20
+ );
21
+ }
22
+ export function formDictionarySelection(pickers, ids) {
23
+ const selected = ids ?? {};
24
+ return Object.fromEntries(
25
+ pickers.map((picker) => {
26
+ const values = selected[picker.slug] ?? [];
27
+ return [picker.slug, picker.multiple ? values : values[0] ?? null];
28
+ })
29
+ );
30
+ }
@@ -0,0 +1,65 @@
1
+ import type { Fields } from '@katecms/core';
2
+ import type { ParentOption } from './collections.js';
3
+ export type { ParentOption };
4
+ /** Dictionary type exposed to the admin UI (from CMS config). */
5
+ export interface AdminDictionaryMeta {
6
+ slug: string;
7
+ labels: {
8
+ name: string;
9
+ singularName: string;
10
+ };
11
+ fields: Fields;
12
+ collections: string[];
13
+ multiple: boolean;
14
+ hierarchical: boolean;
15
+ public: boolean;
16
+ rewrite?: string;
17
+ }
18
+ /** A dictionary term as shown in the admin UI. */
19
+ export interface AdminDictionaryTerm {
20
+ id: number;
21
+ type: string;
22
+ slug: string;
23
+ slugPath: string;
24
+ title: string;
25
+ fields: Record<string, unknown>;
26
+ parentId: number | null;
27
+ /** Nesting level in a hierarchical list (0 = top-level). */
28
+ depth?: number;
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ canUpdate?: boolean;
32
+ canDelete?: boolean;
33
+ }
34
+ export interface DictionaryListResponse {
35
+ dictionary: AdminDictionaryMeta;
36
+ terms: AdminDictionaryTerm[];
37
+ parents: ParentOption[];
38
+ canCreate: boolean;
39
+ canUpdate: boolean;
40
+ canDelete: boolean;
41
+ }
42
+ export interface DictionaryTermResponse {
43
+ dictionary: AdminDictionaryMeta;
44
+ term: AdminDictionaryTerm;
45
+ canUpdate: boolean;
46
+ canDelete: boolean;
47
+ parents: ParentOption[];
48
+ }
49
+ export interface DictionaryTermFormModel {
50
+ title: string;
51
+ slug: string;
52
+ parentId: number | null;
53
+ fields: Record<string, unknown>;
54
+ }
55
+ /** Slim dictionary descriptors sent on `public.katecms.dictionaries` (sidebar). */
56
+ export interface PublicDictionaryNav {
57
+ labels: {
58
+ name: string;
59
+ singularName: string;
60
+ };
61
+ icon?: string;
62
+ }
63
+ /** Public term URL, or `null` when the dictionary is not public. */
64
+ export declare function dictionaryTermUrl(dictionary: Pick<AdminDictionaryMeta, 'slug' | 'public' | 'rewrite'>, slugPath: string): string | null;
65
+ export declare function dictionaryApi(slug: string, id?: number): string;
@@ -0,0 +1,14 @@
1
+ import { buildPublicPath } from "@katecms/core";
2
+ export function dictionaryTermUrl(dictionary, slugPath) {
3
+ if (!dictionary.public || !slugPath) {
4
+ return null;
5
+ }
6
+ return buildPublicPath(dictionary.rewrite, dictionary.slug, slugPath);
7
+ }
8
+ export function dictionaryApi(slug, id) {
9
+ const base = `/api/_katecms/dictionaries/${encodeURIComponent(slug)}`;
10
+ if (id == null) {
11
+ return base;
12
+ }
13
+ return `${base}/${id}`;
14
+ }
@@ -0,0 +1,4 @@
1
+ import { type ComputedRef, type InjectionKey, type Ref } from 'vue';
2
+ export declare const miraiCmsFieldErrorsKey: InjectionKey<Ref<Record<string, string>>>;
3
+ export declare function provideKateCmsFieldErrors(errors: Ref<Record<string, string>>): void;
4
+ export declare function useKateCmsFieldError(fieldKey: () => string): ComputedRef<string>;
@@ -0,0 +1,9 @@
1
+ import { computed, inject, provide } from "vue";
2
+ export const miraiCmsFieldErrorsKey = Symbol("katecmsFieldErrors");
3
+ export function provideKateCmsFieldErrors(errors) {
4
+ provide(miraiCmsFieldErrorsKey, errors);
5
+ }
6
+ export function useKateCmsFieldError(fieldKey) {
7
+ const errors = inject(miraiCmsFieldErrorsKey, null);
8
+ return computed(() => errors?.value[fieldKey()] ?? "");
9
+ }
@@ -0,0 +1,19 @@
1
+ import { type InjectionKey, type Ref } from 'vue';
2
+ /**
3
+ * Parent form / group values for layout-only fields (`tab`, `accordion`).
4
+ * May be a reactive object or a ref to one (e.g. group `defineModel`).
5
+ */
6
+ export type KateCmsFieldValuesStore = Ref<Record<string, unknown>> | Record<string, unknown>;
7
+ export declare const miraiCmsFieldValuesKey: InjectionKey<KateCmsFieldValuesStore>;
8
+ export declare function provideKateCmsFieldValues(store: KateCmsFieldValuesStore): void;
9
+ /**
10
+ * Read/write helpers for the nearest provided field-values store.
11
+ * Layout fields (`tab` / `accordion`) use this instead of their own v-model.
12
+ */
13
+ export declare function useKateCmsFieldValues(): {
14
+ store: KateCmsFieldValuesStore | null;
15
+ getValues: () => Record<string, unknown>;
16
+ setValue: (key: string, value: unknown) => void;
17
+ ensureDefaults: (defaults: Record<string, unknown>) => void;
18
+ removeKey: (key: string) => void;
19
+ };
@@ -0,0 +1,82 @@
1
+ import { inject, isRef, provide } from "vue";
2
+ export const miraiCmsFieldValuesKey = Symbol("miraiCmsFieldValues");
3
+ export function provideKateCmsFieldValues(store) {
4
+ provide(miraiCmsFieldValuesKey, store);
5
+ }
6
+ function readStore(store) {
7
+ if (!store) {
8
+ return {};
9
+ }
10
+ if (isRef(store)) {
11
+ const value = store.value;
12
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
13
+ }
14
+ return store;
15
+ }
16
+ export function useKateCmsFieldValues() {
17
+ const store = inject(miraiCmsFieldValuesKey, null);
18
+ function getValues() {
19
+ return readStore(store);
20
+ }
21
+ function setValue(key, value) {
22
+ if (!store) {
23
+ return;
24
+ }
25
+ if (isRef(store)) {
26
+ const current = readStore(store);
27
+ store.value = {
28
+ ...current,
29
+ [key]: value
30
+ };
31
+ return;
32
+ }
33
+ store[key] = value;
34
+ }
35
+ function ensureDefaults(defaults) {
36
+ if (!store) {
37
+ return;
38
+ }
39
+ if (isRef(store)) {
40
+ const current = { ...readStore(store) };
41
+ let changed = false;
42
+ for (const [key, value] of Object.entries(defaults)) {
43
+ if (!(key in current)) {
44
+ current[key] = value;
45
+ changed = true;
46
+ }
47
+ }
48
+ if (changed) {
49
+ store.value = current;
50
+ }
51
+ return;
52
+ }
53
+ for (const [key, value] of Object.entries(defaults)) {
54
+ if (!(key in store)) {
55
+ store[key] = value;
56
+ }
57
+ }
58
+ }
59
+ function removeKey(key) {
60
+ if (!store) {
61
+ return;
62
+ }
63
+ if (isRef(store)) {
64
+ const current = readStore(store);
65
+ if (!(key in current)) {
66
+ return;
67
+ }
68
+ const next = { ...current };
69
+ Reflect.deleteProperty(next, key);
70
+ store.value = next;
71
+ return;
72
+ }
73
+ Reflect.deleteProperty(store, key);
74
+ }
75
+ return {
76
+ store,
77
+ getValues,
78
+ setValue,
79
+ ensureDefaults,
80
+ removeKey
81
+ };
82
+ }
@@ -0,0 +1,4 @@
1
+ import type { Component } from 'vue';
2
+ /** Registers a field widget supplied by an addon. `type` matches the field config `type`. */
3
+ export declare function registerKateCmsField(type: string, component: Component): void;
4
+ export declare function resolveField(type: string): Component | undefined;
@@ -0,0 +1,20 @@
1
+ const fieldModules = import.meta.glob(
2
+ "../internal/fields/*.vue",
3
+ { eager: true }
4
+ );
5
+ const fieldComponents = Object.fromEntries(
6
+ Object.entries(fieldModules).map(([path, mod]) => {
7
+ const name = path.split(/[/\\]/).pop().replace(/\.vue$/, "");
8
+ return [name, mod.default];
9
+ })
10
+ );
11
+ const extraFieldComponents = /* @__PURE__ */ new Map();
12
+ export function registerKateCmsField(type, component) {
13
+ extraFieldComponents.set(type, component);
14
+ }
15
+ function toPascalCase(str) {
16
+ return str.split(/[_\-\s]+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
17
+ }
18
+ export function resolveField(type) {
19
+ return fieldComponents[`${toPascalCase(type)}Field`] ?? extraFieldComponents.get(type);
20
+ }
@@ -0,0 +1,54 @@
1
+ import type { MediaItem } from '@katecms/core';
2
+ /** Library filter shown in the media page and file pickers. */
3
+ export type MediaTypeFilter = 'all' | 'image' | 'audio' | 'video' | 'document' | 'spreadsheet' | 'archive';
4
+ /** How the library list is ordered. The part after the hyphen is the direction. */
5
+ export type MediaSort = 'date-desc' | 'date-asc' | 'author-asc' | 'author-desc' | 'name-asc' | 'name-desc' | 'filesize-desc' | 'filesize-asc' | 'dimensions-desc' | 'dimensions-asc';
6
+ export interface MediaLibraryFilterState {
7
+ type: MediaTypeFilter;
8
+ /** `all` or `YYYY-MM`. */
9
+ month: string;
10
+ search: string;
11
+ sort: MediaSort;
12
+ }
13
+ export interface MediaLibraryPage<T> {
14
+ media: T[];
15
+ total: number;
16
+ /** `YYYY-MM` values that contain matches for the current type and search. */
17
+ months: string[];
18
+ }
19
+ export declare const MEDIA_TYPE_FILTERS: MediaTypeFilter[];
20
+ export declare const MEDIA_SORTS: MediaSort[];
21
+ export declare const MEDIA_SORT_CHOICES: {
22
+ val: MediaSort;
23
+ lbl: string;
24
+ }[];
25
+ export declare const MEDIA_TYPE_CHOICES: {
26
+ val: MediaTypeFilter;
27
+ lbl: string;
28
+ }[];
29
+ export declare const DOCUMENT_MIME_TYPES: readonly ["application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.ms-word.document.macroEnabled.12", "application/vnd.ms-word.template.macroEnabled.12", "application/vnd.oasis.opendocument.text", "application/vnd.apple.pages", "application/pdf", "application/vnd.ms-xpsdocument", "application/oxps", "application/rtf", "application/wordperfect", "application/octet-stream"];
30
+ export declare const SPREADSHEET_MIME_TYPES: readonly ["application/vnd.apple.numbers", "application/vnd.oasis.opendocument.spreadsheet", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-excel.sheet.macroEnabled.12", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"];
31
+ export declare const ARCHIVE_MIME_TYPES: readonly ["application/x-gzip", "application/rar", "application/x-tar", "application/zip", "application/x-7z-compressed"];
32
+ export declare function defaultMediaLibraryFilters(): MediaLibraryFilterState;
33
+ export declare function isMediaTypeFilter(value: unknown): value is MediaTypeFilter;
34
+ export declare function isMediaSort(value: unknown): value is MediaSort;
35
+ export declare function normalizeMediaLibraryFilters(value: MediaLibraryFilterState): MediaLibraryFilterState;
36
+ export declare function mediaFiltersActive(filters: MediaLibraryFilterState): boolean;
37
+ /** Minutes to add to UTC to get the viewer's local time. */
38
+ export declare function clampUtcOffsetMinutes(value: number): number;
39
+ export declare function localUtcOffsetMinutes(now?: Date): number;
40
+ export declare function monthLabel(value: string): string;
41
+ /** Local calendar month for an ISO timestamp, as `YYYY-MM`. */
42
+ export declare function monthKey(iso: string, offsetMinutes: number): string;
43
+ /** Search text with LIKE wildcards removed. */
44
+ export declare function searchNeedle(value: string): string;
45
+ export declare function matchesMediaType(mime: string, type: MediaTypeFilter): boolean;
46
+ export declare function mediaMatchesFilters(item: Pick<MediaItem, 'mime_type' | 'filename' | 'alt' | 'caption' | 'created_at'>, filters: MediaLibraryFilterState, offsetMinutes?: number): boolean;
47
+ /**
48
+ * Query string for `GET /api/_katecms/media`.
49
+ * Image pickers pass `baseType: 'image'` so "All media items" still pages through images only.
50
+ */
51
+ export declare function mediaLibraryQuery(filters: MediaLibraryFilterState, paging: {
52
+ limit: number;
53
+ offset: number;
54
+ }, baseType?: 'image'): Record<string, string | number>;