dineway 0.1.49 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/dist/{activity-events-CwM7yxPW.mjs → activity-events-y6eT8UW6.mjs} +6 -38
  2. package/dist/actor-CrObAPV0.mjs +37 -0
  3. package/dist/after-BfniwgIf.mjs +9 -0
  4. package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins-_oeyP6x-.mjs} +1 -1
  5. package/dist/api/route-utils.d.mts +10 -10
  6. package/dist/api/route-utils.mjs +16 -13
  7. package/dist/api/schemas/index.d.mts +2 -2
  8. package/dist/api/schemas/index.mjs +5 -4
  9. package/dist/{api-BMIxRIEN.mjs → api-ByrU2q-Z.mjs} +60 -36
  10. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-CjVMQT-X.mjs} +6 -2
  11. package/dist/{apply-D_RlTYtC.mjs → apply-bZswmZPm.mjs} +117 -77
  12. package/dist/astro/image-endpoint.d.mts +7 -0
  13. package/dist/astro/image-endpoint.mjs +54 -0
  14. package/dist/astro/index.d.mts +35 -11
  15. package/dist/astro/index.mjs +157 -23
  16. package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  17. package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
  18. package/dist/astro/middleware/auth.d.mts +10 -10
  19. package/dist/astro/middleware/auth.mjs +42 -24
  20. package/dist/astro/middleware/redirect.mjs +13 -4
  21. package/dist/astro/middleware/request-context.mjs +8 -5
  22. package/dist/astro/middleware/seed.d.mts +1 -1
  23. package/dist/astro/middleware/seed.mjs +2 -2
  24. package/dist/astro/middleware/setup.mjs +1 -1
  25. package/dist/astro/middleware.mjs +333 -192
  26. package/dist/astro/routes/admin.astro +6 -1
  27. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
  28. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
  29. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  30. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  31. package/dist/astro/routes/api/admin/briefing.mjs +21 -17
  32. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
  34. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
  35. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
  36. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
  38. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
  39. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
  40. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
  41. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
  42. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
  43. package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
  44. package/dist/astro/routes/api/admin/context/_id_/history.mjs +26 -24
  45. package/dist/astro/routes/api/admin/context/_id_/index.mjs +26 -24
  46. package/dist/astro/routes/api/admin/context/_id_/review.mjs +31 -28
  47. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +31 -28
  48. package/dist/astro/routes/api/admin/context/diff.mjs +30 -27
  49. package/dist/astro/routes/api/admin/context/index.mjs +31 -28
  50. package/dist/astro/routes/api/admin/context/stale.mjs +30 -27
  51. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +26 -24
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +30 -27
  53. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +30 -27
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +27 -25
  55. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  57. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  58. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +55 -51
  59. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +55 -51
  60. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
  61. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +53 -49
  62. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +52 -48
  63. package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +52 -48
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
  68. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
  69. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
  70. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +31 -27
  71. package/dist/astro/routes/api/admin/review-requests/index.mjs +10 -9
  72. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
  73. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  74. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
  75. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  76. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  77. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
  78. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  79. package/dist/astro/routes/api/admin/users/index.mjs +7 -6
  80. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  81. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  82. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
  83. package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
  84. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
  85. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  86. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
  87. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  88. package/dist/astro/routes/api/auth/me.mjs +9 -8
  89. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  90. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  91. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  92. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
  93. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  94. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
  95. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
  96. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
  97. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
  98. package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
  99. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  100. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
  101. package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
  102. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  103. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
  104. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
  106. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  107. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -5
  108. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  109. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  110. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
  111. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -9
  112. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  113. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  114. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -9
  115. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
  116. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  117. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -5
  118. package/dist/astro/routes/api/content/_collection_/_id_.mjs +10 -9
  119. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  120. package/dist/astro/routes/api/content/_collection_/index.mjs +10 -9
  121. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  122. package/dist/astro/routes/api/dashboard.mjs +9 -8
  123. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  124. package/dist/astro/routes/api/health.mjs +1 -1
  125. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  126. package/dist/astro/routes/api/import/probe.mjs +22 -10
  127. package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
  128. package/dist/astro/routes/api/import/wordpress/execute.d.mts +19 -1
  129. package/dist/astro/routes/api/import/wordpress/execute.mjs +84 -37
  130. package/dist/astro/routes/api/import/wordpress/media.d.mts +13 -1
  131. package/dist/astro/routes/api/import/wordpress/media.mjs +19 -13
  132. package/dist/astro/routes/api/import/wordpress/prepare.mjs +35 -32
  133. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +18 -1
  134. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +120 -100
  135. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  136. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
  137. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +56 -2
  138. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +283 -55
  139. package/dist/astro/routes/api/manifest.mjs +14 -5
  140. package/dist/astro/routes/api/mcp.mjs +265 -69
  141. package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
  142. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  143. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  144. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  145. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  146. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  147. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  148. package/dist/astro/routes/api/media.mjs +27 -34
  149. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +31 -28
  150. package/dist/astro/routes/api/menus/_name_/items.mjs +31 -28
  151. package/dist/astro/routes/api/menus/_name_/reorder.mjs +31 -28
  152. package/dist/astro/routes/api/menus/_name_/translations.mjs +31 -28
  153. package/dist/astro/routes/api/menus/_name_.mjs +31 -28
  154. package/dist/astro/routes/api/menus/index.mjs +31 -28
  155. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  156. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  157. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  158. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  159. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  160. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  161. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  162. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  163. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  164. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +30 -30
  165. package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
  166. package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
  167. package/dist/astro/routes/api/redirects/_id_.mjs +32 -29
  168. package/dist/astro/routes/api/redirects/index.mjs +32 -29
  169. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  170. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  171. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +47 -43
  172. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +47 -43
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +47 -43
  174. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -43
  175. package/dist/astro/routes/api/schema/collections/index.mjs +47 -43
  176. package/dist/astro/routes/api/schema/index.mjs +13 -14
  177. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
  178. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
  179. package/dist/astro/routes/api/search/enable.mjs +11 -10
  180. package/dist/astro/routes/api/search/index.mjs +10 -9
  181. package/dist/astro/routes/api/search/rebuild.mjs +11 -10
  182. package/dist/astro/routes/api/search/stats.mjs +6 -6
  183. package/dist/astro/routes/api/search/suggest.mjs +10 -9
  184. package/dist/astro/routes/api/sections/_slug_.mjs +31 -28
  185. package/dist/astro/routes/api/sections/index.mjs +31 -28
  186. package/dist/astro/routes/api/settings/email.mjs +4 -4
  187. package/dist/astro/routes/api/settings.mjs +31 -28
  188. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  189. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  190. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
  191. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  192. package/dist/astro/routes/api/setup/index.mjs +29 -25
  193. package/dist/astro/routes/api/setup/status.mjs +3 -3
  194. package/dist/astro/routes/api/snapshot.mjs +8 -7
  195. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +34 -31
  196. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +34 -31
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +34 -31
  198. package/dist/astro/routes/api/taxonomies/index.mjs +34 -31
  199. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  200. package/dist/astro/routes/api/typegen.mjs +4 -4
  201. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  202. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  203. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  204. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +30 -27
  205. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +31 -28
  206. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +31 -28
  207. package/dist/astro/routes/api/widget-areas/_name_.mjs +28 -26
  208. package/dist/astro/routes/api/widget-areas/index.mjs +31 -28
  209. package/dist/astro/routes/api/widget-components.mjs +2 -2
  210. package/dist/astro/routes/robots.txt.mjs +8 -7
  211. package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
  212. package/dist/astro/routes/sitemap.xml.mjs +9 -8
  213. package/dist/astro/session-driver.d.mts +1 -1
  214. package/dist/astro/session-driver.mjs +2 -2
  215. package/dist/astro/types.d.mts +21 -13
  216. package/dist/{audit-BeNsSyfU.mjs → audit-ByVKIwWF.mjs} +1 -1
  217. package/dist/auth/providers/github.d.mts +1 -1
  218. package/dist/auth/providers/google.d.mts +1 -1
  219. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-CqeUmQsv.mjs} +1 -1
  220. package/dist/{authorize-BLO0m7fW.mjs → authorize-CcBxcHtz.mjs} +1 -1
  221. package/dist/{briefing-DJX6irto.mjs → briefing-BJaJI8dm.mjs} +2 -1
  222. package/dist/{briefing-CkTee1ex.mjs → briefing-CawZ59CY.mjs} +90 -28
  223. package/dist/bundle-7C_DpkEq.mjs +602 -0
  224. package/dist/{byline-BVC1lV6G.mjs → byline-e51-fWRs.mjs} +30 -62
  225. package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-CUvbslGc.d.mts} +80 -37
  226. package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-D-N5qVIG.mjs} +1 -1
  227. package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-DOJO16Gm.mjs} +3 -3
  228. package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-87nNnYl4.mjs} +2 -2
  229. package/dist/{bylines-LN9XISRo.mjs → bylines-CMQNCNFh.mjs} +9 -3
  230. package/dist/{bylines-DwokOFj6.mjs → bylines-y4LO-dTj.mjs} +5 -5
  231. package/dist/{cache-Bac05gBd.mjs → cache-C-FNTFYK.mjs} +2 -2
  232. package/dist/{chunks-CuUt7K50.mjs → chunks-CxBt-GxR.mjs} +1 -1
  233. package/dist/cli/index.mjs +94 -659
  234. package/dist/client/external-auth-headers.d.mts +1 -1
  235. package/dist/client/index.d.mts +1 -1
  236. package/dist/client/index.mjs +2 -1
  237. package/dist/{comment-Beue8-15.mjs → comment-DlA4iChg.mjs} +13 -3
  238. package/dist/comment-reaction-DfFao1ST.mjs +58 -0
  239. package/dist/{comments-DcjFIfqX.mjs → comments-DApFGMsP.mjs} +1 -1
  240. package/dist/{content-CBxYGWfL.mjs → content-Bh4BDjv8.mjs} +51 -34
  241. package/dist/content-refresh-CgutSUfO.mjs +1576 -0
  242. package/dist/{context-CQVNZaR8.mjs → context-C5W3G18y.mjs} +111 -50
  243. package/dist/{context-Df1xVYyr.mjs → context-CK4ym2Sf.mjs} +2 -2
  244. package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-MASyGgWf.mjs} +2 -1
  245. package/dist/{cron-DxCAU_Sn.mjs → cron-cKcNTix_.mjs} +7 -3
  246. package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-DQkVT7Ei.mjs} +4 -4
  247. package/dist/db/index.d.mts +3 -3
  248. package/dist/db/index.mjs +1 -1
  249. package/dist/db/libsql.d.mts +1 -1
  250. package/dist/db/postgres.d.mts +1 -1
  251. package/dist/db/sqlite.d.mts +1 -1
  252. package/dist/{device-flow-BZVGftqi.mjs → device-flow-BnqRH-T9.mjs} +5 -5
  253. package/dist/{placeholder-d54Qr_7n.mjs → enrich-DIFIFA8O.mjs} +36 -9
  254. package/dist/{error-DCSuUAZW.mjs → error-CytFlgcd.mjs} +5 -0
  255. package/dist/field-defs-cache-DRNdhBJv.mjs +49 -0
  256. package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-Crzypjqu.mjs} +1 -1
  257. package/dist/hitl-Hw1RmWOq.mjs +677 -0
  258. package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-B4Vbcmaq.mjs} +2 -2
  259. package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-hEVzvP8l.mjs} +5 -4
  260. package/dist/import-Bh9biJfx.mjs +1354 -0
  261. package/dist/{index-CZiWCQDp.d.mts → index-D4y6NGiy.d.mts} +75 -3
  262. package/dist/index.d.mts +17 -16
  263. package/dist/index.mjs +80 -68
  264. package/dist/{jsonld-DZ67souc.d.mts → jsonld-Dq0gsnOH.d.mts} +8 -4
  265. package/dist/{load-D9OiGr2m.mjs → load-DmYeniXl.mjs} +1 -1
  266. package/dist/{loader--GOYux8M.mjs → loader-CjWqjweO.mjs} +117 -31
  267. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-BxVPYMJR.mjs} +34 -1
  268. package/dist/mcp-reviewed-executor-TwVbMzG6.mjs +555 -0
  269. package/dist/media/image-endpoint.d.mts +32 -0
  270. package/dist/media/image-endpoint.mjs +111 -0
  271. package/dist/media/index.d.mts +27 -2
  272. package/dist/media/index.mjs +5 -3
  273. package/dist/media/local-runtime.d.mts +16 -11
  274. package/dist/media/local-runtime.mjs +9 -7
  275. package/dist/{media-CbKyYukG.mjs → media-DMj0grzC.mjs} +3 -1
  276. package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-BlVCSzHx.mjs} +1 -1
  277. package/dist/media-url-lEKSrpr9.mjs +20 -0
  278. package/dist/{menus-BZbXf-ej.mjs → menus-TaW1gKnk.mjs} +19 -5
  279. package/dist/{menus-C7F0sCrC.mjs → menus-xvsnVZXw.mjs} +80 -15
  280. package/dist/{normalize-ByemhhfW.mjs → normalize-5ek_z7de.mjs} +8 -1
  281. package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-DiaGvRVz.mjs} +5 -5
  282. package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dl9E8dEM.mjs} +2 -2
  283. package/dist/object-cache/memory.d.mts +14 -0
  284. package/dist/object-cache/memory.mjs +55 -0
  285. package/dist/object-cache-D51qOseS.mjs +419 -0
  286. package/dist/page/index.d.mts +4 -3
  287. package/dist/page/index.mjs +2 -2
  288. package/dist/{parse-CneSgl7-.mjs → parse-CbymENaR.mjs} +1 -1
  289. package/dist/{parser-DxfsARXL.mjs → parser-C1nYd-81.mjs} +151 -9
  290. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-uvNRZBX9.d.mts} +12 -4
  291. package/dist/plugin-utils.d.mts +9 -9
  292. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  293. package/dist/plugins/adapt-sandbox-entry.mjs +11 -2
  294. package/dist/{plugins-DzfqRREq.mjs → plugins-BolVa-tl.mjs} +831 -63
  295. package/dist/{transport-LSdZVXHF.mjs → portable-text-dA_UlJwW.mjs} +1 -134
  296. package/dist/{preview-C-3YTX2U.mjs → preview-vSVg6fwG.mjs} +4 -3
  297. package/dist/process-cache-7xgAO9JY.mjs +106 -0
  298. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-MD8zAbnH.d.mts} +1 -1
  299. package/dist/{public-url-B4xV4rGa.d.mts → public-url-gsp3oUbu.d.mts} +1 -1
  300. package/dist/{query-Ds0EnMFX.mjs → query-CfRCdaL3.mjs} +281 -76
  301. package/dist/{query-CZ3TH_Uu.mjs → query-jaAmw8E1.mjs} +11 -6
  302. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-ZLdyWoZF.mjs} +2 -2
  303. package/dist/{redirect-CEACczxo.mjs → redirect-BAjt4Z6b.mjs} +2 -2
  304. package/dist/{redirects-DYj1yPxs.mjs → redirects-BTdwpQtE.mjs} +47 -24
  305. package/dist/{redirects-ocRJmQHP.mjs → redirects-CA-xylPG.mjs} +19 -11
  306. package/dist/{registry-D7HACema.mjs → registry-CtyVedcN.mjs} +130 -77
  307. package/dist/request-context.d.mts +2 -0
  308. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CUypToDJ.mjs} +1 -1
  309. package/dist/{review-requests-Qum4713s.mjs → review-requests-C9Ff11Vq.mjs} +1 -1
  310. package/dist/{review-requests-BW2NxY-l.mjs → review-requests-DUyEmtmG.mjs} +1 -1
  311. package/dist/{runner-09sTqtv0.d.mts → runner-1tC2tIRV.d.mts} +1 -1
  312. package/dist/runner-DB7CRfOF.mjs +6740 -0
  313. package/dist/{runtime-C4-2lSFg.d.mts → runtime-BOeiQsCv.d.mts} +1952 -1489
  314. package/dist/runtime.d.mts +10 -10
  315. package/dist/runtime.mjs +3 -3
  316. package/dist/schema-DXdYj4R3.mjs +8 -0
  317. package/dist/{search-Gdrqj582.mjs → search-DSaLgEFI.mjs} +5 -3
  318. package/dist/{secrets-CeGpBFV2.mjs → secrets-CDZo2k8L.mjs} +14 -11
  319. package/dist/{sections-BOjU13Y-.mjs → sections-PVVXHGfp.mjs} +2 -2
  320. package/dist/seed/index.d.mts +2 -2
  321. package/dist/seed/index.mjs +21 -18
  322. package/dist/seo/index.d.mts +1 -1
  323. package/dist/seo/index.mjs +3 -12
  324. package/dist/{seo-CLj8lS7Q.mjs → seo-CQG3GCHQ.mjs} +5 -2
  325. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-C1EnikHB.mjs} +11 -3
  326. package/dist/{seo-5lJOtB5J.mjs → seo-qa7Dn0jK.mjs} +22 -4
  327. package/dist/{service-jGlhrICs.mjs → service-DiN4ZuPp.mjs} +2 -2
  328. package/dist/session-user-CAKImna3.mjs +22 -0
  329. package/dist/{settings-CUXOxzsT.mjs → settings-BbqgHWpU.mjs} +28 -55
  330. package/dist/{settings-DlBsT2VS.mjs → settings-i4VPP8bT.mjs} +2 -2
  331. package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-B8fl-mjV.mjs} +1 -1
  332. package/dist/{site-activity-DONFrMBJ.mjs → site-activity-Dy3FROs0.mjs} +1 -1
  333. package/dist/{site-context-C8Az_P_I.mjs → site-context-DQiL8Fl5.mjs} +23 -652
  334. package/dist/{site-url-DIMD68go.mjs → site-url-BML3GQYm.mjs} +1 -1
  335. package/dist/status-DANd8ERo.mjs +21 -0
  336. package/dist/storage/local.d.mts +1 -1
  337. package/dist/storage/local.mjs +1 -1
  338. package/dist/storage/s3.d.mts +1 -1
  339. package/dist/storage/s3.mjs +1 -1
  340. package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-9s-v03H-.mjs} +36 -29
  341. package/dist/taxonomies-DRiixp_E.mjs +443 -0
  342. package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-Dvsw6BOs.mjs} +44 -9
  343. package/dist/transport-BNmCqLu7.mjs +134 -0
  344. package/dist/types-4garmdWa.mjs +66 -0
  345. package/dist/{types-DSPGWjxO.d.mts → types-C8XW6L19.d.mts} +225 -4
  346. package/dist/{types-GaCtZ1k9.d.mts → types-CDpH6MA4.d.mts} +18 -0
  347. package/dist/{types-DRIKLmJI.d.mts → types-C_ly5eTp.d.mts} +17 -2
  348. package/dist/types-DF7ZuGGk.d.mts +118 -0
  349. package/dist/types-DU0bU2Wu.d.mts +2392 -0
  350. package/dist/{types-CwawBUTa.d.mts → types-DW_-sFyz.d.mts} +2 -1
  351. package/dist/{types-CSgR9nQB.mjs → types-Dq1qT19x.mjs} +1 -1
  352. package/dist/ui/server-runtime.d.mts +15 -15
  353. package/dist/ui/server-runtime.mjs +24 -20
  354. package/dist/url-Cac7a9QZ.mjs +33 -0
  355. package/dist/{user-DTLoZs16.mjs → user-BIZPzCb9.mjs} +2 -2
  356. package/dist/{utils-B8hBJ9Oz.mjs → utils-CMDhr5Xd.mjs} +129 -7
  357. package/dist/{validate-DzjCdy6v.d.mts → validate-CZvb-BKB.d.mts} +10 -7
  358. package/dist/{validate-DWmPO6oj.mjs → validate-DNs0pTSc.mjs} +11 -6
  359. package/dist/version-BTvfRGc6.mjs +6 -0
  360. package/dist/{widgets-BpJ8EpPd.mjs → widgets-f0ibZUIq.mjs} +46 -43
  361. package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-BhHJX8XE.mjs} +1 -1
  362. package/dist/{zod-generator-K91-g665.mjs → zod-generator-B7TMjyFJ.mjs} +41 -13
  363. package/package.json +30 -8
  364. package/src/components/Block.astro +50 -0
  365. package/src/components/Comments.astro +143 -1
  366. package/src/components/DinewayHead.astro +19 -2
  367. package/src/components/DinewayImage.astro +66 -33
  368. package/src/components/DinewayMedia.astro +1 -2
  369. package/src/components/Image.astro +85 -40
  370. package/src/components/InlinePortableTextEditor.tsx +12 -2
  371. package/src/components/JsonLdScript.astro +9 -0
  372. package/src/components/LiveSearch.astro +40 -4
  373. package/src/components/index.ts +4 -0
  374. package/src/components/live-search-routing.ts +30 -0
  375. package/src/components/portable-text-text-align.ts +15 -0
  376. package/src/ui.ts +2 -0
  377. package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
  378. package/dist/import-4YBXbDkI.mjs +0 -684
  379. package/dist/runner-DzIpHGND.mjs +0 -2836
  380. package/dist/schema-Bsi-VpYv.mjs +0 -8
  381. package/dist/taxonomies-CZ-_DitR.mjs +0 -327
  382. package/dist/types-CuJOqHfM.d.mts +0 -758
  383. package/dist/version-C4gfn0PJ.mjs +0 -6
  384. /package/dist/{adapters-OQCImOL7.d.mts → adapters-NVSs4UH7.d.mts} +0 -0
  385. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-2r7OWi_I.mjs} +0 -0
  386. /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-Bjlepa2E.mjs} +0 -0
  387. /package/dist/{components--pg6zBvu.mjs → components-Bclf98Be.mjs} +0 -0
  388. /package/dist/{context-types-r8oFvyOq.mjs → context-types-DqTo6C79.mjs} +0 -0
  389. /package/dist/{default-B6iaLvP7.mjs → default--K40jqm0.mjs} +0 -0
  390. /package/dist/{email-console-BOVqIYpB.mjs → email-console-ChgKFO8-.mjs} +0 -0
  391. /package/dist/{escape-BDgouFFY.mjs → escape-Bd4P_xKg.mjs} +0 -0
  392. /package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-BMsUnIAw.mjs} +0 -0
  393. /package/dist/{mime-CbKsKDCB.mjs → mime-CA7Lgovc.mjs} +0 -0
  394. /package/dist/{mode-CZqCF9dZ.mjs → mode-C4CIyjtR.mjs} +0 -0
  395. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CNoXafF7.mjs} +0 -0
  396. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-Ygw4bNyt.mjs} +0 -0
  397. /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
  398. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-BUwu8BA3.mjs} +0 -0
  399. /package/dist/{patterns-DKAX6oqN.mjs → patterns-BhAvqO0S.mjs} +0 -0
  400. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-D0w9dqjm.mjs} +0 -0
  401. /package/dist/{public-url-B_m9IwdV.mjs → public-url-BEz_sM9n.mjs} +0 -0
  402. /package/dist/{redirect-BjIBtDWY.mjs → redirect-wphRBv4y.mjs} +0 -0
  403. /package/dist/{request-cache-ho99schz.mjs → request-cache-D9GQBxMP.mjs} +0 -0
  404. /package/dist/{resolve-DTuDyYKs.mjs → resolve-Cb6Dbz-C.mjs} +0 -0
  405. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-CoyjILvW.mjs} +0 -0
  406. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-C3mqXg4C.mjs} +0 -0
  407. /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
  408. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-DWe8jwAp.mjs} +0 -0
  409. /package/dist/{tokens-SLmgowfd.mjs → tokens-1RK1n6ED.mjs} +0 -0
  410. /package/dist/{transaction-CFLhEOuH.mjs → transaction-C2EOMTJA.mjs} +0 -0
  411. /package/dist/{transport-BnsNxh2l.d.mts → transport-CcJu3Co8.d.mts} +0 -0
  412. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-DTXQ2IMv.mjs} +0 -0
  413. /package/dist/{types-CJ8DkL0q.mjs → types-B3t5cxhU.mjs} +0 -0
  414. /package/dist/{types-nP9vGUFq.d.mts → types-C46EvNdc.d.mts} +0 -0
  415. /package/dist/{types-Cg276-3z.mjs → types-C5CVgwsV.mjs} +0 -0
  416. /package/dist/{types-DZpT-PnG.d.mts → types-POH8PQZh.d.mts} +0 -0
  417. /package/dist/{types-Dryvv7LH.d.mts → types-Rc3gQqqw.d.mts} +0 -0
  418. /package/dist/{url-w7Mp5qAD.mjs → url-CpyFDFpO.mjs} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dineway",
3
- "version": "0.1.49",
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
  ],
@@ -320,7 +341,7 @@
320
341
  },
321
342
  "dependencies": {
322
343
  "@forgeway/sdk": "^1.1.0",
323
- "@cloudflare/kumo": "^2.3.0",
344
+ "@cloudflare/kumo": "2.6.0",
324
345
  "@floating-ui/react": "^0.27.16",
325
346
  "@modelcontextprotocol/sdk": "^1.26.0",
326
347
  "@portabletext/toolkit": "^5.0.1",
@@ -338,7 +359,7 @@
338
359
  "@tiptap/suggestion": "^3.20.0",
339
360
  "@unpic/placeholder": "^0.1.2",
340
361
  "arctic": "^3.7.0",
341
- "astro-portabletext": "^0.11.0",
362
+ "astro-portabletext": "^0.13.0",
342
363
  "better-sqlite3": "^12.8.0",
343
364
  "blurhash": "^2.0.5",
344
365
  "citty": "^0.1.6",
@@ -356,9 +377,9 @@
356
377
  "ulidx": "^2.4.1",
357
378
  "upng-js": "^2.1.0",
358
379
  "zod": "^4.4.1",
359
- "@dineway-ai/admin": "^0.1.18",
360
- "@dineway-ai/auth": "^0.1.18",
361
- "@dineway-ai/gutenberg-to-portable-text": "^0.1.16"
380
+ "@dineway-ai/admin": "^0.2.0",
381
+ "@dineway-ai/auth": "^0.2.0",
382
+ "@dineway-ai/gutenberg-to-portable-text": "^0.2.0"
362
383
  },
363
384
  "optionalDependencies": {
364
385
  "@aws-sdk/client-s3": "^3.1049.0",
@@ -380,14 +401,14 @@
380
401
  "@types/react": "19.2.14",
381
402
  "@types/sanitize-html": "^2.16.0",
382
403
  "@types/sax": "^1.2.7",
383
- "@vitest/ui": "^4.0.17",
404
+ "@vitest/ui": "4.0.18",
384
405
  "publint": "0.3.17",
385
406
  "tsdown": "0.20.3",
386
407
  "typescript": "^5.9.3",
387
408
  "vite": "^6.0.0",
388
409
  "vitest": "^4.0.18",
389
410
  "zod-openapi": "^5.4.6",
390
- "@dineway-ai/blocks": "^0.1.16"
411
+ "@dineway-ai/blocks": "^0.2.0"
391
412
  },
392
413
  "keywords": [
393
414
  "astro",
@@ -405,6 +426,7 @@
405
426
  "typecheck": "tsgo --noEmit",
406
427
  "check": "publint && attw --pack --ignore-rules=cjs-resolves-to-esm --ignore-rules=no-resolution --ignore-rules=internal-resolution-error",
407
428
  "test": "vitest",
429
+ "test:repro": "vitest run --config vitest.repro.config.ts",
408
430
  "test:smoke": "vitest run --config vitest.smoke.config.ts",
409
431
  "test:integration": "vitest run --config vitest.integration.config.ts"
410
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>