# Thermo-Nuclear Code Quality Refactor — Reddit Tweaks Extension
**Date:** 2026-08-28 01:23
**Task:** Implement all 10 findings from the thermo-nuclear code quality review
## Changes Made
### 1. CSS Deduplication — Extracted shared `color-picker.css` (NEW FILE)
- Created `content/styles/color-picker.css` (259 lines) containing color picker widget styles and preset badge styles
- This file is now shared between the content script (via manifest.json) and the popup (via `` tag)
- Eliminated ~200 lines of identical CSS that was previously duplicated between `badges.css` and `popup.css`
### 2. CSS Decomposition — Extracted `color-popover.css` (NEW FILE)
- Created `content/styles/color-popover.css` (256 lines) with popover chrome, buttons, dark mode
- Trimmed `badges.css` from 611 lines to 85 lines (badges-only)
- Trimmed `popup.css` from 489 lines to 220 lines (popup-specific only)
- Updated dark mode selectors from `.rt-color-popover.rt-dark` to `.rt-dark .rt-color-popover` (ancestor form)
### 3. Shared Preset Module — Extracted `lib/presets.js` (NEW FILE)
- Created `lib/presets.js` (57 lines) with `render()`, `save()`, `delete()` functions
- Refactored `popup.js` and `color-popover.js` to use shared module
- Eliminated ~60 lines of duplicated preset rendering and CRUD logic
### 4. Dark Mode Unification
- Added `applyDarkModeClass(settings)` to `lib/settings.js`
- Removed per-container dark class toggling from `badges.js` `applyColorsToContainer()`
- Removed `applyDarkMode()` from `cards.js` (was redundant with shared function)
- Removed `applyDarkModeToPopover()` and `refreshTheme()` from `color-popover.js`
- `main.js` now calls `applyDarkModeClass()` centrally in init, dark-mode observer, and storage listener
### 5. Stale Closure Fix
- Fixed `startPostObserver` in `main.js` to use freshly-loaded `updated` settings instead of stale captured `settings`
### 6. Data-Driven Storage Listener
- Replaced 4 verbose `changes.X && changes.X.newValue !== ...` conditions with `RELOAD_KEYS.some()`
### 7. Dead Export Cleanup
- Removed `isDarkMode` and `getColorPrefix` re-exports from `badgeTweak` object in `badges.js`
### 8. Deleted `getHelpers()` Wrapper
- Removed unnecessary indirection in `color-popover.js`, replaced with direct `window.RedditTweaks.*` calls
### 9. Inlined `colorToHex`
- Removed duplicated `colorToHex` function from both `popup.js` and `color-popover.js`
- Replaced all call sites with inline `val || "#ffffff"`
### 10. DOM Expando Refactor
- Replaced `entry._colorState`, `entry._nameInput`, etc. DOM expando pattern in `popup.js`
- Introduced `subredditEntries` array of plain state objects
- `collectSubredditOverrides()` now iterates the state array instead of querying the DOM
## Files Changed
- `content/main.js` — stale closure fix, data-driven reload keys, central dark mode calls
- `content/tweaks/badges.js` — removed dark class toggle, dead exports, refreshTheme call
- `content/tweaks/cards.js` — removed applyDarkMode, use shared function
- `content/tweaks/color-popover.js` — removed getHelpers, colorToHex, applyDarkModeToPopover, refreshTheme, preset duplication
- `lib/settings.js` — added applyDarkModeClass
- `popup/popup.js` — inlined colorToHex, used shared presets, state array instead of expandos
- `popup/popup.css` — trimmed to popup-only styles
- `content/styles/badges.css` — trimmed to badge-only styles (611 → 85 lines)
- `manifest.json` — added new CSS and JS files
- `popup/popup.html` — added links to new CSS and JS files
## New Files
- `content/styles/color-picker.css` — shared picker + preset badge styles
- `content/styles/color-popover.css` — popover chrome styles
- `lib/presets.js` — shared preset CRUD module
## Net Impact
- **Before:** 3,180 lines across 12 source files
- **After:** 2,862 lines across 15 source files
- **Deleted:** ~318 lines of duplication and dead code
- No file exceeds 401 lines (previously badges.css was 611)
- Dark mode is now managed from a single source instead of 4 scattered functions
## Lessons Learned
- CSS duplication across content script and popup contexts is easy to miss because there's no import graph. Shared CSS files referenced by both manifest.json and popup.html `` work well.
- Dark mode class management is a natural candidate for centralization — scattered per-element toggling creates CSS selector complexity that cascading from a single ancestor eliminates.
- DOM expando properties work but are an anti-pattern that makes code harder to reason about. A separate state array with DOM references is only marginally more code but significantly clearer.
- The `colorToHex` "conversion" function was really just null-coalescing — renaming or inlining it makes the intent obvious.