dineway 0.1.48 → 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 (420) hide show
  1. package/dist/{activity-events-C9u37D5z.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-DhipQNLb.mjs → allowed-origins-_oeyP6x-.mjs} +1 -1
  5. package/dist/api/route-utils.d.mts +10 -10
  6. package/dist/api/route-utils.mjs +17 -14
  7. package/dist/api/schemas/index.d.mts +2 -2
  8. package/dist/api/schemas/index.mjs +5 -4
  9. package/dist/{api-Eiy8_zVZ.mjs → api-ByrU2q-Z.mjs} +61 -37
  10. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-CjVMQT-X.mjs} +6 -2
  11. package/dist/{apply-CX3no7XE.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 +14 -5
  21. package/dist/astro/middleware/request-context.mjs +9 -6
  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 +334 -193
  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 +22 -18
  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 +18 -15
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +18 -15
  38. package/dist/astro/routes/api/admin/bylines/index.mjs +18 -15
  39. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +15 -13
  40. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -6
  41. package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -10
  42. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -6
  43. package/dist/astro/routes/api/admin/comments/index.mjs +12 -10
  44. package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -25
  45. package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -25
  46. package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -29
  47. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -29
  48. package/dist/astro/routes/api/admin/context/diff.mjs +31 -28
  49. package/dist/astro/routes/api/admin/context/index.mjs +32 -29
  50. package/dist/astro/routes/api/admin/context/stale.mjs +31 -28
  51. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -25
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -28
  53. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -28
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -26
  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 +56 -52
  59. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -52
  60. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +48 -44
  61. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -50
  62. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -49
  63. package/dist/astro/routes/api/admin/plugins/index.mjs +48 -44
  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 +47 -43
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -49
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -43
  68. package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -43
  69. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +6 -6
  70. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -28
  71. package/dist/astro/routes/api/admin/review-requests/index.mjs +11 -10
  72. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -43
  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 +47 -43
  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 +10 -9
  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 +6 -6
  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 +16 -14
  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 +6 -6
  108. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -6
  109. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -6
  110. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +12 -11
  111. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +11 -10
  112. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -6
  113. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  114. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +11 -10
  115. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +17 -15
  116. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  117. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -6
  118. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -10
  119. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  120. package/dist/astro/routes/api/content/_collection_/index.mjs +11 -10
  121. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  122. package/dist/astro/routes/api/dashboard.mjs +10 -9
  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 +23 -11
  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 +85 -38
  130. package/dist/astro/routes/api/import/wordpress/media.d.mts +13 -1
  131. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
  132. package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -33
  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 +121 -101
  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 +25 -13
  137. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  138. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +56 -2
  139. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -56
  140. package/dist/astro/routes/api/manifest.mjs +14 -5
  141. package/dist/astro/routes/api/mcp.mjs +266 -70
  142. package/dist/astro/routes/api/media/_id_/confirm.mjs +39 -11
  143. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  144. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  145. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  146. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  147. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  148. package/dist/astro/routes/api/media/upload-url.mjs +12 -11
  149. package/dist/astro/routes/api/media.mjs +28 -35
  150. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -29
  151. package/dist/astro/routes/api/menus/_name_/items.mjs +32 -29
  152. package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -29
  153. package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -29
  154. package/dist/astro/routes/api/menus/_name_.mjs +32 -29
  155. package/dist/astro/routes/api/menus/index.mjs +32 -29
  156. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  157. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  158. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  159. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  160. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  161. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  162. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  163. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  164. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  165. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +30 -30
  166. package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
  167. package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
  168. package/dist/astro/routes/api/redirects/_id_.mjs +33 -30
  169. package/dist/astro/routes/api/redirects/index.mjs +33 -30
  170. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  171. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  172. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +48 -44
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -44
  174. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -44
  175. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -44
  176. package/dist/astro/routes/api/schema/collections/index.mjs +48 -44
  177. package/dist/astro/routes/api/schema/index.mjs +13 -14
  178. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -43
  179. package/dist/astro/routes/api/schema/orphans/index.mjs +47 -43
  180. package/dist/astro/routes/api/search/enable.mjs +12 -11
  181. package/dist/astro/routes/api/search/index.mjs +11 -10
  182. package/dist/astro/routes/api/search/rebuild.mjs +12 -11
  183. package/dist/astro/routes/api/search/stats.mjs +7 -7
  184. package/dist/astro/routes/api/search/suggest.mjs +11 -10
  185. package/dist/astro/routes/api/sections/_slug_.mjs +32 -29
  186. package/dist/astro/routes/api/sections/index.mjs +32 -29
  187. package/dist/astro/routes/api/settings/email.mjs +4 -4
  188. package/dist/astro/routes/api/settings.mjs +32 -29
  189. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  190. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  191. package/dist/astro/routes/api/setup/dev-bypass.mjs +32 -26
  192. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  193. package/dist/astro/routes/api/setup/index.mjs +30 -26
  194. package/dist/astro/routes/api/setup/status.mjs +3 -3
  195. package/dist/astro/routes/api/snapshot.mjs +9 -8
  196. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -32
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -32
  198. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -32
  199. package/dist/astro/routes/api/taxonomies/index.mjs +35 -32
  200. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  201. package/dist/astro/routes/api/typegen.mjs +4 -4
  202. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  203. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  204. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  205. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +31 -28
  206. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -29
  207. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -29
  208. package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -27
  209. package/dist/astro/routes/api/widget-areas/index.mjs +32 -29
  210. package/dist/astro/routes/api/widget-components.mjs +2 -2
  211. package/dist/astro/routes/robots.txt.mjs +9 -8
  212. package/dist/astro/routes/sitemap-_collection_.xml.mjs +24 -15
  213. package/dist/astro/routes/sitemap.xml.mjs +10 -9
  214. package/dist/astro/session-driver.d.mts +1 -1
  215. package/dist/astro/session-driver.mjs +3 -3
  216. package/dist/astro/types.d.mts +21 -13
  217. package/dist/{audit-D1cbG7xH.mjs → audit-ByVKIwWF.mjs} +1 -1
  218. package/dist/auth/providers/github.d.mts +1 -1
  219. package/dist/auth/providers/google.d.mts +1 -1
  220. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-CqeUmQsv.mjs} +1 -1
  221. package/dist/{authorize-BLO0m7fW.mjs → authorize-CcBxcHtz.mjs} +1 -1
  222. package/dist/{briefing-CObXGOGz.mjs → briefing-BJaJI8dm.mjs} +2 -1
  223. package/dist/{briefing-gKWiGLt1.mjs → briefing-CawZ59CY.mjs} +90 -28
  224. package/dist/bundle-7C_DpkEq.mjs +602 -0
  225. package/dist/{byline-1ntDwv8c.mjs → byline-e51-fWRs.mjs} +30 -62
  226. package/dist/{byline-fields-BX7rWKNU.d.mts → byline-fields-CUvbslGc.d.mts} +49 -6
  227. package/dist/{byline-fields-C9_iaPaM.mjs → byline-fields-D-N5qVIG.mjs} +1 -1
  228. package/dist/{byline-fields-B-ZkoVft.mjs → byline-fields-DOJO16Gm.mjs} +3 -3
  229. package/dist/{byline-registry-CUSvkasJ.mjs → byline-registry-87nNnYl4.mjs} +2 -2
  230. package/dist/{bylines-bC15ZqAv.mjs → bylines-CMQNCNFh.mjs} +9 -3
  231. package/dist/{bylines-DtxChhN_.mjs → bylines-y4LO-dTj.mjs} +5 -5
  232. package/dist/{cache-DbKyr60Q.mjs → cache-C-FNTFYK.mjs} +2 -2
  233. package/dist/{chunks-C5zp2xir.mjs → chunks-CxBt-GxR.mjs} +1 -1
  234. package/dist/cli/index.mjs +820 -1276
  235. package/dist/client/external-auth-headers.d.mts +1 -1
  236. package/dist/client/index.d.mts +1 -1
  237. package/dist/client/index.mjs +2 -1
  238. package/dist/{comment-CXDOQ93N.mjs → comment-DlA4iChg.mjs} +13 -3
  239. package/dist/comment-reaction-DfFao1ST.mjs +58 -0
  240. package/dist/{comments-hK-rdzJ9.mjs → comments-DApFGMsP.mjs} +1 -1
  241. package/dist/{content-QaryevFO.mjs → content-Bh4BDjv8.mjs} +51 -34
  242. package/dist/content-refresh-CgutSUfO.mjs +1576 -0
  243. package/dist/{context-CoYb_fvK.mjs → context-C5W3G18y.mjs} +111 -50
  244. package/dist/{context-DBL1ib4v.mjs → context-CK4ym2Sf.mjs} +2 -2
  245. package/dist/{context-route-helpers-CYQVmbIm.mjs → context-route-helpers-MASyGgWf.mjs} +2 -1
  246. package/dist/{cron-DxCAU_Sn.mjs → cron-cKcNTix_.mjs} +7 -3
  247. package/dist/{dashboard-DNlqsknJ.mjs → dashboard-DQkVT7Ei.mjs} +4 -4
  248. package/dist/db/index.d.mts +3 -3
  249. package/dist/db/index.mjs +1 -1
  250. package/dist/db/libsql.d.mts +1 -1
  251. package/dist/db/postgres.d.mts +1 -1
  252. package/dist/db/sqlite.d.mts +1 -1
  253. package/dist/{device-flow-DygsFPGL.mjs → device-flow-BnqRH-T9.mjs} +5 -5
  254. package/dist/{placeholder-BDo81Is5.mjs → enrich-DIFIFA8O.mjs} +36 -9
  255. package/dist/{error-DCSuUAZW.mjs → error-CytFlgcd.mjs} +5 -0
  256. package/dist/field-defs-cache-DRNdhBJv.mjs +49 -0
  257. package/dist/{fts-manager-CIZlScg5.mjs → fts-manager-Crzypjqu.mjs} +1 -1
  258. package/dist/hitl-Hw1RmWOq.mjs +677 -0
  259. package/dist/{hitl-requests-CGQwOEiq.mjs → hitl-requests-B4Vbcmaq.mjs} +2 -2
  260. package/dist/{hitl-route-helpers-GSDLNPpN.mjs → hitl-route-helpers-hEVzvP8l.mjs} +5 -4
  261. package/dist/import-Bh9biJfx.mjs +1354 -0
  262. package/dist/{index-CwRuZ-u8.d.mts → index-D4y6NGiy.d.mts} +75 -3
  263. package/dist/index.d.mts +17 -16
  264. package/dist/index.mjs +81 -69
  265. package/dist/{jsonld-DZ67souc.d.mts → jsonld-Dq0gsnOH.d.mts} +8 -4
  266. package/dist/{load-xE01Jm0V.mjs → load-DmYeniXl.mjs} +1 -1
  267. package/dist/{loader-tg63WSY2.mjs → loader-CjWqjweO.mjs} +117 -31
  268. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-BxVPYMJR.mjs} +34 -1
  269. package/dist/mcp-reviewed-executor-TwVbMzG6.mjs +555 -0
  270. package/dist/media/image-endpoint.d.mts +32 -0
  271. package/dist/media/image-endpoint.mjs +111 -0
  272. package/dist/media/index.d.mts +27 -2
  273. package/dist/media/index.mjs +5 -3
  274. package/dist/media/local-runtime.d.mts +16 -11
  275. package/dist/media/local-runtime.mjs +10 -8
  276. package/dist/{media-DUAjMfvR.mjs → media-DMj0grzC.mjs} +3 -1
  277. package/dist/{media-allowlist-BsXkT9RK.mjs → media-allowlist-BlVCSzHx.mjs} +1 -1
  278. package/dist/media-url-lEKSrpr9.mjs +20 -0
  279. package/dist/{menus-WpFRMXjz.mjs → menus-TaW1gKnk.mjs} +19 -5
  280. package/dist/{menus-DU1eZqw_.mjs → menus-xvsnVZXw.mjs} +80 -15
  281. package/dist/{normalize-DUnoXAa9.mjs → normalize-5ek_z7de.mjs} +8 -1
  282. package/dist/{oauth-authorization-D-1p52Je.mjs → oauth-authorization-DiaGvRVz.mjs} +5 -5
  283. package/dist/{oauth-clients-CzeMGyUU.mjs → oauth-clients-Dl9E8dEM.mjs} +2 -2
  284. package/dist/object-cache/memory.d.mts +14 -0
  285. package/dist/object-cache/memory.mjs +55 -0
  286. package/dist/object-cache-D51qOseS.mjs +419 -0
  287. package/dist/page/index.d.mts +4 -3
  288. package/dist/page/index.mjs +2 -2
  289. package/dist/{parse-CneSgl7-.mjs → parse-CbymENaR.mjs} +1 -1
  290. package/dist/{parser-DxfsARXL.mjs → parser-C1nYd-81.mjs} +151 -9
  291. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-uvNRZBX9.d.mts} +12 -4
  292. package/dist/plugin-utils.d.mts +9 -9
  293. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  294. package/dist/plugins/adapt-sandbox-entry.mjs +11 -2
  295. package/dist/{plugins-C57YQi4l.mjs → plugins-BolVa-tl.mjs} +832 -64
  296. package/dist/{transport-LSdZVXHF.mjs → portable-text-dA_UlJwW.mjs} +1 -134
  297. package/dist/{preview-D5rvDhRt.mjs → preview-vSVg6fwG.mjs} +4 -3
  298. package/dist/process-cache-7xgAO9JY.mjs +106 -0
  299. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-MD8zAbnH.d.mts} +1 -1
  300. package/dist/{public-url-DLUM5OOv.mjs → public-url-BEz_sM9n.mjs} +24 -18
  301. package/dist/{public-url-B5HaoGzj.d.mts → public-url-gsp3oUbu.d.mts} +5 -4
  302. package/dist/{query-BYc3oruA.mjs → query-CfRCdaL3.mjs} +281 -76
  303. package/dist/{query-DKEwzobh.mjs → query-jaAmw8E1.mjs} +11 -6
  304. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-ZLdyWoZF.mjs} +2 -2
  305. package/dist/{redirect-C2zXRj3c.mjs → redirect-BAjt4Z6b.mjs} +2 -2
  306. package/dist/{redirects-YZo_znWG.mjs → redirects-BTdwpQtE.mjs} +47 -24
  307. package/dist/{redirects-ocRJmQHP.mjs → redirects-CA-xylPG.mjs} +19 -11
  308. package/dist/{registry-CTkbIDB9.mjs → registry-CtyVedcN.mjs} +130 -77
  309. package/dist/request-context.d.mts +2 -0
  310. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CUypToDJ.mjs} +1 -1
  311. package/dist/{review-requests-C0un5kdV.mjs → review-requests-C9Ff11Vq.mjs} +1 -1
  312. package/dist/{review-requests-gGMyYYhy.mjs → review-requests-DUyEmtmG.mjs} +1 -1
  313. package/dist/{runner-D4FL9usy.d.mts → runner-1tC2tIRV.d.mts} +1 -1
  314. package/dist/runner-DB7CRfOF.mjs +6740 -0
  315. package/dist/{runtime-DEWQpZ-4.d.mts → runtime-BOeiQsCv.d.mts} +2028 -1564
  316. package/dist/runtime.d.mts +10 -10
  317. package/dist/runtime.mjs +4 -4
  318. package/dist/schema-DXdYj4R3.mjs +8 -0
  319. package/dist/{search-axGQ1KY3.mjs → search-DSaLgEFI.mjs} +5 -3
  320. package/dist/{secrets-062Izo8i.mjs → secrets-CDZo2k8L.mjs} +15 -12
  321. package/dist/{sections-OLKgXL10.mjs → sections-PVVXHGfp.mjs} +2 -2
  322. package/dist/seed/index.d.mts +2 -2
  323. package/dist/seed/index.mjs +22 -19
  324. package/dist/seo/index.d.mts +1 -1
  325. package/dist/seo/index.mjs +3 -12
  326. package/dist/{seo-Cd45Po8L.mjs → seo-CQG3GCHQ.mjs} +5 -2
  327. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-C1EnikHB.mjs} +11 -3
  328. package/dist/{seo-5lJOtB5J.mjs → seo-qa7Dn0jK.mjs} +22 -4
  329. package/dist/{service-Bwad8s5h.mjs → service-DiN4ZuPp.mjs} +2 -2
  330. package/dist/session-user-CAKImna3.mjs +22 -0
  331. package/dist/{settings-yLjz_I4T.mjs → settings-BbqgHWpU.mjs} +28 -55
  332. package/dist/{settings-lAHjaUit.mjs → settings-i4VPP8bT.mjs} +2 -2
  333. package/dist/{setup-complete--PradA4R.mjs → setup-complete-B8fl-mjV.mjs} +1 -1
  334. package/dist/{site-activity-D7Xyropw.mjs → site-activity-Dy3FROs0.mjs} +1 -1
  335. package/dist/{site-context-DaN9Z91j.mjs → site-context-DQiL8Fl5.mjs} +23 -652
  336. package/dist/{site-url-DpGZo9Z6.mjs → site-url-BML3GQYm.mjs} +1 -1
  337. package/dist/status-DANd8ERo.mjs +21 -0
  338. package/dist/storage/local.d.mts +1 -1
  339. package/dist/storage/local.mjs +1 -1
  340. package/dist/storage/s3.d.mts +1 -1
  341. package/dist/storage/s3.mjs +1 -1
  342. package/dist/{taxonomies-uXVEoQso.mjs → taxonomies-9s-v03H-.mjs} +36 -29
  343. package/dist/taxonomies-DRiixp_E.mjs +443 -0
  344. package/dist/{taxonomy-CBmkmMuU.mjs → taxonomy-Dvsw6BOs.mjs} +44 -9
  345. package/dist/{tokens-CjSgb0AC.mjs → tokens-1RK1n6ED.mjs} +1 -1
  346. package/dist/transport-BNmCqLu7.mjs +134 -0
  347. package/dist/types-4garmdWa.mjs +66 -0
  348. package/dist/{types-DSPGWjxO.d.mts → types-C8XW6L19.d.mts} +225 -4
  349. package/dist/{types-GaCtZ1k9.d.mts → types-CDpH6MA4.d.mts} +18 -0
  350. package/dist/{types-DRIKLmJI.d.mts → types-C_ly5eTp.d.mts} +17 -2
  351. package/dist/types-DF7ZuGGk.d.mts +118 -0
  352. package/dist/types-DU0bU2Wu.d.mts +2392 -0
  353. package/dist/{types-CwawBUTa.d.mts → types-DW_-sFyz.d.mts} +2 -1
  354. package/dist/{types-DfuD0Afl.mjs → types-Dq1qT19x.mjs} +2 -2
  355. package/dist/ui/server-runtime.d.mts +15 -15
  356. package/dist/ui/server-runtime.mjs +25 -21
  357. package/dist/url-Cac7a9QZ.mjs +33 -0
  358. package/dist/{user-DtNmjNYt.mjs → user-BIZPzCb9.mjs} +2 -2
  359. package/dist/{utils-wv-zvC-Y.mjs → utils-CMDhr5Xd.mjs} +129 -7
  360. package/dist/{validate-BMs11tan.d.mts → validate-CZvb-BKB.d.mts} +10 -7
  361. package/dist/{validate-7SYRbz2f.mjs → validate-DNs0pTSc.mjs} +11 -6
  362. package/dist/version-BTvfRGc6.mjs +6 -0
  363. package/dist/{widgets-DR8EHuRO.mjs → widgets-f0ibZUIq.mjs} +46 -43
  364. package/dist/{wordpress-slugs-Dvhxh4cl.mjs → wordpress-slugs-BhHJX8XE.mjs} +1 -1
  365. package/dist/{zod-generator-BS9-umbk.mjs → zod-generator-B7TMjyFJ.mjs} +41 -13
  366. package/package.json +31 -8
  367. package/src/components/Block.astro +50 -0
  368. package/src/components/Comments.astro +143 -1
  369. package/src/components/DinewayHead.astro +19 -2
  370. package/src/components/DinewayImage.astro +66 -33
  371. package/src/components/DinewayMedia.astro +1 -2
  372. package/src/components/Image.astro +85 -40
  373. package/src/components/InlinePortableTextEditor.tsx +12 -2
  374. package/src/components/JsonLdScript.astro +9 -0
  375. package/src/components/LiveSearch.astro +40 -4
  376. package/src/components/index.ts +4 -0
  377. package/src/components/live-search-routing.ts +30 -0
  378. package/src/components/portable-text-text-align.ts +15 -0
  379. package/src/ui.ts +2 -0
  380. package/dist/entity-aliases-Egjmqc7I.mjs +0 -51
  381. package/dist/import-CvHY6sf5.mjs +0 -684
  382. package/dist/runner-B-tbV751.mjs +0 -2741
  383. package/dist/schema-B6zyB-Xn.mjs +0 -8
  384. package/dist/taxonomies-CNOGeC-3.mjs +0 -327
  385. package/dist/types-eu5UDgHN.d.mts +0 -652
  386. package/dist/version-xlzMSXF2.mjs +0 -6
  387. /package/dist/{adapters-OQCImOL7.d.mts → adapters-NVSs4UH7.d.mts} +0 -0
  388. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-2r7OWi_I.mjs} +0 -0
  389. /package/dist/{base64-C1Q9yr0B.mjs → base64-F8-DUraK.mjs} +0 -0
  390. /package/dist/{challenge-store-CRSz-Xim.mjs → challenge-store-Bjlepa2E.mjs} +0 -0
  391. /package/dist/{components--pg6zBvu.mjs → components-Bclf98Be.mjs} +0 -0
  392. /package/dist/{context-types-DQh_XKkn.mjs → context-types-DqTo6C79.mjs} +0 -0
  393. /package/dist/{default-B6iaLvP7.mjs → default--K40jqm0.mjs} +0 -0
  394. /package/dist/{email-console-BOVqIYpB.mjs → email-console-ChgKFO8-.mjs} +0 -0
  395. /package/dist/{escape-BDgouFFY.mjs → escape-Bd4P_xKg.mjs} +0 -0
  396. /package/dist/{experimental-workflows-Dh4DUoD_.mjs → experimental-workflows-BMsUnIAw.mjs} +0 -0
  397. /package/dist/{mime-8pAB8-77.mjs → mime-CA7Lgovc.mjs} +0 -0
  398. /package/dist/{mode-CpyEz8pe.mjs → mode-C4CIyjtR.mjs} +0 -0
  399. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CNoXafF7.mjs} +0 -0
  400. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-Ygw4bNyt.mjs} +0 -0
  401. /package/dist/{options-BvJoSSJR.mjs → options-DQPTH5n0.mjs} +0 -0
  402. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-BUwu8BA3.mjs} +0 -0
  403. /package/dist/{patterns-r-0n824Y.mjs → patterns-BhAvqO0S.mjs} +0 -0
  404. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-D0w9dqjm.mjs} +0 -0
  405. /package/dist/{redirect-BjIBtDWY.mjs → redirect-wphRBv4y.mjs} +0 -0
  406. /package/dist/{request-cache-CYMbwZc6.mjs → request-cache-D9GQBxMP.mjs} +0 -0
  407. /package/dist/{resolve-DTuDyYKs.mjs → resolve-Cb6Dbz-C.mjs} +0 -0
  408. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-CoyjILvW.mjs} +0 -0
  409. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-C3mqXg4C.mjs} +0 -0
  410. /package/dist/{slugify-BzGxlOFx.mjs → slugify-KSsVD_D3.mjs} +0 -0
  411. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-DWe8jwAp.mjs} +0 -0
  412. /package/dist/{transaction-CShMWIej.mjs → transaction-C2EOMTJA.mjs} +0 -0
  413. /package/dist/{transport-BnsNxh2l.d.mts → transport-CcJu3Co8.d.mts} +0 -0
  414. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-DTXQ2IMv.mjs} +0 -0
  415. /package/dist/{types-BO8TGjS8.mjs → types-B3t5cxhU.mjs} +0 -0
  416. /package/dist/{types-nP9vGUFq.d.mts → types-C46EvNdc.d.mts} +0 -0
  417. /package/dist/{types-Cg276-3z.mjs → types-C5CVgwsV.mjs} +0 -0
  418. /package/dist/{types-DZpT-PnG.d.mts → types-POH8PQZh.d.mts} +0 -0
  419. /package/dist/{types-Dryvv7LH.d.mts → types-Rc3gQqqw.d.mts} +0 -0
  420. /package/dist/{url-w7Mp5qAD.mjs → url-CpyFDFpO.mjs} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dineway",
3
- "version": "0.1.48",
3
+ "version": "0.2.0",
4
4
  "description": "Agentic Website builder for restaurants — structured content meets AI via the Model Context Protocol",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -93,6 +93,10 @@
93
93
  "types": "./dist/storage/s3.d.mts",
94
94
  "default": "./dist/storage/s3.mjs"
95
95
  },
96
+ "./object-cache/memory": {
97
+ "types": "./dist/object-cache/memory.d.mts",
98
+ "default": "./dist/object-cache/memory.mjs"
99
+ },
96
100
  "./media": {
97
101
  "types": "./dist/media/index.d.mts",
98
102
  "default": "./dist/media/index.mjs"
@@ -101,6 +105,14 @@
101
105
  "types": "./dist/media/local-runtime.d.mts",
102
106
  "default": "./dist/media/local-runtime.mjs"
103
107
  },
108
+ "./media/image-endpoint": {
109
+ "types": "./dist/media/image-endpoint.d.mts",
110
+ "default": "./dist/media/image-endpoint.mjs"
111
+ },
112
+ "./image-endpoint": {
113
+ "types": "./dist/astro/image-endpoint.d.mts",
114
+ "default": "./dist/astro/image-endpoint.mjs"
115
+ },
104
116
  "./runtime": {
105
117
  "types": "./dist/runtime.d.mts",
106
118
  "default": "./dist/runtime.mjs"
@@ -265,6 +277,12 @@
265
277
  "media/local-runtime": [
266
278
  "dist/media/local-runtime.d.mts"
267
279
  ],
280
+ "media/image-endpoint": [
281
+ "dist/media/image-endpoint.d.mts"
282
+ ],
283
+ "image-endpoint": [
284
+ "dist/astro/image-endpoint.d.mts"
285
+ ],
268
286
  "middleware": [
269
287
  "dist/astro/middleware.d.mts"
270
288
  ],
@@ -280,6 +298,9 @@
280
298
  "middleware/setup": [
281
299
  "dist/astro/middleware/setup.d.mts"
282
300
  ],
301
+ "object-cache/memory": [
302
+ "dist/object-cache/memory.d.mts"
303
+ ],
283
304
  "page": [
284
305
  "dist/page/index.d.mts"
285
306
  ],
@@ -319,7 +340,8 @@
319
340
  }
320
341
  },
321
342
  "dependencies": {
322
- "@cloudflare/kumo": "^2.3.0",
343
+ "@forgeway/sdk": "^1.1.0",
344
+ "@cloudflare/kumo": "2.6.0",
323
345
  "@floating-ui/react": "^0.27.16",
324
346
  "@modelcontextprotocol/sdk": "^1.26.0",
325
347
  "@portabletext/toolkit": "^5.0.1",
@@ -337,7 +359,7 @@
337
359
  "@tiptap/suggestion": "^3.20.0",
338
360
  "@unpic/placeholder": "^0.1.2",
339
361
  "arctic": "^3.7.0",
340
- "astro-portabletext": "^0.11.0",
362
+ "astro-portabletext": "^0.13.0",
341
363
  "better-sqlite3": "^12.8.0",
342
364
  "blurhash": "^2.0.5",
343
365
  "citty": "^0.1.6",
@@ -355,9 +377,9 @@
355
377
  "ulidx": "^2.4.1",
356
378
  "upng-js": "^2.1.0",
357
379
  "zod": "^4.4.1",
358
- "@dineway-ai/admin": "^0.1.17",
359
- "@dineway-ai/auth": "^0.1.17",
360
- "@dineway-ai/gutenberg-to-portable-text": "^0.1.15"
380
+ "@dineway-ai/admin": "^0.2.0",
381
+ "@dineway-ai/auth": "^0.2.0",
382
+ "@dineway-ai/gutenberg-to-portable-text": "^0.2.0"
361
383
  },
362
384
  "optionalDependencies": {
363
385
  "@aws-sdk/client-s3": "^3.1049.0",
@@ -379,14 +401,14 @@
379
401
  "@types/react": "19.2.14",
380
402
  "@types/sanitize-html": "^2.16.0",
381
403
  "@types/sax": "^1.2.7",
382
- "@vitest/ui": "^4.0.17",
404
+ "@vitest/ui": "4.0.18",
383
405
  "publint": "0.3.17",
384
406
  "tsdown": "0.20.3",
385
407
  "typescript": "^5.9.3",
386
408
  "vite": "^6.0.0",
387
409
  "vitest": "^4.0.18",
388
410
  "zod-openapi": "^5.4.6",
389
- "@dineway-ai/blocks": "^0.1.15"
411
+ "@dineway-ai/blocks": "^0.2.0"
390
412
  },
391
413
  "keywords": [
392
414
  "astro",
@@ -404,6 +426,7 @@
404
426
  "typecheck": "tsgo --noEmit",
405
427
  "check": "publint && attw --pack --ignore-rules=cjs-resolves-to-esm --ignore-rules=no-resolution --ignore-rules=internal-resolution-error",
406
428
  "test": "vitest",
429
+ "test:repro": "vitest run --config vitest.repro.config.ts",
407
430
  "test:smoke": "vitest run --config vitest.smoke.config.ts",
408
431
  "test:integration": "vitest run --config vitest.integration.config.ts"
409
432
  }
@@ -0,0 +1,50 @@
1
+ ---
2
+ import type { BlockProps } from "astro-portabletext/types";
3
+
4
+ import { textAlignClassName } from "./portable-text-text-align.js";
5
+
6
+ type TextAlignedNode = BlockProps["node"] & { textAlign?: string };
7
+ type Props = Omit<BlockProps, "node"> & { node: TextAlignedNode };
8
+
9
+ const props = Astro.props as Props;
10
+ const { node, index: _index, isInline: _isInline, ...attrs } = props;
11
+
12
+ const styleIs = (style: string) => style === node.style;
13
+ const alignClass = textAlignClassName(node.textAlign);
14
+ ---
15
+
16
+ {
17
+ styleIs("h1") ? (
18
+ <h1 class={alignClass} {...attrs}>
19
+ <slot />
20
+ </h1>
21
+ ) : styleIs("h2") ? (
22
+ <h2 class={alignClass} {...attrs}>
23
+ <slot />
24
+ </h2>
25
+ ) : styleIs("h3") ? (
26
+ <h3 class={alignClass} {...attrs}>
27
+ <slot />
28
+ </h3>
29
+ ) : styleIs("h4") ? (
30
+ <h4 class={alignClass} {...attrs}>
31
+ <slot />
32
+ </h4>
33
+ ) : styleIs("h5") ? (
34
+ <h5 class={alignClass} {...attrs}>
35
+ <slot />
36
+ </h5>
37
+ ) : styleIs("h6") ? (
38
+ <h6 class={alignClass} {...attrs}>
39
+ <slot />
40
+ </h6>
41
+ ) : styleIs("blockquote") ? (
42
+ <blockquote class={alignClass} {...attrs}>
43
+ <slot />
44
+ </blockquote>
45
+ ) : (
46
+ <p class={alignClass} {...attrs}>
47
+ <slot />
48
+ </p>
49
+ )
50
+ }
@@ -19,6 +19,8 @@ interface Props {
19
19
  collection: string;
20
20
  contentId: string;
21
21
  threaded?: boolean;
22
+ reactions?: boolean;
23
+ sort?: "oldest" | "best";
22
24
  class?: string;
23
25
  }
24
26
 
@@ -26,13 +28,15 @@ const {
26
28
  collection,
27
29
  contentId,
28
30
  threaded = false,
31
+ reactions = false,
32
+ sort = "oldest",
29
33
  class: className,
30
34
  } = Astro.props;
31
35
 
32
36
  const collectionInfo = await getCollectionInfo(collection);
33
37
  const enabled = collectionInfo?.commentsEnabled ?? false;
34
38
  const { items, total } = enabled
35
- ? await getComments({ collection, contentId, threaded })
39
+ ? await getComments({ collection, contentId, threaded, reactions, sort })
36
40
  : { items: [], total: 0 };
37
41
 
38
42
  const URL_RE = /https?:\/\/[^\s<>"')\]]+/g;
@@ -60,15 +64,74 @@ function escapeHtml(text: string): string {
60
64
  function formatBody(text: string): string {
61
65
  return autoLinkUrls(escapeHtml(text));
62
66
  }
67
+
68
+ const REACTION_SCRIPT = `
69
+ (() => {
70
+ const sections = document.querySelectorAll('[data-ec-comments][data-ec-reactions]');
71
+ sections.forEach((section) => {
72
+ const collection = section.getAttribute('data-collection');
73
+ const contentId = section.getAttribute('data-content-id');
74
+ if (!collection || !contentId) return;
75
+
76
+ const base = '/_dineway/api/comments/' + encodeURIComponent(collection) + '/' + encodeURIComponent(contentId) + '/reactions';
77
+ const headers = { 'X-Dineway-Request': '1' };
78
+
79
+ fetch(base, { headers: headers })
80
+ .then((response) => (response.ok ? response.json() : null))
81
+ .then((payload) => {
82
+ const viewer = payload && payload.data && payload.data.viewer;
83
+ if (!viewer) return;
84
+ Object.keys(viewer).forEach((commentId) => {
85
+ (viewer[commentId] || []).forEach((reaction) => {
86
+ const selector = '.ec-reaction[data-comment-id="' + commentId + '"][data-ec-reaction="' + reaction + '"]';
87
+ const button = section.querySelector(selector);
88
+ if (button) button.setAttribute('aria-pressed', 'true');
89
+ });
90
+ });
91
+ })
92
+ .catch(() => {});
93
+
94
+ section.addEventListener('click', (event) => {
95
+ const target = event.target;
96
+ if (!(target instanceof Element)) return;
97
+ const button = target.closest('.ec-reaction');
98
+ if (!button || !section.contains(button)) return;
99
+
100
+ const commentId = button.getAttribute('data-comment-id');
101
+ const reaction = button.getAttribute('data-ec-reaction');
102
+ if (!commentId || !reaction) return;
103
+
104
+ button.disabled = true;
105
+ fetch(base, {
106
+ method: 'POST',
107
+ headers: Object.assign({ 'Content-Type': 'application/json' }, headers),
108
+ body: JSON.stringify({ commentId: commentId, reaction: reaction }),
109
+ })
110
+ .then((response) => (response.ok ? response.json() : null))
111
+ .then((payload) => {
112
+ const data = payload && payload.data;
113
+ if (!data) return;
114
+ button.setAttribute('aria-pressed', data.reacted ? 'true' : 'false');
115
+ const countEl = button.querySelector('[data-ec-reaction-count]');
116
+ if (countEl) countEl.textContent = String((data.counts && data.counts[reaction]) || 0);
117
+ })
118
+ .catch(() => {})
119
+ .finally(() => { button.disabled = false; });
120
+ });
121
+ });
122
+ })();
123
+ `;
63
124
  ---
64
125
 
65
126
  {
66
127
  enabled && (
128
+ <Fragment>
67
129
  <section
68
130
  class:list={["ec-comments", className]}
69
131
  data-ec-comments
70
132
  data-collection={collection}
71
133
  data-content-id={contentId}
134
+ {...(reactions ? { "data-ec-reactions": "" } : {})}
72
135
  >
73
136
  <h3 class="ec-comments-heading">
74
137
  {total === 0
@@ -110,6 +173,25 @@ function formatBody(text: string): string {
110
173
  class="ec-comment-body"
111
174
  set:html={formatBody(comment.body)}
112
175
  />
176
+ {reactions && (
177
+ <div class="ec-comment-actions">
178
+ <button
179
+ type="button"
180
+ class="ec-reaction"
181
+ data-ec-reaction="like"
182
+ data-comment-id={comment.id}
183
+ aria-pressed="false"
184
+ >
185
+ <span class="ec-reaction-icon" aria-hidden="true">
186
+ &#x2661;
187
+ </span>
188
+ <span class="ec-reaction-label">Like</span>
189
+ <span class="ec-reaction-count" data-ec-reaction-count>
190
+ {comment.reactions?.like ?? 0}
191
+ </span>
192
+ </button>
193
+ </div>
194
+ )}
113
195
  {threaded && comment.replies && comment.replies.length > 0 && (
114
196
  <ol class="ec-comment-replies">
115
197
  {comment.replies.map((reply: PublicComment) => (
@@ -151,6 +233,28 @@ function formatBody(text: string): string {
151
233
  class="ec-comment-body"
152
234
  set:html={formatBody(reply.body)}
153
235
  />
236
+ {reactions && (
237
+ <div class="ec-comment-actions">
238
+ <button
239
+ type="button"
240
+ class="ec-reaction"
241
+ data-ec-reaction="like"
242
+ data-comment-id={reply.id}
243
+ aria-pressed="false"
244
+ >
245
+ <span class="ec-reaction-icon" aria-hidden="true">
246
+ &#x2661;
247
+ </span>
248
+ <span class="ec-reaction-label">Like</span>
249
+ <span
250
+ class="ec-reaction-count"
251
+ data-ec-reaction-count
252
+ >
253
+ {reply.reactions?.like ?? 0}
254
+ </span>
255
+ </button>
256
+ </div>
257
+ )}
154
258
  </article>
155
259
  </li>
156
260
  ))}
@@ -162,6 +266,8 @@ function formatBody(text: string): string {
162
266
  </ol>
163
267
  )}
164
268
  </section>
269
+ {reactions && <script is:inline set:html={REACTION_SCRIPT} />}
270
+ </Fragment>
165
271
  )
166
272
  }
167
273
 
@@ -227,4 +333,40 @@ function formatBody(text: string): string {
227
333
  white-space: pre-wrap;
228
334
  word-break: break-word;
229
335
  }
336
+
337
+ .ec-comment-actions {
338
+ margin-top: 0.5rem;
339
+ }
340
+
341
+ .ec-reaction {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ gap: 0.35rem;
345
+ font: inherit;
346
+ font-size: 0.875em;
347
+ color: inherit;
348
+ background: none;
349
+ border: var(--ec-comment-border);
350
+ border-radius: 999px;
351
+ padding: 0.15rem 0.6rem;
352
+ cursor: pointer;
353
+ }
354
+
355
+ .ec-reaction[aria-pressed="true"] {
356
+ border-color: currentColor;
357
+ font-weight: 600;
358
+ }
359
+
360
+ .ec-reaction[aria-pressed="true"] .ec-reaction-icon {
361
+ color: #e0245e;
362
+ }
363
+
364
+ .ec-reaction:disabled {
365
+ opacity: 0.5;
366
+ cursor: default;
367
+ }
368
+
369
+ .ec-reaction-count {
370
+ font-variant-numeric: tabular-nums;
371
+ }
230
372
  </style>
@@ -14,6 +14,7 @@
14
14
  * ```
15
15
  */
16
16
  import {
17
+ createSha256CspHash,
17
18
  generateBaseSeoContributions,
18
19
  generateSiteSeoContributions,
19
20
  getPageRuntime,
@@ -25,7 +26,9 @@ import {
25
26
  absolutizeMediaUrl,
26
27
  type PageMetadataContribution,
27
28
  type PublicPageContext,
29
+ type ResolvedPageMetadata,
28
30
  } from "dineway/ui/server-runtime";
31
+ import JsonLdScript from "./JsonLdScript.astro";
29
32
 
30
33
  interface Props {
31
34
  page: PublicPageContext;
@@ -37,6 +40,7 @@ const runtime = getPageRuntime(Astro.locals as Record<string, unknown>);
37
40
  let metadataHtml = "";
38
41
  let siteIdentityHtml = "";
39
42
  let fragmentsHtml = "";
43
+ let jsonLdScripts: ResolvedPageMetadata["jsonld"] = [];
40
44
 
41
45
  if (runtime) {
42
46
  // Plugin contributions come BEFORE site/base, so resolvePageMetadata's
@@ -59,17 +63,30 @@ if (runtime) {
59
63
  const siteContributions = generateSiteSeoContributions(siteSettings.seo);
60
64
  const allContributions = [...pluginContributions, ...siteContributions, ...baseContributions];
61
65
  const resolved = resolvePageMetadata(allContributions);
62
- metadataHtml = renderPageMetadata(resolved);
66
+ jsonLdScripts = resolved.jsonld;
67
+ metadataHtml = renderPageMetadata(resolved, { includeJsonLd: false });
63
68
  siteIdentityHtml = renderSiteIdentity({ favicon: siteSettings.favicon });
64
69
  fragmentsHtml = renderFragments(fragments, "head");
65
70
  } else {
66
71
  // No runtime (Dineway not initialized) — still render base SEO
67
72
  const baseContributions: PageMetadataContribution[] = generateBaseSeoContributions(page);
68
73
  const resolved = resolvePageMetadata(baseContributions);
69
- metadataHtml = renderPageMetadata(resolved);
74
+ jsonLdScripts = resolved.jsonld;
75
+ metadataHtml = renderPageMetadata(resolved, { includeJsonLd: false });
76
+ }
77
+
78
+ if (Astro.csp && jsonLdScripts.length > 0) {
79
+ await Promise.all(
80
+ jsonLdScripts.map(async ({ json }) => {
81
+ Astro.csp?.insertScriptHash(await createSha256CspHash(json));
82
+ }),
83
+ );
70
84
  }
71
85
  ---
72
86
 
73
87
  <Fragment set:html={metadataHtml} />
88
+ {
89
+ jsonLdScripts.map(({ json }) => <JsonLdScript json={json} />)
90
+ }
74
91
  <Fragment set:html={siteIdentityHtml} />
75
92
  <Fragment set:html={fragmentsHtml} />
@@ -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>