Merge main: Guidad Felsökning flyttar ur roten till felsokning/

Main är sedan den här grenen skapades en helt annan produkt — Semantika,
en mobilapp med egen CDK-infrastruktur. Den äger nu repots rot: en
npm-workspaces-monorepo med apps/mobile, services/api och infra.

För att båda ska rymmas i samma repo flyttar Guidad Felsökning in i en
egen katalog i stället för att göra anspråk på roten:

  felsokning/app        webbklienten (Vite, egen package.json och
                        eslint-/vitest-konfiguration)
  felsokning/services   plattformstjänsten och AI-orkestern
  felsokning/infra      Terraform och databasschemat
  felsokning/docs       vision, moduler, drift
  felsokning/supabase   edge-funktion och migrationer

Merge:n hade tagit bort 128 filer som Guidad Felsökning bygger på —
värdapplikationens komponenter, Supabase-klienten, tillgångar — eftersom
main raderat dem och den här grenen inte råkat ändra just dem. De är
återställda på sin nya plats. Utan dem gick varken bygget eller
testerna: ai.ts och synk.ts importerar Supabase-klienten.

Semantikas rotfiler är orörda: package.json, eslint.config.js och
.github/workflows/ är deras. Guidad Felsökning har egna motsvarigheter i
sin katalog.

CI flyttar samtidigt från GitHub Actions till .gitea/workflows — samma
syntax, egna runners. .github/workflows/ tillhör Semantika härefter.

Verifierat på den nya platsen: 96 vitest-tester, typkontroll, eslint på
både klient och tjänster, bygge, och integrationstest mot riktig Postgres.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
Claude
2026-08-04 12:22:49 +00:00
298 changed files with 23491 additions and 6140 deletions
+239
View File
@@ -0,0 +1,239 @@
@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;
}
}
@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;
}
}