This file is the canonical style contract for reproducing the current dark-theme design system across an intranet collection of services.
This style contract defines the portable interface another implementation must expose:
--brand-*).alert-*, .status-*, etc.)body.admin-page)td[data-label])The current class names originated in a shop system, but they are intentionally treated here as generic style primitives that can be reused for non-shop domains.
:root) with all --brand-* variables exactly as listed in this document.body, a, .container, main.max-width: 768px and max-width: 480px.body.admin-page) and responsive table card mode (td[data-label] required).:root)| Token | Value | Intended usage |
|---|---|---|
--brand-primary |
#2f3541 |
Top bars, section headers, dense surfaces |
--brand-primary-dark |
#242a33 |
Darker primary accent |
--brand-danger |
#cf2e2e |
Error/danger/action emphasis |
--brand-danger-dark |
#b12727 |
Danger hover state |
--brand-accent |
#cac300 |
Highlight/open/attention accent |
--brand-dark |
#1b1b1b |
Deep dark token |
--brand-text |
#f5f7fb |
Primary foreground text |
--brand-muted |
#c7ccd6 |
Secondary/supporting text |
--brand-surface |
#2f3541 |
Cards/panels/module containers |
--brand-surface-alt |
#3a4150 |
Alternate surfaces, input fills, hover backgrounds |
--brand-bg |
#28292a |
Page/application background |
--brand-border |
#3b4252 |
Default border color |
| Value | Where used |
|---|---|
#e0d700 |
Generic link hover |
#ffffff |
White text/borders (.status-notified, .status-picked, footer links, info alert border) |
#9ca3af |
Hidden/archived status text |
#6b7280 |
Hidden/archived status border |
#303745 |
Email item-panel background |
#4a5263 |
Email panel/list item borders |
#e9ecef |
Generic placeholder SVG background |
#6c757d |
Generic placeholder SVG text |
| Value | Usage |
|---|---|
rgba(0,0,0,0.18) |
Header shadow |
rgba(0,0,0,0.25) |
Logo drop shadow |
rgba(0,0,0,0.4) |
Card default shadow |
rgba(0,0,0,0.15) |
Card hover shadow |
rgba(0,0,0,0.35) |
Table/stat/panel/card shadows |
rgba(0,0,0,0.6) |
Modal backdrop |
rgba(0,0,0,0.1) |
Media block image shadow |
rgba(202, 195, 0, 0.2) |
Form focus ring overlay |
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif1.6 on body text..brand-title: 1.3rem, 700, letter-spacing: 0.02em.brand-subtitle: 0.9rem, 500, opacity: 0.9font-weight: 600letter-spacing: 0.02em'Courier New', monospace, letter-spacing: 0.2remmonospace (inline)font-size: 0.85rem, font-weight: 600, letter-spacing: 0.02emArial, sans-serif, line-height: 1.60.5rem, 1rem, 1.5rem, 2rem..mt-1/.mt-2/.mt-3 = 0.5rem/1rem/1.5rem.mb-1/.mb-2/.mb-3 = 0.5rem/1rem/1.5rem20px<=480px): 12px4px: buttons, inputs, alerts6px: callout/disclaimer boxes8px: cards, tables, panels, modal content, code/ID boxes10px: email outer card999px: status pills0 2px 6px rgba(0,0,0,0.18)0 2px 8px rgba(0,0,0,0.4) -> hover 0 4px 12px rgba(0,0,0,0.15)0 2px 4px rgba(0,0,0,0.35)0 2px 8px rgba(0,0,0,0.1).btn: transition: background-color 0.3s.product-card: transition: transform 0.3s, box-shadow 0.3s.product-card:hover: transform: translateY(-5px)Note:
product-* class family can be used as generic entity/service cards if not renamed..container: centered layout, max-width: 1200px, side padding.main: min-height: calc(100vh - 200px), vertical section padding..header-inner: horizontal flex, center aligned, justify-content: space-between, gap-based spacing..products-grid: auto-fill card grid, minmax(250px, 1fr) desktop..product-detail-grid: two columns desktop, one column mobile..checkout-grid: two columns desktop, one column mobile.body.admin-page .container: full width (max-width: none), compact side padding.This is the portable public style interface. Implement these selectors and semantics exactly.
body: dark background (--brand-bg), light text (--brand-text), system font stack.a: accent color; hover uses #e0d700..container: width cap and horizontal padding.main: page body spacing and minimum viewport height behavior..site-header: primary background, white text, shadow, vertical padding..header-inner: flex alignment and spacing..brand: inline flex logo + text, white, no underline..brand-logo: fixed height (52px desktop / 46px mobile), drop shadow..brand-title and .brand-subtitle: hierarchy and typography values..site-nav: horizontal link group; links are white, accent on hover..btn: primary action button in --brand-danger..btn:hover: --brand-danger-dark..btn-secondary: transparent with border (--brand-border) and text color (--brand-text)..btn-small: compact button spacing and smaller text..form-group: vertical field spacing..form-group input, textarea, select: dark-alt surface fields, border, inherited font.0 0 0 3px rgba(202, 195, 0, 0.2)..quantity-input: compact numeric field width and centered text..products-grid: generic service/entity card grid..product-card: dark surface card with hover lift..product-card-content: internal spacing..price: prominent numeric/value field (can represent any key metric)..stock.in-stock: positive/available/open state accent..stock.out-of-stock: unavailable/error/depleted state danger color..cart-item: split content/action card row..cart-actions: summary and action group container, desktop right-aligned and mobile stacked.table: full width, surface background, shadow, rounded corners.th: primary background + white text.td: bordered row separation.tr:hover: alternate surface..table-responsive: horizontal overflow wrapper..responsive-table: required class for mobile card conversion in operations context..table-compact: denser table variant with reduced paddings/font size..alert: neutral surface alert container..alert-success: accent border..alert-error: danger border..alert-info: white border..alert-warning: accent border..status: pill base shape..status-open: open/pending/active text+border..status-notified: notified/informed text+border..status-picked: completed/processed text+border..status-expired: expired/invalid text+border..status-hidden: hidden/archived text+border..panel: reusable surface box with border, radius, and shadow..admin-header: top section with title/actions..admin-stats: responsive metrics grid..stat-card, .stat-value: metric visuals..modal: full-screen backdrop overlay (display: none by default, fixed, centered)..modal-content: constrained scrollable panel (max-width: 1000px, max-height: 95vh)..modal-close: top-right positioned close action..text-center: text alignment helper..mt-1/.mt-2/.mt-3, .mb-1/.mb-2/.mb-3: simple spacing utilities.body.admin-page: enables operations-wide layout/table behavior.td[data-label] on responsive tables is required:
td::before { content: attr(data-label); }data-label, mobile card mode loses column labels.Current templates include inline styles. For portability, normalize them into reusable classes or exact one-off rules.
| Legacy inline pattern | Portable equivalent |
|---|---|
width: 100% |
.u-w-full { width: 100%; } |
text-align: center |
.text-center |
margin-top: 1rem / 1.5rem / 2rem |
.mt-2 / .mt-3 / section gap rule |
margin-left: 1rem / 1.5rem |
.ml-2 / .list-indent helper rule |
padding: 1rem; margin-bottom: 1rem (compact summary cards) |
.panel.panel-compact |
padding: 2rem; margin: 2rem 0 (detail blocks) |
.panel.panel-spacious |
display: inline on action forms |
.inline-form { display: inline; } |
display: flex; gap: 1rem; align-items: end; flex-wrap: wrap |
.filter-form |
flex: 1; min-width: 200px |
.filter-field-grow |
max-width: 400px; margin-top: 4rem (auth/login container) |
.auth-container |
Inline media image (width: 100%; border-radius: 8px; box-shadow: ...) |
.media-hero-image |
Inline full-width primary CTA (width:100%; text-align:center; margin-top:1rem) |
.btn-block + .mt-2 |
Fidelity note:
<header> element instead of .site-header. Preserve this behavior if strict parity is required.max-width: 768px.header-inner becomes column layout, left aligned..site-nav wraps..brand-logo height drops to 46px.minmax(200px, 1fr) with tighter gaps..product-detail-grid, .checkout-grid switch to 1 column..cart-item stacks vertically; actions expand..cart-actions left aligns; button groups stack vertically..modal-content adds margins and reduced max-height..admin-header stacks with wrapped action buttons..admin-stats becomes single column.body.admin-page .table-responsive gets edge-to-edge compensation paddings..table-responsive .btn allows wrapping.body.admin-page table.responsive-table transforms rows into card blocks with td[data-label] pseudo labels.max-width: 480px.container horizontal padding -> 12px.main vertical padding reduced..brand-title 1.1rem, .brand-subtitle 0.8rem)..products-grid becomes single column..table-responsive table:not(.responsive-table) { min-width: 520px; }.<body class="admin-page"> for operations/control pages to activate admin-specific layout behavior.max-width: none)responsive-table + table-responsive pairing.status-*) for workflow state display.modal.modal-content.modal-closePrintable detail/receipt/ticket pages should preserve the existing minimal print mode.
Required print rules:
@media print {
header, footer, .btn, nav { display: none !important; }
body { padding: 20px; }
.order-number { page-break-inside: avoid; }
table { page-break-inside: avoid; }
}
Behavioral intent:
Email styles are inline HTML/CSS and must keep the same dark-theme palette.
| Email role | Value |
|---|---|
| Body background | #28292a |
| Main card background | #2f3541 |
| Main card border | #3b4252 |
| Primary text | #f5f7fb |
| Accent text/border | #cac300 |
| Item panel background | #303745 |
| Item panel border | #4a5263 |
| Warning panel border | #cf2e2e |
font-family: Arial, sans-serifline-height: 1.6font-family: monospacemax-width: 640px, dark surface, border, rounded corners)assets/images/feuerwehr-logo-invers.webpassets/images/<filename>8px radius and soft shadow.#e9ecef#6c757d:root tokens exactly.body, a, .container, main)..table-responsive, .responsive-table, .table-compact..text-center, .mt-*, .mb-*).body.admin-page.td[data-label] exists where responsive table cards are needed.<=768px, layout stacks and table card mode works.<=480px, compact spacing and single-column card layout are applied.