Skip to content

Open a script app at its manifest's window size; PDF Tools asks for 1536 x 1024 - #478

Merged
ymote merged 4 commits into
mainfrom
feat/app-window-hint
Oct 11, 2026
Merged

ymote merged 4 commits into
mainfrom
feat/app-window-hint

Conversation

@ymote

@ymote ymote commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Why

The desktop opened every app's window at 72% × 76% of the desk, at most 1000 × 720 points (crates/shell/src/desktop_layout.rs), and an app had no way to ask for more. PDF Tools v2 was designed at 1536 × 1024, so in that window its Combine button and its Home captions fall below the fold.

The decision: apps may ask for a larger desktop window, and PDF Tools uses it. App Hub contract 1.12.0 (App Hub #207, merged as d86101d7) adds the optional manifest field window. It is a hint, not a grant, and it needs schema_minor 1.

What changes

Repin App Hub to d86101d7 (#207's merge commit, which is App Hub main)

  • Root Cargo.toml: the four App Hub crates and the [patch.crates-io] octosense-app-contract line.
  • native-apps.json: App Hub's source; tools/native_apps.py regenerates octosense-app-hub-app from it.
  • Cargo.lock: only the five App Hub source lines, plus octosense-app-contract moving from 1.11.0 to 1.12.0.
  • The workspace's octosense-app-contract requirement moves from "1.11" to "1.12", because the shell now reads manifest.window. The [patch.crates-io] git source supplies 1.12.0.
  • One contract for the whole graph. cargo tree --locked -i octosense-app-contract shows a single octosense-app-contract v1.12.0 from App Hub d86101d7, used by octosense-app-policy, octosense-shell, rinx, rinx-miniapp-catalog and rinx-system-apps.
  • apps.yml's check "One Makepad, App Hub, octos and Rinx in the locked graph" passes, and so does python3 tools/setup.py --check --cargo. Both were re-run after rebasing onto main 3eef4473.

The shell

  • When the desktop opens a window for a script app (system or installed), App::launch_module_as asks apps::window_hint for the manifest's window.
  • window_hint reads the bundle the Card runner is about to open: a system app's admitted build (unpacked on its first launch) or the installed app's bundle.
  • WmLayout::insert_sized then opens the window at desktop_layout::preferred_size:
    • the hint, clamped to the desk minus the margins every new window keeps (42 points left and right, 32 top and bottom);
    • never below the 80 × 60 that a resize drag leaves;
    • placed the way windows are placed today: 42 and 32 points in, each later window cascading 30.
  • The dock. OctoSense's and macOS's docks float over the desk and reserve no strip.
    • desktop::dock_overlay reads, from the shelf's own geometry, how many points of the work area's bottom the dock covers: 78 for macOS and OctoSense, and 0 for Windows (its taskbar reserves its strip), NeXTSTEP, Omarchy and the phone rows.
    • preferred_size clamps the hint to the room above the dock, so the window ends 32 points above it. The zoom bar and the status line ("Saved", storage use) are never behind the dock.
    • One step beyond preferred_size, for review. The hint path's placement uses the same room above the dock. Without that, the third and later cascaded windows on a 900-point-tall desk would again end up to 78 points behind the dock. A test covers all seven cascade positions.
    • Default-size windows and the shell's own maximize are unchanged.
  • Without window, and for every other module, today's rule is unchanged. The constants now have names, and a test pins the old numbers.
  • Phones ignore the hint, because their apps are full-screen.
  • The resize drag uses the same minimum constants.
  • Native app modules are unchanged. Their extra windows still ignore the size they request (WindowRequest::Open { size: _ }), as agreed.

PDF Tools. The bundle's manifest sets "schema_minor": 1 and "window": {"width": 1536, "height": 1024}. System-app packing still works by digest from desktop/system-apps.json.

Tests

  • desktop_layout:
    • the default size and cascade are unchanged;
    • a desk larger than the hint opens the window at the hint's size;
    • a desk smaller than the hint clamps it, and the margins hold on the right and bottom;
    • a dock that floats over the desk: the window ends 32 points above it, and every cascaded window ends at or above the dock's top;
    • a dock that reserves its strip, or no dock: the size is as before;
    • a tiny desk never goes below 80 × 60.
  • desktop::tests::the_dock_overlays_the_desk_only_where_it_floats_over_it:
    • 78 points for OctoSense and macOS, matching the drawn shelf;
    • 0 for every other style;
    • mid-tween, it reads the style the tween is heading to.
  • apps::tests::a_script_apps_manifest_window_is_the_size_it_asks_for checks window_hint on:
    • a packed system app;
    • an installed bundle;
    • a manifest with no hint;
    • a manifest App Hub refuses;
    • a non-script app;
    • the build's own PDF Tools.
  • pdftools_model_tests::the_shipped_manifest_asks_for_the_designs_window_size.

Docs (English and Chinese together)

  • apps/pdftools/README: the window section, the wide layout, status and known limits.
  • desktop/docs/code-walkthrough: how a script app's window gets its size, and the margin above a floating dock.
  • apps/README: the bundle's manifest fields.

PDF Tools at its own size, with the real engine

The binary was target/debug/octosense, built with cargo build --locked -p octosense --no-default-features --features app-hub,craft-engines at 487c79db. That commit's crates/shell, desktop, apps/pdftools/bundle and Cargo.lock trees are the same at this head. It ran on macOS (Apple silicon).

Each run:

  • was started from a Terminal.app tab with a fresh OCTOSENSE_HOME, MAKEPAD_HIDE_WINDOWS=1 and MAKEPAD_REMOTE=127.0.0.1:8915;
  • held the shell-run lock, with no other OctoSense running;
  • was driven over the remote bridge and ended with /quit;
  • took no OS screenshots.

The frames and receipt are in apps/pdftools/tests/evidence/window-20261010/.

  • apps/pdftools/tests/ui.py's shell run, unchanged, light and then dark, with PDF Tools opened at startup (MAKEPAD_WM_TEST_APP):
    • The window was 1296 × 698 and the app had 1292 × 662, which is its wide layout (1180 points and up).
    • Every step of both passes passed with the real pdf engine, at the runtime's 64 ms script budget, with no script errors.
    • Frames of the app's area: Home, Reading, Find, Comment with a highlight, Combine (before and after one scroll), Edit, and Reading in the dark pass.
    • In every frame the status line and the zoom bar sit above the dock.
  • Opened from the shell's menu on a drawn desk (1400 × 897 shell, 1380 × 845 work area):
    • The log says wm: pdftools asks for a 1536x1024 window; it opens at 1296x703 (the dock covers 78 points of the desk).
    • The window is at (52, 74). Its bottom, y 777, is 32 points above the dock's top at 809.
    • The app area is 1292 × 667. Before this change it was 990 × 603.

Findings (recorded in the receipt and the READMEs)

  • Combine: with two PDFs listed, the card's own Combine button is not visible without scrolling at this size. It is 85 points below the fold: its bottom would be at y 778, and the canvas ends at 693. One scroll shows it (wide/06a-combine-end.png).
  • Home: the cards' third caption line (when each PDF was last opened) sits at the fold, with 2 of its 18 points showing.
  • Why: keeping the window above the dock costs 78 points of height on a window 898 points tall. Before that change, the startup window's app area was 740 tall: Home's captions fitted, and the Combine button was about 7 points short. Screens about 985 points tall or more show both.
  • Known: a comment made on 10 Oct (PDT) is dated 11 Oct. This is the UTC reading already listed in the README.

What ran

On the Linux build host (x86_64), at 487c79db, from a fresh clone:

  • python3 tools/setup.py --check --cargo: passed.
  • The new and changed tests, with the desktop system-app selection: cargo test --locked -p octosense-shell --features mobile-apps --lib -- desktop_layout desktop::tests apps::tests::a_script_apps_manifest_window_is_the_size_it_asks_for pdftools_model. 32 passed.
  • The shell suite AGENTS.md lists, from phone/: cargo test --locked --features mobile-apps -p octosense-shell, with phone.yml's OCTOS_SHELL_TEST_KERNEL and MAKEPAD_SPLASH_BUDGET_MS=10000. 1177 passed, 0 failed.
  • cargo check --locked -p octosense-home --features mobile-apps, from phone/: passed.
  • cargo check --locked -p octosense, from desktop/: passed.
  • At 587aefd4, the first commit, these also passed: cargo check --locked -p octosense --features mobile-apps and bash ../tools/check-shell-graph.sh -p octosense, from desktop/; and bash ../tools/check-shell-graph.sh -p octosense-home, from phone/. apps.yml's locked-graph check also passed: cargo tree --locked -p octos-app -i octos-core --target all --depth 0 shows one octos.

On the Mac:

  • The two debug builds.
  • The hidden-shell runs above.
  • python3 tools/setup.py --update, --check --cargo and python3 tools/native_apps.py --check. The last two were run again after the rebase onto main 3eef4473, which changed only tools/ci_local_merge.py, its test and docs/local-ci.md.
  • python3 -m unittest rom/tests/test_no_local_paths.py.

App Hub's gate on the PDF Tools bundle, with hub from App Hub #207's tree, on a stamped copy (hub check --system-app):

  • It refuses only for a missing listing.json. That is a store requirement no system app bundle meets, and main's bundle gets the same single refusal.
  • With a scratch listing added (it is not shipped), the bundle passes with only the unsigned warning.

What did not run

  • tools/ci-local.sh. The coordinator gates it.
  • The macOS cargo check variants (desktop.yml's three, and phone.yml's default and AppCard).
  • The PDF Tools restart, full and empty runs at the new size.
  • Screens taller than the hidden shell's fixed 1400 × 900, and other styles.
  • Windows, Linux desktops and phones (phones ignore the hint by design).

🤖 Generated with Claude Code

ymote and others added 4 commits October 10, 2026 19:47
…536 x 1024

The desktop opened every app at 72% x 76% of the desk, at most 1000 x 720
points, and an app had no way to ask for more. PDF Tools v2 was designed
at 1536 x 1024, so its Combine button and Home captions fell below the
fold. App Hub's contract 1.12.0 (App Hub #207, merged as d86101d7) adds
the optional manifest field `window`, a hint that grants nothing, which
needs schema_minor 1.

Repin App Hub to d86101d7: the four App Hub crates, the [patch.crates-io]
contract line and native-apps.json's App Hub source; in Cargo.lock only
the five App Hub source lines and the contract's 1.11.0 -> 1.12.0. The
workspace's contract requirement moves to "1.12", since the shell now
reads `manifest.window`; Rinx and every other member still resolve to
one contract.

The shell: when the desktop opens a window for a script app, system or
installed, `apps::window_hint` reads `window` from the bundle the Card
runner opens (a system app's admitted build, unpacked now on its first
launch, or the installed bundle), and `WmLayout::insert_sized` opens the
window at `desktop_layout::preferred_size`: that size, clamped to the desk
minus the margins new windows keep (42 points left and right, 32 top and
bottom), never below the 80 x 60 a resize drag leaves, placed as every
window is (42/32 in, cascading 30). Without a hint, and for every other
module, the default rule is unchanged. Phones ignore it. The resize drag
now names the same minimum constants. Native modules' own window size
requests (`WindowRequest::Open { size }`) are still ignored.

PDF Tools sets "schema_minor": 1 and "window": {"width": 1536, "height":
1024}.

Tests: the default size is unchanged, a desk larger than the hint opens it
at its size, a smaller desk clamps it to the desk minus the margins, a tiny
desk never goes below the minimum; window_hint reads a packed system app,
an installed bundle, no hint, a refused manifest and a non-script app; the
build's packed PDF Tools and the shipped manifest ask for 1536 x 1024.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PDF Tools' README (English and Chinese) said the desktop opens every app
at the default 72% x 76% of the desk and that an app could not ask for
more. It now says the manifest asks for the designs' 1536 x 1024, how the
desk clamps it, what a hidden shell measured, and that the modes were not
re-run at the new size. The code walkthrough describes how a script app's
window gets its size, and the apps guide lists `window` among a bundle's
manifest fields, in both languages.

Evidence (tests/evidence/window-20261010): a hidden desktop shell built
from 587aefd, PDF Tools opened from the shell's menu once the desk had
drawn. The 1400 x 899 shell has a 1380 x 847 tile area, and the window
opens at 1296 x 783 points, 42 in left and right and 32 top and bottom,
an app area of 1292 x 747; before, the default window gave 990 x 603. One
/g grab at one pixel per point, and a receipt with the binary's digest.
Opened at startup through MAKEPAD_WM_TEST_APP it was 1296 x 776, sized on
the shell's startup proportions as every window opened then is. The
OctoSense style's dock overlays the desk, so the window's lowest points
sit behind it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… desk

OctoSense's and macOS's docks float over the bottom of the desk and reserve
no strip, so a window clamped to the desk minus its margins had its lowest
points behind the dock: about 45 points of PDF Tools' window, where its
zoom bar and its status line ("Saved", storage use) sit.

`desktop::dock_overlay` says how many points of the work area's bottom the
dock covers, from the shelf's own geometry for the style the tween is
heading to: 78 for macOS and OctoSense, 0 for Windows (whose taskbar
reserves its strip), NeXTSTEP, Omarchy and the phone rows.
`desktop_layout::preferred_size` clamps the hint to the room above the dock,
less the usual margins, so the window ends 32 points above the dock; the
hint path's placement uses the same room, so a cascaded window moves up
instead of down behind the dock. Default-size windows and the shell's own
maximize are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
apps/pdftools/tests/ui.py's `shell` run, unchanged, light and then dark,
in a hidden desktop shell built from 487c79d with the dock margin: the
window opened at 1296 x 698 (on the startup proportions), the app had
1292 x 662, its wide layout, and every step of both passes passed with the
real pdf engine at the runtime's 64 ms budget, with no script errors and a
clean /quit. Frames of the app's area (one pixel per point) in
tests/evidence/window-20261010/wide/: Home, Reading, Find, Comment with a
highlight, Combine before and after one scroll, Edit, and Reading in the
dark pass. In every frame the status line and the zoom bar sit above the
dock. Opened from the shell's menu on a drawn desk, the window is
1296 x 703, 32 points above the dock (opened-from-the-menu.png, the whole
hidden window).

What the run showed, recorded in the receipt and the READMEs: at this
898-point-tall window, with two PDFs listed, Combine's own button is
85 points below the fold (one scroll shows it), and Home's last caption
line sits at the fold. Keeping the window above the dock costs 78 points
of height here; before that change both fitted or nearly did.

The PDF Tools README (English and Chinese) gives the new size, the wide
layout and these limits; the code walkthrough describes the margin kept
above a dock that floats over the desk.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ymote
ymote force-pushed the feat/app-window-hint branch from 487c79d to d28f3f7 Compare October 11, 2026 02:47
@ymote
ymote marked this pull request as ready for review October 11, 2026 03:04
@ymote

ymote commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Local CI passed on d28f3f7 (tools/ci-local.sh --only all --linux-host --offload, 13m59s, Darwin arm64; the ubuntu jobs and the macOS jobs' portable steps (their macOS steps ran here) on the Linux build host, Linux x86_64).

GitHub would run for this PR: desktop.yml, phone.yml, apps.yml. Merged on this local pass (macOS runner queue); GitHub CI runs on the merge commit on main.

Job Step Result Time
ci-local / drift The local mapping fits the workflows PASS -
desktop.yml / desktop Prepare the pinned framework sources PASS 0s
desktop.yml / desktop Compile the desktop with the shared runtime PASS 4m35s
desktop.yml / desktop Desktop tools and scripts PASS 14s
desktop.yml / desktop (linux) Prepare the pinned framework sources PASS 1s
desktop.yml / desktop (linux) One copy of every shell source PASS -
desktop.yml / desktop (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 2s
desktop.yml / desktop (linux) The native apps' generated places match native-apps.json PASS 0s
desktop.yml / native-host-api Prepare the pinned framework sources PASS 1s
desktop.yml / native-host-api Build the native acceptance host and pinned Hub CLI PASS 1m02s
desktop.yml / native-host-api Signed app tool calls a real OS permission API PASS 2s
phone.yml / home Prepare pinned sources and the reviewed runtime patch PASS 1s
phone.yml / home Validate launcher icons and Apple asset catalogs PASS 4s
phone.yml / home Compile Home and its bundled modules PASS 4m30s
phone.yml / home (linux) Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home (linux) Verify the single runtime graph PASS 1s
phone.yml / home (linux) The native apps' generated places match native-apps.json PASS 0s
phone.yml / home (linux) The pinned octos revision PASS 0s
phone.yml / home (linux) Build octos (unless cached) PASS -
phone.yml / home (linux) Build Home, App Hub admission and runtime policy tests PASS 3m12s
phone.yml / home (linux) Test Home, App Hub admission and runtime policy PASS 40s
phone.yml / home (linux) Two-lane scenario (real kernel, scripted model) PASS 27s
phone.yml / home (linux) Build opt-in AppCard tests PASS 2m41s
phone.yml / home (linux) Test opt-in AppCard PASS 1s
phone.yml / home (linux) Build craft-engine relay and system-chat tests PASS 2m45s
phone.yml / home (linux) Test craft-engine relay and system chat PASS 4s
phone.yml / home (linux) Build linked Terminal tests PASS 2m26s
phone.yml / home (linux) Test linked Terminal PASS 1s
phone.yml / home (linux) Build Wasm and runtime policy tests PASS 1m15s
phone.yml / home (linux) Test Wasm and runtime policy PASS 11s
apps.yml / services (linux) python3 tools/setup.py PASS 0s
apps.yml / services (linux) Shared system app interface PASS 0s
apps.yml / services (linux) Kernel service PASS 16s
apps.yml / services (linux) App peers PASS 29s
apps.yml / services (linux) AI providers config PASS 4s
apps.yml / services (linux) Connected provider protocols and Linux host adapter PASS 48s
apps.yml / services (linux) L0 in-card chat (sys.chat, host side) PASS 9s
apps.yml / services (linux) System toolbox (workflow templates) PASS 1m29s
apps.yml / kernel-security (linux) python3 tools/setup.py PASS 0s
apps.yml / kernel-security (linux) The pinned octos revision PASS 0s
apps.yml / kernel-security (linux) Build octos (unless cached) PASS -
apps.yml / kernel-security (linux) Real-kernel tests PASS 38s
apps.yml / apps (linux) python3 tools/setup.py PASS 0s
apps.yml / apps (linux) Host services (Mail, AI providers, News) PASS 2m02s
apps.yml / apps (linux) Connected accounts and Rinx editor PASS 1m32s
apps.yml / apps (linux) Shell AI services (crates/ai-host) PASS 2m55s
apps.yml / apps (linux) AppCard runtime setup safeguards PASS 0s
apps.yml / apps (linux) AppCard clippy (own crates; shared runtime compiles) PASS 27s
apps.yml / apps (linux) AppCard transport and store PASS 7s
apps.yml / apps (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 2s
rom.yml / product (linux) python3 -m unittest discover -s tests -v SKIPPED (!) -
rom.yml / product (linux) Check generated Agent Binder client SKIPPED (!) -
rom.yml / product (linux) bash -n scripts/stage-forks.sh scripts/publish-release.sh scripts/apply-to-tree.sh scripts/build-rom.sh PASS -
rom.yml / web-installer (linux) npm ci --ignore-scripts --no-audit --no-fund SKIPPED (!) -
rom.yml / web-installer (linux) npm test SKIPPED (!) -
rom.yml / web-installer (linux) npx playwright install --with-deps chromium SKIPPED (!) -
rom.yml / web-installer (linux) npm run test:browser SKIPPED (!) -
rom.yml / web-installer (linux) python3 -m unittest discover -s tests -p test_installer_manifest.py -v SKIPPED (!) -
rom.yml / web-installer (linux) bash -n scripts/release.sh SKIPPED (!) -
linux-host / sandbox (linux) python3 tools/setup.py PASS 0s
linux-host / sandbox (linux) Process sandbox on Linux (Landlock, seccomp) PASS 1m42s

Skipped (these did NOT pass; (!) marks a skip that blocks tools/ci-local-merge.sh):

  • rom.yml / product (linux): python3 -m unittest discover -s tests -v: javac -version does not work here: install a JDK (17 or newer) and put its bin/ on PATH or set JAVA_HOME
  • rom.yml / product (linux): Check generated Agent Binder client: needs build-tools/35.0.0/aidl, platforms/android-35/framework.aidl in the Android SDK (no Android SDK found): install the SDK packages 'build-tools;35.0.0' and 'platforms;android-35' (sdkmanager) and set ANDROID_HOME
  • rom.yml / web-installer (linux): npm ci --ignore-scripts --no-audit --no-fund: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm test: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npx playwright install --with-deps chromium: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm run test:browser: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): python3 -m unittest discover -s tests -p test_installer_manifest.py -v: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): bash -n scripts/release.sh: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH

Notes:

  • GitHub runs Python 3.12; this run used Python 3.9.6
  • GitHub runs Python 3.12; the Linux host used Python 3.14.4

Native GitHub acceptance passed on the same head: embedded-browser.yml.

@ymote
ymote merged commit 5c28da7 into main Oct 11, 2026
4 of 9 checks passed
@ymote
ymote deleted the feat/app-window-hint branch October 11, 2026 03:04
ymote added a commit that referenced this pull request Oct 11, 2026
…ort window

With the desktop's window above the dock (1292 x 662, #478), Combine's own
button sat 85 points below the fold with two PDFs listed. Now:

- When the list fits, the card is as design 06 draws it.
- When it doesn't, a tall card fills the pane. Its title and footer ("One
  PDF of N pages", Name and the Combine button) stay in view, and the file
  list scrolls inside it.
- The tall card's list is a static scroll view, so it keeps its place
  while the list is drawn again (adding a PDF, typing its pages).
- combine_list_h and combine_fits do the height math from the design's
  measures, and are model-tested.

In the shell's default window (990 x 603):
- The Edit panel draws its gaps tighter, so Apply and Cancel stay in view
  under Alignment and Colour.
- Colour's box opens into its seven colours in its own row instead of a
  row below it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ymote added a commit that referenced this pull request Oct 11, 2026
…wn size

ui.py's shell, restart, full and empty runs, rebased on main with #478.
They ran in a hidden desktop shell with the real pdf engine, at the runtime's
64 ms budget, with PDF Tools at its own window size (an app area of 1292 x
662), light and dark. The fixture run used card-host at the designs'
1536 x 1024.

What they show:
- comment dates in this machine's local time ("Today 20:21" when UTC was
  03:21 the next day);
- the Edit panel's Alignment and Colour applied by the engine;
- the status line from files.status ("187 KB of 64 MB used" for a storage
  of 191,793 bytes; the PDFs alone are 38,356);
- one cover per PDF, kept untouched across a restart;
- Combine's own button in view with two PDFs listed (before, 85 points
  below the fold);
- with the storage full, cards that still show their pages and size.

The receipt holds the digests, the commands and the numbers. The README's
Verified, Not verified and Known say so in English and Chinese.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ymote added a commit that referenced this pull request Oct 11, 2026
…ort window

With the desktop's window above the dock (1292 x 662, #478), Combine's own
button sat 85 points below the fold with two PDFs listed. Now:

- When the list fits, the card is as design 06 draws it.
- When it doesn't, a tall card fills the pane. Its title and footer ("One
  PDF of N pages", Name and the Combine button) stay in view, and the file
  list scrolls inside it.
- The tall card's list is a static scroll view, so it keeps its place
  while the list is drawn again (adding a PDF, typing its pages).
- combine_list_h and combine_fits do the height math from the design's
  measures, and are model-tested.

In the shell's default window (990 x 603):
- The Edit panel draws its gaps tighter, so Apply and Cancel stay in view
  under Alignment and Colour.
- Colour's box opens into its seven colours in its own row instead of a
  row below it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ymote added a commit that referenced this pull request Oct 11, 2026
…wn size

ui.py's shell, restart, full and empty runs, rebased on main with #478.
They ran in a hidden desktop shell with the real pdf engine, at the runtime's
64 ms budget, with PDF Tools at its own window size (an app area of 1292 x
662), light and dark. The fixture run used card-host at the designs'
1536 x 1024.

What they show:
- comment dates in this machine's local time ("Today 20:21" when UTC was
  03:21 the next day);
- the Edit panel's Alignment and Colour applied by the engine;
- the status line from files.status ("187 KB of 64 MB used" for a storage
  of 191,793 bytes; the PDFs alone are 38,356);
- one cover per PDF, kept untouched across a restart;
- Combine's own button in view with two PDFs listed (before, 85 points
  below the fold);
- with the storage full, cards that still show their pages and size.

The receipt holds the digests, the commands and the numbers. The README's
Verified, Not verified and Known say so in English and Chinese.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant