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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Horizon scenes**: added three pure-CSS animated pattern backgrounds on the shared 42% horizon, all drawn from photographic references rather than illustration: `clouds` (a deep-blue altitude sky over a parallax cloud deck, with a placeable moon), `dune` (golden-hour ridges receding into haze, blowing sand, a placeable moon), and `aurora` (borealis curtains mirrored in rippling water below the waterline). None of the three draws a horizon *line*: the sky dissolves into the ground across a mottled haze band, and distant layers wash toward the sky's own value. All are light/dark aware, take a half-strength theme cast in the mid-sky, move on compositor-only transforms, and respect reduced motion. `clouds` and `dune` swap the disc per mode: a **sun** by day (a hot core with a wide bloom, sitting low in the warm band for `dune`) and a prominent moon by night, from one shared rule, and `dune` adds a **blowing-sand control** (`breeze` / `storm` / `still`) driving wind veils that stream across the ridges.

### Fixed
- **Pattern scenes composite as a handful of layers, not dozens**: each horizon scene's sun and moon are compositing layers (they have to be: moved on the page's own layer, a masked, filtered disc left half of itself painted behind), and WebKit gives every later sibling that overlaps a composited layer a layer of its own. So everything drawn in front of the disc was a separate full-viewport layer, and the window server re-applied each one's mask and blur on every frame anything above it changed: counted from WebKit's own layer tree, dune made 52 of them while static (66 animated), forest 25, synthwave and moonrise 23, clouds 15 and aurora 11. The same effect made the forest's light/dark flip slow before it moved to SVG. Everything in front of a disc now sits in one `.scene-group`, a stacking context painted as one layer, as does any still run over a moving part (forest's rays and middle ridge over a fog bank, aurora's sun path and haze over the water, aurora's sky patch over the curtains), so only what moves gets a layer of its own: static, dune, forest, clouds and aurora are down to 7 layers each, clip layers included. Aurora's curtains move as two boxes: the box that sways and shimmers carries only its transform and opacity, and an `.au-paint` child draws the rays with their blur, masks and clip, so those are drawn into the layer once instead of being re-applied by the window server on every frame for all six curtains. The sun path keeps the layer it had by accident (it moves with the disc, so it gets the disc's treatment on purpose now) and draws its glints on a child the same way. Measured in WebKit at 1400×900 with a panel sliding over the scene, as window-server GPU time: static dune 24% → 7% (an empty page measures 7%), animated dune 52% → 17%, animated aurora 42% → 19%, and animated clouds' device utilization 20% → 9%. Forest and the other static scenes were near the floor already; synthwave and moonrise are unchanged, since their floor's 3D grids need masked layers of their own. One cost moved the other way: at some window sizes (1400px, as measured) aurora's widest curtain, now drawn with its blur, is just wide enough to cross WebKit's tiling threshold, and WebKit spends about 5% of a core on it while it sways; in wider windows the old build tiles it too, and at 3440px both measure the same. The scenes render pixel for pixel as before: 48 WebKit snapshots (every scene, light and dark, both disc sides, the animated ones frozen at the same instant) are identical to the old build's. `tests/pattern-background.test.tsx` pins the group and the paint children.
- **Components, against upstream shadcn**: a review of all 52 components against the current shadcn `new-york-v4` sources (the style they came from), ignoring the deliberate material, icon and styling changes, found these, now fixed and pinned by `tests/upstream-parity.test.tsx`:
- *Resizable*: the divider between side-by-side panels was drawn as a flat full-width bar with its grip turned. react-resizable-panels v4 reports the LINE's orientation (a horizontal group has a vertical separator), and the handle styling keyed on the group's.
- *Input OTP*: shadcn's composition (`<InputOTP><InputOTPGroup><InputOTPSlot index={0} />…`, which the site's own code example shows) neither typechecked nor showed typed characters: children were dropped and a render function always passed. InputOTP now renders children through input-otp's context and InputOTPSlot reads its slot by `index`; `containerClassName` merges into the surface instead of replacing it, and `className` styles the input, as in shadcn (**behaviour change**: it used to style the container). Slots take the aria-invalid error state.
Expand Down
Loading
Loading