diff --git a/CHANGELOG.md b/CHANGELOG.md index e9f67dd..14b747c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Formatnya mengikuti prinsip [Keep a Changelog](https://keepachangelog.com/) dan ### Added +- Social preview 1280×640 dengan identitas quiet editorial Ramu, dipakai ulang oleh Open Graph/Twitter metadata website. - English entry surfaces through `README.en.md` and `CONTRIBUTING.en.md`, while Bahasa Indonesia remains the canonical project documentation. - **UT S1 Akuntansi Semester 1 2026/2027** sebagai maintained pack 18 SKS, termasuk slot Pendidikan Agama yang mengikuti pilihan resmi sesuai data pribadi/registrasi UT. - Dukungan manifest untuk `selection.mode: choose-one` agar satu slot kurikulum dapat memiliki beberapa kode mata kuliah resmi tanpa membuat kode akademik palsu atau menggandakan seluruh pack. diff --git a/docs/UX-DIRECTION.md b/docs/UX-DIRECTION.md index 5b74794..9c6010d 100644 --- a/docs/UX-DIRECTION.md +++ b/docs/UX-DIRECTION.md @@ -390,6 +390,12 @@ Remove from the redesign: `prefers-reduced-motion: reduce` remains mandatory, but the normal experience should already be calm enough that accessibility is not achieved merely by disabling an otherwise over-animated interface. +## Appearance decision + +Ramu intentionally ships one polished light appearance for this redesign. Dark mode is not added in Phase 6 because there is no product requirement yet that justifies maintaining a second complete token/state surface. Revisit it only when usage evidence or accessibility needs make the extra maintenance worthwhile. + +The social preview follows the same quiet editorial identity: warm ivory canvas, graphite type, muted sage accent, real product information, no gradients/glow/fake metrics. + ## Accessibility contract Implementation must preserve or improve: diff --git a/scripts/validate_site.py b/scripts/validate_site.py index 81a43c2..08bd0e9 100644 --- a/scripts/validate_site.py +++ b/scripts/validate_site.py @@ -4,6 +4,7 @@ from __future__ import annotations import re +import struct import sys from pathlib import Path @@ -62,7 +63,11 @@ def main() -> int: 'property="og:url" content="https://man612.github.io/ramu/"', 'property="og:site_name" content="Ramu"', 'property="og:locale" content="id_ID"', - 'name="twitter:card" content="summary"', + 'property="og:image" content="https://man612.github.io/ramu/social-preview.png"', + 'property="og:image:width" content="1280"', + 'property="og:image:height" content="640"', + 'name="twitter:card" content="summary_large_image"', + 'name="twitter:image" content="https://man612.github.io/ramu/social-preview.png"', 'href="https://github.com/man612/ramu/blob/main/README.en.md"', 'href="https://github.com/man612/ramu/blob/main/SUPPORT.md"', ]) @@ -88,7 +93,11 @@ def main() -> int: 'href="https://github.com/man612/ramu/blob/main/README.en.md"', 'property="og:site_name" content="Ramu"', 'property="og:locale" content="id_ID"', - 'name="twitter:card" content="summary"', + 'property="og:image" content="https://man612.github.io/ramu/social-preview.png"', + 'property="og:image:width" content="1280"', + 'property="og:image:height" content="640"', + 'name="twitter:card" content="summary_large_image"', + 'name="twitter:image" content="https://man612.github.io/ramu/social-preview.png"', 'Setup Ramu | siapkan ChatGPT Project untuk mata kuliah', ]) require_text(SITE / "app.js", [ @@ -125,6 +134,20 @@ def main() -> int: "@media (max-width: 430px)", ]) + preview = SITE / "social-preview.png" + if not preview.is_file(): + fail("Social preview asset tidak ditemukan.") + else: + data = preview.read_bytes() + if len(data) >= 24 and data[:8] == b"\x89PNG\r\n\x1a\n": + width, height = struct.unpack(">II", data[16:24]) + if (width, height) != (1280, 640): + fail(f"Social preview harus 1280x640, sekarang {width}x{height}.") + else: + fail("Social preview harus PNG valid.") + if len(data) >= 1_000_000: + fail(f"Social preview harus <1 MB, sekarang {len(data)} byte.") + foundations_text = (SITE / "foundations.css").read_text(encoding="utf-8") if (SITE / "foundations.css").is_file() else "" motion_text = (SITE / "motion.css").read_text(encoding="utf-8") if (SITE / "motion.css").is_file() else "" tokens = dict(re.findall(r"--([a-z0-9-]+):\s*(#[0-9a-fA-F]{6})\s*;", foundations_text)) diff --git a/site/index.html b/site/index.html index 3f752c4..d43e997 100644 --- a/site/index.html +++ b/site/index.html @@ -11,7 +11,12 @@ - + + + + + + Ramu — workspace belajar terstruktur untuk ChatGPT Projects diff --git a/site/setup.html b/site/setup.html index 71b683d..df64117 100644 --- a/site/setup.html +++ b/site/setup.html @@ -11,7 +11,12 @@ - + + + + + + Setup Ramu | siapkan ChatGPT Project untuk mata kuliah diff --git a/site/social-preview.png b/site/social-preview.png new file mode 100644 index 0000000..74fe599 Binary files /dev/null and b/site/social-preview.png differ