dineway 0.1.49 → 0.2.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 (418) hide show
  1. package/dist/{activity-events-CwM7yxPW.mjs → activity-events-y6eT8UW6.mjs} +6 -38
  2. package/dist/actor-CrObAPV0.mjs +37 -0
  3. package/dist/after-BfniwgIf.mjs +9 -0
  4. package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins-_oeyP6x-.mjs} +1 -1
  5. package/dist/api/route-utils.d.mts +10 -10
  6. package/dist/api/route-utils.mjs +16 -13
  7. package/dist/api/schemas/index.d.mts +2 -2
  8. package/dist/api/schemas/index.mjs +5 -4
  9. package/dist/{api-BMIxRIEN.mjs → api-ByrU2q-Z.mjs} +60 -36
  10. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-CjVMQT-X.mjs} +6 -2
  11. package/dist/{apply-D_RlTYtC.mjs → apply-bZswmZPm.mjs} +117 -77
  12. package/dist/astro/image-endpoint.d.mts +7 -0
  13. package/dist/astro/image-endpoint.mjs +54 -0
  14. package/dist/astro/index.d.mts +35 -11
  15. package/dist/astro/index.mjs +157 -23
  16. package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  17. package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
  18. package/dist/astro/middleware/auth.d.mts +10 -10
  19. package/dist/astro/middleware/auth.mjs +42 -24
  20. package/dist/astro/middleware/redirect.mjs +13 -4
  21. package/dist/astro/middleware/request-context.mjs +8 -5
  22. package/dist/astro/middleware/seed.d.mts +1 -1
  23. package/dist/astro/middleware/seed.mjs +2 -2
  24. package/dist/astro/middleware/setup.mjs +1 -1
  25. package/dist/astro/middleware.mjs +333 -192
  26. package/dist/astro/routes/admin.astro +6 -1
  27. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
  28. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
  29. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  30. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  31. package/dist/astro/routes/api/admin/briefing.mjs +21 -17
  32. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
  34. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
  35. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
  36. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
  38. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
  39. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
  40. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
  41. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
  42. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
  43. package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
  44. package/dist/astro/routes/api/admin/context/_id_/history.mjs +26 -24
  45. package/dist/astro/routes/api/admin/context/_id_/index.mjs +26 -24
  46. package/dist/astro/routes/api/admin/context/_id_/review.mjs +31 -28
  47. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +31 -28
  48. package/dist/astro/routes/api/admin/context/diff.mjs +30 -27
  49. package/dist/astro/routes/api/admin/context/index.mjs +31 -28
  50. package/dist/astro/routes/api/admin/context/stale.mjs +30 -27
  51. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +26 -24
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +30 -27
  53. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +30 -27
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +27 -25
  55. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  57. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  58. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +55 -51
  59. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +55 -51
  60. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
  61. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +53 -49
  62. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +52 -48
  63. package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +52 -48
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
  68. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
  69. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
  70. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +31 -27
  71. package/dist/astro/routes/api/admin/review-requests/index.mjs +10 -9
  72. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
  73. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  74. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
  75. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  76. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  77. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
  78. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  79. package/dist/astro/routes/api/admin/users/index.mjs +7 -6
  80. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  81. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  82. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
  83. package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
  84. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
  85. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  86. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
  87. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  88. package/dist/astro/routes/api/auth/me.mjs +9 -8
  89. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  90. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  91. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  92. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
  93. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  94. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
  95. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
  96. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
  97. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
  98. package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
  99. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  100. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
  101. package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
  102. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  103. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
  104. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
  106. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  107. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -5
  108. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  109. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  110. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
  111. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -9
  112. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  113. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  114. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -9
  115. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
  116. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  117. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -5
  118. package/dist/astro/routes/api/content/_collection_/_id_.mjs +10 -9
  119. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  120. package/dist/astro/routes/api/content/_collection_/index.mjs +10 -9
  121. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  122. package/dist/astro/routes/api/dashboard.mjs +9 -8
  123. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  124. package/dist/astro/routes/api/health.mjs +1 -1
  125. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  126. package/dist/astro/routes/api/import/probe.mjs +22 -10
  127. package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
  128. package/dist/astro/routes/api/import/wordpress/execute.d.mts +19 -1
  129. package/dist/astro/routes/api/import/wordpress/execute.mjs +84 -37
  130. package/dist/astro/routes/api/import/wordpress/media.d.mts +13 -1
  131. package/dist/astro/routes/api/import/wordpress/media.mjs +19 -13
  132. package/dist/astro/routes/api/import/wordpress/prepare.mjs +35 -32
  133. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +18 -1
  134. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +120 -100
  135. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  136. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
  137. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +56 -2
  138. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +283 -55
  139. package/dist/astro/routes/api/manifest.mjs +14 -5
  140. package/dist/astro/routes/api/mcp.mjs +265 -69
  141. package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
  142. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  143. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  144. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  145. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  146. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  147. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  148. package/dist/astro/routes/api/media.mjs +27 -34
  149. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +31 -28
  150. package/dist/astro/routes/api/menus/_name_/items.mjs +31 -28
  151. package/dist/astro/routes/api/menus/_name_/reorder.mjs +31 -28
  152. package/dist/astro/routes/api/menus/_name_/translations.mjs +31 -28
  153. package/dist/astro/routes/api/menus/_name_.mjs +31 -28
  154. package/dist/astro/routes/api/menus/index.mjs +31 -28
  155. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  156. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  157. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  158. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  159. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  160. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  161. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  162. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  163. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  164. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +30 -30
  165. package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
  166. package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
  167. package/dist/astro/routes/api/redirects/_id_.mjs +32 -29
  168. package/dist/astro/routes/api/redirects/index.mjs +32 -29
  169. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  170. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  171. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +47 -43
  172. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +47 -43
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +47 -43
  174. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -43
  175. package/dist/astro/routes/api/schema/collections/index.mjs +47 -43
  176. package/dist/astro/routes/api/schema/index.mjs +13 -14
  177. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
  178. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
  179. package/dist/astro/routes/api/search/enable.mjs +11 -10
  180. package/dist/astro/routes/api/search/index.mjs +10 -9
  181. package/dist/astro/routes/api/search/rebuild.mjs +11 -10
  182. package/dist/astro/routes/api/search/stats.mjs +6 -6
  183. package/dist/astro/routes/api/search/suggest.mjs +10 -9
  184. package/dist/astro/routes/api/sections/_slug_.mjs +31 -28
  185. package/dist/astro/routes/api/sections/index.mjs +31 -28
  186. package/dist/astro/routes/api/settings/email.mjs +4 -4
  187. package/dist/astro/routes/api/settings.mjs +31 -28
  188. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  189. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  190. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
  191. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  192. package/dist/astro/routes/api/setup/index.mjs +29 -25
  193. package/dist/astro/routes/api/setup/status.mjs +3 -3
  194. package/dist/astro/routes/api/snapshot.mjs +8 -7
  195. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +34 -31
  196. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +34 -31
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +34 -31
  198. package/dist/astro/routes/api/taxonomies/index.mjs +34 -31
  199. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  200. package/dist/astro/routes/api/typegen.mjs +4 -4
  201. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  202. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  203. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  204. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +30 -27
  205. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +31 -28
  206. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +31 -28
  207. package/dist/astro/routes/api/widget-areas/_name_.mjs +28 -26
  208. package/dist/astro/routes/api/widget-areas/index.mjs +31 -28
  209. package/dist/astro/routes/api/widget-components.mjs +2 -2
  210. package/dist/astro/routes/robots.txt.mjs +8 -7
  211. package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
  212. package/dist/astro/routes/sitemap.xml.mjs +9 -8
  213. package/dist/astro/session-driver.d.mts +1 -1
  214. package/dist/astro/session-driver.mjs +2 -2
  215. package/dist/astro/types.d.mts +21 -13
  216. package/dist/{audit-BeNsSyfU.mjs → audit-ByVKIwWF.mjs} +1 -1
  217. package/dist/auth/providers/github.d.mts +1 -1
  218. package/dist/auth/providers/google.d.mts +1 -1
  219. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-CqeUmQsv.mjs} +1 -1
  220. package/dist/{authorize-BLO0m7fW.mjs → authorize-CcBxcHtz.mjs} +1 -1
  221. package/dist/{briefing-DJX6irto.mjs → briefing-BJaJI8dm.mjs} +2 -1
  222. package/dist/{briefing-CkTee1ex.mjs → briefing-CawZ59CY.mjs} +90 -28
  223. package/dist/bundle-7C_DpkEq.mjs +602 -0
  224. package/dist/{byline-BVC1lV6G.mjs → byline-e51-fWRs.mjs} +30 -62
  225. package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-CUvbslGc.d.mts} +80 -37
  226. package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-D-N5qVIG.mjs} +1 -1
  227. package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-DOJO16Gm.mjs} +3 -3
  228. package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-87nNnYl4.mjs} +2 -2
  229. package/dist/{bylines-LN9XISRo.mjs → bylines-CMQNCNFh.mjs} +9 -3
  230. package/dist/{bylines-DwokOFj6.mjs → bylines-y4LO-dTj.mjs} +5 -5
  231. package/dist/{cache-Bac05gBd.mjs → cache-C-FNTFYK.mjs} +2 -2
  232. package/dist/{chunks-CuUt7K50.mjs → chunks-CxBt-GxR.mjs} +1 -1
  233. package/dist/cli/index.mjs +94 -659
  234. package/dist/client/external-auth-headers.d.mts +1 -1
  235. package/dist/client/index.d.mts +1 -1
  236. package/dist/client/index.mjs +2 -1
  237. package/dist/{comment-Beue8-15.mjs → comment-DlA4iChg.mjs} +13 -3
  238. package/dist/comment-reaction-DfFao1ST.mjs +58 -0
  239. package/dist/{comments-DcjFIfqX.mjs → comments-DApFGMsP.mjs} +1 -1
  240. package/dist/{content-CBxYGWfL.mjs → content-Bh4BDjv8.mjs} +51 -34
  241. package/dist/content-refresh-CgutSUfO.mjs +1576 -0
  242. package/dist/{context-CQVNZaR8.mjs → context-C5W3G18y.mjs} +111 -50
  243. package/dist/{context-Df1xVYyr.mjs → context-CK4ym2Sf.mjs} +2 -2
  244. package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-MASyGgWf.mjs} +2 -1
  245. package/dist/{cron-DxCAU_Sn.mjs → cron-cKcNTix_.mjs} +7 -3
  246. package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-DQkVT7Ei.mjs} +4 -4
  247. package/dist/db/index.d.mts +3 -3
  248. package/dist/db/index.mjs +1 -1
  249. package/dist/db/libsql.d.mts +1 -1
  250. package/dist/db/postgres.d.mts +1 -1
  251. package/dist/db/sqlite.d.mts +1 -1
  252. package/dist/{device-flow-BZVGftqi.mjs → device-flow-BnqRH-T9.mjs} +5 -5
  253. package/dist/{placeholder-d54Qr_7n.mjs → enrich-DIFIFA8O.mjs} +36 -9
  254. package/dist/{error-DCSuUAZW.mjs → error-CytFlgcd.mjs} +5 -0
  255. package/dist/field-defs-cache-DRNdhBJv.mjs +49 -0
  256. package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-Crzypjqu.mjs} +1 -1
  257. package/dist/hitl-Hw1RmWOq.mjs +677 -0
  258. package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-B4Vbcmaq.mjs} +2 -2
  259. package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-hEVzvP8l.mjs} +5 -4
  260. package/dist/import-Bh9biJfx.mjs +1354 -0
  261. package/dist/{index-CZiWCQDp.d.mts → index-D4y6NGiy.d.mts} +75 -3
  262. package/dist/index.d.mts +17 -16
  263. package/dist/index.mjs +80 -68
  264. package/dist/{jsonld-DZ67souc.d.mts → jsonld-Dq0gsnOH.d.mts} +8 -4
  265. package/dist/{load-D9OiGr2m.mjs → load-DmYeniXl.mjs} +1 -1
  266. package/dist/{loader--GOYux8M.mjs → loader-CjWqjweO.mjs} +117 -31
  267. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-BxVPYMJR.mjs} +34 -1
  268. package/dist/mcp-reviewed-executor-TwVbMzG6.mjs +555 -0
  269. package/dist/media/image-endpoint.d.mts +32 -0
  270. package/dist/media/image-endpoint.mjs +111 -0
  271. package/dist/media/index.d.mts +27 -2
  272. package/dist/media/index.mjs +5 -3
  273. package/dist/media/local-runtime.d.mts +16 -11
  274. package/dist/media/local-runtime.mjs +9 -7
  275. package/dist/{media-CbKyYukG.mjs → media-DMj0grzC.mjs} +3 -1
  276. package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-BlVCSzHx.mjs} +1 -1
  277. package/dist/media-url-lEKSrpr9.mjs +20 -0
  278. package/dist/{menus-BZbXf-ej.mjs → menus-TaW1gKnk.mjs} +19 -5
  279. package/dist/{menus-C7F0sCrC.mjs → menus-xvsnVZXw.mjs} +80 -15
  280. package/dist/{normalize-ByemhhfW.mjs → normalize-5ek_z7de.mjs} +8 -1
  281. package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-DiaGvRVz.mjs} +5 -5
  282. package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dl9E8dEM.mjs} +2 -2
  283. package/dist/object-cache/memory.d.mts +14 -0
  284. package/dist/object-cache/memory.mjs +55 -0
  285. package/dist/object-cache-D51qOseS.mjs +419 -0
  286. package/dist/page/index.d.mts +4 -3
  287. package/dist/page/index.mjs +2 -2
  288. package/dist/{parse-CneSgl7-.mjs → parse-CbymENaR.mjs} +1 -1
  289. package/dist/{parser-DxfsARXL.mjs → parser-C1nYd-81.mjs} +151 -9
  290. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-uvNRZBX9.d.mts} +12 -4
  291. package/dist/plugin-utils.d.mts +9 -9
  292. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  293. package/dist/plugins/adapt-sandbox-entry.mjs +11 -2
  294. package/dist/{plugins-DzfqRREq.mjs → plugins-BolVa-tl.mjs} +831 -63
  295. package/dist/{transport-LSdZVXHF.mjs → portable-text-dA_UlJwW.mjs} +1 -134
  296. package/dist/{preview-C-3YTX2U.mjs → preview-vSVg6fwG.mjs} +4 -3
  297. package/dist/process-cache-7xgAO9JY.mjs +106 -0
  298. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-MD8zAbnH.d.mts} +1 -1
  299. package/dist/{public-url-B4xV4rGa.d.mts → public-url-gsp3oUbu.d.mts} +1 -1
  300. package/dist/{query-Ds0EnMFX.mjs → query-CfRCdaL3.mjs} +281 -76
  301. package/dist/{query-CZ3TH_Uu.mjs → query-jaAmw8E1.mjs} +11 -6
  302. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-ZLdyWoZF.mjs} +2 -2
  303. package/dist/{redirect-CEACczxo.mjs → redirect-BAjt4Z6b.mjs} +2 -2
  304. package/dist/{redirects-DYj1yPxs.mjs → redirects-BTdwpQtE.mjs} +47 -24
  305. package/dist/{redirects-ocRJmQHP.mjs → redirects-CA-xylPG.mjs} +19 -11
  306. package/dist/{registry-D7HACema.mjs → registry-CtyVedcN.mjs} +130 -77
  307. package/dist/request-context.d.mts +2 -0
  308. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CUypToDJ.mjs} +1 -1
  309. package/dist/{review-requests-Qum4713s.mjs → review-requests-C9Ff11Vq.mjs} +1 -1
  310. package/dist/{review-requests-BW2NxY-l.mjs → review-requests-DUyEmtmG.mjs} +1 -1
  311. package/dist/{runner-09sTqtv0.d.mts → runner-1tC2tIRV.d.mts} +1 -1
  312. package/dist/runner-DB7CRfOF.mjs +6740 -0
  313. package/dist/{runtime-C4-2lSFg.d.mts → runtime-BOeiQsCv.d.mts} +1952 -1489
  314. package/dist/runtime.d.mts +10 -10
  315. package/dist/runtime.mjs +3 -3
  316. package/dist/schema-DXdYj4R3.mjs +8 -0
  317. package/dist/{search-Gdrqj582.mjs → search-DSaLgEFI.mjs} +5 -3
  318. package/dist/{secrets-CeGpBFV2.mjs → secrets-CDZo2k8L.mjs} +14 -11
  319. package/dist/{sections-BOjU13Y-.mjs → sections-PVVXHGfp.mjs} +2 -2
  320. package/dist/seed/index.d.mts +2 -2
  321. package/dist/seed/index.mjs +21 -18
  322. package/dist/seo/index.d.mts +1 -1
  323. package/dist/seo/index.mjs +3 -12
  324. package/dist/{seo-CLj8lS7Q.mjs → seo-CQG3GCHQ.mjs} +5 -2
  325. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-C1EnikHB.mjs} +11 -3
  326. package/dist/{seo-5lJOtB5J.mjs → seo-qa7Dn0jK.mjs} +22 -4
  327. package/dist/{service-jGlhrICs.mjs → service-DiN4ZuPp.mjs} +2 -2
  328. package/dist/session-user-CAKImna3.mjs +22 -0
  329. package/dist/{settings-CUXOxzsT.mjs → settings-BbqgHWpU.mjs} +28 -55
  330. package/dist/{settings-DlBsT2VS.mjs → settings-i4VPP8bT.mjs} +2 -2
  331. package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-B8fl-mjV.mjs} +1 -1
  332. package/dist/{site-activity-DONFrMBJ.mjs → site-activity-Dy3FROs0.mjs} +1 -1
  333. package/dist/{site-context-C8Az_P_I.mjs → site-context-DQiL8Fl5.mjs} +23 -652
  334. package/dist/{site-url-DIMD68go.mjs → site-url-BML3GQYm.mjs} +1 -1
  335. package/dist/status-DANd8ERo.mjs +21 -0
  336. package/dist/storage/local.d.mts +1 -1
  337. package/dist/storage/local.mjs +1 -1
  338. package/dist/storage/s3.d.mts +1 -1
  339. package/dist/storage/s3.mjs +1 -1
  340. package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-9s-v03H-.mjs} +36 -29
  341. package/dist/taxonomies-DRiixp_E.mjs +443 -0
  342. package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-Dvsw6BOs.mjs} +44 -9
  343. package/dist/transport-BNmCqLu7.mjs +134 -0
  344. package/dist/types-4garmdWa.mjs +66 -0
  345. package/dist/{types-DSPGWjxO.d.mts → types-C8XW6L19.d.mts} +225 -4
  346. package/dist/{types-GaCtZ1k9.d.mts → types-CDpH6MA4.d.mts} +18 -0
  347. package/dist/{types-DRIKLmJI.d.mts → types-C_ly5eTp.d.mts} +17 -2
  348. package/dist/types-DF7ZuGGk.d.mts +118 -0
  349. package/dist/types-DU0bU2Wu.d.mts +2392 -0
  350. package/dist/{types-CwawBUTa.d.mts → types-DW_-sFyz.d.mts} +2 -1
  351. package/dist/{types-CSgR9nQB.mjs → types-Dq1qT19x.mjs} +1 -1
  352. package/dist/ui/server-runtime.d.mts +15 -15
  353. package/dist/ui/server-runtime.mjs +24 -20
  354. package/dist/url-Cac7a9QZ.mjs +33 -0
  355. package/dist/{user-DTLoZs16.mjs → user-BIZPzCb9.mjs} +2 -2
  356. package/dist/{utils-B8hBJ9Oz.mjs → utils-CMDhr5Xd.mjs} +129 -7
  357. package/dist/{validate-DzjCdy6v.d.mts → validate-CZvb-BKB.d.mts} +10 -7
  358. package/dist/{validate-DWmPO6oj.mjs → validate-DNs0pTSc.mjs} +11 -6
  359. package/dist/version-BTvfRGc6.mjs +6 -0
  360. package/dist/{widgets-BpJ8EpPd.mjs → widgets-f0ibZUIq.mjs} +46 -43
  361. package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-BhHJX8XE.mjs} +1 -1
  362. package/dist/{zod-generator-K91-g665.mjs → zod-generator-B7TMjyFJ.mjs} +41 -13
  363. package/package.json +30 -8
  364. package/src/components/Block.astro +50 -0
  365. package/src/components/Comments.astro +143 -1
  366. package/src/components/DinewayHead.astro +19 -2
  367. package/src/components/DinewayImage.astro +66 -33
  368. package/src/components/DinewayMedia.astro +1 -2
  369. package/src/components/Image.astro +85 -40
  370. package/src/components/InlinePortableTextEditor.tsx +12 -2
  371. package/src/components/JsonLdScript.astro +9 -0
  372. package/src/components/LiveSearch.astro +40 -4
  373. package/src/components/index.ts +4 -0
  374. package/src/components/live-search-routing.ts +30 -0
  375. package/src/components/portable-text-text-align.ts +15 -0
  376. package/src/ui.ts +2 -0
  377. package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
  378. package/dist/import-4YBXbDkI.mjs +0 -684
  379. package/dist/runner-DzIpHGND.mjs +0 -2836
  380. package/dist/schema-Bsi-VpYv.mjs +0 -8
  381. package/dist/taxonomies-CZ-_DitR.mjs +0 -327
  382. package/dist/types-CuJOqHfM.d.mts +0 -758
  383. package/dist/version-C4gfn0PJ.mjs +0 -6
  384. /package/dist/{adapters-OQCImOL7.d.mts → adapters-NVSs4UH7.d.mts} +0 -0
  385. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-2r7OWi_I.mjs} +0 -0
  386. /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-Bjlepa2E.mjs} +0 -0
  387. /package/dist/{components--pg6zBvu.mjs → components-Bclf98Be.mjs} +0 -0
  388. /package/dist/{context-types-r8oFvyOq.mjs → context-types-DqTo6C79.mjs} +0 -0
  389. /package/dist/{default-B6iaLvP7.mjs → default--K40jqm0.mjs} +0 -0
  390. /package/dist/{email-console-BOVqIYpB.mjs → email-console-ChgKFO8-.mjs} +0 -0
  391. /package/dist/{escape-BDgouFFY.mjs → escape-Bd4P_xKg.mjs} +0 -0
  392. /package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-BMsUnIAw.mjs} +0 -0
  393. /package/dist/{mime-CbKsKDCB.mjs → mime-CA7Lgovc.mjs} +0 -0
  394. /package/dist/{mode-CZqCF9dZ.mjs → mode-C4CIyjtR.mjs} +0 -0
  395. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CNoXafF7.mjs} +0 -0
  396. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-Ygw4bNyt.mjs} +0 -0
  397. /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
  398. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-BUwu8BA3.mjs} +0 -0
  399. /package/dist/{patterns-DKAX6oqN.mjs → patterns-BhAvqO0S.mjs} +0 -0
  400. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-D0w9dqjm.mjs} +0 -0
  401. /package/dist/{public-url-B_m9IwdV.mjs → public-url-BEz_sM9n.mjs} +0 -0
  402. /package/dist/{redirect-BjIBtDWY.mjs → redirect-wphRBv4y.mjs} +0 -0
  403. /package/dist/{request-cache-ho99schz.mjs → request-cache-D9GQBxMP.mjs} +0 -0
  404. /package/dist/{resolve-DTuDyYKs.mjs → resolve-Cb6Dbz-C.mjs} +0 -0
  405. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-CoyjILvW.mjs} +0 -0
  406. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-C3mqXg4C.mjs} +0 -0
  407. /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
  408. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-DWe8jwAp.mjs} +0 -0
  409. /package/dist/{tokens-SLmgowfd.mjs → tokens-1RK1n6ED.mjs} +0 -0
  410. /package/dist/{transaction-CFLhEOuH.mjs → transaction-C2EOMTJA.mjs} +0 -0
  411. /package/dist/{transport-BnsNxh2l.d.mts → transport-CcJu3Co8.d.mts} +0 -0
  412. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-DTXQ2IMv.mjs} +0 -0
  413. /package/dist/{types-CJ8DkL0q.mjs → types-B3t5cxhU.mjs} +0 -0
  414. /package/dist/{types-nP9vGUFq.d.mts → types-C46EvNdc.d.mts} +0 -0
  415. /package/dist/{types-Cg276-3z.mjs → types-C5CVgwsV.mjs} +0 -0
  416. /package/dist/{types-DZpT-PnG.d.mts → types-POH8PQZh.d.mts} +0 -0
  417. /package/dist/{types-Dryvv7LH.d.mts → types-Rc3gQqqw.d.mts} +0 -0
  418. /package/dist/{url-w7Mp5qAD.mjs → url-CpyFDFpO.mjs} +0 -0
@@ -5,10 +5,9 @@
5
5
  * Renders image blocks from WordPress imports and Dineway media.
6
6
  * Uses the provider's getSrc function for responsive srcset generation.
7
7
  */
8
- import { getImage } from "astro:assets";
8
+ import { Image as AstroImage } from "astro:assets";
9
9
  import {
10
10
  RESPONSIVE_BREAKPOINTS,
11
- buildResponsiveImage,
12
11
  buildRenderMediaUrl,
13
12
  getMediaProvider,
14
13
  getPublicOrigin,
@@ -34,11 +33,19 @@ export interface Props {
34
33
  width?: number;
35
34
  /** Original image height */
36
35
  height?: number;
36
+ /** LQIP blurhash -- first-class field (legacy snapshots store it in `asset.meta`). */
37
+ blurhash?: string;
38
+ /** LQIP dominant color -- first-class field (legacy snapshots store it in `asset.meta`). */
39
+ dominantColor?: string;
37
40
  /** Display width for this instance (overrides original) */
38
41
  displayWidth?: number;
39
42
  /** Display height for this instance (overrides original) */
40
43
  displayHeight?: number;
44
+ /** Alignment for this image instance (e.g. from a WordPress import) */
45
+ alignment?: "left" | "center" | "right" | "wide" | "full";
41
46
  };
47
+ /** Render the LQIP placeholder as an inline background. Disable for strict CSP. */
48
+ placeholder?: boolean;
42
49
  }
43
50
 
44
51
  /**
@@ -57,13 +64,13 @@ function generateSrcset(
57
64
  .join(", ");
58
65
  }
59
66
 
60
- const { node } = Astro.props;
67
+ const { node, placeholder = true } = Astro.props;
61
68
 
62
69
  if (!node?.asset) {
63
70
  return null;
64
71
  }
65
72
 
66
- const { asset, alt = "", caption, width, height, displayWidth, displayHeight } = node;
73
+ const { asset, alt = "", caption, width, height, displayWidth, displayHeight, alignment } = node;
67
74
 
68
75
  // Calculate aspect ratio from original dimensions
69
76
  const aspectRatio = width && height ? width / height : undefined;
@@ -90,6 +97,7 @@ if (displayWidth && displayHeight) {
90
97
  let src = "";
91
98
  let srcset: string | undefined;
92
99
  let sizes: string | undefined;
100
+ let astroImageSrc = "";
93
101
  const providerId = asset.provider;
94
102
 
95
103
  if (providerId && providerId !== "local") {
@@ -128,58 +136,63 @@ if (providerId && providerId !== "local") {
128
136
  }
129
137
  }
130
138
 
131
- // Fallback for local provider — prefer stored URL (includes storage key with extension),
132
- // fall back to _ref (bare ULID, works if media file endpoint supports ID lookup)
139
+ // Fallback for local provider. `asset.url` carries the storage key with
140
+ // extension when present; `asset._ref` is a bare ULID that only the internal
141
+ // `/file/{id}` route can resolve. `buildRenderMediaUrl` picks the right shape.
133
142
  if (!src) {
134
143
  src = buildRenderMediaUrl(Astro.locals.dineway?.getPublicMediaUrl, {
135
144
  url: asset.url,
136
145
  id: asset._ref,
137
146
  });
138
- const optimized = await buildResponsiveImage(getImage, {
139
- src: toAbsoluteMediaUrl(
147
+ if (renderWidth && renderHeight) {
148
+ astroImageSrc = toAbsoluteMediaUrl(
140
149
  src,
141
- getPublicOrigin(Astro.url, Astro.locals.dineway?.config)
142
- ),
143
- width: renderWidth,
144
- height: renderHeight,
145
- });
146
- if (optimized) {
147
- src = optimized.src;
148
- srcset = optimized.srcset;
149
- sizes = optimized.sizes;
150
+ getPublicOrigin(Astro.url, Astro.locals.dineway?.config),
151
+ );
150
152
  }
151
153
  }
152
154
 
153
- // Build placeholder background style
154
- const blurhash = asset.meta?.blurhash as string | undefined;
155
- const dominantColor = asset.meta?.dominantColor as string | undefined;
155
+ // Build placeholder background style. Prefer first-class LQIP fields; fall
156
+ // back to `asset.meta` for legacy snapshots persisted before LQIP was promoted.
157
+ const blurhash = node.blurhash ?? (asset.meta?.blurhash as string | undefined);
158
+ const dominantColor = node.dominantColor ?? (asset.meta?.dominantColor as string | undefined);
156
159
 
157
160
  let placeholderStyle = "";
158
- if (blurhash) {
161
+ if (placeholder && blurhash) {
159
162
  const { blurhashToImageCssString } = await import("@unpic/placeholder");
160
163
  placeholderStyle = blurhashToImageCssString(blurhash);
161
- } else if (dominantColor) {
164
+ } else if (placeholder && dominantColor) {
162
165
  placeholderStyle = `background-color: ${dominantColor};`;
163
166
  }
164
-
165
- const baseStyle = aspectRatio
166
- ? `aspect-ratio: ${aspectRatio}; max-width: 100%; height: auto;`
167
- : "max-width: 100%; height: auto;";
168
- const imgStyle = placeholderStyle ? `${baseStyle} ${placeholderStyle}` : baseStyle;
169
167
  ---
170
168
 
171
- <figure class="dineway-image">
172
- <img
173
- src={src}
174
- srcset={srcset}
175
- sizes={sizes}
176
- alt={alt}
177
- width={renderWidth}
178
- height={renderHeight}
179
- loading="lazy"
180
- decoding="async"
181
- style={imgStyle}
182
- />
169
+ <figure class:list={["dineway-image", alignment && `dineway-image--align-${alignment}`]}>
170
+ {
171
+ astroImageSrc ? (
172
+ <AstroImage
173
+ src={astroImageSrc}
174
+ alt={alt}
175
+ width={renderWidth}
176
+ height={renderHeight}
177
+ layout="constrained"
178
+ loading="lazy"
179
+ decoding="async"
180
+ style={placeholderStyle || undefined}
181
+ />
182
+ ) : (
183
+ <img
184
+ src={src}
185
+ srcset={srcset}
186
+ sizes={sizes}
187
+ alt={alt}
188
+ width={renderWidth}
189
+ height={renderHeight}
190
+ loading="lazy"
191
+ decoding="async"
192
+ style={placeholderStyle || undefined}
193
+ />
194
+ )
195
+ }
183
196
  {caption && <figcaption>{caption}</figcaption>}
184
197
  </figure>
185
198
 
@@ -193,8 +206,40 @@ const imgStyle = placeholderStyle ? `${baseStyle} ${placeholderStyle}` : baseSty
193
206
  }
194
207
  .dineway-image figcaption {
195
208
  font-size: 0.875rem;
196
- color: #666;
209
+ color: var(--dineway-caption-color, var(--color-muted, #666));
197
210
  margin-top: 0.5rem;
198
211
  text-align: center;
199
212
  }
213
+ /* Alignment (WordPress-style). Floats wrap surrounding text; wide/full span the column. */
214
+ .dineway-image--align-left,
215
+ .dineway-image--align-right {
216
+ width: fit-content;
217
+ max-width: 50%;
218
+ }
219
+ .dineway-image--align-left {
220
+ float: left;
221
+ margin: 0 1.5rem 1rem 0;
222
+ }
223
+ .dineway-image--align-right {
224
+ float: right;
225
+ margin: 0 0 1rem 1.5rem;
226
+ }
227
+ .dineway-image--align-center {
228
+ width: fit-content;
229
+ margin-inline: auto;
230
+ }
231
+ .dineway-image--align-wide,
232
+ .dineway-image--align-full {
233
+ width: 100%;
234
+ }
235
+ /* On narrow screens, un-float left/right so the image is not cramped beside text. */
236
+ @media (max-width: 640px) {
237
+ .dineway-image--align-left,
238
+ .dineway-image--align-right {
239
+ float: none;
240
+ width: 100%;
241
+ max-width: 100%;
242
+ margin-inline: 0;
243
+ }
244
+ }
200
245
  </style>
@@ -51,6 +51,7 @@ interface PTTextBlock {
51
51
  level?: number;
52
52
  children: PTSpan[];
53
53
  markDefs?: PTMarkDef[];
54
+ textAlign?: "left" | "center" | "right" | "justify";
54
55
  }
55
56
 
56
57
  type PTBlock = PTTextBlock | { _type: string; _key: string; [key: string]: unknown };
@@ -101,6 +102,10 @@ function attrNum(attrs: Record<string, unknown> | undefined, key: string): numbe
101
102
  return typeof v === "number" ? v : undefined;
102
103
  }
103
104
 
105
+ function normalizeTextAlign(value: unknown): "center" | "right" | "justify" | undefined {
106
+ return value === "center" || value === "right" || value === "justify" ? value : undefined;
107
+ }
108
+
104
109
  function pmToPortableText(doc: PMNode): PTBlock[] {
105
110
  if (!doc || doc.type !== "doc" || !doc.content) return [];
106
111
  const blocks: PTBlock[] = [];
@@ -118,6 +123,7 @@ function convertPMNode(node: PMNode): PTBlock | PTBlock[] | null {
118
123
  switch (node.type) {
119
124
  case "paragraph": {
120
125
  const { children, markDefs } = convertInline(node.content || []);
126
+ const textAlign = normalizeTextAlign(node.attrs?.textAlign);
121
127
  if (children.length === 0) return null;
122
128
  return {
123
129
  _type: "block",
@@ -125,11 +131,13 @@ function convertPMNode(node: PMNode): PTBlock | PTBlock[] | null {
125
131
  style: "normal",
126
132
  children,
127
133
  markDefs: markDefs.length > 0 ? markDefs : undefined,
134
+ ...(textAlign ? { textAlign } : {}),
128
135
  };
129
136
  }
130
137
  case "heading": {
131
138
  const { children, markDefs } = convertInline(node.content || []);
132
139
  const level = attrNum(node.attrs, "level") ?? 1;
140
+ const textAlign = normalizeTextAlign(node.attrs?.textAlign);
133
141
  if (children.length === 0) return null;
134
142
  const headingStyles: Record<number, PTTextBlock["style"]> = {
135
143
  1: "h1",
@@ -146,6 +154,7 @@ function convertPMNode(node: PMNode): PTBlock | PTBlock[] | null {
146
154
  style: headingStyle,
147
155
  children,
148
156
  markDefs: markDefs.length > 0 ? markDefs : undefined,
157
+ ...(textAlign ? { textAlign } : {}),
149
158
  };
150
159
  }
151
160
  case "bulletList":
@@ -358,7 +367,7 @@ function portableTextToPM(blocks: PTBlock[]): JSONContent {
358
367
 
359
368
  function convertPTBlock(block: PTBlock): JSONContent | null {
360
369
  if (isPTTextBlock(block)) {
361
- const { style = "normal", children, markDefs = [] } = block;
370
+ const { style = "normal", children, markDefs = [], textAlign } = block;
362
371
  const pmContent = convertPTSpans(children, markDefs);
363
372
 
364
373
  if (style === "blockquote") {
@@ -376,12 +385,13 @@ function convertPTBlock(block: PTBlock): JSONContent | null {
376
385
  const level = parseInt(style.substring(1), 10);
377
386
  return {
378
387
  type: "heading",
379
- attrs: { level },
388
+ attrs: { level, ...(textAlign ? { textAlign } : {}) },
380
389
  content: pmContent.length > 0 ? pmContent : undefined,
381
390
  };
382
391
  }
383
392
  return {
384
393
  type: "paragraph",
394
+ attrs: textAlign ? { textAlign } : undefined,
385
395
  content: pmContent.length > 0 ? pmContent : undefined,
386
396
  };
387
397
  }
@@ -0,0 +1,9 @@
1
+ ---
2
+ interface Props {
3
+ json: string;
4
+ }
5
+
6
+ const { json } = Astro.props;
7
+ ---
8
+
9
+ <script type="application/ld+json" set:html={json}></script>
@@ -34,6 +34,8 @@ export interface Props {
34
34
  limit?: number;
35
35
  /** CSS class for the container */
36
36
  class?: string;
37
+ /** Inline style for the container */
38
+ style?: string;
37
39
  /** CSS class for the input */
38
40
  inputClass?: string;
39
41
  /** CSS class for the results container */
@@ -48,6 +50,10 @@ export interface Props {
48
50
  suggestMode?: boolean;
49
51
  /** Expand input width on focus (provide collapsed and expanded widths) */
50
52
  expandOnFocus?: { collapsed: string; expanded: string };
53
+ /** Search results page to navigate to when pressing Enter without a focused result */
54
+ searchPage?: string;
55
+ /** Per-collection URL templates, e.g. { posts: "/blog/:path" } */
56
+ routeMap?: Record<string, string>;
51
57
  }
52
58
 
53
59
  const {
@@ -57,6 +63,7 @@ const {
57
63
  debounce = 300,
58
64
  limit = 10,
59
65
  class: className = "",
66
+ style: styleAttr = "",
60
67
  inputClass = "",
61
68
  resultsClass = "",
62
69
  resultClass = "",
@@ -64,6 +71,8 @@ const {
64
71
  autofocus = false,
65
72
  suggestMode = false,
66
73
  expandOnFocus,
74
+ searchPage = "",
75
+ routeMap = {},
67
76
  } = Astro.props;
68
77
 
69
78
  const config = {
@@ -74,11 +83,14 @@ const config = {
74
83
  showSnippets,
75
84
  suggestMode,
76
85
  expandOnFocus: expandOnFocus ?? null,
86
+ searchPage,
87
+ routeMap,
77
88
  };
78
89
  ---
79
90
 
80
91
  <dineway-live-search
81
92
  class:list={["dineway-live-search", className]}
93
+ style={styleAttr}
82
94
  data-config={JSON.stringify(config)}
83
95
  >
84
96
  <input
@@ -109,6 +121,12 @@ const config = {
109
121
  </dineway-live-search>
110
122
 
111
123
  <script>
124
+ import {
125
+ buildLiveSearchResultUrl,
126
+ type LiveSearchRoutableResult,
127
+ type LiveSearchRouteMap,
128
+ } from "./live-search-routing.js";
129
+
112
130
  // Sanitization patterns for search snippets (allow only <mark> tags from FTS5)
113
131
  const SNIPPET_AMP_RE = /&/g;
114
132
  const SNIPPET_LT_RE = /</g;
@@ -128,6 +146,7 @@ const config = {
128
146
  interface Suggestion {
129
147
  collection: string;
130
148
  id: string;
149
+ slug?: string | null;
131
150
  title: string;
132
151
  }
133
152
 
@@ -139,6 +158,8 @@ const config = {
139
158
  showSnippets: boolean;
140
159
  suggestMode: boolean;
141
160
  expandOnFocus: { collapsed: string; expanded: string } | null;
161
+ searchPage: string;
162
+ routeMap: LiveSearchRouteMap;
142
163
  }
143
164
 
144
165
  class DinewayLiveSearch extends HTMLElement {
@@ -156,6 +177,8 @@ const config = {
156
177
  showSnippets: true,
157
178
  suggestMode: false,
158
179
  expandOnFocus: null,
180
+ searchPage: "",
181
+ routeMap: {},
159
182
  };
160
183
  private debounceTimer: ReturnType<typeof setTimeout> | null = null;
161
184
  private abortController: AbortController | null = null;
@@ -275,11 +298,25 @@ const config = {
275
298
  ".dineway-live-search-result:focus, .dineway-live-search-result.focused"
276
299
  ) as HTMLAnchorElement | null;
277
300
  if (focused?.href) {
301
+ e.preventDefault();
278
302
  window.location.href = focused.href;
303
+ return;
304
+ }
305
+
306
+ const query = this.input?.value.trim();
307
+ if (query && this.config.searchPage) {
308
+ e.preventDefault();
309
+ const url = new URL(this.config.searchPage, window.location.origin);
310
+ url.searchParams.set("q", query);
311
+ window.location.href = url.toString();
279
312
  }
280
313
  }
281
314
  }
282
315
 
316
+ private buildResultUrl(result: LiveSearchRoutableResult): string {
317
+ return buildLiveSearchResultUrl(result, this.config.routeMap);
318
+ }
319
+
283
320
  private navigateResults(direction: number) {
284
321
  if (!this.resultsList) return;
285
322
 
@@ -376,9 +413,7 @@ const config = {
376
413
  const link = clone.querySelector("a");
377
414
 
378
415
  if (link) {
379
- // Build URL - use slug if available, otherwise id
380
- const path = result.slug ?? result.id;
381
- link.href = `/${result.collection}/${path}`;
416
+ link.href = this.buildResultUrl(result);
382
417
 
383
418
  // Fill in title
384
419
  const titleEl = link.querySelector(
@@ -439,7 +474,7 @@ const config = {
439
474
  const link = clone.querySelector("a");
440
475
 
441
476
  if (link) {
442
- link.href = `/${suggestion.collection}/${suggestion.id}`;
477
+ link.href = this.buildResultUrl(suggestion);
443
478
 
444
479
  const titleEl = link.querySelector(
445
480
  ".dineway-live-search-result-title"
@@ -465,6 +500,7 @@ const config = {
465
500
 
466
501
  link.dataset.id = suggestion.id;
467
502
  link.dataset.collection = suggestion.collection;
503
+ link.dataset.slug = suggestion.slug ?? "";
468
504
  }
469
505
 
470
506
  this.resultsList.appendChild(clone);
@@ -36,6 +36,7 @@ export { default as DinewayImage } from "./DinewayImage.astro";
36
36
  export { default as DinewayMedia } from "./DinewayMedia.astro";
37
37
 
38
38
  // Portable Text block type components
39
+ export { default as Block } from "./Block.astro";
39
40
  export { default as Image } from "./Image.astro";
40
41
  export { default as Code } from "./Code.astro";
41
42
  export { default as Embed } from "./Embed.astro";
@@ -57,6 +58,7 @@ export { default as Underline } from "./marks/Underline.astro";
57
58
  export { default as StrikeThrough } from "./marks/StrikeThrough.astro";
58
59
  export { default as Link } from "./marks/Link.astro";
59
60
 
61
+ import BlockComponent from "./Block.astro";
60
62
  import BreakComponent from "./Break.astro";
61
63
  import ButtonComponent from "./Button.astro";
62
64
  import ButtonsComponent from "./Buttons.astro";
@@ -77,11 +79,13 @@ import TableComponent from "./Table.astro";
77
79
  * Pre-configured components for Dineway Portable Text content
78
80
  *
79
81
  * Includes renderers for:
82
+ * - Block styles: paragraph, h1..h6, blockquote, with text alignment classes
80
83
  * - Block types: image, code, embed, gallery, columns, break, htmlBlock, table,
81
84
  * button, buttons, cover, file, pullquote
82
85
  * - Marks: superscript, subscript, underline, strike-through, link
83
86
  */
84
87
  export const dinewayComponents = {
88
+ block: BlockComponent,
85
89
  type: {
86
90
  image: ImageComponent,
87
91
  code: CodeComponent,
@@ -0,0 +1,30 @@
1
+ export interface LiveSearchRoutableResult {
2
+ collection: string;
3
+ id: string;
4
+ slug?: string | null;
5
+ }
6
+
7
+ export type LiveSearchRouteMap = Record<string, string>;
8
+
9
+ const ROUTE_TOKEN_RE = /:(collection|id|slug|path)/g;
10
+
11
+ export function buildLiveSearchResultUrl(
12
+ result: LiveSearchRoutableResult,
13
+ routeMap: LiveSearchRouteMap = {},
14
+ ): string {
15
+ const path = result.slug ?? result.id;
16
+ const template = routeMap[result.collection];
17
+
18
+ if (!template) {
19
+ return `/${result.collection}/${path}`;
20
+ }
21
+
22
+ const replacements: Record<string, string> = {
23
+ collection: result.collection,
24
+ id: result.id,
25
+ slug: result.slug ?? result.id,
26
+ path,
27
+ };
28
+
29
+ return template.replace(ROUTE_TOKEN_RE, (_token, key: string) => replacements[key] ?? "");
30
+ }
@@ -0,0 +1,15 @@
1
+ type AlignClassName = "has-text-align-center" | "has-text-align-right" | "has-text-align-justify";
2
+
3
+ const ALIGN_CLASS_MAP: Record<string, AlignClassName> = {
4
+ center: "has-text-align-center",
5
+ right: "has-text-align-right",
6
+ justify: "has-text-align-justify",
7
+ };
8
+
9
+ export function textAlignClassName(value: string | undefined): AlignClassName | undefined {
10
+ if (value === undefined) return undefined;
11
+ if (Object.hasOwn(ALIGN_CLASS_MAP, value)) {
12
+ return ALIGN_CLASS_MAP[value];
13
+ }
14
+ return undefined;
15
+ }
package/src/ui.ts CHANGED
@@ -47,6 +47,8 @@ export {
47
47
  DinewayImage as Image,
48
48
  // Main component (wrapper with Dineway defaults)
49
49
  PortableText,
50
+ // Block style override for paragraph, heading, blockquote, and text alignment.
51
+ Block,
50
52
  // Comment components
51
53
  Comments,
52
54
  CommentForm,
@@ -1,51 +0,0 @@
1
- import { ulid } from "ulidx";
2
-
3
- //#region src/database/repositories/entity-aliases.ts
4
- const WHITESPACE_PATTERN = /\s+/g;
5
- function isResolvableEntityType(value) {
6
- return value === "content" || value === "collection" || value === "plugin" || value === "taxonomy" || value === "menu";
7
- }
8
- function mapEntityAlias(row) {
9
- if (!isResolvableEntityType(row.entity_type)) throw new Error(`Invalid entity alias type: ${row.entity_type}`);
10
- return {
11
- id: row.id,
12
- entityType: row.entity_type,
13
- collectionSlug: row.collection_slug,
14
- entityId: row.entity_id,
15
- alias: row.alias,
16
- normalizedAlias: row.normalized_alias,
17
- createdAt: row.created_at
18
- };
19
- }
20
- function normalizeEntityAlias(value) {
21
- return value.trim().toLowerCase().replace(WHITESPACE_PATTERN, " ");
22
- }
23
- var EntityAliasRepository = class {
24
- constructor(db) {
25
- this.db = db;
26
- }
27
- async create(input) {
28
- const id = ulid();
29
- const normalizedAlias = normalizeEntityAlias(input.alias);
30
- await this.db.insertInto("_dineway_entity_aliases").values({
31
- id,
32
- entity_type: input.entityType,
33
- collection_slug: input.collectionSlug ?? null,
34
- entity_id: input.entityId,
35
- alias: input.alias,
36
- normalized_alias: normalizedAlias
37
- }).execute();
38
- return mapEntityAlias(await this.db.selectFrom("_dineway_entity_aliases").selectAll().where("id", "=", id).executeTakeFirstOrThrow());
39
- }
40
- async findByNormalizedAlias(input) {
41
- const limit = Math.min(Math.max(input.limit ?? 10, 1), 50);
42
- const collectionSlug = input.collectionSlug;
43
- let query = this.db.selectFrom("_dineway_entity_aliases").selectAll().where("normalized_alias", "=", input.normalizedAlias);
44
- if (input.entityTypes && input.entityTypes.length > 0) query = query.where("entity_type", "in", input.entityTypes);
45
- if (collectionSlug) query = query.where((eb) => eb.or([eb("collection_slug", "is", null), eb("collection_slug", "=", collectionSlug)]));
46
- return (await query.orderBy("created_at", "desc").limit(limit).execute()).map(mapEntityAlias);
47
- }
48
- };
49
-
50
- //#endregion
51
- export { normalizeEntityAlias as n, EntityAliasRepository as t };