diff --git a/CHANGELOG.md b/CHANGELOG.md index 11fb1c7..2383c6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Formatnya mengikuti prinsip [Keep a Changelog](https://keepachangelog.com/) dan ### Changed +- Mobile Phase 4 menghapus persistent bottom dock dan `mobile.js`, menjadikan setup small-screen task-first dengan sticky 4-step rail, target sentuh minimal 44px, header lebih fokus, serta regression 390px/320px; responsive homepage CSS juga dikunci agar kurung stylesheet seimbang. - Setup desktop dirombak menjadi workspace 4 langkah yang lebih padat: sticky step navigation, pack summary ringkas, action hierarchy lebih jelas, dan course pack sebagai accordion rows; browser regression mengunci desktop state sekaligus mobile no-overflow. - Homepage Phase 2 mengganti fake ChatGPT phone mockup dengan live Ramu pack preview, menambahkan jalur Pack vs Ramu Starter, memadatkan workflow/layer hierarchy, dan mengubah course catalog menjadi resource list yang lebih tenang di desktop maupun mobile. - Browser regression sekarang memiliki mobile viewport contract untuk homepage/setup, termasuk no-horizontal-overflow dan visibility pada primary content. diff --git a/scripts/validate_site.py b/scripts/validate_site.py index ad4e89d..ceb8456 100644 --- a/scripts/validate_site.py +++ b/scripts/validate_site.py @@ -40,6 +40,7 @@ def main() -> int: 'data-setup-link', 'href="catalog.css"', 'href="homepage.css"', + '
', 'id="hero-preview-courses"', 'href="https://github.com/man612/ramu/blob/main/starter/README.md"', 'id="course-list"', @@ -58,6 +59,9 @@ def main() -> int: 'data-pack-picker-menu', 'href="catalog.css"', 'href="setup-phase3.css"', + '', + 'aria-label="Langkah 1: Cek Memory"', + 'id="progress-title" aria-live="polite"', 'id="setup-pack-name"', 'id="setup-courses"', 'id="copy-instructions"', @@ -100,6 +104,13 @@ def main() -> int: ".setup-course summary", "@media (max-width: 720px)", ]) + require_text(SITE / "mobile.css", [ + ".setup-page .site-header nav", + ".setup-nav a span", + "grid-template-columns: repeat(4, minmax(0, 1fr))", + "min-height: 44px", + "@media (max-width: 430px)", + ]) app_text = (SITE / "app.js").read_text(encoding="utf-8") if (SITE / "app.js").is_file() else "" for forbidden in ( @@ -121,6 +132,22 @@ def main() -> int: for path_name, text in (("site/index.html", index_text), ("site/setup.html", setup_text)): if "