diff --git a/1030000/META.json b/1030000/META.json index a4782d0..977112b 100644 --- a/1030000/META.json +++ b/1030000/META.json @@ -15,7 +15,7 @@ "unresolved_missing": 0, "stale": 0, "cdp_hit_rate": 0.6389, - "overlay_entries": 284 + "overlay_entries": 287 }, "required_paths": { "main.playbar.buttons.button.wrapper": "verified_cdp", @@ -95,6 +95,17 @@ "class": "utdiMuyxdKvPowN1CIBs", "staged_class": "x-toggle-input", "verification": "The native checkbox uses opacity:0, pointer-events:none, and position:absolute in five stock stylesheets. The missing semantic hook left stdlib Settings rows showing both a native checkbox and their styled indicator. Reapply restores the shared input styling; live Spicetify Settings inputs have opacity 0 and absolute positioning while their toggle indicators remain visible. Regression coverage fails without the mapping." + }, + "playback_bar": { + "date": "2026-09-16", + "spotify_version": "1.3.0.277", + "mappings": { + "Ox6fJ7l6WeB1wD0MqHXb": "playback-bar", + "LppHcR524PsiPr4sz5IV": "playback-bar__progress-time-elapsed", + "TcCS0BhwDXw_s2HufffR": "main-playbackBarRemainingTime-container" + }, + "verification": "Stock CSS and live playback controls confirm the container, elapsed-time, and duration roles. Applied through Rust CLI 3.0.0-beta.17 on macOS with published Text 0.1.6. Text restores its full-width 16px seek track. Text 0.1.6 returns the absolutely positioned timestamp spans to normal flow and aligns the seek handle. Pointer seeking, ArrowRight seeking, and the duration/remaining-time toggle passed through UI input.", + "previous_version_check": "Archived Spotify 1.2.94 CSS maps o9SONbmdTWwKgbUo, _xaGcuWD6w4FNkGu, and jYB3Yggec0UDIsZh to the same hooks and preserves their container and timestamp roles. Older maps are unchanged. No older client was run live." } } } diff --git a/1030000/css-map.json b/1030000/css-map.json index 2bca146..076875f 100644 --- a/1030000/css-map.json +++ b/1030000/css-map.json @@ -58,6 +58,7 @@ "LguNLyc0Zj3lIy5bxmgs": "main-nowPlayingView-queue", "Llk54MZFup0wu3rkXHF0": "x-settings-restartAppButton", "LoJaWz3GM7y9bCpg7l62": "x-settings-equalizerPanelFilter", + "LppHcR524PsiPr4sz5IV": "playback-bar__progress-time-elapsed", "LwhcudULaBeptw_Hhqql": "main-cardImage-image", "M5eIz4xR20CQuAB7RMRN": "main-shelf-titleWrapper", "MCkayUaVAuxznWlcW6sh": "cover-art", @@ -72,6 +73,7 @@ "OoLU5N1eto82G2kJrMug": "profile-userEditDetails-image", "OtjXd6gTGOwBz_BO2MWu": "x-settings-tooltip", "OweqfPQPNscHYqA1Ke4y": "profile-userEditDetails-labelText", + "Ox6fJ7l6WeB1wD0MqHXb": "playback-bar", "P91StDUW8iiKx4vRlEpx": "artist-artistDiscography-headerContainer", "PGUsx7TTOQt2hFluVtHK": "main-trackList-rowSectionEnd", "PIP22o58Crv8RXY4wB2o": "Root__nav-bar", @@ -99,6 +101,7 @@ "TA9CeGsJ_G9M7He0TKpg": "main-editImageButton-image", "TKsrejtJOyPetWIlgRI4": "main-nowPlayingView-headerButtonContainer", "TUsfbEDwQemSH_FcqOOg": "main-contextMenu-menuItemIconWrapper", + "TcCS0BhwDXw_s2HufffR": "main-playbackBarRemainingTime-container", "TfVTZDI_lRJD2nIOQv3b": "x-progressBar-fillColor", "U9IblwAQPPLiYT7AX6uC": "main-yourLibraryX-filterArea", "V7HUYAKeYnj9VXHJ6zB7": "view-homeShortcutsGrid-imageContainer", diff --git a/index.json b/index.json index 7ab7093..a62b67b 100644 --- a/index.json +++ b/index.json @@ -137,11 +137,11 @@ }, "cssMapOverlay": { "file": "css-map.json", - "sha256": "29351b698ec06c6731a6069628ed007218e20acd507b98d5a89248ba3770370b" + "sha256": "160c68ee450a4b56353948a77d2416a41f301cc728da469ad58b65ad954ff212" }, "meta": { "file": "META.json", - "sha256": "c1dfef890570cb5a02524558c9c6b8fd89f103bc59f08ce8d2079df0ceebfc6e" + "sha256": "fee7854bc9391380d4fdc515859af5c3eed56f74cd09090a4a52b30cd350f186" }, "spotifyVersion": "1.3.0.277", "status": "verified" diff --git a/scripts/test_classmap_contracts.py b/scripts/test_classmap_contracts.py index e8d2732..653db18 100644 --- a/scripts/test_classmap_contracts.py +++ b/scripts/test_classmap_contracts.py @@ -24,6 +24,21 @@ def test_spotify_130_topbar_buttons_keep_the_native_hitbox_after_staging(self): ) +class PlaybackBarContractTests(unittest.TestCase): + def test_spotify_130_restores_seek_bar_and_time_label_hooks(self): + overlay = json.loads((ROOT / "1030000" / "css-map.json").read_text()) + # Roles checked against the stock CSS and live playback controls. + expected = { + "Ox6fJ7l6WeB1wD0MqHXb": "playback-bar", + "LppHcR524PsiPr4sz5IV": "playback-bar__progress-time-elapsed", + "TcCS0BhwDXw_s2HufffR": "main-playbackBarRemainingTime-container", + } + for source, target in expected.items(): + with self.subTest(control=target): + self.assertEqual(overlay.get(source), target) + self.assertEqual(list(overlay.values()).count(target), 1) + + class RootContainerContractTests(unittest.TestCase): def test_settings_toggle_hides_the_native_input_behind_its_indicator(self): overlay = json.loads((ROOT / "1030000" / "css-map.json").read_text()) diff --git a/visual/baseline/text/home-profile.png b/visual/baseline/text/home-profile.png new file mode 100644 index 0000000..1cb9ee9 Binary files /dev/null and b/visual/baseline/text/home-profile.png differ diff --git a/visual/baseline/text/home.png b/visual/baseline/text/home.png new file mode 100644 index 0000000..58e8edf Binary files /dev/null and b/visual/baseline/text/home.png differ diff --git a/visual/baseline/text/liked-songs.png b/visual/baseline/text/liked-songs.png new file mode 100644 index 0000000..497a31b Binary files /dev/null and b/visual/baseline/text/liked-songs.png differ diff --git a/visual/baseline/text/search.png b/visual/baseline/text/search.png new file mode 100644 index 0000000..849f4e3 Binary files /dev/null and b/visual/baseline/text/search.png differ diff --git a/visual/baseline/text/settings-library.png b/visual/baseline/text/settings-library.png new file mode 100644 index 0000000..af46a83 Binary files /dev/null and b/visual/baseline/text/settings-library.png differ diff --git a/visual/baseline/text/settings-top.png b/visual/baseline/text/settings-top.png new file mode 100644 index 0000000..165610b Binary files /dev/null and b/visual/baseline/text/settings-top.png differ diff --git a/visual/baseline/text/spicetify-settings.png b/visual/baseline/text/spicetify-settings.png new file mode 100644 index 0000000..be8d3d2 Binary files /dev/null and b/visual/baseline/text/spicetify-settings.png differ diff --git a/visual/baseline/unthemed/home-profile.png b/visual/baseline/unthemed/home-profile.png new file mode 100644 index 0000000..a28e3d1 Binary files /dev/null and b/visual/baseline/unthemed/home-profile.png differ diff --git a/visual/baseline/unthemed/home.png b/visual/baseline/unthemed/home.png new file mode 100644 index 0000000..0147fca Binary files /dev/null and b/visual/baseline/unthemed/home.png differ diff --git a/visual/baseline/unthemed/liked-songs.png b/visual/baseline/unthemed/liked-songs.png new file mode 100644 index 0000000..0be57ec Binary files /dev/null and b/visual/baseline/unthemed/liked-songs.png differ diff --git a/visual/baseline/unthemed/search.png b/visual/baseline/unthemed/search.png new file mode 100644 index 0000000..5d7c9d3 Binary files /dev/null and b/visual/baseline/unthemed/search.png differ diff --git a/visual/baseline/unthemed/settings-library.png b/visual/baseline/unthemed/settings-library.png new file mode 100644 index 0000000..30d6a88 Binary files /dev/null and b/visual/baseline/unthemed/settings-library.png differ diff --git a/visual/baseline/unthemed/settings-top.png b/visual/baseline/unthemed/settings-top.png new file mode 100644 index 0000000..c24c184 Binary files /dev/null and b/visual/baseline/unthemed/settings-top.png differ diff --git a/visual/baseline/unthemed/spicetify-settings.png b/visual/baseline/unthemed/spicetify-settings.png new file mode 100644 index 0000000..268e9b2 Binary files /dev/null and b/visual/baseline/unthemed/spicetify-settings.png differ