@velastack/cms 0.1.0

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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +644 -0
  3. package/dist/cms.d.ts +6 -0
  4. package/dist/cms.js +30 -0
  5. package/dist/components/admin-bar/admin-bar-internal.svelte +1697 -0
  6. package/dist/components/admin-bar/admin-bar-internal.svelte.d.ts +12 -0
  7. package/dist/components/admin-bar/admin-bar.css +5 -0
  8. package/dist/components/admin-bar/admin-bar.svelte +355 -0
  9. package/dist/components/admin-bar/admin-bar.svelte.d.ts +7 -0
  10. package/dist/components/admin-bar/click-outside.d.ts +8 -0
  11. package/dist/components/admin-bar/click-outside.js +17 -0
  12. package/dist/components/admin-bar/css-root.svelte +23 -0
  13. package/dist/components/admin-bar/css-root.svelte.d.ts +19 -0
  14. package/dist/components/admin-bar/delete-page-dialog.svelte +326 -0
  15. package/dist/components/admin-bar/delete-page-dialog.svelte.d.ts +32 -0
  16. package/dist/components/admin-bar/history-panel.svelte +264 -0
  17. package/dist/components/admin-bar/history-panel.svelte.d.ts +8 -0
  18. package/dist/components/admin-bar/icons/bold.svelte +13 -0
  19. package/dist/components/admin-bar/icons/bold.svelte.d.ts +3 -0
  20. package/dist/components/admin-bar/icons/check.svelte +11 -0
  21. package/dist/components/admin-bar/icons/check.svelte.d.ts +3 -0
  22. package/dist/components/admin-bar/icons/chevron-down.svelte +11 -0
  23. package/dist/components/admin-bar/icons/chevron-down.svelte.d.ts +3 -0
  24. package/dist/components/admin-bar/icons/chevron-right.svelte +11 -0
  25. package/dist/components/admin-bar/icons/chevron-right.svelte.d.ts +3 -0
  26. package/dist/components/admin-bar/icons/chevron-up.svelte +11 -0
  27. package/dist/components/admin-bar/icons/chevron-up.svelte.d.ts +3 -0
  28. package/dist/components/admin-bar/icons/code.svelte +14 -0
  29. package/dist/components/admin-bar/icons/code.svelte.d.ts +3 -0
  30. package/dist/components/admin-bar/icons/external-link.svelte +15 -0
  31. package/dist/components/admin-bar/icons/external-link.svelte.d.ts +3 -0
  32. package/dist/components/admin-bar/icons/file.svelte +19 -0
  33. package/dist/components/admin-bar/icons/file.svelte.d.ts +3 -0
  34. package/dist/components/admin-bar/icons/heading-2.svelte +16 -0
  35. package/dist/components/admin-bar/icons/heading-2.svelte.d.ts +3 -0
  36. package/dist/components/admin-bar/icons/heading-3.svelte +17 -0
  37. package/dist/components/admin-bar/icons/heading-3.svelte.d.ts +3 -0
  38. package/dist/components/admin-bar/icons/icon.svelte +41 -0
  39. package/dist/components/admin-bar/icons/icon.svelte.d.ts +21 -0
  40. package/dist/components/admin-bar/icons/images.svelte +16 -0
  41. package/dist/components/admin-bar/icons/images.svelte.d.ts +3 -0
  42. package/dist/components/admin-bar/icons/italic.svelte +15 -0
  43. package/dist/components/admin-bar/icons/italic.svelte.d.ts +3 -0
  44. package/dist/components/admin-bar/icons/link-2-off.svelte +16 -0
  45. package/dist/components/admin-bar/icons/link-2-off.svelte.d.ts +3 -0
  46. package/dist/components/admin-bar/icons/link.svelte +14 -0
  47. package/dist/components/admin-bar/icons/link.svelte.d.ts +3 -0
  48. package/dist/components/admin-bar/icons/list-ordered.svelte +18 -0
  49. package/dist/components/admin-bar/icons/list-ordered.svelte.d.ts +3 -0
  50. package/dist/components/admin-bar/icons/list.svelte +18 -0
  51. package/dist/components/admin-bar/icons/list.svelte.d.ts +3 -0
  52. package/dist/components/admin-bar/icons/loader-circle.svelte +11 -0
  53. package/dist/components/admin-bar/icons/loader-circle.svelte.d.ts +3 -0
  54. package/dist/components/admin-bar/icons/minus.svelte +11 -0
  55. package/dist/components/admin-bar/icons/minus.svelte.d.ts +3 -0
  56. package/dist/components/admin-bar/icons/quote.svelte +24 -0
  57. package/dist/components/admin-bar/icons/quote.svelte.d.ts +3 -0
  58. package/dist/components/admin-bar/icons/search.svelte +14 -0
  59. package/dist/components/admin-bar/icons/search.svelte.d.ts +3 -0
  60. package/dist/components/admin-bar/icons/trash-2.svelte +17 -0
  61. package/dist/components/admin-bar/icons/trash-2.svelte.d.ts +3 -0
  62. package/dist/components/admin-bar/icons/triangle-alert.svelte +15 -0
  63. package/dist/components/admin-bar/icons/triangle-alert.svelte.d.ts +3 -0
  64. package/dist/components/admin-bar/icons/types.d.ts +7 -0
  65. package/dist/components/admin-bar/icons/types.js +1 -0
  66. package/dist/components/admin-bar/icons/undo-2.svelte +14 -0
  67. package/dist/components/admin-bar/icons/undo-2.svelte.d.ts +3 -0
  68. package/dist/components/admin-bar/icons/upload.svelte +15 -0
  69. package/dist/components/admin-bar/icons/upload.svelte.d.ts +3 -0
  70. package/dist/components/admin-bar/icons/x.svelte +14 -0
  71. package/dist/components/admin-bar/icons/x.svelte.d.ts +3 -0
  72. package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte +96 -0
  73. package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte.d.ts +7 -0
  74. package/dist/components/admin-bar/locales-panel.svelte +137 -0
  75. package/dist/components/admin-bar/locales-panel.svelte.d.ts +9 -0
  76. package/dist/components/admin-bar/media-panel.svelte +282 -0
  77. package/dist/components/admin-bar/media-panel.svelte.d.ts +7 -0
  78. package/dist/components/admin-bar/new-page-chooser-dialog.svelte +56 -0
  79. package/dist/components/admin-bar/new-page-chooser-dialog.svelte.d.ts +10 -0
  80. package/dist/components/admin-bar/new-page-dialog.svelte +126 -0
  81. package/dist/components/admin-bar/new-page-dialog.svelte.d.ts +14 -0
  82. package/dist/components/admin-bar/page-config.d.ts +61 -0
  83. package/dist/components/admin-bar/page-config.js +24 -0
  84. package/dist/components/admin-bar/pages-panel.svelte +639 -0
  85. package/dist/components/admin-bar/pages-panel.svelte.d.ts +13 -0
  86. package/dist/components/admin-bar/panel-footer.svelte +21 -0
  87. package/dist/components/admin-bar/panel-footer.svelte.d.ts +8 -0
  88. package/dist/components/admin-bar/panel-header.svelte +29 -0
  89. package/dist/components/admin-bar/panel-header.svelte.d.ts +10 -0
  90. package/dist/components/admin-bar/panel.svelte +41 -0
  91. package/dist/components/admin-bar/panel.svelte.d.ts +10 -0
  92. package/dist/components/admin-bar/publish-dialog.svelte +387 -0
  93. package/dist/components/admin-bar/publish-dialog.svelte.d.ts +16 -0
  94. package/dist/components/admin-bar/resolve-route.d.ts +20 -0
  95. package/dist/components/admin-bar/resolve-route.js +50 -0
  96. package/dist/components/admin-bar/seo-panel.svelte +387 -0
  97. package/dist/components/admin-bar/seo-panel.svelte.d.ts +7 -0
  98. package/dist/components/admin-bar/share-preview-link-dialog.svelte +97 -0
  99. package/dist/components/admin-bar/share-preview-link-dialog.svelte.d.ts +9 -0
  100. package/dist/components/admin-bar/site-settings-panel.svelte +225 -0
  101. package/dist/components/admin-bar/site-settings-panel.svelte.d.ts +7 -0
  102. package/dist/components/admin-bar/status-pill.svelte +49 -0
  103. package/dist/components/admin-bar/status-pill.svelte.d.ts +11 -0
  104. package/dist/components/admin-bar/theme.svelte.d.ts +16 -0
  105. package/dist/components/admin-bar/theme.svelte.js +39 -0
  106. package/dist/components/admin-bar/ui/badge/badge.svelte +57 -0
  107. package/dist/components/admin-bar/ui/badge/badge.svelte.d.ts +16 -0
  108. package/dist/components/admin-bar/ui/badge/index.d.ts +4 -0
  109. package/dist/components/admin-bar/ui/badge/index.js +4 -0
  110. package/dist/components/admin-bar/ui/button/button.svelte +73 -0
  111. package/dist/components/admin-bar/ui/button/button.svelte.d.ts +16 -0
  112. package/dist/components/admin-bar/ui/button/index.d.ts +4 -0
  113. package/dist/components/admin-bar/ui/button/index.js +4 -0
  114. package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte +7 -0
  115. package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte.d.ts +4 -0
  116. package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte +7 -0
  117. package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte.d.ts +4 -0
  118. package/dist/components/admin-bar/ui/collapsible/collapsible.svelte +7 -0
  119. package/dist/components/admin-bar/ui/collapsible/collapsible.svelte.d.ts +4 -0
  120. package/dist/components/admin-bar/ui/collapsible/index.d.ts +4 -0
  121. package/dist/components/admin-bar/ui/collapsible/index.js +6 -0
  122. package/dist/components/admin-bar/ui/dialog/dialog-close.svelte +7 -0
  123. package/dist/components/admin-bar/ui/dialog/dialog-close.svelte.d.ts +4 -0
  124. package/dist/components/admin-bar/ui/dialog/dialog-content.svelte +46 -0
  125. package/dist/components/admin-bar/ui/dialog/dialog-content.svelte.d.ts +11 -0
  126. package/dist/components/admin-bar/ui/dialog/dialog-description.svelte +17 -0
  127. package/dist/components/admin-bar/ui/dialog/dialog-description.svelte.d.ts +4 -0
  128. package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte +23 -0
  129. package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte.d.ts +5 -0
  130. package/dist/components/admin-bar/ui/dialog/dialog-header.svelte +20 -0
  131. package/dist/components/admin-bar/ui/dialog/dialog-header.svelte.d.ts +5 -0
  132. package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte +20 -0
  133. package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
  134. package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte +7 -0
  135. package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte.d.ts +3 -0
  136. package/dist/components/admin-bar/ui/dialog/dialog-title.svelte +17 -0
  137. package/dist/components/admin-bar/ui/dialog/dialog-title.svelte.d.ts +4 -0
  138. package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte +7 -0
  139. package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte.d.ts +4 -0
  140. package/dist/components/admin-bar/ui/dialog/dialog.svelte +7 -0
  141. package/dist/components/admin-bar/ui/dialog/dialog.svelte.d.ts +3 -0
  142. package/dist/components/admin-bar/ui/dialog/index.d.ts +11 -0
  143. package/dist/components/admin-bar/ui/dialog/index.js +13 -0
  144. package/dist/components/admin-bar/ui/input/index.d.ts +3 -0
  145. package/dist/components/admin-bar/ui/input/index.js +3 -0
  146. package/dist/components/admin-bar/ui/input/input.svelte +24 -0
  147. package/dist/components/admin-bar/ui/input/input.svelte.d.ts +5 -0
  148. package/dist/components/admin-bar/ui/kbd/index.d.ts +4 -0
  149. package/dist/components/admin-bar/ui/kbd/index.js +6 -0
  150. package/dist/components/admin-bar/ui/kbd/kbd-group.svelte +20 -0
  151. package/dist/components/admin-bar/ui/kbd/kbd-group.svelte.d.ts +5 -0
  152. package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte +52 -0
  153. package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte.d.ts +8 -0
  154. package/dist/components/admin-bar/ui/kbd/kbd.svelte +27 -0
  155. package/dist/components/admin-bar/ui/kbd/kbd.svelte.d.ts +5 -0
  156. package/dist/components/admin-bar/ui/label/index.d.ts +3 -0
  157. package/dist/components/admin-bar/ui/label/index.js +3 -0
  158. package/dist/components/admin-bar/ui/label/label.svelte +20 -0
  159. package/dist/components/admin-bar/ui/label/label.svelte.d.ts +4 -0
  160. package/dist/components/admin-bar/ui/menubar/index.d.ts +18 -0
  161. package/dist/components/admin-bar/ui/menubar/index.js +20 -0
  162. package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte +46 -0
  163. package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte.d.ts +10 -0
  164. package/dist/components/admin-bar/ui/menubar/menubar-content.svelte +28 -0
  165. package/dist/components/admin-bar/ui/menubar/menubar-content.svelte.d.ts +4 -0
  166. package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte +25 -0
  167. package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte.d.ts +8 -0
  168. package/dist/components/admin-bar/ui/menubar/menubar-group.svelte +12 -0
  169. package/dist/components/admin-bar/ui/menubar/menubar-group.svelte.d.ts +7 -0
  170. package/dist/components/admin-bar/ui/menubar/menubar-item.svelte +27 -0
  171. package/dist/components/admin-bar/ui/menubar/menubar-item.svelte.d.ts +8 -0
  172. package/dist/components/admin-bar/ui/menubar/menubar-label.svelte +25 -0
  173. package/dist/components/admin-bar/ui/menubar/menubar-label.svelte.d.ts +8 -0
  174. package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte +7 -0
  175. package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte.d.ts +3 -0
  176. package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte +7 -0
  177. package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte.d.ts +3 -0
  178. package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte +11 -0
  179. package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte.d.ts +4 -0
  180. package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte +37 -0
  181. package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte.d.ts +8 -0
  182. package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte +17 -0
  183. package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte.d.ts +4 -0
  184. package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte +23 -0
  185. package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte.d.ts +5 -0
  186. package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte +20 -0
  187. package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte.d.ts +4 -0
  188. package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte +29 -0
  189. package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte.d.ts +8 -0
  190. package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte +7 -0
  191. package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte.d.ts +4 -0
  192. package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte +20 -0
  193. package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte.d.ts +4 -0
  194. package/dist/components/admin-bar/ui/menubar/menubar.svelte +20 -0
  195. package/dist/components/admin-bar/ui/menubar/menubar.svelte.d.ts +4 -0
  196. package/dist/components/admin-bar/ui/select/index.d.ts +12 -0
  197. package/dist/components/admin-bar/ui/select/index.js +14 -0
  198. package/dist/components/admin-bar/ui/select/select-content.svelte +45 -0
  199. package/dist/components/admin-bar/ui/select/select-content.svelte.d.ts +11 -0
  200. package/dist/components/admin-bar/ui/select/select-group-heading.svelte +21 -0
  201. package/dist/components/admin-bar/ui/select/select-group-heading.svelte.d.ts +10 -0
  202. package/dist/components/admin-bar/ui/select/select-group.svelte +17 -0
  203. package/dist/components/admin-bar/ui/select/select-group.svelte.d.ts +4 -0
  204. package/dist/components/admin-bar/ui/select/select-item.svelte +40 -0
  205. package/dist/components/admin-bar/ui/select/select-item.svelte.d.ts +5 -0
  206. package/dist/components/admin-bar/ui/select/select-label.svelte +20 -0
  207. package/dist/components/admin-bar/ui/select/select-label.svelte.d.ts +6 -0
  208. package/dist/components/admin-bar/ui/select/select-portal.svelte +7 -0
  209. package/dist/components/admin-bar/ui/select/select-portal.svelte.d.ts +3 -0
  210. package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte +23 -0
  211. package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte.d.ts +5 -0
  212. package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte +23 -0
  213. package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte.d.ts +5 -0
  214. package/dist/components/admin-bar/ui/select/select-separator.svelte +21 -0
  215. package/dist/components/admin-bar/ui/select/select-separator.svelte.d.ts +4 -0
  216. package/dist/components/admin-bar/ui/select/select-trigger.svelte +31 -0
  217. package/dist/components/admin-bar/ui/select/select-trigger.svelte.d.ts +8 -0
  218. package/dist/components/admin-bar/ui/select/select.svelte +11 -0
  219. package/dist/components/admin-bar/ui/select/select.svelte.d.ts +3 -0
  220. package/dist/components/admin-bar/ui/separator/index.d.ts +2 -0
  221. package/dist/components/admin-bar/ui/separator/index.js +4 -0
  222. package/dist/components/admin-bar/ui/separator/separator.svelte +21 -0
  223. package/dist/components/admin-bar/ui/separator/separator.svelte.d.ts +4 -0
  224. package/dist/components/admin-bar/ui/textarea/index.d.ts +3 -0
  225. package/dist/components/admin-bar/ui/textarea/index.js +3 -0
  226. package/dist/components/admin-bar/ui/textarea/textarea.svelte +21 -0
  227. package/dist/components/admin-bar/ui/textarea/textarea.svelte.d.ts +5 -0
  228. package/dist/components/admin-bar/user-avatar.svelte +29 -0
  229. package/dist/components/admin-bar/user-avatar.svelte.d.ts +7 -0
  230. package/dist/components/admin-bar/utils.d.ts +10 -0
  231. package/dist/components/admin-bar/utils.js +46 -0
  232. package/dist/components/admin-bar/variants.d.ts +20 -0
  233. package/dist/components/admin-bar/variants.js +14 -0
  234. package/dist/components/cms/cms-boolean.svelte +102 -0
  235. package/dist/components/cms/cms-boolean.svelte.d.ts +10 -0
  236. package/dist/components/cms/cms-date-time-editable.svelte +66 -0
  237. package/dist/components/cms/cms-date-time-editable.svelte.d.ts +11 -0
  238. package/dist/components/cms/cms-date-time.svelte +67 -0
  239. package/dist/components/cms/cms-date-time.svelte.d.ts +19 -0
  240. package/dist/components/cms/cms-entries.svelte +24 -0
  241. package/dist/components/cms/cms-entries.svelte.d.ts +31 -0
  242. package/dist/components/cms/cms-image-editable.svelte +439 -0
  243. package/dist/components/cms/cms-image-editable.svelte.d.ts +11 -0
  244. package/dist/components/cms/cms-image.svelte +78 -0
  245. package/dist/components/cms/cms-image.svelte.d.ts +18 -0
  246. package/dist/components/cms/cms-link-editable.svelte +429 -0
  247. package/dist/components/cms/cms-link-editable.svelte.d.ts +13 -0
  248. package/dist/components/cms/cms-link.svelte +92 -0
  249. package/dist/components/cms/cms-link.svelte.d.ts +25 -0
  250. package/dist/components/cms/cms-markdown-editable.svelte +74 -0
  251. package/dist/components/cms/cms-markdown-editable.svelte.d.ts +9 -0
  252. package/dist/components/cms/cms-markdown.svelte +56 -0
  253. package/dist/components/cms/cms-markdown.svelte.d.ts +10 -0
  254. package/dist/components/cms/cms-media-picker.svelte +150 -0
  255. package/dist/components/cms/cms-media-picker.svelte.d.ts +8 -0
  256. package/dist/components/cms/cms-number-editable.svelte +77 -0
  257. package/dist/components/cms/cms-number-editable.svelte.d.ts +13 -0
  258. package/dist/components/cms/cms-number.svelte +63 -0
  259. package/dist/components/cms/cms-number.svelte.d.ts +16 -0
  260. package/dist/components/cms/cms-repeater-editable.svelte +137 -0
  261. package/dist/components/cms/cms-repeater-editable.svelte.d.ts +31 -0
  262. package/dist/components/cms/cms-repeater.svelte +55 -0
  263. package/dist/components/cms/cms-repeater.svelte.d.ts +30 -0
  264. package/dist/components/cms/cms-rich-text-editable.svelte +101 -0
  265. package/dist/components/cms/cms-rich-text-editable.svelte.d.ts +9 -0
  266. package/dist/components/cms/cms-rich-text-toolbar.svelte +246 -0
  267. package/dist/components/cms/cms-rich-text-toolbar.svelte.d.ts +9 -0
  268. package/dist/components/cms/cms-rich-text.svelte +74 -0
  269. package/dist/components/cms/cms-rich-text.svelte.d.ts +10 -0
  270. package/dist/components/cms/cms-store.svelte.d.ts +294 -0
  271. package/dist/components/cms/cms-store.svelte.js +625 -0
  272. package/dist/components/cms/cms-text.svelte +131 -0
  273. package/dist/components/cms/cms-text.svelte.d.ts +11 -0
  274. package/dist/components/cms/index.d.ts +13 -0
  275. package/dist/components/cms/index.js +11 -0
  276. package/dist/components/cms/install-scope.svelte.d.ts +7 -0
  277. package/dist/components/cms/install-scope.svelte.js +33 -0
  278. package/dist/components/cms/locale-merge.d.ts +41 -0
  279. package/dist/components/cms/locale-merge.js +77 -0
  280. package/dist/components/cms/overlay-sync.d.ts +82 -0
  281. package/dist/components/cms/overlay-sync.js +76 -0
  282. package/dist/components/cms/path.d.ts +30 -0
  283. package/dist/components/cms/path.js +156 -0
  284. package/dist/components/cms/scope.d.ts +120 -0
  285. package/dist/components/cms/scope.js +23 -0
  286. package/dist/index.d.ts +27 -0
  287. package/dist/index.js +28 -0
  288. package/dist/srv/README.md +341 -0
  289. package/dist/srv/api-adapter.d.ts +20 -0
  290. package/dist/srv/api-adapter.js +178 -0
  291. package/dist/srv/cms.d.ts +62 -0
  292. package/dist/srv/cms.js +35 -0
  293. package/dist/srv/index.d.ts +5 -0
  294. package/dist/srv/index.js +4 -0
  295. package/dist/srv/load-cms.d.ts +105 -0
  296. package/dist/srv/load-cms.js +227 -0
  297. package/dist/srv/mock-adapter.d.ts +96 -0
  298. package/dist/srv/mock-adapter.js +171 -0
  299. package/dist/srv/types.d.ts +114 -0
  300. package/dist/srv/types.js +1 -0
  301. package/package.json +116 -0
  302. package/plugin/README.md +137 -0
  303. package/plugin/dist/adapter.d.ts +35 -0
  304. package/plugin/dist/adapter.js +346 -0
  305. package/plugin/dist/adapter.js.map +1 -0
  306. package/plugin/dist/build-state.d.ts +10 -0
  307. package/plugin/dist/build-state.js +26 -0
  308. package/plugin/dist/build-state.js.map +1 -0
  309. package/plugin/dist/fallback-shim.js +194 -0
  310. package/plugin/dist/index.d.ts +56 -0
  311. package/plugin/dist/index.js +396 -0
  312. package/plugin/dist/index.js.map +1 -0
  313. package/plugin/dist/manifest.d.ts +76 -0
  314. package/plugin/dist/manifest.js +367 -0
  315. package/plugin/dist/manifest.js.map +1 -0
  316. package/plugin/dist/media.d.ts +36 -0
  317. package/plugin/dist/media.js +153 -0
  318. package/plugin/dist/media.js.map +1 -0
  319. package/plugin/dist/parse-svelte.d.ts +35 -0
  320. package/plugin/dist/parse-svelte.js +120 -0
  321. package/plugin/dist/parse-svelte.js.map +1 -0
  322. package/plugin/dist/route-tree.d.ts +27 -0
  323. package/plugin/dist/route-tree.js +69 -0
  324. package/plugin/dist/route-tree.js.map +1 -0
  325. package/plugin/dist/transforms.d.ts +42 -0
  326. package/plugin/dist/transforms.js +95 -0
  327. package/plugin/dist/transforms.js.map +1 -0
@@ -0,0 +1,96 @@
1
+ import { type Tree } from '../components/cms/path.ts';
2
+ import type { CmsAdapter, CmsAdapterTombstone } from './types.ts';
3
+ /**
4
+ * One page-kind entry: a specific (`routeId`, `params`) pair and its
5
+ * currently-published content. `routeId` is the SvelteKit route id (e.g.
6
+ * `/(marketing)/rooms/[slug]`); `params` is the bound values for that route's
7
+ * owned params (e.g. `{ slug: 'suite-1' }`). For static page routes (no owned
8
+ * params) `params` is `{}` and there's exactly one entry per route id.
9
+ *
10
+ * Pending edits live in releases (see `_store.ts`), not on the entry — saving
11
+ * a draft adds an item to the editor's open release rather than mutating the
12
+ * published content here.
13
+ *
14
+ * `tombstone`, when set, marks this entry as a published tombstone — the page
15
+ * was deleted with a non-404 outcome in a prior release. `published` is still
16
+ * required (for `findPageEntry` symmetry) but is ignored when `tombstone` is
17
+ * set; `fetchDocs` returns the tombstone instead of the doc.
18
+ */
19
+ export type PageEntry = {
20
+ params: Record<string, string>;
21
+ published: Record<string, unknown>;
22
+ tombstone?: CmsAdapterTombstone;
23
+ };
24
+ /**
25
+ * One pending change in an open release, snapshot for adapter overlay. Items
26
+ * with `kind: 'page'` carry `params`; layout items don't (layouts have no
27
+ * owned params). `kind: 'page-delete'` signals a staged page removal — in
28
+ * preview, the adapter emits the staged `outcome` (gone / redirect) when set,
29
+ * and otherwise suppresses the page so it appears removed (404 after publish).
30
+ * The `tree` is a partial tree that deep-merges over the published content.
31
+ *
32
+ * Each item carries its `locale`. A release in flight typically holds items
33
+ * across all locales the editor has touched; the adapter filters by the
34
+ * request's `locale` so only matching items overlay.
35
+ */
36
+ export type ReleaseItemSnapshot = {
37
+ kind: 'page';
38
+ routeId: string;
39
+ params: Record<string, string>;
40
+ locale: string;
41
+ tree: Tree;
42
+ } | {
43
+ kind: 'layout';
44
+ routeId: string;
45
+ locale: string;
46
+ tree: Tree;
47
+ } | {
48
+ kind: 'page-delete';
49
+ routeId: string;
50
+ params: Record<string, string>;
51
+ locale: string;
52
+ outcome?: CmsAdapterTombstone;
53
+ };
54
+ export type ReleaseSnapshot = {
55
+ id: string;
56
+ items: ReleaseItemSnapshot[];
57
+ };
58
+ export type MockAdapterOptions = {
59
+ /**
60
+ * Layout docs keyed by `[locale][routeId]` (e.g. `en['/']`,
61
+ * `en['/(marketing)']`). Layouts have no owned params, so the inner
62
+ * `routeId` alone identifies a layout doc per locale.
63
+ */
64
+ layoutDocs?: Record<string, Record<string, Record<string, unknown>>>;
65
+ /**
66
+ * Page docs keyed by `[locale][routeId]`, with one `PageEntry` per
67
+ * (`params`) combination per locale. Stores only currently-published
68
+ * content; missing-locale fallback to the default locale happens in
69
+ * `resolveCmsPayload`, not here.
70
+ */
71
+ pageDocs?: Record<string, Record<string, PageEntry[]>>;
72
+ /**
73
+ * Look up an open release by its preview key. Called when a request
74
+ * carries `?preview=…` so adapter results overlay the matching release's
75
+ * pending edits onto published content.
76
+ */
77
+ resolvePreview?: (previewKey: string) => ReleaseSnapshot | null | undefined;
78
+ };
79
+ /** Match a `PageEntry` whose `params` map equals the requested params. */
80
+ export declare const findPageEntry: (entries: PageEntry[] | undefined, params: Record<string, string>) => PageEntry | undefined;
81
+ /**
82
+ * In-memory {@link CmsAdapter} useful for tests, demos, and local development
83
+ * before a real backend is wired up.
84
+ *
85
+ * Layout queries are looked up by `[locale][routeId]`; page queries by
86
+ * `[locale][routeId]` + exact `params` map. When `context.previewKey` is set
87
+ * and matches an open release (via `resolvePreview`), pending edits in that
88
+ * release whose `locale` matches the query's `locale` overlay the published
89
+ * content for any matching scope. Without a preview key, queries always
90
+ * return the published content for the requested locale.
91
+ *
92
+ * Default-locale fallback (when a value is missing in the requested locale)
93
+ * is handled by `resolveCmsPayload`, not here — the adapter only returns
94
+ * what's stored for the requested locale.
95
+ */
96
+ export declare const mockAdapter: (options?: MockAdapterOptions) => CmsAdapter;
@@ -0,0 +1,171 @@
1
+ import { mergeTree } from "../components/cms/path.js";
2
+ /** Match a `PageEntry` whose `params` map equals the requested params. */
3
+ export const findPageEntry = (entries, params) => {
4
+ if (!entries)
5
+ return undefined;
6
+ const keys = Object.keys(params);
7
+ for (const entry of entries) {
8
+ const entryKeys = Object.keys(entry.params);
9
+ if (entryKeys.length !== keys.length)
10
+ continue;
11
+ let match = true;
12
+ for (const k of keys) {
13
+ if (entry.params[k] !== params[k]) {
14
+ match = false;
15
+ break;
16
+ }
17
+ }
18
+ if (match)
19
+ return entry;
20
+ }
21
+ return undefined;
22
+ };
23
+ const paramsEqual = (a, b) => {
24
+ const aKeys = Object.keys(a);
25
+ if (aKeys.length !== Object.keys(b).length)
26
+ return false;
27
+ for (const k of aKeys)
28
+ if (a[k] !== b[k])
29
+ return false;
30
+ return true;
31
+ };
32
+ const findReleaseItem = (snapshot, q) => {
33
+ for (const item of snapshot.items) {
34
+ if (item.locale !== q.locale)
35
+ continue;
36
+ if (q.kind === 'layout') {
37
+ if (item.kind === 'layout' && item.routeId === q.routeId)
38
+ return item;
39
+ }
40
+ else {
41
+ if (item.kind === 'layout')
42
+ continue;
43
+ if (item.routeId === q.routeId && paramsEqual(item.params, q.params)) {
44
+ return item;
45
+ }
46
+ }
47
+ }
48
+ return undefined;
49
+ };
50
+ const findPageDelete = (snapshot, routeId, params, locale) => {
51
+ for (const item of snapshot.items) {
52
+ if (item.kind !== 'page-delete')
53
+ continue;
54
+ if (item.locale !== locale)
55
+ continue;
56
+ if (item.routeId === routeId && paramsEqual(item.params, params))
57
+ return item;
58
+ }
59
+ return undefined;
60
+ };
61
+ const applyOverlay = (base, item) => mergeTree(base ?? {}, item.tree);
62
+ /**
63
+ * In-memory {@link CmsAdapter} useful for tests, demos, and local development
64
+ * before a real backend is wired up.
65
+ *
66
+ * Layout queries are looked up by `[locale][routeId]`; page queries by
67
+ * `[locale][routeId]` + exact `params` map. When `context.previewKey` is set
68
+ * and matches an open release (via `resolvePreview`), pending edits in that
69
+ * release whose `locale` matches the query's `locale` overlay the published
70
+ * content for any matching scope. Without a preview key, queries always
71
+ * return the published content for the requested locale.
72
+ *
73
+ * Default-locale fallback (when a value is missing in the requested locale)
74
+ * is handled by `resolveCmsPayload`, not here — the adapter only returns
75
+ * what's stored for the requested locale.
76
+ */
77
+ export const mockAdapter = (options = {}) => {
78
+ const layoutDocs = options.layoutDocs ?? {};
79
+ const pageDocs = options.pageDocs ?? {};
80
+ const resolvePreview = options.resolvePreview;
81
+ return {
82
+ fetchDocs(queries, context) {
83
+ const previewKey = context.previewKey;
84
+ const release = previewKey && resolvePreview ? resolvePreview(previewKey) : null;
85
+ const out = {};
86
+ for (const q of queries) {
87
+ let base;
88
+ let baseTombstone;
89
+ if (q.kind === 'page') {
90
+ const entry = findPageEntry(pageDocs[q.locale]?.[q.routeId], q.params);
91
+ base = entry?.published;
92
+ baseTombstone = entry?.tombstone;
93
+ }
94
+ else {
95
+ base = layoutDocs[q.locale]?.[q.routeId];
96
+ }
97
+ const pageDelete = release && q.kind === 'page'
98
+ ? findPageDelete(release, q.routeId, q.params, q.locale)
99
+ : undefined;
100
+ if (pageDelete) {
101
+ if (pageDelete.outcome)
102
+ out[q.scopeId] = pageDelete.outcome;
103
+ // No outcome → suppress (404 in production after publish).
104
+ continue;
105
+ }
106
+ const overlayItem = release ? findReleaseItem(release, q) : undefined;
107
+ if (overlayItem && overlayItem.kind !== 'page-delete') {
108
+ out[q.scopeId] = { contents: applyOverlay(base, overlayItem) };
109
+ }
110
+ else if (baseTombstone) {
111
+ out[q.scopeId] = baseTombstone;
112
+ }
113
+ else if (base) {
114
+ out[q.scopeId] = { contents: base };
115
+ }
116
+ }
117
+ return out;
118
+ },
119
+ fetchEntries(routeId, context) {
120
+ const locale = context.locale;
121
+ const entries = pageDocs[locale]?.[routeId];
122
+ const previewKey = context.previewKey;
123
+ const release = previewKey && resolvePreview ? resolvePreview(previewKey) : null;
124
+ const out = [];
125
+ const metaOf = (tree) => {
126
+ const m = tree?.metadata;
127
+ return m && typeof m === 'object' && !Array.isArray(m)
128
+ ? m
129
+ : {};
130
+ };
131
+ const tombstoneFlags = (t) => t.kind === 'redirect' ? { redirectTo: t.to } : { gone: true };
132
+ for (const e of entries ?? []) {
133
+ if (release) {
134
+ const pageDelete = findPageDelete(release, routeId, e.params, locale);
135
+ if (pageDelete) {
136
+ if (pageDelete.outcome) {
137
+ out.push({
138
+ params: { ...e.params },
139
+ metadata: metaOf(e.published),
140
+ ...tombstoneFlags(pageDelete.outcome)
141
+ });
142
+ }
143
+ // No outcome → drop from preview list (hard-delete in flight).
144
+ continue;
145
+ }
146
+ }
147
+ if (e.tombstone) {
148
+ out.push({
149
+ params: { ...e.params },
150
+ metadata: metaOf(e.published),
151
+ ...tombstoneFlags(e.tombstone)
152
+ });
153
+ continue;
154
+ }
155
+ out.push({ params: { ...e.params }, metadata: metaOf(e.published) });
156
+ }
157
+ if (release) {
158
+ for (const item of release.items) {
159
+ if (item.kind !== 'page' || item.routeId !== routeId)
160
+ continue;
161
+ if (item.locale !== locale)
162
+ continue;
163
+ if (findPageEntry(entries, item.params))
164
+ continue;
165
+ out.push({ params: { ...item.params }, metadata: metaOf(item.tree) });
166
+ }
167
+ }
168
+ return out;
169
+ }
170
+ };
171
+ };
@@ -0,0 +1,114 @@
1
+ import type { CmsEntry, CmsScopeEntry, SiteSchema } from '../components/cms/scope.ts';
2
+ export type { CmsEntry, SiteSchema };
3
+ /**
4
+ * One scope's request, expanded from the build-time manifest with the locale
5
+ * and any owned param values from the current SvelteKit request. Adapters
6
+ * receive arrays of these and translate them into backend reads.
7
+ */
8
+ export type CmsScopeQuery = CmsScopeEntry & {
9
+ locale: string;
10
+ };
11
+ /**
12
+ * One resolved document from an adapter. `contents` is the doc's tree —
13
+ * lodash-style paths walk into nested branches. Page-kind docs own a
14
+ * `metadata` branch that `loadCms` aliases as `cms.metadata`.
15
+ */
16
+ export type CmsAdapterDoc = {
17
+ contents: Record<string, unknown>;
18
+ };
19
+ /**
20
+ * Tombstone for a page-kind scope: the page was deleted but the URL still
21
+ * resolves with non-404 semantics. `kind: 'gone'` means the page is
22
+ * deliberately permanently removed (HTTP 410); `kind: 'redirect'` means the
23
+ * page was replaced with a permanent redirect to `to` (HTTP 308). Layout
24
+ * scopes never resolve to a tombstone — only page-kind scopes do.
25
+ */
26
+ export type CmsAdapterTombstone = {
27
+ kind: 'gone';
28
+ } | {
29
+ kind: 'redirect';
30
+ to: string;
31
+ };
32
+ /**
33
+ * One resolution from an adapter for a single scope query: either the doc's
34
+ * tree (`CmsAdapterDoc`) or a tombstone signaling the page was deleted with
35
+ * a non-404 outcome. Discriminator: presence of `kind` on the value.
36
+ */
37
+ export type CmsAdapterResolution = CmsAdapterDoc | CmsAdapterTombstone;
38
+ /**
39
+ * Per-request context handed to adapter methods alongside their queries.
40
+ * `fetch` is the SvelteKit request-scoped fetch, suitable for HTTP-backed
41
+ * adapters that need cookie forwarding during SSR. `previewKey`, when set,
42
+ * is the value of `?preview=…` from the request URL — adapters that support
43
+ * release previews use it to overlay an open release's pending edits onto
44
+ * published content. `versionKey`, when set, is the value of `?version=…` —
45
+ * adapters resolve it to a past published release and return that release's
46
+ * snapshot. Mutually exclusive with `previewKey`; when both are present
47
+ * `versionKey` wins.
48
+ *
49
+ * `locale` is the BCP-47 string bound at `loadCms(event, { locale })` time;
50
+ * `locales` is the full supported set from `createCms({ locales })`. The
51
+ * first entry of `locales` is the default locale used for read-time
52
+ * fallback. Adapters use `locale` to scope reads (`fetchEntries` doesn't
53
+ * take queries, so it relies on this); `fetchDocs` also gets per-query
54
+ * `locale` on each `CmsScopeQuery`.
55
+ */
56
+ export type CmsAdapterContext = {
57
+ fetch: typeof fetch;
58
+ previewKey?: string | null;
59
+ versionKey?: string | null;
60
+ locale: string;
61
+ locales: string[];
62
+ };
63
+ /**
64
+ * Backend-agnostic adapter. Implementations connect Vela CMS to a backing
65
+ * store (PocketBase, a flat-file mock, an in-memory table, …) and decide how
66
+ * scope queries map to documents.
67
+ *
68
+ * `fetchDocs` is called once per request with every applicable scope. May be
69
+ * sync or async. Page-kind docs own a `metadata` branch on their tree;
70
+ * `loadCms` aliases it as `cms.metadata` for the request without removing it
71
+ * from the doc — components can address `metadata.title` like any other path.
72
+ */
73
+ export interface CmsAdapter {
74
+ /**
75
+ * URL prefix the frontend uses for client-side admin-bar fetches and that
76
+ * gets surfaced in `CmsPayload.endpoint`. HTTP-backed adapters set this to
77
+ * their base URL (e.g. `https://cms.example/v1/projects/p1/cms`); adapters
78
+ * with no remote (`mockAdapter`) leave it unset and the loader falls back
79
+ * to `'/api/cms'`.
80
+ */
81
+ readonly endpoint?: string;
82
+ /**
83
+ * Resolve documents for every scope in `queries`. The result map is keyed
84
+ * by `query.scopeId`; missing entries are treated as "no document yet"
85
+ * and components fall back to their authored `fallback`. Adapters
86
+ * disambiguate page-kind documents using `routeId` + `params` from the
87
+ * query, never a pre-composed scope-key string. When `context.previewKey`
88
+ * is set, adapters that support release previews overlay the matching
89
+ * open release's pending field edits on top of published content before
90
+ * returning.
91
+ *
92
+ * Page-kind scopes may resolve to a {@link CmsAdapterTombstone} instead of
93
+ * a {@link CmsAdapterDoc} when the page has been deleted with a non-404
94
+ * outcome (gone / redirect). The resolver short-circuits the page render
95
+ * for tombstoned scopes; layout-kind scopes never tombstone.
96
+ */
97
+ fetchDocs(queries: CmsScopeQuery[], context: CmsAdapterContext): Promise<Record<string, CmsAdapterResolution>> | Record<string, CmsAdapterResolution>;
98
+ /**
99
+ * Enumerate the publishable entries the adapter has at a given
100
+ * `routeId`. Each entry carries its bound owned `params` (for SvelteKit's
101
+ * prerender `entries()`) plus the doc's `metadata` branch (for index pages
102
+ * that render a list with titles).
103
+ */
104
+ fetchEntries(routeId: string, context: CmsAdapterContext): Promise<CmsEntry[]> | CmsEntry[];
105
+ /**
106
+ * Resolve the project-wide site tree (branding, contact, social, …).
107
+ * Always one tree per project — no locale, no params. Preview-overlay
108
+ * support is identical to `fetchDocs`: when `context.previewKey` is set,
109
+ * adapters merge the open release's site item on top of the published
110
+ * tree. Optional — adapters that don't carry site state may omit this and
111
+ * the loader treats the project as having an empty site tree.
112
+ */
113
+ fetchSite?(context: CmsAdapterContext): Promise<Record<string, unknown>> | Record<string, unknown>;
114
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "@velastack/cms",
3
+ "version": "0.1.0",
4
+ "description": "A scope-aware CMS for SvelteKit, for static or dynamic sites.",
5
+ "keywords": [
6
+ "svelte",
7
+ "sveltekit",
8
+ "cms",
9
+ "content",
10
+ "editing",
11
+ "vite-plugin",
12
+ "velastack"
13
+ ],
14
+ "license": "MIT",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/velastack/cms.git"
18
+ },
19
+ "homepage": "https://github.com/velastack/cms#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/velastack/cms/issues"
22
+ },
23
+ "type": "module",
24
+ "engines": {
25
+ "node": "^20.19.0 || >=22.12.0"
26
+ },
27
+ "scripts": {
28
+ "dev": "vite dev",
29
+ "build": "vite build && npm run prepack",
30
+ "preview": "vite preview",
31
+ "prepare": "svelte-kit sync || echo ''",
32
+ "prepack": "svelte-kit sync && svelte-package && node scripts/build-plugin.js && node scripts/build-admin-bar-css.js && publint",
33
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
34
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
35
+ "lint": "prettier --check .",
36
+ "format": "prettier --write .",
37
+ "test:unit": "vitest",
38
+ "test": "npm run test:unit -- --run"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "!dist/**/*.test.*",
43
+ "!dist/**/*.spec.*",
44
+ "plugin/dist",
45
+ "!plugin/dist/**/*.test.*",
46
+ "README.md",
47
+ "LICENSE"
48
+ ],
49
+ "sideEffects": [
50
+ "**/*.css"
51
+ ],
52
+ "svelte": "./dist/index.js",
53
+ "types": "./dist/index.d.ts",
54
+ "exports": {
55
+ ".": {
56
+ "types": "./dist/index.d.ts",
57
+ "svelte": "./dist/index.js",
58
+ "default": "./dist/index.js"
59
+ },
60
+ "./srv": {
61
+ "types": "./dist/srv/index.d.ts",
62
+ "default": "./dist/srv/index.js"
63
+ },
64
+ "./vite": {
65
+ "types": "./plugin/dist/index.d.ts",
66
+ "default": "./plugin/dist/index.js"
67
+ },
68
+ "./adapter": {
69
+ "types": "./plugin/dist/adapter.d.ts",
70
+ "default": "./plugin/dist/adapter.js"
71
+ }
72
+ },
73
+ "peerDependencies": {
74
+ "@sveltejs/kit": "^2.0.0",
75
+ "marked": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
76
+ "svelte": "^5.0.0",
77
+ "vite": "^8.0.0"
78
+ },
79
+ "peerDependenciesMeta": {
80
+ "marked": {
81
+ "optional": true
82
+ }
83
+ },
84
+ "devDependencies": {
85
+ "@internationalized/date": "^3.12.3",
86
+ "@sveltejs/adapter-auto": "^7.0.1",
87
+ "@sveltejs/kit": "^2.70.3",
88
+ "@sveltejs/package": "^2.5.8",
89
+ "@sveltejs/vite-plugin-svelte": "^7.3.0",
90
+ "@tailwindcss/cli": "^4.3.3",
91
+ "@tailwindcss/vite": "^4.3.3",
92
+ "@types/node": "^26.4.0",
93
+ "marked": "^18.0.11",
94
+ "prettier": "^3.9.6",
95
+ "prettier-plugin-svelte": "^4.1.1",
96
+ "publint": "^0.3.24",
97
+ "svelte": "^5.57.0",
98
+ "svelte-check": "^4.7.6",
99
+ "svelte-meta-tags": "^5.0.2",
100
+ "tailwindcss": "^4.3.3",
101
+ "tw-animate-css": "^1.4.0",
102
+ "typescript": "^6.0.3",
103
+ "vite": "^8.2.2",
104
+ "vitest": "^4.1.11"
105
+ },
106
+ "dependencies": {
107
+ "@sveltejs/adapter-static": "^3.0.10",
108
+ "@tiptap/core": "^3.30.6",
109
+ "@tiptap/extension-link": "^3.30.6",
110
+ "@tiptap/pm": "^3.30.6",
111
+ "@tiptap/starter-kit": "^3.30.6",
112
+ "bits-ui": "^2.19.0",
113
+ "devalue": "^5.9.2",
114
+ "tailwind-merge": "^3.6.0"
115
+ }
116
+ }
@@ -0,0 +1,137 @@
1
+ # `@velastack/cms/vite` — Vite plugin
2
+
3
+ Build-time companion to [`@velastack/cms`](../README.md). Walks SvelteKit's `src/routes`
4
+ tree, scans every route file's static Svelte import graph, and exposes the
5
+ result as virtual modules that the runtime CMS components and AdminBar consume.
6
+ Also auto-injects two small bits of glue so authors don't repeat themselves at
7
+ every route.
8
+
9
+ ## Install
10
+
11
+ ```ts
12
+ // vite.config.ts
13
+ import { defineConfig } from 'vite';
14
+ import { sveltekit } from '@sveltejs/kit/vite';
15
+ import { cms } from '@velastack/cms/vite';
16
+
17
+ export default defineConfig({
18
+ plugins: [cms(), sveltekit()]
19
+ });
20
+ ```
21
+
22
+ `cms()` should be registered **before** `sveltekit()`. The plugin sets
23
+ `enforce: 'pre'` so its `transform` hook runs before vite-plugin-svelte
24
+ compiles the route file.
25
+
26
+ ## Options
27
+
28
+ ```ts
29
+ type CmsPluginOptions = {
30
+ routesDir?: string; // default: 'src/routes' (relative to vite root)
31
+ libDir?: string; // default: 'src/lib'
32
+ components?: ExternalCmsComponentSpec[];
33
+ traverse?: (string | RegExp)[];
34
+ };
35
+
36
+ type ExternalCmsComponentSpec =
37
+ | { source: string; names: string[] } // bare specifier with named CMS exports
38
+ | { source: string; default: true }; // bare specifier whose default export is a CMS component
39
+ ```
40
+
41
+ - `routesDir` / `libDir` — only override if your project diverges from the
42
+ SvelteKit defaults.
43
+ - `components` — third-party CMS component packs the walker should recognize.
44
+ Auto-discovered for everything inside `<libDir>/components/cms/` and the
45
+ `@velastack/cms` package itself; use this for components installed from npm.
46
+ - `traverse` — bare specifiers whose `.svelte` files contain CMS usages but
47
+ aren't themselves CMS components (wrapper packages). Strings match
48
+ `source === pattern || source.startsWith(pattern + '/')`. Auto-populated with
49
+ every `components[].source`.
50
+
51
+ ## Virtual modules
52
+
53
+ ### `virtual:vela-cms/manifest`
54
+
55
+ ```ts
56
+ import { cmsManifest } from 'virtual:vela-cms/manifest';
57
+
58
+ type CmsManifest = {
59
+ version: 1;
60
+ routes: Record<string, { scopes: CmsManifestScope[] }>;
61
+ };
62
+
63
+ type CmsManifestScope = {
64
+ scopeId: string; // 'layout:/(marketing)' or 'page:/(marketing)/rooms/[slug]'
65
+ kind: 'layout' | 'page';
66
+ routeId: string; // route the scope is rooted at
67
+ ownedParams: string[]; // params introduced at this scope (deduped up-chain)
68
+ fields: string[]; // CMS field names referenced anywhere in the scope
69
+ metadata?: string[]; // page-only — editable metadata field names
70
+ };
71
+ ```
72
+
73
+ One entry per route id whose chain ends in a `+page.svelte`. Each entry's
74
+ `scopes` array goes from root layout → leaf page; layouts that contribute
75
+ nothing are still included. `loadCms` consumes this map at request time.
76
+
77
+ ### `virtual:vela-cms/pages`
78
+
79
+ ```ts
80
+ import { pages } from 'virtual:vela-cms/pages';
81
+ // pages: Record<string, { routeId: string; /* …user definePage(...) config */ }>
82
+ ```
83
+
84
+ Aggregates every `page.cms.ts` next to a `+page.svelte` (one per route).
85
+ Each entry is the `definePage(...)` config plus the auto-injected `routeId`.
86
+ The AdminBar reads this to know what's editable per page.
87
+
88
+ ## Auto-injection
89
+
90
+ ### Scope install in route `.svelte` files
91
+
92
+ For every `+layout.svelte` and `+page.svelte` whose route appears in the
93
+ manifest, the plugin prepends an `installCmsScope({...})` call into the
94
+ instance script (or creates one if absent). Authors never write
95
+ `setContext(CMS_SCOPE, ...)` manually.
96
+
97
+ ### `routeId` into zero-arg `generateEntries()` calls
98
+
99
+ In any `+page.ts` or `+page.server.ts` that imports `generateEntries` (from
100
+ anywhere — typically `$lib/cms.ts`), zero-argument calls
101
+ `generateEntries()` are rewritten to `generateEntries('<routeId>')`. Calls
102
+ with any explicit argument are left alone — that's the documented opt-out.
103
+
104
+ ## What gets walked
105
+
106
+ For each route entrypoint (`+page.svelte` or `+layout.svelte`), the plugin
107
+ parses with `svelte/compiler` and follows static imports of `.svelte` files.
108
+ Imports get classified as CMS components by:
109
+
110
+ 1. **In-tree barrel** — anything from `<libDir>/components/cms/index.{ts,js}`.
111
+ Named imports are CMS components; default isn't.
112
+ 2. **In-tree files** — `.svelte` files directly under `<libDir>/components/cms/`.
113
+ Default imports are CMS components.
114
+ 3. **`@velastack/cms` package** — any import resolving inside the `@velastack/cms`
115
+ package itself (named exports, plus `.svelte` default imports).
116
+ 4. **External `components` spec** — user-declared packs.
117
+
118
+ Component usages with a `name=<static>` prop are recorded as field
119
+ references; `value=<…>` opts the call out (it's a runtime override, not a
120
+ field). Dynamic `name={expr}` props are ignored.
121
+
122
+ ## HMR
123
+
124
+ The plugin invalidates `virtual:vela-cms/manifest` and
125
+ `virtual:vela-cms/pages` (plus the per-`page.cms.ts` synthetic ids) when:
126
+
127
+ - a `.svelte` file already in the visited graph changes, or
128
+ - any file in `routesDir/` changes (route added/removed), or
129
+ - a `+page.ts` / `+page.server.ts` / `page.cms.ts` changes.
130
+
131
+ The walker re-runs lazily on the next `load` of the virtual module.
132
+
133
+ ## Stability
134
+
135
+ Pre-1.0. The `CmsManifest` shape is part of the public surface; the
136
+ synthetic `page-cms-N` ids and the install-call code template are
137
+ internal implementation details and may change.
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Wraps `@sveltejs/adapter-static`. After the inner adapter writes prerendered
3
+ * pages, scans `builder.routes` for parameterized routes and emits a
4
+ * `__fallback.json` next to each parent URL directory. The fallback is built
5
+ * from a real prerendered `__data.json` for that route, with `cms.metadata`
6
+ * and `cms.docs[pageScope]` cleared and every `params[name]` replaced by
7
+ * `%name%`. The runtime can fetch the fallback when navigating to a CMS page
8
+ * that wasn't prerendered, then substitute the actual params client-side.
9
+ *
10
+ * @param {StaticAdapterOptions} [options]
11
+ */
12
+ export default function adapter(options?: StaticAdapterOptions): {
13
+ name: string;
14
+ /** @param {import('@sveltejs/kit').Builder} builder */
15
+ adapt(builder: import("@sveltejs/kit").Builder): Promise<void>;
16
+ };
17
+ export function parseRouteSegments(routeId: string): ParsedSegment[];
18
+ export function buildParamExtractor(segments: ParsedSegment[]): ((url: string) => Record<string, string> | null) | null;
19
+ export type StaticAdapterOptions = Parameters<typeof staticAdapter>[0];
20
+ export type ParsedSegment = {
21
+ kind: "static";
22
+ value: string;
23
+ } | {
24
+ kind: "dynamic";
25
+ name: string;
26
+ } | {
27
+ kind: "rest";
28
+ name: string;
29
+ } | {
30
+ kind: "optional";
31
+ name: string;
32
+ } | {
33
+ kind: "unsupported";
34
+ };
35
+ import staticAdapter from '@sveltejs/adapter-static';