@node-k/ui (0.2.2)

Published 2026-09-29 11:18:25 +02:00 by registry-user in node-K/Design-System

Installation

@node-k:registry=
npm config set @node-k:registry=
npm install @node-k/ui@0.2.2
"@node-k/ui": "0.2.2"

About this package

@node-k/ui — Bausteine als Web Components

Stufe 4 aus korrekturen/paketierung.md §7. Angelegt 11.9.2026 mit nk-button als Muster (4a). Entscheidungen 11.9.: form-associated ja · Lit vendored · Workspace ui/ · .jsx-Wrapper später als eigenes Paket · diese Sitzung nur Button.

Benutzen

<script type="module" src="node_modules/@node-k/ui/src/define/nk-button.js"></script>
<link rel="stylesheet" href="node_modules/@node-k/tokens/dist/css/nodek-tokens.css">

<nk-button>Node finden</nk-button>
<nk-button variant="secondary">Mitglied werden</nk-button>
<nk-button variant="ghost" size="sm">Mehr</nk-button>
<nk-button full-width type="submit">Anmelden</nk-button>

Tokens greifen als Custom Properties durch das Shadow DOM — die Komponente bringt keine Farben mit. Ohne nodek-tokens.css ist sie unsichtbar; das ist Absicht (eine Quelle, kein Rückfall-Zweitsatz).

Attribut Werte Standard
variant primary · secondary · ghost primary
size sm · md · lg md
type button · submit · reset button
disabled boolean —
full-width boolean —
label aria-label für Icon-Buttons ohne Text —
--nk-button-surface Grundfläche hinter Umriss-Varianten var(--nk-black)

part="button" und part="label" für ::part()-Styling von außen.

Angular

Was heute trägt (D1 §1 — die angular/-Platzhalter waren tote Exporte und sind entfernt; echte Direktiven entstehen dort, wo sie geprüft werden können, siehe PORTIERUNG.md):

  • CUSTOM_ELEMENTS_SCHEMA gehört in die schemas jeder standalone Komponente, die ein nk-*-Element benutzt. Ohne NgModules gibt es keine Stelle, an der man es einmal für die App hinterlegt.
  • Side-Effect-Importe je Bauteil: import '@node-k/ui/button', …/logo und so fort. Die Unterpfade stehen in exports, fünfzehn Stück.
  • nk-input und nk-switch sind form-associated. In einem nativen <form> melden sie ihren Wert über ElementInternals.setFormValue() selbst — gemessen in K1 am 12.9.: fünf Felder mit Startwert im ersten FormData, form.reset() stellt sie wieder her, <fieldset disabled> greift über formDisabledCallback. Es fehlt also nur die Brücke zu Signal Forms' [field], nicht die Wertweitergabe.
  • Die Ereignisse: nk-input feuert change und input, nk-switch nur change.
  • Status-Aktionen: es gibt primary, secondary, ghost — kein danger, kein success. Wer eine Löschaktion zeichnet, nimmt ghost und setzt die Farbe von außen.

nk-logo beim Konsumenten (D1 §2). Die Vorgabepfade sind repo-relativ zu base; @node-k/ui liefert keine Bilder mit (Bilder liegen in @node-k/assets). nk-logo erwartet unterhalb von base die Unterordner assets/svg/wbm/, assets/svg/wordmark/, assets/svg/app/. Ein angular.json-Eintrag, der @node-k/assets/dist/svg dorthin kopiert:

"assets": [{ "glob": "**/*", "input": "node_modules/@node-k/assets/dist/svg", "output": "assets/svg" }]

Nuxt-Gegenstück (nuxt.config.ts):

hooks: { 'nitro:config': (cfg) => { cfg.publicAssets ??= []; cfg.publicAssets.push({ dir: 'node_modules/@node-k/assets/dist/svg', baseURL: 'assets/svg' }); } }

Den Pfad setzt man einmal je Seite am <html>: <html data-nk-asset-base="/">. Ein base-Attribut am einzelnen Element sticht diesen Standard, ist aber nur noetig, wenn eine Seite zwei Herkuenfte mischt. <nk-logo base="/"> (oder der Pfad, unter dem assets/svg/ kopiert liegt). Die Quelle ist bewusst assets/svg/ und nicht svg-flat: nk-logo bettet inline ein und färbt über var(--nk-*), das braucht die tokenisierte Fassung (A4 §4). Ohne gesetztes base und außerhalb der Baumwurzel bleibt ein Platzhalter stehen, kein leeres Bild — die Konsolenmeldung nennt die versuchte URL.

Portierung, Bauart-Begründungen (4b/4c) und Abnahmeprotokolle: siehe PORTIERUNG.md.

Lit: vendored, nicht transitiv

vendor/lit/lit.js ist ein einzelnes ESM-Bündel (LitElement, html, css, svg, nothing, unsafeCSS, classMap, ifDefined), erzeugt von npm run vendor -w ui aus der devDependency lit@3.3.1. Konsumenten bekommen genau diese Fassung, ohne eigene Lit-Auflösung — eine Version in allen drei Apps. src/** importiert ausschließlich ../../vendor/lit/lit.js; jeder andere Lit-Import fällt im check.

Stand 11.9.: die Registry ist aus dem Designsystem heraus nicht erreichbar. vendor/lit/lit.js reicht deshalb den Shim lit.shim.js durch — eine Minimal-Oberfläche derselben API ohne Diffing, für Browserproben ausreichend, für Produktion nicht. Der Shim exportiert dieselben Namen wie das echte Bündel (LitElement, nicht mehr litElementBase), damit die Komponenten unverändert gegen beides laufen. Regel seit der Zwischenkorrektur: kein „fertig" ohne echtes Lit — Abnahme nur nach:

npm ci
npm run vendor -w ui          # esbuild ist devDependency; ersetzt lit.js durch das echte Bündel, löscht den Shim, kopiert die Kerne
npm run check -w ui           # Exit 0, keine Shim-/Platzhalter-Warnung mehr

Nachweis im Browser: Probe öffnen, customElements.get('nk-button') liefert die Klasse. Jede Komponente exportiert ihre Klasse als nk<Name>Element (klein), weil der Design-System-Compiler Großbuchstaben-Exporte hebt (P1.3).

Dependencies

Dependencies

ID Version
@node-k/assets 0.2.2
@node-k/tokens 0.2.2

Development dependencies

ID Version
esbuild 0.25.9
lit 3.3.1
Details
npm
2026-09-29 11:18:25 +02:00
4
2026-11-06 18:55:33 +01:00
MIT
73 KiB
Assets (1)
ui-0.2.2.tgz 73 KiB
Versions (9) View all
0.2.8 2026-10-11
0.2.7 2026-10-04
0.2.6 2026-10-04
0.2.5 2026-09-30
0.2.4 2026-09-29