@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,387 @@
1
+ <script lang="ts">
2
+ import { page } from '$app/state';
3
+ import ChevronDownIcon from './icons/chevron-down.svelte';
4
+ import { pages } from 'virtual:vela-cms/pages';
5
+ import { cmsStore, type CmsScopeRef } from '../cms/cms-store.svelte.js';
6
+ import { getPageScope, type CmsPayload } from '../cms/scope.js';
7
+ import {
8
+ DEFAULT_METADATA_SCHEMA,
9
+ fieldType,
10
+ type CmsPageMetadataSchema,
11
+ type MetadataFieldSchema
12
+ } from './page-config.js';
13
+ import PanelFooter from './panel-footer.svelte';
14
+ import PanelHeader from './panel-header.svelte';
15
+ import Panel from './panel.svelte';
16
+ import { Button } from './ui/button/index.js';
17
+ import * as Collapsible from './ui/collapsible/index.js';
18
+ import { Input } from './ui/input/index.js';
19
+ import { Textarea } from './ui/textarea/index.js';
20
+
21
+ type Props = { onClose: () => void; onSave: () => void | Promise<void> };
22
+ let { onClose, onSave }: Props = $props();
23
+
24
+ const TITLE_TARGET = 60;
25
+ const DESC_TARGET = 155;
26
+ // "Approaches" the limit at 80% — past this, color shifts amber to nudge.
27
+ const TITLE_AMBER_AT = Math.floor(TITLE_TARGET * 0.8);
28
+ const DESC_AMBER_AT = Math.floor(DESC_TARGET * 0.8);
29
+
30
+ const cms = $derived(page.data.cms as CmsPayload | undefined);
31
+ const pageScope = $derived(getPageScope(cms));
32
+ const ref = $derived<CmsScopeRef | null>(
33
+ pageScope
34
+ ? { scopeId: pageScope.scopeId, routeId: pageScope.routeId, params: pageScope.params }
35
+ : null
36
+ );
37
+
38
+ // Schema lives in the route's `page.cms.ts`. Fall back to default
39
+ // title/description so every route gets at least the SEO basics.
40
+ const schema = $derived.by<CmsPageMetadataSchema>(() => {
41
+ if (!pageScope) return {};
42
+ const cfg = pages[pageScope.routeId];
43
+ return cfg?.metadata ?? DEFAULT_METADATA_SCHEMA;
44
+ });
45
+
46
+ const entries = $derived(Object.entries(schema));
47
+ const advancedEntries = $derived(entries.filter(([k]) => k !== 'title' && k !== 'description'));
48
+
49
+ const persistedValue = (key: string): unknown => {
50
+ if (!ref) return undefined;
51
+ return cmsStore.getValue(ref, `metadata.${key}`);
52
+ };
53
+
54
+ // Local form state — typing only updates `local`; nothing reaches
55
+ // cmsStore.metadataDrafts until Save fires. That keeps the bar's "X page
56
+ // draft" badge from flickering as the user explores.
57
+ let local = $state<Record<string, unknown>>({});
58
+
59
+ $effect(() => {
60
+ const next: Record<string, unknown> = {};
61
+ for (const [k] of entries) next[k] = persistedValue(k);
62
+ local = next;
63
+ });
64
+
65
+ const titleVal = $derived(typeof local.title === 'string' ? local.title : '');
66
+ const descVal = $derived(typeof local.description === 'string' ? local.description : '');
67
+
68
+ const breadcrumb = $derived.by(() => {
69
+ const host = page.url.hostname || 'localhost';
70
+ const segments = page.url.pathname.split('/').filter(Boolean);
71
+ return segments.length === 0 ? host : `${host} › ${segments.join(' › ')}`;
72
+ });
73
+
74
+ let previewTab = $state<'search' | 'social'>('search');
75
+
76
+ // Pull the live site's favicon — Google's result preview shows whichever
77
+ // favicon the document head declares, so the SEO preview should match. Resolve
78
+ // to absolute URLs (using `.href` rather than `.getAttribute`) so the img src
79
+ // renders correctly regardless of where the favicon is hosted.
80
+ let faviconHref = $state<string | null>(null);
81
+ $effect(() => {
82
+ if (typeof document === 'undefined') return;
83
+ const link = document.querySelector<HTMLLinkElement>(
84
+ 'link[rel="icon"], link[rel~="icon"], link[rel="shortcut icon"]'
85
+ );
86
+ faviconHref = link?.href ?? null;
87
+ });
88
+
89
+ // Best-effort OG image: an explicit `og_image` field in the schema wins,
90
+ // otherwise the first image-type metadata field. The Social card stays useful
91
+ // even when neither exists — title/description still render against a
92
+ // placeholder.
93
+ const ogImageVal = $derived.by(() => {
94
+ const og = stringValue(local.og_image);
95
+ if (og) return og;
96
+ for (const [k, s] of entries) {
97
+ if (fieldType(s) !== 'image') continue;
98
+ const v = stringValue(local[k]);
99
+ if (v) return v;
100
+ }
101
+ return '';
102
+ });
103
+
104
+ const hostname = $derived(page.url.hostname || 'localhost');
105
+
106
+ const counterClass = (n: number, target: number, amberAt: number): string => {
107
+ if (n > target) return 'vela:text-destructive';
108
+ if (n >= amberAt) return 'vela:text-[var(--cms-status-warn-text)]';
109
+ return 'vela:text-bar-text-tertiary';
110
+ };
111
+
112
+ const handleSave = async () => {
113
+ if (!ref) return onClose();
114
+ for (const [k] of entries) {
115
+ const v = local[k];
116
+ if (v !== persistedValue(k)) cmsStore.setValue(ref, `metadata.${k}`, v);
117
+ }
118
+ await onSave();
119
+ };
120
+
121
+ const fieldLabelClass = 'vela:text-[12px] vela:text-bar-text-secondary';
122
+ const counterBaseClass = 'vela:text-[11px] vela:font-mono vela:tabular-nums';
123
+ const selectClass =
124
+ 'vela:flex vela:h-9 vela:w-full vela:rounded-md vela:border vela:border-[var(--cms-bar-divider)]' +
125
+ ' vela:bg-[var(--cms-bar-bg-hover)] vela:px-3 vela:py-1 vela:text-[13px] vela:text-bar-text' +
126
+ ' vela:focus:outline-none vela:focus:ring-2 vela:focus:ring-[var(--cms-accent)]';
127
+
128
+ const stringValue = (v: unknown): string => (typeof v === 'string' ? v : '');
129
+ const numberValue = (v: unknown): number | null =>
130
+ typeof v === 'number' && !Number.isNaN(v) ? v : null;
131
+ const booleanValue = (v: unknown): boolean => v === true;
132
+
133
+ const setNumber = (key: string, raw: string) => {
134
+ if (raw === '') {
135
+ local[key] = undefined;
136
+ } else {
137
+ const n = Number(raw);
138
+ local[key] = Number.isFinite(n) ? n : undefined;
139
+ }
140
+ };
141
+
142
+ const enumValues = (s: MetadataFieldSchema): readonly string[] =>
143
+ typeof s !== 'string' && s.type === 'enum' ? s.values : [];
144
+ </script>
145
+
146
+ <Panel ariaLabel="SEO and metadata" {onClose}>
147
+ <PanelHeader title="SEO &amp; metadata" {onClose} />
148
+
149
+ <form
150
+ class="vela:overflow-y-auto vela:px-4 vela:pb-4 vela:flex vela:flex-col vela:gap-4"
151
+ onsubmit={(e) => {
152
+ e.preventDefault();
153
+ handleSave();
154
+ }}
155
+ >
156
+ {#if !pageScope}
157
+ <p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">
158
+ No page scope on this route.
159
+ </p>
160
+ {:else}
161
+ <div class="vela:flex vela:flex-col vela:gap-2">
162
+ <div
163
+ role="tablist"
164
+ aria-label="Preview format"
165
+ class="vela:inline-flex vela:self-start vela:p-0.5 vela:rounded-md
166
+ vela:bg-[var(--cms-bar-bg-hover)] vela:border vela:border-[var(--cms-bar-divider)]"
167
+ >
168
+ <button
169
+ type="button"
170
+ role="tab"
171
+ aria-selected={previewTab === 'search'}
172
+ onclick={() => (previewTab = 'search')}
173
+ class="vela:px-2.5 vela:py-1 vela:rounded vela:text-[11px] vela:font-medium
174
+ vela:cursor-pointer vela:transition-colors
175
+ {previewTab === 'search'
176
+ ? 'vela:bg-bar-bg vela:text-bar-text'
177
+ : 'vela:text-bar-text-secondary vela:hover:text-bar-text'}"
178
+ >
179
+ Search
180
+ </button>
181
+ <button
182
+ type="button"
183
+ role="tab"
184
+ aria-selected={previewTab === 'social'}
185
+ onclick={() => (previewTab = 'social')}
186
+ class="vela:px-2.5 vela:py-1 vela:rounded vela:text-[11px] vela:font-medium
187
+ vela:cursor-pointer vela:transition-colors
188
+ {previewTab === 'social'
189
+ ? 'vela:bg-bar-bg vela:text-bar-text'
190
+ : 'vela:text-bar-text-secondary vela:hover:text-bar-text'}"
191
+ >
192
+ Social
193
+ </button>
194
+ </div>
195
+
196
+ {#if previewTab === 'search'}
197
+ <div
198
+ class="vela:bg-[#fafafa] vela:text-[#202124] vela:rounded-lg vela:p-3.5
199
+ vela:border vela:border-[#e8eaed]"
200
+ >
201
+ <div class="vela:flex vela:items-center vela:gap-1.5 vela:text-[12px]">
202
+ {#if faviconHref}
203
+ <img
204
+ src={faviconHref}
205
+ alt=""
206
+ class="vela:w-4 vela:h-4 vela:rounded-full vela:bg-white vela:object-contain"
207
+ />
208
+ {:else}
209
+ <span
210
+ class="vela:inline-flex vela:items-center vela:justify-center vela:w-4 vela:h-4 vela:rounded-full vela:bg-[var(--cms-accent)]"
211
+ ></span>
212
+ {/if}
213
+ <span class="vela:text-[#202124]">{breadcrumb}</span>
214
+ </div>
215
+ <div
216
+ class="vela:mt-1.5 vela:text-[18px] vela:leading-snug vela:text-[#1a0dab] vela:truncate"
217
+ >
218
+ {titleVal || 'Page title'}
219
+ </div>
220
+ <div class="vela:mt-1 vela:text-[13px] vela:leading-snug vela:text-[#4d5156]">
221
+ {descVal || 'Meta description appears here.'}
222
+ </div>
223
+ </div>
224
+ {:else}
225
+ <div
226
+ class="vela:bg-white vela:text-[#0f1419] vela:rounded-lg vela:overflow-hidden
227
+ vela:border vela:border-[#e8eaed]"
228
+ >
229
+ <div
230
+ class="vela:aspect-[1.91/1] vela:bg-[#e8eaed] vela:flex vela:items-center vela:justify-center vela:overflow-hidden"
231
+ >
232
+ {#if ogImageVal}
233
+ <img src={ogImageVal} alt="" class="vela:w-full vela:h-full vela:object-cover" />
234
+ {:else}
235
+ <span class="vela:text-[11px] vela:text-[#5f6368]">No social image set</span>
236
+ {/if}
237
+ </div>
238
+ <div
239
+ class="vela:px-3.5 vela:py-2.5 vela:border-t vela:border-[#e8eaed] vela:bg-[#f7f9fa]"
240
+ >
241
+ <div class="vela:text-[11px] vela:uppercase vela:text-[#5f6368]">
242
+ {hostname}
243
+ </div>
244
+ <div
245
+ class="vela:mt-0.5 vela:text-[14px] vela:font-semibold vela:leading-snug vela:line-clamp-2"
246
+ >
247
+ {titleVal || 'Page title'}
248
+ </div>
249
+ <div
250
+ class="vela:mt-0.5 vela:text-[12px] vela:leading-snug vela:text-[#536471] vela:line-clamp-2"
251
+ >
252
+ {descVal || 'Meta description appears here.'}
253
+ </div>
254
+ </div>
255
+ </div>
256
+ {/if}
257
+ </div>
258
+
259
+ {#if 'title' in schema}
260
+ <label class="vela:flex vela:flex-col vela:gap-1.5">
261
+ <div class="vela:flex vela:items-center vela:justify-between">
262
+ <span class={fieldLabelClass}>Title</span>
263
+ <span
264
+ class="{counterBaseClass} {counterClass(
265
+ titleVal.length,
266
+ TITLE_TARGET,
267
+ TITLE_AMBER_AT
268
+ )}"
269
+ >
270
+ {titleVal.length} / {TITLE_TARGET}
271
+ </span>
272
+ </div>
273
+ <Input
274
+ type="text"
275
+ value={stringValue(local.title)}
276
+ oninput={(e) => (local.title = e.currentTarget.value)}
277
+ />
278
+ </label>
279
+ {/if}
280
+
281
+ {#if 'description' in schema}
282
+ <label class="vela:flex vela:flex-col vela:gap-1.5">
283
+ <div class="vela:flex vela:items-center vela:justify-between">
284
+ <span class={fieldLabelClass}>Description</span>
285
+ <span
286
+ class="{counterBaseClass} {counterClass(descVal.length, DESC_TARGET, DESC_AMBER_AT)}"
287
+ >
288
+ {descVal.length} / {DESC_TARGET}
289
+ </span>
290
+ </div>
291
+ <Textarea
292
+ value={stringValue(local.description)}
293
+ oninput={(e) => (local.description = e.currentTarget.value)}
294
+ />
295
+ </label>
296
+ {/if}
297
+
298
+ {#if advancedEntries.length > 0}
299
+ <Collapsible.Root class="vela:border-t vela:border-[var(--cms-bar-divider)] vela:pt-3">
300
+ <Collapsible.Trigger
301
+ class="vela:group vela:flex vela:items-center vela:justify-between vela:w-full
302
+ vela:text-left vela:text-[13px] vela:text-bar-text-secondary
303
+ vela:hover:text-bar-text vela:cursor-pointer vela:focus:outline-none"
304
+ >
305
+ <span>More fields</span>
306
+ <ChevronDownIcon
307
+ class="vela:size-4 vela:transition-transform vela:group-data-[state=open]:rotate-180"
308
+ />
309
+ </Collapsible.Trigger>
310
+ <Collapsible.Content>
311
+ <div class="vela:flex vela:flex-col vela:gap-3 vela:mt-3">
312
+ {#each advancedEntries as [key, fieldSchema] (key)}
313
+ {@const t = fieldType(fieldSchema)}
314
+ {#if t === 'boolean'}
315
+ <label
316
+ class="vela:flex vela:items-center vela:gap-2 vela:text-[13px] vela:text-bar-text"
317
+ >
318
+ <input
319
+ type="checkbox"
320
+ checked={booleanValue(local[key])}
321
+ onchange={(e) => (local[key] = e.currentTarget.checked)}
322
+ />
323
+ <span>{key}</span>
324
+ </label>
325
+ {:else}
326
+ <label class="vela:flex vela:flex-col vela:gap-1.5">
327
+ <span class={fieldLabelClass}>{key}</span>
328
+ {#if t === 'long-string'}
329
+ <Textarea
330
+ value={stringValue(local[key])}
331
+ oninput={(e) => (local[key] = e.currentTarget.value)}
332
+ />
333
+ {:else if t === 'number'}
334
+ <Input
335
+ type="number"
336
+ value={numberValue(local[key]) ?? ''}
337
+ oninput={(e) => setNumber(key, e.currentTarget.value)}
338
+ />
339
+ {:else if t === 'date'}
340
+ <Input
341
+ type="date"
342
+ value={stringValue(local[key])}
343
+ oninput={(e) => (local[key] = e.currentTarget.value)}
344
+ />
345
+ {:else if t === 'image'}
346
+ <Input
347
+ type="url"
348
+ placeholder="https://…"
349
+ value={stringValue(local[key])}
350
+ oninput={(e) => (local[key] = e.currentTarget.value)}
351
+ />
352
+ {:else if t === 'enum'}
353
+ <select
354
+ class={selectClass}
355
+ value={stringValue(local[key])}
356
+ onchange={(e) => (local[key] = e.currentTarget.value)}
357
+ >
358
+ <option value="">—</option>
359
+ {#each enumValues(fieldSchema) as v (v)}
360
+ <option value={v}>{v}</option>
361
+ {/each}
362
+ </select>
363
+ {:else}
364
+ <Input
365
+ type="text"
366
+ value={stringValue(local[key])}
367
+ oninput={(e) => (local[key] = e.currentTarget.value)}
368
+ />
369
+ {/if}
370
+ </label>
371
+ {/if}
372
+ {/each}
373
+ </div>
374
+ </Collapsible.Content>
375
+ </Collapsible.Root>
376
+ {/if}
377
+ {/if}
378
+ </form>
379
+
380
+ <PanelFooter>
381
+ <span>Save to keep your changes</span>
382
+ <div class="vela:flex vela:items-center vela:gap-1.5">
383
+ <Button variant="ghost" size="pill" onclick={onClose}>Cancel</Button>
384
+ <Button size="pill" onclick={handleSave}>Save</Button>
385
+ </div>
386
+ </PanelFooter>
387
+ </Panel>
@@ -0,0 +1,7 @@
1
+ type Props = {
2
+ onClose: () => void;
3
+ onSave: () => void | Promise<void>;
4
+ };
5
+ declare const SeoPanel: import("svelte").Component<Props, {}, "">;
6
+ type SeoPanel = ReturnType<typeof SeoPanel>;
7
+ export default SeoPanel;
@@ -0,0 +1,97 @@
1
+ <script lang="ts">
2
+ import { Button } from './ui/button/index.js';
3
+ import * as Dialog from './ui/dialog/index.js';
4
+ import { Input } from './ui/input/index.js';
5
+
6
+ type Props = {
7
+ open: boolean;
8
+ onOpenChange: (open: boolean) => void;
9
+ previewUrl: string;
10
+ onRegenerate: () => Promise<void> | void;
11
+ };
12
+ let { open, onOpenChange, previewUrl, onRegenerate }: Props = $props();
13
+
14
+ let copied = $state(false);
15
+ let regenerating = $state(false);
16
+ let copiedTimer: ReturnType<typeof setTimeout> | null = null;
17
+
18
+ $effect(() => {
19
+ if (!open) {
20
+ copied = false;
21
+ if (copiedTimer) {
22
+ clearTimeout(copiedTimer);
23
+ copiedTimer = null;
24
+ }
25
+ }
26
+ });
27
+
28
+ const onCopy = async () => {
29
+ if (!previewUrl) return;
30
+ try {
31
+ await navigator.clipboard.writeText(previewUrl);
32
+ copied = true;
33
+ if (copiedTimer) clearTimeout(copiedTimer);
34
+ copiedTimer = setTimeout(() => (copied = false), 1600);
35
+ } catch {
36
+ /* clipboard may be unavailable; swallow silently */
37
+ }
38
+ };
39
+
40
+ const onRegenerateClick = async () => {
41
+ if (regenerating) return;
42
+ regenerating = true;
43
+ try {
44
+ await onRegenerate();
45
+ } finally {
46
+ regenerating = false;
47
+ }
48
+ };
49
+ </script>
50
+
51
+ <Dialog.Root {open} {onOpenChange}>
52
+ <Dialog.Content class="vela:max-w-[28rem]">
53
+ <Dialog.Header>
54
+ <Dialog.Title>Share preview link</Dialog.Title>
55
+ <Dialog.Description>
56
+ Anyone with this link can view your unpublished changes without signing in. Share it with
57
+ teammates or stakeholders to gather feedback before publishing.
58
+ </Dialog.Description>
59
+ </Dialog.Header>
60
+
61
+ <div class="vela:px-6 vela:pb-4 vela:flex vela:flex-col vela:gap-4">
62
+ <div class="vela:flex vela:items-center vela:gap-2">
63
+ <Input
64
+ readonly
65
+ value={previewUrl}
66
+ onfocus={(e) => e.currentTarget.select()}
67
+ class="vela:font-mono vela:text-[12px]"
68
+ />
69
+ <Button variant="default" onclick={onCopy} disabled={!previewUrl}>
70
+ {copied ? 'Copied' : 'Copy'}
71
+ </Button>
72
+ </div>
73
+
74
+ <div
75
+ class="vela:flex vela:items-start vela:justify-between vela:gap-3 vela:pt-3
76
+ vela:border-t vela:border-[var(--cms-bar-divider)]"
77
+ >
78
+ <p class="vela:text-[12px] vela:text-bar-text-secondary vela:leading-snug vela:m-0">
79
+ Regenerating the preview key revokes access for anyone holding a previously shared link.
80
+ </p>
81
+ <Button
82
+ variant="outline-destructive"
83
+ size="sm"
84
+ onclick={onRegenerateClick}
85
+ disabled={regenerating || !previewUrl}
86
+ class="vela:shrink-0"
87
+ >
88
+ {regenerating ? 'Regenerating…' : 'Regenerate'}
89
+ </Button>
90
+ </div>
91
+ </div>
92
+
93
+ <Dialog.Footer class="vela:justify-end vela:pt-2">
94
+ <Button variant="ghost" onclick={() => onOpenChange(false)}>Done</Button>
95
+ </Dialog.Footer>
96
+ </Dialog.Content>
97
+ </Dialog.Root>
@@ -0,0 +1,9 @@
1
+ type Props = {
2
+ open: boolean;
3
+ onOpenChange: (open: boolean) => void;
4
+ previewUrl: string;
5
+ onRegenerate: () => Promise<void> | void;
6
+ };
7
+ declare const SharePreviewLinkDialog: import("svelte").Component<Props, {}, "">;
8
+ type SharePreviewLinkDialog = ReturnType<typeof SharePreviewLinkDialog>;
9
+ export default SharePreviewLinkDialog;