Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/acceptance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ jobs:
run: |
raco pkg install --auto --no-docs "https://github.com/turinglambdaai/keel.git#$env:KEEL_PIN"
raco pkg install --auto --no-docs "https://github.com/turinglambdaai/rivet.git#$env:RIVET_PIN"
- name: Verify Windows installer artwork
shell: pwsh
run: python scripts/check-windows-installer-bitmaps.py
- name: Run executable acceptance contract
shell: pwsh
run: |
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ jobs:
run: bash scripts/check-release-version.sh
- name: Verify dependency pins stay aligned
run: bash scripts/check-dependency-pins.sh
- name: Verify Windows installer bitmap and checkbox surface
run: python3 scripts/check-windows-installer-bitmaps.py

core:
name: Racket core (contract tests)
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ jobs:
- name: Version preflight (VERSION == rivet.rktd == updater == tag)
shell: bash
run: bash scripts/check-release-version.sh "${{ github.ref_name }}"
- name: Verify Windows installer checkbox surface
shell: pwsh
run: python scripts/check-windows-installer-bitmaps.py
- name: Release (MSI + portable zip)
shell: pwsh
run: raco rivet release --without-updates --development
Expand Down
Binary file modified assets/wizard-dialog.bmp
Binary file not shown.
Binary file modified assets/wizard-dialog.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions assets/wizard-dialog.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
72 changes: 72 additions & 0 deletions scripts/check-windows-installer-bitmaps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/env python3
"""Verify WiX 5 completion dialog bitmap and native checkbox background."""
from __future__ import annotations

import struct
import zlib
from pathlib import Path

ASSETS = Path(__file__).resolve().parents[1] / "assets"
WIDTH, HEIGHT = 493, 312


def bmp_pixels() -> bytes:
source = (ASSETS / "wizard-dialog.bmp").read_bytes()
assert source[:2] == b"BM", "invalid BMP"
offset = struct.unpack_from("<I", source, 10)[0]
width, height, planes, depth = struct.unpack_from("<iiHH", source, 18)
assert (width, abs(height), planes, depth) == (WIDTH, HEIGHT, 1, 24)
stride = (WIDTH * 3 + 3) & ~3
assert offset + HEIGHT * stride <= len(source)
pixels = bytearray()
for y in range(HEIGHT):
row = y if height < 0 else HEIGHT - y - 1
offset_row = offset + row * stride
for x in range(WIDTH):
start = offset_row + x * 3
blue, green, red = source[start : start + 3]
pixels.extend((red, green, blue))
return bytes(pixels)


def png_pixels() -> bytes:
source = (ASSETS / "wizard-dialog.png").read_bytes()
assert source[:8] == b"\x89PNG\r\n\x1a\n"
pos, chunks = 8, []
while pos < len(source):
size = struct.unpack_from(">I", source, pos)[0]
tag = source[pos + 4 : pos + 8]
payload = source[pos + 8 : pos + 8 + size]
if tag == b"IHDR":
assert struct.unpack_from(">IIBBBBB", payload) == (
WIDTH, HEIGHT, 8, 2, 0, 0, 0
)
if tag == b"IDAT":
chunks.append(payload)
pos += size + 12
raw = zlib.decompress(b"".join(chunks))
stride = WIDTH * 3
pixels = bytearray()
for y in range(HEIGHT):
offset = y * (stride + 1)
assert raw[offset] == 0, "PNG preview must use filter None"
pixels.extend(raw[offset + 1 : offset + 1 + stride])
return bytes(pixels)


def main() -> None:
pixels = bmp_pixels()
assert png_pixels() == pixels, "preview PNG differs from shipping BMP"
row_width = WIDTH * 3
for y in range(248, HEIGHT):
row = pixels[y * row_width : (y + 1) * row_width]
assert row == bytes((240, 240, 240)) * WIDTH, (
f"Windows checkbox backing is not flat #F0F0F0 at y={y}"
)
divider = pixels[247 * row_width : 248 * row_width]
assert divider == bytes((214, 210, 206)) * WIDTH
print("Windows MSI artwork OK: 493x312, flat native checkbox footer")


if __name__ == "__main__":
main()
15 changes: 15 additions & 0 deletions shared/spec/DESIGN-TOKENS.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,18 @@ accent-filled white-text rounded button. No chrome field borders anywhere.
White rounded square (macOS-squircle radius ≈ 22.5%) with a quiet checklist
mark: one system-blue rounded bar over two neutral (`#CECED3`) bars, staggered
widths. Monochrome, no gradients — must read on light and dark docks alike.

## Windows MSI installer artwork

WiX 5's `WixUI_InstallDir` shares `assets/wizard-dialog.bmp` (493×312)
between welcome and completion pages. Its `ExitDialog` optional checkbox is
**opaque** at x=135…355 and y=190…230 installer units, mapping to approximately
x=180…473 and y=253…307 on the bitmap. Gradients under this native control
produce a conspicuous rectangular patch.

The image's **entire bottom footer** (y=248…311) is flat classic Windows
button-face `#F0F0F0`, with a subtle divider at y=247. The interactive
checkbox remains native and accessible, while its backing now blends into the
same surface. Keep SVG, PNG preview, and shipping BMP synchronized.
`scripts/check-windows-installer-bitmaps.py` verifies pixel identity and
native checkbox surface in CI, packaged acceptance and Windows release.
Loading