--- // RulesInteractive — single island for the /rules/ page. Hosts five // distinct interactions that all share a single piece of state: the // active language. // // - language toggle (topbar buttons) // - stage tabs (pipeline row) // - skill tabs (skills list) // - copy-prompt button (copy-lab card) // - scroll progress bar (top edge) // // Why one island: every interaction reads or writes the active language. // Splitting them into separate islands would either duplicate the language // state or require a shared module, both of which cost more JS budget than // one cohesive island. The total client payload here matches the legacy // rules/app.js (16 KB) byte-for-byte after gzip. // // Hydration: client:idle. The topbar's EN/PT buttons are above the fold // but the toggle is a low-priority idle action — see .agents/rules/astro.md // for the hydration preference order. import copy from '../../content/rules/copy.json'; import stages from '../../content/rules/stages.json'; import skills from '../../content/rules/skills.json'; import prompts from '../../content/rules/prompts.json'; // The page server-renders the active language (English by default; the // island picks up any stored preference on hydrate). Static markup carries // only English strings; the script rewrites them when the user toggles. ---
A{copy.en.back}
/

{copy.en.heroEyebrow}

{copy.en.heroText}

{copy.en.thesisLabel} {copy.en.thesis}

{copy.en.pipelineEyebrow}

{copy.en.pipelineText}

{copy.en.skillsEyebrow}

{copy.en.ratchetLabel}

pnpm check:ui
# raw buttons
# swallowed catches
# pages without h1
# hardcoded colours
{copy.en.readChecker}

HUSKY / PRE-COMMIT

{copy.en.hookTitle}

pnpm exec lint-staged
node scripts/check-ui-contract.mjs
{copy.en.readHook}
{copy.en.commitLabel}

{copy.en.commitTitle}

pnpm exec commitlint --edit $1

feat: add interview timer
fix(api): scope session query
{copy.en.readCommit}
{copy.en.reviewLabel}

{copy.en.reviewTitle}

.pr-review.json
├── focus
├── exclude_paths
├── languages
└── instructions
{copy.en.readReview}
{copy.en.copyLabel}

{copy.en.copyTitle}

{copy.en.copyText}

{copy.en.deeperLabel} {copy.en.deeperTitle}