Komponenten

Design language

An octagon with chamfered corners — never a radius, never a point.

Colours — the same shape, a different meaning

The shape is colour-independent. All values in oklch, unchanged from globals.css.

Brand--goldPrimary, ring, accent
Brand dimmed--gold-dimSecondary voice
Error--destructiveDestructive actions
Warning--warningAwaiting approval
Surface--cardCards, panels
Bevel--bevelEdge of the chamfer — opaque

Chamfer — two rows

One value cannot work: controls stay subtle (more was too harsh on a 32-px button), surfaces carry the slant clearly, otherwise it looks timid.

Control small
Control
Mark
Card
Panel

Design language

Formensprache

Die Tessera-Form: Kappung statt Rundung, Kante als evenodd-Ring, gemessene Bevel-Stufen. Grundlage aller weiteren Items.

The design language travels as a file, byte-identical — not as translated tokens. That leaves one source and nothing that can drift apart. Whoever pulls it also gets the repair rules, and those must stay unlayered: in Tailwind v4 the @layer rank beats specificity. Also worth knowing: hand-written @layer utilities classes get no responsive variants — sm:tsr-cut is never generated.

npx shadcn@latest add @tessera/form

Primitives

Button

Kappung an der Groessenvariante, nicht an der Aufrufstelle. Umriss-Variante traegt die Kante als Ring.

The chamfer hangs on the size variant, not on the call site. It used to sit in the className of every call — 19 places, some of which were always forgotten. The outline variant carries its edge as a ring, not as a border: on a chamfer a border only survives the straight edges, the slants stay empty.

npx shadcn@latest add @tessera/button

Pulls in: @tessera/form, utils

Card

Kappung 12px, Kante als Ring. Keine Rundung, kein ring-Utility — beide sind auf einer Kappung unsichtbar.

A card
12px chamfer, edge as a ring.
The border used to continue across the slants — that was the original defect.

No ring-1. A ring lies outside the box and is removed completely by the chamfer — not half, entirely. The same goes for outline and box-shadow. Two ways remain: the evenodd ring in the pseudo-element or coloured padding on an identically shaped hull.

npx shadcn@latest add @tessera/card

Pulls in: @tessera/form, utils

Dialog

Kappung 15px, mit Kopf, Fuss und Beschreibung. Traegt eine eigene Regel fuer den responsiven Fall, in dem der Dialog erst ab sm eine Kappung bekommt.

npx shadcn@latest add @tessera/dialog

Pulls in: @tessera/form, utils

Input

Traegt die Form, aber bewusst keine Huelle: die Kante kommt von FieldShell, weil sonst die className der Aufrufstellen mehrdeutig wird.

Carries the shape, but deliberately no hull. The edge would otherwise come from the className of twenty call sites and be ambiguous there — tailwind-merge lets, say, p-3.5 win against py-(--card-spacing). For fields with an edge: FieldShell.

npx shadcn@latest add @tessera/input

Pulls in: @tessera/form, utils

Tooltip

Kappung und Ring statt Schatten.

Chamfer and ring instead of shadow.

npx shadcn@latest add @tessera/tooltip

Pulls in: @tessera/form, utils

Sheet

Seitliches Panel auf Radix-Dialog. Kappung ueber die Rollen-Selektoren der Formensprache.

15px chamfer via the role selectors. An open sheet would cover the catalogue — best seen in the app-shell on narrow screens.

npx shadcn@latest add @tessera/sheet

Pulls in: @tessera/form, utils

Skeleton

Ladeplatzhalter. Traegt keine Kante — eine Flaeche, die noch niemand ist.

npx shadcn@latest add @tessera/skeleton

Pulls in: @tessera/form, utils

Separator

Trennlinie in Haarstaerke.

Above the line

Below the line

npx shadcn@latest add @tessera/separator

Pulls in: @tessera/form, utils

Tabs

Base-UI-Tabs. Die Kappung der Ausloeser kommt zentral ueber [role=tab] aus der Formensprache.

Every trigger carries the brand chamfer via [role=tab].
npx shadcn@latest add @tessera/tabs

Pulls in: @tessera/form, utils

ScrollArea

Scroll-Flaeche mit eigener, schmaler Leiste.

npx shadcn@latest add @tessera/scroll-area

Pulls in: @tessera/form, utils

Collapsible

Auf- und zuklappender Ast, traegerlos — die Form kommt vom Inhalt.

npx shadcn@latest add @tessera/collapsible

Pulls in: @tessera/form, utils

Table

Datentabelle mit Kopf, Fuss und Zeilenmarkierung. Grundlage jedes Gitters.

Registry packages — three of twelve.
PackageReleaseSize
@dev0zzz.tessera.at/sdk0.4.1184 kB
@dev0zzz.tessera.at/cli0.2.092 kB
@dev0zzz.tessera.at/ui0.1.3311 kB
Total587 kB
npx shadcn@latest add @tessera/table

Pulls in: @tessera/form, utils

Pagination

Seitenwechsel als nav mit Liste und aria-current. Bringt paginationRange mit — welche Zahlen sichtbar sind, entscheidet nicht die Aufrufstelle.

Page 7 of 42

npx shadcn@latest add @tessera/pagination

Pulls in: @tessera/form, @tessera/button, utils

ColumnResizer

Ziehgriff fuer Spaltenbreiten. Button mit role=separator statt div — mit Pfeiltasten bedienbar, Breite als aria-valuenow.

ReleaseChannel
v0.5.2 — design languageRadicle
v0.5.1 — dialogsRadicle

180 px — arrow keys ±8, with Shift ±80, double-click resets

npx shadcn@latest add @tessera/column-resizer

Pulls in: @tessera/form, utils

DataGrid

Tabelle mit Sortierung, Auswahl und ziehbaren Spalten. Haelt keinen Zustand — sortiert wird bei jeder ernsthaften Menge auf dem Server.

v0.0.0Radiclewithdrawn2026-01-01120
v0.0.1GitHubsigned2026-02-02157
v0.0.2npmjssigned2026-03-03194
v0.0.3Radicledraft2026-04-04231
v0.1.0GitHubsigned2026-05-05268
v0.1.1npmjssigned2026-06-06305
v0.1.2Radicledraft2026-07-07342
v0.1.3GitHubwithdrawn2026-08-08379
npx shadcn@latest add @tessera/data-grid

Pulls in: @tessera/form, @tessera/table, @tessera/checkbox, @tessera/column-resizer, @tessera/skeleton, utils

Checkbox

Kaestchen — benannte Ausnahme der Formensprache: es behaelt seine eigene Form.

npx shadcn@latest add @tessera/checkbox

Pulls in: @tessera/form, utils

Label

Beschriftung eines Feldes, verknuepft ueber htmlFor.

npx shadcn@latest add @tessera/label

Pulls in: @tessera/form, utils

Textarea

Mehrzeiliges Feld. Ohne Ziehgriff — der sitzt in der Ecke, die die Kappung wegschneidet; die Hoehe kommt aus rows, das Mitwachsen schaltet die Aufrufstelle zu.

npx shadcn@latest add @tessera/textarea

Pulls in: @tessera/form, utils

InputGroup

Feld mit Beiwerk — Lupe davor, Knopf dahinter, Zaehler darunter. Die zweite Huelle neben FieldShell, weiterhin genau ein Feld pro Huelle.

rows/page
0/140
npx shadcn@latest add @tessera/input-group

Pulls in: @tessera/form, @tessera/input, @tessera/textarea, utils

Popover

Freie Flaeche an einem Ausloeser. Kein Menue — die Pfeiltasten bleiben unangetastet, damit ein Formular darin bedienbar ist.

npx shadcn@latest add @tessera/popover

Pulls in: @tessera/form, utils

Calendar

Monatsraster auf react-day-picker. Der Balken einer Spanne bleibt ein Rechteck — gekappt wird der Tagesknopf darauf.

August 2026
August 2026
npx shadcn@latest add @tessera/calendar

Pulls in: @tessera/form, @tessera/button, utils

DatePicker

Datum und Zeitraum aus einem Kalender im Popover. Der Ausloeser ist ein Feld, kein Knopf; getippt wird nicht.

npx shadcn@latest add @tessera/date-picker

Pulls in: @tessera/form, @tessera/calendar, @tessera/popover, utils

Select

Auswahl aus einer festen Liste. Der Ausloeser ist ein Feld, keine Schaltflaeche — Hoehe und Kappung folgen dem Input.

Channel
npx shadcn@latest add @tessera/select

Pulls in: @tessera/form, utils

Combobox

Auswahl mit Tippen, einfach und mehrfach. Die Mehrfachauswahl steckt mit drin — Chips als Huelle, ein Chip je gewaehltem Wert.

npx shadcn@latest add @tessera/combobox

Pulls in: @tessera/form, utils

ToggleGroup

Segmentierte Auswahl. Die Gruppe traegt die Kappung des Kastens, jeder Knopf darin seine eigene.

npx shadcn@latest add @tessera/toggle-group

Pulls in: @tessera/form, utils

Atoms

Badge

Kappung 6px.

VerifiedApprovedAwaiting approvalLockedDraft
npx shadcn@latest add @tessera/badge

Pulls in: @tessera/form, utils

CodeBlock

Rendert code oder pre und ersetzt die sieben identischen Klassenketten, die vorher von Hand wiederholt wurden.

npx shadcn@latest add @tessera/button
npx shadcn@latest add @tessera/code-block

Pulls in: @tessera/form, utils

FieldShell

Kappung und Ring fuer ein einzelnes Feld. Traegt die Kante, die das Input bewusst nicht selbst traegt.

npx shadcn@latest add @tessera/field-shell

Pulls in: @tessera/form, utils

Toggle

Zweiwertiger Umschalter, gekappt.

Post public
Allow zaps
Locked
npx shadcn@latest add @tessera/toggle

Pulls in: @tessera/form, utils

SearchInput

Suchfeld mit Lupe, gekappt und mit Kante.

npx shadcn@latest add @tessera/search-input

Pulls in: @tessera/form, @tessera/input, utils

TesseraStart

Der Marken-Knopf.

Filled, never outlined-with-a-hollow-core. The gold belongs to the primary action, and that is Create @handle — only signed-out visitors see these buttons, and they are usually new here. Three drafts lie behind this: gold border with a hollow core (over-engineered), gold for both (then the colour no longer says what is primary), emphasis swapped. Now the component derives the look from intent, so an app cannot pick it wrongly. Both fills are opaque, hence independent of the background.

npx shadcn@latest add @tessera/tessera-start

Pulls in: @tessera/form, @tessera/logo, utils

OrgCrest

Wappen einer Organisation, im Achteck.

npx shadcn@latest add @tessera/org-crest

Pulls in: @tessera/form, utils

ActorAvatar

Form nach Herkunft: Tessera-Konten im Achteck mit Goldrand, alle anderen rund. Der Rand ist Polsterung auf gleich geformter Huelle, weil ein ring auf einer Kappung verschwindet.

SS

The shape states the origin: Tessera accounts in the octagon with a gold border, everyone else round. isTesseraActor checks with endsWith against .tessera.at — never with includes, or tessera.at.evil.example could pass itself off as native. Known limit: Tessera accounts on their own domain read as foreign and get the circle.

npx shadcn@latest add @tessera/actor-avatar

Pulls in: @tessera/form, @tessera/actor-origin, utils

ActorIdentity

Wie ein Konto in Tessera erscheint: Avatar, Anzeigename, darunter das Handle mit @. Eine Figur fuer jede Stelle, an der ein Konto auftaucht.

D
dev0zzz@dev0zzz.tessera.atBuilds Tessera. Radicle, Talos, too many octagons.
Account
H
Haus Slytherin@haus-slytherin.tessera.at
S
Someone from elsewhere@someone.bsky.social
npx shadcn@latest add @tessera/actor-identity

Pulls in: @tessera/actor-avatar, @tessera/form, utils

PathCrumbs

Der Pfad zum aktuellen Ort, Segment fuer Segment klickbar. Mono, weil die Segmente Dateinamen sind; das letzte Segment traegt aria-current statt nur Farbe.

npx shadcn@latest add @tessera/path-crumbs

Pulls in: @tessera/form, utils

ContentSurface

Die Flaeche, auf der der Anwendungsinhalt sitzt: ein eigener Layer unter der Tab-Leiste, mit Tessera-Kante und optional mit vertikalen Reitern am Rand.

The application's tab bar

Description

The content stands on its own plate with the Tessera edge. The tabs at the rim subdivide within the tab and switch with the surface, not with the app.

npx shadcn@latest add @tessera/content-surface

Pulls in: @tessera/form, utils

SearchSyntaxHint

Das Fragezeichen am Suchfeld: zeigt feld:wert, Phrase, Ausschluss und Groessenvergleich mit den echten Feldnamen der Suche. Eine Syntax, die niemand sieht, benutzt niemand.

npx shadcn@latest add @tessera/search-syntax-hint

Pulls in: @tessera/popover, @tessera/button, @tessera/form

Blocks

AppShell

Das Grundgeruest einer Tessera-App: Sidebar mit Navigationsbaum, Inhalt als Inset. Kopf, Fuss und Suche sind Slots — Business gehoert in die Page.

The content sits as its own plate next to the navigation — usually a PageShell lives here.
npx shadcn@latest add @tessera/app-shell

Pulls in: @tessera/sidebar, @tessera/collapsible, @tessera/dropdown-menu, @tessera/form, utils

PageShell

Das Geruest jeder Listen- und Werkzeugseite: Kopfzeile mit Brotkrumen und Navigation, Tabs mit URL-Sync und Werkzeugleisten-Registry, darunter die Inhaltsflaeche. Suche ist ein Slot.

42 entries

The content surface belongs to the page — a grid would stand here.

Header, tabs and toolbar are scaffold, not content.

npx shadcn@latest add @tessera/page-shell

Pulls in: @tessera/content-surface, @tessera/tabs, @tessera/breadcrumb, @tessera/dropdown-menu, @tessera/button, @tessera/badge, @tessera/sidebar, @tessera/form, utils

DetailPage

Vorlage einer Detailseite: Kopfzeile mit Nachbar-Navigation, Brotkrumen-Slot und Tab-Leiste, dazu das L aus Identitaetsleiste und Kontext-Rail — beide Arme falten einzeln, der gefaltete Streifen uebernimmt die Identitaet.

skytess

rad:z3vhVW… — signed provenance

Latest tag v0.9.3Delegates 2Open patches 1
publicsignedRust1 open patch
Delivery
Last run 2026-08-05
v0.9.3Tag
4:12Build time
18.4 MBSize
Provenance
cosign, Fulcio-free
2Delegates
3Signatures
1Mirrors
The rest belongs to the page
The template provides the header, neighbour navigation, tabs and the L of identity band and context rail — both arms fold individually. What sits on the surface — cards here, a grid on a list page — comes from the page.
npx shadcn@latest add @tessera/detail-page

Pulls in: @tessera/page-shell, @tessera/button, @tessera/card, @tessera/popover, @tessera/sidebar, @tessera/form, utils

CommandPalette

Eine Suche ueber alles, auf ⌘K: gruppierte Treffer aus mehreren Quellen, Tastaturnavigation, Hervorhebung und Verlauf. Eine tote Quelle nimmt die anderen nicht mit.

Nothing chosen.

npx shadcn@latest add @tessera/command-palette

Pulls in: @tessera/dialog, @tessera/search-sources, @tessera/form, utils

SmartGrid

Die vollstaendige Liste: Suche, Facetten, Sortierung, Auswahl, Spaltenbreiten, Seitenwechsel und CSV-Export. Die Suche steckt hinter dem unified-search-Adapter — angeschlossen ist nichts.

Total:0
Page1of1
|||
npx shadcn@latest add @tessera/smart-grid

Pulls in: @tessera/data-grid, @tessera/pagination, @tessera/select, @tessera/dropdown-menu, @tessera/toggle-group, @tessera/button, @tessera/badge, @tessera/search-input, @tessera/search-syntax-hint, @tessera/csv-export, @tessera/unified-search, @tessera/form, utils

Library

actor-origin

isTesseraActor prueft mit endsWith auf .tessera.at — nie mit includes, sonst kann sich tessera.at.evil.example als heimisch ausgeben.

npx shadcn@latest add @tessera/actor-origin

csv-export

CSV und ausschliesslich CSV. Quotet nach RFC 4180, entschaerft fuehrende Formelzeichen und schreibt die Bytefolgenmarkierung, damit Excel Umlaute liest.

npx shadcn@latest add @tessera/csv-export

search-query

Die Abfragesprache des Suchfelds: feld:wert, "exakte Phrase", -ausschluss und datum>2026-01. Zerlegt nur — gefunden wird woanders.

npx shadcn@latest add @tessera/search-query

search-sources

Mehrere Quellen, eine Frage: fragt sie nebeneinander, gruppiert nach Herkunft und laesst eine tote Quelle die anderen nicht mitnehmen. Dazu die Hervorhebung der Treffer.

npx shadcn@latest add @tessera/search-sources

Anmeldung mit Tessera

Der komplette OIDC-Login gegen id.tessera.at: Session als verschluesseltes Cookie (iron-session), Login-/Callback-/Logout-Routen mit PKCE-Transaktions-Cookie, einmaliger Selbstheilung und RP-initiiertem Logout. Kanonische Quelle ist start-simple.

npx shadcn@latest add @tessera/auth-oidc

Slider — track and moving part

Not a registry item — the slider so far lives only in this app. Track and moving part carry the shape individually; the element itself stays unclipped, a clip on it would cut the thumb off at the ends. The gold fill needs the value and therefore comes from the Slider atom, not from the CSS.

Raw input[type=range] — without the atomCorrectly shaped, but single-coloured: the shape sits in the CSS, only the fill needs the value.

The rules

  • The shape is a token. One definition in@dev0zzz.tessera.at/sdk/form.css, applied everywhere — not rebuilt per component.
  • The shape is colour-independent. Gold, red, amber: the same silhouette, a different meaning.
  • Focus sits inside. Measured in the browser: everything outside the shape gets clipped — outline, ring, shadow.
  • Exceptions are named. Checkboxes, radios, switches, avatars and floating layers (menu, tooltip) keep their shape and their shadows.
  • The mark is not repeated. It stands large where it works — header, passkey screen. Not in every button: on the front page it otherwise appeared five times. Here the brand carries the shape.
  • ui/ is never touched. The language hooks in via the data-slot attributes that shadcn sets itself.