Skip to content

UltraLog 3.0.0 — Night Drive redesign, log compare, new export sheet, six fixes - #105

Merged
SomethingNew71 merged 60 commits into
mainfrom
release/3.0.0
Oct 25, 2026
Merged

SomethingNew71 merged 60 commits into
mainfrom
release/3.0.0

Conversation

@SomethingNew71

@SomethingNew71 SomethingNew71 commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

UltraLog 3.0.0 — Night Drive redesign, log compare, new export sheet, six fixes

One major release that bundles six bug fixes and the Night Drive design system
(design/, plan docs/plans/2026-10-23-night-drive-design-system.md).

Fixes

  • MCP: show_scatter_plot writes to the requested file's tab, not the active one
  • AiM: XRK channel names read from the right offset (names lost their first characters)
  • Timeline: the cursor record comes from the active tab's file (also removes an out-of-range index on arrow keys)
  • Tabs: the tab row scrolls instead of widening the window
  • Haltech: "no reading" sentinels are filled before unit scaling (no more -31M AFR minimums)
  • UI: floating tool windows are centred; analyzer descriptions no longer overlap Run buttons

Night Drive design system

  • Tokens generated from design/tokens/tokens.json into src/ui/theme/tokens.rs, with a drift test, OKLab blending and a CI contrast check across 7 themes
  • One dark theme with an Ultra intensity slider (Stealth · Night Drive · Neon · Ultra; Stealth by default, also in a theme menu at the end of the menu bar), Color blind mode (Okabe-Ito series, cividis and blue/orange maps) and High contrast; data colours never change with intensity
  • New type families (Outfit, Saira, JetBrains Mono, Noto scripts, system CJK for ja/zh-CN), Phosphor icons, one keyboard focus ring
  • Components: buttons, segmented control, checkbox, notices with icon + word, windows with the redline and Esc
  • Restyled: tool switcher, activity rail, file tabs with ECU badges, drop zone, channel cards and list, chart chrome and custom legend, heatmaps and tables (value plates, hatched empty cells, confidence badges, ColorScale), track map, playback bar, formula editor
  • CI colour gate: no hard-coded colours outside src/ui/theme/

Log compare (closes #98)

  • Overlay a second log in the same tab: Compare in the Channels panel or File → Compare with… (any loaded file, or Open file…)
  • Channels pair by normalized name; log B is dashed in its pair's colour, and a pair shares one y scale so the higher peak looks higher
  • Log A | Log B switch for B-only channels; "not in B" cards; Remove pair; a pair counts as one channel against the caps
  • Log B offset (field, ±0.1 / ±1 s, Reset) and Align at cursor; the timeline covers both logs; legend values come from each log and stay blank outside its span
  • A/B tags in the legend, direct labels and cards; exports dash log B, tag the legend and name both files and the offset
  • remove_file now remaps every tab, so a log B link survives closing another file
  • Design and plan: docs/plans/2026-10-25-log-compare.md (skeptical Opus review folded in)

Export

  • Export dialog (File → Export..., Tools panel, Cmd/Ctrl+E): PDF or PNG on a Paper or Graphite sheet, remembered per format; Copy image for pasting
  • One ExportSheet for chart, scatter plots, histogram and tuning tables: lockup, title, time range and counts, legend or ColorScale, footer
  • PDF is A4 landscape with embedded fonts (selectable text, symbols, non-Latin names); PNG is 1920×1080 with outline text
  • Exports match the screen (visible chart range, histogram filters, table map choice) and are always colour-blind safe

Brand

  • New app icon on macOS, Windows and Linux (generated by scripts/brand/build_app_icons.sh)
  • About window (Help → About UltraLog): version, licence, links, Check for Updates

Docs and release

  • CLAUDE.md: Theme Contract, Export Contract, colour gate, brand assets; README with new screenshots; the ultralog.co copy lives in ultralog-site (GitHub Pages retired in chore(site): retire GitHub Pages — ultralog.co builds from releases #106)
  • Strings for every new screen in all 15 locales (machine-drafted; bn, hi, ur, id, ar, ja need native review)
  • Version 3.0.0 (Cargo.toml, Cargo.lock, README badge)

Review

Three Opus review passes (theme and app state, charts and data views, export). No high findings.
All medium, low-medium and low findings are fixed in 8d7d7e8. Log compare had its own plan review and code review (Opus): no high findings; 3 medium and 4 low fixed in bb6a2e4. Two nits stay open: the Ultra
grid floor lags one frame while panning, and the scatter export uses 96 bins (screen: 512).

Testing

  • cargo fmt --check, cargo clippy --all-targets -D warnings, cargo test (1304 tests), contrast check, colour gate
  • Visual checks in a dev build against design/reference/ in Stealth, Night Drive, Ultra, Color blind and High contrast: chart, Lambda Delay table, export dialog, About window
  • Checked in the running app: Ultra slider arrow keys, Esc after a toast, legend "+N" row at XL font
  • Log compare in a dev build with two Haltech logs: pairing, dashed B, A/B tags, offset nudges, Align at cursor, stacked mode, removing log B's file
  • Exports checked as rendered PNG/PDF files, including a 12-channel sheet with a Japanese title

After merge

Tag v3.0.0, add release notes to the GitHub release, push the prepared wiki commit (51f274b).

Brand book, component specs and reference renders, tokens (7 themes),
the egui theme runtime reference, fonts, logos and the contrast checker.
Generate src/ui/theme/tokens.rs from design/tokens/tokens.json (cargo run
--example gen_theme; a drift test fails when they disagree) and port the
handoff runtime: intensity blending in OKLab, Color blind and High contrast
composition, series/seq/div maps, and the egui Visuals mapping.

sync_theme reinstalls the tokens whenever a theme setting changes, pins the
dark theme slot, and the panel frames read tokens instead of fixed greys.
CI checks every guaranteed contrast pair in every theme.
Settings → Display gains the Ultra intensity control (0-100, default 35,
named stops Stealth / Night Drive / Neon / Ultra with a small detent and a
"Night Drive · 35" readout) and a High contrast checkbox that locks the
slider and says why. Color blind mode now also drives AAA text through the
theme. Both new preferences persist; a 2.x settings file opens at Night
Drive, not Stealth. Analytics: ultra_intensity_changed (at drag end) and
high_contrast_toggled. Strings in all 15 locales.
Outfit (400/500/600), Saira (600, 700 italic, 800 italic) and JetBrains Mono
(400/500) as static instances from google/fonts, one egui family per weight,
built by scripts/fonts/build_static_fonts.sh. The type scale from tokens.json
is installed as text styles with the visuals and follows the font scale
preference.

Hindi, Bengali, Arabic and Urdu now render: Noto Devanagari, Bengali and
Arabic are bundled as fallbacks. Japanese and Chinese load a system CJK font
at runtime, and a 3 KB subset keeps the language picker's own names legible
in every locale. Tests lay out every locale name and the brand symbols.
Button variants (primary, secondary, ghost, danger, sm, icon) per the
component spec; the side panels and analysis cards use them instead of
hand-built frames, and export buttons are no longer coloured by file type.
Phosphor regular follows each brand face in every font family, with a fill
family for transport and the favourite star. The allowed custom painters
(redline, glow, floor, focus ring) live in theme::paint; one keyboard focus
ring is drawn for every control each frame.
Every tool window goes through components::window: Saira title, the sunset
redline on its top edge, space-4 body padding, and Esc closes the topmost
window. Notice and status badges carry an icon shape and a word for every
status; toasts show the status icon.
The empty Files panel is the DropZone: dashed border, perspective floor that
follows Ultra intensity, Saira italic title, one primary "Select a file"
and the extensions in mono; it turns cyan while a file is dragged over the
window. File cards carry the ECU badge. Settings uses the Night Drive
checkbox and segmented font size, and Ultra intensity gets its sunset track.
Properties uses the segmented plot mode.
Formulas are coloured by role as you type (channels cyan, numbers gold,
functions violet, time shifts orange, operators muted) through a tested
tokenizer, and the help window uses the same colouring. Validation reads as
icon + word, the preview is mono, and the footer follows the window spec.
Library templates carry the magenta ƒ, mono unit and formula, a gold star,
a secondary Apply and an overflow menu.
Series take their colour and stroke from the theme: the Night Drive ten,
or eight Okabe-Ito colours in Color blind mode and High contrast, repeating
dashed then dotted past the palette. Colour slots are no longer capped at
ten, so stacked mode never reuses slot 0. The old olive palettes are gone.

Both chart views share plot_style: plot_bg canvas, grid from plot tokens,
cursor in plot_cursor, bloom at Neon and above, the perspective floor at
Ultra, and a custom legend (Cursor row first, mono values, hover to solo;
top-left with direct end labels when color-blind safe). Plot-area headers
use Phosphor carets and an icon button.
Cards carry the series swatch and a 2px series strip, the name in ink, mono
min/max values with their unit, and caret jump buttons. List rows use the
Night Drive checkbox, show the unit in mono and the series swatch once the
channel is on the chart; group headers are overlines.
Histogram, scatter density and the Lambda Delay / Accel Enrichment tables
replace jet and Viridis with the theme's sequential map (diverging around
zero for signed table measures). Cell values are mono on the theme's value
plate where it has one, empty and filtered cells are hatched, confidence is
a badge fill style (filled, outlined, dashed) instead of red/amber/green,
and the selected cell gets the cyan ring. Every map shows a ColorScale with
its real range; tables add the badge legend. Shared painting lives in
ui::heatmap, with a test that cell text reaches contrast on every stop.
The track map colours by the theme's Sequential or Diverging map (the
Viridis / Turbo picker and LUTs are gone), draws a 3px trace over a 1px
bg_void casing, and marks the current position with a plot_cursor dot in a
bg_void ring. ColorSignature now carries theme_generation, so a Color blind
or High contrast switch rebuilds the cached colours. Table exports use the
Paper map until the export dialog lands.
…ine text for PNG

One sheet layout drawn on a Canvas trait with two back ends: PNG through
vello_cpu with skrifa glyph outlines, PDF through printpdf with the bundled
TTFs embedded so text stays selectable. Redline, lockup, title, mono meta,
chart or grids, legend or ColorScale, and the ultralog.co footer, on the
Paper and Graphite export tokens.
…raphite remembered per format, Copy image

Chart, scatter plots, histogram and tuning tables build sheet models and
render through the ExportSheet on the export tokens; the old per-tool PNG
and PDF renderers, the jet heat ramp and the built-in Helvetica text are
gone. Menu, Tools panel and Cmd+E open the ExportDialog. The chart exports
the visible range; the histogram applies the tool's ranges, filters and
min-hits blanking. Copy image puts the chart or table alone on the
clipboard for pasting.
Regenerated from design/logos/ultralog-app-icon-1024.png by
scripts/brand/build_app_icons.sh. macOS keeps Apple's 824 px tile inside
the 1024 canvas so the Dock icon matches other apps; Windows and Linux use
the tile full-bleed, and windows.ico carries 16-256 px.
Opened from Help → About UltraLog. Shows the dark lockup, version, the
AGPL-3.0 licence, links to the website, docs, source, issues and sponsors,
and Check for Updates.
Image tints and export flattening move into the theme module, the IPC
colour comes from series_style, and layout-only colours read the visuals.
CI fails on any Color32/Rgb literal elsewhere, except TRANSPARENT and the
PDF/PNG type conversion.
Table generator errors and warnings, update dialog results, computed
channel errors, the analysis status and the Settings update notice now
lead with the Status icon; the Unicode check mark becomes Phosphor.
Theme contract no longer says in progress; adds the CI colour gate and
its exceptions, the theme_generation key for colour caches, chart
painting in plot_style.rs, and the Night Drive and About features. The
plan is marked implemented.
Replaces the Wong palette and single PNG/PDF export text with Color blind
mode, High contrast, the Ultra intensity slider and the Export dialog, and
adds screenshots of the chart in Night Drive, Ultra and Color blind mode,
a Lambda Delay table and the Export dialog.
- Ultra slider: arrow keys step off a named stop (snap only on pointer
  input) and hold Left/Right while focused
- Esc closes the topmost visible window; toasts sit above windows, take
  no input and repaint to disappear on time
- Chart legend shows the rows that fit plus a +N row instead of vanishing
- Heatmaps: plated value text in ink; rich/target/lean labels only for
  lambda-deviation measures (not PW step); table export uses the same
  diverging map and the cells' decimals on its scale
- Performance: colour map LUT for scatter bins and the track map; no
  hatch on small cells, one empty fill for dense histograms
- Export: legend wraps, system CJK fallback and ? for missing glyphs,
  histogram range matches the tool, constant channels at mid-height, edge
  points clipped along their segment, integer-indexed ticks that round
  before splitting minutes, round PDF joins, filtered lockup
- Speeduino/rusEFI badge reads MLG; missing toast key; two comments
Headless egui tests: the focused Ultra slider steps with Left/Right and
keeps focus, also on the frame right after it gains focus; Esc closes
the newer window before the one it was opened from.
…icMiniDIY/UltraLog into night-drive-3.0.0

# Conflicts:
#	docs/index.html
#	docs/sitemap.xml
@SomethingNew71 SomethingNew71 changed the title UltraLog 3.0.0 — Night Drive redesign, new export sheet, six fixes UltraLog 3.0.0 — Night Drive redesign, log compare, new export sheet, six fixes Oct 25, 2026
@SomethingNew71
SomethingNew71 merged commit f4c7b81 into main Oct 25, 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.

[Feature]:

1 participant