@elytracms/studio 0.0.1

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 (558) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/convex/assets.ts +107 -0
  4. package/convex/auth.config.ts +15 -0
  5. package/convex/auth.ts +50 -0
  6. package/convex/cliTokens.ts +63 -0
  7. package/convex/cms.ts +174 -0
  8. package/convex/content.ts +316 -0
  9. package/convex/delivery.ts +266 -0
  10. package/convex/functions.ts +35 -0
  11. package/convex/graphs.ts +51 -0
  12. package/convex/guard.ts +67 -0
  13. package/convex/http.ts +30 -0
  14. package/convex/members.ts +83 -0
  15. package/convex/publishing.ts +102 -0
  16. package/convex/references.ts +168 -0
  17. package/convex/schema.ts +173 -0
  18. package/convex/sync.ts +322 -0
  19. package/convex/tsconfig.json +12 -0
  20. package/convex/users.ts +23 -0
  21. package/convex/webhooks.ts +85 -0
  22. package/dist/components/assets/asset-library.d.ts +14 -0
  23. package/dist/components/assets/asset-library.js +191 -0
  24. package/dist/components/assets/asset-library.js.map +1 -0
  25. package/dist/components/assets/asset-metadata.d.ts +34 -0
  26. package/dist/components/assets/asset-metadata.js +40 -0
  27. package/dist/components/assets/asset-metadata.js.map +1 -0
  28. package/dist/components/assets/asset-search.d.ts +7 -0
  29. package/dist/components/assets/asset-search.js +12 -0
  30. package/dist/components/assets/asset-search.js.map +1 -0
  31. package/dist/components/assets/asset-selection.d.ts +17 -0
  32. package/dist/components/assets/asset-selection.js +33 -0
  33. package/dist/components/assets/asset-selection.js.map +1 -0
  34. package/dist/components/assets/assets-store.d.ts +51 -0
  35. package/dist/components/assets/assets-store.js +153 -0
  36. package/dist/components/assets/assets-store.js.map +1 -0
  37. package/dist/components/auth-context.d.ts +38 -0
  38. package/dist/components/auth-context.js +88 -0
  39. package/dist/components/auth-context.js.map +1 -0
  40. package/dist/components/backend-gate.d.ts +19 -0
  41. package/dist/components/backend-gate.js +63 -0
  42. package/dist/components/backend-gate.js.map +1 -0
  43. package/dist/components/breadcrumb-context.d.ts +39 -0
  44. package/dist/components/breadcrumb-context.js +38 -0
  45. package/dist/components/breadcrumb-context.js.map +1 -0
  46. package/dist/components/builder/blocks-model.d.ts +80 -0
  47. package/dist/components/builder/blocks-model.js +181 -0
  48. package/dist/components/builder/blocks-model.js.map +1 -0
  49. package/dist/components/builder/blocks-panel.d.ts +44 -0
  50. package/dist/components/builder/blocks-panel.js +147 -0
  51. package/dist/components/builder/blocks-panel.js.map +1 -0
  52. package/dist/components/builder/builder-store.d.ts +69 -0
  53. package/dist/components/builder/builder-store.js +294 -0
  54. package/dist/components/builder/builder-store.js.map +1 -0
  55. package/dist/components/builder/canvas-stylesheet.d.ts +4 -0
  56. package/dist/components/builder/canvas-stylesheet.js +24 -0
  57. package/dist/components/builder/canvas-stylesheet.js.map +1 -0
  58. package/dist/components/builder/canvas.d.ts +8 -0
  59. package/dist/components/builder/canvas.js +723 -0
  60. package/dist/components/builder/canvas.js.map +1 -0
  61. package/dist/components/builder/clipboard-actions.d.ts +93 -0
  62. package/dist/components/builder/clipboard-actions.js +246 -0
  63. package/dist/components/builder/clipboard-actions.js.map +1 -0
  64. package/dist/components/builder/composition-field-editor.d.ts +11 -0
  65. package/dist/components/builder/composition-field-editor.js +150 -0
  66. package/dist/components/builder/composition-field-editor.js.map +1 -0
  67. package/dist/components/builder/composition-scope.d.ts +16 -0
  68. package/dist/components/builder/composition-scope.js +7 -0
  69. package/dist/components/builder/composition-scope.js.map +1 -0
  70. package/dist/components/builder/drag-session.d.ts +41 -0
  71. package/dist/components/builder/drag-session.js +51 -0
  72. package/dist/components/builder/drag-session.js.map +1 -0
  73. package/dist/components/builder/fixture-thumbnail.d.ts +18 -0
  74. package/dist/components/builder/fixture-thumbnail.js +97 -0
  75. package/dist/components/builder/fixture-thumbnail.js.map +1 -0
  76. package/dist/components/builder/inline-edit.d.ts +142 -0
  77. package/dist/components/builder/inline-edit.js +136 -0
  78. package/dist/components/builder/inline-edit.js.map +1 -0
  79. package/dist/components/builder/insert-context.d.ts +14 -0
  80. package/dist/components/builder/insert-context.js +65 -0
  81. package/dist/components/builder/insert-context.js.map +1 -0
  82. package/dist/components/builder/insert-menu.d.ts +9 -0
  83. package/dist/components/builder/insert-menu.js +9 -0
  84. package/dist/components/builder/insert-menu.js.map +1 -0
  85. package/dist/components/builder/layout-inspector.d.ts +14 -0
  86. package/dist/components/builder/layout-inspector.js +84 -0
  87. package/dist/components/builder/layout-inspector.js.map +1 -0
  88. package/dist/components/builder/node-factory.d.ts +17 -0
  89. package/dist/components/builder/node-factory.js +90 -0
  90. package/dist/components/builder/node-factory.js.map +1 -0
  91. package/dist/components/builder/page-tree.d.ts +3 -0
  92. package/dist/components/builder/page-tree.js +207 -0
  93. package/dist/components/builder/page-tree.js.map +1 -0
  94. package/dist/components/builder/property-inspector.d.ts +1 -0
  95. package/dist/components/builder/property-inspector.js +233 -0
  96. package/dist/components/builder/property-inspector.js.map +1 -0
  97. package/dist/components/builder/rich-text-toolbar.d.ts +4 -0
  98. package/dist/components/builder/rich-text-toolbar.js +104 -0
  99. package/dist/components/builder/rich-text-toolbar.js.map +1 -0
  100. package/dist/components/builder/spacing-handles.d.ts +22 -0
  101. package/dist/components/builder/spacing-handles.js +213 -0
  102. package/dist/components/builder/spacing-handles.js.map +1 -0
  103. package/dist/components/cms/asset-picker.d.ts +12 -0
  104. package/dist/components/cms/asset-picker.js +60 -0
  105. package/dist/components/cms/asset-picker.js.map +1 -0
  106. package/dist/components/cms/bulk-actions.d.ts +60 -0
  107. package/dist/components/cms/bulk-actions.js +95 -0
  108. package/dist/components/cms/bulk-actions.js.map +1 -0
  109. package/dist/components/cms/bulk-bar.d.ts +23 -0
  110. package/dist/components/cms/bulk-bar.js +26 -0
  111. package/dist/components/cms/bulk-bar.js.map +1 -0
  112. package/dist/components/cms/cell-edit.d.ts +91 -0
  113. package/dist/components/cms/cell-edit.js +144 -0
  114. package/dist/components/cms/cell-edit.js.map +1 -0
  115. package/dist/components/cms/cell.d.ts +29 -0
  116. package/dist/components/cms/cell.js +127 -0
  117. package/dist/components/cms/cell.js.map +1 -0
  118. package/dist/components/cms/cms-index.d.ts +8 -0
  119. package/dist/components/cms/cms-index.js +23 -0
  120. package/dist/components/cms/cms-index.js.map +1 -0
  121. package/dist/components/cms/cms-store.d.ts +188 -0
  122. package/dist/components/cms/cms-store.js +702 -0
  123. package/dist/components/cms/cms-store.js.map +1 -0
  124. package/dist/components/cms/collection-table.d.ts +6 -0
  125. package/dist/components/cms/collection-table.js +250 -0
  126. package/dist/components/cms/collection-table.js.map +1 -0
  127. package/dist/components/cms/collections-sidebar.d.ts +9 -0
  128. package/dist/components/cms/collections-sidebar.js +25 -0
  129. package/dist/components/cms/collections-sidebar.js.map +1 -0
  130. package/dist/components/cms/detail-editor.d.ts +7 -0
  131. package/dist/components/cms/detail-editor.js +386 -0
  132. package/dist/components/cms/detail-editor.js.map +1 -0
  133. package/dist/components/cms/doc-state.d.ts +13 -0
  134. package/dist/components/cms/doc-state.js +18 -0
  135. package/dist/components/cms/doc-state.js.map +1 -0
  136. package/dist/components/cms/document-editor-context.d.ts +48 -0
  137. package/dist/components/cms/document-editor-context.js +23 -0
  138. package/dist/components/cms/document-editor-context.js.map +1 -0
  139. package/dist/components/cms/editable-cell.d.ts +22 -0
  140. package/dist/components/cms/editable-cell.js +176 -0
  141. package/dist/components/cms/editable-cell.js.map +1 -0
  142. package/dist/components/cms/field-control.d.ts +8 -0
  143. package/dist/components/cms/field-control.js +149 -0
  144. package/dist/components/cms/field-control.js.map +1 -0
  145. package/dist/components/cms/filter-builder.d.ts +12 -0
  146. package/dist/components/cms/filter-builder.js +84 -0
  147. package/dist/components/cms/filter-builder.js.map +1 -0
  148. package/dist/components/cms/import-export.d.ts +6 -0
  149. package/dist/components/cms/import-export.js +33 -0
  150. package/dist/components/cms/import-export.js.map +1 -0
  151. package/dist/components/cms/new-page-dialog.d.ts +22 -0
  152. package/dist/components/cms/new-page-dialog.js +42 -0
  153. package/dist/components/cms/new-page-dialog.js.map +1 -0
  154. package/dist/components/cms/reference-confirm.d.ts +25 -0
  155. package/dist/components/cms/reference-confirm.js +124 -0
  156. package/dist/components/cms/reference-confirm.js.map +1 -0
  157. package/dist/components/cms/relation-picker.d.ts +16 -0
  158. package/dist/components/cms/relation-picker.js +47 -0
  159. package/dist/components/cms/relation-picker.js.map +1 -0
  160. package/dist/components/cms/use-cell-edit.d.ts +33 -0
  161. package/dist/components/cms/use-cell-edit.js +125 -0
  162. package/dist/components/cms/use-cell-edit.js.map +1 -0
  163. package/dist/components/cms/versions-model.d.ts +15 -0
  164. package/dist/components/cms/versions-model.js +23 -0
  165. package/dist/components/cms/versions-model.js.map +1 -0
  166. package/dist/components/cms/versions-pane.d.ts +14 -0
  167. package/dist/components/cms/versions-pane.js +86 -0
  168. package/dist/components/cms/versions-pane.js.map +1 -0
  169. package/dist/components/cms/view-bar.d.ts +11 -0
  170. package/dist/components/cms/view-bar.js +80 -0
  171. package/dist/components/cms/view-bar.js.map +1 -0
  172. package/dist/components/collab/collab-context.d.ts +34 -0
  173. package/dist/components/collab/collab-context.js +52 -0
  174. package/dist/components/collab/collab-context.js.map +1 -0
  175. package/dist/components/collab/collab-seed.d.ts +27 -0
  176. package/dist/components/collab/collab-seed.js +42 -0
  177. package/dist/components/collab/collab-seed.js.map +1 -0
  178. package/dist/components/components/component-detail.d.ts +9 -0
  179. package/dist/components/components/component-detail.js +30 -0
  180. package/dist/components/components/component-detail.js.map +1 -0
  181. package/dist/components/components/component-status.d.ts +10 -0
  182. package/dist/components/components/component-status.js +30 -0
  183. package/dist/components/components/component-status.js.map +1 -0
  184. package/dist/components/components/components-index.d.ts +8 -0
  185. package/dist/components/components/components-index.js +42 -0
  186. package/dist/components/components/components-index.js.map +1 -0
  187. package/dist/components/components/field-inspector.d.ts +9 -0
  188. package/dist/components/components/field-inspector.js +38 -0
  189. package/dist/components/components/field-inspector.js.map +1 -0
  190. package/dist/components/components/fixture-runner.d.ts +10 -0
  191. package/dist/components/components/fixture-runner.js +24 -0
  192. package/dist/components/components/fixture-runner.js.map +1 -0
  193. package/dist/components/components/registry-browser.d.ts +4 -0
  194. package/dist/components/components/registry-browser.js +64 -0
  195. package/dist/components/components/registry-browser.js.map +1 -0
  196. package/dist/components/current-user-menu.d.ts +13 -0
  197. package/dist/components/current-user-menu.js +31 -0
  198. package/dist/components/current-user-menu.js.map +1 -0
  199. package/dist/components/dev-login-badge.d.ts +9 -0
  200. package/dist/components/dev-login-badge.js +18 -0
  201. package/dist/components/dev-login-badge.js.map +1 -0
  202. package/dist/components/extensions/extensions-view.d.ts +7 -0
  203. package/dist/components/extensions/extensions-view.js +126 -0
  204. package/dist/components/extensions/extensions-view.js.map +1 -0
  205. package/dist/components/guards.d.ts +27 -0
  206. package/dist/components/guards.js +46 -0
  207. package/dist/components/guards.js.map +1 -0
  208. package/dist/components/inspector/inspector-sidebar.d.ts +26 -0
  209. package/dist/components/inspector/inspector-sidebar.js +17 -0
  210. package/dist/components/inspector/inspector-sidebar.js.map +1 -0
  211. package/dist/components/operation-error.d.ts +17 -0
  212. package/dist/components/operation-error.js +54 -0
  213. package/dist/components/operation-error.js.map +1 -0
  214. package/dist/components/playground-badge.d.ts +10 -0
  215. package/dist/components/playground-badge.js +19 -0
  216. package/dist/components/playground-badge.js.map +1 -0
  217. package/dist/components/project-list.d.ts +15 -0
  218. package/dist/components/project-list.js +52 -0
  219. package/dist/components/project-list.js.map +1 -0
  220. package/dist/components/project-session.d.ts +46 -0
  221. package/dist/components/project-session.js +107 -0
  222. package/dist/components/project-session.js.map +1 -0
  223. package/dist/components/project-switcher.d.ts +11 -0
  224. package/dist/components/project-switcher.js +44 -0
  225. package/dist/components/project-switcher.js.map +1 -0
  226. package/dist/components/references/builder-deep-link.d.ts +12 -0
  227. package/dist/components/references/builder-deep-link.js +53 -0
  228. package/dist/components/references/builder-deep-link.js.map +1 -0
  229. package/dist/components/references/references-panel.d.ts +17 -0
  230. package/dist/components/references/references-panel.js +66 -0
  231. package/dist/components/references/references-panel.js.map +1 -0
  232. package/dist/components/routes/redirect-chain.d.ts +9 -0
  233. package/dist/components/routes/redirect-chain.js +16 -0
  234. package/dist/components/routes/redirect-chain.js.map +1 -0
  235. package/dist/components/routes/redirect-manager.d.ts +13 -0
  236. package/dist/components/routes/redirect-manager.js +24 -0
  237. package/dist/components/routes/redirect-manager.js.map +1 -0
  238. package/dist/components/routes/route-list.d.ts +35 -0
  239. package/dist/components/routes/route-list.js +69 -0
  240. package/dist/components/routes/route-list.js.map +1 -0
  241. package/dist/components/routes/routes-shell.d.ts +14 -0
  242. package/dist/components/routes/routes-shell.js +68 -0
  243. package/dist/components/routes/routes-shell.js.map +1 -0
  244. package/dist/components/section-nav.d.ts +17 -0
  245. package/dist/components/section-nav.js +33 -0
  246. package/dist/components/section-nav.js.map +1 -0
  247. package/dist/components/section-state.d.ts +24 -0
  248. package/dist/components/section-state.js +78 -0
  249. package/dist/components/section-state.js.map +1 -0
  250. package/dist/components/section-surface.d.ts +31 -0
  251. package/dist/components/section-surface.js +46 -0
  252. package/dist/components/section-surface.js.map +1 -0
  253. package/dist/components/sections.d.ts +38 -0
  254. package/dist/components/sections.js +72 -0
  255. package/dist/components/sections.js.map +1 -0
  256. package/dist/components/settings-form.d.ts +10 -0
  257. package/dist/components/settings-form.js +17 -0
  258. package/dist/components/settings-form.js.map +1 -0
  259. package/dist/components/studio-context.d.ts +22 -0
  260. package/dist/components/studio-context.js +48 -0
  261. package/dist/components/studio-context.js.map +1 -0
  262. package/dist/components/studio-project-screen.d.ts +19 -0
  263. package/dist/components/studio-project-screen.js +195 -0
  264. package/dist/components/studio-project-screen.js.map +1 -0
  265. package/dist/components/studio-shell.d.ts +18 -0
  266. package/dist/components/studio-shell.js +64 -0
  267. package/dist/components/studio-shell.js.map +1 -0
  268. package/dist/components/theme-context.d.ts +17 -0
  269. package/dist/components/theme-context.js +26 -0
  270. package/dist/components/theme-context.js.map +1 -0
  271. package/dist/components/workspace-gate.d.ts +12 -0
  272. package/dist/components/workspace-gate.js +27 -0
  273. package/dist/components/workspace-gate.js.map +1 -0
  274. package/dist/components/workspace-projects.d.ts +13 -0
  275. package/dist/components/workspace-projects.js +18 -0
  276. package/dist/components/workspace-projects.js.map +1 -0
  277. package/dist/lib/assets/delete-asset.d.ts +34 -0
  278. package/dist/lib/assets/delete-asset.js +34 -0
  279. package/dist/lib/assets/delete-asset.js.map +1 -0
  280. package/dist/lib/assets/image-dimensions.d.ts +18 -0
  281. package/dist/lib/assets/image-dimensions.js +26 -0
  282. package/dist/lib/assets/image-dimensions.js.map +1 -0
  283. package/dist/lib/assets/index.d.ts +9 -0
  284. package/dist/lib/assets/index.js +10 -0
  285. package/dist/lib/assets/index.js.map +1 -0
  286. package/dist/lib/assets/upload-state.d.ts +53 -0
  287. package/dist/lib/assets/upload-state.js +59 -0
  288. package/dist/lib/assets/upload-state.js.map +1 -0
  289. package/dist/lib/assets/upload.d.ts +56 -0
  290. package/dist/lib/assets/upload.js +125 -0
  291. package/dist/lib/assets/upload.js.map +1 -0
  292. package/dist/lib/auth/auth-adapter.d.ts +57 -0
  293. package/dist/lib/auth/auth-adapter.js +13 -0
  294. package/dist/lib/auth/auth-adapter.js.map +1 -0
  295. package/dist/lib/auth/convex-auth-adapter.d.ts +39 -0
  296. package/dist/lib/auth/convex-auth-adapter.js +171 -0
  297. package/dist/lib/auth/convex-auth-adapter.js.map +1 -0
  298. package/dist/lib/auth/dev-auto-login-adapter.d.ts +25 -0
  299. package/dist/lib/auth/dev-auto-login-adapter.js +40 -0
  300. package/dist/lib/auth/dev-auto-login-adapter.js.map +1 -0
  301. package/dist/lib/auth/index.d.ts +28 -0
  302. package/dist/lib/auth/index.js +61 -0
  303. package/dist/lib/auth/index.js.map +1 -0
  304. package/dist/lib/auth/local-auth-adapter.d.ts +57 -0
  305. package/dist/lib/auth/local-auth-adapter.js +78 -0
  306. package/dist/lib/auth/local-auth-adapter.js.map +1 -0
  307. package/dist/lib/auth/route-guard.d.ts +33 -0
  308. package/dist/lib/auth/route-guard.js +51 -0
  309. package/dist/lib/auth/route-guard.js.map +1 -0
  310. package/dist/lib/auth-errors.d.ts +42 -0
  311. package/dist/lib/auth-errors.js +74 -0
  312. package/dist/lib/auth-errors.js.map +1 -0
  313. package/dist/lib/bindings/section-bindings.d.ts +24 -0
  314. package/dist/lib/bindings/section-bindings.js +9 -0
  315. package/dist/lib/bindings/section-bindings.js.map +1 -0
  316. package/dist/lib/clipboard/index.d.ts +7 -0
  317. package/dist/lib/clipboard/index.js +8 -0
  318. package/dist/lib/clipboard/index.js.map +1 -0
  319. package/dist/lib/clipboard/os-clipboard.d.ts +46 -0
  320. package/dist/lib/clipboard/os-clipboard.js +105 -0
  321. package/dist/lib/clipboard/os-clipboard.js.map +1 -0
  322. package/dist/lib/clipboard/paste-issues.d.ts +34 -0
  323. package/dist/lib/clipboard/paste-issues.js +67 -0
  324. package/dist/lib/clipboard/paste-issues.js.map +1 -0
  325. package/dist/lib/clipboard/paste-target.d.ts +20 -0
  326. package/dist/lib/clipboard/paste-target.js +28 -0
  327. package/dist/lib/clipboard/paste-target.js.map +1 -0
  328. package/dist/lib/cms/published-documents.d.ts +30 -0
  329. package/dist/lib/cms/published-documents.js +75 -0
  330. package/dist/lib/cms/published-documents.js.map +1 -0
  331. package/dist/lib/cms-views/index.d.ts +9 -0
  332. package/dist/lib/cms-views/index.js +10 -0
  333. package/dist/lib/cms-views/index.js.map +1 -0
  334. package/dist/lib/cms-views/selection.d.ts +29 -0
  335. package/dist/lib/cms-views/selection.js +46 -0
  336. package/dist/lib/cms-views/selection.js.map +1 -0
  337. package/dist/lib/cms-views/view-model.d.ts +192 -0
  338. package/dist/lib/cms-views/view-model.js +353 -0
  339. package/dist/lib/cms-views/view-model.js.map +1 -0
  340. package/dist/lib/cms-views/views-store.d.ts +70 -0
  341. package/dist/lib/cms-views/views-store.js +129 -0
  342. package/dist/lib/cms-views/views-store.js.map +1 -0
  343. package/dist/lib/data/collection-content.d.ts +105 -0
  344. package/dist/lib/data/collection-content.js +196 -0
  345. package/dist/lib/data/collection-content.js.map +1 -0
  346. package/dist/lib/data/data-store.d.ts +97 -0
  347. package/dist/lib/data/data-store.js +205 -0
  348. package/dist/lib/data/data-store.js.map +1 -0
  349. package/dist/lib/data/index.d.ts +4 -0
  350. package/dist/lib/data/index.js +8 -0
  351. package/dist/lib/data/index.js.map +1 -0
  352. package/dist/lib/data/providers.d.ts +143 -0
  353. package/dist/lib/data/providers.js +255 -0
  354. package/dist/lib/data/providers.js.map +1 -0
  355. package/dist/lib/data/sample-capture.d.ts +30 -0
  356. package/dist/lib/data/sample-capture.js +70 -0
  357. package/dist/lib/data/sample-capture.js.map +1 -0
  358. package/dist/lib/data/sources-store.d.ts +42 -0
  359. package/dist/lib/data/sources-store.js +120 -0
  360. package/dist/lib/data/sources-store.js.map +1 -0
  361. package/dist/lib/dnd/drop-rules.d.ts +219 -0
  362. package/dist/lib/dnd/drop-rules.js +257 -0
  363. package/dist/lib/dnd/drop-rules.js.map +1 -0
  364. package/dist/lib/dnd/gap-drag.d.ts +66 -0
  365. package/dist/lib/dnd/gap-drag.js +95 -0
  366. package/dist/lib/dnd/gap-drag.js.map +1 -0
  367. package/dist/lib/locale/binding-fallback.d.ts +28 -0
  368. package/dist/lib/locale/binding-fallback.js +66 -0
  369. package/dist/lib/locale/binding-fallback.js.map +1 -0
  370. package/dist/lib/locale/fallback.d.ts +43 -0
  371. package/dist/lib/locale/fallback.js +52 -0
  372. package/dist/lib/locale/fallback.js.map +1 -0
  373. package/dist/lib/locale/index.d.ts +6 -0
  374. package/dist/lib/locale/index.js +7 -0
  375. package/dist/lib/locale/index.js.map +1 -0
  376. package/dist/lib/locale/locale-store.d.ts +40 -0
  377. package/dist/lib/locale/locale-store.js +61 -0
  378. package/dist/lib/locale/locale-store.js.map +1 -0
  379. package/dist/lib/locale/locale-switcher.d.ts +10 -0
  380. package/dist/lib/locale/locale-switcher.js +24 -0
  381. package/dist/lib/locale/locale-switcher.js.map +1 -0
  382. package/dist/lib/locale/route-variant.d.ts +14 -0
  383. package/dist/lib/locale/route-variant.js +11 -0
  384. package/dist/lib/locale/route-variant.js.map +1 -0
  385. package/dist/lib/locale/use-studio-locale.d.ts +10 -0
  386. package/dist/lib/locale/use-studio-locale.js +8 -0
  387. package/dist/lib/locale/use-studio-locale.js.map +1 -0
  388. package/dist/lib/operations/asset-repository.d.ts +15 -0
  389. package/dist/lib/operations/asset-repository.js +56 -0
  390. package/dist/lib/operations/asset-repository.js.map +1 -0
  391. package/dist/lib/operations/cms-persistence.d.ts +35 -0
  392. package/dist/lib/operations/cms-persistence.js +75 -0
  393. package/dist/lib/operations/cms-persistence.js.map +1 -0
  394. package/dist/lib/operations/graph-commands.d.ts +140 -0
  395. package/dist/lib/operations/graph-commands.js +86 -0
  396. package/dist/lib/operations/graph-commands.js.map +1 -0
  397. package/dist/lib/operations/graph-persistence.d.ts +27 -0
  398. package/dist/lib/operations/graph-persistence.js +35 -0
  399. package/dist/lib/operations/graph-persistence.js.map +1 -0
  400. package/dist/lib/operations/index.d.ts +13 -0
  401. package/dist/lib/operations/index.js +14 -0
  402. package/dist/lib/operations/index.js.map +1 -0
  403. package/dist/lib/operations/operations-package.d.ts +6 -0
  404. package/dist/lib/operations/operations-package.js +7 -0
  405. package/dist/lib/operations/operations-package.js.map +1 -0
  406. package/dist/lib/operations/persist-queue.d.ts +16 -0
  407. package/dist/lib/operations/persist-queue.js +18 -0
  408. package/dist/lib/operations/persist-queue.js.map +1 -0
  409. package/dist/lib/operations/session-hydration.d.ts +84 -0
  410. package/dist/lib/operations/session-hydration.js +112 -0
  411. package/dist/lib/operations/session-hydration.js.map +1 -0
  412. package/dist/lib/operations/studio-operations.d.ts +59 -0
  413. package/dist/lib/operations/studio-operations.js +92 -0
  414. package/dist/lib/operations/studio-operations.js.map +1 -0
  415. package/dist/lib/persistence/backend-mode.d.ts +69 -0
  416. package/dist/lib/persistence/backend-mode.js +120 -0
  417. package/dist/lib/persistence/backend-mode.js.map +1 -0
  418. package/dist/lib/persistence/convex-adapter.d.ts +34 -0
  419. package/dist/lib/persistence/convex-adapter.js +681 -0
  420. package/dist/lib/persistence/convex-adapter.js.map +1 -0
  421. package/dist/lib/persistence/convex-blob-storage.d.ts +57 -0
  422. package/dist/lib/persistence/convex-blob-storage.js +97 -0
  423. package/dist/lib/persistence/convex-blob-storage.js.map +1 -0
  424. package/dist/lib/persistence/convex-client.d.ts +19 -0
  425. package/dist/lib/persistence/convex-client.js +40 -0
  426. package/dist/lib/persistence/convex-client.js.map +1 -0
  427. package/dist/lib/persistence/index.d.ts +30 -0
  428. package/dist/lib/persistence/index.js +60 -0
  429. package/dist/lib/persistence/index.js.map +1 -0
  430. package/dist/lib/persona/labels.d.ts +23 -0
  431. package/dist/lib/persona/labels.js +122 -0
  432. package/dist/lib/persona/labels.js.map +1 -0
  433. package/dist/lib/rail.d.ts +11 -0
  434. package/dist/lib/rail.js +26 -0
  435. package/dist/lib/rail.js.map +1 -0
  436. package/dist/lib/references/impact.d.ts +64 -0
  437. package/dist/lib/references/impact.js +62 -0
  438. package/dist/lib/references/impact.js.map +1 -0
  439. package/dist/lib/references/index.d.ts +7 -0
  440. package/dist/lib/references/index.js +8 -0
  441. package/dist/lib/references/index.js.map +1 -0
  442. package/dist/lib/references/reference-model.d.ts +125 -0
  443. package/dist/lib/references/reference-model.js +242 -0
  444. package/dist/lib/references/reference-model.js.map +1 -0
  445. package/dist/lib/references/references-store.d.ts +65 -0
  446. package/dist/lib/references/references-store.js +221 -0
  447. package/dist/lib/references/references-store.js.map +1 -0
  448. package/dist/lib/registry/index.d.ts +65 -0
  449. package/dist/lib/registry/index.js +114 -0
  450. package/dist/lib/registry/index.js.map +1 -0
  451. package/dist/lib/registry/preview.d.ts +15 -0
  452. package/dist/lib/registry/preview.js +110 -0
  453. package/dist/lib/registry/preview.js.map +1 -0
  454. package/dist/lib/registry/project-components.d.ts +16 -0
  455. package/dist/lib/registry/project-components.js +152 -0
  456. package/dist/lib/registry/project-components.js.map +1 -0
  457. package/dist/lib/routing/index.d.ts +10 -0
  458. package/dist/lib/routing/index.js +11 -0
  459. package/dist/lib/routing/index.js.map +1 -0
  460. package/dist/lib/routing/routing-analysis.d.ts +26 -0
  461. package/dist/lib/routing/routing-analysis.js +37 -0
  462. package/dist/lib/routing/routing-analysis.js.map +1 -0
  463. package/dist/lib/routing/routing-store.d.ts +50 -0
  464. package/dist/lib/routing/routing-store.js +72 -0
  465. package/dist/lib/routing/routing-store.js.map +1 -0
  466. package/dist/lib/starters/kit-session.d.ts +5 -0
  467. package/dist/lib/starters/kit-session.js +17 -0
  468. package/dist/lib/starters/kit-session.js.map +1 -0
  469. package/dist/lib/theme.d.ts +21 -0
  470. package/dist/lib/theme.js +32 -0
  471. package/dist/lib/theme.js.map +1 -0
  472. package/dist/lib/utils.d.ts +11 -0
  473. package/dist/lib/utils.js +28 -0
  474. package/dist/lib/utils.js.map +1 -0
  475. package/dist/lib/webhooks/config.d.ts +15 -0
  476. package/dist/lib/webhooks/config.js +64 -0
  477. package/dist/lib/webhooks/config.js.map +1 -0
  478. package/dist/lib/webhooks/dispatcher.d.ts +67 -0
  479. package/dist/lib/webhooks/dispatcher.js +61 -0
  480. package/dist/lib/webhooks/dispatcher.js.map +1 -0
  481. package/dist/lib/webhooks/index.d.ts +11 -0
  482. package/dist/lib/webhooks/index.js +10 -0
  483. package/dist/lib/webhooks/index.js.map +1 -0
  484. package/dist/lib/webhooks/signing.d.ts +15 -0
  485. package/dist/lib/webhooks/signing.js +24 -0
  486. package/dist/lib/webhooks/signing.js.map +1 -0
  487. package/dist/lib/webhooks/tags.d.ts +25 -0
  488. package/dist/lib/webhooks/tags.js +173 -0
  489. package/dist/lib/webhooks/tags.js.map +1 -0
  490. package/dist/lib/working-graph.d.ts +82 -0
  491. package/dist/lib/working-graph.js +113 -0
  492. package/dist/lib/working-graph.js.map +1 -0
  493. package/dist/lib/workspace/index.d.ts +109 -0
  494. package/dist/lib/workspace/index.js +206 -0
  495. package/dist/lib/workspace/index.js.map +1 -0
  496. package/dist/lib/workspace/switcher-source.d.ts +39 -0
  497. package/dist/lib/workspace/switcher-source.js +23 -0
  498. package/dist/lib/workspace/switcher-source.js.map +1 -0
  499. package/dist/lib/workspace/workspace-source.d.ts +47 -0
  500. package/dist/lib/workspace/workspace-source.js +67 -0
  501. package/dist/lib/workspace/workspace-source.js.map +1 -0
  502. package/dist/router/index.d.ts +32 -0
  503. package/dist/router/index.js +32 -0
  504. package/dist/router/index.js.map +1 -0
  505. package/dist/router/match.d.ts +75 -0
  506. package/dist/router/match.js +87 -0
  507. package/dist/router/match.js.map +1 -0
  508. package/dist/router/search.d.ts +22 -0
  509. package/dist/router/search.js +16 -0
  510. package/dist/router/search.js.map +1 -0
  511. package/dist/ui/avatar.d.ts +17 -0
  512. package/dist/ui/avatar.js +38 -0
  513. package/dist/ui/avatar.js.map +1 -0
  514. package/dist/ui/badge.d.ts +9 -0
  515. package/dist/ui/badge.js +23 -0
  516. package/dist/ui/badge.js.map +1 -0
  517. package/dist/ui/button.d.ts +11 -0
  518. package/dist/ui/button.js +30 -0
  519. package/dist/ui/button.js.map +1 -0
  520. package/dist/ui/card.d.ts +11 -0
  521. package/dist/ui/card.js +23 -0
  522. package/dist/ui/card.js.map +1 -0
  523. package/dist/ui/dialog.d.ts +12 -0
  524. package/dist/ui/dialog.js +27 -0
  525. package/dist/ui/dialog.js.map +1 -0
  526. package/dist/ui/dropdown-menu.d.ts +15 -0
  527. package/dist/ui/dropdown-menu.js +24 -0
  528. package/dist/ui/dropdown-menu.js.map +1 -0
  529. package/dist/ui/field.d.ts +15 -0
  530. package/dist/ui/field.js +14 -0
  531. package/dist/ui/field.js.map +1 -0
  532. package/dist/ui/index.d.ts +14 -0
  533. package/dist/ui/index.js +15 -0
  534. package/dist/ui/index.js.map +1 -0
  535. package/dist/ui/input.d.ts +3 -0
  536. package/dist/ui/input.js +7 -0
  537. package/dist/ui/input.js.map +1 -0
  538. package/dist/ui/inspector.d.ts +18 -0
  539. package/dist/ui/inspector.js +14 -0
  540. package/dist/ui/inspector.js.map +1 -0
  541. package/dist/ui/layout.d.ts +45 -0
  542. package/dist/ui/layout.js +48 -0
  543. package/dist/ui/layout.js.map +1 -0
  544. package/dist/ui/panel.d.ts +12 -0
  545. package/dist/ui/panel.js +20 -0
  546. package/dist/ui/panel.js.map +1 -0
  547. package/dist/ui/separator.d.ts +6 -0
  548. package/dist/ui/separator.js +7 -0
  549. package/dist/ui/separator.js.map +1 -0
  550. package/dist/ui/toolbar.d.ts +9 -0
  551. package/dist/ui/toolbar.js +16 -0
  552. package/dist/ui/toolbar.js.map +1 -0
  553. package/dist/ui/typography.d.ts +50 -0
  554. package/dist/ui/typography.js +43 -0
  555. package/dist/ui/typography.js.map +1 -0
  556. package/package.json +149 -0
  557. package/src/styles/studio.css +101 -0
  558. package/src/styles/tokens.css +63 -0
@@ -0,0 +1,152 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defineComponent } from '@elytracms/component-registry';
3
+ function str(value, fallback = '') {
4
+ return typeof value === 'string' && value.length > 0 ? value : fallback;
5
+ }
6
+ // --- project.MarketingHero -------------------------------------------------
7
+ function MarketingHero(props) {
8
+ const align = props.align === 'center' ? 'items-center text-center' : 'items-start text-left';
9
+ return (_jsxs("div", { className: `flex flex-col gap-3 rounded-xl border border-border bg-card p-8 ${align}`, children: [str(props.eyebrow) ? (_jsx("span", { className: "text-[0.7rem] font-semibold uppercase tracking-[0.14em] text-primary", children: str(props.eyebrow) })) : null, _jsx("h2", { className: "text-2xl font-semibold tracking-tight text-foreground", children: str(props.heading, 'Headline goes here') }), str(props.subheading) ? (_jsx("p", { className: "max-w-prose text-sm text-muted-foreground", children: str(props.subheading) })) : null, str(props.ctaLabel) ? (_jsx("span", { className: "mt-1 inline-flex w-fit items-center rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground", children: str(props.ctaLabel) })) : null] }));
10
+ }
11
+ const MarketingHeroManifest = defineComponent({
12
+ id: 'project.MarketingHero',
13
+ namespace: 'project',
14
+ title: 'Marketing Hero',
15
+ description: 'A headline hero section with eyebrow, subheading, and a call to action.',
16
+ category: 'marketing',
17
+ props: {
18
+ eyebrow: { type: 'text', context: 'prop', default: 'New', form: { label: 'Eyebrow' } },
19
+ heading: {
20
+ type: 'text',
21
+ context: 'prop',
22
+ default: 'Build code-first websites',
23
+ validation: { min: 1 },
24
+ form: { label: 'Heading' },
25
+ },
26
+ subheading: {
27
+ type: 'text',
28
+ context: 'prop',
29
+ default: 'One canonical graph powers editing, content, and export.',
30
+ form: { label: 'Subheading', control: 'textarea' },
31
+ },
32
+ ctaLabel: { type: 'text', context: 'prop', default: 'Get started', form: { label: 'CTA label' } },
33
+ align: {
34
+ type: 'select',
35
+ context: 'prop',
36
+ default: 'left',
37
+ options: [
38
+ { value: 'left', label: 'Left' },
39
+ { value: 'center', label: 'Center' },
40
+ ],
41
+ form: { label: 'Alignment' },
42
+ },
43
+ },
44
+ slots: [],
45
+ designTokens: ['color.primary', 'space.section', 'font.display'],
46
+ fixtures: [
47
+ { name: 'Default' },
48
+ {
49
+ name: 'Centered',
50
+ props: { align: 'center', eyebrow: 'Launch', heading: 'Ship faster', ctaLabel: 'Try it' },
51
+ },
52
+ { name: 'Minimal', props: { eyebrow: '', subheading: '', ctaLabel: '', heading: 'Just a headline' } },
53
+ ],
54
+ });
55
+ // --- project.FeatureCard ---------------------------------------------------
56
+ function FeatureCard(props) {
57
+ const accent = props.tone === 'accent';
58
+ return (_jsxs("div", { className: `flex flex-col gap-2 rounded-lg border p-5 ${accent ? 'border-primary/30 bg-primary/5' : 'border-border bg-card'}`, children: [_jsx("div", { className: `grid size-8 place-items-center rounded-md ${accent ? 'bg-primary text-primary-foreground' : 'bg-muted text-foreground'}`, children: _jsx("span", { className: "text-sm font-bold", children: str(props.title, 'F').charAt(0) }) }), _jsx("h3", { className: "text-sm font-semibold text-foreground", children: str(props.title, 'Feature title') }), _jsx("p", { className: "text-xs text-muted-foreground", children: str(props.body, 'A short description of the feature.') })] }));
59
+ }
60
+ const FeatureCardManifest = defineComponent({
61
+ id: 'project.FeatureCard',
62
+ namespace: 'project',
63
+ title: 'Feature Card',
64
+ description: 'A compact card highlighting a single feature.',
65
+ category: 'marketing',
66
+ props: {
67
+ title: {
68
+ type: 'text',
69
+ context: 'prop',
70
+ default: 'Validation first',
71
+ validation: { min: 1 },
72
+ form: { label: 'Title' },
73
+ },
74
+ body: {
75
+ type: 'text',
76
+ context: 'prop',
77
+ default: 'Broken bindings and missing components are explicit, never silent.',
78
+ form: { label: 'Body', control: 'textarea' },
79
+ },
80
+ tone: {
81
+ type: 'select',
82
+ context: 'prop',
83
+ default: 'default',
84
+ options: [
85
+ { value: 'default', label: 'Default' },
86
+ { value: 'accent', label: 'Accent' },
87
+ ],
88
+ form: { label: 'Tone' },
89
+ },
90
+ },
91
+ slots: [],
92
+ designTokens: ['color.surface', 'color.primary'],
93
+ fixtures: [{ name: 'Default' }, { name: 'Accent', props: { tone: 'accent', title: 'AI inspectable' } }],
94
+ });
95
+ // --- project.PricingCallout ------------------------------------------------
96
+ function PricingCallout(props) {
97
+ const featured = props.featured === true;
98
+ return (_jsxs("div", { className: `flex flex-col gap-1 rounded-xl border p-6 ${featured ? 'border-primary bg-primary/5 shadow-md' : 'border-border bg-card'}`, children: [featured ? (_jsx("span", { className: "mb-1 w-fit rounded-full bg-primary px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-wide text-primary-foreground", children: "Popular" })) : null, _jsx("span", { className: "text-sm font-medium text-muted-foreground", children: str(props.plan, 'Plan') }), _jsxs("div", { className: "flex items-baseline gap-1", children: [_jsx("span", { className: "text-3xl font-semibold tracking-tight text-foreground", children: str(props.price, '$0') }), _jsxs("span", { className: "text-sm text-muted-foreground", children: ["/", str(props.period, 'mo')] })] })] }));
99
+ }
100
+ const PricingCalloutManifest = defineComponent({
101
+ id: 'project.PricingCallout',
102
+ namespace: 'project',
103
+ title: 'Pricing Callout',
104
+ description: 'A pricing plan callout with an optional featured emphasis.',
105
+ category: 'commerce',
106
+ props: {
107
+ plan: {
108
+ type: 'text',
109
+ context: 'prop',
110
+ default: 'Pro',
111
+ validation: { min: 1 },
112
+ form: { label: 'Plan' },
113
+ },
114
+ price: { type: 'text', context: 'prop', default: '$29', form: { label: 'Price' } },
115
+ period: { type: 'text', context: 'prop', default: 'mo', form: { label: 'Period' } },
116
+ featured: { type: 'boolean', context: 'prop', default: false, form: { label: 'Featured' } },
117
+ },
118
+ slots: [],
119
+ designTokens: ['color.primary', 'space.card'],
120
+ fixtures: [{ name: 'Standard' }, { name: 'Featured', props: { featured: true, plan: 'Team', price: '$79' } }],
121
+ });
122
+ // --- project.LegacyBanner (intentionally has NO implementation) -------------
123
+ //
124
+ // Registered manifest with no implementation — exercises the "incompatible /
125
+ // missing implementation" component status (EC-055) and the renderer's
126
+ // missing-component fallback (brief §4.11).
127
+ const LegacyBannerManifest = defineComponent({
128
+ id: 'project.LegacyBanner',
129
+ namespace: 'project',
130
+ title: 'Legacy Banner',
131
+ description: 'A deprecated banner whose implementation has not been wired up.',
132
+ category: 'marketing',
133
+ props: {
134
+ message: { type: 'text', context: 'prop', default: 'Deprecated', form: { label: 'Message' } },
135
+ },
136
+ slots: [],
137
+ fixtures: [{ name: 'Default' }],
138
+ });
139
+ /** Project component manifests (including the deliberately-unimplemented one). */
140
+ export const projectComponentManifests = [
141
+ MarketingHeroManifest,
142
+ FeatureCardManifest,
143
+ PricingCalloutManifest,
144
+ LegacyBannerManifest,
145
+ ];
146
+ /** Implementations for the project components — note `LegacyBanner` is absent. */
147
+ export const projectComponentImplementations = {
148
+ 'project.MarketingHero': MarketingHero,
149
+ 'project.FeatureCard': FeatureCard,
150
+ 'project.PricingCallout': PricingCallout,
151
+ };
152
+ //# sourceMappingURL=project-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-components.js","sourceRoot":"","sources":["../../../src/lib/registry/project-components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Route & redirect surface support (EC-170; made read-only by EC-207 "routes as
3
+ * code"). Routes & redirects are config-sourced — authored in `elytra.config.ts`
4
+ * and read through `resolveDeploymentRoutes`/`resolveDeploymentRedirects`, never
5
+ * the backend. `routing-store.ts` holds the pure template-route helpers;
6
+ * `routing-analysis.ts` holds the engine-derived view models from the
7
+ * `@elytracms/cms-core` router.
8
+ */
9
+ export * from './routing-store';
10
+ export * from './routing-analysis';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Route & redirect surface support (EC-170; made read-only by EC-207 "routes as
3
+ * code"). Routes & redirects are config-sourced — authored in `elytra.config.ts`
4
+ * and read through `resolveDeploymentRoutes`/`resolveDeploymentRedirects`, never
5
+ * the backend. `routing-store.ts` holds the pure template-route helpers;
6
+ * `routing-analysis.ts` holds the engine-derived view models from the
7
+ * `@elytracms/cms-core` router.
8
+ */
9
+ export * from './routing-store';
10
+ export * from './routing-analysis';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,26 @@
1
+ import type { CmsValidationIssue, RedirectRecord } from '@elytracms/cms-core';
2
+ /**
3
+ * Engine-derived view models for the Routes section (EC-170). Everything here
4
+ * is a thin projection over the existing `@elytracms/cms-core` router — the UI
5
+ * never reimplements pattern matching, conflict detection, or loop detection.
6
+ */
7
+ export interface RouteConflict {
8
+ /** The structured `route-conflict` issue from `createRouter`. */
9
+ issue: CmsValidationIssue;
10
+ /** The id of the *other* route in the conflicting pair. */
11
+ otherRouteId: string;
12
+ }
13
+ /**
14
+ * Index the router's `route-conflict` issues by route id, attributing each
15
+ * conflict to BOTH routes in the pair so each affected row can render it
16
+ * inline with a deep link to its counterpart.
17
+ */
18
+ export declare function conflictsByRoute(issues: readonly CmsValidationIssue[]): Map<string, RouteConflict[]>;
19
+ /** 301/302 label for a redirect record. */
20
+ export declare function statusCodeOf(redirect: Pick<RedirectRecord, 'permanent'>): '301' | '302';
21
+ /** Split a route pattern into segments, flagging `:param` segments. */
22
+ export interface PatternSegmentView {
23
+ text: string;
24
+ param: boolean;
25
+ }
26
+ export declare function patternSegments(pattern: string): PatternSegmentView[];
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Index the router's `route-conflict` issues by route id, attributing each
3
+ * conflict to BOTH routes in the pair so each affected row can render it
4
+ * inline with a deep link to its counterpart.
5
+ */
6
+ export function conflictsByRoute(issues) {
7
+ const map = new Map();
8
+ const add = (routeId, conflict) => {
9
+ const list = map.get(routeId) ?? [];
10
+ list.push(conflict);
11
+ map.set(routeId, list);
12
+ };
13
+ for (const issue of issues) {
14
+ if (issue.code !== 'route-conflict')
15
+ continue;
16
+ // The engine attaches the issue at path ['routes', <routeId>] and names
17
+ // the partner in meta.conflictsWith.
18
+ const routeId = typeof issue.path[1] === 'string' ? issue.path[1] : undefined;
19
+ const other = typeof issue.meta?.conflictsWith === 'string' ? issue.meta.conflictsWith : undefined;
20
+ if (routeId)
21
+ add(routeId, { issue, otherRouteId: other ?? '' });
22
+ if (other && routeId)
23
+ add(other, { issue, otherRouteId: routeId });
24
+ }
25
+ return map;
26
+ }
27
+ /** 301/302 label for a redirect record. */
28
+ export function statusCodeOf(redirect) {
29
+ return redirect.permanent ? '301' : '302';
30
+ }
31
+ export function patternSegments(pattern) {
32
+ return pattern
33
+ .split('/')
34
+ .filter((segment) => segment.length > 0)
35
+ .map((segment) => segment.startsWith(':') ? { text: segment, param: true } : { text: segment, param: false });
36
+ }
37
+ //# sourceMappingURL=routing-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-analysis.js","sourceRoot":"","sources":["../../../src/lib/routing/routing-analysis.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAA;IAC9C,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,QAAuB,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACnB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACxB,CAAC,CAAA;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;YAAE,SAAQ;QAC7C,wEAAwE;QACxE,qCAAqC;QACrC,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7E,MAAM,KAAK,GACT,OAAO,KAAK,CAAC,IAAI,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAA;QACtF,IAAI,OAAO;YAAE,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAA;QAC/D,IAAI,KAAK,IAAI,OAAO;YAAE,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,YAAY,CAAC,QAA2C;IACtE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AAC3C,CAAC;AAQD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACf,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAC3F,CAAA;AACL,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { RouteRecord } from '@elytracms/cms-core';
2
+ /**
3
+ * Pure template-route helpers for the Routes domain (EC-166, reshaped by
4
+ * EC-187; route persistence retired by EC-207).
5
+ *
6
+ * Routes & redirects are config-sourced (EC-207 "routes as code"): they are
7
+ * authored in `elytra.config.ts`, materialized by `composeProject`, and read
8
+ * through `resolveDeploymentRoutes`/`resolveDeploymentRedirects` — never written
9
+ * to or read from the backend. The former `routes`/`redirects` system
10
+ * collections are retired. What survives here are pure functions over the
11
+ * canonical `RouteRecord` schema, useful for authoring/inspecting template
12
+ * routes in config.
13
+ *
14
+ * A template page is one page definition serving *every* document of a
15
+ * collection through a dynamic pattern. It is expressed entirely in the
16
+ * canonical route-record schema: the parameterized `document` ref
17
+ * (`{ collection, id: ':slug' }`) names the collection plus the URL param
18
+ * carrying the document's slug/id — `@elytracms/content`'s `resolvePage`
19
+ * substitutes the matched value at request time. After EC-187 there is no
20
+ * `templateId`; a template route is identified purely by its parameterized
21
+ * `document` ref (a `:param` id over a collection). One template route per
22
+ * collection. No new record shape, no parallel store.
23
+ */
24
+ /** Deterministic record id: one template route per collection (EC-187). */
25
+ export declare function templateRouteId(collectionId: string): string;
26
+ export interface TemplateRouteInit {
27
+ collectionId: string;
28
+ /** Dynamic pattern, e.g. `/blog/:slug`. Must capture {@link param}. */
29
+ pattern: string;
30
+ /** The URL param carrying the document slug or id. Defaults to `slug`. */
31
+ param?: string;
32
+ locale?: string;
33
+ }
34
+ /** What a template route binds, read back from a stored record. */
35
+ export interface TemplateRouteBinding {
36
+ collectionId: string;
37
+ param: string;
38
+ }
39
+ /** Build the canonical route record of a template page. */
40
+ export declare function buildTemplateRoute(init: TemplateRouteInit): RouteRecord;
41
+ /** The collection + param a route record templates over, if it is one. */
42
+ export declare function templateBindingOf(route: RouteRecord): TemplateRouteBinding | undefined;
43
+ /** The template route serving a collection, if registered (EC-187). */
44
+ export declare function templateRouteFor(routes: readonly RouteRecord[], collectionId: string): RouteRecord | undefined;
45
+ /**
46
+ * Plain-language validation of a template pattern: it must be a real dynamic
47
+ * pattern that captures the document param exactly once. Returns `undefined`
48
+ * when the pattern is usable.
49
+ */
50
+ export declare function templatePatternError(pattern: string, param?: string): string | undefined;
@@ -0,0 +1,72 @@
1
+ import { routeRecordSchema } from '@elytracms/cms-core';
2
+ /**
3
+ * Pure template-route helpers for the Routes domain (EC-166, reshaped by
4
+ * EC-187; route persistence retired by EC-207).
5
+ *
6
+ * Routes & redirects are config-sourced (EC-207 "routes as code"): they are
7
+ * authored in `elytra.config.ts`, materialized by `composeProject`, and read
8
+ * through `resolveDeploymentRoutes`/`resolveDeploymentRedirects` — never written
9
+ * to or read from the backend. The former `routes`/`redirects` system
10
+ * collections are retired. What survives here are pure functions over the
11
+ * canonical `RouteRecord` schema, useful for authoring/inspecting template
12
+ * routes in config.
13
+ *
14
+ * A template page is one page definition serving *every* document of a
15
+ * collection through a dynamic pattern. It is expressed entirely in the
16
+ * canonical route-record schema: the parameterized `document` ref
17
+ * (`{ collection, id: ':slug' }`) names the collection plus the URL param
18
+ * carrying the document's slug/id — `@elytracms/content`'s `resolvePage`
19
+ * substitutes the matched value at request time. After EC-187 there is no
20
+ * `templateId`; a template route is identified purely by its parameterized
21
+ * `document` ref (a `:param` id over a collection). One template route per
22
+ * collection. No new record shape, no parallel store.
23
+ */
24
+ /** Deterministic record id: one template route per collection (EC-187). */
25
+ export function templateRouteId(collectionId) {
26
+ return `route-template-${collectionId}`;
27
+ }
28
+ /** Build the canonical route record of a template page. */
29
+ export function buildTemplateRoute(init) {
30
+ const param = init.param ?? 'slug';
31
+ return routeRecordSchema.parse({
32
+ id: templateRouteId(init.collectionId),
33
+ pattern: init.pattern,
34
+ document: { collection: init.collectionId, id: `:${param}` },
35
+ ...(init.locale !== undefined ? { locale: init.locale } : {}),
36
+ });
37
+ }
38
+ /** The collection + param a route record templates over, if it is one. */
39
+ export function templateBindingOf(route) {
40
+ if (route.document === undefined)
41
+ return undefined;
42
+ if (!route.document.id.startsWith(':'))
43
+ return undefined;
44
+ return { collectionId: route.document.collection, param: route.document.id.slice(1) };
45
+ }
46
+ /** The template route serving a collection, if registered (EC-187). */
47
+ export function templateRouteFor(routes, collectionId) {
48
+ return routes.find((route) => templateBindingOf(route)?.collectionId === collectionId);
49
+ }
50
+ /**
51
+ * Plain-language validation of a template pattern: it must be a real dynamic
52
+ * pattern that captures the document param exactly once. Returns `undefined`
53
+ * when the pattern is usable.
54
+ */
55
+ export function templatePatternError(pattern, param = 'slug') {
56
+ if (!pattern.startsWith('/'))
57
+ return 'The address must start with “/”.';
58
+ const segments = pattern.split('/').filter((segment) => segment.length > 0);
59
+ if (segments.length === 0)
60
+ return `The address needs at least one part, e.g. “/posts/:${param}”.`;
61
+ if (segments.some((segment) => segment === ':'))
62
+ return 'A “:” part needs a name after it.';
63
+ const params = segments.filter((segment) => segment.startsWith(':'));
64
+ if (params.length === 0) {
65
+ return `The address needs a “:${param}” part — that's where each entry's own address goes.`;
66
+ }
67
+ if (params.length > 1 || params[0] !== `:${param}`) {
68
+ return `Use exactly one “:${param}” part so every entry gets its own address.`;
69
+ }
70
+ return undefined;
71
+ }
72
+ //# sourceMappingURL=routing-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-store.js","sourceRoot":"","sources":["../../../src/lib/routing/routing-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGvD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,OAAO,kBAAkB,YAAY,EAAE,CAAA;AACzC,CAAC;AAiBD,2DAA2D;AAC3D,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAA;IAClC,OAAO,iBAAiB,CAAC,KAAK,CAAC;QAC7B,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;QACtC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE;QAC5D,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC,CAAA;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACxD,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AACvF,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAC9B,MAA8B,EAC9B,YAAoB;IAEpB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,YAAY,CAAC,CAAA;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,KAAK,GAAG,MAAM;IAClE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,kCAAkC,CAAA;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,sDAAsD,KAAK,IAAI,CAAA;IACjG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC;QAAE,OAAO,mCAAmC,CAAA;IAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,yBAAyB,KAAK,sDAAsD,CAAA;IAC7F,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,EAAE,CAAC;QACnD,OAAO,qBAAqB,KAAK,6CAA6C,CAAA;IAChF,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { InstantiatedKit } from '@elytracms/starter-kits';
2
+ /** Record a kit instantiation for a freshly-created project. */
3
+ export declare function setInstantiatedKit(projectId: string, kit: InstantiatedKit): void;
4
+ /** The instantiated kit for a project, if it was created from one. */
5
+ export declare function getInstantiatedKit(projectId: string): InstantiatedKit | undefined;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Session store for instantiated starter kits (EC-119). When a kit is imported into a new
3
+ * project, its instantiated parts (graph, collections, documents, tokens) are stashed here keyed
4
+ * by the new project id, so the project shell can seed the Builder graph and the CMS collections
5
+ * /documents from the kit instead of the default sample fixtures. Module-scoped (per session) —
6
+ * a Convex deployment would persist these instead.
7
+ */
8
+ const byProjectId = new Map();
9
+ /** Record a kit instantiation for a freshly-created project. */
10
+ export function setInstantiatedKit(projectId, kit) {
11
+ byProjectId.set(projectId, kit);
12
+ }
13
+ /** The instantiated kit for a project, if it was created from one. */
14
+ export function getInstantiatedKit(projectId) {
15
+ return byProjectId.get(projectId);
16
+ }
17
+ //# sourceMappingURL=kit-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit-session.js","sourceRoot":"","sources":["../../../src/lib/starters/kit-session.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAA;AAEtD,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,GAAoB;IACxE,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Theme controller (light/dark). The studio renders dark-first (the SSR default
3
+ * and the `<html class="dark">` baseline); a stored preference flips the `dark`
4
+ * class on the document element. Light mode is the absence of that class — the
5
+ * design tokens define `:root` (light) and `.dark` overrides (see tokens.css).
6
+ */
7
+ export type Theme = 'light' | 'dark';
8
+ export declare const THEME_STORAGE_KEY = "elytra-theme";
9
+ export declare const DEFAULT_THEME: Theme;
10
+ /** Apply a theme to the document root by toggling the `dark` class. */
11
+ export declare function applyTheme(theme: Theme, root: HTMLElement): void;
12
+ /** Read the persisted preference, or null when unset/unavailable. */
13
+ export declare function readStoredTheme(): Theme | null;
14
+ /** Persist the preference (best-effort; storage may be unavailable). */
15
+ export declare function storeTheme(theme: Theme): void;
16
+ /**
17
+ * Inline script body that runs before hydration to apply the stored theme,
18
+ * preventing a flash of the wrong theme. Injected as a raw <script> in the
19
+ * document head; defaults to dark when no preference is stored.
20
+ */
21
+ export declare const THEME_INIT_SCRIPT = "(function(){try{var t=localStorage.getItem('elytra-theme');document.documentElement.classList.toggle('dark',t!=='light');}catch(e){}})();";
@@ -0,0 +1,32 @@
1
+ export const THEME_STORAGE_KEY = 'elytra-theme';
2
+ export const DEFAULT_THEME = 'dark';
3
+ /** Apply a theme to the document root by toggling the `dark` class. */
4
+ export function applyTheme(theme, root) {
5
+ root.classList.toggle('dark', theme === 'dark');
6
+ }
7
+ /** Read the persisted preference, or null when unset/unavailable. */
8
+ export function readStoredTheme() {
9
+ try {
10
+ const value = localStorage.getItem(THEME_STORAGE_KEY);
11
+ return value === 'light' || value === 'dark' ? value : null;
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ /** Persist the preference (best-effort; storage may be unavailable). */
18
+ export function storeTheme(theme) {
19
+ try {
20
+ localStorage.setItem(THEME_STORAGE_KEY, theme);
21
+ }
22
+ catch {
23
+ // ignore — preference simply won't persist this session
24
+ }
25
+ }
26
+ /**
27
+ * Inline script body that runs before hydration to apply the stored theme,
28
+ * preventing a flash of the wrong theme. Injected as a raw <script> in the
29
+ * document head; defaults to dark when no preference is stored.
30
+ */
31
+ export const THEME_INIT_SCRIPT = `(function(){try{var t=localStorage.getItem('${THEME_STORAGE_KEY}');document.documentElement.classList.toggle('dark',t!=='light');}catch(e){}})();`;
32
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/lib/theme.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAU,MAAM,CAAA;AAE1C,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,IAAiB;IACxD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAA;AACjD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QACrD,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,+CAA+C,iBAAiB,mFAAmF,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { type ClassValue } from 'clsx';
2
+ /** Merge class names, resolving Tailwind conflicts (last wins). */
3
+ export declare function cn(...inputs: ClassValue[]): string;
4
+ /** "publishedAt" → "Published at", "cover-image" → "Cover image". */
5
+ export declare function humanizeName(name: string): string;
6
+ /**
7
+ * "About Us!" → "about-us"; "" → "". A URL/id-safe lowercase slug. NFKD
8
+ * normalization folds accented letters to their base + combining mark; the
9
+ * non-alphanumeric collapse then drops the combining mark, so "Café" → "cafe".
10
+ */
11
+ export declare function slugify(value: string): string;
@@ -0,0 +1,28 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+ /** Merge class names, resolving Tailwind conflicts (last wins). */
4
+ export function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+ /** "publishedAt" → "Published at", "cover-image" → "Cover image". */
8
+ export function humanizeName(name) {
9
+ const spaced = name
10
+ .replace(/[-_]+/g, ' ')
11
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
12
+ .toLowerCase()
13
+ .trim();
14
+ return spaced.length === 0 ? name : spaced.charAt(0).toUpperCase() + spaced.slice(1);
15
+ }
16
+ /**
17
+ * "About Us!" → "about-us"; "" → "". A URL/id-safe lowercase slug. NFKD
18
+ * normalization folds accented letters to their base + combining mark; the
19
+ * non-alphanumeric collapse then drops the combining mark, so "Café" → "cafe".
20
+ */
21
+ export function slugify(value) {
22
+ return value
23
+ .normalize('NFKD')
24
+ .toLowerCase()
25
+ .replace(/[^a-z0-9]+/g, '-')
26
+ .replace(/^-+|-+$/g, '');
27
+ }
28
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,IAAI,EAAE,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,mEAAmE;AACnE,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,IAAI;SAChB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,WAAW,EAAE;SACb,IAAI,EAAE,CAAA;IACT,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,SAAS,CAAC,MAAM,CAAC;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { OperationEventBus } from '@elytracms/operations';
2
+ import type { WebhookDispatcherAttachment } from './dispatcher';
3
+ /**
4
+ * Attach the dispatcher from environment configuration. Returns `null` when
5
+ * no endpoint/secret is configured (the common local-dev case).
6
+ */
7
+ export declare function attachConfiguredRevalidationWebhooks(events: OperationEventBus): WebhookDispatcherAttachment | null;
8
+ /**
9
+ * The locales the dispatcher emits per-collection tags for. The project's
10
+ * configured locales (the same set the host tags by) are always covered so no
11
+ * locale can be silently dropped (EC-192 — the `/de` freshness fix); the
12
+ * `VITE_REVALIDATE_LOCALES` env may only ADD to that set. Falls back to `en`
13
+ * only when neither config nor env supplies a locale (env-only wiring).
14
+ */
15
+ export declare function revalidationLocales(): string[];
@@ -0,0 +1,64 @@
1
+ import { attachRevalidationWebhooks } from './dispatcher';
2
+ import { resolveDeploymentLocales } from '../workspace';
3
+ /**
4
+ * Environment wiring for the EC-146 revalidation webhooks. The dispatcher is
5
+ * attached only when a host endpoint is configured, so dev sessions and tests
6
+ * (no env) run with zero webhook overhead.
7
+ *
8
+ * Configuration (Vite client env; SSR falls back to `process.env`):
9
+ *
10
+ * - `VITE_REVALIDATE_ENDPOINT` — the host's revalidate route URL
11
+ * (e.g. `https://example-site.vercel.app/api/revalidate`)
12
+ * - `VITE_REVALIDATE_SECRET` — shared HMAC secret (must equal the host's
13
+ * `REVALIDATE_SECRET`). Browser-exposed by design in the v1 dispatch path —
14
+ * see the CORS/secret notes in `dispatcher.ts`.
15
+ * - `VITE_REVALIDATE_LOCALES` — optional comma-separated locale list that can ADD
16
+ * locales to the revalidation tag set. It can never NARROW it: the project's
17
+ * `elytra.config.ts` locales are always covered (EC-192), so a non-default
18
+ * locale like `/de` can never be the one left stale after a publish.
19
+ *
20
+ * The host must allow the studio origin via
21
+ * `createRevalidateRoute({ allowOrigin })` for the browser preflight to pass.
22
+ */
23
+ function readEnv(name) {
24
+ const viteValue = typeof import.meta !== 'undefined'
25
+ ? import.meta.env?.[name]
26
+ : undefined;
27
+ const nodeValue = typeof process !== 'undefined' ? process.env?.[name] : undefined;
28
+ return viteValue ?? nodeValue;
29
+ }
30
+ /**
31
+ * Attach the dispatcher from environment configuration. Returns `null` when
32
+ * no endpoint/secret is configured (the common local-dev case).
33
+ */
34
+ export function attachConfiguredRevalidationWebhooks(events) {
35
+ const url = readEnv('VITE_REVALIDATE_ENDPOINT');
36
+ const secret = readEnv('VITE_REVALIDATE_SECRET');
37
+ if (!url || !secret)
38
+ return null;
39
+ return attachRevalidationWebhooks(events, {
40
+ endpoints: [{ url, secret }],
41
+ locales: revalidationLocales(),
42
+ onError: (error, context) => {
43
+ // Visible, never fatal: a host outage must not break editing.
44
+ console.warn(`[elytra] revalidation webhook delivery failed (${context.url})`, error);
45
+ },
46
+ });
47
+ }
48
+ /**
49
+ * The locales the dispatcher emits per-collection tags for. The project's
50
+ * configured locales (the same set the host tags by) are always covered so no
51
+ * locale can be silently dropped (EC-192 — the `/de` freshness fix); the
52
+ * `VITE_REVALIDATE_LOCALES` env may only ADD to that set. Falls back to `en`
53
+ * only when neither config nor env supplies a locale (env-only wiring).
54
+ */
55
+ export function revalidationLocales() {
56
+ const configLocales = resolveDeploymentLocales();
57
+ const envLocales = (readEnv('VITE_REVALIDATE_LOCALES') ?? '')
58
+ .split(',')
59
+ .map((locale) => locale.trim())
60
+ .filter((locale) => locale.length > 0);
61
+ const union = [...new Set([...configLocales, ...envLocales])];
62
+ return union.length > 0 ? union : ['en'];
63
+ }
64
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/webhooks/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAEvD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,SAAS,GACb,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW;QAChC,CAAC,CAAE,MAAM,CAAC,IAAqD,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAC3E,CAAC,CAAC,SAAS,CAAA;IACf,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAClF,OAAO,SAAS,IAAI,SAAS,CAAA;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAClD,MAAyB;IAEzB,MAAM,GAAG,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAChD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAEhC,OAAO,0BAA0B,CAAC,MAAM,EAAE;QACxC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,mBAAmB,EAAE;QAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1B,8DAA8D;YAC9D,OAAO,CAAC,IAAI,CAAC,kDAAkD,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAA;QACvF,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAA;IAChD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;SAC1D,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC1C,CAAC"}