Skip to content

Commit fa529a9

Browse files
authored
feat(brand): replace the icon with the "Emitting" mark (#37)
The old mark was a green-to-blue gradient tile with a 3x3 grid — a palette that says nothing about solar, and a grid abstract enough to belong to any dashboard. The new one draws a Tigo optimizer reporting on the RS485 bus: the potted body with its two DC leads, a six-block telemetry frame across the face, and amber arcs carrying that frame onto the bus. Palette is silicon indigo #1D2A63, busbar silver #C6D0E2, and amber the identity and the site share a token rather than two near-identical oranges. Amber means one thing everywhere it appears: this part is live. The leading frame block is the amber one, matching where the opcode byte sits in a real frame. Drawn at three sizes instead of scaled, because the frame blocks are 6px in a 64px field and a single file cannot survive the range: docs/images/logo.svg full detail, 48px and up site/src/assets/logo.svg 32px: frame -> two bars, both arcs kept components/.../web/app.html 32px: same cut, device UI sidebar site/public/favicon.svg 16px: one bar, inner arc only tigo_web_server.cpp 16px: byte-identical to the above The docs site had no logo or favicon configured at all and was serving the Starlight default; both are now wired up in astro.config.mjs. Its favicon matches the one the device itself serves, so a docs tab and a live-rig tab carry the same icon. Left alone deliberately: the dashboard's --accent green and chart gradients, and the docs site's green link accent. Those are UI theme, not the mark, and re-theming them is a separate decision. Verified: site build passes with link validation, 37/37 site tests green, favicon resolves under the /esphome-tigomonitor base path, and the firmware was flashed to the rig and the sidebar mark confirmed on device. Claude-Session: https://claude.ai/code/session_01RgSnMCa3JQigphGnPbazdw
1 parent b8a2ce6 commit fa529a9

7 files changed

Lines changed: 153 additions & 101 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
- **New brand mark.** The green-to-blue tile is replaced by an optimizer emitting a telemetry frame, in silicon indigo and amber. It's drawn at three sizes rather than scaled — the device favicon, the device UI sidebar, and the docs — so it stays legible in a browser tab. The docs site had no logo or favicon configured before and now carries the same mark the device serves.
12+
1013
### Fixed
1114
- **Opening the web UI could reboot the device.** History pages read the TSDB from the web server's task while the 30-minute snapshot writes it from another — and on the ESP32-S3 every flash access, read included, cuts the instruction cache on both cores, so the two collide and fault (`Fault - Unknown`). All LittleFS access now goes through one lock. History requests can queue briefly (a month-range query holds the flash ~2.3 s) and return an error rather than hang if they wait more than 15 s.
1215

components/tigo_server/tigo_web_server.cpp

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -787,39 +787,30 @@ bool TigoWebServer::check_web_auth(httpd_req_t *req) {
787787
// ===== HTML Page Handlers =====
788788

789789
esp_err_t TigoWebServer::favicon_handler(httpd_req_t *req) {
790-
// Brand mark — same artwork as docs/images/logo.svg and the SPA sidebar
791-
// brand-logo. Rounded gradient tile + 3x3 panel grid with a "live" cell
792-
// highlight + faint telemetry pulse. Kept inline as a single string so we
793-
// don't pay an extra HTTP round-trip + cache miss for an icon.
790+
// Brand mark, small-size variant — an optimizer emitting a telemetry frame.
791+
// Same drawing as docs/images/logo.svg and the SPA sidebar brand-logo, but
792+
// the six-block frame on the body collapses to one amber bar and the outer
793+
// bus arc is dropped: at 16px those details are sub-pixel and turn to mush.
794+
// Kept inline as a single string so we don't pay an extra HTTP round-trip +
795+
// cache miss for an icon.
794796
const char *favicon_svg =
795797
"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'>"
796798
"<defs>"
797-
"<linearGradient id='b' x1='0' y1='0' x2='1' y2='1'>"
798-
"<stop offset='0%' stop-color='#4ade80'/>"
799-
"<stop offset='100%' stop-color='#38bdf8'/>"
799+
"<linearGradient id='t' x1='0' y1='0' x2='0' y2='1'>"
800+
"<stop offset='0%' stop-color='#16213B'/>"
801+
"<stop offset='100%' stop-color='#0B111F'/>"
800802
"</linearGradient>"
801-
"<radialGradient id='g' cx='50%' cy='40%' r='60%'>"
802-
"<stop offset='0%' stop-color='#fff' stop-opacity='.85'/>"
803-
"<stop offset='60%' stop-color='#fff' stop-opacity='.2'/>"
804-
"<stop offset='100%' stop-color='#fff' stop-opacity='0'/>"
805-
"</radialGradient>"
806803
"</defs>"
807-
"<rect width='64' height='64' rx='14' fill='url(#b)'/>"
808-
"<g transform='translate(10 10)' fill='#061018' fill-opacity='.18'>"
809-
"<rect width='13' height='13' rx='2'/>"
810-
"<rect x='15' width='13' height='13' rx='2'/>"
811-
"<rect x='30' width='13' height='13' rx='2'/>"
812-
"<rect y='15' width='13' height='13' rx='2'/>"
813-
"<rect x='15' y='15' width='13' height='13' rx='2' fill-opacity='.55'/>"
814-
"<rect x='30' y='15' width='13' height='13' rx='2'/>"
815-
"<rect y='30' width='13' height='13' rx='2'/>"
816-
"<rect x='15' y='30' width='13' height='13' rx='2'/>"
817-
"<rect x='30' y='30' width='13' height='13' rx='2'/>"
804+
"<rect width='64' height='64' rx='14' fill='url(#t)'/>"
805+
"<rect x='9' y='18' width='33' height='27' rx='5' fill='#1D2A63' "
806+
"stroke='#C6D0E2' stroke-width='4'/>"
807+
"<rect x='16' y='28' width='19' height='7' rx='1' fill='#F4B23C'/>"
808+
"<path d='M48 25 a12 12 0 0 1 0 14' fill='none' stroke='#F4B23C' "
809+
"stroke-width='5' stroke-linecap='round'/>"
810+
"<g fill='none' stroke='#C6D0E2' stroke-width='5' stroke-linecap='round'>"
811+
"<path d='M17 45 v5 a4 4 0 0 1 -4 4 h-3'/>"
812+
"<path d='M34 45 v5 a4 4 0 0 0 4 4 h3'/>"
818813
"</g>"
819-
"<rect x='25' y='25' width='13' height='13' rx='2' fill='url(#g)'/>"
820-
"<path d='M8 50 18 50 22 44 28 52 34 47 40 49 56 49' fill='none' "
821-
"stroke='#061018' stroke-opacity='.55' stroke-width='2' "
822-
"stroke-linecap='round' stroke-linejoin='round'/>"
823814
"</svg>";
824815

825816
httpd_resp_set_type(req, "image/svg+xml");

components/tigo_server/web/app.html

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -686,39 +686,33 @@
686686
<aside>
687687
<div class="brand">
688688
<div class="brand-logo">
689-
<!-- Same artwork as /favicon.svg and docs/images/logo.svg.
690-
Inlined so the sidebar paints in the first frame without
691-
a network round-trip. Compact gradient tile + 3x3 panel
692-
grid with one "live" cell highlighted + a faint telemetry
693-
pulse along the bottom. -->
689+
<!-- Same drawing as /favicon.svg and docs/images/logo.svg: an
690+
optimizer emitting a telemetry frame on the bus. Inlined so
691+
the sidebar paints in the first frame without a network
692+
round-trip. This renders at 32px, so the six-block frame on
693+
the body collapses to two bars — at 3px per block the full
694+
version is illegible. Both bus arcs still read at this size,
695+
unlike the 16px favicon, which keeps only the inner one. -->
694696
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" aria-label="Tigo Monitor">
695697
<defs>
696-
<linearGradient id="brand-bg" x1="0" y1="0" x2="1" y2="1">
697-
<stop offset="0%" stop-color="#4ade80"/>
698-
<stop offset="100%" stop-color="#38bdf8"/>
698+
<linearGradient id="brand-tile" x1="0" y1="0" x2="0" y2="1">
699+
<stop offset="0%" stop-color="#16213B"/>
700+
<stop offset="100%" stop-color="#0B111F"/>
699701
</linearGradient>
700-
<radialGradient id="brand-live" cx="50%" cy="40%" r="60%">
701-
<stop offset="0%" stop-color="#fff" stop-opacity=".85"/>
702-
<stop offset="60%" stop-color="#fff" stop-opacity=".2"/>
703-
<stop offset="100%" stop-color="#fff" stop-opacity="0"/>
704-
</radialGradient>
705702
</defs>
706-
<rect width="64" height="64" rx="14" fill="url(#brand-bg)"/>
707-
<g transform="translate(10 10)" fill="#061018" fill-opacity=".18">
708-
<rect width="13" height="13" rx="2"/>
709-
<rect x="15" width="13" height="13" rx="2"/>
710-
<rect x="30" width="13" height="13" rx="2"/>
711-
<rect y="15" width="13" height="13" rx="2"/>
712-
<rect x="15" y="15" width="13" height="13" rx="2" fill-opacity=".55"/>
713-
<rect x="30" y="15" width="13" height="13" rx="2"/>
714-
<rect y="30" width="13" height="13" rx="2"/>
715-
<rect x="15" y="30" width="13" height="13" rx="2"/>
716-
<rect x="30" y="30" width="13" height="13" rx="2"/>
703+
<rect width="64" height="64" rx="14" fill="url(#brand-tile)"/>
704+
<rect x="9" y="17" width="34" height="28" rx="5"
705+
fill="#1D2A63" stroke="#C6D0E2" stroke-width="3.5"/>
706+
<rect x="16" y="24" width="20" height="5" rx="1" fill="#C6D0E2" fill-opacity=".65"/>
707+
<rect x="16" y="34" width="13" height="5" rx="1" fill="#F4B23C"/>
708+
<g fill="none" stroke="#F4B23C" stroke-width="4" stroke-linecap="round">
709+
<path d="M48 25 a11 11 0 0 1 0 14"/>
710+
<path d="M53 19 a19 19 0 0 1 0 26"/>
711+
</g>
712+
<g fill="none" stroke="#C6D0E2" stroke-width="4.5" stroke-linecap="round">
713+
<path d="M17 45 v5 a4 4 0 0 1 -4 4 h-4"/>
714+
<path d="M35 45 v5 a4 4 0 0 0 4 4 h4"/>
717715
</g>
718-
<rect x="25" y="25" width="13" height="13" rx="2" fill="url(#brand-live)"/>
719-
<path d="M8 50 18 50 22 44 28 52 34 47 40 49 56 49"
720-
fill="none" stroke="#061018" stroke-opacity=".55"
721-
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
722716
</svg>
723717
</div>
724718
<div>

docs/images/logo.svg

Lines changed: 45 additions & 46 deletions
Loading

site/astro.config.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ export default defineConfig({
99
integrations: [
1010
starlight({
1111
title: 'Tigo Monitor',
12+
// "Emitting" brand mark. Three cuts of the same drawing, each tuned to
13+
// its render size — see the comments in each file. The favicon matches
14+
// the one the device itself serves, so a docs tab and a live-rig tab
15+
// carry the same icon.
16+
logo: { src: './src/assets/logo.svg' },
17+
favicon: '/favicon.svg',
1218
customCss: [
1319
// Self-hosted fonts (bundled, no CDN). Order matters: fonts first.
1420
'@fontsource/ibm-plex-sans/400.css',

site/public/favicon.svg

Lines changed: 27 additions & 0 deletions
Loading

site/src/assets/logo.svg

Lines changed: 32 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)