dineway 0.1.3 → 0.1.5

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 (296) hide show
  1. package/README.md +6 -3
  2. package/dist/{apply-CAPvMfoU.mjs → apply-iVSqz2qs.mjs} +132 -39
  3. package/dist/astro/index.d.mts +18 -9
  4. package/dist/astro/index.mjs +238 -16
  5. package/dist/astro/middleware/auth.d.mts +16 -5
  6. package/dist/astro/middleware/auth.mjs +74 -37
  7. package/dist/astro/middleware/redirect.mjs +24 -8
  8. package/dist/astro/middleware/request-context.mjs +18 -5
  9. package/dist/astro/middleware/setup.mjs +1 -1
  10. package/dist/astro/middleware.mjs +411 -169
  11. package/dist/astro/types.d.mts +25 -8
  12. package/dist/{byline-DeWCMU_i.mjs → byline-OhH2dlRu.mjs} +6 -21
  13. package/dist/{bylines-DyqBV9EQ.mjs → bylines-BGpD9_hy.mjs} +16 -6
  14. package/dist/cache-BdSY-gQN.mjs +42 -0
  15. package/dist/chunks--4F8ddV4.mjs +18 -0
  16. package/dist/cli/index.mjs +935 -15
  17. package/dist/client/external-auth-headers.d.mts +1 -1
  18. package/dist/client/index.d.mts +11 -3
  19. package/dist/client/index.mjs +4 -3
  20. package/dist/{connection-C9pxzuag.mjs → connection-BCNICDWN.mjs} +22 -5
  21. package/dist/{content-zSgdNmnt.mjs → content-DWi4d0rT.mjs} +41 -2
  22. package/dist/database/instrumentation.d.mts +34 -0
  23. package/dist/database/instrumentation.mjs +53 -0
  24. package/dist/db/index.d.mts +3 -3
  25. package/dist/db/index.mjs +2 -2
  26. package/dist/db/libsql.d.mts +1 -1
  27. package/dist/db/libsql.mjs +11 -5
  28. package/dist/db/postgres.d.mts +1 -1
  29. package/dist/db/sqlite.d.mts +1 -1
  30. package/dist/db/sqlite.mjs +7 -1
  31. package/dist/db-errors-CEqD7qH9.mjs +23 -0
  32. package/dist/{default-WYlzADZL.mjs → default-VjJyuuG9.mjs} +2 -0
  33. package/dist/{dialect-helpers-B9uSp2GJ.mjs → dialect-helpers-DhTzaUxP.mjs} +3 -0
  34. package/dist/{error-DrxtnGPg.mjs → error-BmL6QipT.mjs} +7 -3
  35. package/dist/{index-C-jx21qs.d.mts → index-yvc6E_17.d.mts} +157 -30
  36. package/dist/index.d.mts +11 -11
  37. package/dist/index.mjs +24 -22
  38. package/dist/{loader-qKmo0wAY.mjs → loader-sMG4TZ-u.mjs} +9 -3
  39. package/dist/media/index.d.mts +1 -1
  40. package/dist/media/index.mjs +1 -1
  41. package/dist/media/local-runtime.d.mts +7 -7
  42. package/dist/page/index.d.mts +10 -2
  43. package/dist/page/index.mjs +22 -1
  44. package/dist/patterns-CrCYkMBb.mjs +92 -0
  45. package/dist/{placeholder-bOx1xCTY.d.mts → placeholder--wOi4TbO.d.mts} +1 -1
  46. package/dist/{placeholder-B3knXwNc.mjs → placeholder-Cp8g5Emj.mjs} +1 -1
  47. package/dist/plugins/adapt-sandbox-entry.d.mts +5 -5
  48. package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
  49. package/dist/{query-BiaPl_g2.mjs → query-kDmwCsHh.mjs} +118 -50
  50. package/dist/{redirect-JPqLAbxa.mjs → redirect-DnEWAkVg.mjs} +43 -99
  51. package/dist/{registry-DSd1GWB8.mjs → registry-C0zjeB9P.mjs} +191 -123
  52. package/dist/request-cache-Dk5qPSOx.mjs +66 -0
  53. package/dist/request-context.d.mts +4 -16
  54. package/dist/{runner-B5l1JfOj.d.mts → runner-CFI6B6J2.d.mts} +1 -1
  55. package/dist/{runner-BGUGywgG.mjs → runner-DWZm2KQm.mjs} +589 -137
  56. package/dist/runtime.d.mts +6 -6
  57. package/dist/runtime.mjs +2 -2
  58. package/dist/{search-BNruJHDL.mjs → search-ByRGV2pq.mjs} +570 -424
  59. package/dist/seed/index.d.mts +2 -2
  60. package/dist/seed/index.mjs +11 -10
  61. package/dist/seo/index.d.mts +1 -1
  62. package/dist/storage/local.d.mts +1 -1
  63. package/dist/storage/local.mjs +1 -1
  64. package/dist/storage/s3.d.mts +11 -3
  65. package/dist/storage/s3.mjs +78 -15
  66. package/dist/taxonomies-1s5PaS_8.mjs +266 -0
  67. package/dist/transaction-Cn2rjY78.mjs +27 -0
  68. package/dist/{types-BgQeVaPj.d.mts → types-BuMDPy5C.d.mts} +52 -3
  69. package/dist/{types-DuNbGKjF.mjs → types-COeOq9nK.mjs} +6 -1
  70. package/dist/{types-ju-_ORz7.d.mts → types-CWbdtiux.d.mts} +13 -5
  71. package/dist/{types-D38djUXv.d.mts → types-Cj0KMIZV.d.mts} +16 -3
  72. package/dist/{types-DkvMXalq.d.mts → types-DOrVigru.d.mts} +159 -0
  73. package/dist/{validate-CXnRKfJK.mjs → validate-BZ5wnLLp.mjs} +2 -1
  74. package/dist/{validate-DVKJJ-M_.d.mts → validate-IPf8n4Fj.d.mts} +4 -51
  75. package/dist/{validate-CqRJb_xU.mjs → validate-VPnKoIzW.mjs} +10 -10
  76. package/dist/version-BKXPsfmJ.mjs +6 -0
  77. package/package.json +53 -39
  78. package/src/astro/routes/PluginRegistry.tsx +21 -0
  79. package/src/astro/routes/admin.astro +99 -0
  80. package/src/astro/routes/api/admin/allowed-domains/[domain].ts +112 -0
  81. package/src/astro/routes/api/admin/allowed-domains/index.ts +108 -0
  82. package/src/astro/routes/api/admin/api-tokens/[id].ts +44 -0
  83. package/src/astro/routes/api/admin/api-tokens/index.ts +90 -0
  84. package/src/astro/routes/api/admin/briefing.ts +76 -0
  85. package/src/astro/routes/api/admin/bylines/[id]/index.ts +90 -0
  86. package/src/astro/routes/api/admin/bylines/index.ts +74 -0
  87. package/src/astro/routes/api/admin/comments/[id]/status.ts +120 -0
  88. package/src/astro/routes/api/admin/comments/[id].ts +64 -0
  89. package/src/astro/routes/api/admin/comments/bulk.ts +42 -0
  90. package/src/astro/routes/api/admin/comments/counts.ts +30 -0
  91. package/src/astro/routes/api/admin/comments/index.ts +46 -0
  92. package/src/astro/routes/api/admin/context/[id]/history.ts +35 -0
  93. package/src/astro/routes/api/admin/context/[id]/index.ts +35 -0
  94. package/src/astro/routes/api/admin/context/[id]/review.ts +57 -0
  95. package/src/astro/routes/api/admin/context/[id]/supersede.ts +58 -0
  96. package/src/astro/routes/api/admin/context/diff.ts +35 -0
  97. package/src/astro/routes/api/admin/context/index.ts +69 -0
  98. package/src/astro/routes/api/admin/context/stale.ts +35 -0
  99. package/src/astro/routes/api/admin/hitl-requests/[id]/index.ts +38 -0
  100. package/src/astro/routes/api/admin/hitl-requests/[id]/resolve.ts +54 -0
  101. package/src/astro/routes/api/admin/hitl-requests/index.ts +38 -0
  102. package/src/astro/routes/api/admin/hooks/exclusive/[hookName].ts +132 -0
  103. package/src/astro/routes/api/admin/hooks/exclusive/index.ts +51 -0
  104. package/src/astro/routes/api/admin/oauth-clients/[id].ts +137 -0
  105. package/src/astro/routes/api/admin/oauth-clients/index.ts +95 -0
  106. package/src/astro/routes/api/admin/plugins/[id]/disable.ts +91 -0
  107. package/src/astro/routes/api/admin/plugins/[id]/enable.ts +91 -0
  108. package/src/astro/routes/api/admin/plugins/[id]/index.ts +38 -0
  109. package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +98 -0
  110. package/src/astro/routes/api/admin/plugins/[id]/update.ts +154 -0
  111. package/src/astro/routes/api/admin/plugins/index.ts +32 -0
  112. package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +62 -0
  113. package/src/astro/routes/api/admin/plugins/marketplace/[id]/index.ts +33 -0
  114. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +135 -0
  115. package/src/astro/routes/api/admin/plugins/marketplace/index.ts +38 -0
  116. package/src/astro/routes/api/admin/plugins/updates.ts +28 -0
  117. package/src/astro/routes/api/admin/review-requests/[id]/index.ts +35 -0
  118. package/src/astro/routes/api/admin/review-requests/[id]/resolve.ts +52 -0
  119. package/src/astro/routes/api/admin/review-requests/index.ts +35 -0
  120. package/src/astro/routes/api/admin/themes/marketplace/[id]/index.ts +33 -0
  121. package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +62 -0
  122. package/src/astro/routes/api/admin/themes/marketplace/index.ts +45 -0
  123. package/src/astro/routes/api/admin/users/[id]/disable.ts +72 -0
  124. package/src/astro/routes/api/admin/users/[id]/enable.ts +48 -0
  125. package/src/astro/routes/api/admin/users/[id]/index.ts +166 -0
  126. package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +72 -0
  127. package/src/astro/routes/api/admin/users/index.ts +66 -0
  128. package/src/astro/routes/api/auth/dev-bypass.ts +139 -0
  129. package/src/astro/routes/api/auth/invite/accept.ts +52 -0
  130. package/src/astro/routes/api/auth/invite/complete.ts +86 -0
  131. package/src/astro/routes/api/auth/invite/index.ts +99 -0
  132. package/src/astro/routes/api/auth/invite/register-options.ts +73 -0
  133. package/src/astro/routes/api/auth/logout.ts +40 -0
  134. package/src/astro/routes/api/auth/magic-link/send.ts +90 -0
  135. package/src/astro/routes/api/auth/magic-link/verify.ts +71 -0
  136. package/src/astro/routes/api/auth/me.ts +60 -0
  137. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +221 -0
  138. package/src/astro/routes/api/auth/oauth/[provider].ts +120 -0
  139. package/src/astro/routes/api/auth/passkey/[id].ts +124 -0
  140. package/src/astro/routes/api/auth/passkey/index.ts +54 -0
  141. package/src/astro/routes/api/auth/passkey/options.ts +85 -0
  142. package/src/astro/routes/api/auth/passkey/register/options.ts +88 -0
  143. package/src/astro/routes/api/auth/passkey/register/verify.ts +119 -0
  144. package/src/astro/routes/api/auth/passkey/verify.ts +72 -0
  145. package/src/astro/routes/api/auth/signup/complete.ts +87 -0
  146. package/src/astro/routes/api/auth/signup/request.ts +89 -0
  147. package/src/astro/routes/api/auth/signup/verify.ts +53 -0
  148. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +310 -0
  149. package/src/astro/routes/api/content/[collection]/[id]/compare.ts +28 -0
  150. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +68 -0
  151. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +77 -0
  152. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +42 -0
  153. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +107 -0
  154. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +100 -0
  155. package/src/astro/routes/api/content/[collection]/[id]/restore.ts +64 -0
  156. package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +31 -0
  157. package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +129 -0
  158. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +143 -0
  159. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +50 -0
  160. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +69 -0
  161. package/src/astro/routes/api/content/[collection]/[id].ts +173 -0
  162. package/src/astro/routes/api/content/[collection]/index.ts +103 -0
  163. package/src/astro/routes/api/content/[collection]/trash.ts +33 -0
  164. package/src/astro/routes/api/dashboard.ts +32 -0
  165. package/src/astro/routes/api/dev/emails.ts +36 -0
  166. package/src/astro/routes/api/health.ts +54 -0
  167. package/src/astro/routes/api/import/probe.ts +47 -0
  168. package/src/astro/routes/api/import/wordpress/analyze.ts +523 -0
  169. package/src/astro/routes/api/import/wordpress/execute.ts +330 -0
  170. package/src/astro/routes/api/import/wordpress/media.ts +338 -0
  171. package/src/astro/routes/api/import/wordpress/prepare.ts +212 -0
  172. package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +425 -0
  173. package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +111 -0
  174. package/src/astro/routes/api/import/wordpress-plugin/callback.ts +58 -0
  175. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +399 -0
  176. package/src/astro/routes/api/manifest.ts +75 -0
  177. package/src/astro/routes/api/mcp.ts +125 -0
  178. package/src/astro/routes/api/media/[id]/confirm.ts +93 -0
  179. package/src/astro/routes/api/media/[id].ts +145 -0
  180. package/src/astro/routes/api/media/file/[...key].ts +79 -0
  181. package/src/astro/routes/api/media/providers/[providerId]/[itemId].ts +91 -0
  182. package/src/astro/routes/api/media/providers/[providerId]/index.ts +111 -0
  183. package/src/astro/routes/api/media/providers/index.ts +30 -0
  184. package/src/astro/routes/api/media/upload-url.ts +146 -0
  185. package/src/astro/routes/api/media.ts +204 -0
  186. package/src/astro/routes/api/menus/[name]/items.ts +206 -0
  187. package/src/astro/routes/api/menus/[name]/reorder.ts +79 -0
  188. package/src/astro/routes/api/menus/[name].ts +145 -0
  189. package/src/astro/routes/api/menus/index.ts +91 -0
  190. package/src/astro/routes/api/oauth/authorize.ts +430 -0
  191. package/src/astro/routes/api/oauth/device/authorize.ts +45 -0
  192. package/src/astro/routes/api/oauth/device/code.ts +56 -0
  193. package/src/astro/routes/api/oauth/device/token.ts +70 -0
  194. package/src/astro/routes/api/oauth/register.ts +182 -0
  195. package/src/astro/routes/api/oauth/token/refresh.ts +38 -0
  196. package/src/astro/routes/api/oauth/token/revoke.ts +38 -0
  197. package/src/astro/routes/api/oauth/token.ts +195 -0
  198. package/src/astro/routes/api/openapi.json.ts +33 -0
  199. package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +109 -0
  200. package/src/astro/routes/api/redirects/404s/index.ts +72 -0
  201. package/src/astro/routes/api/redirects/404s/summary.ts +33 -0
  202. package/src/astro/routes/api/redirects/[id].ts +183 -0
  203. package/src/astro/routes/api/redirects/index.ts +100 -0
  204. package/src/astro/routes/api/revisions/[revisionId]/index.ts +29 -0
  205. package/src/astro/routes/api/revisions/[revisionId]/restore.ts +62 -0
  206. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +104 -0
  207. package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +67 -0
  208. package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +45 -0
  209. package/src/astro/routes/api/schema/collections/[slug]/index.ts +107 -0
  210. package/src/astro/routes/api/schema/collections/index.ts +61 -0
  211. package/src/astro/routes/api/schema/index.ts +109 -0
  212. package/src/astro/routes/api/schema/orphans/[slug].ts +36 -0
  213. package/src/astro/routes/api/schema/orphans/index.ts +26 -0
  214. package/src/astro/routes/api/search/enable.ts +64 -0
  215. package/src/astro/routes/api/search/index.ts +52 -0
  216. package/src/astro/routes/api/search/rebuild.ts +72 -0
  217. package/src/astro/routes/api/search/stats.ts +35 -0
  218. package/src/astro/routes/api/search/suggest.ts +50 -0
  219. package/src/astro/routes/api/sections/[slug].ts +203 -0
  220. package/src/astro/routes/api/sections/index.ts +107 -0
  221. package/src/astro/routes/api/settings/email.ts +150 -0
  222. package/src/astro/routes/api/settings.ts +116 -0
  223. package/src/astro/routes/api/setup/admin-verify.ts +122 -0
  224. package/src/astro/routes/api/setup/admin.ts +104 -0
  225. package/src/astro/routes/api/setup/dev-bypass.ts +200 -0
  226. package/src/astro/routes/api/setup/dev-reset.ts +40 -0
  227. package/src/astro/routes/api/setup/index.ts +128 -0
  228. package/src/astro/routes/api/setup/status.ts +122 -0
  229. package/src/astro/routes/api/snapshot.ts +76 -0
  230. package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +232 -0
  231. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +131 -0
  232. package/src/astro/routes/api/taxonomies/index.ts +114 -0
  233. package/src/astro/routes/api/themes/preview.ts +78 -0
  234. package/src/astro/routes/api/typegen.ts +114 -0
  235. package/src/astro/routes/api/well-known/auth.ts +71 -0
  236. package/src/astro/routes/api/well-known/oauth-authorization-server.ts +48 -0
  237. package/src/astro/routes/api/well-known/oauth-protected-resource.ts +39 -0
  238. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +114 -0
  239. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +213 -0
  240. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +126 -0
  241. package/src/astro/routes/api/widget-areas/[name].ts +135 -0
  242. package/src/astro/routes/api/widget-areas/index.ts +149 -0
  243. package/src/astro/routes/api/widget-components.ts +22 -0
  244. package/src/astro/routes/robots.txt.ts +81 -0
  245. package/src/astro/routes/sitemap-[collection].xml.ts +104 -0
  246. package/src/astro/routes/sitemap.xml.ts +92 -0
  247. package/src/components/Break.astro +45 -0
  248. package/src/components/Button.astro +71 -0
  249. package/src/components/Buttons.astro +49 -0
  250. package/src/components/Code.astro +59 -0
  251. package/src/components/Columns.astro +59 -0
  252. package/src/components/CommentForm.astro +315 -0
  253. package/src/components/Comments.astro +232 -0
  254. package/src/components/Cover.astro +128 -0
  255. package/src/components/DinewayBodyEnd.astro +32 -0
  256. package/src/components/DinewayBodyStart.astro +32 -0
  257. package/src/components/DinewayHead.astro +61 -0
  258. package/src/components/DinewayImage.astro +178 -0
  259. package/src/components/DinewayMedia.astro +167 -0
  260. package/src/components/Embed.astro +128 -0
  261. package/src/components/File.astro +122 -0
  262. package/src/components/Gallery.astro +93 -0
  263. package/src/components/HtmlBlock.astro +33 -0
  264. package/src/components/Image.astro +178 -0
  265. package/src/components/InlineEditor.astro +27 -0
  266. package/src/components/InlinePortableTextEditor.tsx +1937 -0
  267. package/src/components/LiveSearch.astro +614 -0
  268. package/src/components/PortableText.astro +51 -0
  269. package/src/components/Pullquote.astro +51 -0
  270. package/src/components/Table.astro +135 -0
  271. package/src/components/WidgetArea.astro +22 -0
  272. package/src/components/WidgetRenderer.astro +72 -0
  273. package/src/components/index.ts +106 -0
  274. package/src/components/marks/Link.astro +31 -0
  275. package/src/components/marks/StrikeThrough.astro +7 -0
  276. package/src/components/marks/Subscript.astro +7 -0
  277. package/src/components/marks/Superscript.astro +7 -0
  278. package/src/components/marks/Underline.astro +7 -0
  279. package/src/components/marks.ts +19 -0
  280. package/src/components/widgets/Archives.astro +65 -0
  281. package/src/components/widgets/Categories.astro +35 -0
  282. package/src/components/widgets/RecentPosts.astro +51 -0
  283. package/src/components/widgets/Search.astro +18 -0
  284. package/src/components/widgets/Tags.astro +38 -0
  285. package/src/ui.ts +75 -0
  286. package/LICENSE +0 -9
  287. /package/dist/{adapters-BlzWJG82.d.mts → adapters-C2ypTrZZ.d.mts} +0 -0
  288. /package/dist/{config-Cq8H0SfX.mjs → config-BXwuX8Bx.mjs} +0 -0
  289. /package/dist/{load-C6FCD1FU.mjs → load-Coc9HpHH.mjs} +0 -0
  290. /package/dist/{manifest-schema-CTSEyIJ3.mjs → manifest-schema-D1MSVnoI.mjs} +0 -0
  291. /package/dist/{mode-BlyYtIFO.mjs → mode-47goXBBK.mjs} +0 -0
  292. /package/dist/{tokens-4vgYuXsZ.mjs → tokens-CJz9ubV6.mjs} +0 -0
  293. /package/dist/{transport-C5FYnid7.mjs → transport-DB5eDN4x.mjs} +0 -0
  294. /package/dist/{transport-gIL-e43D.d.mts → transport-Wge_IzKl.d.mts} +0 -0
  295. /package/dist/{types-CLLdsG3g.d.mts → types-BzcUjoqg.d.mts} +0 -0
  296. /package/dist/{types-DShnjzb6.mjs → types-griIBQOQ.mjs} +0 -0
@@ -0,0 +1,45 @@
1
+ ---
2
+ /**
3
+ * Portable Text Break/Separator block component
4
+ *
5
+ * Renders horizontal rules and page breaks.
6
+ */
7
+ export interface Props {
8
+ node: {
9
+ _type: "break";
10
+ _key: string;
11
+ style?: "line" | "dots" | "space";
12
+ };
13
+ }
14
+
15
+ const { node } = Astro.props;
16
+ const style = node?.style || "line";
17
+ ---
18
+
19
+ {
20
+ style === "dots" ? (
21
+ <div class="dineway-break dineway-break-dots">• • •</div>
22
+ ) : style === "space" ? (
23
+ <div class="dineway-break dineway-break-space" />
24
+ ) : (
25
+ <hr class="dineway-break dineway-break-line" />
26
+ )
27
+ }
28
+
29
+ <style>
30
+ .dineway-break {
31
+ margin: 2rem 0;
32
+ }
33
+ .dineway-break-line {
34
+ border: none;
35
+ border-top: 1px solid #e0e0e0;
36
+ }
37
+ .dineway-break-dots {
38
+ text-align: center;
39
+ color: #999;
40
+ letter-spacing: 0.5em;
41
+ }
42
+ .dineway-break-space {
43
+ height: 2rem;
44
+ }
45
+ </style>
@@ -0,0 +1,71 @@
1
+ ---
2
+ import { sanitizeHref } from "../utils/url.js";
3
+
4
+ /**
5
+ * Portable Text Button block component
6
+ *
7
+ * Renders a single button from WordPress imports.
8
+ */
9
+ export interface Props {
10
+ node: {
11
+ _type: "button";
12
+ _key: string;
13
+ text: string;
14
+ url?: string;
15
+ style?: "default" | "outline" | "fill";
16
+ };
17
+ }
18
+
19
+ const { node } = Astro.props;
20
+ const { text, url: rawUrl, style = "default" } = node ?? {};
21
+ const url = rawUrl ? sanitizeHref(rawUrl) : undefined;
22
+ ---
23
+
24
+ {
25
+ url ? (
26
+ <a href={url} class:list={["dineway-button", `dineway-button--${style}`]}>
27
+ {text}
28
+ </a>
29
+ ) : (
30
+ <span class:list={["dineway-button", `dineway-button--${style}`]}>{text}</span>
31
+ )
32
+ }
33
+
34
+ <style>
35
+ .dineway-button {
36
+ display: inline-block;
37
+ padding: 0.75em 1.5em;
38
+ border-radius: 4px;
39
+ text-decoration: none;
40
+ font-weight: 500;
41
+ cursor: pointer;
42
+ transition:
43
+ background-color 0.2s,
44
+ border-color 0.2s,
45
+ color 0.2s;
46
+ }
47
+
48
+ .dineway-button--default,
49
+ .dineway-button--fill {
50
+ background-color: var(--dineway-button-bg, #0073aa);
51
+ color: var(--dineway-button-color, #fff);
52
+ border: 2px solid var(--dineway-button-bg, #0073aa);
53
+ }
54
+
55
+ .dineway-button--default:hover,
56
+ .dineway-button--fill:hover {
57
+ background-color: var(--dineway-button-bg-hover, #005177);
58
+ border-color: var(--dineway-button-bg-hover, #005177);
59
+ }
60
+
61
+ .dineway-button--outline {
62
+ background-color: transparent;
63
+ color: var(--dineway-button-bg, #0073aa);
64
+ border: 2px solid var(--dineway-button-bg, #0073aa);
65
+ }
66
+
67
+ .dineway-button--outline:hover {
68
+ background-color: var(--dineway-button-bg, #0073aa);
69
+ color: var(--dineway-button-color, #fff);
70
+ }
71
+ </style>
@@ -0,0 +1,49 @@
1
+ ---
2
+ /**
3
+ * Portable Text Buttons container component
4
+ *
5
+ * Renders a group of buttons from WordPress imports.
6
+ */
7
+ import Button from "./Button.astro";
8
+
9
+ export interface Props {
10
+ node: {
11
+ _type: "buttons";
12
+ _key: string;
13
+ buttons: Array<{
14
+ _type: "button";
15
+ _key: string;
16
+ text: string;
17
+ url?: string;
18
+ style?: "default" | "outline" | "fill";
19
+ }>;
20
+ layout?: "horizontal" | "vertical";
21
+ };
22
+ }
23
+
24
+ const { node } = Astro.props;
25
+ const { buttons = [], layout = "horizontal" } = node ?? {};
26
+ ---
27
+
28
+ <div class:list={["dineway-buttons", `dineway-buttons--${layout}`]}>
29
+ {buttons.map((button) => <Button node={button} />)}
30
+ </div>
31
+
32
+ <style>
33
+ .dineway-buttons {
34
+ display: flex;
35
+ flex-wrap: wrap;
36
+ gap: 0.75rem;
37
+ margin: 1.5rem 0;
38
+ }
39
+
40
+ .dineway-buttons--vertical {
41
+ flex-direction: column;
42
+ align-items: flex-start;
43
+ }
44
+
45
+ .dineway-buttons--horizontal {
46
+ flex-direction: row;
47
+ align-items: center;
48
+ }
49
+ </style>
@@ -0,0 +1,59 @@
1
+ ---
2
+ /**
3
+ * Portable Text Code block component
4
+ *
5
+ * Renders code blocks with optional syntax highlighting class.
6
+ */
7
+ export interface Props {
8
+ node: {
9
+ _type: "code";
10
+ _key: string;
11
+ code: string;
12
+ language?: string;
13
+ filename?: string;
14
+ };
15
+ }
16
+
17
+ const { node } = Astro.props;
18
+
19
+ if (!node?.code) {
20
+ return null;
21
+ }
22
+
23
+ const { code, language, filename } = node;
24
+ const languageClass = language ? `language-${language}` : "";
25
+ ---
26
+
27
+ <div class="dineway-code">
28
+ {filename && <div class="dineway-code-filename">{filename}</div>}
29
+ <pre class={languageClass}><code class={languageClass}>{code}</code></pre>
30
+ </div>
31
+
32
+ <style>
33
+ .dineway-code {
34
+ margin: 1.5rem 0;
35
+ }
36
+ .dineway-code-filename {
37
+ font-size: 0.75rem;
38
+ font-family: monospace;
39
+ background: #2d2d2d;
40
+ color: #ccc;
41
+ padding: 0.5rem 1rem;
42
+ border-radius: 0.5rem 0.5rem 0 0;
43
+ }
44
+ .dineway-code pre {
45
+ margin: 0;
46
+ padding: 1rem;
47
+ background: #1e1e1e;
48
+ border-radius: 0.5rem;
49
+ overflow-x: auto;
50
+ }
51
+ .dineway-code-filename + pre {
52
+ border-radius: 0 0 0.5rem 0.5rem;
53
+ }
54
+ .dineway-code code {
55
+ font-family: "Fira Code", "Consolas", monospace;
56
+ font-size: 0.875rem;
57
+ color: #e0e0e0;
58
+ }
59
+ </style>
@@ -0,0 +1,59 @@
1
+ ---
2
+ /**
3
+ * Portable Text Columns block component
4
+ *
5
+ * Renders multi-column layouts from WordPress imports.
6
+ */
7
+ import { PortableText } from "astro-portabletext";
8
+
9
+ export interface Props {
10
+ node: {
11
+ _type: "columns";
12
+ _key: string;
13
+ columns: Array<{
14
+ _type: "column";
15
+ _key: string;
16
+ content: unknown[];
17
+ width?: string;
18
+ }>;
19
+ };
20
+ }
21
+
22
+ const { node } = Astro.props;
23
+ const columns = node?.columns ?? [];
24
+
25
+ if (!columns.length) {
26
+ return null;
27
+ }
28
+ ---
29
+
30
+ <div class="dineway-columns" style={`--column-count: ${columns.length}`}>
31
+ {
32
+ columns.map((column) => (
33
+ <div
34
+ class="dineway-column"
35
+ style={column.width ? `flex-basis: ${column.width}` : undefined}
36
+ >
37
+ <PortableText value={column.content} />
38
+ </div>
39
+ ))
40
+ }
41
+ </div>
42
+
43
+ <style>
44
+ .dineway-columns {
45
+ display: flex;
46
+ gap: 2rem;
47
+ margin: 1.5rem 0;
48
+ }
49
+ .dineway-column {
50
+ flex: 1;
51
+ min-width: 0;
52
+ }
53
+ @media (max-width: 768px) {
54
+ .dineway-columns {
55
+ flex-direction: column;
56
+ gap: 1rem;
57
+ }
58
+ }
59
+ </style>
@@ -0,0 +1,315 @@
1
+ ---
2
+ /// <reference types="dineway/locals" />
3
+
4
+ /**
5
+ * Comment submission form.
6
+ *
7
+ * Renders a form that submits via fetch to the public POST endpoint.
8
+ * Includes honeypot field, optional Turnstile widget, and inline feedback.
9
+ * Pre-fills name/email for authenticated CMS users.
10
+ *
11
+ * @example
12
+ * ```astro
13
+ * ---
14
+ * import { CommentForm } from "dineway/ui";
15
+ * ---
16
+ * <CommentForm collection="posts" contentId={post.id} />
17
+ * ```
18
+ */
19
+
20
+ interface Props {
21
+ collection: string;
22
+ contentId: string;
23
+ parentId?: string | null;
24
+ class?: string;
25
+ /** Turnstile site key. If provided, the widget is rendered. */
26
+ turnstileSiteKey?: string;
27
+ }
28
+
29
+ import { getCollectionInfo } from "../schema/query.js";
30
+
31
+ const {
32
+ collection,
33
+ contentId,
34
+ parentId = null,
35
+ class: className,
36
+ turnstileSiteKey,
37
+ } = Astro.props;
38
+
39
+ const enabled = (await getCollectionInfo(collection))?.commentsEnabled ?? false;
40
+ const { user } = Astro.locals;
41
+ const formId = `ec-comment-form-${parentId ?? "root"}`;
42
+ const endpoint = `/_dineway/api/comments/${encodeURIComponent(collection)}/${encodeURIComponent(contentId)}`;
43
+ ---
44
+
45
+ {
46
+ enabled && (
47
+ <form
48
+ id={formId}
49
+ class:list={["ec-comment-form", className]}
50
+ data-ec-comment-form
51
+ data-endpoint={endpoint}
52
+ data-user-name={user?.name ?? ""}
53
+ data-user-email={user?.email ?? ""}
54
+ >
55
+ {user ? (
56
+ <div class="ec-comment-user-info">
57
+ <span class="ec-comment-user-name">{user.name}</span>
58
+ <span class="ec-comment-user-email">{user.email}</span>
59
+ </div>
60
+ ) : (
61
+ <div class="ec-comment-form-fields">
62
+ <label class="ec-comment-form-field">
63
+ <span>Name</span>
64
+ <input type="text" name="authorName" required maxlength="100" />
65
+ </label>
66
+
67
+ <label class="ec-comment-form-field">
68
+ <span>Email</span>
69
+ <input type="email" name="authorEmail" required />
70
+ </label>
71
+ </div>
72
+ )}
73
+
74
+ {/* Honeypot — hidden from humans, filled by bots */}
75
+ <div
76
+ aria-hidden="true"
77
+ style="position:absolute;left:-9999px;top:-9999px;"
78
+ >
79
+ <label>
80
+ Don't fill this out
81
+ <input
82
+ type="text"
83
+ name="website_url"
84
+ tabindex="-1"
85
+ autocomplete="off"
86
+ />
87
+ </label>
88
+ </div>
89
+
90
+ <label class="ec-comment-form-field">
91
+ <span>Comment</span>
92
+ <textarea name="body" required maxlength="5000" rows="4" />
93
+ </label>
94
+
95
+ {parentId && <input type="hidden" name="parentId" value={parentId} />}
96
+
97
+ {turnstileSiteKey && (
98
+ <div
99
+ class="cf-turnstile"
100
+ data-sitekey={turnstileSiteKey}
101
+ data-theme="auto"
102
+ />
103
+ )}
104
+
105
+ <button type="submit" class="ec-comment-form-submit">
106
+ Post Comment
107
+ </button>
108
+
109
+ <div class="ec-comment-form-status" role="status" aria-live="polite" />
110
+ </form>
111
+ )
112
+ }
113
+
114
+ {enabled && turnstileSiteKey && (
115
+ <script is:inline src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
116
+ )}
117
+
118
+ <script>
119
+ document.addEventListener("submit", async (e) => {
120
+ const form = e.target;
121
+ if (
122
+ !(form instanceof HTMLFormElement) ||
123
+ !form.hasAttribute("data-ec-comment-form")
124
+ )
125
+ return;
126
+ e.preventDefault();
127
+
128
+ const endpoint = form.dataset.endpoint;
129
+ if (!endpoint) return;
130
+
131
+ const submitBtn = form.querySelector<HTMLButtonElement>(
132
+ ".ec-comment-form-submit"
133
+ );
134
+ const statusEl = form.querySelector<HTMLElement>(".ec-comment-form-status");
135
+ if (!submitBtn || !statusEl) return;
136
+
137
+ submitBtn.disabled = true;
138
+ submitBtn.textContent = "Submitting...";
139
+ statusEl.textContent = "";
140
+ statusEl.className = "ec-comment-form-status";
141
+
142
+ const data = new FormData(form);
143
+ const body: Record<string, string> = {};
144
+
145
+ // Include user info from data attributes (for authenticated users)
146
+ const userName = form.dataset.userName;
147
+ const userEmail = form.dataset.userEmail;
148
+ if (userName) body.authorName = userName;
149
+ if (userEmail) body.authorEmail = userEmail;
150
+
151
+ for (const [key, value] of data.entries()) {
152
+ if (typeof value === "string") {
153
+ body[key] = value;
154
+ }
155
+ }
156
+
157
+ // Get Turnstile token if present
158
+ const turnstileInput = form.querySelector<HTMLInputElement>(
159
+ "[name='cf-turnstile-response']"
160
+ );
161
+ if (turnstileInput?.value) {
162
+ body.turnstileToken = turnstileInput.value;
163
+ }
164
+
165
+ try {
166
+ const res = await fetch(endpoint, {
167
+ method: "POST",
168
+ headers: {
169
+ "Content-Type": "application/json",
170
+ "X-Dineway-Request": "1",
171
+ },
172
+ body: JSON.stringify(body),
173
+ });
174
+
175
+ const result = await res.json();
176
+
177
+ if (res.ok) {
178
+ statusEl.textContent = result.message || "Comment submitted!";
179
+ statusEl.classList.add("ec-comment-form-success");
180
+ // Reset form fields (but not disabled pre-filled fields)
181
+ const textarea = form.querySelector<HTMLTextAreaElement>(
182
+ "textarea[name='body']"
183
+ );
184
+ if (textarea) textarea.value = "";
185
+ // Reset Turnstile if present
186
+ if (typeof window.turnstile !== "undefined") {
187
+ window.turnstile.reset();
188
+ }
189
+ } else {
190
+ statusEl.textContent =
191
+ result.error?.message ||
192
+ result.message ||
193
+ "Failed to submit comment.";
194
+ statusEl.classList.add("ec-comment-form-error");
195
+ }
196
+ } catch {
197
+ statusEl.textContent = "Network error. Please try again.";
198
+ statusEl.classList.add("ec-comment-form-error");
199
+ } finally {
200
+ submitBtn.disabled = false;
201
+ submitBtn.textContent = "Post Comment";
202
+ }
203
+ });
204
+ </script>
205
+
206
+ <style>
207
+ .ec-comment-form {
208
+ --ec-form-gap: 0.75rem;
209
+ }
210
+
211
+ .ec-comment-form-fields {
212
+ display: grid;
213
+ gap: var(--ec-form-gap);
214
+ }
215
+
216
+ @media (min-width: 640px) {
217
+ .ec-comment-form-fields {
218
+ grid-template-columns: 1fr 1fr;
219
+ }
220
+ }
221
+
222
+ .ec-comment-form-field {
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: 0.25rem;
226
+ margin-top: var(--ec-form-gap);
227
+ }
228
+
229
+ .ec-comment-form-field:first-child {
230
+ margin-top: 0;
231
+ }
232
+
233
+ .ec-comment-form-fields .ec-comment-form-field {
234
+ margin-top: 0;
235
+ }
236
+
237
+ .ec-comment-form-field input,
238
+ .ec-comment-form-field textarea {
239
+ padding: 0.5rem;
240
+ border: 1px solid var(--ec-form-border, #d1d5db);
241
+ border-radius: 0.25rem;
242
+ font: inherit;
243
+ background: var(--ec-form-bg, #fff);
244
+ color: var(--ec-form-color, inherit);
245
+ }
246
+
247
+ :global(.dark) .ec-comment-form-field input,
248
+ :global(.dark) .ec-comment-form-field textarea {
249
+ --ec-form-bg: #1f2937;
250
+ --ec-form-border: #4b5563;
251
+ --ec-form-color: #f9fafb;
252
+ }
253
+
254
+ .ec-comment-user-info {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 0.5rem;
258
+ padding: 0.75rem;
259
+ background: var(--ec-form-user-bg, #f3f4f6);
260
+ border: 1px solid var(--ec-form-user-border, #d1d5db);
261
+ border-radius: 0.375rem;
262
+ font-size: 0.875rem;
263
+ }
264
+
265
+ :global(.dark) .ec-comment-user-info {
266
+ background: var(--ec-form-user-bg-dark, #374151);
267
+ }
268
+
269
+ .ec-comment-user-name {
270
+ font-weight: 600;
271
+ }
272
+
273
+ .ec-comment-user-email {
274
+ opacity: 0.7;
275
+ }
276
+
277
+ .ec-comment-user-email::before {
278
+ content: "·";
279
+ margin-right: 0.5rem;
280
+ }
281
+
282
+ .ec-comment-form-submit {
283
+ margin-top: var(--ec-form-gap);
284
+ padding: 0.5rem 1.5rem;
285
+ border: none;
286
+ border-radius: 0.25rem;
287
+ font: inherit;
288
+ font-weight: 600;
289
+ cursor: pointer;
290
+ background: var(--ec-form-submit-bg, #1f2937);
291
+ color: var(--ec-form-submit-color, #fff);
292
+ }
293
+
294
+ .ec-comment-form-submit:disabled {
295
+ opacity: 0.6;
296
+ cursor: not-allowed;
297
+ }
298
+
299
+ .ec-comment-form-status {
300
+ margin-top: var(--ec-form-gap);
301
+ font-size: 0.875em;
302
+ }
303
+
304
+ .ec-comment-form-status:empty {
305
+ display: none;
306
+ }
307
+
308
+ .ec-comment-form-success {
309
+ color: var(--ec-form-success-color, #059669);
310
+ }
311
+
312
+ .ec-comment-form-error {
313
+ color: var(--ec-form-error-color, #dc2626);
314
+ }
315
+ </style>