From d2a4209b0a806d74118160d8b6c17ab62c0192f8 Mon Sep 17 00:00:00 2001 From: hacklab Date: Thu, 15 Oct 2026 14:15:03 +0200 Subject: [PATCH] style: acampada26s.net palette, Anton titles and T-HUB logo Black/white/neon (#00e5ff) on the existing dark base, h1/h2 in Anton uppercase with the neon offset used on acampada26s.net. Neon fills get dark text. The public submission page and the control-room focus ring follow the same accent. Anton ships under the SIL OFL (license copied next to the font). New logo in docs/brand/t-hub.svg, also the favicon. Co-Authored-By: Claude Opus 5.5 --- apps/web/public/brand/favicon.svg | 45 +++++++-- apps/web/public/brand/t-hub.svg | 40 ++++++++ apps/web/public/fonts/Anton-OFL.txt | 93 ++++++++++++++++++ apps/web/public/fonts/anton.woff2 | Bin 0 -> 15800 bytes .../app/(main)/control-room/control-room.css | 2 +- apps/web/src/app/globals.css | 48 ++++++--- apps/web/src/app/layout.tsx | 2 +- apps/web/src/app/submit/[token]/page.tsx | 26 ++--- docs/brand/t-hub.svg | 40 ++++++++ 9 files changed, 264 insertions(+), 32 deletions(-) create mode 100644 apps/web/public/brand/t-hub.svg create mode 100644 apps/web/public/fonts/Anton-OFL.txt create mode 100644 apps/web/public/fonts/anton.woff2 create mode 100644 docs/brand/t-hub.svg diff --git a/apps/web/public/brand/favicon.svg b/apps/web/public/brand/favicon.svg index cef6a31..ecd65ed 100644 --- a/apps/web/public/brand/favicon.svg +++ b/apps/web/public/brand/favicon.svg @@ -1,7 +1,40 @@ - - - - + + T-HUB + + + + + + + + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/brand/t-hub.svg b/apps/web/public/brand/t-hub.svg new file mode 100644 index 0000000..ecd65ed --- /dev/null +++ b/apps/web/public/brand/t-hub.svg @@ -0,0 +1,40 @@ + + T-HUB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/fonts/Anton-OFL.txt b/apps/web/public/fonts/Anton-OFL.txt new file mode 100644 index 0000000..93fedde --- /dev/null +++ b/apps/web/public/fonts/Anton-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Anton Project Authors (https://github.com/googlefonts/AntonFont.git) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/apps/web/public/fonts/anton.woff2 b/apps/web/public/fonts/anton.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..46fd713ec5d27a15a18e24aeafd9d2ec29a1ab7d GIT binary patch literal 15800 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 setAttempt((n) => n + 1)} className="mt-6 rounded-md bg-[#FF1610] px-3 py-1.5 text-xs font-medium text-white hover:bg-[#e3130e]">Retry} + action={} /> ); @@ -165,7 +165,7 @@ function DeadCard({ tone, title, body, action }: { tone: "warn" | "danger"; titl
{tone === "warn" ? "!" : "✕"} @@ -283,7 +283,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): if (phase === "sent" && done !== null) { return (
- +

Received

Received — the collective will review it. Nothing is published until they approve it. @@ -304,7 +304,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): className="mx-auto flex w-full max-w-xl flex-col gap-6 rounded-lg border border-[#2a2320] bg-[#0F0A09] p-6 sm:p-8" >

- +

Send footage to the collective

@@ -340,7 +340,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): className={`flex min-h-[180px] flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed px-4 py-8 text-center transition-colors duration-150 ${ uploading ? "cursor-not-allowed border-[#3a312e] opacity-60" - : "cursor-pointer border-[#3a312e] hover:border-[#FF1610] focus-visible:border-[#FF1610]" + : "cursor-pointer border-[#3a312e] hover:border-[#00E5FF] focus-visible:border-[#00E5FF]" }`} > {uploading ? ( @@ -350,7 +350,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): {progress < 100 ? `Uploading ${progress}%` : "Upload sent — the collective's server is taking it in…"}{" "} {file !== null && `${file.name} (${formatBytes(file.size)})`} - +

) : file !== null && kind !== null ? ( <> @@ -365,7 +365,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): or browse your device, or paste a file. Nothing is sent until you press Send. - Browse files + Browse files )} {fileError !== null &&

{fileError}

} - {error !== null &&

{error}

} + {error !== null &&

{error}

}
@@ -407,7 +407,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): onChange={(event) => setCreditName(event.target.value)} disabled={uploading} placeholder="How your name should appear in the credit" - className="mt-1 w-full rounded-md border border-[#3a312e] bg-[#060403] px-3 py-2 text-sm text-[#f5efed] placeholder:text-[#6b6563] focus:border-[#FF1610] focus:outline-none" + className="mt-1 w-full rounded-md border border-[#3a312e] bg-[#060403] px-3 py-2 text-sm text-[#f5efed] placeholder:text-[#6b6563] focus:border-[#00E5FF] focus:outline-none" /> {creditTooLong && Up to {SUBMISSION_CREDIT_MAX} characters.} @@ -421,7 +421,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): disabled={uploading} rows={2} placeholder="How licensors can reach you — shown only to admins" - className="mt-1 w-full resize-none rounded-md border border-[#3a312e] bg-[#060403] px-3 py-2 text-sm text-[#f5efed] placeholder:text-[#6b6563] focus:border-[#FF1610] focus:outline-none" + className="mt-1 w-full resize-none rounded-md border border-[#3a312e] bg-[#060403] px-3 py-2 text-sm text-[#f5efed] placeholder:text-[#6b6563] focus:border-[#00E5FF] focus:outline-none" /> {contactTooLong && Up to {SUBMISSION_CONTACT_MAX} characters.} @@ -430,7 +430,7 @@ function SubmitForm({ token, box }: { token: string; box: SubmissionBoxInfo }): diff --git a/docs/brand/t-hub.svg b/docs/brand/t-hub.svg new file mode 100644 index 0000000..ecd65ed --- /dev/null +++ b/docs/brand/t-hub.svg @@ -0,0 +1,40 @@ + + T-HUB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +