Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
c6ef53b
Gate the macOS Aqua theme on master
shai-almog Sep 16, 2026
67127ec
Merge master, keeping the desktop theme work on this branch
shai-almog Sep 16, 2026
35d11aa
Restore the files master's revert removed
shai-almog Sep 16, 2026
1d3c16b
Merge master, keeping the complete desktop theme work on this branch
shai-almog Sep 16, 2026
3dc4b40
Fidelity spec: complete the license headers
shai-almog Sep 16, 2026
9cc51f2
Windows port: the dark-mode native was outside the extern "C" block
shai-almog Sep 16, 2026
2ceb4f0
Restore the macOS gate, lost in the branch rebuild
shai-almog Sep 16, 2026
3959d68
COVERAGE.md: remove a section duplicated by the merge
shai-almog Sep 16, 2026
a0c7335
Act on five codex findings, all of which held up
shai-almog Sep 16, 2026
1c9bd62
Windows capture app: fix the float compare, push back on the other nine
shai-almog Sep 16, 2026
4328416
Developer guide: contraction the prose gate asked for
shai-almog Sep 16, 2026
57dc5f3
Scope the progress-bar value to desktop rows; mobile was regressed
shai-almog Sep 16, 2026
994de9f
Act on six more review findings; four were real bugs
shai-almog Sep 16, 2026
0bd583b
Don't flip any port's default theme in this change
shai-almog Sep 16, 2026
478b333
Three more codex findings; all three held up
shai-almog Sep 16, 2026
14842d9
Revert a review "fix" whose premise was false, and reseed one screenshot
shai-almog Sep 16, 2026
d8e12f1
Developer guide: drop an adverb the prose gate rejects
shai-almog Sep 16, 2026
9db777f
Desktop fidelity: score each tile against its own backdrop, and six h…
shai-almog Sep 16, 2026
12c3a2e
Desktop fidelity: stop a missing baseline from reading as a passing gate
shai-almog Sep 16, 2026
6cf75d4
Merge remote-tracking branch 'origin/master' into desktop-native-them…
shai-almog Sep 16, 2026
22c8c2e
Compile the themes the desktop gate scores, and stage the ones the sy…
shai-almog Sep 16, 2026
77da43a
Merge remote-tracking branch 'origin/master' into desktop-native-them…
shai-almog Sep 16, 2026
c5b4e2c
Developer guide: take sql-entry and storage-content from the runner
shai-almog Sep 16, 2026
96d56fc
Put the hover flag where getStyle reads it, and give Window the same …
shai-almog Sep 16, 2026
4e4cd24
Load the Windows override layer that exists, and wait on a latch
shai-almog Sep 16, 2026
ca7eb38
Linux: reseed the DesktopMode baseline now that the port is a desktop
shai-almog Sep 16, 2026
af6d3ed
Link advapi32 unconditionally, and catch hover up when a gesture ends
shai-almog Sep 16, 2026
bb4d619
Distinguish touch and pen hover and clear window tooltips
shai-almog Sep 16, 2026
257acc9
Preserve local hover styles and reject window-leave hit targets
shai-almog Sep 16, 2026
61689ee
Carry desktop theme choices and platform fonts into packaged JavaSE apps
shai-almog Sep 16, 2026
322da2d
Handle custom desktop themes and nonpositive shadow spread
shai-almog Sep 16, 2026
cccb9fd
Correct native shadow bounds and seed macOS fidelity baseline
shai-almog Sep 16, 2026
55d17d0
Keep desktop font changes opt-in and normalize CSS shadow offsets
shai-almog Sep 16, 2026
36c9eac
Fix inherited hover and preserve progress text sizing
shai-almog Sep 16, 2026
bce0c38
Preserve fractional native shadow geometry without display density
shai-almog Sep 16, 2026
d8ce99f
Capture rasterized hover states and parse shadow padding by property
shai-almog Sep 16, 2026
5b144f4
Use native desktop font aliases and reset Linux hover metadata
shai-almog Sep 16, 2026
ecd6f4d
Match desktop fidelity captures to the native logical pixel scale
shai-almog Sep 16, 2026
6fc2908
Run Fluent fidelity with the Windows 11 reference font inventory
shai-almog Sep 16, 2026
1e194b0
Match desktop control text to native point and logical pixel sizes
shai-almog Sep 16, 2026
5d2f14d
Share installed desktop font family across system and native aliases
shai-almog Sep 16, 2026
e9fcd30
Complete hover lifecycle and runtime inheritance with native-scale ba…
shai-almog Sep 16, 2026
cb70689
Keep hover state consistent through callbacks and reusable window hide
shai-almog Sep 16, 2026
26fa2f2
Validate fidelity spec and native reference consistency in CI
shai-almog Sep 16, 2026
244659f
Bound native shadow offsets and validate hover and fidelity mappings
shai-almog Sep 16, 2026
6fb8185
Keep mobile theme hints independent of desktop opt-in
shai-almog Sep 16, 2026
cd795fc
Express hover inheritance convergence as a bounded while loop
shai-almog Sep 16, 2026
f961b51
Keep CSS blur halos on the raster shadow path
shai-almog Sep 16, 2026
e82ed60
Release hover targets and tooltips during component teardown
shai-almog Sep 16, 2026
ea0c0dd
Cancel window-owned tooltips when input is cancelled
shai-almog Sep 16, 2026
eb5664b
Merge master and preserve desktop fidelity spec support
shai-almog Sep 16, 2026
ef02531
Clear Windows hover pressure while preserving pointer source
shai-almog Sep 16, 2026
b02c494
Preserve Linux pen source across hover and contact events
shai-almog Sep 16, 2026
190ce7e
Release hover animation registrations without canceling application a…
shai-almog Sep 16, 2026
3086a74
Validate fidelity defaults and reject malformed spec fields
shai-almog Sep 16, 2026
44d0568
Honor custom theme mode in the desktop simulator skin
shai-almog Sep 16, 2026
bd82c65
Keep scrollbar fades active alongside hover background animations
shai-almog Sep 16, 2026
b83962d
Protect terminal hover leave events in desktop input queues
shai-almog Sep 16, 2026
d223dc7
Preserve inline-all overrides and theme inheritance in hover styles
shai-almog Sep 16, 2026
09d2958
Honor programmatically installed custom hover styles
shai-almog Sep 16, 2026
38bbd22
Resolve native macOS font aliases with AppKit weights
shai-almog Sep 16, 2026
8701a59
Clear hover ownership when an attached subtree is hidden
shai-almog Sep 16, 2026
efa67fc
Refresh progress mode sizing and attach fidelity focus state
shai-almog Sep 16, 2026
ce580bf
Trigger desktop fidelity when theme generators change
shai-almog Sep 16, 2026
1e81cbe
Validate fidelity materials and score shared spec changes
shai-almog Sep 16, 2026
de3b40c
Validate fidelity tile dimensions and backdrop declarations
shai-almog Sep 16, 2026
5f636b7
Validate animation frame values and capture filenames
shai-almog Sep 16, 2026
e61b73e
Preserve text input focus and enforce fidelity coverage
shai-almog Sep 16, 2026
57e8459
Track effective hover animation through lead and style changes
shai-almog Sep 16, 2026
835e70d
Preserve geometry coverage and mask grouped fidelity backdrops
shai-almog Sep 16, 2026
b83d177
Retain eraser input and require geometry when seeding baselines
shai-almog Sep 16, 2026
3214b7c
Scope native font configuration to JUnit theme installation
shai-almog Sep 16, 2026
94a1ac6
Run desktop fidelity for core and JavaSE source changes
shai-almog Sep 16, 2026
56c5cf2
Reconcile hover lead changes and enforce complete desktop captures
shai-almog Sep 16, 2026
287a40f
Clear collapsed hover state and validate fidelity renderer IDs
shai-almog Sep 16, 2026
f6b0dcb
Reject backdrop-only glass and lens fidelity captures
shai-almog Sep 16, 2026
323eea7
Preserve custom progress assets with native themes
shai-almog Sep 16, 2026
d7a3aee
Keep progress sizing stable across custom component states
shai-almog Sep 16, 2026
37d6e1d
Preserve hover state wrappers when applying CSS derivation
shai-almog Sep 16, 2026
ad9dca5
Rebuild dark desktop progress capsule borders with their colors
shai-almog Sep 17, 2026
e1a67fc
Preserve legacy macOS font mapping outside Aqua mode
shai-almog Sep 17, 2026
960a2a9
Record Window slider captures from run 35169743013
shai-almog Sep 17, 2026
f356e67
Reject Linux host aliases in GNOME fidelity filters
shai-almog Sep 17, 2026
0d56f82
Run Android editor stress teardown on the native UI thread
shai-almog Sep 17, 2026
9ee3b9f
Add required copyright header to Android editor fixture
shai-almog Sep 17, 2026
6d7ca54
Bound every simctl call in the iOS fidelity boot step
shai-almog Sep 17, 2026
730d796
Add a native theme mode that covers every OS, desktop included
shai-almog Sep 17, 2026
775e63a
Stop the playground editor tripwire matching a country and a font
shai-almog Sep 17, 2026
8e1454a
Keep the new theme hint prose inside the developer guide's style gate
shai-almog Sep 17, 2026
75b595a
Give the gradle distribution download a retry window worth having
shai-almog Sep 17, 2026
54feefb
Reseed the macOS map goldens for the vector map labels
shai-almog Sep 17, 2026
a158f89
Say what the backend servers did when a backend test fails
shai-almog Sep 17, 2026
2f5ee80
Pin the backend TLS test to the certificate it generated
shai-almog Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# actionlint configuration. See scripts/check-workflows.sh.

self-hosted-runner:
# windows-11-arm is a REAL GitHub-hosted label -- parparvm-tests-windows.yml runs on it
# and has done for months. actionlint ships a static list of known labels and that list
# lags GitHub's, so the label is reported as unknown.
#
# Declared here rather than by muting the runner-label rule, so a genuine typo in a
# runs-on is still caught.
labels:
- windows-11-arm
5 changes: 4 additions & 1 deletion .github/workflows/_build-mac-port.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ jobs:
steps:
- uses: actions/checkout@v6

- name: Verify native macOS font aliases with AppKit
run: python3 scripts/test_mac_native_font.py

- name: Cache CocoaPods and user gems
uses: actions/cache@v5
with:
Expand Down Expand Up @@ -204,7 +207,7 @@ jobs:

- name: Build macOS port
if: steps.cn1_built.outputs.cache-hit != 'true'
run: ./scripts/build-mac-port.sh -q -DskipTests
run: ./scripts/build-mac-port.sh -q -Dtest=MacNativeFontModeTest -Dsurefire.failIfNoSpecifiedTests=false
timeout-minutes: 40

- name: Report cache outcome
Expand Down
59 changes: 59 additions & 0 deletions .github/workflows/check-workflows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Check workflows

# A workflow file GitHub rejects is not a broken job, it is a broken BRANCH: an invalid
# file produces a failed check run on every push to every branch that contains it,
# regardless of that workflow's own triggers and regardless of what the push touched. The
# only symptom is "This run likely failed because of a workflow file issue" with no log,
# which reads like infrastructure noise rather than a file someone has to fix.
#
# That happened here. A job-level `if:` referencing the `matrix` context took two unrelated
# pull requests red for hours. Nothing local objected, because the file is valid YAML --
# yaml.safe_load parses it, an editor shows nothing, and the error exists only in GitHub's
# own expression parser. actionlint reimplements that parser.
#
# Runs on pull_request as well as push, because the point is to catch the file BEFORE it
# reaches a branch other people build on. It is cheap: one ubuntu minute, no build.

permissions:
contents: read

on:
workflow_dispatch:
pull_request:
branches:
- master
push:
branches:
- master

jobs:
check-workflows:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

# Deliberately NOT filtered by paths. A workflow file is only one of the ways this
# check goes stale: actionlint's own rules move, and a run over an unchanged tree
# that starts failing is information rather than noise.
- name: Validate every workflow file
run: scripts/check-workflows.sh

# This workflow is unfiltered, so changes to the spec, its validator, or any
# native reference table are checked before they reach master.
- name: Validate fidelity spec and native reference tables
run: |
python3 scripts/test_check_fidelity_spec.py
python3 scripts/check-fidelity-spec.py

- name: Check desktop hover queues under saturation
run: python3 scripts/test_native_hover_queue.py

- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'

- name: Check fidelity baseline coverage enforcement
run: |
python3 scripts/test_fidelity_gate.py
python3 scripts/test_fidelity_geometry.py
151 changes: 151 additions & 0 deletions .github/workflows/fidelity-desktop-native-ref.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
---
name: Desktop native reference capture

# Captures REAL native desktop widget screenshots -- Windows 11 Fluent (WinUI 3),
# macOS (AppKit) and GNOME (GTK4 + libadwaita) -- on hosted runners, and uploads
# them for human review. It commits nothing and gates nothing.
#
# MANUAL DISPATCH ONLY, on purpose. There is deliberately no schedule and no path
# filter. A native reference *defines* the design generation the themes are
# authored against; a job that re-captured it on its own would quietly re-anchor
# that definition, turning a real OS-level design change into a green build. This
# is the same doctrine scripts/build-ios-native-ref.sh and
# scripts/build-android-native-ref.sh already state for the mobile references,
# which CI is likewise forbidden from generating.
#
# Why the maintainer's own machine cannot do this: a working developer's Mac has a
# chosen accent colour, a chosen appearance and custom fonts, and there is no
# pristine Windows 11 or GNOME box to hand. The hosted runner IS the pristine
# machine -- which is the whole reason this workflow exists.
#
# Promotion of an artifact into a committed golden set is a human act with a
# written protocol: scripts/fidelity-app/goldens/README.md.

'on':
workflow_dispatch:
inputs:
targets:
description: 'Which reference toolkits to run'
required: true
default: all
type: choice
options: [all, windows, macos, gnome]
mode:
description: 'probe = answer the environment go/no-go questions only; capture = produce reference tiles'
required: true
default: probe
type: choice
options: [probe, capture]
windows_runner:
description: 'windows-11-arm is a real Windows 11 client; windows-latest is Windows SERVER (Mica falls back silently)'
required: false
default: windows-11-arm
type: choice
options: [windows-11-arm, windows-latest]

# No concurrency group at all, which took two tries to get right.
#
# Cancelling in progress -- copied from the PR-gating workflows, where a superseded commit's
# result is genuinely worthless -- is wrong here: a capture run exists to produce evidence,
# and a second dispatch to iterate on one platform would destroy the answer the first was
# dispatched for.
#
# But merely turning cancellation off is not enough, because the group still serialises.
# Measured: a Windows-only dispatch sat in `pending` behind an unrelated run whose macOS leg
# had been waiting an hour for a runner, so the cheap 3-minute leg could not iterate at all.
# The legs are independent and a human dispatches this a few times a day; there is no
# pile-up to protect against, and any grouping only couples platforms that share nothing.

permissions:
contents: read

jobs:
gnome-ref:
if: ${{ inputs.targets == 'all' || inputs.targets == 'gnome' }}
name: GNOME (GTK4 + libadwaita)
runs-on: ubuntu-latest
timeout-minutes: 30
env:
CN1SS_FIDELITY_GOLDEN_SET: gnome-adwaita
NATIVEREF_MODE: ${{ inputs.mode }}
steps:
- uses: actions/checkout@v6
- name: Install the GTK4 / libadwaita stack
run: |
scripts/ci/apt-get-install.sh \
libgtk-4-dev libadwaita-1-dev adwaita-icon-theme fonts-cantarell \
xvfb openbox dbus-x11 libgl1-mesa-dri
- name: Capture
run: scripts/build-gnome-native-ref.sh
- name: Report the environment this run saw
if: always()
run: |
echo '--- capture-manifest.json ---'
cat artifacts/desktop-native-ref/gnome/capture-manifest.json || true
- uses: actions/upload-artifact@v7
if: always()
with:
name: desktop-native-ref-gnome
path: artifacts/desktop-native-ref/gnome/**
if-no-files-found: error
retention-days: 14

windows-ref:
if: ${{ inputs.targets == 'all' || inputs.targets == 'windows' }}
name: Windows (WinUI 3 / Fluent)
runs-on: ${{ inputs.windows_runner }}
timeout-minutes: 30
env:
CN1SS_FIDELITY_GOLDEN_SET: windows-11-fluent
NATIVEREF_MODE: ${{ inputs.mode }}
steps:
- uses: actions/checkout@v6
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
# The WindowsAppSDK packaging targets resolve eight MSBuild tasks out of Visual
# Studio's AppxPackage assembly, which the .NET SDK has never carried. `dotnet build`
# therefore cannot build a WinUI 3 app at all, whichever SDK version is selected.
- name: Put Visual Studio's MSBuild on PATH
uses: microsoft/setup-msbuild@v2
- name: Capture
shell: pwsh
run: ./scripts/build-windows-native-ref.ps1
- name: Report the environment this run saw
if: always()
shell: pwsh
run: |
Write-Host '--- capture-manifest.json ---'
Get-Content artifacts/desktop-native-ref/windows/capture-manifest.json -ErrorAction SilentlyContinue
- uses: actions/upload-artifact@v7
if: always()
with:
name: desktop-native-ref-windows
path: artifacts/desktop-native-ref/windows/**
if-no-files-found: error
retention-days: 14

macos-ref:
if: ${{ inputs.targets == 'all' || inputs.targets == 'macos' }}
name: macOS (AppKit)
runs-on: macos-15
timeout-minutes: 30
env:
CN1SS_FIDELITY_GOLDEN_SET: macos-aqua
NATIVEREF_MODE: ${{ inputs.mode }}
steps:
- uses: actions/checkout@v6
- name: Capture
run: scripts/build-macos-native-ref.sh
- name: Report the environment this run saw
if: always()
run: |
echo '--- capture-manifest.json ---'
cat artifacts/desktop-native-ref/macos/capture-manifest.json || true
- uses: actions/upload-artifact@v7
if: always()
with:
name: desktop-native-ref-macos
path: artifacts/desktop-native-ref/macos/**
if-no-files-found: error
retention-days: 14
35 changes: 30 additions & 5 deletions .github/workflows/native-themes-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ jobs:
bash $GITHUB_WORKSPACE/scripts/ci/retry.sh mvn -B -pl css-compiler -am install -DskipTests -Dmaven.javadoc.skip=true -Plocal-dev-javase

- name: Rebuild native themes
env:
# Makes the script record every file it wrote, so the commit step below stages
# what this run actually produced instead of a list kept by hand.
NATIVE_THEMES_MANIFEST: ${{ runner.temp }}/native-themes-written.txt
run: ./scripts/build-native-themes.sh

- name: Commit and push regenerated .res files
Expand All @@ -80,11 +84,32 @@ jobs:
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
# Themes/ holds the single source of truth. Each downstream consumer
# (nativeios.jar, the Android port jar, the simulator fat-jar, the
# BuildDaemon's sibling cn1 checkout) copies from Themes/ at its own
# build time, so this workflow only commits these two files.
git add Themes/iOSModernTheme.res Themes/AndroidMaterialTheme.res
# Stage what THIS RUN wrote, from the manifest the script emits, rather than
# from a list kept here. The list used to be the two mobile themes and stayed
# that way when three desktop themes and two committed port mirrors joined the
# script: a desktop-only CSS change regenerated three .res files, staged none,
# reported "nothing to commit" and left every downstream build on the previous
# binary -- silently, because "nothing to commit" is what a no-op run says too.
#
# Untracked outputs are skipped deliberately. The script also mirrors into the
# JavaScript port's asset directory, which does not commit these themes, and
# staging blind there would start committing binaries nobody asked for.
staged="${RUNNER_TEMP}/native-themes-staged.txt"
: > "$staged"
while IFS= read -r f; do
[ -n "$f" ] || continue
if git ls-files --error-unmatch -- "$f" >/dev/null 2>&1; then
printf '%s\n' "$f" >> "$staged"
else
echo "not tracked, not staging: $f"
fi
done < "${RUNNER_TEMP}/native-themes-written.txt"
if [ ! -s "$staged" ]; then
echo "The theme build recorded no tracked outputs; refusing to report success." >&2
exit 1
fi
echo "Staging:"; cat "$staged"
git add --pathspec-from-file="$staged"
if git diff --staged --quiet; then
echo "No .res changes; nothing to commit."
exit 0
Expand Down
Loading
Loading