Initial commit

This commit is contained in:
2026-07-19 13:09:04 +02:00
commit 8cf57d7878
215 changed files with 30417 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
@keyframes ui-spin {
to {
transform: rotate(1turn);
}
}
@keyframes ui-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes ui-slide-up {
from {
opacity: 0;
transform: translateY(var(--space-3));
}
to {
opacity: 1;
transform: translateY(0);
}
}

View File

@@ -0,0 +1,90 @@
.ui-button {
min-height: var(--button-height);
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-3);
border: 1px solid transparent;
border-radius: var(--radius-md);
padding: 0 var(--space-5);
font-weight: var(--font-weight-semibold);
line-height: 1;
text-decoration: none;
transition:
background-color var(--transition-fast) ease,
border-color var(--transition-fast) ease,
color var(--transition-fast) ease;
}
.ui-button--primary {
color: var(--color-surface);
background: var(--color-primary);
}
.ui-button--primary:hover {
background: var(--color-primary-hover);
}
.ui-button--primary:active {
background: var(--color-primary-active);
}
.ui-button--secondary {
color: var(--color-surface);
background: var(--color-secondary);
}
.ui-button--ghost {
color: var(--color-primary);
background: transparent;
border-color: var(--color-border);
}
.ui-button--danger {
color: var(--color-surface);
background: var(--color-danger);
}
.ui-button--small {
min-height: 2.25rem;
padding-inline: var(--space-4);
font-size: var(--font-size-sm);
}
.ui-button[disabled],
.ui-button[aria-disabled='true'] {
opacity: 0.55;
}
.ui-icon-button {
position: relative;
width: var(--touch-target);
height: var(--touch-target);
display: inline-grid;
place-items: center;
color: var(--color-text-primary);
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
}
.ui-icon-button:hover {
background: var(--color-primary-subtle);
border-color: var(--color-border-strong);
}
.ui-button__spinner,
.ui-spinner {
width: 1rem;
height: 1rem;
border: 2px solid currentColor;
border-right-color: transparent;
border-radius: var(--radius-pill);
animation: ui-spin 700ms linear infinite;
}
@media (max-width: 35.99rem) {
.ui-button--mobile-full {
width: 100%;
}
}

View File

@@ -0,0 +1,65 @@
.ui-form {
display: grid;
gap: var(--space-5);
}
.ui-form-field {
display: grid;
gap: var(--space-2);
}
.ui-control {
width: 100%;
min-height: var(--input-height);
padding: 0 var(--space-4);
color: var(--color-text-primary);
background: var(--color-surface);
border: 1px solid var(--color-border-strong);
border-radius: var(--radius-md);
transition:
border-color var(--transition-fast) ease,
box-shadow var(--transition-fast) ease;
}
textarea.ui-control {
min-height: 6rem;
padding-block: var(--space-3);
resize: vertical;
}
.ui-control:focus {
border-color: var(--color-focus);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-focus) 22%, transparent);
outline: none;
}
.ui-control:disabled,
.ui-control[readonly] {
color: var(--color-text-muted);
background: var(--color-neutral-subtle);
}
.ui-control[aria-invalid='true'] {
border-color: var(--color-danger);
}
.ui-field-error {
color: var(--color-danger);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
}
.ui-checkbox {
display: grid;
grid-template-columns: 1.25rem 1fr;
align-items: start;
gap: var(--space-3);
min-height: var(--touch-target);
}
.ui-checkbox input {
width: 1.1rem;
height: 1.1rem;
margin-top: 0.2rem;
accent-color: var(--color-primary);
}

View File

@@ -0,0 +1,121 @@
.ui-page {
display: grid;
gap: var(--space-6);
}
.ui-page-header {
display: grid;
gap: var(--space-4);
margin-bottom: var(--space-6);
}
.ui-page-header__content {
display: grid;
gap: var(--space-2);
}
.ui-page-header__actions {
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
}
.ui-grid {
display: grid;
gap: var(--space-4);
}
.ui-grid--cards {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
}
.ui-card {
display: grid;
gap: var(--space-4);
min-width: 0;
padding: var(--space-5);
color: var(--color-text-primary);
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
}
.ui-card--interactive {
transition:
border-color var(--transition-fast) ease,
box-shadow var(--transition-fast) ease;
}
.ui-card--interactive:hover {
border-color: var(--color-border-strong);
box-shadow: var(--shadow-md);
}
.ui-card--selected {
border-color: var(--color-primary);
background: var(--color-primary-subtle);
}
.ui-card--warning {
border-color: var(--color-warning);
background: var(--color-warning-subtle);
}
.ui-card--danger {
border-color: var(--color-danger);
background: var(--color-danger-subtle);
}
.ui-toolbar {
display: grid;
gap: var(--space-4);
padding: var(--space-5);
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
}
.ui-actions {
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
}
.ui-kpi {
display: grid;
gap: var(--space-2);
}
.ui-kpi__value {
font-size: var(--font-size-2xl);
line-height: var(--line-height-tight);
font-weight: var(--font-weight-bold);
}
.ui-notice {
display: grid;
gap: var(--space-2);
padding: var(--space-5);
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
}
.ui-notice--error {
color: var(--color-danger);
background: var(--color-danger-subtle);
border-color: var(--color-danger);
}
@media (min-width: 48rem) {
.ui-page-header {
grid-template-columns: minmax(0, 1fr) auto;
align-items: start;
}
.ui-toolbar {
grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
align-items: end;
}
}

View File

@@ -0,0 +1,70 @@
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
min-width: 0;
min-height: 100%;
font-family: var(--font-family-base);
color: var(--color-text-primary);
background: var(--color-background);
text-size-adjust: 100%;
}
body {
min-width: 0;
min-height: 100%;
margin: 0;
font-size: var(--font-size-md);
line-height: var(--line-height-base);
}
img,
svg,
video {
max-width: 100%;
}
button,
input,
textarea,
select {
font: inherit;
}
button,
a,
input,
textarea,
select {
&:focus-visible {
outline: 3px solid var(--color-focus);
outline-offset: 2px;
}
}
button {
cursor: pointer;
}
button:disabled {
cursor: not-allowed;
}
a {
color: var(--color-primary);
text-underline-offset: 0.16em;
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
scroll-behavior: auto;
transition-duration: 1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
}
}

View File

@@ -0,0 +1,34 @@
.ui-table-wrap {
overflow-x: auto;
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
}
.ui-table {
width: 100%;
border-collapse: collapse;
min-width: 42rem;
}
.ui-table th,
.ui-table td {
padding: var(--space-4) var(--space-5);
text-align: left;
border-bottom: 1px solid var(--color-border);
}
.ui-table th {
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
background: var(--color-neutral-subtle);
}
.ui-table tr:last-child td {
border-bottom: 0;
}
.ui-table tbody tr:hover {
background: var(--color-primary-subtle);
}

View File

@@ -0,0 +1,76 @@
:root {
--color-primary: #245b7d;
--color-primary-hover: #1d4f6d;
--color-primary-active: #173f58;
--color-primary-subtle: #e7f1f7;
--color-secondary: #546475;
--color-background: #f5f7fa;
--color-surface: #ffffff;
--color-surface-elevated: #ffffff;
--color-text-primary: #182331;
--color-text-secondary: #4d5d70;
--color-text-muted: #687789;
--color-border: #d9e0e8;
--color-border-strong: #aeb9c6;
--color-focus: #0b72b9;
--color-success: #23724d;
--color-success-subtle: #e7f5ee;
--color-warning: #8a5a0a;
--color-warning-subtle: #fff4d8;
--color-danger: #a13d3d;
--color-danger-subtle: #fbeaea;
--color-info: #315f94;
--color-info-subtle: #e8f1fb;
--color-neutral-subtle: #eef2f6;
--space-0: 0;
--space-1: 0.125rem;
--space-2: 0.25rem;
--space-3: 0.5rem;
--space-4: 0.75rem;
--space-5: 1rem;
--space-6: 1.5rem;
--space-7: 2rem;
--space-8: 3rem;
--space-9: 4rem;
--font-family-base:
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-size-xs: 0.75rem;
--font-size-sm: 0.875rem;
--font-size-md: 1rem;
--font-size-lg: 1.125rem;
--font-size-xl: 1.375rem;
--font-size-2xl: 1.75rem;
--line-height-tight: 1.2;
--line-height-base: 1.5;
--line-height-relaxed: 1.65;
--font-weight-regular: 400;
--font-weight-medium: 500;
--font-weight-semibold: 650;
--font-weight-bold: 750;
--radius-sm: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
--radius-pill: 999px;
--shadow-sm: 0 1px 2px rgb(24 35 49 / 8%);
--shadow-md: 0 8px 24px rgb(24 35 49 / 12%);
--z-header: 20;
--z-drawer: 30;
--z-overlay: 40;
--z-dialog: 50;
--z-toast: 60;
--transition-fast: 120ms;
--transition-base: 180ms;
--container-width: 72rem;
--sidebar-width: 16.25rem;
--header-height: 4rem;
--breakpoint-small: 36rem;
--breakpoint-medium: 48rem;
--breakpoint-large: 64rem;
--breakpoint-wide: 80rem;
--touch-target: 2.75rem;
--input-height: 2.75rem;
--button-height: 2.75rem;
}

View File

@@ -0,0 +1,44 @@
h1,
h2,
h3,
p {
margin-block: 0;
}
h1,
.ui-page-title {
font-size: var(--font-size-2xl);
line-height: var(--line-height-tight);
font-weight: var(--font-weight-bold);
}
h2,
.ui-section-title {
font-size: var(--font-size-xl);
line-height: var(--line-height-tight);
font-weight: var(--font-weight-semibold);
}
h3,
.ui-subsection-title {
font-size: var(--font-size-lg);
line-height: var(--line-height-tight);
font-weight: var(--font-weight-semibold);
}
.ui-text {
color: var(--color-text-primary);
}
.ui-help-text,
.ui-meta,
.text-muted {
color: var(--color-text-muted);
font-size: var(--font-size-sm);
}
.ui-label {
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
}

View File

@@ -0,0 +1,72 @@
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.stack {
display: grid;
gap: var(--space-4);
}
.cluster {
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
align-items: center;
}
.full-width {
width: 100%;
}
.ui-badge {
width: fit-content;
min-height: 1.5rem;
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: 0 var(--space-3);
border: 1px solid var(--color-border);
border-radius: var(--radius-pill);
color: var(--color-text-secondary);
background: var(--color-neutral-subtle);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-semibold);
}
.ui-badge--success {
color: var(--color-success);
background: var(--color-success-subtle);
border-color: var(--color-success);
}
.ui-badge--warning {
color: var(--color-warning);
background: var(--color-warning-subtle);
border-color: var(--color-warning);
}
.ui-badge--danger {
color: var(--color-danger);
background: var(--color-danger-subtle);
border-color: var(--color-danger);
}
.ui-badge--info {
color: var(--color-info);
background: var(--color-info-subtle);
border-color: var(--color-info);
}