@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,429 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { tick as svelteTick } from 'svelte';
4
+ import { page } from '$app/state';
5
+ import { cmsStore, type CmsScopeRef } from './cms-store.svelte.js';
6
+ import { resolveRouteUrl } from '../admin-bar/resolve-route.js';
7
+ import type { CmsLinkValue, CmsLinkRenderProps } from './cms-link.svelte';
8
+ import { Button } from '../admin-bar/ui/button/index.js';
9
+ import { Input } from '../admin-bar/ui/input/index.js';
10
+ import * as Select from '../admin-bar/ui/select/index.js';
11
+ import CssRoot from '../admin-bar/css-root.svelte';
12
+ import LinkIcon from '../admin-bar/icons/link.svelte';
13
+ import FileIcon from '../admin-bar/icons/file.svelte';
14
+ import ExternalIcon from '../admin-bar/icons/external-link.svelte';
15
+ import CheckIcon from '../admin-bar/icons/check.svelte';
16
+ import XIcon from '../admin-bar/icons/x.svelte';
17
+ import Trash from '../admin-bar/icons/trash-2.svelte';
18
+
19
+ type PageEntry = {
20
+ params: Record<string, string>;
21
+ isDraft: boolean;
22
+ isDeletePending: boolean;
23
+ redirectTo?: string;
24
+ gone?: boolean;
25
+ };
26
+ type PageRoute = {
27
+ routeId: string;
28
+ ownedParams: string[];
29
+ entries: PageEntry[];
30
+ };
31
+
32
+ type Props = {
33
+ scope: CmsScopeRef;
34
+ name: string;
35
+ initial: CmsLinkValue;
36
+ className?: string;
37
+ children?: Snippet<[CmsLinkRenderProps]>;
38
+ };
39
+ let { scope, name, initial, className, children }: Props = $props();
40
+
41
+ const endpoint = $derived(page.data.cms?.endpoint ?? '/api/cms');
42
+
43
+ const current = $derived.by((): CmsLinkValue => {
44
+ const draft = cmsStore.getValue(scope, name);
45
+ if (draft && typeof draft === 'object') return draft as CmsLinkValue;
46
+ return initial;
47
+ });
48
+
49
+ const set = (next: CmsLinkValue) => cmsStore.setValue(scope, name, next);
50
+
51
+ const href = $derived.by(() => {
52
+ if (current.routeId) {
53
+ try {
54
+ return resolveRouteUrl(current.routeId, current.params ?? {});
55
+ } catch {
56
+ return '#';
57
+ }
58
+ }
59
+ return current.href ?? '#';
60
+ });
61
+ const isInternal = $derived(!!current.routeId);
62
+
63
+ let mode: 'idle' | 'url' | 'page' = $state('idle');
64
+
65
+ let urlInput = $state('');
66
+ let urlInputEl: HTMLInputElement | null = $state(null);
67
+
68
+ let pages: PageRoute[] = $state([]);
69
+ let pagesLoaded = $state(false);
70
+ let selectedValue = $state('');
71
+ let pageSelectOpen = $state(false);
72
+
73
+ let labelEl: HTMLElement | undefined = $state();
74
+ let composing = false;
75
+
76
+ $effect(() => {
77
+ if (!labelEl) return;
78
+ const target = current.label ?? '';
79
+ if (document.activeElement === labelEl) return;
80
+ if (labelEl.textContent === target) return;
81
+ labelEl.textContent = target;
82
+ });
83
+
84
+ const onLabelInput = (e: Event) => {
85
+ if (composing) return;
86
+ set({ ...current, label: (e.currentTarget as HTMLElement).textContent ?? '' });
87
+ };
88
+ const onLabelKeydown = (e: KeyboardEvent) => {
89
+ if (e.key === 'Enter') e.preventDefault();
90
+ };
91
+ const onLabelCompositionEnd = (e: CompositionEvent) => {
92
+ composing = false;
93
+ set({ ...current, label: (e.currentTarget as HTMLElement).textContent ?? '' });
94
+ };
95
+
96
+ const enterUrlMode = async (e: Event) => {
97
+ e.preventDefault();
98
+ e.stopPropagation();
99
+ urlInput = current.href ?? '';
100
+ mode = 'url';
101
+ await svelteTick();
102
+ urlInputEl?.focus();
103
+ urlInputEl?.select();
104
+ };
105
+
106
+ const applyUrl = (e?: Event) => {
107
+ e?.preventDefault();
108
+ e?.stopPropagation();
109
+ const v = urlInput.trim();
110
+ set({
111
+ label: current.label,
112
+ href: v || undefined,
113
+ routeId: undefined,
114
+ params: undefined,
115
+ newTab: current.newTab
116
+ });
117
+ mode = 'idle';
118
+ };
119
+
120
+ const cancelMode = (e?: Event) => {
121
+ e?.preventDefault();
122
+ e?.stopPropagation();
123
+ mode = 'idle';
124
+ };
125
+
126
+ const onUrlKey = (e: KeyboardEvent) => {
127
+ if (e.key === 'Enter') applyUrl(e);
128
+ else if (e.key === 'Escape') cancelMode(e);
129
+ };
130
+
131
+ const optionValueFor = (routeId: string, params: Record<string, string>) =>
132
+ `${routeId}::${JSON.stringify(params)}`;
133
+
134
+ const enterPageMode = async (e: Event) => {
135
+ e.preventDefault();
136
+ e.stopPropagation();
137
+ selectedValue = current.routeId ? optionValueFor(current.routeId, current.params ?? {}) : '';
138
+ mode = 'page';
139
+ if (!pagesLoaded) {
140
+ try {
141
+ const res = await fetch(`${endpoint}/pages`, { credentials: 'include' });
142
+ if (res.ok) {
143
+ const data = (await res.json()) as { routes: PageRoute[] };
144
+ pages = data.routes;
145
+ }
146
+ } catch {
147
+ /* ignore — picker shows "No pages found" */
148
+ }
149
+ pagesLoaded = true;
150
+ }
151
+ };
152
+
153
+ const pageOptions = $derived.by(() => {
154
+ const opts: {
155
+ value: string;
156
+ label: string;
157
+ routeId: string;
158
+ params: Record<string, string>;
159
+ }[] = [];
160
+ for (const r of pages) {
161
+ const entries =
162
+ r.entries.length > 0
163
+ ? r.entries
164
+ : [{ params: {} as Record<string, string>, isDraft: false, isDeletePending: false }];
165
+ for (const ent of entries) {
166
+ // Tombstones (redirected / gone) aren't real link targets.
167
+ if (ent.redirectTo || ent.gone) continue;
168
+ let url: string;
169
+ try {
170
+ url = resolveRouteUrl(r.routeId, ent.params);
171
+ } catch {
172
+ continue;
173
+ }
174
+ opts.push({
175
+ value: optionValueFor(r.routeId, ent.params),
176
+ label: url,
177
+ routeId: r.routeId,
178
+ params: ent.params
179
+ });
180
+ }
181
+ }
182
+ opts.sort((a, b) => a.label.localeCompare(b.label));
183
+ return opts;
184
+ });
185
+
186
+ const applyPageValue = (value: string) => {
187
+ const opt = pageOptions.find((o) => o.value === value);
188
+ if (!opt) return;
189
+ set({
190
+ label: current.label,
191
+ routeId: opt.routeId,
192
+ params: opt.params,
193
+ href: undefined,
194
+ newTab: current.newTab
195
+ });
196
+ mode = 'idle';
197
+ };
198
+
199
+ const toggleNewTab = (e: Event) => {
200
+ e.preventDefault();
201
+ e.stopPropagation();
202
+ set({ ...current, newTab: !current.newTab });
203
+ };
204
+
205
+ const clearTarget = (e: Event) => {
206
+ e.preventDefault();
207
+ e.stopPropagation();
208
+ set({ label: current.label, newTab: current.newTab });
209
+ };
210
+
211
+ const stopMouseDown = (e: MouseEvent) => e.preventDefault();
212
+ const blockNav = (e: Event) => e.preventDefault();
213
+
214
+ const renderProps = $derived<CmsLinkRenderProps>({
215
+ label: current.label ?? '',
216
+ href,
217
+ newTab: !!current.newTab
218
+ });
219
+ </script>
220
+
221
+ <CssRoot>
222
+ <span
223
+ class="cms-link-edit"
224
+ role="group"
225
+ aria-label={`Link slot ${name}`}
226
+ data-popover-open={pageSelectOpen ? '' : undefined}
227
+ >
228
+ {#if children}
229
+ <span class="cms-link-edit__custom">
230
+ {@render children(renderProps)}
231
+ </span>
232
+ {:else}
233
+ <a
234
+ class={className ?? 'cms-link'}
235
+ {href}
236
+ aria-label={current.label || name}
237
+ target={current.newTab ? '_blank' : undefined}
238
+ rel={current.newTab ? 'noopener noreferrer' : undefined}
239
+ onclick={blockNav}
240
+ >
241
+ <span
242
+ bind:this={labelEl}
243
+ class="cms-link-edit__label"
244
+ contenteditable="plaintext-only"
245
+ role="textbox"
246
+ tabindex="0"
247
+ aria-label={`${name} label`}
248
+ spellcheck="true"
249
+ data-placeholder={name}
250
+ oninput={onLabelInput}
251
+ onkeydown={onLabelKeydown}
252
+ oncompositionstart={() => (composing = true)}
253
+ oncompositionend={onLabelCompositionEnd}
254
+ ></span>
255
+ </a>
256
+ {/if}
257
+
258
+ <div
259
+ class="cms-link-edit__toolbar"
260
+ role="toolbar"
261
+ tabindex="-1"
262
+ aria-label="Link target"
263
+ onmousedown={stopMouseDown}
264
+ >
265
+ {#if mode === 'idle'}
266
+ <span class="cms-link-edit__href" title={href}>
267
+ <span class="cms-link-edit__href-arrow">{isInternal ? '↪' : '↗'}</span>
268
+ <span class="cms-link-edit__href-text">{href === '#' ? '(no target)' : href}</span>
269
+ </span>
270
+ <span class="cms-link-edit__divider"></span>
271
+ <Button size="xs" variant="ghost" data-active={isInternal} onclick={enterPageMode}>
272
+ <FileIcon class="vela:size-3.5" />
273
+ Page
274
+ </Button>
275
+ <Button
276
+ size="xs"
277
+ variant="ghost"
278
+ data-active={!isInternal && !!current.href}
279
+ onclick={enterUrlMode}
280
+ >
281
+ <LinkIcon class="vela:size-3.5" />
282
+ URL
283
+ </Button>
284
+ <Button
285
+ size="icon"
286
+ variant="ghost"
287
+ data-active={!!current.newTab}
288
+ aria-label={current.newTab ? 'Open in new tab (on)' : 'Open in new tab (off)'}
289
+ onclick={toggleNewTab}
290
+ >
291
+ <ExternalIcon class="vela:size-3.5" />
292
+ </Button>
293
+ {#if current.href || current.routeId}
294
+ <Button size="icon" variant="ghost" aria-label="Clear link target" onclick={clearTarget}>
295
+ <Trash class="vela:size-3.5" />
296
+ </Button>
297
+ {/if}
298
+ {:else if mode === 'url'}
299
+ <Input
300
+ bind:ref={urlInputEl}
301
+ bind:value={urlInput}
302
+ type="url"
303
+ placeholder="https://example.com"
304
+ onkeydown={onUrlKey}
305
+ class="vela:h-7 vela:w-72 vela:text-xs"
306
+ />
307
+ <Button size="icon" variant="ghost" aria-label="Apply URL" onclick={applyUrl}>
308
+ <CheckIcon class="vela:size-4" />
309
+ </Button>
310
+ <Button size="icon" variant="ghost" aria-label="Cancel" onclick={cancelMode}>
311
+ <XIcon class="vela:size-4" />
312
+ </Button>
313
+ {:else}
314
+ {#if !pagesLoaded}
315
+ <span class="cms-link-edit__status">Loading…</span>
316
+ {:else if pageOptions.length === 0}
317
+ <span class="cms-link-edit__status">No pages found</span>
318
+ {:else}
319
+ {@const selectedOpt = pageOptions.find((o) => o.value === selectedValue)}
320
+ <Select.Root
321
+ type="single"
322
+ value={selectedValue}
323
+ onValueChange={(v) => {
324
+ selectedValue = v;
325
+ applyPageValue(v);
326
+ }}
327
+ bind:open={pageSelectOpen}
328
+ >
329
+ <Select.Trigger size="sm" class="vela:min-w-56">
330
+ <span data-slot="select-value" class="vela:truncate">
331
+ {selectedOpt?.label ?? '— Select page —'}
332
+ </span>
333
+ </Select.Trigger>
334
+ <Select.Content sideOffset={6}>
335
+ {#each pageOptions as opt (opt.value)}
336
+ <Select.Item value={opt.value} label={opt.label}>{opt.label}</Select.Item>
337
+ {/each}
338
+ </Select.Content>
339
+ </Select.Root>
340
+ {/if}
341
+ <Button size="icon" variant="ghost" aria-label="Cancel" onclick={cancelMode}>
342
+ <XIcon class="vela:size-4" />
343
+ </Button>
344
+ {/if}
345
+ </div>
346
+ </span>
347
+ </CssRoot>
348
+
349
+ <style>
350
+ .cms-link-edit {
351
+ position: relative;
352
+ display: inline-block;
353
+ vertical-align: baseline;
354
+ border-radius: 0.125rem;
355
+ outline: 1px dashed rgba(127, 127, 127, 0.6);
356
+ outline-offset: 2px;
357
+ }
358
+ .cms-link-edit:hover,
359
+ .cms-link-edit:focus-within {
360
+ outline: 2px solid var(--cms-accent, #534ab7);
361
+ outline-offset: 2px;
362
+ }
363
+ .cms-link-edit__custom {
364
+ display: inline;
365
+ }
366
+ .cms-link-edit__label {
367
+ outline: none;
368
+ min-width: 1ch;
369
+ }
370
+ .cms-link-edit__label:empty::before {
371
+ content: attr(data-placeholder);
372
+ color: rgba(127, 127, 127, 0.6);
373
+ font-style: italic;
374
+ }
375
+ .cms-link-edit__toolbar {
376
+ position: absolute;
377
+ top: 0;
378
+ left: 0;
379
+ transform: translateY(calc(-100% - 0.5rem));
380
+ display: none;
381
+ align-items: center;
382
+ gap: 0.125rem;
383
+ padding: 0.25rem;
384
+ background: var(--cms-bar-bg, #1f1f1f);
385
+ border: 1px solid var(--cms-bar-divider, #3a3a3a);
386
+ border-radius: 0.375rem;
387
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
388
+ color: var(--cms-bar-text, #f5f5f5);
389
+ z-index: 50;
390
+ white-space: nowrap;
391
+ font-family: ui-sans-serif, system-ui, sans-serif;
392
+ }
393
+ .cms-link-edit:hover .cms-link-edit__toolbar,
394
+ .cms-link-edit:focus-within .cms-link-edit__toolbar,
395
+ .cms-link-edit[data-popover-open] .cms-link-edit__toolbar {
396
+ display: inline-flex;
397
+ }
398
+ .cms-link-edit__toolbar :global([data-active='true']) {
399
+ background: var(--cms-bar-bg-hover, #2e2e2e);
400
+ color: var(--cms-bar-text, #f5f5f5);
401
+ }
402
+ .cms-link-edit__divider {
403
+ display: inline-block;
404
+ width: 1px;
405
+ align-self: stretch;
406
+ margin: 0.125rem 0.25rem;
407
+ background: var(--cms-bar-divider, #3a3a3a);
408
+ }
409
+ .cms-link-edit__href {
410
+ display: inline-flex;
411
+ align-items: center;
412
+ gap: 0.375rem;
413
+ padding: 0 0.5rem;
414
+ max-width: 18rem;
415
+ font-size: 0.6875rem;
416
+ font-family: ui-monospace, monospace;
417
+ color: var(--cms-bar-text-secondary, #a3a3a3);
418
+ }
419
+ .cms-link-edit__href-text {
420
+ overflow: hidden;
421
+ text-overflow: ellipsis;
422
+ white-space: nowrap;
423
+ }
424
+ .cms-link-edit__status {
425
+ padding: 0 0.5rem;
426
+ font-size: 0.75rem;
427
+ color: var(--cms-bar-text-secondary, #a3a3a3);
428
+ }
429
+ </style>
@@ -0,0 +1,13 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type CmsScopeRef } from './cms-store.svelte.js';
3
+ import type { CmsLinkValue, CmsLinkRenderProps } from './cms-link.svelte';
4
+ type Props = {
5
+ scope: CmsScopeRef;
6
+ name: string;
7
+ initial: CmsLinkValue;
8
+ className?: string;
9
+ children?: Snippet<[CmsLinkRenderProps]>;
10
+ };
11
+ declare const CmsLinkEditable: import("svelte").Component<Props, {}, "">;
12
+ type CmsLinkEditable = ReturnType<typeof CmsLinkEditable>;
13
+ export default CmsLinkEditable;
@@ -0,0 +1,92 @@
1
+ <script lang="ts" module>
2
+ export type CmsLinkValue = {
3
+ label?: string;
4
+ /** Raw URL — used when `routeId` is absent. */
5
+ href?: string;
6
+ /** SvelteKit route id, e.g. `/blog/[slug]`. Resolved at render time. */
7
+ routeId?: string;
8
+ params?: Record<string, string>;
9
+ newTab?: boolean;
10
+ };
11
+
12
+ export type CmsLinkRenderProps = { label: string; href: string; newTab: boolean };
13
+ </script>
14
+
15
+ <script lang="ts">
16
+ import type { Snippet } from 'svelte';
17
+ import { getCmsScope } from './scope.js';
18
+ import { cmsStore, type CmsScopeRef } from './cms-store.svelte.js';
19
+ import { resolveRouteUrl } from '../admin-bar/resolve-route.js';
20
+
21
+ type Props = {
22
+ name: string;
23
+ fallback?: CmsLinkValue;
24
+ value?: unknown;
25
+ class?: string;
26
+ children?: Snippet<[CmsLinkRenderProps]>;
27
+ };
28
+ let { name, fallback, value, class: className, children }: Props = $props();
29
+
30
+ const scope = getCmsScope();
31
+ const ref = $derived<CmsScopeRef | null>(
32
+ scope ? { scopeId: scope.scopeId, routeId: scope.routeId, params: scope.params } : null
33
+ );
34
+
35
+ const resolved = $derived.by(() => {
36
+ if (value !== undefined) return value;
37
+ return ref ? cmsStore.getValue(ref, name) : undefined;
38
+ });
39
+
40
+ const link = $derived.by((): CmsLinkValue => {
41
+ if (resolved && typeof resolved === 'object') return resolved as CmsLinkValue;
42
+ return fallback ?? {};
43
+ });
44
+
45
+ const href = $derived.by(() => {
46
+ if (link.routeId) {
47
+ try {
48
+ return resolveRouteUrl(link.routeId, link.params ?? {});
49
+ } catch {
50
+ return '#';
51
+ }
52
+ }
53
+ return link.href ?? '#';
54
+ });
55
+
56
+ const label = $derived(link.label ?? '');
57
+ const newTab = $derived(!!link.newTab);
58
+ const editable = $derived(cmsStore.isEditing && value === undefined && !!ref);
59
+ </script>
60
+
61
+ {#if editable && ref}
62
+ {#await import('./cms-link-editable.svelte') then { default: Editable }}
63
+ <Editable scope={ref} {name} initial={link} {className} {children} />
64
+ {/await}
65
+ {:else if children}
66
+ {@render children({ label, href, newTab })}
67
+ {:else if link.href || link.routeId || label}
68
+ <a
69
+ class={className ?? 'cms-link'}
70
+ {href}
71
+ target={newTab ? '_blank' : undefined}
72
+ rel={newTab ? 'noopener noreferrer' : undefined}
73
+ >
74
+ {label || name}
75
+ </a>
76
+ {:else}
77
+ <span class="cms-missing" data-cms-name={name} data-cms-scope={scope?.scopeId ?? '?'}>
78
+ {name}
79
+ </span>
80
+ {/if}
81
+
82
+ <style>
83
+ .cms-missing {
84
+ display: inline-block;
85
+ padding: 0 0.25rem;
86
+ border: 1px dashed rgba(127, 127, 127, 0.6);
87
+ border-radius: 0.25rem;
88
+ font-family: ui-monospace, monospace;
89
+ font-size: 0.85em;
90
+ color: rgba(127, 127, 127, 0.9);
91
+ }
92
+ </style>
@@ -0,0 +1,25 @@
1
+ export type CmsLinkValue = {
2
+ label?: string;
3
+ /** Raw URL — used when `routeId` is absent. */
4
+ href?: string;
5
+ /** SvelteKit route id, e.g. `/blog/[slug]`. Resolved at render time. */
6
+ routeId?: string;
7
+ params?: Record<string, string>;
8
+ newTab?: boolean;
9
+ };
10
+ export type CmsLinkRenderProps = {
11
+ label: string;
12
+ href: string;
13
+ newTab: boolean;
14
+ };
15
+ import type { Snippet } from 'svelte';
16
+ type Props = {
17
+ name: string;
18
+ fallback?: CmsLinkValue;
19
+ value?: unknown;
20
+ class?: string;
21
+ children?: Snippet<[CmsLinkRenderProps]>;
22
+ };
23
+ declare const CmsLink: import("svelte").Component<Props, {}, "">;
24
+ type CmsLink = ReturnType<typeof CmsLink>;
25
+ export default CmsLink;
@@ -0,0 +1,74 @@
1
+ <script lang="ts">
2
+ import { cmsStore, type CmsScopeRef } from './cms-store.svelte.js';
3
+
4
+ type Props = {
5
+ scope: CmsScopeRef;
6
+ name: string;
7
+ initial?: string;
8
+ };
9
+
10
+ let { scope, name, initial }: Props = $props();
11
+
12
+ const live = $derived(cmsStore.getValue(scope, name));
13
+ const display = $derived(typeof live === 'string' ? live : (initial ?? ''));
14
+
15
+ let el = $state<HTMLTextAreaElement>();
16
+
17
+ $effect(() => {
18
+ if (!el) return;
19
+ if (document.activeElement === el) return;
20
+ if (el.value === display) return;
21
+ el.value = display;
22
+ });
23
+
24
+ const autosize = (textarea: HTMLTextAreaElement) => {
25
+ textarea.style.height = 'auto';
26
+ textarea.style.height = `${textarea.scrollHeight}px`;
27
+ };
28
+
29
+ $effect(() => {
30
+ if (!el) return;
31
+ // re-run when display changes
32
+ display;
33
+ autosize(el);
34
+ });
35
+
36
+ const onInput = (e: Event) => {
37
+ const target = e.currentTarget as HTMLTextAreaElement;
38
+ cmsStore.setValue(scope, name, target.value);
39
+ autosize(target);
40
+ };
41
+ </script>
42
+
43
+ <textarea
44
+ bind:this={el}
45
+ class="cms-markdown-editable"
46
+ data-cms-name={name}
47
+ data-cms-scope={scope.scopeId}
48
+ aria-label={name}
49
+ rows="3"
50
+ spellcheck="true"
51
+ oninput={onInput}></textarea>
52
+
53
+ <style>
54
+ .cms-markdown-editable {
55
+ display: block;
56
+ width: 100%;
57
+ padding: 0.375rem 0.5rem;
58
+ font: inherit;
59
+ font-family: ui-monospace, monospace;
60
+ font-size: 0.875em;
61
+ line-height: 1.4;
62
+ background: var(--cms-bar-bg, #1f1f1f);
63
+ color: var(--cms-bar-text, #f5f5f5);
64
+ border: 1px solid var(--cms-bar-divider, #3a3a3a);
65
+ border-radius: 0.25rem;
66
+ resize: vertical;
67
+ overflow: hidden;
68
+ white-space: pre-wrap;
69
+ }
70
+ .cms-markdown-editable:focus {
71
+ outline: 2px solid var(--cms-accent, #534ab7);
72
+ outline-offset: 1px;
73
+ }
74
+ </style>
@@ -0,0 +1,9 @@
1
+ import { type CmsScopeRef } from './cms-store.svelte.js';
2
+ type Props = {
3
+ scope: CmsScopeRef;
4
+ name: string;
5
+ initial?: string;
6
+ };
7
+ declare const CmsMarkdownEditable: import("svelte").Component<Props, {}, "">;
8
+ type CmsMarkdownEditable = ReturnType<typeof CmsMarkdownEditable>;
9
+ export default CmsMarkdownEditable;
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { marked } from 'marked';
4
+ import { getCmsScope } from './scope.js';
5
+ import { cmsStore, type CmsScopeRef } from './cms-store.svelte.js';
6
+
7
+ type Props = {
8
+ name: string;
9
+ fallback?: string;
10
+ value?: unknown;
11
+ children?: Snippet;
12
+ };
13
+
14
+ let { name, fallback, value, children }: Props = $props();
15
+
16
+ const scope = getCmsScope();
17
+ const ref = $derived<CmsScopeRef | null>(
18
+ scope ? { scopeId: scope.scopeId, routeId: scope.routeId, params: scope.params } : null
19
+ );
20
+
21
+ const resolved = $derived.by(() => {
22
+ if (value !== undefined) return value;
23
+ return ref ? cmsStore.getValue(ref, name) : undefined;
24
+ });
25
+
26
+ const source = $derived(typeof resolved === 'string' ? resolved : (fallback ?? ''));
27
+ const editable = $derived(cmsStore.isEditing && value === undefined && !!ref);
28
+ </script>
29
+
30
+ {#if editable && ref}
31
+ {#await import('./cms-markdown-editable.svelte') then { default: Editable }}
32
+ <Editable scope={ref} {name} initial={source} />
33
+ {/await}
34
+ {:else if source}
35
+ <div class="cms-markdown">{@html marked.parse(source, { async: false })}</div>
36
+ {:else if children}
37
+ {@render children()}
38
+ {:else}
39
+ <div class="cms-missing" data-cms-name={name} data-cms-scope={scope?.scopeId ?? '?'}>
40
+ {name}
41
+ </div>
42
+ {/if}
43
+
44
+ <style>
45
+ .cms-markdown {
46
+ display: contents;
47
+ }
48
+ .cms-missing {
49
+ padding: 0.25rem 0.5rem;
50
+ border: 1px dashed rgba(127, 127, 127, 0.6);
51
+ border-radius: 0.25rem;
52
+ font-family: ui-monospace, monospace;
53
+ font-size: 0.85em;
54
+ color: rgba(127, 127, 127, 0.9);
55
+ }
56
+ </style>