Skip to content

fix(css): lantai dukungan 360px dapat angka jujur dan gerbang pemeriksa - #111

Merged
ahliweb merged 3 commits into
mainfrom
fix/lebar-360-gerbang
Sep 5, 2026
Merged

fix(css): lantai dukungan 360px dapat angka jujur dan gerbang pemeriksa#111
ahliweb merged 3 commits into
mainfrom
fix/lebar-360-gerbang

Conversation

@ahliweb

@ahliweb ahliweb commented Sep 5, 2026

Copy link
Copy Markdown
Owner

Ringkasan

Audit menemukan dua cacat nyata di sekitar komitmen "mobile-first dari 360px" yang didokumentasikan repo ini, plus fakta bahwa komitmen itu tidak punya satu pun pemeriksa otomatis. Ketiganya diperbaiki sebagai satu keping atomik — dan review menemukan bahwa cacat inti punya dua instans, bukan satu, karena draf pertama gerbangnya sendiri hanya membaca src/styles/global.css.

Cacat 1 — risiko overflow tanpa sisa di lantai dukungan (DUA tempat)

.container (src/styles/global.css) memasang padding: 0 1.25rem — 20px tiap sisi, 40px total. Pada lantai dukungan 360px yang didokumentasikan, ruang bersihnya karena itu PERSIS 320px. DUA tempat menulis track grid tepat di angka itu, di dalam <main class="container"> (BaseLayout.astro):

/* src/styles/global.css — .grid-cards */
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));

/* src/components/views/Home.astro — .sorotan, di dalam <style> */
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));

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/.sorotan akan mendorong gulir mendatar persis di lebar yang dijanjikan repo ini untuk didukung — dan tidak ada satu gerbang pun yang akan memerah karenanya.

Perbaikan: minmax(min(320px, 100%), 1fr) dan minmax(min(20rem, 100%), 1fr) (unit rem dipertahankan di Home.astro karena itulah yang dipakai berkas itu) — identik hasilnya di setiap lebar ≥320px, hanya tidak lagi bisa dipaksa overflow oleh track-nya sendiri. Diverifikasi tidak ada minmax(<N>px|rem, …) atau min-width tetap lain di src/styles/global.css ATAU di blok <style> mana pun di bawah src/ yang duduk di margin sama atau lebih buruk (SitemapView.astro 280px, Home.astro 11rem/15rem — semua nyaman di bawah 320px, tidak disentuh).

Cacat 2 — aritmetika dokumentasi tidak cocok dengan CSS

AGENTS.md dan docs/awcms-astro/ui-ux-design-system.md (plus cermin .id.md) menulis "kartu 328px — viewport 360px — kanvas 800px tampil pada skala 0.41". 328px mengasumsikan padding 1rem; padding .container yang sungguh berlaku adalah 1.25rem, jadi lebar kartu sungguhan adalah 320px dan skalanya 0.40 (320/800). Kesimpulannya tidak berubah (22px × 0,40 = 8,8px, tetap di bawah 9px dan praktis tidak terbaca) — hanya kedua angka yang salah. Diperbaiki di keempat berkas.

Cacat 3 — aturan tanpa pemeriksa (dan pemeriksanya sendiri hampir punya lubang yang sama)

tests/lebar-360.test.mjs (baru) membaca lantai 360px dan padding sisi .container dari CSS-nya sendiri (bukan menulis ulang "320" sebagai angka tetap), lalu menolak — di src/styles/global.css DAN di setiap blok <style> dari setiap .astro di bawah src/ (komponen, layout, halaman), bukan hanya global.css:

  • minmax(<N>px|rem, …) yang mencapai atau melebihi lebar bersih tanpa dibungkus min(…, 100%);
  • width/min-width tetap yang lebih lebar dari itu, kecuali menu/dropdown/target sentuh, media query khusus layar lebar, aturan position: absolute/fixed yang dikeluarkan dari alur normal, atau punya overflow-x pada dirinya sendiri;
  • angka kartu/skala di AGENTS.md yang tidak lagi sinkron dengan aritmetika CSS yang sebenarnya.

Draf pertama gerbang ini hanya membaca global.css dan tetap HIJAU di atas .sorotan — persis bentuk kegagalan paling dihindari repo ini: gerbang yang mengubah "tidak diperiksa" menjadi "diperiksa dan aman" padahal cacatnya masih ada di berkas lain. Cakupannya diperbaiki sebelum PR ini dianggap selesai. Dasar rem→px (1rem = 16px) dikonfirmasi lewat grep atas seluruh html/:root di repo ini, bukan diasumsikan.

Gerbang ini STATIK atas teks CSS — dinyatakan terus terang di docblock-nya: ia tidak bisa membuktikan keamanan render sungguhan (pembulatan sub-piksel, metrik font nyata, scrollbar sungguhan, clipping ancestor sungguhan), yang butuh pemeriksaan headless-browser document.documentElement.scrollWidth <= 360 atas halaman yang sudah dibangun, terhadap awcms backend yang hidup.

Terbukti gigit EMPAT kali (dua regresi × dua cakupan): minmax(320px, 1fr) disuntik ke .grid-cards di global.css, lalu ke <style> FaqAccordion.astro; min-width: 400px disuntik ke .card di global.css, lalu ke <style> Breadcrumb.astro. Semuanya membuat gerbang merah dengan pesan yang menyebut berkas dan baris yang tepat, lalu dipulihkan.

AGENTS.md/.id.md §Antarmuka, 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 (bukan lagi "global.css saja"); hitungan bun test di keenam dokumen yang dijaga tests/documented-counts.test.mjs naik dari 39 ke 40.

Verifikasi

  • bun test — 782 pass / 12 skip / 0 fail (40 berkas, naik dari 39)
  • bun test tests/lebar-360.test.mjs — 5 pass / 0 fail
  • bun run check — 0 errors, 0 warnings baru (5 hints pra-eksisting, tidak terkait)
  • bun run audit:dokumen — tidak ada pelanggaran
  • bun run audit:translation — OK, 64 mirror current
  • bun run audit:graf — tidak ada pelanggaran
  • bun run audit:rilis — tidak ada pelanggaran (1 changeset menunggu, 0 hari)
  • bun run check:lockfile — sinkron

Test plan

  • bun test hijau (782 pass, 0 fail)
  • tests/lebar-360.test.mjs terbukti merah pada EMPAT suntikan regresi (bare minmax(320px,1fr) dan min-width:400px, masing-masing di global.css dan di sebuah blok <style> komponen), lalu hijau lagi setelah dipulihkan
  • Semua gerbang yang diminta dijalankan dan hijau

🤖 Generated with Claude Code

ahliweb and others added 3 commits September 5, 2026 19:50
`.grid-cards` menulis `minmax(320px, 1fr)`, dan pada lantai dukungan 360px
`.container` menyisakan ruang bersih PERSIS 320px — track selebar 320px di
ruang 320px pas TANPA sisa sama sekali. box-sizing: border-box
menyelamatkannya hari ini, tapi pembulatan sub-piksel atau border yang
kelak ditambahkan ke .card akan mendorong gulir mendatar persis di lebar
yang dijanjikan repo ini untuk didukung, tanpa satu gerbang pun memerah.

- src/styles/global.css: .grid-cards kini minmax(min(320px, 100%), 1fr) —
  identik di setiap lebar >=320px, tidak lagi bisa dipaksa overflow.
- AGENTS.md, AGENTS.id.md, ui-ux-design-system.md(.id.md): "kartu 328px,
  skala 0.41" adalah aritmetika untuk padding 1rem yang sudah lama tidak
  sama dengan padding 1.25rem .container yang sungguh berlaku. Diperbaiki
  ke 320px/skala 0.40; kesimpulan (di bawah 9px, tak terbaca) tidak berubah.
- tests/lebar-360.test.mjs (baru): membaca padding .container dan lantai
  360px dari CSS-nya sendiri, menolak minmax/width/min-width tetap lain
  yang mencapai lebar bersih tanpa jalan keluar, dan menjaga angka
  kartu/skala di AGENTS.md tetap sinkron dengan aritmetika CSS. Gerbang
  statik atas teks CSS — batasnya dinyatakan di docblock-nya sendiri.
- AGENTS.md/.id.md dan SKILL gerbang menyebut gerbang baru ini; hitungan
  bun test di keenam dokumen naik dari 39 ke 40 (tests/documented-counts).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…uma global.css

Cacat yang sama persis yang membuat gerbang ini ditulis ternyata punya
DUA instans, bukan satu: `.sorotan` di `src/components/views/Home.astro`
menulis `minmax(20rem, 1fr)` — 20rem = 320px, sama seperti `.grid-cards`
yang sudah diperbaiki, di dalam `<main class="container">` yang sama.
Draf pertama tests/lebar-360.test.mjs hanya membaca
`src/styles/global.css` dan tetap hijau di atas kasus ini — gerbang yang
mengubah "tidak diperiksa" menjadi "diperiksa dan aman" padahal cacatnya
masih ada, persis kelas kegagalan yang paling dihindari repo ini.

- src/components/views/Home.astro: .sorotan kini
  minmax(min(20rem, 100%), 1fr) — unit rem dipertahankan.
- tests/lebar-360.test.mjs: kini menyusuri setiap blok <style> di setiap
  .astro di bawah src/ (komponen, layout, halaman), bukan cuma
  global.css. Dasar rem=16px dikonfirmasi lewat grep atas seluruh
  html/:root di repo ini, bukan diasumsikan. Menambah pengecualian untuk
  aturan yang dikeluarkan dari alur normal (position: absolute/fixed,
  contoh nyata: .hero-banner-grid::after) dan untuk komentar CSS yang
  mengutip pola lama sebagai contoh (tanpanya, komentar penjelas di atas
  .sorotan sendiri jadi false positive).
- Terbukti gigit: minmax(320px,1fr) dan min-width:400px yang disuntik ke
  blok <style> komponen (FaqAccordion.astro, Breadcrumb.astro) membuat
  gerbang merah dan menyebut berkas yang benar; keduanya dipulihkan.
- AGENTS.md/.id.md, SKILL gerbang, ui-ux-design-system.md/.id.md, dan
  changeset diperbarui supaya tidak lagi menyebut cakupan gerbang sebagai
  "global.css saja".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Uji independen menyuntik `.zz { min-width: 500px; }` sebagai SATU baris
ke dalam blok <style> komponen, dan gerbang tetap 5 pass/0 fail — tidak
menggigit. Sebabnya: pemindaian width/min-width dijangkarkan ke
`^[ \t]*`, yang hanya cocok kalau deklarasinya membuka barisnya sendiri.
Format satu-baris itu CSS yang sah dan lazim di blok <style> ringkas,
jadi gerbangnya bisa dielakkan lewat format saja — kelasnya belum
benar-benar tertutup.

- tests/lebar-360.test.mjs: regex diganti ke lookbehind `(?<=[{;])` —
  syarat struktural deklarasi CSS yang sah bukan "di awal baris",
  melainkan "didahului { atau ;", benar di format satu-baris maupun
  multi-baris. Lookbehind (bukan `[{;]` yang mengonsumsi) dipilih supaya
  dua deklarasi di satu baris yang sama tidak saling menghabiskan
  pembatasnya. `posProperti` dihitung ulang dari posisi `m[1]` di dalam
  `m[0]` supaya nomor baris dan pemeriksaan zona (komentar, media
  desktop) tetap menunjuk ke deklarasinya sendiri, bukan ke karakter
  sebelum properti yang ditinggalkan lookbehind yang zero-width.
- Diverifikasi dua alasan independen kenapa `@media (min-width: 640px)`
  tetap tidak tertangkap: karakter sebelum "min-width" adalah `(` (bukan
  `{`/`;`), dan yang mengikuti angkanya adalah `)` (bukan `;`).
- Terbukti gigit: format satu-baris tanpa jalan keluar (baru), format
  multi-baris lama, dan padding/minmax yang sudah diverifikasi
  sebelumnya. Format satu-baris DENGAN overflow-x: auto tetap lolos.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ahliweb
ahliweb merged commit 0201964 into main Sep 5, 2026
5 checks passed
@ahliweb
ahliweb deleted the fix/lebar-360-gerbang branch September 5, 2026 13:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant