Skip to content

Release v0.1.0: promote dev to master - #76

Merged
tamirelazar merged 304 commits into
masterfrom
dev
Jun 26, 2026
Merged

Release v0.1.0: promote dev to master#76
tamirelazar merged 304 commits into
masterfrom
dev

Conversation

@tamirelazar

@tamirelazar tamirelazar commented Jun 26, 2026

Copy link
Copy Markdown
Owner

Promote dev to master for the v0.1.0 release.

Included

  • v0.1.0 feature set: 4 stable presets + 27 wip presets, OKLch palettes, charsets (HalfBlock/ASCII/Braille/etc), overlays, exports (GIF/PNG/WebM), saved configs, custom palettes/keybinds.
  • Two-depth Controls "Instrument" UI, ambient surface, dashboard.
  • Window-frame/chrome controls, screensaver mode.
  • Regenerated third-party license notices.

Test plan

  • cargo fmt --check, cargo clippy --all-targets --all-features -- -D warnings
  • cargo test, cargo test --all-features --lib, cargo test --test visual_regression
  • Full 3-OS CI matrix (ubuntu/macos/windows) via this PR.

Color-by-temporal-change + colorize-last invariant (levers 3 & 9)
Diffusion/decay art knobs: afterglow, decay-gamma, separable Gaussian, diffuse-weight
Fix field_reassign_with_default clippy errors in deposit test code
(config.rs and simulation/mod.rs); add fold_deposits_sqrt bench case
to diffusion_benchmark.rs. All 5 gate steps pass: fmt clean, clippy
zero warnings, 800 tests pass, 812 all-features pass, 47 goldens
unchanged.
feat: nonlinear deposit curve (lever 4)
feat: per-preset tone curves via render/art-defaults payload (#32)
Add map_brightness_rgb_cycled / map_brightness_cycled that insert a
PaletteCycle remap at pass-order step 5 (between the tone curve and the
gradient lookup). The public map_brightness_rgb / map_brightness keep
their existing signatures and delegate with PaletteCycle::default() so
all ~136 existing callers stay byte-identical. colorize_subpixel gains a
trailing cycle: PaletteCycle param and routes the base color through the
cored fn. frame_buffer.rs and png.rs updated with PaletteCycle::default()
stubs (marked TODO(task4)) to keep the build green.
…nd modals

Two visual-noise fixes for the windowed overlay experience:

1. Status bar now appears only when paused AND no overlay is open. Previously
   it showed whenever paused OR any overlay was open, cluttering the screen
   behind modals. on_pause() no longer expands chrome while an overlay is open,
   and on_modal_open() leaves the default (Minimal) base chrome collapsed
   instead of forcing ModalPane (persistent Expanded chrome is unchanged).

2. When a modal panel overlaps the window-frame border, the simulation and
   frame are wiped to a clean matte behind it so the panel is the sole focus.
   Panels fully contained within the sim interior leave the sim showing, so the
   blanking only kicks in when the frame would otherwise poke out as noise.
   Added FrameBuffer::fill_background and TerminalRenderer::modal_overlaps_frame,
   wired into both the single- and multi-species render paths.
Add 11 new figures (Cassiopeia, Sagittarius, Pegasus-Andromeda, Lyra,
Aquila, Bootes, Taurus, Draco, Hercules, Canis Major, Perseus) and
upgrade Cygnus to a fuller Northern Cross, taking the atlas from 6 to 17.

Figures were authored over varying sub-ranges of 0..1, so many rendered
as a small central patch. fit_to_grid now uniformly rescales each figure
to fill the unit square (preserving proportions) before mapping to the
grid, and the margin shrinks 5% to 4%, so every asterism covers far more
of the frame.
ControlAction::Restart reused original_seed verbatim, so pressing 'r'
always re-picked the same Constellation figure. Re-roll a fresh seed on
each manual restart unless a seed was pinned via --seed (then it stays
reproducible).
The Constellation preset sets constellation_restamp_floor, but the field
has no ProfileOverrides counterpart (capture can't read it back) and is
not runtime-editable. Live capture projected it to its default while the
preset resolved to its set value, so the dirty guard saw a phantom diff
and prompted to discard when swapping away from constellations. Normalize
it on both sides in project(), matching trail_modulation/respawn_config.
New FoodConstellation init mode seeds agents from a food/brightness
image and keeps that image as a per-frame re-stamp template, so the
picture persists like a constellation figure instead of dispersing.

The Trademark preset (alias `logo`) applies this to the embedded
tslime logo: Ethereal palette, HalfBlock charset, auto-normalized
brightness, held crisp via constellation_restamp_floor. Bound to
quick-key 4 by default; user keybinds.toml entries override.
Add two opt-in preset-switch announcement styles selectable via
--transition <toast|figlet|type>, with an optional --transition-tagline.

- TransitionStyle enum (toast default) plumbed end-to-end through CLI,
  profile overrides, SimConfig, config capture, and RuntimeState.
- transition.rs renders FIGLET (4x6 block name, vertical palette gradient,
  fade envelope, backing scrim so the name reads over any field) and TYPE
  (letter-spaced typed readout over a frame-clipped dimmed band, blinking
  caret, near-white ink for legibility, accent underline) as a direct
  FrameBuffer pass inside render_with_overlay.
- Per-preset Preset::tagline(); announce_preset_switch arms the anim.
- FIGLET is suppressed when switching to the Trademark (logo) preset
  (unreadable over the dense logo, redundant since the logo is the brand);
  TYPE and the plain toast still play.
- Multi-species render path does not show transitions yet (noted in README).
Add TransitionStyle::Off variant and make it the default so runtime
preset switches no longer emit a toast unless a transition mode is
explicitly set (--transition toast/figlet/type).
Looping montage that grows the tslime logo across the four launch presets
(Organic, Constellation, Vinescii, Trademark). Optimized GIF at assets/demos/hero.gif.
Replace the static preset stills with six looping GIFs of the live
controls: palette cycling, character sets, preset transitions,
randomize, live parameter tuning, and the palette editor.
Suppress transient toasts and ambient parameter readouts for a clean
field. Start with --no-notifications; toggle live with Ctrl+N. Guards
push_msg and the ambient Tune surface; user-opened overlays (controls,
palette editor, dashboard, preset transitions) are unaffected. Listed in
the README controls table and the ? hints overlay.

Recapture the palette, charset, and randomize gallery demos with
notifications suppressed.
The capture .mov is limited-range (tv, 16-235), so the GIF encode lifted
blacks (~16->31) and read as gray. Expand to full range (tv->pc) and add
a gentle saturation/contrast lift so the GIFs match the on-screen
vividness. Deeper blacks, richer color across all six demos.
Apply the same color treatment as the gallery: gentle saturation/contrast
lift, 256-color palette, and sierra dithering. Deeper blacks and more
vivid color in the settled-preset sections; slightly smaller file.
Deeper blacks exposed the terminal's 150-column render striping. Soften
it with a faint gaussian blur, drop the contrast stretch (keep the
saturation lift), and use full-palette sierra dithering with lighter
lossy compression. Bands gone, logo still crisp, color preserved.
Re-encode from the correct montage source so the ending runs vinescii
then trademark (the prior re-encode used an earlier cut with the segments
reordered). Keeps the de-banding color treatment.
The vinescii opening renders the logo in crisp green ASCII; sharp
quantization made the character grid read as striping. Switch to fine
bayer dithering (breaks the grid into a soft glow) with a lighter blur
and saturation. Keeps deep blacks and the crisp trademark logo.
Same fix as the hero: switch the gallery encode from error-diffusion to
fine bayer dithering, which breaks the terminal's per-cell glyph grid
into a soft texture instead of exposing it as striping. Keeps the
limited->full range fix and color lift.
switch_preset carried transition prefs across a preset swap but not
chrome_style, so a bare preset resolve reset chrome to the preset
default and silently dropped fullscreen. Presets with a small
min_sim_size (Constellation, Trademark) then fell back to the centered
3:2 layout and letterboxed on switch. Carry chrome_style alongside the
transition fields so the active display mode survives the swap.
- regenerate randomize (fire), palette-cycle (vinescii, even tempo),
  charset-cycle, and preset-transition (3 figlets, all fullscreen)
- crop every gallery clip to the hero aspect (480x257) for consistent framing
- drop the param-tune demo; restructure the gallery to 5 cells
docs: README hero + control-demo gallery (ws6)
Updated the README to clarify the functionality of the terminal screensaver and added details about key bindings and presets.
Updated references section to citations and added software inspirations.
Force LF on golden files via .gitattributes and strip CRLF in the
snapshot comparison so the test passes on Windows runners
(core.autocrlf rewrites the text golden to CRLF on checkout).
A push to dev while a dev->master PR is open fired both the push and
pull_request workflows, running the ubuntu suite twice. Scope push CI to
master (post-merge verification); dev and feature branches are covered by
their pull request.
@tamirelazar
tamirelazar merged commit f838723 into master Jun 26, 2026
5 checks passed
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