/* Shared reading surfaces. Product facts are checked against the purchased pack. */
(function () {
const { useT } = window.I18n;
const { PRODUCT, routeHref } = window.Site;
const CONTENT = window.BlooProductContent;
function ResourceHeader({ eyebrow, title, intro, children }) {
  return <header className="resource-header studio-container"><span className="studio-eyebrow">{eyebrow}</span><h1>{title}</h1>{intro && <p>{intro}</p>}{children}</header>;
}
function ResourceLayout({ sections, children, label }) {
  const { t } = useT();
  return <div className="resource-layout studio-container"><aside className="resource-index"><details open><summary>{label || t('On this page', 'Nesta página')}</summary><nav aria-label={label || t('On this page', 'Nesta página')}>{sections.map(([id, title], i) => <a key={id} href={'#' + id}><span aria-hidden="true">{String(i + 1).padStart(2, '0')}</span>{title}</a>)}</nav></details></aside><div className="resource-prose">{children}</div></div>;
}
function ResourceSection({ id, title, children }) { return <section id={id} className="resource-section"><h2>{title}</h2>{children}</section>; }
function Note({ title, children }) { return <aside className="resource-note">{title && <strong>{title}</strong>}{children}</aside>; }
function ReportPreview({ compact = false }) {
  const { t } = useT();
  return <article className={'sample-report' + (compact ? ' sample-report--compact' : '')} aria-label={t('Expected review excerpt', 'Trecho da revisão esperada')}>
    <div className="sample-report__bar"><span>/code-review</span><span>{t('EXPECTED OUTPUT · EXCERPT', 'SAÍDA ESPERADA · TRECHO')}</span></div>
    <div className="sample-report__verdict"><span>{t('Review result', 'Resultado da revisão')}</span><strong>{t('Request changes', 'Solicitar alterações')}</strong><p>{t(`${CONTENT.reportCounts.blockers} blockers · ${CONTENT.reportCounts.shouldFix} should-fix · ${CONTENT.reportCounts.suggestions} suggestions`, `${CONTENT.reportCounts.blockers} bloqueadores · ${CONTENT.reportCounts.shouldFix} correções recomendadas · ${CONTENT.reportCounts.suggestions} sugestões`)}</p></div>
    <div className="sample-report__body"><p className="sample-report__scope">{t('General · security · performance · API', 'Geral · segurança · desempenho · API')}</p><h3><span>[BLOCKER] · F1</span>{t('User input reaches a SQL query.', 'A entrada do usuário chega à consulta SQL.')}</h3><dl>
      <div><dt>{t('Location', 'Local')}</dt><dd><code>GET /api/users/:userId</code></dd></div>
      <div><dt>{t('Failure scenario', 'Cenário de falha')}</dt><dd>{t('A caller inserts SQL into userId or limit and accesses records outside the intended query.', 'Uma pessoa insere SQL em userId ou limit e acessa registros fora da consulta pretendida.')}</dd></div>
      <div><dt>{t('Evidence', 'Evidência')}</dt><dd>{t('Both values are concatenated into SQL before db.query.', 'Os dois valores são concatenados ao SQL antes de db.query.')}</dd></div>
      {!compact && <><div><dt>{t('Fix', 'Correção')}</dt><dd>{t('Use bound parameters. Parse and bound limit as an integer.', 'Use parâmetros vinculados. Converta limit para inteiro e limite seu valor.')}</dd></div><div><dt>{t('Verification', 'Verificação')}</dt><dd>{t('Test quote and boolean payloads and assert the maximum page size.', 'Teste entradas com aspas e expressões booleanas e verifique o tamanho máximo da página.')}</dd></div></>}
      <div><dt>{t('Basis / confidence', 'Base / confiança')}</dt><dd><code>security.input</code> · {t('high', 'alta')}</dd></div>
    </dl><p className="sample-report__foot">{t('F1 of 4 findings from the pack’s authored smoke-test expectation. This is not a recorded model result.', 'F1 de 4 achados da resposta esperada escrita para o teste de exemplo do pack. Não é um resultado registrado de um modelo.')}</p></div>
  </article>;
}
function BuyerFAQ() {
  const { t } = useT();
  const questions = [
    [t('What am I buying?', 'O que estou comprando?'), t('Readable Markdown instructions, YAML/JSON policy templates, and integrations installed in your repository. Your AI agent follows the workflow; bloo does not run a hosted analysis engine.', 'Instruções legíveis em Markdown, modelos de política em YAML/JSON e integrações instaladas no seu repositório. Seu agente de IA segue o fluxo; a bloo não executa um motor de análise hospedado.')],
    [t('What do I need?', 'Do que preciso?'), t('A GitHub account for the purchase invitation, access to your project, Git authentication for the pack, and Claude Code, Cursor, or GitHub Copilot agent mode. AI-provider subscriptions and model usage are separate.', 'Uma conta do GitHub para receber o convite da compra, acesso ao projeto, autenticação Git para o pack e Claude Code, Cursor ou modo agente do GitHub Copilot. Assinaturas de provedores de IA e uso de modelos são separados.')],
    [t('What if I do not use React or Flutter?', 'E se eu não usar React ou Flutter?'), t('General, security, API, performance, accessibility, and architecture guidance can still apply. React and Flutter are the two shipped framework adapters; other stacks do not get an invented framework-specific adapter.', 'As orientações gerais, de segurança, API, desempenho, acessibilidade e arquitetura ainda podem se aplicar. React e Flutter são os dois adaptadores de framework incluídos; outras tecnologias não recebem um adaptador específico inventado.')],
    [t('Does everyone need access to the pack?', 'Todos precisam acessar o pack?'), t('No. One licensed team member installs it and commits .bloo/ plus the selected tool integrations into the team’s private project. Teammates pull that policy. One license covers up to ten developers on the licensed team.', 'Não. Uma pessoa do time licenciado instala e faz commit de .bloo/ e das integrações escolhidas no projeto privado do time. As demais recebem essa política ao atualizar o projeto. Uma licença cobre até dez pessoas desenvolvedoras do time licenciado.')],
    [t('How do updates work?', 'Como funcionam as atualizações?'), t('Twelve months of updates and support are included. /update-bloo-pack previews changes and preserves local policy. Later renewal is optional, priced before renewal, and never automatic. Permanent use of the purchased version remains.', 'Doze meses de atualizações e suporte estão incluídos. /update-bloo-pack mostra a prévia das mudanças e preserva a política local. Depois, a renovação é opcional, com preço informado antes da renovação e sem cobrança automática. O uso da versão adquirida continua permanente.')],
    [t('What if access or installation fails?', 'E se o acesso ou a instalação falhar?'), t('First accept the invitation using the GitHub account entered at checkout and confirm your Git authentication. Do not change the pack URL to work around an access error. Contact Bruno for help; initial support response is within two business days.', 'Primeiro aceite o convite usando a conta do GitHub informada no checkout e confirme sua autenticação Git. Não altere a URL do pack para contornar um erro de acesso. Fale com Bruno; a primeira resposta do suporte ocorre em até dois dias úteis.')],
  ];
  return <section className="buyer-faq studio-container" id="questions"><div><span className="studio-eyebrow">{t('BEFORE YOU BUY', 'ANTES DE COMPRAR')}</span><h2>{t('The practical details.', 'Os detalhes práticos.')}</h2><a className="studio-text-link" href={routeHref('docs')}>{t('Open the manual', 'Abrir o manual')} ↗</a></div><div>{questions.map(([question, answer]) => <details key={question}><summary>{question}</summary><p>{answer}</p></details>)}</div></section>;
}
window.ProductResources = { CONTENT, ResourceHeader, ResourceLayout, ResourceSection, Note, ReportPreview, BuyerFAQ };
})();
