From edb24bf35c29481a764363daeca076ce55d63b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ramos?= Date: Wed, 14 Oct 2026 04:58:06 +0000 Subject: [PATCH] Add multilingual Risk Gate marketing site --- .github/workflows/pages.yml | 37 ++++++++++++ AGENTS.md | 8 ++- site/.nojekyll | 0 site/README.md | 19 ++++++ site/assets/app.js | 54 +++++++++++++++++ site/assets/risk-gate-hero-poster.jpg | Bin 0 -> 38503 bytes site/assets/risk-gate-hero.mp4 | Bin 0 -> 31831 bytes site/assets/styles.css | 9 +++ site/index.html | 82 ++++++++++++++++++++++++++ 9 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/pages.yml create mode 100644 site/.nojekyll create mode 100644 site/README.md create mode 100644 site/assets/app.js create mode 100644 site/assets/risk-gate-hero-poster.jpg create mode 100644 site/assets/risk-gate-hero.mp4 create mode 100644 site/assets/styles.css create mode 100644 site/index.html diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..6db8a04 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,37 @@ +name: Publish marketing site + +on: + push: + branches: [master] + paths: + - "site/**" + - ".github/workflows/pages.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: github-pages + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Check out source + uses: actions/checkout@v4 + - name: Configure GitHub Pages + uses: actions/configure-pages@v5 + - name: Upload site artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/AGENTS.md b/AGENTS.md index 6084bef..33f9ad0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -37,9 +37,11 @@ versioned with the analyzed project in .risk-gate.yaml. 10. Before declaring an integration complete, prove the real path: PR event, configuration loading, diff, analysis, gate execution, comment, and Action exit code. -11. All documentation, comments, CLI messages, reports, examples, and other - user-facing project text must be written in English. Preserve exact - identifiers, YAML keys, API fields, exit codes, and code literals. +11. Write documentation, comments, CLI messages, reports, examples, and other + user-facing project text in English, except for the marketing site in site/, + which must support English, Portuguese, Spanish, Japanese, and Chinese. + Preserve exact identifiers, YAML keys, API fields, exit codes, and code + literals. ## AST and language model diff --git a/site/.nojekyll b/site/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..a23bbd4 --- /dev/null +++ b/site/README.md @@ -0,0 +1,19 @@ +# Risk Gate marketing site + +This static, responsive landing page lives in `site/` and supports English, +Portuguese, Spanish, Japanese, and Chinese. The language selector follows the +browser language on first visit and remembers the visitor's choice. + +## GitHub Pages deployment + +The `Publish marketing site` workflow uploads `site/` and deploys it to GitHub +Pages when site files change on `master`, or when manually dispatched. + +In the repository's **Settings → Pages**, set **Build and deployment → Source** +to **GitHub Actions**. Merge the site and workflow to `master`; the workflow +publishes the landing page and exposes its URL in the `github-pages` +environment. + +The hero video is a locally bundled, silent MP4 with a poster image. It loops +muted, provides native playback controls, and is not downloaded from a third +party. diff --git a/site/assets/app.js b/site/assets/app.js new file mode 100644 index 0000000..87d7fda --- /dev/null +++ b/site/assets/app.js @@ -0,0 +1,54 @@ +const copy = { + en: { + navHow:"How it works",navTeams:"For your team",navQuick:"Quick start",languageLabel:"Choose language",navGithub:"View on GitHub",eyebrow:"OPEN SOURCE · GITHUB ACTION",headline:"Ship with
impact in view.",subhead:"Risk Gate maps what changed to what matters. Then it runs the checks that change deserves, before it reaches production.",ctaStart:"Add to your workflow",ctaHow:"See how it works",metaRust:"Built in Rust",metaOpen:"Open source",metaRepo:"Runs in your GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Your browser does not support embedded video.",live:"LIVE FLOW",prTitle:"Checkout service update",prFiles:"8 files changed",pipeDiff:"Map changed files",pipeDiffSub:"PR diff · dependency graph",pipeRisk:"Impact detected",pipeRiskSub:"Payments → checkout → API",pipeChecks:"Run risk-matched checks",pipeChecksSub:"E2E + mutation suite",done:"DONE",highRisk:"HIGH RISK",running:"RUNNING",teamReview:"Product + Support in the loop",teamReviewSub:"One clear report, shared context",riskLevel:"CHANGE RISK",riskHigh:"HIGH",lowRisk:"LOW",dangerRisk:"DANGER",visualFoot:"Checks scale with impact. Every decision has a reason.",chipAst:"Full-project AST",chipEvidence:"Auditable evidence",scroll:"SCROLL TO EXPLORE",trustLabel:"BUILT FOR THE WAY TEAMS SHIP",trustOne:"PR-aware",trustTwo:"Risk-proportional",trustThree:"Explainable by design",trustFour:"Runs where you work",howEyebrow:"FROM DIFF TO DECISION",howTitle:"Every change has
a different blast radius.",howIntro:"A typo and a payment-flow rewrite should not face the same gate. Risk Gate traces impact through your project, then makes the next step clear.",stepOneTag:"UNDERSTAND",stepOneTitle:"Trace the change",stepOneText:"Connect changed files to modules and dependencies across the full supported project AST.",stepTwoTag:"ASSESS",stepTwoTitle:"Make risk legible",stepTwoText:"See the affected paths, risk level, and dependency chain behind every recommendation.",stepThreeTag:"RESPOND",stepThreeTitle:"Gate what matters",stepThreeText:"Run configured validations and require approvals in proportion to the risk.",gateChecks:"CHECKS",gateReview:"REVIEW",gatePassed:"POLICY MATCHED",flowCaption:"ANALYZE → EXPLAIN → VALIDATE → REPORT",teamsEyebrow:"ONE DECISION, SHARED CONTEXT",teamsTitle:"Engineering sees
the graph.
Teams see the why.",teamsText:"A pull request report gives Engineering evidence to act on, Product a clear view of customer-facing impact, and Support the context to prepare. No one has to decode a green checkmark.",teamsLink:"Explore the analysis",boardTitle:"SHARED RELEASE CONTEXT",changeLabel:"CHANGE",changeTitle:"Checkout retry logic",changeHigh:"HIGH",impactLabel:"IMPACT PATH",roleEng:"Engineering",roleEngSub:"E2E + mutation checks required",statusRunning:"Validating",roleProduct:"Product",roleProductSub:"Customer impact is visible",roleSupport:"Support",roleSupportSub:"Release context is ready",statusReady:"Informed",boardFoot:"Evidence stays attached to the pull request.",startEyebrow:"A SMALL STEP IN YOUR WORKFLOW",startTitle:"Bring risk into
the pull request.",startText:"Add a workflow, define your repository's risk map, and let your team tune the gates to fit how you ship.",startGithub:"Get started on GitHub",startNote:"Open source · Runs in your workflow · Your rules, your repository",copy:"COPY",copied:"Copied",codeReady:"Ready for your next pull request",closing:"Make the risk visible.
Make the next step clear.",footer:"Open source, built for teams that ship." + }, + pt: { + navHow:"Como funciona",navTeams:"Para seu time",navQuick:"Comece rápido",languageLabel:"Escolha o idioma",navGithub:"Ver no GitHub",eyebrow:"CÓDIGO ABERTO · GITHUB ACTION",headline:"Publique com
impacto à vista.",subhead:"O Risk Gate relaciona o que mudou ao que importa. Depois executa as verificações adequadas antes de chegar à produção.",ctaStart:"Adicione ao workflow",ctaHow:"Veja como funciona",metaRust:"Feito em Rust",metaOpen:"Código aberto",metaRepo:"Executa no seu GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Seu navegador não suporta vídeo incorporado.",live:"FLUXO AO VIVO",prTitle:"Atualização do checkout",prFiles:"8 arquivos alterados",pipeDiff:"Mapear arquivos alterados",pipeDiffSub:"Diff do PR · grafo de dependências",pipeRisk:"Impacto identificado",pipeRiskSub:"Pagamentos → checkout → API",pipeChecks:"Executar verificações por risco",pipeChecksSub:"E2E + mutação",done:"OK",highRisk:"RISCO ALTO",running:"EXECUTANDO",teamReview:"Produto + Suporte no contexto",teamReviewSub:"Um relatório claro, contexto compartilhado",riskLevel:"RISCO DA MUDANÇA",riskHigh:"ALTO",lowRisk:"BAIXO",dangerRisk:"CRÍTICO",visualFoot:"As verificações acompanham o impacto. Toda decisão tem um motivo.",chipAst:"AST do projeto completo",chipEvidence:"Evidências auditáveis",scroll:"ROLE PARA EXPLORAR",trustLabel:"FEITO PARA O JEITO QUE OS TIMES ENTREGAM",trustOne:"Entende PRs",trustTwo:"Proporcional ao risco",trustThree:"Explicável por design",trustFour:"Roda onde você trabalha",howEyebrow:"DO DIFF À DECISÃO",howTitle:"Cada mudança tem
um raio de impacto.",howIntro:"Um ajuste de texto e uma mudança no fluxo de pagamentos não deveriam passar pela mesma barreira. O Risk Gate rastreia o impacto e deixa claro o próximo passo.",stepOneTag:"ENTENDA",stepOneTitle:"Rastreie a mudança",stepOneText:"Conecte arquivos alterados a módulos e dependências em toda a AST suportada do projeto.",stepTwoTag:"AVALIE",stepTwoTitle:"Deixe o risco claro",stepTwoText:"Veja os caminhos afetados, o nível de risco e a cadeia de dependências por trás da recomendação.",stepThreeTag:"AJA",stepThreeTitle:"Valide o que importa",stepThreeText:"Execute validações configuradas e exija aprovações proporcionais ao risco.",gateChecks:"TESTES",gateReview:"REVISÃO",gatePassed:"POLÍTICA APLICADA",flowCaption:"ANALISAR → EXPLICAR → VALIDAR → RELATAR",teamsEyebrow:"UMA DECISÃO, CONTEXTO COMPARTILHADO",teamsTitle:"Engenharia vê
o grafo.
O time entende o motivo.",teamsText:"O relatório do pull request dá evidências para Engenharia agir, visibilidade do impacto no cliente para Produto e contexto para Suporte se preparar. Ninguém precisa decifrar um sinal verde.",teamsLink:"Explore a análise",boardTitle:"CONTEXTO DE LANÇAMENTO COMPARTILHADO",changeLabel:"MUDANÇA",changeTitle:"Nova tentativa no checkout",changeHigh:"ALTO",impactLabel:"CAMINHO DO IMPACTO",roleEng:"Engenharia",roleEngSub:"Testes E2E + mutação necessários",statusRunning:"Validando",roleProduct:"Produto",roleProductSub:"Impacto no cliente visível",roleSupport:"Suporte",roleSupportSub:"Contexto da versão disponível",statusReady:"Informado",boardFoot:"As evidências ficam no pull request.",startEyebrow:"UM PEQUENO PASSO NO SEU WORKFLOW",startTitle:"Traga o risco para
o pull request.",startText:"Adicione um workflow, defina o mapa de risco do repositório e ajuste as barreiras ao jeito que seu time entrega.",startGithub:"Comece pelo GitHub",startNote:"Código aberto · No seu workflow · Suas regras, seu repositório",copy:"COPIAR",copied:"Copiado",codeReady:"Pronto para o próximo pull request",closing:"Deixe o risco visível.
Deixe claro o próximo passo.",footer:"Código aberto para times que entregam." + }, + es: { + navHow:"Cómo funciona",navTeams:"Para tu equipo",navQuick:"Inicio rápido",languageLabel:"Elegir idioma",navGithub:"Ver en GitHub",eyebrow:"CÓDIGO ABIERTO · GITHUB ACTION",headline:"Publica con
el impacto a la vista.",subhead:"Risk Gate conecta lo que cambió con lo que importa. Después ejecuta las comprobaciones adecuadas antes de llegar a producción.",ctaStart:"Añadir al workflow",ctaHow:"Ver cómo funciona",metaRust:"Hecho en Rust",metaOpen:"Código abierto",metaRepo:"Se ejecuta en tu GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Tu navegador no admite vídeo integrado.",live:"FLUJO EN VIVO",prTitle:"Actualización del checkout",prFiles:"8 archivos modificados",pipeDiff:"Mapear archivos modificados",pipeDiffSub:"Diff del PR · grafo de dependencias",pipeRisk:"Impacto detectado",pipeRiskSub:"Pagos → checkout → API",pipeChecks:"Ejecutar pruebas según el riesgo",pipeChecksSub:"E2E + mutación",done:"LISTO",highRisk:"RIESGO ALTO",running:"EJECUTANDO",teamReview:"Producto + Soporte al tanto",teamReviewSub:"Un informe claro, contexto compartido",riskLevel:"RIESGO DEL CAMBIO",riskHigh:"ALTO",lowRisk:"BAJO",dangerRisk:"CRÍTICO",visualFoot:"Las comprobaciones escalan con el impacto. Cada decisión tiene un motivo.",chipAst:"AST del proyecto completo",chipEvidence:"Evidencia auditable",scroll:"DESPLAZA PARA EXPLORAR",trustLabel:"DISEÑADO PARA LA FORMA EN QUE LOS EQUIPOS PUBLICAN",trustOne:"Entiende PRs",trustTwo:"Proporcional al riesgo",trustThree:"Explicable por diseño",trustFour:"Se ejecuta donde trabajas",howEyebrow:"DEL DIFF A LA DECISIÓN",howTitle:"Cada cambio tiene
un radio de impacto distinto.",howIntro:"Un cambio de texto y una reescritura del flujo de pagos no deberían pasar por la misma barrera. Risk Gate rastrea el impacto y aclara el siguiente paso.",stepOneTag:"ENTENDER",stepOneTitle:"Rastrea el cambio",stepOneText:"Conecta los archivos modificados con módulos y dependencias en todo el AST compatible del proyecto.",stepTwoTag:"EVALUAR",stepTwoTitle:"Haz visible el riesgo",stepTwoText:"Consulta las rutas afectadas, el nivel de riesgo y la cadena de dependencias que fundamentan cada recomendación.",stepThreeTag:"ACTUAR",stepThreeTitle:"Valida lo importante",stepThreeText:"Ejecuta validaciones configuradas y exige aprobaciones proporcionales al riesgo.",gateChecks:"PRUEBAS",gateReview:"REVISIÓN",gatePassed:"POLÍTICA APLICADA",flowCaption:"ANALIZAR → EXPLICAR → VALIDAR → INFORMAR",teamsEyebrow:"UNA DECISIÓN, CONTEXTO COMPARTIDO",teamsTitle:"Ingeniería ve
el grafo.
El equipo entiende por qué.",teamsText:"El informe del pull request da a Ingeniería pruebas para actuar, a Producto una visión clara del impacto en los clientes y a Soporte el contexto para prepararse. Nadie tiene que descifrar una marca verde.",teamsLink:"Explorar el análisis",boardTitle:"CONTEXTO COMPARTIDO DEL LANZAMIENTO",changeLabel:"CAMBIO",changeTitle:"Reintentos en checkout",changeHigh:"ALTO",impactLabel:"RUTA DEL IMPACTO",roleEng:"Ingeniería",roleEngSub:"Se requieren pruebas E2E + mutación",statusRunning:"Validando",roleProduct:"Producto",roleProductSub:"Impacto en clientes visible",roleSupport:"Soporte",roleSupportSub:"Contexto de lanzamiento listo",statusReady:"Informado",boardFoot:"Las pruebas quedan en el pull request.",startEyebrow:"UN PEQUEÑO PASO EN TU WORKFLOW",startTitle:"Lleva el riesgo
al pull request.",startText:"Añade un workflow, define el mapa de riesgo del repositorio y ajusta las barreras a la forma de publicar de tu equipo.",startGithub:"Empieza en GitHub",startNote:"Código abierto · En tu workflow · Tus reglas, tu repositorio",copy:"COPIAR",copied:"Copiado",codeReady:"Listo para tu próximo pull request",closing:"Haz visible el riesgo.
Deja claro el siguiente paso.",footer:"Código abierto para equipos que publican." + }, + ja: { + navHow:"仕組み",navTeams:"チームで活用",navQuick:"クイックスタート",languageLabel:"言語を選択",navGithub:"GitHubで見る",eyebrow:"オープンソース · GITHUB ACTION",headline:"影響を見据えて
安全にリリース。",subhead:"Risk Gate は変更内容と重要な領域を結び付けます。変更の影響に応じたチェックを本番反映前に実行します。",ctaStart:"ワークフローに追加",ctaHow:"仕組みを見る",metaRust:"Rust製",metaOpen:"オープンソース",metaRepo:"GitHub Actions 上で実行",visualTitle:"PULL REQUEST · #284",videoFallback:"お使いのブラウザーは埋め込み動画に対応していません。",live:"ライブフロー",prTitle:"チェックアウト機能の更新",prFiles:"8ファイルを変更",pipeDiff:"変更ファイルをマッピング",pipeDiffSub:"PR差分 · 依存関係グラフ",pipeRisk:"影響を検出",pipeRiskSub:"決済 → チェックアウト → API",pipeChecks:"リスクに応じたチェックを実行",pipeChecksSub:"E2E + ミューテーション",done:"完了",highRisk:"高リスク",running:"実行中",teamReview:"プロダクトとサポートも共有",teamReviewSub:"明確なレポートで状況を共有",riskLevel:"変更のリスク",riskHigh:"高",lowRisk:"低",dangerRisk:"重大",visualFoot:"影響に応じてチェックを調整。すべての判断に根拠があります。",chipAst:"プロジェクト全体のAST",chipEvidence:"監査可能な根拠",scroll:"スクロールして詳細を見る",trustLabel:"チームのリリース運用に合わせて設計",trustOne:"PRを解析",trustTwo:"リスクに比例",trustThree:"根拠を説明",trustFour:"GitHub内で実行",howEyebrow:"差分から判断へ",howTitle:"変更ごとに
影響範囲は異なります。",howIntro:"文言修正と決済フローの変更に同じゲートは不要です。Risk Gate がプロジェクト内の影響をたどり、次の対応を明確にします。",stepOneTag:"把握",stepOneTitle:"変更を追跡",stepOneText:"変更ファイルをモジュールや依存関係に結び付け、対応言語のプロジェクト全体のASTを解析します。",stepTwoTag:"評価",stepTwoTitle:"リスクを可視化",stepTwoText:"影響するパス、リスクレベル、判断の根拠となる依存関係を確認できます。",stepThreeTag:"対応",stepThreeTitle:"重要な変更をゲート",stepThreeText:"設定済みの検証を実行し、リスクに応じて承認を求めます。",gateChecks:"検証",gateReview:"レビュー",gatePassed:"ポリシー適用済み",flowCaption:"解析 → 説明 → 検証 → レポート",teamsEyebrow:"判断と状況をチームで共有",teamsTitle:"エンジニアには
依存グラフを。
チームには理由を。",teamsText:"PRレポートは、エンジニアに対応の根拠を、プロダクトに顧客影響を、サポートに準備のための状況を共有します。緑のチェックマークを読み解く必要はありません。",teamsLink:"解析の詳細を見る",boardTitle:"リリース状況を共有",changeLabel:"変更",changeTitle:"チェックアウトの再試行",changeHigh:"高",impactLabel:"影響経路",roleEng:"エンジニアリング",roleEngSub:"E2Eとミューテーション検証が必要",statusRunning:"検証中",roleProduct:"プロダクト",roleProductSub:"顧客への影響を確認",roleSupport:"サポート",roleSupportSub:"リリース情報を共有",statusReady:"共有済み",boardFoot:"根拠はPRに記録されます。",startEyebrow:"ワークフローに加える小さな一歩",startTitle:"リスクを
Pull Requestへ。",startText:"ワークフローを追加してリポジトリのリスクマップを定義し、チームの運用に合わせてゲートを調整します。",startGithub:"GitHubで始める",startNote:"オープンソース · ワークフローで実行 · 自分のルールとリポジトリ",copy:"コピー",copied:"コピーしました",codeReady:"次のPull Requestから利用できます",closing:"リスクを見える化。
次の対応を明確に。",footer:"リリースを続けるチームのためのオープンソース。" + }, + zh: { + navHow:"工作原理",navTeams:"团队协作",navQuick:"快速开始",languageLabel:"选择语言",navGithub:"在 GitHub 查看",eyebrow:"开源项目 · GITHUB ACTION",headline:"看清影响,
稳妥发布。",subhead:"Risk Gate 将代码变更与关键模块关联,并在上线前执行与变更风险相匹配的检查。",ctaStart:"添加到工作流",ctaHow:"了解工作原理",metaRust:"使用 Rust 构建",metaOpen:"开源",metaRepo:"在你的 GitHub Actions 中运行",visualTitle:"PULL REQUEST · #284",videoFallback:"你的浏览器不支持嵌入式视频。",live:"实时流程",prTitle:"结账服务更新",prFiles:"修改了 8 个文件",pipeDiff:"映射变更文件",pipeDiffSub:"PR 差异 · 依赖关系图",pipeRisk:"检测到影响",pipeRiskSub:"支付 → 结账 → API",pipeChecks:"执行匹配风险的检查",pipeChecksSub:"E2E + 变异测试",done:"完成",highRisk:"高风险",running:"运行中",teamReview:"产品与支持团队同步了解",teamReviewSub:"清晰报告,共享上下文",riskLevel:"变更风险",riskHigh:"高",lowRisk:"低",dangerRisk:"严重",visualFoot:"检查随影响程度调整。每项判断都有依据。",chipAst:"完整项目 AST",chipEvidence:"可审计证据",scroll:"向下探索",trustLabel:"为团队的交付流程而设计",trustOne:"理解 PR",trustTwo:"风险匹配",trustThree:"解释清晰",trustFour:"在现有工作流中运行",howEyebrow:"从差异到决策",howTitle:"每项变更都有
不同的影响范围。",howIntro:"文案调整和支付流程重构不应经过相同的关卡。Risk Gate 会追踪项目中的影响路径,并明确下一步操作。",stepOneTag:"理解",stepOneTitle:"追踪变更",stepOneText:"在完整的受支持项目 AST 中,将变更文件与模块和依赖项关联起来。",stepTwoTag:"评估",stepTwoTitle:"让风险一目了然",stepTwoText:"查看受影响路径、风险级别,以及每项建议背后的依赖链。",stepThreeTag:"响应",stepThreeTitle:"把关关键变更",stepThreeText:"运行已配置的验证,并根据风险要求相应审批。",gateChecks:"检查",gateReview:"评审",gatePassed:"策略已匹配",flowCaption:"分析 → 解释 → 验证 → 报告",teamsEyebrow:"共享决策与上下文",teamsTitle:"工程团队看到
依赖图。
团队理解原因。",teamsText:"Pull Request 报告为工程团队提供行动依据,让产品团队看清客户影响,也帮助支持团队提前准备。无需猜测绿色勾号代表什么。",teamsLink:"了解分析过程",boardTitle:"共享发布上下文",changeLabel:"变更",changeTitle:"结账重试逻辑",changeHigh:"高",impactLabel:"影响路径",roleEng:"工程",roleEngSub:"需要 E2E + 变异检查",statusRunning:"验证中",roleProduct:"产品",roleProductSub:"客户影响清晰可见",roleSupport:"支持",roleSupportSub:"发布信息已准备",statusReady:"已同步",boardFoot:"证据会保留在 Pull Request 中。",startEyebrow:"为工作流迈出一小步",startTitle:"让风险进入
Pull Request。",startText:"添加工作流,定义仓库风险映射,并根据团队的交付方式调整关卡。",startGithub:"在 GitHub 开始使用",startNote:"开源 · 在你的工作流中运行 · 你的规则与仓库",copy:"复制",copied:"已复制",codeReady:"准备好处理下一个 Pull Request",closing:"让风险清晰可见。
让下一步明确可行。",footer:"为持续交付的团队打造的开源项目。" + } +}; +const select = document.querySelector("#language"); +const supported = Object.keys(copy); +function setLanguage(language) { + const lang = supported.includes(language) ? language : "en"; + document.documentElement.lang = ({en:"en",pt:"pt-BR",es:"es",ja:"ja",zh:"zh-CN"})[lang]; + document.querySelectorAll("[data-i18n]").forEach((node) => { + const key = node.dataset.i18n; + if (copy[lang][key]) node.innerHTML = copy[lang][key]; + }); + select.value = lang; + try { localStorage.setItem("risk-gate-language", lang); } catch (_) {} +} +select.addEventListener("change", () => setLanguage(select.value)); +let saved = null; +try { saved = localStorage.getItem("risk-gate-language"); } catch (_) {} +const browser = (navigator.language || "en").toLowerCase(); +const initial = saved && supported.includes(saved) ? saved : browser.startsWith("pt") ? "pt" : browser.startsWith("es") ? "es" : browser.startsWith("ja") ? "ja" : browser.startsWith("zh") ? "zh" : "en"; +setLanguage(initial); +const copyButton = document.querySelector("#copy-code"); +const toast = document.querySelector("#copy-toast"); +const code = document.querySelector(".code-window code"); +async function copyWorkflow() { + try { + await navigator.clipboard.writeText(code.innerText); + toast.classList.add("show"); + window.setTimeout(() => toast.classList.remove("show"), 1500); + } catch (_) { + copyButton.textContent = "⌘C"; + window.setTimeout(() => copyButton.textContent = copy[select.value].copy, 1200); + } +} +copyButton.addEventListener("click", copyWorkflow); +copyButton.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); copyWorkflow(); } }); +if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) document.querySelector(".hero-video").pause(); + +const observer = new IntersectionObserver((entries) => entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("in-view"); observer.unobserve(entry.target); } }), { threshold: 0.15 }); +document.querySelectorAll(".step-card, .team-board, .code-window, .section-heading").forEach((element) => observer.observe(element)); diff --git a/site/assets/risk-gate-hero-poster.jpg b/site/assets/risk-gate-hero-poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50e817dfe66a540ab6dd319a7ca1e58702c43258 GIT binary patch literal 38503 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 literal 0 HcmV?d00001 diff --git a/site/assets/styles.css b/site/assets/styles.css new file mode 100644 index 0000000..6ed1bb9 --- /dev/null +++ b/site/assets/styles.css @@ -0,0 +1,9 @@ +:root{color-scheme:dark;--bg:#101716;--panel:#151e1b;--panel2:#19231f;--line:#26322d;--muted:#94a49c;--white:#f0f2e9;--mint:#c8f07a;--mint2:#91c854;--orange:#f3a26d;--mono:'DM Mono',monospace;--sans:'DM Sans',sans-serif;--display:Manrope,'DM Sans',sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:90px}body{margin:0;background:var(--bg);color:var(--white);font-family:var(--sans);font-size:15px;line-height:1.6;overflow-x:hidden}body:before{content:"";position:absolute;inset:0 0 auto;height:890px;pointer-events:none;background:radial-gradient(ellipse 50% 62% at 80% 14%,rgba(76,113,71,.2),transparent 72%),radial-gradient(ellipse 33% 42% at 14% 44%,rgba(79,120,80,.08),transparent 70%)}.grain{position:fixed;inset:0;z-index:5;pointer-events:none;opacity:.08;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.22'/%3E%3C/svg%3E")}.wrap{width:min(1160px,calc(100% - 56px));margin-inline:auto}.topbar{height:84px;display:flex;align-items:center;justify-content:space-between;position:relative;z-index:10;border-bottom:1px solid rgba(190,212,194,.09)}.brand{display:flex;align-items:center;gap:10px;color:var(--white);font:800 18px var(--display);letter-spacing:-1.1px;text-decoration:none}.brand-light{color:#91a399;font-weight:500}.brand-mark{width:22px;height:22px;display:flex;align-items:flex-end;gap:3px}.brand-mark i{display:block;width:5px;border-radius:4px;background:var(--mint);box-shadow:0 0 12px #c8f07745}.brand-mark i:nth-child(1){height:10px}.brand-mark i:nth-child(2){height:16px}.brand-mark i:nth-child(3){height:21px}.nav-links{display:flex;gap:35px;margin-left:120px}.nav-links a,.nav-actions a{font-size:12px;color:#acb7b1;text-decoration:none;transition:color .2s}.nav-links a:hover,.nav-actions a:hover{color:var(--mint)}.nav-actions{display:flex;align-items:center;gap:19px}#language{background:transparent;border:1px solid #304038;border-radius:5px;color:var(--white);padding:7px 8px;font:11px var(--mono);cursor:pointer}#language option{background:#15201b}.nav-cta{display:flex;align-items:center;gap:8px!important;color:var(--white)!important;padding:10px 13px;border:1px solid #36443b;border-radius:5px}.nav-cta span:last-child{color:var(--mint);font-size:15px}.hero{min-height:680px;padding:115px 0 78px;display:grid;grid-template-columns:.88fr 1.12fr;align-items:center;gap:45px;position:relative}.hero-copy{padding-bottom:18px}.eyebrow{display:flex;align-items:center;gap:10px;color:var(--mint);font:10px var(--mono);letter-spacing:1.35px}.pulse{width:7px;height:7px;background:var(--mint);border-radius:50%;box-shadow:0 0 0 4px #c8f07717;animation:pulse 2.2s infinite}.hero h1,.section h2,.team-copy h2,.quickstart-copy h2{margin:25px 0 21px;font:600 clamp(47px,5.4vw,68px)/1.04 var(--display);letter-spacing:-4.5px}.hero h1 em,.section h2 em,.team-copy h2 em,.quickstart-copy h2 em{font-style:normal;color:var(--mint)}.hero-sub{max-width:438px;color:#a9b5ad;font-size:15px;line-height:1.8}.hero-actions{display:flex;align-items:center;gap:21px;margin-top:31px}.button{display:inline-flex;align-items:center;gap:13px;text-decoration:none;font-size:12px;font-weight:700;transition:transform .2s,background .2s}.button:hover{transform:translateY(-2px)}.button-primary{padding:14px 17px;border-radius:5px;background:var(--mint);color:#101711}.button-primary span:last-child{font-size:15px}.button-quiet{color:#e3e8df}.play-icon{display:grid;place-items:center;width:28px;height:28px;border:1px solid #536058;border-radius:50%;font-size:8px;color:var(--mint);padding-left:2px}.hero-meta{display:flex;gap:20px;margin-top:35px;color:#829188;font:9px var(--mono)}.hero-meta span{display:flex;align-items:center;gap:6px}.meta-dot{width:4px;height:4px;border-radius:50%;background:#6a8570}.hero-visual{position:relative;border:1px solid #35443a;background:linear-gradient(140deg,#1b2620,#111916 71%);border-radius:9px;box-shadow:0 30px 90px #0007,0 0 70px #b5ee6810;transform:perspective(1200px) rotateY(-3deg) rotateX(1deg);animation:float 7s ease-in-out infinite}.visual-top{height:45px;padding:0 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2c3931}.window-dots{display:flex;gap:5px}.window-dots i{width:6px;height:6px;border-radius:50%;background:#536157}.window-dots i:first-child{background:#db8075}.window-dots i:nth-child(2){background:#dcb968}.window-dots i:last-child{background:#79b879}.visual-label{font:9px var(--mono);letter-spacing:1px;color:#839087}.live-tag{font:8px var(--mono);letter-spacing:.8px;color:#9faea3;display:flex;align-items:center;gap:6px}.live-tag b,.code-status i{width:5px;height:5px;border-radius:50%;background:var(--mint);box-shadow:0 0 7px #c8f077}.visual-body{padding:18px 19px 14px}.pr-card{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid #303d34;background:#18221d;border-radius:5px}.pr-icon{display:grid;place-items:center;width:28px;height:28px;border-radius:5px;background:#29392c;color:var(--mint);font-size:18px}.pr-title{font-size:11px;font-weight:700}.pr-caption{display:flex;gap:6px;align-items:center;color:#84928a;font-size:8px;margin-top:2px}.mono{font:8px var(--mono);color:#9eb1a2}.pr-check{margin-left:auto;display:grid;place-items:center;width:20px;height:20px;border-radius:50%;background:#c8f0771e;color:var(--mint);font-size:11px}.flow-line{height:21px;width:1px;background:#475b49;margin-left:26px;position:relative}.flow-line span{position:absolute;top:0;width:4px;height:4px;left:-1.5px;border-radius:50%;background:var(--mint);animation:flow 2.2s ease-in-out infinite}.pipeline{border:1px solid #303d34;border-radius:5px;overflow:hidden}.pipe-step{height:52px;display:flex;align-items:center;gap:9px;padding:0 11px;border-bottom:1px solid #2a352e;position:relative}.pipe-step:last-child{border:0}.step-icon{width:19px;height:19px;display:grid;place-items:center;border-radius:50%;font-size:10px}.done .step-icon{background:#c8f07718;color:var(--mint)}.active .step-icon{background:#f3a26d1c;color:var(--orange)}.spin{animation:spin 2.4s linear infinite;font-size:14px}.pipe-step strong{display:block;font-size:10px;font-weight:600}.pipe-step small{display:block;color:#829087;font-size:8px;margin-top:1px}.step-state,.running,.risk-pill{margin-left:auto;font:8px var(--mono);letter-spacing:.5px}.step-state{color:#91c67b}.running{color:var(--orange)}.risk-pill{color:#ffb685;background:#f3a26d16;border:1px solid #f3a26d38;border-radius:3px;padding:3px 5px}.review-row{margin-top:10px;display:flex;align-items:center;gap:9px;padding:9px 10px;background:#202b24;border-radius:4px}.review-avatars{display:flex;padding-left:3px}.avatar{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;font-size:8px;font-weight:700;border:2px solid #202b24;margin-left:-3px}.avatar-product{background:#8196df;color:white}.avatar-support{background:#c48361;color:white}.review-copy strong{display:block;font-size:9px}.review-copy small{display:block;color:#89978e;font-size:8px}.review-arrow{margin-left:auto;color:#9ab684}.risk-meter{padding:11px 2px 0}.meter-label,.meter-foot{display:flex;justify-content:space-between;font:8px var(--mono);color:#84948b;letter-spacing:.7px}.meter-value{color:var(--orange)}.meter-bars{display:flex;gap:3px;margin:6px 0 3px}.meter-bars i{height:4px;flex:1;border-radius:2px;background:#344238}.meter-bars i:first-child{background:#75ba70}.meter-bars i:nth-child(2){background:#a8c96d}.meter-bars i:nth-child(3){background:#e2c36d}.meter-bars i:nth-child(4){background:#e5a365}.meter-bars i:nth-child(5){background:#f39b6c;box-shadow:0 0 10px #f39b6c70}.meter-foot{font-size:7px;color:#6f7e74}.visual-foot{padding:10px 18px;display:flex;gap:8px;align-items:center;border-top:1px solid #2a352e;color:#aab5ad;font-size:9px}.foot-check{color:var(--mint)}.float-chip{position:absolute;padding:8px 10px;border:1px solid #3c4c40;background:#19231f;border-radius:4px;box-shadow:0 8px 20px #0006;color:#b9c8ba;font:8px var(--mono);letter-spacing:.2px;white-space:nowrap}.float-chip span:first-child{color:var(--mint);padding-right:3px}.chip-one{top:69px;right:-31px;animation:float 5s ease-in-out infinite}.chip-two{bottom:76px;left:-32px;animation:float 5s ease-in-out -2.2s infinite}.hero-scroll{position:absolute;left:0;bottom:28px;display:flex;align-items:center;gap:9px;color:#6e7d74;font:8px var(--mono);letter-spacing:1.2px}.hero-scroll span:first-child{width:1px;height:27px;background:linear-gradient(var(--mint),transparent)}.trust-strip{border-block:1px solid #26322d;background:#131a17}.trust-inner{min-height:77px;display:flex;align-items:center;justify-content:space-between;gap:30px}.trust-inner>span{font:9px var(--mono);letter-spacing:1px;color:#829087;white-space:nowrap}.trust-items{display:flex;gap:37px}.trust-items span{font-size:10px;color:#9eaaa2}.trust-items b{font:9px var(--mono);color:var(--mint);margin-right:5px}.section{padding-top:126px;padding-bottom:110px}.section-heading{display:grid;grid-template-columns:1fr .62fr;align-items:end;gap:30px;margin-bottom:53px}.eyebrow-num{color:#79916e}.section h2,.team-copy h2,.quickstart-copy h2{font-size:47px;letter-spacing:-2.8px;line-height:1.08;margin:20px 0 0}.section-heading>p{max-width:390px;color:#99a69d;font-size:13px;line-height:1.8;margin-bottom:4px}.steps-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.step-card{padding:17px 17px 22px;background:linear-gradient(145deg,#19221d,#141b18);border:1px solid #2c3931;border-radius:6px;min-width:0;opacity:0;transform:translateY(18px);transition:opacity .7s,transform .7s}.step-card.in-view{opacity:1;transform:none}.step-card:nth-child(2){transition-delay:.13s}.step-card:nth-child(3){transition-delay:.26s}.card-index{font:9px var(--mono);color:#6e7d73;letter-spacing:.9px}.card-index span:first-child{color:#435047;margin:0 5px}.card-art{height:160px;margin:14px 0 20px;border:1px solid #2b382f;border-radius:4px;background:radial-gradient(ellipse at 50% 55%,#28372b,#161e1a 66%);position:relative;overflow:hidden}.step-card h3{font:600 16px var(--display);margin:0 0 7px;letter-spacing:-.4px}.step-card>p{font-size:11px;line-height:1.7;color:#92a097;margin:0}.graph-node{position:absolute;z-index:2;display:grid;place-items:center;width:31px;height:31px;border-radius:50%;background:#203025;border:1px solid #63854f;color:var(--mint);font:9px var(--mono);box-shadow:0 0 18px #b9f07518}.node-a{left:16%;top:44%}.node-b{left:44%;top:25%}.node-c{right:18%;top:43%;background:#302721;border-color:#a4704c;color:#ffb785}.node-d{left:44%;bottom:10%;background:#242c3a;border-color:#5c7095;color:#a8b9f5}.graph-link{position:absolute;height:1px;background:#647a57;transform-origin:left}.link-a{width:66px;left:27%;top:48%;transform:rotate(-24deg)}.link-b{width:72px;left:56%;top:36%;transform:rotate(23deg);background:#a6774a}.link-c{width:67px;left:50%;top:48%;transform:rotate(90deg);background:#637597}.graph-orbit{position:absolute;inset:22% 20%;border:1px dashed #57704d46;border-radius:50%;animation:spin 22s linear infinite}.bars-art{padding:23px 16px}.bar-row{height:24px;display:flex;align-items:center;gap:8px;color:#91a097;font:8px var(--mono)}.bar-row>span{width:28px}.bar-row i{height:5px;width:var(--w);max-width:calc(100% - 78px);border-radius:5px;background:#748f68;animation:grow 1.2s ease-out both}.bar-row b{margin-left:auto;font-size:7px;color:#8b9a8e;font-weight:400}.bar-highlight{color:#d8e3ce}.bar-highlight i{background:var(--mint);box-shadow:0 0 11px #c8f07740}.bar-highlight b{color:var(--mint)}.bar-axis{position:absolute;bottom:12px;left:16px;right:16px;display:flex;justify-content:space-between;padding-top:6px;border-top:1px solid #344138;color:#627067;font:7px var(--mono);letter-spacing:.7px}.gate-track{position:absolute;left:21px;right:21px;top:68px;height:1px;background:#536a4f}.gate-track i{position:absolute;top:-3px;width:7px;height:7px;border-radius:50%;background:var(--mint);box-shadow:0 0 12px #c8f07775}.gate-track i:nth-child(1){left:4%}.gate-track i:nth-child(2){left:50%}.gate-track i:nth-child(3){right:4%}.gate-track span{position:absolute;left:4%;top:-1px;height:3px;width:0;background:var(--mint);animation:travel 3s ease-in-out infinite}.gate-core{position:absolute;top:48px;left:calc(50% - 21px);width:42px;height:42px;display:grid;place-items:center;border:1px solid #91bb6a;border-radius:50%;background:#243322;color:var(--mint);font-size:16px;box-shadow:0 0 27px #c8f07729}.gate-label{position:absolute;top:86px;font:7px var(--mono);letter-spacing:1px;color:#819086}.gate-left{left:16px}.gate-right{right:16px}.gate-caption{position:absolute;bottom:15px;left:0;right:0;text-align:center;color:#9cba81;font:8px var(--mono);letter-spacing:.9px}.flow-caption{margin-top:27px;display:flex;align-items:center;justify-content:center;gap:15px;color:#78867c;font:8px var(--mono);letter-spacing:1.1px}.flow-rule{width:60px;height:1px;background:#334038}.team-section{padding:105px 0 112px;border-block:1px solid #26322d;background:radial-gradient(ellipse 38% 88% at 79% 54%,#263527 0%,transparent 73%),#131a17;overflow:hidden}.team-layout{display:grid;grid-template-columns:.79fr 1.21fr;gap:76px;align-items:center}.team-copy h2{margin-top:20px;font-size:43px}.team-copy>p{max-width:410px;color:#9ba8a0;font-size:12px;line-height:1.85;margin:21px 0}.text-link{display:inline-flex;align-items:center;gap:12px;padding-bottom:5px;border-bottom:1px solid #768b68;color:var(--mint);font-size:11px;text-decoration:none}.team-board{position:relative;padding:18px 20px 0;border:1px solid #3b4b3e;border-radius:7px;background:linear-gradient(140deg,#202b23,#151d19 75%);box-shadow:0 25px 65px #0005;overflow:hidden;opacity:0;transform:translateY(20px);transition:opacity .7s,transform .7s}.team-board.in-view{opacity:1;transform:none}.board-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:14px;border-bottom:1px solid #344038}.board-tag{display:flex;align-items:center;gap:7px;color:#9ca89f;font:8px var(--mono);letter-spacing:.9px}.board-tag i{width:5px;height:5px;border-radius:50%;background:var(--mint)}.board-id{font:8px var(--mono);color:#627168}.board-change{display:flex;align-items:center;gap:12px;padding:19px 1px 16px}.change-icon{display:grid;place-items:center;width:35px;height:35px;border-radius:5px;background:#2b392c;color:var(--mint);font-size:18px}.board-change>div:nth-child(2){display:grid;gap:2px}.board-change small,.impact-path>span{font:7px var(--mono);letter-spacing:1px;color:#738177}.board-change strong{font-size:12px}.change-path{font:8px var(--mono);color:#8e9c91}.change-risk{margin-left:auto;color:#ffc08e;background:#ed996c16;border:1px solid #ed996c3c;border-radius:3px;padding:4px 7px;font:8px var(--mono)}.impact-path{padding:12px 0 17px;border-top:1px solid #2e3a32}.path-chips{display:flex;align-items:center;gap:7px;margin-top:9px}.path-chips span{background:#29342b;color:#bac7bb;padding:5px 7px;border-radius:3px;font:8px var(--mono)}.path-chips b{color:#77877b;font:9px var(--mono)}.path-chips .path-warn{background:#3b3027;color:#ffbb87}.board-divider{height:1px;background:#2d3931}.team-rows{padding:5px 0}.team-row{display:flex;align-items:center;gap:10px;padding:9px 0}.team-avatar{width:25px;height:25px;border-radius:50%;display:grid;place-items:center;font-size:9px;font-weight:700}.av-eng{background:#c4ea7c;color:#1c281c}.av-prod{background:#7386c4;color:white}.av-sup{background:#ca9068;color:white}.team-row>div:nth-child(2){display:grid;gap:0}.team-row strong{font-size:9px}.team-row small{color:#85948a;font-size:8px}.team-status{margin-left:auto;display:flex;align-items:center;gap:6px;font:8px var(--mono)}.status-running{color:#e6aa7d}.status-running i{width:5px;height:5px;border-radius:50%;background:var(--orange);animation:pulse 1.8s infinite}.status-ready{color:#9ac87c}.board-footer{margin:0 -20px;padding:11px 20px;border-top:1px solid #2e3a32;background:#19221d;color:#819087;font-size:8px;display:flex;gap:7px;align-items:center}.foot-lock{color:#b3c98b}.board-orbit{position:absolute;border:1px solid #c8f07708;border-radius:50%;pointer-events:none}.orbit-a{width:370px;height:370px;right:-300px;top:20px}.orbit-b{width:270px;height:270px;right:-250px;top:70px}.quickstart-section{padding-top:125px;padding-bottom:117px;display:grid;grid-template-columns:.82fr 1.18fr;gap:75px;align-items:center}.quickstart-copy h2{font-size:45px}.quickstart-copy>p{max-width:355px;color:#9ba8a0;font-size:12px;line-height:1.8;margin:18px 0 24px}.start-note{margin-top:17px;color:#7e8d83;font-size:9px;display:flex;gap:7px;align-items:center}.start-note span:first-child{color:var(--mint)}.code-window{position:relative;border:1px solid #38463c;background:#131a17;border-radius:6px;box-shadow:0 22px 55px #0005;opacity:0;transform:translateY(18px);transition:opacity .7s,transform .7s}.code-window.in-view{opacity:1;transform:none}.code-top{height:43px;padding:0 13px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2c3830;color:#839087;font:8px var(--mono)}.code-top .window-dots{margin-right:auto}.code-top>span:nth-child(2){margin-left:12px}.code-copy{padding:5px 7px;color:var(--mint);border:1px solid #39483b;border-radius:3px;cursor:pointer}.code-copy:hover{background:#26352a}.code-window pre{margin:0;padding:19px 20px 21px;overflow:auto;color:#c2cec4;font:9px/1.95 var(--mono)}.code-muted{color:#65766b}.code-key{color:#a7cb83}.code-val{color:#e2b785}.code-num{color:#b1a1dc}.code-expr{color:#84bcc2}.code-bottom{height:35px;display:flex;align-items:center;justify-content:space-between;padding:0 14px;border-top:1px solid #2d3931;color:#839087;font:8px var(--mono)}.code-status{display:flex;align-items:center;gap:7px}.code-status i{display:block}.code-lang{color:#718075}.code-toast{position:absolute;right:12px;top:50px;padding:5px 9px;border-radius:3px;background:var(--mint);color:#172017;font-size:9px;opacity:0;transform:translateY(-3px);transition:all .2s;pointer-events:none}.code-toast.show{opacity:1;transform:none}.closing{padding:31px 0 37px;border-top:1px solid #2a362f;border-bottom:1px solid #2a362f;display:flex;align-items:center;gap:19px}.closing-mark{display:flex;gap:3px;align-items:flex-end;height:22px}.closing-mark i{width:4px;border-radius:2px;background:var(--mint)}.closing-mark i:first-child{height:9px}.closing-mark i:nth-child(2){height:15px}.closing-mark i:last-child{height:21px}.closing p{font:600 15px/1.4 var(--display);margin:0;letter-spacing:-.2px}.closing a{margin-left:auto;display:grid;place-items:center;width:34px;height:34px;border:1px solid #445345;border-radius:50%;color:var(--mint);text-decoration:none}.footer{min-height:74px;display:flex;align-items:center;gap:24px;color:#76857b;font-size:9px}.brand-small{font-size:13px}.brand-small .brand-mark{transform:scale(.75);transform-origin:left center;width:18px}.footer>a:nth-of-type(2){color:#a6b1a9;text-decoration:none}.footer-copy{margin-left:auto;font:8px var(--mono)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes pulse{0%,100%{opacity:1;box-shadow:0 0 0 3px #c8f07715}50%{opacity:.55;box-shadow:0 0 0 7px #c8f07700}}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes flow{0%{transform:translateY(0);opacity:0}25%{opacity:1}100%{transform:translateY(18px);opacity:0}}@keyframes grow{from{width:0}to{width:var(--w)}}@keyframes travel{0%{width:0;left:4%}50%{width:46%;left:4%}100%{width:0;left:96%}}@media(max-width:960px){.nav-links{margin-left:0;gap:19px}.hero{grid-template-columns:.9fr 1.1fr;gap:23px;padding-top:95px}.hero h1{font-size:57px}.hero-meta{gap:10px;font-size:8px}.trust-items{gap:18px}.team-layout{gap:40px}.quickstart-section{gap:42px}}@media(max-width:720px){.wrap{width:min(100% - 36px,530px)}.topbar{height:68px}.nav-links{display:none}.nav-actions{gap:10px}.nav-cta{padding:8px 10px}.hero{padding:77px 0 85px;grid-template-columns:1fr;gap:47px}.hero h1{font-size:58px;letter-spacing:-3.4px}.hero-sub{font-size:14px;max-width:500px}.hero-visual{margin-inline:9px;transform:none}.float-chip{font-size:7px}.chip-one{right:-12px}.chip-two{left:-13px}.hero-scroll{bottom:25px}.trust-inner{padding:20px 0;align-items:flex-start;flex-direction:column;gap:17px}.trust-items{display:grid;grid-template-columns:1fr 1fr;gap:12px 18px}.section{padding:82px 0}.section-heading{grid-template-columns:1fr;gap:17px;margin-bottom:32px}.section h2,.team-copy h2,.quickstart-copy h2{font-size:39px;letter-spacing:-2px}.section-heading>p{font-size:12px}.steps-grid{grid-template-columns:1fr;gap:11px}.step-card{padding:16px}.card-art{height:150px}.flow-caption{font-size:7px;gap:8px}.flow-rule{width:21px}.team-section{padding:76px 0}.team-layout{grid-template-columns:1fr;gap:34px}.team-copy>p{font-size:12px}.team-board{padding-inline:14px}.board-footer{margin-inline:-14px;padding-inline:14px}.path-chips{gap:4px}.path-chips span{font-size:7px;padding:5px 4px}.quickstart-section{padding-top:78px;padding-bottom:75px;grid-template-columns:1fr;gap:29px}.quickstart-copy h2{font-size:40px}.code-window pre{padding:16px 12px;font-size:7.1px}.footer{flex-wrap:wrap;gap:13px;padding:17px 0}.footer-copy{width:100%;margin:0}.closing p{font-size:13px}}@media(max-width:390px){.hero h1{font-size:50px}.hero-actions{gap:14px}.button{font-size:10px}.hero-meta{flex-wrap:wrap}.visual-body{padding:14px 12px 11px}.pipe-step{padding-inline:8px;gap:7px}.pipe-step strong{font-size:9px}.pipe-step small{font-size:7px}.risk-pill,.step-state,.running{font-size:7px}.review-copy strong{font-size:8px}.review-copy small{font-size:7px}.board-change strong{font-size:10px}.path-chips{gap:3px}.path-chips span{font-size:6px}.path-chips b{font-size:7px}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}} + +/* Hero film: the artwork is a real, locally bundled MP4 with native playback controls. */ +.hero-visual{aspect-ratio:16/9;min-height:0;overflow:visible;background:#111916;transform:none;isolation:isolate} +.hero-video{position:absolute;inset:0;width:100%;height:100%;border:1px solid #35443a;border-radius:9px;object-fit:cover;background:#101716;box-shadow:0 30px 90px #0007,0 0 70px #b5ee6810} +.video-top{position:absolute;z-index:2;top:1px;left:1px;right:1px;height:44px;padding:0 15px;display:flex;align-items:center;justify-content:space-between;border-radius:8px 8px 0 0;background:linear-gradient(#111916e8,#11191600);pointer-events:none} +.video-caption{position:absolute;z-index:2;bottom:1px;left:1px;right:1px;padding:27px 16px 35px;display:flex;align-items:center;gap:8px;border-radius:0 0 8px 8px;background:linear-gradient(#11191600,#111916ed);color:#c3cec5;font-size:9px;pointer-events:none} +.hero-visual .chip-one{top:18%;right:-23px}.hero-visual .chip-two{bottom:19%;left:-23px} +@media(max-width:720px){.hero-visual{margin-inline:10px}.hero-visual .chip-one{right:-15px}.hero-visual .chip-two{left:-15px}.video-caption{padding:20px 10px 27px;font-size:8px}} diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..4ec1977 --- /dev/null +++ b/site/index.html @@ -0,0 +1,82 @@ + + + + + + + + Risk Gate — ship with impact in view + + + + + + + + +
+ riskgate + + +
+ +
+
+
+
OPEN SOURCE · GITHUB ACTION
+

Ship with
impact in view.

+

Risk Gate maps what changed to what matters. Then it runs the checks that change deserves, before it reaches production.

+ +
Built in RustOpen sourceRuns in your GitHub Actions
+
+
+ +
PULL REQUEST · #284LIVE FLOW
+ ✳ Full-project AST⌁ Auditable evidence +
✓Checks scale with impact. Every decision has a reason.
+
+
SCROLL TO EXPLORE
+
+ +
BUILT FOR THE WAY TEAMS SHIP
01 PR-aware02 Risk-proportional03 Explainable by design04 Runs where you work
+ +
+
01FROM DIFF TO DECISION

Every change has
a different blast radius.

A typo and a payment-flow rewrite should not face the same gate. Risk Gate traces impact through your project, then makes the next step clear.

+
+
01 — UNDERSTAND
PR
API
PAY
DB

Trace the change

Connect changed files to modules and dependencies across the full supported project AST.

+
02 — ASSESS
ui/LOW
api/NORMAL
pay/HIGH
db/DANGER
PATH → IMPACTMAX

Make risk legible

See the affected paths, risk level, and dependency chain behind every recommendation.

+
03 — RESPOND
CHECKS
REVIEW
✓
POLICY MATCHED

Gate what matters

Run configured validations and require approvals in proportion to the risk.

+
+
ANALYZE → EXPLAIN → VALIDATE → REPORT
+
+ +
02ONE DECISION, SHARED CONTEXT

Engineering sees
the graph.
Teams see the why.

A pull request report gives Engineering evidence to act on, Product a clear view of customer-facing impact, and Support the context to prepare. No one has to decode a green checkmark.

Explore the analysis↗
SHARED RELEASE CONTEXTRG / 284
⌘
CHANGECheckout retry logicsrc/checkout/retry.rs
HIGH
IMPACT PATH
checkout→payment API→customer billing
E
EngineeringE2E + mutation checks required
Validating
P
ProductCustomer impact is visible
✓ Informed
S
SupportRelease context is ready
✓ Informed
+ +
03A SMALL STEP IN YOUR WORKFLOW

Bring risk into
the pull request.

Add a workflow, define your repository's risk map, and let your team tune the gates to fit how you ship.

Get started on GitHub↗
⌁Open source · Runs in your workflow · Your rules, your repository
risk-gate.ymlCOPY
# .github/workflows/risk-gate.yml
+name: Risk Gate
+on:
+  pull_request:
+    types: [opened, synchronize, reopened]
+permissions:
+  contents: read
+  pull-requests: read
+  issues: write
+jobs:
+  risk-gate:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - uses: CodeArq-tech/software-risk-gate@v0.1.9
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
Ready for your next pull requestYAML
Copied
+ +

Make the risk visible.
Make the next step clear.

↗
+
+ + +