fix(prefs): make the palette picker expand and scroll properly - #3
fix(prefs): make the palette picker expand and scroll properly#3hanthor wants to merge 25 commits into
Conversation
Show All Palettes did not expand the list: it collapsed it to a single
clipped row of three cards with no way to reach the other 241, and the
scroll wheel scrolled the page instead of the list.
The flow box was wrapped in a ScrolledWindow nested inside the
AdwPreferencesPage, which is already a scroller. A nested scrollable is
allocated its minimum height rather than its natural one, so
propagate-natural-height plus max-content-height never produced the
intended 480px viewport, and the inner scroller trapped the wheel. Drop
the wrapper and let the flow box grow in the group so the page scrolls
it, which is the native behavior and cannot trap scrolling.
Two more defects in the same picker:
- buildPaletteCSS added a fresh display-wide CSS provider on every
call, and it is called on every expand/collapse, so a ~1200-rule
stylesheet (244 palettes) was stacked on the display repeatedly,
with every stale copy still matched against every widget. Reuse a
single provider and reload its contents.
- Three of the eleven curated palette ids (high-contrast,
solarized-dark, vs-code) matched no palette file, so the default
view silently showed eight. Use the names the vendored collection
actually uses, and place each curated entry at most once since that
collection contains names differing only by case.
Verified against a real build under Xvfb: 11 featured cards, expand to a
readable scrollable grid of all 244, collapse back to 11, and clicking a
card still applies the palette.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift
Found while investigating the palette picker; all in the light/dark
style selector in the main menu.
- Every click raised a "Reloaded the configuration" toast, because
picking a style writes the config and triggers a full reload, and
the reload toast is meant for reloads the user asked for. Mark
internal reloads quiet: the picker's own write, and soft reloads
(which happen on every desktop light/dark switch now that the
built-in colors depend on the theme conditional). The flag is set
once per reload so every window agrees, and a user-initiated reload
still toasts.
- The style now applies immediately on click instead of waiting for
the debounced reload, and a failed config write puts the buttons
back rather than leaving them claiming a style that wasn't saved.
- The compact header has its own copy of the selector, but only the
primary one was ever refreshed, and neither followed the config.
Track both and sync them on config change as well as on menu open,
so the selection can't drift from a change made in another window,
the other header, or an edited config file.
- The selected-state checkmark was drawn by the indicator node, which
GTK packs at the start of the button, so it sat jammed against the
circle's left edge, half over the ring. Drop it and mark selection
with the accent ring alone, which also removes a dependency on an
icon-theme name.
- The selector stylesheet is display-wide but was installed once per
window, stacking an identical provider for every window opened.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift
…me-jcx8vw fix: palette picker expand/scroll, and style picker toast/drift/drawing
The repo has no GitHub releases at all: upstream's release-tip.yml and release-tag.yml are gated to github.repository_owner == 'ghostty-org', so they never run in this fork, and nothing else creates one. The only download the docs can point at is a workflow artifact, which expires after 7 days -- that is what the nightly.link install instructions in the README and on the docs page rely on. The flatpak bundles for both arches are already built and uploaded by this workflow, so attach them to a rolling prerelease on every ptyxis-port push. The tag moves forward with the branch, which keeps the download URLs stable while the contents track the newest build, and the notes point at the TunaOS remote that serves the same build. Tag releases keep their existing behavior via release-bundles. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift
ci(flatpak): publish every ptyxis-port build as a rolling tip release
Org-wide policy is that every tuna-os repository is owned by @hanthor. The only CODEOWNERS here was the root-level one inherited from upstream Ghostty, which assigns paths to @ghostty-org/* teams that do not exist in this organisation, so every rule in it was dead. This adds .github/CODEOWNERS, which GitHub reads in preference to the root file, and leaves that file byte-identical so the next upstream sync does not conflict on it. On CI: every job in the inherited Test workflow is path-skipped for this diff, and the "Required Checks: Test" aggregator runs on namespace-profile-ghostty-xsm, a Namespace runner profile this organisation has no runner registered for, so it sits queued indefinitely. It is not a required check on ptyxis-port (the PR was unstable, not blocked). Worth knowing for every future PR here: that aggregator can never report in this fork as the workflow stands.
…-action-3.x chore(deps): update hustcer/milestone-action action to v3.2
…-action-1.x chore(deps): update ryand56/r2-upload-action action to v1.5
…ithub-actions-6.x chore(deps): update flatpak/flatpak-github-actions action to v6.8
…os#76) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…una-os#70) The README pointed at a nightly.link artifact from `ghostty-ptyxis.yml`, which has two problems now that the publishing pipeline is in place: - Workflow artifacts expire after 7 days, so the documented install command breaks on any repo that goes a week without a push. - That workflow builds a separate x86_64-only bundle on the gnome-48 runtime, while the remote and the release serve gnome-50 builds for both x86_64 and aarch64. Users following the README got a different binary from the one we actually ship. The TunaOS remote is live and serving current builds, so drop the "available once the promotion lands" caveat and make it the recommended path. The direct-download alternative now points at the rolling `tip` release, whose URLs are stable across builds and cover both architectures. Verified both URLs return 200 with the full bundle. Prettier reports these files as unformatted both before and after this change, so they are left as-is rather than mixing in a reformat. Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift Co-authored-by: Claude <noreply@anthropic.com>
Bumps [cachix/cachix-action](https://github.com/cachix/cachix-action) from 5f2d7c5294214f71b873db4b969586b980625e71 to 38b082610b782e7e93e209c35fd730d399dee866. - [Release notes](https://github.com/cachix/cachix-action/releases) - [Changelog](https://github.com/cachix/cachix-action/blob/master/RELEASE.md) - [Commits](cachix/cachix-action@5f2d7c5...38b0826) --- updated-dependencies: - dependency-name: cachix/cachix-action dependency-version: 38b082610b782e7e93e209c35fd730d399dee866 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ack (tuna-os#65) Adapts blueshell_vm_providers_add_corral to query 'corral list --json' and 'corral ct list --json' for structured JSON output, keeping the table parser as a fallback for older corral versions. Extends test-vm-providers with JSON enumeration test coverage. Closes tuna-os#23 Signed-off-by: unknown <unknown@users.noreply.github.com> Co-authored-by: unknown <unknown@users.noreply.github.com>
…una-os#62) BlueShell ships to the TunaOS Flatpak remote and has no roadmap, no version identity, and an upstream intake that has failed 13 of 13 scheduled runs since 2026-06-08. For a fork the maturity question is not features — every README feature works — it is whether the maintenance machinery works. So the gates are ordered: the fork sustains itself, then it earns a release contract, then it becomes joinable. Also flips one of the remaining rows in tuna-os/.github ROADMAP-INDEX.md, where blueshell had no entry at all until tuna-os/.github#52. Refs tuna-os#57, tuna-os#58, tuna-os#59, tuna-os/.github#52 Signed-off-by: hanthor-hive-agent[bot] <hanthor-hive-agent[bot]@users.noreply.github.com> Co-authored-by: hanthor-hive-agent[bot] <hanthor-hive-agent[bot]@users.noreply.github.com>
…tuna-os#60) The map is pillar 2 of the rebase strategy in UPSTREAM_SYNC.md and the document upstream-sync.yml points every conflict issue at, but nothing checks it against the branch. Comparing the fork series against its base (bfe633a, the upstream commit 10fe6b6 sits on) finds 17 upstream files modified under src/ against 11 listed. Adds the six missing ones: src/config/Config.zig + src/config.zig +222 -6 src/termio/shell_integration.zig +24 -6 src/apprt/gtk/class/tab.zig +102 src/apprt/gtk/ui/1.5/tab.blp +1 -1 src/apprt/gtk/class.zig +1 Two of them, Config.zig and config.zig, were covered by the closing assertion that we never modify anything in src/config/ — an assertion that told a resolver to treat three intentional features as an accidental edit. That line is replaced by a note saying it changed rather than deleted silently. Config.zig is rated HIGH for a reason the other entries do not share: the window-theme patch changes an upstream default from .auto to .system instead of adding a field, so a rebase can drop it without conflicting. The recipe says to re-check it every time. Also records that twelve upstream workflows and two upstream docs are patched and out of this map's scope, which is a question for tuna-os#55 rather than something to answer here. Refs tuna-os#55 Signed-off-by: hanthor-hive-agent[bot] <hive@users.noreply.github.com> Co-authored-by: hanthor-hive-agent[bot] <hive@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…na-os#53) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](softprops/action-gh-release@3d0d988...efb3536) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 3.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…a-os#51) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…base images (tuna-os#42) Two supply-chain issues in the build Dockerfiles: 1. src/build/docker/debian/Dockerfile (used by test.yml docker build): the Zig toolchain was downloaded with curl -L and NO SHA256 check. A tampered mirror/CDN or compromised ziglang.org release substitutes arbitrary code into the CI build image. Now verified against the shasums published in ziglang.org/download/index.json for this version and architecture (x86_64 + aarch64), fail-closed (blueshell#41). 2. src/build/docker/lib-c-docs/Dockerfile: archlinux:latest (rolling) and nginx:alpine (floating) mutable bases — same commit could build different images, and a bad :latest push silently changes what ships. Now digest-pinned (blueshell#28). Refs tuna-os#41, Refs tuna-os#28 Signed-off-by: hanthor-hive-agent[bot] <290068839+hanthor-hive-agent[bot]@users.noreply.github.com> Co-authored-by: hanthor-hive-agent[bot] <290068839+hanthor-hive-agent[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Adds publish-ghostty-flatpak.yml, which builds com.mitchellh.ghostty for x86_64 and aarch64 and pushes it through the same pipeline publish-flatpak already uses: native runner per arch, skopeo to GHCR, update-index.py against tuna-os/docs. Users then get either terminal, or both side by side, from the one remote. Nothing about the app is maintained here. The workflow checks out ghostty-org/ghostty at the resolved ref and builds with upstream's own manifest and zig-packages.json — upstream's manifest sources `type: dir, path: ..`, so the checkout path is what decides what gets built. An upstream dependency pin or GNOME runtime bump is picked up by the next daily run with no change in this repo. The SDK container has to be chosen before checkout, so the check job reads runtime-version out of upstream's manifest at that commit and falls back with a warning if no matching builder image exists yet. Daily at 05:00 UTC, and cheap when idle: each publish pushes an immutable sha-<upstream-short>-<arch> tag beside latest-<arch>, and the check job exits in seconds when that tag already exists rather than spending two full Zig builds. The tag check is a curl-only helper because the runner images don't ship skopeo, and it uses a credential GHCR accepts — anonymous first, then GITHUB_ACTOR — because a placeholder username is rejected with 403 even inside Actions with packages:write. It fails toward "build", so a registry hiccup can waste a build but can never silence a publish. upstream-sync moves from weekly to daily at 07:00 UTC. A one-day diff conflicts less often than a seven-day one, and a conflict's blast radius is a single day of upstream commits. Two guards make that cadence safe: the up-to-date check now uses merge-base --is-ancestor, where the old HEAD equality test could never be true for a fork carrying patches and so never short-circuited; and the run stands down while an upstream-sync/* PR is still open, instead of stacking a branch and PR on an overlapping range every morning. Documents two ways a green publish still leaves the app uninstallable, because both are silent: FLATPAK_INDEX_TOKEN unset (images reach GHCR, the index update is skipped with a notice, flatpak answers "Nothing matches") and a GHCR package left private. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdA1ynKtrtjQ19d7KPXCo8
|
Closing — this PR is an artifact of the fork divergence, not a change to review.
The rest of the fork's work has been salvaged into the org repo:
Not carried over: the fork's
|
Show All Palettes did not expand the list: it collapsed it to a single
clipped row of three cards with no way to reach the other 241, and the
scroll wheel scrolled the page instead of the list.
The flow box was wrapped in a ScrolledWindow nested inside the
AdwPreferencesPage, which is already a scroller. A nested scrollable is
allocated its minimum height rather than its natural one, so
propagate-natural-height plus max-content-height never produced the
intended 480px viewport, and the inner scroller trapped the wheel. Drop
the wrapper and let the flow box grow in the group so the page scrolls
it, which is the native behavior and cannot trap scrolling.
Two more defects in the same picker:
buildPaletteCSS added a fresh display-wide CSS provider on every
call, and it is called on every expand/collapse, so a ~1200-rule
stylesheet (244 palettes) was stacked on the display repeatedly,
with every stale copy still matched against every widget. Reuse a
single provider and reload its contents.
Three of the eleven curated palette ids (high-contrast,
solarized-dark, vs-code) matched no palette file, so the default
view silently showed eight. Use the names the vendored collection
actually uses, and place each curated entry at most once since that
collection contains names differing only by case.
Verified against a real build under Xvfb: 11 featured cards, expand to a
readable scrollable grid of all 244, collapse back to 11, and clicking a
card still applies the palette.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift