Skip to content

Add Pastellplate skin and polish desktop experience - #1

Draft
oddhap wants to merge 6 commits into
mainfrom
codex/pastellplate-skin
Draft

Add Pastellplate skin and polish desktop experience#1
oddhap wants to merge 6 commits into
mainfrom
codex/pastellplate-skin

Conversation

@oddhap

@oddhap oddhap commented Jul 16, 2026

Copy link
Copy Markdown
Owner

What

  • bundle the original light Pastellplate classic skin and install it as a selectable local skin
  • add a reproducible skin generator, preview artwork, palette resources, and archive validation test
  • include the pastel app icon and a native close action
  • improve native panel movement, startup responsiveness, playlist rendering, and skin browser/local skin behavior

Why

Pastellplate gives Tonelag a redistributable light alternative to Model 275. The accompanying desktop fixes address the interaction and skin-selection issues found during hands-on macOS testing.

Impact

The currently selected skin remains unchanged. Pastellplate is copied to the persistent skin store on startup and becomes available in the installed-skins list. The generated archive and artwork are MIT OR Apache-2.0.

Checks

  • pnpm check
  • cargo test --manifest-path src-tauri/Cargo.toml (41 passed, 3 ignored)
  • pnpm tauri build --bundles app
  • verified default-skin/pastellplate.wsz inside Tonelag.app
  • verified deterministic Pastellplate archive SHA-256

@oddhap

oddhap commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

Fixed the skin-control rendering regression. Root cause: native HTML range thumbs and visible fallback button labels were being drawn on top of the classic skin bitmaps, while the UI had no per-sprite-sheet feature classes. Controls now use the canonical Winamp 2.x/Webamp sprite coordinates with resource-aware fallbacks; Pastellplate now ships complete EQMAIN, TITLEBAR, SHUFREP, POSBAR, and PLEDIT sprite areas. Added DOM/parser regressions and verified the built macOS app with an additional installed skin.

Replace transformed hit testing with layout zoom, move non-classic actions into the Tonelag menu, and add fixed-width skin selection plus safe deletion.
@oddhap

oddhap commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

Fixed the follow-up double-size and skin-management issues. Root cause: the UI and native window were both scaled while the interactive layer used transform: scale(2), and all app-specific controls shared the classic title bar. The main UI now uses layout zoom, lazy EQ/playlist windows restore at the correct 2× dimensions, and only original title-bar hotspots remain. Tonelag-specific actions live in one menu. Installed skins now use a fixed-width dropdown and removable skins can be deleted safely; bundled skins are labelled and protected. Verified the actual macOS app at 550×232 / 550×232 / 550×464 and opened the menu through macOS accessibility in 2× mode.

Use native webview zoom instead of CSS zoom, replace static drag regions with explicit titlebar dragging, and place title controls above the drag surface so their pointer targets stay aligned at 2x.
@oddhap

oddhap commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

Fixed the remaining 2× mouse hit-testing issue in 03fc80e. Root cause was CSS zoom combined with WebKit/Tauri hit testing and the native drag overlay. Double size now uses native webview zoom, titlebar dragging starts explicitly from the non-interactive title surface, and controls are rendered in a separate top layer. Added regression tests for draggable titles vs clickable title controls.

Verified: pnpm check (21 frontend tests), cargo test (44 passed, 3 ignored), and a fresh macOS .app bundle.

The full-width title control layer intercepted blank titlebar clicks. Allow unused chrome across main, equalizer, and playlist to initiate native dragging while excluding every interactive control and list or menu region.
@oddhap

oddhap commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

Improved classic-window dragging in c8e62b1. The full-width title control layer was intercepting blank titlebar clicks, so the main, EQ, and playlist panels now start native dragging from any unused chrome area while excluding buttons, inputs, sliders, labels, menus, and the playlist. The titlebar also shows a move cursor. Skin browser behavior is unchanged.

Verified: 22 frontend tests, 44 Rust tests (3 ignored), and a fresh macOS app bundle.

Imported skins forced the title control layer to relative positioning, separating visible controls from their hit targets. Keep classic coordinates absolute and route EQ and playback snapshots only to windows that consume them so the playlist stays stable.
@oddhap

oddhap commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

Fixed imported-skin hit targets and playlist refreshes in 1928563.

  • Removed an imported-skin CSS override that changed the title control layer from absolute to relative positioning, separating the visible buttons from their mouse targets.
  • EQ/preamp updates no longer emit full snapshots to the playlist window.
  • Frequent playback position/spectrum snapshots now target only the main window; playlist still receives queue updates and snapshots when the active item, scale, language, or skin actually changes.

Verified with the currently selected external skin, 23 frontend tests, 45 Rust tests (3 ignored), and a fresh macOS app bundle.

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