From 9f1aa89de0cf2c6653b789afd7534a761b08010b Mon Sep 17 00:00:00 2001 From: Yutaka Kondo Date: Mon, 27 Apr 2026 12:47:29 -0700 Subject: [PATCH 1/4] =?UTF-8?q?docs(og):=20add=201920=C3=971080=20cover=20?= =?UTF-8?q?art=20set=20+=20wire=20og-01=20as=20og:image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add seven OG / YouTube-thumbnail compositions under `docs/img/og/`, all rendered from a single gallery page (`docs/og.html`) so they share the landing page's design system (Fraunces × Spectral × JetBrains Mono · paper / ink / vermilion / mora-orange / mora-teal · halftone, washi, phoneme bars, chop seal): - og-01 — Overture (paper editorial cover, AppIcon chop, yokai stack) - og-02 — Substitution slab (dark phoneme math: b←v, r←l, s←th) - og-03 — The Numbers (5 / 100+ / 25.84 / 0) - og-04 — Pull quote ("I built Mora for one kid I love." + AppIcon chop) - og-05 — Yokai triumvirate (three mentor cards on washi) - og-06 — Terminal (dev/code aesthetic with live phoneme posterior) - og-01-dyslexic — same as og-01 but the "Mora." wordmark is set in OpenDyslexic, the dyslexia-friendly typeface this product is built for Wire og-01.png into the landing page's `og:image` / `twitter:image` (with width/height/alt) and surface it as a hero image at the top of the README. The chop-seal mark on og-01 / og-04 is the actual `Mora/Assets.xcassets/AppIcon.appiconset/AppIcon.png`, not arbitrary kanji. Ship a `tools/og/render-og.sh` headless-Chrome renderer. It works around a headless quirk where Chrome reserves ~90px of phantom browser chrome at the bottom of every screenshot — render at 1920×1170 and crop the top 1920×1080 via Pillow so the rendered PNGs end exactly at their natural board background instead of leaking the body bg. Co-Authored-By: Claude --- README.md | 2 + docs/img/AppIcon.png | Bin 0 -> 612357 bytes docs/img/og/og-01-dyslexic.png | Bin 0 -> 1307304 bytes docs/img/og/og-01.png | Bin 0 -> 1308427 bytes docs/img/og/og-02.png | Bin 0 -> 1073257 bytes docs/img/og/og-03.png | Bin 0 -> 781631 bytes docs/img/og/og-04.png | Bin 0 -> 2585968 bytes docs/img/og/og-05.png | Bin 0 -> 1545046 bytes docs/img/og/og-06.png | Bin 0 -> 569173 bytes docs/index.html | 7 +- docs/og.html | 1487 ++++++++++++++++++++++++++++++++ tools/og/render-og.sh | 102 +++ 12 files changed, 1597 insertions(+), 1 deletion(-) create mode 100644 docs/img/AppIcon.png create mode 100644 docs/img/og/og-01-dyslexic.png create mode 100644 docs/img/og/og-01.png create mode 100644 docs/img/og/og-02.png create mode 100644 docs/img/og/og-03.png create mode 100644 docs/img/og/og-04.png create mode 100644 docs/img/og/og-05.png create mode 100644 docs/img/og/og-06.png create mode 100644 docs/og.html create mode 100755 tools/og/render-og.sh diff --git a/README.md b/README.md index 9ca32261..6ca7813a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Mora +Mora — A different door into reading. Built with Opus 4.7. + [![License: MPL 2.0](https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg)](https://opensource.org/licenses/MPL-2.0) [![Built with Opus 4.7](https://img.shields.io/badge/Built_with-Opus_4.7-orange.svg)](https://www.youtalk.jp/mora) [![Hackathon Stage 1](https://img.shields.io/badge/Hackathon-Stage_1_2026--04--26-blue.svg)](https://www.youtalk.jp/mora) diff --git a/docs/img/AppIcon.png b/docs/img/AppIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ebf552c7dbb91828ac4762446cc73a6bedf9c6 GIT binary patch literal 612357 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