Skip to content

The dropper's magnifier: a clear liquid orb over the zoom (native on macOS), the same at every zoom - #3

Draft
foxnne wants to merge 4 commits into
mainfrom
ccr-7f00e3d0-sjpshu
Draft

foxnne wants to merge 4 commits into
mainfrom
ccr-7f00e3d0-sjpshu

Conversation

@foxnne

@foxnne foxnne commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

The first step of pixi's dropper orb from fizzy's native windows plan (fizzyedit/fizzy#226). The magnifier that shows while the dropper reads the canvas (right-click held, the sample key or button, a touch held) becomes a clear orb of liquid glass over a pixel-exact zoom. It has no frost and refracts hard at its rim, as a drop of water would.

Glass

  • macOS 26, where fizzy offers the OS's glass (core.native_glass.offered, sdk: release 0.2.18, a plugin's glass over its picture and native fizzy#228): the zoom is drawn in the app's window, and a clear piece of Liquid Glass (frost = 0, the lens alone) is declared over it for fizzy's overlay. The OS's lens refracts the window beneath.
  • Elsewhere, including the web: core.LiquidField.drawPicture over the zoom. Its middle is the zoom as it is; its rim bends it toward the edge.
    • Natively that is Apple's lens on the window opacity slider; on the web it is the earlier clear glass, with the picture reaching past the orb for it to pull from.
    • It is at full refraction and 1.35 times the drop zones' bend.
    • Without a glass program, it's a plain disc with a rim.
  • Earlier tries on this branch read wrong on a Mac: a lens at the dialogs' refraction, then the zoom over a ring of frosted drop glass.

Every zoom

  • Before, the zoom was the canvas's times 8 / (1 + zoom). Below 1/7 that was smaller than the canvas, and past 8 it showed under two pixels.
  • Now a pixel in the zoom is 4× its canvas size, held between 7 and 21 pixels across the orb, in whole screen pixels.
  • The sampled pixel sits at the centre, framed by a crosshair that leaves it in sight.
  • Past the art's edge the zoom shows the canvas background, with the checkerboard only under the art.

Motion and placement

  • It grows out of the pointer and follows it on a spring, resting up and to the right.
  • It is slid back onto the screen it is on, never flipped. That screen can be a popped-out float's window.

Code: src/widgets/magnifier.zig and src/widgets/magnifier_geometry.zig (std-only, tested), shared by the file canvas and the packed-atlas preview.

Before merge

  • sdk: release 0.2.18, a plugin's glass over its picture and native fizzy#228 merged and sdk-v0.2.18 published.
  • Repin: zig fetch --save=fizzy https://github.com/fizzyedit/fizzy/releases/download/sdk-v0.2.18/fizzy-sdk-v0.2.18.tar.gz
  • Tried on macOS 26 (native), with FIZZY_NATIVE_GLASS=0, and on the web: zoom far out, 1×, 8× and 32×+; a popped-out float; motion off; the packed-atlas preview.

Checked so far

  • zig test src/widgets/magnifier_geometry.zig: 5 pass.
  • zig fmt --check and zig ast-check.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Euk6iCavQdW7MG5FN2vvFw

claude added 2 commits October 8, 2026 12:45
…zoom

The first step of pixi's dropper orb from fizzy's native windows plan (#226): the magnifier that
shows while the dropper reads the canvas (right-click held, the sample key or button, a touch
held) is now an orb of fizzy's liquid glass, not an opaque bordered frame.

- **Glass.** The orb's middle is a pixel-exact zoom of the art round the pixel being read, and its
  edge is fizzy's glass bending that zoom toward the rim (`core.LiquidField.drawPicture`). On
  macOS, Windows and Linux that is Apple's lens on the window opacity slider. On the web, which
  publishes no slider look, it is the earlier clear liquid glass; the picture reaches past the orb
  (`pictureMargin`) for that glass's rim to pull from. The middle takes no frost, tint or lift,
  so a colour picked through it is the colour under it. With no glass program (the glass renderer
  off, a WebGL without it, or an SDK before `drawPicture`), it is a plain disc with a rim.
- **Every zoom.** A pixel of the art in the orb is 4x its size on the canvas, held between 7 and
  21 pixels across the orb, in whole screen pixels. Before, the zoom was the canvas's times
  8 / (1 + zoom): under 1/7 it was smaller than the canvas, and past 8 it showed less than two
  pixels. The read pixel sits at the centre, framed by a crosshair that leaves it in sight. The
  picture shows the canvas's background past the art's edge, and the checkerboard only under the
  art.
- **Motion.** It grows out of the pointer and follows it on a spring (`core.Spring`), resting up
  and to the right of it. It is slid back onto the screen it is on, never flipped, and that screen
  can be a popped-out float's window (`core.screens`).
- One module for both canvases: `widgets/magnifier.zig` (drawing) and
  `widgets/magnifier_geometry.zig` (std-only numbers, tested), used by the file canvas and the
  packed-atlas preview.

The glass needs fizzy's `LiquidField.drawPicture` (fizzy ccr-7f00e3d0-sjpshu, in the next SDK
release). Against sdk 0.2.17, which this still pins, the orb draws as the plain disc
(`@hasDecl`). To see the glass now, build against a local fizzy (`.fizzy = .{ .path = ... }`).

Checked: `zig test src/widgets/magnifier_geometry.zig` (5 pass, sweeping zoom 0.01 to 256 at
scales 1 to 3), `zig fmt`, `zig ast-check`. Not built or run here: dependency downloads are
blocked in the environment this was written in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euk6iCavQdW7MG5FN2vvFw
…on is

Tried on a Mac, the orb read as a zoomed picture with a bent edge, nothing like the drop zones.
The orb is now the drop zones' own glass (`core.dialogs.carriedField`): frosted over the canvas
behind it, bending it at the rim, tinted and lit on the window opacity slider as the app's glass
is. The pixel-exact zoom is a disc in it, inside a ring of that glass 16 points wide, its edge
fading into the glass over 3 points, with the crosshair on the read pixel. Without the glass
(the blur off and no glass program), the orb is the dialogs' fill, as the drop zones are then.

- No shadow ring: the drop zones have none.
- No new SDK call: `carriedField` is in sdk 0.2.17. The orb matches the host's drop zones
  once pixi builds against the SDK carrying #227's glass, which is fizzy#228's 0.2.18.
- The zoom's pixel size is reckoned over the zoom, not the whole orb. It is rounded within its
  bounds, which smaller cells otherwise overshot at some UI scales.

Checked: `zig test src/widgets/magnifier_geometry.zig` (5 pass), `zig fmt`, `zig ast-check`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euk6iCavQdW7MG5FN2vvFw
@foxnne foxnne changed the title The dropper's magnifier is an orb of liquid glass, the same at every zoom The dropper's magnifier is an orb of the drop zones' glass, the same at every zoom Oct 8, 2026
…ere, with a thin rim

Tried on a Mac, the orb in the app's glass read as a thick grey border round the zoom, not as
glass.

- **macOS 26** (fizzy offering the OS's glass, `core.native_glass.offered`, fizzy#228): the orb
  is declared as a piece of fizzy's overlay of Liquid Glass, the drop zones' own glass. The zoom
  and crosshair are a layer of their own the overlay takes over it (`core.screens.markCarried`),
  as it takes the drop zones' icons. Pixi draws no glass then.
- **Elsewhere** (and against an SDK without `offered`): the app's drop glass, as before.
- **The rim** left round the zoom is 4 points, as fizzy leaves round the carried view's picture
  on its drop, not 16. The zoom fades into it over 1.5 points.

Checked: `zig test src/widgets/magnifier_geometry.zig` (5 pass), `zig fmt`, `zig ast-check`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euk6iCavQdW7MG5FN2vvFw
@foxnne foxnne changed the title The dropper's magnifier is an orb of the drop zones' glass, the same at every zoom The dropper's magnifier: native Liquid Glass on macOS, the app's glass elsewhere, the same at every zoom Oct 8, 2026
Tried on a Mac and the web, the orb with its zoom laid over a rim of frosted glass read as flat:
nothing under the glass to refract, and on macOS the native glass bent nothing either. The user
asked for no frost and a lot of refraction, a liquid orb as the drop zones are. The glass now goes
over the zoom.

- **macOS 26**, where fizzy offers the OS's glass: the zoom is drawn in the app's window and a
  clear piece of Liquid Glass (`frost = 0`, the lens alone) is declared over it for fizzy's
  overlay. The OS's lens refracts the window beneath it.
- **Elsewhere**: `LiquidField.drawPicture` over the zoom. Its middle is the zoom as it is, and
  its rim bends it toward the edge (Apple's lens on the slider natively; on the web the earlier
  glass, the picture reaching past the orb for it to pull from). It is at full refraction and
  bends 1.35 times as hard as the drop zones. Without a glass program, a plain disc with a rim.
- The zoom is the whole orb again, with no ring round it.

Checked: `zig test src/widgets/magnifier_geometry.zig` (5 pass), `zig fmt`, `zig ast-check`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euk6iCavQdW7MG5FN2vvFw
@foxnne foxnne changed the title The dropper's magnifier: native Liquid Glass on macOS, the app's glass elsewhere, the same at every zoom The dropper's magnifier: a clear liquid orb over the zoom (native on macOS), the same at every zoom Oct 8, 2026
foxnne added a commit to fizzyedit/fizzy that referenced this pull request Oct 8, 2026
Part of #226

## What changes

Two pieces pixi's dropper magnifier (fizzyedit/pixi#3) needs to be a
clear liquid orb over its zoom, with no frost and strong refraction:
native Liquid Glass on macOS, the app's glass everywhere else. And the
SDK release that ships them, so the orb can be tried against `main` as
soon as this merges.

**`core.native_glass.offered`**
- The app publishes each frame whether the OS draws glass declared
outside a view drag (`publishOffered`, from `Popout.beginFrame`'s
`nativeGlass()`).
- A plugin that sees it declares its glass with `native_glass.add`.
Fizzy's overlay of Liquid Glass already stays up while any glass is
declared.
- Pixi declares a clear piece (`frost = 0`, the lens alone) over a zoom
it draws in the window, so the OS's lens refracts the window beneath.
- Off macOS 26, or with native glass off, `offered()` is false.

**`LiquidField.drawPicture` / `pictureMargin` / `lens`, and
`glass_look.forLens`**
- The app's glass as a lens over a picture the plugin drew. The middle
is the picture as it is, with no frost, colour or lift; the rim bends
and lights it.
- It reads no capture, so the middle stays pixel-exact.
- On the web, where no look is published, it is the earlier glass.
`pictureMargin` says how far past the shapes the picture should reach
for that glass's rim, at the strongest shape lens.

**Tried and dropped:** pixi tried the drop zones' frosted glass with its
zoom laid over it. On a Mac it read as a thick grey border or a flat
rim.

**Merged with main** (#234–#236, #239, #240).

## SDK impact

- [ ] None
- [ ] Core-only or additive: reaches plugins at the next SDK release
- [ ] Fingerprint moved: recorded in `sdk/src/version.zig`,
`sdk_version` untouched, PR labelled `sdk`
- [x] SDK release: bumps `sdk_version`, lists the `sdk` PRs since the
last `sdk-v*` tag

`sdk_version` goes 0.2.17 → 0.2.18 (ef95301). Since `sdk-v0.2.17` this
release carries:
- this PR's core additions;
- #223, #224 and #227's core (the one-slider glass, `glass_look`,
`core.native_glass`, `core.screens`'s menus and dialogs).

The fingerprint has not moved, so installed plugins keep loading.
Merging tags `sdk-v0.2.18` and, per #240, asks the store plugins to
repin.

## Verified

- `zig test core/gfx/glass_look.zig`: 13 pass.
- `zig fmt --check` and `zig ast-check` on the changed files.
- `tests/integration.zig` compiles `drawPicture` and checks
`pictureMargin`.
- CI: Linux, macOS, Windows, integration and the Windows cross-build on
this head.
- [x] macOS: pixi's orb tried locally against this branch by the
maintainer, who approved it.
- [ ] Windows:
- [ ] Linux:
- [ ] Web:

## Follow-ups

- pixi#3 repinned to `sdk-v0.2.18` once it's tagged.
- The orb pinching off pixi's sample button and merging with it (the
plan's next step for this consumer).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01Euk6iCavQdW7MG5FN2vvFw

---------

Co-authored-by: Claude <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.

2 participants