Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add default colour for challenge description and reward text - #418

Merged
tastybento merged 1 commit into
developfrom
feat/340-default-text-color
Jul 11, 2026
Merged

Add default colour for challenge description and reward text#418
tastybento merged 1 commit into
developfrom
feat/340-default-text-color

Conversation

@tastybento

Copy link
Copy Markdown
Member

Replaces the closed#340 (see the closing note there for why the original couldn't be merged — MiniMessage migration broke its legacy-colour wrapping and &b prefixing).

This keeps the genuinely useful idea from that PR — a default text colour so admins don't have to prefix every challenge's description/reward text with the same colour code — reimplemented to work with the current pipeline.

What it adds

Two new gui-settings, both empty by default (no behaviour change):

  • description-color — colour applied to each line of a challenge's own description text.
  • reward-text-color — colour applied to each line of a challenge's own first-time and repeat reward text.

Utils.applyDefaultColor(text, color) prefixes every line (so multi-line text stays coloured on each lore line) and runs beforeUtil.translateColorCodes, so it uses the same & / hex codes (e.g. &b, &#55FFFF) as the challenge text. A colour written in the text itself still overrides the default (a later code wins). Only the challenge's own data-field text is affected — per-challenge locale overrides are left alone (admins colour those directly).

Deliberately left out

The lore-length line-wrapping half of #340 is not included:

  • It used WordUtils.wrap + ChatColor.getLastColors, which miscount/mangle MiniMessage tags.
  • Its default (25) reintroduced the space-less-language (CJK) wrapping problems it was removed for.
  • The panel already wraps reward text via wrapToWidth().

Tests

UtilsTest covers applyDefaultColor: blank/null colour → unchanged, empty/null text → unchanged, single-line and multi-line prefixing, blank-line preservation, and hex colours. Full suite green (508 tests).

Closes the loop on #340.

🤖 Generated with Claude Code

Reimplements the useful part of the closed PR #340 in a way that fits the
current pipeline. Setting a default colour saves admins from prefixing
every challenge's description/reward text with the same colour code.
Two new gui-settings, both empty by default (no change):
- description-color: colour applied to each line of a challenge's own
description text.
- reward-text-color: colour applied to each line of a challenge's own
first-time and repeat reward text.
The colour is applied per line (so multi-line text stays coloured on
every lore line) before Util.translateColorCodes, so it uses the same
'&' / hex codes as the challenge text itself; a colour written in the
text still overrides the default. Only the challenge's own data-field
text is affected, not per-challenge locale overrides.
The lore-length line-wrapping half of #340 is intentionally left out: it
was built on legacy ChatColor wrapping incompatible with MiniMessage, its
default reintroduced the space-less-language issues it was removed for,
and the panel already wraps reward text via wrapToWidth().
Adds Utils.applyDefaultColor with JUnit coverage (blank/empty handling,
single/multi-line, blank-line preservation, hex colours).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bb27ccc into developJul 11, 2026
3 checks passed
@tastybento
tastybento deleted the feat/340-default-text-color branch July 11, 2026 03:10
Sign up for freeto 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

@tastybento