Dokumentation

Jede Komponente mit Live-Vorschau, dem Markup zum Kopieren, den beteiligten Klassen und ihrem Verhalten auf kleinen Schirmen. Nichts hier ist aus einem Screenshot erzeugt – die Vorschauen sind echt.

Installation

Ein Stylesheet. Nimm den Weg, der zu deinem Projekt passt.

html<!-- CDN --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/notionkit@1/notionkit.min.css"> <!-- local --> <link rel="stylesheet" href="notionkit.css"> <!-- your own theme, after the library --> <link rel="stylesheet" href="theme-override.css">
htmlnpm install @jungherz-de/notionkit

Das Theme sitzt auf <html>. Hell ist die Vorgabe, das Attribut braucht es also nur für Dunkel:

html<html lang="de" data-theme="dark"> <body class="nk-body"></body> </html>

Ergänze class="nk-body" an deinem <body>, um Schrift, Hintergrund und Textfarbe zu übernehmen. Das ist opt-in: Ohne diese Klasse fasst NotionKit nichts außerhalb seiner eigenen Klassen an.

Design-Tokens

Jeder visuelle Wert ist eine Custom Property. Die beiden Blöcke unten sind die gesamte Token-Fläche – :root für Hell, [data-theme="dark"] für die Abweichungen.

TokenHellDunkelBedeutung
--nk-bg#ffffff#191919Seitenhintergrund
--nk-bg-sidebar#f7f6f3#202020Sidebar und Settings-Navigation
--nk-bg-hoverrgba(0,0,0,0.045)rgba(255,255,255,0.055)Hover-Hauch – eine Verdunkelung, nie ein Farbwechsel
--nk-bg-activergba(0,0,0,0.06)rgba(255,255,255,0.08)Aktive/ausgewählte Zeile
--nk-bg-callout#f1f1ef#252525Callouts, Badges, Tasten, Segment-Schiene
--nk-bg-code#f7f6f3#202020Hintergrund von Code-Blöcken
--nk-bg-card#ffffff#202020Board-Karten – getrennt von --nk-bg, damit Dark Mode sie abheben kann
--nk-text#37352frgba(255,255,255,0.81)Fließtext. Nie reines Schwarz
--nk-text-secondaryrgba(55,53,47,0.65)rgba(255,255,255,0.46)Sekundärtext, inaktive Baum-Einträge
--nk-text-tertiaryrgba(55,53,47,0.45)rgba(255,255,255,0.28)Meta, Platzhalter, Bildunterschriften
--nk-borderrgba(55,53,47,0.09)rgba(255,255,255,0.094)Haarlinien-Trenner
--nk-border-strongrgba(55,53,47,0.16)rgba(255,255,255,0.16)Input-Rahmen, Scrollbar-Griffe, gestrichelte Rahmen
--nk-accent#2383e2#529CCADie eine Markenfarbe. Alles Akzentuierte wird daraus gemischt
--nk-on-accent#ffffffText und Marken auf Akzent- oder Danger-Füllung
--nk-danger#eb5757Destruktive Aktionen, Inline-Code, negative Deltas
--nk-tag-blue-bg#e7f3f8#133040Tag-Hintergrund, zugleich Fortschritts-Schiene
--nk-tag-blue-text#337ea9#529CCATag-Text, zugleich Fortschritts-Füllung
--nk-tag-green-bg#edf3ec#173B2CTag-Hintergrund
--nk-tag-green-text#448361#4DAB9ATag-Text, zugleich positives Delta
--nk-tag-orange-bg#fbecdd#40291BTag-Hintergrund
--nk-tag-orange-text#d9730d#FFA344Tag-Text, zugleich Datums-Erwähnungen und Code-Attribute
--nk-tag-purple-bg#f6f3f9#2E2440Tag-Hintergrund
--nk-tag-purple-text#9065b0#9A6DD7Tag-Text
--nk-decor-purple#9065b0Avatar-Verlauf-Start und Cover. Bewusst in beiden Themes gleich
--nk-decor-blue#529ccaAvatar-Verlauf-Ende und Cover
--nk-decor-orange#d9730dCover-Akzent
--nk-scrimrgba(15,15,15,0.6)Modal-Backdrop
--nk-scrim-softrgba(15,15,15,0.5)Backdrop der Befehlspalette, eine Stufe heller
--nk-sidebar-width260pxSidebar-Breite, zugleich ihre min-width
--nk-radius6pxRadius für Bedienelemente. Karten und Modals nutzen direkt 8–12px
--nk-fontui-sans-serif, -apple-system, "Segoe UI", Inter, Helvetica, Arial, sans-serifSystem-Schriftstapel
--nk-font-monoui-monospace, "SF Mono", Menlo, Consolas, monospaceMonospace-Stapel für Code
--nk-shadow-menurgba(15,15,15,0.05) 0px 0px 0px 1px, rgba(15,15,15,0.1) 0px 3px 6px, rgba(15,15,15,0.2) 0px 9px 24pxrgba(15,15,15,0.2) 0px 0px 0px 1px, rgba(15,15,15,0.4) 0px 3px 6px, rgba(15,15,15,0.6) 0px 9px 24pxDreilagiger Schatten für jede schwebende Fläche
--nk-shadow-card0 1px 2px rgba(0,0,0,0.04)noneAbheben der Board-Karte. Im Dark Mode `none`
--nk-shadow-knob0 1px 2px rgba(0,0,0,0.2)Switch-Knopf
--nk-shadow-segment0 1px 2px rgba(0,0,0,0.08)Aktives Segment

Rebranding ist eine Deklaration. Alles Abgeleitete – Fokusring, Checked-Zustände, ausgewählte Modell-Karte, Danger-Hover – wird per color-mix() aus einem Token gemischt und zieht mit:

html:root { --nk-accent: #16a34a; }

Theming

Umgeschaltet wird über ein Attribut. Mehr bewegt sich nicht.

html<html data-theme="light"> <!-- default, the attribute may be omitted --> <html data-theme="dark">
htmldocument.documentElement.setAttribute('data-theme', 'dark');

Die Token-Blöcke setzen auch color-scheme, damit vom Browser gezeichnete Oberflächen – Datumswähler, Zahlenfelder, Select-Popups, Scrollbars, Autofill – dem Theme ohne Zutun folgen.

Rebranding live sehen: der 🎨-Button in der Kopfleiste wendet die Beispiel-Paletten aus theme-override.css (Forest, Slate, Sunset, Hoher Kontrast) direkt auf diese Seite an. Die Demo-App hat denselben Schalter unter Einstellungen → Darstellung.

Zustandsklassen

NotionKit liefert Zustände, kein Verhalten. Diese Klassen setzt und entfernst du selbst; in der Library steckt kein JavaScript.

KlasseGilt fürWirkung
.activenk-tree-item nk-db-tab nk-tab nk-settings-pane nk-segmented button nk-emoji-cats span nk-board nk-bubble-menu buttonMarkiert das aktuelle Element. Baum-Einträge bekommen den Aktiv-Hintergrund, Reiter die Unterlinie, Panes werden sichtbar.
.opennk-modal-backdrop nk-cmdk-backdrop nk-toggle-arrowBlendet das Overlay ein und macht es bedienbar; dreht den Toggle-Pfeil um 90°.
.collapsednk-tree-childrenKlappt einen Unterbaum per display: none weg.
.selectednk-cmdk-item nk-model-card nk-slash-itemDie per Tastatur hervorgehobene oder gewählte Option. Anders als active: Auswahl ist flüchtig, active ist der Ort, an dem du bist.
.shownk-toastFährt den Toast von unten hoch und blendet ihn ein.
.aria-checked="true"nk-switch (button form)Füllt die Schiene mit dem Akzent und schiebt den Knopf. Ein Attribut, keine Klasse – der Zustand wird so auch an assistive Technik gemeldet.
.:checkednk-todo input nk-check input nk-switch (input form)Nativer Zustand. Zeichnet Haken oder Punkt und streicht ein To-do-Label durch.
.nk-drop-targetnk-block-hostDrag-Rückmeldung: eine 2px-Akzentlinie über dem Block.

Kontraste

Gemessene Kontrastwerte der Standardpalette, jeweils gegen die Fläche, auf der das Paar tatsächlich sitzt. Fließtext erfüllt WCAG AA in beiden Themes deutlich. Sekundär- und Tertiärtext, die Tag-Paare, die Beschriftung des Primärbuttons und die Danger-Farbe liegen unter 4,5:1 – das sind Notions eigene Werte, bewusst beibehalten.

PaarHellDunkelAA Fließtext
--nk-text / --nk-bg12.2611.78
--nk-text / --nk-bg-sidebar11.3511.06
--nk-text-secondary / --nk-bg4.194.63
--nk-text-tertiary / --nk-bg2.492.53
--nk-accent / --nk-bg3.885.83
--nk-on-accent / --nk-accent3.883.01
--nk-danger / --nk-bg3.485.05
tag blue3.954.57
tag green3.994.48
tag orange2.836.82
tag purple4.093.84

Wenn dein Projekt überall AA braucht: theme-override.css enthält einen fertigen High-Contrast-Block. Einkommentieren hebt die durchgefallenen Paare an, der Rest des Designs bleibt unangetastet.

Editor-Integration

NotionKit liefert keinen Editor. Was es liefert, ist .nk-block-host – die optische Hülle – plus eine darin gescopte, gestylte Adapter-Schicht. Der Integrationsvertrag ist eine Klasse am Host-Element.

TipTap / ProseMirror – der Vanilla-JS-Weg

TipTap als ES-Modul von einem CDN laden und in ein Element mit nk-block-host einhängen. Den Rest erledigen die Adapter-Regeln: Typografie, Überschriften, Listen, Zitate, Code, Links, Selektion und Placeholder werden aus --nk-*-Tokens gestylt.

html<div class="nk-block-host" id="editor"></div> <script type="module"> import { Editor } from 'https://esm.sh/@tiptap/core@2'; import StarterKit from 'https://esm.sh/@tiptap/starter-kit@2'; import Placeholder from 'https://esm.sh/@tiptap/extension-placeholder@2'; new Editor({ element: document.getElementById('editor'), extensions: [StarterKit, Placeholder.configure({ placeholder: 'Type "/" for commands …' })], content: '<p>Hello NotionKit.</p>', }); </script>

BlockNote – der React-Weg

Dieselbe Idee: die BlockNote-View in einem Block-Host rendern. .bn-container, .bn-editor, .bn-block-content, Side-Menu und Drag-Handle sind abgedeckt, und .bn-suggestion-menu übernimmt die Slash-Menü-Optik automatisch.

html<div class="nk-block-host"> <BlockNoteView editor={editor} theme="light" /> </div>

Novel – der Next.js-Weg

Novel baut auf ProseMirror auf, die TipTap-Regeln greifen also bereits. .novel-editor und .novel-prose bekommen Schrift und Farbe, und die Prosa-Breitenbegrenzung wird gelöst, damit die Seitenspalte sie bestimmt.

html<div class="nk-block-host"> <EditorContent className="novel-editor" /> </div>

Live: TipTap in einem Block-Host

Der Editor unten ist echtes TipTap, von einem CDN geladen, ohne eigenes CSS. Fahre über einen Block für die + / ⠿-Leiste und zieh ihn, markiere Text für die Bubble-Toolbar, drücke / für das Slash-Menü und schalte das Theme um – alles Sichtbare kommt aus dem Adapter-Abschnitt von notionkit.css.

Das vollständige Rezept – Slash-Menü auf @tiptap/suggestion, Bubble-Toolbar, Block-Handle mit Drag & Drop und Block-Menü – ist docs-editor.js, rund 300 Zeilen schlichtes JavaScript. Es setzt NotionKit-Klassen auf sein DOM (nk-slash-menu, nk-bubble-menu, nk-block-actions, nk-menu) und überlässt den Rest dem Stylesheet.

Web Components

Das Stylesheet wird zweigeteilt ausgeliefert, damit Web Components die Komponentenregeln adoptieren können, ohne die Tokens in ihren Shadow Roots neu zu deklarieren.

htmlimport { componentsSheet, tokensCss } from '@jungherz-de/notionkit/notionkit-styles.js'; // Tokens go on the document once, wrapped in a layer so a brand // stylesheet wins no matter the load order. const tokens = new CSSStyleSheet(); tokens.replaceSync(`@layer notionkit-defaults { ${tokensCss} }`); document.adoptedStyleSheets = [...document.adoptedStyleSheets, tokens]; class NkCallout extends HTMLElement { constructor() { super(); const root = this.attachShadow({ mode: 'open' }); root.adoptedStyleSheets = [componentsSheet]; // components only } }

Warum die Teilung zählt

Ein Shadow Root, der das ganze Sheet adoptiert, adoptiert auch die :root- und [data-theme]-Blöcke. In diesem Root treffen die Selektoren den eigenen Theme-Wrapper des Elements, jedes Token wird also lokal neu deklariert – und eine treffende Regel schlägt immer einen geerbten Wert. Ein :root { --nk-accent: … } des Consumers käme nie an. Also nur componentsSheet adoptieren und tokensCss aufs Dokument legen.

Die ::slotted()-Zwillinge

Von außen übergebener Inhalt bleibt im Light DOM und ist kein Nachfahre von irgendetwas im Shadow Tree – .nk-callout .c-icon erreicht ihn also nicht. Jede solche Regel hat deshalb einen ::slotted()-Zwilling daneben, 92 an der Zahl – darunter ein [slot="…"]-Zwilling für jeden benannten Slot von NotionKit Elements. Zwei Grenzen: ::slotted() trifft nur den zugewiesenen Knoten, nie etwas darin (Icons direkt übergeben, nie verpackt), und bei geslottetem Inhalt gewinnt der äußere Baum gegen den Shadow Tree.

html.nk-callout .c-icon, .nk-callout ::slotted(.c-icon) { font-size: 17px; }

Ein lauffähiger Nachweis liegt als elements-poc.html bei – ein <nk-callout> und ein <nk-tag color="…">, die componentsSheet adoptieren, über data-theme umthemen und das Branding der Seite übernehmen. Die Seite misst das live (sie braucht einen Build und einen Server: npm run build, dann den Ordner ausliefern).

App-Shell & Layout

PRD 5.1

App-Shell .nk-app

nk-app ist eine flex-Zeile über die volle Höhe: Sidebar links, Hauptspalte rechts. Es ist das äußerste Element einer Workspace-App und der einzige Ort, an den eine feste Höhe gehört. In der Sidebar ist nk-sidebar-scroll der scrollende Baumbereich und nk-sidebar-footer der fixierte Fuß (Einstellungen, Papierkorb).

📊 Projektübersicht

Produkt-Roadmap

Ein kurzer Lead-Absatz führt in die Seite ein – ruhiger und etwas größer gesetzt als der Fließtext, der darunter beginnt.

html<div class="nk-app" style="height:100%"> <aside class="nk-sidebar"> <div class="nk-workspace"><div class="avatar">A</div>Acme GmbH<span class="chev"></span></div> <div class="nk-sidebar-scroll"> <div class="nk-tree-item"><span class="icon">🔍</span><span class="label">Suche</span></div> <div class="nk-tree-item active"><span class="icon">🏠</span><span class="label">Start</span></div> <div class="nk-tree-item"><span class="icon">📥</span><span class="label">Posteingang</span></div> </div> <div class="nk-sidebar-footer"> <div class="nk-tree-item"><span class="icon">⚙️</span><span class="label">Einstellungen</span></div> </div> </aside> <main class="nk-main"> <header class="nk-topbar"> <div class="nk-breadcrumb"><span class="crumb current">📊 Projektübersicht</span></div> <div class="nk-topbar-actions"><button class="nk-topbar-btn nk-share-btn">Teilen</button></div> </header> <div class="nk-page-scroll"><div class="nk-page" style="padding-top:16px"> <h1 class="nk-page-title" style="font-size:28px">Produkt-Roadmap</h1> <p class="lead">Ein kurzer Lead-Absatz führt in die Seite ein – ruhiger und etwas größer gesetzt als der Fließtext, der darunter beginnt.</p> </div></div> </main> </div>
Auf kleinem Schirm:Unter 860px verschwindet die Sidebar vollständig, die Hauptspalte nimmt die volle Breite. Eine Off-Canvas-Schublade ist Sache des Consumers (und eine geplante Elements-Komponente).
.nk-app.nk-sidebar.nk-sidebar-scroll.nk-sidebar-footer.nk-main

Workspace-Umschalter .nk-workspace

Sitzt ganz oben in der Sidebar. Der Avatar-Verlauf wird aus --nk-decor-purple und --nk-decor-blue gemischt und übersteht ein Rebranding unverändert.

A
Acme GmbH
html<div class="nk-workspace" style="background:var(--nk-bg-sidebar);max-width:244px"> <div class="avatar">A</div>Acme GmbH<span class="chev"></span> </div>
Auf kleinem Schirm:Verschwindet unter 860px zusammen mit der Sidebar.
.nk-workspace.avatar.chev

Topbar .nk-topbar

Eine 45px hohe Zeile: links der Breadcrumb, rechts die Aktionen. nk-topbar-actions schiebt sich per margin-left:auto nach rechts – ein Platzhalter ist nie nötig.

📊 Projektübersicht/🚀 Roadmap
html<header class="nk-topbar" style="border:1px solid var(--nk-border);border-radius:var(--nk-radius)"> <div class="nk-breadcrumb"> <span class="crumb">📊 Projektübersicht</span><span class="sep">/</span><span class="crumb current">🚀 Roadmap</span> </div> <div class="nk-topbar-actions"> <button class="nk-topbar-btn">💬</button> <button class="nk-topbar-btn nk-share-btn">Teilen</button> <button class="nk-topbar-btn"></button> <button class="nk-topbar-btn nk-theme-toggle">🌙</button> <button class="nk-topbar-btn"></button> </div> </header>
Auf kleinem Schirm:Bleibt bestehen. Der Breadcrumb bricht um; lange Pfade kürzt der Consumer selbst.
.nk-topbar.nk-topbar-actions.nk-topbar-btn.nk-share-btn.nk-theme-toggle

Breadcrumb .nk-breadcrumb

Jede Stufe ist ein .crumb; die letzte trägt .current und wechselt von sekundärer zu primärer Textfarbe. Trenner sind .sep.

📊 Projektübersicht/ 📚 Wissensdatenbank/ 🚀 Roadmap
html<div class="nk-breadcrumb"> <span class="crumb">📊 Projektübersicht</span><span class="sep">/</span> <span class="crumb">📚 Wissensdatenbank</span><span class="sep">/</span> <span class="crumb current">🚀 Roadmap</span> </div>
Auf kleinem Schirm:Bricht um, statt zu kürzen. Auf kleinen Schirmen den Pfad serverseitig kürzen.
.nk-breadcrumb.crumb.sep.current

Abschnitts-Label .nk-section-label

Die kleine Versal-Beschriftung zwischen Sidebar-Gruppen. Das .plus erscheint erst beim Hovern – so bleibt die Hinzufügen-Aktion erreichbar, ohne die Leiste zu schmücken.

📊Projektübersicht
html<div style="background:var(--nk-bg-sidebar);border-radius:var(--nk-radius);padding:4px 8px;max-width:244px"> <div class="nk-section-label">Favoriten<span class="plus"></span></div> <div class="nk-tree-item"><span class="icon">📊</span><span class="label">Projektübersicht</span></div> </div>
Auf kleinem Schirm:In der Settings-Navigation unter 860px ausgeblendet, wo diese auf Icons zusammenschrumpft.
.nk-section-label.plus

Seiten-Shell & Dokument

PRD 5.3

Seitenspalte .nk-page

Die Dokumentspalte: max-width: 760px mit Auto-Rändern, nie eine feste Breite. Das Icon zieht sich per negativem Rand über das Cover; der Titel ist contenteditable-fähig.

🚀

Produkt-Roadmap

👤 Ada Lovelace📅 Erstellt am 12. Mai 2026

Ein kurzer Lead-Absatz führt in die Seite ein – ruhiger und etwas größer gesetzt als der Fließtext, der darunter beginnt.

html<div class="nk-page-scroll" style="height:100%"> <div class="nk-cover" style="height:120px"></div> <div class="nk-page" style="padding-bottom:24px"> <div class="nk-page-icon">🚀</div> <h1 class="nk-page-title" contenteditable="true">Produkt-Roadmap</h1> <div class="nk-page-meta"><span>👤 Ada Lovelace</span><span>📅 Erstellt am 12. Mai 2026</span></div> <p class="lead">Ein kurzer Lead-Absatz führt in die Seite ein – ruhiger und etwas größer gesetzt als der Fließtext, der darunter beginnt.</p> </div> </div>
Auf kleinem Schirm:Der Seitenabstand fällt unter 860px von 64px auf 24px. Die 760px-Grenze greift dort schlicht nicht.
.nk-page-scroll.nk-page.nk-page-icon.nk-page-title.nk-page-meta

Cover .nk-cover

Ein 200px hohes Zierband über der Seite. Drei radiale Verläufe, gemischt aus den --nk-decor-*-Tokens über --nk-bg-callout. Für ein Foto den ganzen background ersetzen.

html<div class="nk-cover" style="border-radius:var(--nk-radius)"></div>
Auf kleinem Schirm:Feste 200px Höhe, randlos. Auf kurzen Schirmen bei Bedarf selbst reduzieren.
.nk-cover

Überschriften & Lead .nk-heading

nk-heading ist die Abschnitts-Überschrift im Dokument – eine flex-Zeile, damit ein Emoji ohne Zusatz-Markup auf der Grundlinie sitzt. p.lead ist der größere Einstiegsabsatz in nk-page.

✅ So funktioniert das

Ein kurzer Lead-Absatz führt in die Seite ein – ruhiger und etwas größer gesetzt als der Fließtext, der darunter beginnt.

html<div class="nk-page" style="padding:0;max-width:none"> <h2 class="nk-heading">✅ So funktioniert das</h2> <p class="lead">Ein kurzer Lead-Absatz führt in die Seite ein – ruhiger und etwas größer gesetzt als der Fließtext, der darunter beginnt.</p> </div>
Auf kleinem Schirm:Unverändert. Der Seitentitel bleibt 40px; bei Bedarf auf dem Handy selbst verkleinern.
.nk-heading.lead

Inhalts-Elemente

PRD 5.4

Callout .nk-callout

Ein getönter Block für den einen Gedanken, der nicht übersehen werden darf. Das Icon ist ein .c-icon-Kind und hat einen ::slotted()-Zwilling – <nk-callout> kann es später per Slot annehmen.

💡
Leitidee: Ein Callout trägt genau einen Gedanken, der nicht übersehen werden darf. Ein bis zwei Sätze reichen.
html<div class="nk-callout"><span class="c-icon">💡</span><div><b>Leitidee:</b> Ein Callout trägt genau einen Gedanken, der nicht übersehen werden darf. Ein bis zwei Sätze reichen.</div></div>
Auf kleinem Schirm:Fließt natürlich; das Icon bleibt in der ersten Zeile, weil die Zeile align-items: flex-start nutzt.
.nk-callout.c-icon

To-do .nk-todo

Eine Checkbox mit eigenem Haken. Der Geschwister-Selektor input:checked + span streicht das Label durch – beide Hälften liegen in einer Komponente und überstehen den Umzug in einen Shadow Root.

html<div> <label class="nk-todo"><input type="checkbox" checked><span>Komponenten-Umfang skizzieren</span></label> <label class="nk-todo"><input type="checkbox" checked><span>Preview bauen</span></label> <label class="nk-todo"><input type="checkbox"><span>MVP-Umfang priorisieren</span></label> </div>
Auf kleinem Schirm:Die 16px-Box liegt unter dem Touch-Minimum. In ein <label> packen, damit die ganze Zeile tippbar ist.
.nk-todo

Toggle .nk-toggle

Auf nativem <details>/<summary> gebaut – öffnet und schließt ohne eine Zeile JavaScript. Der Marker ist ein ::before, das sich bei [open] dreht.

Was ist nicht enthalten?
Der Text-Editor selbst. NotionKit liefert die optische Hülle; TipTap, BlockNote oder Novel hängst du hinein.
html<details class="nk-toggle" open> <summary>Was ist nicht enthalten?</summary> <div class="toggle-body">Der Text-Editor selbst. NotionKit liefert die optische Hülle; TipTap, BlockNote oder Novel hängst du hinein.</div> </details>
Auf kleinem Schirm:Die Summary-Zeile ist bequem tippbar. Natives Verhalten auf allen Plattformen.
.nk-toggle.toggle-body

Zitat & Trenner .nk-quote

Ein Blockzitat mit durchgezogener linker Linie, dazu der waagerechte Trenner. nk-divider ist für ein <hr> gedacht und setzt dessen eigenen Rahmen zurück.

Design ist nicht, wie etwas aussieht. Design ist, wie es funktioniert.— Steve Jobs

html<blockquote class="nk-quote">Design ist nicht, wie etwas aussieht. Design ist, wie es funktioniert.<cite class="q-cite">— Steve Jobs</cite></blockquote> <hr class="nk-divider">
Auf kleinem Schirm:Unverändert.
.nk-quote.q-cite.nk-divider

Inline-Erwähnungen .nk-mention

Drei Varianten im Fließtext: .person mit Mini-Avatar, .page haarfein unterstrichen, .date in der orangen Tag-Farbe. Alle sind inline-flex und brechen nie mitten in der Erwähnung.

SLSara Lindt 📄 Wissensdatenbank 📅 20. Mai

html<p style="line-height:1.9"> <span class="nk-mention person"><span class="mini-avatar" style="background:var(--nk-decor-purple)">SL</span>Sara Lindt</span> <span class="nk-mention page">📄 Wissensdatenbank</span> <span class="nk-mention date">📅 20. Mai</span> </p>
Auf kleinem Schirm:white-space: nowrap hält jede Erwähnung zusammen; der Absatz bricht darum herum.
.nk-mention.person.page.date.mini-avatar

Code .nk-code

Ein Block mit Sprach-Badge in der Ecke und zwei Farb-Haken – .tag nimmt den Akzent, .attr die orange Tag-Farbe. nk-inline-code ist die Variante im Satz.

html<div class="nk-callout"> <span class="c-icon">💡</span> </div>

Inline: --nk-accent

html<div class="nk-code"><span class="lang">html</span><span class="tag">&lt;div</span> <span class="attr">class=</span>"nk-callout"<span class="tag">&gt;</span> <span class="tag">&lt;span</span> <span class="attr">class=</span>"c-icon"<span class="tag">&gt;</span>💡<span class="tag">&lt;/span&gt;</span> <span class="tag">&lt;/div&gt;</span></div> <p>Inline: <code class="nk-inline-code">--nk-accent</code></p>
Auf kleinem Schirm:white-space: pre plus overflow-x: auto: Lange Zeilen scrollen im Block, statt die Seite zu verschieben.
.nk-code.lang.tag.attr.nk-inline-code

Datenbank-Views

PRD 5.5

View-Reiter .nk-db-tabs

Die Leiste über einer Datenbank. Der aktive Reiter wird durch eine 2px-Unterlinie in Textfarbe markiert, nicht durch eine Füllung. Das .badge-Kind trägt die Zeilenzahl.

▦ Tabelle4
▤ Board
🖼 Galerie
html<div class="nk-database"> <div class="nk-db-tabs"> <div class="nk-db-tab active">▦ Tabelle<span class="badge">4</span></div> <div class="nk-db-tab">▤ Board</div> <div class="nk-db-tab">🖼 Galerie</div> </div> </div>
Auf kleinem Schirm:Bei mehr als drei, vier Views overflow-x: auto an die Leiste geben.
.nk-database.nk-db-tabs.nk-db-tab.active.badge

Tabellen-Ansicht .nk-table

Kopfzellen sind ruhig und klickbar, Zeilen heben sich beim Hovern hervor, und jede Zelle ist white-space: nowrap, damit Spalten ihre Form behalten. .nk-new-row ist die Hinzufügen-Zeile unten (innerhalb von .nk-table funktioniert die Kurzform .new-row weiter).

📄NameStatus 👤Verantwortlich📅Fällig 📊Fortschritt
🚀 RoadmapFertig SLSara 12.05.2026 100 %
🎨 Design-SystemIn Arbeit TWTom 20.05.2026 65 %
+ + Neue Seite
html<div class="nk-table-wrap"><table class="nk-table"> <thead><tr> <th><span class="th-icon">📄</span>Name</th><th><span class="th-icon"></span>Status</th> <th><span class="th-icon">👤</span>Verantwortlich</th><th><span class="th-icon">📅</span>Fällig</th> <th><span class="th-icon">📊</span>Fortschritt</th> </tr></thead> <tbody> <tr><td><span class="row-title">🚀 Roadmap</span></td><td><span class="nk-tag green">Fertig</span></td> <td><span class="person-cell"><span class="mini-avatar" style="background:var(--nk-decor-purple)">SL</span>Sara</span></td> <td class="date-cell">12.05.2026</td> <td><span class="nk-progress"><i style="width:100%"></i></span><span class="nk-progress-label">100 %</span></td></tr> <tr><td><span class="row-title">🎨 Design-System</span></td><td><span class="nk-tag blue">In Arbeit</span></td> <td><span class="person-cell"><span class="mini-avatar" style="background:var(--nk-decor-blue)">TW</span>Tom</span></td> <td class="date-cell">20.05.2026</td> <td><span class="nk-progress"><i style="width:65%"></i></span><span class="nk-progress-label">65 %</span></td></tr> </tbody> </table> <div class="nk-new-row">+ + Neue Seite</div></div>
Auf kleinem Schirm:Das ist der entscheidende Fall: nk-table-wrap scrollt horizontal, damit die Tabelle die Seite nie breiter macht. Die Tabelle immer einwickeln.
.nk-table-wrap.nk-table.th-icon.row-title.date-cell.person-cell.nk-new-row

Tags .nk-tag

Vier semantische Farben, je ein Hintergrund/Text-Paar pro Theme. Die Paare sind für Hell und Dunkel getrennt abgestimmt, nicht per Deckkraft abgeleitet.

In Arbeit Fertig Geplant Design-System
html<span class="nk-tag blue">In Arbeit</span> <span class="nk-tag green">Fertig</span> <span class="nk-tag orange">Geplant</span> <span class="nk-tag purple">Design-System</span>
Auf kleinem Schirm:Unverändert. Inline-block, eine Tag-Reihe bricht also um.
.nk-tag.blue.green.orange.purple

Fortschrittsbalken .nk-progress

Eine 6px-Schiene, deren Füllung ein <i> mit Prozentbreite ist. Schiene und Füllung nutzen das blaue Tag-Paar und ziehen bei einem Theme-Wechsel mit.

65 %

20 %
html<span class="nk-progress"><i style="width:65%"></i></span><span class="nk-progress-label">65 %</span><br><br> <span class="nk-progress"><i style="width:20%"></i></span><span class="nk-progress-label">20 %</span>
Auf kleinem Schirm:Feste 110px Breite, damit er in einer Tabellenzelle lesbar bleibt. Für volle Breite überschreiben.
.nk-progress.nk-progress-label

Board-Ansicht .nk-board

Feste 220px-Spalten in einer horizontal scrollenden Zeile. nk-board ist standardmäßig display:none, damit es neben einer Tabellen-Ansicht liegen kann; .active zeigt es.

Geplant1
🖥 Board-Ansicht
TW28.05.
In Arbeit1
🎨 Design-System
Fertig1
🚀 Roadmap
12.05.
html<div class="nk-board active"> <div class="nk-board-col"> <div class="nk-board-col-header"><span class="nk-tag orange">Geplant</span><span class="count">1</span></div> <div class="nk-card"><div class="card-title">🖥 Board-Ansicht</div><div class="card-meta"><span class="mini-avatar" style="background:var(--nk-decor-blue);width:18px;height:18px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:9px;color:var(--nk-on-accent)">TW</span>28.05.</div></div> </div> <div class="nk-board-col"> <div class="nk-board-col-header"><span class="nk-tag blue">In Arbeit</span><span class="count">1</span></div> <div class="nk-card"><div class="card-title">🎨 Design-System</div><div class="card-meta"><span class="nk-progress" style="width:70px"><i style="width:65%"></i></span></div></div> </div> <div class="nk-board-col"> <div class="nk-board-col-header"><span class="nk-tag green">Fertig</span><span class="count">1</span></div> <div class="nk-card"><div class="card-title">🚀 Roadmap</div><div class="card-meta">12.05.</div></div> </div> </div>
Auf kleinem Schirm:Die Spalten scrollen horizontal, statt zu stapeln – das Board bleibt ein Board.
.nk-board.nk-board-col.nk-board-col-header.count.nk-card.card-title.card-meta

Formulare & Einstellungen

PRD 5.6

Inputs, Textarea, Select .nk-input

Eine gemeinsame Form für alle drei. Der Fokusring ist color-mix(in srgb, var(--nk-accent) 25%, transparent) und färbt sich mit dem Akzent um. .wide füllt die Zeile.

html<div style="display:flex;flex-direction:column;gap:10px;max-width:340px"> <input class="nk-input wide" value="Ada Lovelace"> <select class="nk-select wide"><option>Hell</option><option>Dunkel</option><option>System</option></select> <textarea class="nk-textarea wide" placeholder="Ein paar Worte über dich …"></textarea> </div>
Auf kleinem Schirm:min-width: 210px kann eine schmale Feldzeile sprengen – mit .wide kombinieren oder nk-field umbrechen lassen.
.nk-input.nk-textarea.nk-select.wide

Buttons .nk-btn

Fünf Varianten. Hover ist bei gefüllten Buttons eine Deckkraft-Änderung, bei umrandeten ein Hintergrund-Hauch – nie ein Farbwechsel. .small lässt sich mit jeder Variante kombinieren.

html<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center"> <button class="nk-btn primary">Änderungen speichern</button> <button class="nk-btn secondary">Verwerfen</button> <button class="nk-btn danger">Löschen</button> <button class="nk-btn danger-solid">Löschen</button> <button class="nk-btn secondary small">Entfernen</button> </div>
Auf kleinem Schirm:Die Höhe liegt bei rund 30px, unter dem 44px-Touch-Ziel. Für Touch-Oberflächen das Padding anheben.
.nk-btn.primary.secondary.danger.danger-solid.small

Switch .nk-switch

Funktioniert auf zwei Wegen: als <input type="checkbox"> über :checked oder als <button role="switch"> über aria-checked="true". Die Button-Form ist der barrierefreie Standard.

Kompakte Ansicht
Reduziert Abstände in Sidebar und Listen.
Animationen reduzieren
html<div style="max-width:420px"> <div class="nk-field"><div><div class="f-label">Kompakte Ansicht</div><div class="f-desc">Reduziert Abstände in Sidebar und Listen.</div></div> <div class="f-control"><button class="nk-switch" role="switch" aria-checked="true"></button></div></div> <div class="nk-field"><div><div class="f-label">Animationen reduzieren</div></div> <div class="f-control"><button class="nk-switch" role="switch" aria-checked="false"></button></div></div> </div>
Auf kleinem Schirm:34×20px – die Trefferfläche vergrößern, indem die ganze nk-field-Zeile klickbar wird.
.nk-switch.aria-checked

Checkbox & Radio .nk-check

Dieselbe 16px-Box für beides; die Radio-Variante wird über [type="radio"] erkannt und wird zum Kreis mit Punkt. Die Marken sind ::after-Inhalte, keine Bilder.

html<div style="display:flex;gap:32px;flex-wrap:wrap"> <div> <label class="nk-check"><input type="checkbox" checked>Hell</label> <label class="nk-check"><input type="checkbox">Dunkel</label> </div> <div> <label class="nk-check"><input type="radio" name="nkdemo" checked>Hell</label> <label class="nk-check"><input type="radio" name="nkdemo">System</label> </div> </div>
Auf kleinem Schirm:Das Label umschließt das Input, die ganze Zeile ist also die Trefferfläche.
.nk-check

Slider .nk-slider

Ein natives Range-Input, eingefärbt per accent-color: var(--nk-accent) – kein eigenes Schienen-Markup, also bleiben Tastatur und Screenreader nativ. nk-slider-value ist die Anzeige.

Textgröße: 100 %
html<div><input class="nk-slider" type="range" min="80" max="140" value="100"> <div class="nk-slider-value">Textgröße: 100 %</div></div>
Auf kleinem Schirm:Die native Reglergröße liefert auf jeder Plattform eine bequeme Trefferfläche.
.nk-slider.nk-slider-value

Feld-Zeile .nk-field

Das Grundelement einer Einstellungszeile: Label und Beschreibung links, Bedienelement rechts, auseinandergeschoben per justify-content: space-between. Gestapelt ergeben sie ein ganzes Einstellungs-Pane.

Anzeigename
So wirst du im Workspace angezeigt.
E-Mail
html<div style="max-width:460px"> <div class="nk-field"><div><div class="f-label">Anzeigename</div><div class="f-desc">So wirst du im Workspace angezeigt.</div></div> <div class="f-control"><input class="nk-input" value="Ada Lovelace"></div></div> <div class="nk-field"><div><div class="f-label">E-Mail</div></div> <div class="f-control"><input class="nk-input" value="ada@acme.com"></div></div> </div>
Auf kleinem Schirm:Der 24px-Abstand hält beide Seiten getrennt; bei Bedarf selbst flex-wrap: wrap ergänzen, damit das Bedienelement eine eigene Zeile bekommt.
.nk-field.f-label.f-desc.f-control

Profil-Zeile .nk-profile-row

Ein 56px-Avatar mit zwei Aktionen daneben. Der Verlauf passt zu jedem anderen Avatar im System, weil alle dieselben zwei Decor-Tokens lesen.

AL
html<div class="nk-profile-row"> <div class="big-avatar">AL</div> <div style="display:flex;gap:8px;flex-wrap:wrap"> <button class="nk-btn secondary small">Bild hochladen</button> <button class="nk-btn secondary small">Entfernen</button> </div> </div>
Auf kleinem Schirm:Unverändert; auf sehr schmalen Schirmen rutschen die Buttons unter den Avatar.
.nk-profile-row.big-avatar

Modell-Karte .nk-model-card

Eine Radio-Gruppe als Karten. Die ausgewählte Karte mischt 6 % des Akzents in ihren Hintergrund und bekommt einen Akzent-Rahmen – beides abgeleitet und damit rebranding-fest.

Mona StandardEmpfohlen
Ausgewogenes Modell für den Arbeitsalltag. Schnell, ruhig, zuverlässig.
Mona Deep
Ausgewogenes Modell für den Arbeitsalltag. Schnell, ruhig, zuverlässig.
html<div style="max-width:460px"> <div class="nk-model-card selected"><div class="m-radio"></div><div> <div class="m-name">Mona Standard<span class="nk-tag green">Empfohlen</span></div> <div class="m-desc">Ausgewogenes Modell für den Arbeitsalltag. Schnell, ruhig, zuverlässig.</div></div></div> <div class="nk-model-card"><div class="m-radio"></div><div> <div class="m-name">Mona Deep</div><div class="m-desc">Ausgewogenes Modell für den Arbeitsalltag. Schnell, ruhig, zuverlässig.</div></div></div> </div>
Auf kleinem Schirm:Von Haus aus volle Breite; die Beschreibung bricht unter den Namen um.
.nk-model-card.selected.m-radio.m-name.m-desc

Gefahrenbereich .nk-danger-zone

Rahmen und Titel lesen --nk-danger; der Rahmen ist 40 % davon per color-mix() – es gibt kein zweites Rot, das synchron gehalten werden müsste.

⚠️ Gefahrenbereich
Löschen
Entfernt alle Seiten, Datenbanken und Mitglieder unwiderruflich.
html<div class="nk-danger-zone" style="margin-top:0;max-width:460px"> <div class="dz-title">⚠️ Gefahrenbereich</div> <div class="nk-field" style="padding-top:0"> <div><div class="f-label">Löschen</div><div class="f-desc">Entfernt alle Seiten, Datenbanken und Mitglieder unwiderruflich.</div></div> <div class="f-control"><button class="nk-btn danger-solid small">Löschen</button></div> </div> </div>
Auf kleinem Schirm:Unverändert.
.nk-danger-zone.dz-title

Mitglieder-Zeilen .nk-member-row

Zeilen, getrennt durch eine Haarlinie. Die Regel „letzte Zeile ohne Rahmen“ hängt am Container nk-member-list und hat einen ::slotted()-Zwilling – sie funktioniert also weiter, wenn ein künftiges Element die Zeilen projiziert.

AL
Ada Lovelace
ada@acme.com
TW
Tom Weber
tom@acme.com
html<div class="nk-member-list" style="max-width:460px"> <div class="nk-member-row"><span class="mini-avatar" style="background:var(--nk-decor-purple)">AL</span> <div><div>Ada Lovelace</div><div class="m-mail">ada@acme.com</div></div> <select class="nk-select"><option>Admin</option><option>Mitglied</option></select></div> <div class="nk-member-row"><span class="mini-avatar" style="background:var(--nk-decor-blue)">TW</span> <div><div>Tom Weber</div><div class="m-mail">tom@acme.com</div></div> <select class="nk-select"><option>Mitglied</option></select></div> </div>
Auf kleinem Schirm:Das Rollen-Select wird per margin-left:auto nach rechts geschoben; in schmalen Zeilen umbrechen lassen.
.nk-member-list.nk-member-row.m-mail

Overlays & Menüs

PRD 5.8

Popover-Basis .nk-pop

Die gemeinsame Fläche unter jedem schwebenden Panel: Seitenhintergrund, 10px Radius, der dreilagige Menü-Schatten. Die Positionierung übernimmt der Consumer – die Klasse liefert nur die Fläche.

Aktionen
✏️Umbenennen
html<div class="nk-pop" style="width:240px"> <div class="nk-menu-label">Aktionen</div> <div class="nk-menu-item"><span class="m-icon">✏️</span>Umbenennen</div> </div>
Auf kleinem Schirm:Feste 296px Breite. Auf dem Handy entweder verbreitern oder am Viewport-Rand verankern.
.nk-pop

Emoji-Picker .nk-emoji-grid

Ein achtspaltiges Raster in nk-pop, darüber ein Filterfeld, darunter eine ausgegraute Kategorieleiste. Kategorien leuchten beim Hovern oder mit .active auf.

🚀📊💡🎨📚🗂️🔍📥⚙️🧩🌙☀️📅👤💬
🕐😀🐶🍎🚗💡
html<div class="nk-pop"> <input class="nk-emoji-search" placeholder="Suche …"> <div class="nk-emoji-grid"> <span>🚀</span><span>📊</span><span>💡</span><span></span><span>🎨</span><span>📚</span><span>🗂️</span><span>🔍</span><span>📥</span><span>⚙️</span><span>🧩</span><span>🌙</span><span>☀️</span><span>📅</span><span>👤</span><span>💬</span> </div> <div class="nk-emoji-cats"><span class="active">🕐</span><span>😀</span><span>🐶</span><span>🍎</span><span></span><span>🚗</span><span>💡</span></div> </div>
Auf kleinem Schirm:Das Raster ist fließend; fix ist nur die 296px-Popover-Breite – also das Popover verbreitern, nicht das Raster.
.nk-emoji-search.nk-emoji-grid.nk-emoji-cats

Kontextmenü .nk-menu

nk-pop mit nk-menu kombinieren. Einträge nehmen links ein .m-icon und rechts ein .m-shortcut; .danger färbt einen Eintrag rot.

Seiten
✏️Umbenennen⌘⇧R
📄Duplizieren⌘D
🔗Link kopieren⌘L
🗑In den Papierkorb
html<div class="nk-pop nk-menu"> <div class="nk-menu-label">Seiten</div> <div class="nk-menu-item"><span class="m-icon">✏️</span>Umbenennen<span class="m-shortcut">⌘⇧R</span></div> <div class="nk-menu-item"><span class="m-icon">📄</span>Duplizieren<span class="m-shortcut">⌘D</span></div> <div class="nk-menu-item"><span class="m-icon">🔗</span>Link kopieren<span class="m-shortcut">⌘L</span></div> <div class="nk-menu-sep"></div> <div class="nk-menu-item danger"><span class="m-icon">🗑</span>In den Papierkorb</div> </div>
Auf kleinem Schirm:Kürzel sind auf Touch bedeutungslos – die .m-shortcut-Spans dort ausblenden.
.nk-menu.nk-menu-item.m-icon.m-shortcut.danger.nk-menu-sep.nk-menu-label

Befehlspalette .nk-cmdk

Eine ⌘K-Palette: Eingabezeile, gruppierte Liste, Fußzeile mit Tastenhinweisen. Die per Tastatur hervorgehobene Zeile trägt .selected – diese Klasse verschiebt dein Pfeiltasten-Handler.

🔍
Seiten
📊Projektübersicht
📚Wissensdatenbank
Aktionen
Neue Seite⌘N
⚙️Einstellungen öffnen⌘,
html<div class="nk-cmdk-backdrop open" style="position:absolute;padding-top:22px;border-radius:var(--nk-radius)"> <div class="nk-cmdk" style="width:min(460px, 92%)"> <div class="nk-cmdk-input-row"><span>🔍</span><input placeholder="Suchen oder Befehl eingeben …"></div> <div class="nk-cmdk-list"> <div class="nk-cmdk-group">Seiten</div> <div class="nk-cmdk-item selected"><span class="m-icon">📊</span>Projektübersicht</div> <div class="nk-cmdk-item"><span class="m-icon">📚</span>Wissensdatenbank</div> <div class="nk-cmdk-group">Aktionen</div> <div class="nk-cmdk-item"><span class="m-icon"></span>Neue Seite<span class="m-shortcut">⌘N</span></div> <div class="nk-cmdk-item"><span class="m-icon">⚙️</span>Einstellungen öffnen<span class="m-shortcut">⌘,</span></div> </div> <div class="nk-cmdk-footer"> <span><kbd class="nk-kbd"></kbd><kbd class="nk-kbd"></kbd> navigieren</span> <span><kbd class="nk-kbd"></kbd> öffnen</span> <span><kbd class="nk-kbd"></kbd><kbd class="nk-kbd">K</kbd> umschalten</span> </div> </div> </div>
Auf kleinem Schirm:Das padding-top des Backdrops fällt von 14vh auf 6vh, und die Palette verbreitert sich auf min(560px, 96vw) – sie füllt den Handyschirm, statt mittig zu schweben.
.nk-cmdk-backdrop.nk-cmdk.nk-cmdk-input-row.nk-cmdk-list.nk-cmdk-group.nk-cmdk-item.selected.nk-cmdk-empty.nk-cmdk-footer

Palette: keine Treffer .nk-cmdk-empty

Was die Liste zeigt, wenn der Filter nichts trifft. Die Eingabe zurückzitieren, damit sichtbar ist, wonach gesucht wurde.

🔍
Keine Ergebnisse für “xyzzy”
html<div class="nk-cmdk" style="box-shadow:none;border:1px solid var(--nk-border);width:min(460px,100%)"> <div class="nk-cmdk-input-row"><span>🔍</span><input value="xyzzy" placeholder="Suchen oder Befehl eingeben …"></div> <div class="nk-cmdk-list"><div class="nk-cmdk-empty">Keine Ergebnisse für “xyzzy”</div></div> </div>
Auf kleinem Schirm:Wie die Palette: volle Breite, reduziertes oberes Padding.
.nk-cmdk-empty

Toast .nk-toast

Unten mittig fixiert, invertiert (Textfarbe als Hintergrund). Er sitzt außerhalb des Bildes, bis .show ergänzt wird, und fährt dann hoch. pointer-events: none verhindert, dass er Klicks abfängt.

Einstellungen gespeichert
html<div class="nk-toast show" style="position:relative;bottom:auto;left:auto;transform:none;display:inline-flex"><span>Einstellungen gespeichert</span></div>
Auf kleinem Schirm:Per translateX(-50%) zentriert und bleibt es in jeder Breite.
.nk-toast.show

Kollaboration & KI

PRD 5.10

Kommentar-Faden .nk-comments

Ein Faden an einer linken Linie, wie er neben einem Absatz stehen würde. Jeder Kommentar besteht aus Avatar, Kopf (Name und Zeit) und Rumpf.

SL
Sara Lindt · vor 1 Std.
Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍
html<div class="nk-comments" style="max-width:420px"> <div class="nk-comment"> <span class="mini-avatar" style="background:var(--nk-decor-purple)">SL</span> <div><div class="c-head"><b>Sara Lindt</b> · vor 1 Std.</div><div class="c-body">Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍</div></div> </div> <div class="nk-comment-input"> <input class="nk-input" placeholder="Kommentieren …"><button class="nk-btn primary small">Senden</button> </div> </div>
Auf kleinem Schirm:Die 18px-Einrückung bleibt; auf schmalen Schirmen den Faden unter den Absatz setzen statt daneben.
.nk-comments.nk-comment.c-head.c-body.nk-comment-input

KI-Faden .nk-ai-thread

Ein Assistenten-Gespräch als Teil des Dokuments, kein schwebendes Widget. .user gibt der Nachricht den Verlauf-Avatar; der Assistent behält den neutralen Callout-Kreis. Die Eingabezeile leuchtet bei :focus-within auf.

AL
Du
Fasse die offenen Aufgaben dieses Projekts zusammen.
🤖
Mona · KI
Zwei Aufgaben sind offen: Die Tabellen-Ansicht steht bei 65 %, das Board mit Drag-and-Drop ist geplant.
html<div style="max-width:460px"> <div class="nk-ai-thread"> <div class="nk-ai-msg user"> <span class="mini-avatar">AL</span> <div><div class="a-name">Du</div><div class="a-body">Fasse die offenen Aufgaben dieses Projekts zusammen.</div></div> </div> <div class="nk-ai-msg"> <span class="mini-avatar">🤖</span> <div><div class="a-name">Mona <span>· KI</span></div> <div class="a-body">Zwei Aufgaben sind offen: Die Tabellen-Ansicht steht bei 65 %, das Board mit Drag-and-Drop ist geplant.</div> <div class="nk-ai-actions"><button>📋 Kopieren</button><button>↻ Neu formulieren</button></div></div> </div> </div> <div class="nk-ai-input-row"> <input placeholder="Mona etwas fragen …"><button class="nk-ai-send"></button> </div> </div>
Auf kleinem Schirm:Fließt natürlich. Die Eingabezeile ist eine flex-Zeile mit fixem 26px-Sendeknopf.
.nk-ai-thread.nk-ai-msg.user.a-name.a-body.nk-ai-actions.nk-ai-input-row.nk-ai-send

Editor-Adapter

PRD 5.11

Block-Host .nk-block-host

Die optische Hülle, in die ein Editor eingehängt wird. Sie liefert den Hover-Hauch, den Fokusring bei :focus-within, einen Platz für ein Drag-Handle links der Spalte und .nk-drop-target für Drag-Rückmeldung. Sie ist bewusst funktionsfrei.

Leitidee: Ein Callout trägt genau einen Gedanken, der nicht übersehen werden darf. Ein bis zwei Sätze reichen.
Tippe „/“ für Befehle …

Diese Vorschau ist nur die statische Hülle – die + / ⠿-Leiste hier tut nichts. Die funktionierende Fassung mit Slash-Menü, Drag & Drop und Blockmenü ist der Live-Editor in der Doku.

html<div style="padding-left:48px;max-width:460px"> <div class="nk-block-host"> <div class="nk-block-actions show" style="top:6px;left:-46px;pointer-events:none" aria-hidden="true"><button type="button" tabindex="-1"></button><button type="button" class="drag" tabindex="-1"></button></div> <div style="padding:4px 2px;line-height:1.6">Leitidee: Ein Callout trägt genau einen Gedanken, der nicht übersehen werden darf. Ein bis zwei Sätze reichen.</div> </div> <div class="nk-block-host nk-drop-target"> <span class="nk-block-handle"></span> <div style="padding:4px 2px;color:var(--nk-text-tertiary)">Tippe „/“ für Befehle …</div> </div> </div>
Auf kleinem Schirm:Das Handle sitzt bei left: -26px, außerhalb der Spalte. Auf schmalen Schirmen ausblenden und stattdessen ein Long-Press-Menü nutzen.
.nk-block-host.nk-block-handle.nk-block-actions.nk-drop-target

Slash-Menü & Bubble-Toolbar .nk-slash-menu

Gib den schwebenden Containern deines Editors diese Klassen, und sie erben die NotionKit-Popover-Optik. Dieselben Regeln greifen in einem Block-Host auch auf .bn-suggestion-menu und .tippy-box – TipTap und BlockNote brauchen also kein Zusatz-Markup.

Basis-Blöcke
H1
Überschrift 1
Große Abschnitts-Überschrift
To-do-Liste
Aufgaben mit Checkbox verfolgen
</>
Code-Block
Ein Snippet festhalten

Statisches Markup für die Optik. Die lebende, tastaturgesteuerte Fassung läuft im Doku-Editor – dort / tippen.

html<div style="display:flex;gap:20px;flex-wrap:wrap;align-items:flex-start"> <div class="nk-slash-menu" style="box-shadow:none;border:1px solid var(--nk-border)"> <div class="nk-slash-menu-label">Basis-Blöcke</div> <div class="nk-slash-item selected"><span class="m-icon">H1</span><div><div>Überschrift 1</div><div class="m-desc">Große Abschnitts-Überschrift</div></div></div> <div class="nk-slash-item"><span class="m-icon"></span><div><div>To-do-Liste</div><div class="m-desc">Aufgaben mit Checkbox verfolgen</div></div></div> <div class="nk-slash-item"><span class="m-icon">&lt;/&gt;</span><div><div>Code-Block</div><div class="m-desc">Ein Snippet festhalten</div></div></div> </div> <div class="nk-bubble-menu" style="box-shadow:none;border:1px solid var(--nk-border)"> <button class="active"><b>B</b></button><button><i>I</i></button><button><s>S</s></button><button>&lt;/&gt;</button><button>🔗</button> </div> </div>
Auf kleinem Schirm:Feste 280px Breite. Auf dem Handy am Viewport-Rand verankern statt am Cursor.
.nk-slash-menu.nk-slash-menu-label.nk-slash-item.selected.nk-bubble-menu