From c30a1d92d2be3276e1fe25871ace913fdafc0710 Mon Sep 17 00:00:00 2001 From: Elvis020 Date: Tue, 10 Nov 2026 07:24:56 +0000 Subject: [PATCH] feat(devcon26): reconcile ticket totals and payment recovery - Accept automatic EMS ticket totals alongside legacy counter responses, refresh authoritative counts after verified live purchases and across tabs, and preserve the initial animation without optimistic increments. - Consolidate Astro, Cloudflare Workers types, Wrangler, and pinned pnpm setup dependency updates. - Refine the mobile conference hero and navigation, including an accessible menu overlay, background scroll lock, short-screen scrolling, and compact community actions. - Help buyers return to their existing payment, present allowlisted provider observations separately from reservation expiry, and preserve verified fulfillment and refund precedence with safe older-EMS fallbacks. - Align payment recovery actions across phone and desktop layouts without changing payment behavior. Verification: pnpm build including donation and ticket checks; focused counter and managed checkout regression checks; frozen-lockfile install and Wrangler deployment dry run; git diff --check; synthetic phone and desktop payment previews and mobile menu interaction checks; independent reviews. No deployment, real payment, or email was performed. --- .../workflows/deploy-cloudflare-workers.yml | 4 +- .github/workflows/deploy.yml | 2 +- docs/changelog.md | 4 + docs/devcon26-attendance-counter.md | 4 +- docs/devcon26-flexible-checkout.md | 2 + package.json | 6 +- pnpm-lock.yaml | 625 ++++++++++++------ scripts/check-devcon26-attendance-counter.mjs | 56 +- scripts/check-devcon26-managed-checkout.mjs | 109 ++- src/components/MissionSection.astro | 8 + src/components/Navbar.astro | 121 +++- src/lib/devcon26-attendance-counter.ts | 172 ++++- src/lib/devcon26-flexible-checkout.ts | 23 + src/lib/devcon26-payment-confirmation.ts | 104 ++- src/pages/devcon26/checkout.astro | 11 + src/pages/devcon26/index.astro | 39 +- src/pages/devcon26/payment-confirmation.astro | 29 +- 17 files changed, 1030 insertions(+), 289 deletions(-) diff --git a/.github/workflows/deploy-cloudflare-workers.yml b/.github/workflows/deploy-cloudflare-workers.yml index 2b33c04..a58815f 100644 --- a/.github/workflows/deploy-cloudflare-workers.yml +++ b/.github/workflows/deploy-cloudflare-workers.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 with: version: 10.34.5 @@ -70,7 +70,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 with: version: 10.34.5 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2e51cb7..2e9d882 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 with: version: 10.34.5 diff --git a/docs/changelog.md b/docs/changelog.md index 5bcc706..dd5d53f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,9 @@ # Changelog +## 2026-11-10 — Clarify managed payment recovery + +- Offer a check of the existing payment after returning from Paystack, and show supported provider observations and reservation expiry separately without inferring payment from the hold. Preserve verified fulfillment and refund precedence and support older EMS responses. + ## 2026-11-07 — Add online events to calendars - Add individual online events to Google Calendar or download an .ics file for Apple Calendar, Outlook and other apps, including the public meeting link. Preserve registration and live viewing actions. diff --git a/docs/devcon26-attendance-counter.md b/docs/devcon26-attendance-counter.md index fb55f73..550c825 100644 --- a/docs/devcon26-attendance-counter.md +++ b/docs/devcon26-attendance-counter.md @@ -1,5 +1,7 @@ # DevCon26 attendance counter -The website reads the public 2026 attendance counter from EMS at runtime. An EMS Owner publishes the estimate or actual count from Registration. The website does not calculate or publish a count; it hides the readout when the endpoint returns an unpublished value, an invalid response, or an error. +The website reads the public 2026 attendance counter from EMS at runtime. EMS calculates the counter from a starting count and net fulfilled live ticket purchases. The website does not calculate or publish a count; it hides the readout when the endpoint returns an unpublished value, an invalid response, or an error. `PUBLIC_DEVCON26_API_ORIGIN` selects the API origin at build time and defaults to `https://em.devcongress.org`. The production website reads that origin directly. For the website-owned Workers preview URLs using the default API origin, the Worker relays the fixed public counter endpoint because EMS only permits the production website origin. The relay forwards no visitor headers, query parameters, or credentials, and does not cache the response. A custom configured origin is called directly and needs its own CORS and CSP configuration. + +Deploy the reader and relay before activating the EMS `ticket_count` source. The reader also accepts the legacy sources during rollout. It refreshes on return to the page, after a verified live purchase in the same page or another same-origin tab, and periodically while visible; bounded retries accommodate delayed confirmation. Cross-origin tabs are picked up by visibility or periodic refresh. Fetch failures hide the counter. diff --git a/docs/devcon26-flexible-checkout.md b/docs/devcon26-flexible-checkout.md index c533614..0c5e83a 100644 --- a/docs/devcon26-flexible-checkout.md +++ b/docs/devcon26-flexible-checkout.md @@ -132,6 +132,8 @@ The payment badge editor opens the photo adjuster after a new image is selected ## Failure recovery +Returning from managed Paystack checkout offers a link to check the existing reference with its saved browser grant. It never starts a replacement payment automatically. Managed confirmation can show an optional, allowlisted provider observation and a separate expired reservation notice; these are historical context, not proof of fulfillment or that a new charge is safe. Verified fulfillment and order-level refund states take precedence, and older EMS responses without this metadata retain a safe fallback. + An order that cannot accept payment retains its request identity; the buyer is directed to check email or contact the organizer before starting again. The payment confirmation page hides Retry if its browser grant is absent and directs the buyer to their private ticket email. This does not infer that payment failed or authorize a new charge. The admission backend separately reconciles stored payment references. The missing-access state uses a centered, narrow layout on the existing cream background, with a fixed-size ticket-and-envelope illustration beside the heading on desktop and mobile. It displays the buyer-formatted reference as a support identifier and includes it in the contact-email subject; it is not proof of payment. Other confirmation states hide and clear these recovery details. diff --git a/package.json b/package.json index a80ba66..85256bc 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,12 @@ }, "dependencies": { "@inttegro/js": "0.7.2", - "astro": "^7.4.4", + "astro": "^7.4.7", "zod": "^4.6.7" }, "devDependencies": { - "@cloudflare/workers-types": "5.20261030.1", - "wrangler": "^4.156.0" + "@cloudflare/workers-types": "5.20261106.1", + "wrangler": "^4.158.0" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6fb65f5..96a893f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,18 +16,18 @@ importers: specifier: 0.7.2 version: 0.7.2 astro: - specifier: ^7.4.4 - version: 7.4.4(esbuild@0.28.2)(yaml@2.9.1) + specifier: ^7.4.7 + version: 7.4.7(esbuild@0.28.2)(yaml@2.9.1) zod: specifier: ^4.6.7 version: 4.6.7 devDependencies: '@cloudflare/workers-types': - specifier: 5.20261030.1 - version: 5.20261030.1 + specifier: 5.20261106.1 + version: 5.20261106.1 wrangler: - specifier: ^4.156.0 - version: 4.156.0(@cloudflare/workers-types@5.20261030.1) + specifier: ^4.158.0 + version: 4.158.0(@cloudflare/workers-types@5.20261106.1) packages: @@ -102,11 +102,11 @@ packages: resolution: {integrity: sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q==} engines: {node: '>=22.12.0'} - '@astrojs/internal-helpers@0.13.0': - resolution: {integrity: sha512-20jxQqnSmpskcGyad7N5l6Xf1gz0UCa6lNde44bEBdaXGpncEYfAZJ142r2ZgzBaG4dUyzGmhqZWv1INU2eiHQ==} + '@astrojs/internal-helpers@0.13.1': + resolution: {integrity: sha512-LgGLGzoC0wCT3mjDYrxz+hct/tws0enpWsLJW3bswHR3PKgusp/H9xRIT8rTdsyvLM0TcRhhvRL30J2oaZNcqA==} - '@astrojs/markdown-satteri@0.4.6': - resolution: {integrity: sha512-6biKp2lEAYycF3jhv91br+Otyf4EgDFkF1oRL9ks0u/m/YRGmI7XkGQ2MgaM35DslT03f7NtozKtlqfBNkp6bw==} + '@astrojs/markdown-satteri@0.4.7': + resolution: {integrity: sha512-MZvnec/898GGGHQZfkArVbkdZmL1imjIM8RWkmzbAmse737zr8D9inUjFQ5eLBXV3vPobOUs/ZRV/D6Po/bVDg==} '@astrojs/prism@4.1.2': resolution: {integrity: sha512-jMrUEpFDarDO1KWPvVc9eSa8DSfwBlwEOHwX+8zvZQpiqXRGDxFnOXHsYqV6DP7w+0qIgTr98gS1GdQlm8ypWg==} @@ -116,16 +116,16 @@ packages: resolution: {integrity: sha512-2JOMRUxJrBSfiVDfeKLv1wBmvSIx1Y6u2YEO8awZ9qSq3u/rNAiUyFdOYi8dHv91kHrmYEQX7pRDw0J4xyj3UA==} engines: {node: '>=22.23.4'} - '@babel/helper-string-parser@7.29.11': - resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} + '@babel/helper-string-parser@7.29.13': + resolution: {integrity: sha512-fWegr+WsEsiMVW4KUNdIIzzMTZSzNiqhy0//6+2MRi2d5NFNsL/AYwBQW8eBnRbTBVRnDVzjaJEUqKaCWjMMdQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.12': - resolution: {integrity: sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==} + '@babel/parser@7.29.13': + resolution: {integrity: sha512-fJM50YYjlTiBhgdkGmC1tBpv+FMAyo4annf2X6Aks+0yRlaiVkYW/3f07xAfVVkYIoZ9fFZp+mEThUFnuybhkQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -133,52 +133,62 @@ packages: resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} engines: {node: '>=6.9.0'} - '@bruits/satteri-darwin-arm64@0.10.5': - resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + '@bruits/satteri-android-arm64@0.11.6': + resolution: {integrity: sha512-9Cb6ZRDn29c0kluGA9urp/So/JnJOJJSf4J40xYLAIAj3GuqTNsCyquS4A1/yLuuHE2ngYJNnCylAQnDM3L9ow==} + cpu: [arm64] + os: [android] + + '@bruits/satteri-darwin-arm64@0.11.6': + resolution: {integrity: sha512-kcr7QOPGrckuyhMZmUKYcyoXgjQN4vJ/6tCWHE2866mztZPNrTuy5itTwSAbIs1tK0XpTW42tBQ+XPNnkg0XIg==} cpu: [arm64] os: [darwin] - '@bruits/satteri-darwin-x64@0.10.5': - resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + '@bruits/satteri-darwin-x64@0.11.6': + resolution: {integrity: sha512-nwh4Atd/Cxw2SNS6+Gs0Esf/w2i4qyHzwcECaTgoFyxse3m0dpBpu8eqkqqIPfBc1lWhfe4i9LXuk7rG+4pwQw==} cpu: [x64] os: [darwin] - '@bruits/satteri-linux-arm64-gnu@0.10.5': - resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + '@bruits/satteri-freebsd-x64@0.11.6': + resolution: {integrity: sha512-qMkNZRYN3cLshfYawQYjfDS05A208QCOVh1adtEteYH+03MkuOoVVhYkzDRIKhWdfM3gFFEaUjXDOGfVqGjEJg==} + cpu: [x64] + os: [freebsd] + + '@bruits/satteri-linux-arm64-gnu@0.11.6': + resolution: {integrity: sha512-A7cHeCZQkvF3oTgQ6/5LvVriauE1dHo3u3gAME6H1X/+KMeum5Wras3Y7rYUcvPym1CxdmzjZh9WlYD62Ul1xg==} cpu: [arm64] os: [linux] libc: [glibc] - '@bruits/satteri-linux-arm64-musl@0.10.5': - resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + '@bruits/satteri-linux-arm64-musl@0.11.6': + resolution: {integrity: sha512-P/YAudp6VmUr63SFaZefwPIefsw92oZ1wQ6vqrtO/GY9qB3OxLqUVjSIcnKAtqMp4kDW8xBEdSwHz4GZU7P2+g==} cpu: [arm64] os: [linux] libc: [musl] - '@bruits/satteri-linux-x64-gnu@0.10.5': - resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + '@bruits/satteri-linux-x64-gnu@0.11.6': + resolution: {integrity: sha512-nhj90eZFLSA+Icd6n+oYpAi/UXr/mppLGd8jdEOB/larvWAZ/ewFxpT7CLzuNCg7r75+gkdHv9JuRb5eERY1Kg==} cpu: [x64] os: [linux] libc: [glibc] - '@bruits/satteri-linux-x64-musl@0.10.5': - resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + '@bruits/satteri-linux-x64-musl@0.11.6': + resolution: {integrity: sha512-mkWxwHd5Q2dDs+OZK/P1tZFvSPrh2Bb69utWHcBNM0wyJCRWd61T4jU1tF21lGL1C5dy7P+LvaT0y6PQDJj89Q==} cpu: [x64] os: [linux] libc: [musl] - '@bruits/satteri-wasm32-wasi@0.10.5': - resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + '@bruits/satteri-wasm32-wasi@0.11.6': + resolution: {integrity: sha512-GrjNThC6BfA0u8LZwGpOeEFVKoJZsriowLtj/rBYj18fW7/UZouyzn/0Tsxg+tMaxMUgC9HFA078EmfAsdVONg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@bruits/satteri-win32-arm64-msvc@0.10.5': - resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + '@bruits/satteri-win32-arm64-msvc@0.11.6': + resolution: {integrity: sha512-Plesa0QYtJoa3nlObg1Ypj9oD1VOioHMldHUUtG61T/JNU11EcN0pyj0tDsT3DW2pAxKrV0Q8xrfzGtBHuSjfg==} cpu: [arm64] os: [win32] - '@bruits/satteri-win32-x64-msvc@0.10.5': - resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + '@bruits/satteri-win32-x64-msvc@0.11.6': + resolution: {integrity: sha512-fGs5d/7jBIPkYmXkhm9unoEfDuRZ5r66NLxbr+6c8bm0f7ywgPHgW3HJ9L7fKvyqhw49ePtbT4vkWREju8/U6w==} cpu: [x64] os: [win32] @@ -207,38 +217,38 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20261023.1': - resolution: {integrity: sha512-lsEx0i7nR0PNG/erUFFHmQmiidEhLfDE5uQmAL9421/y4/ycuxDDOSaxu3VGGYFFPK5sduyUeMmjIlX4CwOBFg==} + '@cloudflare/workerd-darwin-64@1.20261104.1': + resolution: {integrity: sha512-5Bl+P1HT1/Ezk7Yrhyd+QkJ4VC/3naO0L3so/AkpgdaAHG3bmUmcCJBAtwH7O4JdVt8SMfm6EV89seiPpdjHJQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20261023.1': - resolution: {integrity: sha512-5e79fHgabdDD8EgmjOhJ1S+xMsf6DbC7fL7IgTBizMnzOp0P2isDn7pYmUxI9AJZE9FVQ4RUilH/I36YNg+GQQ==} + '@cloudflare/workerd-darwin-arm64@1.20261104.1': + resolution: {integrity: sha512-2fM+0klAjspAQ3Jl0iw0gVyGpNnkvPiZ50WHigPLhWQRiS+zhabFXVR07zz1RaPGkJHrMjEpWoEfjjm8nU5IOg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20261023.1': - resolution: {integrity: sha512-VHQ6jKFSihjR2+x1buby8XTdBLLJztVnYiB7OLOTYO8aDXB+c1Rd2410PdgFuFYc4AgFEk6PCJLyCLL5L1KBnw==} + '@cloudflare/workerd-linux-64@1.20261104.1': + resolution: {integrity: sha512-VgpZIOooZHjSxjEZIJ1hkyt/jTfL3KeavkWCc0x7xxVu9zgkplaJF78Iv6CzoCTamQXyZeBaRQHS2bbAc70Vgg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20261023.1': - resolution: {integrity: sha512-ilpRHzfDN8YFRM5CLRKuFw40x/LJBS89yVdhdQmxehlVDuBqjKpJB++zPFbTgKRRFaNupgnXc8RHktXAIhgCmQ==} + '@cloudflare/workerd-linux-arm64@1.20261104.1': + resolution: {integrity: sha512-uEBJJHh2SbeQauRGrad7tIFIrpUQ5LUqZX40l7IKwYd0yeemvsno8f57w34Bx/pPpaSsNYVcV5oNFVbv+v/BOw==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20261023.1': - resolution: {integrity: sha512-279WLVjNsMycAwr0EZNiNEf0l2SY6NUtsN80NwZzbTHzakmiN+WSx4w38muxPm+PAU0oSPPAPXKVD+H6Hya8xw==} + '@cloudflare/workerd-windows-64@1.20261104.1': + resolution: {integrity: sha512-b/fnEU1leVm8UrI2EHQ4MSrK2vmnWdR1jefRyEUDZe3ucpKY0PWi4bVxWh5niZdlL0MIc4C5tXNXTlAMZpKDdA==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@5.20261030.1': - resolution: {integrity: sha512-oKHewMzKBtXq3dWiYL9GpHFnBfg8juBOir9PPREMPT8G2MHotAxIBIQ2w1rpO1xCN9etRlAxJaeoQbMGSlXqlQ==} + '@cloudflare/workers-types@5.20261106.1': + resolution: {integrity: sha512-uQtZyYehF0hwImaFi0/z/BWeTC/DMKpEo+nCySs5WZwoMhnIqLnN3sVjS7GCBc222EWf+F6khsHPWIvPEaP6JA==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -250,18 +260,27 @@ packages: '@emnapi/core@1.11.3': resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + '@emnapi/core@2.0.0-beta.2': + resolution: {integrity: sha512-MzCVoWtcg4Pm2B3je5mMvYMvj3MmBKw+fU7vbsJc9/iT8ip6/eYIHo/Dsm/mr+wsHB6SEyJDuxB09Yy6r/8+4A==} + '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/runtime@2.0.0-beta.2': + resolution: {integrity: sha512-JcrSPzPvZuNZvJqPTF9Fw25LbOJ8avzFVlaf2grmH4Cku0oGP47tRgqPZadcfj3YoZMHkFVnCYFbQM8I+i5QEw==} + '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} '@emnapi/wasi-threads@1.2.3': resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + '@emnapi/wasi-threads@2.2.0': + resolution: {integrity: sha512-JP7OYH38Q7+pyTAe14raZHLQIK7BDKbdwji+Xi3pcd/6QkJYQH3SX4wu6EplGrGJWRepoNzedfm0G3B9Z4e9Rw==} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -601,12 +620,22 @@ packages: '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 + '@napi-rs/wasm-runtime@1.2.7': + resolution: {integrity: sha512-zJccwplOAbgfZju95IUHazLnx9RAPtPN2YGJXI6UbrgeaR9QfPjGrQL6ERkSAtnVCA4Q+83ApGyaX5zdpCaKkQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} '@oxc-project/types@0.156.0': resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==} + '@oxc-project/types@0.157.0': + resolution: {integrity: sha512-95iTox1qdt6WGWce3xwNOVayByOfLaYAq+qGPpub6NWbBh9sv0GG3+zyfh9ZBCO/jVu5A0EWI+qQI7g6fevjxg==} + '@poppinss/colors@4.1.6': resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} @@ -622,36 +651,72 @@ packages: cpu: [arm] os: [android] + '@rolldown/binding-android-arm-eabi@1.3.0': + resolution: {integrity: sha512-zjq+pUSE36RJG9nJXqrRfMCOxekzVhlaYMtFELHaOcRH4UqTnkWhbTbEixKEawsb0ZTVMRbn8RLYcuU4DYk8qg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@rolldown/binding-android-arm64@1.2.16': resolution: {integrity: sha512-kx5wBiMB6E7TEvpl2B9gjLU004BkvEm2Dr941BFjx/SontPwSzNuQUIoVKxHHoSjpFIfHMmcguyLOtyn0hObRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.3.0': + resolution: {integrity: sha512-HdnCiSmMGgEILGVLU1o4dcOblLGj8sMnqEFrDY/S7KRti1nTQHAqGGs2AniPspbK90AFS3pM23K/R0J3hPQXYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.2.16': resolution: {integrity: sha512-qslZrXnKJU4cUpjoAmtAo/KQM9e2IRMlmpig6Zpwj+8KWxW8v+nkAf9216Bsek9lOC1jvg2yCjygCFo2f83msQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.3.0': + resolution: {integrity: sha512-TkQ2JGC8/9UxoCeH5dSJj1gxuFhzw200QTJJd2YNPRXznSSM4XvpKV2Cs+RM2BcM8sa6xa4rmXNuiJ64+1993g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.2.16': resolution: {integrity: sha512-FdF+y48ND13eAyM2mQn+85kvAqNlvRWROy2rhgA463X/0Gv4vGtazZtfaF1mRBLscYvtOlh4QnLjOWiFzX69OQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.3.0': + resolution: {integrity: sha512-Gr+iZW50RJZo4BPUazaDh/Azx7W0Rl04sy2MkXD+H4RkxzUX5hIrjaVw1BK+XHsccKExQAmCy6DhvRLlUzaYUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.2.16': resolution: {integrity: sha512-ddjqFM5e95AgLbUPtKIS7V1KTVlA0RUgCVr5mn+/IEhsdy3pr+Vuj/HZ7nlMN2FyxIwUktOH1LEPIQXO1v9y1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.3.0': + resolution: {integrity: sha512-RwAtx8peSqUoBf8pxE0L62xKXBNnA3BtdFV+07t13t0TQoASCtV9tnU67aKKMRZSiD06SU07chB5B8fWFdW3gQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.2.16': resolution: {integrity: sha512-tHdKWbFkFBI687iim3LIyIvyL7j66VvQYkDPss5Stn/qyE2tWkR1YD0dXmXPFKKqT/o5ZEJVsaRsWS2meQwGOA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.3.0': + resolution: {integrity: sha512-ow8fq6kYaIx75D0EVT5GeF4DcawcEYYXJ2CvEaOzyygW1jtVDQU/9o5YYidctHBRDUgPzGaTNB6n/VMTmd1ymw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.2.16': resolution: {integrity: sha512-FJiLGAblPBMlBEdbOqw6kW6QcXDWAf/oJu7gYs9ZJZwmg+K+/zjFLxPTIY9izJUzxzc24FHvmseyA0IvJSl17w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -659,6 +724,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.3.0': + resolution: {integrity: sha512-PLOWuiz+rdqSgiLgN7bxvy6DjXLj8gnJxzRS243LNnLi96VeyB7VFsC3eblcKv3Xwd3jQqJfbCWRhLijTIZyvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.2.16': resolution: {integrity: sha512-hrJpblMsrQ58U9veWpbXzkhV5zStunds6HWLprqq1qauvgBr1E6P+24kLj6lSLI9vjRn/RYpjprhkHQPKGWpNg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -666,6 +738,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.3.0': + resolution: {integrity: sha512-CQ/k85cc342j5SnZ/gT9p132NXZRGTgLRhfItdYqUg+jpvL5HYFve0GB+zQDCYGwDjtDWIoqKSOitkmZMZc/tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.2.16': resolution: {integrity: sha512-qJd/dC6j6CwLG9/s/RP2nb1RZ0GIgj7Ioj7x/SYa3RzjVrlzrmH0fhIOpfvqQDeIsdP0loi+kHaMhJzY1PBIaA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -673,6 +752,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.3.0': + resolution: {integrity: sha512-wk+ZG7xDP2px3cQRFoNoNp52/w1O5hTTtciHxuastreMOp8isYUTCpcG/rEYnSQBI+nycN+B9d9pBGua+qvV7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.2.16': resolution: {integrity: sha512-Vx7Xg5uUJuNcujJjI70OICaH0EYj80BtOLZTSN7uOYg8QOLlyKnaG0IW7Fn/J0IpJsaKzmDKMhOQv1JBM9m9vg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -680,6 +766,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.3.0': + resolution: {integrity: sha512-sEgyZt72Rj7V5q6OZ7A4U2I5v4EMGEv3Fp5QmoncmKbUMTrGmpyH7MwENfERGbfUYjxdBmktw4JJLys5I1aQNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.2.16': resolution: {integrity: sha512-TNKhgE3uJTsTzatUSSYt0Kgo+Oa2uSlSjz4r1aEIea7HX6ULBym4fAlYUhG1i6pjNf2njfCUAfKwr6C3E9Xg1w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -687,6 +780,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.3.0': + resolution: {integrity: sha512-PvL0BoBUwVugK1pFd+zyVk1L9F6ucmQ7oF2dpy8zKPHNlbW2zrU9Jst3fWYfG7z3owjxqhwAvi5G4o0AikrJMw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.2.16': resolution: {integrity: sha512-7chXdpjXZ8qG0+mIxECN3cT9kvhZ3/oZhMX6Pp876P7CDrIy8nJswva6Mq357JR7eYXfuskwZxMeV1SzoZdHrA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -694,53 +794,83 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.3.0': + resolution: {integrity: sha512-5N4DdzAmLtnyuh027H6ViC99BeoA4T0RwKS6qUrl6zY70AKRsNDrnEZeWnqrKmDRFxXmv8zf9yhF2DxN/SfyGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.2.16': resolution: {integrity: sha512-Kwjt+7uNTJK5/MDkGWGVO2KQPnj8yAV75dMpfwyHZrJSXWHrniOB0aUEWlVYf3H1hOqFLIStLdM5QXq6bnKmOQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.3.0': + resolution: {integrity: sha512-Tz+2b+yF5eVRGX3DWebn2JIvZkNYI1gkafI+nF2fau2zeQDOpBAS8w1PxHi4ke//NIOE6+2DNYyq1veIjzAXqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.3.0': + resolution: {integrity: sha512-ntK6OFor3nQtS1TenZP5wX59oPpkKEmour3AipGHB32u+Z8QXxjVdG+7vNSvgerRWIj6vjg4XpKu42slb0vlXQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.2.16': resolution: {integrity: sha512-/LH6WfjDRXXJz/p5xl4TmU+jpcnwcxbKEQBW/GZE0JHfN0lGIyTtsUEGaQ/q/GikkGJ2yLKe6pwm7AnEWO8pdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.3.0': + resolution: {integrity: sha512-ldH38lBlOpS+b4fbSG9euQjhYXLE18PIz5hyvf6gvFfyVLodRE/Tsu4jV8UmPqjjce6lotmUUwscxPuer4lczQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.16': resolution: {integrity: sha512-1lv1KvX0Z871zfk7vw+dnXMMnHNyDwMzWG8Kv3HxDXMOhzCX4SHc7HK319fInP0i+0p9D8brkfzL7pJOaGl+tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.3.0': + resolution: {integrity: sha512-HglhUzUPuXNTGFt5ZwJalSEvavhFSl+nxpQM9urkzkt+2oGI1ZSwgyytk9aGw15/0kk1TCHPc57nv3DdiG8/yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@shikijs/core@4.5.0': - resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} + '@shikijs/core@4.6.0': + resolution: {integrity: sha512-bfd4OKgvoyXYiYmMRuleA656P4V7M/Du9lcTl38Ngm6KszMj7bq4J1IGZwSYR4c95Tv5UQALtYNWUwaI9UT3xw==} engines: {node: '>=20'} - '@shikijs/engine-javascript@4.5.0': - resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==} + '@shikijs/engine-javascript@4.6.0': + resolution: {integrity: sha512-K0oqxFoL+kEMdz89mHLFO15Tsbv3kFZ6WR1cXZKMvLSc+oqaM00A6pyga1qSeXB22dP0tTiSApRcGBaKWsEccg==} engines: {node: '>=20'} - '@shikijs/engine-oniguruma@4.5.0': - resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==} + '@shikijs/engine-oniguruma@4.6.0': + resolution: {integrity: sha512-aggd6Q7SuJOXNnsUbfG2XesxBJKBMAw/PDTUo9PyRjMaaJJ2dNrI+q0C+25ARXAK9yLHAlwxc9oRT2u68YKZ7w==} engines: {node: '>=20'} - '@shikijs/langs@4.5.0': - resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==} + '@shikijs/langs@4.6.0': + resolution: {integrity: sha512-1yMEX3oCVV54LUq/ovfpRkDQoYDkcvjSWFFa/YLUDMiSoRzMi2uxLJYbv41ahT8Lu9lFMaa7hecd3Q39trqUyg==} engines: {node: '>=20'} - '@shikijs/primitive@4.5.0': - resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==} + '@shikijs/primitive@4.6.0': + resolution: {integrity: sha512-c54+TQEo9ToqgfL/AU8FpjnV09+GA9Oa7M5ROkkXteZfp5XzpAJGXjjvZQFQioJOwm/w/6Z3lIzQstAkl8coag==} engines: {node: '>=20'} - '@shikijs/themes@4.5.0': - resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==} + '@shikijs/themes@4.6.0': + resolution: {integrity: sha512-qHAVAs80RiGD+IRuH9G+JPDOEc9A/kHsng4EzCUCwB9bLzW6Z0y9WETh2YyCcADJBmfrIaJ1Jp7KBNP6FHkgtQ==} engines: {node: '>=20'} - '@shikijs/types@4.5.0': - resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==} + '@shikijs/types@4.6.0': + resolution: {integrity: sha512-+ENG1adsKt/X7cRYw1Nl7BEpBmPOjmQ7bR/eGmHuMlT8gtOFf3KEi5l31DJYyAWhW6Y6bjP1plU7FmaxWGENFw==} engines: {node: '>=20'} '@shikijs/vscode-textmate@10.1.0': @@ -789,8 +919,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - astro@7.4.4: - resolution: {integrity: sha512-e+BzhGCaIY/H1tV/BQPTbOPZVZ8wuu6+bbpc+3oSMH2UgoB1l9peSGASk6nswtYra9PO9OoMREhldKtQkZ5TVw==} + astro@7.4.7: + resolution: {integrity: sha512-fH54IOaCkZY1paEjygKn8CPfuJ3w8ns7PourcPML5AouJkQuTBqBQ2RbbIbBhutZbg2qn5se6Yl9DYybzqjC0Q==} engines: {node: '>=22.23.4', npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true peerDependencies: @@ -851,8 +981,8 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - cookie@2.0.1: - resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + cookie@2.0.2: + resolution: {integrity: sha512-SL0cVuEdETEp7pN0FuZb01toc3vnODEfVUCooxG1SJN0yIirh7JMb9X9bvfCFf0vzzbT68RdbKDHYTiWy7a7iw==} engines: {node: '>=22'} crossws@0.3.5: @@ -934,9 +1064,6 @@ packages: engines: {node: '>=18'} hasBin: true - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1129,8 +1256,8 @@ packages: micromark-util-types@2.0.3: resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} - miniflare@5.20261023.3-beta: - resolution: {integrity: sha512-thdXzlktu5GE1o/BlmMAPeJ0Cu6Tu5LpMbRlyfRrpVvMRrhd6p52TMqcITCZZLVzt1UO92VGBkLDhLOpryUAyQ==} + miniflare@5.20261104.0-beta: + resolution: {integrity: sha512-pYZ2n85+FYUb7s0oIVcQxO63/+wgaknm+A/kQjctJqshvHPJs3UtnzaIZ7xrrHMOk8atD7yAfauf6G9VAv7Upg==} engines: {node: '>=22.0.0'} mrmime@2.0.1: @@ -1179,13 +1306,9 @@ packages: resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} engines: {node: '>=20'} - p-queue@9.3.5: - resolution: {integrity: sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ==} - engines: {node: '>=20'} - - p-timeout@7.0.2: - resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} - engines: {node: '>=20'} + p-queue@10.0.0: + resolution: {integrity: sha512-P2wrCri3bhGLPo3kX7qYVXbo/5GvaVATU0DpO24CbeT53Y4z35t8JUWku04ERpXHUYB5rPMi3TkWE3fmJgx5rA==} + engines: {node: '>=22'} package-manager-detector@1.9.0: resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} @@ -1252,15 +1375,20 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - satteri@0.10.5: - resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + rolldown@1.3.0: + resolution: {integrity: sha512-7j1jdVlzWzbRat9EDMsB/QmyMcc6hOO0vbcma8LGjBTmKlpS5Hem+5fpntc/HoRV5tLrG+Qo6I1ZHV/ZuL5S8g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + satteri@0.11.6: + resolution: {integrity: sha512-ddGCTqSfwL+A+odhdjj8E+ZMu1h0QEnG3VTmu7fPJL2+80GdjxDh1AeCw8mn2aa95eQSosG4e2QBYYfCc5nyiA==} sax@1.6.1: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + semver@7.8.6: + resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==} engines: {node: '>=10'} hasBin: true @@ -1273,8 +1401,8 @@ packages: '@types/node': optional: true - shiki@4.5.0: - resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==} + shiki@4.6.0: + resolution: {integrity: sha512-imjLsVHgPuWhvpU3P+zOekvMYqnel7QmKsFC4Sn0fCuAvaaalBsxwKEsrU8Ko5BdFnZA6Go/8a0RzahS634UgA==} engines: {node: '>=20'} sisteransi@1.0.5: @@ -1330,8 +1458,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tslib@2.9.1: + resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==} ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -1346,8 +1474,8 @@ packages: resolution: {integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==} engines: {node: '>=20.18.1'} - undici@8.12.3: - resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} + undici@8.12.4: + resolution: {integrity: sha512-8Mx+uNKKER2bA4AdtedkqRbwUCIJFr2nJckXRe5yrDqzePqwLP7VNcctN8/XdmDSbF7mS+jJKIszlL+vbam1VA==} engines: {node: '>=22.19.0'} unenv@2.0.0-rc.24: @@ -1446,8 +1574,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.3.5: - resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} + vite@8.3.6: + resolution: {integrity: sha512-UI7dK29NnS54Fk+mmo7o+jI6U8Fp7hDl+X5Q1k45WH+d4dSlbLVUETGQ+hfkNgvLQGyoElPj837nZyv4MBc0VA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1497,17 +1625,17 @@ packages: vite: optional: true - workerd@1.20261023.1: - resolution: {integrity: sha512-NeofJFyaYNpqKpFRJW3ApuonaerPd6/JWlfTtLDYf2A6ygqrDEFnYgEXmc0hhOxqnJsSM+kXJN6VebPojzRrsg==} + workerd@1.20261104.1: + resolution: {integrity: sha512-JuiKY9k/4V4UE2xsupaTvZ1SF6o2a8sg+/zfq/DaSDwvH+o7t2ZEFuIWNEnryfeFdP47/tz/p828Kvl4ptPlrA==} engines: {node: '>=16'} hasBin: true - wrangler@4.156.0: - resolution: {integrity: sha512-kVLAShuLiNgE3jcrmXcymDf/iPKDPrSxACe5ueugW/33HeNB9E9CkKYchudCeBwgmsnl4k+1zt4NO7vqb/fRuQ==} + wrangler@4.158.0: + resolution: {integrity: sha512-qZdTxIOU8smBVTHzTJVwHiPZB2lJ9+Js79fqKK05l+AbU5hXLWLUHO6oO1vni5G4hjYQTSBAHoGHtSocWPG0FA==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^5.20261023.1 + '@cloudflare/workers-types': ^5.20261104.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -1579,7 +1707,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 - '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2': @@ -1605,23 +1733,23 @@ snapshots: dependencies: '@astrojs/compiler-binding': 0.5.2 - '@astrojs/internal-helpers@0.13.0': + '@astrojs/internal-helpers@0.13.1': dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 picomatch: 4.0.7 retext-smartypants: 6.2.0 - shiki: 4.5.0 + shiki: 4.6.0 smol-toml: 1.9.1 unified: 11.0.5 yaml: 2.9.1 - '@astrojs/markdown-satteri@0.4.6': + '@astrojs/markdown-satteri@0.4.7': dependencies: - '@astrojs/internal-helpers': 0.13.0 + '@astrojs/internal-helpers': 0.13.1 '@astrojs/prism': 4.1.2 github-slugger: 2.0.0 - satteri: 0.10.5 + satteri: 0.11.6 '@astrojs/prism@4.1.2': dependencies: @@ -1634,48 +1762,54 @@ snapshots: is-docker: 4.0.0 package-manager-detector: 1.9.0 - '@babel/helper-string-parser@7.29.11': {} + '@babel/helper-string-parser@7.29.13': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.12': + '@babel/parser@7.29.13': dependencies: '@babel/types': 7.29.11 '@babel/types@7.29.11': dependencies: - '@babel/helper-string-parser': 7.29.11 + '@babel/helper-string-parser': 7.29.13 '@babel/helper-validator-identifier': 7.29.7 - '@bruits/satteri-darwin-arm64@0.10.5': + '@bruits/satteri-android-arm64@0.11.6': + optional: true + + '@bruits/satteri-darwin-arm64@0.11.6': + optional: true + + '@bruits/satteri-darwin-x64@0.11.6': optional: true - '@bruits/satteri-darwin-x64@0.10.5': + '@bruits/satteri-freebsd-x64@0.11.6': optional: true - '@bruits/satteri-linux-arm64-gnu@0.10.5': + '@bruits/satteri-linux-arm64-gnu@0.11.6': optional: true - '@bruits/satteri-linux-arm64-musl@0.10.5': + '@bruits/satteri-linux-arm64-musl@0.11.6': optional: true - '@bruits/satteri-linux-x64-gnu@0.10.5': + '@bruits/satteri-linux-x64-gnu@0.11.6': optional: true - '@bruits/satteri-linux-x64-musl@0.10.5': + '@bruits/satteri-linux-x64-musl@0.11.6': optional: true - '@bruits/satteri-wasm32-wasi@0.10.5': + '@bruits/satteri-wasm32-wasi@0.11.6': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@bruits/satteri-win32-arm64-msvc@0.10.5': + '@bruits/satteri-win32-arm64-msvc@0.11.6': optional: true - '@bruits/satteri-win32-x64-msvc@0.10.5': + '@bruits/satteri-win32-x64-msvc@0.11.6': optional: true '@capsizecss/unpack@4.0.1': @@ -1696,28 +1830,28 @@ snapshots: '@cloudflare/kv-asset-handler@0.5.0': {} - '@cloudflare/unenv-preset@2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261023.1)': + '@cloudflare/unenv-preset@2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261104.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20261023.1 + workerd: 1.20261104.1 - '@cloudflare/workerd-darwin-64@1.20261023.1': + '@cloudflare/workerd-darwin-64@1.20261104.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20261023.1': + '@cloudflare/workerd-darwin-arm64@1.20261104.1': optional: true - '@cloudflare/workerd-linux-64@1.20261023.1': + '@cloudflare/workerd-linux-64@1.20261104.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20261023.1': + '@cloudflare/workerd-linux-arm64@1.20261104.1': optional: true - '@cloudflare/workerd-windows-64@1.20261023.1': + '@cloudflare/workerd-windows-64@1.20261104.1': optional: true - '@cloudflare/workers-types@5.20261030.1': {} + '@cloudflare/workers-types@5.20261106.1': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -1726,33 +1860,49 @@ snapshots: '@emnapi/core@1.11.1': dependencies: '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@emnapi/core@1.11.3': dependencies: '@emnapi/wasi-threads': 1.2.3 - tslib: 2.8.1 + tslib: 2.9.1 + optional: true + + '@emnapi/core@2.0.0-beta.2': + dependencies: + '@emnapi/wasi-threads': 2.2.0 + tslib: 2.9.1 optional: true '@emnapi/runtime@1.11.1': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@emnapi/runtime@1.11.3': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 + optional: true + + '@emnapi/runtime@2.0.0-beta.2': + dependencies: + tslib: 2.9.1 optional: true '@emnapi/wasi-threads@1.2.2': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@emnapi/wasi-threads@1.2.3': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 + optional: true + + '@emnapi/wasi-threads@2.2.0': + dependencies: + tslib: 2.9.1 optional: true '@esbuild/aix-ppc64@0.28.2': @@ -1950,14 +2100,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@2.0.0-beta.2)(@emnapi/runtime@2.0.0-beta.2)': + dependencies: + '@emnapi/core': 2.0.0-beta.2 + '@emnapi/runtime': 2.0.0-beta.2 + '@tybys/wasm-util': 0.10.4 + optional: true + + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 @@ -1968,6 +2125,8 @@ snapshots: '@oxc-project/types@0.156.0': {} + '@oxc-project/types@0.157.0': {} + '@poppinss/colors@4.1.6': dependencies: kleur: 4.1.5 @@ -1983,84 +2142,136 @@ snapshots: '@rolldown/binding-android-arm-eabi@1.2.16': optional: true + '@rolldown/binding-android-arm-eabi@1.3.0': + optional: true + '@rolldown/binding-android-arm64@1.2.16': optional: true + '@rolldown/binding-android-arm64@1.3.0': + optional: true + '@rolldown/binding-darwin-arm64@1.2.16': optional: true + '@rolldown/binding-darwin-arm64@1.3.0': + optional: true + '@rolldown/binding-darwin-x64@1.2.16': optional: true + '@rolldown/binding-darwin-x64@1.3.0': + optional: true + '@rolldown/binding-freebsd-x64@1.2.16': optional: true + '@rolldown/binding-freebsd-x64@1.3.0': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.16': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.3.0': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.16': optional: true + '@rolldown/binding-linux-arm64-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-arm64-musl@1.2.16': optional: true + '@rolldown/binding-linux-arm64-musl@1.3.0': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.16': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.16': optional: true + '@rolldown/binding-linux-s390x-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-x64-gnu@1.2.16': optional: true + '@rolldown/binding-linux-x64-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-x64-musl@1.2.16': optional: true + '@rolldown/binding-linux-x64-musl@1.3.0': + optional: true + '@rolldown/binding-openharmony-arm64@1.2.16': optional: true + '@rolldown/binding-openharmony-arm64@1.3.0': + optional: true + + '@rolldown/binding-wasm32-wasi@1.3.0': + dependencies: + '@emnapi/core': 2.0.0-beta.2 + '@emnapi/runtime': 2.0.0-beta.2 + '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@2.0.0-beta.2)(@emnapi/runtime@2.0.0-beta.2) + optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.16': optional: true + '@rolldown/binding-win32-arm64-msvc@1.3.0': + optional: true + '@rolldown/binding-win32-x64-msvc@1.2.16': optional: true + '@rolldown/binding-win32-x64-msvc@1.3.0': + optional: true + '@rolldown/pluginutils@1.0.1': {} - '@shikijs/core@4.5.0': + '@shikijs/core@4.6.0': dependencies: - '@shikijs/primitive': 4.5.0 - '@shikijs/types': 4.5.0 + '@shikijs/primitive': 4.6.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 hast-util-to-html: 9.0.6 - '@shikijs/engine-javascript@4.5.0': + '@shikijs/engine-javascript@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@4.5.0': + '@shikijs/engine-oniguruma@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 - '@shikijs/langs@4.5.0': + '@shikijs/langs@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 - '@shikijs/primitive@4.5.0': + '@shikijs/primitive@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 - '@shikijs/themes@4.5.0': + '@shikijs/themes@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 - '@shikijs/types@4.5.0': + '@shikijs/types@4.6.0': dependencies: '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 @@ -2073,7 +2284,7 @@ snapshots: '@tybys/wasm-util@0.10.4': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@types/estree-jsx@1.0.5': @@ -2109,11 +2320,11 @@ snapshots: aria-query@5.3.2: {} - astro@7.4.4(esbuild@0.28.2)(yaml@2.9.1): + astro@7.4.7(esbuild@0.28.2)(yaml@2.9.1): dependencies: '@astrojs/compiler-rs': 0.5.2 - '@astrojs/internal-helpers': 0.13.0 - '@astrojs/markdown-satteri': 0.4.6 + '@astrojs/internal-helpers': 0.13.1 + '@astrojs/markdown-satteri': 0.4.7 '@astrojs/telemetry': 3.4.2 '@capsizecss/unpack': 4.0.1 '@clack/prompts': 1.8.1 @@ -2124,7 +2335,7 @@ snapshots: ci-info: 4.4.0 clsx: 2.1.1 common-ancestor-path: 2.0.0 - cookie: 2.0.1 + cookie: 2.0.2 devalue: 6.0.3 diff: 9.0.0 dset: 3.1.4 @@ -2142,12 +2353,12 @@ snapshots: neotraverse: 1.0.1 obug: 3.0.0 p-limit: 7.3.3 - p-queue: 9.3.5 + p-queue: 10.0.0 package-manager-detector: 1.9.0 piccolore: 0.1.3 picomatch: 4.0.7 - rolldown: 1.2.16 - shiki: 4.5.0 + rolldown: 1.3.0 + shiki: 4.6.0 smol-toml: 1.9.1 svgo: 4.1.0 tinyclip: 1.0.3 @@ -2158,8 +2369,8 @@ snapshots: unifont: 1.0.3 unstorage: 1.17.6 verkit: 0.5.0 - vite: 8.3.5(esbuild@0.28.2)(yaml@2.9.1) - vitefu: 1.1.3(vite@8.3.5(esbuild@0.28.2)(yaml@2.9.1)) + vite: 8.3.6(esbuild@0.28.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.6(esbuild@0.28.2)(yaml@2.9.1)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 zod: 4.6.7 @@ -2230,7 +2441,7 @@ snapshots: cookie@1.1.1: {} - cookie@2.0.1: {} + cookie@2.0.2: {} crossws@0.3.5: dependencies: @@ -2331,8 +2542,6 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 - eventemitter3@5.0.4: {} - extend@3.0.2: {} fast-string-truncated-width@3.0.3: {} @@ -2473,7 +2682,7 @@ snapshots: magicast@0.5.5: dependencies: - '@babel/parser': 7.29.12 + '@babel/parser': 7.29.13 '@babel/types': 7.29.11 source-map-js: 1.2.2 @@ -2510,12 +2719,12 @@ snapshots: micromark-util-types@2.0.3: {} - miniflare@5.20261023.3-beta: + miniflare@5.20261104.0-beta: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.35.5 undici: 7.30.1 - workerd: 1.20261023.1 + workerd: 1.20261104.1 ws: 8.21.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -2563,12 +2772,7 @@ snapshots: dependencies: yocto-queue: 1.2.2 - p-queue@9.3.5: - dependencies: - eventemitter3: 5.0.4 - p-timeout: 7.0.2 - - p-timeout@7.0.2: {} + p-queue@10.0.0: {} package-manager-detector@1.9.0: {} @@ -2639,32 +2843,56 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.16 '@rolldown/binding-win32-x64-msvc': 1.2.16 - satteri@0.10.5: + rolldown@1.3.0: + dependencies: + '@oxc-project/types': 0.157.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.3.0 + '@rolldown/binding-android-arm64': 1.3.0 + '@rolldown/binding-darwin-arm64': 1.3.0 + '@rolldown/binding-darwin-x64': 1.3.0 + '@rolldown/binding-freebsd-x64': 1.3.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.3.0 + '@rolldown/binding-linux-arm64-gnu': 1.3.0 + '@rolldown/binding-linux-arm64-musl': 1.3.0 + '@rolldown/binding-linux-ppc64-gnu': 1.3.0 + '@rolldown/binding-linux-s390x-gnu': 1.3.0 + '@rolldown/binding-linux-x64-gnu': 1.3.0 + '@rolldown/binding-linux-x64-musl': 1.3.0 + '@rolldown/binding-openharmony-arm64': 1.3.0 + '@rolldown/binding-wasm32-wasi': 1.3.0 + '@rolldown/binding-win32-arm64-msvc': 1.3.0 + '@rolldown/binding-win32-x64-msvc': 1.3.0 + + satteri@0.11.6: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 optionalDependencies: - '@bruits/satteri-darwin-arm64': 0.10.5 - '@bruits/satteri-darwin-x64': 0.10.5 - '@bruits/satteri-linux-arm64-gnu': 0.10.5 - '@bruits/satteri-linux-arm64-musl': 0.10.5 - '@bruits/satteri-linux-x64-gnu': 0.10.5 - '@bruits/satteri-linux-x64-musl': 0.10.5 - '@bruits/satteri-wasm32-wasi': 0.10.5 - '@bruits/satteri-win32-arm64-msvc': 0.10.5 - '@bruits/satteri-win32-x64-msvc': 0.10.5 + '@bruits/satteri-android-arm64': 0.11.6 + '@bruits/satteri-darwin-arm64': 0.11.6 + '@bruits/satteri-darwin-x64': 0.11.6 + '@bruits/satteri-freebsd-x64': 0.11.6 + '@bruits/satteri-linux-arm64-gnu': 0.11.6 + '@bruits/satteri-linux-arm64-musl': 0.11.6 + '@bruits/satteri-linux-x64-gnu': 0.11.6 + '@bruits/satteri-linux-x64-musl': 0.11.6 + '@bruits/satteri-wasm32-wasi': 0.11.6 + '@bruits/satteri-win32-arm64-msvc': 0.11.6 + '@bruits/satteri-win32-x64-msvc': 0.11.6 sax@1.6.1: {} - semver@7.8.5: {} + semver@7.8.6: {} sharp@0.35.5: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.5 + semver: 7.8.6 optionalDependencies: '@img/sharp-darwin-arm64': 0.35.5 '@img/sharp-darwin-x64': 0.35.5 @@ -2692,14 +2920,14 @@ snapshots: '@img/sharp-win32-ia32': 0.35.5 '@img/sharp-win32-x64': 0.35.5 - shiki@4.5.0: + shiki@4.6.0: dependencies: - '@shikijs/core': 4.5.0 - '@shikijs/engine-javascript': 4.5.0 - '@shikijs/engine-oniguruma': 4.5.0 - '@shikijs/langs': 4.5.0 - '@shikijs/themes': 4.5.0 - '@shikijs/types': 4.5.0 + '@shikijs/core': 4.6.0 + '@shikijs/engine-javascript': 4.6.0 + '@shikijs/engine-oniguruma': 4.6.0 + '@shikijs/langs': 4.6.0 + '@shikijs/themes': 4.6.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 @@ -2747,7 +2975,7 @@ snapshots: trough@2.2.0: {} - tslib@2.8.1: + tslib@2.9.1: optional: true ufo@1.6.4: {} @@ -2758,7 +2986,7 @@ snapshots: undici@7.30.1: {} - undici@8.12.3: {} + undici@8.12.4: {} unenv@2.0.0-rc.24: dependencies: @@ -2779,7 +3007,7 @@ snapshots: css-tree: 3.2.1 fnv1a-64: 0.1.2 std-env: 4.3.0 - undici: 8.12.3 + undici: 8.12.4 unist-util-is@6.0.1: dependencies: @@ -2827,7 +3055,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.3.5(esbuild@0.28.2)(yaml@2.9.1): + vite@8.3.6(esbuild@0.28.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -2839,30 +3067,31 @@ snapshots: fsevents: 2.3.3 yaml: 2.9.1 - vitefu@1.1.3(vite@8.3.5(esbuild@0.28.2)(yaml@2.9.1)): + vitefu@1.1.3(vite@8.3.6(esbuild@0.28.2)(yaml@2.9.1)): optionalDependencies: - vite: 8.3.5(esbuild@0.28.2)(yaml@2.9.1) + vite: 8.3.6(esbuild@0.28.2)(yaml@2.9.1) - workerd@1.20261023.1: + workerd@1.20261104.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20261023.1 - '@cloudflare/workerd-darwin-arm64': 1.20261023.1 - '@cloudflare/workerd-linux-64': 1.20261023.1 - '@cloudflare/workerd-linux-arm64': 1.20261023.1 - '@cloudflare/workerd-windows-64': 1.20261023.1 + '@cloudflare/workerd-darwin-64': 1.20261104.1 + '@cloudflare/workerd-darwin-arm64': 1.20261104.1 + '@cloudflare/workerd-linux-64': 1.20261104.1 + '@cloudflare/workerd-linux-arm64': 1.20261104.1 + '@cloudflare/workerd-windows-64': 1.20261104.1 - wrangler@4.156.0(@cloudflare/workers-types@5.20261030.1): + wrangler@4.158.0(@cloudflare/workers-types@5.20261106.1): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261023.1) + '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261104.1) + '@cspotcode/source-map-support': 0.8.1 blake3-wasm: 2.1.5 esbuild: 0.28.2 - miniflare: 5.20261023.3-beta + miniflare: 5.20261104.0-beta path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20261023.1 + workerd: 1.20261104.1 optionalDependencies: - '@cloudflare/workers-types': 5.20261030.1 + '@cloudflare/workers-types': 5.20261106.1 fsevents: 2.3.3 transitivePeerDependencies: - '@types/node' diff --git a/scripts/check-devcon26-attendance-counter.mjs b/scripts/check-devcon26-attendance-counter.mjs index 464f4fd..9985a09 100644 --- a/scripts/check-devcon26-attendance-counter.mjs +++ b/scripts/check-devcon26-attendance-counter.mjs @@ -22,7 +22,8 @@ const context = { module: counterModule, URL, AbortSignal, - window: { location: { origin: 'https://devcongress.org' } }, + window: { location: { origin: 'https://devcongress.org' }, addEventListener() {}, removeEventListener() {}, setInterval() { return 1; }, setTimeout() { return 1; }, clearInterval() {}, clearTimeout() {} }, + document: { visibilityState: 'visible', addEventListener() {}, removeEventListener() {} }, fetch: async (url, options) => { requests.push({ url, options }); if (fail) throw new Error('Network failure'); @@ -49,13 +50,14 @@ assert.equal(attendanceEndpoint('https://em.devcongress.org', 'https://devcongre function fixture() { const count = { textContent: '' }; const estimate = { hidden: true }; - return { hidden: true, count, estimate, querySelector: (selector) => selector.includes('count]') ? count : estimate }; + return { hidden: true, count, estimate, querySelector: (selector) => selector === '[data-attendance-count]' ? count : selector === '[data-attendance-estimate]' ? estimate : null }; } for (const [input, label, estimated] of [ [{ count: 0, source: 'actual' }, '0 people are attending', false], [{ count: 1, source: 'actual' }, '1 person is attending', false], [{ count: 1250, source: 'estimate' }, '1,250 people are attending', true], + [{ count: 25, source: 'ticket_count' }, '25 tickets', false], ]) { payload = input; const root = fixture(); @@ -108,6 +110,52 @@ assert.equal(requests[0].options.credentials, 'omit'); assert.equal(requests[0].options.cache, 'no-store'); assert.ok(requests[0].options.signal); +// Exercise refresh signals and ensure a slow response cannot overlap a newer read. +const listeners = {}; +const timers = []; +let refreshPayload = { count: 20, source: 'ticket_count' }; +let calls = 0; +let release; +const lifecycleModule = { exports: {} }; +const lifecycleContext = { + module: lifecycleModule, URL, AbortSignal, + window: { + location: { origin: 'https://devcongress.org' }, + addEventListener(name, callback) { listeners[name] = callback; }, + removeEventListener() {}, + setTimeout(callback) { timers.push(callback); return timers.length; }, + clearTimeout() {}, setInterval(callback) { listeners.interval = callback; return 1; }, clearInterval() {}, + }, + document: { visibilityState: 'visible', addEventListener(name, callback) { listeners[name] = callback; }, removeEventListener() {} }, + fetch: async () => { + calls += 1; + if (release) await new Promise((resolve) => { release = resolve; }); + return { ok: true, json: async () => refreshPayload }; + }, +}; +vm.runInNewContext(await bundle('src/lib/devcon26-attendance-counter.ts'), lifecycleContext); +const lifecycleRoot = fixture(); +await lifecycleModule.exports.initializeAttendanceCounter([lifecycleRoot], 'https://em.devcongress.org'); +assert.equal(lifecycleRoot.count.textContent, '20 tickets'); +refreshPayload = { count: 25, source: 'ticket_count' }; +listeners.storage({ key: 'devcon26-ticket-counter-refresh' }); +await new Promise((resolve) => setImmediate(resolve)); +assert.equal(lifecycleRoot.count.textContent, '25 tickets'); +assert.equal(timers.length, 3); +refreshPayload = { count: 26, source: 'ticket_count' }; +listeners.visibilitychange(); +await new Promise((resolve) => setImmediate(resolve)); +assert.equal(lifecycleRoot.count.textContent, '26 tickets'); +release = true; +listeners.interval(); +listeners.interval(); +const duringRequest = calls; +release(); +release = null; +await new Promise((resolve) => setImmediate(resolve)); +assert.equal(calls, duringRequest + 1, 'overlapping signals coalesce into one follow-up read'); +listeners.pagehide({ persisted: false }); + const workerModule = { exports: {} }; let upstreamRequest; let upstreamFails = false; @@ -118,12 +166,12 @@ vm.runInNewContext(await bundle('src/worker.ts'), { upstreamRequest = { url: String(url), options }; if (upstreamFails) throw new Error('Unavailable'); if (upstreamRedirects) return Response.redirect('https://example.com/', 302); - return Response.json({ count: 42, source: 'estimate', private: 'discarded' }); + return Response.json({ count: 42, source: 'ticket_count', private: 'discarded' }); }, }); const worker = workerModule.exports.default; const response = await worker.fetch(new Request('https://preview.workers.dev/api/devcon26/attendance-counter?other=1', { headers: { Cookie: 'secret', Authorization: 'secret' } }), { ASSETS: {} }, {}); -assert.deepEqual(await response.json(), { count: 42, source: 'estimate' }); +assert.deepEqual(await response.json(), { count: 42, source: 'ticket_count' }); assert.equal(response.headers.get('Cache-Control'), 'no-store'); assert.equal(upstreamRequest.url, 'https://em.devcongress.org/api/public/annual-conference/2026/attendance-counter'); assert.deepEqual(Object.keys(upstreamRequest.options.headers), ['Accept']); diff --git a/scripts/check-devcon26-managed-checkout.mjs b/scripts/check-devcon26-managed-checkout.mjs index 0c6ee98..3fbae11 100644 --- a/scripts/check-devcon26-managed-checkout.mjs +++ b/scripts/check-devcon26-managed-checkout.mjs @@ -172,7 +172,7 @@ function checkoutFixture(handler) { module, document, URL, URLSearchParams, AbortController, crypto: { randomUUID }, console: { warn() {} }, FormData: class { get() { return challenge; } }, - sessionStorage: { setItem: (key, value) => storage.set(key, value) }, + sessionStorage: { setItem: (key, value) => storage.set(key, value), getItem: (key) => storage.get(key) ?? null }, window: { setTimeout, clearTimeout, matchMedia: (query) => ({ matches: query.includes('reduced-motion'), addEventListener() {} }), @@ -314,6 +314,19 @@ await tick(); assert.equal(departed.steps[0].hidden, false, 'BFCache restoration notices a settings change and requires review'); assert.equal(departed.requests.filter((request) => request.body).length, 1, 'Restoration only refreshes the catalog'); + +let returnedFixture; +returnedFixture = checkoutFixture((request) => response(request.body ? initialized() : catalog())); +await tick(); +await returnedFixture.review(); +await returnedFixture.form.fire('submit'); +await returnedFixture.windowEvents.fire('pagehide'); +await returnedFixture.windowEvents.fire('pageshow', { persisted: true }); +await tick(); +assert.equal(returnedFixture.page.querySelector('[data-existing-checkout]').hidden, false); +assert.match(returnedFixture.page.querySelector('[data-existing-checkout-link]').href, /#reference=devcon26-managed-test-/); +assert.equal(returnedFixture.requests.filter((request) => request.body).length, 1, 'Returning never initializes a replacement checkout'); + let retryCount = 0; const retry = checkoutFixture((request) => { if (!request.body) return response(catalog('live')); @@ -380,17 +393,20 @@ function confirmationFixture(reference, mode, options = {}) { const root = new Element(); const requests = []; const badgeCalls = []; + const signals = []; const module = { exports: {} }; root.dataset.checkoutApiOrigin = apiOrigin; vm.runInNewContext(confirmationCode, { - module, URL, URLSearchParams, AbortController, document: {}, + module, URL, URLSearchParams, AbortController, Event, document: {}, + localStorage: { setItem: (key) => signals.push(key) }, sessionStorage: { getItem: () => options.missingGrant ? null : JSON.stringify({ reference, checkout_grant: 'scoped-grant', checkout_verifier: verifier, }) }, window: { location: { search: '?reference=' + reference, hash: '', pathname: '/devcon26/payment-confirmation/' }, history: { replaceState() {} }, setTimeout, clearTimeout, addEventListener() {}, + dispatchEvent: (event) => signals.push(event.type), }, fetch: async (url, init) => { requests.push({ url, body: JSON.parse(init.body) }); @@ -398,13 +414,14 @@ function confirmationFixture(reference, mode, options = {}) { return response({ mode: options.responseMode ?? mode, status: options.status ?? 'verified', currency: 'GHS', quantity: 1, ticket_amount_minor: 15000, processing_fee_minor: 299, amount_paid_minor: 15299, - card_quantity: 1, buyer_grant: 'self-seat-grant', - }); + card_quantity: options.cardQuantity ?? 1, buyer_grant: 'self-seat-grant', + ...options.extra, + }, options.httpStatus ?? 200); }, }); module.exports.initializeDevcon26PaymentConfirmation(root, (...args) => badgeCalls.push(args)); - return { root, requests, badgeCalls, exports: module.exports }; + return { root, requests, badgeCalls, signals, exports: module.exports }; } for (const mode of ['test', 'live']) { @@ -414,6 +431,7 @@ for (const mode of ['test', 'live']) { assert.equal(fixture.requests[0].url, apiOrigin + path + '/verify'); assert.deepEqual(Object.keys(fixture.requests[0].body).sort(), ['checkout_grant', 'checkout_verifier', 'reference']); assert.equal(fixture.root.dataset.paymentState, 'verified'); + assert.deepEqual(fixture.signals, mode === 'live' ? ['devcon26-ticket-counter-refresh', 'devcon26-ticket-counter-refresh'] : []); assert.equal(fixture.root.querySelector('[data-payment-mode-notice]').hidden, mode !== 'test'); assert.equal(fixture.root.querySelector('[data-payment-fee-row]').hidden, false); assert.equal(fixture.root.querySelector('[data-payment-fee]').textContent, 'GHS 2.99'); @@ -424,6 +442,87 @@ for (const mode of ['test', 'live']) { assert.equal(fixture.exports.devcon26ConfirmationReference('#reference=' + shown), initialized(mode).reference); } +const communityConfirmation = confirmationFixture(initialized('live').reference, 'live', { cardQuantity: 0 }); +await tick(); +assert.equal(communityConfirmation.root.dataset.paymentState, 'verified'); +assert.deepEqual(communityConfirmation.signals, ['devcon26-ticket-counter-refresh', 'devcon26-ticket-counter-refresh']); +assert.equal(communityConfirmation.badgeCalls.length, 0); + +const pendingConfirmation = confirmationFixture(initialized('live').reference, 'live', { status: 'pending' }); +await tick(); +assert.equal(pendingConfirmation.root.dataset.paymentState, 'pending'); +assert.deepEqual(pendingConfirmation.signals, []); + + +for (const mode of ['test', 'live']) { + const failed = confirmationFixture(initialized(mode).reference, mode, { + status: 'failed', + extra: { payment_observation: { status: 'abandoned', reason: 'customer_cancelled', check_failed: true }, checkout_hold: { status: 'expired' } }, + }); + + await tick(); + assert.equal(failed.root.dataset.paymentState, 'failed'); + assert.match(failed.root.querySelector('[data-payment-outcome-detail]').textContent, /cancelled.*out of date.*reservation has expired/); + assert.equal(failed.root.querySelector('[data-payment-retry]').hidden, false); + assert.equal(failed.root.querySelector('[data-payment-receipt]').hidden, true); + assert.equal(failed.badgeCalls.length, 0); + await failed.root.querySelector('[data-payment-retry]').fire('click'); + await tick(); + assert.deepEqual(failed.requests[1].body, failed.requests[0].body, 'Retry checks the same granted reference'); + + const verified = confirmationFixture(initialized(mode).reference, mode, { + extra: { payment_observation: { status: 'failed', reason: 'declined', check_failed: true }, checkout_hold: { status: 'expired' } }, + }); + + await tick(); + assert.equal(verified.root.dataset.paymentState, 'verified'); + assert.equal(verified.root.querySelector('[data-payment-outcome-detail]').hidden, true, 'Verified fulfillment overrides stale observations'); + + const refund = confirmationFixture(initialized(mode).reference, mode, { + status: 'refund_required', extra: { refund_status: 'refunded', payment_observation: { status: 'success' } }, + }); + + await tick(); + assert.match(refund.root.querySelector('[data-payment-copy]').textContent, /has been refunded/); + assert.equal(refund.root.querySelector('[data-payment-receipt]').hidden, true); + assert.equal(refund.root.querySelector('[data-payment-outcome-detail]').hidden, true); +} + +for (const httpStatus of [429, 503]) { + const unavailable = confirmationFixture(initialized('live').reference, 'live', { httpStatus }); + + await tick(); + assert.equal(unavailable.root.dataset.paymentState, 'error'); + assert.equal(unavailable.root.querySelector('[data-payment-retry]').hidden, false); + assert.equal(unavailable.root.querySelector('[data-payment-receipt]').hidden, true); + assert.equal(unavailable.badgeCalls.length, 0); +} + +const unavailableDetail = confirmationFixture(initialized('live').reference, 'live', { + httpStatus: 503, extra: { payment_observation: { status: 'success', check_failed: true }, checkout_hold: { status: 'expired' } }, +}); +await tick(); +assert.equal(unavailableDetail.root.dataset.paymentState, 'error'); +assert.match(unavailableDetail.root.querySelector('[data-payment-outcome-detail]').textContent, /still being confirmed.*out of date.*reservation has expired/); +assert.equal(unavailableDetail.root.querySelector('[data-payment-receipt]').hidden, true); +assert.equal(unavailableDetail.badgeCalls.length, 0); + +const pendingSuccess = confirmationFixture(initialized('live').reference, 'live', { + status: 'pending', extra: { payment_observation: { status: 'success' } }, +}); +await tick(); +assert.equal(pendingSuccess.root.dataset.paymentState, 'pending'); +assert.match(pendingSuccess.root.querySelector('[data-payment-outcome-detail]').textContent, /still being confirmed/); +assert.equal(pendingSuccess.root.querySelector('[data-payment-receipt]').hidden, true); +assert.equal(pendingSuccess.badgeCalls.length, 0); + +const unknownMetadata = confirmationFixture(initialized('live').reference, 'live', { + status: 'pending', extra: { payment_observation: { status: 'unknown-provider-text', reason: '' }, checkout_hold: { status: 'unknown' } }, +}); +await tick(); +assert.equal(unknownMetadata.root.querySelector('[data-payment-outcome-detail]').hidden, true); + + for (const options of [{ missingGrant: true }, { responseMode: 'live' }]) { const fixture = confirmationFixture(initialized('test').reference, 'test', options); diff --git a/src/components/MissionSection.astro b/src/components/MissionSection.astro index 8b75879..e3316ce 100644 --- a/src/components/MissionSection.astro +++ b/src/components/MissionSection.astro @@ -119,6 +119,14 @@ const headlineParts = parseEmphasis(mission.headline); font-size: var(--text-lg); } + @media (max-width: 899px) { + .btn-mission { + min-height: 44px; + padding: var(--s3) var(--s6); + font-size: var(--text-sm); + } + } + .mission-body { font-size: var(--text-base); color: var(--text-mid); diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro index 17e0826..3213895 100644 --- a/src/components/Navbar.astro +++ b/src/components/Navbar.astro @@ -40,18 +40,21 @@ const links = conference ? [ + + diff --git a/src/pages/devcon26/index.astro b/src/pages/devcon26/index.astro index b817b94..5c95757 100644 --- a/src/pages/devcon26/index.astro +++ b/src/pages/devcon26/index.astro @@ -225,10 +225,10 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) {

Technology for the Next Generation

Innovation • Community • Impact

-

With a gathering of builders, researchers, designers, security professionals, product managers and marketers. Come gain knowledge and exchange knowledge at DevCon26

+

With a gathering of builders, researchers, designers, security professionals, product managers and marketers. Come gain knowledge and exchange knowledge at DevCon26Meet Ghana’s builders, researchers and creators. Share ideas and learn together at DevCon26.

+

19 December 2026
Accra Digital Center

Buy tickets -

19 December 2026
Accra Digital Center

@@ -706,6 +706,10 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { text-wrap: pretty; } + .hero-summary-mobile, .hero-details-separator { + display: none; + } + .hero-actions { display: flex; align-items: center; @@ -717,6 +721,7 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { } .hero-actions p { + order: 1; font-size: 12px; line-height: 1.6; } @@ -2134,7 +2139,7 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { } .hero h1 { - font-size: clamp(30px, 8.8vw, 42px); + font-size: clamp(36px, 9vw, 40px); letter-spacing: -0.025em; } @@ -2144,7 +2149,7 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { .hero-tagline { margin-top: 12px; - text-align: center; + text-align: left; font-size: 15px; line-height: 1.4; } @@ -2152,27 +2157,41 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { .hero-summary { max-width: none; margin-top: 20px; - margin-inline: auto; - text-align: center; + text-align: left; font-size: 16px; line-height: 1.55; } + .hero-summary-desktop, .hero-actions p br { + display: none; + } + + .hero-summary-mobile, .hero-details-separator { + display: inline; + } + .hero-actions { flex-direction: column; - justify-content: center; + align-items: stretch; gap: 16px; margin-top: 20px; - text-align: center; + text-align: left; } .hero-actions p { - max-width: 32ch; - text-wrap: balance; + order: 0; font-size: 14px; letter-spacing: 0; } + .hero-actions .button { + min-height: 50px; + } + + .hero-actions .button span { + font-size: 18px; + } + .hero-images { gap: 6px; } diff --git a/src/pages/devcon26/payment-confirmation.astro b/src/pages/devcon26/payment-confirmation.astro index 65ad35c..563a8e6 100644 --- a/src/pages/devcon26/payment-confirmation.astro +++ b/src/pages/devcon26/payment-confirmation.astro @@ -38,6 +38,7 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ Payment received + @@ -183,9 +184,10 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/
- Back to DevCon26 - - Contact us +
@@ -1420,8 +1422,6 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ .confirmation-actions { display: block; margin-top: 24px; - padding-top: 16px; - border-top: 1px solid var(--border); } .confirmation-actions .payment-actions { @@ -1514,6 +1514,13 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ align-items: center; } + .payment-secondary-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 4px 20px; + } + .confirmation-actions .support-link { font-size: 13px; color: var(--text-mid); @@ -1551,9 +1558,9 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ } .confirmation-actions .payment-actions { - flex-direction: row; - justify-content: center; - gap: 0 12px; + flex-direction: column; + align-items: flex-start; + gap: 4px; } .confirmation-actions .support-link { @@ -1564,10 +1571,6 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ } } - .footer-divider { - color: var(--text-mid); - } - @media (hover: hover) and (pointer: fine) { .confirmation-actions .support-link:hover { color: var(--pink);