Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions .changesets/2026-09-05-lantai-360px-dapat-gerbang.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
bump: patch
tipe: perbaikan
dampak: internal
---

# Lantai dukungan 360px akhirnya punya angka yang jujur dan gerbang yang menjaganya

`.grid-cards` menulis `grid-template-columns: repeat(auto-fill, minmax(320px, 1fr))`.
Di lantai dukungan 360px yang didokumentasikan repo ini, `.container` (padding
`0 1.25rem` — 20px tiap sisi) menyisakan ruang bersih PERSIS 320px — sebuah track
selebar 320px di ruang 320px pas TANPA sisa sama sekali. `box-sizing: border-box`
menyelamatkannya hari ini, tapi pembulatan sub-piksel atau border/outline/shadow
yang kelak ditambahkan ke `.card` akan mendorong gulir mendatar persis di lebar
yang dijanjikan repo ini untuk didukung, dan tidak ada satu gerbang pun yang akan
memerah karenanya. `.sorotan` di `src/components/views/Home.astro` — sebuah blok
`<style>` komponen, bukan `global.css` — punya cacat yang identik lewat
`minmax(20rem, 1fr)` (20rem = 320px); draf pertama gerbangnya sendiri hanya
membaca `global.css` dan tetap hijau di atasnya, jadi cakupan berkasnya
diperbaiki dulu sebelum PR ini boleh dianggap selesai.

- `src/styles/global.css`: `.grid-cards` kini memakai
`minmax(min(320px, 100%), 1fr)` — identik hasilnya di setiap lebar di atas
320px, tapi tidak bisa lagi dipaksa overflow oleh track-nya sendiri.
- `src/components/views/Home.astro`: `.sorotan` kini memakai
`minmax(min(20rem, 100%), 1fr)` — unit rem dipertahankan, bukan dikonversi
ke px, karena itulah yang berkas ini pakai di tempat lain.
- `AGENTS.md`, `AGENTS.id.md`, `docs/awcms-astro/ui-ux-design-system.md`, dan
`.id.md`-nya menulis "kartu 328px … skala 0.41" — aritmetika untuk padding
1rem yang sudah lama tidak sama dengan padding 1.25rem yang sungguh berlaku
di `.container`. Angkanya kini 320px dan skala 0.40 (kesimpulannya tidak
berubah: 22px × 0,40 = 8,8px, tetap di bawah 9px dan praktis tidak terbaca).
- Aturan lantai 360px sebelumnya tidak punya satu pun pemeriksa. Kini ada:
`tests/lebar-360.test.mjs` membaca padding `.container` dan lantai 360px dari
`src/styles/global.css`, menurunkan lebar bersihnya dari CSS itu sendiri
(bukan menulis ulang "320" sebagai angka tetap), lalu menolak
`minmax(<N>px|rem, …)` atau `width`/`min-width` tetap lain yang mencapai atau
melebihi lebar itu tanpa jalan keluar `min(…, 100%)`, media query khusus
layar lebar, `overflow-x` pada dirinya sendiri, atau posisi absolut/fixed di
luar alur — **diperiksa di `src/styles/global.css` DAN di setiap blok
`<style>` setiap berkas `.astro` di bawah `src/`** (komponen, layout,
halaman), bukan hanya `global.css`, supaya kasus kedua di `Home.astro` tidak
bisa lolos lagi dengan nama lain. Juga menjaga angka kartu/skala di
`AGENTS.md` tetap sinkron dengan aritmetika CSS yang sebenarnya. Gerbang ini
statik atas teks CSS: ia tidak bisa membuktikan keamanan render sungguhan
(pembulatan sub-piksel, metrik font nyata, scrollbar sungguhan) — itu butuh
pemeriksaan headless-browser `document.documentElement.scrollWidth <= 360`
atas halaman yang sudah dibangun, terhadap `awcms` backend yang hidup.
- `AGENTS.md`/`.id.md` §Interface, item Definition of Done tentang 360px, dan
`.claude/skills/awcms-astro-gerbang/SKILL.md`/`.id.md` kini menyebut gerbang
baru ini dan cakupan berkasnya yang sebenarnya; hitungan `bun test` di
keenam dokumen yang dijaga `tests/documented-counts.test.mjs` naik dari 39
ke 40.
4 changes: 2 additions & 2 deletions .claude/skills/awcms-astro-gerbang/SKILL.id.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Sembilan gerbang awcms-astro (check, test, audit:konten, audit:doku

🇮🇩 Bahasa Indonesia · 🇬🇧 [English (source)](SKILL.md)

<!-- i18n-source-hash: sha256:d7fe6d7bca25ea634416acf53697ff1549c1c572c868a6a41816633ca2adf1bc -->
<!-- i18n-source-hash: sha256:ef43189338a892f2ecd559fd2de361cbc466924e6596bd29c76ace80e0dc8014 -->

# awcms-astro — gerbang

Expand All @@ -29,7 +29,7 @@ bun run audit:rilis # backlog changeset menunggu — tanpa build, tanpa j
| Gerbang | Kelas cacat |
| --- | --- |
| `check` | Tipe, props, impor putus, lockfile milik proyek lain |
| `bun test` | 39 berkas. Paritas katalog PO; kontrak `awcms` (traversal, media, kartu) dan **permukaan yang dipanggil build**; **PERAN repo** (`tests/peran-situs.test.mjs`, ADR-0034); **TANPA backend** (`tests/tanpa-backend.test.mjs`, ADR-0038 — dependency kelas backend, jalur tulis, artefak persistensi); **TANPA runtime Node.js** (`tests/runtime-bun.test.mjs`, ADR-0050 — scripts package.json, CI, Dockerfile, shebang, dengan bawaan `node:*` dan keputusan mempertahankan `@astrojs/node`/`compression` dinyatakan sengaja); **kosakata `news`** (`tests/kosakata-news.test.mjs`, ADR-0036); feed Atom (`tests/feed.test.mjs`, ADR-0035); dua tanggal terpisah (`tests/tanggal.test.mjs`, ADR-0033); header + cache penyaji; CSP atas keluaran; **versi toolchain** termasuk pin TypeScript (ADR-0037); SBOM; CWV lab; analisis statik; schema; seni lokal; renderer blok; rilis terkondisi; logika pemeriksa terjemahan (`tests/docs-i18n-checks.test.mjs`, ADR-0039); plus 6 meta-tes yang menjalankan ulang enam dari tujuh skrip audit atas repo ini DAN atas pohon fixture (`audit:translation` yang ketujuh; logikanya digerbangi `tests/docs-i18n-checks.test.mjs`). **Kedua hitungan di baris ini diperiksa terhadap repo oleh `tests/documented-counts.test.mjs`.** Keduanya berbunyi 21 dan tiga sampai 28 Agustus 2026, hanyut satu berkas demi satu berkas seiring gerbang bertambah — dan itulah sebabnya keduanya digerbangi, bukan sekadar dikoreksi |
| `bun test` | 40 berkas. Paritas katalog PO; kontrak `awcms` (traversal, media, kartu) dan **permukaan yang dipanggil build**; **PERAN repo** (`tests/peran-situs.test.mjs`, ADR-0034); **TANPA backend** (`tests/tanpa-backend.test.mjs`, ADR-0038 — dependency kelas backend, jalur tulis, artefak persistensi); **TANPA runtime Node.js** (`tests/runtime-bun.test.mjs`, ADR-0050 — scripts package.json, CI, Dockerfile, shebang, dengan bawaan `node:*` dan keputusan mempertahankan `@astrojs/node`/`compression` dinyatakan sengaja); **kosakata `news`** (`tests/kosakata-news.test.mjs`, ADR-0036); feed Atom (`tests/feed.test.mjs`, ADR-0035); dua tanggal terpisah (`tests/tanggal.test.mjs`, ADR-0033); header + cache penyaji; CSP atas keluaran; **versi toolchain** termasuk pin TypeScript (ADR-0037); SBOM; CWV lab; analisis statik; schema; seni lokal; renderer blok; rilis terkondisi; logika pemeriksa terjemahan (`tests/docs-i18n-checks.test.mjs`, ADR-0039); **lantai lebar 360px** (`tests/lebar-360.test.mjs` — padding `.container` sendiri menurunkan lebar bersih pada lantai itu, dan tidak ada `minmax(…)` angka tetap/rem atau `width`/`min-width` tetap — di `src/styles/global.css` MAUPUN di blok `<style>` mana pun dari berkas `.astro` mana pun di bawah `src/` — yang boleh mencapainya tanpa jalan keluar `min(…, 100%)`, media query khusus layar lebar, atau `overflow-x` pada dirinya sendiri; lahir dari `.grid-cards` yang duduk persis di lebar itu dengan sisa nol, dan tertangkap KEDUA KALINYA di `.sorotan` milik `Home.astro` justru setelah cakupan berkas gerbangnya sendiri diperluas melewati `global.css` saja — gerbang statik atas teks CSS, jadi tidak bisa membuktikan keamanan render sungguhan seperti pemeriksaan `scrollWidth` headless-browser atas halaman yang sudah dibangun); plus 6 meta-tes yang menjalankan ulang enam dari tujuh skrip audit atas repo ini DAN atas pohon fixture (`audit:translation` yang ketujuh; logikanya digerbangi `tests/docs-i18n-checks.test.mjs`). **Kedua hitungan di baris ini diperiksa terhadap repo oleh `tests/documented-counts.test.mjs`.** Keduanya berbunyi 21 dan tiga sampai 28 Agustus 2026, hanyut satu berkas demi satu berkas seiring gerbang bertambah — dan itulah sebabnya keduanya digerbangi, bukan sekadar dikoreksi |
| `audit:konten` | Rasio gambar terhadap `--ratio-visual`, format dibaca dari ISI berkas, judul/canonical/hreflang, aset yang dijanjikan metadata, tautan mati, sitemap, **setiap `.xml` di keluaran** (feed Atom sah, atau pelanggaran), nama key bocor ke layar |
| `audit:dokumen` | Tautan markdown mati, indeks ADR lengkap dua arah, status ADR setuju dengan berkasnya, daftar permukaan kilau, jalur berkas yang disebut dokumen, **kutipan `ADR-NNNN` yang resolve ke berkasnya** |
| `audit:translation` | Cermin basi (sebuah `.id.md` yang hash tercatatnya tidak lagi cocok dengan sumber Inggrisnya), cermin yatim yang sumbernya hilang, dokumen tanpa cermin yang tidak ada di buku besar yang hanya boleh menyusut, dan entri buku besar yang cerminnya kini ada (ADR-0039) |
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/awcms-astro-gerbang/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ bun run audit:rilis # the waiting release backlog — no build, no network
| Gate | Class of defect |
| --- | --- |
| `check` | Types, props, broken imports, a lockfile belonging to another project |
| `bun test` | 39 files. PO catalogue parity; the `awcms` contract (traversal, media, cards) and **the surfaces the build calls**; the repo's ROLE (`tests/peran-situs.test.mjs`, ADR-0034); **NO backend** (`tests/tanpa-backend.test.mjs`, ADR-0038 — backend-class dependencies, write paths, persistence artefacts); **NO Node.js runtime** (`tests/runtime-bun.test.mjs`, ADR-0050 — package.json scripts, CI, Dockerfile, shebangs, with `node:*` built-ins and the `@astrojs/node`/`compression` keeps named as deliberate); the **`news` vocabulary** (`tests/kosakata-news.test.mjs`, ADR-0036); the Atom feed (`tests/feed.test.mjs`, ADR-0035); two separate dates (`tests/tanggal.test.mjs`, ADR-0033); the server's headers + cache; CSP over the output; **toolchain versions** including the TypeScript pin (ADR-0037); SBOM; lab CWV; static analysis; schema; local art; the block renderer; the conditional release; the translation-check logic (`tests/docs-i18n-checks.test.mjs`, ADR-0039); plus 6 meta-tests that re-run six of the seven audit scripts over this repo AND over a fixture tree (`audit:translation` is the seventh; its logic is gated by `tests/docs-i18n-checks.test.mjs` instead). **The two counts in this row are checked against the repo by `tests/documented-counts.test.mjs`.** They read 21 and three until 28 August 2026, drifting one file at a time as gates were added — which is why they are gated rather than merely corrected |
| `bun test` | 40 files. PO catalogue parity; the `awcms` contract (traversal, media, cards) and **the surfaces the build calls**; the repo's ROLE (`tests/peran-situs.test.mjs`, ADR-0034); **NO backend** (`tests/tanpa-backend.test.mjs`, ADR-0038 — backend-class dependencies, write paths, persistence artefacts); **NO Node.js runtime** (`tests/runtime-bun.test.mjs`, ADR-0050 — package.json scripts, CI, Dockerfile, shebangs, with `node:*` built-ins and the `@astrojs/node`/`compression` keeps named as deliberate); the **`news` vocabulary** (`tests/kosakata-news.test.mjs`, ADR-0036); the Atom feed (`tests/feed.test.mjs`, ADR-0035); two separate dates (`tests/tanggal.test.mjs`, ADR-0033); the server's headers + cache; CSP over the output; **toolchain versions** including the TypeScript pin (ADR-0037); SBOM; lab CWV; static analysis; schema; local art; the block renderer; the conditional release; the translation-check logic (`tests/docs-i18n-checks.test.mjs`, ADR-0039); **the 360px layout floor** (`tests/lebar-360.test.mjs` — `.container`'s own padding derives the inner width at that floor, and no fixed-px/rem `minmax(…)` or fixed `width`/`min-width` — in `src/styles/global.css` OR in any `<style>` block of any `.astro` file under `src/` — may reach it without a `min(…, 100%)` escape, a desktop-only media query, or its own `overflow-x`; born from `.grid-cards` sitting at that exact width with zero margin, and caught a SECOND time in `Home.astro`'s `.sorotan` only once the checker's own file scope grew past `global.css` alone — a static gate over CSS text, so it cannot prove real rendering safety the way a headless-browser `scrollWidth` check on a built page would); plus 6 meta-tests that re-run six of the seven audit scripts over this repo AND over a fixture tree (`audit:translation` is the seventh; its logic is gated by `tests/docs-i18n-checks.test.mjs` instead). **The two counts in this row are checked against the repo by `tests/documented-counts.test.mjs`.** They read 21 and three until 28 August 2026, drifting one file at a time as gates were added — which is why they are gated rather than merely corrected |
| `audit:konten` | Image ratios against `--ratio-visual`, format read from the file CONTENTS, title/canonical/hreflang, assets promised by metadata, dead links, the sitemap, **every `.xml` in the output** (a valid Atom feed, or a violation), key names leaking to the screen |
| `audit:dokumen` | Dead markdown links, the ADR index complete in both directions, an ADR's status agreeing with its file, the polish-surface list, file paths named by a document, **`ADR-NNNN` citations that resolve to their file** |
| `audit:translation` | A stale mirror (an `.id.md` whose recorded hash no longer matches its English source), an orphan mirror whose source is gone, a document with no mirror that is not on the shrink-only ledger, and a ledger entry whose mirror now exists (ADR-0039) |
Expand Down
29 changes: 25 additions & 4 deletions AGENTS.id.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
🇮🇩 Bahasa Indonesia · 🇬🇧 [English (source)](AGENTS.md)

<!-- i18n-source-hash: sha256:9079b0964aa2afbb4e410fcf96c5edf45f06893bfa5e17a0c7eac4e4034a71c7 -->
<!-- i18n-source-hash: sha256:215c437bb7248a5b0933aec516cd7419a7769e0c05d136d36a5eadb8ebbc6827 -->

# AGENTS.md — kontrak kerja `awcms-astro`

Expand Down Expand Up @@ -499,7 +499,23 @@ yang [ADR-0034](docs/adr/0034-publik-secara-bawaan-admin-hanya-bila-dinyatakan.m
— aturan `*` global hanya memangkas durasi, dan animasi 0,01 md tetap
berkedip. Umpan balik hover juga aktif pada `:focus-visible`, sehingga
pengguna keyboard tidak mendapat versi yang lebih miskin.
- **Mobile-first dari 360px.**
- **Mobile-first dari 360px.** Padding `.container` sendiri menyisakan lebar
bersih persis 320px pada lantai itu — sebuah track grid yang dipatok ke angka
yang sama punya sisa nol, dan itu yang dilakukan `.grid-cards` sampai
ditemukan dan dibungkus `min(320px, 100%)`; `.sorotan` di `Home.astro`
(`minmax(20rem, 1fr)`, blok `<style>` komponen) punya cacat yang identik,
ditemukan hanya setelah cakupan berkas gerbangnya sendiri diperbaiki. Aturan
ini kini punya pemeriksanya: `tests/lebar-360.test.mjs` membaca lantai 360px
dan padding `.container`, menurunkan lebar bersih itu dari CSS-nya sendiri,
dan menolak `minmax(…)` angka tetap/rem lain atau `width`/`min-width` tetap —
di `src/styles/global.css` DAN di setiap blok `<style>` setiap berkas
`.astro` di bawah `src/` (komponen, layout, halaman) — yang mencapai atau
melebihinya tanpa jalan keluar `min(…, 100%)`, media query khusus layar
lebar, atau `overflow-x` pada dirinya sendiri. Ia gerbang statik atas TEKS
CSS: tidak bisa membuktikan keamanan render sungguhan — pembulatan
sub-piksel, metrik font nyata, dan scrollbar sungguhan butuh browser, yaitu
mengasersikan `document.documentElement.scrollWidth <= 360` pada halaman
kunci setelah build, terhadap `awcms` backend yang hidup.
- **String antarmuka lewat katalog PO**, tidak pernah ditulis langsung di
komponen. Ini berlaku juga bagi label yang datang dari konfigurasi: navigasi
utama pernah merender nilai HURUF BESAR dari `src/config/site.ts`, sehingga
Expand Down Expand Up @@ -607,7 +623,7 @@ merender `.visual-placeholder`, dan itu jujur.
ilustrasi.** Situs dari template ini adalah portal independen, dan lambang
negara di halamannya membantah pernyataan itu dalam satu pandangan.
- **Teks terkecil di dalam SVG minimal 22px pada kanvas 800px.** Pada kartu
selebar 328px — viewport 360px — kanvas 800px tampil pada skala 0,41, jadi di
selebar 320px — viewport 360px — kanvas 800px tampil pada skala 0,40, jadi di
bawah ambang itu teksnya tampil di bawah 9px dan praktis tidak terbaca.
- **`src: undefined` adalah keadaan yang didukung.** Pemanggil merender
`.visual-placeholder`. Ilustrasi yang hilang tidak boleh menjadi halaman yang
Expand Down Expand Up @@ -803,7 +819,12 @@ performa:
dengan tipe kontraknya menemukan seluruhnya dalam satu kali typecheck.
- [ ] Locale default dan locale berprefiks menghasilkan jumlah halaman yang sama.
- [ ] Gambar baru berasio `--ratio-visual`, ekstensinya sesuai isi berkas, tanpa
lambang instansi maupun data tiruan, dan teksnya terbaca pada lebar 360px.
lambang instansi maupun data tiruan, dan teksnya terbaca pada lebar
360px — `bun run audit:konten` memeriksa yang terakhir terhadap ambang
22px pada kanvas 800px; aritmetika lebar kartu asal ambang itu (320px,
skala 0,40) diperiksa terpisah oleh `tests/lebar-360.test.mjs`, yang
membaca CSS `.container` sendiri alih-alih mempercayai angka yang
ditulis di prosa.
- [ ] Perubahan pada penyajian — header, CSP, `Cache-Control`, kompresi, port —
dibuktikan `tests/penyaji.test.mjs`, bukan diperiksa dengan mata. **Sebuah
`Vary` termasuk di dalamnya**: `Cookie` dan `Accept-Language` ditolak
Expand Down
Loading