@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,639 @@
1
+ <script lang="ts">
2
+ import { goto } from '$app/navigation';
3
+ import { page } from '$app/state';
4
+ import SearchIcon from './icons/search.svelte';
5
+ import { cmsStore } from '../cms/cms-store.svelte.js';
6
+ import type { CmsCreatablePageConfigWithRouteId } from './page-config.js';
7
+ import NewPageDialog from './new-page-dialog.svelte';
8
+ import PanelHeader from './panel-header.svelte';
9
+ import Panel from './panel.svelte';
10
+ import { resolveRouteOnlyParams, resolveRouteUrl } from './resolve-route.js';
11
+ import { Badge } from './ui/badge/index.js';
12
+ import { Button } from './ui/button/index.js';
13
+ import { Input } from './ui/input/index.js';
14
+
15
+ type PageEntry = {
16
+ params: Record<string, string>;
17
+ isDraft: boolean;
18
+ isDeletePending: boolean;
19
+ redirectTo?: string;
20
+ gone?: boolean;
21
+ };
22
+
23
+ type PageRoute = {
24
+ routeId: string;
25
+ ownedParams: string[];
26
+ entries: PageEntry[];
27
+ };
28
+
29
+ type Props = {
30
+ endpoint: string;
31
+ creatablePages: CmsCreatablePageConfigWithRouteId[];
32
+ onClose: () => void;
33
+ onChanged: () => Promise<void> | void;
34
+ onRequestNew: (config: CmsCreatablePageConfigWithRouteId) => void;
35
+ onRequestDuplicate: (
36
+ config: CmsCreatablePageConfigWithRouteId,
37
+ sourceParams: Record<string, string>
38
+ ) => void;
39
+ onRequestDelete: (routeId: string, params: Record<string, string>, isDraft: boolean) => void;
40
+ };
41
+ let {
42
+ endpoint,
43
+ creatablePages,
44
+ onClose,
45
+ onChanged,
46
+ onRequestNew,
47
+ onRequestDuplicate,
48
+ onRequestDelete
49
+ }: Props = $props();
50
+
51
+ let routes = $state<PageRoute[]>([]);
52
+ let loading = $state(true);
53
+ let error = $state<string | null>(null);
54
+ let mutating = $state<string | null>(null);
55
+ let query = $state('');
56
+ let searchEl = $state<HTMLInputElement | null>(null);
57
+
58
+ /** Active editor preview locale: URL `?locale=` overrides server-resolved
59
+ * `cms.locale`. Used to scope the page listing AND the per-row draft flag,
60
+ * so the panel reflects exactly what the editor is previewing. */
61
+ const activeLocale = $derived(page.url.searchParams.get('locale') ?? page.data.cms?.locale ?? '');
62
+ let scrollContainerEl = $state<HTMLElement | null>(null);
63
+ let highlightedIndex = $state(-1);
64
+
65
+ let renameConfig = $state<CmsCreatablePageConfigWithRouteId | null>(null);
66
+ let renameFromParams = $state<Record<string, string> | null>(null);
67
+ let renameRunning = $state(false);
68
+ let renameError = $state<string | null>(null);
69
+
70
+ const creatableByRouteId = $derived(new Map(creatablePages.map((c) => [c.routeId, c] as const)));
71
+
72
+ const rowKey = (routeId: string, params: Record<string, string>): string =>
73
+ `${routeId}?${JSON.stringify(params)}`;
74
+
75
+ const isCurrentPage = (routeId: string, params: Record<string, string>): boolean => {
76
+ const current = page.data.cms?.page;
77
+ if (!current || current.routeId !== routeId) return false;
78
+ const ck = Object.keys(current.params);
79
+ if (ck.length !== Object.keys(params).length) return false;
80
+ for (const k of ck) if (current.params[k] !== params[k]) return false;
81
+ return true;
82
+ };
83
+
84
+ const fetchList = async (forLocale: string): Promise<void> => {
85
+ loading = true;
86
+ try {
87
+ const qs = forLocale ? `?locale=${encodeURIComponent(forLocale)}` : '';
88
+ const res = await fetch(`${endpoint}/pages${qs}`, { credentials: 'include' });
89
+ if (!res.ok) {
90
+ error = 'Could not load pages.';
91
+ return;
92
+ }
93
+ const data = (await res.json()) as { routes: PageRoute[] };
94
+ routes = data.routes;
95
+ error = null;
96
+ } catch {
97
+ error = 'Could not load pages.';
98
+ } finally {
99
+ loading = false;
100
+ }
101
+ };
102
+
103
+ $effect(() => {
104
+ void fetchList(activeLocale);
105
+ });
106
+
107
+ $effect(() => {
108
+ searchEl?.focus();
109
+ });
110
+
111
+ /** Active-locale-scoped draft flag: a page row is "edited" when there's a
112
+ * release item targeting THIS locale on its `(routeId, params)`. Edits in
113
+ * other locales don't mark this row — switching locale rotates the panel. */
114
+ const editedKeys = $derived.by(() => {
115
+ const set = new Set<string>();
116
+ for (const item of cmsStore.openRelease?.items ?? []) {
117
+ if (item.kind === 'layout' || item.kind === 'site') continue;
118
+ if (item.locale !== activeLocale) continue;
119
+ set.add(rowKey(item.routeId, item.params));
120
+ }
121
+ return set;
122
+ });
123
+ const hasDraft = (routeId: string, entry: PageEntry): boolean =>
124
+ entry.isDraft || entry.isDeletePending || editedKeys.has(rowKey(routeId, entry.params));
125
+
126
+ const totalPages = $derived(routes.reduce((n, r) => n + r.entries.length, 0));
127
+ const draftPages = $derived(
128
+ routes.reduce((n, r) => n + r.entries.filter((e) => hasDraft(r.routeId, e)).length, 0)
129
+ );
130
+
131
+ const matchesQuery = (routeId: string, params: Record<string, string>): boolean => {
132
+ const q = query.trim().toLowerCase();
133
+ if (!q) return true;
134
+ const url = resolveRouteUrl(routeId, params).toLowerCase();
135
+ const stripped = resolveRouteOnlyParams(routeId).toLowerCase();
136
+ return url.includes(q) || stripped.includes(q);
137
+ };
138
+
139
+ type StaticRow = { routeId: string; entry: PageEntry; url: string };
140
+ const staticRows = $derived.by<StaticRow[]>(() => {
141
+ const out: StaticRow[] = [];
142
+ for (const r of routes) {
143
+ if (creatableByRouteId.has(r.routeId)) continue;
144
+ for (const e of r.entries) {
145
+ if (!matchesQuery(r.routeId, e.params)) continue;
146
+ out.push({ routeId: r.routeId, entry: e, url: resolveRouteUrl(r.routeId, e.params) });
147
+ }
148
+ }
149
+ return out.sort((a, b) => (a.url < b.url ? -1 : a.url > b.url ? 1 : 0));
150
+ });
151
+
152
+ type TemplateGroup = {
153
+ routeId: string;
154
+ creator: CmsCreatablePageConfigWithRouteId;
155
+ entries: Array<{ entry: PageEntry; url: string }>;
156
+ };
157
+ const templateGroups = $derived.by<TemplateGroup[]>(() => {
158
+ const isFiltering = query.trim() !== '';
159
+ const out: TemplateGroup[] = [];
160
+ for (const r of routes) {
161
+ const creator = creatableByRouteId.get(r.routeId);
162
+ if (!creator) continue;
163
+ const entries = r.entries
164
+ .filter((e) => matchesQuery(r.routeId, e.params))
165
+ .map((entry) => ({ entry, url: resolveRouteUrl(r.routeId, entry.params) }));
166
+ // While filtering, hide template cards whose entries all got filtered
167
+ // out — keeps the search results focused. With no filter, empty cards
168
+ // stay so the user can still hit "+ New".
169
+ if (isFiltering && entries.length === 0) continue;
170
+ out.push({ routeId: r.routeId, creator, entries });
171
+ }
172
+ return out;
173
+ });
174
+
175
+ type FlatRow = { routeId: string; entry: PageEntry; key: string };
176
+ const flatRows = $derived.by<FlatRow[]>(() => {
177
+ const out: FlatRow[] = [];
178
+ for (const r of staticRows) {
179
+ out.push({ routeId: r.routeId, entry: r.entry, key: rowKey(r.routeId, r.entry.params) });
180
+ }
181
+ for (const g of templateGroups) {
182
+ for (const e of g.entries) {
183
+ out.push({
184
+ routeId: g.routeId,
185
+ entry: e.entry,
186
+ key: rowKey(g.routeId, e.entry.params)
187
+ });
188
+ }
189
+ }
190
+ return out;
191
+ });
192
+
193
+ const highlightedKey = $derived(
194
+ highlightedIndex >= 0 && highlightedIndex < flatRows.length
195
+ ? flatRows[highlightedIndex].key
196
+ : null
197
+ );
198
+
199
+ // Reset highlight when the filter changes — indices are no longer meaningful.
200
+ $effect(() => {
201
+ query;
202
+ highlightedIndex = -1;
203
+ });
204
+
205
+ $effect(() => {
206
+ if (highlightedIndex >= flatRows.length) highlightedIndex = flatRows.length - 1;
207
+ });
208
+
209
+ $effect(() => {
210
+ if (highlightedKey === null || !scrollContainerEl) return;
211
+ const el = scrollContainerEl.querySelector(
212
+ `[data-row-key="${CSS.escape(highlightedKey)}"]`
213
+ ) as HTMLElement | null;
214
+ el?.scrollIntoView({ block: 'nearest' });
215
+ });
216
+
217
+ const navigateTo = async (routeId: string, params: Record<string, string>) => {
218
+ const url = new URL(resolveRouteUrl(routeId, params), page.url.origin);
219
+ const key = cmsStore.openRelease?.preview_key;
220
+ if (key) url.searchParams.set('preview', key);
221
+ // onClose();
222
+ await goto(url, { keepFocus: true, noScroll: true });
223
+ };
224
+
225
+ const onView = async (routeId: string, params: Record<string, string>) => {
226
+ await navigateTo(routeId, params);
227
+ };
228
+
229
+ const onEdit = async (routeId: string, params: Record<string, string>) => {
230
+ await navigateTo(routeId, params);
231
+ cmsStore.isEditing = true;
232
+ };
233
+
234
+ const onDiscard = async (routeId: string, params: Record<string, string>) => {
235
+ const url = resolveRouteUrl(routeId, params);
236
+ if (!confirm(`Discard pending edits on ${url}?`)) return;
237
+ const key = rowKey(routeId, params);
238
+ mutating = key;
239
+ try {
240
+ const res = await fetch(`${endpoint}/release/items`, {
241
+ method: 'DELETE',
242
+ credentials: 'include',
243
+ headers: { 'content-type': 'application/json' },
244
+ body: JSON.stringify({
245
+ kind: 'page',
246
+ routeId,
247
+ locale: page.url.searchParams.get('locale') ?? page.data.cms?.locale ?? '',
248
+ params
249
+ })
250
+ });
251
+ if (!res.ok) {
252
+ error = 'Could not discard.';
253
+ return;
254
+ }
255
+ await cmsStore.fetchOpenRelease(endpoint);
256
+ await fetchList(activeLocale);
257
+ await onChanged();
258
+ } finally {
259
+ mutating = null;
260
+ }
261
+ };
262
+
263
+ const setHighlightByKey = (k: string) => {
264
+ const i = flatRows.findIndex((r) => r.key === k);
265
+ if (i >= 0) highlightedIndex = i;
266
+ };
267
+
268
+ const onSearchKeydown = (e: KeyboardEvent) => {
269
+ if (e.key === 'ArrowDown') {
270
+ if (flatRows.length === 0) return;
271
+ e.preventDefault();
272
+ highlightedIndex =
273
+ highlightedIndex < 0 ? 0 : Math.min(highlightedIndex + 1, flatRows.length - 1);
274
+ } else if (e.key === 'ArrowUp') {
275
+ if (highlightedIndex < 0) return;
276
+ e.preventDefault();
277
+ highlightedIndex = highlightedIndex === 0 ? -1 : highlightedIndex - 1;
278
+ } else if (e.key === 'Enter') {
279
+ if (highlightedIndex < 0 || highlightedIndex >= flatRows.length) return;
280
+ e.preventDefault();
281
+ const r = flatRows[highlightedIndex];
282
+ void onView(r.routeId, r.entry.params);
283
+ }
284
+ };
285
+
286
+ const openRenameDialog = (
287
+ config: CmsCreatablePageConfigWithRouteId,
288
+ fromParams: Record<string, string>
289
+ ) => {
290
+ renameConfig = config;
291
+ renameFromParams = fromParams;
292
+ renameError = null;
293
+ };
294
+
295
+ const closeRenameDialog = () => {
296
+ if (renameRunning) return;
297
+ renameConfig = null;
298
+ renameFromParams = null;
299
+ renameError = null;
300
+ };
301
+
302
+ const onRenameSubmit = async (rawValues: Record<string, string>) => {
303
+ const config = renameConfig;
304
+ const fromParams = renameFromParams;
305
+ if (!config || !fromParams) return;
306
+ renameRunning = true;
307
+ renameError = null;
308
+ try {
309
+ let toParams: Record<string, string>;
310
+ try {
311
+ toParams = config.transform(rawValues).params;
312
+ } catch {
313
+ renameError = 'Could not derive params from input.';
314
+ return;
315
+ }
316
+ const samePage = Object.keys(toParams).every((k) => toParams[k] === fromParams[k]);
317
+ if (samePage) {
318
+ renameError = 'New slug matches the existing one.';
319
+ return;
320
+ }
321
+ // Active editor locale (URL `?locale=` overrides the server-resolved
322
+ // locale) so renames within a non-default-locale preview target the
323
+ // right bucket.
324
+ const locale = page.url.searchParams.get('locale') ?? page.data.cms?.locale ?? '';
325
+ let toUrl: string;
326
+ try {
327
+ toUrl = resolveRouteUrl(config.routeId, toParams);
328
+ } catch {
329
+ renameError = 'Could not derive a target URL.';
330
+ return;
331
+ }
332
+ const onCurrent = isCurrentPage(config.routeId, fromParams);
333
+ const result = await cmsStore.renameSlug(endpoint, {
334
+ routeId: config.routeId,
335
+ fromParams,
336
+ toParams,
337
+ locale,
338
+ toUrl
339
+ });
340
+ if (!result.ok) {
341
+ renameError = 'Could not rename page.';
342
+ return;
343
+ }
344
+ renameConfig = null;
345
+ renameFromParams = null;
346
+ await fetchList(activeLocale);
347
+ if (!onCurrent) await onChanged();
348
+ } finally {
349
+ renameRunning = false;
350
+ }
351
+ };
352
+
353
+ const onUndoDelete = async (routeId: string, params: Record<string, string>) => {
354
+ const key = rowKey(routeId, params);
355
+ const onCurrent = isCurrentPage(routeId, params);
356
+ mutating = key;
357
+ try {
358
+ const res = await fetch(`${endpoint}/release/items`, {
359
+ method: 'DELETE',
360
+ credentials: 'include',
361
+ headers: { 'content-type': 'application/json' },
362
+ body: JSON.stringify({
363
+ kind: 'page-delete',
364
+ routeId,
365
+ locale: page.url.searchParams.get('locale') ?? page.data.cms?.locale ?? '',
366
+ params
367
+ })
368
+ });
369
+ if (!res.ok) {
370
+ error = 'Could not undo delete.';
371
+ return;
372
+ }
373
+ await cmsStore.fetchOpenRelease(endpoint);
374
+ await fetchList(activeLocale);
375
+ if (!onCurrent) await onChanged();
376
+ } finally {
377
+ mutating = null;
378
+ }
379
+ };
380
+ </script>
381
+
382
+ <Panel ariaLabel="All pages" {onClose}>
383
+ <PanelHeader title="All pages" {onClose} class="vela:pb-2">
384
+ {#snippet subtitle()}
385
+ <span class="vela:text-[12px] vela:text-bar-text-secondary vela:truncate">
386
+ {totalPages}
387
+ {totalPages === 1 ? 'page' : 'pages'}{draftPages > 0 ? ` · ${draftPages} with draft` : ''}
388
+ </span>
389
+ {/snippet}
390
+ </PanelHeader>
391
+
392
+ <div class="vela:px-4 vela:pb-3">
393
+ <div class="vela:relative">
394
+ <SearchIcon
395
+ class="vela:absolute vela:left-2.5 vela:top-1/2 vela:-translate-y-1/2 vela:size-4 vela:text-bar-text-tertiary vela:pointer-events-none"
396
+ />
397
+ <Input
398
+ bind:ref={searchEl}
399
+ bind:value={query}
400
+ onkeydown={onSearchKeydown}
401
+ placeholder="Filter pages…"
402
+ aria-label="Filter pages"
403
+ class="vela:pl-8 vela:pr-9"
404
+ />
405
+ <kbd
406
+ class="vela:absolute vela:right-2 vela:top-1/2 vela:-translate-y-1/2
407
+ vela:inline-flex vela:items-center vela:justify-center vela:min-w-5 vela:h-5 vela:px-1
408
+ vela:rounded vela:border vela:border-[var(--cms-bar-divider)]
409
+ vela:text-[11px] vela:font-mono vela:text-bar-text-tertiary"
410
+ >
411
+ /
412
+ </kbd>
413
+ </div>
414
+ </div>
415
+
416
+ <div
417
+ bind:this={scrollContainerEl}
418
+ class="vela:overflow-y-auto vela:px-4 vela:pb-3 vela:flex vela:flex-col vela:gap-3"
419
+ >
420
+ {#if loading && routes.length === 0}
421
+ <p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">Loading…</p>
422
+ {:else if error}
423
+ <p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">{error}</p>
424
+ {:else if routes.length === 0}
425
+ <p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">No CMS pages.</p>
426
+ {:else}
427
+ {#if staticRows.length > 0}
428
+ <ul class="vela:list-none vela:pl-0 vela:m-0 vela:flex vela:flex-col">
429
+ {#each staticRows as { routeId, entry, url } (rowKey(routeId, entry.params))}
430
+ {@const k = rowKey(routeId, entry.params)}
431
+ <li
432
+ data-row-key={k}
433
+ onmouseenter={() => setHighlightByKey(k)}
434
+ class="vela:flex vela:items-center vela:gap-2 vela:min-h-9 vela:px-1.5 vela:py-1.5 vela:rounded-md {highlightedKey ===
435
+ k
436
+ ? 'vela:bg-[var(--cms-bar-bg-hover)]'
437
+ : ''}"
438
+ >
439
+ <span class="vela:flex vela:items-center vela:justify-center vela:w-3 vela:h-3">
440
+ {#if hasDraft(routeId, entry)}
441
+ <span
442
+ class="vela:w-1.5 vela:h-1.5 vela:rounded-full vela:bg-[var(--cms-status-warn-dot)]"
443
+ ></span>
444
+ {/if}
445
+ </span>
446
+ <span
447
+ class="vela:font-mono vela:text-[12px] vela:text-bar-text vela:truncate vela:flex-1"
448
+ >
449
+ {url}
450
+ </span>
451
+ {#if entry.isDeletePending}
452
+ <Badge variant="warn" size="sm">
453
+ {entry.redirectTo
454
+ ? 'redirect pending'
455
+ : entry.gone
456
+ ? 'gone pending'
457
+ : 'delete pending'}
458
+ </Badge>
459
+ {#if highlightedKey === k}
460
+ <Button
461
+ variant="outline"
462
+ size="xs"
463
+ disabled={mutating === k}
464
+ onclick={() => onUndoDelete(routeId, entry.params)}
465
+ >
466
+ {mutating === k ? '…' : 'Undo'}
467
+ </Button>
468
+ {/if}
469
+ {:else if highlightedKey === k}
470
+ {#if hasDraft(routeId, entry)}
471
+ <Button
472
+ variant="outline"
473
+ size="xs"
474
+ disabled={mutating === k}
475
+ onclick={() => onDiscard(routeId, entry.params)}
476
+ >
477
+ {mutating === k ? '…' : 'Discard'}
478
+ </Button>
479
+ {/if}
480
+ <Button variant="outline" size="xs" onclick={() => onView(routeId, entry.params)}>
481
+ View
482
+ </Button>
483
+ <Button variant="outline" size="xs" onclick={() => onEdit(routeId, entry.params)}>
484
+ Edit
485
+ </Button>
486
+ {/if}
487
+ </li>
488
+ {/each}
489
+ </ul>
490
+ {/if}
491
+
492
+ {#each templateGroups as group (group.routeId)}
493
+ <section
494
+ class="vela:rounded-lg vela:bg-[var(--cms-template-bg)] vela:border vela:border-[var(--cms-bar-divider)] vela:overflow-hidden"
495
+ >
496
+ <div
497
+ class="vela:flex vela:items-center vela:justify-between vela:gap-2 vela:px-3 vela:py-2"
498
+ >
499
+ <div class="vela:flex vela:items-baseline vela:gap-2 vela:min-w-0">
500
+ <span class="vela:text-[11px] vela:text-bar-text-tertiary">Template</span>
501
+ <span
502
+ class="vela:font-mono vela:text-[12px] vela:px-1.5 vela:py-0.5 vela:rounded
503
+ vela:bg-[var(--cms-template-accent-bg)] vela:text-[var(--cms-template-accent-text)] vela:truncate"
504
+ >
505
+ {resolveRouteOnlyParams(group.routeId)}
506
+ </span>
507
+ </div>
508
+ <Button
509
+ variant="outline"
510
+ size="pill"
511
+ class="vela:shrink-0"
512
+ onclick={() => onRequestNew(group.creator)}
513
+ >
514
+ + New {group.creator.type}
515
+ </Button>
516
+ </div>
517
+ {#if group.entries.length > 0}
518
+ <ul
519
+ class="vela:list-none vela:pl-0 vela:m-0 vela:flex vela:flex-col vela:px-1.5 vela:pb-1.5"
520
+ >
521
+ {#each group.entries as { entry, url } (rowKey(group.routeId, entry.params))}
522
+ {@const k = rowKey(group.routeId, entry.params)}
523
+ <li
524
+ data-row-key={k}
525
+ onmouseenter={() => setHighlightByKey(k)}
526
+ class="vela:flex vela:items-center vela:gap-2 vela:min-h-9 vela:px-1.5 vela:py-1.5 vela:rounded-md {highlightedKey ===
527
+ k
528
+ ? 'vela:bg-[var(--cms-bar-bg-hover)]'
529
+ : ''}"
530
+ >
531
+ <span class="vela:flex vela:items-center vela:justify-center vela:w-3 vela:h-3">
532
+ {#if hasDraft(group.routeId, entry)}
533
+ <span
534
+ class="vela:w-1.5 vela:h-1.5 vela:rounded-full vela:bg-[var(--cms-status-warn-dot)]"
535
+ ></span>
536
+ {/if}
537
+ </span>
538
+ <span
539
+ class="vela:font-mono vela:text-[12px] vela:text-bar-text vela:truncate vela:flex-1"
540
+ >
541
+ {url}
542
+ </span>
543
+ {#if entry.isDeletePending}
544
+ <Badge variant="warn" size="sm">
545
+ {entry.redirectTo
546
+ ? 'redirect pending'
547
+ : entry.gone
548
+ ? 'gone pending'
549
+ : 'delete pending'}
550
+ </Badge>
551
+ {#if highlightedKey === k}
552
+ <Button
553
+ variant="outline"
554
+ size="xs"
555
+ disabled={mutating === k}
556
+ onclick={() => onUndoDelete(group.routeId, entry.params)}
557
+ >
558
+ {mutating === k ? '…' : 'Undo'}
559
+ </Button>
560
+ {/if}
561
+ {:else if highlightedKey === k}
562
+ {#if hasDraft(group.routeId, entry)}
563
+ <Button
564
+ variant="outline"
565
+ size="xs"
566
+ disabled={mutating === k}
567
+ onclick={() => onDiscard(group.routeId, entry.params)}
568
+ >
569
+ {mutating === k ? '…' : 'Discard'}
570
+ </Button>
571
+ {/if}
572
+ <Button
573
+ variant="outline"
574
+ size="xs"
575
+ onclick={() => onView(group.routeId, entry.params)}
576
+ >
577
+ View
578
+ </Button>
579
+ <Button
580
+ variant="outline"
581
+ size="xs"
582
+ onclick={() => onEdit(group.routeId, entry.params)}
583
+ >
584
+ Edit
585
+ </Button>
586
+ <Button
587
+ variant="outline"
588
+ size="xs"
589
+ onclick={() => onRequestDuplicate(group.creator, entry.params)}
590
+ >
591
+ Duplicate
592
+ </Button>
593
+ {#if !entry.isDraft && !entry.isDeletePending}
594
+ <Button
595
+ variant="outline"
596
+ size="xs"
597
+ onclick={() => openRenameDialog(group.creator, entry.params)}
598
+ >
599
+ Rename
600
+ </Button>
601
+ {/if}
602
+ <Button
603
+ variant="outline-destructive"
604
+ size="xs"
605
+ disabled={mutating === k}
606
+ onclick={() => onRequestDelete(group.routeId, entry.params, entry.isDraft)}
607
+ >
608
+ {mutating === k ? '…' : 'Delete'}
609
+ </Button>
610
+ {/if}
611
+ </li>
612
+ {/each}
613
+ </ul>
614
+ {/if}
615
+ </section>
616
+ {/each}
617
+
618
+ {#if query.trim() && staticRows.length === 0 && templateGroups.length === 0}
619
+ <p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2 vela:px-1.5">
620
+ No pages match "{query}".
621
+ </p>
622
+ {/if}
623
+ {/if}
624
+ </div>
625
+ </Panel>
626
+
627
+ {#if renameConfig}
628
+ <NewPageDialog
629
+ open={true}
630
+ onOpenChange={(next) => {
631
+ if (!next) closeRenameDialog();
632
+ }}
633
+ config={renameConfig}
634
+ creating={renameRunning}
635
+ error={renameError}
636
+ onCreate={onRenameSubmit}
637
+ mode="rename"
638
+ />
639
+ {/if}
@@ -0,0 +1,13 @@
1
+ import type { CmsCreatablePageConfigWithRouteId } from './page-config.js';
2
+ type Props = {
3
+ endpoint: string;
4
+ creatablePages: CmsCreatablePageConfigWithRouteId[];
5
+ onClose: () => void;
6
+ onChanged: () => Promise<void> | void;
7
+ onRequestNew: (config: CmsCreatablePageConfigWithRouteId) => void;
8
+ onRequestDuplicate: (config: CmsCreatablePageConfigWithRouteId, sourceParams: Record<string, string>) => void;
9
+ onRequestDelete: (routeId: string, params: Record<string, string>, isDraft: boolean) => void;
10
+ };
11
+ declare const PagesPanel: import("svelte").Component<Props, {}, "">;
12
+ type PagesPanel = ReturnType<typeof PagesPanel>;
13
+ export default PagesPanel;
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { cn } from './utils.js';
4
+
5
+ type Props = {
6
+ class?: string;
7
+ children: Snippet;
8
+ };
9
+ let { class: className, children }: Props = $props();
10
+ </script>
11
+
12
+ <div
13
+ class={cn(
14
+ 'vela:flex vela:items-center vela:justify-between vela:px-4 vela:py-2.5',
15
+ 'vela:border-t vela:border-[var(--cms-bar-divider)]',
16
+ 'vela:text-[12px] vela:text-bar-text-tertiary',
17
+ className
18
+ )}
19
+ >
20
+ {@render children()}
21
+ </div>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Props = {
3
+ class?: string;
4
+ children: Snippet;
5
+ };
6
+ declare const PanelFooter: import("svelte").Component<Props, {}, "">;
7
+ type PanelFooter = ReturnType<typeof PanelFooter>;
8
+ export default PanelFooter;