From 127798424ac7b64513ecf1055d7a02987157ee36 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 12:53:05 -0400 Subject: [PATCH 01/16] feat(cad): add printable laptop screen inserts (#56) A4 PDF with one page per servo preset: eight designs (build output, source code, agent chat, crash dump, retro computer, ELIZA-style chat, splash, blank template), a 10 mm square and 50 mm ruler for scale. scripts/laptop_screens.py measures each preset's insert size from LaptopScreen.stl and the visible window from the LaptopCase lid pocket, so new presets get correct sizes after export. Designs are plain-text .screen files; CI checks the committed PDF is current. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 2 + 3d_models/README.md | 2 +- 3d_models/laptop_screens/README.md | 66 +++ 3d_models/laptop_screens/laptop-screens.pdf | Bin 0 -> 29761 bytes .../laptop_screens/screens/01-build.screen | 20 + .../laptop_screens/screens/02-code.screen | 21 + .../laptop_screens/screens/03-agent.screen | 18 + .../laptop_screens/screens/04-panic.screen | 20 + .../laptop_screens/screens/05-retro.screen | 18 + .../laptop_screens/screens/06-eliza.screen | 16 + .../laptop_screens/screens/07-splash.screen | 15 + .../laptop_screens/screens/08-blank.screen | 7 + docs/3d/assembly.md | 2 +- scripts/laptop_screens.py | 521 ++++++++++++++++++ 14 files changed, 726 insertions(+), 2 deletions(-) create mode 100644 3d_models/laptop_screens/README.md create mode 100644 3d_models/laptop_screens/laptop-screens.pdf create mode 100644 3d_models/laptop_screens/screens/01-build.screen create mode 100644 3d_models/laptop_screens/screens/02-code.screen create mode 100644 3d_models/laptop_screens/screens/03-agent.screen create mode 100644 3d_models/laptop_screens/screens/04-panic.screen create mode 100644 3d_models/laptop_screens/screens/05-retro.screen create mode 100644 3d_models/laptop_screens/screens/06-eliza.screen create mode 100644 3d_models/laptop_screens/screens/07-splash.screen create mode 100644 3d_models/laptop_screens/screens/08-blank.screen create mode 100644 scripts/laptop_screens.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ab23acc..78b05136 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,8 @@ jobs: run: pip install -U platformio - name: Audio pack tests run: python3 scripts/test_audio_pack.py + - name: Laptop screen inserts PDF up to date + run: python3 scripts/laptop_screens.py --check - name: Build firmware run: pio run - name: Build LittleFS image diff --git a/3d_models/README.md b/3d_models/README.md index 04b8b5fc..faa91ad3 100644 --- a/3d_models/README.md +++ b/3d_models/README.md @@ -84,7 +84,7 @@ Same filenames in each `parts/{servo_id}/3mf/` folder (and matching `stl/` / `st | `DeskTop.3mf` | Desk top surface | | `DeskPad.3mf` | Desk pad | | `LaptopCase.3mf` | Miniature laptop body | -| `LaptopScreen.3mf` | Laptop screen | +| `LaptopScreen.3mf` | Laptop screen — optional printed paper screens: [laptop screen inserts](laptop_screens/README.md) | | `Bell.3mf` | Service bell | | `LampBase.3mf` | Desk lamp base | | `LampCap.3mf` | Lamp cap | diff --git a/3d_models/laptop_screens/README.md b/3d_models/laptop_screens/README.md new file mode 100644 index 00000000..30e35bcd --- /dev/null +++ b/3d_models/laptop_screens/README.md @@ -0,0 +1,66 @@ +# Laptop screen inserts + +Paper inserts that turn the plain black `LaptopScreen` into a terminal, an IDE, an agent chat, a crash dump, a retro computer, an ELIZA-style chat or a Tiny Engineer splash. No electronics: print, cut, slide into the lid. Inspired by a [community build](https://github.com/jamro/tiny-engineer/discussions/13#discussioncomment-18741594) that used a printed ELIZA screenshot behind clear PET. + +**Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, one page per servo preset. + +## Print, cut, install + +1. Open the PDF and print **only the page for your servo preset** (`sg90`, `fs0307`, `es9051` or `hd1370a` — the same folder you printed from [`parts/`](../parts/)). Each insert is labelled with its preset. +2. Print at **100% / Actual size**. Turn off "Fit to page" / "Shrink to printable area". +3. Check the scale: the square at the top must measure **10 × 10 mm** and the ruler **50 mm**. If not, fix the print settings and reprint — a scaled insert will not fit the pocket. +4. Cut along the thin grey outline. Snip the four corners slightly: the pocket has rounded corners. +5. Cut a piece of clear PET (a drink bottle or blister pack works) to the same size. +6. Slide the paper insert, printed side towards you, into the pocket on the underside of `LaptopCase` with the PET in front of it, then slide `LaptopScreen` in behind them as usual ([assembly §14](../../docs/3d/assembly.md#14-desk-props--laptop-mug-bell)). The top of the design goes to the top of the lid, away from the hinge. + +The pocket has about **0.6 mm** of spare depth behind the lip. Plain 80 g/m² paper (~0.1 mm) plus thin bottle PET (~0.2–0.3 mm) fits. If it binds, leave out the PET or use thinner paper. + +Only the top part of each insert shows through the bezel; the bottom ~6–8 mm hides behind the hinge. The designs keep their content in the visible window. + +## Sizes + +Measured from the exported meshes (`LaptopScreen.stl` for the insert, the lid pocket and lip in `LaptopCase.stl` for the window). Window offsets are from the left and top edge of the insert. + +| Preset | Insert (W × H) | Visible window (W × H) | Window offset | +| --- | --- | --- | --- | +| `sg90` | 45.6 × 34.4 mm | 45.2 × 25.9 mm | 0.2 / 1.7 mm | +| `fs0307` | 33.8 × 26.0 mm | 33.4 × 17.5 mm | 0.2 / 1.7 mm | +| `es9051` | 37.2 × 28.4 mm | 36.8 × 19.9 mm | 0.2 / 1.7 mm | +| `hd1370a` | 32.7 × 25.2 mm | 32.3 × 16.7 mm | 0.2 / 1.7 mm | + +Using your own image (a screenshot, a photo)? Crop it to the visible window's aspect ratio, print it at the insert size with the window offset above, or cut out the **Blank template** and glue it inside the dashed line. + +## Add or edit a screen + +Designs are plain-text files in [`screens/`](screens/), one per insert, drawn in a monospaced font scaled to fill the window. Files are laid out in name order. + +```text +# title: Build output +# background: #0d1117 +# foreground: #c9d1d9 +# color ok: #3fb950 +# align: top-left +# outline: none +$ pio run +{ok}[SUCCESS]{/} Took 12.84 seconds +``` + +| Header | Meaning | +| --- | --- | +| `title` | Label printed under the insert | +| `background` | Fill for the whole insert, `#rrggbb` | +| `foreground` | Default text colour | +| `color ` | Named colour for `{name}…{/}` spans in the text | +| `align` | `top-left` (default) or `center` | +| `outline` | `window` draws a dashed line around the visible area (blank template) | + +Text lines follow the headers. `{name}` switches to a named colour, `{/}` back to the foreground. Characters must be printable in the PDF base fonts (ASCII and Latin-1 are fine). + +Then rebuild the PDF from the repo root (Python 3, standard library only): + +```bash +python3 scripts/laptop_screens.py # rewrite laptop-screens.pdf +python3 scripts/laptop_screens.py --check # CI: fail if the PDF is stale +``` + +The script re-measures every `parts/{servo_id}/stl/` folder that has a `LaptopScreen.stl`, so a new servo preset gets its own page after the Fusion export — no sizes to edit by hand. diff --git a/3d_models/laptop_screens/laptop-screens.pdf b/3d_models/laptop_screens/laptop-screens.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e15de81e1fea0e5a266944230e5a5bf6ad7eaafb GIT binary patch literal 29761 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 Y&c=?;fA=-FAddhi20gvZ2U(2&1IntFr~m)} literal 0 HcmV?d00001 diff --git a/3d_models/laptop_screens/screens/01-build.screen b/3d_models/laptop_screens/screens/01-build.screen new file mode 100644 index 00000000..00881a99 --- /dev/null +++ b/3d_models/laptop_screens/screens/01-build.screen @@ -0,0 +1,20 @@ +# title: Build output +# background: #0d1117 +# foreground: #c9d1d9 +# color dim: #6e7681 +# color ok: #3fb950 +# color cmd: #79c0ff +# color warn: #d29922 +{cmd}~/tiny-engineer${/} pio run +{dim}Processing esp32-c3-devkitm-1 (espressif32){/} +{dim}-------------------------------------------{/} +Compiling .pio/build/src/anim/poses.cpp.o +Compiling .pio/build/src/http/routes.cpp.o +Compiling .pio/build/src/servos/park.cpp.o +Linking .pio/build/firmware.elf +{warn}Checking size .pio/build/firmware.elf{/} +RAM: [== ] 17.4% (57012 bytes) +Flash: [===== ] 52.1% (1023890 bytes) +Building .pio/build/firmware.bin +{ok}========== [SUCCESS] Took 12.84 seconds =========={/} +{cmd}~/tiny-engineer${/} _ diff --git a/3d_models/laptop_screens/screens/02-code.screen b/3d_models/laptop_screens/screens/02-code.screen new file mode 100644 index 00000000..dc5ddda3 --- /dev/null +++ b/3d_models/laptop_screens/screens/02-code.screen @@ -0,0 +1,21 @@ +# title: Source code +# background: #1e1e1e +# foreground: #d4d4d4 +# color num: #858585 +# color kw: #569cd6 +# color ty: #4ec9b0 +# color fn: #dcdcaa +# color str: #ce9178 +# color cm: #6a9955 +{num} 1{/} {cm}// wave hello, then get back to work{/} +{num} 2{/} {kw}void{/} {fn}greet{/}({ty}Robot{/} &bot) { +{num} 3{/} {kw}for{/} ({kw}int{/} i = {num}0{/}; i < {num}3{/}; i++) { +{num} 4{/} bot.{fn}arm{/}({ty}Side{/}::Right, {num}0.8f{/}); +{num} 5{/} {fn}delay{/}({num}180{/}); +{num} 6{/} bot.{fn}arm{/}({ty}Side{/}::Right, {num}-0.2f{/}); +{num} 7{/} {fn}delay{/}({num}180{/}); +{num} 8{/} } +{num} 9{/} bot.{fn}say{/}({str}"Hello, world!"{/}); +{num}10{/} bot.{fn}pose{/}({str}"typing"{/}); +{num}11{/} } +{num}12{/} diff --git a/3d_models/laptop_screens/screens/03-agent.screen b/3d_models/laptop_screens/screens/03-agent.screen new file mode 100644 index 00000000..8bb60272 --- /dev/null +++ b/3d_models/laptop_screens/screens/03-agent.screen @@ -0,0 +1,18 @@ +# title: AI agent chat +# background: #191919 +# foreground: #e6e6e6 +# color you: #8ab4f8 +# color bot: #f0a868 +# color dim: #8a8a8a +# color ok: #81c995 +{you}> fix the failing servo test{/} + +{bot}*{/} Reading test/servos/test_park.cpp +{bot}*{/} The test expects the elbow to park at + 0.0, but the default is now -0.1. +{bot}*{/} Updating the expected value... +{dim} - TEST_ASSERT_EQUAL_FLOAT(0.0f, pose);{/} +{ok} + TEST_ASSERT_EQUAL_FLOAT(-0.1f, pose);{/} +{bot}*{/} Ran pio test -e native: {ok}42 passed{/} + +{you}> {/}_ diff --git a/3d_models/laptop_screens/screens/04-panic.screen b/3d_models/laptop_screens/screens/04-panic.screen new file mode 100644 index 00000000..7f772adc --- /dev/null +++ b/3d_models/laptop_screens/screens/04-panic.screen @@ -0,0 +1,20 @@ +# title: Crash / stack trace +# background: #0a0a0a +# foreground: #d0d0d0 +# color err: #ff5f56 +# color dim: #7a7a7a +# color hi: #ffbd2e +{err}Guru Meditation Error: Core 0 panic'ed{/} +{err}(Load access fault). Exception was unhandled.{/} + +{dim}Core 0 register dump:{/} +MEPC : {hi}0x42008a3e{/} RA : 0x42008a1c +SP : 0x3fc9b2f0 GP : 0x3fc8e400 +MTVAL : {hi}0x00000000{/} <- null pointer + +{dim}Backtrace:{/} + 0x42008a3e in Coffee::refill() at mug.cpp:42 + 0x42004f10 in Engineer::morning() at day.cpp:7 + 0x42003c88 in loop() at main.cpp:118 + +{err}Rebooting...{/} diff --git a/3d_models/laptop_screens/screens/05-retro.screen b/3d_models/laptop_screens/screens/05-retro.screen new file mode 100644 index 00000000..a13a285e --- /dev/null +++ b/3d_models/laptop_screens/screens/05-retro.screen @@ -0,0 +1,18 @@ +# title: Retro computer +# background: #08260f +# foreground: #39ff6a +# color dim: #1f9a40 +{dim}**** TINY ENGINEER BASIC V2 ****{/} +{dim} 64K RAM SYSTEM 38911 BASIC BYTES FREE{/} + +READY. +10 PRINT "HELLO, HUMAN" +20 GOTO 10 +RUN +HELLO, HUMAN +HELLO, HUMAN +HELLO, HUMAN +HELLO, HUMAN +BREAK IN 10 +READY. +_ diff --git a/3d_models/laptop_screens/screens/06-eliza.screen b/3d_models/laptop_screens/screens/06-eliza.screen new file mode 100644 index 00000000..6ba09308 --- /dev/null +++ b/3d_models/laptop_screens/screens/06-eliza.screen @@ -0,0 +1,16 @@ +# title: ELIZA-style chat +# background: #f2efe4 +# foreground: #1d1d1d +# color you: #6b4f2a +HOW DO YOU DO. PLEASE STATE YOUR PROBLEM. +{you}> My robot keeps waving at me.{/} +WHY DO YOU SAY YOUR ROBOT KEEPS WAVING +AT YOU? +{you}> Maybe it wants a coffee.{/} +YOU DON'T SEEM QUITE CERTAIN. +{you}> I am never certain before coffee.{/} +HOW LONG HAVE YOU BEEN NEVER CERTAIN +BEFORE COFFEE? +{you}> Since I started writing firmware.{/} +TELL ME MORE ABOUT WRITING FIRMWARE. +{you}> {/}_ diff --git a/3d_models/laptop_screens/screens/07-splash.screen b/3d_models/laptop_screens/screens/07-splash.screen new file mode 100644 index 00000000..83feb165 --- /dev/null +++ b/3d_models/laptop_screens/screens/07-splash.screen @@ -0,0 +1,15 @@ +# title: Tiny Engineer splash +# background: #12100e +# foreground: #e8a15a +# color dim: #8c6a48 +# align: center + .-----. + | o o | + | - | + '--+--' + /| |\ + |___| + + TINY ENGINEER +{dim} booting desk robot...{/} +{dim} [##########--------]{/} diff --git a/3d_models/laptop_screens/screens/08-blank.screen b/3d_models/laptop_screens/screens/08-blank.screen new file mode 100644 index 00000000..96e45db8 --- /dev/null +++ b/3d_models/laptop_screens/screens/08-blank.screen @@ -0,0 +1,7 @@ +# title: Blank template +# background: #ffffff +# foreground: #b0b0b0 +# align: center +# outline: window +draw or glue your screen inside +the dashed line (visible area) diff --git a/docs/3d/assembly.md b/docs/3d/assembly.md index 79bca506..8ac6993b 100644 --- a/docs/3d/assembly.md +++ b/docs/3d/assembly.md @@ -177,7 +177,7 @@ Seat the **main control board** in `Desk`. This step mounts what you already con ## 14. Desk props — laptop, mug, bell -1. **Laptop** — slide `LaptopScreen` into the pocket on the underside of `LaptopCase`. Place the laptop on the desk and fasten with one M2 screw from under the desk (M2×8 mm works). +1. **Laptop** — slide `LaptopScreen` into the pocket on the underside of `LaptopCase`. Place the laptop on the desk and fasten with one M2 screw from under the desk (M2×8 mm works). Optional: put a printed paper screen in front of the plate — [laptop screen inserts](../../3d_models/laptop_screens/README.md). 2. **Mug** — seat `Coffee` inside `Mug`. Place the mug in its dedicated spot on the desk and fasten the same way: one M2 screw from under the desk (M2×8 mm works). 3. **Bell** — first drive the M2 screw fully into `Bell` alone (M2×16 mm works). Then, with the screw already in the bell, drive that screw down into the desk from above and secure with an M2 nut underneath. diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py new file mode 100644 index 00000000..1a099612 --- /dev/null +++ b/scripts/laptop_screens.py @@ -0,0 +1,521 @@ +#!/usr/bin/env python3 +"""Build the printable laptop screen inserts PDF (one A4 page per servo preset). + +Insert size and visible window are measured from the exported meshes, so every +preset under 3d_models/parts/ gets correctly sized inserts: + +- LaptopScreen.stl: the plate. The insert is cut to the plate outline. +- LaptopCase.stl: the lid pocket the plate slides into, and the lip in front of + it whose opening is the part of the insert you actually see. + +Screen designs are plain-text files in 3d_models/laptop_screens/screens/*.screen +(format: 3d_models/laptop_screens/README.md). Standard library only. + + python3 scripts/laptop_screens.py # rewrite the PDF + python3 scripts/laptop_screens.py --check # fail if the PDF is stale +""" + +import argparse +import json +import math +import re +import struct +import sys +import zlib +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PARTS = ROOT / "3d_models" / "parts" +SERVOS_JSON = ROOT / "3d_models" / "fusion" / "TinyEngineerTools" / "servos.json" +SCREENS_DIR = ROOT / "3d_models" / "laptop_screens" / "screens" +OUT_PDF = ROOT / "3d_models" / "laptop_screens" / "laptop-screens.pdf" + +PT_PER_MM = 72 / 25.4 +A4_MM = (210.0, 297.0) +PRESET_ORDER = ["sg90", "fs0307", "es9051", "hd1370a"] # docs order; others follow + + +class ScreensError(Exception): + pass + + +# ---------------------------------------------------------------- geometry + +def sub(a, b): + return (a[0] - b[0], a[1] - b[1], a[2] - b[2]) + + +def dot(a, b): + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + + +def cross(a, b): + return (a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]) + + +def norm(a): + length = math.sqrt(dot(a, a)) + return (a[0] / length, a[1] / length, a[2] / length) + + +def read_stl(path): + """Binary STL -> list of (unit normal, area, centroid, (v0, v1, v2)).""" + data = path.read_bytes() + if data[:5] == b"solid" and b"facet" in data[:400]: + raise ScreensError(f"{path}: ASCII STL not supported") + (count,) = struct.unpack_from("= 2: + spans.append((min(hits), max(hits))) + merged = [] + for a, b in sorted(spans): + if merged and a <= merged[-1][1] + 1e-4: + merged[-1][1] = max(merged[-1][1], b) + else: + merged.append([a, b]) + gaps, pos = [], lo + for a, b in merged: + if a > pos: + gaps.append((pos, a)) + pos = max(pos, b) + if pos < hi: + gaps.append((pos, hi)) + return gaps + + +def measure_plate(path): + pts = [p for t in read_stl(path) for p in t[3]] + size = sorted(max(p[k] for p in pts) - min(p[k] for p in pts) for k in range(3)) + thickness, height, width = size # the screen is landscape + return width, height, thickness + + +def measure_lid(path): + """Pocket and window of the LaptopCase lid, in lid coordinates (mm). + + s runs across the screen, t runs up the screen (away from the hinge), and + u is the screen normal pointing at the viewer. + """ + tris = read_stl(path) + buckets = {} + for n, area, _, _ in tris: + if max(abs(c) for c in n) < 0.99: # the lid is the big tilted slab + key = tuple(round(c * 20) for c in n) + buckets[key] = buckets.get(key, 0) + area + if not buckets: + raise ScreensError(f"{path}: no tilted lid faces found") + key = max(buckets, key=buckets.get) + guess = norm(tuple(k / 20 for k in key)) + acc = [0.0, 0.0, 0.0] + for n, area, _, _ in tris: + if abs(dot(n, guess)) > 0.995: + sign = 1 if dot(n, guess) > 0 else -1 + for k in range(3): + acc[k] += sign * n[k] * area + u = norm(tuple(acc)) + lid = [t for t in tris if abs(dot(t[0], u)) > 0.995] + rest = [t for t in tris if abs(dot(t[0], u)) <= 0.995] + + def centroid(group): + total = sum(t[1] for t in group) + return tuple(sum(t[2][k] * t[1] for t in group) / total for k in range(3)) + + lid_c, base_c = centroid(lid), centroid(rest) + if dot(u, sub(base_c, lid_c)) < 0: # the screen faces the keyboard + u = (-u[0], -u[1], -u[2]) + # The hinge axis is the model axis the lid normal has no component along. + hinge_axis = min(range(3), key=lambda k: abs(u[k])) + if abs(u[hinge_axis]) > 0.01: + raise ScreensError(f"{path}: lid normal {u} is not perpendicular to a model axis") + axis = tuple(1.0 if k == hinge_axis else 0.0 for k in range(3)) + t_dir = norm(cross(u, axis)) + pts = [p for t in lid for p in t[3]] + top = max(pts, key=lambda p: dot(p, t_dir)) + bottom = min(pts, key=lambda p: dot(p, t_dir)) + if dot(sub(top, base_c), sub(top, base_c)) < dot(sub(bottom, base_c), sub(bottom, base_c)): + t_dir = (-t_dir[0], -t_dir[1], -t_dir[2]) + s_dir = cross(t_dir, u) # viewer's right + + facing = lambda sign: [(dot(t[2], u), t) for t in lid if dot(t[0], u) * sign > 0] + back_levels = clusters(facing(-1)) + front_levels = clusters(facing(+1)) + if len(back_levels) < 2: + raise ScreensError(f"{path}: expected a back wall and a lip in the lid") + lip = [t for _, t in back_levels[-1]] + lip_d = back_levels[-1][0][0] + back_d = back_levels[0][0][0] + floors = [c for c in front_levels if back_d < c[0][0] < lip_d] + if not floors: + raise ScreensError(f"{path}: no pocket floor between back wall and lip") + floor = [t for _, t in floors[-1]] + depth = lip_d - floors[-1][-1][0] + + to2d = lambda p: (dot(p, s_dir), dot(p, t_dir)) + floor_pts = [to2d(p) for t in floor for p in t[3]] + pocket = (min(p[0] for p in floor_pts), max(p[0] for p in floor_pts), + min(p[1] for p in floor_pts), max(p[1] for p in floor_pts)) + lip2d = [tuple(to2d(p) for p in t[3]) for t in lip] + s_mid = (pocket[0] + pocket[1]) / 2 + 1e-3 + t_gaps = covered_intervals(lip2d, 0, s_mid, pocket[2], pocket[3]) + t_gaps = [g for g in t_gaps if pocket[2] < g[0] and g[1] < pocket[3]] or t_gaps + if not t_gaps: + raise ScreensError(f"{path}: no window found in the lid lip") + t0, t1 = max(t_gaps, key=lambda g: g[1] - g[0]) + s_gaps = covered_intervals(lip2d, 1, (t0 + t1) / 2 + 1e-3, pocket[0], pocket[1]) + s0, s1 = next(((a, b) for a, b in s_gaps if a < s_mid < b), (None, None)) + if s0 is None: + raise ScreensError(f"{path}: window does not cross the pocket centre") + return {"pocket": pocket, "window": (s0, s1, t0, t1), "depth": depth} + + +def measure_preset(preset_dir): + """Insert and window in insert coordinates: mm, origin top-left, y down.""" + width, height, thickness = measure_plate(preset_dir / "stl" / "LaptopScreen.stl") + lid = measure_lid(preset_dir / "stl" / "LaptopCase.stl") + p_s0, p_s1, p_t0, p_t1 = lid["pocket"] + w_s0, w_s1, w_t0, w_t1 = lid["window"] + # The plate floats in the pocket by `slack`; assume it sits centred. + slack = ((p_s1 - p_s0) - width, (p_t1 - p_t0) - height) + left = p_s0 + slack[0] / 2 + top = p_t1 - slack[1] / 2 + window = (w_s0 - left, top - w_t1, w_s1 - w_s0, w_t1 - w_t0) + if (min(slack) < -0.01 or window[0] < 0 or window[1] < 0 + or window[0] + window[2] > width + 0.01 or window[1] + window[3] > height + 0.01): + raise ScreensError(f"{preset_dir.name}: window {window} does not sit on the " + f"{width:.2f} x {height:.2f} mm plate (slack {slack})") + return { + "insert": (width, height), + "window": window, + "slack": max(slack), + "spare_depth": lid["depth"] - thickness, + } + + +def presets(): + names = {v["servo_id"]: k for k, v in json.loads(SERVOS_JSON.read_text()).items()} + found = [p.name for p in PARTS.iterdir() if (p / "stl" / "LaptopScreen.stl").is_file()] + order = sorted(found, key=lambda s: (PRESET_ORDER.index(s) if s in PRESET_ORDER else 99, s)) + return [(sid, names.get(sid, sid)) for sid in order] + + +# ---------------------------------------------------------------- screens + +COLOR_RE = re.compile(r"#[0-9a-fA-F]{6}$") +MARKUP_RE = re.compile(r"\{([a-z][a-z0-9_-]*|/)\}") + + +def parse_color(text, where): + if not COLOR_RE.match(text): + raise ScreensError(f"{where}: expected #rrggbb, got {text!r}") + return tuple(int(text[i:i + 2], 16) / 255 for i in (1, 3, 5)) + + +def parse_screen(path): + """`# key: value` headers, then text lines with {name}...{/} colour spans.""" + meta = {"title": path.stem, "background": "#000000", "foreground": "#ffffff", + "align": "top-left", "outline": "none"} + palette, body = {}, [] + lines = path.read_text(encoding="utf-8").splitlines() + while lines and lines[0].startswith("#"): + key, _, value = lines.pop(0)[1:].partition(":") + key, value = key.strip(), value.strip() + if key.startswith("color "): + name = key[6:].strip() + if name == "/" or not MARKUP_RE.fullmatch("{" + name + "}"): + raise ScreensError(f"{path.name}: bad colour name {name!r}") + palette[name] = parse_color(value, f"{path.name} {key}") + elif key in meta: + meta[key] = value + else: + raise ScreensError(f"{path.name}: unknown header {key!r}") + if lines and not lines[0].strip(): + lines.pop(0) + while lines and not lines[-1].strip(): + lines.pop() + fg = parse_color(meta["foreground"], f"{path.name} foreground") + for n, line in enumerate(lines, 1): + runs, colour, pos = [], fg, 0 + for m in MARKUP_RE.finditer(line): + if m.start() > pos: + runs.append((line[pos:m.start()], colour)) + name = m.group(1) + if name == "/": + colour = fg + elif name in palette: + colour = palette[name] + else: + raise ScreensError(f"{path.name}:{n}: unknown colour {{{name}}}") + pos = m.end() + if pos < len(line): + runs.append((line[pos:], colour)) + for text, _ in runs: + try: + text.encode("cp1252") + except UnicodeEncodeError as err: + raise ScreensError(f"{path.name}:{n}: character not printable in PDF base fonts") from err + body.append(runs) + if meta["align"] not in ("top-left", "center"): + raise ScreensError(f"{path.name}: align must be top-left or center") + if meta["outline"] not in ("none", "window"): + raise ScreensError(f"{path.name}: outline must be none or window") + meta["background"] = parse_color(meta["background"], f"{path.name} background") + return {"meta": meta, "lines": body} + + +def load_screens(): + files = sorted(SCREENS_DIR.glob("*.screen")) + if not files: + raise ScreensError(f"no *.screen files in {SCREENS_DIR}") + return [parse_screen(f) for f in files] + + +# ---------------------------------------------------------------- PDF + +def pdf_str(text): + raw = text.encode("cp1252") + return "(" + raw.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)").decode("latin-1") + ")" + + +def num(v): + s = f"{v:.3f}".rstrip("0").rstrip(".") + return s if s not in ("-0", "") else "0" + + +FONTS = {"F1": "Courier", "F2": "Helvetica", "F3": "Helvetica-Bold"} + + +class Page: + """Drawing in mm with the origin top-left, emitted as PDF operators.""" + + def __init__(self): + self.ops = [f"{num(PT_PER_MM)} 0 0 {num(-PT_PER_MM)} 0 {num(A4_MM[1] * PT_PER_MM)} cm"] + + def colour(self, rgb, stroke=False): + self.ops.append(" ".join(num(c) for c in rgb) + (" RG" if stroke else " rg")) + + def rect(self, x, y, w, h, fill=None, stroke=None, width=0.1, dash=None): + if fill: + self.colour(fill) + if stroke: + self.colour(stroke, stroke=True) + self.ops.append(f"{num(width)} w " + (f"[{num(dash)} {num(dash)}] 0 d" if dash else "[] 0 d")) + op = "B" if fill and stroke else "f" if fill else "S" + self.ops.append(f"{num(x)} {num(y)} {num(w)} {num(h)} re {op}") + + def line(self, x0, y0, x1, y1, rgb=(0, 0, 0), width=0.1): + self.colour(rgb, stroke=True) + self.ops.append(f"{num(width)} w [] 0 d {num(x0)} {num(y0)} m {num(x1)} {num(y1)} l S") + + def text(self, x, y, s, size, font="F2", rgb=(0, 0, 0)): + """Baseline at y (mm). Text matrix flips y back so glyphs are upright.""" + self.colour(rgb) + self.ops.append(f"BT /{font} {num(size)} Tf 1 0 0 -1 {num(x)} {num(y)} Tm {pdf_str(s)} Tj ET") + + def clip(self, x, y, w, h): + self.ops.append(f"q {num(x)} {num(y)} {num(w)} {num(h)} re W n") + + def unclip(self): + self.ops.append("Q") + + def stream(self): + return "\n".join(self.ops).encode("latin-1") + + +def write_pdf(pages, title): + objs = [] + + def add(body): + objs.append(body) + return len(objs) + + font_ids = {k: add(f"<< /Type /Font /Subtype /Type1 /BaseFont /{v} /Encoding /WinAnsiEncoding >>".encode()) + for k, v in FONTS.items()} + fonts = " ".join(f"/{k} {v} 0 R" for k, v in font_ids.items()) + pages_id = len(objs) + 1 + 2 * len(pages) + kids = [] + for page in pages: + data = zlib.compress(page.stream(), 9) + content = add(b"<< /Length %d /Filter /FlateDecode >>\nstream\n" % len(data) + data + b"\nendstream") + kids.append(add((f"<< /Type /Page /Parent {pages_id} 0 R /MediaBox [0 0 {num(A4_MM[0] * PT_PER_MM)} " + f"{num(A4_MM[1] * PT_PER_MM)}] /Resources << /Font << {fonts} >> >> " + f"/Contents {content} 0 R >>").encode())) + assert add(f"<< /Type /Pages /Kids [{' '.join(f'{k} 0 R' for k in kids)}] /Count {len(kids)} " + f"/ViewerPreferences << /PrintScaling /None >> >>".encode()) == pages_id + info = add(f"<< /Title {pdf_str(title)} /Producer (scripts/laptop_screens.py) >>".encode()) + catalog = add(f"<< /Type /Catalog /Pages {pages_id} 0 R " + f"/ViewerPreferences << /PrintScaling /None >> >>".encode()) + out = bytearray(b"%PDF-1.4\n%\xe2\xe3\xcf\xd3\n") + offsets = [] + for i, body in enumerate(objs, 1): + offsets.append(len(out)) + out += b"%d 0 obj\n" % i + body + b"\nendobj\n" + xref = len(out) + out += b"xref\n0 %d\n0000000000 65535 f \n" % (len(objs) + 1) + out += b"".join(b"%010d 00000 n \n" % o for o in offsets) + out += (b"trailer\n<< /Size %d /Root %d 0 R /Info %d 0 R >>\nstartxref\n%d\n%%%%EOF\n" + % (len(objs) + 1, catalog, info, xref)) + return bytes(out) + + +# ---------------------------------------------------------------- layout + +MARGIN = 12.0 +GAP_X = 4.0 +LABEL_H = 4.0 +GREY = (0.45, 0.45, 0.45) +CUT = (0.6, 0.6, 0.6) +TEXT_PAD = 0.6 # mm inside the window, on top of half the pocket slack +LINE_H = 1.2 # line height in em +CHAR_W = 0.6 # Courier advance in em + + +def draw_insert(page, x, y, geo, screen): + w, h = geo["insert"] + wx, wy, ww, wh = geo["window"] + meta = screen["meta"] + page.rect(x, y, w, h, fill=meta["background"]) + pad = TEXT_PAD + geo["slack"] / 2 + ax, ay, aw, ah = x + wx + pad, y + wy + pad, ww - 2 * pad, wh - 2 * pad + lines = screen["lines"] + if lines: + cols = max(sum(len(t) for t, _ in runs) for runs in lines) or 1 + size_mm = min(aw / (cols * CHAR_W), ah / (len(lines) * LINE_H)) + block_w = cols * CHAR_W * size_mm + block_h = len(lines) * LINE_H * size_mm + if meta["align"] == "center": + ax += (aw - block_w) / 2 + ay += (ah - block_h) / 2 + page.clip(x, y, w, h) + for i, runs in enumerate(lines): + cx = ax + base = ay + (i + 0.8) * LINE_H * size_mm + for text, rgb in runs: + if text.strip(): + page.text(cx, base, text, size_mm, font="F1", rgb=rgb) + cx += len(text) * CHAR_W * size_mm + page.unclip() + if meta["outline"] == "window": + page.rect(x + wx, y + wy, ww, wh, stroke=GREY, width=0.15, dash=0.8) + page.rect(x, y, w, h, stroke=CUT, width=0.1) + + +def draw_scale_check(page, x, y): + page.rect(x, y, 10, 10, stroke=(0, 0, 0), width=0.2) + page.text(x + 1.2, y + 5.8, "10 mm", 2.4, rgb=GREY) + rx = x + 16 + page.line(rx, y + 10, rx + 50, y + 10, width=0.2) + for mm in range(51): + tick = 3.0 if mm % 10 == 0 else 2.0 if mm % 5 == 0 else 1.2 + page.line(rx + mm, y + 10, rx + mm, y + 10 - tick, width=0.12) + for mm in range(0, 51, 10): + page.text(rx + mm - 0.8, y + 5.6, str(mm), 2.2, rgb=GREY) + page.text(rx + 53, y + 4.4, "Square must measure 10 x 10 mm and the ruler 50 mm.", 2.6) + page.text(rx + 53, y + 8.6, "If not, reprint at 100% / Actual size (scaling off).", 2.6) + + +def preset_page(sid, name, geo, screens): + page = Page() + w, h = geo["insert"] + wx, wy, ww, wh = geo["window"] + y = MARGIN + 6 + page.text(MARGIN, y, "Tiny Engineer - laptop screen inserts", 6.0, font="F3") + y += 7.5 + page.text(MARGIN, y, f"Servo preset: {name} ({sid})", 4.6, font="F3") + page.text(A4_MM[0] - MARGIN - 52, y, f"Print only this page for {sid} parts.", 2.8, rgb=GREY) + y += 6 + page.text(MARGIN, y, (f"Insert {w:.1f} x {h:.1f} mm (cut on the grey line). Visible window " + f"{ww:.1f} x {wh:.1f} mm, {wx:.1f} mm from the left and {wy:.1f} mm from " + f"the top edge."), 2.8) + y += 4.2 + page.text(MARGIN, y, ("Slide the paper insert, then a same-size piece of clear PET, into the lid " + "pocket in front of LaptopScreen."), 2.8) + y += 4 + draw_scale_check(page, MARGIN, y) + y += 16 + + cols = max(1, int((A4_MM[0] - 2 * MARGIN + GAP_X) // (w + GAP_X))) + rows = max(1, int((A4_MM[1] - MARGIN - y) // (h + LABEL_H + 2))) + grid_w = cols * w + (cols - 1) * GAP_X + x0 = (A4_MM[0] - grid_w) / 2 + for i in range(cols * rows): + screen = screens[i % len(screens)] + r, c = divmod(i, cols) + ix, iy = x0 + c * (w + GAP_X), y + r * (h + LABEL_H + 2) + draw_insert(page, ix, iy, geo, screen) + page.text(ix, iy + h + 2.8, f"{sid} - {screen['meta']['title']}", 2.4, rgb=GREY) + return page + + +def build(): + screens = load_screens() + pages, report = [], [] + for sid, name in presets(): + geo = measure_preset(PARTS / sid) + pages.append(preset_page(sid, name, geo, screens)) + report.append((sid, geo)) + return write_pdf(pages, "Tiny Engineer laptop screen inserts"), report + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("--check", action="store_true", help="fail if the committed PDF is out of date") + args = parser.parse_args(argv) + try: + pdf, report = build() + except ScreensError as err: + print(f"laptop_screens: {err}", file=sys.stderr) + return 1 + for sid, geo in report: + w, h = geo["insert"] + wx, wy, ww, wh = geo["window"] + print(f"{sid:8} insert {w:6.2f} x {h:5.2f} mm window {ww:6.2f} x {wh:5.2f} mm at " + f"({wx:.2f}, {wy:.2f}) slack {geo['slack']:.2f} spare depth {geo['spare_depth']:.2f} mm") + rel = OUT_PDF.relative_to(ROOT) + if args.check: + if not OUT_PDF.is_file() or OUT_PDF.read_bytes() != pdf: + print(f"{rel} is out of date: run python3 scripts/laptop_screens.py", file=sys.stderr) + return 1 + print(f"{rel} is up to date") + return 0 + OUT_PDF.parent.mkdir(parents=True, exist_ok=True) + OUT_PDF.write_bytes(pdf) + print(f"wrote {rel}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 1469aa088565cea4b76cc261eed4a21a8be6ca20 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:01:28 -0400 Subject: [PATCH 02/16] feat(cad): add paper-colour page per preset to laptop screen inserts Each preset now gets a second page with no background fill and black/grey text only, so inserts work from a black-only printer and on coloured paper (the paper becomes the screen). Colour designs must keep 3:1 contrast so they stay readable when printed in greyscale; paper-dim marks which colours print grey. Co-Authored-By: Claude Opus 5.5 --- 3d_models/laptop_screens/README.md | 21 +++++- 3d_models/laptop_screens/laptop-screens.pdf | Bin 29761 -> 57515 bytes .../laptop_screens/screens/01-build.screen | 1 + .../laptop_screens/screens/02-code.screen | 1 + .../laptop_screens/screens/03-agent.screen | 1 + .../laptop_screens/screens/04-panic.screen | 1 + .../laptop_screens/screens/05-retro.screen | 1 + .../laptop_screens/screens/06-eliza.screen | 1 + .../laptop_screens/screens/07-splash.screen | 1 + .../laptop_screens/screens/08-blank.screen | 8 ++- scripts/laptop_screens.py | 63 +++++++++++++++--- 11 files changed, 84 insertions(+), 15 deletions(-) diff --git a/3d_models/laptop_screens/README.md b/3d_models/laptop_screens/README.md index 30e35bcd..3ebb4b0b 100644 --- a/3d_models/laptop_screens/README.md +++ b/3d_models/laptop_screens/README.md @@ -2,11 +2,23 @@ Paper inserts that turn the plain black `LaptopScreen` into a terminal, an IDE, an agent chat, a crash dump, a retro computer, an ELIZA-style chat or a Tiny Engineer splash. No electronics: print, cut, slide into the lid. Inspired by a [community build](https://github.com/jamro/tiny-engineer/discussions/13#discussioncomment-18741594) that used a printed ELIZA screenshot behind clear PET. -**Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, one page per servo preset. +**Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, two pages per servo preset with the same designs: + +- **Colour screens** — each design on its own dark (or light) background. +- **Paper screens** — no background, black and grey text only, so the paper colour becomes the screen colour. + +| Your printer and paper | Print | +| --- | --- | +| Colour printer, white paper | Colour screens | +| Black-only printer, white paper | Colour screens (prints as greyscale; heavy on toner) or Paper screens | +| Colour printer, coloured paper | Paper screens (Colour screens also work, but their dark fill hides the paper) | +| Black-only printer, coloured paper | Paper screens | + +Green paper gives an old-LCD look; any pale colour works. Printers cannot print white, so dark paper (black, navy) will not show the text. ## Print, cut, install -1. Open the PDF and print **only the page for your servo preset** (`sg90`, `fs0307`, `es9051` or `hd1370a` — the same folder you printed from [`parts/`](../parts/)). Each insert is labelled with its preset. +1. Open the PDF and print **one page for your servo preset** (`sg90`, `fs0307`, `es9051` or `hd1370a` — the same folder you printed from [`parts/`](../parts/)), picking Colour or Paper screens from the table above. Each insert is labelled with its preset. 2. Print at **100% / Actual size**. Turn off "Fit to page" / "Shrink to printable area". 3. Check the scale: the square at the top must measure **10 × 10 mm** and the ruler **50 mm**. If not, fix the print settings and reprint — a scaled insert will not fit the pocket. 4. Cut along the thin grey outline. Snip the four corners slightly: the pocket has rounded corners. @@ -41,6 +53,8 @@ Designs are plain-text files in [`screens/`](screens/), one per insert, drawn in # color ok: #3fb950 # align: top-left # outline: none +# color dim: #6e7681 +# paper-dim: dim $ pio run {ok}[SUCCESS]{/} Took 12.84 seconds ``` @@ -53,9 +67,12 @@ $ pio run | `color ` | Named colour for `{name}…{/}` spans in the text | | `align` | `top-left` (default) or `center` | | `outline` | `window` draws a dashed line around the visible area (blank template) | +| `paper-dim` | Colour names that print grey on the Paper screens page; all other text prints black | Text lines follow the headers. `{name}` switches to a named colour, `{/}` back to the foreground. Characters must be printable in the PDF base fonts (ASCII and Latin-1 are fine). +Every text colour needs at least **3:1** contrast against `background`, so the Colour page still reads from a black-only printer. The script refuses a design that falls below it. + Then rebuild the PDF from the repo root (Python 3, standard library only): ```bash diff --git a/3d_models/laptop_screens/laptop-screens.pdf b/3d_models/laptop_screens/laptop-screens.pdf index e15de81e1fea0e5a266944230e5a5bf6ad7eaafb..ee72da17cf5a097f13e2dc15ea8b87760dc912eb 100644 GIT binary patch literal 57515 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

BfhDPZpT*T%j!GGr|VcI#y;4s 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 Ie^9{rKkr}|!vFvP diff --git a/3d_models/laptop_screens/screens/01-build.screen b/3d_models/laptop_screens/screens/01-build.screen index 00881a99..9534d944 100644 --- a/3d_models/laptop_screens/screens/01-build.screen +++ b/3d_models/laptop_screens/screens/01-build.screen @@ -1,6 +1,7 @@ # title: Build output # background: #0d1117 # foreground: #c9d1d9 +# paper-dim: dim # color dim: #6e7681 # color ok: #3fb950 # color cmd: #79c0ff diff --git a/3d_models/laptop_screens/screens/02-code.screen b/3d_models/laptop_screens/screens/02-code.screen index dc5ddda3..ba7fddb1 100644 --- a/3d_models/laptop_screens/screens/02-code.screen +++ b/3d_models/laptop_screens/screens/02-code.screen @@ -1,6 +1,7 @@ # title: Source code # background: #1e1e1e # foreground: #d4d4d4 +# paper-dim: num cm # color num: #858585 # color kw: #569cd6 # color ty: #4ec9b0 diff --git a/3d_models/laptop_screens/screens/03-agent.screen b/3d_models/laptop_screens/screens/03-agent.screen index 8bb60272..7160285c 100644 --- a/3d_models/laptop_screens/screens/03-agent.screen +++ b/3d_models/laptop_screens/screens/03-agent.screen @@ -1,6 +1,7 @@ # title: AI agent chat # background: #191919 # foreground: #e6e6e6 +# paper-dim: dim # color you: #8ab4f8 # color bot: #f0a868 # color dim: #8a8a8a diff --git a/3d_models/laptop_screens/screens/04-panic.screen b/3d_models/laptop_screens/screens/04-panic.screen index 7f772adc..a423a52f 100644 --- a/3d_models/laptop_screens/screens/04-panic.screen +++ b/3d_models/laptop_screens/screens/04-panic.screen @@ -1,6 +1,7 @@ # title: Crash / stack trace # background: #0a0a0a # foreground: #d0d0d0 +# paper-dim: dim # color err: #ff5f56 # color dim: #7a7a7a # color hi: #ffbd2e diff --git a/3d_models/laptop_screens/screens/05-retro.screen b/3d_models/laptop_screens/screens/05-retro.screen index a13a285e..93afc50e 100644 --- a/3d_models/laptop_screens/screens/05-retro.screen +++ b/3d_models/laptop_screens/screens/05-retro.screen @@ -1,6 +1,7 @@ # title: Retro computer # background: #08260f # foreground: #39ff6a +# paper-dim: dim # color dim: #1f9a40 {dim}**** TINY ENGINEER BASIC V2 ****{/} {dim} 64K RAM SYSTEM 38911 BASIC BYTES FREE{/} diff --git a/3d_models/laptop_screens/screens/06-eliza.screen b/3d_models/laptop_screens/screens/06-eliza.screen index 6ba09308..270ef3df 100644 --- a/3d_models/laptop_screens/screens/06-eliza.screen +++ b/3d_models/laptop_screens/screens/06-eliza.screen @@ -1,6 +1,7 @@ # title: ELIZA-style chat # background: #f2efe4 # foreground: #1d1d1d +# paper-dim: you # color you: #6b4f2a HOW DO YOU DO. PLEASE STATE YOUR PROBLEM. {you}> My robot keeps waving at me.{/} diff --git a/3d_models/laptop_screens/screens/07-splash.screen b/3d_models/laptop_screens/screens/07-splash.screen index 83feb165..7c81e307 100644 --- a/3d_models/laptop_screens/screens/07-splash.screen +++ b/3d_models/laptop_screens/screens/07-splash.screen @@ -1,6 +1,7 @@ # title: Tiny Engineer splash # background: #12100e # foreground: #e8a15a +# paper-dim: dim # color dim: #8c6a48 # align: center .-----. diff --git a/3d_models/laptop_screens/screens/08-blank.screen b/3d_models/laptop_screens/screens/08-blank.screen index 96e45db8..44967460 100644 --- a/3d_models/laptop_screens/screens/08-blank.screen +++ b/3d_models/laptop_screens/screens/08-blank.screen @@ -1,7 +1,9 @@ # title: Blank template # background: #ffffff -# foreground: #b0b0b0 +# foreground: #1a1a1a +# paper-dim: hint +# color hint: #8a8a8a # align: center # outline: window -draw or glue your screen inside -the dashed line (visible area) +{hint}draw or glue your screen inside{/} +{hint}the dashed line (visible area){/} diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index 1a099612..2bf22ff1 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -247,7 +247,7 @@ def parse_color(text, where): def parse_screen(path): """`# key: value` headers, then text lines with {name}...{/} colour spans.""" meta = {"title": path.stem, "background": "#000000", "foreground": "#ffffff", - "align": "top-left", "outline": "none"} + "align": "top-left", "outline": "none", "paper-dim": ""} palette, body = {}, [] lines = path.read_text(encoding="utf-8").splitlines() while lines and lines[0].startswith("#"): @@ -292,10 +292,40 @@ def parse_screen(path): raise ScreensError(f"{path.name}: align must be top-left or center") if meta["outline"] not in ("none", "window"): raise ScreensError(f"{path.name}: outline must be none or window") - meta["background"] = parse_color(meta["background"], f"{path.name} background") + bg = meta["background"] = parse_color(meta["background"], f"{path.name} background") + meta["foreground"] = fg + dim_names = meta["paper-dim"].split() + for name in dim_names: + if name not in palette: + raise ScreensError(f"{path.name}: paper-dim names unknown colour {name!r}") + meta["paper_dim"] = {palette[name] for name in dim_names} + for runs in body: + for text, rgb in runs: + ratio = contrast(rgb, bg) + if text.strip() and ratio < MIN_CONTRAST: + raise ScreensError(f"{path.name}: {text.strip()!r} has contrast {ratio:.1f}:1 against the " + f"background; needs {MIN_CONTRAST}:1 to survive greyscale printing") return {"meta": meta, "lines": body} +MIN_CONTRAST = 3.0 + + +def luminance(rgb): + lin = [c / 12.92 if c <= 0.04045 else ((c + 0.055) / 1.055) ** 2.4 for c in rgb] + return 0.2126 * lin[0] + 0.7152 * lin[1] + 0.0722 * lin[2] + + +def contrast(a, b): + la, lb = sorted((luminance(a), luminance(b)), reverse=True) + return (la + 0.05) / (lb + 0.05) + + +def paper_ink(rgb, meta): + """Paper mode: colours listed in `paper-dim` print grey, everything else black.""" + return PAPER_DIM if rgb in meta["paper_dim"] else PAPER_TEXT + + def load_screens(): files = sorted(SCREENS_DIR.glob("*.screen")) if not files: @@ -401,13 +431,22 @@ def add(body): TEXT_PAD = 0.6 # mm inside the window, on top of half the pocket slack LINE_H = 1.2 # line height in em CHAR_W = 0.6 # Courier advance in em +PAPER_TEXT = (0, 0, 0) +PAPER_DIM = (0.45, 0.45, 0.45) +MODES = { + "colour": ("Colour screens", + "Colour or black-only printer on white paper. Dark fills hide the paper colour."), + "paper": ("Paper screens", + "Any printer, any paper colour: no fill, so the paper becomes the screen."), +} -def draw_insert(page, x, y, geo, screen): +def draw_insert(page, x, y, geo, screen, mode): w, h = geo["insert"] wx, wy, ww, wh = geo["window"] meta = screen["meta"] - page.rect(x, y, w, h, fill=meta["background"]) + if mode == "colour": + page.rect(x, y, w, h, fill=meta["background"]) pad = TEXT_PAD + geo["slack"] / 2 ax, ay, aw, ah = x + wx + pad, y + wy + pad, ww - 2 * pad, wh - 2 * pad lines = screen["lines"] @@ -425,7 +464,8 @@ def draw_insert(page, x, y, geo, screen): base = ay + (i + 0.8) * LINE_H * size_mm for text, rgb in runs: if text.strip(): - page.text(cx, base, text, size_mm, font="F1", rgb=rgb) + ink = rgb if mode == "colour" else paper_ink(rgb, meta) + page.text(cx, base, text, size_mm, font="F1", rgb=ink) cx += len(text) * CHAR_W * size_mm page.unclip() if meta["outline"] == "window": @@ -447,16 +487,19 @@ def draw_scale_check(page, x, y): page.text(rx + 53, y + 8.6, "If not, reprint at 100% / Actual size (scaling off).", 2.6) -def preset_page(sid, name, geo, screens): +def preset_page(sid, name, geo, screens, mode): page = Page() w, h = geo["insert"] wx, wy, ww, wh = geo["window"] + heading, use = MODES[mode] y = MARGIN + 6 - page.text(MARGIN, y, "Tiny Engineer - laptop screen inserts", 6.0, font="F3") + page.text(MARGIN, y, f"Tiny Engineer - laptop screen inserts: {heading}", 6.0, font="F3") y += 7.5 page.text(MARGIN, y, f"Servo preset: {name} ({sid})", 4.6, font="F3") - page.text(A4_MM[0] - MARGIN - 52, y, f"Print only this page for {sid} parts.", 2.8, rgb=GREY) + page.text(A4_MM[0] - MARGIN - 52, y, f"Print only one page for {sid} parts.", 2.8, rgb=GREY) y += 6 + page.text(MARGIN, y, use, 2.8, font="F3") + y += 4.2 page.text(MARGIN, y, (f"Insert {w:.1f} x {h:.1f} mm (cut on the grey line). Visible window " f"{ww:.1f} x {wh:.1f} mm, {wx:.1f} mm from the left and {wy:.1f} mm from " f"the top edge."), 2.8) @@ -475,7 +518,7 @@ def preset_page(sid, name, geo, screens): screen = screens[i % len(screens)] r, c = divmod(i, cols) ix, iy = x0 + c * (w + GAP_X), y + r * (h + LABEL_H + 2) - draw_insert(page, ix, iy, geo, screen) + draw_insert(page, ix, iy, geo, screen, mode) page.text(ix, iy + h + 2.8, f"{sid} - {screen['meta']['title']}", 2.4, rgb=GREY) return page @@ -485,7 +528,7 @@ def build(): pages, report = [], [] for sid, name in presets(): geo = measure_preset(PARTS / sid) - pages.append(preset_page(sid, name, geo, screens)) + pages.extend(preset_page(sid, name, geo, screens, mode) for mode in MODES) report.append((sid, geo)) return write_pdf(pages, "Tiny Engineer laptop screen inserts"), report From abddc0d7b36bb2de3a67faeccfb6c5afc890d9e8 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:11:44 -0400 Subject: [PATCH 03/16] feat(docs): add laptop screen generator to the site New /screens/ page: pick a servo preset, type a screen (or edit a stock design) or drop in a screenshot, preview it at real proportions and download an A4 PDF of inserts with the scale check. The PDF is built in the browser; images never leave it. scripts/laptop_screens.py now also writes web/screens/presets.json and designs.json from the CAD measurements and .screen files; --check covers them. Co-Authored-By: Claude Opus 5.5 --- 3d_models/laptop_screens/README.md | 8 +- scripts/laptop_screens.py | 50 ++-- web/STYLE.md | 1 + web/css/base.css | 162 +++++++++++ web/flash/index.html | 1 + web/index.html | 1 + web/js/screens.js | 416 +++++++++++++++++++++++++++++ web/screens/designs.json | 34 +++ web/screens/index.html | 137 ++++++++++ web/screens/presets.json | 62 +++++ 10 files changed, 854 insertions(+), 18 deletions(-) create mode 100644 web/js/screens.js create mode 100644 web/screens/designs.json create mode 100644 web/screens/index.html create mode 100644 web/screens/presets.json diff --git a/3d_models/laptop_screens/README.md b/3d_models/laptop_screens/README.md index 3ebb4b0b..bedd6fe4 100644 --- a/3d_models/laptop_screens/README.md +++ b/3d_models/laptop_screens/README.md @@ -40,7 +40,11 @@ Measured from the exported meshes (`LaptopScreen.stl` for the insert, the lid po | `es9051` | 37.2 × 28.4 mm | 36.8 × 19.9 mm | 0.2 / 1.7 mm | | `hd1370a` | 32.7 × 25.2 mm | 32.3 × 16.7 mm | 0.2 / 1.7 mm | -Using your own image (a screenshot, a photo)? Crop it to the visible window's aspect ratio, print it at the insert size with the window offset above, or cut out the **Blank template** and glue it inside the dashed line. +## Make your own + +**[Laptop screen generator](https://jamro.github.io/tiny-engineer/screens/)** — in the browser, nothing to install. Pick your servo preset, then either type a screen (or edit one of the stock designs, colours included) or drop in a screenshot, which is cropped to the visible window. It previews the insert at real proportions and downloads an A4 PDF of copies with the same scale check. Images stay in your browser. + +No internet? Cut out the **Blank template** and draw on it or glue a print inside the dashed line, using the sizes above. ## Add or edit a screen @@ -80,4 +84,4 @@ python3 scripts/laptop_screens.py # rewrite laptop-screens.pdf python3 scripts/laptop_screens.py --check # CI: fail if the PDF is stale ``` -The script re-measures every `parts/{servo_id}/stl/` folder that has a `LaptopScreen.stl`, so a new servo preset gets its own page after the Fusion export — no sizes to edit by hand. +The script re-measures every `parts/{servo_id}/stl/` folder that has a `LaptopScreen.stl`, so a new servo preset gets its own page after the Fusion export — no sizes to edit by hand. It also writes `web/screens/presets.json` and `designs.json`, which the generator page reads; `--check` covers those too. The generator's **Copy .screen source** button gives you a file in this format, ready for a PR. diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index 2bf22ff1..8f6b4f6a 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -29,6 +29,7 @@ SERVOS_JSON = ROOT / "3d_models" / "fusion" / "TinyEngineerTools" / "servos.json" SCREENS_DIR = ROOT / "3d_models" / "laptop_screens" / "screens" OUT_PDF = ROOT / "3d_models" / "laptop_screens" / "laptop-screens.pdf" +WEB_DIR = ROOT / "web" / "screens" PT_PER_MM = 72 / 25.4 A4_MM = (210.0, 297.0) @@ -523,41 +524,58 @@ def preset_page(sid, name, geo, screens, mode): return page +def web_data(report): + """Sizes and stock designs for the web generator (web/screens/).""" + sizes = [{"id": sid, "name": name, + "insert": [round(v, 2) for v in geo["insert"]], + "window": [round(v, 2) for v in geo["window"]], + "slack": round(geo["slack"], 2)} for sid, name, geo in report] + designs = [{"file": f.name, "source": f.read_text(encoding="utf-8")} + for f in sorted(SCREENS_DIR.glob("*.screen"))] + dump = lambda data: (json.dumps(data, indent=2) + "\n").encode() + return {WEB_DIR / "presets.json": dump(sizes), WEB_DIR / "designs.json": dump(designs)} + + def build(): screens = load_screens() pages, report = [], [] for sid, name in presets(): geo = measure_preset(PARTS / sid) pages.extend(preset_page(sid, name, geo, screens, mode) for mode in MODES) - report.append((sid, geo)) - return write_pdf(pages, "Tiny Engineer laptop screen inserts"), report + report.append((sid, name, geo)) + outputs = {OUT_PDF: write_pdf(pages, "Tiny Engineer laptop screen inserts")} + outputs.update(web_data(report)) + return outputs, report def main(argv=None): parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) - parser.add_argument("--check", action="store_true", help="fail if the committed PDF is out of date") + parser.add_argument("--check", action="store_true", help="fail if the committed outputs are out of date") args = parser.parse_args(argv) try: - pdf, report = build() + outputs, report = build() except ScreensError as err: print(f"laptop_screens: {err}", file=sys.stderr) return 1 - for sid, geo in report: + for sid, _, geo in report: w, h = geo["insert"] wx, wy, ww, wh = geo["window"] print(f"{sid:8} insert {w:6.2f} x {h:5.2f} mm window {ww:6.2f} x {wh:5.2f} mm at " f"({wx:.2f}, {wy:.2f}) slack {geo['slack']:.2f} spare depth {geo['spare_depth']:.2f} mm") - rel = OUT_PDF.relative_to(ROOT) - if args.check: - if not OUT_PDF.is_file() or OUT_PDF.read_bytes() != pdf: - print(f"{rel} is out of date: run python3 scripts/laptop_screens.py", file=sys.stderr) - return 1 - print(f"{rel} is up to date") - return 0 - OUT_PDF.parent.mkdir(parents=True, exist_ok=True) - OUT_PDF.write_bytes(pdf) - print(f"wrote {rel}") - return 0 + stale = 0 + for path, data in outputs.items(): + rel = path.relative_to(ROOT) + if args.check: + if not path.is_file() or path.read_bytes() != data: + print(f"{rel} is out of date: run python3 scripts/laptop_screens.py", file=sys.stderr) + stale = 1 + else: + print(f"{rel} is up to date") + else: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(data) + print(f"wrote {rel}") + return stale if __name__ == "__main__": diff --git a/web/STYLE.md b/web/STYLE.md index 5624e089..14164f15 100644 --- a/web/STYLE.md +++ b/web/STYLE.md @@ -399,6 +399,7 @@ Do not copy any one reference literally. - `/` — thin landing (hero + CTAs) - `/flash/` — USB web installer (ESP Web Tools) +- `/screens/` — laptop screen insert generator; sizes from `presets.json`, written by `scripts/laptop_screens.py` ### Homepage structure (when expanding) diff --git a/web/css/base.css b/web/css/base.css index 7de23e75..b05b157a 100644 --- a/web/css/base.css +++ b/web/css/base.css @@ -637,3 +637,165 @@ esp-web-install-button .button, color: var(--muted); font-size: 0.9rem; } + +/* Laptop screen generator (/screens/) */ + +.page-screens main { + gap: 1.25rem; +} + +.page-screens .hero { + align-items: start; +} + +.page-screens [hidden] { + display: none !important; +} + +.field { + display: flex; + flex-direction: column; + gap: 0.4rem; + min-width: 0; +} + +.input, +.textarea { + width: 100%; + padding: 0.45rem 0.7rem; + border-radius: var(--radius); + border: 1px solid var(--border-strong); + background: var(--raised); + color: var(--text); + font: inherit; + font-size: 0.9rem; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04) inset; +} + +.textarea { + font-family: var(--font-mono); + font-size: 0.78rem; + line-height: 1.45; + resize: vertical; + white-space: pre; + overflow-x: auto; +} + +.input:focus, +.textarea:focus, +.range:focus-visible, +.seg input:focus-visible + *, +.check input:focus-visible { + outline: 1px solid var(--accent); + outline-offset: 1px; +} + +.hint { + margin: 0; + color: var(--muted); + font-size: 0.8rem; +} + +.seg { + display: inline-flex; + align-self: flex-start; + border: 1px solid var(--border-strong); + border-radius: var(--radius); + overflow: hidden; +} + +.seg label { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.4rem 0.9rem; + font-family: var(--font-mono); + font-size: 0.8rem; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--muted); + cursor: pointer; +} + +.seg label + label { + border-left: 1px solid var(--border-strong); +} + +.seg label:has(input:checked) { + background: var(--accent-dim); + color: var(--text); +} + +.seg input, +.check input { + accent-color: var(--accent); +} + +.swatches { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.swatch { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.25rem 0.55rem 0.25rem 0.3rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--raised); + font-size: 0.75rem; + cursor: pointer; +} + +.swatch input { + width: 1.6rem; + height: 1.6rem; + padding: 0; + border: none; + background: none; + cursor: pointer; +} + +.check { + display: flex; + align-items: flex-start; + gap: 0.5rem; + font-size: 0.88rem; + color: var(--muted); + cursor: pointer; +} + +.check input { + margin-top: 0.2rem; +} + +.file { + font-size: 0.85rem; + color: var(--muted); +} + +.range { + width: 100%; + accent-color: var(--accent); +} + +.preview-frame { + padding: 0.75rem; + border: 1px dashed var(--border-strong); + border-radius: var(--radius); + background: repeating-linear-gradient(45deg, #1b1b1b 0 6px, #1e1e1e 6px 12px); + transition: border-color var(--dur) ease; +} + +.preview-frame.is-over { + border-color: var(--accent); +} + +.preview-frame canvas { + display: block; + width: 100%; + max-width: 100%; + box-shadow: 0 0 0 1px var(--border-strong); +} diff --git a/web/flash/index.html b/web/flash/index.html index c257d22d..f0a8a738 100644 --- a/web/flash/index.html +++ b/web/flash/index.html @@ -20,6 +20,7 @@

diff --git a/web/index.html b/web/index.html index b486243a..765677df 100644 --- a/web/index.html +++ b/web/index.html @@ -19,6 +19,7 @@ diff --git a/web/js/screens.js b/web/js/screens.js new file mode 100644 index 00000000..568a64e4 --- /dev/null +++ b/web/js/screens.js @@ -0,0 +1,416 @@ +// Laptop screen insert generator. Sizes and stock designs come from +// presets.json / designs.json, written by scripts/laptop_screens.py from the +// exported CAD meshes. The PDF is assembled here: one JPEG per insert, vector +// cut lines and scale check, no library. + +const PX_PER_MM = 24; // ~610 dpi in the PDF +const TEXT_PAD = 0.6; // mm inside the window, plus half the pocket slack +const LINE_H = 1.2; +const PAPER_DIM = '#737373'; +const MIN_CONTRAST = 3; +const A4 = [210, 297]; +const MARGIN = 12; +const GAP_X = 4; +const LABEL_H = 4; +const MARKUP = /\{([a-z][a-z0-9_-]*|\/)\}/g; + +const $ = (id) => document.getElementById(id); +const state = { + presets: [], designs: [], preset: null, source: 'text', design: null, + image: null, zoom: 1, panX: 0.5, panY: 0.5, paper: false, mask: true, +}; + +// ------------------------------------------------------------ .screen format + +function parseScreen(source) { + const meta = { title: 'Custom', background: '#000000', foreground: '#ffffff', align: 'top-left', outline: 'none', 'paper-dim': '' }; + const palette = {}; + const lines = source.replace(/\r/g, '').split('\n'); + while (lines.length && lines[0].startsWith('#')) { + const raw = lines.shift().slice(1); + const i = raw.indexOf(':'); + const key = raw.slice(0, i).trim(); + const value = raw.slice(i + 1).trim(); + if (key.startsWith('color ')) palette[key.slice(6).trim()] = value; + else if (key in meta) meta[key] = value; + } + while (lines.length && !lines[0].trim()) lines.shift(); + while (lines.length && !lines[lines.length - 1].trim()) lines.pop(); + return { + title: meta.title, background: meta.background, foreground: meta.foreground, + align: meta.align, outline: meta.outline, palette, + paperDim: meta['paper-dim'].split(/\s+/).filter(Boolean), body: lines.join('\n'), + }; +} + +function toScreenSource(d) { + const head = [`# title: ${d.title}`, `# background: ${d.background}`, `# foreground: ${d.foreground}`]; + if (d.paperDim.length) head.push(`# paper-dim: ${d.paperDim.join(' ')}`); + for (const [name, hex] of Object.entries(d.palette)) head.push(`# color ${name}: ${hex}`); + if (d.align !== 'top-left') head.push(`# align: ${d.align}`); + if (d.outline !== 'none') head.push(`# outline: ${d.outline}`); + return `${head.join('\n')}\n${d.body}\n`; +} + +function runs(line, d) { + const out = []; + let colour = d.foreground; + let pos = 0; + for (const m of line.matchAll(MARKUP)) { + if (m.index > pos) out.push([line.slice(pos, m.index), colour]); + colour = m[1] === '/' ? d.foreground : (d.palette[m[1]] ?? d.foreground); + pos = m.index + m[0].length; + } + if (pos < line.length) out.push([line.slice(pos), colour]); + return out; +} + +// ------------------------------------------------------------ colour + +function luminance(hex) { + const c = [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16) / 255) + .map((v) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4)); + return 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2]; +} + +function contrast(a, b) { + const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x); + return (hi + 0.05) / (lo + 0.05); +} + +function lowContrastColours(d) { + const used = new Set([d.foreground, ...Object.values(d.palette)]); + return [...used].filter((hex) => contrast(hex, d.background) < MIN_CONTRAST); +} + +// ------------------------------------------------------------ drawing + +function drawInsert(ctx, preset, scale, { mask = false } = {}) { + const [w, h] = preset.insert; + const [wx, wy, ww, wh] = preset.window; + const d = state.design; + const mm = (v) => v * scale; + ctx.save(); + ctx.fillStyle = state.paper ? '#ffffff' : d.background; + ctx.fillRect(0, 0, mm(w), mm(h)); + + if (state.source === 'image' && state.image) { + const bleed = preset.slack / 2; + const rx = Math.max(0, wx - bleed); + const ry = Math.max(0, wy - bleed); + const rw = Math.min(w, wx + ww + bleed) - rx; + const rh = Math.min(h, wy + wh + bleed) - ry; + const img = state.image; + const s = Math.max(mm(rw) / img.naturalWidth, mm(rh) / img.naturalHeight) * state.zoom; + const dw = img.naturalWidth * s; + const dh = img.naturalHeight * s; + ctx.beginPath(); + ctx.rect(mm(rx), mm(ry), mm(rw), mm(rh)); + ctx.clip(); + if (state.paper) ctx.filter = 'grayscale(1)'; + ctx.drawImage(img, mm(rx) + (mm(rw) - dw) * state.panX, mm(ry) + (mm(rh) - dh) * state.panY, dw, dh); + ctx.filter = 'none'; + } else if (state.source === 'text') { + const lines = d.body.split('\n').map((l) => runs(l, d)); + const cols = Math.max(1, ...lines.map((r) => r.reduce((n, [t]) => n + t.length, 0))); + const pad = TEXT_PAD + preset.slack / 2; + let ax = wx + pad; + let ay = wy + pad; + const aw = ww - 2 * pad; + const ah = wh - 2 * pad; + ctx.font = '100px "IBM Plex Mono", monospace'; + const charW = ctx.measureText('M').width / 100; + const size = Math.min(aw / (cols * charW), ah / (Math.max(1, lines.length) * LINE_H)); + if (d.align === 'center') { + ax += (aw - cols * charW * size) / 2; + ay += (ah - lines.length * LINE_H * size) / 2; + } + // Draw at 100px and scale down: at small sizes the browser rounds glyph + // advances, which made long lines overrun the window. + ctx.font = '100px "IBM Plex Mono", monospace'; + ctx.textBaseline = 'alphabetic'; + const k = mm(size) / 100; + const dim = new Set(d.paperDim.map((n) => d.palette[n])); + lines.forEach((r, i) => { + let cx = ax; + const base = ay + (i + 0.8) * LINE_H * size; + for (const [text, colour] of r) { + ctx.fillStyle = state.paper ? (dim.has(colour) ? PAPER_DIM : '#000000') : colour; + ctx.save(); + ctx.translate(mm(cx), mm(base)); + ctx.scale(k, k); + ctx.fillText(text, 0, 0); + ctx.restore(); + cx += text.length * charW * size; + } + }); + } + + if (d.outline === 'window' && state.source === 'text') { + ctx.setLineDash([mm(0.8), mm(0.8)]); + ctx.strokeStyle = '#737373'; + ctx.lineWidth = mm(0.15); + ctx.strokeRect(mm(wx), mm(wy), mm(ww), mm(wh)); + ctx.setLineDash([]); + } + if (mask) { + ctx.fillStyle = 'rgba(17, 17, 17, 0.6)'; + ctx.beginPath(); + ctx.rect(0, 0, mm(w), mm(h)); + ctx.rect(mm(wx), mm(wy), mm(ww), mm(wh)); + ctx.fill('evenodd'); + } + ctx.restore(); +} + +function renderPreview() { + const preset = state.preset; + if (!preset || !state.design) return; + const canvas = $('scr-preview'); + const cssW = canvas.parentElement.clientWidth; + const scale = (cssW / preset.insert[0]) * (window.devicePixelRatio || 1); + canvas.width = Math.round(preset.insert[0] * scale); + canvas.height = Math.round(preset.insert[1] * scale); + canvas.style.aspectRatio = `${preset.insert[0]} / ${preset.insert[1]}`; + drawInsert(canvas.getContext('2d'), preset, scale, { mask: state.mask }); + + const status = $('scr-status'); + const weak = state.source === 'text' && !state.paper ? lowContrastColours(state.design) : []; + if (state.source === 'image' && !state.image) { + status.textContent = 'No image yet. Pick a file or drop one on the preview.'; + status.className = 'status-message'; + } else if (weak.length) { + status.textContent = `Low contrast: ${weak.join(', ')} may vanish on a black-only printer.`; + status.className = 'status-message is-err'; + } else { + status.textContent = 'Ready. Preview matches the printed insert.'; + status.className = 'status-message is-ok'; + } + $('scr-download').disabled = state.source === 'image' && !state.image; + $('scr-copy').disabled = state.source !== 'text'; +} + +// ------------------------------------------------------------ PDF + +const enc = new TextEncoder(); +const num = (v) => (Math.round(v * 1000) / 1000).toString(); +const pdfStr = (s) => `(${s.replace(/[^\x20-\x7e]/g, '?').replace(/([\\()])/g, '\\$1')})`; + +class Ops { + constructor() { this.ops = [`${num(72 / 25.4)} 0 0 ${num(-72 / 25.4)} 0 ${num(A4[1] * 72 / 25.4)} cm`]; } + push(s) { this.ops.push(s); } + rgb(c, stroke) { this.push(`${c.map(num).join(' ')} ${stroke ? 'RG' : 'rg'}`); } + line(x0, y0, x1, y1, w) { this.rgb([0, 0, 0], true); this.push(`${num(w)} w ${num(x0)} ${num(y0)} m ${num(x1)} ${num(y1)} l S`); } + rect(x, y, w, h, colour, width) { this.rgb(colour, true); this.push(`${num(width)} w ${num(x)} ${num(y)} ${num(w)} ${num(h)} re S`); } + text(x, y, s, size, font = 'F1', colour = [0, 0, 0]) { + this.rgb(colour); + this.push(`BT /${font} ${num(size)} Tf 1 0 0 -1 ${num(x)} ${num(y)} Tm ${pdfStr(s)} Tj ET`); + } + image(x, y, w, h) { this.push(`q ${num(w)} 0 0 ${num(-h)} ${num(x)} ${num(y + h)} cm /Im0 Do Q`); } +} + +function sheetOps(preset, title) { + const [w, h] = preset.insert; + const [wx, wy, ww, wh] = preset.window; + const grey = [0.45, 0.45, 0.45]; + const o = new Ops(); + let y = MARGIN + 6; + o.text(MARGIN, y, 'Tiny Engineer - laptop screen inserts', 6, 'F2'); + y += 7.5; + o.text(MARGIN, y, `Servo preset: ${preset.name} (${preset.id})`, 4.6, 'F2'); + y += 6; + o.text(MARGIN, y, `Insert ${w.toFixed(1)} x ${h.toFixed(1)} mm (cut on the grey line). Visible window ${ww.toFixed(1)} x ${wh.toFixed(1)} mm, ${wx.toFixed(1)} mm from the left and ${wy.toFixed(1)} mm from the top edge.`, 2.8); + y += 4.2; + o.text(MARGIN, y, 'Slide the paper insert, then a same-size piece of clear PET, into the lid pocket in front of LaptopScreen.', 2.8); + y += 4; + o.rect(MARGIN, y, 10, 10, [0, 0, 0], 0.2); + o.text(MARGIN + 1.2, y + 5.8, '10 mm', 2.4, 'F1', grey); + const rx = MARGIN + 16; + o.line(rx, y + 10, rx + 50, y + 10, 0.2); + for (let i = 0; i <= 50; i++) { + const tick = i % 10 === 0 ? 3 : i % 5 === 0 ? 2 : 1.2; + o.line(rx + i, y + 10, rx + i, y + 10 - tick, 0.12); + if (i % 10 === 0) o.text(rx + i - 0.8, y + 5.6, String(i), 2.2, 'F1', grey); + } + o.text(rx + 53, y + 4.4, 'Square must measure 10 x 10 mm and the ruler 50 mm.', 2.6); + o.text(rx + 53, y + 8.6, 'If not, reprint at 100% / Actual size (scaling off).', 2.6); + y += 16; + + const cols = Math.max(1, Math.floor((A4[0] - 2 * MARGIN + GAP_X) / (w + GAP_X))); + const rows = Math.max(1, Math.floor((A4[1] - MARGIN - y) / (h + LABEL_H + 2))); + const x0 = (A4[0] - (cols * w + (cols - 1) * GAP_X)) / 2; + for (let i = 0; i < cols * rows; i++) { + const ix = x0 + (i % cols) * (w + GAP_X); + const iy = y + Math.floor(i / cols) * (h + LABEL_H + 2); + o.image(ix, iy, w, h); + o.rect(ix, iy, w, h, [0.6, 0.6, 0.6], 0.1); + o.text(ix, iy + h + 2.8, `${preset.id} - ${title}`, 2.4, 'F1', grey); + } + return o.ops.join('\n'); +} + +async function buildPdf() { + const preset = state.preset; + const canvas = document.createElement('canvas'); + canvas.width = Math.round(preset.insert[0] * PX_PER_MM); + canvas.height = Math.round(preset.insert[1] * PX_PER_MM); + drawInsert(canvas.getContext('2d'), preset, PX_PER_MM); + const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/jpeg', 0.95)); + const jpeg = new Uint8Array(await blob.arrayBuffer()); + const content = enc.encode(sheetOps(preset, $('scr-title').value.trim() || 'Custom')); + const page = `${num(A4[0] * 72 / 25.4)} ${num(A4[1] * 72 / 25.4)}`; + + const objs = [ + enc.encode('<< /Type /Catalog /Pages 2 0 R /ViewerPreferences << /PrintScaling /None >> >>'), + enc.encode('<< /Type /Pages /Kids [3 0 R] /Count 1 >>'), + enc.encode(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${page}] /Resources << /Font << /F1 5 0 R /F2 6 0 R >> /XObject << /Im0 7 0 R >> >> /Contents 4 0 R >>`), + [enc.encode(`<< /Length ${content.length} >>\nstream\n`), content, enc.encode('\nendstream')], + enc.encode('<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>'), + enc.encode('<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>'), + [enc.encode(`<< /Type /XObject /Subtype /Image /Width ${canvas.width} /Height ${canvas.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${jpeg.length} >>\nstream\n`), jpeg, enc.encode('\nendstream')], + ]; + const parts = [enc.encode('%PDF-1.4\n%\xe2\xe3\xcf\xd3\n')]; + let size = parts[0].length; + const offsets = []; + objs.forEach((body, i) => { + offsets.push(size); + for (const chunk of [enc.encode(`${i + 1} 0 obj\n`), ...[body].flat(), enc.encode('\nendobj\n')]) { + parts.push(chunk); + size += chunk.length; + } + }); + const xref = [`xref\n0 ${objs.length + 1}\n0000000000 65535 f \n`, ...offsets.map((o) => `${String(o).padStart(10, '0')} 00000 n \n`)].join(''); + parts.push(enc.encode(`${xref}trailer\n<< /Size ${objs.length + 1} /Root 1 0 R >>\nstartxref\n${size}\n%%EOF\n`)); + return new Blob(parts, { type: 'application/pdf' }); +} + +// ------------------------------------------------------------ UI + +function setDesign(d) { + state.design = structuredClone(d); + $('scr-body').value = d.body; + $('scr-title').value = d.title; + const box = $('scr-colours'); + box.replaceChildren(); + const swatch = (label, value, onInput) => { + const id = `scr-colour-${label.replace(/\W/g, '-')}`; + const wrap = document.createElement('label'); + wrap.className = 'swatch'; + wrap.htmlFor = id; + const input = Object.assign(document.createElement('input'), { type: 'color', id, value }); + input.addEventListener('input', () => { onInput(input.value); renderPreview(); }); + const name = Object.assign(document.createElement('span'), { className: 'mono', textContent: label }); + wrap.append(input, name); + box.append(wrap); + }; + swatch('background', d.background, (v) => { state.design.background = v; }); + swatch('text', d.foreground, (v) => { state.design.foreground = v; }); + for (const name of Object.keys(d.palette)) swatch(`{${name}}`, d.palette[name], (v) => { state.design.palette[name] = v; }); + renderPreview(); +} + +function loadImage(file) { + if (!file || !file.type.startsWith('image/')) return; + const img = new Image(); + img.onload = () => { state.image = img; renderPreview(); }; + img.src = URL.createObjectURL(file); +} + +function setSource(source) { + state.source = source; + $('scr-text-fields').hidden = source !== 'text'; + $('scr-image-fields').hidden = source !== 'image'; + if (source === 'image' && $('scr-title').value === state.design.title) $('scr-title').value = 'Custom'; + renderPreview(); +} + +function bind() { + $('scr-preset').addEventListener('change', (e) => { + state.preset = state.presets.find((p) => p.id === e.target.value); + const [w, h] = state.preset.insert; + const [, , ww, wh] = state.preset.window; + $('scr-insert-size').textContent = `${w.toFixed(1)} × ${h.toFixed(1)} mm`; + $('scr-window-size').textContent = `${ww.toFixed(1)} × ${wh.toFixed(1)} mm`; + renderPreview(); + }); + $('scr-template').addEventListener('change', (e) => setDesign(state.designs[Number(e.target.value)])); + $('scr-body').addEventListener('input', (e) => { state.design.body = e.target.value; renderPreview(); }); + document.querySelectorAll('input[name="scr-source"]').forEach((r) => r.addEventListener('change', () => setSource(r.value))); + $('scr-image').addEventListener('change', (e) => loadImage(e.target.files[0])); + const drop = $('scr-drop'); + drop.addEventListener('dragover', (e) => { e.preventDefault(); drop.classList.add('is-over'); }); + drop.addEventListener('dragleave', () => drop.classList.remove('is-over')); + drop.addEventListener('drop', (e) => { + e.preventDefault(); + drop.classList.remove('is-over'); + $('scr-source-image').checked = true; + setSource('image'); + loadImage(e.dataTransfer.files[0]); + }); + $('scr-zoom').addEventListener('input', (e) => { + state.zoom = Number(e.target.value) / 100; + $('scr-zoom-val').textContent = `${e.target.value}%`; + renderPreview(); + }); + $('scr-pan-x').addEventListener('input', (e) => { state.panX = Number(e.target.value) / 100; renderPreview(); }); + $('scr-pan-y').addEventListener('input', (e) => { state.panY = Number(e.target.value) / 100; renderPreview(); }); + $('scr-paper').addEventListener('change', (e) => { state.paper = e.target.checked; renderPreview(); }); + $('scr-mask').addEventListener('change', (e) => { state.mask = e.target.checked; renderPreview(); }); + $('scr-title').addEventListener('input', () => { state.design.title = $('scr-title').value; }); + $('scr-download').addEventListener('click', async () => { + const button = $('scr-download'); + button.disabled = true; + try { + const url = URL.createObjectURL(await buildPdf()); + const a = Object.assign(document.createElement('a'), { href: url, download: `tiny-engineer-screen-${state.preset.id}.pdf` }); + a.click(); + setTimeout(() => URL.revokeObjectURL(url), 10000); + $('scr-status').textContent = 'PDF downloaded. Print at 100% and check the 10 mm square.'; + $('scr-status').className = 'status-message is-ok'; + } catch (err) { + $('scr-status').textContent = `Could not build the PDF: ${err.message}`; + $('scr-status').className = 'status-message is-err'; + } finally { + button.disabled = false; + } + }); + $('scr-copy').addEventListener('click', async () => { + const text = toScreenSource({ ...state.design, title: $('scr-title').value.trim() || 'Custom' }); + try { + await navigator.clipboard.writeText(text); + $('scr-status').textContent = 'Copied. Save it as 3d_models/laptop_screens/screens/.screen to add it to the stock sheet.'; + $('scr-status').className = 'status-message is-ok'; + } catch { + $('scr-body').select(); + $('scr-status').textContent = 'Clipboard blocked. Copy the text field by hand.'; + $('scr-status').className = 'status-message is-err'; + } + }); + new ResizeObserver(renderPreview).observe($('scr-drop')); +} + +async function init() { + bind(); + try { + const [presets, designs] = await Promise.all(['presets.json', 'designs.json'].map(async (f) => { + const res = await fetch(f); + if (!res.ok) throw new Error(`${f}: HTTP ${res.status}`); + return res.json(); + })); + state.presets = presets; + state.designs = designs.map((d) => parseScreen(d.source)); + } catch (err) { + $('scr-status').textContent = `Could not load sizes (${err.message}). Reload to try again.`; + $('scr-status').className = 'status-message is-err'; + return; + } + const preset = $('scr-preset'); + preset.replaceChildren(...state.presets.map((p) => new Option(`${p.name} (${p.id})`, p.id))); + preset.disabled = false; + $('scr-template').replaceChildren(...state.designs.map((d, i) => new Option(d.title, String(i)))); + await document.fonts.load('10px "IBM Plex Mono"').catch(() => {}); + setDesign(state.designs[0]); + preset.dispatchEvent(new Event('change')); +} + +init(); diff --git a/web/screens/designs.json b/web/screens/designs.json new file mode 100644 index 00000000..216db213 --- /dev/null +++ b/web/screens/designs.json @@ -0,0 +1,34 @@ +[ + { + "file": "01-build.screen", + "source": "# title: Build output\n# background: #0d1117\n# foreground: #c9d1d9\n# paper-dim: dim\n# color dim: #6e7681\n# color ok: #3fb950\n# color cmd: #79c0ff\n# color warn: #d29922\n{cmd}~/tiny-engineer${/} pio run\n{dim}Processing esp32-c3-devkitm-1 (espressif32){/}\n{dim}-------------------------------------------{/}\nCompiling .pio/build/src/anim/poses.cpp.o\nCompiling .pio/build/src/http/routes.cpp.o\nCompiling .pio/build/src/servos/park.cpp.o\nLinking .pio/build/firmware.elf\n{warn}Checking size .pio/build/firmware.elf{/}\nRAM: [== ] 17.4% (57012 bytes)\nFlash: [===== ] 52.1% (1023890 bytes)\nBuilding .pio/build/firmware.bin\n{ok}========== [SUCCESS] Took 12.84 seconds =========={/}\n{cmd}~/tiny-engineer${/} _\n" + }, + { + "file": "02-code.screen", + "source": "# title: Source code\n# background: #1e1e1e\n# foreground: #d4d4d4\n# paper-dim: num cm\n# color num: #858585\n# color kw: #569cd6\n# color ty: #4ec9b0\n# color fn: #dcdcaa\n# color str: #ce9178\n# color cm: #6a9955\n{num} 1{/} {cm}// wave hello, then get back to work{/}\n{num} 2{/} {kw}void{/} {fn}greet{/}({ty}Robot{/} &bot) {\n{num} 3{/} {kw}for{/} ({kw}int{/} i = {num}0{/}; i < {num}3{/}; i++) {\n{num} 4{/} bot.{fn}arm{/}({ty}Side{/}::Right, {num}0.8f{/});\n{num} 5{/} {fn}delay{/}({num}180{/});\n{num} 6{/} bot.{fn}arm{/}({ty}Side{/}::Right, {num}-0.2f{/});\n{num} 7{/} {fn}delay{/}({num}180{/});\n{num} 8{/} }\n{num} 9{/} bot.{fn}say{/}({str}\"Hello, world!\"{/});\n{num}10{/} bot.{fn}pose{/}({str}\"typing\"{/});\n{num}11{/} }\n{num}12{/}\n" + }, + { + "file": "03-agent.screen", + "source": "# title: AI agent chat\n# background: #191919\n# foreground: #e6e6e6\n# paper-dim: dim\n# color you: #8ab4f8\n# color bot: #f0a868\n# color dim: #8a8a8a\n# color ok: #81c995\n{you}> fix the failing servo test{/}\n\n{bot}*{/} Reading test/servos/test_park.cpp\n{bot}*{/} The test expects the elbow to park at\n 0.0, but the default is now -0.1.\n{bot}*{/} Updating the expected value...\n{dim} - TEST_ASSERT_EQUAL_FLOAT(0.0f, pose);{/}\n{ok} + TEST_ASSERT_EQUAL_FLOAT(-0.1f, pose);{/}\n{bot}*{/} Ran pio test -e native: {ok}42 passed{/}\n\n{you}> {/}_\n" + }, + { + "file": "04-panic.screen", + "source": "# title: Crash / stack trace\n# background: #0a0a0a\n# foreground: #d0d0d0\n# paper-dim: dim\n# color err: #ff5f56\n# color dim: #7a7a7a\n# color hi: #ffbd2e\n{err}Guru Meditation Error: Core 0 panic'ed{/}\n{err}(Load access fault). Exception was unhandled.{/}\n\n{dim}Core 0 register dump:{/}\nMEPC : {hi}0x42008a3e{/} RA : 0x42008a1c\nSP : 0x3fc9b2f0 GP : 0x3fc8e400\nMTVAL : {hi}0x00000000{/} <- null pointer\n\n{dim}Backtrace:{/}\n 0x42008a3e in Coffee::refill() at mug.cpp:42\n 0x42004f10 in Engineer::morning() at day.cpp:7\n 0x42003c88 in loop() at main.cpp:118\n\n{err}Rebooting...{/}\n" + }, + { + "file": "05-retro.screen", + "source": "# title: Retro computer\n# background: #08260f\n# foreground: #39ff6a\n# paper-dim: dim\n# color dim: #1f9a40\n{dim}**** TINY ENGINEER BASIC V2 ****{/}\n{dim} 64K RAM SYSTEM 38911 BASIC BYTES FREE{/}\n\nREADY.\n10 PRINT \"HELLO, HUMAN\"\n20 GOTO 10\nRUN\nHELLO, HUMAN\nHELLO, HUMAN\nHELLO, HUMAN\nHELLO, HUMAN\nBREAK IN 10\nREADY.\n_\n" + }, + { + "file": "06-eliza.screen", + "source": "# title: ELIZA-style chat\n# background: #f2efe4\n# foreground: #1d1d1d\n# paper-dim: you\n# color you: #6b4f2a\nHOW DO YOU DO. PLEASE STATE YOUR PROBLEM.\n{you}> My robot keeps waving at me.{/}\nWHY DO YOU SAY YOUR ROBOT KEEPS WAVING\nAT YOU?\n{you}> Maybe it wants a coffee.{/}\nYOU DON'T SEEM QUITE CERTAIN.\n{you}> I am never certain before coffee.{/}\nHOW LONG HAVE YOU BEEN NEVER CERTAIN\nBEFORE COFFEE?\n{you}> Since I started writing firmware.{/}\nTELL ME MORE ABOUT WRITING FIRMWARE.\n{you}> {/}_\n" + }, + { + "file": "07-splash.screen", + "source": "# title: Tiny Engineer splash\n# background: #12100e\n# foreground: #e8a15a\n# paper-dim: dim\n# color dim: #8c6a48\n# align: center\n .-----.\n | o o |\n | - |\n '--+--'\n /| |\\\n |___|\n\n TINY ENGINEER\n{dim} booting desk robot...{/}\n{dim} [##########--------]{/}\n" + }, + { + "file": "08-blank.screen", + "source": "# title: Blank template\n# background: #ffffff\n# foreground: #1a1a1a\n# paper-dim: hint\n# color hint: #8a8a8a\n# align: center\n# outline: window\n{hint}draw or glue your screen inside{/}\n{hint}the dashed line (visible area){/}\n" + } +] diff --git a/web/screens/index.html b/web/screens/index.html new file mode 100644 index 00000000..5d49b6da --- /dev/null +++ b/web/screens/index.html @@ -0,0 +1,137 @@ + + + + + + Laptop screens · Tiny Engineer + + + + + + + + +
+ + +
+
+

Printable · LaptopScreen insert

+

Laptop screens

+

+ Type a screen or drop in a screenshot. You get an A4 PDF of inserts cut to your servo preset’s laptop. +

+
+ +
+
+

Screen

+
+
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ + +

Monospaced, sized to fill the window. {name}…{/} switches to a colour below.

+
+
+ Colours +
+
+
+ + + + +
+ + +
+
+
+ +
+

Preview · actual proportions

+
+
+ +
+
+
Insert
…
+
Visible
…
+
+ +

Loading sizes…

+
+ + +
+
+
+

+ Print at 100% / Actual size. Browser print dialogs often shrink to fit. + The 10 mm square on the sheet tells you if it did. Cut on the grey line, add a same-size piece of clear PET in front, + and slide both into the lid with LaptopScreen behind them. +

+
+
+
+
+ +
+

Ship it to the screen. The screen is paper.

+
+
+ + diff --git a/web/screens/presets.json b/web/screens/presets.json new file mode 100644 index 00000000..a95a9e06 --- /dev/null +++ b/web/screens/presets.json @@ -0,0 +1,62 @@ +[ + { + "id": "sg90", + "name": "Tower Pro SG90", + "insert": [ + 45.64, + 34.4 + ], + "window": [ + 0.2, + 1.7, + 45.24, + 25.92 + ], + "slack": 1.2 + }, + { + "id": "fs0307", + "name": "Feetech FS0307", + "insert": [ + 33.8, + 26.02 + ], + "window": [ + 0.2, + 1.7, + 33.4, + 17.53 + ], + "slack": 1.2 + }, + { + "id": "es9051", + "name": "EMAX ES9051", + "insert": [ + 37.16, + 28.4 + ], + "window": [ + 0.2, + 1.7, + 36.76, + 19.91 + ], + "slack": 1.2 + }, + { + "id": "hd1370a", + "name": "PowerHD HD-1370A", + "insert": [ + 32.68, + 25.22 + ], + "window": [ + 0.2, + 1.7, + 32.28, + 16.74 + ], + "slack": 1.2 + } +] From aa182f0231abcf56c1d336907c3a4ccead4ed668 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:17:50 -0400 Subject: [PATCH 04/16] feat(docs): choose printer and paper up front in the screen generator Replaces the no-background checkbox with a three-way choice right after the servo preset: colour printer on white, black-only printer on white (preview and PDF in greyscale), or coloured paper (no background, black text). Co-Authored-By: Claude Opus 5.5 --- web/css/base.css | 48 ++++++++++++++++++++++++++++++++++++++++++ web/js/screens.js | 33 ++++++++++++++++++++++------- web/screens/index.html | 20 ++++++++++++++---- 3 files changed, 89 insertions(+), 12 deletions(-) diff --git a/web/css/base.css b/web/css/base.css index b05b157a..83d4ce1e 100644 --- a/web/css/base.css +++ b/web/css/base.css @@ -696,6 +696,54 @@ esp-web-install-button .button, font-size: 0.8rem; } +.choices { + margin: 0; + padding: 0; + border: none; +} + +.choices legend { + padding: 0; + margin-bottom: 0.4rem; +} + +.choice { + display: flex; + align-items: flex-start; + gap: 0.6rem; + padding: 0.55rem 0.75rem; + border: 1px solid var(--border-strong); + border-radius: var(--radius); + background: var(--raised); + cursor: pointer; + transition: border-color var(--dur) ease; +} + +.choice + .choice { + margin-top: 0.4rem; +} + +.choice:has(input:checked) { + border-color: var(--accent); + background: var(--accent-dim); +} + +.choice input { + margin-top: 0.25rem; + accent-color: var(--accent); +} + +.choice strong { + display: block; + font-size: 0.9rem; + font-weight: 600; +} + +.choice input:focus-visible { + outline: 1px solid var(--accent); + outline-offset: 1px; +} + .seg { display: inline-flex; align-self: flex-start; diff --git a/web/js/screens.js b/web/js/screens.js index 568a64e4..06caaa0a 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -17,7 +17,7 @@ const MARKUP = /\{([a-z][a-z0-9_-]*|\/)\}/g; const $ = (id) => document.getElementById(id); const state = { presets: [], designs: [], preset: null, source: 'text', design: null, - image: null, zoom: 1, panX: 0.5, panY: 0.5, paper: false, mask: true, + image: null, zoom: 1, panX: 0.5, panY: 0.5, print: 'colour', mask: true, }; // ------------------------------------------------------------ .screen format @@ -85,13 +85,26 @@ function lowContrastColours(d) { // ------------------------------------------------------------ drawing +// What a black-only printer does to the page. Done on pixels rather than with +// ctx.filter, which Safari ignores. +function greyscale(ctx, w, h) { + const img = ctx.getImageData(0, 0, w, h); + const px = img.data; + for (let i = 0; i < px.length; i += 4) { + const y = 0.2126 * px[i] + 0.7152 * px[i + 1] + 0.0722 * px[i + 2]; + px[i] = px[i + 1] = px[i + 2] = y; + } + ctx.putImageData(img, 0, 0); +} + function drawInsert(ctx, preset, scale, { mask = false } = {}) { const [w, h] = preset.insert; const [wx, wy, ww, wh] = preset.window; const d = state.design; const mm = (v) => v * scale; + const paper = state.print === 'paper'; ctx.save(); - ctx.fillStyle = state.paper ? '#ffffff' : d.background; + ctx.fillStyle = paper ? '#ffffff' : d.background; ctx.fillRect(0, 0, mm(w), mm(h)); if (state.source === 'image' && state.image) { @@ -107,9 +120,7 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { ctx.beginPath(); ctx.rect(mm(rx), mm(ry), mm(rw), mm(rh)); ctx.clip(); - if (state.paper) ctx.filter = 'grayscale(1)'; ctx.drawImage(img, mm(rx) + (mm(rw) - dw) * state.panX, mm(ry) + (mm(rh) - dh) * state.panY, dw, dh); - ctx.filter = 'none'; } else if (state.source === 'text') { const lines = d.body.split('\n').map((l) => runs(l, d)); const cols = Math.max(1, ...lines.map((r) => r.reduce((n, [t]) => n + t.length, 0))); @@ -135,7 +146,7 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { let cx = ax; const base = ay + (i + 0.8) * LINE_H * size; for (const [text, colour] of r) { - ctx.fillStyle = state.paper ? (dim.has(colour) ? PAPER_DIM : '#000000') : colour; + ctx.fillStyle = paper ? (dim.has(colour) ? PAPER_DIM : '#000000') : colour; ctx.save(); ctx.translate(mm(cx), mm(base)); ctx.scale(k, k); @@ -153,6 +164,9 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { ctx.strokeRect(mm(wx), mm(wy), mm(ww), mm(wh)); ctx.setLineDash([]); } + ctx.restore(); + if (state.print !== 'colour') greyscale(ctx, Math.round(mm(w)), Math.round(mm(h))); + ctx.save(); if (mask) { ctx.fillStyle = 'rgba(17, 17, 17, 0.6)'; ctx.beginPath(); @@ -172,10 +186,10 @@ function renderPreview() { canvas.width = Math.round(preset.insert[0] * scale); canvas.height = Math.round(preset.insert[1] * scale); canvas.style.aspectRatio = `${preset.insert[0]} / ${preset.insert[1]}`; - drawInsert(canvas.getContext('2d'), preset, scale, { mask: state.mask }); + drawInsert(canvas.getContext('2d', { willReadFrequently: true }), preset, scale, { mask: state.mask }); const status = $('scr-status'); - const weak = state.source === 'text' && !state.paper ? lowContrastColours(state.design) : []; + const weak = state.source === 'text' && state.print !== 'paper' ? lowContrastColours(state.design) : []; if (state.source === 'image' && !state.image) { status.textContent = 'No image yet. Pick a file or drop one on the preview.'; status.className = 'status-message'; @@ -354,7 +368,10 @@ function bind() { }); $('scr-pan-x').addEventListener('input', (e) => { state.panX = Number(e.target.value) / 100; renderPreview(); }); $('scr-pan-y').addEventListener('input', (e) => { state.panY = Number(e.target.value) / 100; renderPreview(); }); - $('scr-paper').addEventListener('change', (e) => { state.paper = e.target.checked; renderPreview(); }); + document.querySelectorAll('input[name="scr-print"]').forEach((r) => r.addEventListener('change', () => { + state.print = r.value; + renderPreview(); + })); $('scr-mask').addEventListener('change', (e) => { state.mask = e.target.checked; renderPreview(); }); $('scr-title').addEventListener('input', () => { state.design.title = $('scr-title').value; }); $('scr-download').addEventListener('click', async () => { diff --git a/web/screens/index.html b/web/screens/index.html index 5d49b6da..4fccca36 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -46,6 +46,22 @@

Laptop screens

+
+ Printing on + + + +
+
@@ -87,10 +103,6 @@

Laptop screens

-
From 323662271c11b823fbd203d22c49cf4f52eecc46 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:20:38 -0400 Subject: [PATCH 05/16] feat(cad): add colour-on-coloured-paper option to laptop screen inserts New print mode: no background, each text colour keeps its hue but is darkened (linear-RGB scaling) until it reads on pale coloured paper. Adds a third PDF page per preset and a fourth choice in the generator, with a paper-colour picker that previews the ink multiplying through. Co-Authored-By: Claude Opus 5.5 --- 3d_models/laptop_screens/README.md | 11 ++--- 3d_models/laptop_screens/laptop-screens.pdf | Bin 57515 -> 86047 bytes scripts/laptop_screens.py | 31 +++++++++++++- web/css/base.css | 11 +++++ web/js/screens.js | 44 +++++++++++++++++--- web/screens/index.html | 10 ++++- 6 files changed, 95 insertions(+), 12 deletions(-) diff --git a/3d_models/laptop_screens/README.md b/3d_models/laptop_screens/README.md index bedd6fe4..96358f14 100644 --- a/3d_models/laptop_screens/README.md +++ b/3d_models/laptop_screens/README.md @@ -2,23 +2,24 @@ Paper inserts that turn the plain black `LaptopScreen` into a terminal, an IDE, an agent chat, a crash dump, a retro computer, an ELIZA-style chat or a Tiny Engineer splash. No electronics: print, cut, slide into the lid. Inspired by a [community build](https://github.com/jamro/tiny-engineer/discussions/13#discussioncomment-18741594) that used a printed ELIZA screenshot behind clear PET. -**Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, two pages per servo preset with the same designs: +**Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, three pages per servo preset with the same designs: - **Colour screens** — each design on its own dark (or light) background. +- **Colour on coloured paper** — no background; each colour keeps its hue but is darkened so it reads on pale paper. - **Paper screens** — no background, black and grey text only, so the paper colour becomes the screen colour. | Your printer and paper | Print | | --- | --- | | Colour printer, white paper | Colour screens | | Black-only printer, white paper | Colour screens (prints as greyscale; heavy on toner) or Paper screens | -| Colour printer, coloured paper | Paper screens (Colour screens also work, but their dark fill hides the paper) | +| Colour printer, coloured paper | Colour on coloured paper | | Black-only printer, coloured paper | Paper screens | -Green paper gives an old-LCD look; any pale colour works. Printers cannot print white, so dark paper (black, navy) will not show the text. +Green paper gives an old-LCD look; any pale colour works. Ink is translucent, so printed colours mix with the paper (blue on yellow turns greenish). Printers cannot print white, so dark paper (black, navy) will not show the text. ## Print, cut, install -1. Open the PDF and print **one page for your servo preset** (`sg90`, `fs0307`, `es9051` or `hd1370a` — the same folder you printed from [`parts/`](../parts/)), picking Colour or Paper screens from the table above. Each insert is labelled with its preset. +1. Open the PDF and print **one page for your servo preset** (`sg90`, `fs0307`, `es9051` or `hd1370a` — the same folder you printed from [`parts/`](../parts/)), picking the page from the table above. Each insert is labelled with its preset. 2. Print at **100% / Actual size**. Turn off "Fit to page" / "Shrink to printable area". 3. Check the scale: the square at the top must measure **10 × 10 mm** and the ruler **50 mm**. If not, fix the print settings and reprint — a scaled insert will not fit the pocket. 4. Cut along the thin grey outline. Snip the four corners slightly: the pocket has rounded corners. @@ -71,7 +72,7 @@ $ pio run | `color ` | Named colour for `{name}…{/}` spans in the text | | `align` | `top-left` (default) or `center` | | `outline` | `window` draws a dashed line around the visible area (blank template) | -| `paper-dim` | Colour names that print grey on the Paper screens page; all other text prints black | +| `paper-dim` | Colour names the design treats as secondary: grey on the Paper screens page (other text is black), and darkened less on the Colour on coloured paper page | Text lines follow the headers. `{name}` switches to a named colour, `{/}` back to the foreground. Characters must be printable in the PDF base fonts (ASCII and Latin-1 are fine). diff --git a/3d_models/laptop_screens/laptop-screens.pdf b/3d_models/laptop_screens/laptop-screens.pdf index ee72da17cf5a097f13e2dc15ea8b87760dc912eb..fecf8f178e0e4931d0952a47a3d68ece67b0713d 100644 GIT binary patch delta 28564 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 delta 577 zcmbQgfOYjj<_!^|j0Tez+GI{XB&xERL#sk)a+Ib5ROpGO@@75TG{wmcHV~n{&GQ=; z%1@pe2jV6!$eOGWud@05f*InI-`B&0sv1-_f4ra~HralGB3M=5=A+Mh6eqXsfN--W z3++_dUZ>4?Mt-v61(?{`3$l}YY`CWX^=7o?idE2e&M(a?QLvbv=)-8qXgGbg4`Vu$ zkOTJ1|Xo2r@#ef7#f&ZSfGnp z8km}6h#46gqKO%q8ylhPH8MA`K)1u#*wn-rq_-Z)Vq;@7OG`8ZjV+BW&@DE$glb08 zYhqz&itZQ_3u6Oxy{2X+X2@cOATOJmnHhmygJhtonYlTpn1#8;^mG1<(jfKvLHYS5 s3PwhtpjFWK%uCBxFakOO$g#8IDlSPZDgg(zshOp@374v>tG^o;03rUDmjD0& diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index 8f6b4f6a..4aa7c848 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -327,6 +327,28 @@ def paper_ink(rgb, meta): return PAPER_DIM if rgb in meta["paper_dim"] else PAPER_TEXT +def to_linear(c): + return c / 12.92 if c <= 0.04045 else ((c + 0.055) / 1.055) ** 2.4 + + +def to_srgb(c): + return 12.92 * c if c <= 0.0031308 else 1.055 * c ** (1 / 2.4) - 0.055 + + +def tinted_ink(rgb, meta): + """Tinted mode: keep the hue, darken until it reads on pale coloured paper. + + Scaling linear RGB keeps the colour's chromaticity, so green stays green. + Text the design treats as dim (`paper-dim`) is allowed to stay lighter. + """ + target = TINT_DIM_LUM if rgb in meta["paper_dim"] else TINT_TEXT_LUM + lum = luminance(rgb) + if lum <= target: + return rgb + k = target / lum + return tuple(round(to_srgb(to_linear(c) * k), 4) for c in rgb) + + def load_screens(): files = sorted(SCREENS_DIR.glob("*.screen")) if not files: @@ -434,12 +456,19 @@ def add(body): CHAR_W = 0.6 # Courier advance in em PAPER_TEXT = (0, 0, 0) PAPER_DIM = (0.45, 0.45, 0.45) +# Relative luminance ceilings for tinted text: ~5:1 and ~2.5:1 against a +# mid-pastel paper (luminance 0.6), so text survives yellow, blue or pink stock. +TINT_TEXT_LUM = 0.08 +TINT_DIM_LUM = 0.2 MODES = { "colour": ("Colour screens", "Colour or black-only printer on white paper. Dark fills hide the paper colour."), + "tinted": ("Colour on coloured paper", + "Colour printer, pale coloured paper: no fill, colours darkened to read on the paper."), "paper": ("Paper screens", "Any printer, any paper colour: no fill, so the paper becomes the screen."), } +INKS = {"colour": lambda rgb, meta: rgb, "tinted": tinted_ink, "paper": paper_ink} def draw_insert(page, x, y, geo, screen, mode): @@ -465,7 +494,7 @@ def draw_insert(page, x, y, geo, screen, mode): base = ay + (i + 0.8) * LINE_H * size_mm for text, rgb in runs: if text.strip(): - ink = rgb if mode == "colour" else paper_ink(rgb, meta) + ink = INKS[mode](rgb, meta) page.text(cx, base, text, size_mm, font="F1", rgb=ink) cx += len(text) * CHAR_W * size_mm page.unclip() diff --git a/web/css/base.css b/web/css/base.css index 83d4ce1e..5054b38a 100644 --- a/web/css/base.css +++ b/web/css/base.css @@ -739,6 +739,17 @@ esp-web-install-button .button, font-weight: 600; } +.paper-swatch { + display: flex; + margin-top: 0.5rem; + color: var(--muted); + line-height: 1.35; +} + +.paper-swatch input { + flex: none; +} + .choice input:focus-visible { outline: 1px solid var(--accent); outline-offset: 1px; diff --git a/web/js/screens.js b/web/js/screens.js index 06caaa0a..f37bf65e 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -7,6 +7,9 @@ const PX_PER_MM = 24; // ~610 dpi in the PDF const TEXT_PAD = 0.6; // mm inside the window, plus half the pocket slack const LINE_H = 1.2; const PAPER_DIM = '#737373'; +// Luminance ceilings for tinted text, same as scripts/laptop_screens.py. +const TINT_TEXT_LUM = 0.08; +const TINT_DIM_LUM = 0.2; const MIN_CONTRAST = 3; const A4 = [210, 297]; const MARGIN = 12; @@ -17,7 +20,7 @@ const MARKUP = /\{([a-z][a-z0-9_-]*|\/)\}/g; const $ = (id) => document.getElementById(id); const state = { presets: [], designs: [], preset: null, source: 'text', design: null, - image: null, zoom: 1, panX: 0.5, panY: 0.5, print: 'colour', mask: true, + image: null, zoom: 1, panX: 0.5, panY: 0.5, print: 'colour', paperColour: '#fff1a8', mask: true, }; // ------------------------------------------------------------ .screen format @@ -78,6 +81,27 @@ function contrast(a, b) { return (hi + 0.05) / (lo + 0.05); } +// Keep the hue, darken until it reads on pale coloured paper. Scaling linear +// RGB keeps the chromaticity, so green stays green. +function tintedInk(hex, dim) { + const target = dim ? TINT_DIM_LUM : TINT_TEXT_LUM; + const lum = luminance(hex); + if (lum <= target) return hex; + const k = target / lum; + return '#' + [1, 3, 5].map((i) => { + const v = parseInt(hex.slice(i, i + 2), 16) / 255; + const lin = (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4) * k; + const s = lin <= 0.0031308 ? 12.92 * lin : 1.055 * lin ** (1 / 2.4) - 0.055; + return Math.round(s * 255).toString(16).padStart(2, '0'); + }).join(''); +} + +function inkFor(colour, dim) { + if (state.print === 'paper') return dim ? PAPER_DIM : '#000000'; + if (state.print === 'tinted') return tintedInk(colour, dim); + return colour; +} + function lowContrastColours(d) { const used = new Set([d.foreground, ...Object.values(d.palette)]); return [...used].filter((hex) => contrast(hex, d.background) < MIN_CONTRAST); @@ -102,7 +126,7 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { const [wx, wy, ww, wh] = preset.window; const d = state.design; const mm = (v) => v * scale; - const paper = state.print === 'paper'; + const paper = state.print === 'paper' || state.print === 'tinted'; ctx.save(); ctx.fillStyle = paper ? '#ffffff' : d.background; ctx.fillRect(0, 0, mm(w), mm(h)); @@ -146,7 +170,7 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { let cx = ax; const base = ay + (i + 0.8) * LINE_H * size; for (const [text, colour] of r) { - ctx.fillStyle = paper ? (dim.has(colour) ? PAPER_DIM : '#000000') : colour; + ctx.fillStyle = inkFor(colour, dim.has(colour)); ctx.save(); ctx.translate(mm(cx), mm(base)); ctx.scale(k, k); @@ -165,8 +189,15 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { ctx.setLineDash([]); } ctx.restore(); - if (state.print !== 'colour') greyscale(ctx, Math.round(mm(w)), Math.round(mm(h))); + if (state.print === 'mono' || state.print === 'paper') greyscale(ctx, Math.round(mm(w)), Math.round(mm(h))); ctx.save(); + if (mask && paper) { + // Preview only: ink is translucent, so the paper colour multiplies through. + ctx.globalCompositeOperation = 'multiply'; + ctx.fillStyle = state.paperColour; + ctx.fillRect(0, 0, mm(w), mm(h)); + ctx.globalCompositeOperation = 'source-over'; + } if (mask) { ctx.fillStyle = 'rgba(17, 17, 17, 0.6)'; ctx.beginPath(); @@ -189,7 +220,8 @@ function renderPreview() { drawInsert(canvas.getContext('2d', { willReadFrequently: true }), preset, scale, { mask: state.mask }); const status = $('scr-status'); - const weak = state.source === 'text' && state.print !== 'paper' ? lowContrastColours(state.design) : []; + const weak = state.source === 'text' && (state.print === 'colour' || state.print === 'mono') + ? lowContrastColours(state.design) : []; if (state.source === 'image' && !state.image) { status.textContent = 'No image yet. Pick a file or drop one on the preview.'; status.className = 'status-message'; @@ -370,8 +402,10 @@ function bind() { $('scr-pan-y').addEventListener('input', (e) => { state.panY = Number(e.target.value) / 100; renderPreview(); }); document.querySelectorAll('input[name="scr-print"]').forEach((r) => r.addEventListener('change', () => { state.print = r.value; + $('scr-paper-field').hidden = r.value !== 'tinted' && r.value !== 'paper'; renderPreview(); })); + $('scr-paper-colour').addEventListener('input', (e) => { state.paperColour = e.target.value; renderPreview(); }); $('scr-mask').addEventListener('change', (e) => { state.mask = e.target.checked; renderPreview(); }); $('scr-title').addEventListener('input', () => { state.design.title = $('scr-title').value; }); $('scr-download').addEventListener('click', async () => { diff --git a/web/screens/index.html b/web/screens/index.html index 4fccca36..89ae106a 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -56,9 +56,17 @@

Laptop screens

Black-only printer, white paperGreyscale, so the preview matches the print. + + From f387915fdc0b95c6546347c286cbfe2aebe04504 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:22:53 -0400 Subject: [PATCH 06/16] feat(docs): reuse the background swatch as paper colour in the screen generator In the coloured-paper modes nothing is printed behind the text, so the background swatch becomes the (preview-only) paper colour instead of a second picker. It sits outside the text fields so image mode gets it too. Co-Authored-By: Claude Opus 5.5 --- web/js/screens.js | 25 +++++++++++++++++++++---- web/screens/index.html | 12 ++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/web/js/screens.js b/web/js/screens.js index f37bf65e..4d76f9d7 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -126,7 +126,7 @@ function drawInsert(ctx, preset, scale, { mask = false } = {}) { const [wx, wy, ww, wh] = preset.window; const d = state.design; const mm = (v) => v * scale; - const paper = state.print === 'paper' || state.print === 'tinted'; + const paper = onPaper(); ctx.save(); ctx.fillStyle = paper ? '#ffffff' : d.background; ctx.fillRect(0, 0, mm(w), mm(h)); @@ -349,12 +349,25 @@ function setDesign(d) { wrap.append(input, name); box.append(wrap); }; - swatch('background', d.background, (v) => { state.design.background = v; }); swatch('text', d.foreground, (v) => { state.design.foreground = v; }); for (const name of Object.keys(d.palette)) swatch(`{${name}}`, d.palette[name], (v) => { state.design.palette[name] = v; }); + syncBackground(); renderPreview(); } +const onPaper = () => state.print === 'tinted' || state.print === 'paper'; + +// One swatch: the design's background when it is printed, the paper colour +// (preview only) when the print mode leaves the background unprinted. +function syncBackground() { + const paper = onPaper(); + $('scr-bg-label').textContent = paper ? 'Paper colour' : 'Background'; + $('scr-bg-hint').textContent = paper + ? 'Preview only. Nothing is printed behind the text, so this shows the ink on your paper. Ink varies by printer; treat it as a guide.' + : 'Fills the insert behind your text or image.'; + $('scr-bg').value = paper ? state.paperColour : state.design.background; +} + function loadImage(file) { if (!file || !file.type.startsWith('image/')) return; const img = new Image(); @@ -402,10 +415,14 @@ function bind() { $('scr-pan-y').addEventListener('input', (e) => { state.panY = Number(e.target.value) / 100; renderPreview(); }); document.querySelectorAll('input[name="scr-print"]').forEach((r) => r.addEventListener('change', () => { state.print = r.value; - $('scr-paper-field').hidden = r.value !== 'tinted' && r.value !== 'paper'; + syncBackground(); renderPreview(); })); - $('scr-paper-colour').addEventListener('input', (e) => { state.paperColour = e.target.value; renderPreview(); }); + $('scr-bg').addEventListener('input', (e) => { + if (onPaper()) state.paperColour = e.target.value; + else state.design.background = e.target.value; + renderPreview(); + }); $('scr-mask').addEventListener('change', (e) => { state.mask = e.target.checked; renderPreview(); }); $('scr-title').addEventListener('input', () => { state.design.title = $('scr-title').value; }); $('scr-download').addEventListener('click', async () => { diff --git a/web/screens/index.html b/web/screens/index.html index 89ae106a..b1cbde54 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -64,12 +64,16 @@

Laptop screens

Black-only printer, coloured paperNo background and black text. The paper becomes the screen. - +
+ +
+ + Fills the insert behind your text or image. +
+
+
From 738913a09a5cb8b92f1aab8cdc08781565056ec7 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:25:14 -0400 Subject: [PATCH 07/16] fix(docs): show the ink that prints in the screen generator swatches Black-only on white paper: swatches show and store greys, and the background is labelled as printing grey. Colour on coloured paper: swatches show the darkened ink. Black-only on coloured paper: text swatches are hidden, since everything prints black or grey. Co-Authored-By: Claude Opus 5.5 --- web/js/screens.js | 85 +++++++++++++++++++++++++++++------------- web/screens/index.html | 1 + 2 files changed, 61 insertions(+), 25 deletions(-) diff --git a/web/js/screens.js b/web/js/screens.js index 4d76f9d7..bc5d32f0 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -336,36 +336,67 @@ function setDesign(d) { state.design = structuredClone(d); $('scr-body').value = d.body; $('scr-title').value = d.title; - const box = $('scr-colours'); - box.replaceChildren(); - const swatch = (label, value, onInput) => { - const id = `scr-colour-${label.replace(/\W/g, '-')}`; - const wrap = document.createElement('label'); - wrap.className = 'swatch'; - wrap.htmlFor = id; - const input = Object.assign(document.createElement('input'), { type: 'color', id, value }); - input.addEventListener('input', () => { onInput(input.value); renderPreview(); }); - const name = Object.assign(document.createElement('span'), { className: 'mono', textContent: label }); - wrap.append(input, name); - box.append(wrap); - }; - swatch('text', d.foreground, (v) => { state.design.foreground = v; }); - for (const name of Object.keys(d.palette)) swatch(`{${name}}`, d.palette[name], (v) => { state.design.palette[name] = v; }); - syncBackground(); + syncColours(); renderPreview(); } const onPaper = () => state.print === 'tinted' || state.print === 'paper'; +const mono = () => state.print === 'mono'; + +// A black-only printer only has greys, so in that mode every swatch shows and +// stores the grey that will print. +function toGrey(hex) { + const lin = luminance(hex); + const s = lin <= 0.0031308 ? 12.92 * lin : 1.055 * lin ** (1 / 2.4) - 0.055; + return `#${Math.round(s * 255).toString(16).padStart(2, '0').repeat(3)}`; +} + +// What the swatch shows is what prints: greys on a black-only printer, +// darkened ink on coloured paper. +const shown = (hex, dim = false) => (mono() ? toGrey(hex) : state.print === 'tinted' ? tintedInk(hex, dim) : hex); +const stored = (hex) => (mono() ? toGrey(hex) : hex); + +// Swatches follow the print mode: real colours, greys for a black-only +// printer, none at all when everything prints black. +function syncColours() { + const d = state.design; + const box = $('scr-colours'); + box.replaceChildren(); + const blackOnly = state.print === 'paper'; + box.hidden = blackOnly; + $('scr-colours-note').hidden = !blackOnly; + if (!blackOnly) { + const swatch = (label, value, dim, onInput) => { + const id = `scr-colour-${label.replace(/\W/g, '-')}`; + const wrap = document.createElement('label'); + wrap.className = 'swatch'; + wrap.htmlFor = id; + const input = Object.assign(document.createElement('input'), { type: 'color', id, value: shown(value, dim) }); + input.addEventListener('input', () => { + onInput(stored(input.value)); + input.value = shown(input.value, dim); + renderPreview(); + }); + const name = Object.assign(document.createElement('span'), { className: 'mono', textContent: label }); + wrap.append(input, name); + box.append(wrap); + }; + swatch('text', d.foreground, false, (v) => { d.foreground = v; }); + for (const name of Object.keys(d.palette)) { + swatch(`{${name}}`, d.palette[name], d.paperDim.includes(name), (v) => { d.palette[name] = v; }); + } + } -// One swatch: the design's background when it is printed, the paper colour -// (preview only) when the print mode leaves the background unprinted. -function syncBackground() { + // One background swatch: the design's background when it is printed, the + // paper colour (preview only) when the print mode leaves it unprinted. const paper = onPaper(); - $('scr-bg-label').textContent = paper ? 'Paper colour' : 'Background'; + $('scr-bg-label').textContent = paper ? 'Paper colour' : mono() ? 'Background · prints as grey' : 'Background'; $('scr-bg-hint').textContent = paper ? 'Preview only. Nothing is printed behind the text, so this shows the ink on your paper. Ink varies by printer; treat it as a guide.' - : 'Fills the insert behind your text or image.'; - $('scr-bg').value = paper ? state.paperColour : state.design.background; + : mono() + ? 'Black-only printers print shades of grey, so pick a grey. Light greys save toner.' + : 'Fills the insert behind your text or image.'; + $('scr-bg').value = paper ? state.paperColour : shown(d.background); } function loadImage(file) { @@ -415,12 +446,16 @@ function bind() { $('scr-pan-y').addEventListener('input', (e) => { state.panY = Number(e.target.value) / 100; renderPreview(); }); document.querySelectorAll('input[name="scr-print"]').forEach((r) => r.addEventListener('change', () => { state.print = r.value; - syncBackground(); + syncColours(); renderPreview(); })); $('scr-bg').addEventListener('input', (e) => { - if (onPaper()) state.paperColour = e.target.value; - else state.design.background = e.target.value; + if (onPaper()) { + state.paperColour = e.target.value; + } else { + state.design.background = stored(e.target.value); + e.target.value = shown(e.target.value); + } renderPreview(); }); $('scr-mask').addEventListener('change', (e) => { state.mask = e.target.checked; renderPreview(); }); diff --git a/web/screens/index.html b/web/screens/index.html index b1cbde54..c88352d6 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -92,6 +92,7 @@

Laptop screens

Colours
+
From 4b6ca7d637620e66ed5c4ba79c7765b7e4f1dcce Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:29:25 -0400 Subject: [PATCH 08/16] docs(docs): relabel black-text screen mode as any printer, any paper Co-Authored-By: Claude Opus 5.5 --- web/screens/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/screens/index.html b/web/screens/index.html index c88352d6..bcaf1142 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -62,7 +62,7 @@

Laptop screens

@@ -92,7 +92,7 @@

Laptop screens

Colours
- +
From 121efbb94eb17bb5850b53273c440303893a3517 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 13:31:54 -0400 Subject: [PATCH 09/16] feat(docs): pick laptop screens by printer and background, not paper colour The generator now asks two questions, Printer (colour / black only) and Background (printed / none), instead of four paper-based options. The swatch reads Background colour when it is printed and Paper colour (preview only) when it is not. PDF page titles and the README table use the same terms. Co-Authored-By: Claude Opus 5.5 --- 3d_models/laptop_screens/README.md | 24 +++++----- 3d_models/laptop_screens/laptop-screens.pdf | Bin 86047 -> 86273 bytes scripts/laptop_screens.py | 12 ++--- web/css/base.css | 6 ++- web/js/screens.js | 15 ++++--- web/screens/index.html | 46 ++++++++++++-------- 6 files changed, 59 insertions(+), 44 deletions(-) diff --git a/3d_models/laptop_screens/README.md b/3d_models/laptop_screens/README.md index 96358f14..ec2a8bbf 100644 --- a/3d_models/laptop_screens/README.md +++ b/3d_models/laptop_screens/README.md @@ -4,18 +4,18 @@ Paper inserts that turn the plain black `LaptopScreen` into a terminal, an IDE, **Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, three pages per servo preset with the same designs: -- **Colour screens** — each design on its own dark (or light) background. -- **Colour on coloured paper** — no background; each colour keeps its hue but is darkened so it reads on pale paper. -- **Paper screens** — no background, black and grey text only, so the paper colour becomes the screen colour. +- **Printed background** — each design on its own dark (or light) background. Most ink. +- **No background, colour text** — only the text prints; each colour keeps its hue but is darkened so it reads on pale paper. +- **No background, black text** — only the text prints, in black and grey. Least ink. -| Your printer and paper | Print | -| --- | --- | -| Colour printer, white paper | Colour screens | -| Black-only printer, white paper | Colour screens (prints as greyscale; heavy on toner) or Paper screens | -| Colour printer, coloured paper | Colour on coloured paper | -| Black-only printer, coloured paper | Paper screens | +Two questions pick the page: does your printer do colour, and do you want the background printed? + +| Printer | Printed background | No background | +| --- | --- | --- | +| Colour | Printed background | No background, colour text | +| Black only | Printed background (comes out in greys; heavy on toner) | No background, black text | -Green paper gives an old-LCD look; any pale colour works. Ink is translucent, so printed colours mix with the paper (blue on yellow turns greenish). Printers cannot print white, so dark paper (black, navy) will not show the text. +With no background the paper is the screen: green paper gives an old-LCD look, and any pale colour works. Ink is translucent, so printed colours mix with the paper (blue on yellow turns greenish). Printers cannot print white, so dark paper (black, navy) will not show the text. ## Print, cut, install @@ -72,11 +72,11 @@ $ pio run | `color ` | Named colour for `{name}…{/}` spans in the text | | `align` | `top-left` (default) or `center` | | `outline` | `window` draws a dashed line around the visible area (blank template) | -| `paper-dim` | Colour names the design treats as secondary: grey on the Paper screens page (other text is black), and darkened less on the Colour on coloured paper page | +| `paper-dim` | Colour names the design treats as secondary: grey on the No background, black text page (other text is black), and darkened less on the No background, colour text page | Text lines follow the headers. `{name}` switches to a named colour, `{/}` back to the foreground. Characters must be printable in the PDF base fonts (ASCII and Latin-1 are fine). -Every text colour needs at least **3:1** contrast against `background`, so the Colour page still reads from a black-only printer. The script refuses a design that falls below it. +Every text colour needs at least **3:1** contrast against `background`, so the Printed background page still reads from a black-only printer. The script refuses a design that falls below it. Then rebuild the PDF from the repo root (Python 3, standard library only): diff --git a/3d_models/laptop_screens/laptop-screens.pdf b/3d_models/laptop_screens/laptop-screens.pdf index fecf8f178e0e4931d0952a47a3d68ece67b0713d..3a281b4700bbb6dc69296263156c58785dd13101 100644 GIT binary patch delta 75935 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

L%;ObKQzl3#r2$o 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%0Avpe0 zzK=-Uf+CM=WrDu$8GBl#%r~TH?Q2OtgZ=4H)Vq|P#%IT2z7VYR+iaA9&L9>JM&}O& zd?J34EiY^>d)H+hw>3AXa(U(oWdj-%)af2;5(Xo!)5M^tR&L{pRhU7jkV7 z2sit-(sPCGJf>(i2UxH%ZS=GHI!@wY^m1WZ9*nSA9-xN(&1OE@EUupLm@|!PKx`wg ztRq(vjF)O#@zzLf*KFQMtnF5gX|fdafRVgmeRk@mIlDvF)L_)a(EM_3zK1v{VftRG3cvx*7*(m2PqCB@8o& zvL-5U)d}SS11_dQCA)z4*WRIw^^MO+B1LCjr>(cLL3beqV_Sy;{V)<(;JZq!xF5ZY z9!s(kf~5lT)*b?E|2&Iur5~?fPi)m76F9<~oT<${7*+Jm9l%D4V-oKBYDg|zQprl? z9-P%S@tea%Gxk2Ov$+n)Eqznq)El_XB_a4Nfk|}akIy=D-I+S*X>XW>H-o@C@y~tF zYWY&Ah?^vHTZFQht^2(+p;DQ-JgzkvR7o7=2Wd9bDFz~K7V`H*h}k}yG)Cp+zUq@+ z>z-xIu9nLl-f{;%oo(>mDCWZ4*34%8dRD?)Z3;3tMQ$H#a%b;J_I^1Fla+Y*XFx>I zx476Wa2Bq8`he<$$lmkUD<`jvo8;-nC2{RRTQN9Y$zPHQv{GKkz3E&Ic~R`SrL*nG z-{19o9#X~8X>T8(KM(nXiW&lh2eL>?3*gOvNo4*V(hDfJvlTd=gZry)5-vhxzzVnl zzP3tyY5qF_y7Ten3o>d{Cq+J{|4db6M_8OKqxPSkN=;*P+ndkk$*8EKK}nF2K=edP$7O1 z=sy(&`1yJNbtu3O75vwsfC#UE(7(1K|7|NMB*Mr0Pd!0lh!Ff=VFx(Q1HL9 vAPg1e{WmkhP!Yj@Gb1d(3l;b$u&@B%|M8dBtObz4dFmJr6O+8A0?z*e-SCjD diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index 4aa7c848..e019dba8 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -461,12 +461,12 @@ def add(body): TINT_TEXT_LUM = 0.08 TINT_DIM_LUM = 0.2 MODES = { - "colour": ("Colour screens", - "Colour or black-only printer on white paper. Dark fills hide the paper colour."), - "tinted": ("Colour on coloured paper", - "Colour printer, pale coloured paper: no fill, colours darkened to read on the paper."), - "paper": ("Paper screens", - "Any printer, any paper colour: no fill, so the paper becomes the screen."), + "colour": ("Printed background", + "Background and text in colour; a black-only printer prints them as greys. Most ink."), + "tinted": ("No background, colour text", + "Colour printer. Only the text prints, darkened to read on pale paper; the paper shows through."), + "paper": ("No background, black text", + "Any printer. Only the text prints, in black and grey; the paper shows through. Least ink."), } INKS = {"colour": lambda rgb, meta: rgb, "tinted": tinted_ink, "paper": paper_ink} diff --git a/web/css/base.css b/web/css/base.css index 5054b38a..da758d91 100644 --- a/web/css/base.css +++ b/web/css/base.css @@ -719,8 +719,10 @@ esp-web-install-button .button, transition: border-color var(--dur) ease; } -.choice + .choice { - margin-top: 0.4rem; +.choice-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 11rem), 1fr)); + gap: 0.4rem; } .choice:has(input:checked) { diff --git a/web/js/screens.js b/web/js/screens.js index bc5d32f0..ee3f9c42 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -390,12 +390,13 @@ function syncColours() { // One background swatch: the design's background when it is printed, the // paper colour (preview only) when the print mode leaves it unprinted. const paper = onPaper(); - $('scr-bg-label').textContent = paper ? 'Paper colour' : mono() ? 'Background · prints as grey' : 'Background'; + $('scr-bg-label').textContent = paper ? 'Paper colour · preview only' + : mono() ? 'Background colour · prints as grey' : 'Background colour'; $('scr-bg-hint').textContent = paper - ? 'Preview only. Nothing is printed behind the text, so this shows the ink on your paper. Ink varies by printer; treat it as a guide.' + ? 'No background is printed. Set this to your paper to preview the ink on it; ink varies by printer, so treat it as a guide.' : mono() ? 'Black-only printers print shades of grey, so pick a grey. Light greys save toner.' - : 'Fills the insert behind your text or image.'; + : 'Printed behind your text or image.'; $('scr-bg').value = paper ? state.paperColour : shown(d.background); } @@ -444,8 +445,12 @@ function bind() { }); $('scr-pan-x').addEventListener('input', (e) => { state.panX = Number(e.target.value) / 100; renderPreview(); }); $('scr-pan-y').addEventListener('input', (e) => { state.panY = Number(e.target.value) / 100; renderPreview(); }); - document.querySelectorAll('input[name="scr-print"]').forEach((r) => r.addEventListener('change', () => { - state.print = r.value; + // Printer x background -> print mode. + const MODES = { 'colour/printed': 'colour', 'mono/printed': 'mono', 'colour/none': 'tinted', 'mono/none': 'paper' }; + document.querySelectorAll('input[name="scr-printer"], input[name="scr-bgmode"]').forEach((r) => r.addEventListener('change', () => { + const printer = document.querySelector('input[name="scr-printer"]:checked').value; + const bg = document.querySelector('input[name="scr-bgmode"]:checked').value; + state.print = MODES[`${printer}/${bg}`]; syncColours(); renderPreview(); })); diff --git a/web/screens/index.html b/web/screens/index.html index bcaf1142..a9ed70d4 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -47,27 +47,35 @@

Laptop screens

- Printing on - - - - + Printer +
+ + +
+
+ +
+ Background +
+ + +
- +
Fills the insert behind your text or image. @@ -92,7 +100,7 @@

Laptop screens

Colours
- +
From 91859413044ecec386800e997afcd2715e1f8261 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 19 Oct 2026 15:46:24 -0400 Subject: [PATCH 10/16] feat(cad): per-preset screen PDFs, five new designs, roomier editor Review feedback on #88: - One PDF per servo preset (laptop-screens-.pdf) instead of one combined file; each print style paginates so no design is ever dropped. --check also flags PDFs that are no longer generated. - Five new screens, original drawings in the spirit of the classics: rubber duck debugging, Linux boot with Tux (credited to Larry Ewing), pixel aliens, a blocky green neighbour and a TE-9000 console. - Generator: taller text box, wider editor column, preview pinned beside it on desktop and first on phones, plus a link to the stock PDF for the selected preset. Co-Authored-By: Claude Opus 5.5 --- 3d_models/laptop_screens/README.md | 17 +++++-- .../laptop_screens/laptop-screens-es9051.pdf | Bin 0 -> 23672 bytes .../laptop_screens/laptop-screens-fs0307.pdf | Bin 0 -> 28952 bytes .../laptop_screens/laptop-screens-hd1370a.pdf | Bin 0 -> 28976 bytes .../laptop_screens/laptop-screens-sg90.pdf | Bin 0 -> 19548 bytes 3d_models/laptop_screens/laptop-screens.pdf | Bin 86273 -> 0 bytes .../laptop_screens/screens/09-duck.screen | 18 +++++++ .../laptop_screens/screens/10-tux.screen | 19 ++++++++ .../laptop_screens/screens/11-aliens.screen | 22 +++++++++ .../laptop_screens/screens/12-blocky.screen | 16 ++++++ .../laptop_screens/screens/13-console.screen | 15 ++++++ scripts/laptop_screens.py | 46 +++++++++++++----- web/css/base.css | 27 ++++++++++ web/js/screens.js | 1 + web/screens/designs.json | 20 ++++++++ web/screens/index.html | 3 +- 16 files changed, 188 insertions(+), 16 deletions(-) create mode 100644 3d_models/laptop_screens/laptop-screens-es9051.pdf create mode 100644 3d_models/laptop_screens/laptop-screens-fs0307.pdf create mode 100644 3d_models/laptop_screens/laptop-screens-hd1370a.pdf create mode 100644 3d_models/laptop_screens/laptop-screens-sg90.pdf delete mode 100644 3d_models/laptop_screens/laptop-screens.pdf create mode 100644 3d_models/laptop_screens/screens/09-duck.screen create mode 100644 3d_models/laptop_screens/screens/10-tux.screen create mode 100644 3d_models/laptop_screens/screens/11-aliens.screen create mode 100644 3d_models/laptop_screens/screens/12-blocky.screen create mode 100644 3d_models/laptop_screens/screens/13-console.screen diff --git a/3d_models/laptop_screens/README.md b/3d_models/laptop_screens/README.md index ec2a8bbf..5aafe55b 100644 --- a/3d_models/laptop_screens/README.md +++ b/3d_models/laptop_screens/README.md @@ -1,8 +1,17 @@ # Laptop screen inserts -Paper inserts that turn the plain black `LaptopScreen` into a terminal, an IDE, an agent chat, a crash dump, a retro computer, an ELIZA-style chat or a Tiny Engineer splash. No electronics: print, cut, slide into the lid. Inspired by a [community build](https://github.com/jamro/tiny-engineer/discussions/13#discussioncomment-18741594) that used a printed ELIZA screenshot behind clear PET. +Paper inserts that turn the plain black `LaptopScreen` into a terminal, an IDE, an agent chat, a crash dump, a retro computer, an ELIZA-style chat, a Tiny Engineer splash, a rubber duck, a Linux boot with Tux, pixel aliens, a blocky green neighbour or a red-eyed TE-9000 console. The pop-culture ones are original drawings in the spirit of the classics, not copies; Tux is credited to Larry Ewing, as he asks. No electronics: print, cut, slide into the lid. Inspired by a [community build](https://github.com/jamro/tiny-engineer/discussions/13#discussioncomment-18741594) that used a printed ELIZA screenshot behind clear PET. -**Print:** [`laptop-screens.pdf`](laptop-screens.pdf) — A4, three pages per servo preset with the same designs: +**Print:** one PDF per servo preset — download the one matching the folder you printed from [`parts/`](../parts/): + +| Preset | PDF | +| --- | --- | +| `sg90` | [`laptop-screens-sg90.pdf`](laptop-screens-sg90.pdf) | +| `fs0307` | [`laptop-screens-fs0307.pdf`](laptop-screens-fs0307.pdf) | +| `es9051` | [`laptop-screens-es9051.pdf`](laptop-screens-es9051.pdf) | +| `hd1370a` | [`laptop-screens-hd1370a.pdf`](laptop-screens-hd1370a.pdf) | + +Each is A4 with one page per print style, every design on each: - **Printed background** — each design on its own dark (or light) background. Most ink. - **No background, colour text** — only the text prints; each colour keeps its hue but is darkened so it reads on pale paper. @@ -19,7 +28,7 @@ With no background the paper is the screen: green paper gives an old-LCD look, a ## Print, cut, install -1. Open the PDF and print **one page for your servo preset** (`sg90`, `fs0307`, `es9051` or `hd1370a` — the same folder you printed from [`parts/`](../parts/)), picking the page from the table above. Each insert is labelled with its preset. +1. Open the PDF for your servo preset (table above) and print **the page for your printer and background** from the table above. A style with more designs than fit one page continues onto the next. Each insert is labelled with its preset. 2. Print at **100% / Actual size**. Turn off "Fit to page" / "Shrink to printable area". 3. Check the scale: the square at the top must measure **10 × 10 mm** and the ruler **50 mm**. If not, fix the print settings and reprint — a scaled insert will not fit the pocket. 4. Cut along the thin grey outline. Snip the four corners slightly: the pocket has rounded corners. @@ -81,7 +90,7 @@ Every text colour needs at least **3:1** contrast against `background`, so the P Then rebuild the PDF from the repo root (Python 3, standard library only): ```bash -python3 scripts/laptop_screens.py # rewrite laptop-screens.pdf +python3 scripts/laptop_screens.py # rewrite laptop-screens-.pdf python3 scripts/laptop_screens.py --check # CI: fail if the PDF is stale ``` diff --git a/3d_models/laptop_screens/laptop-screens-es9051.pdf b/3d_models/laptop_screens/laptop-screens-es9051.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6c9fc23bad7135edbc01583e19382657d7234470 GIT binary patch literal 23672 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 AEdT%j literal 0 HcmV?d00001 diff --git a/3d_models/laptop_screens/laptop-screens-fs0307.pdf b/3d_models/laptop_screens/laptop-screens-fs0307.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7bf383cbe8d28b00c470f6bde111e27edd23a952 GIT binary patch literal 28952 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 literal 0 HcmV?d00001 diff --git a/3d_models/laptop_screens/laptop-screens-hd1370a.pdf b/3d_models/laptop_screens/laptop-screens-hd1370a.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd19a6d1edb1403bee4511d6e2f3775533cd4ac9 GIT binary patch literal 28976 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 MbE&Gj`nz!f06E-dO#lD@ literal 0 HcmV?d00001 diff --git a/3d_models/laptop_screens/laptop-screens.pdf b/3d_models/laptop_screens/laptop-screens.pdf deleted file mode 100644 index 3a281b4700bbb6dc69296263156c58785dd13101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86273 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 Egxwt7du&y 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
yJy~84E>+8IqssCyKtxt~KAUT4Z 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 BS6AmWkek4ecB`QWLe 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 bnkhUy!S0^_8moeQd;;8P^z<@nvS|Mogrh)Y diff --git a/3d_models/laptop_screens/screens/09-duck.screen b/3d_models/laptop_screens/screens/09-duck.screen new file mode 100644 index 00000000..683776cf --- /dev/null +++ b/3d_models/laptop_screens/screens/09-duck.screen @@ -0,0 +1,18 @@ +# title: Rubber duck debugging +# background: #10151c +# foreground: #d8dee9 +# paper-dim: dim +# color dim: #7b8494 +# color duck: #ffd23f +# color beak: #ff8c42 +{dim}$ explain --to duck src/servos/park.cpp{/} + +{duck} __{/} + {beak}<{/}{duck}(o )___{/} So the elbow parks at 0.0 +{duck} ( ._> /{/} because the default is... +{duck} `---'{/} + + ...-0.1. Oh. + Never mind. Thanks, duck. + +{dim}duck: *squeak*{/} diff --git a/3d_models/laptop_screens/screens/10-tux.screen b/3d_models/laptop_screens/screens/10-tux.screen new file mode 100644 index 00000000..20115624 --- /dev/null +++ b/3d_models/laptop_screens/screens/10-tux.screen @@ -0,0 +1,19 @@ +# title: Linux boot (Tux) +# background: #0b0b0b +# foreground: #d0d0d0 +# paper-dim: dim +# color dim: #7f7f7f +# color ok: #4ec94e +# color tux: #f2f2f2 +# color feet: #ffb000 +{tux} .--.{/} {dim}[ 0.000000] Linux version 6.12-te{/} +{tux} |o_o |{/} {dim}[ 0.412718] esp32: hello from below{/} +{tux} |:{feet}_{/}{tux}/ |{/} [ {ok}OK{/} ] Mounted /desk +{tux} // \ \{/} [ {ok}OK{/} ] Started coffee.service +{tux} (| | ){/} [ {ok}OK{/} ] Started tiny-engineer.service +{tux}/'\_ _/`\{/} [ {ok}OK{/} ] Reached target Productivity +{tux}\{feet}___){/}{tux}={/}{feet}(___{/}{tux}/{/} + +tiny-engineer login: _ + +{dim}Tux by Larry Ewing, made with The GIMP{/} diff --git a/3d_models/laptop_screens/screens/11-aliens.screen b/3d_models/laptop_screens/screens/11-aliens.screen new file mode 100644 index 00000000..bffb9368 --- /dev/null +++ b/3d_models/laptop_screens/screens/11-aliens.screen @@ -0,0 +1,22 @@ +# title: Pixel aliens +# background: #050510 +# foreground: #e8e8e8 +# paper-dim: dim +# color dim: #8080a0 +# color a: #ff5fd2 +# color b: #5fd7ff +# color c: #9dff5f +# color ship: #ffe14d +SCORE 00420 HI 09001 + + {a}# #{/} {a}# #{/} {a}# #{/} {a}# #{/} + {a}#####{/} {a}#####{/} {a}#####{/} {a}#####{/} + {a}## # ##{/} {a}## # ##{/} {a}## # ##{/} {a}## # ##{/} + + {b}.###.{/} {b}.###.{/} {b}.###.{/} {b}.###.{/} + {b}#o###o#{/} {b}#o###o#{/} {b}#o###o#{/} {b}#o###o#{/} + {b}/ ' ' \{/} {b}/ ' ' \{/} {b}/ ' ' \{/} {b}/ ' ' \{/} + {ship}|{/} + {c}.####.{/} {c}.####.{/} {c}.####.{/} + {ship}_/^\_{/} +{dim}LIVES {/}{ship}^ ^ ^{/}{dim} CREDIT 01{/} diff --git a/3d_models/laptop_screens/screens/12-blocky.screen b/3d_models/laptop_screens/screens/12-blocky.screen new file mode 100644 index 00000000..277a707d --- /dev/null +++ b/3d_models/laptop_screens/screens/12-blocky.screen @@ -0,0 +1,16 @@ +# title: Blocky neighbour +# background: #0d140d +# foreground: #d6e8d0 +# paper-dim: dim +# color dim: #7f9a78 +# color g: #6cc04a +# color d: #3f8a2c + {g}################{/} + {g}##{/}{d}##{/}{g}####{/}{d}##{/}{g}##{/}{d}##{/}{g}##{/} > mining... + {g}## #### ##{/} > found: 3 x coffee bean + {g}## {/}{d}##{/}{g}## ##{/} > found: 1 x loose M2 screw + {g}###### ######{/} + {g}#### ####{/} {dim}A quiet green neighbour{/} + {g}#### {/}{d}####{/}{g} ####{/} {dim}is standing behind{/} + {g}#### #### ####{/} {dim}the robot.{/} + {g}################{/} diff --git a/3d_models/laptop_screens/screens/13-console.screen b/3d_models/laptop_screens/screens/13-console.screen new file mode 100644 index 00000000..41227c5c --- /dev/null +++ b/3d_models/laptop_screens/screens/13-console.screen @@ -0,0 +1,15 @@ +# title: TE-9000 console +# background: #070707 +# foreground: #d8d8d8 +# paper-dim: dim +# color dim: #808080 +# color ring: #a8a8a8 +# color eye: #ff3b30 +{ring} .-------.{/} TE-9000 DESK UNIT +{ring} .' .---. '.{/} {dim}all systems nominal{/} +{ring} / ( {/}{eye}(@){/}{ring} ) \{/} +{ring} \ '---' /{/} > open the pod bay doors +{ring} '. .'{/} +{ring} '-------'{/} I can't do that. + I can open a pull + request, though. diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index e019dba8..11d3cea1 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Build the printable laptop screen inserts PDF (one A4 page per servo preset). +"""Build the printable laptop screen insert PDFs (one PDF per servo preset). Insert size and visible window are measured from the exported meshes, so every preset under 3d_models/parts/ gets correctly sized inserts: @@ -11,8 +11,8 @@ Screen designs are plain-text files in 3d_models/laptop_screens/screens/*.screen (format: 3d_models/laptop_screens/README.md). Standard library only. - python3 scripts/laptop_screens.py # rewrite the PDF - python3 scripts/laptop_screens.py --check # fail if the PDF is stale + python3 scripts/laptop_screens.py # rewrite the PDFs + python3 scripts/laptop_screens.py --check # fail if a PDF is stale """ import argparse @@ -28,7 +28,13 @@ PARTS = ROOT / "3d_models" / "parts" SERVOS_JSON = ROOT / "3d_models" / "fusion" / "TinyEngineerTools" / "servos.json" SCREENS_DIR = ROOT / "3d_models" / "laptop_screens" / "screens" -OUT_PDF = ROOT / "3d_models" / "laptop_screens" / "laptop-screens.pdf" +OUT_DIR = ROOT / "3d_models" / "laptop_screens" + + +def out_pdf(sid): + return OUT_DIR / f"laptop-screens-{sid}.pdf" + + WEB_DIR = ROOT / "web" / "screens" PT_PER_MM = 72 / 25.4 @@ -517,7 +523,17 @@ def draw_scale_check(page, x, y): page.text(rx + 53, y + 8.6, "If not, reprint at 100% / Actual size (scaling off).", 2.6) -def preset_page(sid, name, geo, screens, mode): +def preset_pages(sid, name, geo, screens, mode): + """One print style for one preset: every design at least once, spares fill the last page.""" + pages, start = [], 0 + while start < len(screens): + page, slots = preset_page(sid, name, geo, screens, mode, start) + pages.append(page) + start += slots + return pages + + +def preset_page(sid, name, geo, screens, mode, start): page = Page() w, h = geo["insert"] wx, wy, ww, wh = geo["window"] @@ -526,7 +542,7 @@ def preset_page(sid, name, geo, screens, mode): page.text(MARGIN, y, f"Tiny Engineer - laptop screen inserts: {heading}", 6.0, font="F3") y += 7.5 page.text(MARGIN, y, f"Servo preset: {name} ({sid})", 4.6, font="F3") - page.text(A4_MM[0] - MARGIN - 52, y, f"Print only one page for {sid} parts.", 2.8, rgb=GREY) + page.text(A4_MM[0] - MARGIN - 52, y, "Print one page that suits your printer.", 2.8, rgb=GREY) y += 6 page.text(MARGIN, y, use, 2.8, font="F3") y += 4.2 @@ -545,12 +561,12 @@ def preset_page(sid, name, geo, screens, mode): grid_w = cols * w + (cols - 1) * GAP_X x0 = (A4_MM[0] - grid_w) / 2 for i in range(cols * rows): - screen = screens[i % len(screens)] + screen = screens[(start + i) % len(screens)] r, c = divmod(i, cols) ix, iy = x0 + c * (w + GAP_X), y + r * (h + LABEL_H + 2) draw_insert(page, ix, iy, geo, screen, mode) page.text(ix, iy + h + 2.8, f"{sid} - {screen['meta']['title']}", 2.4, rgb=GREY) - return page + return page, cols * rows def web_data(report): @@ -567,12 +583,12 @@ def web_data(report): def build(): screens = load_screens() - pages, report = [], [] + outputs, report = {}, [] for sid, name in presets(): geo = measure_preset(PARTS / sid) - pages.extend(preset_page(sid, name, geo, screens, mode) for mode in MODES) + pages = [p for mode in MODES for p in preset_pages(sid, name, geo, screens, mode)] + outputs[out_pdf(sid)] = write_pdf(pages, f"Tiny Engineer laptop screen inserts ({sid})") report.append((sid, name, geo)) - outputs = {OUT_PDF: write_pdf(pages, "Tiny Engineer laptop screen inserts")} outputs.update(web_data(report)) return outputs, report @@ -592,6 +608,14 @@ def main(argv=None): print(f"{sid:8} insert {w:6.2f} x {h:5.2f} mm window {ww:6.2f} x {wh:5.2f} mm at " f"({wx:.2f}, {wy:.2f}) slack {geo['slack']:.2f} spare depth {geo['spare_depth']:.2f} mm") stale = 0 + for path in sorted(set(OUT_DIR.glob("laptop-screens*.pdf")) - set(outputs)): + rel = path.relative_to(ROOT) + if args.check: + print(f"{rel} is no longer generated: run python3 scripts/laptop_screens.py", file=sys.stderr) + stale = 1 + else: + path.unlink() + print(f"removed {rel}") for path, data in outputs.items(): rel = path.relative_to(ROOT) if args.check: diff --git a/web/css/base.css b/web/css/base.css index da758d91..51b5bc11 100644 --- a/web/css/base.css +++ b/web/css/base.css @@ -644,10 +644,37 @@ esp-web-install-button .button, gap: 1.25rem; } +.page-screens .wrap { + width: min(100% - 2rem, 72rem); +} + .page-screens .hero { align-items: start; } +/* Keep the preview beside the text while editing: pinned on wide screens, + first on narrow ones. */ +@media (min-width: 760px) { + .page-screens .hero { + grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); + } + + .page-screens .hero > .panel-raised { + position: sticky; + top: 1rem; + } +} + +@media (max-width: 759px) { + .page-screens .hero > .panel-raised { + order: -1; + } +} + +.page-screens .textarea { + min-height: 20rem; +} + .page-screens [hidden] { display: none !important; } diff --git a/web/js/screens.js b/web/js/screens.js index ee3f9c42..52e1d850 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -422,6 +422,7 @@ function bind() { const [, , ww, wh] = state.preset.window; $('scr-insert-size').textContent = `${w.toFixed(1)} × ${h.toFixed(1)} mm`; $('scr-window-size').textContent = `${ww.toFixed(1)} × ${wh.toFixed(1)} mm`; + $('scr-stock-pdf').href = `https://github.com/jamro/tiny-engineer/raw/main/3d_models/laptop_screens/laptop-screens-${state.preset.id}.pdf`; renderPreview(); }); $('scr-template').addEventListener('change', (e) => setDesign(state.designs[Number(e.target.value)])); diff --git a/web/screens/designs.json b/web/screens/designs.json index 216db213..590b2ef1 100644 --- a/web/screens/designs.json +++ b/web/screens/designs.json @@ -30,5 +30,25 @@ { "file": "08-blank.screen", "source": "# title: Blank template\n# background: #ffffff\n# foreground: #1a1a1a\n# paper-dim: hint\n# color hint: #8a8a8a\n# align: center\n# outline: window\n{hint}draw or glue your screen inside{/}\n{hint}the dashed line (visible area){/}\n" + }, + { + "file": "09-duck.screen", + "source": "# title: Rubber duck debugging\n# background: #10151c\n# foreground: #d8dee9\n# paper-dim: dim\n# color dim: #7b8494\n# color duck: #ffd23f\n# color beak: #ff8c42\n{dim}$ explain --to duck src/servos/park.cpp{/}\n\n{duck} __{/}\n {beak}<{/}{duck}(o )___{/} So the elbow parks at 0.0\n{duck} ( ._> /{/} because the default is...\n{duck} `---'{/}\n\n ...-0.1. Oh.\n Never mind. Thanks, duck.\n\n{dim}duck: *squeak*{/}\n" + }, + { + "file": "10-tux.screen", + "source": "# title: Linux boot (Tux)\n# background: #0b0b0b\n# foreground: #d0d0d0\n# paper-dim: dim\n# color dim: #7f7f7f\n# color ok: #4ec94e\n# color tux: #f2f2f2\n# color feet: #ffb000\n{tux} .--.{/} {dim}[ 0.000000] Linux version 6.12-te{/}\n{tux} |o_o |{/} {dim}[ 0.412718] esp32: hello from below{/}\n{tux} |:{feet}_{/}{tux}/ |{/} [ {ok}OK{/} ] Mounted /desk\n{tux} // \\ \\{/} [ {ok}OK{/} ] Started coffee.service\n{tux} (| | ){/} [ {ok}OK{/} ] Started tiny-engineer.service\n{tux}/'\\_ _/`\\{/} [ {ok}OK{/} ] Reached target Productivity\n{tux}\\{feet}___){/}{tux}={/}{feet}(___{/}{tux}/{/}\n\ntiny-engineer login: _\n\n{dim}Tux by Larry Ewing, made with The GIMP{/}\n" + }, + { + "file": "11-aliens.screen", + "source": "# title: Pixel aliens\n# background: #050510\n# foreground: #e8e8e8\n# paper-dim: dim\n# color dim: #8080a0\n# color a: #ff5fd2\n# color b: #5fd7ff\n# color c: #9dff5f\n# color ship: #ffe14d\nSCORE 00420 HI 09001\n\n {a}# #{/} {a}# #{/} {a}# #{/} {a}# #{/}\n {a}#####{/} {a}#####{/} {a}#####{/} {a}#####{/}\n {a}## # ##{/} {a}## # ##{/} {a}## # ##{/} {a}## # ##{/}\n\n {b}.###.{/} {b}.###.{/} {b}.###.{/} {b}.###.{/}\n {b}#o###o#{/} {b}#o###o#{/} {b}#o###o#{/} {b}#o###o#{/}\n {b}/ ' ' \\{/} {b}/ ' ' \\{/} {b}/ ' ' \\{/} {b}/ ' ' \\{/}\n {ship}|{/}\n {c}.####.{/} {c}.####.{/} {c}.####.{/}\n {ship}_/^\\_{/}\n{dim}LIVES {/}{ship}^ ^ ^{/}{dim} CREDIT 01{/}\n" + }, + { + "file": "12-blocky.screen", + "source": "# title: Blocky neighbour\n# background: #0d140d\n# foreground: #d6e8d0\n# paper-dim: dim\n# color dim: #7f9a78\n# color g: #6cc04a\n# color d: #3f8a2c\n {g}################{/}\n {g}##{/}{d}##{/}{g}####{/}{d}##{/}{g}##{/}{d}##{/}{g}##{/} > mining...\n {g}## #### ##{/} > found: 3 x coffee bean\n {g}## {/}{d}##{/}{g}## ##{/} > found: 1 x loose M2 screw\n {g}###### ######{/}\n {g}#### ####{/} {dim}A quiet green neighbour{/}\n {g}#### {/}{d}####{/}{g} ####{/} {dim}is standing behind{/}\n {g}#### #### ####{/} {dim}the robot.{/}\n {g}################{/}\n" + }, + { + "file": "13-console.screen", + "source": "# title: TE-9000 console\n# background: #070707\n# foreground: #d8d8d8\n# paper-dim: dim\n# color dim: #808080\n# color ring: #a8a8a8\n# color eye: #ff3b30\n{ring} .-------.{/} TE-9000 DESK UNIT\n{ring} .' .---. '.{/} {dim}all systems nominal{/}\n{ring} / ( {/}{eye}(@){/}{ring} ) \\{/}\n{ring} \\ '---' /{/} > open the pod bay doors\n{ring} '. .'{/}\n{ring} '-------'{/} I can't do that.\n I can open a pull\n request, though.\n" } ] diff --git a/web/screens/index.html b/web/screens/index.html index a9ed70d4..0618daf3 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -94,7 +94,7 @@

Laptop screens

- +

Monospaced, sized to fill the window. {name}…{/} switches to a colour below.

@@ -141,6 +141,7 @@

Laptop screens

Insert
…
Visible
…
+

Just want the stock designs? Ready-made PDF for this preset.

From 7ab18ec612828cc0325850b339cdf490186c06ef Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Thu, 22 Oct 2026 13:01:57 -0400 Subject: [PATCH 13/16] fix(scripts): address CodeRabbit review on laptop screen inserts - --check compares PDFs with streams inflated, so a different zlib build cannot report a false stale file - copied .screen source drops paper-dim names whose tags were removed - screen generator status line is a polite live region Co-Authored-By: Claude Opus 5.5 --- scripts/laptop_screens.py | 30 +++++++++++++++++++++++++++++- web/js/screens.js | 7 +++++-- web/screens/index.html | 2 +- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index 11d3cea1..51a4ebb6 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -593,6 +593,34 @@ def build(): return outputs, report +FLATE_STREAM = re.compile(rb"<< /Length (\d+) /Filter /FlateDecode >>\nstream\n") + + +def pdf_content(data): + """Objects with streams inflated and the xref dropped, so zlib builds compare equal.""" + body = data[:data.rindex(b"\nxref\n")] + out, pos = bytearray(), 0 + for m in FLATE_STREAM.finditer(body): + if m.start() < pos: + continue # match inside compressed bytes already consumed + end = m.end() + int(m.group(1)) + out += body[pos:m.start()] + zlib.decompress(body[m.end():end]) + pos = end + return bytes(out + body[pos:]) + + +def up_to_date(path, data): + if not path.is_file(): + return False + old = path.read_bytes() + if path.suffix != ".pdf": + return old == data + try: + return pdf_content(old) == pdf_content(data) + except (ValueError, zlib.error): + return False + + def main(argv=None): parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) parser.add_argument("--check", action="store_true", help="fail if the committed outputs are out of date") @@ -619,7 +647,7 @@ def main(argv=None): for path, data in outputs.items(): rel = path.relative_to(ROOT) if args.check: - if not path.is_file() or path.read_bytes() != data: + if not up_to_date(path, data): print(f"{rel} is out of date: run python3 scripts/laptop_screens.py", file=sys.stderr) stale = 1 else: diff --git a/web/js/screens.js b/web/js/screens.js index 635d19e8..24b6b20b 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -67,8 +67,11 @@ function ensureTags(d) { function toScreenSource(d) { const head = [`# title: ${d.title}`, `# background: ${d.background}`, `# foreground: ${d.foreground}`]; - if (d.paperDim.length) head.push(`# paper-dim: ${d.paperDim.join(' ')}`); - for (const name of usedTags(d.body)) head.push(`# color ${name}: ${d.palette[name]}`); + const used = usedTags(d.body); + // A paper-dim name without its colour line fails parse_screen, so drop unused ones. + const dim = d.paperDim.filter((name) => used.includes(name)); + if (dim.length) head.push(`# paper-dim: ${dim.join(' ')}`); + for (const name of used) head.push(`# color ${name}: ${d.palette[name]}`); if (d.align !== 'top-left') head.push(`# align: ${d.align}`); if (d.outline !== 'none') head.push(`# outline: ${d.outline}`); return `${head.join('\n')}\n${d.body}\n`; diff --git a/web/screens/index.html b/web/screens/index.html index 47a17616..57ed7119 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -143,7 +143,7 @@

Laptop screens

Shade hidden part -

Loading sizes…

+

Loading sizes…

From 922079ca863ccbf0142cdb2c0e2c674b69a70eee Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Thu, 22 Oct 2026 14:29:47 -0400 Subject: [PATCH 14/16] fix(scripts): validate PDF xref in --check and copy full screen source on fallback - --check rejects a committed PDF whose startxref or xref entries do not point at their objects, before comparing inflated content - when the clipboard is blocked, show the complete .screen source in a read-only box and select it, instead of selecting only the body Co-Authored-By: Claude Opus 5.5 --- scripts/laptop_screens.py | 19 ++++++++++++++++++- web/js/screens.js | 9 +++++++-- web/screens/index.html | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index 51a4ebb6..db968b6e 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -609,6 +609,23 @@ def pdf_content(data): return bytes(out + body[pos:]) +def xref_ok(data): + """startxref finds the table and every entry points at its own object.""" + m = re.search(rb"startxref\n(\d+)\n%%EOF\n$", data) + if not m: + return False + xref = int(m.group(1)) + head = re.match(rb"xref\n0 (\d+)\n0000000000 65535 f \n", data[xref:]) + if not head: + return False + count = int(head.group(1)) - 1 + entries = re.match(rb"(?:\d{10} 00000 n \n){%d}trailer\n" % count, data[xref + head.end():]) + if not entries: + return False + offsets = re.findall(rb"(\d{10}) 00000 n \n", entries.group(0)) + return all(data.startswith(b"%d 0 obj\n" % i, int(o)) for i, o in enumerate(offsets, 1)) + + def up_to_date(path, data): if not path.is_file(): return False @@ -616,7 +633,7 @@ def up_to_date(path, data): if path.suffix != ".pdf": return old == data try: - return pdf_content(old) == pdf_content(data) + return xref_ok(old) and pdf_content(old) == pdf_content(data) except (ValueError, zlib.error): return False diff --git a/web/js/screens.js b/web/js/screens.js index 24b6b20b..57b63622 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -519,13 +519,18 @@ function bind() { }); $('scr-copy').addEventListener('click', async () => { const text = toScreenSource({ ...state.design, title: $('scr-title').value.trim() || 'Custom' }); + const out = $('scr-source-out'); try { await navigator.clipboard.writeText(text); + out.hidden = true; $('scr-status').textContent = 'Copied. Save it as 3d_models/laptop_screens/screens/.screen to add it to the stock sheet.'; $('scr-status').className = 'status-message is-ok'; } catch { - $('scr-body').select(); - $('scr-status').textContent = 'Clipboard blocked. Copy the text field by hand.'; + out.value = text; + out.hidden = false; + out.focus(); + out.select(); + $('scr-status').textContent = 'Clipboard blocked. Copy the selected source under the buttons by hand.'; $('scr-status').className = 'status-message is-err'; } }); diff --git a/web/screens/index.html b/web/screens/index.html index 57ed7119..258c4002 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -168,6 +168,7 @@

Laptop screens

+

Print at 100% / Actual size. Browser print dialogs often shrink to fit. The 10 mm square on the sheet tells you if it did. Cut on the grey line, add a same-size piece of clear PET in front, From f76416833e3235faa6c943bd0dfdf82c5f9553ca Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 26 Oct 2026 18:00:50 -0400 Subject: [PATCH 15/16] fix(docs): keep screen generator buttons clear of the pinned preview The download and copy buttons sat in the same column as the pinned preview, so scrolling slid the preview over them; at 1201x700 they could not be clicked. Move them below the editor row, where neither the desktop nor the phone pinned preview can reach. Co-Authored-By: Claude Opus 5.5 --- web/css/base.css | 15 ++++++++------- web/screens/index.html | 5 ++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/web/css/base.css b/web/css/base.css index 8940d5c3..e97415a5 100644 --- a/web/css/base.css +++ b/web/css/base.css @@ -727,19 +727,24 @@ esp-web-install-button .button, } /* The side column is as tall as the editor, so the preview and its - controls can stay pinned while the download buttons follow below. */ + controls stay pinned until the editor ends. */ .side { align-self: stretch; } + /* The download buttons sit below, under the preview column. */ + .workspace-foot .actions { + grid-column: 2; + } + .preview-stack { position: sticky; top: 1rem; } } -/* Phones: the preview sticks to the top of the screen, the text box sits - right under it, and the download controls follow the editor. */ +/* Phones: the preview sticks to the top of the screen until the editor + ends, with the text box right under it. */ @media (max-width: 759px) { .side, .preview-stack { @@ -782,10 +787,6 @@ esp-web-install-button .button, font-size: 0.8rem; } - .actions { - order: 2; - } - .page-screens .textarea { min-height: 14rem; scroll-margin-top: calc(30vh + 4.5rem); diff --git a/web/screens/index.html b/web/screens/index.html index 258c4002..7c1a201c 100644 --- a/web/screens/index.html +++ b/web/screens/index.html @@ -162,7 +162,11 @@

Laptop screens

+ + + +
@@ -175,7 +179,6 @@

Laptop screens

and slide both into the lid with LaptopScreen behind them.

-
From 0d3c67d64288332c8c1212cfc701e3d9e5d309b8 Mon Sep 17 00:00:00 2001 From: Jon Truland Date: Mon, 26 Oct 2026 18:00:51 -0400 Subject: [PATCH 16/16] fix(scripts): check the PDF trailer /Size in --check Co-Authored-By: Claude Opus 5.5 --- scripts/laptop_screens.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/laptop_screens.py b/scripts/laptop_screens.py index db968b6e..d2e8c43d 100644 --- a/scripts/laptop_screens.py +++ b/scripts/laptop_screens.py @@ -610,7 +610,7 @@ def pdf_content(data): def xref_ok(data): - """startxref finds the table and every entry points at its own object.""" + """startxref finds the table, /Size matches it, and every entry points at its own object.""" m = re.search(rb"startxref\n(\d+)\n%%EOF\n$", data) if not m: return False @@ -619,8 +619,8 @@ def xref_ok(data): if not head: return False count = int(head.group(1)) - 1 - entries = re.match(rb"(?:\d{10} 00000 n \n){%d}trailer\n" % count, data[xref + head.end():]) - if not entries: + entries = re.match(rb"(?:\d{10} 00000 n \n){%d}trailer\n<< /Size (\d+) " % count, data[xref + head.end():]) + if not entries or int(entries.group(1)) != count + 1: return False offsets = re.findall(rb"(\d{10}) 00000 n \n", entries.group(0)) return all(data.startswith(b"%d 0 obj\n" % i, int(o)) for i, o in enumerate(offsets, 1))