@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,29 @@
1
+ <script lang="ts">
2
+ import XIcon from './icons/x.svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { Button } from './ui/button/index.js';
5
+ import { cn } from './utils.js';
6
+
7
+ type Props = {
8
+ title: string;
9
+ onClose: () => void;
10
+ class?: string;
11
+ subtitle?: Snippet;
12
+ };
13
+ let { title, onClose, class: className, subtitle }: Props = $props();
14
+ </script>
15
+
16
+ <div
17
+ class={cn(
18
+ 'vela:flex vela:items-center vela:justify-between vela:px-4 vela:pt-3.5 vela:pb-3',
19
+ className
20
+ )}
21
+ >
22
+ <div class="vela:flex vela:items-baseline vela:gap-2 vela:min-w-0">
23
+ <h2 class="vela:text-[15px] vela:font-semibold vela:m-0">{title}</h2>
24
+ {#if subtitle}{@render subtitle()}{/if}
25
+ </div>
26
+ <Button variant="ghost" size="pill-icon" aria-label="Close" onclick={onClose}>
27
+ <XIcon class="vela:size-4" />
28
+ </Button>
29
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Props = {
3
+ title: string;
4
+ onClose: () => void;
5
+ class?: string;
6
+ subtitle?: Snippet;
7
+ };
8
+ declare const PanelHeader: import("svelte").Component<Props, {}, "">;
9
+ type PanelHeader = ReturnType<typeof PanelHeader>;
10
+ export default PanelHeader;
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { cn } from './utils.js';
4
+
5
+ type Props = {
6
+ ariaLabel: string;
7
+ onClose: () => void;
8
+ class?: string;
9
+ children: Snippet;
10
+ };
11
+ let { ariaLabel, onClose, class: className, children }: Props = $props();
12
+
13
+ // Escape closes the panel. Each panel previously duplicated this effect; it
14
+ // lives here now so callers don't have to remember.
15
+ $effect(() => {
16
+ const onKeydown = (e: KeyboardEvent) => {
17
+ if (e.key !== 'Escape') return;
18
+ e.preventDefault();
19
+ e.stopPropagation();
20
+ onClose();
21
+ };
22
+ window.addEventListener('keydown', onKeydown);
23
+ return () => window.removeEventListener('keydown', onKeydown);
24
+ });
25
+ </script>
26
+
27
+ <div
28
+ role="dialog"
29
+ aria-label={ariaLabel}
30
+ class={cn(
31
+ 'vela:fixed vela:top-[var(--cms-panel-top,72px)] vela:left-1/2 vela:-translate-x-1/2 vela:z-[9998]',
32
+ 'vela:w-full vela:max-w-[560px] vela:mx-4 vela:sm:mx-auto',
33
+ 'vela:flex vela:flex-col',
34
+ 'vela:max-h-[calc(100vh-var(--cms-panel-top,72px)-1rem)]',
35
+ 'vela:rounded-xl vela:bg-bar-bg vela:text-bar-text',
36
+ 'vela:shadow-[0_12px_32px_rgba(0,0,0,0.45)]',
37
+ className
38
+ )}
39
+ >
40
+ {@render children()}
41
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Props = {
3
+ ariaLabel: string;
4
+ onClose: () => void;
5
+ class?: string;
6
+ children: Snippet;
7
+ };
8
+ declare const Panel: import("svelte").Component<Props, {}, "">;
9
+ type Panel = ReturnType<typeof Panel>;
10
+ export default Panel;
@@ -0,0 +1,387 @@
1
+ <script lang="ts">
2
+ import { page } from '$app/state';
3
+ import type { ReleaseItem } from '../cms/cms-store.svelte.js';
4
+ import type { CmsPayload } from '../cms/scope.js';
5
+ import { diffPaths, type Tree } from '../cms/path.js';
6
+ import { resolveRouteOnlyParams, resolveRouteUrl } from './resolve-route.js';
7
+ import { Badge, type BadgeVariant } from './ui/badge/index.js';
8
+ import { Button } from './ui/button/index.js';
9
+ import * as Dialog from './ui/dialog/index.js';
10
+ import { Input } from './ui/input/index.js';
11
+
12
+ type Props = {
13
+ open: boolean;
14
+ onOpenChange: (open: boolean) => void;
15
+ items: ReleaseItem[];
16
+ publishing: boolean;
17
+ error: string | null;
18
+ user: { name: string };
19
+ endpoint: string;
20
+ onConfirm: (name: string | undefined) => void;
21
+ };
22
+ let { open, onOpenChange, items, publishing, error, user, endpoint, onConfirm }: Props = $props();
23
+
24
+ const defaultLocale = $derived((page.data.cms as CmsPayload | undefined)?.locales?.[0] ?? '');
25
+
26
+ /**
27
+ * Identity key shared across locales — `(kind, routeId, params)`. Two
28
+ * items with the same key are "the same page" edited in different locales
29
+ * and render as one row with both locales tagged. Treats `page` and
30
+ * `page-delete` as one identity so the row classifier can decide if the
31
+ * net effect is delete vs edit.
32
+ */
33
+ const groupKey = (item: ReleaseItem): string => {
34
+ if (item.kind === 'layout') return `layout|${item.routeId}`;
35
+ if (item.kind === 'site') return 'site';
36
+ const sortedKeys = Object.keys(item.params).sort();
37
+ const qp = sortedKeys.map((k) => `${k}=${item.params[k]}`).join('&');
38
+ return `page|${item.routeId}|${qp}`;
39
+ };
40
+
41
+ type Group = {
42
+ key: string;
43
+ items: ReleaseItem[];
44
+ locales: string[];
45
+ /** Earliest-added item — used for the URL label and primary classification. */
46
+ primary: ReleaseItem;
47
+ /** Latest `addedAt` across all locales — drives the "X minutes ago" suffix. */
48
+ latestAddedAt: string;
49
+ };
50
+
51
+ const groups = $derived.by<Group[]>(() => {
52
+ const map = new Map<string, Group>();
53
+ for (const item of items) {
54
+ const key = groupKey(item);
55
+ const existing = map.get(key);
56
+ const itemLocale = item.kind === 'site' ? '' : item.locale;
57
+ if (existing) {
58
+ existing.items.push(item);
59
+ if (itemLocale && !existing.locales.includes(itemLocale)) existing.locales.push(itemLocale);
60
+ if (item.addedAt < existing.primary.addedAt) existing.primary = item;
61
+ if (item.addedAt > existing.latestAddedAt) existing.latestAddedAt = item.addedAt;
62
+ } else {
63
+ map.set(key, {
64
+ key,
65
+ items: [item],
66
+ locales: itemLocale ? [itemLocale] : [],
67
+ primary: item,
68
+ latestAddedAt: item.addedAt
69
+ });
70
+ }
71
+ }
72
+ // Sort locales: default first, then alphabetical.
73
+ for (const g of map.values()) {
74
+ g.locales.sort((a, b) => {
75
+ if (a === defaultLocale) return -1;
76
+ if (b === defaultLocale) return 1;
77
+ return a < b ? -1 : a > b ? 1 : 0;
78
+ });
79
+ }
80
+ return [...map.values()];
81
+ });
82
+
83
+ let releaseName = $state('');
84
+ /** Identity keys (locale-stripped) of pages that have NO published entry
85
+ * in *any* locale yet — used to classify a row as "new" rather than "edited". */
86
+ let draftPageKeys = $state<Set<string>>(new Set());
87
+
88
+ const initials = $derived(
89
+ user.name
90
+ .trim()
91
+ .split(/\s+/)
92
+ .slice(0, 2)
93
+ .map((w) => w[0]?.toUpperCase() ?? '')
94
+ .join('')
95
+ );
96
+
97
+ // Fetch the page map once on open so we can distinguish "new page" items
98
+ // (page kind, no published entry yet) from "edited" or "SEO-only" items.
99
+ // Across locales: a page with a published entry in ANY locale is "edited"
100
+ // in every locale (the storage already exists; we're adding a translation),
101
+ // not "new". So we union draft-status across locales here.
102
+ $effect(() => {
103
+ if (!open) return;
104
+ void (async () => {
105
+ try {
106
+ const res = await fetch(`${endpoint}/pages`, { credentials: 'include' });
107
+ if (!res.ok) return;
108
+ const data = (await res.json()) as {
109
+ routes: Array<{
110
+ routeId: string;
111
+ entries: Array<{ params: Record<string, string>; isDraft: boolean }>;
112
+ }>;
113
+ };
114
+ const sortedParamsKey = (params: Record<string, string>): string => {
115
+ const ks = Object.keys(params).sort();
116
+ return ks.map((k) => `${k}=${params[k]}`).join('&');
117
+ };
118
+ const set = new Set<string>();
119
+ for (const r of data.routes) {
120
+ for (const e of r.entries) {
121
+ if (e.isDraft) set.add(`page|${r.routeId}|${sortedParamsKey(e.params)}`);
122
+ }
123
+ }
124
+ draftPageKeys = set;
125
+ } catch {
126
+ /* leave empty — items default to "edited" classification */
127
+ }
128
+ })();
129
+ });
130
+
131
+ type ChangeType = 'edited' | 'new' | 'delete' | 'gone' | 'redirect' | 'seo';
132
+
133
+ const META_PREFIX = 'metadata.';
134
+
135
+ /** All edited leaf paths in the item's tree. */
136
+ const editedPaths = (tree: Tree): string[] => diffPaths(undefined, tree);
137
+
138
+ /** Leaf paths under the `metadata.*` branch, surfaced without the prefix. */
139
+ const metadataPaths = (tree: Tree): string[] =>
140
+ editedPaths(tree)
141
+ .filter((p) => p.startsWith(META_PREFIX))
142
+ .map((p) => p.slice(META_PREFIX.length));
143
+
144
+ /** Leaf paths NOT under the `metadata.*` branch. */
145
+ const nonMetadataPaths = (tree: Tree): string[] =>
146
+ editedPaths(tree).filter((p) => !p.startsWith(META_PREFIX));
147
+
148
+ /** Classify a group: page-delete > new > seo > edited, evaluated across
149
+ * all locales in the group. If any locale stages a delete, the row is a
150
+ * delete. If ANY locale has only `metadata.*` edits and none have body
151
+ * edits, it's "SEO". */
152
+ const changeTypeOfGroup = (group: Group): ChangeType => {
153
+ // page-delete in any locale wins; the publish summary should reflect
154
+ // that the row's net effect is removal. Outcome priority: redirect > gone > delete.
155
+ const deletes = group.items.filter((i) => i.kind === 'page-delete');
156
+ if (deletes.length > 0) {
157
+ if (deletes.some((d) => d.kind === 'page-delete' && d.outcome?.kind === 'redirect'))
158
+ return 'redirect';
159
+ if (deletes.some((d) => d.kind === 'page-delete' && d.outcome?.kind === 'gone'))
160
+ return 'gone';
161
+ return 'delete';
162
+ }
163
+ if (group.primary.kind === 'site') return 'edited';
164
+ if (group.primary.kind === 'layout') return 'edited';
165
+ if (draftPageKeys.has(group.key)) return 'new';
166
+ const anyNonMeta = group.items.some(
167
+ (i) => i.kind === 'page' && nonMetadataPaths(i.tree).length > 0
168
+ );
169
+ const anyMeta = group.items.some((i) => i.kind === 'page' && metadataPaths(i.tree).length > 0);
170
+ if (!anyNonMeta && anyMeta) return 'seo';
171
+ return 'edited';
172
+ };
173
+
174
+ const labelFor = (item: ReleaseItem): string => {
175
+ if (item.kind === 'site') return 'Site settings';
176
+ if (item.kind === 'layout') return resolveRouteOnlyParams(item.routeId);
177
+ try {
178
+ return resolveRouteUrl(item.routeId, item.params);
179
+ } catch {
180
+ return resolveRouteOnlyParams(item.routeId);
181
+ }
182
+ };
183
+
184
+ const summarizeNames = (names: string[], verb: string): string => {
185
+ if (names.length === 0) return verb;
186
+ if (names.length === 1) return `${verb} ${names[0]}`;
187
+ return `${verb} ${names[0]} +${names.length - 1} more`;
188
+ };
189
+
190
+ const unionPaths = (group: Group, filter: (paths: string[]) => string[]): string[] => {
191
+ const seen = new Set<string>();
192
+ const out: string[] = [];
193
+ for (const i of group.items) {
194
+ if (i.kind === 'page-delete') continue;
195
+ for (const p of filter(editedPaths(i.tree))) {
196
+ if (seen.has(p)) continue;
197
+ seen.add(p);
198
+ out.push(p);
199
+ }
200
+ }
201
+ return out;
202
+ };
203
+
204
+ const metaTextForGroup = (group: Group): string => {
205
+ const deletes = group.items.filter((i) => i.kind === 'page-delete');
206
+ if (deletes.length > 0) {
207
+ // Delete description follows the same outcome priority as classification.
208
+ const redirect = deletes.find(
209
+ (d) => d.kind === 'page-delete' && d.outcome?.kind === 'redirect'
210
+ );
211
+ if (redirect && redirect.kind === 'page-delete' && redirect.outcome?.kind === 'redirect')
212
+ return `Redirects to ${redirect.outcome.to}`;
213
+ if (deletes.some((d) => d.kind === 'page-delete' && d.outcome?.kind === 'gone'))
214
+ return 'Marked permanently gone';
215
+ return 'Marked for deletion';
216
+ }
217
+ if (group.primary.kind === 'site' || group.primary.kind === 'layout') {
218
+ return summarizeNames(
219
+ unionPaths(group, (p) => p),
220
+ 'Edited'
221
+ );
222
+ }
223
+ if (changeTypeOfGroup(group) === 'new') return 'Created';
224
+ const non = unionPaths(group, (paths) => paths.filter((p) => !p.startsWith(META_PREFIX)));
225
+ if (non.length > 0) return summarizeNames(non, 'Edited');
226
+ const meta = unionPaths(group, (paths) =>
227
+ paths.filter((p) => p.startsWith(META_PREFIX)).map((p) => p.slice(META_PREFIX.length))
228
+ );
229
+ return summarizeNames(meta, 'Updated');
230
+ };
231
+
232
+ const formatRelative = (iso: string): string => {
233
+ const t = new Date(iso).getTime();
234
+ if (Number.isNaN(t)) return '';
235
+ const now = Date.now();
236
+ const seconds = Math.max(0, Math.floor((now - t) / 1000));
237
+ if (seconds < 45) return 'just now';
238
+ const minutes = Math.floor(seconds / 60);
239
+ if (minutes < 60) return minutes <= 1 ? '1 minute ago' : `${minutes} minutes ago`;
240
+ const d = new Date(t);
241
+ const today = new Date(now);
242
+ const sameDay =
243
+ d.getFullYear() === today.getFullYear() &&
244
+ d.getMonth() === today.getMonth() &&
245
+ d.getDate() === today.getDate();
246
+ if (sameDay) {
247
+ const h = d.getHours();
248
+ if (h < 12) return 'this morning';
249
+ if (h < 17) return 'this afternoon';
250
+ return 'this evening';
251
+ }
252
+ const yesterday = new Date(today);
253
+ yesterday.setDate(yesterday.getDate() - 1);
254
+ const isYesterday =
255
+ d.getFullYear() === yesterday.getFullYear() &&
256
+ d.getMonth() === yesterday.getMonth() &&
257
+ d.getDate() === yesterday.getDate();
258
+ if (isYesterday) return 'yesterday';
259
+ return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
260
+ };
261
+
262
+ /** Submit-disabled gate: nothing to publish when there are no items at all.
263
+ * (Group count is fine here too — no items → no groups.) */
264
+ const total = $derived(items.length);
265
+
266
+ const submit = () => {
267
+ if (publishing || total === 0) return;
268
+ const trimmed = releaseName.trim();
269
+ onConfirm(trimmed === '' ? undefined : trimmed);
270
+ };
271
+
272
+ const badgeVariantOf = (t: ChangeType): BadgeVariant => {
273
+ if (t === 'edited') return 'warn';
274
+ if (t === 'new') return 'success';
275
+ if (t === 'delete' || t === 'gone') return 'destructive';
276
+ if (t === 'redirect') return 'edit';
277
+ return 'edit';
278
+ };
279
+ const badgeLabel = (t: ChangeType): string => (t === 'seo' ? 'SEO' : t);
280
+ </script>
281
+
282
+ <Dialog.Root
283
+ {open}
284
+ onOpenChange={(next) => {
285
+ // Block close while publishing — `Cancel` and overlay click route through here.
286
+ if (!next && publishing) return;
287
+ onOpenChange(next);
288
+ }}
289
+ >
290
+ <Dialog.Content showCloseButton={false} class="vela:max-w-[30rem] vela:p-0">
291
+ <form
292
+ class="vela:flex vela:flex-col vela:gap-0"
293
+ onsubmit={(e) => {
294
+ e.preventDefault();
295
+ submit();
296
+ }}
297
+ >
298
+ <Dialog.Header class="vela:gap-1 vela:px-6 vela:pt-5 vela:pb-4">
299
+ <Dialog.Title>Review &amp; publish</Dialog.Title>
300
+ <Dialog.Description>All changes will go live together.</Dialog.Description>
301
+ </Dialog.Header>
302
+
303
+ <ul
304
+ class="vela:list-none vela:m-0 vela:px-6 vela:pb-4 vela:flex vela:flex-col vela:gap-3 vela:overflow-y-auto vela:max-h-[40vh]"
305
+ >
306
+ {#each groups as group (group.key)}
307
+ {@const t = changeTypeOfGroup(group)}
308
+ {@const showLocaleTags =
309
+ group.locales.length > 1 ||
310
+ (group.locales.length === 1 && group.locales[0] !== defaultLocale)}
311
+ <li class="vela:flex vela:items-start vela:gap-3">
312
+ <span class="vela:flex vela:flex-col vela:min-w-0 vela:flex-1">
313
+ <span class="vela:flex vela:items-center vela:gap-1.5 vela:min-w-0">
314
+ <span class="vela:font-mono vela:text-[14px] vela:text-bar-text vela:truncate">
315
+ {labelFor(group.primary)}
316
+ </span>
317
+ {#if showLocaleTags}
318
+ {#each group.locales as locale (locale)}
319
+ <Badge variant="default" size="sm" class="vela:shrink-0 vela:font-mono">
320
+ {locale}
321
+ </Badge>
322
+ {/each}
323
+ {/if}
324
+ </span>
325
+ <span class="vela:mt-0.5 vela:text-[12px] vela:text-bar-text-secondary vela:truncate">
326
+ {metaTextForGroup(group)} · {formatRelative(group.latestAddedAt)}
327
+ </span>
328
+ </span>
329
+ <Badge variant={badgeVariantOf(t)} class="vela:shrink-0 vela:mt-0.5">
330
+ {badgeLabel(t)}
331
+ </Badge>
332
+ </li>
333
+ {/each}
334
+ </ul>
335
+
336
+ <div
337
+ class="vela:px-6 vela:pt-4 vela:pb-3 vela:flex vela:flex-col vela:gap-1.5
338
+ vela:border-t vela:border-[var(--cms-bar-divider)]"
339
+ >
340
+ <div class="vela:flex vela:items-baseline vela:justify-between">
341
+ <label for="vela-release-name" class="vela:text-[13px] vela:text-bar-text">
342
+ Release name <span class="vela:text-bar-text-tertiary">(optional)</span>
343
+ </label>
344
+ <span class="vela:text-[12px] vela:text-bar-text-tertiary"
345
+ >Helps you find it in History</span
346
+ >
347
+ </div>
348
+ <Input
349
+ id="vela-release-name"
350
+ placeholder="Spring relaunch"
351
+ bind:value={releaseName}
352
+ disabled={publishing}
353
+ class="vela:bg-[var(--cms-bar-bg-hover)]"
354
+ />
355
+ </div>
356
+
357
+ {#if error}
358
+ <p
359
+ role="alert"
360
+ class="vela:mx-6 vela:mb-2 vela:px-3 vela:py-2 vela:rounded-md
361
+ vela:bg-[var(--cms-status-error-bg)] vela:text-[var(--cms-status-error-text)] vela:text-[12px]"
362
+ >
363
+ {error}
364
+ </p>
365
+ {/if}
366
+
367
+ <Dialog.Footer>
368
+ <span class="vela:text-[12px] vela:text-bar-text-secondary">
369
+ Publishing as <span class="vela:font-medium vela:text-bar-text">{initials}</span>
370
+ </span>
371
+ <div class="vela:flex vela:items-center vela:gap-2">
372
+ <Button variant="ghost" onclick={() => onOpenChange(false)} disabled={publishing}>
373
+ Cancel
374
+ </Button>
375
+ <Button type="submit" disabled={publishing || total === 0}>
376
+ {#if publishing}
377
+ Publishing…
378
+ {:else}
379
+ Publish {total}
380
+ {total === 1 ? 'change' : 'changes'}
381
+ {/if}
382
+ </Button>
383
+ </div>
384
+ </Dialog.Footer>
385
+ </form>
386
+ </Dialog.Content>
387
+ </Dialog.Root>
@@ -0,0 +1,16 @@
1
+ import type { ReleaseItem } from '../cms/cms-store.svelte.js';
2
+ type Props = {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ items: ReleaseItem[];
6
+ publishing: boolean;
7
+ error: string | null;
8
+ user: {
9
+ name: string;
10
+ };
11
+ endpoint: string;
12
+ onConfirm: (name: string | undefined) => void;
13
+ };
14
+ declare const PublishDialog: import("svelte").Component<Props, {}, "">;
15
+ type PublishDialog = ReturnType<typeof PublishDialog>;
16
+ export default PublishDialog;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Resolve a SvelteKit route id + params to a concrete URL path.
3
+ *
4
+ * `/(marketing)/rooms/[slug]` + `{ slug: 'a' }` → `/rooms/a`
5
+ * `/(marketing)` + `{}` → `/`
6
+ * `/blog/[...rest]` + `{ rest: 'a/b' }` → `/blog/a/b`
7
+ *
8
+ * Throws if a non-group, non-param segment references a param that's missing
9
+ * from `params`.
10
+ */
11
+ export declare const resolveRouteUrl: (routeId: string, params: Record<string, string>) => string;
12
+ /**
13
+ * Resolve a SvelteKit route id to a route id with params. Removes any group segments.
14
+ *
15
+ * `/(marketing)/rooms/[slug]` → `/rooms/[slug]`
16
+ * `/(marketing)` → `/`
17
+ * `/blog/[...rest]` → `/blog/[...rest]`
18
+ *
19
+ */
20
+ export declare const resolveRouteOnlyParams: (routeId: string) => string;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Resolve a SvelteKit route id + params to a concrete URL path.
3
+ *
4
+ * `/(marketing)/rooms/[slug]` + `{ slug: 'a' }` → `/rooms/a`
5
+ * `/(marketing)` + `{}` → `/`
6
+ * `/blog/[...rest]` + `{ rest: 'a/b' }` → `/blog/a/b`
7
+ *
8
+ * Throws if a non-group, non-param segment references a param that's missing
9
+ * from `params`.
10
+ */
11
+ export const resolveRouteUrl = (routeId, params) => {
12
+ if (routeId === '/' || routeId === '')
13
+ return '/';
14
+ const segments = routeId.split('/').filter(Boolean);
15
+ const out = [];
16
+ for (const seg of segments) {
17
+ if (seg.startsWith('(') && seg.endsWith(')'))
18
+ continue;
19
+ const m = seg.match(/^\[(\.\.\.)?([^/\]]+)\]$/);
20
+ if (m) {
21
+ const name = m[2];
22
+ const value = params[name];
23
+ if (value == null) {
24
+ throw new Error(`resolveRouteUrl: missing param "${name}" for route "${routeId}"`);
25
+ }
26
+ out.push(value);
27
+ continue;
28
+ }
29
+ out.push(seg);
30
+ }
31
+ return '/' + out.join('/');
32
+ };
33
+ /**
34
+ * Resolve a SvelteKit route id to a route id with params. Removes any group segments.
35
+ *
36
+ * `/(marketing)/rooms/[slug]` → `/rooms/[slug]`
37
+ * `/(marketing)` → `/`
38
+ * `/blog/[...rest]` → `/blog/[...rest]`
39
+ *
40
+ */
41
+ export const resolveRouteOnlyParams = (routeId) => {
42
+ const segments = routeId.split('/').filter(Boolean);
43
+ const out = [];
44
+ for (const seg of segments) {
45
+ if (seg.startsWith('(') && seg.endsWith(')'))
46
+ continue;
47
+ out.push(seg);
48
+ }
49
+ return '/' + out.join('/');
50
+ };