From 33fa1e4e9356f53cad9c86b54999e470fb9875b8 Mon Sep 17 00:00:00 2001 From: tleininger Date: Thu, 1 Oct 2026 12:03:39 +0200 Subject: [PATCH] Add the design foundation: self-hosted Nunito, type scale, new tokens and an Icon component --- Elternbeirat.Web.Tests/IconSetTests.cs | 30 ++++++ Elternbeirat.Web.Tests/RouteSmokeTests.cs | 45 ++++++++- Elternbeirat.Web/Shared/Icon.razor | 13 +++ Elternbeirat.Web/Shared/Icon.razor.cs | 46 +++++++++ Elternbeirat.Web/Shared/IconSet.cs | 83 +++++++++++++++ Elternbeirat.Web/wwwroot/app.css | 95 ++++++++++++++++-- Elternbeirat.Web/wwwroot/fonts/OFL.txt | 93 +++++++++++++++++ .../wwwroot/fonts/nunito-latin-wght.woff2 | Bin 0 -> 36192 bytes docs/recht.md | 6 ++ 9 files changed, 401 insertions(+), 10 deletions(-) create mode 100644 Elternbeirat.Web.Tests/IconSetTests.cs create mode 100644 Elternbeirat.Web/Shared/Icon.razor create mode 100644 Elternbeirat.Web/Shared/Icon.razor.cs create mode 100644 Elternbeirat.Web/Shared/IconSet.cs create mode 100644 Elternbeirat.Web/wwwroot/fonts/OFL.txt create mode 100644 Elternbeirat.Web/wwwroot/fonts/nunito-latin-wght.woff2 diff --git a/Elternbeirat.Web.Tests/IconSetTests.cs b/Elternbeirat.Web.Tests/IconSetTests.cs new file mode 100644 index 0000000..aad46c8 --- /dev/null +++ b/Elternbeirat.Web.Tests/IconSetTests.cs @@ -0,0 +1,30 @@ +using Elternbeirat.Web.Shared; + +namespace Elternbeirat.Web.Tests; + +/// +/// Unit tests for the icon lookup behind the Icon component. Pure logic, no +/// PocketBase needed. +/// +public class IconSetTests +{ + [Theory] + [InlineData("calendar")] + [InlineData("map-pin")] + [InlineData("help-circle")] // kept under its old name although Lucide renamed it + public void Known_name_returns_svg_markup(string name) + { + var markup = IconSet.Find(name); + + markup.ShouldNotBeNullOrWhiteSpace(); + markup.ShouldStartWith("<"); // SVG child elements, ready to inline + } + + [Theory] + [InlineData("does-not-exist")] + [InlineData("Calendar")] // lookup is case-sensitive, names are code identifiers + [InlineData("")] + [InlineData(null)] + public void Unknown_name_returns_null(string? name) => + IconSet.Find(name).ShouldBeNull(); +} diff --git a/Elternbeirat.Web.Tests/RouteSmokeTests.cs b/Elternbeirat.Web.Tests/RouteSmokeTests.cs index d483a2f..9393910 100644 --- a/Elternbeirat.Web.Tests/RouteSmokeTests.cs +++ b/Elternbeirat.Web.Tests/RouteSmokeTests.cs @@ -1,4 +1,5 @@ using System.Net; +using System.Text.RegularExpressions; using Microsoft.AspNetCore.Mvc.Testing; namespace Elternbeirat.Web.Tests; @@ -15,7 +16,7 @@ namespace Elternbeirat.Web.Tests; /// /// [Collection(PocketBaseTestGroup.Name)] -public sealed class RouteSmokeTests : IDisposable +public sealed partial class RouteSmokeTests : IDisposable { // WithWebHostBuilder returns a new factory that wraps the base one; both are // disposable, so both are held and disposed to avoid leaking either. @@ -158,6 +159,39 @@ public sealed class RouteSmokeTests : IDisposable events.ShouldContain("Sitzungen und Veranstaltungen auf einen Blick."); // the page body } + [Theory] + [InlineData("/app.css")] + [InlineData("/")] + public async Task No_resource_is_loaded_from_a_foreign_host(string route) + { + // Privacy rule (docs/recht.md): nothing may make the visitor's browser contact + // a third-party host -- no Google Fonts, no CDN. Check the stylesheet and the + // rendered home page for anything that LOADS from an absolute URL (src, + // srcset, , CSS url() and @import). Plain links are left + // alone on purpose: an editor may link to another site, and a link loads + // nothing until the visitor clicks it. + var client = _factory.CreateClient(); + + var body = await client.GetStringAsync(new Uri(route, UriKind.Relative)); + + ForeignResource().Matches(body).Select(match => match.Value).ShouldBeEmpty(); + } + + [Fact] + public async Task Site_font_is_self_hosted() + { + // The @font-face must point at our own wwwroot with a relative URL, and the + // file must actually be served -- otherwise every visitor silently falls back + // to the system font. + var client = _factory.CreateClient(); + + var css = await client.GetStringAsync(new Uri("/app.css", UriKind.Relative)); + css.ShouldContain("url(\"fonts/nunito-latin-wght.woff2\")"); + + var font = await client.GetAsync(new Uri("/fonts/nunito-latin-wght.woff2", UriKind.Relative)); + font.StatusCode.ShouldBe(HttpStatusCode.OK); + } + [Fact] public async Task Health_returns_200_when_PocketBase_is_reachable() { @@ -187,4 +221,13 @@ public sealed class RouteSmokeTests : IDisposable response.StatusCode.ShouldBe(HttpStatusCode.ServiceUnavailable); } + + /// + /// Matches a resource reference that points at an absolute URL, with or without + /// scheme (https://, http:// or protocol-relative //): the + /// src/srcset attributes, a <link>'s href, CSS + /// url() and @import. + /// + [GeneratedRegex("""(?:\b(?:src|srcset)\s*=\s*|]*\bhref\s*=\s*|url\(\s*|@import\s+)["']?\s*(?:https?:)?//""", RegexOptions.IgnoreCase)] + private static partial Regex ForeignResource(); } diff --git a/Elternbeirat.Web/Shared/Icon.razor b/Elternbeirat.Web/Shared/Icon.razor new file mode 100644 index 0000000..e913425 --- /dev/null +++ b/Elternbeirat.Web/Shared/Icon.razor @@ -0,0 +1,13 @@ +@* + Renders one icon from IconSet as inline SVG. Purely decorative: aria-hidden hides + it from screen readers (the text next to it carries the meaning) and + focusable="false" keeps old Edge/IE from putting it in the tab order. The stroke + is currentColor, so the icon takes the colour of the surrounding text. An unknown + name renders nothing at all. +*@ +@if (_markup is not null) +{ + +} diff --git a/Elternbeirat.Web/Shared/Icon.razor.cs b/Elternbeirat.Web/Shared/Icon.razor.cs new file mode 100644 index 0000000..d72944b --- /dev/null +++ b/Elternbeirat.Web/Shared/Icon.razor.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Components; + +namespace Elternbeirat.Web.Shared; + +/// +/// Renders a decorative line icon from as inline SVG. +/// +/// +/// Inline SVG, not an <img> or icon font: no extra request, nothing +/// from a third-party host, and the icon follows the text colour (including dark +/// mode) through currentColor. The icon is hidden from assistive technology, +/// so it must never be the only carrier of meaning. +/// +/// +/// +/// <Icon Name="map-pin" /> Aula +/// <Icon Name="calendar" Size="16" /> +/// +/// +/// +public partial class Icon +{ + /// + /// The inner SVG markup of the current icon, or when the + /// name is unknown and nothing should render. + /// + private MarkupString? _markup; + + /// + /// The icon name, e.g. calendar; see for the set. + /// + [Parameter] + [EditorRequired] + public string Name { get; set; } = ""; + + /// + /// Width and height in CSS pixels. Defaults to 20, which sits well next + /// to body text. + /// + [Parameter] + public int Size { get; set; } = 20; + + /// + protected override void OnParametersSet() => + _markup = IconSet.Find(Name) is { } markup ? new MarkupString(markup) : null; +} diff --git a/Elternbeirat.Web/Shared/IconSet.cs b/Elternbeirat.Web/Shared/IconSet.cs new file mode 100644 index 0000000..1bb863b --- /dev/null +++ b/Elternbeirat.Web/Shared/IconSet.cs @@ -0,0 +1,83 @@ +using System.Collections.Frozen; + +namespace Elternbeirat.Web.Shared; + +/// +/// The fixed set of line icons the site can show, keyed by name. +/// +/// +/// The icons are inlined as SVG markup instead of being loaded from an icon font or +/// a CDN: the site loads nothing from third-party hosts (see docs/recht.md), +/// and inline SVG needs no extra request and inherits the text colour. +/// +/// Source: Lucide (lucide.dev), ISC license; the icons derived from +/// Feather (calendar, clock, download, +/// external-link, help-circle, info, arrow-right) +/// are MIT, Copyright (c) 2013-present Cole Bemis. Both licenses only ask that +/// the notice travels with the copy, which this comment does. Only the inner +/// elements are stored; supplies the shared +/// <svg> wrapper (24x24 view box, 2px round stroke). +/// +/// +/// Lucide renamed help-circle to circle-question-mark; the old +/// name is kept here because it is the one the design work refers to. +/// +/// +/// +public static class IconSet +{ + /// + /// Inner SVG markup per icon name. Ordinal keys: names are code identifiers, + /// not visitor text, so Calendar is deliberately not calendar. + /// + private static readonly FrozenDictionary Icons = + new Dictionary + { + ["calendar"] = + """""", + ["calendar-plus"] = + """""", + ["clock"] = + """""", + ["map-pin"] = + """""", + ["file-text"] = + """""", + ["download"] = + """""", + ["mail"] = + """""", + ["users"] = + """""", + ["heart-handshake"] = + """""", + ["help-circle"] = + """""", + ["newspaper"] = + """""", + ["arrow-right"] = + """""", + ["external-link"] = + """""", + ["info"] = + """""", + }.ToFrozenDictionary(StringComparer.Ordinal); + + /// + /// Looks up the inner SVG markup of an icon. + /// + /// + /// The icon name, e.g. calendar or map-pin. Case-sensitive. + /// + /// + /// The SVG child elements (paths, circles, rects) to place inside an + /// <svg>, or if is + /// or not part of the set. + /// + /// + /// An unknown name yields rather than an exception, so a + /// typo costs a missing decoration, never a broken page. + /// + public static string? Find(string? name) => + name is null ? null : Icons.GetValueOrDefault(name); +} diff --git a/Elternbeirat.Web/wwwroot/app.css b/Elternbeirat.Web/wwwroot/app.css index d77750e..e3ca9b3 100644 --- a/Elternbeirat.Web/wwwroot/app.css +++ b/Elternbeirat.Web/wwwroot/app.css @@ -23,6 +23,20 @@ --color-accent: #6db863; --color-accent-dark: #4f9247; + /* A whisper of the green for calm background areas (info boxes, highlighted + rows). Light enough that body text keeps its full contrast on top. */ + --color-accent-tint: #eef7ec; + + /* Warm yellow for the rare thing that must catch the eye (a "new" marker, a + deadline). Background only, never text -- yellow text is unreadable on white. + Used sparingly: if everything is highlighted, nothing is. */ + --color-highlight: #fdf0c2; + + /* Brand gradient for large surfaces (hero, banner): the header blue flowing into + the IGMH green. The green end is a deep shade (#3a7a3e, 5.2:1 with white), + not --color-accent, so white text stays readable across the whole sweep. */ + --gradient-brand: linear-gradient(135deg, var(--color-header) 0%, #3a7a3e 100%); + /* Headings. Its own token (not --color-brand) so headings and links can differ: in dark mode headings become a soft white while links keep the brand blue. */ --color-heading: #2b6f9c; @@ -48,14 +62,38 @@ /* Rounded corners and a soft shadow for cards, matching the friendly tone. */ --radius: 12px; --radius-sm: 6px; + --radius-lg: 20px; /* large surfaces (hero, banner) look stiff with + the card radius at their size */ --shadow: 0 1px 3px rgba(31, 58, 95, 0.08), 0 4px 12px rgba(31, 58, 95, 0.06); --shadow-hover: 0 2px 6px rgba(31, 58, 95, 0.12), 0 8px 20px rgba(31, 58, 95, 0.1); + --shadow-lg: 0 4px 12px rgba(31, 58, 95, 0.1), 0 16px 40px rgba(31, 58, 95, 0.12); /* One transition speed for hovers/focus across the site. */ --transition: 0.15s ease; - /* Reading width, so long text lines never get uncomfortably wide. */ - --content-width: 60rem; + /* Width of the page frame (header, content, footer). Wide enough for card grids + side by side; running text does not follow it -- paragraphs keep their own + reading width (see p below), so lines never get uncomfortably long. */ + --content-width: 72rem; + + /* Type. The site font is self-hosted (see @font-face below); the system stack + stays behind it, so text shows at once and only swaps when Nunito arrives. */ + --font-family: "Nunito", system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + + /* Type scale. h1 and h2 grow fluidly with the viewport (clamp: minimum, preferred + in vw, maximum) instead of jumping at a breakpoint, so a long German compound + word in a heading still fits a phone screen. Smaller sizes stay fixed: the + difference would not be visible. Body text sits a touch above the 1rem default + because Nunito's rounded letters read small. */ + --font-size-h1: clamp(2rem, 1.6rem + 1.6vw, 2.75rem); + --font-size-h2: clamp(1.5rem, 1.35rem + 0.6vw, 1.75rem); + --font-size-h3: 1.2rem; + --font-size-body: 1.0625rem; + + /* Headings: extra-bold for a friendly, confident lead, pulled slightly tighter + because heavy letters at large sizes otherwise look spaced out. */ + --font-weight-heading: 800; + --letter-spacing-heading: -0.015em; } /* Dark mode: follows the visitor's OS setting automatically (prefers-color-scheme). @@ -77,6 +115,13 @@ --color-accent: #86c97d; /* the IGMH green nudged brighter for dark */ --color-accent-dark: #86c97d; /* no darkening needed on a dark surface */ + --color-accent-tint: #24332a; /* a dark green-grey: tinted, but the soft + body text still reads at 5.5:1 */ + + --color-highlight: #3a3220; /* the warm yellow as a deep amber -- a bright + yellow would glare on the dark page */ + + --gradient-brand: linear-gradient(135deg, var(--color-header) 0%, #2f6b33 100%); --color-heading: #c9ced6; /* soft white, kept a step brighter than the body text so headings still lead the page */ @@ -91,12 +136,30 @@ --shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3); --shadow-hover: 0 2px 6px rgba(0, 0, 0, 0.5), 0 8px 20px rgba(0, 0, 0, 0.4); + --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.5), 0 16px 40px rgba(0, 0, 0, 0.45); } } -/* Base styles. Self-hosted system font stack — no external fonts, for privacy. */ +/* Nunito, served from our own wwwroot -- never from Google Fonts, which would hand + every visitor's IP to Google (see docs/recht.md). One variable file covers every + weight from 400 to 800, so body, bold and headings cost a single ~36 KB request + instead of three static files. Subset to Latin incl. German and the common + European names (ä ö ü ß é ç ğ ş ł ...), € and German quotes; anything outside falls + back to the system font. No italic file: Markdown emphasis is rare, so the browser + slanting the upright face is worth the saved request. font-display: swap shows the + system font immediately and swaps once the file is there -- text never waits. + License: SIL OFL 1.1, see fonts/OFL.txt. */ +@font-face { + font-family: "Nunito"; + src: url("fonts/nunito-latin-wght.woff2") format("woff2"); + font-weight: 400 800; + font-style: normal; + font-display: swap; +} + +/* Base styles. */ html { - font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + font-family: var(--font-family); line-height: 1.65; color: var(--color-text); /* Tell the browser we support both schemes, so form controls, scrollbars and @@ -112,6 +175,7 @@ body { /* A soft tinted page background so white cards/content lift off it. */ background: var(--color-page); color: var(--color-text); + font-size: var(--font-size-body); } a { @@ -129,26 +193,31 @@ a:hover { h1, h2, h3, h4 { line-height: 1.25; color: var(--color-heading); + font-weight: var(--font-weight-heading); + letter-spacing: var(--letter-spacing-heading); margin: var(--space-5) 0 var(--space-3); } h1 { - font-size: 1.5rem; + font-size: var(--font-size-h1); + line-height: 1.15; /* big type needs less leading, or wrapped lines drift apart */ margin-top: 0; /* the first heading on a page needs no gap above */ } h2 { - font-size: 1.2rem; + font-size: var(--font-size-h2); } h3 { - font-size: 1.05rem; + font-size: var(--font-size-h3); } /* h4 gets its own size so it stays a step below h3 instead of falling back to the - browser default, which can render as large as (or larger than) a small h3. */ + browser default, which can render as large as (or larger than) a small h3. Body + size: below that it would read smaller than the text it heads; the extra-bold + weight alone sets it apart. */ h4 { - font-size: 0.95rem; + font-size: var(--font-size-body); } /* Comfortable paragraph rhythm and a capped line length for readability. */ @@ -161,6 +230,14 @@ h1:focus { outline: none; } +/* Icons (Shared/Icon.razor) sit inline next to text: nudged down to line up with the + letters instead of the baseline, and never squeezed when they share a flex row + with a long label. */ +.icon { + flex-shrink: 0; + vertical-align: -0.15em; +} + /* Header navigation links. These live here (global), not in MainLayout.razor.css: NavLink renders plain elements without a scoped-CSS attribute, so a scoped ".main-nav a" rule would not match them -- the links would fall back to the diff --git a/Elternbeirat.Web/wwwroot/fonts/OFL.txt b/Elternbeirat.Web/wwwroot/fonts/OFL.txt new file mode 100644 index 0000000..c8210f0 --- /dev/null +++ b/Elternbeirat.Web/wwwroot/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/nunito) + +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/Elternbeirat.Web/wwwroot/fonts/nunito-latin-wght.woff2 b/Elternbeirat.Web/wwwroot/fonts/nunito-latin-wght.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..65f3728235e69745a2784d68fc6b5b04b2a24e5d GIT binary patch literal 36192 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