feat(15d): complete localization of full-guide page to PT

This commit is contained in:
Marcos Paulo
2026-09-05 22:30:50 +00:00
parent c022a93302
commit 054393f7af
38 changed files with 1322 additions and 325 deletions
+2 -1
View File
@@ -49,4 +49,5 @@ likely to fail; verify before shipping.
## Bilingual content
`<html lang>` must change with the language toggle, not just the text. Screen
readers pick pronunciation from it. This already works today — do not regress it.
readers pick pronunciation from it. This already works today — do not regress
it.
+8 -4
View File
@@ -20,12 +20,16 @@ Several current stylesheets already honour it. Every new animation must:
```css
@media (prefers-reduced-motion: reduce) {
* { animation-duration: .01ms !important; animation-iteration-count: 1 !important;
transition-duration: .01ms !important; scroll-behavior: auto !important; }
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
```
Reduced motion means *reduced*, not *broken*: the end state must still be
Reduced motion means _reduced_, not _broken_: the end state must still be
correct and the interface still usable. Test it — in DevTools, Rendering →
Emulate `prefers-reduced-motion`.
@@ -35,7 +39,7 @@ Emulate `prefers-reduced-motion`.
Animating `width`, `height`, `top`, `left`, or `margin` forces layout on every
frame and will show up as a failed INP.
- `will-change` only on an element about to animate, removed after. Leaving it
on permanently costs memory and can *hurt* performance.
on permanently costs memory and can _hurt_ performance.
- Prefer CSS transitions. Reach for the Web Animations API only for sequencing
that CSS cannot express. Do not add an animation library — it is a runtime
dependency on a site whose thesis is having none.
+14 -11
View File
@@ -15,12 +15,12 @@ this site's ten pages ship no JS today and must continue to.
Only these need interactivity. Anything else claiming island status is wrong:
| Island | Why | Directive |
| --- | --- | --- |
| Guide phase/tab switchers | click-driven panel swap | `client:visible` |
| Review desk catalog + file viewer | search, filter, fetch source files | `client:load` |
| Vote widget | talks to `vote-service/` | `client:visible` |
| Language toggle | swaps EN/PT across the page | `client:idle` |
| Island | Why | Directive |
| --------------------------------- | ---------------------------------- | ---------------- |
| Guide phase/tab switchers | click-driven panel swap | `client:visible` |
| Review desk catalog + file viewer | search, filter, fetch source files | `client:load` |
| Vote widget | talks to `vote-service/` | `client:visible` |
| Language toggle | swaps EN/PT across the page | `client:idle` |
## Structure
@@ -31,8 +31,11 @@ Only these need interactivity. Anything else claiming island status is wrong:
// 3. destructure Astro.props
// 4. derived values — no side effects, no fetch in components
---
<!-- markup -->
<style>/* component-scoped */</style>
<style>
/* component-scoped */
</style>
```
- Typed props always: `interface Props { … }`, then `const { … } = Astro.props`.
@@ -60,13 +63,13 @@ almost one-to-one — do that rather than importing a 27 KB JS file.
The site is served from `/ai-for-dummies/`. Set `base` in `astro.config.mjs` and
never hand-write an absolute internal path. Use `import.meta.env.BASE_URL`.
Existing routes are load-bearing and must not change, including trailing
slashes and the review desk's query params.
Existing routes are load-bearing and must not change, including trailing slashes
and the review desk's query params.
## Never
- No UI framework (React/Vue/Svelte) unless a task brief explicitly calls for it.
Astro components plus a little vanilla JS cover everything here.
- No UI framework (React/Vue/Svelte) unless a task brief explicitly calls for
it. Astro components plus a little vanilla JS cover everything here.
- No CSS framework. This site has a hand-built visual identity — see
[`theming.md`](theming.md).
- No external runtime requests. Self-host. `audit-ui.mjs` enforces it.
+3 -3
View File
@@ -3,7 +3,7 @@
## Match what is there
This codebase has a real voice: dense one-liner CSS, terse ES modules, comments
that explain *why* and never *what*. Do not reformat it into someone else's
that explain _why_ and never _what_. Do not reformat it into someone else's
house style as a side effect of a task.
The one exception is CSS minification-by-hand — `styles.css` is single-line and
@@ -44,5 +44,5 @@ overrides, and the temptation during migration will be to port it wholesale
## Commits
Present tense, lowercase, `type: subject`, matching the existing log
(`feat:`, `fix:`, `docs:`). The body explains why, and states what you did not do.
Present tense, lowercase, `type: subject`, matching the existing log (`feat:`,
`fix:`, `docs:`). The body explains why, and states what you did not do.
+2 -1
View File
@@ -3,7 +3,8 @@
## When to make a component
Extract when the same markup appears **three times**, or when a block has a name
a person would use out loud ("the eyebrow", "the route card", "the phase panel").
a person would use out loud ("the eyebrow", "the route card", "the phase
panel").
Do not extract on the second occurrence. Two similar blocks often diverge; the
premature abstraction costs more than the duplication.
+2 -2
View File
@@ -55,5 +55,5 @@ hand-rolled client-side renderer. That deletes code and improves fidelity.
Careful: `skill-reviews/improved/**/SKILL.md` is **generated** from those
entries by `scripts/build-skill-review.mjs`, and the generated files are
committed. Keep that generator working, or replace it and update every
reference to it.
committed. Keep that generator working, or replace it and update every reference
to it.