@phtngyn/cms 0.2.0-beta.8 → 0.3.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 (524) hide show
  1. package/LICENSE +18 -10
  2. package/README.md +59 -404
  3. package/drizzle/20261003215543_initial/migration.sql +251 -0
  4. package/drizzle/20261003215543_initial/snapshot.json +1941 -0
  5. package/package.json +75 -71
  6. package/src/Authoring.d.ts +41 -49
  7. package/src/Authoring.js +1 -1
  8. package/src/Blocks-BrxSemnd.js +40 -0
  9. package/src/Client.d.ts +8186 -0
  10. package/src/Client.js +41 -0
  11. package/src/Collections.d.ts +142 -0
  12. package/src/Collections.js +142 -0
  13. package/src/Config-CMiwciub.js +130 -0
  14. package/src/Config.d.ts +172 -0
  15. package/src/Config.js +2 -0
  16. package/src/Configuration-Dk2k3OIc.js +73 -0
  17. package/src/DataTransfer-BmECvPHB.js +488 -0
  18. package/src/Database-DSsNCGft.d.ts +3 -0
  19. package/src/Delivery.d.ts +28 -0
  20. package/src/Delivery.js +7 -0
  21. package/src/Document-CKXMSEf1.js +293 -0
  22. package/src/Document-TgwYKJZM.d.ts +220 -0
  23. package/src/DocumentRenderer-Wz2xaNyf.js +394 -0
  24. package/src/EditorSchema-wrDv-id6.js +296 -0
  25. package/src/Fields-BegSgYhj.d.ts +166 -0
  26. package/src/Fields-ioGaMEh9.js +130 -0
  27. package/src/Forms-BuKAXQxr.d.ts +203 -0
  28. package/src/Forms.d.ts +48 -11
  29. package/src/Forms.js +342 -7
  30. package/src/I18n-Ckf9h0rC.js +154 -0
  31. package/src/I18n.d.ts +45 -2
  32. package/src/I18n.js +2 -1
  33. package/src/Image-CJWPLnhP.js +110 -0
  34. package/src/Links-CJYyy7rC.js +28 -0
  35. package/src/Links-Dx1yOni8.d.ts +28 -0
  36. package/src/Locales-Ch7a5xuA.js +67 -0
  37. package/src/Locales-jwbmJaOp.d.ts +43 -0
  38. package/src/Locales.d.ts +3 -0
  39. package/src/Locales.js +3 -0
  40. package/src/Media-BQ0uL4w7.d.ts +15 -0
  41. package/src/Media-DSyvd14o.js +87 -0
  42. package/src/Module.d.ts +2 -10
  43. package/src/Module.js +1040 -152
  44. package/src/Operations.d.ts +57 -0
  45. package/src/Operations.js +263 -0
  46. package/src/People-DvNZauWw.js +69 -0
  47. package/src/PreviewFocus-C_EelZO5.js +104 -0
  48. package/src/Query-C0kGJF5_.d.ts +261 -0
  49. package/src/RevisionPreview-IVwbJ9Wy.js +133 -0
  50. package/src/Routes-BaZvm2LE.js +126 -0
  51. package/src/Routes-DM1rRp3r.d.ts +15 -0
  52. package/src/S3MediaObjects-y-WacEi9.js +193 -0
  53. package/src/Seo-BcpqxoAs.d.ts +57 -0
  54. package/src/Seo-CjNUtUkj.js +254 -0
  55. package/src/StudioApi-CXLwwocX.js +833 -0
  56. package/src/StudioErrors-T5zLGQ1M.js +117 -0
  57. package/src/StudioErrors-kq-E44lQ.d.ts +104 -0
  58. package/src/StudioServer.d.ts +20 -0
  59. package/src/StudioServer.js +34 -0
  60. package/src/answers-DcTg0Xv2.js +41 -0
  61. package/src/cli.js +681 -187
  62. package/src/contracts-rprW3ZOB.js +130 -0
  63. package/src/forms-3xuf0Ym7.d.ts +206 -0
  64. package/src/localeConfiguration-BPbkLi7-.js +32 -0
  65. package/src/localeContext-DhF3SPvM.js +59 -0
  66. package/src/locales-6OD4XGIZ.js +12 -0
  67. package/src/nuxtDelivery-BYX_Cddb.js +466 -0
  68. package/src/plugin-DTYuDaQu.js +7171 -0
  69. package/src/previewContext-dt3ZUh-w.js +4 -0
  70. package/src/previewRegions-CXjk5cbP.js +145 -0
  71. package/src/previewSource-fb-q3ESM.js +144 -0
  72. package/src/rendering-D9LVeEKX.js +47 -0
  73. package/src/rolldown-runtime-8H4AJuhK.js +14 -0
  74. package/src/runtime/CmsImage.js +38 -0
  75. package/src/runtime/DocumentPage.vue +10 -0
  76. package/src/runtime/DocumentPageContent.js +48 -0
  77. package/src/runtime/DocumentRenderer.d.ts +129 -0
  78. package/src/runtime/DocumentRenderer.js +2 -0
  79. package/src/runtime/api.js +48 -6
  80. package/src/runtime/delivery/useCmsDocument.js +2 -0
  81. package/src/runtime/delivery/useCmsDocumentQuery.js +2 -0
  82. package/src/runtime/delivery/useCmsDocumentSeo.js +2 -114
  83. package/src/runtime/delivery/useCmsLocale.js +10 -0
  84. package/src/runtime/plugin.js +2 -40
  85. package/src/runtime/preview.css +85 -0
  86. package/src/runtime/preview.js +277 -0
  87. package/src/runtime/previewSource.js +82 -0
  88. package/src/runtime/revisionPrivacy.js +13 -0
  89. package/src/runtime/studio.js +10 -0
  90. package/src/runtime/studioIcons.js +36 -0
  91. package/src/validation-3pggwcnm.js +396 -0
  92. package/src/validation-DpUwPC8Y.js +224 -0
  93. package/studio/THIRD-PARTY-LICENSES.md +2406 -0
  94. package/studio/chunks/AccountPage-DL3DitDM.js +288 -0
  95. package/studio/chunks/AccountPage-DL3DitDM.js.br +0 -0
  96. package/studio/chunks/AccountPage-DL3DitDM.js.gz +0 -0
  97. package/studio/chunks/ActivityPage-CLqVUqTh.js +584 -0
  98. package/studio/chunks/ActivityPage-CLqVUqTh.js.br +0 -0
  99. package/studio/chunks/ActivityPage-CLqVUqTh.js.gz +0 -0
  100. package/studio/chunks/Alert-D0D24z_a.js +335 -0
  101. package/studio/chunks/Alert-D0D24z_a.js.br +0 -0
  102. package/studio/chunks/Alert-D0D24z_a.js.gz +0 -0
  103. package/studio/chunks/Badge-BBFs88TI.js +346 -0
  104. package/studio/chunks/Badge-BBFs88TI.js.br +0 -0
  105. package/studio/chunks/Badge-BBFs88TI.js.gz +0 -0
  106. package/studio/chunks/Button-BT3ztSPx.js +14319 -0
  107. package/studio/chunks/Button-BT3ztSPx.js.br +0 -0
  108. package/studio/chunks/Button-BT3ztSPx.js.gz +0 -0
  109. package/studio/chunks/Collapsible-CKnEYIlp.js +246 -0
  110. package/studio/chunks/Collapsible-CKnEYIlp.js.br +0 -0
  111. package/studio/chunks/Collapsible-CKnEYIlp.js.gz +0 -0
  112. package/studio/chunks/ContentInventory-D7nsFA6U.js +1745 -0
  113. package/studio/chunks/ContentInventory-D7nsFA6U.js.br +0 -0
  114. package/studio/chunks/ContentInventory-D7nsFA6U.js.gz +0 -0
  115. package/studio/chunks/ContentPage-DCxt6BeD.js +18 -0
  116. package/studio/chunks/ContentPage-DCxt6BeD.js.br +0 -0
  117. package/studio/chunks/ContentPage-DCxt6BeD.js.gz +0 -0
  118. package/studio/chunks/DashboardSearch-DjyMjJwF.js +2413 -0
  119. package/studio/chunks/DashboardSearch-DjyMjJwF.js.br +0 -0
  120. package/studio/chunks/DashboardSearch-DjyMjJwF.js.gz +0 -0
  121. package/studio/chunks/DocumentLocaleMenu-0EkkOr6_.js +26063 -0
  122. package/studio/chunks/DocumentLocaleMenu-0EkkOr6_.js.br +0 -0
  123. package/studio/chunks/DocumentLocaleMenu-0EkkOr6_.js.gz +0 -0
  124. package/studio/chunks/DropdownMenu-CA9fB0uZ.js +4400 -0
  125. package/studio/chunks/DropdownMenu-CA9fB0uZ.js.br +0 -0
  126. package/studio/chunks/DropdownMenu-CA9fB0uZ.js.gz +0 -0
  127. package/studio/chunks/EditorPage-D_PAYEE4.js +7799 -0
  128. package/studio/chunks/EditorPage-D_PAYEE4.js.br +0 -0
  129. package/studio/chunks/EditorPage-D_PAYEE4.js.gz +0 -0
  130. package/studio/chunks/FormField-CgM6l2Yn.js +198 -0
  131. package/studio/chunks/FormField-CgM6l2Yn.js.br +0 -0
  132. package/studio/chunks/FormField-CgM6l2Yn.js.gz +0 -0
  133. package/studio/chunks/HelpPage-C-vrFcT_.js +552 -0
  134. package/studio/chunks/HelpPage-C-vrFcT_.js.br +0 -0
  135. package/studio/chunks/HelpPage-C-vrFcT_.js.gz +0 -0
  136. package/studio/chunks/Kbd-Ot7TIhVZ.js +271 -0
  137. package/studio/chunks/Kbd-Ot7TIhVZ.js.br +0 -0
  138. package/studio/chunks/Kbd-Ot7TIhVZ.js.gz +0 -0
  139. package/studio/chunks/MediaFolderDialog-DYu-eu-q.js +101 -0
  140. package/studio/chunks/MediaFolderDialog-DYu-eu-q.js.br +0 -0
  141. package/studio/chunks/MediaFolderDialog-DYu-eu-q.js.gz +0 -0
  142. package/studio/chunks/MediaPage-D-jaWtdl.js +923 -0
  143. package/studio/chunks/MediaPage-D-jaWtdl.js.br +0 -0
  144. package/studio/chunks/MediaPage-D-jaWtdl.js.gz +0 -0
  145. package/studio/chunks/MediaPicker-BZs2wUFz.js +837 -0
  146. package/studio/chunks/MediaPicker-BZs2wUFz.js.br +0 -0
  147. package/studio/chunks/MediaPicker-BZs2wUFz.js.gz +0 -0
  148. package/studio/chunks/MediaUploadPanel-C7Kyg6aR.js +1173 -0
  149. package/studio/chunks/MediaUploadPanel-C7Kyg6aR.js.br +0 -0
  150. package/studio/chunks/MediaUploadPanel-C7Kyg6aR.js.gz +0 -0
  151. package/studio/chunks/Modal-D6hSvxHd.js +265 -0
  152. package/studio/chunks/Modal-D6hSvxHd.js.br +0 -0
  153. package/studio/chunks/Modal-D6hSvxHd.js.gz +0 -0
  154. package/studio/chunks/NewDocumentDialog-C8B6_r3J.js +277 -0
  155. package/studio/chunks/NewDocumentDialog-C8B6_r3J.js.br +0 -0
  156. package/studio/chunks/NewDocumentDialog-C8B6_r3J.js.gz +0 -0
  157. package/studio/chunks/Pagination-D9BSo5H2.js +573 -0
  158. package/studio/chunks/Pagination-D9BSo5H2.js.br +0 -0
  159. package/studio/chunks/Pagination-D9BSo5H2.js.gz +0 -0
  160. package/studio/chunks/PeoplePage-CWIXitBD.js +783 -0
  161. package/studio/chunks/PeoplePage-CWIXitBD.js.br +0 -0
  162. package/studio/chunks/PeoplePage-CWIXitBD.js.gz +0 -0
  163. package/studio/chunks/Popover-B63bkTMS.js +128 -0
  164. package/studio/chunks/Popover-B63bkTMS.js.br +0 -0
  165. package/studio/chunks/Popover-B63bkTMS.js.gz +0 -0
  166. package/studio/chunks/PublicationActionDialog-Cm_P0C3I.js +255 -0
  167. package/studio/chunks/PublicationActionDialog-Cm_P0C3I.js.br +0 -0
  168. package/studio/chunks/PublicationActionDialog-Cm_P0C3I.js.gz +0 -0
  169. package/studio/chunks/Routes-DLYHmulE.js +102 -0
  170. package/studio/chunks/Routes-DLYHmulE.js.br +0 -0
  171. package/studio/chunks/Routes-DLYHmulE.js.gz +0 -0
  172. package/studio/chunks/RovingFocusItem-QZNg-wWF.js +95 -0
  173. package/studio/chunks/RovingFocusItem-QZNg-wWF.js.br +0 -0
  174. package/studio/chunks/RovingFocusItem-QZNg-wWF.js.gz +0 -0
  175. package/studio/chunks/ScheduledPage-C0hqrkr5.js +332 -0
  176. package/studio/chunks/ScheduledPage-C0hqrkr5.js.br +0 -0
  177. package/studio/chunks/ScheduledPage-C0hqrkr5.js.gz +0 -0
  178. package/studio/chunks/Search-BEgCe9Aj.js +14646 -0
  179. package/studio/chunks/Search-BEgCe9Aj.js.br +0 -0
  180. package/studio/chunks/Search-BEgCe9Aj.js.gz +0 -0
  181. package/studio/chunks/Select-B50WZMW-.js +2145 -0
  182. package/studio/chunks/Select-B50WZMW-.js.br +0 -0
  183. package/studio/chunks/Select-B50WZMW-.js.gz +0 -0
  184. package/studio/chunks/SelectMenu-DSweWGMz.js +2109 -0
  185. package/studio/chunks/SelectMenu-DSweWGMz.js.br +0 -0
  186. package/studio/chunks/SelectMenu-DSweWGMz.js.gz +0 -0
  187. package/studio/chunks/SeoPage-CNNxGe4h.js +846 -0
  188. package/studio/chunks/SeoPage-CNNxGe4h.js.br +0 -0
  189. package/studio/chunks/SeoPage-CNNxGe4h.js.gz +0 -0
  190. package/studio/chunks/Skeleton-COz8dcrw.js +39 -0
  191. package/studio/chunks/Skeleton-COz8dcrw.js.br +2 -0
  192. package/studio/chunks/Skeleton-COz8dcrw.js.gz +0 -0
  193. package/studio/chunks/Slideover-QMMHAAys.js +289 -0
  194. package/studio/chunks/Slideover-QMMHAAys.js.br +0 -0
  195. package/studio/chunks/Slideover-QMMHAAys.js.gz +0 -0
  196. package/studio/chunks/StudioPage-ngEIDr5d.js +80 -0
  197. package/studio/chunks/StudioPage-ngEIDr5d.js.br +0 -0
  198. package/studio/chunks/StudioPage-ngEIDr5d.js.gz +0 -0
  199. package/studio/chunks/StudioPageToolbar-BwHnqyr6.js +2524 -0
  200. package/studio/chunks/StudioPageToolbar-BwHnqyr6.js.br +0 -0
  201. package/studio/chunks/StudioPageToolbar-BwHnqyr6.js.gz +0 -0
  202. package/studio/chunks/Switch-qKl1aDn7.js +484 -0
  203. package/studio/chunks/Switch-qKl1aDn7.js.br +0 -0
  204. package/studio/chunks/Switch-qKl1aDn7.js.gz +0 -0
  205. package/studio/chunks/ToolPage-DxoVAJVk.js +29 -0
  206. package/studio/chunks/ToolPage-DxoVAJVk.js.br +0 -0
  207. package/studio/chunks/ToolPage-DxoVAJVk.js.gz +0 -0
  208. package/studio/chunks/Tooltip-Bu15m_DB.js +693 -0
  209. package/studio/chunks/Tooltip-Bu15m_DB.js.br +0 -0
  210. package/studio/chunks/Tooltip-Bu15m_DB.js.gz +0 -0
  211. package/studio/chunks/TrashPage-lhqLLdoG.js +12 -0
  212. package/studio/chunks/TrashPage-lhqLLdoG.js.br +0 -0
  213. package/studio/chunks/TrashPage-lhqLLdoG.js.gz +0 -0
  214. package/studio/chunks/VersionsPage-Cqy6UAp9.js +2349 -0
  215. package/studio/chunks/VersionsPage-Cqy6UAp9.js.br +0 -0
  216. package/studio/chunks/VersionsPage-Cqy6UAp9.js.gz +0 -0
  217. package/studio/chunks/VisuallyHiddenInput-Cu8hQLRf.js +113 -0
  218. package/studio/chunks/VisuallyHiddenInput-Cu8hQLRf.js.br +0 -0
  219. package/studio/chunks/VisuallyHiddenInput-Cu8hQLRf.js.gz +0 -0
  220. package/studio/chunks/arrays-CUJkmV4I.js +10 -0
  221. package/studio/chunks/arrays-CUJkmV4I.js.br +0 -0
  222. package/studio/chunks/arrays-CUJkmV4I.js.gz +0 -0
  223. package/studio/chunks/base-DkTekJe8.js +213 -0
  224. package/studio/chunks/base-DkTekJe8.js.br +0 -0
  225. package/studio/chunks/base-DkTekJe8.js.gz +0 -0
  226. package/studio/chunks/content-DUGl3N4d.js +6012 -0
  227. package/studio/chunks/content-DUGl3N4d.js.br +0 -0
  228. package/studio/chunks/content-DUGl3N4d.js.gz +0 -0
  229. package/studio/chunks/destinations-DPIQVQa6.js +227 -0
  230. package/studio/chunks/destinations-DPIQVQa6.js.br +0 -0
  231. package/studio/chunks/destinations-DPIQVQa6.js.gz +0 -0
  232. package/studio/chunks/en-073cjKW4.js +152 -0
  233. package/studio/chunks/en-073cjKW4.js.br +0 -0
  234. package/studio/chunks/en-073cjKW4.js.gz +0 -0
  235. package/studio/chunks/en-Bn8mxPuf.js +134 -0
  236. package/studio/chunks/en-Bn8mxPuf.js.br +0 -0
  237. package/studio/chunks/en-Bn8mxPuf.js.gz +0 -0
  238. package/studio/chunks/en-C9OiaUDZ.js +251 -0
  239. package/studio/chunks/en-C9OiaUDZ.js.br +0 -0
  240. package/studio/chunks/en-C9OiaUDZ.js.gz +0 -0
  241. package/studio/chunks/en-CHAR6jzx.js +147 -0
  242. package/studio/chunks/en-CHAR6jzx.js.br +0 -0
  243. package/studio/chunks/en-CHAR6jzx.js.gz +0 -0
  244. package/studio/chunks/en-Cq4N1vEF.js +93 -0
  245. package/studio/chunks/en-Cq4N1vEF.js.br +2 -0
  246. package/studio/chunks/en-Cq4N1vEF.js.gz +0 -0
  247. package/studio/chunks/en-D2hRqlse.js +140 -0
  248. package/studio/chunks/en-D2hRqlse.js.br +0 -0
  249. package/studio/chunks/en-D2hRqlse.js.gz +0 -0
  250. package/studio/chunks/en-DiUC3-j6.js +144 -0
  251. package/studio/chunks/en-DiUC3-j6.js.br +0 -0
  252. package/studio/chunks/en-DiUC3-j6.js.gz +0 -0
  253. package/studio/chunks/english-Cs_Adu-u.js +8 -0
  254. package/studio/chunks/english-Cs_Adu-u.js.br +0 -0
  255. package/studio/chunks/english-Cs_Adu-u.js.gz +0 -0
  256. package/studio/chunks/esm-D6DqSiL1.js +752 -0
  257. package/studio/chunks/esm-D6DqSiL1.js.br +0 -0
  258. package/studio/chunks/esm-D6DqSiL1.js.gz +0 -0
  259. package/studio/chunks/externalRequest-CTzr2nDq.js +23 -0
  260. package/studio/chunks/externalRequest-CTzr2nDq.js.br +0 -0
  261. package/studio/chunks/externalRequest-CTzr2nDq.js.gz +0 -0
  262. package/studio/chunks/iconify-DR9ryCPv.js +1007 -0
  263. package/studio/chunks/iconify-DR9ryCPv.js.br +0 -0
  264. package/studio/chunks/iconify-DR9ryCPv.js.gz +0 -0
  265. package/studio/chunks/icons-D2MsAaXq.js +183 -0
  266. package/studio/chunks/icons-D2MsAaXq.js.br +0 -0
  267. package/studio/chunks/icons-D2MsAaXq.js.gz +0 -0
  268. package/studio/chunks/leaveGuards-D22fTGgr.js +26 -0
  269. package/studio/chunks/leaveGuards-D22fTGgr.js.br +0 -0
  270. package/studio/chunks/leaveGuards-D22fTGgr.js.gz +0 -0
  271. package/studio/chunks/lucideIcons-EyqyPBsX.js +238 -0
  272. package/studio/chunks/lucideIcons-EyqyPBsX.js.br +0 -0
  273. package/studio/chunks/lucideIcons-EyqyPBsX.js.gz +0 -0
  274. package/studio/chunks/mediaRoute--8cY8rUe.js +17 -0
  275. package/studio/chunks/mediaRoute--8cY8rUe.js.br +0 -0
  276. package/studio/chunks/mediaRoute--8cY8rUe.js.gz +0 -0
  277. package/studio/chunks/newDocumentPlanning-C26DHpvh.js +77 -0
  278. package/studio/chunks/newDocumentPlanning-C26DHpvh.js.br +0 -0
  279. package/studio/chunks/newDocumentPlanning-C26DHpvh.js.gz +0 -0
  280. package/studio/chunks/notifications-OKOLc40v.js +110 -0
  281. package/studio/chunks/notifications-OKOLc40v.js.br +0 -0
  282. package/studio/chunks/notifications-OKOLc40v.js.gz +0 -0
  283. package/studio/chunks/operations-CjNHyrEX.js +57 -0
  284. package/studio/chunks/operations-CjNHyrEX.js.br +0 -0
  285. package/studio/chunks/operations-CjNHyrEX.js.gz +0 -0
  286. package/studio/chunks/overlay-DnqFLZTc.js +1733 -0
  287. package/studio/chunks/overlay-DnqFLZTc.js.br +0 -0
  288. package/studio/chunks/overlay-DnqFLZTc.js.gz +0 -0
  289. package/studio/chunks/presentation-DF83w0hE.js +57 -0
  290. package/studio/chunks/presentation-DF83w0hE.js.br +0 -0
  291. package/studio/chunks/presentation-DF83w0hE.js.gz +0 -0
  292. package/studio/chunks/runtime-core.esm-bundler-DKFA9Rep.js +4557 -0
  293. package/studio/chunks/runtime-core.esm-bundler-DKFA9Rep.js.br +0 -0
  294. package/studio/chunks/runtime-core.esm-bundler-DKFA9Rep.js.gz +0 -0
  295. package/studio/chunks/searchPresentation-DFwxQkt3.js +76 -0
  296. package/studio/chunks/searchPresentation-DFwxQkt3.js.br +0 -0
  297. package/studio/chunks/searchPresentation-DFwxQkt3.js.gz +0 -0
  298. package/studio/chunks/status-DQv6ihkU.js +38 -0
  299. package/studio/chunks/status-DQv6ihkU.js.br +0 -0
  300. package/studio/chunks/status-DQv6ihkU.js.gz +0 -0
  301. package/studio/chunks/studioContext-I8HozGU1.js +4953 -0
  302. package/studio/chunks/studioContext-I8HozGU1.js.br +0 -0
  303. package/studio/chunks/studioContext-I8HozGU1.js.gz +0 -0
  304. package/studio/chunks/studioQueries-BR-9NT5F.js +73 -0
  305. package/studio/chunks/studioQueries-BR-9NT5F.js.br +0 -0
  306. package/studio/chunks/studioQueries-BR-9NT5F.js.gz +0 -0
  307. package/studio/chunks/studioSearch-ByaL-QpM.js +1095 -0
  308. package/studio/chunks/studioSearch-ByaL-QpM.js.br +0 -0
  309. package/studio/chunks/studioSearch-ByaL-QpM.js.gz +0 -0
  310. package/studio/chunks/useAcknowledgedDraft-0_c9sWI6.js +62 -0
  311. package/studio/chunks/useAcknowledgedDraft-0_c9sWI6.js.br +0 -0
  312. package/studio/chunks/useAcknowledgedDraft-0_c9sWI6.js.gz +0 -0
  313. package/studio/chunks/useApi-CUWMwLLw-B3Q3g2nf.js +189 -0
  314. package/studio/chunks/useApi-CUWMwLLw-B3Q3g2nf.js.br +0 -0
  315. package/studio/chunks/useApi-CUWMwLLw-B3Q3g2nf.js.gz +0 -0
  316. package/studio/chunks/useDocumentMessage-BAWvc38w.js +16 -0
  317. package/studio/chunks/useDocumentMessage-BAWvc38w.js.br +3 -0
  318. package/studio/chunks/useDocumentMessage-BAWvc38w.js.gz +0 -0
  319. package/studio/chunks/useFilter-DzyiTR7f.js +87 -0
  320. package/studio/chunks/useFilter-DzyiTR7f.js.br +0 -0
  321. package/studio/chunks/useFilter-DzyiTR7f.js.gz +0 -0
  322. package/studio/chunks/useFormControl-CL7sSCUo.js +8 -0
  323. package/studio/chunks/useFormControl-CL7sSCUo.js.br +0 -0
  324. package/studio/chunks/useFormControl-CL7sSCUo.js.gz +0 -0
  325. package/studio/chunks/useGraceArea-Chcy25IQ.js +154 -0
  326. package/studio/chunks/useGraceArea-Chcy25IQ.js.br +0 -0
  327. package/studio/chunks/useGraceArea-Chcy25IQ.js.gz +0 -0
  328. package/studio/chunks/useLeaveConfirmation-_iCSnKEp.js +44 -0
  329. package/studio/chunks/useLeaveConfirmation-_iCSnKEp.js.br +8 -0
  330. package/studio/chunks/useLeaveConfirmation-_iCSnKEp.js.gz +0 -0
  331. package/studio/chunks/useLinkCopy-CMjQteCy.js +35 -0
  332. package/studio/chunks/useLinkCopy-CMjQteCy.js.br +0 -0
  333. package/studio/chunks/useLinkCopy-CMjQteCy.js.gz +0 -0
  334. package/studio/chunks/usePointerMotion-DwRcwBNQ.js +16 -0
  335. package/studio/chunks/usePointerMotion-DwRcwBNQ.js.br +0 -0
  336. package/studio/chunks/usePointerMotion-DwRcwBNQ.js.gz +0 -0
  337. package/studio/chunks/useStudioNavigation-CLwtSYpb.js +298 -0
  338. package/studio/chunks/useStudioNavigation-CLwtSYpb.js.br +0 -0
  339. package/studio/chunks/useStudioNavigation-CLwtSYpb.js.gz +0 -0
  340. package/studio/chunks/useStudioPages-DR9qmYLg.js +79 -0
  341. package/studio/chunks/useStudioPages-DR9qmYLg.js.br +0 -0
  342. package/studio/chunks/useStudioPages-DR9qmYLg.js.gz +0 -0
  343. package/studio/chunks/utils-mdScC0v0.js +59 -0
  344. package/studio/chunks/utils-mdScC0v0.js.br +0 -0
  345. package/studio/chunks/utils-mdScC0v0.js.gz +0 -0
  346. package/studio/chunks/virtualizer-D1S0bZ4t.js +781 -0
  347. package/studio/chunks/virtualizer-D1S0bZ4t.js.br +0 -0
  348. package/studio/chunks/virtualizer-D1S0bZ4t.js.gz +0 -0
  349. package/studio/help/64f767fe29c2-save-and-publish.svg +7 -0
  350. package/studio/host.css +1 -1
  351. package/studio/host.css.br +0 -0
  352. package/studio/host.css.gz +0 -0
  353. package/studio/host.js +8793 -39395
  354. package/studio/host.js.br +0 -0
  355. package/studio/host.js.gz +0 -0
  356. package/CHANGELOG.md +0 -14
  357. package/bin/cms.mjs +0 -2
  358. package/src/ApplicationTypes.d.ts +0 -84
  359. package/src/ApplicationTypes.js +0 -1
  360. package/src/Configuration-CMweD9bn.js +0 -1191
  361. package/src/Configuration-CMweD9bn.js.map +0 -1
  362. package/src/Configuration.d.ts +0 -82
  363. package/src/Configuration.js +0 -8
  364. package/src/Configuration.js.map +0 -1
  365. package/src/Content.d.ts +0 -68
  366. package/src/Content.js +0 -373
  367. package/src/Content.js.map +0 -1
  368. package/src/ContentTransfer-BxwswWn3.js +0 -86
  369. package/src/ContentTransfer-BxwswWn3.js.map +0 -1
  370. package/src/ContentTransfer-Z9FHyLez.d.ts +0 -72
  371. package/src/DocumentEngine-tYtwbBjr.js +0 -978
  372. package/src/DocumentEngine-tYtwbBjr.js.map +0 -1
  373. package/src/DocumentModel.d.ts +0 -52
  374. package/src/DocumentModel.js +0 -66
  375. package/src/DocumentModel.js.map +0 -1
  376. package/src/Forms-CX-hwmJF.js +0 -391
  377. package/src/Forms-CX-hwmJF.js.map +0 -1
  378. package/src/Forms-CfNPTiCr.js +0 -110
  379. package/src/Forms-CfNPTiCr.js.map +0 -1
  380. package/src/Forms-R0HoTR-o.d.ts +0 -92
  381. package/src/Forms.js.map +0 -1
  382. package/src/HttpPaths-Be3vshPJ.js +0 -20
  383. package/src/HttpPaths-Be3vshPJ.js.map +0 -1
  384. package/src/I18n-wxswIRyY.d.ts +0 -30
  385. package/src/Media-j1bTritO.js +0 -112
  386. package/src/Media-j1bTritO.js.map +0 -1
  387. package/src/Module.js.map +0 -1
  388. package/src/References-CCPDAPve.js +0 -45
  389. package/src/References-CCPDAPve.js.map +0 -1
  390. package/src/S3MediaObjects-BXfjaZOu.js +0 -2756
  391. package/src/S3MediaObjects-BXfjaZOu.js.map +0 -1
  392. package/src/Seo-402YumpT.d.ts +0 -198
  393. package/src/cli/content.js +0 -101
  394. package/src/cli/content.js.map +0 -1
  395. package/src/cli.js.map +0 -1
  396. package/src/connection-BP80q4d-.js +0 -92
  397. package/src/connection-BP80q4d-.js.map +0 -1
  398. package/src/dev-lifecycle-3I_pozUl.js +0 -535
  399. package/src/dev-lifecycle-3I_pozUl.js.map +0 -1
  400. package/src/installation-DxqSSVbH.js +0 -9105
  401. package/src/installation-DxqSSVbH.js.map +0 -1
  402. package/src/internal/application-types.js +0 -43
  403. package/src/internal/application-types.js.map +0 -1
  404. package/src/internal/authoring-catalog.js +0 -158
  405. package/src/internal/authoring-catalog.js.map +0 -1
  406. package/src/internal/authoring-compiler.js +0 -146
  407. package/src/internal/authoring-compiler.js.map +0 -1
  408. package/src/internal/authoring-metadata.js +0 -191
  409. package/src/internal/authoring-metadata.js.map +0 -1
  410. package/src/internal/cms-config.js +0 -45
  411. package/src/internal/cms-config.js.map +0 -1
  412. package/src/internal/configuration.js +0 -228
  413. package/src/internal/configuration.js.map +0 -1
  414. package/src/internal/dev-lifecycle.js +0 -3
  415. package/src/internal/diagnostics.js +0 -47
  416. package/src/internal/diagnostics.js.map +0 -1
  417. package/src/internal/document-model.js +0 -376
  418. package/src/internal/document-model.js.map +0 -1
  419. package/src/internal/field-metadata.js +0 -7
  420. package/src/internal/field-metadata.js.map +0 -1
  421. package/src/internal/form-capabilities.js +0 -12
  422. package/src/internal/form-capabilities.js.map +0 -1
  423. package/src/internal/i18n.js +0 -73
  424. package/src/internal/i18n.js.map +0 -1
  425. package/src/internal/studio-app.js +0 -68
  426. package/src/internal/studio-app.js.map +0 -1
  427. package/src/location-CMNGO3lU.js +0 -35
  428. package/src/location-CMNGO3lU.js.map +0 -1
  429. package/src/metadata-DN9_K6Yl.js +0 -201
  430. package/src/metadata-DN9_K6Yl.js.map +0 -1
  431. package/src/models-5j67LMqW.js +0 -131
  432. package/src/models-5j67LMqW.js.map +0 -1
  433. package/src/models-VmGmG19-.js +0 -628
  434. package/src/models-VmGmG19-.js.map +0 -1
  435. package/src/runtime/api.js.map +0 -1
  436. package/src/runtime/blocks.js +0 -30
  437. package/src/runtime/blocks.js.map +0 -1
  438. package/src/runtime/collaboration.js +0 -45
  439. package/src/runtime/collaboration.js.map +0 -1
  440. package/src/runtime/delivery/DocumentField.js +0 -23
  441. package/src/runtime/delivery/DocumentField.js.map +0 -1
  442. package/src/runtime/delivery/DocumentRenderer.js +0 -61
  443. package/src/runtime/delivery/DocumentRenderer.js.map +0 -1
  444. package/src/runtime/delivery/DocumentScope.js +0 -41
  445. package/src/runtime/delivery/DocumentScope.js.map +0 -1
  446. package/src/runtime/delivery/blocks.js +0 -8
  447. package/src/runtime/delivery/blocks.js.map +0 -1
  448. package/src/runtime/delivery/context.js +0 -12
  449. package/src/runtime/delivery/context.js.map +0 -1
  450. package/src/runtime/delivery/document-page.js +0 -21
  451. package/src/runtime/delivery/document-page.js.map +0 -1
  452. package/src/runtime/delivery/document.js +0 -43
  453. package/src/runtime/delivery/document.js.map +0 -1
  454. package/src/runtime/delivery/error.js +0 -11
  455. package/src/runtime/delivery/error.js.map +0 -1
  456. package/src/runtime/delivery/plugin.js +0 -104
  457. package/src/runtime/delivery/plugin.js.map +0 -1
  458. package/src/runtime/delivery/preview.d.ts +0 -11
  459. package/src/runtime/delivery/preview.js +0 -6
  460. package/src/runtime/delivery/preview.js.map +0 -1
  461. package/src/runtime/delivery/types.d.ts +0 -2
  462. package/src/runtime/delivery/types.js +0 -1
  463. package/src/runtime/delivery/useCmsDocumentSeo.d.ts +0 -67
  464. package/src/runtime/delivery/useCmsDocumentSeo.js.map +0 -1
  465. package/src/runtime/delivery/useDocument.d.ts +0 -6
  466. package/src/runtime/delivery/useDocument.js +0 -23
  467. package/src/runtime/delivery/useDocument.js.map +0 -1
  468. package/src/runtime/delivery/useDocumentQuery.d.ts +0 -7
  469. package/src/runtime/delivery/useDocumentQuery.js +0 -29
  470. package/src/runtime/delivery/useDocumentQuery.js.map +0 -1
  471. package/src/runtime/forms/document.js +0 -38
  472. package/src/runtime/forms/document.js.map +0 -1
  473. package/src/runtime/forms/useCmsForm.js +0 -257
  474. package/src/runtime/forms/useCmsForm.js.map +0 -1
  475. package/src/runtime/i18n/translator.js +0 -58
  476. package/src/runtime/i18n/translator.js.map +0 -1
  477. package/src/runtime/i18n/useCmsI18n.d.ts +0 -13
  478. package/src/runtime/i18n/useCmsI18n.js +0 -38
  479. package/src/runtime/i18n/useCmsI18n.js.map +0 -1
  480. package/src/runtime/installation.js +0 -3
  481. package/src/runtime/plugin.js.map +0 -1
  482. package/src/runtime/preview/CmsStudioPreviewMarker.js +0 -29
  483. package/src/runtime/preview/CmsStudioPreviewMarker.js.map +0 -1
  484. package/src/runtime/preview/comark-document.js +0 -37
  485. package/src/runtime/preview/comark-document.js.map +0 -1
  486. package/src/runtime/preview/connection.js +0 -3
  487. package/src/runtime/preview/controller.js +0 -265
  488. package/src/runtime/preview/controller.js.map +0 -1
  489. package/src/runtime/preview/crypto.js +0 -16
  490. package/src/runtime/preview/crypto.js.map +0 -1
  491. package/src/runtime/preview/overlay.js +0 -122
  492. package/src/runtime/preview/overlay.js.map +0 -1
  493. package/src/runtime/preview/plugin.client.js +0 -68
  494. package/src/runtime/preview/plugin.client.js.map +0 -1
  495. package/src/runtime/preview/preview.css +0 -91
  496. package/src/runtime/preview/protocol.d.ts +0 -16
  497. package/src/runtime/preview/protocol.js +0 -23
  498. package/src/runtime/preview/protocol.js.map +0 -1
  499. package/src/runtime/preview/regions.js +0 -142
  500. package/src/runtime/preview/regions.js.map +0 -1
  501. package/src/runtime/preview/store.js +0 -4
  502. package/src/runtime/sitemap-entries.js +0 -17
  503. package/src/runtime/sitemap-entries.js.map +0 -1
  504. package/src/runtime/sitemap.js +0 -23
  505. package/src/runtime/sitemap.js.map +0 -1
  506. package/src/runtime/studio-app.js +0 -17
  507. package/src/runtime/studio-app.js.map +0 -1
  508. package/src/runtime/studio-document.js +0 -46
  509. package/src/runtime/studio-document.js.map +0 -1
  510. package/src/runtime/studio-entry.js +0 -19
  511. package/src/runtime/studio-entry.js.map +0 -1
  512. package/src/runtime/studio-navigation.js +0 -11
  513. package/src/runtime/studio-navigation.js.map +0 -1
  514. package/src/scalars-CA6kyipS.d.ts +0 -7
  515. package/src/scalars-CVZqT3L0.js +0 -22
  516. package/src/scalars-CVZqT3L0.js.map +0 -1
  517. package/src/store-X1e1o_MF.js +0 -209
  518. package/src/store-X1e1o_MF.js.map +0 -1
  519. package/src/types-DZ0IV-Ow.d.ts +0 -101
  520. package/studio/CreateDocumentDialog-C4_JBo1w.js +0 -335
  521. package/studio/SelectMenu-wXqxymUw.js +0 -34045
  522. package/studio/collaboration-DcK2F6v9.js +0 -4566
  523. package/studio/editor-P2rB7Csp.js +0 -30128
  524. package/studio/rolldown-runtime-Dy4uBu1J.js +0 -11
package/src/Forms.js CHANGED
@@ -1,13 +1,348 @@
1
- import { validateFormCapabilities } from "./internal/form-capabilities.js";
2
- import { useCmsForm } from "./runtime/forms/useCmsForm.js";
3
-
1
+ import { r as FormCapabilities, s as FormResult, u as formAnswerKey } from "./contracts-rprW3ZOB.js";
2
+ import { t as validateFormValues } from "./answers-DcTg0Xv2.js";
3
+ import { a as encodePreviewSource, r as StudioFocusMessage } from "./PreviewFocus-C_EelZO5.js";
4
+ import { t as previewContextKey } from "./previewContext-dt3ZUh-w.js";
5
+ import { Result, Schema } from "effect";
6
+ import { computed, getCurrentInstance, inject, readonly, ref, shallowRef, toValue, useId, watch } from "vue";
7
+ import { tryOnScopeDispose, useEventListener } from "@vueuse/core";
8
+ //#region src/runtime/forms/internal/values.ts
9
+ function normalizeFormValue(field, input) {
10
+ if (field.type === "checkbox") return input === true;
11
+ if (field.type === "number") {
12
+ if (input === "" || input == null) return null;
13
+ const value = Schema.is(Schema.Finite)(input) || Schema.is(Schema.String)(input) ? Number(input) : NaN;
14
+ if (Number.isFinite(value)) return value;
15
+ return Schema.is(Schema.String)(input) ? input : null;
16
+ }
17
+ return Schema.is(Schema.String)(input) ? input : "";
18
+ }
19
+ function emptyFormValue(field) {
20
+ if (field.type === "checkbox") return false;
21
+ if (field.type === "number") return null;
22
+ return "";
23
+ }
24
+ //#endregion
25
+ //#region src/runtime/forms/internal/controls.ts
26
+ /** Keeps field normalization, validation feedback, and DOM bindings in one place. */
27
+ function useFormControls({ fields, currentStep, values, errors, touched, previewAttrs }) {
28
+ const fieldIdPrefix = getCurrentInstance() ? useId() : "cms-form";
29
+ const controls = /* @__PURE__ */ new Map();
30
+ function control(input) {
31
+ const fieldId = Schema.is(Schema.String)(input) ? input : input.id;
32
+ const existing = controls.get(fieldId);
33
+ if (existing) return existing;
34
+ if (!fields.value.some((candidate) => candidate.id === fieldId)) throw new Error(`Unknown CMS form field ${fieldId}.`);
35
+ const current = computed(() => {
36
+ const candidate = fields.value.find((field) => field.id === fieldId);
37
+ if (!candidate) throw new Error(`CMS form field ${fieldId} no longer exists.`);
38
+ return candidate;
39
+ });
40
+ const answerKey = computed(() => formAnswerKey(current.value));
41
+ const controlId = `${fieldIdPrefix}-${encodeURIComponent(fieldId)}`;
42
+ const helpId = `${controlId}-help`;
43
+ const errorId = `${controlId}-error`;
44
+ const helpAttrs = { id: helpId };
45
+ const errorAttrs = {
46
+ id: errorId,
47
+ role: "alert"
48
+ };
49
+ const refreshError = () => {
50
+ const issue = validateFormValues([current.value], values.value)[answerKey.value];
51
+ const nextErrors = { ...errors.value };
52
+ if (issue) nextErrors[answerKey.value] = issue;
53
+ else delete nextErrors[answerKey.value];
54
+ errors.value = nextErrors;
55
+ };
56
+ const value = computed({
57
+ get: () => values.value[answerKey.value] ?? emptyFormValue(current.value),
58
+ set: (next) => {
59
+ values.value[answerKey.value] = normalizeFormValue(current.value, next);
60
+ if (touched.value.has(fieldId) || errors.value[answerKey.value]) refreshError();
61
+ }
62
+ });
63
+ const dirty = computed(() => values.value[answerKey.value] !== emptyFormValue(current.value));
64
+ const touchedState = computed(() => touched.value.has(fieldId));
65
+ const valid = computed(() => !errors.value[answerKey.value] && validateFormValues([current.value], values.value)[answerKey.value] === void 0);
66
+ const error = computed(() => errors.value[answerKey.value]);
67
+ const attrs = computed(() => {
68
+ const fieldError = errors.value[answerKey.value];
69
+ const describedBy = [current.value.help ? helpId : void 0, fieldError ? errorId : void 0].filter((part) => part !== void 0).join(" ");
70
+ return {
71
+ id: controlId,
72
+ name: answerKey.value,
73
+ required: current.value.required === true,
74
+ "aria-invalid": fieldError ? "true" : void 0,
75
+ "aria-describedby": describedBy || void 0
76
+ };
77
+ });
78
+ const state = {
79
+ get field() {
80
+ return current.value;
81
+ },
82
+ get value() {
83
+ return value.value;
84
+ },
85
+ set value(next) {
86
+ value.value = next;
87
+ },
88
+ get dirty() {
89
+ return dirty.value;
90
+ },
91
+ get touched() {
92
+ return touchedState.value;
93
+ },
94
+ get valid() {
95
+ return valid.value;
96
+ },
97
+ get error() {
98
+ return error.value;
99
+ },
100
+ get attrs() {
101
+ return attrs.value;
102
+ },
103
+ get previewAttrs() {
104
+ return previewAttrs(current.value);
105
+ },
106
+ helpAttrs,
107
+ errorAttrs,
108
+ touch: () => {
109
+ touched.value = /* @__PURE__ */ new Set([...touched.value, fieldId]);
110
+ refreshError();
111
+ }
112
+ };
113
+ controls.set(fieldId, state);
114
+ return state;
115
+ }
116
+ const visibleControls = computed(() => currentStep.value?.fields.map((entry) => control(entry)) ?? []);
117
+ const invalidControls = computed(() => fields.value.map((entry) => control(entry)).filter((entry) => !entry.valid));
118
+ return {
119
+ control,
120
+ visibleControls,
121
+ invalidControls,
122
+ firstInvalidControlId: computed(() => invalidControls.value[0]?.attrs.id)
123
+ };
124
+ }
125
+ //#endregion
126
+ //#region src/runtime/forms/internal/preview.ts
127
+ function formPreviewTarget(definition, step, field) {
128
+ return {
129
+ kind: "blockField",
130
+ blockId: definition.blockId,
131
+ path: [
132
+ {
133
+ kind: "field",
134
+ name: "steps"
135
+ },
136
+ {
137
+ kind: "item",
138
+ id: step.id
139
+ },
140
+ ...field ? [{
141
+ kind: "field",
142
+ name: "fields"
143
+ }, {
144
+ kind: "item",
145
+ id: field.id
146
+ }] : []
147
+ ]
148
+ };
149
+ }
150
+ /** Select mode reveals authored questions without running visitor validation. */
151
+ function formPreviewStep(definition, target) {
152
+ if (!definition.preview || target.kind !== "blockField" || target.blockId !== definition.blockId || target.path[0]?.kind !== "field" || target.path[0].name !== "steps" || target.path[1]?.kind !== "item") return -1;
153
+ const stepId = target.path[1].id;
154
+ const index = definition.steps.findIndex((step) => step.id === stepId);
155
+ if (index < 0) return -1;
156
+ if (target.path.length === 2) return index;
157
+ if (target.path[2]?.kind !== "field" || target.path[2].name !== "fields" || target.path[3]?.kind !== "item") return -1;
158
+ const fieldId = target.path[3].id;
159
+ return definition.steps[index]?.fields.some((field) => field.id === fieldId) ? index : -1;
160
+ }
161
+ function useFormPreview(definition, stepIndex, isSuccess) {
162
+ const context = getCurrentInstance() ? inject(previewContextKey, null) : null;
163
+ if (typeof window !== "undefined" && context) useEventListener(window, "message", (event) => {
164
+ if (!context.interactive.value || event.origin !== window.location.origin || event.source !== window.parent || !Schema.is(StudioFocusMessage)(event.data) || event.data.documentId !== definition.value.documentId) return;
165
+ const index = formPreviewStep(definition.value, event.data.target);
166
+ if (index < 0) return;
167
+ stepIndex.value = index;
168
+ isSuccess.value = false;
169
+ });
170
+ return (step, field) => definition.value.preview ? { "data-cms-source": encodePreviewSource({
171
+ documentId: definition.value.documentId,
172
+ target: formPreviewTarget(definition.value, step, field),
173
+ approximate: false
174
+ }) } : {};
175
+ }
176
+ //#endregion
177
+ //#region src/runtime/forms/useCmsForm.ts
178
+ const CMS_FORM_SUBMIT_PATH = "/_cms/api/forms/submit";
179
+ /** Headless, per-instance form state. Definition changes preserve answers for unchanged field types. */
180
+ function useCmsForm(input, options = {}) {
181
+ const definition = computed(() => toValue(input));
182
+ const steps = computed(() => definition.value.steps);
183
+ const fields = computed(() => steps.value.flatMap((step) => step.fields));
184
+ const values = ref({});
185
+ const errors = shallowRef({});
186
+ const stepIndex = shallowRef(0);
187
+ const currentStep = computed(() => steps.value[stepIndex.value]);
188
+ const isFirstStep = computed(() => stepIndex.value === 0);
189
+ const isLastStep = computed(() => stepIndex.value === steps.value.length - 1);
190
+ const submitting = shallowRef(false);
191
+ const isSuccess = shallowRef(false);
192
+ const isPreview = computed(() => definition.value.preview);
193
+ const submitError = shallowRef();
194
+ const touched = shallowRef(/* @__PURE__ */ new Set());
195
+ let controller;
196
+ let generation = 0;
197
+ let previousFields = /* @__PURE__ */ new Map();
198
+ const previewAttrs = useFormPreview(definition, stepIndex, isSuccess);
199
+ const stepPreviewAttrs = computed(() => currentStep.value ? previewAttrs(currentStep.value) : {});
200
+ const { control, visibleControls, invalidControls, firstInvalidControlId } = useFormControls({
201
+ fields,
202
+ currentStep,
203
+ values,
204
+ errors,
205
+ touched,
206
+ previewAttrs: (field) => {
207
+ const step = steps.value.find((item) => item.fields.some((item) => item.id === field.id));
208
+ return step ? previewAttrs(step, field) : {};
209
+ }
210
+ });
211
+ const stop = watch(definition, (next, before) => {
212
+ generation++;
213
+ controller?.abort();
214
+ submitting.value = false;
215
+ const sameForm = before?.documentId === next.documentId && before.blockId === next.blockId && before.name === next.name;
216
+ values.value = Object.fromEntries(next.steps.flatMap((step) => step.fields).map((field) => [formAnswerKey(field), sameForm && previousFields.get(field.id)?.type === field.type ? values.value[previousFields.get(field.id)?.answerKey ?? field.id] ?? null : field.type === "checkbox" ? false : field.type === "number" ? null : ""]));
217
+ previousFields = new Map(next.steps.flatMap((step) => step.fields).map((field) => [field.id, field]));
218
+ stepIndex.value = Math.max(0, next.steps.findIndex((step) => step.id === before?.steps[stepIndex.value]?.id));
219
+ errors.value = {};
220
+ touched.value = /* @__PURE__ */ new Set();
221
+ submitError.value = void 0;
222
+ isSuccess.value = false;
223
+ }, {
224
+ immediate: true,
225
+ deep: true,
226
+ flush: "sync"
227
+ });
228
+ function validate() {
229
+ touched.value = new Set(fields.value.map((field) => field.id));
230
+ errors.value = validateFormValues(fields.value, values.value);
231
+ return Object.keys(errors.value).length === 0;
232
+ }
233
+ function next() {
234
+ if (submitting.value || isLastStep.value) return false;
235
+ const stepFields = currentStep.value?.fields ?? [];
236
+ touched.value = /* @__PURE__ */ new Set([...touched.value, ...stepFields.map((field) => field.id)]);
237
+ const issues = validateFormValues(stepFields, values.value);
238
+ errors.value = {
239
+ ...Object.fromEntries(Object.entries(errors.value).filter(([id]) => !stepFields.some((field) => formAnswerKey(field) === id))),
240
+ ...issues
241
+ };
242
+ if (Object.keys(issues).length) return false;
243
+ stepIndex.value++;
244
+ return true;
245
+ }
246
+ function previous() {
247
+ if (!submitting.value && !isFirstStep.value) stepIndex.value--;
248
+ }
249
+ function reset() {
250
+ generation++;
251
+ controller?.abort();
252
+ submitting.value = false;
253
+ values.value = Object.fromEntries(fields.value.map((field) => [formAnswerKey(field), emptyFormValue(field)]));
254
+ errors.value = {};
255
+ touched.value = /* @__PURE__ */ new Set();
256
+ submitError.value = void 0;
257
+ isSuccess.value = false;
258
+ stepIndex.value = 0;
259
+ }
260
+ async function submit() {
261
+ if (submitting.value || isSuccess.value) return false;
262
+ submitError.value = void 0;
263
+ if (!validate()) {
264
+ stepIndex.value = Math.max(0, steps.value.findIndex((step) => step.fields.some((field) => errors.value[formAnswerKey(field)])));
265
+ return false;
266
+ }
267
+ if (isPreview.value) {
268
+ isSuccess.value = true;
269
+ return true;
270
+ }
271
+ const currentGeneration = ++generation;
272
+ controller = new AbortController();
273
+ submitting.value = true;
274
+ try {
275
+ const { documentId, blockId, revision, locale } = definition.value;
276
+ const result = await (options.submit ?? send)({
277
+ documentId,
278
+ blockId,
279
+ revision,
280
+ locale,
281
+ values: { ...values.value }
282
+ }, controller.signal);
283
+ if (generation !== currentGeneration) return false;
284
+ errors.value = result.status === "invalid" ? { ...result.errors } : {};
285
+ isSuccess.value = result.status === "accepted";
286
+ if (result.status === "invalid") stepIndex.value = Math.max(0, steps.value.findIndex((step) => step.fields.some((field) => errors.value[formAnswerKey(field)])));
287
+ if (result.status !== "accepted" && result.status !== "invalid") submitError.value = result.status;
288
+ return isSuccess.value;
289
+ } catch {
290
+ if (generation === currentGeneration) submitError.value = "failed";
291
+ return false;
292
+ } finally {
293
+ if (generation === currentGeneration) submitting.value = false;
294
+ }
295
+ }
296
+ tryOnScopeDispose(() => {
297
+ generation++;
298
+ controller?.abort();
299
+ stop();
300
+ });
301
+ const canSubmit = computed(() => !submitting.value && !isSuccess.value && invalidControls.value.length === 0);
302
+ return {
303
+ fields,
304
+ steps,
305
+ values,
306
+ errors: readonly(errors),
307
+ currentStep,
308
+ stepIndex: readonly(stepIndex),
309
+ isFirstStep,
310
+ isLastStep,
311
+ submitting: readonly(submitting),
312
+ isSuccess: readonly(isSuccess),
313
+ isPreview,
314
+ submitError: readonly(submitError),
315
+ canSubmit,
316
+ visibleControls,
317
+ invalidControls,
318
+ firstInvalidControlId,
319
+ control,
320
+ stepPreviewAttrs,
321
+ next,
322
+ previous,
323
+ validate,
324
+ submit,
325
+ reset
326
+ };
327
+ }
328
+ async function send(submission, signal) {
329
+ const response = await fetch(CMS_FORM_SUBMIT_PATH, {
330
+ method: "POST",
331
+ headers: { "content-type": "application/json" },
332
+ body: JSON.stringify(submission),
333
+ signal
334
+ });
335
+ if (!response.ok) throw new Error("Submission failed.");
336
+ return Result.getOrThrow(Schema.decodeUnknownResult(FormResult)(await response.json()));
337
+ }
338
+ //#endregion
4
339
  //#region src/Forms.ts
5
- /** Register this definition under the kebab-case name of your Vue form renderer. */
340
+ /** Declare the question types and rules Studio may author for this block. */
6
341
  function defineCmsForm(definition) {
7
- validateFormCapabilities(definition);
342
+ Schema.decodeSync(FormCapabilities)(definition);
343
+ if (new Set(definition.fieldTypes).size !== definition.fieldTypes.length) throw new Error("Form question types must be unique.");
344
+ if (new Set(definition.rules).size !== definition.rules.length) throw new Error("Form rules must be unique.");
8
345
  return definition;
9
346
  }
10
-
11
347
  //#endregion
12
348
  export { defineCmsForm, useCmsForm };
13
- //# sourceMappingURL=Forms.js.map
@@ -0,0 +1,154 @@
1
+ //#region ../model/src/I18n.ts
2
+ /** Canonical language/script/region identity, excluding Unicode and private-use extensions. */
3
+ function canonicalLocale(locale) {
4
+ try {
5
+ return new Intl.Locale(locale).baseName;
6
+ } catch {
7
+ return;
8
+ }
9
+ }
10
+ /** A display name in an explicitly selected language, or the code when it cannot be named. */
11
+ function languageName(locale, displayLocale = locale) {
12
+ try {
13
+ return new Intl.DisplayNames(displayLocale, { type: "language" }).of(locale) ?? locale;
14
+ } catch {
15
+ return locale;
16
+ }
17
+ }
18
+ const rightToLeftScripts = /* @__PURE__ */ new Set([
19
+ "Adlm",
20
+ "Arab",
21
+ "Armi",
22
+ "Avst",
23
+ "Chrs",
24
+ "Cprt",
25
+ "Elym",
26
+ "Gara",
27
+ "Hatr",
28
+ "Hebr",
29
+ "Hung",
30
+ "Khar",
31
+ "Lydi",
32
+ "Mand",
33
+ "Mani",
34
+ "Mend",
35
+ "Merc",
36
+ "Mero",
37
+ "Narb",
38
+ "Nbat",
39
+ "Nkoo",
40
+ "Orkh",
41
+ "Ougr",
42
+ "Palm",
43
+ "Phli",
44
+ "Phlp",
45
+ "Phnx",
46
+ "Prti",
47
+ "Rohg",
48
+ "Samr",
49
+ "Sarb",
50
+ "Sidt",
51
+ "Sogd",
52
+ "Sogo",
53
+ "Syrc",
54
+ "Thaa",
55
+ "Yezi"
56
+ ]);
57
+ /** Derives text direction from Intl's likely script, without reading browser or application state. */
58
+ function localeDirection(locale) {
59
+ try {
60
+ const script = new Intl.Locale(locale).maximize().script;
61
+ return script && rightToLeftScripts.has(script) ? "rtl" : "ltr";
62
+ } catch {
63
+ return "ltr";
64
+ }
65
+ }
66
+ /**
67
+ * Matches preferred BCP 47 languages in order, using exact and progressively
68
+ * broader language ranges. Returns the caller's original supported locale code.
69
+ */
70
+ function matchLocale(preferred, supported, fallback) {
71
+ const available = supported.map((locale) => {
72
+ const canonical = canonicalLocale(locale);
73
+ if (!canonical) throw new RangeError(`Invalid supported locale "${locale}".`);
74
+ return {
75
+ locale,
76
+ canonical
77
+ };
78
+ });
79
+ const fallbackLocale = canonicalLocale(fallback);
80
+ const fallbackMatch = available.find((item) => item.canonical === fallbackLocale);
81
+ if (!fallbackMatch) throw new RangeError(`Fallback locale "${fallback}" must be supported.`);
82
+ for (const preference of preferred) {
83
+ let range = canonicalLocale(preference);
84
+ while (range) {
85
+ const match = available.find((item) => item.canonical === range) ?? available.find((item) => item.canonical.startsWith(`${range}-`));
86
+ if (match) return match.locale;
87
+ const separator = range.lastIndexOf("-");
88
+ range = separator === -1 ? void 0 : range.slice(0, separator);
89
+ }
90
+ }
91
+ return fallbackMatch.locale;
92
+ }
93
+ function parameterNames(message) {
94
+ const texts = typeof message === "string" ? [message] : Object.values(message);
95
+ const names = new Set(texts.flatMap((text) => [...text.matchAll(/\{([^{}]+)\}/gu)].map((match) => match[1] ?? "")));
96
+ if (typeof message !== "string") names.add("count");
97
+ return names;
98
+ }
99
+ /**
100
+ * Creates a stateless translator. The caller supplies locale for every message,
101
+ * so separate applications and concurrent server requests cannot share language state.
102
+ * Numeric values use the selected locale's number format; strings stay unchanged.
103
+ */
104
+ function createTranslator(base, options) {
105
+ const fallbackLocale = canonicalLocale(options.fallbackLocale);
106
+ if (!fallbackLocale) throw new RangeError(`Invalid fallback locale "${options.fallbackLocale}".`);
107
+ const catalogs = /* @__PURE__ */ new Map();
108
+ for (const [locale, catalog] of Object.entries(options.translations ?? {})) {
109
+ const canonical = canonicalLocale(locale);
110
+ if (!canonical) throw new RangeError(`Invalid translation locale "${locale}".`);
111
+ if (canonical === fallbackLocale || catalogs.has(canonical)) throw new RangeError(`Duplicate message locale "${locale}".`);
112
+ for (const [key, message] of Object.entries(catalog)) {
113
+ if (message === void 0) continue;
114
+ const original = base[key];
115
+ if (original === void 0) throw new RangeError(`Unknown translated message "${key}".`);
116
+ const expected = parameterNames(original);
117
+ const actual = parameterNames(message);
118
+ if (expected.size !== actual.size || [...expected].some((name) => !actual.has(name))) throw new RangeError(`Translated message "${key}" in "${locale}" must keep the base named values.`);
119
+ }
120
+ catalogs.set(canonical, catalog);
121
+ }
122
+ const supported = [fallbackLocale, ...catalogs.keys()];
123
+ return (locale, key, ...args) => {
124
+ const selectedLocale = locale === fallbackLocale || catalogs.has(locale) ? locale : matchLocale([locale], supported, fallbackLocale);
125
+ const translated = catalogs.get(selectedLocale)?.[key];
126
+ const message = translated ?? base[key];
127
+ if (message === void 0) throw new RangeError(`Unknown message "${key}".`);
128
+ const values = args[0];
129
+ let text;
130
+ if (typeof message === "string") text = message;
131
+ else {
132
+ const count = values?.count;
133
+ if (typeof count !== "number" || !Number.isFinite(count)) throw new TypeError(`Plural message "${key}" needs a finite numeric count.`);
134
+ const messageLocale = translated === void 0 ? fallbackLocale : selectedLocale;
135
+ text = message[new Intl.PluralRules(messageLocale).select(count)] ?? message.other;
136
+ }
137
+ return text.replace(/\{([^{}]+)\}/gu, (_match, name) => {
138
+ const value = values?.[name];
139
+ if (value === void 0) throw new TypeError(`Message "${key}" needs a value for "${name}".`);
140
+ return typeof value === "number" ? formatNumber(selectedLocale, value) : value;
141
+ });
142
+ };
143
+ }
144
+ function formatNumber(locale, value, options) {
145
+ return new Intl.NumberFormat(locale, options).format(value);
146
+ }
147
+ function formatDate(locale, value, options) {
148
+ return new Intl.DateTimeFormat(locale, options).format(value);
149
+ }
150
+ function formatRelativeTime(locale, value, unit, options) {
151
+ return new Intl.RelativeTimeFormat(locale, options).format(value, unit);
152
+ }
153
+ //#endregion
154
+ export { formatRelativeTime as a, matchLocale as c, formatNumber as i, createTranslator as n, languageName as o, formatDate as r, localeDirection as s, canonicalLocale as t };
package/src/I18n.d.ts CHANGED
@@ -1,2 +1,45 @@
1
- import { a as CmsMessageParameters, i as CmsMessageKey, n as CmsI18nRegistry, o as CmsMessages, r as CmsLocale, t as CmsI18nOptions } from "./I18n-wxswIRyY.js";
2
- export { CmsI18nOptions, CmsI18nRegistry, CmsLocale, CmsMessageKey, CmsMessageParameters, CmsMessages };
1
+ //#region ../model/src/I18n.d.ts
2
+ /** A message may select an Intl plural category. Every plural supplies an `other` form. */
3
+ type PluralMessage = Readonly<Partial<Record<Intl.LDMLPluralRule, string>> & {
4
+ other: string;
5
+ }>;
6
+ type Message = string | PluralMessage;
7
+ /** Flat, stable keys keep message identity independent from the displayed language. */
8
+ type MessageCatalog = Readonly<Record<string, Message>>;
9
+ type MessageKey<Catalog extends MessageCatalog> = Extract<keyof Catalog, string>;
10
+ type ParameterNames<Text extends string> = string extends Text ? never : Text extends `${string}{${infer Name}}${infer Rest}` ? Name | ParameterNames<Rest> : never;
11
+ type MessageText<Value extends Message> = Value extends string ? Value : Extract<Value[keyof Value], string>;
12
+ /** The base message defines named values. A plural always needs a numeric count. */
13
+ type MessageParameters<Value extends Message> = { readonly [Name in ParameterNames<MessageText<Value>> | (Value extends PluralMessage ? 'count' : never)]: Name extends 'count' ? number : string | number; };
14
+ type MessageArguments<Value extends Message> = keyof MessageParameters<Value> extends never ? [] : [values: MessageParameters<Value>];
15
+ /** Missing translated keys use the complete base message. */
16
+ type TranslationCatalog<Base extends MessageCatalog> = { readonly [Key in keyof Base]?: Base[Key] extends string ? string : PluralMessage; };
17
+ interface Translator<Catalog extends MessageCatalog> {
18
+ <Key extends MessageKey<Catalog>>(locale: string, key: Key, ...args: MessageArguments<Catalog[Key]>): string;
19
+ }
20
+ interface TranslatorOptions<Base extends MessageCatalog> {
21
+ readonly fallbackLocale: string;
22
+ readonly translations?: Readonly<Record<string, TranslationCatalog<Base>>>;
23
+ }
24
+ /** Canonical language/script/region identity, excluding Unicode and private-use extensions. */
25
+ export declare function canonicalLocale(locale: string): string | undefined;
26
+ /** A display name in an explicitly selected language, or the code when it cannot be named. */
27
+ export declare function languageName(locale: string, displayLocale?: string): string;
28
+ /** Derives text direction from Intl's likely script, without reading browser or application state. */
29
+ export declare function localeDirection(locale: string): 'ltr' | 'rtl';
30
+ /**
31
+ * Matches preferred BCP 47 languages in order, using exact and progressively
32
+ * broader language ranges. Returns the caller's original supported locale code.
33
+ */
34
+ export declare function matchLocale<const Supported extends readonly string[]>(preferred: readonly string[], supported: Supported, fallback: NoInfer<Supported[number]>): Supported[number];
35
+ /**
36
+ * Creates a stateless translator. The caller supplies locale for every message,
37
+ * so separate applications and concurrent server requests cannot share language state.
38
+ * Numeric values use the selected locale's number format; strings stay unchanged.
39
+ */
40
+ export declare function createTranslator<const Base extends MessageCatalog>(base: Base, options: TranslatorOptions<NoInfer<Base>>): Translator<Base>;
41
+ export declare function formatNumber(locale: string, value: number | bigint, options?: Intl.NumberFormatOptions): string;
42
+ export declare function formatDate(locale: string, value: Date | number, options?: Intl.DateTimeFormatOptions): string;
43
+ export declare function formatRelativeTime(locale: string, value: number, unit: Intl.RelativeTimeFormatUnit, options?: Intl.RelativeTimeFormatOptions): string;
44
+ //#endregion
45
+ export type { Message, MessageArguments, MessageCatalog, MessageKey, MessageParameters, PluralMessage, TranslationCatalog, Translator, TranslatorOptions };
package/src/I18n.js CHANGED
@@ -1 +1,2 @@
1
- export { };
1
+ import { a as formatRelativeTime, c as matchLocale, i as formatNumber, n as createTranslator, o as languageName, r as formatDate, s as localeDirection, t as canonicalLocale } from "./I18n-Ckf9h0rC.js";
2
+ export { canonicalLocale, createTranslator, formatDate, formatNumber, formatRelativeTime, languageName, localeDirection, matchLocale };
@@ -0,0 +1,110 @@
1
+ import { i as MediaId } from "./Media-DSyvd14o.js";
2
+ import { Schema } from "effect";
3
+ //#region ../model/src/Image.ts
4
+ const ImagePosition = Schema.Int.check(Schema.isBetween({
5
+ minimum: 0,
6
+ maximum: 100
7
+ }));
8
+ const ImageZoom = Schema.Finite.check(Schema.isBetween({
9
+ minimum: 1,
10
+ maximum: 3
11
+ }));
12
+ const ImagePlacement = Schema.Struct({
13
+ focalX: Schema.optionalKey(ImagePosition),
14
+ focalY: Schema.optionalKey(ImagePosition),
15
+ zoom: Schema.optionalKey(ImageZoom)
16
+ });
17
+ /** A framed image authored in a collection field or block property. */
18
+ const AuthoredImage = Schema.Struct({
19
+ kind: Schema.Literal("image"),
20
+ mediaId: Schema.String.check(Schema.isUUID()),
21
+ alt: Schema.optionalKey(Schema.String),
22
+ frame: Schema.optionalKey(Schema.Literals(["square", "wide"])),
23
+ ...ImagePlacement.fields
24
+ });
25
+ function imageAspectRatio(frame) {
26
+ return frame === "square" ? 1 : 16 / 9;
27
+ }
28
+ /** CSS placement shared by Studio's framed preview and published images. */
29
+ function imagePlacementStyle(placement) {
30
+ const x = placement.focalX ?? 50;
31
+ const y = placement.focalY ?? 50;
32
+ const zoom = placement.zoom ?? 1;
33
+ return {
34
+ objectFit: "cover",
35
+ objectPosition: `${x}% ${y}%`,
36
+ transform: `scale(${zoom}) translate(${(50 - x) * (zoom - 1) / zoom}%, ${(50 - y) * (zoom - 1) / zoom}%)`
37
+ };
38
+ }
39
+ const ImageDimension = Schema.Int.check(Schema.isBetween({
40
+ minimum: 1,
41
+ maximum: 4096
42
+ }));
43
+ const ImageQuality = Schema.Int.check(Schema.isBetween({
44
+ minimum: 1,
45
+ maximum: 100
46
+ }));
47
+ const ImageFit = Schema.Literals([
48
+ "contain",
49
+ "cover",
50
+ "fill",
51
+ "inside",
52
+ "outside"
53
+ ]);
54
+ const ImageFormat = Schema.Literals([
55
+ "avif",
56
+ "gif",
57
+ "jpeg",
58
+ "png",
59
+ "webp"
60
+ ]);
61
+ const ImageModifiers = Schema.Struct({
62
+ width: Schema.optionalKey(ImageDimension),
63
+ height: Schema.optionalKey(ImageDimension),
64
+ fit: Schema.optionalKey(ImageFit),
65
+ format: Schema.optionalKey(ImageFormat),
66
+ quality: Schema.optionalKey(ImageQuality)
67
+ });
68
+ function imagePath(id, modifiers = {}) {
69
+ const checked = Schema.decodeSync(ImageModifiers)(modifiers);
70
+ return `/_cms/image/${[
71
+ checked.width === void 0 ? void 0 : `w_${checked.width}`,
72
+ checked.height === void 0 ? void 0 : `h_${checked.height}`,
73
+ checked.fit === void 0 ? void 0 : `fit_${checked.fit}`,
74
+ checked.format === void 0 ? void 0 : `f_${checked.format}`,
75
+ checked.quality === void 0 ? void 0 : `q_${checked.quality}`
76
+ ].filter((operation) => operation !== void 0).join(",") || "_"}/${id}`;
77
+ }
78
+ function parseImagePath(pathname) {
79
+ const match = /^\/_cms\/image\/([^/]+)\/([^/]+)$/u.exec(pathname);
80
+ const operationPath = match?.[1];
81
+ const id = match?.[2];
82
+ if (!operationPath || !Schema.is(MediaId)(id)) return void 0;
83
+ const raw = {};
84
+ if (operationPath !== "_") for (const operation of operationPath.split(",")) {
85
+ const part = /^(w|h|fit|f|q)_([a-z0-9]+)$/u.exec(operation);
86
+ const name = part?.[1];
87
+ const value = part?.[2];
88
+ if (!name || !value) return void 0;
89
+ const key = {
90
+ w: "width",
91
+ h: "height",
92
+ fit: "fit",
93
+ f: "format",
94
+ q: "quality"
95
+ }[name];
96
+ if (!key || Object.hasOwn(raw, key)) return void 0;
97
+ raw[key] = [
98
+ "w",
99
+ "h",
100
+ "q"
101
+ ].includes(name) ? Number(value) : value;
102
+ }
103
+ if (!Schema.is(ImageModifiers)(raw)) return void 0;
104
+ return {
105
+ id,
106
+ modifiers: raw
107
+ };
108
+ }
109
+ //#endregion
110
+ export { imagePath as a, imageAspectRatio as i, ImagePosition as n, imagePlacementStyle as o, ImageZoom as r, parseImagePath as s, AuthoredImage as t };