notionkit.css auf dem Dokument laden und class="nk-body" auf <body> setzen. Die Shadow Roots erben Schrift, Farbe und den Scoped Reset von dort; die Elemente bringen kein eigenes visuelles CSS mit. Das Bundle injiziert zusätzlich die Design-Tokens als Cascade Layer (@layer notionkit-defaults): Eine Seite ohne Stylesheet rendert trotzdem, und jedes eigene, unlayered :root { --nk-* } gewinnt.
Jeder <nk-*>-Host ist display: contents: Er erzeugt keine eigene Box, das innere .nk-*-Element nimmt also genau dort am Eltern-Layout teil, wo es das Klassen-Markup täte – ein Button bleibt inline, eine Sidebar ist direktes Flex-Kind der App, Baumzeile und Kinder-Box sind Geschwister. Das ist der Grund, warum die Pixel-Parität hält. Konsequenz: das Elternelement (oder die Tokens) stylen, nicht den Host; hidden am Host funktioniert weiter; getBoundingClientRect() eines Hosts ist leer.
<!-- ✓ spacing on a wrapper you own -->
<divstyle="margin-top:16px"><nk-btnvariant="primary">Speichern</nk-btn></div>
<!-- ✗ the host has no box; this margin does nothing -->
<nk-btnstyle="margin-top:16px" variant="primary">Speichern</nk-btn>
Theming & Branding
data-theme="light|dark" auf <html> setzen – nirgends sonst. Ein Observer spiegelt es in jedes Element. Zum Rebranding Tokens auf :root in einem normalen Stylesheet deklarieren: Jedes Element folgt, in beiden Themes.
Formular-Controls sind form-associated Custom Elements: In einem <form> erscheinen sie in FormData, folgen reset, respektieren required und <fieldset disabled>. Außerhalb eines Formulars funktionieren value und Events weiter, aber nichts wird abgeschickt.
Elemente, die ihre Kinder kopieren (nk-select-Optionen, Breadcrumb-Einträge), beobachten sie per MutationObserver – ein Framework, das Kinder austauscht, hält das Element synchron. element.refresh() ist der Notausgang. Der leere String ist ein gültiger Wert.
const sel = document.querySelector('nk-select');
sel.innerHTML = roles.map(r => `<optionvalue="${r.id}">${r.name}</option>`).join('');
// the shadow <select> follows; sel.value is preserved when the option still exists
Icons übergeben
::slotted() trifft nur den zugewiesenen Knoten selbst. Ein Icon als direktes Kind mit Slot-Namen übergeben – nie in einen Container verpackt.
<!-- ✓ the icon is the slotted node -->
<nk-callout><spanslot="icon">📌</span>…</nk-callout>
<!-- ✗ wrapped: ::slotted() cannot reach the inner node -->
<nk-callout><spanslot="icon"><em>📌</em></span>…</nk-callout>
Overlays
nk-modal, nk-cmdk und nk-toast direkt unter <body> platzieren. In einem transformierten oder clippenden Container ist ein fixed Overlay gefangen.
Editor
NotionKit liefert keinen Editor. nk-block-host ist die optische Hülle; TipTap wird mit dem Rezept unten in ein Light-DOM-.nk-block-host gemountet (die Demo-App nutzt genau diese Datei). <nk-editor>, ein dünner TipTap-Wrapper, folgt in v1.1 als optionaler Import – nie Teil des Core-Bundles.
<!-- the shell: hover wash, focus ring, drag handle -->
<divclass="nk-block-host" id="editor">
<p>Server-rendered content becomes the initial document.</p>
</div>
<!-- the recipe: TipTap + slash menu + bubble menu + block handle (docs-editor.js) -->
<scripttype="module" src="../docs-editor.js"></script>
Rendert button.nk-btn, mit href ein a.nk-btn. Modifikator-Klassen werden Attribute. Ein geslottetes <svg> bekommt seine Größe aus dem Stylesheet – direkt übergeben, nie verpackt.
Ein natives <input> im Shadow Root, per ElementInternals ins umgebende Formular eingebunden: FormData, Reset und required-Validierung funktionieren wie beim nackten Input.
Auf kleinem Schirm:Mindestbreite 210px; wide füllt die Zeile.
Ersetzt.nk-input.wide
<nk-textarea> Textbereich
Mehrzeiliges Geschwister von nk-input. Startwert ist das value-Attribut oder der Textinhalt des Elements.
Welle 1
<nk-textareaname="bio" rows="3" placeholder="Ein Satz über dich"></nk-textarea>
<textareaclass="nk-textarea" name="bio" rows="3" placeholder="Ein Satz über dich"></textarea>
Attribute
Attribut
Typ
Standard
Beschreibung
value
string
–
Aktueller Wert.
placeholder
string
–
Platzhaltertext.
rows
number
–
Sichtbare Zeilen.
name
string
–
Name des Formularfelds (FormData-Schlüssel).
disabled
boolean
–
Deaktiviert das Control.
required
boolean
–
Pflichtfeld.
wide
boolean
–
Volle Breite.
Slots
Slot
Beschreibung
(default)
Starttext (wenn kein value gesetzt ist).
Events
Event
detail
Beschreibung
nk-change
{ value, name }
Beim Übernehmen.
nk-input
{ value, name }
Bei jedem Tastendruck.
Auf kleinem Schirm:Nur vertikal veränderbar; wide füllt die Zeile.
Ersetzt.nk-textarea.wide
<nk-select> Auswahlfeld
Light-DOM-<option>- und <optgroup>-Kinder werden in das Shadow-<select> kopiert und bleiben synchron, wenn ein Framework sie austauscht. Der leere String ist ein gültiger Wert; ein value ohne passende Option lässt die Auswahl unangetastet.
120px Mindestbreite (.compact), z. B. in einer Mitgliederzeile.
Slots
Slot
Beschreibung
(default)
<option>-/<optgroup>-Kinder – nur direkte Kinder.
Events
Event
detail
Beschreibung
nk-change
{ value, name }
Bei Auswahl.
Properties:valueselectedIndexoptions
Methoden:refresh()
Auf kleinem Schirm:Nutzt den nativen Picker der Plattform (color-scheme folgt dem Theme).
Ersetzt.nk-select.compact
<nk-switch> Schalter
Rendert button.nk-switch[role=switch]; das Stylesheet steuert den Knopf über aria-checked, das Element übernimmt das Umschalten. Sendet value (Standard on) wenn eingeschaltet, sonst nichts – wie eine Checkbox.
Auf kleinem Schirm:Zeilenhöhe ~24px; die ganze Beschriftung ist Trefferfläche.
Ersetzt.nk-check
<nk-radio> Radio
Gleiche Optik wie nk-check mit rundem Mark. Radios mit gleichem name im selben Tree und Formular bilden eine Gruppe – auch über Shadow-Grenzen, was native Radios nicht können. Ein Tab-Stop pro Gruppe; Pfeiltasten wandern, springen um und überspringen deaktivierte. Ein nk-radio-group gibt es bewusst nicht.
Ein Gedanke, der nicht untergehen darf. Das Icon kommt aus dem icon-Attribut oder einem slot="icon"-Knoten – der Knoten selbst, nie verpackt.
Welle 1
Core idea: Ein Callout trägt einen Gedanken, der nicht untergehen darf.
💡
Core idea: Ein Callout trägt einen Gedanken, der nicht untergehen darf.
<nk-callouticon="💡"><b>Core idea:</b> Ein Callout trägt einen Gedanken, der nicht untergehen darf.</nk-callout>
<divclass="nk-callout"><spanclass="c-icon">💡</span><div><b>Core idea:</b> Ein Callout trägt einen Gedanken, der nicht untergehen darf.</div></div>
Attribute
Attribut
Typ
Standard
Beschreibung
icon
string
💡
Emoji- oder Text-Icon.
Slots
Slot
Beschreibung
(default)
Inhalt.
icon
Icon-Knoten (z. B. <span slot="icon">📌</span>).
Events
keine
Auf kleinem Schirm:Unverändert; bricht mit dem Text um.
Ersetzt.nk-callout.c-icon
<nk-divider> Trennlinie
Eine Haarlinie als <hr> mit Blockabstand.
Welle 1
<nk-divider></nk-divider>
<hrclass="nk-divider">
Attribute
keine
Slots
keine
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-divider
<nk-heading> Überschrift
Eine Abschnittsüberschrift. level wählt das echte Heading-Element (h1–h4), damit die Dokumentstruktur stimmt.
Welle 1
Abschnittsüberschrift
Abschnittsüberschrift
<nk-heading>Abschnittsüberschrift</nk-heading>
<h2class="nk-heading">Abschnittsüberschrift</h2>
Attribute
Attribut
Typ
Standard
Beschreibung
level
1 | 2 | 3 | 4
2
Überschriften-Ebene.
Slots
Slot
Beschreibung
(default)
Text.
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-heading
<nk-toggle> Toggle-Block
Ein <details>-Block. Die Summary wird im Element gerendert (ihr Marker ist ein Pseudo-Element und auf geslottetem Inhalt nicht stylbar); der Inhalt wird geslottet.
Welle 1
Hier steht der eingeklappte Inhalt.
Details
Hier steht der eingeklappte Inhalt.
<nk-togglelabel="Details" open>Hier steht der eingeklappte Inhalt.</nk-toggle>
<detailsclass="nk-toggle" open><summary>Details</summary><divclass="toggle-body">Hier steht der eingeklappte Inhalt.</div></details>
Attribute
Attribut
Typ
Standard
Beschreibung
label
string
–
Summary-Text.
open
boolean
–
Aufgeklappt, in beide Richtungen gespiegelt.
Slots
Slot
Beschreibung
(default)
Eingeklappter Inhalt.
label
Formatierte Summary.
Events
Event
detail
Beschreibung
nk-toggle
{ open }
Beim Auf-/Zuklappen.
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-toggle.toggle-body
<nk-todo> To-do
Checkbox-Zeile, durchgestrichen wenn erledigt. Formular-fähig wie nk-check.
Vorformatierter Block mit Sprach-Badge. Whitespace bleibt wie geschrieben; < als < maskieren. Mit highlight werden HTML-Tags und -Attribute eingefärbt.
Auf kleinem Schirm:Scrollt horizontal statt umzubrechen.
Ersetzt.nk-code.lang.tag.attr
<nk-quote> Zitat
Ein Blockzitat mit optionaler Quellenzeile.
Welle 1
Die beste Oberfläche ist die, die aus dem Weg geht.
Die beste Oberfläche ist die, die aus dem Weg geht.Unbekannt
<nk-quotecite="Unbekannt">Die beste Oberfläche ist die, die aus dem Weg geht.</nk-quote>
<blockquoteclass="nk-quote">Die beste Oberfläche ist die, die aus dem Weg geht.<citeclass="q-cite">Unbekannt</cite></blockquote>
Attribute
Attribut
Typ
Standard
Beschreibung
cite
string
–
Quellenangabe.
Slots
Slot
Beschreibung
(default)
Zitattext.
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-quote.q-cite
App-Gerüst & Navigation
Welle 2
<nk-app> App-Shell
Das äußerste Element einer Workspace-App: eine flex-Zeile über die volle Höhe mit dem Sidebar-Slot links und main.nk-main rechts. Alles im Default-Slot – nk-topbar, nk-page – wird Flex-Kind der Hauptspalte.
Auf kleinem Schirm:Unter 860px ist die Sidebar verborgen; als Schublade öffnen mit sidebar.open = true.
Ersetzt.nk-app.nk-main
<nk-sidebar> Sidebar
Die linke Leiste: Workspace-Slot oben, ein scrollender Default-Slot für den Baum, ein fixierter Footer-Slot. Footer-Einträge bekommen automatisch compact (26px-Zeilen). Der Host ist display: contents, das aside also direktes Flex-Kind der App – wie im Klassen-Markup.
Die Zeile ganz oben in der Sidebar. Ein Klick schaltet open und zeigt den Inhalt des menu-Slots darunter (ein nk-menu ab Welle 4); Klick außerhalb und Escape schließen.
Container für nk-tree-items: hält genau einen Eintrag active (hört nk-select in jeder Tiefe), gibt dem Baum einen Tab-Stop mit Pfeiltasten-Navigation (↑↓ bewegen, → klappt auf oder steigt ein, ← klappt zu oder steigt aus, Home/End) und rendert Einträge aus tree.data. tree.value ist nur lesbar – programmatisch wählen mit item.select() oder dem active-Attribut. Abschnittsbeschriftungen dürfen zwischen den Einträgen stehen; ihr + feuert nk-action { action: 'add' } ohne Wert.
Auf kleinem Schirm:Zeilen sind 28px; in einer Touch-Schublade die Trefferfläche selbst vergrößern.
Ersetzt
<nk-tree-item> Baum-Eintrag
Eine Zeile des Seitenbaums – samt Kinder-Box. Textinhalt ist das Label, verschachtelte nk-tree-items sind die Kinder (nur dann erscheint der Pfeil), slot="icon" und slot="end" landen dort. Hover-Aktionen +/⋯ melden sich über nk-action; ein Klick feuert nk-select (abbrechbar). Außerhalb eines nk-tree (Sidebar-Footer) setzt sich ein Eintrag beim Klick selbst active, sofern das Event nicht abgebrochen wird.
Die 45px-Leiste über der Seite: Breadcrumb im Default-Slot, Buttons im actions-Slot (rechtsbündig). Dort nk-btn variant="topbar" / "share" und nk-theme-toggle verwenden.
Welle 2
📊 Projektübersicht🚀 NotionKit MVPZuletzt bearbeitet vor 2 Min.Teilen⭐
Als Kinder einfache <span> oder <a>; sie werden mit Trennern in die Leiste geklont, das letzte (oder das Kind mit current-Attribut) ist das aktuelle. Textänderungen sowie neue oder entfernte Kinder werden automatisch übernommen (refresh() nur für das, was der Observer nicht sieht). Ein Klick feuert nk-select und reicht den Klick an das Original weiter – Links navigieren genau einmal.
Crumb-Kinder (nur direkte Kinder, ohne slot-Attribut).
Events
Event
detail
Beschreibung
nk-select
{ index, value, label, href, current }
Crumb geklickt; preventDefault() unterbindet den weitergereichten Klick.
Methoden:refresh()
Auf kleinem Schirm:Bleibt einzeilig; Einträge kurz halten.
Ersetzt.nk-breadcrumb.crumb.sep.current
<nk-theme-toggle> Theme-Umschalter
Der ☀️/🌙-Button. Schaltet data-theme auf <html>, merkt sich die Wahl in localStorage, wendet beim ersten Connect eine gespeicherte oder die System-Präferenz an, wenn <html> noch kein Theme trägt, und akzeptiert postMessage({ nkTheme }) einer Elternseite. apply(theme) tut alles, was ein Klick tut: setzen, merken, nk-change feuern.
Die Dokumentspalte: scrollender Wrapper, optionales Cover, die 760px-Seite mit 64px Seitenabstand und das Seiten-Icon (hier gerendert, weil sein Slot-Zwilling am Elternelement hängt). narrow lässt den Scroll-Wrapper weg, wenn die Seite selbst das Dokument ist.
Welle 3
<divstyle="display:flex;flex-direction:column;height:100%"><nk-pageicon="🚀" cover>
<nk-page-title>NotionKit MVP</nk-page-title>
<nk-page-actions><span>👤 Marcel Karas</span><span>📅 Erstellt am 12. Mai 2026</span><span>🏷️ <nk-tagcolor="purple">Designsystem</nk-tag></span></nk-page-actions>
<pclass="lead">Eine ruhige, dokumentzentrierte Workspace-App – nur aus Elementen gebaut.</p>
</nk-page></div>
<divstyle="display:flex;flex-direction:column;height:100%"><divclass="nk-page-scroll"><divclass="nk-cover"></div><divclass="nk-page">
<divclass="nk-page-icon">🚀</div>
<h1class="nk-page-title">NotionKit MVP</h1>
<divclass="nk-page-meta"><span>👤 Marcel Karas</span><span>📅 Erstellt am 12. Mai 2026</span><span>🏷️ <spanclass="nk-tag purple">Designsystem</span></span></div>
<pclass="lead">Eine ruhige, dokumentzentrierte Workspace-App – nur aus Elementen gebaut.</p>
</div></div></div>
Attribute
Attribut
Typ
Standard
Beschreibung
icon
string
–
Seiten-Emoji; Klick feuert nk-action.
cover
boolean
–
Token-Gradient-Cover zeigen.
narrow
boolean
–
Ohne Scroll-Wrapper (Landing-/Doku-Seite).
Slots
Slot
Beschreibung
(default)
Titel, Meta, Blöcke – ein <p class="lead"> wird zum Vorspann.
cover
Ein nk-page-cover (statt des cover-Attributs).
icon
Eigener Icon-Knoten.
Events
Event
detail
Beschreibung
nk-action
{ action: 'icon', value }
Icon geklickt (Emoji-Picker öffnen).
Auf kleinem Schirm:Seitenabstand sinkt unter 860px auf 24px.
Auf kleinem Schirm:Unverändert; lange Titel brechen um.
Ersetzt.nk-page-title
<nk-page-actions> Seiten-Metazeile
Die ruhige Zeile unter dem Titel: Besitzer, Datum, Tags – beliebiger Inline-Inhalt mit 16px Abstand.
Welle 3
👤 Marcel Karas📅 Erstellt am 12. Mai 2026🏷️ Designsystem
👤 Marcel Karas📅 Erstellt am 12. Mai 2026🏷️ Designsystem
<nk-page-actions><span>👤 Marcel Karas</span><span>📅 Erstellt am 12. Mai 2026</span><span>🏷️ <nk-tagcolor="purple">Designsystem</nk-tag></span></nk-page-actions>
<divclass="nk-page-meta"><span>👤 Marcel Karas</span><span>📅 Erstellt am 12. Mai 2026</span><span>🏷️ <spanclass="nk-tag purple">Designsystem</span></span></div>
Attribute
keine
Slots
Slot
Beschreibung
(default)
Meta-Einträge.
Events
keine
Auf kleinem Schirm:Bricht natürlich um.
Ersetzt.nk-page-meta
<nk-block-host> Block-Hülle
Die optische Hülle für Editor-Inhalt: Hover-Fläche, Fokusring, Drop-Target-Linie, optionaler Drag-Griff. Verhaltensneutral – den Editor ins Light DOM mounten; nk-editor (v1.1) übernimmt das für TipTap.
Welle 3
Hier steht Block-Inhalt – klicken zum Fokussieren.
⠿
Hier steht Block-Inhalt – klicken zum Fokussieren.
<nk-block-host handle><pstyle="margin:0" contenteditable="true">Hier steht Block-Inhalt – klicken zum Fokussieren.</p></nk-block-host>
<divclass="nk-block-host"><spanclass="nk-block-handle">⠿</span><pstyle="margin:0" contenteditable="true">Hier steht Block-Inhalt – klicken zum Fokussieren.</p></div>
Attribute
Attribut
Typ
Standard
Beschreibung
handle
boolean
–
Drag-Griff ⠿ rendern (bei Hover sichtbar).
drop-target
boolean
–
Drop-Indikator-Linie über dem Block.
Slots
Slot
Beschreibung
(default)
Block-Inhalt / Editor-Wurzel.
Events
keine
Auf kleinem Schirm:Der Griff sitzt 26px links der Spalte und ist ohne Platz verborgen.
Eine getönte Hinweiszeile. Der Farb-Modifikator wird variant; ein Aktions-Link kommt in slot="action" und sitzt am rechten Rand.
Welle 3
ℹ️ Diese Seite ist eine Komponenten-Vorschau – jedes Element folgt denselben Design-Tokens.Palette öffnen⚠️ Die Datenbank „Projektübersicht“ hat 2 überfällige Einträge.Ansehen✓ Alle Änderungen wurden synchronisiert.
ℹ️ Diese Seite ist eine Komponenten-Vorschau – jedes Element folgt denselben Design-Tokens.Palette öffnen
⚠️ Die Datenbank „Projektübersicht“ hat 2 überfällige Einträge.Ansehen
✓ Alle Änderungen wurden synchronisiert.
<nk-bannervariant="info">ℹ️ <span>Diese Seite ist eine <b>Komponenten-Vorschau</b> – jedes Element folgt denselben Design-Tokens.</span><spanslot="action">Palette öffnen</span></nk-banner>
<nk-bannervariant="warning">⚠️ <span>Die Datenbank „Projektübersicht“ hat 2 überfällige Einträge.</span><spanslot="action">Ansehen</span></nk-banner>
<nk-bannervariant="success">✓ <span>Alle Änderungen wurden synchronisiert.</span></nk-banner>
<divclass="nk-banner info">ℹ️ <span>Diese Seite ist eine <b>Komponenten-Vorschau</b> – jedes Element folgt denselben Design-Tokens.</span><spanclass="b-action">Palette öffnen</span></div>
<divclass="nk-banner warning">⚠️ <span>Die Datenbank „Projektübersicht“ hat 2 überfällige Einträge.</span><spanclass="b-action">Ansehen</span></div>
<divclass="nk-banner success">✓ <span>Alle Änderungen wurden synchronisiert.</span></div>
Attribute
Attribut
Typ
Standard
Beschreibung
variant
info | success | warning
–
Farbpaar.
Slots
Slot
Beschreibung
(default)
Icon und Text.
action
Aktions-Link (unterstrichen, rechts).
Events
keine
Auf kleinem Schirm:Bricht um; die Aktion rutscht bei Bedarf unter den Text.
Ersetzt.nk-banner.info.success.warning.b-action
<nk-empty> Leerzustand
Gestrichelte Box mit Icon, Titel, Beschreibung und der Aktion, die du hineinslottest.
Welle 3
+ Neuer Eintrag
🗂️
Noch keine Einträge
Lege den ersten Eintrag an oder importiere Daten.
<nk-emptyicon="🗂️" title="Noch keine Einträge" desc="Lege den ersten Eintrag an oder importiere Daten."><nk-btnvariant="primary" small>+ Neuer Eintrag</nk-btn></nk-empty>
<divclass="nk-empty"><divclass="e-icon">🗂️</div><divclass="e-title">Noch keine Einträge</div><divclass="e-desc">Lege den ersten Eintrag an oder importiere Daten.</div><buttonclass="nk-btn primary small">+ Neuer Eintrag</button></div>
Attribute
Attribut
Typ
Standard
Beschreibung
icon
string
–
Emoji.
title
string
–
Titel.
desc
string
–
Beschreibung.
Slots
Slot
Beschreibung
(default)
Handlungsaufforderung.
icon
Formatiertes Icon.
title
Formatierter Titel.
desc
Formatierte Beschreibung.
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-empty.e-icon.e-title.e-desc
<nk-skeleton> Skelett
Schimmernde Platzhalterzeilen. lines rendert mehrere; widths gibt jeder ihre Breite.
Eine Tab-Leiste mit Panels. nk-tab-Kinder sind die Tabs; Elemente mit slot="panel" und passendem data-tab die Panels – die Tabs verbergen per hidden alle bis auf das aktive. Pfeiltasten wechseln.
Welle 3
📝 Notizen✅ Aufgaben📎 Dateien
Freie Notizen zum Projekt – Protokolle, Ideen, Entwürfe.
Aufgaben zu diesem Projekt, verknüpft mit der Datenbank.
Angehängte Dateien und Exporte.
📝 Notizen✅ Aufgaben📎 Dateien
Freie Notizen zum Projekt – Protokolle, Ideen, Entwürfe.
<nk-tabsvalue="notes">
<nk-tabvalue="notes">📝 Notizen</nk-tab>
<nk-tabvalue="tasks">✅ Aufgaben</nk-tab>
<nk-tabvalue="files">📎 Dateien</nk-tab>
<divslot="panel" data-tab="notes" class="nk-tab-panel">Freie Notizen zum Projekt – Protokolle, Ideen, Entwürfe.</div>
<divslot="panel" data-tab="tasks" class="nk-tab-panel">Aufgaben zu diesem Projekt, verknüpft mit der Datenbank.</div>
<divslot="panel" data-tab="files" class="nk-tab-panel">Angehängte Dateien und Exporte.</div>
</nk-tabs>
<divclass="nk-tabs">
<spanclass="nk-tab active">📝 Notizen</span>
<spanclass="nk-tab">✅ Aufgaben</span>
<spanclass="nk-tab">📎 Dateien</span>
</div>
<divclass="nk-tab-panel">Freie Notizen zum Projekt – Protokolle, Ideen, Entwürfe.</div>
Attribute
Attribut
Typ
Standard
Beschreibung
value
string
–
Aktiver Tab-Wert (Standard: Tab mit active, sonst der erste).
Slots
Slot
Beschreibung
(default)
nk-tab-Kinder.
panel
Panels mit data-tab.
Events
Event
detail
Beschreibung
nk-change
{ value }
Aktiver Tab gewechselt.
nk-select
{ value, label }
Vom geklickten Tab.
Properties:value
Auf kleinem Schirm:Leiste bleibt einzeilig; Labels kurz halten.
Ersetzt.nk-tabs.nk-tab.active.nk-tab-panel
<nk-tab> Tab
Ein Tab von nk-tabs. Alleinstehend schaltet er sein eigenes active.
Einfache <button value>-Kinder bleiben im Light DOM (die Slot-Zwillinge des Stylesheets formen sie); das Element bewegt .active, behandelt Pfeiltasten und sendet value mit dem Formular.
<nk-stats><nk-statlabel="Aktive Seiten" value="128" delta="▲ 12 diese Woche" trend="up"></nk-stat></nk-stats>
<divclass="nk-stats"><divclass="nk-stat"><divclass="s-label">Aktive Seiten</div><divclass="s-value">128</div><divclass="s-delta up">▲ 12 diese Woche</div></div></div>
Attribute
Attribut
Typ
Standard
Beschreibung
label
string
–
Label.
value
string
–
Wert.
delta
string
–
Trendtext.
trend
up | down
–
Delta-Farbe.
Slots
Slot
Beschreibung
label
Formatiertes Label.
value
Formatierter Wert.
delta
Formatiertes Delta (mit class="up" / "down").
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-stat
<nk-avatar-group> Avatar-Gruppe
Überlappende .mini-avatar-Kinder (Light DOM, gestylt durch die Slot-Zwillinge) plus eine „Mehr“-Blase aus dem Attribut.
Welle 3
MKSLTW5 Personen haben Zugriff
MKSLTW+2
5 Personen haben Zugriff
<divstyle="display:flex;align-items:center;gap:12px"><nk-avatar-groupmore="+2"><spanclass="mini-avatar" style="background:linear-gradient(135deg,#9065b0,#529cca)">MK</span><spanclass="mini-avatar" style="background:#448361">SL</span><spanclass="mini-avatar" style="background:#d9730d">TW</span></nk-avatar-group><spanstyle="font-size:12.5px;color:var(--nk-text-tertiary)">5 Personen haben Zugriff</span></div>
<divstyle="display:flex;align-items:center;gap:12px"><divclass="nk-avatar-group"><spanclass="mini-avatar" style="background:linear-gradient(135deg,#9065b0,#529cca)">MK</span><spanclass="mini-avatar" style="background:#448361">SL</span><spanclass="mini-avatar" style="background:#d9730d">TW</span><spanclass="mini-avatar more">+2</span></div><spanstyle="font-size:12.5px;color:var(--nk-text-tertiary)">5 Personen haben Zugriff</span></div>
Eine Radio-artige Karte. Karten mit gleichem name bilden eine Gruppe; die gewählte sendet value mit dem Formular.
Welle 3
Mona Pro
Am besten für lange Dokumente und Recherche.
Mona Fast
Schnelle Antworten, geringere Kosten.
<nk-model-cardname="model" value="pro" title="Mona Pro" desc="Am besten für lange Dokumente und Recherche." selected></nk-model-card>
<nk-model-cardname="model" value="fast" title="Mona Fast" desc="Schnelle Antworten, geringere Kosten."></nk-model-card>
<divclass="nk-model-card selected"><divclass="m-radio"></div><div><divclass="m-name">Mona Pro</div><divclass="m-desc">Am besten für lange Dokumente und Recherche.</div></div></div>
<divclass="nk-model-card"><divclass="m-radio"></div><div><divclass="m-name">Mona Fast</div><divclass="m-desc">Schnelle Antworten, geringere Kosten.</div></div></div>
<nk-danger-zonetitle="Gefahrenzone"><nk-fieldlabel="Workspace löschen" desc="Das Löschen des Workspace entfernt alle Seiten."><nk-btnvariant="danger-solid" small>Löschen</nk-btn></nk-field></nk-danger-zone>
<divclass="nk-danger-zone"><divclass="dz-title">Gefahrenzone</div><divclass="nk-field"><div><divclass="f-label">Workspace löschen</div><divclass="f-desc">Das Löschen des Workspace entfernt alle Seiten.</div></div><divclass="f-control"><buttonclass="nk-btn danger-solid small">Löschen</button></div></div></div>
Attribute
Attribut
Typ
Standard
Beschreibung
title
string
–
Rote Überschrift.
Slots
Slot
Beschreibung
(default)
Felder und Buttons.
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-danger-zone.dz-title
<nk-member-list> Mitgliederliste
Zeilen aus nk-member-row; die Liste markiert die letzte Zeile, damit ihr unterer Rand entfällt. Jede Zeile zeigt Avatar (Initialen + color), Name, Mail und ein slot="role"-Control rechts.
Das Einstellungs-Overlay: Backdrop, ein 960×640-Dialog mit Nav- und Inhaltsspalte. Die Nav-Zeilen rendert das Modal aus label/icon/group der Panes, sodass 27px-Zeilen und die 860px-Icon-Leiste direkt aus dem Stylesheet kommen. Escape und Backdrop schließen; der Fokus wandert hinein und zurück; die Seite dahinter ist scroll-gesperrt und inert. Direkt unter <body> platzieren.
Ein Pane des Einstellungs-Modals. label, icon und group speisen die Nav des Modals; title rendert die Pane-Überschrift. Geslottete <h2>/<h3> werden ebenfalls gestylt.
Auf kleinem Schirm:Unter 860px bleibt nur der Avatar.
Ersetzt.nk-settings-user.avatar.u-text.name.mail
<nk-cmdk> Befehlspalette
⌘K. Befüllen mit palette.commands = [{ group, items: [{ id, icon, label, shortcut, keywords, action }] }]; es sucht unscharf über Label und Keywords, behält die Gruppenreihenfolge, bewegt die Auswahl mit ↑↓, wählt mit Enter oder Klick (nk-command plus action des Eintrags) und schließt mit Escape oder Backdrop. Der Hotkey ist mod+k, sofern nicht geändert. Direkt unter <body> platzieren.
Ein 230px-Kontextmenü. Einträge sind nk-menu-items (type="separator" / "label" für den Rest); ↑↓ bewegen, Enter wählt, nk-select bubbelt hoch. Lebt meist in nk-pop oder im Workspace-Umschalter.
Welle 4
SeiteUmbenennenDuplizierenVerschieben nach …Löschen
Verankert eine schwebende Fläche an einem Auslöser. Der Auslöser kommt in slot="trigger" und schaltet open; Klick außerhalb, Escape und ein nk-select von innen schließen. Inhalt wird in .nk-pop gehüllt, außer er bringt seine eigene Fläche mit (nk-menu, nk-emoji-picker) oder bare ist gesetzt.
Statischer Inhalt (wenn show() keine Nachricht bekommt).
Events
Event
detail
Beschreibung
nk-toggle
{ open }
Gezeigt / verborgen.
Properties:openmessage
Methoden:show(message?, { duration })close()
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-toast.show
Daten & Kollaboration
Welle 5
<nk-database> Datenbank
Der Ansichts-Umschalter. Kind-Views (nk-table-view, nk-board-view) werden Tabs; columns und rows werden in jede View gepusht. view wählt die aktive; count an einer View zeigt die Zeilenzahl als Badge. Kein Fetching: Daten reingeben, Events hören.
Rendert columns × rows als NotionKit-Tabelle. Zellen sind polymorph (text, select, multi-select, date, person, checkbox, url, number, progress) und werden vom exportierten renderPropertyCell() als Klassen-Markup gerendert – jede Zellregel beginnt mit .nk-table, ein eigenes Zellen-Element würde nie gestylt. Kopfklicks sortieren mit sortable.
Gruppiert Zeilen über eine Select-Spalte (group-by, Standard: die erste Select-Spalte) in eine Spalte je Option. Karten zeigen die Titelspalte und die meta-keys (Standard: Datum und Fortschritt). Karte auf eine andere Spalte ziehen: Der Wert der Zeile ändert sich, nk-change feuert.
Eine Werkzeugleiste aus vorhandenen Klassen: Filter- und Sortier-Button (nk-action), aktive Filter als entfernbare Chips, optionales Suchfeld. bar.apply(rows) behält Zeilen, bei denen jeder Chip strikt gleich ist (row[key] === value, also den Options-Wert nutzen) und der Suchtext in einem String-Feld vorkommt (bei Personen der name); die Datenlogik bleibt deine.
Ein links gerahmter Faden aus nk-comments mit Eingabezeile. Enter oder der Button feuert nk-submit { text }; das Anhängen übernimmst du.
Welle 5
Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍AIIch habe die überfälligen Einträge markiert und eine Zusammenfassung vorbereitet.
SL
Sara Lindt · 1 hr ago
Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍
✨
MonaAI · 20 min ago
Ich habe die überfälligen Einträge markiert und eine Zusammenfassung vorbereitet.
<nk-commentsplaceholder="Kommentieren …" send-label="Senden">
<nk-commentauthor="Sara Lindt" time="1 hr ago" color="#448361">Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍</nk-comment>
<nk-commentauthor="Mona" time="20 min ago" avatar="✨" color="var(--nk-text-tertiary)"><spanslot="head" class="nk-tag blue" style="font-size:10.5px">AI</span>Ich habe die überfälligen Einträge markiert und eine Zusammenfassung vorbereitet.</nk-comment>
</nk-comments>
<divclass="nk-comments">
<divclass="nk-comment"><spanclass="mini-avatar" style="background:#448361">SL</span><div><divclass="c-head"><b>Sara Lindt</b> · 1 hr ago</div><divclass="c-body">Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍</div></div></div>
<divclass="nk-comment"><spanclass="mini-avatar" style="background:var(--nk-text-tertiary)">✨</span><div><divclass="c-head"><b>Mona</b><spanclass="nk-tag blue" style="font-size:10.5px">AI</span> · 20 min ago</div><divclass="c-body">Ich habe die überfälligen Einträge markiert und eine Zusammenfassung vorbereitet.</div></div></div>
<divclass="nk-comment-input"><inputclass="nk-input" placeholder="Kommentieren …"><buttonclass="nk-btn primary small">Senden</button></div>
</div>
Attribute
Attribut
Typ
Standard
Beschreibung
placeholder
string
–
Platzhalter.
send-label
string
Send
Button-Text.
no-input
boolean
–
Nur lesen.
disabled
boolean
–
Eingabe deaktiviert.
Slots
Slot
Beschreibung
(default)
nk-comment-Kinder.
Events
Event
detail
Beschreibung
nk-submit
{ text }
Neuer Kommentar; preventDefault() behält den Text.
Ein Kommentar: Avatar (Initialen + color), fetter Autor, Zeit, Text. slot="head" ergänzt Inhalt hinter dem Namen.
Welle 5
Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍
SL
Sara Lindt · 1 hr ago
Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍
<nk-comments no-input><nk-commentauthor="Sara Lindt" time="1 hr ago" color="#448361">Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍</nk-comment></nk-comments>
<divclass="nk-comments"><divclass="nk-comment"><spanclass="mini-avatar" style="background:#448361">SL</span><div><divclass="c-head"><b>Sara Lindt</b> · 1 hr ago</div><divclass="c-body">Die Board-Ansicht fühlt sich schon sehr nah am Original an. 👍</div></div></div></div>
Attribute
Attribut
Typ
Standard
Beschreibung
author
string
–
Name.
time
string
–
Relative Zeit.
avatar
string
–
Initialen/Emoji (Standard: aus dem Autor).
color
CSS color
–
Avatar-Hintergrund.
Slots
Slot
Beschreibung
(default)
Text.
head
Hinter dem Namen (Tag, Badge).
avatar
Eigener Avatar.
Events
keine
Auf kleinem Schirm:Unverändert.
Ersetzt.nk-comment.c-head.c-body
<nk-ai-thread> KI-Thread
Die Konversationsspalte: nk-ai-msg-Kinder (role="user" bekommt den Gradient-Avatar), gefolgt von einer nk-ai-input-row. Action-Buttons in slot="actions" feuern nk-action { action, value } – beide tragen das value des Buttons (oder seinen Text).
Welle 5
Fasse die offenen Aufgaben dieses Projekts zusammen.Zwei Aufgaben sind offen: die Tabellenansicht steht bei 65 % (fällig 20. Mai), das Board mit Drag-and-Drop ist geplant.
MK
Du
Fasse die offenen Aufgaben dieses Projekts zusammen.
✨
Mona · KI
Zwei Aufgaben sind offen: die Tabellenansicht steht bei 65 % (fällig 20. Mai), das Board mit Drag-and-Drop ist geplant.
✨
<nk-ai-thread>
<nk-ai-msgrole="user" name="Du" avatar="MK">Fasse die offenen Aufgaben dieses Projekts zusammen.</nk-ai-msg>
<nk-ai-msgrole="assistant" name="Mona" badge="· KI">Zwei Aufgaben sind offen: die <b>Tabellenansicht</b> steht bei 65 % (fällig 20. Mai), das <b>Board mit Drag-and-Drop</b> ist geplant.
<buttonslot="actions" value="copy">📋 Kopieren</button><buttonslot="actions" value="rephrase">↻ Umformulieren</button><buttonslot="actions" value="like">👍</button>
</nk-ai-msg>
</nk-ai-thread>
<nk-ai-input-rowplaceholder="Frag Mona etwas …"></nk-ai-input-row>
<divclass="nk-ai-thread">
<divclass="nk-ai-msg user"><spanclass="mini-avatar">MK</span><divclass="a-body"><divclass="a-name">Du</div>Fasse die offenen Aufgaben dieses Projekts zusammen.</div></div>
<divclass="nk-ai-msg"><spanclass="mini-avatar">✨</span><divclass="a-body"><divclass="a-name">Mona <span>· KI</span></div>Zwei Aufgaben sind offen: die <b>Tabellenansicht</b> steht bei 65 % (fällig 20. Mai), das <b>Board mit Drag-and-Drop</b> ist geplant.<divclass="nk-ai-actions"><button>📋 Kopieren</button><button>↻ Umformulieren</button><button>👍</button></div></div></div>
</div>
<divclass="nk-ai-input-row"><spanstyle="font-size:14px">✨</span><inputplaceholder="Frag Mona etwas …"><buttonclass="nk-ai-send">↑</button></div>
Eine Nachricht. role="user" schaltet den Avatar auf den Gradient; badge ist das graue Suffix hinter dem Namen („· KI“); einfache <button slot="actions">s bilden die Aktionszeile.
Welle 5
Zwei Aufgaben sind offen: die Tabellenansicht steht bei 65 % (fällig 20. Mai), das Board mit Drag-and-Drop ist geplant.
✨
Mona · KI
Zwei Aufgaben sind offen: die Tabellenansicht steht bei 65 % (fällig 20. Mai), das Board mit Drag-and-Drop ist geplant.
<nk-ai-thread><nk-ai-msgrole="assistant" name="Mona" badge="· KI">Zwei Aufgaben sind offen: die <b>Tabellenansicht</b> steht bei 65 % (fällig 20. Mai), das <b>Board mit Drag-and-Drop</b> ist geplant.<buttonslot="actions" value="copy">📋 Kopieren</button></nk-ai-msg></nk-ai-thread>
<divclass="nk-ai-thread"><divclass="nk-ai-msg"><spanclass="mini-avatar">✨</span><divclass="a-body"><divclass="a-name">Mona <span>· KI</span></div>Zwei Aufgaben sind offen: die <b>Tabellenansicht</b> steht bei 65 % (fällig 20. Mai), das <b>Board mit Drag-and-Drop</b> ist geplant.<divclass="nk-ai-actions"><button>📋 Kopieren</button></div></div></div></div>