dineway 0.1.49 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/dist/activity-DUaz_w7p.mjs +79 -0
  2. package/dist/{activity-events-CwM7yxPW.mjs → activity-events-CJDvE2uc.mjs} +5 -113
  3. package/dist/actor-0QJ1Gbtf.mjs +37 -0
  4. package/dist/after-BfniwgIf.mjs +9 -0
  5. package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins--OwHHiY8.mjs} +1 -1
  6. package/dist/api/route-utils.d.mts +9 -10
  7. package/dist/api/route-utils.mjs +16 -13
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +5 -4
  10. package/dist/{api-BMIxRIEN.mjs → api-B4PHIF4V.mjs} +93 -41
  11. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-tbK_sORH.mjs} +6 -2
  12. package/dist/{apply-D_RlTYtC.mjs → apply-DjTqq6Ae.mjs} +117 -77
  13. package/dist/astro/image-endpoint.d.mts +7 -0
  14. package/dist/astro/image-endpoint.mjs +54 -0
  15. package/dist/astro/index.d.mts +34 -11
  16. package/dist/astro/index.mjs +163 -24
  17. package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  18. package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
  19. package/dist/astro/middleware/auth.d.mts +8 -18
  20. package/dist/astro/middleware/auth.mjs +42 -24
  21. package/dist/astro/middleware/redirect.mjs +13 -4
  22. package/dist/astro/middleware/request-context.mjs +8 -5
  23. package/dist/astro/middleware/seed.d.mts +1 -1
  24. package/dist/astro/middleware/seed.mjs +2 -2
  25. package/dist/astro/middleware/setup.mjs +1 -1
  26. package/dist/astro/middleware.mjs +389 -206
  27. package/dist/astro/routes/admin.astro +6 -1
  28. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
  29. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
  30. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  31. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  32. package/dist/astro/routes/api/admin/briefing.mjs +21 -17
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
  35. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
  36. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
  37. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
  39. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
  40. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
  41. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
  42. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
  43. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
  44. package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
  45. package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -24
  46. package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -24
  47. package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -28
  48. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -28
  49. package/dist/astro/routes/api/admin/context/diff.mjs +31 -27
  50. package/dist/astro/routes/api/admin/context/index.mjs +32 -28
  51. package/dist/astro/routes/api/admin/context/stale.mjs +31 -27
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -24
  53. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -27
  54. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -27
  55. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -25
  56. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  57. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  58. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  59. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -51
  60. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -51
  61. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
  62. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -49
  63. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -48
  64. package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
  67. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -48
  68. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
  69. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -63
  72. package/dist/astro/routes/api/admin/review-requests/index.d.mts +2 -1
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +58 -10
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
  75. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  76. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -6
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  90. package/dist/astro/routes/api/auth/me.mjs +9 -8
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
  103. package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
  107. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
  108. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  109. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +6 -5
  110. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  111. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -5
  112. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
  113. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +49 -20
  114. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -5
  115. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  116. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +67 -32
  117. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
  118. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  119. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -5
  120. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  121. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  122. package/dist/astro/routes/api/content/_collection_/index.mjs +11 -9
  123. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  124. package/dist/astro/routes/api/dashboard.mjs +9 -8
  125. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  126. package/dist/astro/routes/api/health.mjs +1 -1
  127. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  128. package/dist/astro/routes/api/import/probe.mjs +22 -10
  129. package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
  130. package/dist/astro/routes/api/import/wordpress/execute.d.mts +18 -1
  131. package/dist/astro/routes/api/import/wordpress/execute.mjs +85 -37
  132. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -1
  133. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
  134. package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -32
  135. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +17 -1
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +121 -100
  137. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  138. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
  139. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +55 -2
  140. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -55
  141. package/dist/astro/routes/api/manifest.mjs +14 -5
  142. package/dist/astro/routes/api/mcp.mjs +753 -170
  143. package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
  144. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  145. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  146. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  147. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  148. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  149. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  150. package/dist/astro/routes/api/media.mjs +28 -35
  151. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -28
  152. package/dist/astro/routes/api/menus/_name_/items.mjs +32 -28
  153. package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -28
  154. package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -28
  155. package/dist/astro/routes/api/menus/_name_.mjs +32 -28
  156. package/dist/astro/routes/api/menus/index.mjs +32 -28
  157. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  158. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  159. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  160. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  161. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  162. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  163. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  164. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  165. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  166. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +46 -31
  167. package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
  168. package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
  169. package/dist/astro/routes/api/redirects/_id_.mjs +33 -29
  170. package/dist/astro/routes/api/redirects/index.mjs +33 -29
  171. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  172. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +48 -43
  174. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -43
  175. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -43
  176. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -43
  177. package/dist/astro/routes/api/schema/collections/index.mjs +48 -43
  178. package/dist/astro/routes/api/schema/index.mjs +14 -15
  179. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
  180. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
  181. package/dist/astro/routes/api/search/enable.mjs +11 -10
  182. package/dist/astro/routes/api/search/index.mjs +10 -9
  183. package/dist/astro/routes/api/search/rebuild.mjs +11 -10
  184. package/dist/astro/routes/api/search/stats.mjs +6 -6
  185. package/dist/astro/routes/api/search/suggest.mjs +10 -9
  186. package/dist/astro/routes/api/sections/_slug_.mjs +32 -28
  187. package/dist/astro/routes/api/sections/index.mjs +32 -28
  188. package/dist/astro/routes/api/settings/email.mjs +4 -4
  189. package/dist/astro/routes/api/settings.mjs +32 -28
  190. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  191. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  192. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
  193. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  194. package/dist/astro/routes/api/setup/index.mjs +29 -25
  195. package/dist/astro/routes/api/setup/status.mjs +3 -3
  196. package/dist/astro/routes/api/snapshot.mjs +8 -7
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -31
  198. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -31
  199. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -31
  200. package/dist/astro/routes/api/taxonomies/index.mjs +35 -31
  201. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  202. package/dist/astro/routes/api/typegen.mjs +4 -4
  203. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  204. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  205. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  206. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +31 -27
  207. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -28
  208. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -28
  209. package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -26
  210. package/dist/astro/routes/api/widget-areas/index.mjs +32 -28
  211. package/dist/astro/routes/api/widget-components.mjs +2 -2
  212. package/dist/astro/routes/robots.txt.mjs +8 -7
  213. package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
  214. package/dist/astro/routes/sitemap.xml.mjs +9 -8
  215. package/dist/astro/session-driver.d.mts +1 -1
  216. package/dist/astro/session-driver.mjs +2 -2
  217. package/dist/astro/types.d.mts +22 -13
  218. package/dist/{audit-BeNsSyfU.mjs → audit-B2pRxZ20.mjs} +1 -1
  219. package/dist/auth/providers/github.d.mts +1 -1
  220. package/dist/auth/providers/google.d.mts +1 -1
  221. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-D71jourk.mjs} +1 -1
  222. package/dist/{authorize-BLO0m7fW.mjs → authorize-ZXPGPwKn.mjs} +1 -1
  223. package/dist/{briefing-CkTee1ex.mjs → briefing-0rf-su3-.mjs} +90 -28
  224. package/dist/{briefing-DJX6irto.mjs → briefing-kRhegBoF.mjs} +2 -1
  225. package/dist/bundle-CEcdUa1s.mjs +602 -0
  226. package/dist/{byline-BVC1lV6G.mjs → byline-7xR185Ly.mjs} +30 -62
  227. package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-BKzA0fJU.mjs} +1 -1
  228. package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-Ckeqd1OY.d.mts} +88 -35
  229. package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-WN7RQT4q.mjs} +10 -4
  230. package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-Ba54M74c.mjs} +2 -2
  231. package/dist/{bylines-LN9XISRo.mjs → bylines-C-EL6dh3.mjs} +9 -3
  232. package/dist/{bylines-DwokOFj6.mjs → bylines-CmZFCMr0.mjs} +5 -5
  233. package/dist/{cache-Bac05gBd.mjs → cache-DkVCKGio.mjs} +2 -2
  234. package/dist/{chunks-CuUt7K50.mjs → chunks-ChGNDY8r.mjs} +1 -1
  235. package/dist/cli/index.d.mts +29 -1
  236. package/dist/cli/index.mjs +1466 -1763
  237. package/dist/cli/plugin-kit.d.mts +75 -0
  238. package/dist/cli/plugin-kit.mjs +4 -0
  239. package/dist/client/external-auth-headers.d.mts +1 -1
  240. package/dist/client/index.d.mts +27 -52
  241. package/dist/client/index.mjs +34 -6
  242. package/dist/client-factory-BDD9azPJ.mjs +233 -0
  243. package/dist/{comment-Beue8-15.mjs → comment-DFALgsJD.mjs} +13 -3
  244. package/dist/comment-reaction-C37bf99u.mjs +58 -0
  245. package/dist/{comments-DcjFIfqX.mjs → comments-B3NwDBxl.mjs} +1 -1
  246. package/dist/{content-CBxYGWfL.mjs → content-DJcAYFhz.mjs} +51 -34
  247. package/dist/content-refresh-B4ZCmxgd.mjs +1576 -0
  248. package/dist/{context-Df1xVYyr.mjs → context-DnpXcp6Y.mjs} +2 -2
  249. package/dist/{context-CQVNZaR8.mjs → context-fSCYLL3c.mjs} +125 -53
  250. package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-CI8XzcsK.mjs} +2 -1
  251. package/dist/{cron-DxCAU_Sn.mjs → cron-B1SL_lsb.mjs} +7 -3
  252. package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-D0nj5oWg.mjs} +4 -4
  253. package/dist/db/index.d.mts +3 -3
  254. package/dist/db/index.mjs +1 -1
  255. package/dist/db/libsql.d.mts +1 -1
  256. package/dist/db/postgres.d.mts +1 -1
  257. package/dist/db/sqlite.d.mts +1 -1
  258. package/dist/{device-flow-BZVGftqi.mjs → device-flow-BJe6VEhP.mjs} +5 -5
  259. package/dist/{placeholder-d54Qr_7n.mjs → enrich-Ck9tfMqe.mjs} +36 -9
  260. package/dist/{error-DCSuUAZW.mjs → error-CSVaQNZy.mjs} +5 -0
  261. package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-GVhUgzEs.mjs} +1 -1
  262. package/dist/field-defs-cache-DL-T2XVS.mjs +49 -0
  263. package/dist/forgeway-seo-client-G5ddhVHd.mjs +456 -0
  264. package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-ewTGohf4.mjs} +1 -1
  265. package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-DEFj8e6u.mjs} +2 -2
  266. package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-C23JHaWz.mjs} +5 -4
  267. package/dist/import-CXXL5pip.mjs +1354 -0
  268. package/dist/index-DcnOCD1e.d.mts +375 -0
  269. package/dist/index.d.mts +15 -16
  270. package/dist/index.mjs +85 -70
  271. package/dist/{jsonld-DZ67souc.d.mts → jsonld-DzKbhRZ4.d.mts} +8 -4
  272. package/dist/{load-D9OiGr2m.mjs → load-CFtJRT3c.mjs} +1 -1
  273. package/dist/{loader--GOYux8M.mjs → loader-aWkkc1_o.mjs} +117 -31
  274. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-uA6pRFXi.mjs} +38 -1
  275. package/dist/mcp-reviewed-executor-Dn52L_yY.mjs +558 -0
  276. package/dist/media/image-endpoint.d.mts +32 -0
  277. package/dist/media/image-endpoint.mjs +111 -0
  278. package/dist/media/index.d.mts +27 -2
  279. package/dist/media/index.mjs +5 -3
  280. package/dist/media/local-runtime.d.mts +15 -11
  281. package/dist/media/local-runtime.mjs +9 -7
  282. package/dist/{media-CbKyYukG.mjs → media-CVMOoywq.mjs} +3 -1
  283. package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-zDNJmXCo.mjs} +1 -1
  284. package/dist/media-url-BdoLPvg8.mjs +20 -0
  285. package/dist/{menus-C7F0sCrC.mjs → menus-CCG2z5um.mjs} +80 -15
  286. package/dist/{menus-BZbXf-ej.mjs → menus-CmyIkRG5.mjs} +19 -5
  287. package/dist/{normalize-ByemhhfW.mjs → normalize-Cyt7JdF7.mjs} +8 -1
  288. package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-B9H7X85L.mjs} +5 -5
  289. package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dwl32-Uj.mjs} +2 -2
  290. package/dist/object-cache/memory.d.mts +14 -0
  291. package/dist/object-cache/memory.mjs +55 -0
  292. package/dist/object-cache-D51qOseS.mjs +419 -0
  293. package/dist/output-DhBe5_Pi.mjs +68 -0
  294. package/dist/page/index.d.mts +10 -3
  295. package/dist/page/index.mjs +2 -2
  296. package/dist/{parse-CneSgl7-.mjs → parse-i15EFSAE.mjs} +1 -1
  297. package/dist/{parser-DxfsARXL.mjs → parser-06LLLL4E.mjs} +151 -9
  298. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-DkWkXfDI.d.mts} +12 -4
  299. package/dist/plugin-utils.d.mts +8 -9
  300. package/dist/plugins/adapt-sandbox-entry.d.mts +8 -9
  301. package/dist/plugins/adapt-sandbox-entry.mjs +13 -2
  302. package/dist/{plugins-DzfqRREq.mjs → plugins-CPA2PtfY.mjs} +919 -66
  303. package/dist/{transport-LSdZVXHF.mjs → portable-text-BASHceim.mjs} +1 -134
  304. package/dist/portable-text-E79LyjGo.d.mts +45 -0
  305. package/dist/{preview-C-3YTX2U.mjs → preview-BjedZm8G.mjs} +4 -3
  306. package/dist/process-cache-CCDgti7j.mjs +106 -0
  307. package/dist/project-env-DKibmuP8.mjs +95 -0
  308. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-DC2JdWeO.d.mts} +1 -1
  309. package/dist/{public-url-B4xV4rGa.d.mts → public-url-DQJCnYi9.d.mts} +1 -1
  310. package/dist/publication-authorization-RKiHXKtq.mjs +985 -0
  311. package/dist/{query-CZ3TH_Uu.mjs → query-C2U5u5_p.mjs} +11 -6
  312. package/dist/{query-Ds0EnMFX.mjs → query-DEv5x6yB.mjs} +281 -76
  313. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-DglsAJSw.mjs} +2 -2
  314. package/dist/{redirect-CEACczxo.mjs → redirect-ubhEqQCQ.mjs} +2 -2
  315. package/dist/{redirects-ocRJmQHP.mjs → redirects-Bhpm8bRe.mjs} +35 -19
  316. package/dist/{redirects-DYj1yPxs.mjs → redirects-xs2yahLq.mjs} +47 -24
  317. package/dist/{registry-D7HACema.mjs → registry-BYYyb2tF.mjs} +148 -81
  318. package/dist/request-context.d.mts +2 -0
  319. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CFe1tW2M.mjs} +1 -1
  320. package/dist/review-payload-BysRWpxS.mjs +111 -0
  321. package/dist/{review-requests-BW2NxY-l.mjs → review-requests-CTWGnWUt.mjs} +1 -1
  322. package/dist/review-requests-D42VEP1l.mjs +142 -0
  323. package/dist/review-route-helpers-C31vO6SI.mjs +41 -0
  324. package/dist/runner-BgmttQmD.mjs +7444 -0
  325. package/dist/{runner-09sTqtv0.d.mts → runner-D6hzs8L9.d.mts} +1 -1
  326. package/dist/runtime.d.mts +9 -10
  327. package/dist/runtime.mjs +3 -3
  328. package/dist/schema-DUtnZxjZ.mjs +8 -0
  329. package/dist/{search-Gdrqj582.mjs → search-DUKgZUlm.mjs} +5 -3
  330. package/dist/{secrets-CeGpBFV2.mjs → secrets-ZV5rd8yV.mjs} +14 -11
  331. package/dist/{sections-BOjU13Y-.mjs → sections-DvFgsnda.mjs} +2 -2
  332. package/dist/seed/index.d.mts +2 -2
  333. package/dist/seed/index.mjs +21 -18
  334. package/dist/seo/index.d.mts +1 -1
  335. package/dist/seo/index.mjs +3 -12
  336. package/dist/{seo-5lJOtB5J.mjs → seo-BLszyJxd.mjs} +22 -4
  337. package/dist/{seo-CLj8lS7Q.mjs → seo-BU8MLCS9.mjs} +5 -2
  338. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-GnCuL1ML.mjs} +11 -3
  339. package/dist/{service-jGlhrICs.mjs → service-FL3fB0Rx.mjs} +2 -2
  340. package/dist/session-user-Ct6GBLvn.mjs +22 -0
  341. package/dist/{settings-CUXOxzsT.mjs → settings-BECcAIRH.mjs} +28 -55
  342. package/dist/{settings-DlBsT2VS.mjs → settings-EzADu-dd.mjs} +2 -2
  343. package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-Da0axZEE.mjs} +1 -1
  344. package/dist/{site-activity-DONFrMBJ.mjs → site-activity-h8smOlYI.mjs} +1 -1
  345. package/dist/{site-context-C8Az_P_I.mjs → site-context-B8T1kpUP.mjs} +337 -530
  346. package/dist/{site-url-DIMD68go.mjs → site-url-DJEid0ml.mjs} +1 -1
  347. package/dist/stable-hash-DshcXvRE.mjs +19 -0
  348. package/dist/status-NqWOSFAD.mjs +21 -0
  349. package/dist/storage/local.d.mts +1 -1
  350. package/dist/storage/local.mjs +1 -1
  351. package/dist/storage/s3.d.mts +1 -1
  352. package/dist/storage/s3.mjs +1 -1
  353. package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-BiM9NtgW.mjs} +36 -29
  354. package/dist/taxonomies-DSnY5nOa.mjs +443 -0
  355. package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-0k_vRVsD.mjs} +44 -9
  356. package/dist/transport-C46KHLMP.mjs +134 -0
  357. package/dist/types-A8fPOJnl.mjs +69 -0
  358. package/dist/types-BLQCz46p.d.mts +118 -0
  359. package/dist/{types-CwawBUTa.d.mts → types-B_FlxIIl.d.mts} +4 -1
  360. package/dist/{types-CSgR9nQB.mjs → types-ChxYDRvx.mjs} +1 -1
  361. package/dist/{types-GaCtZ1k9.d.mts → types-Cw0PeCT_.d.mts} +18 -0
  362. package/dist/types-DuQn1G7-.d.mts +2973 -0
  363. package/dist/{runtime-C4-2lSFg.d.mts → types-DwoUifGE.d.mts} +5668 -3000
  364. package/dist/{types-DRIKLmJI.d.mts → types-opjX_kz6.d.mts} +17 -2
  365. package/dist/ui/server-runtime.d.mts +13 -15
  366. package/dist/ui/server-runtime.mjs +24 -20
  367. package/dist/url-guoXQQcV.mjs +33 -0
  368. package/dist/{user-DTLoZs16.mjs → user-BH-n01y3.mjs} +2 -2
  369. package/dist/{utils-B8hBJ9Oz.mjs → utils-D1SrKGtP.mjs} +129 -7
  370. package/dist/{validate-DzjCdy6v.d.mts → validate-CbVFoJgc.d.mts} +65 -8
  371. package/dist/{validate-DWmPO6oj.mjs → validate-D1HL-oLR.mjs} +11 -6
  372. package/dist/version-C3iVRuaF.mjs +6 -0
  373. package/dist/{widgets-BpJ8EpPd.mjs → widgets-BZrLrNgS.mjs} +46 -43
  374. package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-C3PWcowq.mjs} +1 -1
  375. package/dist/{zod-generator-K91-g665.mjs → zod-generator-C7AsLpSB.mjs} +42 -14
  376. package/package.json +38 -8
  377. package/src/components/Block.astro +50 -0
  378. package/src/components/Comments.astro +143 -1
  379. package/src/components/DinewayHead.astro +19 -2
  380. package/src/components/DinewayImage.astro +66 -33
  381. package/src/components/DinewayMedia.astro +1 -2
  382. package/src/components/Image.astro +85 -40
  383. package/src/components/InlinePortableTextEditor.tsx +12 -2
  384. package/src/components/JsonLdScript.astro +9 -0
  385. package/src/components/LiveSearch.astro +40 -4
  386. package/src/components/index.ts +4 -0
  387. package/src/components/live-search-routing.ts +30 -0
  388. package/src/components/portable-text-text-align.ts +15 -0
  389. package/src/ui.ts +2 -0
  390. package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
  391. package/dist/import-4YBXbDkI.mjs +0 -684
  392. package/dist/index-CZiWCQDp.d.mts +0 -227
  393. package/dist/review-requests-Qum4713s.mjs +0 -79
  394. package/dist/runner-DzIpHGND.mjs +0 -2836
  395. package/dist/schema-Bsi-VpYv.mjs +0 -8
  396. package/dist/taxonomies-CZ-_DitR.mjs +0 -327
  397. package/dist/types-CuJOqHfM.d.mts +0 -758
  398. package/dist/types-DSPGWjxO.d.mts +0 -1247
  399. package/dist/types-nP9vGUFq.d.mts +0 -56
  400. package/dist/version-C4gfn0PJ.mjs +0 -6
  401. /package/dist/{adapters-OQCImOL7.d.mts → adapters-BiRymx02.d.mts} +0 -0
  402. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-Ypaly90d.mjs} +0 -0
  403. /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-D5pSY2S1.mjs} +0 -0
  404. /package/dist/{components--pg6zBvu.mjs → components-DImzlLhb.mjs} +0 -0
  405. /package/dist/{context-types-r8oFvyOq.mjs → context-types-eBuMDAg-.mjs} +0 -0
  406. /package/dist/{default-B6iaLvP7.mjs → default-D4Vygcy_.mjs} +0 -0
  407. /package/dist/{email-console-BOVqIYpB.mjs → email-console-Bp0r68iF.mjs} +0 -0
  408. /package/dist/{escape-BDgouFFY.mjs → escape-DN4Qmjsl.mjs} +0 -0
  409. /package/dist/{hash-BPmX6P8I.mjs → hash-mxxx2oPW.mjs} +0 -0
  410. /package/dist/{mime-CbKsKDCB.mjs → mime-C0vOHFm7.mjs} +0 -0
  411. /package/dist/{mode-CZqCF9dZ.mjs → mode-C8yZnIlR.mjs} +0 -0
  412. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CndT35iw.mjs} +0 -0
  413. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-CMehAaKs.mjs} +0 -0
  414. /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
  415. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-NYukYGed.mjs} +0 -0
  416. /package/dist/{patterns-DKAX6oqN.mjs → patterns-CoqlXUvk.mjs} +0 -0
  417. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-BtfrrzfD.mjs} +0 -0
  418. /package/dist/{public-url-B_m9IwdV.mjs → public-url-Cp6hyjVR.mjs} +0 -0
  419. /package/dist/{redirect-BjIBtDWY.mjs → redirect-DrbEmU9a.mjs} +0 -0
  420. /package/dist/{request-cache-ho99schz.mjs → request-cache-CBFjCwSt.mjs} +0 -0
  421. /package/dist/{resolve-DTuDyYKs.mjs → resolve-DE71WcL9.mjs} +0 -0
  422. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-BtkKnvxQ.mjs} +0 -0
  423. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-Ctzfyyp-.mjs} +0 -0
  424. /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
  425. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-FJqwQzj4.mjs} +0 -0
  426. /package/dist/{tokens-SLmgowfd.mjs → tokens-BDQU29Vd.mjs} +0 -0
  427. /package/dist/{transaction-CFLhEOuH.mjs → transaction-0LEAAy8R.mjs} +0 -0
  428. /package/dist/{transport-BnsNxh2l.d.mts → transport-D9pKAzFP.d.mts} +0 -0
  429. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-Dm7Mxvt6.mjs} +0 -0
  430. /package/dist/{types-CJ8DkL0q.mjs → types-B7TDDFMG.mjs} +0 -0
  431. /package/dist/{types-Dryvv7LH.d.mts → types-g0zMtraY.d.mts} +0 -0
  432. /package/dist/{types-Cg276-3z.mjs → types-mVVgRPaU.mjs} +0 -0
  433. /package/dist/{types-DZpT-PnG.d.mts → types-wFu80FrO.d.mts} +0 -0
  434. /package/dist/{url-w7Mp5qAD.mjs → url-EMAguGVk.mjs} +0 -0
@@ -17,6 +17,7 @@
17
17
  * ```
18
18
  */
19
19
  import { getImage } from "astro:assets";
20
+ import { Image as AstroImage } from "astro:assets";
20
21
  import type { HTMLAttributes } from "astro/types";
21
22
  import {
22
23
  RESPONSIVE_BREAKPOINTS,
@@ -43,9 +44,20 @@ interface Props extends Omit<
43
44
  height?: number;
44
45
  /** Priority loading (disables lazy loading) */
45
46
  priority?: boolean;
47
+ /** Render the LQIP placeholder as an inline background. Disable for strict CSP. */
48
+ placeholder?: boolean;
46
49
  }
47
50
 
48
- const { image, alt, width, height, priority, ...attrs } = Astro.props;
51
+ const {
52
+ image,
53
+ alt,
54
+ width,
55
+ height,
56
+ priority,
57
+ placeholder = true,
58
+ class: className,
59
+ ...attrs
60
+ } = Astro.props;
49
61
 
50
62
  // Normalize string URLs to object form
51
63
  function normalizeImage(
@@ -59,13 +71,12 @@ function normalizeImage(
59
71
  }
60
72
 
61
73
  /**
62
- * Build the URL for a local image
74
+ * Build the URL for a local image. Prefers `meta.storageKey`; falls back to
75
+ * the internal proxy with `img.id` when no storage key is available.
63
76
  */
64
77
  function buildLocalImageUrl(img: MediaValue): string {
65
- const storageKey = (img.meta?.storageKey as string) || img.id;
66
78
  return buildRenderMediaUrl(Astro.locals.dineway?.getPublicMediaUrl, {
67
- storageKey,
68
- url: img.src,
79
+ storageKey: img.meta?.storageKey as string | undefined,
69
80
  id: img.id,
70
81
  });
71
82
  }
@@ -99,6 +110,7 @@ const aspectRatio =
99
110
  let src = "";
100
111
  let srcset: string | undefined;
101
112
  let sizes: string | undefined;
113
+ let astroImageSrc = "";
102
114
 
103
115
  if (img) {
104
116
  const providerId = img.provider ?? "local";
@@ -107,18 +119,21 @@ if (img) {
107
119
  // Local provider or direct src URL. Route through Astro's image service
108
120
  // when possible; fall back to the plain URL when optimization is unavailable.
109
121
  src = img.src || buildLocalImageUrl(img);
110
- const optimized = await buildResponsiveImage(getImage, {
111
- src: toAbsoluteMediaUrl(
112
- src,
113
- getPublicOrigin(Astro.url, Astro.locals.dineway?.config)
114
- ),
115
- width: finalWidth,
116
- height: finalHeight,
117
- });
118
- if (optimized) {
119
- src = optimized.src;
120
- srcset = optimized.srcset;
121
- sizes = optimized.sizes;
122
+ const publicOrigin = getPublicOrigin(Astro.url, Astro.locals.dineway?.config);
123
+ const absoluteSrc = toAbsoluteMediaUrl(src, publicOrigin);
124
+ if (finalWidth && finalHeight && absoluteSrc.startsWith(`${publicOrigin}/`)) {
125
+ astroImageSrc = absoluteSrc;
126
+ } else {
127
+ const optimized = await buildResponsiveImage(getImage, {
128
+ src: absoluteSrc,
129
+ width: finalWidth,
130
+ height: finalHeight,
131
+ });
132
+ if (optimized) {
133
+ src = optimized.src;
134
+ srcset = optimized.srcset;
135
+ sizes = optimized.sizes;
136
+ }
122
137
  }
123
138
  } else {
124
139
  // External provider
@@ -160,28 +175,20 @@ if (img) {
160
175
  }
161
176
  }
162
177
 
163
- // Build placeholder background style
164
- const blurhash =
165
- typeof image === "object"
166
- ? (image?.meta?.blurhash as string | undefined)
167
- : undefined;
178
+ // Build placeholder background style. Prefer the first-class MediaValue fields;
179
+ // fall back to `meta` for snapshots stored before LQIP was promoted off `meta`.
180
+ const blurhash = img?.blurhash ?? (img?.meta?.blurhash as string | undefined);
168
181
  const dominantColor =
169
- typeof image === "object"
170
- ? (image?.meta?.dominantColor as string | undefined)
171
- : undefined;
182
+ img?.dominantColor ?? (img?.meta?.dominantColor as string | undefined);
172
183
 
173
184
  let placeholderStyle = "";
174
- if (blurhash) {
185
+ if (placeholder && blurhash) {
175
186
  const { blurhashToImageCssString } = await import("@unpic/placeholder");
176
187
  placeholderStyle = blurhashToImageCssString(blurhash);
177
- } else if (dominantColor) {
188
+ } else if (placeholder && dominantColor) {
178
189
  placeholderStyle = `background-color: ${dominantColor};`;
179
190
  }
180
191
 
181
- const baseStyle = aspectRatio
182
- ? `aspect-ratio: ${aspectRatio}; max-width: 100%; height: auto;`
183
- : "max-width: 100%; height: auto;";
184
-
185
192
  const imgProps: Record<string, unknown> = {
186
193
  src,
187
194
  srcset,
@@ -192,9 +199,35 @@ const imgProps: Record<string, unknown> = {
192
199
  loading: priority ? "eager" : "lazy",
193
200
  fetchpriority: priority ? "high" : undefined,
194
201
  decoding: "async",
195
- style: placeholderStyle ? `${baseStyle} ${placeholderStyle}` : baseStyle,
202
+ style: placeholderStyle || undefined,
203
+ class: ["dineway-image-media", className].filter(Boolean).join(" "),
196
204
  ...attrs,
197
205
  };
198
206
  ---
199
207
 
200
- {img && src ? <img {...imgProps} /> : null}
208
+ {
209
+ img && astroImageSrc ? (
210
+ <AstroImage
211
+ src={astroImageSrc}
212
+ alt={finalAlt}
213
+ width={finalWidth}
214
+ height={finalHeight}
215
+ priority={priority}
216
+ layout="constrained"
217
+ loading={priority ? "eager" : "lazy"}
218
+ decoding="async"
219
+ class={className}
220
+ style={placeholderStyle || undefined}
221
+ {...attrs}
222
+ />
223
+ ) : img && src ? (
224
+ <img {...imgProps} />
225
+ ) : null
226
+ }
227
+
228
+ <style>
229
+ .dineway-image-media {
230
+ max-width: 100%;
231
+ height: auto;
232
+ }
233
+ </style>
@@ -167,9 +167,8 @@ const finalAlt = alt ?? (embed?.type === "image" ? embed.alt : undefined) ?? med
167
167
  </audio>
168
168
  )}
169
169
 
170
+ {/* Custom component embeds (Mux player, etc.) require dynamic import. Placeholder until that lands. */}
170
171
  {embed?.type === "component" && (
171
- <!-- Custom component embeds (Mux player, etc.) require dynamic import -->
172
- <!-- For now, show a placeholder - full implementation TBD -->
173
172
  <div class="dineway-media-component" data-package={embed.package} data-export={embed.export}>
174
173
  <p>Custom media component: {embed.package}</p>
175
174
  </div>
@@ -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,