emdash 1.1.0 → 1.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 (1571) hide show
  1. package/dist/action-token-SK8zyN7w.mjs +26 -0
  2. package/dist/action-token-SK8zyN7w.mjs.map +1 -0
  3. package/dist/activation-Dim4YMM7.mjs +387 -0
  4. package/dist/activation-Dim4YMM7.mjs.map +1 -0
  5. package/dist/adapters-F_xorvWv.d.mts +173 -0
  6. package/dist/adapters-F_xorvWv.d.mts.map +1 -0
  7. package/dist/allowed-origins-CEug-p0t.mjs +116 -0
  8. package/dist/allowed-origins-CEug-p0t.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +4 -4
  10. package/dist/api/route-utils.d.mts.map +1 -1
  11. package/dist/api/route-utils.mjs +48 -46
  12. package/dist/api/route-utils.mjs.map +1 -1
  13. package/dist/api/schemas/index.d.mts +2 -2
  14. package/dist/api/schemas/index.mjs +10 -10
  15. package/dist/api-D-7BNHoz.mjs +5025 -0
  16. package/dist/api-D-7BNHoz.mjs.map +1 -0
  17. package/dist/api-tokens-Bx38ZCQp.mjs +173 -0
  18. package/dist/api-tokens-Bx38ZCQp.mjs.map +1 -0
  19. package/dist/apply-T7ATgzCh.mjs +1702 -0
  20. package/dist/apply-T7ATgzCh.mjs.map +1 -0
  21. package/dist/approvals-D-m6wvGl.mjs +460 -0
  22. package/dist/approvals-D-m6wvGl.mjs.map +1 -0
  23. package/dist/artifact-fetch-DIh7iyOV.mjs +659 -0
  24. package/dist/artifact-fetch-DIh7iyOV.mjs.map +1 -0
  25. package/dist/artifacts-htGyfCSt.mjs +307 -0
  26. package/dist/artifacts-htGyfCSt.mjs.map +1 -0
  27. package/dist/astro/image-endpoint.d.mts.map +1 -1
  28. package/dist/astro/image-endpoint.mjs +26 -6
  29. package/dist/astro/image-endpoint.mjs.map +1 -1
  30. package/dist/astro/index.d.mts +14 -14
  31. package/dist/astro/index.d.mts.map +1 -1
  32. package/dist/astro/index.mjs +324 -23
  33. package/dist/astro/index.mjs.map +1 -1
  34. package/dist/astro/middleware/auth.d.mts +12 -12
  35. package/dist/astro/middleware/auth.d.mts.map +1 -1
  36. package/dist/astro/middleware/auth.mjs +18 -13
  37. package/dist/astro/middleware/auth.mjs.map +1 -1
  38. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  39. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  40. package/dist/astro/middleware/redirect.mjs +81 -46
  41. package/dist/astro/middleware/redirect.mjs.map +1 -1
  42. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  43. package/dist/astro/middleware/request-context.mjs +117 -56
  44. package/dist/astro/middleware/request-context.mjs.map +1 -1
  45. package/dist/astro/middleware/setup.mjs +1 -1
  46. package/dist/astro/middleware.d.mts +12 -12
  47. package/dist/astro/middleware.d.mts.map +1 -1
  48. package/dist/astro/middleware.mjs +145 -415
  49. package/dist/astro/middleware.mjs.map +1 -1
  50. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
  51. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
  52. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +7 -6
  53. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs.map +1 -1
  54. package/dist/astro/routes/api/admin/api-tokens/index.mjs +8 -7
  55. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
  57. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +16 -16
  58. package/dist/astro/routes/api/admin/byline-fields/index.mjs +16 -16
  59. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +16 -16
  60. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -21
  61. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -21
  63. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/bylines/index.mjs +22 -21
  65. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
  67. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  68. package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
  69. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  70. package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
  71. package/dist/astro/routes/api/admin/core-update.mjs +7 -7
  72. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  73. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  74. package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
  75. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +21 -21
  76. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +21 -21
  77. package/dist/astro/routes/api/admin/media-usage/progress.mjs +23 -22
  78. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  79. package/dist/astro/routes/api/admin/media-usage/repair.mjs +29 -28
  80. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  81. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +21 -21
  82. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +21 -21
  83. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  84. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  85. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  86. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  87. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -70
  88. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  90. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -69
  91. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +71 -70
  93. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +80 -79
  95. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/plugins/index.mjs +72 -70
  97. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +7 -7
  99. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -69
  100. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  101. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +79 -78
  102. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -69
  104. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +71 -70
  106. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +81 -80
  108. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +10 -10
  110. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  111. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +73 -72
  112. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  113. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  114. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -70
  115. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  116. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -69
  117. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  118. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +5 -5
  119. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -69
  120. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +7 -7
  122. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -69
  123. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  125. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +38 -37
  126. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +38 -37
  128. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +40 -39
  130. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  131. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +40 -39
  132. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  133. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +40 -39
  134. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  135. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +41 -40
  136. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  137. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +41 -40
  138. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  139. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +40 -39
  140. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  141. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +41 -40
  142. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  143. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +42 -41
  144. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  145. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +40 -39
  146. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  147. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +40 -39
  148. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  149. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +42 -41
  150. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  151. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +40 -39
  152. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  153. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +42 -41
  154. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  155. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +40 -39
  156. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  157. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +40 -39
  158. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  159. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +42 -41
  160. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  161. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +40 -39
  162. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  163. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +40 -39
  164. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  165. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +42 -41
  166. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  167. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
  168. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  169. package/dist/astro/routes/api/admin/users/_id_/index.mjs +14 -14
  170. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  171. package/dist/astro/routes/api/admin/users/index.mjs +14 -14
  172. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  173. package/dist/astro/routes/api/auth/handover.d.mts +8 -0
  174. package/dist/astro/routes/api/auth/handover.d.mts.map +1 -0
  175. package/dist/astro/routes/api/auth/handover.mjs +49 -0
  176. package/dist/astro/routes/api/auth/handover.mjs.map +1 -0
  177. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  178. package/dist/astro/routes/api/auth/invite/complete.mjs +19 -19
  179. package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
  180. package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
  181. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  182. package/dist/astro/routes/api/auth/magic-link/send.mjs +19 -18
  183. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  184. package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
  185. package/dist/astro/routes/api/auth/magic-link/verify.mjs +23 -17
  186. package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
  187. package/dist/astro/routes/api/auth/me.mjs +15 -15
  188. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  189. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
  190. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  191. package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
  192. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  193. package/dist/astro/routes/api/auth/passkey/options.d.mts.map +1 -1
  194. package/dist/astro/routes/api/auth/passkey/options.mjs +27 -20
  195. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  196. package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
  197. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
  198. package/dist/astro/routes/api/auth/passkey/verify.mjs +19 -19
  199. package/dist/astro/routes/api/auth/signup/complete.mjs +19 -19
  200. package/dist/astro/routes/api/auth/signup/request.mjs +18 -17
  201. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  202. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  203. package/dist/astro/routes/api/calendar.mjs +15 -15
  204. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
  205. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
  206. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  207. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
  208. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -17
  209. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  210. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +7 -10
  211. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  212. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +20 -17
  213. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
  214. package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts.map +1 -1
  215. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +7 -6
  216. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  217. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
  218. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +30 -29
  219. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  220. package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
  221. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -17
  222. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  223. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +35 -34
  224. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  225. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +35 -34
  226. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  227. package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts.map +1 -1
  228. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +7 -6
  229. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  230. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  231. package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
  232. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +19 -18
  233. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  234. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  235. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +31 -26
  236. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  237. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  238. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
  239. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -17
  240. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  241. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  242. package/dist/astro/routes/api/content/_collection_/_id_.mjs +27 -20
  243. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  244. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  245. package/dist/astro/routes/api/content/_collection_/index.mjs +18 -21
  246. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  247. package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
  248. package/dist/astro/routes/api/dashboard.d.mts.map +1 -1
  249. package/dist/astro/routes/api/dashboard.mjs +18 -12
  250. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  251. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  252. package/dist/astro/routes/api/dev/scheduled-tasks.d.mts +12 -0
  253. package/dist/astro/routes/api/dev/scheduled-tasks.d.mts.map +1 -0
  254. package/dist/astro/routes/api/dev/scheduled-tasks.mjs +140 -0
  255. package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -0
  256. package/dist/astro/routes/api/health.mjs +6 -6
  257. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  258. package/dist/astro/routes/api/import/probe.mjs +25 -23
  259. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  260. package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -1
  261. package/dist/astro/routes/api/import/wordpress/analyze.mjs +7 -20
  262. package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
  263. package/dist/astro/routes/api/import/wordpress/execute.d.mts +15 -14
  264. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  265. package/dist/astro/routes/api/import/wordpress/execute.mjs +36 -30
  266. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  267. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  268. package/dist/astro/routes/api/import/wordpress/media.mjs +17 -17
  269. package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -17
  270. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  271. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +8 -0
  272. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -1
  273. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +67 -31
  274. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -1
  275. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  276. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +27 -26
  277. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  278. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  279. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +26 -23
  280. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  281. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  282. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  283. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +63 -35
  284. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  285. package/dist/astro/routes/api/manifest.mjs +9 -6
  286. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  287. package/dist/astro/routes/api/mcp.mjs +135 -101
  288. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  289. package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -1
  290. package/dist/astro/routes/api/media/_id_/confirm.mjs +34 -18
  291. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  292. package/dist/astro/routes/api/media/_id_/replace.mjs +15 -15
  293. package/dist/astro/routes/api/media/_id_/upload.mjs +8 -8
  294. package/dist/astro/routes/api/media/_id_/usage.mjs +31 -30
  295. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  296. package/dist/astro/routes/api/media/_id_.mjs +29 -28
  297. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  298. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  299. package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
  300. package/dist/astro/routes/api/media/file/_...key_.mjs +45 -15
  301. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  302. package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
  303. package/dist/astro/routes/api/media/folders/index.mjs +16 -16
  304. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  305. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  306. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  307. package/dist/astro/routes/api/media/upload-url.mjs +40 -20
  308. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  309. package/dist/astro/routes/api/media.d.mts.map +1 -1
  310. package/dist/astro/routes/api/media.mjs +40 -29
  311. package/dist/astro/routes/api/media.mjs.map +1 -1
  312. package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
  313. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +19 -18
  314. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  315. package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
  316. package/dist/astro/routes/api/menus/_name_/items.mjs +18 -17
  317. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  318. package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
  319. package/dist/astro/routes/api/menus/_name_/reorder.mjs +18 -17
  320. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  321. package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
  322. package/dist/astro/routes/api/menus/_name_/translations.mjs +18 -17
  323. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  324. package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
  325. package/dist/astro/routes/api/menus/_name_.mjs +19 -18
  326. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  327. package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
  328. package/dist/astro/routes/api/menus/index.mjs +18 -17
  329. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  330. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  331. package/dist/astro/routes/api/oauth/device/authorize.mjs +8 -8
  332. package/dist/astro/routes/api/oauth/device/code.mjs +12 -11
  333. package/dist/astro/routes/api/oauth/device/code.mjs.map +1 -1
  334. package/dist/astro/routes/api/oauth/device/token.mjs +11 -10
  335. package/dist/astro/routes/api/oauth/device/token.mjs.map +1 -1
  336. package/dist/astro/routes/api/oauth/register.mjs +8 -7
  337. package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
  338. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  339. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  340. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  341. package/dist/astro/routes/api/openapi.json.mjs +22 -22
  342. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  343. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
  344. package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
  345. package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
  346. package/dist/astro/routes/api/redirects/_id_.d.mts.map +1 -1
  347. package/dist/astro/routes/api/redirects/_id_.mjs +32 -23
  348. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  349. package/dist/astro/routes/api/redirects/index.d.mts.map +1 -1
  350. package/dist/astro/routes/api/redirects/index.mjs +24 -21
  351. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  352. package/dist/astro/routes/api/relations/_id_/index.mjs +35 -34
  353. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  354. package/dist/astro/routes/api/relations/index.mjs +35 -34
  355. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  356. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  357. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +16 -16
  358. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -69
  359. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  360. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -69
  361. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  362. package/dist/astro/routes/api/schema/block-types/index.mjs +71 -69
  363. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  364. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +71 -69
  365. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  366. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -69
  367. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  368. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -69
  369. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  370. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -69
  371. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  372. package/dist/astro/routes/api/schema/collections/index.mjs +71 -69
  373. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  374. package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -69
  375. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  376. package/dist/astro/routes/api/schema/index.mjs +17 -16
  377. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  378. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -69
  379. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  380. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -69
  381. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  382. package/dist/astro/routes/api/search/enable.mjs +19 -18
  383. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  384. package/dist/astro/routes/api/search/index.mjs +18 -17
  385. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  386. package/dist/astro/routes/api/search/rebuild.mjs +19 -18
  387. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  388. package/dist/astro/routes/api/search/stats.mjs +9 -8
  389. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  390. package/dist/astro/routes/api/search/suggest.mjs +18 -17
  391. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  392. package/dist/astro/routes/api/sections/_slug_.mjs +18 -17
  393. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  394. package/dist/astro/routes/api/sections/index.mjs +18 -17
  395. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  396. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  397. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  398. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  399. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  400. package/dist/astro/routes/api/settings/domain-notify.d.mts +8 -0
  401. package/dist/astro/routes/api/settings/domain-notify.d.mts.map +1 -0
  402. package/dist/astro/routes/api/settings/domain-notify.mjs +125 -0
  403. package/dist/astro/routes/api/settings/domain-notify.mjs.map +1 -0
  404. package/dist/astro/routes/api/settings/domain.d.mts +9 -0
  405. package/dist/astro/routes/api/settings/domain.d.mts.map +1 -0
  406. package/dist/astro/routes/api/settings/domain.mjs +64 -0
  407. package/dist/astro/routes/api/settings/domain.mjs.map +1 -0
  408. package/dist/astro/routes/api/settings/email.mjs +6 -6
  409. package/dist/astro/routes/api/settings.d.mts.map +1 -1
  410. package/dist/astro/routes/api/settings.mjs +23 -20
  411. package/dist/astro/routes/api/settings.mjs.map +1 -1
  412. package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
  413. package/dist/astro/routes/api/setup/admin-verify.mjs +25 -21
  414. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  415. package/dist/astro/routes/api/setup/admin.mjs +18 -18
  416. package/dist/astro/routes/api/setup/dev-bypass.mjs +43 -41
  417. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  418. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  419. package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
  420. package/dist/astro/routes/api/setup/index.mjs +53 -47
  421. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  422. package/dist/astro/routes/api/setup/status.mjs +6 -6
  423. package/dist/astro/routes/api/site/domain-proof.d.mts +8 -0
  424. package/dist/astro/routes/api/site/domain-proof.d.mts.map +1 -0
  425. package/dist/astro/routes/api/site/domain-proof.mjs +35 -0
  426. package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -0
  427. package/dist/astro/routes/api/snapshot.mjs +8 -8
  428. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
  429. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +24 -22
  430. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  431. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
  432. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +24 -22
  433. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  434. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
  435. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -23
  436. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  437. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
  438. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +24 -22
  439. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  440. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -21
  441. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  442. package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
  443. package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -23
  444. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  445. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +35 -34
  446. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  447. package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
  448. package/dist/astro/routes/api/taxonomies/index.mjs +24 -22
  449. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  450. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  451. package/dist/astro/routes/api/typegen.mjs +6 -6
  452. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  453. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +18 -18
  454. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  455. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  456. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  457. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  458. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
  459. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +17 -16
  460. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  461. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
  462. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +21 -19
  463. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  464. package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
  465. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -18
  466. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  467. package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
  468. package/dist/astro/routes/api/widget-areas/_name_.mjs +10 -8
  469. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  470. package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
  471. package/dist/astro/routes/api/widget-areas/index.mjs +20 -18
  472. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  473. package/dist/astro/routes/api/widget-components.mjs +5 -5
  474. package/dist/astro/routes/robots.txt.d.mts.map +1 -1
  475. package/dist/astro/routes/robots.txt.mjs +38 -5
  476. package/dist/astro/routes/robots.txt.mjs.map +1 -1
  477. package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -1
  478. package/dist/astro/routes/sitemap-_collection_.xml.mjs +33 -11
  479. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
  480. package/dist/astro/routes/sitemap.xml.d.mts.map +1 -1
  481. package/dist/astro/routes/sitemap.xml.mjs +17 -11
  482. package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
  483. package/dist/astro/types.d.mts +32 -18
  484. package/dist/astro/types.d.mts.map +1 -1
  485. package/dist/audit-_gieLVGU.mjs +127 -0
  486. package/dist/audit-_gieLVGU.mjs.map +1 -0
  487. package/dist/auth/providers/github.d.mts +1 -1
  488. package/dist/auth/providers/google.d.mts +1 -1
  489. package/dist/auth/providers/microsoft.d.mts +1 -1
  490. package/dist/authoritative-records-CQlB3JzE.mjs +5183 -0
  491. package/dist/authoritative-records-CQlB3JzE.mjs.map +1 -0
  492. package/dist/authorize-DPFBGbE6.mjs +74 -0
  493. package/dist/authorize-DPFBGbE6.mjs.map +1 -0
  494. package/dist/backup-3FgVxiDJ.mjs +246 -0
  495. package/dist/backup-3FgVxiDJ.mjs.map +1 -0
  496. package/dist/block-types-CYcG56JB.mjs +132 -0
  497. package/dist/block-types-CYcG56JB.mjs.map +1 -0
  498. package/dist/block-values-gCX4HBSl.mjs +215 -0
  499. package/dist/block-values-gCX4HBSl.mjs.map +1 -0
  500. package/dist/byline-BR1qhyiw.mjs +909 -0
  501. package/dist/byline-BR1qhyiw.mjs.map +1 -0
  502. package/dist/byline-fields-4ClDC88c.mjs +123 -0
  503. package/dist/byline-fields-4ClDC88c.mjs.map +1 -0
  504. package/dist/byline-fields-BLXZnX7N.mjs +280 -0
  505. package/dist/byline-fields-BLXZnX7N.mjs.map +1 -0
  506. package/dist/bylines-CVOvRUL7.mjs +234 -0
  507. package/dist/bylines-CVOvRUL7.mjs.map +1 -0
  508. package/dist/bylines-DxOs9B7z.mjs +150 -0
  509. package/dist/bylines-DxOs9B7z.mjs.map +1 -0
  510. package/dist/cache-CEU9wo_h.mjs +151 -0
  511. package/dist/cache-CEU9wo_h.mjs.map +1 -0
  512. package/dist/canonical-BudtH-Fx.mjs +174 -0
  513. package/dist/canonical-BudtH-Fx.mjs.map +1 -0
  514. package/dist/capture-triggers-CT6dK9zd.mjs +362 -0
  515. package/dist/capture-triggers-CT6dK9zd.mjs.map +1 -0
  516. package/dist/challenge-store-C17BYx2-.mjs +51 -0
  517. package/dist/challenge-store-C17BYx2-.mjs.map +1 -0
  518. package/dist/checksum-CEqvfxGX.mjs +162 -0
  519. package/dist/checksum-CEqvfxGX.mjs.map +1 -0
  520. package/dist/chunks-xC4UD5-S.mjs +25 -0
  521. package/dist/chunks-xC4UD5-S.mjs.map +1 -0
  522. package/dist/cli/index.mjs +134 -118
  523. package/dist/cli/index.mjs.map +1 -1
  524. package/dist/client/cf-access.d.mts +1 -1
  525. package/dist/client/index.d.mts +122 -122
  526. package/dist/client/index.d.mts.map +1 -1
  527. package/dist/client/index.mjs +12 -10
  528. package/dist/client/index.mjs.map +1 -1
  529. package/dist/collection-slugs-cache-e09QeJQt.mjs +85 -0
  530. package/dist/collection-slugs-cache-e09QeJQt.mjs.map +1 -0
  531. package/dist/comment-UvIWDKcW.mjs +325 -0
  532. package/dist/comment-UvIWDKcW.mjs.map +1 -0
  533. package/dist/comment-reaction-dGp6_FRo.mjs +85 -0
  534. package/dist/comment-reaction-dGp6_FRo.mjs.map +1 -0
  535. package/dist/comments-pej-_BUO.mjs +195 -0
  536. package/dist/comments-pej-_BUO.mjs.map +1 -0
  537. package/dist/comments-yiRFx3w5.mjs +99 -0
  538. package/dist/comments-yiRFx3w5.mjs.map +1 -0
  539. package/dist/components-Brp__9xo.mjs +112 -0
  540. package/dist/components-Brp__9xo.mjs.map +1 -0
  541. package/dist/config-Bsm_u_oE.d.mts +6799 -0
  542. package/dist/config-Bsm_u_oE.d.mts.map +1 -0
  543. package/dist/config-CFMojMFK.d.mts +39 -0
  544. package/dist/config-CFMojMFK.d.mts.map +1 -0
  545. package/dist/config-DBU6iUQB.mjs +228 -0
  546. package/dist/config-DBU6iUQB.mjs.map +1 -0
  547. package/dist/connection-BtEN_lP9.mjs +36 -0
  548. package/dist/connection-BtEN_lP9.mjs.map +1 -0
  549. package/dist/content-DQSRZTVw.mjs +2075 -0
  550. package/dist/content-DQSRZTVw.mjs.map +1 -0
  551. package/dist/content-list-query-CYKcY6Vi.d.mts +26 -0
  552. package/dist/content-list-query-CYKcY6Vi.d.mts.map +1 -0
  553. package/dist/content-repair-DNh5--x5.mjs +442 -0
  554. package/dist/content-repair-DNh5--x5.mjs.map +1 -0
  555. package/dist/context-BYptmCN0.mjs +2090 -0
  556. package/dist/context-BYptmCN0.mjs.map +1 -0
  557. package/dist/credits-B9iORdWB.mjs +110 -0
  558. package/dist/credits-B9iORdWB.mjs.map +1 -0
  559. package/dist/cron-D7obTIfk.mjs +306 -0
  560. package/dist/cron-D7obTIfk.mjs.map +1 -0
  561. package/dist/dashboard-D0jcgBD7.mjs +167 -0
  562. package/dist/dashboard-D0jcgBD7.mjs.map +1 -0
  563. package/dist/database/migration-lock.d.mts +17 -4
  564. package/dist/database/migration-lock.d.mts.map +1 -1
  565. package/dist/database/migration-lock.mjs +32 -5
  566. package/dist/database/migration-lock.mjs.map +1 -1
  567. package/dist/db/index.d.mts +3 -3
  568. package/dist/db/index.mjs +1 -1
  569. package/dist/db/libsql-migrations.d.mts +1 -1
  570. package/dist/db/libsql-migrations.mjs +4 -4
  571. package/dist/db/libsql.d.mts +1 -1
  572. package/dist/db/postgres-migrations.d.mts +1 -1
  573. package/dist/db/postgres-migrations.mjs +4 -4
  574. package/dist/db/postgres.d.mts +1 -1
  575. package/dist/db/sqlite-migrations.d.mts +1 -1
  576. package/dist/db/sqlite-migrations.mjs +4 -4
  577. package/dist/db/sqlite.d.mts +1 -1
  578. package/dist/db/sqlite.mjs +1 -1
  579. package/dist/default-C0W-PhAp.mjs +81 -0
  580. package/dist/default-C0W-PhAp.mjs.map +1 -0
  581. package/dist/deferred-tasks-ZvUECSzI.d.mts +9 -0
  582. package/dist/deferred-tasks-ZvUECSzI.d.mts.map +1 -0
  583. package/dist/dev-typegen-EBni_pOQ.mjs +29 -0
  584. package/dist/dev-typegen-EBni_pOQ.mjs.map +1 -0
  585. package/dist/device-flow-BkFKBoAn.mjs +521 -0
  586. package/dist/device-flow-BkFKBoAn.mjs.map +1 -0
  587. package/dist/digest-DJ1tHCgy.mjs +194 -0
  588. package/dist/digest-DJ1tHCgy.mjs.map +1 -0
  589. package/dist/direct-executor-Cbxzg4qe.mjs +117 -0
  590. package/dist/direct-executor-Cbxzg4qe.mjs.map +1 -0
  591. package/dist/email-console-FFVJWb9N.mjs +50 -0
  592. package/dist/email-console-FFVJWb9N.mjs.map +1 -0
  593. package/dist/email-locale-BJ8DjTzZ.mjs +25 -0
  594. package/dist/email-locale-BJ8DjTzZ.mjs.map +1 -0
  595. package/dist/emdash-runtime-DVi7vtXC.mjs +4379 -0
  596. package/dist/emdash-runtime-DVi7vtXC.mjs.map +1 -0
  597. package/dist/entry-lock-C7VX0NGK.d.mts +4568 -0
  598. package/dist/entry-lock-C7VX0NGK.d.mts.map +1 -0
  599. package/dist/entry-lock-DLxCffFW.mjs +163 -0
  600. package/dist/entry-lock-DLxCffFW.mjs.map +1 -0
  601. package/dist/entry-lock-Df6-XhIu.mjs +1211 -0
  602. package/dist/entry-lock-Df6-XhIu.mjs.map +1 -0
  603. package/dist/env-types-C3FCVBWe.mjs +38 -0
  604. package/dist/env-types-C3FCVBWe.mjs.map +1 -0
  605. package/dist/error-CVWeIOku.mjs +90 -0
  606. package/dist/error-CVWeIOku.mjs.map +1 -0
  607. package/dist/errors-B4f4It-2.mjs +120 -0
  608. package/dist/errors-B4f4It-2.mjs.map +1 -0
  609. package/dist/errors-BOYNdIo3.mjs +479 -0
  610. package/dist/errors-BOYNdIo3.mjs.map +1 -0
  611. package/dist/escape-lsNq38PP.mjs +9 -0
  612. package/dist/escape-lsNq38PP.mjs.map +1 -0
  613. package/dist/fence-C3MUitUN.mjs +162 -0
  614. package/dist/fence-C3MUitUN.mjs.map +1 -0
  615. package/dist/field-defs-cache-Dez5iWJJ.mjs +77 -0
  616. package/dist/field-defs-cache-Dez5iWJJ.mjs.map +1 -0
  617. package/dist/field-map-Bft9LKak.mjs +83 -0
  618. package/dist/field-map-Bft9LKak.mjs.map +1 -0
  619. package/dist/fts-manager-Beg3e4bI.mjs +443 -0
  620. package/dist/fts-manager-Beg3e4bI.mjs.map +1 -0
  621. package/dist/gc-ByyAYiYE.mjs +75 -0
  622. package/dist/gc-ByyAYiYE.mjs.map +1 -0
  623. package/dist/hash-BJaeek87.mjs +37 -0
  624. package/dist/hash-BJaeek87.mjs.map +1 -0
  625. package/dist/hook-result-BrdLyOdI.d.mts +31 -0
  626. package/dist/hook-result-BrdLyOdI.d.mts.map +1 -0
  627. package/dist/hreflang-C8Jb-hrf.mjs +105 -0
  628. package/dist/hreflang-C8Jb-hrf.mjs.map +1 -0
  629. package/dist/hreflang-CY_F5OjF.d.mts +50 -0
  630. package/dist/hreflang-CY_F5OjF.d.mts.map +1 -0
  631. package/dist/http-route-dispatch-CyeW6iPv.mjs +342 -0
  632. package/dist/http-route-dispatch-CyeW6iPv.mjs.map +1 -0
  633. package/dist/identity-Cael5uTT.mjs +35 -0
  634. package/dist/identity-Cael5uTT.mjs.map +1 -0
  635. package/dist/import-BUXjdZUn.mjs +2126 -0
  636. package/dist/import-BUXjdZUn.mjs.map +1 -0
  637. package/dist/index-BB9sVisO.d.mts +623 -0
  638. package/dist/index-BB9sVisO.d.mts.map +1 -0
  639. package/dist/index.d.mts +24 -24
  640. package/dist/index.mjs +97 -95
  641. package/dist/install-finalization-3JX5qQEA.mjs +58 -0
  642. package/dist/install-finalization-3JX5qQEA.mjs.map +1 -0
  643. package/dist/json-recordset-BUjxhr77.mjs +12 -0
  644. package/dist/json-recordset-BUjxhr77.mjs.map +1 -0
  645. package/dist/json-schema-v_D_pPNG.mjs +15 -0
  646. package/dist/json-schema-v_D_pPNG.mjs.map +1 -0
  647. package/dist/keys-CifIkT0N.mjs +61 -0
  648. package/dist/keys-CifIkT0N.mjs.map +1 -0
  649. package/dist/kinds-B_Qcl5pz.mjs +974 -0
  650. package/dist/kinds-B_Qcl5pz.mjs.map +1 -0
  651. package/dist/lifecycle-7vUJeFRe.mjs +25 -0
  652. package/dist/lifecycle-7vUJeFRe.mjs.map +1 -0
  653. package/dist/load-CdAG9wz-.mjs +28 -0
  654. package/dist/load-CdAG9wz-.mjs.map +1 -0
  655. package/dist/loader-CswroUbe.mjs +1380 -0
  656. package/dist/loader-CswroUbe.mjs.map +1 -0
  657. package/dist/loops-uA4iTOzd.mjs +205 -0
  658. package/dist/loops-uA4iTOzd.mjs.map +1 -0
  659. package/dist/manifest-builder-B8zjuH3f.mjs +189 -0
  660. package/dist/manifest-builder-B8zjuH3f.mjs.map +1 -0
  661. package/dist/manifest-schema-DNb4XmTS.mjs +497 -0
  662. package/dist/manifest-schema-DNb4XmTS.mjs.map +1 -0
  663. package/dist/marketplace-CqbgeIa7.mjs +257 -0
  664. package/dist/marketplace-CqbgeIa7.mjs.map +1 -0
  665. package/dist/media/image-endpoint.d.mts +26 -2
  666. package/dist/media/image-endpoint.d.mts.map +1 -1
  667. package/dist/media/image-endpoint.mjs +73 -3
  668. package/dist/media/image-endpoint.mjs.map +1 -1
  669. package/dist/media/index.d.mts +1 -1
  670. package/dist/media/local-runtime.d.mts +14 -14
  671. package/dist/media/local-runtime.mjs +10 -5
  672. package/dist/media/local-runtime.mjs.map +1 -1
  673. package/dist/media--dJRU6i2.mjs +294 -0
  674. package/dist/media--dJRU6i2.mjs.map +1 -0
  675. package/dist/media-1WC65OCB.mjs +416 -0
  676. package/dist/media-1WC65OCB.mjs.map +1 -0
  677. package/dist/media-Bws9f18T.mjs +373 -0
  678. package/dist/media-Bws9f18T.mjs.map +1 -0
  679. package/dist/media-allowlist-BJB7MFx6.mjs +45 -0
  680. package/dist/media-allowlist-BJB7MFx6.mjs.map +1 -0
  681. package/dist/media-folders-Dn3C16B8.mjs +210 -0
  682. package/dist/media-folders-Dn3C16B8.mjs.map +1 -0
  683. package/dist/media-url-BQgKvpQ5.mjs +43 -0
  684. package/dist/media-url-BQgKvpQ5.mjs.map +1 -0
  685. package/dist/media-usage-CF0WVcLO.mjs +282 -0
  686. package/dist/media-usage-CF0WVcLO.mjs.map +1 -0
  687. package/dist/media-usage-activation-C9HwVw5w.mjs +78 -0
  688. package/dist/media-usage-activation-C9HwVw5w.mjs.map +1 -0
  689. package/dist/media-usage-work-CkLa5-nc.mjs +1036 -0
  690. package/dist/media-usage-work-CkLa5-nc.mjs.map +1 -0
  691. package/dist/media-usage-work-m3AWTmmC.mjs +151 -0
  692. package/dist/media-usage-work-m3AWTmmC.mjs.map +1 -0
  693. package/dist/menus-BCVSSp1z.mjs +753 -0
  694. package/dist/menus-BCVSSp1z.mjs.map +1 -0
  695. package/dist/menus-BSzwObhV.mjs +92 -0
  696. package/dist/menus-BSzwObhV.mjs.map +1 -0
  697. package/dist/menus-Cl4kwdt7.mjs +3721 -0
  698. package/dist/menus-Cl4kwdt7.mjs.map +1 -0
  699. package/dist/migrations/index.d.mts +1 -1
  700. package/dist/migrations/index.d.mts.map +1 -1
  701. package/dist/migrations/index.mjs +3 -3
  702. package/dist/mode-C-D3qICy.mjs +23 -0
  703. package/dist/mode-C-D3qICy.mjs.map +1 -0
  704. package/dist/node-sqlite-compat-CrKzRr0J.mjs +63 -0
  705. package/dist/node-sqlite-compat-CrKzRr0J.mjs.map +1 -0
  706. package/dist/oauth-authorization-TpEJrYB7.mjs +274 -0
  707. package/dist/oauth-authorization-TpEJrYB7.mjs.map +1 -0
  708. package/dist/oauth-clients-BT0Pg-MO.mjs +266 -0
  709. package/dist/oauth-clients-BT0Pg-MO.mjs.map +1 -0
  710. package/dist/oauth-state-store-CHMn_mwc.mjs +50 -0
  711. package/dist/oauth-state-store-CHMn_mwc.mjs.map +1 -0
  712. package/dist/oauth-user-lookup-BDgF6IVG.mjs +26 -0
  713. package/dist/oauth-user-lookup-BDgF6IVG.mjs.map +1 -0
  714. package/dist/object-cache/memory.d.mts +1 -1
  715. package/dist/options-DJWaq3Ie.d.mts +81 -0
  716. package/dist/options-DJWaq3Ie.d.mts.map +1 -0
  717. package/dist/ownership-MiyA7qKO.mjs +12 -0
  718. package/dist/ownership-MiyA7qKO.mjs.map +1 -0
  719. package/dist/page/index.d.mts +2 -2
  720. package/dist/page/index.mjs +9 -4
  721. package/dist/page/index.mjs.map +1 -1
  722. package/dist/parse-CWHOFc6z.d.mts +176 -0
  723. package/dist/parse-CWHOFc6z.d.mts.map +1 -0
  724. package/dist/parse-DgQ2NABT.mjs +81 -0
  725. package/dist/parse-DgQ2NABT.mjs.map +1 -0
  726. package/dist/passkey-config-D0kdzEao.mjs +46 -0
  727. package/dist/passkey-config-D0kdzEao.mjs.map +1 -0
  728. package/dist/paths-biDzFTY2.mjs +77 -0
  729. package/dist/paths-biDzFTY2.mjs.map +1 -0
  730. package/dist/patterns-CMNnYCgf.mjs +159 -0
  731. package/dist/patterns-CMNnYCgf.mjs.map +1 -0
  732. package/dist/placeholder-D41vk11_.d.mts +306 -0
  733. package/dist/placeholder-D41vk11_.d.mts.map +1 -0
  734. package/dist/plan-CCoqxNoU.mjs +135 -0
  735. package/dist/plan-CCoqxNoU.mjs.map +1 -0
  736. package/dist/plugin-test-runtime.d.mts +14 -14
  737. package/dist/plugin-test-runtime.d.mts.map +1 -1
  738. package/dist/plugin-test-runtime.mjs +110 -108
  739. package/dist/plugin-tool-name-DDUgN_0p.mjs +27 -0
  740. package/dist/plugin-tool-name-DDUgN_0p.mjs.map +1 -0
  741. package/dist/plugin-types.d.mts +2 -2
  742. package/dist/plugin-utils.d.mts +12 -12
  743. package/dist/plugin-utils.mjs +1 -1
  744. package/dist/plugin-utils.mjs.map +1 -1
  745. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  746. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  747. package/dist/plugins/adapt-sandbox-entry.mjs +9 -8
  748. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  749. package/dist/plugins/host.d.mts +5 -5
  750. package/dist/plugins/host.mjs +46 -42
  751. package/dist/plugins-COJ2L49n.mjs +261 -0
  752. package/dist/plugins-COJ2L49n.mjs.map +1 -0
  753. package/dist/policy-DLQ--Hnm.mjs +45 -0
  754. package/dist/policy-DLQ--Hnm.mjs.map +1 -0
  755. package/dist/portable-text-BH4zgkSm.mjs +311 -0
  756. package/dist/portable-text-BH4zgkSm.mjs.map +1 -0
  757. package/dist/preview-DLexxwp3.mjs +107 -0
  758. package/dist/preview-DLexxwp3.mjs.map +1 -0
  759. package/dist/protocol-79kUO7jP.d.mts +65 -0
  760. package/dist/protocol-79kUO7jP.d.mts.map +1 -0
  761. package/dist/public-plugin-api-routes-BuAMJ8nN.mjs +316 -0
  762. package/dist/public-plugin-api-routes-BuAMJ8nN.mjs.map +1 -0
  763. package/dist/public-submission-Di3TsgzX.mjs +251 -0
  764. package/dist/public-submission-Di3TsgzX.mjs.map +1 -0
  765. package/dist/public-url-Bt98vysr.mjs +101 -0
  766. package/dist/public-url-Bt98vysr.mjs.map +1 -0
  767. package/dist/query-CpnRlBh8.mjs +1156 -0
  768. package/dist/query-CpnRlBh8.mjs.map +1 -0
  769. package/dist/query-haKvLAWl.mjs +41 -0
  770. package/dist/query-haKvLAWl.mjs.map +1 -0
  771. package/dist/range-CYfeXgGK.mjs +51 -0
  772. package/dist/range-CYfeXgGK.mjs.map +1 -0
  773. package/dist/rate-limit-Xp4d0NBY.mjs +127 -0
  774. package/dist/rate-limit-Xp4d0NBY.mjs.map +1 -0
  775. package/dist/receipt-BUsQCOeM.mjs +43 -0
  776. package/dist/receipt-BUsQCOeM.mjs.map +1 -0
  777. package/dist/redirect-CQAV7mCo.mjs +19 -0
  778. package/dist/redirect-CQAV7mCo.mjs.map +1 -0
  779. package/dist/redirect-DiS_3mA4.mjs +423 -0
  780. package/dist/redirect-DiS_3mA4.mjs.map +1 -0
  781. package/dist/redirect-paths-CNYq7w80.mjs +36 -0
  782. package/dist/redirect-paths-CNYq7w80.mjs.map +1 -0
  783. package/dist/redirects-BEVSRMa2.mjs +148 -0
  784. package/dist/redirects-BEVSRMa2.mjs.map +1 -0
  785. package/dist/redirects-BHpy-VsZ.mjs +446 -0
  786. package/dist/redirects-BHpy-VsZ.mjs.map +1 -0
  787. package/dist/registry/testing.mjs +3 -3
  788. package/dist/registry-TUVaid9Z.mjs +8369 -0
  789. package/dist/registry-TUVaid9Z.mjs.map +1 -0
  790. package/dist/relations-CA_QuMTU.mjs +776 -0
  791. package/dist/relations-CA_QuMTU.mjs.map +1 -0
  792. package/dist/request-context.d.mts +1 -1
  793. package/dist/request-meta-bwZ_NsvU.mjs +141 -0
  794. package/dist/request-meta-bwZ_NsvU.mjs.map +1 -0
  795. package/dist/resolve-DwNM-CXl.mjs +101 -0
  796. package/dist/resolve-DwNM-CXl.mjs.map +1 -0
  797. package/dist/revision-BVp8S0e_.mjs +374 -0
  798. package/dist/revision-BVp8S0e_.mjs.map +1 -0
  799. package/dist/route-cache-QSOyDEw0.mjs +20 -0
  800. package/dist/route-cache-QSOyDEw0.mjs.map +1 -0
  801. package/dist/route-wire-Ca_HWCZ5.mjs +197 -0
  802. package/dist/route-wire-Ca_HWCZ5.mjs.map +1 -0
  803. package/dist/routes-BerZFrvV.mjs +272 -0
  804. package/dist/routes-BerZFrvV.mjs.map +1 -0
  805. package/dist/runner-BObHz5FC.d.mts +68 -0
  806. package/dist/runner-BObHz5FC.d.mts.map +1 -0
  807. package/dist/runner-C5NeAkBQ.mjs +6595 -0
  808. package/dist/runner-C5NeAkBQ.mjs.map +1 -0
  809. package/dist/runtime.d.mts +13 -13
  810. package/dist/runtime.mjs +3 -2
  811. package/dist/runtime.mjs.map +1 -1
  812. package/dist/schema/project-env-types.mjs +40 -36
  813. package/dist/schema/project-env-types.mjs.map +1 -1
  814. package/dist/schema-C4OBuv6Z.mjs +13 -0
  815. package/dist/schema-C4OBuv6Z.mjs.map +1 -0
  816. package/dist/schema-DJRfvM_o.mjs +815 -0
  817. package/dist/schema-DJRfvM_o.mjs.map +1 -0
  818. package/dist/scopes-BU03K7Uo.mjs +34 -0
  819. package/dist/scopes-BU03K7Uo.mjs.map +1 -0
  820. package/dist/search-DfVzks89.mjs +450 -0
  821. package/dist/search-DfVzks89.mjs.map +1 -0
  822. package/dist/sections-BMy4JVUz.mjs +346 -0
  823. package/dist/sections-BMy4JVUz.mjs.map +1 -0
  824. package/dist/seed/index.d.mts +2 -2
  825. package/dist/seed/index.mjs +38 -34
  826. package/dist/seo/index.d.mts +3 -3
  827. package/dist/seo/index.mjs +25 -21
  828. package/dist/seo/index.mjs.map +1 -1
  829. package/dist/seo-ClB-dw9w.mjs +188 -0
  830. package/dist/seo-ClB-dw9w.mjs.map +1 -0
  831. package/dist/seo-VZYOEy8f.mjs +133 -0
  832. package/dist/seo-VZYOEy8f.mjs.map +1 -0
  833. package/dist/service-Bo_usgSk.mjs +150 -0
  834. package/dist/service-Bo_usgSk.mjs.map +1 -0
  835. package/dist/session-user-DlpPdf8L.mjs +61 -0
  836. package/dist/session-user-DlpPdf8L.mjs.map +1 -0
  837. package/dist/settings-CWb84sDm.mjs +452 -0
  838. package/dist/settings-CWb84sDm.mjs.map +1 -0
  839. package/dist/settings-DS914jjE.mjs +66 -0
  840. package/dist/settings-DS914jjE.mjs.map +1 -0
  841. package/dist/settings-Dd1uivmQ.mjs +73 -0
  842. package/dist/settings-Dd1uivmQ.mjs.map +1 -0
  843. package/dist/setup-complete-BuNxAUiN.mjs +65 -0
  844. package/dist/setup-complete-BuNxAUiN.mjs.map +1 -0
  845. package/dist/setup-nonce-BnEAX0iy.mjs +25 -0
  846. package/dist/setup-nonce-BnEAX0iy.mjs.map +1 -0
  847. package/dist/site-domain-Bq5j5bVg.mjs +131 -0
  848. package/dist/site-domain-Bq5j5bVg.mjs.map +1 -0
  849. package/dist/site-settings-DRHfX7bq.mjs +50 -0
  850. package/dist/site-settings-DRHfX7bq.mjs.map +1 -0
  851. package/dist/site-url-MB685I5X.mjs +45 -0
  852. package/dist/site-url-MB685I5X.mjs.map +1 -0
  853. package/dist/sitemap-name-BTg2NJJv.mjs +26 -0
  854. package/dist/sitemap-name-BTg2NJJv.mjs.map +1 -0
  855. package/dist/slug-aVnUV4SL.mjs +16 -0
  856. package/dist/slug-aVnUV4SL.mjs.map +1 -0
  857. package/dist/slugify-bu2-jKia.mjs +22 -0
  858. package/dist/slugify-bu2-jKia.mjs.map +1 -0
  859. package/dist/snapshot-DYsG4uOq.mjs +414 -0
  860. package/dist/snapshot-DYsG4uOq.mjs.map +1 -0
  861. package/dist/ssrf-BcYjyM4M.mjs +406 -0
  862. package/dist/ssrf-BcYjyM4M.mjs.map +1 -0
  863. package/dist/stage-D8DWgPcO.mjs +662 -0
  864. package/dist/stage-D8DWgPcO.mjs.map +1 -0
  865. package/dist/staged-CD_imitH.mjs +686 -0
  866. package/dist/staged-CD_imitH.mjs.map +1 -0
  867. package/dist/state-CFbGZziM.mjs +178 -0
  868. package/dist/state-CFbGZziM.mjs.map +1 -0
  869. package/dist/status-BFNdxzKc.mjs +30 -0
  870. package/dist/status-BFNdxzKc.mjs.map +1 -0
  871. package/dist/storage/local.d.mts +2 -2
  872. package/dist/storage/local.d.mts.map +1 -1
  873. package/dist/storage/local.mjs +12 -5
  874. package/dist/storage/local.mjs.map +1 -1
  875. package/dist/storage/s3.d.mts +4 -2
  876. package/dist/storage/s3.d.mts.map +1 -1
  877. package/dist/storage/s3.mjs +56 -9
  878. package/dist/storage/s3.mjs.map +1 -1
  879. package/dist/storage-query-DRyu3bSU.d.mts +1615 -0
  880. package/dist/storage-query-DRyu3bSU.d.mts.map +1 -0
  881. package/dist/tar-DFjExb9X.mjs +449 -0
  882. package/dist/tar-DFjExb9X.mjs.map +1 -0
  883. package/dist/target-CWZs2-o6.mjs +27 -0
  884. package/dist/target-CWZs2-o6.mjs.map +1 -0
  885. package/dist/taxonomies-ChnU7Mc8.mjs +697 -0
  886. package/dist/taxonomies-ChnU7Mc8.mjs.map +1 -0
  887. package/dist/taxonomies-Dd9JJv_a.mjs +939 -0
  888. package/dist/taxonomies-Dd9JJv_a.mjs.map +1 -0
  889. package/dist/taxonomy-C_C_LBAU.mjs +550 -0
  890. package/dist/taxonomy-C_C_LBAU.mjs.map +1 -0
  891. package/dist/tokens-BnhSnGwJ.mjs +171 -0
  892. package/dist/tokens-BnhSnGwJ.mjs.map +1 -0
  893. package/dist/transfer-ClH6w6BV.mjs +8873 -0
  894. package/dist/transfer-ClH6w6BV.mjs.map +1 -0
  895. package/dist/transfer-WmWiR3xf.mjs +166 -0
  896. package/dist/transfer-WmWiR3xf.mjs.map +1 -0
  897. package/dist/transfer-download--ofRj9Cw.mjs +33 -0
  898. package/dist/transfer-download--ofRj9Cw.mjs.map +1 -0
  899. package/dist/transformations-Bx4lYY0Y.mjs +196 -0
  900. package/dist/transformations-Bx4lYY0Y.mjs.map +1 -0
  901. package/dist/transport-BjbqNiPI.mjs +136 -0
  902. package/dist/transport-BjbqNiPI.mjs.map +1 -0
  903. package/dist/transport-DxiXnbXk.d.mts +42 -0
  904. package/dist/transport-DxiXnbXk.d.mts.map +1 -0
  905. package/dist/trusted-proxy-BU3Nx9g1.mjs +51 -0
  906. package/dist/trusted-proxy-BU3Nx9g1.mjs.map +1 -0
  907. package/dist/turnstile-CJwvsOqw.mjs +58 -0
  908. package/dist/turnstile-CJwvsOqw.mjs.map +1 -0
  909. package/dist/types-BA3ey2QH.d.mts +87 -0
  910. package/dist/types-BA3ey2QH.d.mts.map +1 -0
  911. package/dist/types-Bwpzb5o6.d.mts +227 -0
  912. package/dist/types-Bwpzb5o6.d.mts.map +1 -0
  913. package/dist/types-CNB-dj6F.d.mts +289 -0
  914. package/dist/types-CNB-dj6F.d.mts.map +1 -0
  915. package/dist/types-CgfFGfO5.mjs +16 -0
  916. package/dist/types-CgfFGfO5.mjs.map +1 -0
  917. package/dist/types-D2NEXtgB.mjs +127 -0
  918. package/dist/types-D2NEXtgB.mjs.map +1 -0
  919. package/dist/types-DCFavOii.d.mts +916 -0
  920. package/dist/types-DCFavOii.d.mts.map +1 -0
  921. package/dist/types-DHO7Pd25.d.mts +366 -0
  922. package/dist/types-DHO7Pd25.d.mts.map +1 -0
  923. package/dist/types-DvqVxZXa.d.mts +125 -0
  924. package/dist/types-DvqVxZXa.d.mts.map +1 -0
  925. package/dist/types-QoPHm-2w.d.mts +1741 -0
  926. package/dist/types-QoPHm-2w.d.mts.map +1 -0
  927. package/dist/types-RLgeIpnF.d.mts +374 -0
  928. package/dist/types-RLgeIpnF.d.mts.map +1 -0
  929. package/dist/types-qHVygneX.mjs +77 -0
  930. package/dist/types-qHVygneX.mjs.map +1 -0
  931. package/dist/types-sUHaH7lC.mjs +37 -0
  932. package/dist/types-sUHaH7lC.mjs.map +1 -0
  933. package/dist/types-slSqujQL.d.mts +204 -0
  934. package/dist/types-slSqujQL.d.mts.map +1 -0
  935. package/dist/update-check-BxNg9T6N.mjs +161 -0
  936. package/dist/update-check-BxNg9T6N.mjs.map +1 -0
  937. package/dist/upload-attempts-DPFC4COv.mjs +32 -0
  938. package/dist/upload-attempts-DPFC4COv.mjs.map +1 -0
  939. package/dist/url-pattern-QATUE_rv.mjs +41 -0
  940. package/dist/url-pattern-QATUE_rv.mjs.map +1 -0
  941. package/dist/user-BlCTKVAm.mjs +171 -0
  942. package/dist/user-BlCTKVAm.mjs.map +1 -0
  943. package/dist/utils-TPt7w2cS.mjs +442 -0
  944. package/dist/utils-TPt7w2cS.mjs.map +1 -0
  945. package/dist/validate-DxYhJQA-.mjs +524 -0
  946. package/dist/validate-DxYhJQA-.mjs.map +1 -0
  947. package/dist/validate-emKxGC5F.d.mts +468 -0
  948. package/dist/validate-emKxGC5F.d.mts.map +1 -0
  949. package/dist/validation-Ckq4vsVg.mjs +220 -0
  950. package/dist/validation-Ckq4vsVg.mjs.map +1 -0
  951. package/dist/version-BZj18Q7G.mjs +9 -0
  952. package/dist/version-BZj18Q7G.mjs.map +1 -0
  953. package/dist/version-DHmGpcch.mjs +7 -0
  954. package/dist/version-DHmGpcch.mjs.map +1 -0
  955. package/dist/video-DytCnw3L.mjs +54 -0
  956. package/dist/video-DytCnw3L.mjs.map +1 -0
  957. package/dist/virtual-modules-DO954n7P.mjs +515 -0
  958. package/dist/virtual-modules-DO954n7P.mjs.map +1 -0
  959. package/dist/widgets-DA5XmvVC.mjs +121 -0
  960. package/dist/widgets-DA5XmvVC.mjs.map +1 -0
  961. package/dist/wxr-taxonomies-CrMonejI.d.mts +34 -0
  962. package/dist/wxr-taxonomies-CrMonejI.d.mts.map +1 -0
  963. package/dist/wxr-taxonomies-RgRG0d5e.mjs +453 -0
  964. package/dist/wxr-taxonomies-RgRG0d5e.mjs.map +1 -0
  965. package/dist/zod-generator-D0JKy94C.mjs +424 -0
  966. package/dist/zod-generator-D0JKy94C.mjs.map +1 -0
  967. package/package.json +15 -11
  968. package/src/api/authorize.ts +42 -0
  969. package/src/api/errors.ts +9 -0
  970. package/src/api/handlers/api-tokens.ts +12 -6
  971. package/src/api/handlers/content.ts +57 -8
  972. package/src/api/handlers/dashboard.ts +33 -10
  973. package/src/api/handlers/domain-move-notice.ts +94 -0
  974. package/src/api/handlers/index.ts +2 -0
  975. package/src/api/handlers/manifest.ts +6 -0
  976. package/src/api/handlers/media-usage.ts +2 -1
  977. package/src/api/handlers/media.ts +1 -0
  978. package/src/api/handlers/plugins.ts +1 -0
  979. package/src/api/handlers/revision.ts +6 -2
  980. package/src/api/handlers/seo.ts +155 -59
  981. package/src/api/handlers/settings.ts +31 -1
  982. package/src/api/handlers/site-domain.ts +159 -0
  983. package/src/api/openapi/document.ts +2 -2
  984. package/src/api/public-url.ts +1 -1
  985. package/src/api/schemas/content.ts +20 -0
  986. package/src/api/schemas/media-usage.ts +7 -1
  987. package/src/api/schemas/media.ts +12 -0
  988. package/src/api/schemas/settings.ts +2 -0
  989. package/src/api/site-url.ts +53 -5
  990. package/src/api/types.ts +4 -0
  991. package/src/astro/image-endpoint.ts +46 -4
  992. package/src/astro/integration/admin-locales.ts +168 -0
  993. package/src/astro/integration/dev-env.ts +84 -0
  994. package/src/astro/integration/dev-scheduler-bridge.ts +91 -0
  995. package/src/astro/integration/index.ts +97 -10
  996. package/src/astro/integration/routes.ts +28 -0
  997. package/src/astro/integration/runtime.ts +17 -1
  998. package/src/astro/integration/virtual-modules.ts +9 -16
  999. package/src/astro/integration/vite-config.ts +22 -16
  1000. package/src/astro/middleware/auth.ts +19 -4
  1001. package/src/astro/middleware/csp.ts +1 -0
  1002. package/src/astro/middleware/redirect.ts +94 -50
  1003. package/src/astro/middleware/request-context.ts +12 -6
  1004. package/src/astro/middleware.ts +71 -17
  1005. package/src/astro/prefetch.ts +7 -5
  1006. package/src/astro/public-plugin-api-routes.ts +10 -2
  1007. package/src/astro/routes/api/admin/plugins/registry/artifact.ts +1 -1
  1008. package/src/astro/routes/api/auth/handover.ts +58 -0
  1009. package/src/astro/routes/api/auth/magic-link/verify.ts +11 -3
  1010. package/src/astro/routes/api/auth/passkey/options.ts +10 -2
  1011. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -1
  1012. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +1 -5
  1013. package/src/astro/routes/api/content/[collection]/[id]/lock.ts +2 -2
  1014. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -1
  1015. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
  1016. package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -1
  1017. package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +3 -2
  1018. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +5 -4
  1019. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -1
  1020. package/src/astro/routes/api/content/[collection]/[id].ts +18 -6
  1021. package/src/astro/routes/api/content/[collection]/index.ts +1 -5
  1022. package/src/astro/routes/api/dashboard.ts +4 -1
  1023. package/src/astro/routes/api/dev/scheduled-tasks.ts +20 -0
  1024. package/src/astro/routes/api/import/wordpress/analyze.ts +1 -16
  1025. package/src/astro/routes/api/import/wordpress/execute.ts +27 -3
  1026. package/src/astro/routes/api/import/wordpress/rewrite-url-helpers.ts +80 -42
  1027. package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +4 -1
  1028. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +49 -5
  1029. package/src/astro/routes/api/manifest.ts +10 -0
  1030. package/src/astro/routes/api/media/[id]/confirm.ts +19 -0
  1031. package/src/astro/routes/api/media/file/[...key].ts +60 -12
  1032. package/src/astro/routes/api/media/upload-url.ts +28 -4
  1033. package/src/astro/routes/api/media.ts +15 -0
  1034. package/src/astro/routes/api/menus/[name]/items/[id].ts +3 -2
  1035. package/src/astro/routes/api/menus/[name]/items.ts +2 -1
  1036. package/src/astro/routes/api/menus/[name]/reorder.ts +2 -1
  1037. package/src/astro/routes/api/menus/[name]/translations.ts +2 -1
  1038. package/src/astro/routes/api/menus/[name].ts +3 -2
  1039. package/src/astro/routes/api/menus/index.ts +2 -1
  1040. package/src/astro/routes/api/redirects/[id].ts +15 -2
  1041. package/src/astro/routes/api/redirects/index.ts +5 -1
  1042. package/src/astro/routes/api/schema/index.ts +1 -1
  1043. package/src/astro/routes/api/settings/domain-notify.ts +76 -0
  1044. package/src/astro/routes/api/settings/domain.ts +64 -0
  1045. package/src/astro/routes/api/settings.ts +2 -1
  1046. package/src/astro/routes/api/setup/admin-verify.ts +7 -1
  1047. package/src/astro/routes/api/setup/index.ts +7 -0
  1048. package/src/astro/routes/api/site/domain-proof.ts +28 -0
  1049. package/src/astro/routes/api/taxonomies/[name]/reorder.ts +2 -1
  1050. package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +2 -1
  1051. package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +3 -2
  1052. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +2 -1
  1053. package/src/astro/routes/api/taxonomies/[name].ts +3 -2
  1054. package/src/astro/routes/api/taxonomies/index.ts +2 -1
  1055. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +2 -1
  1056. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +3 -2
  1057. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +2 -1
  1058. package/src/astro/routes/api/widget-areas/[name].ts +2 -1
  1059. package/src/astro/routes/api/widget-areas/index.ts +2 -1
  1060. package/src/astro/routes/robots.txt.ts +33 -2
  1061. package/src/astro/routes/sitemap-[collection].xml.ts +31 -8
  1062. package/src/astro/routes/sitemap.xml.ts +12 -10
  1063. package/src/astro/types.ts +23 -2
  1064. package/src/auth/rate-limit.ts +18 -13
  1065. package/src/auth/types.ts +11 -4
  1066. package/src/aws-sdk.d.ts +2 -1
  1067. package/src/cache/redirect-paths.ts +56 -0
  1068. package/src/cache/route-cache.ts +22 -0
  1069. package/src/cleanup.ts +26 -0
  1070. package/src/cli/commands/export-seed.ts +2 -0
  1071. package/src/cli/commands/import/wordpress.ts +3 -27
  1072. package/src/cli/commands/login.ts +35 -43
  1073. package/src/cli/commands/migrate.ts +36 -4
  1074. package/src/cli/commands/seed.ts +23 -12
  1075. package/src/cli/wxr/parser.ts +2 -2
  1076. package/src/client/index.ts +18 -3
  1077. package/src/client/portable-text.ts +21 -7
  1078. package/src/comments/public-submission.ts +15 -8
  1079. package/src/comments/query.ts +8 -2
  1080. package/src/components/CommentForm.astro +50 -10
  1081. package/src/components/Comments.astro +51 -29
  1082. package/src/components/EmDashImage.astro +6 -4
  1083. package/src/components/Gallery.astro +4 -3
  1084. package/src/components/Image.astro +4 -3
  1085. package/src/components/InlinePortableTextEditor.tsx +269 -1320
  1086. package/src/components/Video.astro +100 -0
  1087. package/src/components/index.ts +4 -1
  1088. package/src/components/inline-block-types.ts +278 -0
  1089. package/src/components/inline-bubble-menu.tsx +696 -0
  1090. package/src/components/inline-code-block.tsx +8 -0
  1091. package/src/components/inline-editor-ui.tsx +1192 -0
  1092. package/src/components/inline-image.tsx +722 -0
  1093. package/src/components/inline-media-picker.tsx +1221 -0
  1094. package/src/components/inline-slash-menu.tsx +556 -0
  1095. package/src/components/webmcp-search.ts +15 -19
  1096. package/src/components/widgets/RecentPosts.astro +57 -17
  1097. package/src/content/converters/mark-safety.ts +3 -3
  1098. package/src/content/converters/portable-text-identity.ts +1 -0
  1099. package/src/content/converters/portable-text-to-prosemirror.ts +7 -0
  1100. package/src/content/converters/prosemirror-to-portable-text.ts +16 -0
  1101. package/src/content/converters/types.ts +22 -0
  1102. package/src/content/converters/video.ts +77 -0
  1103. package/src/database/collection-cleanup.ts +30 -0
  1104. package/src/database/datetime-storage.ts +337 -60
  1105. package/src/database/migration-lock.ts +43 -7
  1106. package/src/database/migrations/runner.ts +13 -1
  1107. package/src/database/repositories/comment.ts +17 -3
  1108. package/src/database/repositories/content.ts +25 -4
  1109. package/src/database/repositories/plugin-storage.ts +137 -27
  1110. package/src/database/repositories/redirect.ts +24 -2
  1111. package/src/database/repositories/revision.ts +24 -6
  1112. package/src/database/repositories/taxonomy.ts +61 -46
  1113. package/src/database/repositories/types.ts +67 -7
  1114. package/src/emdash-runtime.ts +393 -228
  1115. package/src/import/index.ts +1 -0
  1116. package/src/import/registry.ts +17 -0
  1117. package/src/import/sources/wordpress-plugin.ts +154 -11
  1118. package/src/import/types.ts +3 -0
  1119. package/src/import/utils.ts +7 -3
  1120. package/src/index.ts +3 -0
  1121. package/src/loader.ts +170 -45
  1122. package/src/mcp/json-schema.ts +14 -0
  1123. package/src/mcp/plugin-tool-name.ts +36 -0
  1124. package/src/mcp/server.ts +74 -15
  1125. package/src/media/image-endpoint.ts +101 -1
  1126. package/src/media/responsive.ts +14 -7
  1127. package/src/media/usage/collection-deletion.ts +4 -0
  1128. package/src/media/usage/extractor.ts +19 -2
  1129. package/src/media/usage/types.ts +5 -1
  1130. package/src/migrations/direct-executor.ts +42 -12
  1131. package/src/migrations/protocol.ts +6 -2
  1132. package/src/plugin-utils.ts +1 -1
  1133. package/src/plugins/adapt-sandbox-entry.ts +16 -6
  1134. package/src/plugins/context.ts +3 -7
  1135. package/src/plugins/hooks.ts +1 -1
  1136. package/src/plugins/http-route-dispatch.ts +5 -1
  1137. package/src/plugins/manifest-schema.ts +1 -0
  1138. package/src/plugins/route-error.ts +14 -0
  1139. package/src/plugins/routes.ts +2 -2
  1140. package/src/plugins/state.ts +41 -8
  1141. package/src/plugins/types.ts +6 -0
  1142. package/src/query.ts +59 -10
  1143. package/src/redirects/cache.ts +34 -2
  1144. package/src/redirects/patterns.ts +26 -2
  1145. package/src/schema/block-values.ts +80 -17
  1146. package/src/schema/registry.ts +16 -5
  1147. package/src/schema/slug.ts +19 -0
  1148. package/src/search/query.ts +3 -1
  1149. package/src/search/text-extraction.ts +6 -1
  1150. package/src/seed/apply.ts +32 -8
  1151. package/src/seed/validate.ts +31 -0
  1152. package/src/seo/sitemap-name.ts +22 -0
  1153. package/src/settings/index.ts +20 -0
  1154. package/src/settings/types.ts +2 -0
  1155. package/src/storage/index.ts +2 -0
  1156. package/src/storage/local.ts +10 -2
  1157. package/src/storage/range.ts +54 -0
  1158. package/src/storage/s3.ts +52 -8
  1159. package/src/storage/types.ts +30 -3
  1160. package/src/ui.ts +1 -0
  1161. package/src/utils/slugify.ts +6 -1
  1162. package/src/visual-editing/toolbar.ts +126 -47
  1163. package/src/widgets/components.ts +4 -0
  1164. package/src/widgets/index.ts +74 -82
  1165. package/src/widgets/recent-posts.ts +62 -0
  1166. package/dist/action-token-AgOs1UWD.mjs +0 -26
  1167. package/dist/action-token-AgOs1UWD.mjs.map +0 -1
  1168. package/dist/activation-xomsCMJg.mjs +0 -387
  1169. package/dist/activation-xomsCMJg.mjs.map +0 -1
  1170. package/dist/adapters-DM1oyHIN.d.mts +0 -173
  1171. package/dist/adapters-DM1oyHIN.d.mts.map +0 -1
  1172. package/dist/allowed-origins-CFtudhyw.mjs +0 -116
  1173. package/dist/allowed-origins-CFtudhyw.mjs.map +0 -1
  1174. package/dist/api-CltsXhiX.mjs +0 -4980
  1175. package/dist/api-CltsXhiX.mjs.map +0 -1
  1176. package/dist/api-tokens-P3mAaQgr.mjs +0 -166
  1177. package/dist/api-tokens-P3mAaQgr.mjs.map +0 -1
  1178. package/dist/apply-Q7uvzBWW.mjs +0 -1680
  1179. package/dist/apply-Q7uvzBWW.mjs.map +0 -1
  1180. package/dist/approvals-DycwI6lZ.mjs +0 -460
  1181. package/dist/approvals-DycwI6lZ.mjs.map +0 -1
  1182. package/dist/artifact-fetch-CWxyELVI.mjs +0 -659
  1183. package/dist/artifact-fetch-CWxyELVI.mjs.map +0 -1
  1184. package/dist/artifacts-UzWbysb8.mjs +0 -307
  1185. package/dist/artifacts-UzWbysb8.mjs.map +0 -1
  1186. package/dist/audit-CCH3MA4Y.mjs +0 -127
  1187. package/dist/audit-CCH3MA4Y.mjs.map +0 -1
  1188. package/dist/authoritative-records-dSvXCfzb.mjs +0 -5172
  1189. package/dist/authoritative-records-dSvXCfzb.mjs.map +0 -1
  1190. package/dist/authorize-DeWfk--K.mjs +0 -49
  1191. package/dist/authorize-DeWfk--K.mjs.map +0 -1
  1192. package/dist/backup-CFnbdTSJ.mjs +0 -246
  1193. package/dist/backup-CFnbdTSJ.mjs.map +0 -1
  1194. package/dist/block-types-C0YFSfR7.mjs +0 -132
  1195. package/dist/block-types-C0YFSfR7.mjs.map +0 -1
  1196. package/dist/block-values-H4E0XwE8.mjs +0 -175
  1197. package/dist/block-values-H4E0XwE8.mjs.map +0 -1
  1198. package/dist/byline-BhVslYLz.mjs +0 -909
  1199. package/dist/byline-BhVslYLz.mjs.map +0 -1
  1200. package/dist/byline-fields-DHJs0Mja.mjs +0 -280
  1201. package/dist/byline-fields-DHJs0Mja.mjs.map +0 -1
  1202. package/dist/byline-fields-xdxE9kxZ.mjs +0 -123
  1203. package/dist/byline-fields-xdxE9kxZ.mjs.map +0 -1
  1204. package/dist/bylines-B_nN9liM.mjs +0 -234
  1205. package/dist/bylines-B_nN9liM.mjs.map +0 -1
  1206. package/dist/bylines-C71YACkL.mjs +0 -150
  1207. package/dist/bylines-C71YACkL.mjs.map +0 -1
  1208. package/dist/cache-aTYCL9nK.mjs +0 -133
  1209. package/dist/cache-aTYCL9nK.mjs.map +0 -1
  1210. package/dist/canonical-Y1dpjCnp.mjs +0 -174
  1211. package/dist/canonical-Y1dpjCnp.mjs.map +0 -1
  1212. package/dist/capture-triggers-C9JKoIdT.mjs +0 -362
  1213. package/dist/capture-triggers-C9JKoIdT.mjs.map +0 -1
  1214. package/dist/challenge-store-CxZxPqaw.mjs +0 -51
  1215. package/dist/challenge-store-CxZxPqaw.mjs.map +0 -1
  1216. package/dist/checksum-DtH6m5uk.mjs +0 -162
  1217. package/dist/checksum-DtH6m5uk.mjs.map +0 -1
  1218. package/dist/chunks-zlGB5IQP.mjs +0 -25
  1219. package/dist/chunks-zlGB5IQP.mjs.map +0 -1
  1220. package/dist/collection-slugs-cache-B2Gs9Jwx.mjs +0 -85
  1221. package/dist/collection-slugs-cache-B2Gs9Jwx.mjs.map +0 -1
  1222. package/dist/comment-Bu08Wvr3.mjs +0 -313
  1223. package/dist/comment-Bu08Wvr3.mjs.map +0 -1
  1224. package/dist/comment-reaction-B8SfT-yM.mjs +0 -85
  1225. package/dist/comment-reaction-B8SfT-yM.mjs.map +0 -1
  1226. package/dist/comments-BRtp992B.mjs +0 -99
  1227. package/dist/comments-BRtp992B.mjs.map +0 -1
  1228. package/dist/comments-DVUYqdyC.mjs +0 -195
  1229. package/dist/comments-DVUYqdyC.mjs.map +0 -1
  1230. package/dist/components-CQY-Sgm-.mjs +0 -108
  1231. package/dist/components-CQY-Sgm-.mjs.map +0 -1
  1232. package/dist/config-B-uePMLj.d.mts +0 -39
  1233. package/dist/config-B-uePMLj.d.mts.map +0 -1
  1234. package/dist/config-B6BDSsz2.d.mts +0 -6712
  1235. package/dist/config-B6BDSsz2.d.mts.map +0 -1
  1236. package/dist/config-BsJHiQxC.mjs +0 -228
  1237. package/dist/config-BsJHiQxC.mjs.map +0 -1
  1238. package/dist/connection-B9pIasFd.mjs +0 -36
  1239. package/dist/connection-B9pIasFd.mjs.map +0 -1
  1240. package/dist/content-Dji9vEiW.mjs +0 -2063
  1241. package/dist/content-Dji9vEiW.mjs.map +0 -1
  1242. package/dist/content-list-query-DiNwyKtd.d.mts +0 -26
  1243. package/dist/content-list-query-DiNwyKtd.d.mts.map +0 -1
  1244. package/dist/content-repair-B7wnbzhN.mjs +0 -442
  1245. package/dist/content-repair-B7wnbzhN.mjs.map +0 -1
  1246. package/dist/context-Ctcxc8Ia.mjs +0 -2026
  1247. package/dist/context-Ctcxc8Ia.mjs.map +0 -1
  1248. package/dist/credits-Bu7dlobo.mjs +0 -110
  1249. package/dist/credits-Bu7dlobo.mjs.map +0 -1
  1250. package/dist/cron-xe5XKqA-.mjs +0 -306
  1251. package/dist/cron-xe5XKqA-.mjs.map +0 -1
  1252. package/dist/dashboard-B5hVHOtf.mjs +0 -151
  1253. package/dist/dashboard-B5hVHOtf.mjs.map +0 -1
  1254. package/dist/default-DaoYyFRS.mjs +0 -81
  1255. package/dist/default-DaoYyFRS.mjs.map +0 -1
  1256. package/dist/deferred-tasks-BYcDx2o_.d.mts +0 -9
  1257. package/dist/deferred-tasks-BYcDx2o_.d.mts.map +0 -1
  1258. package/dist/dev-typegen-Dtl8AfS6.mjs +0 -29
  1259. package/dist/dev-typegen-Dtl8AfS6.mjs.map +0 -1
  1260. package/dist/device-flow-Ma5P5d2e.mjs +0 -521
  1261. package/dist/device-flow-Ma5P5d2e.mjs.map +0 -1
  1262. package/dist/digest-xIpR3o64.mjs +0 -194
  1263. package/dist/digest-xIpR3o64.mjs.map +0 -1
  1264. package/dist/direct-executor-DMWwCey3.mjs +0 -104
  1265. package/dist/direct-executor-DMWwCey3.mjs.map +0 -1
  1266. package/dist/email-console-DmqVF5J_.mjs +0 -50
  1267. package/dist/email-console-DmqVF5J_.mjs.map +0 -1
  1268. package/dist/email-locale-Cc5YSXfJ.mjs +0 -25
  1269. package/dist/email-locale-Cc5YSXfJ.mjs.map +0 -1
  1270. package/dist/emdash-runtime-BlybX9Ui.mjs +0 -4249
  1271. package/dist/emdash-runtime-BlybX9Ui.mjs.map +0 -1
  1272. package/dist/entry-lock-De1L8qUQ.mjs +0 -163
  1273. package/dist/entry-lock-De1L8qUQ.mjs.map +0 -1
  1274. package/dist/entry-lock-esmMbgI9.d.mts +0 -4551
  1275. package/dist/entry-lock-esmMbgI9.d.mts.map +0 -1
  1276. package/dist/entry-lock-sxz2PGAT.mjs +0 -1197
  1277. package/dist/entry-lock-sxz2PGAT.mjs.map +0 -1
  1278. package/dist/env-types-BkjCtN13.mjs +0 -38
  1279. package/dist/env-types-BkjCtN13.mjs.map +0 -1
  1280. package/dist/error-B0rgPgsQ.mjs +0 -90
  1281. package/dist/error-B0rgPgsQ.mjs.map +0 -1
  1282. package/dist/errors-CuHQRiBW.mjs +0 -120
  1283. package/dist/errors-CuHQRiBW.mjs.map +0 -1
  1284. package/dist/errors-DTE6C3K_.mjs +0 -470
  1285. package/dist/errors-DTE6C3K_.mjs.map +0 -1
  1286. package/dist/escape-nJW7dR0s.mjs +0 -9
  1287. package/dist/escape-nJW7dR0s.mjs.map +0 -1
  1288. package/dist/fence-CGw57S4v.mjs +0 -162
  1289. package/dist/fence-CGw57S4v.mjs.map +0 -1
  1290. package/dist/field-defs-cache-Bw8w499w.mjs +0 -77
  1291. package/dist/field-defs-cache-Bw8w499w.mjs.map +0 -1
  1292. package/dist/field-map-hn-D-SyH.mjs +0 -83
  1293. package/dist/field-map-hn-D-SyH.mjs.map +0 -1
  1294. package/dist/fts-manager-DacCYIe4.mjs +0 -443
  1295. package/dist/fts-manager-DacCYIe4.mjs.map +0 -1
  1296. package/dist/gc-BBplHrv6.mjs +0 -75
  1297. package/dist/gc-BBplHrv6.mjs.map +0 -1
  1298. package/dist/hash-C4DFoJ7Z.mjs +0 -37
  1299. package/dist/hash-C4DFoJ7Z.mjs.map +0 -1
  1300. package/dist/hook-result-DSRRxu_-.d.mts +0 -31
  1301. package/dist/hook-result-DSRRxu_-.d.mts.map +0 -1
  1302. package/dist/hreflang-CKPunvU0.mjs +0 -105
  1303. package/dist/hreflang-CKPunvU0.mjs.map +0 -1
  1304. package/dist/hreflang-egumj6WF.d.mts +0 -50
  1305. package/dist/hreflang-egumj6WF.d.mts.map +0 -1
  1306. package/dist/http-route-dispatch-DjNFZcJ2.mjs +0 -339
  1307. package/dist/http-route-dispatch-DjNFZcJ2.mjs.map +0 -1
  1308. package/dist/identity-Dfrx2_Bc.mjs +0 -35
  1309. package/dist/identity-Dfrx2_Bc.mjs.map +0 -1
  1310. package/dist/import-ROBvhbNc.mjs +0 -2021
  1311. package/dist/import-ROBvhbNc.mjs.map +0 -1
  1312. package/dist/index-B4sIdCAT.d.mts +0 -623
  1313. package/dist/index-B4sIdCAT.d.mts.map +0 -1
  1314. package/dist/install-finalization-CPM7Gged.mjs +0 -58
  1315. package/dist/install-finalization-CPM7Gged.mjs.map +0 -1
  1316. package/dist/keys-DxqxcAD4.mjs +0 -61
  1317. package/dist/keys-DxqxcAD4.mjs.map +0 -1
  1318. package/dist/kinds-BQl5gN6e.mjs +0 -974
  1319. package/dist/kinds-BQl5gN6e.mjs.map +0 -1
  1320. package/dist/lifecycle-DGQI7itS.mjs +0 -25
  1321. package/dist/lifecycle-DGQI7itS.mjs.map +0 -1
  1322. package/dist/load-DMxRl4VK.mjs +0 -28
  1323. package/dist/load-DMxRl4VK.mjs.map +0 -1
  1324. package/dist/loader-1DMiOq5s.mjs +0 -1303
  1325. package/dist/loader-1DMiOq5s.mjs.map +0 -1
  1326. package/dist/loops-Dn1i16FP.mjs +0 -205
  1327. package/dist/loops-Dn1i16FP.mjs.map +0 -1
  1328. package/dist/manifest-builder-CTw4FmZk.mjs +0 -189
  1329. package/dist/manifest-builder-CTw4FmZk.mjs.map +0 -1
  1330. package/dist/manifest-schema-gy37bD_D.mjs +0 -496
  1331. package/dist/manifest-schema-gy37bD_D.mjs.map +0 -1
  1332. package/dist/marketplace-tHWSsCUo.mjs +0 -257
  1333. package/dist/marketplace-tHWSsCUo.mjs.map +0 -1
  1334. package/dist/media-Bw-Q65ve.mjs +0 -294
  1335. package/dist/media-Bw-Q65ve.mjs.map +0 -1
  1336. package/dist/media-BzUDu7nl.mjs +0 -373
  1337. package/dist/media-BzUDu7nl.mjs.map +0 -1
  1338. package/dist/media-aahnKHze.mjs +0 -408
  1339. package/dist/media-aahnKHze.mjs.map +0 -1
  1340. package/dist/media-allowlist-RMrjo8TU.mjs +0 -45
  1341. package/dist/media-allowlist-RMrjo8TU.mjs.map +0 -1
  1342. package/dist/media-folders-kabR1oJf.mjs +0 -210
  1343. package/dist/media-folders-kabR1oJf.mjs.map +0 -1
  1344. package/dist/media-url-DloW2xrP.mjs +0 -43
  1345. package/dist/media-url-DloW2xrP.mjs.map +0 -1
  1346. package/dist/media-usage-CHHpV7ee.mjs +0 -282
  1347. package/dist/media-usage-CHHpV7ee.mjs.map +0 -1
  1348. package/dist/media-usage-activation-BinYqC_r.mjs +0 -78
  1349. package/dist/media-usage-activation-BinYqC_r.mjs.map +0 -1
  1350. package/dist/media-usage-work-C734aq6s.mjs +0 -1015
  1351. package/dist/media-usage-work-C734aq6s.mjs.map +0 -1
  1352. package/dist/media-usage-work-lxvV0-UO.mjs +0 -151
  1353. package/dist/media-usage-work-lxvV0-UO.mjs.map +0 -1
  1354. package/dist/menus-6RHNq4ZK.mjs +0 -753
  1355. package/dist/menus-6RHNq4ZK.mjs.map +0 -1
  1356. package/dist/menus-AuCTaO9W.mjs +0 -3704
  1357. package/dist/menus-AuCTaO9W.mjs.map +0 -1
  1358. package/dist/menus-BQKqf0Up.mjs +0 -92
  1359. package/dist/menus-BQKqf0Up.mjs.map +0 -1
  1360. package/dist/mode-nh0ppSX5.mjs +0 -23
  1361. package/dist/mode-nh0ppSX5.mjs.map +0 -1
  1362. package/dist/node-sqlite-compat-CDOEcc97.mjs +0 -63
  1363. package/dist/node-sqlite-compat-CDOEcc97.mjs.map +0 -1
  1364. package/dist/oauth-authorization-BtYQ80uU.mjs +0 -274
  1365. package/dist/oauth-authorization-BtYQ80uU.mjs.map +0 -1
  1366. package/dist/oauth-clients-C1S4NQHh.mjs +0 -266
  1367. package/dist/oauth-clients-C1S4NQHh.mjs.map +0 -1
  1368. package/dist/oauth-state-store-CpGi2FZH.mjs +0 -50
  1369. package/dist/oauth-state-store-CpGi2FZH.mjs.map +0 -1
  1370. package/dist/oauth-user-lookup-BNp1aFAr.mjs +0 -26
  1371. package/dist/oauth-user-lookup-BNp1aFAr.mjs.map +0 -1
  1372. package/dist/options-B41aLm1I.d.mts +0 -81
  1373. package/dist/options-B41aLm1I.d.mts.map +0 -1
  1374. package/dist/ownership-DoeAIuTg.mjs +0 -12
  1375. package/dist/ownership-DoeAIuTg.mjs.map +0 -1
  1376. package/dist/parse-CmFDTGzp.mjs +0 -81
  1377. package/dist/parse-CmFDTGzp.mjs.map +0 -1
  1378. package/dist/parse-QVS0t5oR.d.mts +0 -172
  1379. package/dist/parse-QVS0t5oR.d.mts.map +0 -1
  1380. package/dist/passkey-config-C-MxsV22.mjs +0 -46
  1381. package/dist/passkey-config-C-MxsV22.mjs.map +0 -1
  1382. package/dist/paths-kr8hAMMI.mjs +0 -77
  1383. package/dist/paths-kr8hAMMI.mjs.map +0 -1
  1384. package/dist/patterns-DyZJ67I7.mjs +0 -140
  1385. package/dist/patterns-DyZJ67I7.mjs.map +0 -1
  1386. package/dist/placeholder-Dn7MMdWr.d.mts +0 -306
  1387. package/dist/placeholder-Dn7MMdWr.d.mts.map +0 -1
  1388. package/dist/plan-CuQOeU9g.mjs +0 -135
  1389. package/dist/plan-CuQOeU9g.mjs.map +0 -1
  1390. package/dist/plugins-CGb-G98c.mjs +0 -261
  1391. package/dist/plugins-CGb-G98c.mjs.map +0 -1
  1392. package/dist/policy-C5wrDXYV.mjs +0 -45
  1393. package/dist/policy-C5wrDXYV.mjs.map +0 -1
  1394. package/dist/portable-text-BnRuiR1-.mjs +0 -307
  1395. package/dist/portable-text-BnRuiR1-.mjs.map +0 -1
  1396. package/dist/preview-xWNSR1Li.mjs +0 -107
  1397. package/dist/preview-xWNSR1Li.mjs.map +0 -1
  1398. package/dist/protocol-ClxN-m1e.d.mts +0 -61
  1399. package/dist/protocol-ClxN-m1e.d.mts.map +0 -1
  1400. package/dist/public-submission-CkmT2SKv.mjs +0 -250
  1401. package/dist/public-submission-CkmT2SKv.mjs.map +0 -1
  1402. package/dist/public-url-B5a0QAh6.mjs +0 -101
  1403. package/dist/public-url-B5a0QAh6.mjs.map +0 -1
  1404. package/dist/query-DHqFiqqH.mjs +0 -41
  1405. package/dist/query-DHqFiqqH.mjs.map +0 -1
  1406. package/dist/query-DT85BehD.mjs +0 -1125
  1407. package/dist/query-DT85BehD.mjs.map +0 -1
  1408. package/dist/rate-limit-iMvcu3eu.mjs +0 -120
  1409. package/dist/rate-limit-iMvcu3eu.mjs.map +0 -1
  1410. package/dist/receipt-Dpp1uaX9.mjs +0 -43
  1411. package/dist/receipt-Dpp1uaX9.mjs.map +0 -1
  1412. package/dist/redirect-BRoLiWQE.mjs +0 -19
  1413. package/dist/redirect-BRoLiWQE.mjs.map +0 -1
  1414. package/dist/redirect-xZNpBoGp.mjs +0 -417
  1415. package/dist/redirect-xZNpBoGp.mjs.map +0 -1
  1416. package/dist/redirects-D4EWeXAo.mjs +0 -148
  1417. package/dist/redirects-D4EWeXAo.mjs.map +0 -1
  1418. package/dist/redirects-DCKqwiWp.mjs +0 -446
  1419. package/dist/redirects-DCKqwiWp.mjs.map +0 -1
  1420. package/dist/registry-DaXmUsD4.mjs +0 -8369
  1421. package/dist/registry-DaXmUsD4.mjs.map +0 -1
  1422. package/dist/relations-JvBP8nGP.mjs +0 -776
  1423. package/dist/relations-JvBP8nGP.mjs.map +0 -1
  1424. package/dist/request-meta-B6blULFY.mjs +0 -141
  1425. package/dist/request-meta-B6blULFY.mjs.map +0 -1
  1426. package/dist/resolve-DAhHi5tn.mjs +0 -100
  1427. package/dist/resolve-DAhHi5tn.mjs.map +0 -1
  1428. package/dist/revision-BWEH2qQB.mjs +0 -368
  1429. package/dist/revision-BWEH2qQB.mjs.map +0 -1
  1430. package/dist/route-wire-DK600v4u.mjs +0 -197
  1431. package/dist/route-wire-DK600v4u.mjs.map +0 -1
  1432. package/dist/routes-BeZyaCzv.mjs +0 -272
  1433. package/dist/routes-BeZyaCzv.mjs.map +0 -1
  1434. package/dist/runner-CskI4Hmq.mjs +0 -6372
  1435. package/dist/runner-CskI4Hmq.mjs.map +0 -1
  1436. package/dist/runner-J3Cj6DGk.d.mts +0 -68
  1437. package/dist/runner-J3Cj6DGk.d.mts.map +0 -1
  1438. package/dist/schema-CK0ihqMR.mjs +0 -815
  1439. package/dist/schema-CK0ihqMR.mjs.map +0 -1
  1440. package/dist/schema-VtaZSrC-.mjs +0 -13
  1441. package/dist/schema-VtaZSrC-.mjs.map +0 -1
  1442. package/dist/scopes-BRnGlL9t.mjs +0 -34
  1443. package/dist/scopes-BRnGlL9t.mjs.map +0 -1
  1444. package/dist/search-D6-XK1Sn.mjs +0 -448
  1445. package/dist/search-D6-XK1Sn.mjs.map +0 -1
  1446. package/dist/sections-CBDCf7qR.mjs +0 -346
  1447. package/dist/sections-CBDCf7qR.mjs.map +0 -1
  1448. package/dist/seo-BdeEPDNW.mjs +0 -133
  1449. package/dist/seo-BdeEPDNW.mjs.map +0 -1
  1450. package/dist/seo-C61bnPuV.mjs +0 -114
  1451. package/dist/seo-C61bnPuV.mjs.map +0 -1
  1452. package/dist/service-BuRKLMxa.mjs +0 -150
  1453. package/dist/service-BuRKLMxa.mjs.map +0 -1
  1454. package/dist/session-user-CqkPtrPL.mjs +0 -61
  1455. package/dist/session-user-CqkPtrPL.mjs.map +0 -1
  1456. package/dist/settings-0u0lTthS.mjs +0 -51
  1457. package/dist/settings-0u0lTthS.mjs.map +0 -1
  1458. package/dist/settings-WHr45II1.mjs +0 -61
  1459. package/dist/settings-WHr45II1.mjs.map +0 -1
  1460. package/dist/settings-m5tIYnF0.mjs +0 -443
  1461. package/dist/settings-m5tIYnF0.mjs.map +0 -1
  1462. package/dist/setup-complete-B2_dhZZz.mjs +0 -65
  1463. package/dist/setup-complete-B2_dhZZz.mjs.map +0 -1
  1464. package/dist/setup-nonce-CJV9ftSK.mjs +0 -25
  1465. package/dist/setup-nonce-CJV9ftSK.mjs.map +0 -1
  1466. package/dist/site-settings-KJOqJW6W.mjs +0 -50
  1467. package/dist/site-settings-KJOqJW6W.mjs.map +0 -1
  1468. package/dist/site-url-Ceq_AUK0.mjs +0 -16
  1469. package/dist/site-url-Ceq_AUK0.mjs.map +0 -1
  1470. package/dist/slugify-T5GHH42D.mjs +0 -17
  1471. package/dist/slugify-T5GHH42D.mjs.map +0 -1
  1472. package/dist/snapshot-Dzsn3NZa.mjs +0 -414
  1473. package/dist/snapshot-Dzsn3NZa.mjs.map +0 -1
  1474. package/dist/ssrf-DsmvZB80.mjs +0 -406
  1475. package/dist/ssrf-DsmvZB80.mjs.map +0 -1
  1476. package/dist/stage-Csnh_yEd.mjs +0 -662
  1477. package/dist/stage-Csnh_yEd.mjs.map +0 -1
  1478. package/dist/staged-Q7pnEVvI.mjs +0 -686
  1479. package/dist/staged-Q7pnEVvI.mjs.map +0 -1
  1480. package/dist/state-kGdOMQRY.mjs +0 -153
  1481. package/dist/state-kGdOMQRY.mjs.map +0 -1
  1482. package/dist/status-D39Fpy8R.mjs +0 -30
  1483. package/dist/status-D39Fpy8R.mjs.map +0 -1
  1484. package/dist/storage-query-C7iy6eUb.d.mts +0 -1615
  1485. package/dist/storage-query-C7iy6eUb.d.mts.map +0 -1
  1486. package/dist/tar-BWiraSUY.mjs +0 -449
  1487. package/dist/tar-BWiraSUY.mjs.map +0 -1
  1488. package/dist/target-DOFs5oUC.mjs +0 -27
  1489. package/dist/target-DOFs5oUC.mjs.map +0 -1
  1490. package/dist/taxonomies-BS40Wxvi.mjs +0 -939
  1491. package/dist/taxonomies-BS40Wxvi.mjs.map +0 -1
  1492. package/dist/taxonomies-DAZU9VDd.mjs +0 -697
  1493. package/dist/taxonomies-DAZU9VDd.mjs.map +0 -1
  1494. package/dist/taxonomy-XzLE95Vx.mjs +0 -525
  1495. package/dist/taxonomy-XzLE95Vx.mjs.map +0 -1
  1496. package/dist/tokens-DSQan4p7.mjs +0 -171
  1497. package/dist/tokens-DSQan4p7.mjs.map +0 -1
  1498. package/dist/transfer-BcCVxDgf.mjs +0 -166
  1499. package/dist/transfer-BcCVxDgf.mjs.map +0 -1
  1500. package/dist/transfer-OMrancOt.mjs +0 -8873
  1501. package/dist/transfer-OMrancOt.mjs.map +0 -1
  1502. package/dist/transfer-download-Dc-ltjZY.mjs +0 -33
  1503. package/dist/transfer-download-Dc-ltjZY.mjs.map +0 -1
  1504. package/dist/transformations-Ddx7UtrY.mjs +0 -196
  1505. package/dist/transformations-Ddx7UtrY.mjs.map +0 -1
  1506. package/dist/transport-flR-Zmds.d.mts +0 -42
  1507. package/dist/transport-flR-Zmds.d.mts.map +0 -1
  1508. package/dist/transport-umzEbgYO.mjs +0 -136
  1509. package/dist/transport-umzEbgYO.mjs.map +0 -1
  1510. package/dist/trusted-proxy-BqfQFs6a.mjs +0 -51
  1511. package/dist/trusted-proxy-BqfQFs6a.mjs.map +0 -1
  1512. package/dist/turnstile-Do60baId.mjs +0 -58
  1513. package/dist/turnstile-Do60baId.mjs.map +0 -1
  1514. package/dist/types-BT1p3uyb.d.mts +0 -1735
  1515. package/dist/types-BT1p3uyb.d.mts.map +0 -1
  1516. package/dist/types-BYaPWs_F.d.mts +0 -198
  1517. package/dist/types-BYaPWs_F.d.mts.map +0 -1
  1518. package/dist/types-C-Xp0CcN.mjs +0 -103
  1519. package/dist/types-C-Xp0CcN.mjs.map +0 -1
  1520. package/dist/types-CLTQ9b_r.d.mts +0 -374
  1521. package/dist/types-CLTQ9b_r.d.mts.map +0 -1
  1522. package/dist/types-CPkQw2T2.d.mts +0 -85
  1523. package/dist/types-CPkQw2T2.d.mts.map +0 -1
  1524. package/dist/types-CQLvuXoZ.d.mts +0 -198
  1525. package/dist/types-CQLvuXoZ.d.mts.map +0 -1
  1526. package/dist/types-CV5xszpF.d.mts +0 -363
  1527. package/dist/types-CV5xszpF.d.mts.map +0 -1
  1528. package/dist/types-CdEMurNh.mjs +0 -77
  1529. package/dist/types-CdEMurNh.mjs.map +0 -1
  1530. package/dist/types-CxwtnuSS.mjs +0 -37
  1531. package/dist/types-CxwtnuSS.mjs.map +0 -1
  1532. package/dist/types-DGw8KMX_.mjs +0 -16
  1533. package/dist/types-DGw8KMX_.mjs.map +0 -1
  1534. package/dist/types-DOfVMPoo.d.mts +0 -125
  1535. package/dist/types-DOfVMPoo.d.mts.map +0 -1
  1536. package/dist/types-LtS0SM4F.d.mts +0 -287
  1537. package/dist/types-LtS0SM4F.d.mts.map +0 -1
  1538. package/dist/types-ifgOkcBa.d.mts +0 -916
  1539. package/dist/types-ifgOkcBa.d.mts.map +0 -1
  1540. package/dist/update-check-DOc2aBIU.mjs +0 -161
  1541. package/dist/update-check-DOc2aBIU.mjs.map +0 -1
  1542. package/dist/upload-attempts-nzdc3cay.mjs +0 -32
  1543. package/dist/upload-attempts-nzdc3cay.mjs.map +0 -1
  1544. package/dist/url-pattern-hVbqpXs6.mjs +0 -41
  1545. package/dist/url-pattern-hVbqpXs6.mjs.map +0 -1
  1546. package/dist/user-Dnp53zTq.mjs +0 -171
  1547. package/dist/user-Dnp53zTq.mjs.map +0 -1
  1548. package/dist/utils-CoV-PYhg.mjs +0 -439
  1549. package/dist/utils-CoV-PYhg.mjs.map +0 -1
  1550. package/dist/validate-CfQ9_YlD.d.mts +0 -468
  1551. package/dist/validate-CfQ9_YlD.d.mts.map +0 -1
  1552. package/dist/validate-DBX3DKtL.mjs +0 -516
  1553. package/dist/validate-DBX3DKtL.mjs.map +0 -1
  1554. package/dist/validation-BJMiDhB1.mjs +0 -219
  1555. package/dist/validation-BJMiDhB1.mjs.map +0 -1
  1556. package/dist/version-BaT8yKIT.mjs +0 -7
  1557. package/dist/version-BaT8yKIT.mjs.map +0 -1
  1558. package/dist/version-BwEGkqkx.mjs +0 -9
  1559. package/dist/version-BwEGkqkx.mjs.map +0 -1
  1560. package/dist/virtual-modules-B6vJW15k.mjs +0 -516
  1561. package/dist/virtual-modules-B6vJW15k.mjs.map +0 -1
  1562. package/dist/widgets-BkxBAgZ_.mjs +0 -126
  1563. package/dist/widgets-BkxBAgZ_.mjs.map +0 -1
  1564. package/dist/wxr-taxonomies-D7gAJyOF.mjs +0 -453
  1565. package/dist/wxr-taxonomies-D7gAJyOF.mjs.map +0 -1
  1566. package/dist/wxr-taxonomies-DM5J9AsT.d.mts +0 -34
  1567. package/dist/wxr-taxonomies-DM5J9AsT.d.mts.map +0 -1
  1568. package/dist/zod-generator-BQilAboC.mjs +0 -424
  1569. package/dist/zod-generator-BQilAboC.mjs.map +0 -1
  1570. /package/dist/{api-tokens-BLz2MtQs.mjs → api-tokens-CdP49zVF.mjs} +0 -0
  1571. /package/dist/{ssrf-tA45vIPX.mjs → ssrf-DM0E-D_8.mjs} +0 -0
@@ -2,32 +2,37 @@
2
2
  * Self-contained inline Portable Text editor for visual editing.
3
3
  *
4
4
  * Uses TipTap directly with content extensions — no admin UI deps.
5
- * Includes BubbleMenu for inline formatting (bold, italic, etc.)
6
- * but no toolbar, no media picker, no section picker.
5
+ * Includes the admin editor's selection toolbar and slash menu, and a
6
+ * toolbar and picker for images, but no fixed toolbar, sidebar, or section
7
+ * picker.
7
8
  *
8
9
  * Converts between Portable Text and ProseMirror on mount/save.
9
10
  * Auto-saves on blur, dispatches custom events for toolbar integration.
10
11
  */
11
12
 
12
13
  import { htmlBlockFields } from "@emdash-cms/admin/html-block";
13
- import { autoUpdate, flip, offset, shift, useFloating } from "@floating-ui/react";
14
- import { Extension, Node, mergeAttributes, type JSONContent, type Range } from "@tiptap/core";
14
+ import { Node, mergeAttributes, type JSONContent } from "@tiptap/core";
15
15
  import Focus from "@tiptap/extension-focus";
16
- import Image from "@tiptap/extension-image";
17
16
  import Link from "@tiptap/extension-link";
18
17
  import Placeholder from "@tiptap/extension-placeholder";
18
+ import Subscript from "@tiptap/extension-subscript";
19
+ import Superscript from "@tiptap/extension-superscript";
19
20
  import TextAlign from "@tiptap/extension-text-align";
20
21
  import Typography from "@tiptap/extension-typography";
21
22
  import Underline from "@tiptap/extension-underline";
22
- import { Plugin } from "@tiptap/pm/state";
23
+ import { Plugin, type Transaction } from "@tiptap/pm/state";
23
24
  import { useEditor, EditorContent, type Editor } from "@tiptap/react";
24
- import { BubbleMenu } from "@tiptap/react/menus";
25
25
  import StarterKit from "@tiptap/starter-kit";
26
- import Suggestion from "@tiptap/suggestion";
26
+ import { exitSuggestion } from "@tiptap/suggestion";
27
27
  import * as React from "react";
28
- import { createPortal } from "react-dom";
29
28
 
30
29
  import { resolveImageMedia } from "../content/converters/gallery.js";
30
+ import { normalizeImageLink } from "../content/converters/image-link.js";
31
+ import {
32
+ assertPortableTextMarksSupported,
33
+ assertProseMirrorMarksSupported,
34
+ UnsupportedPortableTextMarksError,
35
+ } from "../content/converters/mark-safety.js";
31
36
  import {
32
37
  deriveLegacyListId,
33
38
  normalizeProseMirrorOrderedListJson,
@@ -35,9 +40,20 @@ import {
35
40
  normalizeListStart,
36
41
  readOrderedListMetadata,
37
42
  } from "../content/converters/numbered-list.js";
38
- import { computeThumbnailSize } from "../media/thumbnail.js";
43
+ import type { ProseMirrorDocument } from "../content/converters/types.js";
39
44
  import { CodeMarkExtension } from "./code-mark.js";
45
+ import { InlineBubbleMenu } from "./inline-bubble-menu.js";
40
46
  import { InlineCodeBlockExtension } from "./inline-code-block.js";
47
+ import { INLINE_EDITOR_UI_STYLES, useInlineUiRoot } from "./inline-editor-ui.js";
48
+ import { INLINE_IMAGE_STYLES, InlineImageExtension, insertImage } from "./inline-image.js";
49
+ import { INLINE_MEDIA_PICKER_STYLES, InlineMediaPicker } from "./inline-media-picker.js";
50
+ import {
51
+ InlineSlashMenu,
52
+ createSlashCommandsExtension,
53
+ initialSlashMenuState,
54
+ type SlashCommandItem,
55
+ type SlashMenuState,
56
+ } from "./inline-slash-menu.js";
41
57
  import { EmDashOrderedList } from "./ordered-list.js";
42
58
 
43
59
  // ── Portable Text types ────────────────────────────────────────────
@@ -81,10 +97,15 @@ function isPTTableBlock(value: unknown): value is PTTableBlock {
81
97
  return typeof value === "object" && value !== null && "_type" in value && value._type === "table";
82
98
  }
83
99
 
84
- /** Type guard for ProseMirror JSON document node */
85
- function isPMNode(value: unknown): value is PMNode {
100
+ /** Type guard for a ProseMirror JSON document. */
101
+ function isProseMirrorDocument(value: unknown): value is ProseMirrorDocument {
86
102
  return (
87
- typeof value === "object" && value !== null && "type" in value && typeof value.type === "string"
103
+ typeof value === "object" &&
104
+ value !== null &&
105
+ "type" in value &&
106
+ value.type === "doc" &&
107
+ "content" in value &&
108
+ Array.isArray(value.content)
88
109
  );
89
110
  }
90
111
 
@@ -172,6 +193,18 @@ function attrDimension(
172
193
  return value !== undefined && Number.isFinite(value) && value > 0 ? value : undefined;
173
194
  }
174
195
 
196
+ type ImageAlignment = "left" | "center" | "right" | "wide" | "full";
197
+
198
+ function imageAlignment(value: unknown): ImageAlignment | undefined {
199
+ return value === "left" ||
200
+ value === "center" ||
201
+ value === "right" ||
202
+ value === "wide" ||
203
+ value === "full"
204
+ ? value
205
+ : undefined;
206
+ }
207
+
175
208
  function canonicalMediaProviderId(provider: string | undefined): string | undefined {
176
209
  return provider === "external-url" ? "external" : provider;
177
210
  }
@@ -300,6 +333,8 @@ function convertPMNode(node: PMNode, path: string): PTBlock | PTBlock[] | null {
300
333
  ...(dominantColor ? { dominantColor } : {}),
301
334
  displayWidth: attrDimension(node.attrs, "displayWidth"),
302
335
  displayHeight: attrDimension(node.attrs, "displayHeight"),
336
+ alignment: imageAlignment(node.attrs?.alignment),
337
+ link: normalizeImageLink(node.attrs?.link) ?? undefined,
303
338
  };
304
339
  }
305
340
  case "horizontalRule":
@@ -448,6 +483,7 @@ function convertPMMark(
448
483
 
449
484
  function portableTextToPM(blocks: PTBlock[]): JSONContent {
450
485
  if (!blocks || blocks.length === 0) return { type: "doc", content: [{ type: "paragraph" }] };
486
+ assertPortableTextMarksSupported(blocks);
451
487
 
452
488
  const content: PMNode[] = [];
453
489
  let i = 0;
@@ -592,6 +628,9 @@ function convertPTBlock(block: PTBlock): PMNode | null {
592
628
  dominantColor?: string;
593
629
  displayWidth?: number;
594
630
  displayHeight?: number;
631
+ alignment?: unknown;
632
+ /** `{ href, blank? }`, or a bare string on WordPress-imported content */
633
+ link?: unknown;
595
634
  };
596
635
  const meta = ib.asset?.meta;
597
636
  const { asset, alt, width, height } = resolveImageMedia(ib);
@@ -623,6 +662,8 @@ function convertPTBlock(block: PTBlock): PMNode | null {
623
662
  dominantColor,
624
663
  displayWidth: ib.displayWidth,
625
664
  displayHeight: ib.displayHeight,
665
+ alignment: imageAlignment(ib.alignment) ?? null,
666
+ link: normalizeImageLink(ib.link),
626
667
  },
627
668
  };
628
669
  }
@@ -811,6 +852,12 @@ function convertPTMarks(marks: string[], markDefs: Map<string, PTMarkDef>): Mark
811
852
  case "code":
812
853
  pm.push({ type: "code" });
813
854
  break;
855
+ case "superscript":
856
+ pm.push({ type: "superscript" });
857
+ break;
858
+ case "subscript":
859
+ pm.push({ type: "subscript" });
860
+ break;
814
861
  default: {
815
862
  const md = markDefs.get(mark);
816
863
  if (md && md._type === "link") {
@@ -826,278 +873,6 @@ function convertPTMarks(marks: string[], markDefs: Map<string, PTMarkDef>): Mark
826
873
  return pm;
827
874
  }
828
875
 
829
- // ── Inline BubbleMenu ──────────────────────────────────────────────
830
-
831
- function InlineBubbleMenu({ editor }: { editor: Editor }) {
832
- const [showLinkInput, setShowLinkInput] = React.useState(false);
833
- const [linkUrl, setLinkUrl] = React.useState("");
834
- const inputRef = React.useRef<HTMLInputElement>(null);
835
-
836
- React.useEffect(() => {
837
- if (showLinkInput) {
838
- const existingUrl = editor.getAttributes("link").href || "";
839
- setLinkUrl(existingUrl);
840
- setTimeout(() => inputRef.current?.focus(), 0);
841
- }
842
- }, [showLinkInput, editor]);
843
-
844
- const handleSetLink = () => {
845
- if (linkUrl.trim() === "") {
846
- editor.chain().focus().extendMarkRange("link").unsetLink().run();
847
- } else {
848
- editor.chain().focus().extendMarkRange("link").setLink({ href: linkUrl.trim() }).run();
849
- }
850
- setShowLinkInput(false);
851
- setLinkUrl("");
852
- };
853
-
854
- const handleRemoveLink = () => {
855
- editor.chain().focus().extendMarkRange("link").unsetLink().run();
856
- setShowLinkInput(false);
857
- setLinkUrl("");
858
- };
859
-
860
- const handleKeyDown = (e: React.KeyboardEvent) => {
861
- if (e.key === "Enter") {
862
- e.preventDefault();
863
- handleSetLink();
864
- } else if (e.key === "Escape") {
865
- setShowLinkInput(false);
866
- setLinkUrl("");
867
- editor.commands.focus();
868
- }
869
- };
870
-
871
- return (
872
- <BubbleMenu
873
- editor={editor}
874
- options={{ placement: "top", offset: 8, flip: true, shift: true }}
875
- className="emdash-bubble-menu"
876
- >
877
- {showLinkInput ? (
878
- <div style={{ display: "flex", alignItems: "center", gap: "4px" }}>
879
- <input
880
- ref={inputRef}
881
- type="url"
882
- placeholder="https://..."
883
- value={linkUrl}
884
- onChange={(e) => setLinkUrl(e.target.value)}
885
- onKeyDown={handleKeyDown}
886
- className="emdash-bubble-link-input"
887
- />
888
- <button
889
- type="button"
890
- className="emdash-bubble-btn"
891
- onClick={handleSetLink}
892
- title="Apply link"
893
- >
894
- ↗
895
- </button>
896
- {editor.isActive("link") && (
897
- <button
898
- type="button"
899
- className="emdash-bubble-btn emdash-bubble-btn--danger"
900
- onClick={handleRemoveLink}
901
- title="Remove link"
902
- >
903
- ✕
904
- </button>
905
- )}
906
- </div>
907
- ) : (
908
- <>
909
- <button
910
- type="button"
911
- className={`emdash-bubble-btn ${editor.isActive("bold") ? "emdash-bubble-btn--active" : ""}`}
912
- onClick={() => editor.chain().focus().toggleBold().run()}
913
- title="Bold"
914
- >
915
- <strong>B</strong>
916
- </button>
917
- <button
918
- type="button"
919
- className={`emdash-bubble-btn ${editor.isActive("italic") ? "emdash-bubble-btn--active" : ""}`}
920
- onClick={() => editor.chain().focus().toggleItalic().run()}
921
- title="Italic"
922
- >
923
- <em>I</em>
924
- </button>
925
- <button
926
- type="button"
927
- className={`emdash-bubble-btn ${editor.isActive("underline") ? "emdash-bubble-btn--active" : ""}`}
928
- onClick={() => editor.chain().focus().toggleUnderline().run()}
929
- title="Underline"
930
- >
931
- <span style={{ textDecoration: "underline" }}>U</span>
932
- </button>
933
- <button
934
- type="button"
935
- className={`emdash-bubble-btn ${editor.isActive("strike") ? "emdash-bubble-btn--active" : ""}`}
936
- onClick={() => editor.chain().focus().toggleStrike().run()}
937
- title="Strikethrough"
938
- >
939
- <span style={{ textDecoration: "line-through" }}>S</span>
940
- </button>
941
- <button
942
- type="button"
943
- className={`emdash-bubble-btn ${editor.isActive("code") ? "emdash-bubble-btn--active" : ""}`}
944
- onClick={() => editor.chain().focus().toggleCode().run()}
945
- title="Code"
946
- >
947
- <span style={{ fontFamily: "monospace", fontSize: "13px" }}>&lt;/&gt;</span>
948
- </button>
949
- <span className="emdash-bubble-divider" />
950
- <button
951
- type="button"
952
- className={`emdash-bubble-btn ${editor.isActive("link") ? "emdash-bubble-btn--active" : ""}`}
953
- onClick={() => setShowLinkInput(true)}
954
- title={editor.isActive("link") ? "Edit link" : "Add link"}
955
- >
956
- 🔗
957
- </button>
958
- </>
959
- )}
960
- </BubbleMenu>
961
- );
962
- }
963
-
964
- // ── Slash Menu ──────────────────────────────────────────────────────
965
-
966
- interface SlashCommandItem {
967
- id: string;
968
- title: string;
969
- description: string;
970
- icon: string;
971
- command: (props: { editor: Editor; range: Range }) => void;
972
- aliases?: string[];
973
- }
974
-
975
- const slashCommands: SlashCommandItem[] = [
976
- {
977
- id: "heading1",
978
- title: "Heading 1",
979
- description: "Large section heading",
980
- icon: "H1",
981
- aliases: ["h1", "title"],
982
- command: ({ editor, range }) => {
983
- editor.chain().focus().deleteRange(range).setNode("heading", { level: 1 }).run();
984
- },
985
- },
986
- {
987
- id: "heading2",
988
- title: "Heading 2",
989
- description: "Medium section heading",
990
- icon: "H2",
991
- aliases: ["h2", "subtitle"],
992
- command: ({ editor, range }) => {
993
- editor.chain().focus().deleteRange(range).setNode("heading", { level: 2 }).run();
994
- },
995
- },
996
- {
997
- id: "heading3",
998
- title: "Heading 3",
999
- description: "Small section heading",
1000
- icon: "H3",
1001
- aliases: ["h3"],
1002
- command: ({ editor, range }) => {
1003
- editor.chain().focus().deleteRange(range).setNode("heading", { level: 3 }).run();
1004
- },
1005
- },
1006
- {
1007
- id: "bulletList",
1008
- title: "Bullet List",
1009
- description: "Create a bullet list",
1010
- icon: "•",
1011
- aliases: ["ul", "unordered"],
1012
- command: ({ editor, range }) => {
1013
- editor.chain().focus().deleteRange(range).toggleBulletList().run();
1014
- },
1015
- },
1016
- {
1017
- id: "numberedList",
1018
- title: "Numbered List",
1019
- description: "Create a numbered list",
1020
- icon: "1.",
1021
- aliases: ["ol", "ordered"],
1022
- command: ({ editor, range }) => {
1023
- editor.chain().focus().deleteRange(range).toggleOrderedList().run();
1024
- },
1025
- },
1026
- {
1027
- id: "quote",
1028
- title: "Quote",
1029
- description: "Insert a blockquote",
1030
- icon: "\u201C",
1031
- aliases: ["blockquote", "cite"],
1032
- command: ({ editor, range }) => {
1033
- editor.chain().focus().deleteRange(range).toggleBlockquote().run();
1034
- },
1035
- },
1036
- {
1037
- id: "codeBlock",
1038
- title: "Code Block",
1039
- description: "Insert a code block",
1040
- icon: "</>",
1041
- aliases: ["code", "pre", "```"],
1042
- command: ({ editor, range }) => {
1043
- editor.chain().focus().deleteRange(range).toggleCodeBlock().run();
1044
- },
1045
- },
1046
- {
1047
- id: "htmlBlock",
1048
- title: "HTML",
1049
- description: "Insert raw HTML",
1050
- icon: "< >",
1051
- aliases: ["html", "raw", "markup"],
1052
- command: ({ editor, range }) => {
1053
- editor
1054
- .chain()
1055
- .focus()
1056
- .deleteRange(range)
1057
- .insertContent({ type: "htmlBlock", attrs: { html: "", isolated: true } })
1058
- .run();
1059
- },
1060
- },
1061
- {
1062
- id: "divider",
1063
- title: "Divider",
1064
- description: "Insert a horizontal rule",
1065
- icon: "—",
1066
- aliases: ["hr", "---", "separator"],
1067
- command: ({ editor, range }) => {
1068
- editor.chain().focus().deleteRange(range).setHorizontalRule().run();
1069
- },
1070
- },
1071
- {
1072
- id: "image",
1073
- title: "Image",
1074
- description: "Insert an image",
1075
- icon: "🖼",
1076
- aliases: ["img", "photo", "picture"],
1077
- command: ({ editor, range }) => {
1078
- editor.chain().focus().deleteRange(range).run();
1079
- // Signal the component to open the media picker
1080
- document.dispatchEvent(new CustomEvent("emdash:open-media-picker"));
1081
- },
1082
- },
1083
- ];
1084
-
1085
- interface SlashMenuState {
1086
- isOpen: boolean;
1087
- items: SlashCommandItem[];
1088
- selectedIndex: number;
1089
- clientRect: (() => DOMRect | null) | null;
1090
- range: Range | null;
1091
- }
1092
-
1093
- const initialSlashMenuState: SlashMenuState = {
1094
- isOpen: false,
1095
- items: [],
1096
- selectedIndex: 0,
1097
- clientRect: null,
1098
- range: null,
1099
- };
1100
-
1101
876
  /**
1102
877
  * Minimal `htmlBlock` TipTap node for the inline (visual-editing) editor.
1103
878
  *
@@ -1265,844 +1040,6 @@ const PluginBlockNode = Node.create({
1265
1040
  },
1266
1041
  });
1267
1042
 
1268
- function createSlashCommandsExtension(options: {
1269
- filterCommands: (query: string) => SlashCommandItem[];
1270
- onStateChange: React.Dispatch<React.SetStateAction<SlashMenuState>>;
1271
- getState: () => SlashMenuState;
1272
- }) {
1273
- const { filterCommands, onStateChange, getState } = options;
1274
-
1275
- return Extension.create({
1276
- name: "slashCommands",
1277
-
1278
- addProseMirrorPlugins() {
1279
- return [
1280
- Suggestion({
1281
- editor: this.editor,
1282
- char: "/",
1283
- startOfLine: true,
1284
- command: ({ editor, range, props }) => {
1285
- const item: unknown = props;
1286
- if (
1287
- typeof item === "object" &&
1288
- item !== null &&
1289
- "command" in item &&
1290
- typeof item.command === "function"
1291
- ) {
1292
- item.command({ editor, range });
1293
- }
1294
- },
1295
- items: ({ query }) => filterCommands(query),
1296
- render: () => {
1297
- return {
1298
- onStart: (props) => {
1299
- onStateChange({
1300
- isOpen: true,
1301
- items: props.items,
1302
- selectedIndex: 0,
1303
- clientRect: props.clientRect ?? null,
1304
- range: props.range,
1305
- });
1306
- },
1307
- onUpdate: (props) => {
1308
- onStateChange((prev) => ({
1309
- ...prev,
1310
- items: props.items,
1311
- selectedIndex: 0,
1312
- clientRect: props.clientRect ?? null,
1313
- range: props.range,
1314
- }));
1315
- },
1316
- onKeyDown: (props) => {
1317
- if (props.event.key === "Escape") {
1318
- onStateChange((prev) => ({ ...prev, isOpen: false }));
1319
- return true;
1320
- }
1321
- if (props.event.key === "ArrowUp") {
1322
- onStateChange((prev) => ({
1323
- ...prev,
1324
- selectedIndex: (prev.selectedIndex - 1 + prev.items.length) % prev.items.length,
1325
- }));
1326
- return true;
1327
- }
1328
- if (props.event.key === "ArrowDown") {
1329
- onStateChange((prev) => ({
1330
- ...prev,
1331
- selectedIndex: (prev.selectedIndex + 1) % prev.items.length,
1332
- }));
1333
- return true;
1334
- }
1335
- if (props.event.key === "Enter") {
1336
- const state = getState();
1337
- if (state.items.length > 0 && state.range) {
1338
- const item = state.items[state.selectedIndex];
1339
- if (item) {
1340
- item.command({ editor: this.editor, range: state.range });
1341
- onStateChange((prev) => ({ ...prev, isOpen: false }));
1342
- return true;
1343
- }
1344
- }
1345
- return false;
1346
- }
1347
- return false;
1348
- },
1349
- onExit: () => {
1350
- onStateChange((prev) => ({ ...prev, isOpen: false }));
1351
- },
1352
- };
1353
- },
1354
- }),
1355
- ];
1356
- },
1357
- });
1358
- }
1359
-
1360
- function InlineSlashMenu({
1361
- state,
1362
- onCommand,
1363
- setSelectedIndex,
1364
- }: {
1365
- state: SlashMenuState;
1366
- onCommand: (item: SlashCommandItem) => void;
1367
- setSelectedIndex: (index: number) => void;
1368
- }) {
1369
- const containerRef = React.useRef<HTMLDivElement>(null);
1370
-
1371
- // Track whether we have a positioned reference to avoid rendering at (0,0)
1372
- const [hasReference, setHasReference] = React.useState(false);
1373
-
1374
- const { refs, floatingStyles } = useFloating({
1375
- open: state.isOpen && hasReference,
1376
- placement: "bottom-start",
1377
- middleware: [offset(8), flip(), shift({ padding: 8 })],
1378
- whileElementsMounted: autoUpdate,
1379
- });
1380
-
1381
- React.useEffect(() => {
1382
- if (state.clientRect) {
1383
- const clientRectFn = state.clientRect;
1384
- refs.setReference({
1385
- getBoundingClientRect: () => clientRectFn() ?? new DOMRect(),
1386
- });
1387
- setHasReference(true);
1388
- } else {
1389
- setHasReference(false);
1390
- }
1391
- }, [state.clientRect, refs]);
1392
-
1393
- // Reset reference tracking when menu closes
1394
- React.useEffect(() => {
1395
- if (!state.isOpen) setHasReference(false);
1396
- }, [state.isOpen]);
1397
-
1398
- React.useEffect(() => {
1399
- if (!state.isOpen || !hasReference) return;
1400
- const container = containerRef.current;
1401
- if (!container) return;
1402
- const selected = container.querySelector(`[data-index="${state.selectedIndex}"]`);
1403
- if (selected instanceof HTMLElement) {
1404
- // Use scrollIntoView only within the menu container to avoid scrolling the page
1405
- const containerTop = container.scrollTop;
1406
- const containerBottom = containerTop + container.clientHeight;
1407
- const itemTop = selected.offsetTop;
1408
- const itemBottom = itemTop + selected.offsetHeight;
1409
- if (itemTop < containerTop) {
1410
- container.scrollTop = itemTop;
1411
- } else if (itemBottom > containerBottom) {
1412
- container.scrollTop = itemBottom - container.clientHeight;
1413
- }
1414
- }
1415
- }, [state.selectedIndex, state.isOpen, hasReference]);
1416
-
1417
- if (!state.isOpen || !hasReference) return null;
1418
-
1419
- return createPortal(
1420
- <div
1421
- ref={(node) => {
1422
- containerRef.current = node;
1423
- refs.setFloating(node);
1424
- }}
1425
- style={{
1426
- ...floatingStyles,
1427
- zIndex: 100,
1428
- borderRadius: "8px",
1429
- border: "1px solid #d1d5db",
1430
- background: "white",
1431
- padding: "4px",
1432
- boxShadow: "0 4px 12px rgba(0, 0, 0, 0.15)",
1433
- minWidth: "220px",
1434
- maxHeight: "300px",
1435
- overflowY: "auto",
1436
- }}
1437
- className="emdash-slash-menu"
1438
- >
1439
- {state.items.length === 0 ? (
1440
- <p
1441
- style={{
1442
- padding: "8px 12px",
1443
- fontSize: "13px",
1444
- color: "#9ca3af",
1445
- margin: 0,
1446
- }}
1447
- >
1448
- No results
1449
- </p>
1450
- ) : (
1451
- state.items.map((item, index) => (
1452
- <button
1453
- key={item.id}
1454
- type="button"
1455
- data-index={index}
1456
- style={{
1457
- display: "flex",
1458
- alignItems: "center",
1459
- gap: "12px",
1460
- width: "100%",
1461
- padding: "8px 12px",
1462
- fontSize: "13px",
1463
- borderRadius: "4px",
1464
- border: "none",
1465
- textAlign: "left",
1466
- cursor: "pointer",
1467
- background: index === state.selectedIndex ? "#f3f4f6" : "transparent",
1468
- }}
1469
- onClick={() => onCommand(item)}
1470
- onMouseEnter={() => setSelectedIndex(index)}
1471
- >
1472
- <span
1473
- style={{
1474
- width: "24px",
1475
- height: "24px",
1476
- display: "flex",
1477
- alignItems: "center",
1478
- justifyContent: "center",
1479
- flexShrink: 0,
1480
- fontSize: "14px",
1481
- fontWeight: 600,
1482
- color: "#6b7280",
1483
- background: "#f3f4f6",
1484
- borderRadius: "4px",
1485
- }}
1486
- >
1487
- {item.icon}
1488
- </span>
1489
- <span style={{ display: "flex", flexDirection: "column" }}>
1490
- <span style={{ fontWeight: 500 }}>{item.title}</span>
1491
- <span style={{ fontSize: "12px", color: "#9ca3af" }}>{item.description}</span>
1492
- </span>
1493
- </button>
1494
- ))
1495
- )}
1496
- </div>,
1497
- document.body,
1498
- );
1499
- }
1500
-
1501
- // ── Media Picker ───────────────────────────────────────────────────
1502
-
1503
- interface MediaItemData {
1504
- id: string;
1505
- filename: string;
1506
- mimeType: string;
1507
- url: string;
1508
- storageKey?: string;
1509
- width?: number;
1510
- height?: number;
1511
- blurhash?: string;
1512
- dominantColor?: string;
1513
- alt?: string;
1514
- provider?: string;
1515
- previewUrl?: string;
1516
- meta?: Record<string, unknown>;
1517
- }
1518
-
1519
- interface ProviderInfo {
1520
- id: string;
1521
- name: string;
1522
- icon?: string;
1523
- capabilities: { browse: boolean; search: boolean; upload: boolean; delete: boolean };
1524
- }
1525
-
1526
- const API_BASE = "/_emdash/api";
1527
-
1528
- async function ecFetch(url: string, init?: RequestInit): Promise<Response> {
1529
- const base = new Headers(init?.headers);
1530
- base.set("X-EmDash-Request", "1");
1531
- return fetch(url, {
1532
- credentials: "same-origin",
1533
- ...init,
1534
- headers: base,
1535
- });
1536
- }
1537
-
1538
- function InlineMediaPicker({
1539
- open,
1540
- onClose,
1541
- onSelect,
1542
- }: {
1543
- open: boolean;
1544
- onClose: () => void;
1545
- onSelect: (item: MediaItemData) => void;
1546
- }) {
1547
- const [providers, setProviders] = React.useState<ProviderInfo[]>([]);
1548
- const [activeProvider, setActiveProvider] = React.useState("local");
1549
- const [items, setItems] = React.useState<MediaItemData[]>([]);
1550
- const [loading, setLoading] = React.useState(false);
1551
- const [uploading, setUploading] = React.useState(false);
1552
- const [selectedId, setSelectedId] = React.useState<string | null>(null);
1553
- const fileInputRef = React.useRef<HTMLInputElement>(null);
1554
-
1555
- // Fetch providers on open
1556
- React.useEffect(() => {
1557
- if (!open) return;
1558
- setSelectedId(null);
1559
- setActiveProvider("local");
1560
- ecFetch(`${API_BASE}/media/providers`)
1561
- .then((r) => r.json())
1562
- .then((d) => setProviders(d.data.items ?? []))
1563
- .catch(() => setProviders([]));
1564
- }, [open]);
1565
-
1566
- // Fetch items when provider changes
1567
- React.useEffect(() => {
1568
- if (!open) return;
1569
- setLoading(true);
1570
- setSelectedId(null);
1571
-
1572
- const url =
1573
- activeProvider === "local"
1574
- ? `${API_BASE}/media?mimeType=image/&limit=50`
1575
- : `${API_BASE}/media/providers/${activeProvider}?mimeType=image/&limit=50`;
1576
-
1577
- void (async () => {
1578
- try {
1579
- const r = await ecFetch(url);
1580
- const d = await r.json();
1581
- const raw = d.data.items ?? [];
1582
- // eslint-disable-next-line typescript/no-unsafe-type-assertion -- API response items mapped to MediaItem shape
1583
- const typedRaw = raw as Array<{
1584
- id: string;
1585
- filename?: string;
1586
- mimeType?: string;
1587
- url?: string;
1588
- previewUrl?: string;
1589
- storageKey?: string;
1590
- width?: number;
1591
- height?: number;
1592
- blurhash?: string;
1593
- dominantColor?: string;
1594
- alt?: string;
1595
- meta?: Record<string, unknown>;
1596
- }>;
1597
- setItems(
1598
- typedRaw.map((item) => ({
1599
- id: item.id,
1600
- filename: item.filename || "",
1601
- mimeType: item.mimeType || "image/unknown",
1602
- url:
1603
- item.url ||
1604
- item.previewUrl ||
1605
- (item.storageKey ? `${API_BASE}/media/file/${item.storageKey}` : ""),
1606
- storageKey: item.storageKey,
1607
- width: item.width,
1608
- height: item.height,
1609
- blurhash: item.blurhash,
1610
- dominantColor: item.dominantColor,
1611
- alt: item.alt,
1612
- provider: activeProvider === "local" ? undefined : activeProvider,
1613
- previewUrl: item.previewUrl,
1614
- meta: item.meta,
1615
- })),
1616
- );
1617
- } catch {
1618
- setItems([]);
1619
- } finally {
1620
- setLoading(false);
1621
- }
1622
- })();
1623
- }, [open, activeProvider]);
1624
-
1625
- const handleUpload = async (file: File) => {
1626
- setUploading(true);
1627
- try {
1628
- // Detect dimensions and generate a thumbnail for large images to
1629
- // avoid OOM in server-side blurhash generation on Workers.
1630
- const dims = await new Promise<{
1631
- width?: number;
1632
- height?: number;
1633
- thumbnail?: Blob;
1634
- }>((resolve) => {
1635
- if (!file.type.startsWith("image/")) return resolve({});
1636
- const img = new window.Image();
1637
- img.onload = () => {
1638
- const w = img.naturalWidth;
1639
- const h = img.naturalHeight;
1640
- // 32 MB RGBA threshold — matches server MAX_DECODED_BYTES
1641
- if (w * h * 4 > 32 * 1024 * 1024) {
1642
- const { width: thumbW, height: thumbH } = computeThumbnailSize(w, h);
1643
- try {
1644
- const canvas = document.createElement("canvas");
1645
- canvas.width = thumbW;
1646
- canvas.height = thumbH;
1647
- const ctx = canvas.getContext("2d");
1648
- if (ctx) {
1649
- ctx.drawImage(img, 0, 0, thumbW, thumbH);
1650
- canvas.toBlob((blob) => {
1651
- URL.revokeObjectURL(img.src);
1652
- resolve({ width: w, height: h, thumbnail: blob ?? undefined });
1653
- }, "image/png");
1654
- return;
1655
- }
1656
- } catch {
1657
- // Canvas allocation or draw failed — fall through to no-thumbnail path
1658
- }
1659
- }
1660
- URL.revokeObjectURL(img.src);
1661
- resolve({ width: w, height: h });
1662
- };
1663
- img.onerror = () => {
1664
- resolve({});
1665
- URL.revokeObjectURL(img.src);
1666
- };
1667
- img.src = URL.createObjectURL(file);
1668
- });
1669
-
1670
- let item: MediaItemData;
1671
-
1672
- if (activeProvider === "local") {
1673
- const formData = new FormData();
1674
- formData.append("file", file);
1675
- if (dims.width) formData.append("width", String(dims.width));
1676
- if (dims.height) formData.append("height", String(dims.height));
1677
- if (dims.thumbnail) formData.append("thumbnail", dims.thumbnail, "thumb.png");
1678
- const res = await ecFetch(`${API_BASE}/media`, { method: "POST", body: formData });
1679
- const data = await res.json();
1680
- const unwrapped = data.data ?? data;
1681
- if (!unwrapped.item) throw new Error("Upload failed");
1682
- const raw = unwrapped.item;
1683
- item = {
1684
- id: raw.id,
1685
- filename: raw.filename || file.name,
1686
- mimeType: raw.mimeType || file.type,
1687
- url: raw.url || raw.previewUrl || `${API_BASE}/media/file/${raw.storageKey}`,
1688
- storageKey: raw.storageKey,
1689
- width: raw.width || dims.width,
1690
- height: raw.height || dims.height,
1691
- blurhash: raw.blurhash,
1692
- dominantColor: raw.dominantColor,
1693
- alt: raw.alt,
1694
- };
1695
- } else {
1696
- const formData = new FormData();
1697
- formData.append("file", file);
1698
- const res = await ecFetch(`${API_BASE}/media/providers/${activeProvider}`, {
1699
- method: "POST",
1700
- body: formData,
1701
- });
1702
- const data = await res.json();
1703
- const unwrapped = data.data ?? data;
1704
- if (!unwrapped.item) throw new Error("Upload failed");
1705
- const raw = unwrapped.item;
1706
- item = {
1707
- id: raw.id,
1708
- filename: raw.filename || file.name,
1709
- mimeType: raw.mimeType || file.type,
1710
- url: raw.previewUrl || "",
1711
- width: raw.width || dims.width,
1712
- height: raw.height || dims.height,
1713
- blurhash: raw.blurhash,
1714
- dominantColor: raw.dominantColor,
1715
- alt: raw.alt,
1716
- provider: activeProvider,
1717
- previewUrl: raw.previewUrl,
1718
- meta: raw.meta,
1719
- };
1720
- }
1721
-
1722
- setItems((prev) => [item, ...prev]);
1723
- setSelectedId(item.id);
1724
- } catch (err) {
1725
- console.error("Upload failed:", err);
1726
- } finally {
1727
- setUploading(false);
1728
- }
1729
- };
1730
-
1731
- const handleConfirm = () => {
1732
- const item = items.find((i) => i.id === selectedId);
1733
- if (item) onSelect(item);
1734
- };
1735
-
1736
- const providerTabs = React.useMemo(() => {
1737
- const tabs: Array<{ id: string; name: string; icon?: string }> = [
1738
- { id: "local", name: "Library" },
1739
- ];
1740
- for (const p of providers) {
1741
- if (p.id !== "local") tabs.push({ id: p.id, name: p.name, icon: p.icon });
1742
- }
1743
- return tabs;
1744
- }, [providers]);
1745
-
1746
- if (!open) return null;
1747
-
1748
- return createPortal(
1749
- <div
1750
- style={{
1751
- position: "fixed",
1752
- inset: 0,
1753
- zIndex: 10000,
1754
- display: "flex",
1755
- alignItems: "center",
1756
- justifyContent: "center",
1757
- background: "rgba(0,0,0,0.5)",
1758
- fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
1759
- }}
1760
- onClick={(e) => {
1761
- if (e.target === e.currentTarget) onClose();
1762
- }}
1763
- >
1764
- <div
1765
- style={{
1766
- background: "white",
1767
- borderRadius: "12px",
1768
- width: "min(700px, 90vw)",
1769
- maxHeight: "80vh",
1770
- display: "flex",
1771
- flexDirection: "column",
1772
- overflow: "hidden",
1773
- boxShadow: "0 20px 60px rgba(0,0,0,0.3)",
1774
- }}
1775
- className="emdash-media-picker"
1776
- >
1777
- {/* Header */}
1778
- <div
1779
- style={{
1780
- display: "flex",
1781
- alignItems: "center",
1782
- justifyContent: "space-between",
1783
- padding: "16px 20px",
1784
- borderBottom: "1px solid #e5e7eb",
1785
- }}
1786
- >
1787
- <span style={{ fontSize: "16px", fontWeight: 600 }}>Insert Image</span>
1788
- <button
1789
- type="button"
1790
- onClick={onClose}
1791
- style={{
1792
- background: "none",
1793
- border: "none",
1794
- cursor: "pointer",
1795
- fontSize: "18px",
1796
- padding: "4px 8px",
1797
- borderRadius: "4px",
1798
- color: "#6b7280",
1799
- }}
1800
- aria-label="Close"
1801
- >
1802
- ✕
1803
- </button>
1804
- </div>
1805
-
1806
- {/* Provider tabs */}
1807
- {providerTabs.length > 1 && (
1808
- <div
1809
- style={{
1810
- display: "flex",
1811
- gap: "6px",
1812
- padding: "12px 20px",
1813
- borderBottom: "1px solid #e5e7eb",
1814
- flexWrap: "wrap",
1815
- }}
1816
- >
1817
- {providerTabs.map((tab) => (
1818
- <button
1819
- key={tab.id}
1820
- type="button"
1821
- onClick={() => setActiveProvider(tab.id)}
1822
- style={{
1823
- padding: "6px 14px",
1824
- fontSize: "13px",
1825
- fontWeight: 500,
1826
- borderRadius: "6px",
1827
- border: "none",
1828
- cursor: "pointer",
1829
- background: activeProvider === tab.id ? "#3b82f6" : "#f3f4f6",
1830
- color: activeProvider === tab.id ? "white" : "#4b5563",
1831
- }}
1832
- >
1833
- {tab.icon && (
1834
- <span
1835
- style={{ marginRight: "6px", display: "inline-flex", alignItems: "center" }}
1836
- >
1837
- {tab.icon.startsWith("data:") || tab.icon.startsWith("http") ? (
1838
- <img src={tab.icon} alt="" style={{ width: "16px", height: "16px" }} />
1839
- ) : (
1840
- tab.icon
1841
- )}
1842
- </span>
1843
- )}
1844
- {tab.name}
1845
- </button>
1846
- ))}
1847
- </div>
1848
- )}
1849
-
1850
- {/* Upload bar */}
1851
- <div
1852
- style={{
1853
- display: "flex",
1854
- alignItems: "center",
1855
- justifyContent: "space-between",
1856
- padding: "12px 20px",
1857
- borderBottom: "1px solid #e5e7eb",
1858
- }}
1859
- >
1860
- <span style={{ fontSize: "13px", color: "#6b7280" }}>
1861
- {loading ? "Loading…" : `${items.length} image${items.length !== 1 ? "s" : ""}`}
1862
- </span>
1863
- <button
1864
- type="button"
1865
- onClick={() => fileInputRef.current?.click()}
1866
- disabled={uploading}
1867
- style={{
1868
- padding: "6px 14px",
1869
- fontSize: "13px",
1870
- fontWeight: 500,
1871
- borderRadius: "6px",
1872
- border: "1px solid #d1d5db",
1873
- cursor: uploading ? "not-allowed" : "pointer",
1874
- background: "white",
1875
- color: "#374151",
1876
- opacity: uploading ? 0.6 : 1,
1877
- }}
1878
- >
1879
- {uploading ? "Uploading…" : "Upload"}
1880
- </button>
1881
- <input
1882
- ref={fileInputRef}
1883
- type="file"
1884
- accept="image/*"
1885
- style={{ display: "none" }}
1886
- onChange={(e) => {
1887
- const file = e.target.files?.[0];
1888
- if (file) void handleUpload(file);
1889
- if (fileInputRef.current) fileInputRef.current.value = "";
1890
- }}
1891
- />
1892
- </div>
1893
-
1894
- {/* Grid */}
1895
- <div
1896
- style={{
1897
- flex: 1,
1898
- overflowY: "auto",
1899
- padding: "16px 20px",
1900
- minHeight: "250px",
1901
- }}
1902
- >
1903
- {loading ? (
1904
- <div
1905
- style={{
1906
- display: "flex",
1907
- alignItems: "center",
1908
- justifyContent: "center",
1909
- height: "200px",
1910
- color: "#9ca3af",
1911
- fontSize: "14px",
1912
- }}
1913
- >
1914
- Loading…
1915
- </div>
1916
- ) : items.length === 0 ? (
1917
- <div
1918
- style={{
1919
- display: "flex",
1920
- flexDirection: "column",
1921
- alignItems: "center",
1922
- justifyContent: "center",
1923
- height: "200px",
1924
- color: "#9ca3af",
1925
- fontSize: "14px",
1926
- textAlign: "center",
1927
- }}
1928
- >
1929
- <div style={{ fontSize: "32px", marginBottom: "8px" }}>🖼</div>
1930
- No images found
1931
- <button
1932
- type="button"
1933
- onClick={() => fileInputRef.current?.click()}
1934
- style={{
1935
- marginTop: "12px",
1936
- padding: "8px 16px",
1937
- fontSize: "13px",
1938
- borderRadius: "6px",
1939
- border: "1px solid #d1d5db",
1940
- background: "white",
1941
- cursor: "pointer",
1942
- color: "#374151",
1943
- }}
1944
- >
1945
- Upload an image
1946
- </button>
1947
- </div>
1948
- ) : (
1949
- <div
1950
- style={{
1951
- display: "grid",
1952
- gridTemplateColumns: "repeat(auto-fill, minmax(110px, 1fr))",
1953
- gap: "10px",
1954
- }}
1955
- >
1956
- {items.map((item) => {
1957
- const isSelected = selectedId === item.id;
1958
- const thumb = item.url || item.previewUrl || "";
1959
- return (
1960
- <button
1961
- key={item.id}
1962
- type="button"
1963
- onClick={() => setSelectedId(item.id)}
1964
- onDoubleClick={() => onSelect(item)}
1965
- style={{
1966
- position: "relative",
1967
- aspectRatio: "1",
1968
- borderRadius: "8px",
1969
- border: isSelected ? "2px solid #3b82f6" : "2px solid transparent",
1970
- overflow: "hidden",
1971
- cursor: "pointer",
1972
- padding: 0,
1973
- background: "#f3f4f6",
1974
- outline: isSelected ? "2px solid rgba(59,130,246,0.3)" : "none",
1975
- outlineOffset: "1px",
1976
- }}
1977
- aria-label={item.filename}
1978
- >
1979
- {thumb ? (
1980
- <img
1981
- src={thumb}
1982
- alt=""
1983
- style={{ width: "100%", height: "100%", objectFit: "cover" }}
1984
- />
1985
- ) : (
1986
- <div
1987
- style={{
1988
- width: "100%",
1989
- height: "100%",
1990
- display: "flex",
1991
- alignItems: "center",
1992
- justifyContent: "center",
1993
- fontSize: "24px",
1994
- }}
1995
- >
1996
- 🖼
1997
- </div>
1998
- )}
1999
- {isSelected && (
2000
- <div
2001
- style={{
2002
- position: "absolute",
2003
- inset: 0,
2004
- background: "rgba(59,130,246,0.15)",
2005
- display: "flex",
2006
- alignItems: "center",
2007
- justifyContent: "center",
2008
- }}
2009
- >
2010
- <div
2011
- style={{
2012
- width: "24px",
2013
- height: "24px",
2014
- borderRadius: "50%",
2015
- background: "#3b82f6",
2016
- color: "white",
2017
- display: "flex",
2018
- alignItems: "center",
2019
- justifyContent: "center",
2020
- fontSize: "14px",
2021
- }}
2022
- >
2023
- ✓
2024
- </div>
2025
- </div>
2026
- )}
2027
- <div
2028
- style={{
2029
- position: "absolute",
2030
- bottom: 0,
2031
- left: 0,
2032
- right: 0,
2033
- background: "linear-gradient(transparent, rgba(0,0,0,0.6))",
2034
- padding: "16px 6px 4px",
2035
- }}
2036
- >
2037
- <div
2038
- style={{
2039
- fontSize: "11px",
2040
- color: "white",
2041
- overflow: "hidden",
2042
- textOverflow: "ellipsis",
2043
- whiteSpace: "nowrap",
2044
- }}
2045
- >
2046
- {item.filename}
2047
- </div>
2048
- </div>
2049
- </button>
2050
- );
2051
- })}
2052
- </div>
2053
- )}
2054
- </div>
2055
-
2056
- {/* Footer */}
2057
- <div
2058
- style={{
2059
- display: "flex",
2060
- justifyContent: "flex-end",
2061
- gap: "8px",
2062
- padding: "12px 20px",
2063
- borderTop: "1px solid #e5e7eb",
2064
- }}
2065
- >
2066
- <button
2067
- type="button"
2068
- onClick={onClose}
2069
- style={{
2070
- padding: "8px 16px",
2071
- fontSize: "13px",
2072
- fontWeight: 500,
2073
- borderRadius: "6px",
2074
- border: "1px solid #d1d5db",
2075
- background: "white",
2076
- cursor: "pointer",
2077
- color: "#374151",
2078
- }}
2079
- >
2080
- Cancel
2081
- </button>
2082
- <button
2083
- type="button"
2084
- onClick={handleConfirm}
2085
- disabled={!selectedId}
2086
- style={{
2087
- padding: "8px 16px",
2088
- fontSize: "13px",
2089
- fontWeight: 500,
2090
- borderRadius: "6px",
2091
- border: "none",
2092
- background: selectedId ? "#3b82f6" : "#93c5fd",
2093
- color: "white",
2094
- cursor: selectedId ? "pointer" : "not-allowed",
2095
- }}
2096
- >
2097
- Insert
2098
- </button>
2099
- </div>
2100
- </div>
2101
- </div>,
2102
- document.body,
2103
- );
2104
- }
2105
-
2106
1043
  // ── Component ──────────────────────────────────────────────────────
2107
1044
 
2108
1045
  export interface InlinePortableTextEditorProps {
@@ -2128,8 +1065,8 @@ export function InlinePortableTextEditor({
2128
1065
  const savingRef = React.useRef(false);
2129
1066
  const editorRef = React.useRef<ReturnType<typeof useEditor>>(null);
2130
1067
 
2131
- // Media picker state
2132
- const [mediaPickerOpen, setMediaPickerOpen] = React.useState(false);
1068
+ // Where the image picker that `/image` opened will put the image.
1069
+ const [imagePickerAt, setImagePickerAt] = React.useState<number | null>(null);
2133
1070
  const [unsupportedFileGuidance, setUnsupportedFileGuidance] = React.useState<{
2134
1071
  message: string;
2135
1072
  version: number;
@@ -2146,38 +1083,54 @@ export function InlinePortableTextEditor({
2146
1083
  [showUnsupportedFileGuidance],
2147
1084
  );
2148
1085
 
2149
- // Listen for the slash command's media picker event
2150
- React.useEffect(() => {
2151
- const handler = () => setMediaPickerOpen(true);
2152
- document.addEventListener("emdash:open-media-picker", handler);
2153
- return () => document.removeEventListener("emdash:open-media-picker", handler);
2154
- }, []);
1086
+ const uiRoot = useInlineUiRoot();
2155
1087
 
2156
- // Slash menu state — use ref to avoid re-creating the extension on state change
2157
- const [slashMenuState, setSlashMenuState] = React.useState<SlashMenuState>(initialSlashMenuState);
1088
+ // The Suggestion plugin's key handlers read the slash menu's state as soon
1089
+ // as it changes, before React commits it, so the ref takes each change
1090
+ // synchronously and the extension, created once, reads the ref.
1091
+ const [slashMenuState, setSlashMenuStateRaw] =
1092
+ React.useState<SlashMenuState>(initialSlashMenuState);
2158
1093
  const slashMenuStateRef = React.useRef(slashMenuState);
2159
- slashMenuStateRef.current = slashMenuState;
2160
-
2161
- const filterCommandsRef = React.useRef((query: string): SlashCommandItem[] => {
2162
- const q = query.toLowerCase();
2163
- return slashCommands.filter(
2164
- (cmd) =>
2165
- cmd.title.toLowerCase().includes(q) ||
2166
- cmd.description.toLowerCase().includes(q) ||
2167
- cmd.aliases?.some((a) => a.toLowerCase().includes(q)),
2168
- );
1094
+ const setSlashMenuState: React.Dispatch<React.SetStateAction<SlashMenuState>> = React.useCallback(
1095
+ (action) => {
1096
+ const next = typeof action === "function" ? action(slashMenuStateRef.current) : action;
1097
+ slashMenuStateRef.current = next;
1098
+ setSlashMenuStateRaw(next);
1099
+ },
1100
+ [],
1101
+ );
1102
+ const slashMenuActionsRef = React.useRef({
1103
+ run: (_item: SlashCommandItem) => {},
1104
+ dismiss: () => {},
2169
1105
  });
2170
1106
 
2171
- const initialContent = React.useMemo(
2172
- () => portableTextToPM(value || []),
2173
- [], // Only compute once on mount
2174
- );
1107
+ const [loadState] = React.useState<{
1108
+ content: JSONContent;
1109
+ error: UnsupportedPortableTextMarksError | null;
1110
+ }>(() => {
1111
+ try {
1112
+ return { content: portableTextToPM(value || []), error: null };
1113
+ } catch (error) {
1114
+ if (error instanceof UnsupportedPortableTextMarksError) {
1115
+ return {
1116
+ content: { type: "doc", content: [{ type: "paragraph" }] },
1117
+ error,
1118
+ };
1119
+ }
1120
+ throw error;
1121
+ }
1122
+ });
1123
+
1124
+ const initialContent = loadState.content;
1125
+ const loadError = loadState.error;
1126
+ const [saveError, setSaveError] = React.useState<string | null>(null);
2175
1127
 
2176
1128
  const getBlocks = React.useCallback((): PTBlock[] => {
2177
1129
  const editor = editorRef.current;
2178
1130
  if (!editor) return initialRef.current;
2179
1131
  const json: unknown = editor.getJSON();
2180
- if (!isPMNode(json)) return initialRef.current;
1132
+ if (!isProseMirrorDocument(json)) return initialRef.current;
1133
+ assertProseMirrorMarksSupported(json);
2181
1134
  return pmToPortableText(json);
2182
1135
  }, []);
2183
1136
 
@@ -2186,26 +1139,34 @@ export function InlinePortableTextEditor({
2186
1139
  // A pagehide flush must not be skipped: an in-flight blur save is
2187
1140
  // cancelled by the navigation, so the keepalive request is the only
2188
1141
  // one that can still land.
1142
+ if (loadError) return;
2189
1143
  if (savingRef.current && !options?.keepalive) return;
2190
1144
 
2191
1145
  const doc = editorRef.current?.state.doc;
2192
1146
  if (!doc || !savedDocRef.current || doc.eq(savedDocRef.current)) return;
2193
- const blocks = getBlocks();
2194
1147
 
2195
1148
  savingRef.current = true;
1149
+ let settle = () => {};
1150
+ const done = new Promise<void>((resolve) => {
1151
+ settle = () => resolve();
1152
+ });
1153
+ // The visual-editing toolbar holds Publish until `done` settles.
1154
+ document.dispatchEvent(new CustomEvent("emdash:save-pending", { detail: { done } }));
2196
1155
  try {
1156
+ const blocks = getBlocks();
2197
1157
  const res = await fetch(
2198
1158
  `/_emdash/api/content/${encodeURIComponent(collection)}/${encodeURIComponent(entryId)}`,
2199
1159
  {
2200
1160
  method: "PUT",
2201
1161
  credentials: "same-origin",
2202
1162
  headers: { "Content-Type": "application/json", "X-EmDash-Request": "1" },
2203
- body: JSON.stringify({ data: { [field]: blocks } }),
1163
+ body: JSON.stringify({ data: { [field]: blocks }, skipRevision: true }),
2204
1164
  keepalive: options?.keepalive ?? false,
2205
1165
  },
2206
1166
  );
2207
1167
 
2208
1168
  if (res.ok) {
1169
+ setSaveError(null);
2209
1170
  initialRef.current = blocks;
2210
1171
  savedDocRef.current = doc;
2211
1172
  document.dispatchEvent(new CustomEvent("emdash:save", { detail: { state: "saved" } }));
@@ -2215,17 +1176,24 @@ export function InlinePortableTextEditor({
2215
1176
  }),
2216
1177
  );
2217
1178
  } else {
1179
+ setSaveError(`Save failed: ${res.status}`);
2218
1180
  document.dispatchEvent(new CustomEvent("emdash:save", { detail: { state: "error" } }));
2219
1181
  console.error("Save failed:", res.status);
2220
1182
  }
2221
1183
  } catch (err) {
1184
+ setSaveError(
1185
+ err instanceof UnsupportedPortableTextMarksError
1186
+ ? `Save failed: unsupported formatting (${err.marks.join(", ")}).`
1187
+ : "Save failed. Please try again.",
1188
+ );
2222
1189
  document.dispatchEvent(new CustomEvent("emdash:save", { detail: { state: "error" } }));
2223
1190
  console.error("Save failed:", err);
2224
1191
  } finally {
2225
1192
  savingRef.current = false;
1193
+ settle();
2226
1194
  }
2227
1195
  },
2228
- [collection, entryId, field, getBlocks],
1196
+ [collection, entryId, field, getBlocks, loadError],
2229
1197
  );
2230
1198
 
2231
1199
  // Flush unsaved edits when the page goes away (browser back/forward,
@@ -2246,44 +1214,34 @@ export function InlinePortableTextEditor({
2246
1214
  const slashCommandsExtension = React.useMemo(
2247
1215
  () =>
2248
1216
  createSlashCommandsExtension({
2249
- filterCommands: (query: string) => filterCommandsRef.current(query),
2250
1217
  onStateChange: setSlashMenuState,
2251
1218
  getState: () => slashMenuStateRef.current,
1219
+ onCommand: (item) => slashMenuActionsRef.current.run(item),
1220
+ onDismiss: () => slashMenuActionsRef.current.dismiss(),
2252
1221
  }),
2253
- [],
1222
+ [setSlashMenuState],
2254
1223
  );
2255
1224
 
2256
1225
  const editor = useEditor({
2257
1226
  extensions: [
2258
1227
  StarterKit.configure({
2259
- heading: { levels: [1, 2, 3] },
2260
1228
  dropcursor: { color: "#3b82f6", width: 2 },
2261
1229
  // Replaced with InlineCodeBlockExtension below (adds language picker).
2262
1230
  codeBlock: false,
2263
1231
  // Replaced with CodeMarkExtension so inline code can combine with link/etc.
2264
1232
  code: false,
2265
1233
  orderedList: false,
1234
+ // Registered on their own below, so links don't open when clicked.
1235
+ link: false,
1236
+ underline: false,
2266
1237
  }),
2267
1238
  EmDashOrderedList,
2268
1239
  CodeMarkExtension,
2269
1240
  InlineCodeBlockExtension,
2270
- Image.extend({
2271
- addAttributes() {
2272
- return {
2273
- ...this.parent?.(),
2274
- mediaId: { default: null },
2275
- provider: { default: null },
2276
- width: { default: null },
2277
- height: { default: null },
2278
- displayWidth: { default: null },
2279
- displayHeight: { default: null },
2280
- caption: { default: null },
2281
- blurhash: { default: null },
2282
- dominantColor: { default: null },
2283
- };
2284
- },
2285
- }),
1241
+ InlineImageExtension,
2286
1242
  Underline,
1243
+ Subscript,
1244
+ Superscript,
2287
1245
  Link.configure({
2288
1246
  openOnClick: false,
2289
1247
  HTMLAttributes: { class: "underline text-blue-600 dark:text-blue-400" },
@@ -2328,64 +1286,105 @@ export function InlinePortableTextEditor({
2328
1286
  if (editor && !savedDocRef.current) savedDocRef.current = editor.state.doc;
2329
1287
  }, [editor]);
2330
1288
 
2331
- // Slash menu command handler
2332
- const handleSlashCommand = React.useCallback(
1289
+ const runSlashCommand = React.useCallback(
2333
1290
  (item: SlashCommandItem) => {
2334
- if (!editor || !slashMenuStateRef.current.range) return;
2335
- item.command({ editor, range: slashMenuStateRef.current.range });
1291
+ const { range } = slashMenuStateRef.current;
1292
+ if (!editor || !range) return;
1293
+ item.command({
1294
+ editor,
1295
+ range,
1296
+ openImagePicker: () => setImagePickerAt(editor.state.selection.from),
1297
+ });
2336
1298
  setSlashMenuState((prev) => ({ ...prev, isOpen: false }));
2337
1299
  },
2338
- [editor],
1300
+ [editor, setSlashMenuState],
2339
1301
  );
1302
+ /** Closes the slash menu without a command, keeping what was typed. */
1303
+ const closeSlashMenu = React.useCallback(() => {
1304
+ const { range } = slashMenuStateRef.current;
1305
+ setSlashMenuState((prev) => ({
1306
+ ...prev,
1307
+ isOpen: false,
1308
+ dismissedSlashFrom: range ? range.from : prev.dismissedSlashFrom,
1309
+ }));
1310
+ if (editor && range) exitSuggestion(editor.view);
1311
+ }, [editor, setSlashMenuState]);
1312
+ slashMenuActionsRef.current = { run: runSlashCommand, dismiss: closeSlashMenu };
2340
1313
 
2341
- // Handle media selection from the picker
2342
- const handleMediaSelect = React.useCallback(
2343
- (item: MediaItemData) => {
2344
- if (!editor) return;
2345
- const src =
2346
- item.url || item.previewUrl || `/_emdash/api/media/file/${item.storageKey || item.id}`;
2347
- editor
2348
- .chain()
2349
- .focus()
2350
- .setImage({
2351
- src,
2352
- alt: item.alt || item.filename || "",
2353
- mediaId: item.id,
2354
- provider: canonicalMediaProviderId(item.provider) || "local",
2355
- width: item.width,
2356
- height: item.height,
2357
- blurhash: item.blurhash,
2358
- dominantColor: item.dominantColor,
2359
- })
2360
- .run();
2361
- setMediaPickerOpen(false);
2362
- void save();
2363
- },
2364
- [editor, save],
1314
+ // Edits made while the picker is open, as when focus stays in the editor, move the spot it inserts at.
1315
+ const pickerOpen = imagePickerAt !== null;
1316
+ React.useEffect(() => {
1317
+ if (!editor || !pickerOpen) return;
1318
+ const onTransaction = ({ transaction }: { transaction: Transaction }) => {
1319
+ if (!transaction.docChanged) return;
1320
+ setImagePickerAt((at) => (at === null ? at : transaction.mapping.map(at)));
1321
+ };
1322
+ editor.on("transaction", onTransaction);
1323
+ return () => {
1324
+ editor.off("transaction", onTransaction);
1325
+ };
1326
+ }, [editor, pickerOpen]);
1327
+
1328
+ // The image picker opens at the caret the `/image` command left.
1329
+ const caretReference = React.useMemo(
1330
+ () =>
1331
+ editor && imagePickerAt !== null
1332
+ ? {
1333
+ getBoundingClientRect: () => {
1334
+ if (editor.isDestroyed) return new DOMRect();
1335
+ const { view } = editor;
1336
+ const caret = view.coordsAtPos(Math.min(imagePickerAt, view.state.doc.content.size));
1337
+ return new DOMRect(caret.left, caret.top, 0, caret.bottom - caret.top);
1338
+ },
1339
+ contextElement: editor.view.dom,
1340
+ }
1341
+ : null,
1342
+ [editor, imagePickerAt],
2365
1343
  );
2366
1344
 
2367
- // Save on blur — but not when interacting with slash menu or media picker
1345
+ // Save on blur — but not when interacting with slash menu or image picker
2368
1346
  const handleBlur = React.useCallback(
2369
1347
  (e: React.FocusEvent<HTMLDivElement>) => {
2370
- if (mediaPickerOpen) return;
2371
1348
  const related = e.relatedTarget instanceof HTMLElement ? e.relatedTarget : null;
2372
1349
  if (related && e.currentTarget.contains(related)) return;
2373
1350
  // The copy fallback briefly moves focus to its textarea before restoring the editor.
2374
1351
  if (related?.hasAttribute("data-emdash-clipboard-fallback")) return;
2375
- // Don't save if focus moved to the slash menu (portalled to body)
2376
- if (related?.closest(".emdash-slash-menu")) return;
2377
- if (related?.closest(".emdash-media-picker")) return;
1352
+ // The toolbars, menus, and image picker live in a root of their own at the end of the page.
1353
+ if (related && uiRoot?.contains(related)) return;
1354
+ // A toolbar button keeps focus in the editor, so the toolbars skip
1355
+ // the editor's next blur; telling them again lets them hide. It waits
1356
+ // for this blur to finish, which may be a toolbar removing itself.
1357
+ const event = e.nativeEvent;
1358
+ queueMicrotask(() => {
1359
+ if (!editor || editor.isDestroyed || editor.view.hasFocus()) return;
1360
+ if (uiRoot?.contains(document.activeElement)) return;
1361
+ editor.view.dispatch(editor.state.tr.setMeta("blur", { event }));
1362
+ });
2378
1363
  void save();
2379
1364
  },
2380
- [save, mediaPickerOpen],
1365
+ [editor, save, uiRoot],
2381
1366
  );
2382
1367
 
2383
- if (!editor) return null;
1368
+ if (!editor || !uiRoot) return null;
2384
1369
 
2385
1370
  return (
2386
1371
  <div onBlur={handleBlur}>
2387
- <InlineBubbleMenu editor={editor} />
2388
- <EditorContent editor={editor} />
1372
+ {loadError ? (
1373
+ <div className="emdash-inline-editor-error" role="alert" dir="auto">
1374
+ This field can’t be edited here because it contains unsupported Portable Text marks:{" "}
1375
+ {loadError.marks.join(", ")}.
1376
+ </div>
1377
+ ) : (
1378
+ <>
1379
+ <InlineBubbleMenu editor={editor} uiRoot={uiRoot} onImageReplaced={() => void save()} />
1380
+ <EditorContent editor={editor} />
1381
+ </>
1382
+ )}
1383
+ {saveError ? (
1384
+ <div className="emdash-inline-editor-error" role="alert" dir="auto">
1385
+ {saveError}
1386
+ </div>
1387
+ ) : null}
2389
1388
  {unsupportedFileGuidance ? (
2390
1389
  <div
2391
1390
  key={unsupportedFileGuidance.version}
@@ -2398,20 +1397,33 @@ export function InlinePortableTextEditor({
2398
1397
  </div>
2399
1398
  ) : null}
2400
1399
  <InlineSlashMenu
1400
+ editor={editor}
1401
+ uiRoot={uiRoot}
2401
1402
  state={slashMenuState}
2402
- onCommand={handleSlashCommand}
1403
+ onCommand={runSlashCommand}
1404
+ onClose={closeSlashMenu}
2403
1405
  setSelectedIndex={(index) =>
2404
1406
  setSlashMenuState((prev) => ({ ...prev, selectedIndex: index }))
2405
1407
  }
2406
1408
  />
2407
- <InlineMediaPicker
2408
- open={mediaPickerOpen}
2409
- onClose={() => {
2410
- setMediaPickerOpen(false);
2411
- editor?.commands.focus();
2412
- }}
2413
- onSelect={handleMediaSelect}
2414
- />
1409
+ {imagePickerAt !== null && caretReference && (
1410
+ <InlineMediaPicker
1411
+ uiRoot={uiRoot}
1412
+ reference={caretReference}
1413
+ gap={6}
1414
+ label="Insert image"
1415
+ onChoose={(image) => {
1416
+ insertImage(editor, imagePickerAt, image);
1417
+ editor.view.focus();
1418
+ setImagePickerAt(null);
1419
+ void save();
1420
+ }}
1421
+ onClose={(reason) => {
1422
+ if (reason !== "blur") editor.view.focus();
1423
+ setImagePickerAt(null);
1424
+ }}
1425
+ />
1426
+ )}
2415
1427
  <style>{`
2416
1428
  .emdash-inline-code-block {
2417
1429
  position: relative;
@@ -2539,114 +1551,33 @@ export function InlinePortableTextEditor({
2539
1551
  --emdash-code-focus: var(--emdash-inline-code-focus, #a8d5ff);
2540
1552
  }
2541
1553
  }
2542
- .emdash-bubble-menu {
2543
- z-index: 100;
2544
- display: flex;
2545
- align-items: center;
2546
- gap: 2px;
2547
- padding: 4px;
2548
- border-radius: 8px;
2549
- border: 1px solid #d1d5db;
2550
- background: white;
2551
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
2552
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
2553
- }
2554
- .emdash-bubble-btn {
2555
- display: inline-flex;
2556
- align-items: center;
2557
- justify-content: center;
2558
- width: 32px;
2559
- height: 32px;
2560
- border-radius: 6px;
2561
- border: none;
2562
- background: transparent;
2563
- cursor: pointer;
2564
- color: inherit;
2565
- font-size: 14px;
2566
- line-height: 1;
2567
- padding: 0;
2568
- }
2569
- .emdash-bubble-btn:hover {
2570
- background: #f3f4f6;
1554
+ .emdash-inline-editor .emdash-slash-query {
1555
+ margin-inline: -0.25em;
1556
+ padding: 0.125em 0.25em;
1557
+ border-radius: 0.375rem;
1558
+ background: color-mix(in srgb, currentColor 8%, transparent);
2571
1559
  }
2572
- .emdash-bubble-btn--active {
2573
- background: #dbeafe;
2574
- color: #1d4ed8;
2575
- }
2576
- .emdash-bubble-btn--active:hover {
2577
- background: #bfdbfe;
2578
- }
2579
- .emdash-bubble-btn--danger {
2580
- color: #dc2626;
2581
- }
2582
- .emdash-bubble-divider {
2583
- display: block;
2584
- width: 1px;
2585
- height: 20px;
2586
- background: #d1d5db;
2587
- margin: 0 4px;
1560
+ .emdash-inline-editor .emdash-slash-query.is-empty::after {
1561
+ content: "Type to search";
1562
+ color: color-mix(in srgb, currentColor 45%, transparent);
1563
+ pointer-events: none;
2588
1564
  }
2589
- .emdash-bubble-link-input {
2590
- height: 28px;
2591
- width: 200px;
2592
- font-size: 13px;
2593
- padding: 0 8px;
2594
- border: 1px solid #d1d5db;
2595
- border-radius: 4px;
1565
+ ${INLINE_EDITOR_UI_STYLES}
1566
+ ${INLINE_MEDIA_PICKER_STYLES}
1567
+ ${INLINE_IMAGE_STYLES}
1568
+ .emdash-inline-editor:focus {
2596
1569
  outline: none;
2597
- background: white;
2598
- color: inherit;
2599
- font-family: inherit;
2600
1570
  }
2601
- .emdash-bubble-link-input:focus {
2602
- border-color: #3b82f6;
1571
+ .emdash-inline-editor:focus p.is-editor-empty {
1572
+ display: flow-root;
2603
1573
  }
2604
- @media (prefers-color-scheme: dark) {
2605
- .emdash-bubble-menu {
2606
- background: #1f2937;
2607
- border-color: #374151;
2608
- color: #e5e7eb;
2609
- }
2610
- .emdash-bubble-btn:hover {
2611
- background: #374151;
2612
- }
2613
- .emdash-bubble-btn--active {
2614
- background: #1e3a5f;
2615
- color: #93c5fd;
2616
- }
2617
- .emdash-bubble-btn--active:hover {
2618
- background: #1e40af;
2619
- }
2620
- .emdash-bubble-divider {
2621
- background: #4b5563;
2622
- }
2623
- .emdash-bubble-link-input {
2624
- background: #111827;
2625
- border-color: #4b5563;
2626
- color: #e5e7eb;
2627
- }
2628
- .emdash-bubble-link-input:focus {
2629
- border-color: #60a5fa;
2630
- }
2631
- .emdash-slash-menu {
2632
- background: #1f2937 !important;
2633
- border-color: #374151 !important;
2634
- color: #e5e7eb !important;
2635
- }
2636
- .emdash-slash-menu button:hover,
2637
- .emdash-slash-menu button[style*="background: rgb(243, 244, 246)"] {
2638
- background: #374151 !important;
2639
- }
2640
- .emdash-media-picker {
2641
- background: #1f2937 !important;
2642
- color: #e5e7eb !important;
2643
- }
2644
- .emdash-media-picker button {
2645
- color: #e5e7eb !important;
2646
- }
2647
- }
2648
- .emdash-inline-editor:focus {
2649
- outline: none;
1574
+ .emdash-inline-editor:focus p.is-editor-empty::before {
1575
+ content: attr(data-placeholder);
1576
+ float: inline-start;
1577
+ width: 100%;
1578
+ margin-inline-end: -100%;
1579
+ opacity: 0.5;
1580
+ pointer-events: none;
2650
1581
  }
2651
1582
  .emdash-inline-editor-guidance {
2652
1583
  margin-block-start: 0.75rem;
@@ -2661,6 +1592,19 @@ export function InlinePortableTextEditor({
2661
1592
  line-height: 1.4;
2662
1593
  text-align: start;
2663
1594
  }
1595
+ .emdash-inline-editor-error {
1596
+ margin-block-start: 0.75rem;
1597
+ padding-block: 0.625rem;
1598
+ padding-inline: 0.875rem;
1599
+ border: 1px solid #fecaca;
1600
+ border-radius: 0.5rem;
1601
+ background: #fef2f2;
1602
+ color: #991b1b;
1603
+ font-size: 0.875rem;
1604
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
1605
+ line-height: 1.4;
1606
+ text-align: start;
1607
+ }
2664
1608
  .emdash-plugin-block-placeholder {
2665
1609
  margin: 0.75rem 0;
2666
1610
  padding: 0.625rem 0.875rem;
@@ -2678,6 +1622,11 @@ export function InlinePortableTextEditor({
2678
1622
  background: #172554;
2679
1623
  color: #dbeafe;
2680
1624
  }
1625
+ .emdash-inline-editor-error {
1626
+ border-color: #991b1b;
1627
+ background: #450a0a;
1628
+ color: #fee2e2;
1629
+ }
2681
1630
  .emdash-plugin-block-placeholder {
2682
1631
  border-color: #374151;
2683
1632
  background: #111827;