From c423f172d0d770e16cbd8666aa5c6b6008a8919a Mon Sep 17 00:00:00 2001 From: hacklab Date: Thu, 15 Oct 2026 14:40:02 +0200 Subject: [PATCH] style: light theme and hand-inked logo matching acampada26s.net The previous pass kept the dark base and the red icons, which did not read as the acampada. Now: - Light theme: white page, black ink and borders, black buttons with a hard neon offset shadow, neon for focus and the active nav item; h1/h2 in Anton with the stepped neon shadow of the site headings. - Nav, empty-state, spinner and pattern assets in black; platform icons keep their dark disc with a neon stroke. - New mark: three dome tents wired from their doors into a switch with an antenna, drawn in the inked style of the acampada logo (curved poles, ball ends, hatching) over a neon offset copy. LogoMark renders it inline; visible product name is T-HUB. - docs/brand: t-hub.svg and a lockup with the Anton wordmark converted to outlines so it renders without the font. - Public submission page moved to the light palette. Checked with headless Chromium screenshots (offline sample data) on desktop and mobile. --- README.md | 4 +- apps/web/public/brand/empty-state.svg | 8 +- apps/web/public/brand/favicon.svg | 76 ++++++++------- apps/web/public/brand/icon-bluesky.svg | 4 +- apps/web/public/brand/icon-discord.svg | 4 +- apps/web/public/brand/icon-facebook.svg | 4 +- apps/web/public/brand/icon-instagram.svg | 4 +- apps/web/public/brand/icon-linkedin.svg | 4 +- apps/web/public/brand/icon-mastodon.svg | 4 +- apps/web/public/brand/icon-peertube.svg | 4 +- apps/web/public/brand/icon-reddit.svg | 4 +- apps/web/public/brand/icon-slack.svg | 4 +- apps/web/public/brand/icon-telegram.svg | 4 +- apps/web/public/brand/icon-threads.svg | 4 +- apps/web/public/brand/icon-twitch.svg | 4 +- apps/web/public/brand/nav-analytics.svg | 2 +- apps/web/public/brand/nav-approvals.svg | 2 +- apps/web/public/brand/nav-audit.svg | 2 +- apps/web/public/brand/nav-calendar.svg | 2 +- apps/web/public/brand/nav-chat.svg | 8 +- apps/web/public/brand/nav-compose.svg | 2 +- apps/web/public/brand/nav-connections.svg | 2 +- apps/web/public/brand/nav-files.svg | 2 +- apps/web/public/brand/nav-home.svg | 2 +- apps/web/public/brand/nav-inbox.svg | 2 +- apps/web/public/brand/nav-more.svg | 2 +- apps/web/public/brand/nav-search.svg | 2 +- apps/web/public/brand/nav-settings.svg | 2 +- apps/web/public/brand/nav-team.svg | 2 +- apps/web/public/brand/nav-video.svg | 2 +- apps/web/public/brand/pattern.svg | 4 +- apps/web/public/brand/spinner.svg | 8 +- apps/web/public/brand/t-hub.svg | 76 ++++++++------- apps/web/src/app/(main)/layout.tsx | 2 +- apps/web/src/app/(main)/more/page.tsx | 2 +- apps/web/src/app/(main)/onboarding/page.tsx | 6 +- apps/web/src/app/globals.css | 55 ++++++----- apps/web/src/app/join/[token]/page.tsx | 10 +- apps/web/src/app/layout.tsx | 6 +- apps/web/src/app/login/page.tsx | 2 +- apps/web/src/app/page.tsx | 2 +- apps/web/src/app/submit/[token]/page.tsx | 74 +++++++------- apps/web/src/components/brand/logo.tsx | 91 ++++++++++-------- .../src/components/shell/command-palette.tsx | 2 +- apps/web/src/components/shell/sidebar.tsx | 4 +- docs/T-HUB-VALIDACION.txt | 22 +++-- docs/brand/t-hub-lockup.png | Bin 0 -> 43521 bytes docs/brand/t-hub-lockup.svg | 41 ++++++++ docs/brand/t-hub.svg | 76 ++++++++------- 49 files changed, 369 insertions(+), 286 deletions(-) create mode 100644 docs/brand/t-hub-lockup.png create mode 100644 docs/brand/t-hub-lockup.svg diff --git a/README.md b/README.md index 0513976..d45a446 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # T-HUB -

T-HUB

+

T-HUB

Copia de trabajo del [Tactical Media Broadcast Hub](https://gitlab.moxexley.com/mediatools/tacticalmediahub) para la red de acampadas: [acampada26s.net](https://acampada26s.net), @@ -16,7 +16,7 @@ Cambios respecto a upstream: - Instagram registrado en conexión y publicación; claves de la app de Meta solo en el entorno del servidor. - Panel **Outreach** para escribir por privado a mano, contacto a contacto, con seguimiento. - RLS forzado en `media_assets` (migración 042). -- Estilo de acampada26s.net en la web: negro, blanco, neón `#00e5ff` y títulos en Anton. +- Estilo de acampada26s.net en la web: fondo blanco, tinta negra, neón `#00e5ff` en sombras y foco, títulos en Anton. Logo de tres tiendas cableadas a un switch con antena, dibujado como el de la acampada (`docs/brand/`). | Remoto | URL | |---|---| diff --git a/apps/web/public/brand/empty-state.svg b/apps/web/public/brand/empty-state.svg index 6dc6b6f..fa0020e 100644 --- a/apps/web/public/brand/empty-state.svg +++ b/apps/web/public/brand/empty-state.svg @@ -1,11 +1,11 @@ - + + fill="none" stroke="#000000" stroke-width="75" stroke-linecap="round" stroke-linejoin="round"/> - - + + \ No newline at end of file diff --git a/apps/web/public/brand/favicon.svg b/apps/web/public/brand/favicon.svg index ecd65ed..57cf12e 100644 --- a/apps/web/public/brand/favicon.svg +++ b/apps/web/public/brand/favicon.svg @@ -1,40 +1,44 @@ - + T-HUB - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/apps/web/public/brand/icon-bluesky.svg b/apps/web/public/brand/icon-bluesky.svg index 7295511..8ecff66 100644 --- a/apps/web/public/brand/icon-bluesky.svg +++ b/apps/web/public/brand/icon-bluesky.svg @@ -1,6 +1,6 @@ Bluesky - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-discord.svg b/apps/web/public/brand/icon-discord.svg index cf2d999..37f9d2a 100644 --- a/apps/web/public/brand/icon-discord.svg +++ b/apps/web/public/brand/icon-discord.svg @@ -1,6 +1,6 @@ Discord - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-facebook.svg b/apps/web/public/brand/icon-facebook.svg index 2359872..6bcc22d 100644 --- a/apps/web/public/brand/icon-facebook.svg +++ b/apps/web/public/brand/icon-facebook.svg @@ -1,6 +1,6 @@ Facebook - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-instagram.svg b/apps/web/public/brand/icon-instagram.svg index edfe6bd..486e018 100644 --- a/apps/web/public/brand/icon-instagram.svg +++ b/apps/web/public/brand/icon-instagram.svg @@ -1,6 +1,6 @@ Instagram - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-linkedin.svg b/apps/web/public/brand/icon-linkedin.svg index 7797174..7e693d3 100644 --- a/apps/web/public/brand/icon-linkedin.svg +++ b/apps/web/public/brand/icon-linkedin.svg @@ -1,6 +1,6 @@ Linkedin - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-mastodon.svg b/apps/web/public/brand/icon-mastodon.svg index 2d92c11..39e42f4 100644 --- a/apps/web/public/brand/icon-mastodon.svg +++ b/apps/web/public/brand/icon-mastodon.svg @@ -1,6 +1,6 @@ Mastodon - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-peertube.svg b/apps/web/public/brand/icon-peertube.svg index 787cdb0..a22704a 100644 --- a/apps/web/public/brand/icon-peertube.svg +++ b/apps/web/public/brand/icon-peertube.svg @@ -1,6 +1,6 @@ Peertube - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-reddit.svg b/apps/web/public/brand/icon-reddit.svg index 497ad38..8d135d5 100644 --- a/apps/web/public/brand/icon-reddit.svg +++ b/apps/web/public/brand/icon-reddit.svg @@ -1,6 +1,6 @@ Reddit - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-slack.svg b/apps/web/public/brand/icon-slack.svg index 21dbdbc..3c39cd5 100644 --- a/apps/web/public/brand/icon-slack.svg +++ b/apps/web/public/brand/icon-slack.svg @@ -1,6 +1,6 @@ Slack - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-telegram.svg b/apps/web/public/brand/icon-telegram.svg index 2c04c3b..0738b13 100644 --- a/apps/web/public/brand/icon-telegram.svg +++ b/apps/web/public/brand/icon-telegram.svg @@ -1,6 +1,6 @@ Telegram - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-threads.svg b/apps/web/public/brand/icon-threads.svg index 87aa902..fd6e59e 100644 --- a/apps/web/public/brand/icon-threads.svg +++ b/apps/web/public/brand/icon-threads.svg @@ -1,6 +1,6 @@ Threads - - + \ No newline at end of file diff --git a/apps/web/public/brand/icon-twitch.svg b/apps/web/public/brand/icon-twitch.svg index dd99360..7cb2747 100644 --- a/apps/web/public/brand/icon-twitch.svg +++ b/apps/web/public/brand/icon-twitch.svg @@ -1,6 +1,6 @@ Twitch - - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-analytics.svg b/apps/web/public/brand/nav-analytics.svg index 96c623d..d86f160 100644 --- a/apps/web/public/brand/nav-analytics.svg +++ b/apps/web/public/brand/nav-analytics.svg @@ -1,4 +1,4 @@ Nav Analytics - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-approvals.svg b/apps/web/public/brand/nav-approvals.svg index dcb2371..d90b1ce 100644 --- a/apps/web/public/brand/nav-approvals.svg +++ b/apps/web/public/brand/nav-approvals.svg @@ -1,4 +1,4 @@ Nav Approvals - + diff --git a/apps/web/public/brand/nav-audit.svg b/apps/web/public/brand/nav-audit.svg index 82dd8ef..2ae85f9 100644 --- a/apps/web/public/brand/nav-audit.svg +++ b/apps/web/public/brand/nav-audit.svg @@ -1,4 +1,4 @@ Nav Audit - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-calendar.svg b/apps/web/public/brand/nav-calendar.svg index 1398cca..b77a972 100644 --- a/apps/web/public/brand/nav-calendar.svg +++ b/apps/web/public/brand/nav-calendar.svg @@ -1,4 +1,4 @@ Nav Calendar - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-chat.svg b/apps/web/public/brand/nav-chat.svg index 61a9adb..6016011 100644 --- a/apps/web/public/brand/nav-chat.svg +++ b/apps/web/public/brand/nav-chat.svg @@ -1,7 +1,7 @@ Nav Chat - - - - + + + + diff --git a/apps/web/public/brand/nav-compose.svg b/apps/web/public/brand/nav-compose.svg index eb9228c..e9b41fa 100644 --- a/apps/web/public/brand/nav-compose.svg +++ b/apps/web/public/brand/nav-compose.svg @@ -1,4 +1,4 @@ Nav Compose - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-connections.svg b/apps/web/public/brand/nav-connections.svg index a6f759c..f5cd986 100644 --- a/apps/web/public/brand/nav-connections.svg +++ b/apps/web/public/brand/nav-connections.svg @@ -1,4 +1,4 @@ Nav Connections - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-files.svg b/apps/web/public/brand/nav-files.svg index 7bdd812..7d00638 100644 --- a/apps/web/public/brand/nav-files.svg +++ b/apps/web/public/brand/nav-files.svg @@ -1,4 +1,4 @@ Nav Files - + diff --git a/apps/web/public/brand/nav-home.svg b/apps/web/public/brand/nav-home.svg index c324549..9d9fc9e 100644 --- a/apps/web/public/brand/nav-home.svg +++ b/apps/web/public/brand/nav-home.svg @@ -1,4 +1,4 @@ Nav Home - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-inbox.svg b/apps/web/public/brand/nav-inbox.svg index fb4dde6..260580a 100644 --- a/apps/web/public/brand/nav-inbox.svg +++ b/apps/web/public/brand/nav-inbox.svg @@ -1,4 +1,4 @@ Nav Inbox - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-more.svg b/apps/web/public/brand/nav-more.svg index 86d7e8e..6adaa7f 100644 --- a/apps/web/public/brand/nav-more.svg +++ b/apps/web/public/brand/nav-more.svg @@ -1,4 +1,4 @@ Nav More - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-search.svg b/apps/web/public/brand/nav-search.svg index 424d7fe..8135375 100644 --- a/apps/web/public/brand/nav-search.svg +++ b/apps/web/public/brand/nav-search.svg @@ -1,4 +1,4 @@ Nav Search - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-settings.svg b/apps/web/public/brand/nav-settings.svg index 6ab306a..1eb2864 100644 --- a/apps/web/public/brand/nav-settings.svg +++ b/apps/web/public/brand/nav-settings.svg @@ -1,4 +1,4 @@ Nav Settings - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-team.svg b/apps/web/public/brand/nav-team.svg index 0a5fe68..b9ebcbe 100644 --- a/apps/web/public/brand/nav-team.svg +++ b/apps/web/public/brand/nav-team.svg @@ -1,4 +1,4 @@ Nav Team - + \ No newline at end of file diff --git a/apps/web/public/brand/nav-video.svg b/apps/web/public/brand/nav-video.svg index 74e982a..8fe1c5e 100644 --- a/apps/web/public/brand/nav-video.svg +++ b/apps/web/public/brand/nav-video.svg @@ -1,4 +1,4 @@ Nav Video - + diff --git a/apps/web/public/brand/pattern.svg b/apps/web/public/brand/pattern.svg index 8a38621..0645eea 100644 --- a/apps/web/public/brand/pattern.svg +++ b/apps/web/public/brand/pattern.svg @@ -3,8 +3,8 @@ - - + + diff --git a/apps/web/public/brand/spinner.svg b/apps/web/public/brand/spinner.svg index ca6de79..d49dd42 100644 --- a/apps/web/public/brand/spinner.svg +++ b/apps/web/public/brand/spinner.svg @@ -1,8 +1,8 @@ - - - - + + + + \ No newline at end of file diff --git a/apps/web/public/brand/t-hub.svg b/apps/web/public/brand/t-hub.svg index ecd65ed..57cf12e 100644 --- a/apps/web/public/brand/t-hub.svg +++ b/apps/web/public/brand/t-hub.svg @@ -1,40 +1,44 @@ - + T-HUB - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/apps/web/src/app/(main)/layout.tsx b/apps/web/src/app/(main)/layout.tsx index 28f48e0..2d2ff28 100644 --- a/apps/web/src/app/(main)/layout.tsx +++ b/apps/web/src/app/(main)/layout.tsx @@ -49,7 +49,7 @@ function Shell({ children }: { children: ReactNode }): React.ReactElement { scrollPositions.set(pathname, { main: main.scrollTop, nested: scrollableChildren(main).map((element) => element.scrollTop) }); }; }, [pathname, mobile]); - const title = titles[pathname.split("/")[1] ?? ""] ?? "Tactical Media Broadcast Hub"; + const title = titles[pathname.split("/")[1] ?? ""] ?? "T-HUB"; return (
diff --git a/apps/web/src/app/(main)/more/page.tsx b/apps/web/src/app/(main)/more/page.tsx index 39dc9bb..14e6f18 100644 --- a/apps/web/src/app/(main)/more/page.tsx +++ b/apps/web/src/app/(main)/more/page.tsx @@ -48,7 +48,7 @@ export default function MorePage(): React.ReactElement {
-

{session?.user.displayName || session?.user.username || "Tactical Media Broadcast Hub"}

+

{session?.user.displayName || session?.user.username || "T-HUB"}

@{session?.user.username || "offline"}{session?.user.email ? ` · ${session.user.email}` : ""}

{session?.role || "Preview"}{session?.workspace.name || "Studio"}
diff --git a/apps/web/src/app/(main)/onboarding/page.tsx b/apps/web/src/app/(main)/onboarding/page.tsx index d1287a1..597dea8 100644 --- a/apps/web/src/app/(main)/onboarding/page.tsx +++ b/apps/web/src/app/(main)/onboarding/page.tsx @@ -221,15 +221,15 @@ export default function OnboardingPage(): React.ReactElement {
- +
Horizontal Collaborative Broadcast System
-
Tactical Media Broadcast Hub
+
T-HUB
-

Tactical Media Broadcast Hub

+

T-HUB

Your platform. Their feeds. No algorithm in between.

diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index c349d0d..9d9fb82 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -8,23 +8,25 @@ } @theme { - /* T-HUB: the acampada26s.net palette (black, white, neon) on a dark base. */ - --color-bg: #000; - --color-surface: #0d0d0d; - --color-surface-2: #181818; - --color-border: #3d3d3d; - --color-border-subtle: #262626; - --color-text: #fff; - --color-text-dim: #b3b3b3; - --color-text-faint: #808080; - --color-accent: #00e5ff; - --color-accent-hover: #5cefff; - --color-accent-dim: rgb(0 229 255 / 0.15); - --color-live: oklch(0.72 0.19 145); - --color-warn: oklch(0.78 0.16 85); - --color-danger: oklch(0.55 0.24 15); - --color-added: oklch(0.72 0.16 145); - --color-removed: oklch(0.55 0.24 15); + /* T-HUB: the acampada26s.net palette. White page, black ink and borders, + neon #00e5ff for hover, focus and the offset shadows. */ + --color-bg: #fff; + --color-surface: #fff; + --color-surface-2: #f2f2f2; + --color-border: #000; + --color-border-subtle: #d4d4d4; + --color-text: #000; + --color-text-dim: #333; + --color-text-faint: #666; + --color-accent: #000; + --color-accent-hover: #222; + --color-accent-dim: rgb(0 229 255 / 0.28); + --color-neon: #00e5ff; + --color-live: #007a3d; + --color-warn: #8a5a00; + --color-danger: #c4001a; + --color-added: #007a3d; + --color-removed: #c4001a; --font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; --font-mono: ui-monospace, "SF Mono", Menlo, monospace; @@ -51,7 +53,7 @@ } html { - color-scheme: dark; + color-scheme: light; } body { @@ -72,13 +74,20 @@ h1, h2 { letter-spacing: 0.01em; } h1 { - text-shadow: 0.04em 0.04em 0 var(--color-accent); + font-size: 1.75rem; + line-height: 1.05; + text-shadow: 0.01em 0.01em 0 var(--color-neon), 0.02em 0.02em 0 var(--color-neon), 0.03em 0.03em 0 var(--color-neon), 0.04em 0.04em 0 var(--color-neon); } -/* Neon fills need dark text; unlayered so it outranks the text-white utility. */ -.bg-accent.text-white, -.bg-accent .text-white { - color: #000; +/* Buttons as on acampada26s.net: hard offset shadow, neon on hover. */ +button.bg-accent, a.bg-accent { + box-shadow: 0 3px 0 var(--color-neon); +} +button.bg-accent:hover, a.bg-accent:hover, button.bg-accent:focus-visible, a.bg-accent:focus-visible { + box-shadow: 0 5px 0 var(--color-neon); +} +:focus-visible { + outline-color: var(--color-neon); } @media (max-width: 1023px) { diff --git a/apps/web/src/app/join/[token]/page.tsx b/apps/web/src/app/join/[token]/page.tsx index afc87c1..4e9a227 100644 --- a/apps/web/src/app/join/[token]/page.tsx +++ b/apps/web/src/app/join/[token]/page.tsx @@ -324,11 +324,11 @@ export default function JoinWorkspacePage({ params }: { params: { token: string
Tactical Media Broadcast Hub — arrows from a circle, warm red on black

Join {info.workspaceName}

diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index cef64d0..edc3c49 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -3,8 +3,8 @@ import type { Metadata, Viewport } from "next"; import "./globals.css"; export const metadata: Metadata = { - title: "Tactical Media Broadcast Hub", - description: "Tactical Media Broadcast Hub — post, schedule and amplify across every network you refuse to be owned by.", + title: "T-HUB", + description: "T-HUB — post, schedule and amplify across every network you refuse to be owned by. Based on Tactical Media Broadcast Hub.", icons: { icon: "/brand/favicon.svg" }, }; @@ -13,7 +13,7 @@ export const viewport: Viewport = { initialScale: 1, viewportFit: "cover", interactiveWidget: "resizes-content", - themeColor: "#000000", + themeColor: "#ffffff", }; export default function RootLayout({ children }: { children: ReactNode }): React.ReactNode { diff --git a/apps/web/src/app/login/page.tsx b/apps/web/src/app/login/page.tsx index fd007e3..a053a06 100644 --- a/apps/web/src/app/login/page.tsx +++ b/apps/web/src/app/login/page.tsx @@ -40,7 +40,7 @@ export default function LoginPage(): React.ReactElement {

Sign in

-

Tactical Media Broadcast Hub

+

T-HUB

void submit(e)}>
diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index adb9e41..51871b3 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -116,7 +116,7 @@ function ManualLanding(): React.ReactElement {
- Tactical Media Broadcast Hub + T-HUB
{(["es", "en"] as const).map((code) => (