Skip to content

Commit 848458d

Browse files
committed
fix(x01): release bust highlight visual fix in 2.4.7
- keep bust active-player styling independent from later hit tile colors - bump userscript version and regenerate release artifacts - document release and require commit messages for future version bumps
1 parent 369c519 commit 848458d

10 files changed

Lines changed: 64 additions & 57 deletions

File tree

.agents/skills/package-userscript-release/SKILL.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Do not use it for ordinary implementation, cleanup, validation, or docs work.
2222
- keep local working tree, local commit, GitHub-published, and installed-userscript truth separate
2323
- use `$maintain-changelog` for changelog curation; do not duplicate changelog policy here
2424
- do not claim remote publication or installed-version availability unless actually verified
25+
- include a suitable draft commit message whenever a version bump is performed
2526

2627
# Context budget
2728

@@ -48,3 +49,4 @@ A valid result must:
4849
- align all local version markers
4950
- distinguish local, committed, GitHub-published, and installed truth
5051
- report validation and publication state honestly
52+
- include a suitable draft commit message when the task included a version bump

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ zum nächsten Release-Commit vorübergehend auf `HEAD` zeigen.
1212
Dieses Repository führt keine `Unreleased`-Sektion. Jeder dokumentierte Eintrag gehört
1313
direkt zu einer versionierten Release-Sektion.
1414

15+
## [2.4.7] - 2026-06-25
16+
17+
### Fixed
18+
19+
- Nutzerwirkung: `X01 Bust Active Player Highlight` behält beim Überwurf das rote `60 T20`-Hitkachel-Design auf der aktiven Spielerkarte, auch wenn spätere Trefferanimationen andere Farben verwenden.
20+
Technik: Das Bust-Modul verwendet eine feste Kopie der roten Hitkachel-Visuals statt aktueller Throw-Tile-Styles und schützt den Pfad mit einer Regression gegen anders eingefärbte Trefferflächen.
21+
1522
## [2.4.6] - 2026-06-25
1623

1724
### Added
@@ -1759,7 +1766,8 @@ direkt zu einer versionierten Release-Sektion.
17591766
und Regressionstests eingeführt und die generierten README-/FEATURES-Texte wurden
17601767
entsprechend synchronisiert.
17611768

1762-
[2.4.6]: https://github.com/thomasasen/autodarts-xconfig/compare/4da06d6...HEAD
1769+
[2.4.7]: https://github.com/thomasasen/autodarts-xconfig/compare/369c519...HEAD
1770+
[2.4.6]: https://github.com/thomasasen/autodarts-xconfig/compare/4da06d6...369c519
17631771
[2.4.5]: https://github.com/thomasasen/autodarts-xconfig/compare/106b63c...4da06d6
17641772
[2.4.4]: https://github.com/thomasasen/autodarts-xconfig/compare/e93e11d...106b63c
17651773
[2.4.3]: https://github.com/thomasasen/autodarts-xconfig/compare/73900ce...e93e11d

dist/autodarts-xconfig.meta.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// ==UserScript==
22
// @name autodarts-xconfig
33
// @namespace https://github.com/thomasasen/autodarts-xconfig
4-
// @version 2.4.6
4+
// @version 2.4.7
55
// @description Modular, side-effect resistant Tampermonkey runtime for Autodarts enhancements.
66
// @author Thomas Asen
77
// @license MIT

dist/autodarts-xconfig.user.js

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// ==UserScript==
22
// @name autodarts-xconfig
33
// @namespace https://github.com/thomasasen/autodarts-xconfig
4-
// @version 2.4.6
4+
// @version 2.4.7
55
// @description Modular, side-effect resistant Tampermonkey runtime for Autodarts enhancements.
66
// @author Thomas Asen
77
// @license MIT
@@ -12926,7 +12926,6 @@ ${scopedClassSelector(selectorPrefix, EFFECT_CLASSES["fade-blink"])} {
1292612926

1292712927
// src/features/x01-bust-active-player-highlight/logic.js
1292812928
var TURN_POINTS_SELECTOR2 = ".ad-ext-turn-points";
12929-
var TURN_THROW_SELECTOR = "#ad-ext-turn .ad-ext-turn-throw, .ad-ext-turn-throw";
1293012929
var ACTIVE_PLAYER_SELECTOR = "#ad-ext-player-display .ad-ext-player.ad-ext-player-active, #ad-ext-player-display .ad-ext-player-active, .ad-ext-player.ad-ext-player-active, .ad-ext-player-active";
1293112930
var SHAKE_DURATION_MS = 3e3;
1293212931
var BUST_SOUND_VOLUME = 0.9;
@@ -12996,26 +12995,12 @@ ${scopedClassSelector(selectorPrefix, EFFECT_CLASSES["fade-blink"])} {
1299612995
}
1299712996
return queryOne2(documentRef, ACTIVE_PLAYER_SELECTOR);
1299812997
}
12999-
function readComputedValue(style, propertyName, fallbackValue) {
13000-
const value = String(style?.[propertyName] || "").trim();
13001-
return value || fallbackValue;
13002-
}
13003-
function resolveBustCardVisuals(documentRef, windowRef = null) {
13004-
const throwNode = queryOne2(documentRef, TURN_THROW_SELECTOR);
13005-
const getComputedStyleRef3 = windowRef && typeof windowRef.getComputedStyle === "function" ? windowRef.getComputedStyle.bind(windowRef) : null;
13006-
const style = throwNode && getComputedStyleRef3 ? getComputedStyleRef3(throwNode) : null;
12998+
function resolveBustCardVisuals() {
1300712999
return {
13008-
background: readComputedValue(style, "background", FALLBACK_BUST_CARD_VISUALS.background),
13009-
backgroundColor: readComputedValue(
13010-
style,
13011-
"backgroundColor",
13012-
FALLBACK_BUST_CARD_VISUALS.backgroundColor
13013-
),
13014-
border: readComputedValue(style, "border", FALLBACK_BUST_CARD_VISUALS.border),
13015-
borderColor: readComputedValue(style, "borderColor", "rgb(207, 52, 52)"),
13016-
borderStyle: readComputedValue(style, "borderStyle", "solid"),
13017-
borderWidth: readComputedValue(style, "borderWidth", "0.8px"),
13018-
boxShadow: readComputedValue(style, "boxShadow", FALLBACK_BUST_CARD_VISUALS.boxShadow)
13000+
...FALLBACK_BUST_CARD_VISUALS,
13001+
borderColor: "rgb(207, 52, 52)",
13002+
borderStyle: "solid",
13003+
borderWidth: "0.8px"
1301913004
};
1302013005
}
1302113006
function setStylePropertyIfChanged(node, propertyName, value) {
@@ -13434,7 +13419,7 @@ ${scopedClassSelector(selectorPrefix, EFFECT_CLASSES["fade-blink"])} {
1343413419
clearNodeState(state.activeNode);
1343513420
}
1343613421
const enteredBust = state.wasBust !== true;
13437-
const visuals = resolveBustCardVisuals(documentRef, windowRef);
13422+
const visuals = resolveBustCardVisuals();
1343813423
activeNode.classList.add(BUST_ACTIVE_CLASS);
1343913424
applyBustCardVisuals(activeNode, visuals);
1344013425
state.activeNode = activeNode;
@@ -41964,7 +41949,7 @@ ${buildTurnSuggestionDartGuardStyleBlock()}`;
4196441949

4196541950
// src/core/bootstrap.js
4196641951
var GLOBAL_NAMESPACE_KEY = "__adXConfig";
41967-
var API_VERSION = "2.4.6";
41952+
var API_VERSION = "2.4.7";
4196841953
var STARTUP_DEFER_INTERVAL_MS = 16;
4196941954
function getWindowTimerApi(windowRef) {
4197041955
let setTimeoutRef = null;

loader/autodarts-xconfig.user.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// ==UserScript==
22
// @name autodarts-xconfig
33
// @namespace https://github.com/thomasasen/autodarts-xconfig
4-
// @version 2.4.6
4+
// @version 2.4.7
55
// @description Modular, side-effect resistant Tampermonkey runtime for Autodarts enhancements.
66
// @author Thomas Asen
77
// @license MIT

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "autodarts-xconfig",
3-
"version": "2.4.6",
3+
"version": "2.4.7",
44
"description": "Clean successor architecture for autodarts xConfig userscript modules",
55
"type": "module",
66
"imports": {

src/core/bootstrap.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { createListenerRegistry } from "./listener-registry.js";
1313
import { createObserverRegistry } from "./observer-registry.js";
1414

1515
const GLOBAL_NAMESPACE_KEY = "__adXConfig";
16-
const API_VERSION = "2.4.6";
16+
const API_VERSION = "2.4.7";
1717
const STARTUP_DEFER_INTERVAL_MS = 16;
1818

1919
function getWindowTimerApi(windowRef) {

src/features/x01-bust-active-player-highlight/logic.js

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { isX01VariantText } from "../../domain/variant-rules.js";
1010
import { removeBustCracks, renderBustCracks } from "./cracks.js";
1111

1212
export const TURN_POINTS_SELECTOR = ".ad-ext-turn-points";
13-
export const TURN_THROW_SELECTOR = "#ad-ext-turn .ad-ext-turn-throw, .ad-ext-turn-throw";
1413
export const ACTIVE_PLAYER_SELECTOR =
1514
"#ad-ext-player-display .ad-ext-player.ad-ext-player-active, #ad-ext-player-display .ad-ext-player-active, .ad-ext-player.ad-ext-player-active, .ad-ext-player-active";
1615
export const SHAKE_DURATION_MS = 3000;
@@ -101,31 +100,12 @@ export function findActiveX01PlayerCard(documentRef) {
101100
return queryOne(documentRef, ACTIVE_PLAYER_SELECTOR);
102101
}
103102

104-
function readComputedValue(style, propertyName, fallbackValue) {
105-
const value = String(style?.[propertyName] || "").trim();
106-
return value || fallbackValue;
107-
}
108-
109-
export function resolveBustCardVisuals(documentRef, windowRef = null) {
110-
const throwNode = queryOne(documentRef, TURN_THROW_SELECTOR);
111-
const getComputedStyleRef =
112-
windowRef && typeof windowRef.getComputedStyle === "function"
113-
? windowRef.getComputedStyle.bind(windowRef)
114-
: null;
115-
const style = throwNode && getComputedStyleRef ? getComputedStyleRef(throwNode) : null;
116-
103+
export function resolveBustCardVisuals() {
117104
return {
118-
background: readComputedValue(style, "background", FALLBACK_BUST_CARD_VISUALS.background),
119-
backgroundColor: readComputedValue(
120-
style,
121-
"backgroundColor",
122-
FALLBACK_BUST_CARD_VISUALS.backgroundColor
123-
),
124-
border: readComputedValue(style, "border", FALLBACK_BUST_CARD_VISUALS.border),
125-
borderColor: readComputedValue(style, "borderColor", "rgb(207, 52, 52)"),
126-
borderStyle: readComputedValue(style, "borderStyle", "solid"),
127-
borderWidth: readComputedValue(style, "borderWidth", "0.8px"),
128-
boxShadow: readComputedValue(style, "boxShadow", FALLBACK_BUST_CARD_VISUALS.boxShadow),
105+
...FALLBACK_BUST_CARD_VISUALS,
106+
borderColor: "rgb(207, 52, 52)",
107+
borderStyle: "solid",
108+
borderWidth: "0.8px",
129109
};
130110
}
131111

@@ -625,7 +605,7 @@ export function syncBustActivePlayerHighlight(context = {}, state = createBustAc
625605
}
626606

627607
const enteredBust = state.wasBust !== true;
628-
const visuals = resolveBustCardVisuals(documentRef, windowRef);
608+
const visuals = resolveBustCardVisuals();
629609
activeNode.classList.add(BUST_ACTIVE_CLASS);
630610
applyBustCardVisuals(activeNode, visuals);
631611
state.activeNode = activeNode;

tests/runtime/x01-bust-active-player-highlight.test.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ function setupBustDocument(options = {}) {
129129
documentRef.variantElement.textContent = options.variantText || "X01";
130130
setTurnScore(documentRef, options.turnScoreText || "BUST");
131131
const players = appendPlayerDisplay(documentRef);
132-
documentRef.throwRow.__computedStyle = {
132+
documentRef.throwRow.__computedStyle = options.throwComputedStyle || {
133133
background:
134134
"rgba(255, 0, 0, 0.15) none repeat scroll 0% 0% / auto padding-box border-box",
135135
backgroundColor: "rgba(255, 0, 0, 0.15)",
@@ -181,6 +181,38 @@ test("x01 bust highlight styles and shakes only the active player on bust entry"
181181
assert.equal(activeCard.style.getPropertyPriority("box-shadow"), "important");
182182
});
183183

184+
test("x01 bust highlight keeps copied hit visuals when current hit tiles use another theme", () => {
185+
const { documentRef, activeCard, activeSurface } = setupBustDocument({
186+
throwComputedStyle: {
187+
background:
188+
"rgba(0, 0, 0, 0) linear-gradient(165deg, rgba(8, 12, 12, 0.98) 0%, rgba(11, 19, 12, 0.96) 48%, rgba(6, 11, 8, 0.99) 100%) repeat scroll 0% 0% / auto padding-box border-box",
189+
backgroundColor: "rgba(0, 0, 0, 0)",
190+
border: "0.8px solid rgba(255, 255, 255, 0.14)",
191+
borderColor: "rgba(255, 255, 255, 0.14)",
192+
borderStyle: "solid",
193+
borderWidth: "0.8px",
194+
boxShadow:
195+
"rgba(255, 255, 255, 0.04) 0px 0px 0px 1px inset, rgba(0, 0, 0, 0.28) 0px -8px 18px 0px inset",
196+
},
197+
});
198+
const state = createBustActivePlayerHighlightState();
199+
const { windowRef } = createManualTimerWindow(documentRef);
200+
201+
syncBustActivePlayerHighlight({ documentRef, windowRef }, state);
202+
203+
assert.equal(
204+
activeCard.style.getPropertyValue("--ad-ext-x01-bust-active-player-background-color"),
205+
"rgba(255, 0, 0, 0.15)"
206+
);
207+
assert.equal(
208+
activeCard.style.getPropertyValue("--ad-ext-x01-bust-active-player-border"),
209+
"0.8px solid rgb(207, 52, 52)"
210+
);
211+
assert.equal(activeSurface.style.getPropertyValue("background-color"), "rgba(255, 0, 0, 0.15)");
212+
assert.equal(activeCard.style.getPropertyValue("border-color"), "rgb(207, 52, 52)");
213+
assert.equal(activeCard.style.getPropertyValue("box-shadow"), "none");
214+
});
215+
184216
test("x01 bust highlight plays the glass crack sound only on bust entry when enabled", () => {
185217
const { documentRef } = setupBustDocument();
186218
const state = createBustActivePlayerHighlightState();

0 commit comments

Comments
 (0)