nerdtech-ui (1.0.1)
Installation
registry=npm install nerdtech-ui@1.0.1"nerdtech-ui": "1.0.1"About this package
L_cke_text UI Design System
L_cke_text UI ist ein Vue-3-Designsystem mit klarer Schichtung:
Design Tokens -> Theme-Tokens -> Primitive Layout-Komponenten -> UI-Komponenten.
Ziel ist eine konsistente, wartbare UI-Sprache mit vorhersehbaren APIs und wiederverwendbaren Bausteinen.
Architekturdiagramm (Kurzüberblick)
Consumer App
|
v
L_cke_text UI Plugin (src/index.ts)
|
+--> base.css (globale Defaults, Focus, Reduced Motion)
+--> tokens.css (Foundation: Color/Space/Type/Radius/...)
+--> themes.css (Semantik: background/surface/text/primary/...)
|
+--> Primitives (UiBox, UiGrid, UiStack, UiInline, ...)
| |
| +--> layout + spacing + structure
|
+--> UI Components (Form, Navigation, Feedback, Data Display)
|
+--> konsistente API + states + accessibility
Theme switch:
useTheme() -> data-nt-theme="light|dark" -> Theme-Tokens aktualisieren alle Komponenten.
Komponenten-Lebenszyklus (Mini-Diagramm)
Consumer Props / v-model
|
v
Component State + Composables
(z. B. useControllableState, useTheme)
|
v
Render in Vue Template
|
v
Styles aus Tokens + Theme-Variablen
(tokens.css + themes.css + overrides.css)
|
v
UI Output + Interaction Events
|
v
emit(...) / v-model:update -> zurück an Consumer
Wie das Designsystem funktioniert
1) Design Tokens (Foundation)
Basiswerte liegen in src/styles/tokens.css und als TypeScript-Tokens in src/tokens/*.
Beispiele:
- Farben:
--nt-color-primary-*,--nt-color-neutral-* - Spacing:
--nt-space-* - Radius:
--nt-radius-* - Typografie:
--nt-font-size-*,--nt-font-weight-* - Motion, Z-Index, Shadow
Regel: Komponenten verwenden Tokens statt harter Pixel-/Farbwerte.
2) Theme Layer (Semantik)
Semantische Theme-Variablen liegen in src/styles/themes.css:
--nt-theme-background,--nt-theme-surface--nt-theme-text,--nt-theme-muted--nt-theme-primary,--nt-theme-danger
Themes werden über data-nt-theme geschaltet:
data-nt-theme="light"data-nt-theme="dark"
3) Base Layer (Global Behavior)
src/styles/base.css setzt globale, systemweite Defaults:
box-sizing: border-box- globale Schriftfamilie
- Focus-Visibility (
:focus-visible) - Reduced-Motion-Verhalten
4) Primitive Layout-Komponenten
Die Layout-Primitives sind die Grundlage für Seitenaufbau und Spacing:
UiBox: Container mit kontrolliertem Padding/Margin/DimensionenUiGrid: responsive Raster-LayoutsUiStack: vertikaler Flow mit konsistentem AbstandUiInline: horizontaler Flow für Actions/GruppenUiText,UiHeading,UiLink,UiPrimitiveDivider: typografische und strukturelle Basis
Regel: Erst mit Primitives layouten, dann fachliche Komponenten einsetzen.
5) UI-Komponenten (Feature Layer)
Auf den Primitives aufbauend kommen Fachkomponenten wie:
- Form:
UiButton,UiInput,UiSelect,UiSlider,UiStepper,UiSwitch,UiCheckbox - Navigation:
UiTabs,UiPagination,UiBreadcrumbs,UiAccordion,UiPageSlider - Feedback:
UiToast,UiProgress,UiSkeleton,UiSpinner,UiCallout,UiEmptyState - Data Display:
UiTable,UiMetric,UiTimeline,UiDataList,UiImageSlider,UiAvatar
Jede Komponente liegt in src/components/<Name>/ und folgt dem Muster:
Ui<Name>.vueUi<Name>.types.tsUi<Name>.overrides.css- optional:
Ui<Name>.stories.ts,Ui<Name>.spec.ts,README.md
Schichten im Import-Flow
Die Library exportiert in src/index.ts:
./styles/base.css./styles/themes.css./styles/tokens.css- alle Komponenten, Composables und TS-Tokens
Damit kommt ein konsistentes Styling-System automatisch mit.
Theme-Steuerung im Code
useTheme() aus src/composables/useTheme.ts steuert Theme-Zustände:
lightdarksystem
const { theme, resolvedTheme, setTheme } = useTheme(); setTheme("dark");
<details>
<summary><strong>1) Design Tokens (Foundation)</strong></summary>
Basiswerte liegen in `src/styles/tokens.css` und als TypeScript-Tokens in `src/tokens/*`.
Beispiele:
- Farben: `--nt-color-primary-*`, `--nt-color-neutral-*`
- Spacing: `--nt-space-*`
- Radius: `--nt-radius-*`
- Typografie: `--nt-font-size-*`, `--nt-font-weight-*`
- Motion, Z-Index, Shadow
Regel: Komponenten verwenden Tokens statt harter Pixel-/Farbwerte.
</details>
## Verwendung im Consumer-Projekt
Wichtig: `nerdtech-ui` ist in der aktuellen Forgejo-Instanz produktiv nur als unscoped Paket verfügbar. Vue bleibt eine `peerDependency` und sollte im Consumer-Projekt separat installiert sein.
import NerdtechUI from "nerdtech-ui";
<details>
<summary><strong>2) Theme Layer (Semantik)</strong></summary>
Semantische Theme-Variablen liegen in `src/styles/themes.css`:
- `--nt-theme-background`, `--nt-theme-surface`
- `--nt-theme-text`, `--nt-theme-muted`
- `--nt-theme-primary`, `--nt-theme-danger`
Themes werden über `data-nt-theme` geschaltet:
- `data-nt-theme="light"`
- `data-nt-theme="dark"`
</details>
import "nerdtech-ui/style.css";
createApp(App).use(NerdtechUI).mount("#app");
- Konsistente API-Namings (
Ui*, klare Props)
3) Base Layer (Global Behavior)
src/styles/base.css setzt globale, systemweite Defaults:
box-sizing: border-box- globale Schriftfamilie
- Focus-Visibility (
:focus-visible) - Reduced-Motion-Verhalten
Qualitätssicherung
npm run test:unit -- --run
<details>
<summary><strong>4) Primitive Layout-Komponenten</strong></summary>
Die Layout-Primitives sind die Grundlage für Seitenaufbau und Spacing:
- `UiBox`: Container mit kontrolliertem Padding/Margin/Dimensionen
- `UiGrid`: responsive Raster-Layouts
- `UiStack`: vertikaler Flow mit konsistentem Abstand
- `UiInline`: horizontaler Flow für Actions/Gruppen
- `UiText`, `UiHeading`, `UiLink`, `UiPrimitiveDivider`: typografische und strukturelle Basis
Regel: Erst mit Primitives layouten, dann fachliche Komponenten einsetzen.
</details>
## Publish (Kurzablauf)
```bash
npm run build
npm run type-check
Wichtig: Wenn `npm publish` mit `E409` fehlschlägt, existiert die Version bereits in der Registry. In dem Fall die Version erneut erhöhen und neu publishen.
- Playground: `docs/playground.md`
<details>
<summary><strong>5) UI-Komponenten (Feature Layer)</strong></summary>
Auf den Primitives aufbauend kommen Fachkomponenten wie:
- Form: `UiButton`, `UiInput`, `UiSelect`, `UiSlider`, `UiStepper`, `UiSwitch`, `UiCheckbox`
- Navigation: `UiTabs`, `UiPagination`, `UiBreadcrumbs`, `UiAccordion`, `UiPageSlider`
- Feedback: `UiToast`, `UiProgress`, `UiSkeleton`, `UiSpinner`, `UiCallout`, `UiEmptyState`
- Data Display: `UiTable`, `UiMetric`, `UiTimeline`, `UiDataList`, `UiImageSlider`, `UiAvatar`
Jede Komponente liegt in `src/components/<Name>/` und folgt dem Muster:
- `Ui<Name>.vue`
- `Ui<Name>.types.ts`
- `Ui<Name>.overrides.css`
- optional: `Ui<Name>.stories.ts`, `Ui<Name>.spec.ts`, `README.md`
</details>
- Publishing: `docs/publishing.md`
- Team-Installation: `docs/team-install.md`
- Release-Checklist: `docs/release-checklist.md`
import NerdtechUI from "nerdtech-ui";
- Package-Migration: `docs/package-migration.md`
- Komponenten-Readmes: `src/components/*/README.md`
createApp(App).use(NerdtechUI).mount("#app");
Dependencies
Development dependencies
| ID | Version |
|---|---|
| @types/node | ^22.13.1 |
| @vitejs/plugin-vue | ^5.2.1 |
| @vue/test-utils | ^2.4.6 |
| jsdom | ^25.0.1 |
| marked | ^17.0.4 |
| prettier | ^3.5.3 |
| typescript | ^5.9.2 |
| vite | ^5.4.11 |
| vitest | ^2.1.8 |
| vue | ^3.5.13 |
| vue-tsc | ^2.1.10 |
Peer dependencies
| ID | Version |
|---|---|
| vue | >=3.3.0 <4 |