Communitygithub.com

Oberflächen

Definiert die visuelle Struktur von Web-UI-Elementen: Füllung, Kanten, Schatten, Radien, Zustände und Symbole – mit präzisen Rezepten für Hell- und Dunkelmodus.

Was ist Oberflächen?

Diese Fähigkeit (Skill) legt fest, woraus jedes UI-Element im Web besteht: seine Füllung, Kante, Schatten, Eckenradien, interaktive Zustände und Symbole. Sie stellt eine kurze, konsistente Liste von Rezepten zur Verfügung, sodass zwei verschiedene Bildschirme niemals zwei unterschiedliche Karten enthalten. Der Skill entscheidet in einer festgelegten Reihenfolge über die Notwendigkeit einer Oberfläche, die Höhenebene (Seite, angehoben, schwebend, Overlay) sowie über die Art der Kante (Schattenring vs. Rahmen), die Radien (konzentrisch), die Zustandsänderungen (hover, pressed, selected, disabled, focus-visible) und die Symbolbehandlung (einheitlicher Satz, currentColor, Strichstärke passend zum Text). Er unterstützt Hell- und Dunkelmodus, erzwingt Konzentrizität der Radien, setzt auf transparente Rahmen für den Farbzwangsmodus und definiert klare Regeln für Fokusringe, deaktivierte Steuerelemente und das Verhalten von Bildüberlagerungen. Der Skill ist für jeden Frontend-Entwickler geeignet, der mit UI-Komponenten arbeitet, unabhängig vom Framework, und liefert am Ende eine Checkliste zur Validierung der Ergebnisse.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nkurunziza-saddy/hmm-interfaces/tree/HEAD/surfaces

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Oberflächen?

Dieser Skill legt fest, woraus jedes Element besteht: seine Füllung, Kante, Schatten, Radien, Zustände und Symbole. Er wählt aus einer kurzen Liste von Rezepten, sodass zwei Bildschirme niemals zwei unterschiedliche Karten enthalten.

Vor jeder Entscheidung wende product-ui §1 (das Geschmacksjournal und die Rangfolge) und §5 (welcher Skill was besitzt) an.

Entscheide in dieser Reihenfolge

  1. Wird eine Oberfläche benötigt? Entfernen, bevor du hinzufügst. Eine Überschrift mit ausreichendem Abstand drumherum braucht keine Karte. Verschachtele niemals eine Karte in einer Karte. Warum: Jeder Behälter fügt eine Kante hinzu, die das Auge lesen muss.
  2. Welche Ebene? Seite, angehoben, schwebend oder Overlay. Eine Ebene pro Element, ausgewählt nach seiner Funktion, nicht danach, wie sehr es hervorstechen soll. elevation.md.
  3. Was zeichnet die Kante? Erhöhung bekommt einen Schattenring. Struktur bekommt einen Rahmen. Niemals beides an einer Kante. elevation.md.
  4. Welcher Radius? Nimm das Token für die Rolle des Elements, dann mache verschachtelte Radien konzentrisch. elevation.md.
  5. Welche Zustände? Gestalte Hover, Pressed, Selected, Disabled und Focus-visible als Änderungen der Oberfläche, bevor du den Standardzustand polierst. states-and-icons.md.
  6. Welche Symbolbehandlung? Ein Satz, currentColor, Strichstärke passend zum Text. states-and-icons.md.
  7. Ist ein Material erlaubt? Nur schwebendes Chrome über scrollendem Inhalt. materials-and-edges.md.
  8. Kanten des Scrollbereichs. Trennlinien, Ausblendungen, Überscrollen. materials-and-edges.md.

Die vier Ebenen

EbeneVerwendungHellDunkel
SeiteDer GrundGrundfüllung, kein SchattenDunkelste Füllung, kein Schatten
AngehobenKarten, Steuerelemente, die ausgewählte OptionWeiß, Ring + 1px Schlagschatten + 3px enger SchlagschattenEine Stufe heller, weißer Ring, enger schwarzer Schlagschatten
SchwebenMenüs, Popover, Tooltips, ToastsWeiß, Ring + 1px Schlagschatten + 4px enger SchlagschattenZwei Stufen heller, weißer Ring, enger schwarzer Schlagschatten
OverlayDialoge, Sheets, Befehlspalette (mit einer Verdunkelung)Weiß, Ring + 1px Schlagschatten + 6px enger SchlagschattenDrei Stufen heller, weißer Ring, enger schwarzer Schlagschatten

Die genauen Token findest du in elevation.md. Die Regeln dahinter:

  • Ein Ring plus ein enger Schlagschatten. Weichzeichnung ≤ 8px, Versatz ≤ 6px, Schlagschatten mit negativer Streuung. Warum: Große weiche Weichzeichnungen wirken wie Leuchten, machen die Seite matschig und sehen generiert aus.
  • Der Dunkelmodus steigt, indem er heller wird. Schatten sind im Dunkeln kaum sichtbar, daher trägt die Helligkeit die Höhe, und ein weißer Ring mit niedrigem Alpha-Wert trägt die Kante.
  • Schatten sind durchscheinend und einfarbig. Undurchsichtige Grautöne hinterlassen einen Hof. Dunkle Schlagschatten bleiben schwarz.
  • Geschwister teilen sich eine Ebene. Karten in einer Reihe haben einen Schatten, einen Radius, einen Innenabstand.
  • Hover ändert die Füllung, nicht den Schatten.

Regeln, die keine Referenz benötigen

  • Rahmen zeigen Struktur, Schatten zeigen Erhöhung. Trennlinien, Eingabefelder, Tabellenzellen und ausgewählte Zustände behalten Rahmen. Eine Karte, deren Rahmen nur dazu da ist, sie anzuheben, bekommt stattdessen einen Ring.
  • Behalte border: 1px solid transparent unter einem Schattenring. Warum: Der Farbzwangsmodus entfernt Schatten, und der Rahmen zeichnet trotzdem eine Kante.
  • Bilder bekommen eine 1px innere Umrandung: outline: 1px solid schwarz mit 10% (weiß mit 10% im Dunkelmodus), outline-offset: -1px. Niemals eine getönte Farbe, die wie ein Rand wirkt. Überspringe Logos und transparente Grafiken.
  • Konzentrischer Radius. Außen = Innen + Innenabstand (+ Rahmen), bis zu 24px Innenabstand. Darüber hinaus sind es separate Oberflächen.
  • Fokus ist ein Ring, niemals nichts. :focus-visible zeigt eine 2px breite Akzentumrandung mit 2px Abstand; Eingabefelder nehmen sie bündig, als 2px breite Akzentkante ohne Lücke. outline: none ohne Ersatz ist ein Fehler. Der Ring nimmt keinen Layoutplatz ein.
  • Deaktivierte Steuerelemente reagieren nicht auf Hover, Drücken oder Skalierung.
  • Symbole: ein Satz pro Oberfläche, currentColor, standardmäßig Umriss und gefüllt, wenn aktiv. Die Strichstärke folgt dem Gewicht des benachbarten Textes, 1,5px bei 400 bis zu 2px bei 600.
  • Weichzeichner im Hintergrund nur bei schwebendem Chrome. Niemals auf Inhalten, Karten oder Tabellen.
  • Scrollbare Overlays (Dialoge, Schubladen, Menüs) erhalten overscroll-behavior: contain.

Paare

FehlerhaftRichtigWarum
border: 1px solid #e5e5e5 auf einer Kartebox-shadow: var(--elev-raised); border: 1px solid transparentEin reiner Tiefenrahmen wird zu einem Ring; der Farbzwangsmodus zeichnet trotzdem eine Kante
box-shadow: 0 10px 40px rgba(0,0,0,.2)0 0 0 1px a.08, 0 1px 2px a.12, 0 4px 8px -4px a.16Eng und klar schlägt groß und weich
Dunkle Karte mit 0 8px 24px #000Hellere Füllung plus 0 0 0 1px oklch(1 0 0 / .08)Schatten verschwinden auf Dunkel; Helligkeit zeigt Höhe
Kartenradius 8, innerer Bildradius 8, Innenabstand 8Innen 8, außen 16Konzentrische Ecken sorgen für einen gleichmäßigen Abstand
<img> verschmilzt mit einer weißen Karteoutline: 1px solid oklch(0 0 0 / .1); outline-offset: -1pxDie Kante ist lesbar, ohne einen Rahmen
button:focus { outline: none }button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px }Tastaturnutzer behalten ihre Position
1,5px Symbolstrich neben einer 600er-Schrift2px StrichDie Strichstärke entspricht der Stammstärke
Gefüllte Symbole in jedem SymbolleistenplatzStandardmäßig Umriss, gefüllt für das aktiveFüllung ist das Zustandssignal
backdrop-filter: blur(20px) auf einer KarteEine undurchsichtige OberflächeWeichzeichnung gehört zu Chrome, das über scrollendem Inhalt schwebt

Bevor du fertig bist

MusterBehebung
box-shadow mit Weichzeichnung > 8px oder Alpha > .2 auf heller UIVerwende ein Ebenen-Token
border plus box-shadow, die die gleiche Aufgabe erfüllenNur Ring plus transparenter Rahmen
Schattenring ohne border: 1px solid transparentFüge es hinzu
Gleicher border-radius auf einem Eltern- und seinem gepolsterten Kindinner + padding für das Elternelement
outline: none oder outline: 0 ohne :focus-visible ErsatzFüge den Ring hinzu
:focus (nicht :focus-visible) gestaltet einen RingWechsle zu :focus-visible
border-width ändert sich in einem ZustandFarbe, Füllung oder ein transparenter Rahmen gleicher Breite
Hartcodiertes fill="#…" oder stroke="#…" in einem SymbolcurrentColor
Zwei importierte Symbolbibliotheken auf einem BildschirmEine
backdrop-filter außerhalb einer fixierten Leiste, Seitenleiste oder eines schwebenden MenüsEntferne es
Overlay-Liste ohne overscroll-behavior: containFüge es hinzu
Harter Schnitt am Rand eines Scrollers oder ein durch overflow: hidden abgeschnittener SchattenBlende die Kante aus; polstere den Scroller

Überprüfe durch Darstellung in Hell und Dunkel bei 2× und beschneide eine Kante jeder Ebene. Fahre mit der Maus darüber, drücke, tabbe zum Fokus, wähle aus und deaktiviere jedes Steuerelement und vergleiche die Kastengröße vorher und nachher. Schalte den Farbzwangsmodus um (Chrome DevTools, Rendering-Emulation) und bestätige, dass jede Karte noch eine Kante hat.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

nkurunziza-saddy/break

Stress-tests a piece of UI with worst-case data and every reachable state, then reports what broke with a numbered fix for each. Use it when the user types /break, or asks to "break this", "stress-test", "try the worst case", "what happens with long names", "check the empty and error states" or "find the edge cases" on a component or screen.

nkurunziza-saddy/layout

Structure and space in product UI on the web. It sets the spacing scale, grouping, alignment, density (compact or comfortable), hit areas, app shells (sidebar, toolbar, content, inspector), max widths, container-query responsiveness, dropdown and popover sizing, room for long and translated text, layout stability (no shift on load) and sticky elements that must not cover focus.

nkurunziza-saddy/motion

Builds motion for product UI on the web. It decides whether something should move at all, then why, which tool (CSS transition, WAAPI, Motion, spring), which properties, curve, duration, interruption, exit and reduced-motion path, and it writes the code. Also covers stagger and choreography, gestures (drag, flick, sheets), motion tokens and animation performance.

nkurunziza-saddy/pick-library

Picks the right library for a frontend task from a curated, status-checked list, instead of hand-rolling it or installing an abandoned package. Use it when the user asks "what should I use for…", "is there a library for…", or names a package, and when you are about to build a toast, command menu, drawer, date picker, table, virtual list, drag and drop, chart, OTP input, animated number, theme switch, form validation…

Verwandte Skills