9668cc256b
ALVA satte inget eget snitt och ärvde därför värdapplikationens `Crimson Text` — en antikva. Specens paragraf 6 föreskriver DIN 2014, med FF DIN och IBM Plex Sans som tillåtna alternativ. Skillnaden är inte kosmetisk. Bokstavsformen är det första som säger vilken tradition ett verktyg tillhör, och dokumentet beskrev ett tyskt industrisystem medan skärmen visade en bokstavsform ur en helt annan. På en telefon, där ingenting annat konkurrerar om intrycket, var det i praktiken allt man såg. Fallkedjan är därför inte godtycklig: en organisation som licensierat DIN får DIN, övriga faller ned genom grotesker som delar dess karaktär, och aldrig till en antikva. Beteckningar och mätvärden sätts med fast teckenbredd och tabellsiffror — en beteckning jämförs oftare än den läses. Reglerna gäller bara ALVA-ytan; butiken lämnas som den är. Fyra tester låser snittet, kaskaden och siffrorna, inklusive att fallkedjan aldrig slutar i en antikva. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
291 lines
6.5 KiB
CSS
291 lines
6.5 KiB
CSS
@tailwind base;
|
||
@tailwind components;
|
||
@tailwind utilities;
|
||
|
||
/* Lennart Svenssons Konditorivaror - Traditionell Svensk Konditoristil */
|
||
|
||
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&family=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400&display=swap');
|
||
|
||
@layer base {
|
||
:root {
|
||
--background: 38 25% 96%;
|
||
--foreground: 25 30% 12%;
|
||
|
||
--card: 40 30% 94%;
|
||
--card-foreground: 25 30% 12%;
|
||
|
||
--popover: 40 30% 94%;
|
||
--popover-foreground: 25 30% 12%;
|
||
|
||
--primary: 4 70% 45%;
|
||
--primary-foreground: 40 30% 96%;
|
||
|
||
--secondary: 35 20% 88%;
|
||
--secondary-foreground: 25 30% 18%;
|
||
|
||
--muted: 35 15% 85%;
|
||
--muted-foreground: 0 0% 0%;
|
||
|
||
--accent: 4 70% 45%;
|
||
--accent-foreground: 40 30% 96%;
|
||
|
||
--destructive: 4 70% 40%;
|
||
--destructive-foreground: 40 30% 96%;
|
||
|
||
--border: 30 20% 80%;
|
||
--input: 30 20% 80%;
|
||
--ring: 4 70% 45%;
|
||
|
||
--radius: 0.25rem;
|
||
|
||
/* Custom tokens */
|
||
--gradient-warm: linear-gradient(180deg, hsl(40 30% 94%) 0%, hsl(35 25% 90%) 100%);
|
||
--shadow-classic: 0 4px 20px -4px hsl(25 30% 12% / 0.15);
|
||
--shadow-card: 0 2px 8px hsl(25 30% 12% / 0.08);
|
||
|
||
--font-display: 'Cormorant Garamond', serif;
|
||
--font-body: 'Crimson Text', serif;
|
||
}
|
||
|
||
.dark {
|
||
--background: 25 20% 8%;
|
||
--foreground: 38 25% 92%;
|
||
--card: 25 18% 12%;
|
||
--card-foreground: 38 25% 92%;
|
||
--primary: 30 50% 55%;
|
||
--primary-foreground: 25 20% 8%;
|
||
--secondary: 25 15% 18%;
|
||
--secondary-foreground: 38 25% 92%;
|
||
--muted: 25 12% 22%;
|
||
--muted-foreground: 30 15% 60%;
|
||
--border: 25 15% 25%;
|
||
}
|
||
}
|
||
|
||
@layer base {
|
||
* {
|
||
@apply border-border;
|
||
}
|
||
|
||
html {
|
||
scroll-behavior: smooth;
|
||
scrollbar-width: none; /* Firefox */
|
||
-ms-overflow-style: none; /* IE/Edge */
|
||
}
|
||
|
||
html::-webkit-scrollbar {
|
||
display: none; /* Chrome, Safari, Opera */
|
||
}
|
||
|
||
body {
|
||
@apply bg-background text-foreground antialiased;
|
||
font-family: var(--font-body);
|
||
}
|
||
|
||
/* Ensure full-width layout (avoid template max-width/padding on #root) */
|
||
#root {
|
||
max-width: none;
|
||
margin: 0;
|
||
padding: 0;
|
||
text-align: inherit;
|
||
}
|
||
|
||
h1, h2, h3, h4, h5, h6 {
|
||
font-family: var(--font-display);
|
||
}
|
||
}
|
||
|
||
@layer components {
|
||
.hero-gradient {
|
||
background: var(--gradient-warm);
|
||
}
|
||
|
||
.text-accent-warm {
|
||
color: hsl(var(--accent));
|
||
}
|
||
|
||
.card-classic {
|
||
box-shadow: var(--shadow-card);
|
||
border: 1px solid hsl(var(--border));
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.card-classic:hover {
|
||
box-shadow: var(--shadow-classic);
|
||
transform: translateY(-4px);
|
||
}
|
||
|
||
.btn-classic {
|
||
@apply bg-primary text-primary-foreground font-semibold transition-all duration-300;
|
||
border: 2px solid hsl(var(--primary));
|
||
}
|
||
|
||
.btn-classic:hover {
|
||
@apply bg-transparent;
|
||
color: hsl(var(--primary));
|
||
}
|
||
|
||
.btn-outline-classic {
|
||
@apply bg-transparent font-semibold transition-all duration-300;
|
||
color: hsl(var(--primary));
|
||
border: 2px solid hsl(var(--primary));
|
||
}
|
||
|
||
.btn-outline-classic:hover {
|
||
@apply bg-primary text-primary-foreground;
|
||
}
|
||
|
||
.divider-ornament {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 1rem;
|
||
}
|
||
|
||
.divider-ornament::before,
|
||
.divider-ornament::after {
|
||
content: '';
|
||
flex: 1;
|
||
height: 1px;
|
||
background: linear-gradient(90deg, transparent, hsl(var(--border)), transparent);
|
||
}
|
||
|
||
.ornament {
|
||
color: hsl(var(--primary));
|
||
font-family: var(--font-display);
|
||
font-size: 1.5rem;
|
||
}
|
||
}
|
||
|
||
/* ---- ALVA-ytan (ALVA-SPEC-001 · paragraf 6) --------------------------
|
||
*
|
||
* Värdapplikationen sätter en antikva på body. ALVA ärvde den, vilket är
|
||
* fel tradition för ett system som beskriver sig som ett tyskt
|
||
* industriverktyg. Reglerna nedan gäller bara ALVA-ytan; butiken lämnas
|
||
* som den är.
|
||
*
|
||
* Snittet deklareras i src/alva/system.ts och speglas här därför att
|
||
* kaskaden måste nå även de element komponenterna inte själva sätter
|
||
* stil på — rubriker fångas annars av värdapplikationens h1–h6-regel.
|
||
*/
|
||
.alva-yta,
|
||
.alva-yta h1,
|
||
.alva-yta h2,
|
||
.alva-yta h3,
|
||
.alva-yta h4,
|
||
.alva-yta h5,
|
||
.alva-yta h6,
|
||
.alva-yta button,
|
||
.alva-yta input,
|
||
.alva-yta select,
|
||
.alva-yta textarea {
|
||
font-family:
|
||
"DIN 2014",
|
||
"FF DIN",
|
||
"IBM Plex Sans",
|
||
"Inter",
|
||
"Helvetica Neue",
|
||
Helvetica,
|
||
Arial,
|
||
system-ui,
|
||
sans-serif;
|
||
}
|
||
|
||
/* Siffror står i kolumn. En beteckning jämförs oftare än den läses. */
|
||
.alva-yta {
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.alva-yta .font-mono {
|
||
font-family:
|
||
ui-monospace,
|
||
"IBM Plex Mono",
|
||
"SF Mono",
|
||
"Cascadia Mono",
|
||
Menlo,
|
||
Consolas,
|
||
"Liberation Mono",
|
||
monospace;
|
||
}
|
||
|
||
@layer utilities {
|
||
.animate-fade-up {
|
||
animation: fadeUp 0.8s ease-out forwards;
|
||
}
|
||
|
||
@keyframes fadeUp {
|
||
from {
|
||
opacity: 0;
|
||
transform: translateY(20px);
|
||
}
|
||
to {
|
||
opacity: 1;
|
||
transform: translateY(0);
|
||
}
|
||
}
|
||
|
||
.text-balance {
|
||
text-wrap: balance;
|
||
}
|
||
|
||
/* Calculator slider — minimal, exclusive */
|
||
.calculator-slider {
|
||
-webkit-appearance: none;
|
||
appearance: none;
|
||
height: 4px;
|
||
background: hsl(var(--border));
|
||
border-radius: 999px;
|
||
outline: none;
|
||
cursor: pointer;
|
||
transition: background 0.2s ease;
|
||
}
|
||
.calculator-slider:hover {
|
||
background: hsl(var(--muted));
|
||
}
|
||
.calculator-slider::-webkit-slider-thumb {
|
||
-webkit-appearance: none;
|
||
appearance: none;
|
||
width: 26px;
|
||
height: 26px;
|
||
border-radius: 50%;
|
||
background: hsl(var(--primary));
|
||
border: 3px solid hsl(var(--card));
|
||
box-shadow: 0 2px 10px hsl(var(--primary) / 0.35);
|
||
cursor: grab;
|
||
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
||
}
|
||
.calculator-slider::-webkit-slider-thumb:hover {
|
||
transform: scale(1.1);
|
||
box-shadow: 0 4px 16px hsl(var(--primary) / 0.5);
|
||
}
|
||
.calculator-slider::-webkit-slider-thumb:active {
|
||
cursor: grabbing;
|
||
}
|
||
.calculator-slider::-moz-range-thumb {
|
||
width: 26px;
|
||
height: 26px;
|
||
border-radius: 50%;
|
||
background: hsl(var(--primary));
|
||
border: 3px solid hsl(var(--card));
|
||
box-shadow: 0 2px 10px hsl(var(--primary) / 0.35);
|
||
cursor: grab;
|
||
}
|
||
}
|
||
|
||
/* Guidad Felsökning: utskriftsvänlig kundrapport — mörkt arbetsläge på
|
||
skärm, svart på vitt på papper. Interaktiva element döljs vid utskrift. */
|
||
@media print {
|
||
.felsokning-print,
|
||
.felsokning-print * {
|
||
background: #fff !important;
|
||
color: #111 !important;
|
||
border-color: #d4d4d8 !important;
|
||
animation: none !important;
|
||
}
|
||
.felsokning-print nav,
|
||
.felsokning-print button,
|
||
.felsokning-print input,
|
||
.felsokning-print textarea {
|
||
display: none !important;
|
||
}
|
||
}
|