From 1a7d9abc2ca753e1cb94773291b90130bd9ecba3 Mon Sep 17 00:00:00 2001 From: alloynetworks Date: Sat, 18 Apr 2026 12:51:34 +0300 Subject: [PATCH 01/19] Replace MDX roadmap pages with data-driven Xahau Roadmap component Adds a build-time-rendered roadmap chart (XahauRoadmap.astro) backed by a single JSON source of truth (src/data/roadmap.json) validated by a Zod schema. The old hand-written per-locale MDX pages are removed in favour of an Astro i18n route at src/pages/[...lang]/roadmap.astro that renders /roadmap and /es/roadmap, using BaseLayout directly so the page shows one heading instead of a duplicate PageLayout H1. Co-Authored-By: Claude Opus 4.7 --- package-lock.json | 1050 ++++++++++++++++++++++------- src/components/XahauRoadmap.astro | 479 +++++++++++++ src/data/roadmap.json | 432 ++++++++++++ src/pages/[...lang]/roadmap.astro | 46 ++ src/pages/es/roadmap.mdx | 69 -- src/pages/ja/roadmap.mdx | 69 -- src/pages/roadmap.mdx | 69 -- src/schemas/roadmap.ts | 89 +++ 8 files changed, 1862 insertions(+), 441 deletions(-) create mode 100644 src/components/XahauRoadmap.astro create mode 100644 src/data/roadmap.json create mode 100644 src/pages/[...lang]/roadmap.astro delete mode 100644 src/pages/es/roadmap.mdx delete mode 100644 src/pages/ja/roadmap.mdx delete mode 100644 src/pages/roadmap.mdx create mode 100644 src/schemas/roadmap.ts diff --git a/package-lock.json b/package-lock.json index 1c7c936..f4999d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -123,23 +123,23 @@ } }, "node_modules/@astrojs/node": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.4.4.tgz", - "integrity": "sha512-zQelZmeejnpw3Y5cj2gCyAZ6HT7tjgsWLZH8k40s3bTaT6lqJXlPtKJeIsuEcod21vZLODqBEQeu0CWrWm01EQ==", + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.5.5.tgz", + "integrity": "sha512-rtU2BGU5u3SfGURpANfMxVzCIoR86MkaN05ncza9rbtuMKJ/XnRJt/BbyVknDbOJ71hoci0SIsJwKcJR8vvi/A==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.7.3", - "send": "^1.2.0", + "@astrojs/internal-helpers": "0.7.6", + "send": "^1.2.1", "server-destroy": "^1.0.1" }, "peerDependencies": { - "astro": "^5.7.0" + "astro": "^5.17.3" } }, "node_modules/@astrojs/node/node_modules/@astrojs/internal-helpers": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.3.tgz", - "integrity": "sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", "license": "MIT" }, "node_modules/@astrojs/prism": { @@ -1000,6 +1000,22 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", @@ -2010,240 +2026,325 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", "cpu": [ "loong64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", "cpu": [ "ppc64" ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", "cpu": [ "riscv64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", "cpu": [ "riscv64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", "cpu": [ "s390x" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", "cpu": [ "arm64" ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", "cpu": [ "ia32" ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -2857,9 +2958,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2887,9 +2988,9 @@ } }, "node_modules/altcha": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/altcha/-/altcha-2.2.4.tgz", - "integrity": "sha512-UrU2izh1pISqzd7TCAJiJB2N+r7roqA348Qxt1gJlW5k9pJpbDDmMcDaxfuet9h/WFE6Snrritu/WusmERarrg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/altcha/-/altcha-2.3.0.tgz", + "integrity": "sha512-vl8I0dQvSQB7/Mx09XuWZ1+LdSP7vEda6OLbg9kUQ2ZO2LT7MzgUyLK7Iips+GAV6c0ntVcS1XWOqhEPpwbDhQ==", "license": "MIT", "dependencies": { "@altcha/crypto": "^0.0.1" @@ -2965,9 +3066,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -3013,14 +3114,14 @@ } }, "node_modules/astro": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.7.tgz", - "integrity": "sha512-Kfv7FKisFR+THvmojXWtvJGRCvQ4D9przguE9XdeUtS464ned6hvbgmyFDvPzyaNmDtkHGNpPwAQ9tgFcVqp+Q==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.1.tgz", + "integrity": "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", - "@astrojs/internal-helpers": "0.7.5", - "@astrojs/markdown-remark": "6.3.10", + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/markdown-remark": "6.3.11", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", @@ -3036,12 +3137,12 @@ "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", - "devalue": "^5.6.1", - "diff": "^5.2.0", + "devalue": "^5.6.2", + "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", - "esbuild": "^0.25.0", + "esbuild": "^0.27.3", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", @@ -3062,16 +3163,16 @@ "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", - "shiki": "^3.20.0", + "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", - "unifont": "~0.7.1", + "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.3", + "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", @@ -3109,6 +3210,482 @@ "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0" } }, + "node_modules/astro/node_modules/@astrojs/internal-helpers": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", + "license": "MIT" + }, + "node_modules/astro/node_modules/@astrojs/markdown-remark": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz", + "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/astro/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, "node_modules/astro/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -3328,15 +3905,15 @@ } }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3436,9 +4013,9 @@ } }, "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", "license": "MIT" }, "node_modules/crossws": { @@ -3587,9 +4164,9 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, "node_modules/depd": { @@ -3636,9 +4213,9 @@ } }, "node_modules/devalue": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", + "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", "license": "MIT" }, "node_modules/devlop": { @@ -3654,9 +4231,10 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -4162,19 +4740,19 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/h3": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", - "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", "license": "MIT", "dependencies": { - "cookie-es": "^1.2.2", + "cookie-es": "^1.2.3", "crossws": "^0.3.5", - "defu": "^6.1.4", + "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.2", + "node-mock-http": "^1.0.4", "radix3": "^1.1.2", - "ufo": "^1.6.1", + "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, @@ -4589,28 +5167,23 @@ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/i18next": { @@ -5391,9 +5964,10 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -6169,9 +6743,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -6190,15 +6764,19 @@ } }, "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/minipass": { @@ -6210,9 +6788,10 @@ } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -6220,20 +6799,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -6500,9 +7065,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -6656,12 +7221,12 @@ } }, "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -7069,9 +7634,10 @@ } }, "node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, @@ -7083,33 +7649,42 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" } }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/scheduler": { "version": "0.26.0", @@ -7126,25 +7701,29 @@ } }, "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/server-destroy": { @@ -7263,9 +7842,9 @@ "license": "MIT" }, "node_modules/smol-toml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", - "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -7449,9 +8028,9 @@ } }, "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "license": "MIT", "dependencies": { "commander": "^11.1.0", @@ -7460,7 +8039,7 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.4.1" + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo.js" @@ -7492,15 +8071,15 @@ } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -7645,9 +8224,9 @@ } }, "node_modules/ufo": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz", - "integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, "node_modules/ultrahtml": { @@ -7686,9 +8265,9 @@ } }, "node_modules/unifont": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.1.tgz", - "integrity": "sha512-0lg9M1cMYvXof8//wZBq6EDEfbwv4++t7+dYpXeS2ypaLuZJmUFYEwTm412/1ED/Wfo/wyzSu6kNZEr9hgRNfg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", "license": "MIT", "dependencies": { "css-tree": "^3.1.0", @@ -7840,19 +8419,19 @@ } }, "node_modules/unstorage": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz", - "integrity": "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -7861,14 +8440,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -7936,10 +8515,13 @@ } }, "node_modules/unstorage/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/update-browserslist-db": { "version": "1.1.3", @@ -8038,9 +8620,9 @@ } }, "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", diff --git a/src/components/XahauRoadmap.astro b/src/components/XahauRoadmap.astro new file mode 100644 index 0000000..b957c4a --- /dev/null +++ b/src/components/XahauRoadmap.astro @@ -0,0 +1,479 @@ +--- +/** + * XahauRoadmap.astro + * + * Single-source-of-truth roadmap chart. Reads src/data/roadmap.json, + * renders statically at build time. No runtime JS. + * + * Usage (in a .astro page): + * + * --- + * import XahauRoadmap from "@/components/XahauRoadmap.astro"; + * // Starlight / Astro i18n: the current locale is on Astro.currentLocale + * --- + * + * + * To add/edit/delete an item: edit src/data/roadmap.json and commit. That's it. + */ + +import roadmap from "../data/roadmap.json"; +import { roadmapSchema, type RoadmapItem } from "../schemas/roadmap"; + +interface Props { + /** BCP-47 locale key — must match a key under `labels` in roadmap.json */ + lang?: string; + /** Override the start quarter (ISO date). Otherwise uses meta.window. */ + startDate?: string; + /** + * Visual theme. "dark" (default) renders the original dark panel. + * "light" renders the roadmap on a white surface to match a light site. + * Swap by changing `theme` in the page — rollback is one word. + */ + theme?: "dark" | "light"; +} + +const { lang: langProp, startDate, theme = "dark" } = Astro.props; + +// --- Parse & validate ------------------------------------------------------- +const data = roadmapSchema.parse(roadmap); +const defaultLocale = data.meta.i18n.defaultLocale; +const lang = + langProp && data.labels[langProp] ? langProp : defaultLocale; + +const labels = data.labels[lang] ?? data.labels[defaultLocale]; + +// --- Helpers ---------------------------------------------------------------- +const tr = (v: unknown): string => { + if (typeof v === "string") return v; + if (v && typeof v === "object") { + const rec = v as Record; + return rec[lang] ?? rec[defaultLocale] ?? Object.values(rec)[0] ?? ""; + } + return ""; +}; + +const qToIdx = (q: string) => { + const [y, qx] = q.split("-Q"); + return Number(y) * 4 + (Number(qx) - 1); +}; +const idxToQ = (i: number) => ({ + q: `Q${(i % 4) + 1}`, + y: String(Math.floor(i / 4)), + id: `${Math.floor(i / 4)}-Q${(i % 4) + 1}`, +}); + +// Current-quarter detection (build-time) +const nowIdx = (() => { + const d = new Date(); + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3); +})(); + +// Window resolution +const win = data.meta.window; +const startIdx = (() => { + if (startDate) { + const d = new Date(startDate); + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3); + } + if (win.mode === "manual" && win.start) { + const d = new Date(win.start); + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3); + } + return nowIdx; // auto: start at current quarter +})(); +const QCOUNT = 6; +const quarters = Array.from({ length: QCOUNT }, (_, i) => idxToQ(startIdx + i)); + +// Resolve how many quarters an item covers, honouring (in order): +// openEnded → stretches to the end of the visible window +// endQuarter → explicit end (inclusive) +// span → count of quarters +// The returned span is clamped to the visible window. +const resolveSpan = (item: RoadmapItem): number => { + const startCol = qToIdx(item.quarter); + if (item.openEnded) { + return Math.max(1, startIdx + QCOUNT - startCol); + } + if (item.endQuarter) { + const endCol = qToIdx(item.endQuarter); + return Math.max(1, endCol - startCol + 1); + } + return item.span ?? 1; +}; + +// An item is "in window" if any part of its span overlaps the visible window. +const inWindow = (item: RoadmapItem) => { + const startCol = qToIdx(item.quarter); + const endCol = startCol + resolveSpan(item) - 1; + return endCol >= startIdx && startCol < startIdx + QCOUNT; +}; + +// Return { col, span } in 1-based CSS grid coordinates, clipped to the window. +const gridPos = (item: RoadmapItem) => { + const startCol = qToIdx(item.quarter); + const rawSpan = resolveSpan(item); + const clippedStart = Math.max(startCol, startIdx); + const clippedEnd = Math.min(startCol + rawSpan - 1, startIdx + QCOUNT - 1); + return { + col: clippedStart - startIdx + 1, + span: clippedEnd - clippedStart + 1, + clippedStart: clippedStart > startCol, // started before window + }; +}; + +const techItems = data.items.filter((i) => i.lane === "tech" && inWindow(i)); +const rolloutItems = data.items.filter( + (i) => i.lane === "rollout" && inWindow(i), +); + +// KPIs +const kpiFeatures = techItems.length; +const kpiRollouts = rolloutItems.length; +--- + +
+
+
+
+

{labels.title}

+

{labels.subtitle}

+
+
+
+ + + {quarters[0].q} {quarters[0].y} → {quarters[QCOUNT - 1].q} {quarters[QCOUNT - 1].y} + + {labels.updated} · {data.meta.updated} +
+
+ +
+

+

+
{kpiRollouts}{labels.kpis.rollouts}
+
{QCOUNT}{labels.kpis.quarters}
+
{kpiFeatures}{labels.kpis.features}
+
+
+ +
+ +
+ {quarters.map((q) => ( +
+ {q.q} + {q.y} +
+ ))} +
+ + +
+ + {rolloutItems.map((it) => { + const p = gridPos(it); + const classes = [ + "xr-roll", + `status-${it.status}`, + p.span > 1 ? "is-span" : "", + it.openEnded ? "is-openended" : "", + p.clippedStart ? "is-clipstart" : "", + ].filter(Boolean).join(" "); + return ( +
+ {it.tag &&
{tr(it.tag)}
} +
{tr(it.title)}
+ {it.description &&
{tr(it.description)}
} + +
+ ); + })} +
+ + + + + +
+ + {techItems.map((it) => { + const p = gridPos(it); + const classes = [ + "xr-feat", + `status-${it.status}`, + p.span > 1 ? "is-span" : "", + it.openEnded ? "is-openended" : "", + p.clippedStart ? "is-clipstart" : "", + ].filter(Boolean).join(" "); + return ( +
+ + {it.tag &&
{tr(it.tag)}
} +
{tr(it.title)}
+ {it.description &&
{tr(it.description)}
} +
+ ); + })} +
+
+ +
+ {labels.philosophy.map((p) => ( +
+
{p.t}
+
{p.v}
+
+ ))} +
+ +
+ {labels.legend.feature} + {labels.legend.live} + {labels.legend.pilot} + {labels.legend.partnership} + {labels.legend.launch} +
+ +
+ {labels.foot} +
+
+ + diff --git a/src/data/roadmap.json b/src/data/roadmap.json new file mode 100644 index 0000000..d20a250 --- /dev/null +++ b/src/data/roadmap.json @@ -0,0 +1,432 @@ +{ + "$comment": "Xahau roadmap source of truth. Edit this file to add/update/remove items. Committed JSON is rendered at build time by src/components/XahauRoadmap.astro — no runtime JS required.", + + "meta": { + "updated": "2026-04-17", + "window": { + "mode": "auto", + "$comment_mode": "'auto' = current quarter + next 5. 'manual' = use the `start` field below.", + "start": null, + "$comment_start": "ISO date e.g. '2026-04-01', or null. Ignored when mode=auto." + }, + "i18n": { + "defaultLocale": "en", + "locales": ["en", "es"] + } + }, + + "labels": { + "en": { + "title": "Xahau Roadmap", + "subtitle": "Enterprise network with minimal feature additions, maximal reliability", + "statement": "Xahau is an Enterprise Grade Layer-1 Blockchain. Protocol changes are deliberate and few. Most of the work is in rollouts: audits, integrations and partnerships that put the network in the hands of real users. Items listed here are indicative and subject to change. This roadmap currently only covers core development and activities shared by INFTF.", + "kpis": { + "features": "new protocol features", + "quarters": "quarters ahead", + "rollouts": "rollout milestones" + }, + "laneTech": "Protocol features", + "laneRollout": "Rollouts & deployments", + "now": "NOW", + "updated": "updated", + "philosophy": [ + { + "t": "Posture", + "v": "Enterprise-grade - change is deliberate, tested, and reversible before live." + }, + { + "t": "New features", + "v": "Only what users/enterprises genuinely need." + }, + { + "t": "Focus", + "v": "Rollouts, corridors and partnerships - putting Xahau to work." + }, + { + "t": "Open", + "v": "Transparent amendment process, public audits, open standards." + } + ], + "legend": { + "feature": "Protocol feature", + "live": "Live", + "pilot": "Pilot", + "partnership": "Partnership", + "launch": "Launch / public good" + }, + "foot": "Directional - subject to change - xahau.network" + }, + "es": { + "title": "Hoja de ruta de Xahau", + "subtitle": "Red empresarial con adiciones mínimas de funciones, máxima fiabilidad", + "statement": "Xahau es una Blockchain Layer-1 de Grado Empresarial. Los cambios de protocolo son deliberados y escasos. La mayor parte del trabajo está en los despliegues: auditorías, integraciones y alianzas que ponen la red en manos de usuarios reales.", + "kpis": { + "features": "nuevas funciones de protocolo", + "quarters": "trimestres por delante", + "rollouts": "hitos de despliegue" + }, + "laneTech": "Funciones de protocolo", + "laneRollout": "Despliegues y puestas en marcha", + "now": "AHORA", + "updated": "actualizado", + "philosophy": [ + { + "t": "Postura", + "v": "Grado empresarial - cambios deliberados, probados y reversibles antes del despliegue." + }, + { + "t": "Nuevas funciones", + "v": "Solo lo que usuarios/empresas realmente necesitan. Hoy: RNG y AMM." + }, + { + "t": "Enfoque", + "v": "Despliegues, corredores y alianzas - poniendo Xahau a trabajar." + }, + { + "t": "Apertura", + "v": "Proceso de enmiendas transparente, auditorías públicas, estándares abiertos." + } + ], + "legend": { + "feature": "Función de protocolo", + "live": "En vivo", + "pilot": "Piloto", + "partnership": "Alianza", + "launch": "Lanzamiento / bien público" + }, + "foot": "Orientativo - sujeto a cambios - xahau.network" + } + }, + + "items": [ + { + "id": "rng", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "endQuarter": "2026-Q2", + "tag": { + "en": "Feature · in beta development", + "es": "Función · en desarrollo beta" + }, + "title": { + "en": "Random Number Generator", + "es": "Generador de números aleatorios" + }, + "description": { + "en": "Native on-ledger RNG primitive — verifiable, tamper-resistant randomness for Hooks and applications.", + "es": "Primitiva RNG nativa en el ledger — aleatoriedad verificable y resistente a manipulación para Hooks y aplicaciones." + } + }, + { + "id": "export", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q3", + "endQuarter": "2026-Q4", + "tag": { + "en": "Feature · in development", + "es": "Función · en desarrollo" + }, + "title": { "en": "FeatureExport", "es": "FeatureExport" } + }, + { + "id": "amm", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "span": 2, + "tag": { + "en": "Feature · ready for amendment", + "es": "Función · lista para enmienda" + }, + "title": { "en": "AMM", "es": "AMM" }, + "description": { + "en": "Automated Market Maker primitive for deep native liquidity on the Xahau DEX. Merged into the xahaud dev branch, awaiting amendment vote.", + "es": "Primitiva Automated Market Maker para liquidez nativa profunda en el DEX de Xahau. Integrada en la rama dev de xahaud, a la espera de la votación de enmienda." + } + }, + { + "id": "price-oracle", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "span": 2, + "tag": { + "en": "Feature · ready for amendment", + "es": "Función · lista para enmienda" + }, + "title": { "en": "PriceOracle", "es": "PriceOracle" }, + "description": { + "en": "Native on-ledger price feed primitive — tamper-resistant asset prices for DeFi, AMM and Hooks. Merged into the xahaud dev branch, awaiting amendment vote.", + "es": "Primitiva nativa de precios en el ledger — precios de activos resistentes a manipulación para DeFi, AMM y Hooks. Integrada en la rama dev de xahaud, a la espera de la votación de enmienda." + } + }, + { + "id": "iou-reward-claim", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "endQuarter": "2026-Q3", + "tag": { + "en": "Feature · in development", + "es": "Función · en desarrollo" + }, + "title": { "en": "IOURewardClaim", "es": "IOURewardClaim" }, + "description": { + "en": "Extends the current RewardClaim for XAH to make it available for IOU tokens as well — letting projects use Hooks to distribute rewards based on a user's token holdings.", + "es": "Extiende el RewardClaim actual de XAH para ofrecerlo también a tokens IOU — permitiendo a los proyectos usar Hooks para distribuir recompensas según las tenencias de tokens de un usuario." + } + }, + { + "id": "named-hook", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q3", + "endQuarter": "2026-Q4", + "tag": { + "en": "Feature · in development", + "es": "Función · en desarrollo" + }, + "title": { "en": "NamedHook", "es": "NamedHook" }, + "description": { + "en": "Allows names to be set to identify Hooks, so different Hooks can be invoked even within the same transaction type.", + "es": "Permite asignar nombres para identificar Hooks, de modo que se puedan invocar diferentes Hooks incluso dentro del mismo tipo de transacción." + } + }, + { + "id": "audit-optimisations", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "openEnded": true, + "tag": { + "en": "Ongoing · audits + optimisations", + "es": "Continuo · auditorías y optimizaciones" + }, + "title": { + "en": "Audit & optimisations", + "es": "Auditorías y optimizaciones" + }, + "description": { + "en": "Continuous security audits and performance work across the protocol, Hooks and tooling.", + "es": "Auditorías de seguridad y trabajo de rendimiento continuos en el protocolo, Hooks y herramientas." + } + }, + + { + "id": "coopbank-eur", + "lane": "rollout", + "status": "live", + "quarter": "2026-Q2", + "openEnded": false, + "span": 2, + "tag": { "en": "Live · remittance", "es": "En vivo · remesas" }, + "title": { + "en": "COOP Bank EUR corridor scale-up to entire country.", + "es": "Escalado del corredor EUR de COOP Bank a todo el país." + }, + "description": { + "en": "InFTF × Cooperative Bank of Oromia growing EUR → ETB volume.", + "es": "InFTF × Cooperative Bank of Oromia aumentando el volumen EUR → ETB." + } + }, + { + "id": "stablecoinUSD", + "lane": "rollout", + "status": "partnership", + "quarter": "2026-Q2", + "endQuarter": "2026-Q3", + "tag": { "en": "Launch", "es": "Lanzamiento" }, + "title": { + "en": "USD stablecoin on Xahau", + "es": "Stablecoin USD en Xahau" + }, + "description": { + "en": "Addition of compliant USD stablecoin", + "es": "Incorporación de una stablecoin USD que cumple con la normativa." + } + }, + { + "id": "stablecoinOthers", + "lane": "rollout", + "status": "partnership", + "quarter": "2026-Q4", + "openEnded": true, + "tag": { "en": "Launch", "es": "Lanzamiento" }, + "title": { + "en": "Currencies from multiple countries on Xahau", + "es": "Divisas de múltiples países en Xahau" + }, + "description": { + "en": "Addition of regulated currencies from multiple countries", + "es": "Incorporación de divisas reguladas de múltiples países." + } + }, + { + "id": "stablecoinGBP", + "lane": "rollout", + "status": "partnership", + "quarter": "2026-Q3", + "endQuarter": "2026-Q4", + "tag": { "en": "Launch", "es": "Lanzamiento" }, + "title": { + "en": "GBP stablecoin on Xahau", + "es": "Stablecoin GBP en Xahau" + }, + "description": { + "en": "Addition of compliant GBP stablecoin", + "es": "Incorporación de una stablecoin GBP que cumple con la normativa." + } + }, + { + "id": "usd-corridor", + "lane": "rollout", + "status": "pilot", + "quarter": "2026-Q3", + "endQuarter": "2026-Q4", + "tag": { "en": "Pilot", "es": "Piloto" }, + "title": { "en": "USD corridor pilot", "es": "Piloto del corredor USD" }, + "description": { + "en": "Second fiat corridor (USD → ETB) opens to selected diaspora markets.", + "es": "Un segundo corredor fiat (USD → ETB) se abre a mercados de diáspora seleccionados." + } + }, + { + "id": "bank-partners", + "lane": "rollout", + "status": "partnership", + "quarter": "2026-Q4", + "openEnded": true, + "tag": { "en": "Partnerships", "es": "Alianzas" }, + "title": { + "en": "Additional bank & RSP partners", + "es": "Bancos y socios RSP adicionales" + }, + "description": { + "en": "New regulated remittance partners across East & West Africa.", + "es": "Nuevos socios de remesas regulados en África Oriental y Occidental." + } + }, + { + "id": "corridor-ga", + "lane": "rollout", + "status": "live", + "quarter": "2027-Q1", + "span": 1, + "tag": { "en": "GA · remittance", "es": "GA · remesas" }, + "title": { + "en": "Corridor expansion · GA", + "es": "Expansión de corredores · GA" + }, + "description": { + "en": "Additional diaspora corridors graduate from pilot to production.", + "es": "Corredores adicionales de diáspora pasan de piloto a producción." + } + }, + { + "id": "merchant-pilot", + "lane": "rollout", + "status": "pilot", + "quarter": "2027-Q2", + "endQuarter": "2027-Q3", + "tag": { "en": "Pilot · payments", "es": "Piloto · pagos" }, + "title": { + "en": "Merchant settlement pilot", + "es": "Piloto de liquidación para comercios" + }, + "description": { + "en": "Stablecoin settlement with Hooks-based compliance for merchants.", + "es": "Liquidación con stablecoins y cumplimiento basado en Hooks para comercios." + } + }, + + { + "id": "enterprise-ga", + "lane": "rollout", + "status": "partnership", + "quarter": "2027-Q3", + "openEnded": true, + "tag": { "en": "Enterprise", "es": "Empresarial" }, + "title": { + "en": "Enterprise settlement GA", + "es": "GA de liquidación empresarial" + }, + "description": { + "en": "Production offering for regulated partners, built on audited Hooks components.", + "es": "Oferta de producción para socios regulados, construida sobre componentes Hooks auditados." + } + }, + + { + "id": "ngo-donations", + "lane": "rollout", + "status": "launch", + "quarter": "2026-Q4", + "openEnded": true, + "tag": { + "en": "Launch · public good", + "es": "Lanzamiento · bien público" + }, + "title": { + "en": "NGO donation platform", + "es": "Plataforma de donaciones para ONG" + }, + "description": { + "en": "Multi-currency, on-ledger donations for NGOs and public-good initiatives.", + "es": "Donaciones multimoneda en el ledger para ONG e iniciativas de bien público." + } + }, + + { + "id": "xahau-connect", + "lane": "rollout", + "status": "launch", + "quarter": "2026-Q2", + "openEnded": true, + "tag": { "en": "Event · quarterly", "es": "Evento · trimestral" }, + "title": { "en": "Xahau Connect", "es": "Xahau Connect" }, + "description": { + "en": "Recurring community + ecosystem event, held once each quarter.", + "es": "Evento recurrente de comunidad y ecosistema, celebrado una vez por trimestre." + } + }, + { + "id": "inftf-event", + "lane": "rollout", + "status": "launch", + "quarter": "2026-Q4", + "tag": { + "en": "Event · enterprise + devs", + "es": "Evento · empresas y desarrolladores" + }, + "title": { "en": "InFTF event", "es": "Evento InFTF" }, + "description": { + "en": "InFTF event bringing enterprise partners and developers together.", + "es": "Evento InFTF que reúne a socios empresariales y desarrolladores." + } + } + ], + + "$commentedItems": { + "$comment": "Items kept on file but currently hidden from the rendered roadmap. Move entries back into `items` to re-enable. This key is stripped by the Zod schema so nothing here is rendered or validated.", + "items": [ + { + "id": "tipbot", + "lane": "rollout", + "status": "pilot", + "quarter": "2026-Q2", + "endQuarter": "2026-Q3", + "tag": { + "en": "Testing Q2 · Live Q3", + "es": "Pruebas Q2 · En vivo Q3" + }, + "title": { "en": "TipBot", "es": "TipBot" }, + "description": { + "en": "Non-custodial tipping bot built on Hooks, integrated with social media platforms. Testing in Q2, live in Q3.", + "es": "Bot de propinas no custodial basado en Hooks, integrado con redes sociales. Pruebas en Q2, lanzamiento en Q3." + } + } + ] + } +} diff --git a/src/pages/[...lang]/roadmap.astro b/src/pages/[...lang]/roadmap.astro new file mode 100644 index 0000000..315ea7d --- /dev/null +++ b/src/pages/[...lang]/roadmap.astro @@ -0,0 +1,46 @@ +--- +/** + * /roadmap (default locale) and /es/roadmap (Spanish) via Astro native i18n. + * + * Uses BaseLayout directly (instead of PageLayout) so the site header, + * footer, and cookie consent stay consistent without rendering a duplicate + * visible page heading — the XahauRoadmap component supplies its own title. + * Tailwind/site styles are pulled in explicitly via main.css. + */ + +import "../../styles/main.css"; +import BaseLayout from "../../layouts/BaseLayout.astro"; +import XahauRoadmap from "../../components/XahauRoadmap.astro"; + +// Static paths for every configured locale. +export function getStaticPaths() { + return [ + { params: { lang: undefined } }, // default locale at /roadmap + { params: { lang: "es" } }, // /es/roadmap + ]; +} + +const lang = Astro.currentLocale ?? (Astro.params.lang as string | undefined) ?? "en"; + +// Frontmatter is only used for meta (title/description) — no visible H1. +const frontmatterByLang: Record = { + en: { + title: "Roadmap", + description: "Xahau's roadmap across the upcoming quarters", + }, + es: { + title: "Hoja de ruta", + description: "La hoja de ruta de Xahau para los próximos trimestres", + }, +}; + +const frontmatter = frontmatterByLang[lang] ?? frontmatterByLang.en; +--- + + +
+
+ +
+
+
diff --git a/src/pages/es/roadmap.mdx b/src/pages/es/roadmap.mdx deleted file mode 100644 index bf3cebd..0000000 --- a/src/pages/es/roadmap.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Hoja de ruta -description: Este año, la Red Xahau tiene previsto recibir potentes actualizaciones en escalabilidad, accesibilidad, seguridad e innovación ---- -import PageLayout from '../../layouts/PageLayout.astro'; -import PageSection from '../../components/PageSection.astro'; -import roadmap from '../../assets/roadmap_2025.jpeg' -import { Image } from 'astro:assets'; - - - - -Hoja de ruta de Xahau 2025 - -# H1 2025 - -## 1. Proyecto "L10K" - -Mejorar la eficiencia de la tecnología central para aumentar la capacidad de transacciones a 10.000 transacciones por ledger, mejorando la eficiencia y la seguridad. - -¡Un hito en el rendimiento para el ecosistema Xahau! - -## 2. Mejorar la Monitorización UDP y RPC - -Las funciones de monitorización sin conexión y RPC para los operadores de nodos optimizan el rendimiento y la escalabilidad en toda la red. - -Permite una monitorización pasiva y eficiente de entornos de uno o varios nodos, reduciendo significativamente la sobrecarga. - -## 3. Nuevas Características Finalizadas (Remarks, Touch, Blackhole, DataMonitor) - -Completar el desarrollo e integración de estas características de vanguardia, mejorando la interacción con Xahau tanto para desarrolladores como para usuarios finales a través de productos construidos por desarrolladores. - -## 4. Soporte Completo de Ledger Hardware Wallet para Xahau - -Garantizar transacciones seguras y simplificadas de Xahau con compatibilidad con Ledger Hardware Wallet, abriendo la accesibilidad a Xahau a nivel mundial. - -## 5. Acceso a Exchanges y Plataformas On/Off-Ramp - -Se prevé que Xahau sea más accesible a través de exchanges y plataformas on/off-ramp, apoyando una mayor participación e integración dentro del ecosistema. - -## 6. Soporte para LedgerLive - -Integración de Xahau con Ledger Live, permitiendo un acceso y gestión sencillos mediante el popular producto Ledger Live. - -## 7. Marco Universal de Explicación de Hooks Integrable - -Permitir que cualquier wallet integre fácilmente una explicación clara de la influencia de los Hooks en las transacciones (web, móvil, escritorio) con imágenes claras e integradas para transacciones HookSet, garantizando una adopción más sencilla. - -# H2 2025 - -## 8. Implementación de JavaScript Hooks - -Pendiente de aprobación de auditoría, llevar los Hooks basados en JavaScript y sus herramientas a decenas de millones de desarrolladores de todo el mundo para desarrollar con Xahau lógica avanzada on-chain y capacidades de transacciones programables. - -## 9. Auditorías Completas y Controles de Seguridad - -Completar las auditorías de todas las principales características de 2025 para demostrar la seguridad y estabilidad de la red, proporcionando una garantía verificable al mundo a medida que nos adentramos en 2026. - -## 10. Mejora de la Experiencia de Usuario - -Guiados por los comentarios recibidos, el ecosistema Xahau tiene previsto garantizar una integración y usabilidad fluidas en todas las wallets y aplicaciones. - -## 11. Implementación de Batch - -Habilitar verificaciones eficientes de múltiples transacciones, garantizando que todas o ninguna de las transacciones ocurran, a la vez que se permite a los proveedores de servicios incorporar operaciones específicas del flujo de trabajo de forma fluida en el flujo de transacciones. - -**2025 es el año en que Xahau se vuelve más fácil de acceder, usar, aprovechar y construir, mientras escala de forma más inteligente, rápida y sólida.** - - diff --git a/src/pages/ja/roadmap.mdx b/src/pages/ja/roadmap.mdx deleted file mode 100644 index bf1ff87..0000000 --- a/src/pages/ja/roadmap.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: ロードマップ -description: 今年、Xahauネットワークはスケーラビリティ、アクセシビリティ、セキュリティ、イノベーションにわたる強力なアップデートを予定しています ---- -import PageLayout from '../../layouts/PageLayout.astro'; -import PageSection from '../../components/PageSection.astro'; -import roadmap from '../../assets/roadmap_2025.jpeg' -import { Image } from 'astro:assets'; - - - - -Xahau 2025 ロードマップ - -# H1 2025 - -## 1. プロジェクト「L10K」 - -コア技術の効率を改善し、レジャーあたりの取引容量を10,000トランザクションに増加させ、効率性とセキュリティを向上させます。 - -Xahauエコシステムにとってパフォーマンスのマイルストーン! - -## 2. UDPモニタリングとRPCの改善 - -ノードオペレーター向けのコネクションレスモニタリングとRPC機能により、ネットワーク全体のパフォーマンスとスケーラビリティを最適化します。 - -単一または複数ノード環境の効率的なパッシブモニタリングを可能にし、オーバーヘッドを大幅に削減します。 - -## 3. 新機能の最終化(Remarks、Touch、Blackhole、DataMonitor) - -これらの最先端機能の開発と統合を完成させ、開発者および開発者が構築した製品を通じてエンドユーザーのXahauとの対話を改善します。 - -## 4. XahauのLedgerハードウェアウォレット完全サポート - -Ledgerハードウェアウォレットとの互換性によりXahauの安全で合理的な取引を確保し、世界中でXahauへのアクセシビリティを開きます。 - -## 5. 取引所とOn/Off-Rampアクセス - -Xahauは取引所とOn/Off-Rampプラットフォームを通じてよりアクセスしやすくなり、エコシステム内でのより広範な参加と統合をサポートすることを目指しています。 - -## 6. LedgerLiveサポート - -Ledger LiveとのXahau統合により、人気のLedger Live製品を使用した簡単なアクセスと管理を可能にします。 - -## 7. ユニバーサル埋め込み可能なHook説明フレーム - -HookSet取引の明確な統合されたビジュアルで、Hooksがトランザクションに与える影響の明確な説明を任意のウォレット(ウェブ、モバイル、デスクトップ)に簡単に統合できるようにし、より容易な採用を確保します。 - -# H2 2025 - -## 8. JavaScriptフック実装 - -監査承認待ちで、JavaScriptベースのHooksとツールを世界中の何千万もの開発者にもたらし、高度なオンチェーンロジックとプログラマブルなトランザクション機能のためにXahauを使用した開発を可能にします。 - -## 9. 包括的な監査とセキュリティチェック - -2025年のすべての主要機能の監査を完了し、ネットワークのセキュリティと安定性を示し、2026年に向けて世界に検証可能な保証を提供します。 - -## 10. ユーザーエクスペリエンスの改善 - -フィードバックに導かれ、Xahauエコシステムはすべてのウォレットとアプリケーションにわたるシームレスな統合と使いやすさを確保します。 - -## 11. バッチ実装 - -効率的なマルチトランザクション検証を可能にし、すべてまたは何も取引が発生しないことを確保しながら、サービスプロバイダーがワークフロー固有の操作をトランザクションフローにシームレスに組み込むことを可能にします。 - -**2025年は、Xahauがよりスマートに、より速く、より強くスケールしながら、アクセス、使用、活用、構築がより容易になる年です。** - - diff --git a/src/pages/roadmap.mdx b/src/pages/roadmap.mdx deleted file mode 100644 index 93f81f0..0000000 --- a/src/pages/roadmap.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Roadmap -description: This year, Xahau Network intends to receive powerful updates across scalability, accessibility, security, and innovation ---- -import PageLayout from '../layouts/PageLayout.astro'; -import PageSection from '../components/PageSection.astro'; -import roadmap from '../assets/roadmap_2025.jpeg' -import { Image } from 'astro:assets'; - - - - -Xahau roadmap 2025 - -# H1 2025 - -## 1. Project "L10K" - -Improve core technology efficiency to boost transaction capacity to 10,000 transactions per ledger for better efficiency and security. - -A milestone in performance for the Xahau ecosystem! - -## 2. Improve UDP Monitoring & RPC - -Connection-less monitoring and RPC features for node operators optimize performance and scalability across the network. - -Allowing for efficient, passive monitoring of single or multi-node environments - significantly reducing the overhead. - -## 3. Finalized New Features (Remarks, Touch, Blackhole, DataMonitor) - -Complete development and integration of these cutting-edge features, improving interaction with Xahau for developers as well as end-users through products built by developers. - -## 4. Ledger Hardware Wallet Full Support for Xahau - -Ensure secure, streamlined Xahau transactions with Ledger Hardware Wallet compatibility, opening up accessibility to Xahau worldwide. - -## 5. Exchange and On/Off-Ramp Access - -Xahau is intended to become more accessible through exchanges and on/off-ramp platforms, supporting broader participation and integration within the ecosystem. - -## 6. LedgerLive Support - -Xahau integration with Ledger Live, enabling easy access and management using the popular Ledger Live product. - -## 7. Universal Embeddable Hook Explainer Frame - -Allowing any wallet to easily integrate a clear explanation of the influence of Hooks on transactions (web, mobile, desktop) with clear, integrated visuals for HookSet transactions, ensuring easier adoption. - -# H2 2025 - -## 8. JavaScript Hooks Implementation - -Pending audit approval, bring JavaScript-based Hooks and tooling to tens of millions of developers around the world to develop using Xahau for advanced on-chain logic and programmable transaction capabilities. - -## 9. Comprehensive Audits & Security Checks - -Complete audits for all major 2025 features to demonstrate the security and stability of the network, providing verifiable assurance to the world as we head into 2026. - -## 10. Improved User Experience - -Guided by feedback, the Xahau ecosystem is set to ensure seamless integration and usability across all wallets and applications. - -## 11. Batch Implementation - -Enable efficient multi-transaction verifications, ensuring either all or no transactions occur while allowing service providers to incorporate workflow-specific operations seamlessly into the transaction flow. - -**2025 is the year Xahau becomes easier to access, use, leverage, and build on while scaling smarter, faster, and stronger.** - - \ No newline at end of file diff --git a/src/schemas/roadmap.ts b/src/schemas/roadmap.ts new file mode 100644 index 0000000..a42ac20 --- /dev/null +++ b/src/schemas/roadmap.ts @@ -0,0 +1,89 @@ +import { z } from "astro:content"; + +/** + * Schema for src/data/roadmap.json. + * Keep this in sync with the JSON file — if you add a field there, add it here. + * + * Used by XahauRoadmap.astro (build-time validation) and optionally by a + * Content Collection if you ever promote the JSON to `src/content/`. + */ + +const localized = z + .union([z.string(), z.record(z.string(), z.string())]) + .transform((v) => (typeof v === "string" ? { en: v } : v)); + +export const quarterId = z + .string() + .regex(/^\d{4}-Q[1-4]$/, "Quarter must look like '2026-Q2'"); + +export const roadmapItem = z.object({ + id: z.string().min(1), + lane: z.enum(["tech", "rollout"]), + status: z.enum([ + "feature", + "live", + "pilot", + "partnership", + "launch", + ]), + // Start quarter (required). + quarter: quarterId, + // How many quarters the activity covers, starting from `quarter`. Defaults to 1. + span: z.number().int().min(1).max(6).default(1), + // Alternative to `span`: an explicit end quarter (inclusive). Takes precedence if set. + endQuarter: quarterId.optional(), + // Ongoing activity with no firm end date. Stretches to the end of the visible + // window and renders a "continues" indicator. Overrides `span`/`endQuarter`. + openEnded: z.boolean().optional().default(false), + tag: localized.optional(), + title: localized, + description: localized.optional(), + link: z.string().url().optional(), +}); + +export const roadmapLabels = z.object({ + title: z.string(), + subtitle: z.string(), + statement: z.string(), + kpis: z.object({ + features: z.string(), + quarters: z.string(), + rollouts: z.string(), + }), + laneTech: z.string(), + laneRollout: z.string(), + now: z.string(), + updated: z.string(), + philosophy: z + .array(z.object({ t: z.string(), v: z.string() })) + .min(1) + .max(6), + legend: z.object({ + feature: z.string(), + live: z.string(), + pilot: z.string(), + partnership: z.string(), + launch: z.string(), + }), + foot: z.string(), +}); + +export const roadmapSchema = z.object({ + meta: z.object({ + updated: z.string(), + window: z.object({ + mode: z.enum(["auto", "manual"]).default("auto"), + start: z.string().nullable().default(null), + }), + i18n: z.object({ + defaultLocale: z.string(), + locales: z.array(z.string()).min(1), + }), + }), + labels: z.record(z.string(), roadmapLabels), + items: z.array(roadmapItem), +}); + +export type Roadmap = z.infer; +export type RoadmapItem = z.infer; +export type RoadmapLabels = z.infer; From 22a22ad939e0626cb0231a00b645c154cb810e6a Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Sat, 18 Apr 2026 15:55:54 +0300 Subject: [PATCH 02/19] Mobile for roadmap --- src/components/XahauRoadmap.astro | 112 +++++++++++++++++++++++++++++- src/data/roadmap.json | 20 +++++- 2 files changed, 128 insertions(+), 4 deletions(-) diff --git a/src/components/XahauRoadmap.astro b/src/components/XahauRoadmap.astro index b957c4a..cb9c2bb 100644 --- a/src/components/XahauRoadmap.astro +++ b/src/components/XahauRoadmap.astro @@ -129,6 +129,22 @@ const rolloutItems = data.items.filter( // KPIs const kpiFeatures = techItems.length; const kpiRollouts = rolloutItems.length; + +// Human-readable period label for mobile card badge (and screen readers). +// The horizontal timeline is hidden on small screens, so each card needs to +// carry its own quarter/year range inline. +const fmtItemPeriod = (item: RoadmapItem): string => { + const startCol = qToIdx(item.quarter); + const start = idxToQ(startCol); + if (item.openEnded) return `${start.q} ${start.y} →`; + let endCol = startCol; + if (item.endQuarter) endCol = qToIdx(item.endQuarter); + else if (item.span && item.span > 1) endCol = startCol + item.span - 1; + if (endCol === startCol) return `${start.q} ${start.y}`; + const end = idxToQ(endCol); + if (start.y === end.y) return `${start.q}–${end.q} ${start.y}`; + return `${start.q} ${start.y} → ${end.q} ${end.y}`; +}; ---
@@ -184,6 +200,7 @@ const kpiRollouts = rolloutItems.length; ].filter(Boolean).join(" "); return (
+ {it.tag &&
{tr(it.tag)}
}
{tr(it.title)}
{it.description &&
{tr(it.description)}
} @@ -221,6 +238,7 @@ const kpiRollouts = rolloutItems.length; return (
+ {it.tag &&
{tr(it.tag)}
}
{tr(it.title)}
{it.description &&
{tr(it.description)}
} @@ -464,14 +482,102 @@ const kpiRollouts = rolloutItems.length; .xr-foot { margin-top:18px; padding-top:14px; border-top:1px solid var(--line); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:11px; color:var(--ink-mute); } + /* Per-card quarter badge — hidden on desktop (timeline carries this info) + and shown on mobile where the horizontal arrow is collapsed. */ + .xr-q-badge { display:none; } + @media (max-width:1100px) { .xr-philosophy { grid-template-columns:repeat(2,1fr); } } - @media (max-width:720px) { - .xr-qgrid, .xr-lane { grid-template-columns:repeat(3,1fr); } + + /* Tablet breakpoint: drop to 3 visible columns but keep the timeline metaphor. */ + @media (max-width:900px) and (min-width:641px) { + .xr-qgrid, .xr-lane, .xr-dividers, .xr-arrow .grid, .xr-arrow .labels { + grid-template-columns:repeat(3,1fr); + } .xr-arrow { height:46px; } - /* Full-row stacking on mobile — span instructions would overflow 3 cols. */ + .xr-arrow .ql { font-size:10px; padding:0 10px; } .xr-lane .xr-feat, .xr-lane .xr-roll { grid-column: 1 / -1 !important; } .xr-dividers { display:none; } } + + /* --- Mobile (≤640px) ------------------------------------------------------ + The horizontal timeline metaphor does not survive narrow viewports, so at + phone widths we flip to a linear, stacked card list. The quarter header + row, arrow and column dividers are hidden; every card instead shows its + own period via the .xr-q-badge (populated at build time). */ + @media (max-width:640px) { + .xroadmap { padding:20px 16px 18px; border-radius:14px; } + .xroadmap h2 { font-size:22px; } + .xr-sub { font-size:12px; } + + .xr-head { gap:10px; margin-bottom:14px; } + .xr-meta { gap:6px; } + .xr-chip { font-size:10px; padding:4px 8px; } + + .xr-intro { padding:12px 14px; gap:12px; } + .xr-stmt { font-size:14px; line-height:1.45; } + .xr-kpis { gap:10px; margin-left:0; width:100%; justify-content:space-between; } + .xr-kpi { min-width:auto; flex:1; } + .xr-kpi .n { font-size:20px; } + .xr-kpi .l { font-size:9px; letter-spacing:0.1em; } + + .xr-wrap { padding:0; margin:12px 0 4px; } + .xr-qgrid, .xr-arrow, .xr-dividers { display:none !important; } + + /* Lanes collapse to a simple block list with a section heading derived + from the existing aria-label (so no extra markup is needed). */ + .xr-lane { display:block; padding:0 !important; min-height:0 !important; position:relative; margin-bottom:18px; } + .xr-lane.top, .xr-lane.bot { padding:0 !important; } + .xr-lane::before { + content:attr(aria-label); + display:block; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size:10px; letter-spacing:0.18em; text-transform:uppercase; + color:var(--ink-mute); + margin-bottom:10px; + } + + /* Cards become full-width blocks; drop peg/open-ended/clip glyphs that + only make sense against a horizontal timeline. */ + .xr-feat, .xr-roll { + display:block !important; + grid-column:auto !important; + width:auto; + margin:0 0 10px !important; + padding:12px 14px !important; + border-radius:10px !important; + } + .xr-feat .peg, .xr-roll .peg { display:none; } + .xr-feat.is-openended::after, .xr-roll.is-openended::after, + .xr-feat.is-clipstart::before, .xr-roll.is-clipstart::before { display:none; } + .xr-feat.is-openended, .xr-roll.is-openended { padding-right:14px; } + .xr-feat.is-clipstart, .xr-roll.is-clipstart { padding-left:14px; } + + /* Quarter badge → compact chip pinned to the top-right of each card. */ + .xr-q-badge { + display:inline-block; + float:right; + margin:0 0 4px 8px; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size:9.5px; letter-spacing:0.12em; + padding:3px 7px; border-radius:999px; + border:1px solid var(--line-2); + color:var(--ink-dim); + background:rgba(255,255,255,0.03); + } + .xroadmap.theme-light .xr-q-badge { + background:rgba(15,35,40,0.04); + color:#2a3439; + border-color:var(--line-2); + } + + .xr-feat .n, .xr-roll .n { font-size:15px; } + .xr-feat .d, .xr-roll .d { font-size:12.5px; } + + .xr-philosophy { grid-template-columns:1fr; gap:8px; margin-top:16px; } + .xr-legend { gap:10px 14px; font-size:11px; margin-top:14px; } + .xr-foot { font-size:10px; } + } + @media print { .xroadmap { background:#fff !important; color:#000 !important; border:none; box-shadow:none; } .xr-intro, .xr-phil, .xr-foot, .xr-chip { color:#000 !important; border-color:#ccc !important; } diff --git a/src/data/roadmap.json b/src/data/roadmap.json index d20a250..de69038 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -377,7 +377,25 @@ "es": "Donaciones multimoneda en el ledger para ONG e iniciativas de bien público." } }, - + { + "id": "on-off-ramp", + "lane": "rollout", + "status": "partnership", + "quarter": "2026-Q2", + "openEnded": true, + "tag": { + "en": "On-off ramps and XAH listings", + "es": "On-off ramps and XAH listings" + }, + "title": { + "en": "On and off ramps and token listing", + "es": "On and off ramps and token listing" + }, + "description": { + "en": "Work with multiple partners to enhance the ability to on and off ramp on Xahau", + "es": "Work with multiple partners to enhance the ability to on and off ramp on Xahau" + } + }, { "id": "xahau-connect", "lane": "rollout", From a9e47846a1c11ff7ee92e39148c71faf932b0fc6 Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Sat, 18 Apr 2026 16:00:59 +0300 Subject: [PATCH 03/19] json modification --- src/data/roadmap.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/data/roadmap.json b/src/data/roadmap.json index de69038..16b007a 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -59,7 +59,7 @@ "es": { "title": "Hoja de ruta de Xahau", "subtitle": "Red empresarial con adiciones mínimas de funciones, máxima fiabilidad", - "statement": "Xahau es una Blockchain Layer-1 de Grado Empresarial. Los cambios de protocolo son deliberados y escasos. La mayor parte del trabajo está en los despliegues: auditorías, integraciones y alianzas que ponen la red en manos de usuarios reales.", + "statement": "Xahau es una Blockchain Layer-1 de Grado Empresarial. Los cambios de protocolo son deliberados y escasos. La mayor parte del trabajo está en los despliegues: auditorías, integraciones y alianzas que ponen la red en manos de usuarios reales. Los elementos aquí listados son orientativos y están sujetos a cambios. Esta hoja de ruta cubre actualmente solo el desarrollo principal y las actividades compartidas por INFTF.", "kpis": { "features": "nuevas funciones de protocolo", "quarters": "trimestres por delante", @@ -76,7 +76,7 @@ }, { "t": "Nuevas funciones", - "v": "Solo lo que usuarios/empresas realmente necesitan. Hoy: RNG y AMM." + "v": "Solo lo que usuarios/empresas realmente necesitan." }, { "t": "Enfoque", @@ -300,8 +300,8 @@ "openEnded": true, "tag": { "en": "Partnerships", "es": "Alianzas" }, "title": { - "en": "Additional bank & RSP partners", - "es": "Bancos y socios RSP adicionales" + "en": "Additional bank & remittance partners", + "es": "Bancos y socios de remesas adicionales" }, "description": { "en": "New regulated remittance partners across East & West Africa.", @@ -385,15 +385,15 @@ "openEnded": true, "tag": { "en": "On-off ramps and XAH listings", - "es": "On-off ramps and XAH listings" + "es": "Rampas on/off y listados de XAH" }, "title": { "en": "On and off ramps and token listing", - "es": "On and off ramps and token listing" + "es": "Rampas de entrada y salida y listado del token" }, "description": { "en": "Work with multiple partners to enhance the ability to on and off ramp on Xahau", - "es": "Work with multiple partners to enhance the ability to on and off ramp on Xahau" + "es": "Colaboración con múltiples socios para ampliar las rampas de entrada y salida en Xahau." } }, { From 506cb1d9be4a67da05c57357b589b01b6083947f Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Sat, 18 Apr 2026 16:10:56 +0300 Subject: [PATCH 04/19] change updation date --- src/data/roadmap.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/roadmap.json b/src/data/roadmap.json index 16b007a..a2dc653 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -2,7 +2,7 @@ "$comment": "Xahau roadmap source of truth. Edit this file to add/update/remove items. Committed JSON is rendered at build time by src/components/XahauRoadmap.astro — no runtime JS required.", "meta": { - "updated": "2026-04-17", + "updated": "2026-04-18", "window": { "mode": "auto", "$comment_mode": "'auto' = current quarter + next 5. 'manual' = use the `start` field below.", From 41d6993b24e8df03471f71c950fcb79e1ec315d3 Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Sun, 19 Apr 2026 07:56:36 +0300 Subject: [PATCH 05/19] Changes to items --- src/data/roadmap.json | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/src/data/roadmap.json b/src/data/roadmap.json index a2dc653..d1c3dae 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -118,18 +118,6 @@ "es": "Primitiva RNG nativa en el ledger — aleatoriedad verificable y resistente a manipulación para Hooks y aplicaciones." } }, - { - "id": "export", - "lane": "tech", - "status": "feature", - "quarter": "2026-Q3", - "endQuarter": "2026-Q4", - "tag": { - "en": "Feature · in development", - "es": "Función · en desarrollo" - }, - "title": { "en": "FeatureExport", "es": "FeatureExport" } - }, { "id": "amm", "lane": "tech", @@ -424,27 +412,4 @@ "es": "Evento InFTF que reúne a socios empresariales y desarrolladores." } } - ], - - "$commentedItems": { - "$comment": "Items kept on file but currently hidden from the rendered roadmap. Move entries back into `items` to re-enable. This key is stripped by the Zod schema so nothing here is rendered or validated.", - "items": [ - { - "id": "tipbot", - "lane": "rollout", - "status": "pilot", - "quarter": "2026-Q2", - "endQuarter": "2026-Q3", - "tag": { - "en": "Testing Q2 · Live Q3", - "es": "Pruebas Q2 · En vivo Q3" - }, - "title": { "en": "TipBot", "es": "TipBot" }, - "description": { - "en": "Non-custodial tipping bot built on Hooks, integrated with social media platforms. Testing in Q2, live in Q3.", - "es": "Bot de propinas no custodial basado en Hooks, integrado con redes sociales. Pruebas en Q2, lanzamiento en Q3." - } - } - ] - } } From 81be0b4ed2ede18e4f38df662552d7efd139fe51 Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Sun, 19 Apr 2026 08:02:20 +0300 Subject: [PATCH 06/19] error in roadmap.json --- src/data/roadmap.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/roadmap.json b/src/data/roadmap.json index d1c3dae..71f4377 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -412,4 +412,5 @@ "es": "Evento InFTF que reúne a socios empresariales y desarrolladores." } } + ] } From 32e157449a7868d3e5b62862349c91994a2413e8 Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Sun, 19 Apr 2026 08:15:51 +0300 Subject: [PATCH 07/19] Add Export Feature. --- src/data/roadmap.json | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/data/roadmap.json b/src/data/roadmap.json index 71f4377..8a515d8 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -118,6 +118,22 @@ "es": "Primitiva RNG nativa en el ledger — aleatoriedad verificable y resistente a manipulación para Hooks y aplicaciones." } }, + { + "id": "export", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "endQuarter": "2026-Q3", + "tag": { + "en": "Feature · in development", + "es": "Función · en desarrollo" + }, + "title": { "en": "FeatureExport", "es": "FeatureExport" }, + "description": { + "en": "Export lets a Xahau user or hook request that the Xahau UNL sign a transaction destined for the XRPL — an ordinary transaction with a MultiSign block in which each UNL member contributes one of the signatures. This allows Xahau hooks to effectively control XRPL accounts and issue and manage assets on XRPL.", + "es": "Export permite que un usuario o un Hook de Xahau solicite que la UNL de Xahau firme una transacción destinada al XRPL — una transacción ordinaria con un bloque MultiSign en el que cada miembro de la UNL aporta una de las firmas. Esto permite que los Hooks de Xahau controlen cuentas del XRPL y emitan y gestionen activos en XRPL." + } + }, { "id": "amm", "lane": "tech", @@ -182,6 +198,22 @@ "es": "Permite asignar nombres para identificar Hooks, de modo que se puedan invocar diferentes Hooks incluso dentro del mismo tipo de transacción." } }, + { + "id": "js-hooks", + "lane": "tech", + "status": "feature", + "quarter": "2026-Q2", + "span": 3, + "tag": { + "en": "Feature · in alpha development", + "es": "Función · en desarrollo alfa" + }, + "title": { "en": "JSHooks", "es": "JSHooks" }, + "description": { + "en": "JavaScript runtime for Hooks — write Xahau smart-contract logic in JavaScript alongside the existing WebAssembly runtime, broadening the developer surface.", + "es": "Entorno de ejecución JavaScript para Hooks — escribir la lógica de smart contracts en JavaScript junto al entorno WebAssembly existente, ampliando la superficie para desarrolladores." + } + }, { "id": "audit-optimisations", "lane": "tech", @@ -232,7 +264,7 @@ }, "description": { "en": "Addition of compliant USD stablecoin", - "es": "Incorporación de una stablecoin USD que cumple con la normativa." + "es": "Incorporación de una stablecoin USD que cumple con la normativa" } }, { @@ -248,7 +280,7 @@ }, "description": { "en": "Addition of regulated currencies from multiple countries", - "es": "Incorporación de divisas reguladas de múltiples países." + "es": "Incorporación de divisas reguladas de múltiples países" } }, { @@ -264,7 +296,7 @@ }, "description": { "en": "Addition of compliant GBP stablecoin", - "es": "Incorporación de una stablecoin GBP que cumple con la normativa." + "es": "Incorporación de una stablecoin GBP que cumple con la normativa" } }, { @@ -381,7 +413,7 @@ }, "description": { "en": "Work with multiple partners to enhance the ability to on and off ramp on Xahau", - "es": "Colaboración con múltiples socios para ampliar las rampas de entrada y salida en Xahau." + "es": "Colaboración con múltiples socios para ampliar las rampas de entrada y salida en Xahau" } }, { From b76bfd827701b53b062e94cb5c9885cd7a1bd7d2 Mon Sep 17 00:00:00 2001 From: alloynetworks Date: Sun, 19 Apr 2026 12:52:39 +0300 Subject: [PATCH 08/19] Refactor for biome checks --- src/components/XahauRoadmap.astro | 1329 +++++++++++++++++++++-------- src/data/roadmap.json | 2 +- src/pages/[...lang]/roadmap.astro | 46 - src/pages/es/roadmap.astro | 15 + src/pages/roadmap.astro | 15 + src/schemas/roadmap.ts | 30 +- 6 files changed, 1020 insertions(+), 417 deletions(-) delete mode 100644 src/pages/[...lang]/roadmap.astro create mode 100644 src/pages/es/roadmap.astro create mode 100644 src/pages/roadmap.astro diff --git a/src/components/XahauRoadmap.astro b/src/components/XahauRoadmap.astro index cb9c2bb..38f97fe 100644 --- a/src/components/XahauRoadmap.astro +++ b/src/components/XahauRoadmap.astro @@ -1,153 +1,151 @@ --- -/** - * XahauRoadmap.astro - * - * Single-source-of-truth roadmap chart. Reads src/data/roadmap.json, - * renders statically at build time. No runtime JS. - * - * Usage (in a .astro page): - * - * --- - * import XahauRoadmap from "@/components/XahauRoadmap.astro"; - * // Starlight / Astro i18n: the current locale is on Astro.currentLocale - * --- - * - * - * To add/edit/delete an item: edit src/data/roadmap.json and commit. That's it. - */ + // XahauRoadmap.astro + // Single-source-of-truth roadmap chart. Reads src/data/roadmap.json, + // renders statically at build time. No runtime JS. + // + // Usage in a .astro page frontmatter: + // import XahauRoadmap from '@/components/XahauRoadmap.astro' + // Then in the template: + // + // + // To add/edit/delete an item: edit src/data/roadmap.json and commit. -import roadmap from "../data/roadmap.json"; -import { roadmapSchema, type RoadmapItem } from "../schemas/roadmap"; + import roadmap from '../data/roadmap.json' + import { type RoadmapItem, roadmapSchema } from '../schemas/roadmap' -interface Props { - /** BCP-47 locale key — must match a key under `labels` in roadmap.json */ - lang?: string; - /** Override the start quarter (ISO date). Otherwise uses meta.window. */ - startDate?: string; - /** - * Visual theme. "dark" (default) renders the original dark panel. - * "light" renders the roadmap on a white surface to match a light site. - * Swap by changing `theme` in the page — rollback is one word. - */ - theme?: "dark" | "light"; -} - -const { lang: langProp, startDate, theme = "dark" } = Astro.props; - -// --- Parse & validate ------------------------------------------------------- -const data = roadmapSchema.parse(roadmap); -const defaultLocale = data.meta.i18n.defaultLocale; -const lang = - langProp && data.labels[langProp] ? langProp : defaultLocale; - -const labels = data.labels[lang] ?? data.labels[defaultLocale]; - -// --- Helpers ---------------------------------------------------------------- -const tr = (v: unknown): string => { - if (typeof v === "string") return v; - if (v && typeof v === "object") { - const rec = v as Record; - return rec[lang] ?? rec[defaultLocale] ?? Object.values(rec)[0] ?? ""; + interface Props { + /** BCP-47 locale key — must match a key under `labels` in roadmap.json */ + lang?: string + /** Override the start quarter (ISO date). Otherwise uses meta.window. */ + startDate?: string + /** + * Visual theme. "dark" (default) renders the original dark panel. + * "light" renders the roadmap on a white surface to match a light site. + * Swap by changing `theme` in the page — rollback is one word. + */ + theme?: 'dark' | 'light' } - return ""; -}; -const qToIdx = (q: string) => { - const [y, qx] = q.split("-Q"); - return Number(y) * 4 + (Number(qx) - 1); -}; -const idxToQ = (i: number) => ({ - q: `Q${(i % 4) + 1}`, - y: String(Math.floor(i / 4)), - id: `${Math.floor(i / 4)}-Q${(i % 4) + 1}`, -}); + const { lang: langProp, startDate, theme = 'dark' } = Astro.props -// Current-quarter detection (build-time) -const nowIdx = (() => { - const d = new Date(); - return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3); -})(); + // === Parse & validate ======================================================= + const data = roadmapSchema.parse(roadmap) + const defaultLocale = data.meta.i18n.defaultLocale + const lang = langProp && data.labels[langProp] ? langProp : defaultLocale -// Window resolution -const win = data.meta.window; -const startIdx = (() => { - if (startDate) { - const d = new Date(startDate); - return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3); + const labels = data.labels[lang] ?? data.labels[defaultLocale] + + // === Helpers ================================================================ + const tr = (v: unknown): string => { + if (typeof v === 'string') return v + if (v && typeof v === 'object') { + const rec = v as Record + return rec[lang] ?? rec[defaultLocale] ?? Object.values(rec)[0] ?? '' + } + return '' } - if (win.mode === "manual" && win.start) { - const d = new Date(win.start); - return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3); + + const qToIdx = (q: string) => { + const [y, qx] = q.split('-Q') + return Number(y) * 4 + (Number(qx) - 1) } - return nowIdx; // auto: start at current quarter -})(); -const QCOUNT = 6; -const quarters = Array.from({ length: QCOUNT }, (_, i) => idxToQ(startIdx + i)); + const idxToQ = (i: number) => ({ + q: `Q${(i % 4) + 1}`, + y: String(Math.floor(i / 4)), + id: `${Math.floor(i / 4)}-Q${(i % 4) + 1}`, + }) -// Resolve how many quarters an item covers, honouring (in order): -// openEnded → stretches to the end of the visible window -// endQuarter → explicit end (inclusive) -// span → count of quarters -// The returned span is clamped to the visible window. -const resolveSpan = (item: RoadmapItem): number => { - const startCol = qToIdx(item.quarter); - if (item.openEnded) { - return Math.max(1, startIdx + QCOUNT - startCol); + // Current-quarter detection (build-time) + const nowIdx = (() => { + const d = new Date() + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) + })() + + // Window resolution + const win = data.meta.window + const startIdx = (() => { + if (startDate) { + const d = new Date(startDate) + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) + } + if (win.mode === 'manual' && win.start) { + const d = new Date(win.start) + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) + } + return nowIdx // auto: start at current quarter + })() + const QCOUNT = 6 + const quarters = Array.from({ length: QCOUNT }, (_, i) => + idxToQ(startIdx + i), + ) + + // Resolve how many quarters an item covers, honouring (in order): + // openEnded → stretches to the end of the visible window + // endQuarter → explicit end (inclusive) + // span → count of quarters + // The returned span is clamped to the visible window. + const resolveSpan = (item: RoadmapItem): number => { + const startCol = qToIdx(item.quarter) + if (item.openEnded) { + return Math.max(1, startIdx + QCOUNT - startCol) + } + if (item.endQuarter) { + const endCol = qToIdx(item.endQuarter) + return Math.max(1, endCol - startCol + 1) + } + return item.span ?? 1 } - if (item.endQuarter) { - const endCol = qToIdx(item.endQuarter); - return Math.max(1, endCol - startCol + 1); + + // An item is "in window" if any part of its span overlaps the visible window. + const inWindow = (item: RoadmapItem) => { + const startCol = qToIdx(item.quarter) + const endCol = startCol + resolveSpan(item) - 1 + return endCol >= startIdx && startCol < startIdx + QCOUNT } - return item.span ?? 1; -}; -// An item is "in window" if any part of its span overlaps the visible window. -const inWindow = (item: RoadmapItem) => { - const startCol = qToIdx(item.quarter); - const endCol = startCol + resolveSpan(item) - 1; - return endCol >= startIdx && startCol < startIdx + QCOUNT; -}; + // Return { col, span } in 1-based CSS grid coordinates, clipped to the window. + const gridPos = (item: RoadmapItem) => { + const startCol = qToIdx(item.quarter) + const rawSpan = resolveSpan(item) + const clippedStart = Math.max(startCol, startIdx) + const clippedEnd = Math.min(startCol + rawSpan - 1, startIdx + QCOUNT - 1) + return { + col: clippedStart - startIdx + 1, + span: clippedEnd - clippedStart + 1, + clippedStart: clippedStart > startCol, // started before window + } + } -// Return { col, span } in 1-based CSS grid coordinates, clipped to the window. -const gridPos = (item: RoadmapItem) => { - const startCol = qToIdx(item.quarter); - const rawSpan = resolveSpan(item); - const clippedStart = Math.max(startCol, startIdx); - const clippedEnd = Math.min(startCol + rawSpan - 1, startIdx + QCOUNT - 1); - return { - col: clippedStart - startIdx + 1, - span: clippedEnd - clippedStart + 1, - clippedStart: clippedStart > startCol, // started before window - }; -}; + const techItems = data.items.filter((i) => i.lane === 'tech' && inWindow(i)) + const rolloutItems = data.items.filter( + (i) => i.lane === 'rollout' && inWindow(i), + ) -const techItems = data.items.filter((i) => i.lane === "tech" && inWindow(i)); -const rolloutItems = data.items.filter( - (i) => i.lane === "rollout" && inWindow(i), -); + // KPIs + const kpiFeatures = techItems.length + const kpiRollouts = rolloutItems.length -// KPIs -const kpiFeatures = techItems.length; -const kpiRollouts = rolloutItems.length; - -// Human-readable period label for mobile card badge (and screen readers). -// The horizontal timeline is hidden on small screens, so each card needs to -// carry its own quarter/year range inline. -const fmtItemPeriod = (item: RoadmapItem): string => { - const startCol = qToIdx(item.quarter); - const start = idxToQ(startCol); - if (item.openEnded) return `${start.q} ${start.y} →`; - let endCol = startCol; - if (item.endQuarter) endCol = qToIdx(item.endQuarter); - else if (item.span && item.span > 1) endCol = startCol + item.span - 1; - if (endCol === startCol) return `${start.q} ${start.y}`; - const end = idxToQ(endCol); - if (start.y === end.y) return `${start.q}–${end.q} ${start.y}`; - return `${start.q} ${start.y} → ${end.q} ${end.y}`; -}; + // Human-readable period label for mobile card badge (and screen readers). + // The horizontal timeline is hidden on small screens, so each card needs to + // carry its own quarter/year range inline. + const fmtItemPeriod = (item: RoadmapItem): string => { + const startCol = qToIdx(item.quarter) + const start = idxToQ(startCol) + if (item.openEnded) return `${start.q} ${start.y} →` + let endCol = startCol + if (item.endQuarter) endCol = qToIdx(item.endQuarter) + else if (item.span && item.span > 1) endCol = startCol + item.span - 1 + if (endCol === startCol) return `${start.q} ${start.y}` + const end = idxToQ(endCol) + if (start.y === end.y) return `${start.q}–${end.q} ${start.y}` + return `${start.q} ${start.y} → ${end.q} ${end.y}` + } --- - -
+
@@ -158,18 +156,32 @@ const fmtItemPeriod = (item: RoadmapItem): string => {
- {quarters[0].q} {quarters[0].y} → {quarters[QCOUNT - 1].q} {quarters[QCOUNT - 1].y} + {quarters[0].q} + {quarters[0].y}→ {quarters[QCOUNT - 1].q} + {quarters[QCOUNT - 1].y} - {labels.updated} · {data.meta.updated} + {labels.updated}· {data.meta.updated}
-

+

-
{kpiRollouts}{labels.kpis.rollouts}
-
{QCOUNT}{labels.kpis.quarters}
-
{kpiFeatures}{labels.kpis.features}
+
+ {kpiRollouts}{labels.kpis.rollouts} +
+
+ {QCOUNT}{labels.kpis.quarters} +
+
+ {kpiFeatures}{labels.kpis.features} +
@@ -213,9 +225,7 @@ const fmtItemPeriod = (item: RoadmapItem): string => {
- {labels.legend.feature} - {labels.legend.live} - {labels.legend.pilot} - {labels.legend.partnership} - {labels.legend.launch} + + {labels.legend.feature} + + {labels.legend.live} + + {labels.legend.pilot} + + {labels.legend.partnership} + + {labels.legend.launch}
@@ -278,32 +303,46 @@ const fmtItemPeriod = (item: RoadmapItem): string => { xahau-green-dark #007b3d — darker accent xahau-secondary #fad7ae — warm secondary */ - --bg:#0a1619; --panel:#0f2328; --ink:#e9edf1; --ink-dim:#aab3bd; --ink-mute:#7a8890; - --line:#1a3036; --line-2:#244048; - --accent:#5de48c; --accent-2:#007b3d; - --teal:#44c7b6; --violet:#9a7cff; --rose:#ff6b9a; --green:#7dd67a; --peach:#fad7ae; + --bg: #0a1619; + --panel: #0f2328; + --ink: #e9edf1; + --ink-dim: #aab3bd; + --ink-mute: #7a8890; + --line: #1a3036; + --line-2: #244048; + --accent: #5de48c; + --accent-2: #007b3d; + --teal: #44c7b6; + --violet: #9a7cff; + --rose: #ff6b9a; + --green: #7dd67a; + --peach: #fad7ae; --section-bg: linear-gradient(180deg, var(--panel), var(--bg)); - --section-shadow: 0 30px 80px -40px rgba(0,0,0,0.8); + --section-shadow: 0 30px 80px -40px rgba(0, 0, 0, 0.8); background: var(--section-bg); border: 1px solid var(--line); border-radius: 18px; padding: 30px 34px 28px; color: var(--ink); - font-family: "Onest", var(--sl-font, "Inter", system-ui, sans-serif); + font-family: 'Onest', var(--sl-font, 'Inter'), system-ui, sans-serif; box-shadow: var(--section-shadow); } - /* --- Light theme override -------------------------------------------------- + /* === Light theme override ================================================== Activate by rendering . Rollback is a one-word - prop change in src/pages/[...lang]/roadmap.astro (or remove the prop for - the default "dark"). */ + prop change in src/pages/roadmap.astro (or remove the prop for the default + "dark"). */ .xroadmap.theme-light { /* Panel is a warm off-white so cards don't dissolve into the page bg. */ - --bg:#eef2f1; --panel:#fbfbf9; - --ink:#0f2328; --ink-dim:#2a3439; --ink-mute:#546066; - --line:#d6dcde; --line-2:#b9c2c6; + --bg: #eef2f1; + --panel: #fbfbf9; + --ink: #0f2328; + --ink-dim: #2a3439; + --ink-mute: #546066; + --line: #d6dcde; + --line-2: #b9c2c6; --section-bg: linear-gradient(180deg, #fbfbf9, #f3f6f4); - --section-shadow: 0 22px 56px -28px rgba(15,35,40,0.28); + --section-shadow: 0 22px 56px -28px rgba(15, 35, 40, 0.28); } /* Feature cards: near-white surface + chunky left accent, matching rollouts. Keeps green as an accent colour instead of a pastel wash. */ @@ -311,275 +350,861 @@ const fmtItemPeriod = (item: RoadmapItem): string => { background: #ffffff; border: 1px solid var(--line); border-left: 3px solid var(--accent-2); - box-shadow: 0 6px 18px -14px rgba(15,35,40,0.25); + box-shadow: 0 6px 18px -14px rgba(15, 35, 40, 0.25); + } + .xroadmap.theme-light .xr-feat.is-span { + background: #ffffff; } - .xroadmap.theme-light .xr-feat.is-span { background: #ffffff; } /* Bump tags up a touch — 9px text was fragile on white. Colour stays per-card-type so status colours (live/pilot/partnership/launch) still apply. */ .xroadmap.theme-light .xr-feat .k, - .xroadmap.theme-light .xr-roll .k { font-size: 10px; font-weight: 700; } - .xroadmap.theme-light .xr-feat .k { color: var(--accent-2); } - .xroadmap.theme-light .xr-feat.is-openended::after { color: var(--accent-2); } + .xroadmap.theme-light .xr-roll .k { + font-size: 10px; + font-weight: 700; + } + .xroadmap.theme-light .xr-feat .k { + color: var(--accent-2); + } + .xroadmap.theme-light .xr-feat.is-openended::after { + color: var(--accent-2); + } /* Descriptions: darker than --ink-dim so body text is comfortably legible. */ .xroadmap.theme-light .xr-feat .d, - .xroadmap.theme-light .xr-roll .d { color: #2a3439; } + .xroadmap.theme-light .xr-roll .d { + color: #2a3439; + } /* Peg dot matches the deeper accent so nothing glows neon-green on white. */ - .xroadmap.theme-light .xr-feat .peg { background: rgba(0,123,61,0.5); } - .xroadmap.theme-light .xr-feat .peg::after { background: var(--accent-2); box-shadow: 0 0 8px rgba(0,123,61,0.4); } + .xroadmap.theme-light .xr-feat .peg { + background: rgba(0, 123, 61, 0.5); + } + .xroadmap.theme-light .xr-feat .peg::after { + background: var(--accent-2); + box-shadow: 0 0 8px rgba(0, 123, 61, 0.4); + } /* Rollout cards: white surface, colour carried by the left rule and tag. */ .xroadmap.theme-light .xr-roll { - background:#ffffff; + background: #ffffff; border: 1px solid var(--line); border-left: 3px solid var(--teal); - box-shadow: 0 6px 18px -14px rgba(15,35,40,0.25); + box-shadow: 0 6px 18px -14px rgba(15, 35, 40, 0.25); + } + .xroadmap.theme-light .xr-roll.status-live { + border-left-color: #2fa84f; + } + .xroadmap.theme-light .xr-roll.status-pilot { + border-left-color: var(--violet); + } + .xroadmap.theme-light .xr-roll.status-partnership { + border-left-color: var(--rose); + } + .xroadmap.theme-light .xr-roll.status-launch { + border-left-color: var(--teal); } - .xroadmap.theme-light .xr-roll.status-live { border-left-color: #2fa84f; } - .xroadmap.theme-light .xr-roll.status-pilot { border-left-color: var(--violet); } - .xroadmap.theme-light .xr-roll.status-partnership { border-left-color: var(--rose); } - .xroadmap.theme-light .xr-roll.status-launch { border-left-color: var(--teal); } /* Deepen the status accent colours so tag text and pegs read cleanly on white. The bright dark-theme palette (teal/violet/rose/green) washes out at small sizes. */ - .xroadmap.theme-light .xr-roll.status-live .k { color: #2fa84f; } - .xroadmap.theme-light .xr-roll.status-live .peg::before { background: #2fa84f; } - .xroadmap.theme-light .xr-roll.status-launch .k { color: #0d7d6b; } - .xroadmap.theme-light .xr-roll.status-launch .peg::before { background: #0d7d6b; } - .xroadmap.theme-light .xr-roll.status-launch { border-left-color: #0d7d6b; } - .xroadmap.theme-light .xr-roll.status-pilot .k { color: #5a3fbf; } - .xroadmap.theme-light .xr-roll.status-pilot .peg::before { background: #5a3fbf; } - .xroadmap.theme-light .xr-roll.status-pilot { border-left-color: #5a3fbf; } - .xroadmap.theme-light .xr-roll.status-partnership .k { color: #c9316b; } - .xroadmap.theme-light .xr-roll.status-partnership .peg::before { background: #c9316b; } - .xroadmap.theme-light .xr-roll.status-partnership { border-left-color: #c9316b; } + .xroadmap.theme-light .xr-roll.status-live .k { + color: #2fa84f; + } + .xroadmap.theme-light .xr-roll.status-live .peg::before { + background: #2fa84f; + } + .xroadmap.theme-light .xr-roll.status-launch .k { + color: #0d7d6b; + } + .xroadmap.theme-light .xr-roll.status-launch .peg::before { + background: #0d7d6b; + } + .xroadmap.theme-light .xr-roll.status-launch { + border-left-color: #0d7d6b; + } + .xroadmap.theme-light .xr-roll.status-pilot .k { + color: #5a3fbf; + } + .xroadmap.theme-light .xr-roll.status-pilot .peg::before { + background: #5a3fbf; + } + .xroadmap.theme-light .xr-roll.status-pilot { + border-left-color: #5a3fbf; + } + .xroadmap.theme-light .xr-roll.status-partnership .k { + color: #c9316b; + } + .xroadmap.theme-light .xr-roll.status-partnership .peg::before { + background: #c9316b; + } + .xroadmap.theme-light .xr-roll.status-partnership { + border-left-color: #c9316b; + } /* Dividers on light need more contrast than the card border colour. */ - .xroadmap.theme-light .xr-dividers span { border-right-color: var(--line-2); } - .xroadmap.theme-light .xr-qhead { border-right-color: var(--line-2); } + .xroadmap.theme-light .xr-dividers span { + border-right-color: var(--line-2); + } + .xroadmap.theme-light .xr-qhead { + border-right-color: var(--line-2); + } /* Chip accent + intro emphasis read better with the deeper green. */ - .xroadmap.theme-light .xr-chip.accent { color: var(--accent-2); border-color: rgba(0,123,61,0.45); background: rgba(93,228,140,0.08); } - .xroadmap.theme-light .xr-chip { background: rgba(15,35,40,0.03); } - .xroadmap.theme-light .xr-dot { background: var(--accent-2); box-shadow: 0 0 8px rgba(0,123,61,0.5); } - .xroadmap.theme-light .xr-stmt em { color: var(--accent-2); } - .xroadmap.theme-light .xr-intro { background: rgba(93,228,140,0.05); border-color: rgba(0,123,61,0.20); } - .xroadmap.theme-light .xr-phil { background: #ffffff; } + .xroadmap.theme-light .xr-chip.accent { + color: var(--accent-2); + border-color: rgba(0, 123, 61, 0.45); + background: rgba(93, 228, 140, 0.08); + } + .xroadmap.theme-light .xr-chip { + background: rgba(15, 35, 40, 0.03); + } + .xroadmap.theme-light .xr-dot { + background: var(--accent-2); + box-shadow: 0 0 8px rgba(0, 123, 61, 0.5); + } + .xroadmap.theme-light .xr-stmt em { + color: var(--accent-2); + } + .xroadmap.theme-light .xr-intro { + background: rgba(93, 228, 140, 0.05); + border-color: rgba(0, 123, 61, 0.2); + } + .xroadmap.theme-light .xr-phil { + background: #ffffff; + } /* Arrow shaft: uniform deep green so the quarter labels stay readable. */ .xroadmap.theme-light .xr-arrow .shaft { - background: linear-gradient(90deg, rgba(0,123,61,0.85), rgba(0,123,61,0.98) 50%, rgba(0,123,61,0.85)); + background: linear-gradient( + 90deg, + rgba(0, 123, 61, 0.85), + rgba(0, 123, 61, 0.98) 50%, + rgba(0, 123, 61, 0.85) + ); + } + .xroadmap.theme-light .xr-arrow .ql { + color: #ffffff; + } + .xroadmap.theme-light .xr-arrow .tick { + border-right-color: rgba(255, 255, 255, 0.18); + } + .xroadmap * { + box-sizing: border-box; } - .xroadmap.theme-light .xr-arrow .ql { color: #ffffff; } - .xroadmap.theme-light .xr-arrow .tick { border-right-color: rgba(255,255,255,0.18); } - .xroadmap * { box-sizing: border-box; } - .xr-head { display:flex; justify-content:space-between; align-items:flex-end; gap:24px; margin-bottom:22px; flex-wrap:wrap; } - .xr-title { display:flex; gap:14px; align-items:center; } - .xr-mark { width:42px; height:42px; border-radius:10px; background:linear-gradient(140deg,var(--accent),var(--accent-2)); color:#0f2328; display:grid; place-items:center; font-weight:700; font-size:22px; } - .xroadmap h2 { margin:0; font-size:28px; letter-spacing:-0.01em; font-weight:600; } - .xr-sub { color:var(--ink-dim); font-size:13px; margin:3px 0 0; } - .xr-meta { display:flex; gap:10px; flex-wrap:wrap; } - .xr-chip { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:11px; padding:6px 10px; border:1px solid var(--line-2); border-radius:999px; color:var(--ink-dim); } - .xr-chip.accent { border-color:rgba(93,228,140,0.35); color:var(--accent); } - .xr-dot { display:inline-block; width:6px; height:6px; border-radius:50%; background:var(--accent); margin-right:6px; box-shadow:0 0 8px var(--accent); } + .xr-head { + display: flex; + justify-content: space-between; + align-items: flex-end; + gap: 24px; + margin-bottom: 22px; + flex-wrap: wrap; + } + .xr-title { + display: flex; + gap: 14px; + align-items: center; + } + .xr-mark { + width: 42px; + height: 42px; + border-radius: 10px; + background: linear-gradient(140deg, var(--accent), var(--accent-2)); + color: #0f2328; + display: grid; + place-items: center; + font-weight: 700; + font-size: 22px; + } + .xroadmap h2 { + margin: 0; + font-size: 28px; + letter-spacing: -0.01em; + font-weight: 600; + } + .xr-sub { + color: var(--ink-dim); + font-size: 13px; + margin: 3px 0 0; + } + .xr-meta { + display: flex; + gap: 10px; + flex-wrap: wrap; + } + .xr-chip { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 11px; + padding: 6px 10px; + border: 1px solid var(--line-2); + border-radius: 999px; + color: var(--ink-dim); + } + .xr-chip.accent { + border-color: rgba(93, 228, 140, 0.35); + color: var(--accent); + } + .xr-dot { + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--accent); + margin-right: 6px; + box-shadow: 0 0 8px var(--accent); + } - .xr-intro { display:flex; gap:24px; align-items:flex-start; flex-wrap:wrap; margin:6px 0 14px; padding:14px 16px; border:1px solid var(--line); border-radius:12px; } - .xr-stmt { font-size:17px; max-width:780px; line-height:1.4; margin:0; } - .xr-stmt em { color:var(--accent); font-style:normal; } - .xr-kpis { display:flex; gap:18px; margin-left:auto; flex-wrap:wrap; } - .xr-kpi { min-width:110px; } - .xr-kpi .n { font-size:26px; line-height:1; display:block; } - .xr-kpi .l { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:10px; letter-spacing:0.14em; text-transform:uppercase; color:var(--ink-mute); margin-top:6px; display:block; } + .xr-intro { + display: flex; + gap: 24px; + align-items: flex-start; + flex-wrap: wrap; + margin: 6px 0 14px; + padding: 14px 16px; + border: 1px solid var(--line); + border-radius: 12px; + } + .xr-stmt { + font-size: 17px; + max-width: 780px; + line-height: 1.4; + margin: 0; + } + .xr-stmt em { + color: var(--accent); + font-style: normal; + } + .xr-kpis { + display: flex; + gap: 18px; + margin-left: auto; + flex-wrap: wrap; + } + .xr-kpi { + min-width: 110px; + } + .xr-kpi .n { + font-size: 26px; + line-height: 1; + display: block; + } + .xr-kpi .l { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 10px; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--ink-mute); + margin-top: 6px; + display: block; + } - .xr-wrap { position:relative; margin:18px 0 10px; padding:0 8px; } - .xr-qgrid, .xr-lane { display:grid; grid-template-columns:repeat(6,1fr); } - .xr-qhead { padding:0 12px 8px; border-right:1px dashed var(--line); } - .xr-qhead:last-child { border-right:none; } - .xr-qhead .q { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:11px; color:var(--ink-dim); letter-spacing:0.14em; } - .xr-qhead .y { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:9px; color:var(--ink-mute); letter-spacing:0.16em; display:block; margin-top:2px; } + .xr-wrap { + position: relative; + margin: 18px 0 10px; + padding: 0 8px; + } + .xr-qgrid, + .xr-lane { + display: grid; + grid-template-columns: repeat(6, 1fr); + } + .xr-qhead { + padding: 0 12px 8px; + border-right: 1px dashed var(--line); + } + .xr-qhead:last-child { + border-right: none; + } + .xr-qhead .q { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 11px; + color: var(--ink-dim); + letter-spacing: 0.14em; + } + .xr-qhead .y { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; + color: var(--ink-mute); + letter-spacing: 0.16em; + display: block; + margin-top: 2px; + } - .xr-lane { position:relative; gap:8px 12px; } - .xr-lane.top { min-height:170px; align-items:end; padding:12px 14px 18px; } - .xr-lane.bot { min-height:180px; padding:18px 14px 0; } + .xr-lane { + position: relative; + gap: 8px 12px; + } + .xr-lane.top { + min-height: 170px; + align-items: end; + padding: 12px 14px 18px; + } + .xr-lane.bot { + min-height: 180px; + padding: 18px 14px 0; + } /* Dashed column dividers drawn behind the cards. */ - .xr-dividers { position:absolute; inset:0; display:grid; grid-template-columns:repeat(6,1fr); pointer-events:none; z-index:0; } - .xr-dividers span { border-right:1px dashed var(--line); } - .xr-dividers span:last-child { border-right:none; } + .xr-dividers { + position: absolute; + inset: 0; + display: grid; + grid-template-columns: repeat(6, 1fr); + pointer-events: none; + z-index: 0; + } + .xr-dividers span { + border-right: 1px dashed var(--line); + } + .xr-dividers span:last-child { + border-right: none; + } - .xr-feat, .xr-roll { position:relative; z-index:1; } + .xr-feat, + .xr-roll { + position: relative; + z-index: 1; + } - .xr-feat { background:linear-gradient(180deg, rgba(93,228,140,0.10), rgba(93,228,140,0.02)); border:1px solid rgba(93,228,140,0.35); border-radius:10px; padding:12px 12px 12px 14px; } - .xr-feat .k { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:9px; letter-spacing:0.18em; text-transform:uppercase; margin-bottom:6px; color:var(--accent); } - .xr-feat .n { font-size:14px; font-weight:600; letter-spacing:-0.005em; line-height:1.2; } - .xr-feat .d { font-size:11.5px; color:var(--ink-dim); margin-top:5px; line-height:1.4; } - .xr-feat .peg { position:absolute; left:20px; top:-14px; width:2px; height:12px; background:rgba(93,228,140,0.6); } - .xr-feat .peg::after { content:""; position:absolute; top:-4px; left:-3px; width:8px; height:8px; border-radius:50%; background:var(--accent); box-shadow:0 0 10px rgba(93,228,140,0.7); } + .xr-feat { + background: linear-gradient( + 180deg, + rgba(93, 228, 140, 0.1), + rgba(93, 228, 140, 0.02) + ); + border: 1px solid rgba(93, 228, 140, 0.35); + border-radius: 10px; + padding: 12px 12px 12px 14px; + } + .xr-feat .k { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; + letter-spacing: 0.18em; + text-transform: uppercase; + margin-bottom: 6px; + color: var(--accent); + } + .xr-feat .n { + font-size: 14px; + font-weight: 600; + letter-spacing: -0.005em; + line-height: 1.2; + } + .xr-feat .d { + font-size: 11.5px; + color: var(--ink-dim); + margin-top: 5px; + line-height: 1.4; + } + .xr-feat .peg { + position: absolute; + left: 20px; + top: -14px; + width: 2px; + height: 12px; + background: rgba(93, 228, 140, 0.6); + } + .xr-feat .peg::after { + content: ''; + position: absolute; + top: -4px; + left: -3px; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--accent); + box-shadow: 0 0 10px rgba(93, 228, 140, 0.7); + } /* Multi-quarter cards get a subtle inner rule showing the timeline extent. */ - .xr-feat.is-span { background:linear-gradient(180deg, rgba(93,228,140,0.14), rgba(93,228,140,0.04)); } - .xr-roll.is-span { background:linear-gradient(90deg, rgba(68,199,182,0.08), rgba(68,199,182,0.02)); } + .xr-feat.is-span { + background: linear-gradient( + 180deg, + rgba(93, 228, 140, 0.14), + rgba(93, 228, 140, 0.04) + ); + } + .xr-roll.is-span { + background: linear-gradient( + 90deg, + rgba(68, 199, 182, 0.08), + rgba(68, 199, 182, 0.02) + ); + } /* Open-ended: soft fade on the right edge and a "continues" arrow. */ - .xr-feat.is-openended, .xr-roll.is-openended { padding-right:30px; } - .xr-feat.is-openended::after, .xr-roll.is-openended::after { - content:"›"; position:absolute; right:10px; top:50%; transform:translateY(-50%); - font-size:22px; line-height:1; font-weight:700; color:var(--accent); opacity:0.9; + .xr-feat.is-openended, + .xr-roll.is-openended { + padding-right: 30px; + } + .xr-feat.is-openended::after, + .xr-roll.is-openended::after { + content: '›'; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + font-size: 22px; + line-height: 1; + font-weight: 700; + color: var(--accent); + opacity: 0.9; + } + .xr-roll.is-openended.status-live::after { + color: var(--green); + } + .xr-roll.is-openended.status-pilot::after { + color: var(--violet); + } + .xr-roll.is-openended.status-partnership::after { + color: var(--rose); + } + .xr-roll.is-openended.status-launch::after { + color: var(--teal); } - .xr-roll.is-openended.status-live::after { color:var(--green); } - .xr-roll.is-openended.status-pilot::after { color:var(--violet); } - .xr-roll.is-openended.status-partnership::after { color:var(--rose); } - .xr-roll.is-openended.status-launch::after { color:var(--teal); } /* Clipped-start indicator: a soft left-edge gradient mask. */ - .xr-feat.is-clipstart, .xr-roll.is-clipstart { padding-left:24px; } - .xr-feat.is-clipstart::before, .xr-roll.is-clipstart::before { - content:"‹"; position:absolute; left:8px; top:50%; transform:translateY(-50%); - font-size:22px; line-height:1; font-weight:700; color:var(--ink-mute); opacity:0.6; + .xr-feat.is-clipstart, + .xr-roll.is-clipstart { + padding-left: 24px; + } + .xr-feat.is-clipstart::before, + .xr-roll.is-clipstart::before { + content: '‹'; + position: absolute; + left: 8px; + top: 50%; + transform: translateY(-50%); + font-size: 22px; + line-height: 1; + font-weight: 700; + color: var(--ink-mute); + opacity: 0.6; } - .xr-arrow { position:relative; height:58px; margin:6px 0; } - .xr-arrow .shaft { position:absolute; inset:0; background:linear-gradient(90deg, rgba(93,228,140,0.22), rgba(93,228,140,0.65) 22%, rgba(0,123,61,0.95) 50%, rgba(93,228,140,0.65) 78%, rgba(93,228,140,0.22)); clip-path:polygon(0 30%, 95% 30%, 95% 12%, 100% 50%, 95% 88%, 95% 70%, 0 70%); } - .xr-arrow .grid { position:absolute; inset:0; display:grid; grid-template-columns:repeat(6,1fr); pointer-events:none; } - .xr-arrow .tick { border-right:1px solid rgba(0,0,0,0.28); } - .xr-arrow .tick:last-child { border-right:none; } - .xr-arrow .labels { position:absolute; inset:0; display:grid; grid-template-columns:repeat(6,1fr); align-items:center; } - .xr-arrow .ql { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:11px; color:#0f2328; font-weight:700; letter-spacing:0.08em; padding:0 14px; } + .xr-arrow { + position: relative; + height: 58px; + margin: 6px 0; + } + .xr-arrow .shaft { + position: absolute; + inset: 0; + background: linear-gradient( + 90deg, + rgba(93, 228, 140, 0.22), + rgba(93, 228, 140, 0.65) 22%, + rgba(0, 123, 61, 0.95) 50%, + rgba(93, 228, 140, 0.65) 78%, + rgba(93, 228, 140, 0.22) + ); + clip-path: polygon( + 0 30%, + 95% 30%, + 95% 12%, + 100% 50%, + 95% 88%, + 95% 70%, + 0 70% + ); + } + .xr-arrow .grid { + position: absolute; + inset: 0; + display: grid; + grid-template-columns: repeat(6, 1fr); + pointer-events: none; + } + .xr-arrow .tick { + border-right: 1px solid rgba(0, 0, 0, 0.28); + } + .xr-arrow .tick:last-child { + border-right: none; + } + .xr-arrow .labels { + position: absolute; + inset: 0; + display: grid; + grid-template-columns: repeat(6, 1fr); + align-items: center; + } + .xr-arrow .ql { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 11px; + color: #0f2328; + font-weight: 700; + letter-spacing: 0.08em; + padding: 0 14px; + } - .xr-roll { padding:12px 12px 12px 14px; border-left:2px solid var(--teal); background:rgba(68,199,182,0.04); border-radius:0 8px 8px 0; } - .xr-roll.status-live { border-left-color:var(--green); background:rgba(125,214,122,0.05); } - .xr-roll.status-pilot { border-left-color:var(--violet); background:rgba(154,124,255,0.05); } - .xr-roll.status-partnership { border-left-color:var(--rose); background:rgba(255,107,154,0.05); } - .xr-roll.status-launch { border-left-color:var(--teal); background:rgba(68,199,182,0.05); } - .xr-roll .k { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:9px; letter-spacing:0.18em; text-transform:uppercase; margin-bottom:5px; color:var(--ink-mute); } - .xr-roll.status-live .k { color:var(--green); } - .xr-roll.status-pilot .k { color:var(--violet); } - .xr-roll.status-partnership .k { color:var(--rose); } - .xr-roll.status-launch .k { color:var(--teal); } - .xr-roll .n { font-weight:600; font-size:16px; letter-spacing:-0.005em; line-height:1.2; } - .xr-roll .d { font-size:12px; color:var(--ink-dim); margin-top:5px; line-height:1.45; } - .xr-roll .peg { position:absolute; left:20px; bottom:-14px; width:2px; height:12px; background:rgba(68,199,182,0.6); } - .xr-roll.status-live .peg { background:rgba(125,214,122,0.6); } - .xr-roll.status-pilot .peg { background:rgba(154,124,255,0.6); } - .xr-roll.status-partnership .peg { background:rgba(255,107,154,0.6); } - .xr-roll .peg::before { content:""; position:absolute; bottom:-4px; left:-3px; width:8px; height:8px; border-radius:50%; background:var(--teal); } - .xr-roll.status-live .peg::before { background:var(--green); } - .xr-roll.status-pilot .peg::before { background:var(--violet); } - .xr-roll.status-partnership .peg::before { background:var(--rose); } + .xr-roll { + padding: 12px 12px 12px 14px; + border-left: 2px solid var(--teal); + background: rgba(68, 199, 182, 0.04); + border-radius: 0 8px 8px 0; + } + .xr-roll.status-live { + border-left-color: var(--green); + background: rgba(125, 214, 122, 0.05); + } + .xr-roll.status-pilot { + border-left-color: var(--violet); + background: rgba(154, 124, 255, 0.05); + } + .xr-roll.status-partnership { + border-left-color: var(--rose); + background: rgba(255, 107, 154, 0.05); + } + .xr-roll.status-launch { + border-left-color: var(--teal); + background: rgba(68, 199, 182, 0.05); + } + .xr-roll .k { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; + letter-spacing: 0.18em; + text-transform: uppercase; + margin-bottom: 5px; + color: var(--ink-mute); + } + .xr-roll.status-live .k { + color: var(--green); + } + .xr-roll.status-pilot .k { + color: var(--violet); + } + .xr-roll.status-partnership .k { + color: var(--rose); + } + .xr-roll.status-launch .k { + color: var(--teal); + } + .xr-roll .n { + font-weight: 600; + font-size: 16px; + letter-spacing: -0.005em; + line-height: 1.2; + } + .xr-roll .d { + font-size: 12px; + color: var(--ink-dim); + margin-top: 5px; + line-height: 1.45; + } + .xr-roll .peg { + position: absolute; + left: 20px; + bottom: -14px; + width: 2px; + height: 12px; + background: rgba(68, 199, 182, 0.6); + } + .xr-roll.status-live .peg { + background: rgba(125, 214, 122, 0.6); + } + .xr-roll.status-pilot .peg { + background: rgba(154, 124, 255, 0.6); + } + .xr-roll.status-partnership .peg { + background: rgba(255, 107, 154, 0.6); + } + .xr-roll .peg::before { + content: ''; + position: absolute; + bottom: -4px; + left: -3px; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--teal); + } + .xr-roll.status-live .peg::before { + background: var(--green); + } + .xr-roll.status-pilot .peg::before { + background: var(--violet); + } + .xr-roll.status-partnership .peg::before { + background: var(--rose); + } - .xr-philosophy { display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:22px; } - .xr-phil { padding:14px; border:1px solid var(--line); border-radius:10px; } - .xr-phil .t { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:10px; letter-spacing:0.16em; text-transform:uppercase; color:var(--ink-mute); margin-bottom:6px; } - .xr-phil .v { font-size:14px; line-height:1.35; } + .xr-philosophy { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + margin-top: 22px; + } + .xr-phil { + padding: 14px; + border: 1px solid var(--line); + border-radius: 10px; + } + .xr-phil .t { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 10px; + letter-spacing: 0.16em; + text-transform: uppercase; + color: var(--ink-mute); + margin-bottom: 6px; + } + .xr-phil .v { + font-size: 14px; + line-height: 1.35; + } - .xr-legend { display:flex; gap:18px; flex-wrap:wrap; margin:18px 0 0; font-size:12px; color:var(--ink-dim); } - .xr-legend .sw { display:inline-flex; align-items:center; gap:8px; } - .xr-legend .sw i { width:10px; height:10px; border-radius:2px; display:inline-block; } - .xr-legend .sw.feat i { background:var(--accent); } - .xr-legend .sw.live i { background:var(--green); } - .xr-legend .sw.pilot i { background:var(--violet); } - .xr-legend .sw.partner i { background:var(--rose); } - .xr-legend .sw.launch i { background:var(--teal); } + .xr-legend { + display: flex; + gap: 18px; + flex-wrap: wrap; + margin: 18px 0 0; + font-size: 12px; + color: var(--ink-dim); + } + .xr-legend .sw { + display: inline-flex; + align-items: center; + gap: 8px; + } + .xr-legend .sw i { + width: 10px; + height: 10px; + border-radius: 2px; + display: inline-block; + } + .xr-legend .sw.feat i { + background: var(--accent); + } + .xr-legend .sw.live i { + background: var(--green); + } + .xr-legend .sw.pilot i { + background: var(--violet); + } + .xr-legend .sw.partner i { + background: var(--rose); + } + .xr-legend .sw.launch i { + background: var(--teal); + } - .xr-foot { margin-top:18px; padding-top:14px; border-top:1px solid var(--line); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:11px; color:var(--ink-mute); } + .xr-foot { + margin-top: 18px; + padding-top: 14px; + border-top: 1px solid var(--line); + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 11px; + color: var(--ink-mute); + } /* Per-card quarter badge — hidden on desktop (timeline carries this info) and shown on mobile where the horizontal arrow is collapsed. */ - .xr-q-badge { display:none; } - - @media (max-width:1100px) { .xr-philosophy { grid-template-columns:repeat(2,1fr); } } - - /* Tablet breakpoint: drop to 3 visible columns but keep the timeline metaphor. */ - @media (max-width:900px) and (min-width:641px) { - .xr-qgrid, .xr-lane, .xr-dividers, .xr-arrow .grid, .xr-arrow .labels { - grid-template-columns:repeat(3,1fr); - } - .xr-arrow { height:46px; } - .xr-arrow .ql { font-size:10px; padding:0 10px; } - .xr-lane .xr-feat, .xr-lane .xr-roll { grid-column: 1 / -1 !important; } - .xr-dividers { display:none; } + .xr-q-badge { + display: none; } - /* --- Mobile (≤640px) ------------------------------------------------------ + @media (max-width: 1100px) { + .xr-philosophy { + grid-template-columns: repeat(2, 1fr); + } + } + + /* Tablet breakpoint: drop to 3 visible columns but keep the timeline metaphor. */ + @media (max-width: 900px) and (min-width: 641px) { + .xr-qgrid, + .xr-lane, + .xr-dividers, + .xr-arrow .grid, + .xr-arrow .labels { + grid-template-columns: repeat(3, 1fr); + } + .xr-arrow { + height: 46px; + } + .xr-arrow .ql { + font-size: 10px; + padding: 0 10px; + } + .xr-lane .xr-feat, + .xr-lane .xr-roll { + grid-column: 1 / -1 !important; + } + .xr-dividers { + display: none; + } + } + + /* === Mobile (≤640px) ====================================================== The horizontal timeline metaphor does not survive narrow viewports, so at phone widths we flip to a linear, stacked card list. The quarter header row, arrow and column dividers are hidden; every card instead shows its own period via the .xr-q-badge (populated at build time). */ - @media (max-width:640px) { - .xroadmap { padding:20px 16px 18px; border-radius:14px; } - .xroadmap h2 { font-size:22px; } - .xr-sub { font-size:12px; } + @media (max-width: 640px) { + .xroadmap { + padding: 20px 16px 18px; + border-radius: 14px; + } + .xroadmap h2 { + font-size: 22px; + } + .xr-sub { + font-size: 12px; + } - .xr-head { gap:10px; margin-bottom:14px; } - .xr-meta { gap:6px; } - .xr-chip { font-size:10px; padding:4px 8px; } + .xr-head { + gap: 10px; + margin-bottom: 14px; + } + .xr-meta { + gap: 6px; + } + .xr-chip { + font-size: 10px; + padding: 4px 8px; + } - .xr-intro { padding:12px 14px; gap:12px; } - .xr-stmt { font-size:14px; line-height:1.45; } - .xr-kpis { gap:10px; margin-left:0; width:100%; justify-content:space-between; } - .xr-kpi { min-width:auto; flex:1; } - .xr-kpi .n { font-size:20px; } - .xr-kpi .l { font-size:9px; letter-spacing:0.1em; } + .xr-intro { + padding: 12px 14px; + gap: 12px; + } + .xr-stmt { + font-size: 14px; + line-height: 1.45; + } + .xr-kpis { + gap: 10px; + margin-left: 0; + width: 100%; + justify-content: space-between; + } + .xr-kpi { + min-width: auto; + flex: 1; + } + .xr-kpi .n { + font-size: 20px; + } + .xr-kpi .l { + font-size: 9px; + letter-spacing: 0.1em; + } - .xr-wrap { padding:0; margin:12px 0 4px; } - .xr-qgrid, .xr-arrow, .xr-dividers { display:none !important; } + .xr-wrap { + padding: 0; + margin: 12px 0 4px; + } + .xr-qgrid, + .xr-arrow, + .xr-dividers { + display: none !important; + } /* Lanes collapse to a simple block list with a section heading derived from the existing aria-label (so no extra markup is needed). */ - .xr-lane { display:block; padding:0 !important; min-height:0 !important; position:relative; margin-bottom:18px; } - .xr-lane.top, .xr-lane.bot { padding:0 !important; } + .xr-lane { + display: block; + padding: 0 !important; + min-height: 0 !important; + position: relative; + margin-bottom: 18px; + } + .xr-lane.top, + .xr-lane.bot { + padding: 0 !important; + } .xr-lane::before { - content:attr(aria-label); - display:block; + content: attr(aria-label); + display: block; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; - font-size:10px; letter-spacing:0.18em; text-transform:uppercase; - color:var(--ink-mute); - margin-bottom:10px; + font-size: 10px; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--ink-mute); + margin-bottom: 10px; } /* Cards become full-width blocks; drop peg/open-ended/clip glyphs that only make sense against a horizontal timeline. */ - .xr-feat, .xr-roll { - display:block !important; - grid-column:auto !important; - width:auto; - margin:0 0 10px !important; - padding:12px 14px !important; - border-radius:10px !important; + .xr-feat, + .xr-roll { + display: block !important; + grid-column: auto !important; + width: auto; + margin: 0 0 10px !important; + padding: 12px 14px !important; + border-radius: 10px !important; + } + .xr-feat .peg, + .xr-roll .peg { + display: none; + } + .xr-feat.is-openended::after, + .xr-roll.is-openended::after, + .xr-feat.is-clipstart::before, + .xr-roll.is-clipstart::before { + display: none; + } + .xr-feat.is-openended, + .xr-roll.is-openended { + padding-right: 14px; + } + .xr-feat.is-clipstart, + .xr-roll.is-clipstart { + padding-left: 14px; } - .xr-feat .peg, .xr-roll .peg { display:none; } - .xr-feat.is-openended::after, .xr-roll.is-openended::after, - .xr-feat.is-clipstart::before, .xr-roll.is-clipstart::before { display:none; } - .xr-feat.is-openended, .xr-roll.is-openended { padding-right:14px; } - .xr-feat.is-clipstart, .xr-roll.is-clipstart { padding-left:14px; } /* Quarter badge → compact chip pinned to the top-right of each card. */ .xr-q-badge { - display:inline-block; - float:right; - margin:0 0 4px 8px; + display: inline-block; + float: right; + margin: 0 0 4px 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; - font-size:9.5px; letter-spacing:0.12em; - padding:3px 7px; border-radius:999px; - border:1px solid var(--line-2); - color:var(--ink-dim); - background:rgba(255,255,255,0.03); + font-size: 9.5px; + letter-spacing: 0.12em; + padding: 3px 7px; + border-radius: 999px; + border: 1px solid var(--line-2); + color: var(--ink-dim); + background: rgba(255, 255, 255, 0.03); } .xroadmap.theme-light .xr-q-badge { - background:rgba(15,35,40,0.04); - color:#2a3439; - border-color:var(--line-2); + background: rgba(15, 35, 40, 0.04); + color: #2a3439; + border-color: var(--line-2); } - .xr-feat .n, .xr-roll .n { font-size:15px; } - .xr-feat .d, .xr-roll .d { font-size:12.5px; } + .xr-feat .n, + .xr-roll .n { + font-size: 15px; + } + .xr-feat .d, + .xr-roll .d { + font-size: 12.5px; + } - .xr-philosophy { grid-template-columns:1fr; gap:8px; margin-top:16px; } - .xr-legend { gap:10px 14px; font-size:11px; margin-top:14px; } - .xr-foot { font-size:10px; } + .xr-philosophy { + grid-template-columns: 1fr; + gap: 8px; + margin-top: 16px; + } + .xr-legend { + gap: 10px 14px; + font-size: 11px; + margin-top: 14px; + } + .xr-foot { + font-size: 10px; + } } @media print { - .xroadmap { background:#fff !important; color:#000 !important; border:none; box-shadow:none; } - .xr-intro, .xr-phil, .xr-foot, .xr-chip { color:#000 !important; border-color:#ccc !important; } + .xroadmap { + background: #fff !important; + color: #000 !important; + border: none; + box-shadow: none; + } + .xr-intro, + .xr-phil, + .xr-foot, + .xr-chip { + color: #000 !important; + border-color: #ccc !important; + } } diff --git a/src/data/roadmap.json b/src/data/roadmap.json index 8a515d8..2c65978 100644 --- a/src/data/roadmap.json +++ b/src/data/roadmap.json @@ -2,7 +2,7 @@ "$comment": "Xahau roadmap source of truth. Edit this file to add/update/remove items. Committed JSON is rendered at build time by src/components/XahauRoadmap.astro — no runtime JS required.", "meta": { - "updated": "2026-04-18", + "updated": "2026-04-19", "window": { "mode": "auto", "$comment_mode": "'auto' = current quarter + next 5. 'manual' = use the `start` field below.", diff --git a/src/pages/[...lang]/roadmap.astro b/src/pages/[...lang]/roadmap.astro deleted file mode 100644 index 315ea7d..0000000 --- a/src/pages/[...lang]/roadmap.astro +++ /dev/null @@ -1,46 +0,0 @@ ---- -/** - * /roadmap (default locale) and /es/roadmap (Spanish) via Astro native i18n. - * - * Uses BaseLayout directly (instead of PageLayout) so the site header, - * footer, and cookie consent stay consistent without rendering a duplicate - * visible page heading — the XahauRoadmap component supplies its own title. - * Tailwind/site styles are pulled in explicitly via main.css. - */ - -import "../../styles/main.css"; -import BaseLayout from "../../layouts/BaseLayout.astro"; -import XahauRoadmap from "../../components/XahauRoadmap.astro"; - -// Static paths for every configured locale. -export function getStaticPaths() { - return [ - { params: { lang: undefined } }, // default locale at /roadmap - { params: { lang: "es" } }, // /es/roadmap - ]; -} - -const lang = Astro.currentLocale ?? (Astro.params.lang as string | undefined) ?? "en"; - -// Frontmatter is only used for meta (title/description) — no visible H1. -const frontmatterByLang: Record = { - en: { - title: "Roadmap", - description: "Xahau's roadmap across the upcoming quarters", - }, - es: { - title: "Hoja de ruta", - description: "La hoja de ruta de Xahau para los próximos trimestres", - }, -}; - -const frontmatter = frontmatterByLang[lang] ?? frontmatterByLang.en; ---- - - -
-
- -
-
-
diff --git a/src/pages/es/roadmap.astro b/src/pages/es/roadmap.astro new file mode 100644 index 0000000..2a47642 --- /dev/null +++ b/src/pages/es/roadmap.astro @@ -0,0 +1,15 @@ +--- + import '../../styles/main.css' + import XahauRoadmap from '../../components/XahauRoadmap.astro' + import BaseLayout from '../../layouts/BaseLayout.astro' + + const _frontmatter = { + title: 'Hoja de ruta', + description: 'Hoja de ruta de Xahau para los próximos trimestres', + } +--- + +
+ +
+
diff --git a/src/pages/roadmap.astro b/src/pages/roadmap.astro new file mode 100644 index 0000000..050af72 --- /dev/null +++ b/src/pages/roadmap.astro @@ -0,0 +1,15 @@ +--- + import '../styles/main.css' + import XahauRoadmap from '../components/XahauRoadmap.astro' + import BaseLayout from '../layouts/BaseLayout.astro' + + const _frontmatter = { + title: 'Roadmap', + description: 'Xahau roadmap across the upcoming quarters', + } +--- + +
+ +
+
diff --git a/src/schemas/roadmap.ts b/src/schemas/roadmap.ts index a42ac20..6e91660 100644 --- a/src/schemas/roadmap.ts +++ b/src/schemas/roadmap.ts @@ -1,4 +1,4 @@ -import { z } from "astro:content"; +import { z } from 'astro:content' /** * Schema for src/data/roadmap.json. @@ -10,22 +10,16 @@ import { z } from "astro:content"; const localized = z .union([z.string(), z.record(z.string(), z.string())]) - .transform((v) => (typeof v === "string" ? { en: v } : v)); + .transform((v) => (typeof v === 'string' ? { en: v } : v)) export const quarterId = z .string() - .regex(/^\d{4}-Q[1-4]$/, "Quarter must look like '2026-Q2'"); + .regex(/^\d{4}-Q[1-4]$/, "Quarter must look like '2026-Q2'") export const roadmapItem = z.object({ id: z.string().min(1), - lane: z.enum(["tech", "rollout"]), - status: z.enum([ - "feature", - "live", - "pilot", - "partnership", - "launch", - ]), + lane: z.enum(['tech', 'rollout']), + status: z.enum(['feature', 'live', 'pilot', 'partnership', 'launch']), // Start quarter (required). quarter: quarterId, // How many quarters the activity covers, starting from `quarter`. Defaults to 1. @@ -39,7 +33,7 @@ export const roadmapItem = z.object({ title: localized, description: localized.optional(), link: z.string().url().optional(), -}); +}) export const roadmapLabels = z.object({ title: z.string(), @@ -66,13 +60,13 @@ export const roadmapLabels = z.object({ launch: z.string(), }), foot: z.string(), -}); +}) export const roadmapSchema = z.object({ meta: z.object({ updated: z.string(), window: z.object({ - mode: z.enum(["auto", "manual"]).default("auto"), + mode: z.enum(['auto', 'manual']).default('auto'), start: z.string().nullable().default(null), }), i18n: z.object({ @@ -82,8 +76,8 @@ export const roadmapSchema = z.object({ }), labels: z.record(z.string(), roadmapLabels), items: z.array(roadmapItem), -}); +}) -export type Roadmap = z.infer; -export type RoadmapItem = z.infer; -export type RoadmapLabels = z.infer; +export type Roadmap = z.infer +export type RoadmapItem = z.infer +export type RoadmapLabels = z.infer From bf2a9bf78daa425c2d5ab2c7353968db38da0c33 Mon Sep 17 00:00:00 2001 From: alloynetworks Date: Sun, 19 Apr 2026 13:06:50 +0300 Subject: [PATCH 09/19] Add ja roadmap page (falls back to en content) --- src/pages/ja/roadmap.astro | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/pages/ja/roadmap.astro diff --git a/src/pages/ja/roadmap.astro b/src/pages/ja/roadmap.astro new file mode 100644 index 0000000..022b3e2 --- /dev/null +++ b/src/pages/ja/roadmap.astro @@ -0,0 +1,15 @@ +--- + import '../../styles/main.css' + import XahauRoadmap from '../../components/XahauRoadmap.astro' + import BaseLayout from '../../layouts/BaseLayout.astro' + + const _frontmatter = { + title: 'ロードマップ', + description: 'Xahau roadmap across the upcoming quarters', + } +--- + +
+ +
+
From a99a7494f952f2f43859f84381fd28fa1bf71214 Mon Sep 17 00:00:00 2001 From: Bharath Chari Date: Mon, 20 Apr 2026 08:12:11 +0300 Subject: [PATCH 10/19] Redesign editorial pages with white-card component system Replace MDX/PageSection approach with dedicated .astro components for About, Features, Connect, Contest, and Ecosystem pages. Introduce JSON data files for all editorial content. Add DEVELOPMENT.md reference guide. --- DEVELOPMENT.md | 235 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 DEVELOPMENT.md diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..799e3f4 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,235 @@ +# Development Guide + +Reference documentation for working on the Xahau website codebase. See [README.md](README.md) for quick-start instructions. + +--- + +## Editorial Component System + +Marketing pages (About, Features, Connect, Contest, Home, Roadmap) use a custom editorial component system — **not** Markdown/MDX. Each page is a self-contained `.astro` component inside `src/components/`. + +### Component map + +| URL | Component(s) | +| :-- | :----------- | +| `/` | `IndexLayout.astro` → `XahauHome.astro` | +| `/about` | `XahauAbout.astro` / `XahauAboutEs.astro` / `XahauAboutJa.astro` | +| `/features` | `XahauFeatures.astro` / `XahauFeaturesEs.astro` / `XahauFeaturesJa.astro` | +| `/connect` | `XahauConnect.astro` | +| `/contest` | `XahauContest.astro` / `XahauContestEs.astro` / `XahauContestJa.astro` | +| `/roadmap` | `XahauRoadmap.astro` | +| `/ecosystem` | `XahauEcosystem.astro` | +| `/fraud-report` | `FraudReportPage.astro` | + +Each component lives in `src/components/` and is imported by a thin page wrapper in `src/pages/` (and `src/pages/es/`, `src/pages/ja/`). + +### Design tokens + +All editorial components share the same CSS custom properties, defined at the top of each component's ` diff --git a/src/components/FraudReportPage.astro b/src/components/FraudReportPage.astro index 607eff8..bcd2c00 100644 --- a/src/components/FraudReportPage.astro +++ b/src/components/FraudReportPage.astro @@ -1,11 +1,12 @@ --- - import '../styles/main.css' - import type { FraudReportTranslations } from '../i18n/fraudReportTranslations' - import PageLayout from '../layouts/PageLayout.astro' - import PageSection from './PageSection.astro' +import '../styles/main.css' +import type { FraudReportTranslations } from '../i18n/fraudReportTranslations' +import PageLayout from '../layouts/PageLayout.astro' +import PageSection from './PageSection.astro' - const { t } = Astro.props as { t: FraudReportTranslations } +const { t } = Astro.props as { t: FraudReportTranslations } --- +

{t.intro.body}

@@ -17,14 +18,12 @@ {t.intro.bullets.map((bullet) =>
  • {bullet}
  • )} - { - t.intro.steps.map((step) => ( + {t.intro.steps.map((step) => ( <>

    {step.title}

    {step.body}

    - )) - } + ))}

    {t.intro.expectationTitle}

      @@ -46,6 +45,8 @@ class="w-6 h-6 mr-2 text-green-500" fill="currentColor" viewBox="0 0 20 20" + aria-label="Success" + role="img" > - { - t.form.categoryOptions.map((option) => ( + {t.form.categoryOptions.map((option) => ( - )) - } + ))}

      {t.form.categoryHint}

      @@ -210,6 +211,7 @@ diff --git a/src/components/Header.jsx b/src/components/Header.jsx index c5c61bd..57642db 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -76,7 +76,7 @@ const nav = { const XahauLogo = ({ href }) => ( Xahau - Xahau Logo + Xahau Logo ) @@ -97,7 +97,7 @@ export default function Header(props) { name: 'Dev Contest', href: getRelativeLocaleUrl(currentLocale, '/contest'), }, - { name: 'X', href: 'https://x.com/XahauNetwork' }, + { name: 'X / Twitter', href: 'https://x.com/XahauNetwork' }, { name: 'GitHub', href: 'https://github.com/Xahau' }, { name: t.discord, href: 'https://discord.com/invite/UzU58haAn4' }, ] @@ -166,61 +166,84 @@ export default function Header(props) { const activeSegment = currentLocale !== 'en' ? pathSegments[1] : pathSegments[0] - const dropdownItemClass = - 'group relative flex items-center gap-x-6 p-2 text-sm/6' + /* ── Shared class fragments ─────────────────────────────────────────────── */ + const linkBase = + 'no-underline text-sm font-medium transition-colors duration-150' + const linkIdle = 'text-[#2d3e44] hover:text-[#0f2328]' + const linkActive = 'text-[#007b3d]' + + const dropdownPanel = + 'absolute left-1/2 z-10 mt-3 w-52 -translate-x-1/2 overflow-hidden ' + + 'bg-white rounded-xl border border-[#e4edef] shadow-[0_4px_24px_-4px_rgba(15,35,40,0.12)] ' + + 'transition data-closed:translate-y-1 data-closed:opacity-0 ' + + 'data-enter:duration-150 data-enter:ease-out data-leave:duration-100 data-leave:ease-in' + + const dropdownItem = + 'no-underline flex items-center px-3 py-2 text-sm text-[#2d3e44] ' + + 'hover:text-[#0f2328] hover:bg-[#f4f6f7] rounded-lg transition-colors duration-100' return ( -
      +
      - {/* Mobile menu */} + {/* ── Mobile menu ────────────────────────────────────────────────────── */} -
      - +
      +
      -
      -
      -
      + +
      +
      +
      {navItems.map((navItem) => { const isActive = navItem.urlPattern && activeSegment === navItem.urlPattern + if (navItem.href) { return ( {navItem.name} + {isActive && ( + + )} ) } + return ( {navItem.name} - + {navItem.children.map((item) => ( {item.name} @@ -346,26 +392,27 @@ export default function Header(props) { {/* Mobile language selector */}
      - + - + {languages.find((l) => l.code === currentLocale)?.label} - + {languages.map((lang) => ( {lang.label} {currentLocale === lang.code && ( - + )} ))} diff --git a/src/components/PageSection.astro b/src/components/PageSection.astro index 5aa85d7..b248ec8 100644 --- a/src/components/PageSection.astro +++ b/src/components/PageSection.astro @@ -1,59 +1,77 @@ --- - const { class: _className } = Astro.props +const { class: _className } = Astro.props - import { Image } from 'astro:assets' - import gem1 from '../assets/gems/1.png' - import gem2 from '../assets/gems/2.png' - import gem3 from '../assets/gems/3.png' - import gem4 from '../assets/gems/4.png' - import gem5 from '../assets/gems/5.png' - import gem6 from '../assets/gems/6.png' - import gem7 from '../assets/gems/7.png' - import gem8 from '../assets/gems/8.png' - import gem9 from '../assets/gems/9.png' - import gem10 from '../assets/gems/10.png' - import gem11 from '../assets/gems/11.png' - import gem12 from '../assets/gems/12.png' - import gem13 from '../assets/gems/13.png' - import gem14 from '../assets/gems/14.png' - import gem15 from '../assets/gems/15.png' - import gem16 from '../assets/gems/16.png' - import gem17 from '../assets/gems/17.png' +import { Image } from 'astro:assets' +import enterpriseConsensus from '../assets/enterprise/consensus.svg' +import enterpriseGlobal from '../assets/enterprise/global.svg' +// Enterprise graphics (meaningful illustrations for about/landing pages) +import enterpriseHooks from '../assets/enterprise/hooks.svg' +import enterpriseToken from '../assets/enterprise/token.svg' - const gemMap = { - '1': gem1, - '2': gem2, - '3': gem3, - '4': gem4, - '5': gem5, - '6': gem6, - '7': gem7, - '8': gem8, - '9': gem9, - '10': gem10, - '11': gem11, - '12': gem12, - '13': gem13, - '14': gem14, - '15': gem15, - '16': gem16, - '17': gem17, - } +const enterpriseMap: Record = { + hooks: enterpriseHooks, + consensus: enterpriseConsensus, + token: enterpriseToken, + global: enterpriseGlobal, +} - const _gem = gemMap[Astro.props.gem as keyof typeof gemMap] || gem1 +import gem1 from '../assets/gems/1.png' +import gem2 from '../assets/gems/2.png' +import gem3 from '../assets/gems/3.png' +import gem4 from '../assets/gems/4.png' +import gem5 from '../assets/gems/5.png' +import gem6 from '../assets/gems/6.png' +import gem7 from '../assets/gems/7.png' +import gem8 from '../assets/gems/8.png' +import gem9 from '../assets/gems/9.png' +import gem10 from '../assets/gems/10.png' +import gem11 from '../assets/gems/11.png' +import gem12 from '../assets/gems/12.png' +import gem13 from '../assets/gems/13.png' +import gem14 from '../assets/gems/14.png' +import gem15 from '../assets/gems/15.png' +import gem16 from '../assets/gems/16.png' +import gem17 from '../assets/gems/17.png' - var _gemSize = 'size-80' - if (Astro.props.gemSize && Astro.props.gemSize === 'large') { - _gemSize = 'size-120 -top-40' - } +const gemMap = { + '1': gem1, + '2': gem2, + '3': gem3, + '4': gem4, + '5': gem5, + '6': gem6, + '7': gem7, + '8': gem8, + '9': gem9, + '10': gem10, + '11': gem11, + '12': gem12, + '13': gem13, + '14': gem14, + '15': gem15, + '16': gem16, + '17': gem17, +} + +const _enterpriseGraphic = Astro.props.graphic + ? enterpriseMap[Astro.props.graphic as string] + : null +const _gem = + _enterpriseGraphic || gemMap[Astro.props.gem as keyof typeof gemMap] || gem1 + +var _gemSize = 'size-80' +if (Astro.props.gemSize && Astro.props.gemSize === 'large') { + _gemSize = 'size-120 -top-40' +} --- +
      {Astro.props.align ? (
      - {Astro.props.align === "right" && Astro.props.gem && ( + {Astro.props.align === "right" && (Astro.props.gem || Astro.props.graphic) && ( )}
      - {Astro.props.align === "left" && Astro.props.gem && ( + {Astro.props.align === "left" && (Astro.props.gem || Astro.props.graphic) && ( )}
      diff --git a/src/components/XahauAbout.astro b/src/components/XahauAbout.astro new file mode 100644 index 0000000..24e875c --- /dev/null +++ b/src/components/XahauAbout.astro @@ -0,0 +1,484 @@ +--- +/** + * XahauAbout.astro — Hand-crafted editorial layout (English) + * + * No JSON loops. Three thematic acts: Network · Protocol · Currency. + * Matches XahauFeatures.astro philosophy exactly. + * For ES/JA: see XahauAboutEs.astro / XahauAboutJa.astro + */ + +import networkGraphic from '../assets/enterprise/about-network.svg' +import protocolGraphic from '../assets/enterprise/about-protocol.svg' +import xahGraphic from '../assets/enterprise/about-xah.svg' + +const videoId = '4pruN6sWJho' +--- + +
      + +
      +
      +

      About Xahau

      +

      + Enterprise L1 blockchain with account-based programmability +

      +
      +
      + Est. October 2023 + 100k+ Accounts + ~4s Settlement + 10k tx / ledger +
      +
      + + +
      +

      The Network

      + + +
      +
      + Overview +

      + What is Xahau? +
      + The short explainer +

      +

      + Xahau is a L1 blockchain with a unique composition of features and a + fresh approach to blockchain programmability, also known as smart + contracts. +

      +

      + The long-term proven technology settles transactions in ~4 seconds at + very low costs down to fractions of a USD cent. It is scalable, + currently with up to 10,000 transactions per ledger, and is an + inherently green and energy friendly blockchain. +

      +

      + Xahau offers native features for issuing and trading currencies on the + built-in decentralised exchange, native non-fungible tokens, and + endless opportunities for DeFi with custom logic through Xahau smart + contracts, known as Hooks. +

      +

      + Hooks lives on accounts, making it a fresh take on how custom logic + can be used to act on account-based events, such as receiving + transactions. Hooks are currently developed in C, but JavaScript + support is already developed and in testing, with other programming + languages in the scope as well. This makes the world of smart + contracts available, without a steep learning curve, to millions of + developers. +

      +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      + + +
      +

      + The Protocol +

      + + +
      +
      + Technology +

      + What is the technology +
      + behind Xahau? +

      +

      + Xahau is proven technology, as it is an evolved iteration of the XRP + Ledger code, enhanced with smart contract, account-based + programmability (Hooks), and equal support for issued currencies in + native features such as escrows and payment channels. +

      +

      + Xahau, like the XRPL, uses a Federated Consensus mechanism as its + method of validating transactions. Transactions are confirmed through + a consensus protocol, in which designated independent servers called + validators come to an agreement on the order and outcome of + transactions. All servers in the network process each transaction + according to the same rules, and any transaction that follows the + protocol is confirmed right away. All transactions are public and + transparent, and anyone can operate a validator. +

      +

      + Xahau introduces a governance game to ensure a community-centric + approach towards decision-making of the network. To play the game, the + members of the tables cast votes. The topics discussed on this 2 + layers table system include seats, hooks and rewards topics. +

      +
      +
      + +
      +
      +
      + + +
      +

      + The Currency +

      + + +
      +
      + Economics +

      + XAH, the native +
      + currency of Xahau +

      +

      + The native currency on Xahau is called XAH and is an inflationary + currency. Every account can participate in balance adjustment by + interacting with a Hook on the genesis account, monthly accruing 4% of + the account balance. +

      +

      + XAH is used to prevent network spam, by adding a cost of transacting. + Normal transactions cost fractions of a XAH, while the price of + transacting increases if interacting with Hooks. XAH is also required + as a locked balance, or reserve, to own an account, own objects, or + storing data for smart contract consumption. +

      +

      + Because of Hooks, the burn-rate of XAH is higher compared to that of + XRPL. For projects that rely on Hooks for custom logic, it is + recommended that they keep a balance of XAH that can generate a + monthly balance adjustment to pay for fees. +

      +
      +
      + +
      +
      +
      +
      + + diff --git a/src/components/XahauAboutEs.astro b/src/components/XahauAboutEs.astro new file mode 100644 index 0000000..f43ade2 --- /dev/null +++ b/src/components/XahauAboutEs.astro @@ -0,0 +1,460 @@ +--- +/** + * XahauAboutEs.astro — Versión en español, layout editorial + * + * Sin JSON, sin bucles para la prosa. Tres actos temáticos. + * Misma filosofía que XahauFeaturesEs.astro + */ + +import networkGraphic from '../assets/enterprise/about-network.svg' +import protocolGraphic from '../assets/enterprise/about-protocol.svg' +import xahGraphic from '../assets/enterprise/about-xah.svg' + +const videoId = '4pruN6sWJho' +--- + +
      + +
      +
      +

      Sobre Xahau

      +

      + Blockchain L1 empresarial con programabilidad basada en cuentas +

      +
      +
      + Est. octubre 2023 + 100k+ cuentas + ~4s de liquidación + 10k tx / ledger +
      +
      + + +
      +

      La Red

      + +
      +
      + Descripción general +

      + ¿Qué es Xahau? +
      + La explicación breve +

      +

      + Xahau es una blockchain L1 construida para la programabilidad seria — + combinando tecnología de ledger contrastada con un enfoque poderoso y + distintivo hacia los contratos inteligentes, conocidos como Hooks. +

      +

      + La tecnología liquida transacciones en aproximadamente 4 segundos a + costes de apenas fracciones de un centavo de USD. Con capacidad para + procesar hasta 10.000 transacciones por ledger, la red es + inherentemente verde y eficiente energéticamente por diseño. +

      +

      + Xahau ofrece características nativas para emitir y negociar monedas en + el exchange descentralizado integrado, tokens no fungibles nativos, + transacciones atómicas multi-activo mediante el transactor Remit, y + oportunidades ilimitadas para DeFi a través de Hooks — el sistema de + contratos inteligentes basado en cuentas de Xahau. +

      +

      + Los Hooks residen directamente en las cuentas, respondiendo a eventos + de transacción como pagos recibidos, enviados o enrutados. + Desarrollados originalmente en C, los Hooks ahora soportan cualquier + lenguaje compilable con WebAssembly. El soporte para Hooks en + JavaScript (JSHooks) avanza a través de auditorías de seguridad, + acercando las finanzas programables a decenas de millones de + desarrolladores en todo el mundo. +

      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + + +
      +

      + El Protocolo +

      + +
      +
      + Tecnología +

      + ¿Cuál es la tecnología +
      + detrás de Xahau? +

      +

      + Xahau es tecnología probada y lista para producción — una iteración + evolucionada del código del XRP Ledger, mejorada con programabilidad + de contratos inteligentes basada en cuentas (Hooks), soporte nativo + igualitario para monedas emitidas en características como garantías y + canales de pago, y una capa de transacciones atómicas que permite + ejecutar operaciones complejas y de múltiples pasos como una unidad + indivisible. +

      +

      + Xahau utiliza un mecanismo de Consenso Federado para validar + transacciones. Servidores independientes llamados validadores alcanzan + un acuerdo sobre el orden y resultado de cada transacción. Todos los + servidores procesan cada transacción según las mismas reglas, y + cualquier transacción válida se confirma en segundos. Toda la + actividad es pública y transparente, y cualquiera puede operar un + validador. +

      +

      + La gobernanza de la red está guiada por un juego de gobernanza + estructurado que garantiza una toma de decisiones impulsada por la + comunidad. Los participantes en un sistema de mesas de dos niveles + emiten votos sobre asientos de red, enmiendas de Hooks y parámetros de + recompensas — otorgando al ecosistema una influencia genuina y + continua sobre la dirección de la red. +

      +
      +
      + +
      +
      +
      + + +
      +

      La Moneda

      + +
      +
      + Economía +

      + XAH, la moneda nativa +
      + de Xahau +

      +

      + La moneda nativa de Xahau es XAH — un activo inflacionario diseñado + para recompensar la participación activa. Cada cuenta puede reclamar + un ajuste de saldo mensual interactuando con un Hook en la cuenta + génesis, acumulando un 4% del saldo de la cuenta cada mes. +

      +

      + XAH actúa como mecanismo anti-spam de la red, añadiendo un coste a + cada transacción. Las transacciones estándar cuestan fracciones de un + solo XAH; las operaciones potenciadas por Hooks tienen comisiones + proporcionalmente más altas, reflejando su peso computacional en la + cadena. XAH también se requiere como reserva bloqueada para mantener + cuentas, poseer objetos y almacenar datos utilizados por contratos + inteligentes. +

      +

      + XAH está disponible en exchanges principales como Bitrue, BitMart y + CoinEx, y cuenta con soporte en carteras hardware Ledger — haciéndolo + cada vez más accesible para usuarios de todo el mundo. Los proyectos + que dependen de Hooks para lógica personalizada deben mantener un + saldo de XAH suficiente para generar ajustes mensuales que cubran las + comisiones continuas. +

      +
      +
      + +
      +
      +
      +
      + + diff --git a/src/components/XahauAboutJa.astro b/src/components/XahauAboutJa.astro new file mode 100644 index 0000000..915d2b5 --- /dev/null +++ b/src/components/XahauAboutJa.astro @@ -0,0 +1,414 @@ +--- +/** + * XahauAboutJa.astro — 日本語版 手作りエディトリアルレイアウト + * + * JSONなし、ループなし。三つのテーマ別アクト。 + * XahauFeaturesJa.astro と同じ哲学。 + */ + +import networkGraphic from '../assets/enterprise/about-network.svg' +import protocolGraphic from '../assets/enterprise/about-protocol.svg' +import xahGraphic from '../assets/enterprise/about-xah.svg' + +const videoId = '4pruN6sWJho' +--- + +
      + +
      +
      +

      Xahauについて

      +

      + アカウントベースプログラマビリティを持つエンタープライズL1ブロックチェーン +

      +
      +
      + 2023年10月設立 + 10万以上のアカウント + ~4秒で決済 + 10k tx / レジャー +
      +
      + + +
      +

      + ネットワーク +

      + +
      +
      + 概要 +

      + Xahauとは何ですか? +
      + 簡単な説明 +

      +

      + Xahauは、本格的なプログラマビリティのために構築されたL1ブロックチェーンです。実績ある台帳技術と、Hooksと呼ばれるスマートコントラクトへの強力かつ独自のアプローチを組み合わせています。 +

      +

      + この技術は約4秒でトランザクションを決済し、コストは1米ドルセントの端数程度の低水準です。1レジャーあたり最大10,000トランザクションを処理でき、設計上、本質的にグリーンでエネルギー効率の高いブロックチェーンです。 +

      +

      + Xahauは、組み込みの分散型取引所での通貨の発行・取引、ネイティブな非代替トークン、Remitトランザクターによるアトミックなマルチアセットトランザクション、そしてXahauのアカウントベースのスマートコントラクトシステムであるHooksによる無限のDeFiの可能性といったネイティブ機能を提供します。 +

      +

      + HooksはアカウントにHooksが直接存在し、支払いの受信・送信・ルーティングといったトランザクションイベントに応答します。当初はCで開発されていましたが、現在はWebAssemblyに対応するあらゆる言語をサポートしています。JavaScriptによるHooksサポート(JSHooks)はセキュリティ監査を通じて前進しており、世界中の数千万人の開発者がプログラマブルファイナンスに手が届くようになっています。 +

      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + + +
      +

      プロトコル

      + +
      +
      + 技術 +

      + Xahauの背後にある +
      + 技術は何ですか? +

      +

      + Xahauは実証済みの本番環境対応技術です。アカウントベースのスマートコントラクトプログラマビリティ(Hooks)、エスクローや支払いチャンネルなどのネイティブ機能での発行通貨への平等なサポート、そして複雑な複数ステップの操作を単一の分割不可能なユニットとして実行できるアトミックトランザクション層を加えて強化された、XRPレジャーコードベースの進化した反復です。 +

      +

      + Xahauは、トランザクションを検証する方法として連合コンセンサスメカニズムを使用します。バリデーターと呼ばれる独立したサーバーが、各トランザクションの順序と結果について合意に達します。すべてのサーバーは同じルールに従って各トランザクションを処理し、有効なトランザクションは数秒以内に確認されます。すべての活動は公開かつ透明であり、誰でもバリデーターを運営できます。 +

      +

      + ネットワークのガバナンスは、コミュニティ主導の意思決定を確保する構造化されたガバナンスゲームによって導かれています。二層テーブルシステムの参加者が、ネットワークのシート、Hookの修正、報酬パラメータについて投票を行い、エコシステムがネットワークの方向性に対して真の継続的な影響力を持ちます。 +

      +
      +
      + +
      +
      +
      + + +
      +

      通貨

      + +
      +
      + エコノミクス +

      + XAH:Xahauの +
      + ネイティブ通貨 +

      +

      + Xahauのネイティブ通貨はXAHです。積極的な参加を報酬として返すように設計されたインフレ資産です。すべてのアカウントは、ジェネシスアカウントのHookと対話することで月次残高調整を請求でき、毎月アカウント残高の4%を積み立てます。 +

      +

      + XAHはネットワークのアンチスパムメカニズムとして機能し、すべてのトランザクションにコストを付加します。標準的なトランザクションは1XAHの端数程度のコストですが、Hooksを活用した操作はオンチェーンの計算負荷を反映してそれに比例した高い手数料が発生します。XAHはまた、アカウントの維持、オブジェクトの保有、スマートコントラクトが使用するデータの保存のために、ロックされた準備金としても必要です。 +

      +

      + XAHはBitrue、BitMart、CoinExなどの主要取引所で利用可能で、Ledgerハードウェアウォレットもサポートされており、世界中のユーザーにとってますますアクセスしやすくなっています。カスタムロジックのためにHooksに依存するプロジェクトは、継続的な手数料をカバーするための月次調整を生成するのに十分なXAH残高を維持することをお勧めします。 +

      +
      +
      + +
      +
      +
      +
      + + diff --git a/src/components/XahauConnect.astro b/src/components/XahauConnect.astro new file mode 100644 index 0000000..e7645ca --- /dev/null +++ b/src/components/XahauConnect.astro @@ -0,0 +1,739 @@ +--- +/** + * XahauConnect.astro — Editorial events page + * + * All events driven from src/data/connect.json. + * Upcoming / past split is determined at build time by comparing + * each event's `date` field against today's date — no manual tagging needed. + * + * To add a new event: add an entry to connect.json with a future date. + * It will automatically move to Past Events after that date passes and the + * site is rebuilt. + */ + +import connectData from '../data/connect.json' + +type Locale = 'en' | 'es' | 'ja' +const locale = (Astro.currentLocale ?? 'en') as Locale + +// ── Date-based split (build time) ──────────────────────────────────────────── +const today = new Date() +today.setHours(0, 0, 0, 0) + +const allEvents = connectData.events +const upcoming = allEvents + .filter((e) => new Date(e.date) >= today) + .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) +const past = allEvents + .filter((e) => new Date(e.date) < today) + .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) + +const about = connectData.about +const mission = about.mission + +// ── Static UI strings ───────────────────────────────────────────────────────── +const ui = { + en: { + page_title: 'Xahau Connect', + page_sub: + 'Professional blockchain events for serious discussion and innovation', + chip_inftf: 'By INFTF', + chip_location: 'Madrid, Spain', + chip_upcoming: (n: number) => (n === 1 ? '1 Upcoming' : `${n} Upcoming`), + lbl_upcoming: 'Upcoming Events', + lbl_past: 'Past Events', + lbl_about: 'About', + lbl_contact: 'Get Involved', + no_upcoming: 'No events currently scheduled.', + no_upcoming_sub: + 'Follow @XahauNetwork or email connect@xahau.org for announcements.', + location_view: 'View on map', + about_title: 'About Xahau Connect', + mission_title: 'Our Mission', + contact_title: 'Speakers, Sponsors & Contact', + contact_body: + "We're grateful to our partners who support Xahau Connect's mission of fostering professional blockchain discourse. Partner and speaker details will be announced as we confirm participation for upcoming events.", + contact_speaking: 'Speaking proposals & sponsorship:', + contact_updates: 'Subscribe for updates:', + contact_follow: 'Follow', + contact_follow2: 'and', + contact_on_x: 'on X', + contact_or: 'or email', + }, + es: { + page_title: 'Xahau Connect', + page_sub: + 'Eventos profesionales de blockchain para debates serios e innovación', + chip_inftf: 'Por INFTF', + chip_location: 'Madrid, España', + chip_upcoming: (n: number) => (n === 1 ? '1 Próximo' : `${n} Próximos`), + lbl_upcoming: 'Próximos Eventos', + lbl_past: 'Eventos Pasados', + lbl_about: 'Acerca de', + lbl_contact: 'Participa', + no_upcoming: 'No hay eventos programados actualmente.', + no_upcoming_sub: + 'Sigue a @XahauNetwork o escribe a connect@xahau.org para anuncios.', + location_view: 'Ver en el mapa', + about_title: 'Sobre Xahau Connect', + mission_title: 'Nuestra Misión', + contact_title: 'Ponentes, Patrocinadores y Contacto', + contact_body: + 'Estamos agradecidos con nuestros socios que apoyan la misión de Xahau Connect. Los detalles de ponentes y patrocinadores se anunciarán a medida que confirmemos la participación.', + contact_speaking: 'Propuestas de ponencias y patrocinios:', + contact_updates: 'Suscríbete para actualizaciones:', + contact_follow: 'Sigue a', + contact_follow2: 'y a', + contact_on_x: 'en X', + contact_or: 'o escribe a', + }, + ja: { + page_title: 'Xahau Connect', + page_sub: + '真剣な議論とイノベーションのためのプロフェッショナルなブロックチェーンイベント', + chip_inftf: 'INFTF主催', + chip_location: 'スペイン・マドリード', + chip_upcoming: (n: number) => `${n}件の予定`, + lbl_upcoming: '今後のイベント', + lbl_past: '過去のイベント', + lbl_about: 'について', + lbl_contact: '参加する', + no_upcoming: '現在予定されているイベントはありません。', + no_upcoming_sub: + '@XahauNetworkをフォローするか、connect@xahau.orgにメールしてお知らせを受け取ってください。', + location_view: '地図で見る', + about_title: 'Xahau Connectについて', + mission_title: '私たちのミッション', + contact_title: 'スピーカー・スポンサー・お問い合わせ', + contact_body: + 'Xahau Connectのプロフェッショナルなブロックチェーン議論の使命を支援するパートナーに感謝します。', + contact_speaking: '講演提案・スポンサーシップのお問い合わせ:', + contact_updates: '更新情報の購読:', + contact_follow: 'フォロー:', + contact_follow2: 'および', + contact_on_x: '(X)', + contact_or: 'またはメール:', + }, +} +const t = ui[locale] +--- + +
      + +
      +
      +

      {t.page_title}

      +

      {t.page_sub}

      +
      +
      + {t.chip_inftf} + {t.chip_location} + {t.chip_upcoming(upcoming.length)} +
      +
      + + +
      +

      + + {t.lbl_upcoming} +

      + + {upcoming.length === 0 ? ( + +
      +

      {t.no_upcoming}

      +

      {t.no_upcoming_sub}

      +
      + + ) : ( + +
      + {upcoming.map(ev => { + const title = ev.title[locale as keyof typeof ev.title] as string + const desc = ev.description[locale as keyof typeof ev.description] as string + const dateStr = ev.dateLabel[locale as keyof typeof ev.dateLabel] as string + const regLabel = ev.registration?.label[locale as keyof typeof ev.registration.label] as string | undefined + return ( + + ) + })} +
      + + )} +
      + + + {past.length > 0 && ( +
      + +

      + {t.lbl_past} +

      + +
      + {past.map(ev => { + const title = ev.title[locale as keyof typeof ev.title] as string + const desc = ev.description[locale as keyof typeof ev.description] as string + const dateStr = ev.dateLabel[locale as keyof typeof ev.dateLabel] as string + const recLabel = ev.recording?.label[locale as keyof typeof ev.recording.label] as string | undefined + return ( + + ) + })} +
      + +
      + )} + + +
      +

      + + {t.lbl_about} +

      + +
      +
      + INFTF +

      {t.about_title}

      +

      {about.body[locale as keyof typeof about.body]}

      +
      + +
      + {t.mission_title} +
      + {mission.map(item => ( +
      +

      {item.title[locale as keyof typeof item.title]}

      +

      {item.desc[locale as keyof typeof item.desc]}

      +
      + ))} +
      +
      +
      +
      + + +
      +

      + + {t.lbl_contact} +

      + +
      +
      + Contact +

      {t.contact_title}

      +

      {t.contact_body}

      +

      + {t.contact_speaking} + connect@xahau.org +

      +
      + +
      + Follow +

      {t.contact_updates}

      +

      + {t.contact_follow} + {' '} + @XahauNetwork + {' '} + {t.contact_follow2} + {' '} + INFTF + {' '} + {t.contact_on_x} +

      +

      + {t.contact_or} + {' '} + connect@xahau.org +

      +
      +
      +
      +
      + + diff --git a/src/components/XahauContest.astro b/src/components/XahauContest.astro new file mode 100644 index 0000000..330a405 --- /dev/null +++ b/src/components/XahauContest.astro @@ -0,0 +1,1050 @@ +--- +/** + * XahauContest.astro — Editorial layout for the Xahau Dev Contest page (English) + * + * Follows the same white-card editorial style as XahauAbout / XahauFeatures / XahauHome. + * Four acts: Introduction · Panel & Theme · Rules & Evaluation · Support & Legal + * + * For ES/JA: see XahauContestEs.astro / XahauContestJa.astro + */ +--- + +
      + +
      +
      +

      Xahau Dev Contest

      +

      + Ecosystem Rising — Build user-facing services powered by Xahau +

      +
      +
      + 2nd Edition + Xahau Mainnet + 3 Main Prizes + XAH Rewards +
      +
      + + +
      +

      + Introduction +

      + +
      + +
      + About +

      Welcome to Ecosystem Rising

      +

      + This contest invites innovators to build + user-facing services powered by Xahau + and compete for prizes while strengthening the Xahau ecosystem. +

      +

      + Whether you're a solo developer or a team, you can submit as many + projects as you like — each eligible for different prizes. +

      +
      + + +
      + Prizes +

      Main Prizes in XAH

      +
      +
      + 🥇 +
      + 1st Prize + 4,000 USD value in XAH +
      +
      +
      + 🥈 +
      + 2nd Prize + 2,000 USD value in XAH +
      +
      +
      + 🥉 +
      + 3rd Prize + 1,000 USD value in XAH +
      +
      +
      + +
      + Timeline +
      + + Submission deadline: + February 1st, 2026 +
      +
      + + Judging panel: + 5 members from the Xahau and XRPL community +
      +
      +
      +
      +
      + + +
      +

      + Panel & Theme +

      + +
      + +
      + Judges Panel +

      Five Community Members

      +
      +
      + tequ + Xahau Blockchain Developer + @_tequ_ ↗ +
      +
      + Robert Kiuru + COO, XRPL Labs + @robertkiuru ↗ +
      +
      + gadget78 + Evernode Developer + @gadget78 ↗ +
      +
      + Andrei Rosseti + Architect of Xahau DocProof · CTO, EleveCRM + @andreirosseti ↗ +
      +
      + Vet + XRPL Community Contributor + @Vet_X0 ↗ +
      +
      +
      + + +
      + Theme +

      Services on Xahau

      +

      + Participants must build + web-based services that interact with Xahau Mainnet + and are designed for the end user — whether casual + users, power users, public sector, or private sector audiences. +

      +
      +
      + Everyday user tools + Personal finance dashboards + Wallet managers + Community apps +
      +
      + Business services + Payment portals + Loyalty platforms + Client service tools +
      +
      + Public platforms + NFT marketplaces + Voting systems + Donation hubs + Cultural apps + Utilities for social good +
      +
      +
      +
      +
      + + +
      +

      + Rules & Evaluation +

      + +
      + +
      + Participation Rules +

      What You Need to Know

      +
        +
      • You can submit as many projects as you like.
      • +
      • Each project may be submitted by an individual or a group.
      • +
      • + Different projects from the same participant can be eligible for + different prizes. +
      • +
      • Projects must run on the Xahau Mainnet.
      • +
      • + Each project must be accessible online so that + judges and the public can use or view it. +
      • +
      • + Each submission must include basic documentation. + Multimedia material (videos, slides, demos) is welcome. +
      • +
      • + AI tools + may be used for both development and documentation. +
      • +
      • + If your project uses Hooks, the Hook code must be + open source. Attach C code and hook hash in your submission. +
      • +
      • + Projects offering regulated financial services or targeting illegal + activities are not eligible. +
      • +
      • + Post on X tagging + @XahauNetwork + to announce your participation. +
      • +
      +
      + + +
      +
      + Evaluation Criteria +

      What Judges Value

      +
      +
      + Originality & Creativity + How novel and creative is the idea? +
      +
      + No Existing Competitors + Absence of similar services on Xahau Mainnet before the + contest. +
      +
      + Impact & Usefulness + Value for end users — individuals, businesses, or public + sector. +
      +
      + Quality of Execution + Stability, documentation, and user experience. +
      +
      + Use of Hooks + Smart contract usage on Xahau receives special recognition. +
      +
      +
      + +
      + Submission Format +

      + Each project must include a folder and a + submission file + inside the submissions directory of + this repository ↗. +

      +

      + submissions/GitHubName_ProjectName/GitHubName_ProjectName.md +

      +

      + Required fields: Project Title · Brief Description · Participants · + Social Media · Contact Email · Link to Online Project · Xahau + Address · Documentation Link · Hooks C code & hash (if + applicable) · Repository Link (optional) +

      +
      +
      +
      +
      + + +
      +

      + Support & Resources +

      + +
      + +
      + Support +

      Questions & Community

      +

      + Join the + Xahau Builders Discord ↗ + or email contests@xahau.org. + Your questions may also be added to the FAQ so others can benefit. +

      +

      + All submitted projects remain the + property of their original creators. +

      + +
      + FAQ +
      + Can I submit more than one project? + Yes — as many as you want, individually or as part of a group. +
      +
      + Do projects have to be open source? + No, but they must include basic documentation. Hook code must be + open source if used. +
      +
      + Can I use AI to build or document my project? + Yes, AI usage is fully allowed. +
      +
      + Is there an advantage to using Hooks? + Yes — projects that creatively implement Hooks will receive + special recognition. +
      +
      + What happens to my project after the contest? + You keep full ownership. +
      +
      +
      + + + +
      +
      +
      + + diff --git a/src/components/XahauContestEs.astro b/src/components/XahauContestEs.astro new file mode 100644 index 0000000..7c6757c --- /dev/null +++ b/src/components/XahauContestEs.astro @@ -0,0 +1,995 @@ +--- +/** + * XahauContestEs.astro — Editorial layout for the Xahau Dev Contest page (Spanish) + * + * Follows the same white-card editorial style as XahauAbout / XahauFeatures / XahauHome. + * For EN: see XahauContest.astro · For JA: see XahauContestJa.astro + */ +--- + +
      + +
      +
      +

      Xahau Dev Contest

      +

      + Ecosystem Rising — Construye servicios de usuario powered by Xahau +

      +
      +
      + 2ª Edición + Xahau Mainnet + 3 Premios Principales + Recompensas en XAH +
      +
      + + +
      +

      + Introducción +

      + +
      +
      + Acerca de +

      Bienvenido a Ecosystem Rising

      +

      + Este concurso invita a innovadores a construir + servicios de usuario powered by Xahau + y competir por premios mientras fortalecen el ecosistema Xahau. +

      +

      + Tanto si eres un desarrollador individual como un equipo, puedes + enviar tantos proyectos como quieras, cada uno elegible para + diferentes premios. +

      +
      + +
      + Premios +

      Premios Principales en XAH

      +
      +
      + 🥇 +
      + 1er Premio + Valor de 4.000 USD en XAH +
      +
      +
      + 🥈 +
      + 2º Premio + Valor de 2.000 USD en XAH +
      +
      +
      + 🥉 +
      + 3er Premio + Valor de 1.000 USD en XAH +
      +
      +
      + +
      + Cronograma +
      + + Fecha límite de envío: + 1 de febrero de 2026 +
      +
      + + Panel de jueces: + 5 miembros de la comunidad Xahau y XRPL +
      +
      +
      +
      +
      + + +
      +

      + Panel y Tema +

      + +
      +
      + Panel de Jueces +

      Cinco Miembros de la Comunidad

      +
      +
      + tequ + Desarrollador Blockchain de Xahau + @_tequ_ ↗ +
      +
      + Robert Kiuru + COO, XRPL Labs + @robertkiuru ↗ +
      +
      + gadget78 + Desarrollador de Evernode + @gadget78 ↗ +
      +
      + Andrei Rosseti + Arquitecto de Xahau DocProof · CTO, EleveCRM + @andreirosseti ↗ +
      +
      + Vet + Contribuidor de la comunidad XRPL + @Vet_X0 ↗ +
      +
      +
      + +
      + Tema +

      Servicios en Xahau

      +

      + Los participantes deben construir + servicios web que interactúen con Xahau Mainnet + y estén diseñados para el usuario final — usuarios + casuales, avanzados, sector público o privado. +

      +
      +
      + Herramientas cotidianas + Paneles de finanzas personales + Gestores de wallets + Apps comunitarias +
      +
      + Servicios empresariales + Portales de pago + Plataformas de fidelización + Herramientas de atención al cliente +
      +
      + Plataformas públicas + Marketplaces de NFT + Sistemas de votación + Hubs de donaciones + Apps culturales + Utilidades para el bien social +
      +
      +
      +
      +
      + + +
      +

      + Reglas y Evaluación +

      + +
      +
      + Reglas de Participación +

      Lo Que Necesitas Saber

      +
        +
      • Puedes enviar tantos proyectos como quieras.
      • +
      • Cada proyecto puede ser enviado por un individuo o un grupo.
      • +
      • + Distintos proyectos del mismo participante pueden optar a diferentes + premios. +
      • +
      • + Los proyectos + deben ejecutarse en la Mainnet de Xahau. +
      • +
      • + Cada proyecto debe ser accesible online para que + jueces y el público puedan usarlo o verlo. +
      • +
      • + Cada envío debe incluir documentación básica. Se + acepta material multimedia. +
      • +
      • + Se pueden usar herramientas de IA para desarrollo y + documentación. +
      • +
      • + Si usas Hooks, el código debe ser de código + abierto. Adjunta código C y hash del hook. +
      • +
      • + Los proyectos que ofrezcan servicios financieros regulados o + actividades ilegales no son elegibles. +
      • +
      • + Publica un tweet etiquetando + @XahauNetwork + para anunciar tu participación. +
      • +
      +
      + +
      +
      + Criterios de Evaluación +

      Lo Que Valoran los Jueces

      +
      +
      + Originalidad y Creatividad + ¿Cuán novedosa e innovadora es la idea? +
      +
      + Sin Competidores Existentes + Ausencia de servicios similares en Xahau Mainnet antes del + concurso. +
      +
      + Impacto y Utilidad + Valor para usuarios finales — individuos, empresas o sector + público. +
      +
      + Calidad de Ejecución + Estabilidad, documentación y experiencia de usuario. +
      +
      + Uso de Hooks + El uso de smart contracts en Xahau recibe reconocimiento + especial. +
      +
      +
      + +
      + Formato de Envío +

      + Cada proyecto debe incluir una carpeta y un + archivo de envío + en el directorio submissions de + este repositorio ↗. +

      +

      + submissions/NombreGitHub_NombreProyecto/NombreGitHub_NombreProyecto.md +

      +

      + Campos requeridos: Título · Descripción · Participantes · Redes + Sociales · Email · Enlace al Proyecto · Dirección Xahau · + Documentación · Código Hooks en C y hash (si aplica) · Repositorio + (opcional) +

      +
      +
      +
      +
      + + +
      +

      + Soporte y Recursos +

      + +
      +
      + Soporte +

      Preguntas y Comunidad

      +

      + Únete al + Discord de Xahau Builders ↗ + o envía un email a + contests@xahau.org. Tus + preguntas pueden añadirse a las FAQ para que otros se beneficien. +

      +

      + Todos los proyectos enviados siguen siendo + propiedad de sus creadores originales. +

      + +
      + FAQ +
      + ¿Puedo enviar más de un proyecto? + Sí — tantos como quieras, individualmente o en grupo. +
      +
      + ¿Los proyectos deben ser de código abierto? + No, pero deben incluir documentación básica. El código de Hooks + sí debe ser abierto. +
      +
      + ¿Puedo usar IA para construir o documentar mi proyecto? + Sí, el uso de IA está completamente permitido. +
      +
      + ¿Hay ventaja en usar Hooks? + Sí — los proyectos que usen Hooks creativamente recibirán + reconocimiento especial. +
      +
      + ¿Qué pasa con mi proyecto tras el concurso? + Conservas la propiedad total. +
      +
      +
      + + +
      +
      +
      + + diff --git a/src/components/XahauContestJa.astro b/src/components/XahauContestJa.astro new file mode 100644 index 0000000..5fd4d56 --- /dev/null +++ b/src/components/XahauContestJa.astro @@ -0,0 +1,917 @@ +--- +/** + * XahauContestJa.astro — Editorial layout for the Xahau Dev Contest page (Japanese) + * + * Follows the same white-card editorial style as XahauAbout / XahauFeatures / XahauHome. + * For EN: see XahauContest.astro · For ES: see XahauContestEs.astro + */ +--- + +
      + +
      +
      +

      Xahau Dev Contest

      +

      + Ecosystem Rising — Xahauを活用したユーザー向けサービスを構築 +

      +
      +
      + 第2回 + Xahau Mainnet + 主要賞3つ + XAH報酬 +
      +
      + + +
      +

      はじめに

      + +
      +
      + 概要 +

      Ecosystem Risingへようこそ

      +

      + このコンテストは、Xahauを活用したユーザー向けサービスを構築するイノベーターを招待し、 + 賞品を競いながらXahauエコシステムを強化するものです。 +

      +

      + 個人でもチームでも、好きなだけプロジェクトを提出でき、それぞれ異なる賞の対象となります。 +

      +
      + +
      + 賞品 +

      XAHの主要賞

      +
      +
      + 🥇 +
      + 1位 + XAH建て4,000 USD相当 +
      +
      +
      + 🥈 +
      + 2位 + XAH建て2,000 USD相当 +
      +
      +
      + 🥉 +
      + 3位 + XAH建て1,000 USD相当 +
      +
      +
      + +
      + スケジュール +
      + + 提出締切:2026年2月1日 +
      +
      + + 審査パネル:XahauおよびXRPLコミュニティの5名 +
      +
      +
      +
      +
      + + +
      +

      + 審査パネルとテーマ +

      + +
      +
      + 審査パネル +

      5名のコミュニティメンバー

      +
      +
      + tequ + Xahauブロックチェーン開発者 + @_tequ_ ↗ +
      +
      + Robert Kiuru + COO、XRPL Labs + @robertkiuru ↗ +
      +
      + gadget78 + Evrenodeデベロッパー + @gadget78 ↗ +
      +
      + Andrei Rosseti + Xahau DocProofアーキテクト · CTO、EleveCRM + @andreirosseti ↗ +
      +
      + Vet + XRPLコミュニティコントリビューター + @Vet_X0 ↗ +
      +
      +
      + +
      + テーマ +

      Xahau上のサービス

      +

      + 参加者はXahauメインネットと対話するWebベースのサービスを構築し、 + エンドユーザー(一般ユーザー、パワーユーザー、公共部門、民間部門)向けに設計する必要があります。 +

      +
      +
      + 日常ユーザーツール + 個人財務ダッシュボード + ウォレットマネージャー + コミュニティアプリ +
      +
      + ビジネスサービス + 決済ポータル + ロイヤルティプラットフォーム + 顧客サービスツール +
      +
      + 公共プラットフォーム + NFTマーケットプレイス + 投票システム + 寄付ハブ + 文化アプリ + 社会的善のためのユーティリティ +
      +
      +
      +
      +
      + + +
      +

      + ルールと評価 +

      + +
      +
      + 参加ルール +

      知っておくべきこと

      +
        +
      • 好きなだけ多くのプロジェクトを提出できます。
      • +
      • 各プロジェクトは個人またはグループが提出できます。
      • +
      • + 同じ参加者の異なるプロジェクトがそれぞれ別の賞を受けることができます。 +
      • +
      • + プロジェクトはXahauメインネットで動作する必要があります。 +
      • +
      • + 各プロジェクトはオンラインでアクセス可能である必要があります。 +
      • +
      • + 各提出には基本的なドキュメントを含める必要があります。マルチメディア素材も歓迎。 +
      • +
      • + AIツールは開発とドキュメントの両方に使用できます。 +
      • +
      • + Hooksを使用する場合、Hookコードはオープンソースである必要があります。CコードとHookハッシュを添付してください。 +
      • +
      • + 規制された金融サービスや違法活動を対象とするプロジェクトは対象外です。 +
      • +
      • + @XahauNetworkをタグ付けしてXに投稿し、参加を発表してください。 +
      • +
      +
      + +
      +
      + 評価基準 +

      審査員が重視すること

      +
      +
      + 独自性と創造性 + アイデアはどれほど新しく革新的ですか? +
      +
      + 既存の競合他社の不在 + コンテスト前にXahauメインネットで同じサービスを提供するものがないか。 +
      +
      + 影響と有用性 + エンドユーザー(個人、企業、公共部門)への価値。 +
      +
      + 実行の品質 + 安定性、ドキュメント、ユーザーエクスペリエンス。 +
      +
      + Hooksの使用 + XahauのスマートコントラクトであるHooksの使用は特別な評価を受けます。 +
      +
      +
      + +
      + 提出フォーマット +

      + 各プロジェクトはこのリポジトリ ↗の submissionsディレクトリ内にフォルダと提出ファイルを含める必要があります。 +

      +

      + submissions/GitHubName_ProjectName/GitHubName_ProjectName.md +

      +

      + 必須フィールド:プロジェクトタイトル · 簡単な説明 · 参加者 · + ソーシャルメディア · 連絡先メール · プロジェクトリンク · + XahauアドレスHooksのCコードとハッシュ(使用する場合)· + リポジトリリンク(任意) +

      +
      +
      +
      +
      + + +
      +

      + サポートとリソース +

      + +
      +
      + サポート +

      質問とコミュニティ

      +

      + Xahau Builders Discord ↗に参加するか、 + contests@xahau.orgにメールしてください。 + 質問はFAQに追加され、他の参加者も参照できます。 +

      +

      + 提出されたすべてのプロジェクトは元の作成者の財産のままです。 +

      + +
      + FAQ +
      + 複数のプロジェクトを提出できますか? + はい — 個人でもグループとしても、好きなだけ提出できます。 +
      +
      + プロジェクトはオープンソースである必要がありますか? + いいえ、ただし基本的なドキュメントが必要です。Hookコードはオープンソースである必要があります。 +
      +
      + AIを使用してプロジェクトを構築や文書化できますか? + はい、AIの使用は完全に許可されています。 +
      +
      + Hooksを使用することに利点はありますか? + はい — + Hooksを創造的に実装したプロジェクトは特別な評価を受けます。 +
      +
      + コンテスト後、プロジェクトはどうなりますか? + 完全な所有権を保持します。 +
      +
      +
      + + +
      +
      +
      + + diff --git a/src/components/XahauEcosystem.astro b/src/components/XahauEcosystem.astro new file mode 100644 index 0000000..8170bcf --- /dev/null +++ b/src/components/XahauEcosystem.astro @@ -0,0 +1,509 @@ +--- +/** + * XahauEcosystem.astro — Editorial ecosystem directory + * + * All content driven from src/data/ecosystem.json. + * Add/remove/update items there; no markup changes needed. + * + * Layout philosophy: + * - Wallets / Exchanges / Explorers → open logo strip, no boxes + * - Projects (no logos) → two-column editorial list, names as headings + */ + +import { Image } from 'astro:assets' +import logoBithomp from '../assets/ecosystem-logos/bithomp.png' +import logoBitmart from '../assets/ecosystem-logos/bitmart.png' +import logoBitrue from '../assets/ecosystem-logos/bitrue.png' +import logoCoinex from '../assets/ecosystem-logos/coinex.png' +import logoDcent from '../assets/ecosystem-logos/dcent.png' +import logoGatehub from '../assets/ecosystem-logos/gatehub.png' +import logoXahauServices from '../assets/ecosystem-logos/xahau-services.png' +import logoXahscan from '../assets/ecosystem-logos/xahscan.png' +// ── Logo import map (static imports required by Astro) +import logoXaman from '../assets/ecosystem-logos/xaman.png' +import logoXrplwin from '../assets/ecosystem-logos/xrplwin.png' +import ecosystemData from '../data/ecosystem.json' + +const logoMap: Record = { + xaman: logoXaman, + dcent: logoDcent, + gatehub: logoGatehub, + bitrue: logoBitrue, + bitmart: logoBitmart, + coinex: logoCoinex, + xahscan: logoXahscan, + bithomp: logoBithomp, + xrplwin: logoXrplwin, + 'xahau-services': logoXahauServices, +} + +type Locale = 'en' | 'es' | 'ja' +const locale = (Astro.currentLocale ?? 'en') as Locale + +// Projects sorted alphabetically at build time; others keep editorial order. +const sections = ecosystemData.sections.map((section) => + section.id === 'projects' + ? { + ...section, + items: [...section.items].sort((a, b) => a.name.localeCompare(b.name)), + } + : section, +) +--- + +
      + +
      +
      +

      Ecosystem

      +

      + Wallets, exchanges, explorers and projects built on or around Xahau +

      +
      +
      + 4 Wallets + 4 Exchanges + 4 Explorers + 18 Projects +
      +
      + + {sections.map(section => { + const isProjects = section.id === 'projects' + return ( +
      + + {/* Section label (pip + monospace) + tagline */} +
      +

      + + {section.label[locale]} +

      +

      {section.tagline[locale]}

      +
      + + {isProjects ? ( + + /* ── Projects: two-column editorial list, no boxes ── */ + + + ) : ( + + /* ── Logo strip: open flex, no boxes ── */ +
      + {section.items.map(item => { + const logo = item.logo ? logoMap[item.logo] : null + return ( + + {logo ? ( +
      + {item.name} +
      + ) : ( +
      + {item.name} +
      + )} + {item.name} + {item.desc} +
      + ) + })} +
      + + )} + +
      + ) + })} +
      + + diff --git a/src/components/XahauFeatures.astro b/src/components/XahauFeatures.astro new file mode 100644 index 0000000..bc5a78a --- /dev/null +++ b/src/components/XahauFeatures.astro @@ -0,0 +1,731 @@ +--- +/** + * XahauFeatures.astro — Hand-crafted editorial layout + * + * No JSON, no loops. Each feature section is individually composed. + * Three thematic acts: Protocol · Finance · Governance. + * Statement openers + varied pair/trio detail sections. + * + * Edit content directly in this file. + * For ES/JA: duplicate this file and translate in-place. + */ + +import consensusGraphic from '../assets/enterprise/consensus.svg' +import globalGraphic from '../assets/enterprise/global.svg' +import hooksGraphic from '../assets/enterprise/hooks.svg' + +interface Props { + lang?: string +} +const { lang = 'en' } = Astro.props +--- + +
      + +
      +
      +

      Features

      +

      Proven technology with a fresh approach

      +
      +
      + 10+ Protocol Features + Native DEX + NFTs Built-In + No Runtime Overhead +
      +
      + + +
      +

      + Protocol Layer +

      + + +
      +
      + Programmability +

      + Hooks: Account-Level +
      + Smart Contract Logic +

      +

      + Xahau introduces Hooks—a unique form of on-ledger smart contract logic + that runs directly at the account level. Unlike smart contracts on + most blockchains that require interacting with external contract + addresses, Hooks are lightweight programs embedded inside user + accounts themselves. These Hooks can automatically inspect, modify, or + reject any transaction involving that account, without the need for + explicit function calls. +

      +

      + Because Hooks are executed inline and within consensus, they offer + real-time programmability with minimal overhead. This allows for + powerful use cases such as rejecting unauthorized token transfers, + triggering actions on deposits, or implementing compliance logic—all + without slowing down the network. Hooks represent a new security and + programmability paradigm, making accounts active participants in + transaction logic. +

      +
      +
      + +
      +
      + + +
      +
      + Exchange +

      Offers: Built-In Decentralized Exchange (DEX)

      +

      + Xahau includes a native Offers system, powering a built-in + decentralized exchange on the ledger. Users can create Offer entries + to buy or sell assets (such as tokens or issued currencies) directly + on the network, and these offers are automatically matched by the + protocol's order book. +

      +

      + Unlike many blockchains that require smart contracts or external + platforms for trading, Xahau's DEX is a first-class feature of the + ledger. This on-ledger exchange offers fast settlement and low fees, + making asset trading seamless for users and applications. +

      +
      + +
      + Economics +

      Low Fees with Fee Burning

      +

      + Xahau maintains consistently low transaction fees, with a built-in + fee-burning model that reduces spam and rewards long-term network + health. Every transaction pays a minimal fee in XAH, and a portion of + that fee is permanently destroyed—creating a deflationary effect over + time. +

      +

      + This approach discourages network abuse while preserving + accessibility, particularly for high-throughput or cost-sensitive + applications. Unlike inflationary models or auction-style fees, Xahau + provides predictability and economic alignment for all users. +

      +
      +
      + + +
      + Infrastructure +

      Fast, Green, and Scalable

      +
      +

      + Built on a refined version of XRPL's consensus protocol, Xahau offers + fast finality, low energy usage, and reliable scalability. + Transactions confirm in seconds, with no mining and minimal hardware + requirements. The result is a network that can serve real-world + financial and enterprise use cases without compromising the + environment or user experience. +

      +

      + Xahau's architecture is ideal for global payment systems, tokenized + asset platforms, or high-volume applications where performance and + sustainability are non-negotiable. +

      +
      +
      +
      + + +
      +

      + Financial Primitives +

      + + +
      +
      + Payments +

      + Payments: +
      + Multi-Asset Transfers +
      + & Channels +

      +

      + The Payments functionality in Xahau is designed to facilitate fast, + flexible transfer of value across the network. Uniquely, Xahau (like + XRPL) supports multi-asset payments through a system of trust lines + and issued currencies. Using a TrustSet transaction, two parties can + establish a trust line to transact in a custom asset or IOU, enabling + built-in support for multiple currencies or tokens without requiring + smart contracts. +

      +

      + This means businesses can issue stablecoins or tokens on Xahau and + users can send or exchange them natively. The Payments suite also + includes advanced features like Deposit Preauthorization, which lets + an account whitelist who can send it funds, adding security against + unwanted transactions. +

      +

      + In addition, Xahau supports payment channels for scalability. Payment + channels allow two parties to conduct rapid, high-volume transactions + off-ledger and then settle the net result on the blockchain. With + transactions like PaymentChannelCreate, Fund, and Claim, Xahau enables + micropayments or streaming payments that are secured by the ledger but + don't congest it. +

      +
      +
      + +
      +
      + + +
      +
      + Asset Control +

      Token and Asset Control by Design

      +

      + Xahau gives issuers and users granular control over tokens and + trustlines. Features like TrustSet, Clawback, Freeze, and Deposit + Authorization allow full customization of how tokens can be used or + received. Assets can be whitelisted, blocked, or burned, all enforced + at the protocol level. +

      +

      + This makes Xahau uniquely suited for regulated financial instruments, + stablecoins, loyalty programs, or enterprise supply chains—any + scenario where compliance, safety, and precision are critical. +

      +
      + +
      + Economics +

      Balance Rewards: Passive Yield Without Staking

      +

      + Xahau offers a Balance Reward system that lets accounts passively + accumulate value simply by holding assets. These rewards are + calculated based on account balance and distributed through a + consensus-enforced mechanism, without requiring staking, delegation, + or third-party contracts. +

      +

      + The mechanism is powered by protocol-level logic and on-chain Hooks, + ensuring rewards are automatic, fair, and sustainable. Unlike yield + farming or staking systems on other blockchains, Xahau's reward model + doesn't require users to lock assets or chase complex DeFi + strategies—it works natively, with transparency and simplicity. +

      +
      +
      + + +
      +
      + Primitives +

      Escrow: Conditional Transfers for Any Asset

      +

      + Xahau supports on-ledger escrow of both native and issued tokens, + enabling secure conditional transfers for a broad range of business + and financial use cases. Funds or tokens can be locked with time-based + or condition-based release logic, enforced by the network itself. +

      +

      + Whether you're building a milestone-based payment system, marketplace + settlement, or trusted token distribution, Xahau's escrows offer a + simple yet powerful tool—without the need for external smart + contracts. Native support for both fungible and non-fungible assets in + escrow makes this a uniquely versatile feature. +

      +
      + +
      + Payments +

      Remit: Native Cross-Account Transfers

      +

      + The Remit feature allows streamlined, multi-operation transactions + between accounts—ideal for complex or high-volume payment flows. + Instead of sending multiple separate instructions, a single Remit + transaction can distribute value to multiple recipients or trigger + multiple balance changes atomically. +

      +

      + This improves efficiency and reliability, especially for payment + processors, marketplaces, or applications that need to perform bundled + operations. Because it's built into the protocol, Remit ensures + predictable performance, low latency, and strong auditability. +

      +
      + +
      + Payments +

      Checks: Deferred Payment System

      +

      + Xahau supports Checks, a deferred payment system akin to writing + digital checks on the blockchain. One party can issue a Check (promise + of payment) that the intended recipient may cash at a later time or + cancel if needed. This feature allows secure, flexible + transactions—for example, a business can issue payment that the + receiver will claim when certain conditions are met. +

      +

      + The ledger has dedicated transactions for creating a check, cashing + it, or canceling it. Few other platforms have this kind of native + deferred payment instrument; Xahau's check system provides an extra + layer of payment control, all enforced by the network's rules without + requiring custom smart contracts. +

      +
      +
      +
      + + +
      +

      + Governance & Identity +

      + + +
      +
      + Governance +

      + Governance Game: +
      + Decentralized Coordination +
      + with Purpose +

      +

      + Xahau features a novel governance system backed by the Governance + Game, a transparent, on-ledger mechanism for proposing, reviewing, and + voting on amendments. Validator operators (Governors) participate + directly in shaping the protocol, while also competing in a structured + reward system based on accountability and engagement. +

      +

      + This system ensures that protocol upgrades and policy decisions are + open and participatory, not dictated by a centralized entity. It + combines the benefits of structured enterprise coordination with the + transparency and resilience of decentralized consensus. By gamifying + governance in a secure and incentive-aligned way, Xahau sets a new + standard for on-chain coordination. +

      +
      +
      + +
      +
      + + +
      +
      + NFTs +

      URITokens: Native NFTs on Xahau

      +

      + URITokens represent Xahau's approach to non-fungible tokens (NFTs), + implemented as a native part of the ledger rather than via separate + smart contracts. A URIToken is a first-class on-ledger object uniquely + identified by the issuing account and a Uniform Resource Identifier + (URI) that typically points to the token's metadata or content. Only + one URIToken with a given URI can exist per account, ensuring true + uniqueness for each digital asset. +

      +

      + This built-in NFT standard means creators can mint, trade, or burn + NFTs with simple transactions (e.g. URITokenMint, URITokenBuy, + URITokenBurn) without deploying custom code. The issuer of a URIToken + can even allow it to be destroyed (burned) by setting a flag, giving + flexibility in how NFTs are managed. By integrating NFTs at the + protocol level, Xahau makes issuing and managing digital collectibles + or credentials more efficient and secure. +

      +
      +
      +
      +
      + + diff --git a/src/components/XahauFeatures.checkerboard.astro.bak b/src/components/XahauFeatures.checkerboard.astro.bak new file mode 100644 index 0000000..0c4e215 --- /dev/null +++ b/src/components/XahauFeatures.checkerboard.astro.bak @@ -0,0 +1,295 @@ +--- +/** + * XahauFeatures.astro + * Data-driven Features page. Reads src/data/features.json. + * Checkerboard layout: features alternate graphic-right / graphic-left. + * Styled to match XahauAbout / XahauRoadmap theme-light — same box, same tokens. + * + * Usage: + * (also accepts "es", "ja") + */ + +import { Image } from 'astro:assets' +import featuresData from '../data/features.json' +import hooksGraphic from '../assets/enterprise/hooks.svg' +import consensusGraphic from '../assets/enterprise/consensus.svg' +import tokenGraphic from '../assets/enterprise/token.svg' +import globalGraphic from '../assets/enterprise/global.svg' + +interface Props { + lang?: string +} + +const { lang: langProp = 'en' } = Astro.props +const defaultLang = 'en' + +type Lang = keyof typeof featuresData.content +const lang: Lang = (langProp in featuresData.content ? langProp : defaultLang) as Lang +const c = featuresData.content[lang] + +const graphicMap: Record = { + hooks: hooksGraphic, + consensus: consensusGraphic, + token: tokenGraphic, + global: globalGraphic, +} +--- + +
      + + +
      +
      +

      {c.title}

      +

      {c.subtitle}

      +
      +
      + {c.chips.map(chip => ( + {chip} + ))} +
      +
      + + +
      + {c.features.map((f, i) => { + const graphic = f.graphic ? graphicMap[f.graphic] : null + // Even index → graphic on RIGHT; odd → graphic on LEFT + const panelSide = i % 2 === 0 ? 'panel-right' : 'panel-left' + return ( +
      + + +
      + {f.label} +

      {f.heading}

      + {f.paragraphs.map(p =>

      {p}

      )} +
      + + +
      + {graphic ? ( + + ) : ( + + )} +
      + +
      + ) + })} +
      + +
      + + diff --git a/src/components/XahauFeaturesEs.astro b/src/components/XahauFeaturesEs.astro new file mode 100644 index 0000000..dfd3987 --- /dev/null +++ b/src/components/XahauFeaturesEs.astro @@ -0,0 +1,668 @@ +--- +/** + * XahauFeaturesEs.astro — Versión en español del layout editorial + * + * Sin JSON, sin bucles. Cada sección está compuesta individualmente. + * Tres actos temáticos: Protocolo · Finanzas · Gobernanza. + * + * Edita el contenido directamente en este archivo. + */ + +import consensusGraphic from '../assets/enterprise/consensus.svg' +import globalGraphic from '../assets/enterprise/global.svg' +import hooksGraphic from '../assets/enterprise/hooks.svg' +--- + +
      + +
      +
      +

      Características

      +

      Tecnología probada con un enfoque innovador

      +
      +
      + 10+ Funciones de Protocolo + DEX Nativo + NFTs Integrados + Sin Sobrecarga de Ejecución +
      +
      + + +
      +

      + Capa de Protocolo +

      + + +
      +
      + Programabilidad +

      + Hooks: Lógica de Contrato +
      + Inteligente a Nivel de Cuenta +

      +

      + Xahau introduce los Hooks, una forma única de lógica de contrato + inteligente on-ledger que se ejecuta directamente a nivel de cuenta. A + diferencia de los contratos inteligentes en la mayoría de blockchains, + que requieren interactuar con direcciones de contratos externas, los + Hooks son programas ligeros incrustados dentro de las propias cuentas + de usuario. Estos Hooks pueden inspeccionar, modificar o rechazar + automáticamente cualquier transacción que involucre esa cuenta, sin + necesidad de llamadas a funciones explícitas. +

      +

      + Dado que los Hooks se ejecutan inline y dentro del consenso, ofrecen + programabilidad en tiempo real con una sobrecarga mínima. Rechaza + transferencias de tokens no autorizadas, desencadena acciones en + depósitos, implementa lógica de cumplimiento normativo — todo sin + ralentizar la red. Los Hooks representan un nuevo paradigma de + seguridad y programabilidad. +

      +
      +
      + +
      +
      + + +
      +
      + Exchange +

      Ofertas: Exchange Descentralizado (DEX) Integrado

      +

      + Xahau incluye un sistema de Ofertas nativo, que impulsa un exchange + descentralizado integrado en el ledger. Los usuarios pueden crear + entradas de Oferta para comprar o vender activos directamente en la + red; el libro de órdenes del protocolo las empareja automáticamente. + Intercambio entre pares sin intermediarios ni plataformas externas. +

      +

      + A diferencia de la mayoría de blockchains que necesitan contratos + inteligentes para el trading, el DEX de Xahau es una característica de + primera clase del ledger — liquidación rápida, bajas comisiones, + integración perfecta. +

      +
      + +
      + Economía +

      Bajas Comisiones con Quema de Fees

      +

      + Comisiones de transacción consistentemente bajas, respaldadas por un + modelo integrado de quema de fees que reduce el spam y premia la salud + a largo plazo de la red. Cada transacción paga una comisión mínima en + XAH; una parte se destruye permanentemente — un silencioso efecto + deflacionario. +

      +

      + A diferencia de los modelos inflacionarios o las comisiones de tipo + subasta, Xahau proporciona previsibilidad y alineación económica para + todos los usuarios. +

      +
      +
      + + +
      + Infraestructura +

      Rápido, Verde y Escalable

      +
      +

      + Construido sobre una versión refinada del protocolo de consenso del + XRPL, Xahau ofrece finalidad rápida, bajo consumo de energía y + escalabilidad fiable. Las transacciones se confirman en segundos — sin + minería, requisitos mínimos de hardware. +

      +

      + El resultado es una red que puede servir casos de uso financieros y + empresariales del mundo real sin comprometer el medio ambiente ni la + experiencia del usuario. Ideal para sistemas de pago globales, activos + tokenizados o aplicaciones de alto volumen donde el rendimiento y la + sostenibilidad son innegociables. +

      +
      +
      +
      + + +
      +

      + Primitivas Financieras +

      + + +
      +
      + Pagos +

      + Transferencias Multi-Activo +
      y Canales de Pago +

      +

      + Xahau soporta pagos multi-activo a través de un sistema de líneas de + confianza y monedas emitidas. Usando una transacción TrustSet, dos + partes pueden establecer una línea de confianza para transaccionar en + cualquier activo personalizado o IOU — soporte integrado para + múltiples monedas y tokens, sin contratos inteligentes. +

      +

      + Las empresas pueden emitir stablecoins o tokens en Xahau; los usuarios + los envían e intercambian de forma nativa. La suite de Pagos también + incluye Preautorización de Depósito, que permite a las cuentas incluir + en una lista blanca quién puede enviarles fondos — seguridad contra + transacciones no deseadas. +

      +

      + Y para escala: Xahau soporta canales de pago que permiten + transacciones rápidas y de alto volumen fuera del ledger con + liquidación on-chain. Micropagos, pagos en streaming — asegurados por + el ledger sin congestionarlo. +

      +
      +
      + +
      +
      + + +
      +
      + Control de Activos +

      Control de Tokens y Activos por Diseño

      +

      + Control granular sobre tokens y líneas de confianza. TrustSet, + Clawback, Freeze y Deposit Authorization permiten una personalización + completa de cómo se pueden usar o recibir los tokens. Los activos + pueden ser incluidos en listas blancas, bloqueados o quemados — todo + aplicado a nivel de protocolo. +

      +

      + Especialmente adecuado para instrumentos financieros regulados, + stablecoins, programas de fidelización o cadenas de suministro + empresariales donde el cumplimiento normativo, la seguridad y la + precisión son críticos. +

      +
      + +
      + Economía +

      Recompensas de Saldo: Rendimiento Pasivo Sin Staking

      +

      + Las cuentas acumulan valor pasivamente simplemente manteniendo + activos. Las recompensas se calculan en función del saldo de la cuenta + y se distribuyen mediante un mecanismo aplicado por consenso — sin + staking, sin delegación, sin contratos de terceros. +

      +

      + A diferencia del yield farming en otros lugares, el modelo de + recompensas de Xahau funciona de forma nativa, transparente y + automática. +

      +
      +
      + + +
      +
      + Primitivas +

      Escrow

      +

      + Escrow on-ledger para tokens nativos y emitidos. Los fondos se + bloquean con lógica de liberación basada en tiempo o condiciones, + aplicada por la propia red — sin contratos inteligentes externos. +

      +

      + Pagos por hitos, liquidación de marketplace, distribución de confianza + — soporte nativo para activos fungibles y no fungibles en escrow. +

      +
      + +
      + Pagos +

      Remit

      +

      + Transacciones multi-operación simplificadas entre cuentas. Un solo + Remit puede distribuir valor a múltiples destinatarios o desencadenar + múltiples cambios de saldo de forma atómica — sin pila de + instrucciones separadas. +

      +

      + Rendimiento predecible, baja latencia, sólida trazabilidad para + procesadores de pago y marketplaces. Integrado en el protocolo. +

      +
      + +
      + Pagos +

      Cheques

      +

      + Un sistema de pago diferido — como escribir cheques digitales + on-chain. Emite un Cheque que el destinatario cobra más tarde, o + cancela si es necesario. Control de pago adicional, aplicado puramente + por las reglas de la red. +

      +

      + Pocas plataformas tienen un instrumento de pago diferido nativo. Sin + contratos inteligentes personalizados. Solo una primitiva limpia y + simple. +

      +
      +
      +
      + + +
      +

      + Gobernanza e Identidad +

      + + +
      +
      + Gobernanza +

      + El Juego de Gobernanza: +
      + Coordinación Descentralizada +
      + con Propósito +

      +

      + Xahau cuenta con un novedoso sistema de gobernanza respaldado por el + Juego de Gobernanza — un mecanismo transparente y on-ledger para + proponer, revisar y votar enmiendas. Los operadores de validadores + (Gobernadores) participan directamente en la configuración del + protocolo, compitiendo en un sistema de recompensas estructurado + basado en la responsabilidad y el compromiso. +

      +

      + Las actualizaciones del protocolo y las decisiones de política son + abiertas y participativas, no dictadas por una entidad centralizada. + La coordinación empresarial estructurada se une a la transparencia y + resiliencia del consenso descentralizado — estableciendo un nuevo + estándar para la coordinación on-chain. +

      +
      +
      + +
      +
      + + +
      +
      + NFTs +

      URITokens: NFTs Nativos en Xahau

      +

      + Los URITokens representan el enfoque de Xahau hacia los tokens no + fungibles — implementados como una parte nativa del ledger, no + mediante contratos inteligentes separados. Un URIToken es un objeto + on-ledger de primera clase, identificado de forma única por la cuenta + emisora y el URI. Solo puede existir un URIToken con un URI dado por + cuenta, garantizando la verdadera unicidad de cada activo digital. +

      +

      + Los creadores acuñan, intercambian o queman NFTs con transacciones + simples — URITokenMint, URITokenBuy, URITokenBurn — sin desplegar + código personalizado. El emisor puede incluso permitir la quema + estableciendo un flag. NFTs a nivel de protocolo: más eficientes, más + seguros, menos fricción. +

      +
      +
      +
      +
      + + diff --git a/src/components/XahauFeaturesJa.astro b/src/components/XahauFeaturesJa.astro new file mode 100644 index 0000000..d439a12 --- /dev/null +++ b/src/components/XahauFeaturesJa.astro @@ -0,0 +1,621 @@ +--- +/** + * XahauFeaturesJa.astro — 日本語版 手作りエディトリアルレイアウト + * + * JSONなし、ループなし。各セクションを個別に構成。 + * 三つのテーマ別アクト:プロトコル層・金融プリミティブ・ガバナンスとアイデンティティ + * + * コンテンツはこのファイルで直接編集してください。 + */ + +import consensusGraphic from '../assets/enterprise/consensus.svg' +import globalGraphic from '../assets/enterprise/global.svg' +import hooksGraphic from '../assets/enterprise/hooks.svg' +--- + +
      + +
      +
      +

      機能

      +

      実証された技術と革新的なアプローチ

      +
      +
      + 10以上のプロトコル機能 + ネイティブDEX + NFT組み込み済み + 実行オーバーヘッドなし +
      +
      + + +
      +

      + プロトコル層 +

      + + +
      +
      + プログラマビリティ +

      + Hooks:アカウントレベルの +
      + スマートコントラクトロジック +

      +

      + Xahauはアカウントレベルで直接動作するユニークな形式のオンレジャースマートコントラクトロジックであるHooksを導入しています。外部のコントラクトアドレスとの対話を必要とする他のブロックチェーンのスマートコントラクトとは異なり、Hooksはユーザーアカウント自体に組み込まれた軽量なプログラムです。これらのHooksは、明示的な関数呼び出しなしに、そのアカウントに関わるあらゆる取引を自動的に検査、変更、または拒否することができます。 +

      +

      + Hooksはインラインかつコンセンサス内で実行されるため、最小限のオーバーヘッドでリアルタイムのプログラマビリティを提供します。これにより、不正なトークン転送の拒否、入金時のアクションのトリガー、コンプライアンスロジックの実装などの強力なユースケースが可能になります。Hooksは新しいセキュリティとプログラマビリティのパラダイムを表し、アカウントをトランザクションロジックのアクティブな参加者にします。 +

      +
      +
      + +
      +
      + + +
      +
      + 取引所 +

      オファー:内蔵の分散型取引所(DEX)

      +

      + Xahauはネイティブのオファーシステムを含み、レジャー上の内蔵分散型取引所を動かしています。ユーザーはネットワーク上で直接資産(トークンや発行通貨など)を売買するためのオファーエントリを作成でき、これらのオファーはプロトコルのオーダーブックによって自動的にマッチングされます。 +

      +

      + 取引のためにスマートコントラクトや外部プラットフォームを必要とする多くのブロックチェーンとは異なり、XahauのDEXはレジャーのファーストクラスの機能です。このオンレジャー取引所は高速決済と低手数料を提供し、ユーザーやアプリケーションにとってシームレスな資産取引を実現します。 +

      +
      + +
      + エコノミクス +

      手数料燃焼による低手数料

      +

      + Xahauは一貫して低い取引手数料を維持し、スパムを減らしてネットワークの長期的な健全性を報酬する組み込みの手数料燃焼モデルを持っています。各取引はXAHで最小限の手数料を支払い、その手数料の一部は永久に破壊され、時間とともにデフレ効果をもたらします。 +

      +

      + このアプローチはネットワークの乱用を抑止しながらアクセシビリティを維持します。インフレモデルやオークション形式の手数料とは異なり、Xahauはすべてのユーザーに予測可能性と経済的整合性を提供します。 +

      +
      +
      + + +
      + インフラストラクチャ +

      高速、グリーン、スケーラブル

      +
      +

      + XRPLのコンセンサスプロトコルの洗練されたバージョンの上に構築されたXahauは、高速なファイナリティ、低エネルギー使用量、信頼性の高いスケーラビリティを提供します。取引は数秒で確認され、マイニングなし、最小限のハードウェア要件で行われます。その結果、環境やユーザーエクスペリエンスを損なうことなく、実世界の金融およびエンタープライズのユースケースに対応できるネットワークが実現します。 +

      +

      + Xahauのアーキテクチャは、パフォーマンスと持続可能性が交渉の余地のないグローバル決済システム、トークン化資産プラットフォーム、または高ボリュームアプリケーションに最適です。 +

      +
      +
      +
      + + +
      +

      + 金融プリミティブ +

      + + +
      +
      + 決済 +

      + 支払い:マルチアセット +
      + 転送とチャンネル +

      +

      + Xahauの支払い機能は、ネットワーク全体での価値の高速かつ柔軟な転送を容易にするように設計されています。Xahauはトラストラインと発行通貨のシステムを通じてマルチアセット支払いをサポートし、スマートコントラクトを必要とせずに複数の通貨やトークンの組み込みサポートを可能にします。 +

      +

      + これは、企業がXahau上でステーブルコインやトークンを発行し、ユーザーがそれらをネイティブに送受信または交換できることを意味します。支払いスイートには、口座に資金を送れる人をホワイトリスト化できる入金事前承認など、不要な取引に対するセキュリティを追加する高度な機能も含まれています。 +

      +

      + さらに、Xahauはスケーラビリティのためのペイメントチャンネルをサポートしています。ペイメントチャンネルにより、2者がオフレジャーで高速・大量の取引を行い、その後正味の結果をブロックチェーン上で決済することができます。PaymentChannelCreate、Fund、Claimなどのトランザクションにより、Xahauはレジャーによって保護されるがそれを混雑させないマイクロペイメントやストリーミングペイメントを可能にします。 +

      +
      +
      + +
      +
      + + +
      +
      + 資産管理 +

      設計によるトークンと資産の制御

      +

      + Xahauは発行者とユーザーにトークンとトラストラインに対する詳細な制御を与えます。TrustSet、Clawback、Freeze、Deposit + Authorizationなどの機能により、トークンの使用方法や受け取り方を完全にカスタマイズできます。資産はホワイトリスト化、ブロック、または燃焼させることができ、すべてプロトコルレベルで適用されます。 +

      +

      + これにより、Xahauは規制された金融商品、ステーブルコイン、ロイヤルティプログラム、エンタープライズサプライチェーンなど、コンプライアンス、安全性、精度が重要なシナリオに特に適しています。 +

      +
      + +
      + エコノミクス +

      残高報酬:ステーキングなしのパッシブ収益

      +

      + Xahauは残高報酬システムを提供しており、アカウントが資産を保有するだけで価値を受動的に積み立てることができます。これらの報酬はアカウント残高に基づいて計算され、ステーキング、委任、サードパーティのコントラクトを必要とせず、コンセンサスによって適用されるメカニズムを通じて分配されます。 +

      +

      + このメカニズムはプロトコルレベルのロジックとオンチェーンHooksによって支えられており、報酬が自動的、公正、持続可能であることを保証します。他のブロックチェーンのイールドファーミングやステーキングシステムとは異なり、Xahauの報酬モデルはユーザーが資産をロックしたり複雑なDeFi戦略を追いかけたりする必要がありません。 +

      +
      +
      + + +
      +
      + プリミティブ +

      エスクロー:あらゆる資産の条件付き転送

      +

      + Xahauはネイティブおよび発行済みトークンのオンレジャーエスクローをサポートし、幅広いビジネスおよび金融ユースケースのための安全な条件付き転送を可能にします。資金またはトークンは、ネットワーク自体によって適用される時間ベースまたは条件ベースのリリースロジックでロックできます。 +

      +

      + Xahauのエスクローは外部のスマートコントラクトを必要とせず、シンプルながら強力なツールを提供します。エスクローにおける代替可能および代替不可能な資産の両方に対するネイティブサポートにより、この機能は特に多用途です。 +

      +
      + +
      + 決済 +

      Remit:ネイティブのクロスアカウント転送

      +

      + Remit機能により、アカウント間での合理化されたマルチオペレーション取引が可能になり、複雑または大量の支払いフローに最適です。複数の個別の命令を送信する代わりに、単一のRemit取引が複数の受取人に価値を配布したり、複数の残高変更をアトミックにトリガーしたりできます。 +

      +

      + これにより、特に支払い処理業者、マーケットプレイス、またはバンドル操作を実行する必要があるアプリケーションの効率性と信頼性が向上します。プロトコルに組み込まれているため、Remitは予測可能なパフォーマンス、低レイテンシ、および強力な監査可能性を保証します。 +

      +
      + +
      + 決済 +

      チェック:繰延決済システム

      +

      + Xahauはブロックチェーン上でデジタル小切手を書くような繰延決済システムであるチェックをサポートしています。一方が後で現金化するか、必要に応じてキャンセルできるチェック(支払いの約束)を発行できます。この機能により、安全で柔軟な取引が可能になります。 +

      +

      + レジャーにはチェックの作成、現金化、またはキャンセルのための専用トランザクションがあります。Xahauのチェックシステムは、カスタムスマートコントラクトを必要とせず、ネットワークのルールによってすべて適用される追加の支払い制御層を提供します。 +

      +
      +
      +
      + + +
      +

      + ガバナンスとアイデンティティ +

      + + +
      +
      + ガバナンス +

      + ガバナンスゲーム: +
      + 目的を持った +
      + 分散型調整 +

      +

      + Xahauはガバナンスゲームに裏付けられた新しいガバナンスシステムを特徴としています。これは、修正案を提案、審査、投票するための透明でオンレジャーのメカニズムです。バリデーターオペレーター(ガバナー)は、説明責任とエンゲージメントに基づく構造化された報酬システムで競いながら、プロトコルの形成に直接参加します。 +

      +

      + このシステムにより、プロトコルのアップグレードとポリシー決定が、中央集権的なエンティティによって指示されるのではなく、オープンで参加型になることが保証されます。構造化されたエンタープライズ調整の利点と、分散型コンセンサスの透明性と回復力を組み合わせています。安全でインセンティブに沿った方法でガバナンスをゲーム化することで、Xahauはオンチェーン調整の新しい基準を設定します。 +

      +
      +
      + +
      +
      + + +
      +
      + NFT +

      URITokens:XahauのネイティブNFT

      +

      + URITokensは、別のスマートコントラクトを介してではなく、レジャーのネイティブな部分として実装されたXahauの非代替トークン(NFT)へのアプローチを表しています。URITokenは、発行アカウントとトークンのメタデータやコンテンツを通常指すUniform + Resource + Identifier(URI)によって一意に識別される、ファーストクラスのオンレジャーオブジェクトです。アカウントごとに特定のURIを持つURITokenは1つしか存在できず、各デジタル資産の真の独自性を確保します。 +

      +

      + この組み込みNFT標準により、クリエイターはカスタムコードをデプロイすることなく、シンプルな取引(例:URITokenMint、URITokenBuy、URITokenBurn)でNFTをミント、取引、または燃焼させることができます。URITokenの発行者はフラグを設定することで破壊(燃焼)を許可することもでき、NFTの管理方法に柔軟性を与えます。プロトコルレベルでNFTを統合することで、Xahauはデジタルコレクティブルや資格情報の発行・管理をより効率的かつ安全にします。 +

      +
      +
      +
      +
      + + diff --git a/src/components/XahauHome.astro b/src/components/XahauHome.astro new file mode 100644 index 0000000..957234b --- /dev/null +++ b/src/components/XahauHome.astro @@ -0,0 +1,416 @@ +--- +/** + * XahauHome.astro — Editorial home page sections (Network + Statistics) + * + * Hero lives in IndexLayout. This component renders the two post-hero acts + * in the same white-card editorial style as XahauAbout / XahauFeatures. + * + * Stats values are driven from src/data/home.json — update the JSON to + * change the numbers without touching markup. + */ + +import { getRelativeLocaleUrl } from 'astro:i18n' +import homeData from '../data/home.json' +import type { IndexLocale } from '../i18n/indexTranslations' +import { indexTranslations } from '../i18n/indexTranslations' + +const locale = (Astro.currentLocale ?? 'en') as IndexLocale +const i = indexTranslations[locale] +const stats = homeData.stats + +// Build a plain array from the flat feat1…feat5 translation keys +type TKey = keyof typeof i +const features = [1, 2, 3, 4, 5].map((n) => ({ + title: i[`feat${n}_title` as TKey] as string, + desc: i[`feat${n}_desc` as TKey] as string, +})) +--- + +
      + +
      +
      +

      {i.network_title}

      +

      {i.network_subtitle}

      +
      +
      + Est. October 2023 + ~4s Settlement + 10k tx / ledger + 100k+ Accounts +
      +
      + + +
      +

      Network

      + +
      + {features.map(f => ( +
      +

      {f.title}

      +

      {f.desc}

      +
      + ))} + + + {i.feat_more}→ + +
      +
      + + +
      +

      Statistics

      + +
      +
      + Network +

      + {i.stats_title} +
      + {i.stats_subtitle} +

      +
      +
      + + +
      + {stats.map(s => ( +
      + + {s.label[locale as keyof typeof s.label]} + + {s.value} +
      + ))} +
      + + + +
      +
      + + diff --git a/src/components/XahauRoadmap.astro b/src/components/XahauRoadmap.astro index 38f97fe..bbd18ea 100644 --- a/src/components/XahauRoadmap.astro +++ b/src/components/XahauRoadmap.astro @@ -1,146 +1,145 @@ --- - // XahauRoadmap.astro - // Single-source-of-truth roadmap chart. Reads src/data/roadmap.json, - // renders statically at build time. No runtime JS. - // - // Usage in a .astro page frontmatter: - // import XahauRoadmap from '@/components/XahauRoadmap.astro' - // Then in the template: - // - // - // To add/edit/delete an item: edit src/data/roadmap.json and commit. +// XahauRoadmap.astro +// Single-source-of-truth roadmap chart. Reads src/data/roadmap.json, +// renders statically at build time. No runtime JS. +// +// Usage in a .astro page frontmatter: +// import XahauRoadmap from '@/components/XahauRoadmap.astro' +// Then in the template: +// +// +// To add/edit/delete an item: edit src/data/roadmap.json and commit. - import roadmap from '../data/roadmap.json' - import { type RoadmapItem, roadmapSchema } from '../schemas/roadmap' +import roadmap from '../data/roadmap.json' +import { type RoadmapItem, roadmapSchema } from '../schemas/roadmap' - interface Props { - /** BCP-47 locale key — must match a key under `labels` in roadmap.json */ - lang?: string - /** Override the start quarter (ISO date). Otherwise uses meta.window. */ - startDate?: string - /** - * Visual theme. "dark" (default) renders the original dark panel. - * "light" renders the roadmap on a white surface to match a light site. - * Swap by changing `theme` in the page — rollback is one word. - */ - theme?: 'dark' | 'light' +interface Props { + /** BCP-47 locale key — must match a key under `labels` in roadmap.json */ + lang?: string + /** Override the start quarter (ISO date). Otherwise uses meta.window. */ + startDate?: string + /** + * Visual theme. "dark" (default) renders the original dark panel. + * "light" renders the roadmap on a white surface to match a light site. + * Swap by changing `theme` in the page — rollback is one word. + */ + theme?: 'dark' | 'light' +} + +const { lang: langProp, startDate, theme = 'dark' } = Astro.props + +// === Parse & validate ======================================================= +const data = roadmapSchema.parse(roadmap) +const defaultLocale = data.meta.i18n.defaultLocale +const lang = langProp && data.labels[langProp] ? langProp : defaultLocale + +const labels = data.labels[lang] ?? data.labels[defaultLocale] + +// === Helpers ================================================================ +const tr = (v: unknown): string => { + if (typeof v === 'string') return v + if (v && typeof v === 'object') { + const rec = v as Record + return rec[lang] ?? rec[defaultLocale] ?? Object.values(rec)[0] ?? '' } + return '' +} - const { lang: langProp, startDate, theme = 'dark' } = Astro.props +const qToIdx = (q: string) => { + const [y, qx] = q.split('-Q') + return Number(y) * 4 + (Number(qx) - 1) +} +const idxToQ = (i: number) => ({ + q: `Q${(i % 4) + 1}`, + y: String(Math.floor(i / 4)), + id: `${Math.floor(i / 4)}-Q${(i % 4) + 1}`, +}) - // === Parse & validate ======================================================= - const data = roadmapSchema.parse(roadmap) - const defaultLocale = data.meta.i18n.defaultLocale - const lang = langProp && data.labels[langProp] ? langProp : defaultLocale +// Current-quarter detection (build-time) +const nowIdx = (() => { + const d = new Date() + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) +})() - const labels = data.labels[lang] ?? data.labels[defaultLocale] - - // === Helpers ================================================================ - const tr = (v: unknown): string => { - if (typeof v === 'string') return v - if (v && typeof v === 'object') { - const rec = v as Record - return rec[lang] ?? rec[defaultLocale] ?? Object.values(rec)[0] ?? '' - } - return '' - } - - const qToIdx = (q: string) => { - const [y, qx] = q.split('-Q') - return Number(y) * 4 + (Number(qx) - 1) - } - const idxToQ = (i: number) => ({ - q: `Q${(i % 4) + 1}`, - y: String(Math.floor(i / 4)), - id: `${Math.floor(i / 4)}-Q${(i % 4) + 1}`, - }) - - // Current-quarter detection (build-time) - const nowIdx = (() => { - const d = new Date() +// Window resolution +const win = data.meta.window +const startIdx = (() => { + if (startDate) { + const d = new Date(startDate) return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) - })() - - // Window resolution - const win = data.meta.window - const startIdx = (() => { - if (startDate) { - const d = new Date(startDate) - return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) - } - if (win.mode === 'manual' && win.start) { - const d = new Date(win.start) - return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) - } - return nowIdx // auto: start at current quarter - })() - const QCOUNT = 6 - const quarters = Array.from({ length: QCOUNT }, (_, i) => - idxToQ(startIdx + i), - ) - - // Resolve how many quarters an item covers, honouring (in order): - // openEnded → stretches to the end of the visible window - // endQuarter → explicit end (inclusive) - // span → count of quarters - // The returned span is clamped to the visible window. - const resolveSpan = (item: RoadmapItem): number => { - const startCol = qToIdx(item.quarter) - if (item.openEnded) { - return Math.max(1, startIdx + QCOUNT - startCol) - } - if (item.endQuarter) { - const endCol = qToIdx(item.endQuarter) - return Math.max(1, endCol - startCol + 1) - } - return item.span ?? 1 } - - // An item is "in window" if any part of its span overlaps the visible window. - const inWindow = (item: RoadmapItem) => { - const startCol = qToIdx(item.quarter) - const endCol = startCol + resolveSpan(item) - 1 - return endCol >= startIdx && startCol < startIdx + QCOUNT + if (win.mode === 'manual' && win.start) { + const d = new Date(win.start) + return d.getFullYear() * 4 + Math.floor(d.getMonth() / 3) } + return nowIdx // auto: start at current quarter +})() +const QCOUNT = 6 +const quarters = Array.from({ length: QCOUNT }, (_, i) => idxToQ(startIdx + i)) - // Return { col, span } in 1-based CSS grid coordinates, clipped to the window. - const gridPos = (item: RoadmapItem) => { - const startCol = qToIdx(item.quarter) - const rawSpan = resolveSpan(item) - const clippedStart = Math.max(startCol, startIdx) - const clippedEnd = Math.min(startCol + rawSpan - 1, startIdx + QCOUNT - 1) - return { - col: clippedStart - startIdx + 1, - span: clippedEnd - clippedStart + 1, - clippedStart: clippedStart > startCol, // started before window - } +// Resolve how many quarters an item covers, honouring (in order): +// openEnded → stretches to the end of the visible window +// endQuarter → explicit end (inclusive) +// span → count of quarters +// The returned span is clamped to the visible window. +const resolveSpan = (item: RoadmapItem): number => { + const startCol = qToIdx(item.quarter) + if (item.openEnded) { + return Math.max(1, startIdx + QCOUNT - startCol) } - - const techItems = data.items.filter((i) => i.lane === 'tech' && inWindow(i)) - const rolloutItems = data.items.filter( - (i) => i.lane === 'rollout' && inWindow(i), - ) - - // KPIs - const kpiFeatures = techItems.length - const kpiRollouts = rolloutItems.length - - // Human-readable period label for mobile card badge (and screen readers). - // The horizontal timeline is hidden on small screens, so each card needs to - // carry its own quarter/year range inline. - const fmtItemPeriod = (item: RoadmapItem): string => { - const startCol = qToIdx(item.quarter) - const start = idxToQ(startCol) - if (item.openEnded) return `${start.q} ${start.y} →` - let endCol = startCol - if (item.endQuarter) endCol = qToIdx(item.endQuarter) - else if (item.span && item.span > 1) endCol = startCol + item.span - 1 - if (endCol === startCol) return `${start.q} ${start.y}` - const end = idxToQ(endCol) - if (start.y === end.y) return `${start.q}–${end.q} ${start.y}` - return `${start.q} ${start.y} → ${end.q} ${end.y}` + if (item.endQuarter) { + const endCol = qToIdx(item.endQuarter) + return Math.max(1, endCol - startCol + 1) } + return item.span ?? 1 +} + +// An item is "in window" if any part of its span overlaps the visible window. +const inWindow = (item: RoadmapItem) => { + const startCol = qToIdx(item.quarter) + const endCol = startCol + resolveSpan(item) - 1 + return endCol >= startIdx && startCol < startIdx + QCOUNT +} + +// Return { col, span } in 1-based CSS grid coordinates, clipped to the window. +const gridPos = (item: RoadmapItem) => { + const startCol = qToIdx(item.quarter) + const rawSpan = resolveSpan(item) + const clippedStart = Math.max(startCol, startIdx) + const clippedEnd = Math.min(startCol + rawSpan - 1, startIdx + QCOUNT - 1) + return { + col: clippedStart - startIdx + 1, + span: clippedEnd - clippedStart + 1, + clippedStart: clippedStart > startCol, // started before window + } +} + +const techItems = data.items.filter((i) => i.lane === 'tech' && inWindow(i)) +const rolloutItems = data.items.filter( + (i) => i.lane === 'rollout' && inWindow(i), +) + +// KPIs +const kpiFeatures = techItems.length +const kpiRollouts = rolloutItems.length + +// Human-readable period label for mobile card badge (and screen readers). +// The horizontal timeline is hidden on small screens, so each card needs to +// carry its own quarter/year range inline. +const fmtItemPeriod = (item: RoadmapItem): string => { + const startCol = qToIdx(item.quarter) + const start = idxToQ(startCol) + if (item.openEnded) return `${start.q} ${start.y} →` + let endCol = startCol + if (item.endQuarter) endCol = qToIdx(item.endQuarter) + else if (item.span && item.span > 1) endCol = startCol + item.span - 1 + if (endCol === startCol) return `${start.q} ${start.y}` + const end = idxToQ(endCol) + if (start.y === end.y) return `${start.q}–${end.q} ${start.y}` + return `${start.q} ${start.y} → ${end.q} ${end.y}` +} --- +
      -

      +

      - {kpiRollouts}{labels.kpis.rollouts} + {kpiRollouts}{labels.kpis.rollouts}
      - {QCOUNT}{labels.kpis.quarters} + {QCOUNT}{labels.kpis.quarters}
      - {kpiFeatures}{labels.kpis.features} + {kpiFeatures}{labels.kpis.features}
      @@ -290,19 +286,17 @@ >
      -
      - {labels.foot} -
      +
      {labels.foot}
    From fdf88a10b4b255a90e2163fc6b460c03be8076b4 Mon Sep 17 00:00:00 2001 From: alloynetworks Date: Mon, 20 Apr 2026 11:26:07 +0300 Subject: [PATCH 16/19] fix: remove stale logo reference --- src/components/XahauEcosystem.astro | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/XahauEcosystem.astro b/src/components/XahauEcosystem.astro index 012cdf4..959d76b 100644 --- a/src/components/XahauEcosystem.astro +++ b/src/components/XahauEcosystem.astro @@ -40,7 +40,6 @@ const logoMap: Record = { xrplwin: logoXrplwin, 'xahau-services': logoXahauServices, 'Coopbank-Logo-Ethiopia': logoCoopbank, - TerraPay_Logo: logoTerrapay, AUPF: logoAfricanUnion, quantoz: logoQuantoz, } From a6492d12dcafc6986ec124e9270930ec68e02010 Mon Sep 17 00:00:00 2001 From: alloynetworks Date: Mon, 20 Apr 2026 11:54:44 +0300 Subject: [PATCH 17/19] fix: update account count to 200k+ across all locales --- src/data/about.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/about.json b/src/data/about.json index 9619584..498b87b 100644 --- a/src/data/about.json +++ b/src/data/about.json @@ -11,7 +11,7 @@ "subtitle": "Enterprise L1 blockchain with account-based programmability", "chips": [ "Est. October 2023", - "100k+ Accounts", + "200k+ Accounts", "~4s Settlement", "10k tx / ledger" ], @@ -115,7 +115,7 @@ "subtitle": "Blockchain L1 empresarial con programabilidad basada en cuentas", "chips": [ "Est. octubre 2023", - "100k+ Cuentas", + "200k+ Cuentas", "~4s Liquidación", "10k tx / ledger" ], @@ -219,7 +219,7 @@ "subtitle": "アカウントベースプログラマビリティを持つエンタープライズL1ブロックチェーン", "chips": [ "2023年10月設立", - "10万以上のアカウント", + "20万以上のアカウント", "~4秒決済", "10k tx / レジャー" ], From 2d1d94a72abab3dcc9cd9243db2328af2228d4c6 Mon Sep 17 00:00:00 2001 From: alloynetworks Date: Mon, 20 Apr 2026 13:24:22 +0300 Subject: [PATCH 18/19] update numbers --- src/components/XahauAbout.astro | 30 +++++++++++------------ src/components/XahauAboutEs.astro | 2 +- src/components/XahauAboutJa.astro | 2 +- src/components/XahauFeatures.astro | 36 ++++++++++++++-------------- src/components/XahauFeaturesJa.astro | 36 ++++++++++++++-------------- src/components/XahauHome.astro | 9 ++++++- src/components/XahauRoadmap.astro | 36 ++++++++++++++-------------- 7 files changed, 79 insertions(+), 72 deletions(-) diff --git a/src/components/XahauAbout.astro b/src/components/XahauAbout.astro index efeab66..a4207d3 100644 --- a/src/components/XahauAbout.astro +++ b/src/components/XahauAbout.astro @@ -25,7 +25,7 @@ const videoId = '4pruN6sWJho'
    Est. October 2023 - 100k+ Accounts + 200k+ Accounts ~4s Settlement 10k tx / ledger
    @@ -208,8 +208,8 @@ const videoId = '4pruN6sWJho'