41 Commits
Author SHA1 Message Date
John Smith 3240df2c0b docs: refresh README — full achieved vs remaining parity status, parity scorecard (~85%), recent-commit log 2026-09-10 12:28:53 -04:00
John Smith 52c630e3f3 feat(ui/playlists): drag-and-drop + hover-swap-icon (Tier B2) — Zune 4.8 fan-loved playlist flow
Each playlist card in the left rail is now a drag-drop target. Dragging a
track from the right rail (PointerPressed starts DragDrop.DoDragDropAsync
with a TrackListPayload) over a playlist card highlights it with the
accent color (MultiBinding + PlaylistDropHighlightConverter comparing
each Playlist's Id to the VM's HoveredPlaylist).

After a 300ms dwell (Zune's signature hover pause), the hover-swap popup
appears next to the hovered playlist listing the OTHER playlists; hovering
each one swaps the drop target via SwapHoverTargetCommand (the user's
'hover-swap-icon' affordance from the r/Zune quote). Releasing the drag
on the current hover target fires AddTracksToPlaylistCommand which
calls the existing IMediaLibraryService.AddTrackToPlaylistAsync per
track, sets a status message, and reloads the current tracklist.

Nine new VM-level tests cover: EnterPlaylistDropZone / Leave / Refresh,
ClearPlaylistHover, HoverSwapAlternatives filtering, SwapHoverTargetCommand,
AddTracksToPlaylistCommand payload + status message, and HoverSwapPlaylistName
mirroring.
2026-09-10 12:25:23 -04:00
John Smith 351d756889 feat(smartdj): heart-aware Smart DJ shuffle (Tier B1) — hearts prioritized, broken hearts always excluded
Smart DJ now matches the Zune 4.8 fan-loved behavior: favorites surface
first in the mix regardless of similarity to the seed; broken hearts
are ALWAYS filtered even when the seed context (album/artist/genre match)
would otherwise pull them in.

Scoring weights tuned so a heart in any context outranks a non-heart:
AlbumMatchWeight = 12, ArtistMatchWeight = 10, GenreMatchWeight = 5,
HeartBonus = 25, RandomJitter = 3. The favorites-first OrderBy keeps the
ordering stable + testable; a secondary OrderBy by Title makes the output
deterministic.

The ExcludeDisliked flag on SmartDJSeed is preserved for backward
compatibility but is no longer the gate — broken hearts are filtered
unconditionally, which matches the xune-HD canon and the disassembly's
Smart DJ behavior.
2026-09-10 12:03:43 -04:00
John Smith d612da855b feat(ui/motion): Tier A motion batch — Zune 4.8 cropped-header back, parallax pivot slide, idle screensaver, drawer slide-in animations
Tier A1: Tap-the-cut-off-header-to-go-back. The Zune 4.8 iconic navigation
where the current page title bleeds off the left edge of the window and
clicking it pops back to the parent pivot. MainShellViewModel exposes
CroppedHeaderTitle (pivot name or wizard StepTitle), IsCroppedHeaderBack
(click → GoBack), and IsCroppedHeaderDetail (hides brand wordmark in
detail mode). PointerPressed sets e.Handled so the title-bar drag handler
doesn't fire.

Tier A2: PivotParallaxTransition (IPageTransition implementation) gives
each pivot change a 420ms slide + scale + fade with CubicEaseOut.
Quickplay variant tightens to 320ms / 0.85 scale for the 'left and rear'
recess feel. Wired into TransitioningContentControl.

Tier A3: Now Playing idle screensaver. After 3.5s of inactivity in
Now Playing, text drifts left (TranslateTransform.X driven by
IdleDriftConverter on NowPlayingIdleProgress 0..1) and the giant
artist watermark rotates slowly around the Y axis (Rotate3DTransform
on NowPlayingArtRotation, one revolution every 90s). Two new
converters (IdleOpacityConverter, IdleDriftConverter).

Tier A4: Drawer slide-in / fade animations. Bio drawer slides from
-400px (off-screen left), Showlist drawer slides from +400px (off-screen
right), SyncToast slides up from +80px. All driven by VM-side timer
interpolation (BioDrawerOffsetX/Opacity, ShowlistDrawerOffsetX/Opacity)
with two new converters (SyncToastOpacityConverter, SyncToastSlideConverter)
providing the initial RenderTransform target values. NowPlayingViewModel
exposes UpdateDrawerTargets() invoked from ToggleBioDrawer/ToggleShowlist
that starts a 60fps interpolation timer until both drawers reach target.
2026-09-10 08:09:28 -04:00
John Smith 3a4318a3fc docs(parity): add comprehensive gap inventory vs disassembly (input to next-batch roadmap) 2026-09-10 07:23:51 -04:00
John Smith 481c36312d fix(ui/shell): Settings pivot-gating bug + Now Playing button hover/pressed states + CDView disc art + mini-player showlist/volume + cross-collection search + real About panel
- Settings pivot-gating regression: SoftwarePivot setter was missing
  5 OnPropertyChanged notifications for the Phase 3 sub-pivots
  (Podcasts / FileTypes / Privacy / Photos / General). Switching between
  them left the previous panel visible. Fix + regression test.
- CDView: bind CDLANDSHINE / CDRIPBURNGLOW / CDARTSHADOW assets
  (already extracted in the disassembly corpus, never wired).
- MainShell Now Playing button: ENTER / HOVER / PRESSED variants and
  HOVER.FRAME0N / PRESSED.FRAME0N per-frame variants — Avalonia 11
  PointerEntered / PointerExited / PointerPressed wired through the VM.
- Compact mini-player: showlist toggle (NowPlayingVM.ToggleShowlistCommand)
  + compact volume slider; mini-player Width bumped 420 -> 480 to fit.
- MainShell header search: cross-collection matches (podcasts + videos)
  fetched asynchronously with cancellation, debounced via a per-keystroke
  CancellationTokenSource, deduped against the synchronous collection
  suggestions.
- About sub-pivot: full Zune-style product panel — branded logo,
  ProductName / ProductTagline / ProductVersion / ProductRuntime /
  PlatformInfo / ProductBuildId / ProductCopyright / MIT license / EULA link.
  AppInfo expanded with BuildIdentifier and RuntimeIdentifier populated
  at Desktop startup.
- Reusable test fakes (FakeMediaLibraryService / FakeDeviceSyncService)
  under tests/NotZune.Tests.Application/TestFakes/.
2026-09-10 07:23:43 -04:00
John Smith dbd759d4b0 docs(parity): refresh deferred registry — add type-ahead jump, OS file associations, drag-inertia pivot pan, settings sharing 2026-09-09 22:08:52 -04:00
John Smith 9476c0bc85 feat(ui/theme): Zune 4.8 light theme parity — runtime dark/light swap (default light is #F3EFF1 per Shell.cs:668)
Add full paired token sets for surfaces, text, borders, and inputs
(ZuneBackground / ZuneSurfaceElevated / ZuneCard / ZuneCardHover /
ZuneBorder / ZuneSubtleBorder / ZuneInputBackground / five text levels).
A Settings → Display "THEME" picker lets the user toggle dark/light;
the selection is persisted as SelectedThemeName.

ApplyTheme rewrites the brush colors in Application.Resources so every
view bound via DynamicResource updates without per-view restyling.
Verified visually under Xvfb at 1012x693: dark mode reproduces the
authentic #11090F, light mode reproduces the authentic #F3EFF1 with
the magenta accent family unchanged across both.
2026-09-09 22:08:17 -04:00
John Smith 19935883b3 feat(ui/device): FirstConnect wizard parity — per-serial device-arrival onboarding (FIRSTCONNECT.UIX)
Zune 4.8's FirstConnect flow: welcome → device name → media-type sync
toggles → privacy → done. Triggered once per physical device serial
the first time it connects, mirroring the existing first-launch /
what's-new overlay pattern.

Persistence: FirstConnectCompletedSerials list in AppSettings tracks
which serials have completed setup. The chosen sync-rule defaults are
pushed into the existing SettingsVM sync-rule fields, and the device
name into a new FirstConnectDeviceName field, all saved via the
existing JSON settings pipeline.
2026-09-09 21:58:36 -04:00
John Smith 429e322333 feat(ui/settings): Zune 4.8 settings parity — file types, privacy, photos, general pages (and FirstConnect serials persisted)
File types page (FILETYPES.UIX parity): ingest-extensions editor with
Zune's default preset set; real OS file associations deferred.
Privacy page: usage-data opt-in (no telemetry subsystem ships with this
flag — stored for parity) + auto-check-for-updates toggle.
Photos page: photo folder picker + slideshow shuffle/repeat defaults
+ delete-after-reverse-sync toggle.
General page: startup view (Quickplay/Collection), sound effects,
compact-mode-always-on-top, show-ratings toggles.
FirstConnect completed-serials list also persisted here so the upcoming
FirstConnect wizard can run once per physical device.
2026-09-09 21:42:56 -04:00
John Smith 1e935ee952 feat(ui/podcasts): mark-all-played/unplayed commands + podcasts settings page (keep episodes, auto-download) 2026-09-09 20:38:58 -04:00
John Smith c3c530ee11 feat(ui/playback): Zune 4.8 keyboard-shortcut parity — Ctrl+S stop, Ctrl+Left/Right seek, F1 about, / search-focus; gas-gauge category colors bound to dynamic tokens 2026-09-09 20:24:17 -04:00
John Smith 6da7bb80ac feat(ui/theme): authentic Zune 4.8 visual parity verified against disassembly corpus
Ground truth from tools/disassembly/ (Shell.cs, StandAlone.cs, shipped asset pixels):
- window background #111111 -> #11090F (Shell.WindowColorFromRGB RGB(17,9,15))
- default accent #FA2A55 -> authentic 4.8 magenta #F10DA2 (TRANSPORT.*.ON pixels),
  hover #FA6EC9, new pressed token #B9077B; settings accent options pink/orange
  corrected to #F10DA2/#EC6922 (asset-verified); SystemAccentColor follows accent
  so Fluent-templated slider thumb/checks/radios re-brand (App.axaml + ApplyAccent)
- window geometry: default 1012x693 (StandAlone.cs WindowSize) and min 734x500
  (Shell.c_minimumWindowWidth/Height) restored; compact-exit floor matches
- pivot strip now pans (wheel) with panoramic right-edge bleed, so authentic
  32pt pivots (Segoe Z Light,32 spec) fit the 734px min again
- HUD columns 340,*,340 -> Auto,*,Auto + tightened metrics: no more transport/time
  collision at 734px; back-arrow rendered at native 24x24 (was distorted 14x15)
- test updated for corrected accent hex

Verified: Release build 0 warnings, 112 tests pass, design audit PASSED,
Xvfb screenshots at 1012x693 and 734x500 inspected
2026-09-09 19:30:38 -04:00
John Smith 6a83692897 fix(ui/shell): use Avalonia 11.2 StandardCursorType names for resize zones (SizeNorthWestSouthEast etc. don't exist; startup crash) 2026-09-09 18:57:17 -04:00
John Smith 1e3737b982 feat(ui/shell): borderless window chrome with edge resize, pivot/settings polish, ShowSearch parity
- SystemDecorations=None for authentic Zune 4.8 chromeless window, with
  invisible 8-zone edge/corner resize hits + resize cursors and
  double-click-to-maximize on the title bar
- Widen default window (1360x780) and compact-exit floor (1100x560)
- pivot-header 32 -> 28; new mini-pivot style for SETTINGS/mode toggles;
  CD + settings mode/sub-pivot rows moved to subpivot + Classes.active
- settings sub-pivot flags composed with top-level pivot to stop two
  content panels rendering at once
- header search hidden on quickplay/now playing/settings (ShowSearch parity)
- background art, sync toast, first-launch/whats-new overlays span the full shell grid
2026-09-09 18:53:02 -04:00
John Smith 340d16fbc0 fix: always resolve video paths via GetFullPath before Uri conversion (rooted Windows paths are not absolute URIs); deadline-based CD rip/burn test polling 2026-09-09 18:04:14 -04:00
John Smith d249c692a3 audio: replace obsolete BassFlags.MixerNoRampin with MixerChanNoRampin (zero-warnings policy) 2026-09-09 17:58:05 -04:00
John Smith 7321d9d500 fix: Windows CI — resolve relative paths to full paths in video LoadAndPlay, clear SQLite connection pools in test cleanup 2026-09-09 17:57:16 -04:00
John Smith 502eed628e Phase 11: final parity sweep — CI/release packaging, measured re-audit (~75-80%), WAL + artwork decode cache, deferred registry 2026-09-09 17:21:04 -04:00
John Smith d89756ebb2 Phase 9: device sync architecture — sync-group engine, transport abstraction, dry-run manifest, guest sessions, reverse sync 2026-09-09 17:16:03 -04:00
John Smith 1bfc4f0b28 docs(plan): refresh true-parity task plan — phases 5-8 complete, detailed phases 9-11 2026-09-09 16:58:48 -04:00
John Smith 833b5ef4ac feat(media): video + photo libraries with real libVLC playback, now playing clips, gallery + slideshow, device media sync rules (true-parity phase 8) 2026-09-09 16:54:22 -04:00
John Smith f3d95aad4f feat(onboarding): first-launch wizard, what's new dialog, sync instruction toast + animation (true-parity phase 7) 2026-09-09 16:32:40 -04:00
John Smith ead9a079eb feat(collection): smart playlists, find-album-info track matching, search autocomplete, global back-stack, mixview action tiles (true-parity phase 6) 2026-09-09 16:25:14 -04:00
John Smith fc5e7a1a68 feat(audio): real ManagedBass playback engine — gapless, crossfade, replaygain, FFT visualizer, podcast streams (true-parity phase 5) 2026-09-09 15:51:04 -04:00
John Smith 93e99d7525 docs(audit): full Zune 4.8 parity audit against decompiled binaries (shell, ZMDB API, 241 UIX docs, setup payload)
- Decompile ZuneDBApi_Dll (1030 files) and re-extract 1857 ZuneShellResources (241 UIX)
- Unpack ZuneSetupPkg.exe offline setup (x86/x64 MSIs + firmware update svc)
- docs/parity/zune48_parity_audit.md: 13-domain parity matrix, status + evidence
- Track decompiled trees (zuneshell/zunedbapi/zuneshell_resources/uix); ignore raw installers
2026-09-09 14:54:01 -04:00
John Smith 6570600d6c feat(enrichment): online metadata integration (find album info, artist bios + fanart backdrops, LRCLIB lyrics, settings persistence) 2026-09-09 14:38:32 -04:00
John Smith 622a57bb3c feat(ui/playback): complete Zune 4.8 Phase 3 fidelity rebuild (mixview, cd land, ken-burns now playing, two-tier settings, crossfade) 2026-09-09 14:07:11 -04:00
John Smith f348f7dbab feat(ui/playback): complete Zune 4.8 Phase 2 rebuild (mini-player, pinning, smart DJ, shortcuts, showlist, folder watcher, settings) 2026-09-07 01:02:47 -04:00
John Smith 17eca5b548 feat(branding): configure xune.svg as multi-resolution application and window icon (.ico/.png) 2026-09-06 22:43:29 -04:00
BillyOutlast 09d05bd9a8 Add files via upload 2026-09-06 22:41:36 -04:00
John Smith ceb3a4378b feat(zune-4.8): rebuild fan-favorite quick dock, gas gauge, playlists, search, and metadata editor 2026-09-06 22:37:41 -04:00
John Smith 79d6e837ca feat(library): wire music folder browsing, TagLibSharp audio scanning, and demo data clearing 2026-09-06 22:20:23 -04:00
John Smith abb0b4094f fix(xaml): use explicit clr-namespace assembly qualification to resolve type resolution error in standalone builds 2026-09-06 20:53:36 -04:00
John Smith cc1312c21c feat(ui): restore signature Zune features (Mini-Player, Zune Card Social, Podcasts, WAV sounds, themes gallery, animated equalizer) 2026-09-06 20:47:09 -04:00
John Smith 553a1a256a feat(ui): disassemble Zune 4.8, extract authentic Iris UIX assets, and rebuild UI
- Download and disassemble official ZunePackage.exe redistributable
- Decompile ZuneShell.dll and extract all 1,857 assets from ZuneShellResources.dll
- Ingest authentic 32-bit RGBA transport, rating, window, branding PNGs, and Segoe Zune TrueType fonts
- Rebuild MainShellView, QuickplayView, NowPlayingView, and DeviceView with authentic Zune assets
- Enforce exact Zune Iris minimum window constraints (734x500)
- Add Avalonia Headless testing support for view instantiation
- Author detailed technical analysis docs/disassembly/zune_uix_analysis.md
2026-09-06 20:36:19 -04:00
John Smith 8213c70f82 fix(ui): register ViewLocator and DataTemplates, fix play button glyph and settings accent command
- Create ViewLocator implementing IDataTemplate for ViewModel-to-View resolution
- Register ViewLocator in App.axaml and add explicit DataTemplates to MainShellView
- Expose PlayPauseIcon (▶ / ⏸) on MainShellViewModel and NowPlayingViewModel to replace raw boolean display
- Add SelectAccentCommand to SettingsViewModel and bind accent palette tiles
- Add NavigationAndPlaybackUiTests suite covering ViewLocator, glyph toggles, and pivot navigation (12/12 tests passing)
2026-09-06 20:24:14 -04:00
John Smith 8be7f0f774 feat(ui): complete authentic Zune Desktop 4.8 / Metro UI overhaul
- Implement borderless custom window chrome with client area decorations and minimal controls
- Add two-column integrated artist discography view with inline album cards and tracklists
- Add interactive album cover grid and dense song data table with contextual queue management
- Implement Quickplay Hub with 3-deck panorama (Pins, History, New) and Smart DJ presets
- Implement cinematic Now Playing experience with dynamic Ken-Burns canvas, mosaic wall, and auto-hiding HUD
- Seed 6 complete iconic albums (Rush, Daft Punk, Pink Floyd, Fleetwood Mac, Miles Davis, New Order)
- Verify zero design invariant violations across all AXAML views
2026-09-06 20:15:52 -04:00
John Smith eb685b25b4 docs: Add special thanks to cmoserror1 and community acknowledgements 2026-09-06 20:07:08 -04:00
John Smith 8c70db1bc6 ci: Add multi-platform build and release workflow for Linux and Windows (x64 and arm64) 2026-09-06 20:03:06 -04:00
John Smith 80410ef9ed feat: Initial implementation of Not-Zune cross-platform desktop player 2026-09-06 20:01:39 -04:00