Commit Graph

627 Commits

Author SHA1 Message Date
you 044ffd34e2 fix: config.json lives in /app/data/ volume, not baked into image
- entrypoint copies example config to /app/data/config.json on first run
- symlinks /app/config.json → /app/data/config.json so app code unchanged
- theme.json also symlinked from /app/data/ if present
- config persists across container rebuilds without extra bind mounts
- updated README with new config/theme instructions
2026-03-23 04:43:04 +00:00
you 28b2756f40 fix: remove POST /api/config/theme and server save/load buttons
Server theme is admin-only: download theme.json, place it on the server manually.
No unauthenticated write endpoint.
2026-03-23 04:34:10 +00:00
you 4fc12383fa feat: add theme import from file
- Import File button opens file picker for .json theme files
- Merges imported theme into current state, applies live preview
- Also syncs ROLE_COLORS/TYPE_COLORS globals on import
- Moved Copy/Download buttons out of collapsed details
- Raw JSON textarea now editable (was readonly)
2026-03-23 04:31:58 +00:00
you f2c7c48eed feat: server-side theme save/load via theme.json
- Server reads from theme.json (separate from config.json), hot-loads on every request
- POST /api/config/theme writes theme.json directly — no manual file editing
- GET /api/config/theme now merges: defaults → config.json → theme.json
- Also returns themeDark and typeColors (were missing from API)
- Customizer: replaced 'merge into config.json' instructions with Save/Load Server buttons
- JSON export moved to collapsible details section
- theme.json added to .gitignore (instance-specific)
2026-03-23 04:31:08 +00:00
you e027beeb38 fix: replace all hardcoded nav bar colors with CSS variables
- .nav-link.active: #fff → var(--nav-text)
- .nav-stats: #94a3b8 → var(--nav-text-muted)
- .nav-btn border: #444 → var(--border)
- .nav-btn:hover bg: #333 → var(--nav-bg2)
- .dropdown-menu border: #333 → var(--border)
- .badge-hash color: #fff → var(--nav-text)
- .field-table th color: #fff → var(--nav-text)
- .live-dot default: #555 → var(--text-muted)
- .trace-path-label: #94a3b8 → var(--text-muted)
- .hop-prefix, .subpath-meta, .hour-labels, .subpath-jump-nav: #9ca3af → var(--text-muted)
- scrollbar thumb hover: #94a3b8 → var(--text-muted)

All nav bar text now responds to customizer theme changes.
2026-03-23 04:29:33 +00:00
you 748862db9c Replace hardcoded status colors with CSS variables and theme-aware helpers
CSS changes:
- style.css: .live-dot.connected, .hop-global-fallback, .perf-slow, .perf-warn
  now use var(--status-green/red/yellow) instead of hardcoded hex
- live.css: live recording dot uses var(--status-red), LCD text uses var(--status-green)

JS changes (analytics.js):
- Added cssVar/statusGreen/statusYellow/statusRed/accentColor/snrColor helpers
  that read from CSS custom properties with hardcoded fallbacks
- Replaced ~20 hardcoded status colors in: SNR histograms, quality zones,
  zone borders/patterns, SNR timeline, daily SNR bars, collision badges
  (Local/Regional/Distant), distance classification, subpath map markers,
  hop distance distribution, network status cards, self-loop bars

JS changes (live.js):
- Added statusGreen helper for LCD clock color
- Legend dots now read from TYPE_COLORS global instead of hardcoded hex

All colors now respond to theme customization via the customize panel.
2026-03-23 04:17:31 +00:00
you 036078e1ce Fix: localStorage preferences take priority over server config
app.js was fetching /api/config/theme and overwriting ROLE_COLORS,
ROLE_STYLE, branding AFTER customize.js had already restored them
from localStorage. Now skips server overrides for any section
where user has local preferences.

Also added branding restore from localStorage on DOMContentLoaded.
2026-03-23 03:58:01 +00:00
you 60a20d4190 Fix: restore branding (site name, logo, favicon) from localStorage on load 2026-03-23 03:54:19 +00:00
you 9aa185ef09 Fix: nav bar text fully customizable via --nav-text (Basic)
Added --nav-text and --nav-text-muted CSS variables. All nav
selectors (.top-nav, .nav-brand, .nav-link, .nav-btn, .nav-stats)
use these instead of --text/--text-muted. Nav Text is in Basic
settings. Nav Muted Text in Advanced.

This is separate from page text because nav sits on a dark
background — page text color would be unreadable on the nav.
2026-03-23 03:49:12 +00:00
you 89b4ee817e Update customization plan: Phase 1 status, known bugs, Phase 2 roadmap 2026-03-23 03:43:07 +00:00
you 48de8f99b3 Fix: load customize.js right after roles.js, BEFORE app/map
customize.js was loading last — saved colors restored AFTER the
map already created markers with default colors. Now loads right
after roles.js, before app.js. ROLE_STYLE colors are updated
before any page renders.
2026-03-23 03:41:29 +00:00
you c13de6f7d7 fix: replace all hardcoded colors with CSS variables
- Move --status-green/yellow/red from home.css to style.css :root (light+dark)
- Replace hardcoded status colors in style.css (.tl-snr, .health-dot, .byop-err,
  .badge-hash-*, .fav-star.on, .spark-fill) with CSS variable references
- Replace hardcoded colors in live.css (VCR mode, stat pills, fdc-link, playhead)
- Replace --primary/--bg-secondary/--text-primary/--text-secondary dead vars with
  canonical --accent/--input-bg/--text/--text-muted in style.css, map.js, live.js,
  traces.js, packets.js
- Fix nodes.js legend colors to use ROLE_COLORS globals instead of hardcoded hex
- Replace hardcoded hex in home.js (SNR), perf.js (indicators), map.js (accuracy
  circles) with CSS variable references via getComputedStyle or var()
- Add --detail-bg to customizer (THEME_CSS_MAP, DEFAULTS, ADVANCED_KEYS, labels)
- Move font/mono out of ADVANCED_KEYS into separate Fonts section in customizer
- Remove debug console.log lines from customize.js
- Bump cache busters in index.html
2026-03-23 03:29:38 +00:00
you e04324a4c9 Fix: restore saved colors IMMEDIATELY on script load, not DOMContentLoaded
customize.js loads after roles.js but before app.js triggers
navigate(). Restoring colors in the IIFE body (not DOMContentLoaded)
ensures ROLE_STYLE/ROLE_COLORS/TYPE_COLORS are updated BEFORE
the map or any page creates markers.
2026-03-23 03:25:52 +00:00
you 871d6953ed Debug: log autoSave and restore for node/type colors 2026-03-23 03:06:41 +00:00
you e5f808b078 Fix: nav bar uses --text and --text-muted, not separate nav-text
Changed nav brand, links, buttons from hardcoded #fff/#cbd5e1 to
var(--text) and var(--text-muted). Setting primary text color
now changes nav text too. Removed unnecessary --nav-text variable.
2026-03-23 03:05:04 +00:00
you 3650007f06 Nav text uses --nav-text variable, customizable in Advanced
Defaults to white. Admin can change it for light nav backgrounds.
Nav bar brand, links, buttons all use var(--nav-text, #fff).
2026-03-23 02:59:22 +00:00
you eca41c466f Fix: initState merges localStorage → export includes saved changes
State now loads: DEFAULTS → server config → localStorage.
Admin saves locally, comes back later, opens customizer —
sees their saved values, export includes everything.
2026-03-23 02:56:59 +00:00
you 074dd736d9 Fix: auto-save all customizations to localStorage on every change
Every color pick, text edit, step change auto-saves (debounced
500ms). No manual save needed. Also fixed syncBadgeColors on
restore and removed stray closing brace.
2026-03-23 02:56:03 +00:00
you bfc1acbbe6 Fix: debounce theme-refresh 300ms — no more re-render spam
Color picker input events fire dozens of times per second while
dragging. Now debounced to 300ms — page re-renders once after
you stop dragging.
2026-03-23 02:48:20 +00:00
you f16fce8b7f Fix: markdown hint below textareas, themed input backgrounds
Textareas use var(--input-bg) and var(--text) instead of white.
Markdown syntax hint shown below each textarea:
**bold** *italic* `code` [text](url) - list
2026-03-23 02:46:40 +00:00
you a892582821 Markdown support in home page editor
Added miniMarkdown() — simple markdown→HTML (bold, italic, code,
links, lists, line breaks). Home page description/answer fields
render markdown. Customizer uses textareas with markdown hint
for description and answer fields.
2026-03-23 02:43:27 +00:00
you 3e2f7a9afe Fix: home page editor — stacked layout shows all fields
Steps/checklist/links were cramming 3+ inputs in one row,
truncating content. Now emoji+title+buttons on row 1,
description on row 2. All content visible.
2026-03-23 02:37:55 +00:00
you 56a09d180d Fix: customization panel scrolls — fixed height + min-height: 0 on body 2026-03-23 02:35:07 +00:00
you f1bcb95ee5 Add ANON_REQ to TYPE_COLORS + customizer
Anonymous Request — encrypted messages with ephemeral key so
sender identity is hidden. Rose/pink color (#f43f5e), 🕵️ emoji.
2026-03-23 02:34:09 +00:00
you 011294c0fa Fix: customizer home page defaults match actual home page content
Steps now match the real home.js defaults (Discord, Bluetooth,
frequency, advertise, heard repeats, nearby repeaters) instead
of generic placeholders.
2026-03-23 02:31:35 +00:00
you b97212087d Remove hardcoded badge colors from CSS — syncBadgeColors is sole source
Badge colors were hardcoded in style.css with different values
than TYPE_COLORS, causing mismatch between customizer and actual
display. Removed all .badge-advert/.badge-grp-txt/etc color rules.
syncBadgeColors() in roles.js now generates them from TYPE_COLORS
on every page load.
2026-03-23 02:29:46 +00:00
you 68f36d9ecf Fix: packet type color picker calls syncBadgeColors immediately 2026-03-23 02:29:00 +00:00
you 5d20269d05 Fix: badge colors always match TYPE_COLORS — single source of truth
Badge CSS (.badge-advert etc.) was hardcoded in style.css with
different colors than TYPE_COLORS. Now roles.js generates badge
CSS from TYPE_COLORS on page load via syncBadgeColors(). Customizer
calls syncBadgeColors() after changes. Badges always match the
color pickers and TYPE_COLORS, in both light and dark mode.
2026-03-23 02:24:51 +00:00
you 918589fc8c Fix: packet type colors update badges in real-time
Badge classes (.badge-advert etc.) use hardcoded CSS colors.
Now injects a <style> element with color overrides derived from
TYPE_COLORS on every theme preview update.
2026-03-23 02:23:12 +00:00
you f2c6186d8c Fix: customization panel stays below nav bar — clamped at 56px top
Default top: 56px (below nav). Drag clamped to min 56px top,
0px left. Can't slide under the nav bar anymore.
2026-03-23 02:22:03 +00:00
you 6a0c0770b4 Fix: background/cards color changes work — set derived vars explicitly
--content-bg and --card-bg reference --surface-0/--surface-1 via
var() which doesn't live-update when source changes via JS. Now
explicitly sets the derived vars alongside the source.
2026-03-23 02:20:42 +00:00
you c4c06e7fb8 Fix: force nav bar gradient repaint on theme color change
Some browsers cache CSS gradient paint and don't re-render when
custom properties change. Force reflow by toggling background.
2026-03-23 02:19:57 +00:00
you 502244fc38 Customizer: friendly packet type names (Channel Message, Direct Message, etc.) 2026-03-23 02:08:21 +00:00
you 0073504657 Rename 'Node Colors' tab to 'Colors' — covers nodes + packet types 2026-03-23 02:06:59 +00:00
you b4ce4ede42 Fix: color changes re-render in-place without page flash
theme-changed now dispatches theme-refresh event instead of
full navigate(). Map re-renders markers, packets re-renders
table rows. No teardown/rebuild, no flash.
2026-03-23 02:06:26 +00:00
you 6362c4338a Customization: Basic (7 colors) + Advanced (collapsible) + fonts
Basic: Brand Color, Navigation, Background, Text, Healthy/Warning/Error
Advanced (collapsed by default): hover, muted text, borders, surfaces,
cards, inputs, stripes, row hover, selected + body/mono fonts

Fonts editable as text inputs. Everything else derives from the 7
basic colors. Admins only need to touch Basic unless they want
pixel-perfect control.
2026-03-23 01:35:54 +00:00
you fb57670f74 Customization panel: wider default (480px) + resizable via CSS resize 2026-03-23 01:32:46 +00:00
you 1666f7c5d7 Fix: node/type colors trigger page re-render, conflict badge uses status-yellow
Color changes dispatch theme-changed event → app.js re-navigates
to current page, rebuilding markers/rows with new colors.

Conflict badges (.hop-ambiguous, .hop-conflict-btn) now use
var(--status-yellow) so they follow the customized status color.
2026-03-23 01:31:36 +00:00
you feceadf432 Customization: packet type colors (ADVERT, GRP_TXT, etc.)
Added global window.TYPE_COLORS in roles.js. Live.js and audio-lab.js
now reference the global. Customizer shows packet type colors with
emoji + descriptions. Changes sync to TYPE_COLORS in real-time.
Saved/restored via localStorage alongside node colors.
2026-03-23 01:29:56 +00:00
you 5e81ad6c87 Fix: branding changes apply in real-time
Site name updates nav bar text + document title as you type.
Logo URL updates the nav brand icon. Favicon URL updates the
browser tab icon.
2026-03-23 01:25:33 +00:00
you f1cf759ebd Fix: node color changes sync to ROLE_COLORS + ROLE_STYLE
Changing node colors in the customizer now updates both ROLE_COLORS
(used for badges, labels) and ROLE_STYLE (used for map markers).
Also fixed localStorage restore to sync both objects.
2026-03-23 01:24:34 +00:00
you da19ddef51 Customization: all CSS variables exposed, light/dark mode separate
- Nav bar now uses CSS variables (was hardcoded gradient)
- 19 customizable colors: accent, text, backgrounds, borders,
  surfaces, inputs, stripes, hover, selected, status indicators
- Light and dark mode have separate color sets
- Theme tab shows which mode you are editing
- Toggle ☀️/🌙 in nav bar to switch modes and edit the other set
- Export includes both theme and themeDark sections
- localStorage save/restore handles both modes
2026-03-23 01:23:04 +00:00
you b461a05b6d Customization: compact icon tabs — no scrolling needed
Tabs now use emoji + short text label below, flex equally across
panel width. No horizontal scrolling.
2026-03-23 01:17:39 +00:00
you 9916a9d59f Customization: personal user themes via localStorage
Export tab now has two sections:
- "My Preferences" — save colors to browser localStorage, auto-applied
  on every page load. Personal to you, no server changes.
- "Admin Export" — download config.json for server deployment,
  applies to all users.

User theme auto-loads on DOMContentLoaded, overriding CSS variables
and node colors from localStorage.
2026-03-23 00:53:17 +00:00
you f979743727 Customization: floating draggable panel instead of full page
Click 🎨 in nav to toggle a floating panel. Stays open as you
navigate between pages — tweak colors, check packets, tweak more.
Draggable by header. Close with ✕. Preview persists everywhere.
2026-03-23 00:51:12 +00:00
you 056410a850 Customization: show what each color affects
Each color picker now has a description underneath:
- Accent: 'Active nav tab, buttons, links, selected rows, badges'
- Status Green: 'Healthy nodes, online indicators, good SNR'
- Repeater: 'Infrastructure nodes — map markers, packet path badges'
etc.
2026-03-23 00:45:02 +00:00
you 142bbabcc3 Fix: customization preview persists across page navigation
Preview was reverting on destroy (page leave). Now CSS variable
overrides stay active until explicit reset, so you can navigate
to packets/map/etc and see your color changes.
2026-03-23 00:42:53 +00:00
you da315aac94 Add Tools → Customize page with live theme preview and JSON export
New page at #/customize with 5 tabs:
- Branding: site name, tagline, logo/favicon URLs
- Theme Colors: color pickers for all CSS variables with live preview
- Node Colors: per-role color pickers with dot previews
- Home Page: editable hero, steps, checklist, footer links
- Export: JSON diff output, copy/download buttons

Only exports values that differ from defaults. Self-contained CSS.
Mobile responsive, dark mode compatible.
2026-03-23 00:39:43 +00:00
you db9219319d feat: config-driven customization system (Phase 1)
Add GET /api/config/theme endpoint serving branding, theme colors,
node colors, and home page content from config.json with sensible
defaults so unconfigured instances look identical to before.

Client-side (app.js):
- Fetch theme config on page load, before first render
- Override CSS variables from theme.* on document root
- Override ROLE_COLORS/ROLE_STYLE from nodeColors.*
- Replace nav brand text, logo, favicon from branding.*
- Store config in window.SITE_CONFIG for other pages

Home page (home.js):
- Hero title/subtitle from config.home
- Steps and checklist from config.home
- Footer links from config.home.footerLinks
- Chooser welcome text uses configured siteName

Config example updated with all available theme options.

No default appearance changes — all overrides are optional.
2026-03-23 00:37:48 +00:00
you db7f394a6a Revert "Cascadia theme: navy/blue color scheme, muted status colors"
This reverts commit e36c6cca49.
2026-03-23 00:27:59 +00:00