Alternativ B · Sundsvall DS

Kommunal service som känns som en produkt.

Samma tolv profilfärger, samma shadcn-grund, samma AI-perspektiv – men ett formspråk lånat från de bästa mjukvaruprodukterna: kommandopalett, sidopanel med assistent, konversationsformulär, bläckmörkt läge och två gradienter som signatur. Färgerna är förstärkta i kroma så att de fungerar på skärm, inte bara på papper.

Ärenden · Barn och utbildning

Skolskjuts

Att göra 12MinaFörfaller snartNytt ärende
Inkomna 5
Elias Lund, Bergsåkers skola
SBK-04471Förberett av AI
Maja Öberg, Hagaskolan
SBK-04480
Noel Sjödin, Kyrkmons skola
SBK-04482Ny
Handläggs 4
Alva Berg, växelvis boende
SBK-04398Komplettering
Liam Nordin, trafikfarlig väg
SBK-04412
Beslut 3
Sara Vikström
SBK-04301Beviljat
Omar Haddad
SBK-04355Beviljat
Skillnaden

Samma grund, annan ambition

Alternativ A tolkar profilen troget: fyra verksamhetsfärger, en åt gången, lugn och institutionell. Alternativ B tar profilens fyra kulörer och behandlar dem som ett spektrum, förstärker dem för skärm och lägger till de mönster som gör moderna produkter snabba att använda.

A · Sundsvall DSB · Aurora
FärgProfilens hex exakt, en verksamhetsfärg per tjänstProfilens nyanser, förstärkt kroma; blå primär för alla, spektrum som signatur
NeutralerKalla gråtoner, vit yta"Bläck": blåtonade neutraler ner till nästan-svart marinblå
Mörkt lägeFöljer systemLikvärdigt med ljust; interna verktyg är mörka som standard
FormRadie 4–20, rektangulära knapparRadie 8–28, pillerknappar, glas i överlägg, färgad glöd på primär
TypografiRaleway + InterBricolage Grotesque + Geist
NavigationMeny och brödsmulorKommandopalett först, rail, chips, sticky action bar
FormulärStegformulärKonversationsformulär med strukturerade kort, AI-förifyllning
AIRegler för agenter som bygger UIÄven UI-tillstånd för AI-innehåll: föreslaget, strömmande, väntar, konfidens, agentlogg
PassarMedborgartjänster med lagkrav, breda målgrupperInterna verktyg, handläggarappar, pilotprojekt, mobila medborgarappar
Färg

Profilen som spektrum

Överst profilens fyra primärfärger som de är. Underst samma fyra nyanser med höjd kroma och ljushet för skärm. Nyansen (hue) är bevarad inom två grader; det är det som gör att paletten fortfarande är Sundsvalls.

profil: #005595 · #00733b · #5b1f78 · #a90074aurora: electric · mint · violet · magenta
Fjordelectric-600 → mint-700 när text ligger på den (varje stopp ≥ 4.5:1 mot vitt). Den ljusare varianten electric-500 → mint-400 finns som g-fjord-deco och får bara användas utan text. Primär signatur: hero, primärknapp i kampanjläge, förlopp, slider. Aldrig som bakgrund för text under 20 px.
Auroraviolet-600 → magenta-600 när text ligger på den (≥ 5.7:1). Varianten med amber i slutet är dekorativ och bara för avatar och ikon. Reserverad för AI: assistentens avatar, AI-notiser, "förberett av AI". Betyder alltid att en modell varit inblandad.
Bläckneutraler ur Vattjom, kroma ökar mot mörkt
0#ffffff
50#f8fafd
100#f1f4f6
200#e4e8ed
300#d0d5d9
400#abb2b8
500#838a90
600#636a70
700#434f59
800#2a343e
900#13212d
950#04111c
1000#000610
Electricur Vattjom · primär
50#f1f7ff
100#deedff
200#bcdbff
300#8ec2fe
400#4fa1fc
500#0380ea
600#0c69be
700#01559f
800#04427d
900#00305f
950#001f42
Mintur Grönsta · success, fjord
50#e9fff1
100#c8fedd
200#96f6c0
300#5be9a2
400#1cd185
500#0fb472
600#0d915b
700#007346
800#005633
900#023e24
950#002714
Violetur Björnstigen · AI
50#fbf4ff
100#f4e4ff
200#eac9ff
300#dca3fe
400#c872f6
500#ab4adc
600#9033bd
700#75209b
800#581377
900#400a58
950#280838
Magentaur Juniskär · accent, destructive
50#fff3f8
100#fee2ef
200#fec4e1
300#fd98ce
400#f65bb6
500#e327a0
600#c00f85
700#9c036b
800#770451
900#560139
950#350122
Ambertillägg · warning
50#fff7ed
100#ffebd2
200#fed7a1
300#fdbd5d
400#f2a618
500#db9508
600#b2790e
700#8c5f0b
800#684505
900#4a2f00
950#311d00

Regel 1

Electric är primär i alla tjänster. Verksamhetstillhörighet visas med ord och ikon, inte med färg.

Regel 2

Gradienter finns på fem platser: hero, kampanjknapp, förlopp, AI-avatar, AI-notis. Ingen annanstans.

Regel 3

Ingen information bärs av en ljus ton ensam. Mjuka ytor har alltid kant (steg 500) och ikon, så de överlever en TV som tappar ljusa toner. Slå på "Simulera TV" och "Hög (TV)" uppe till höger.

Form och material

Mjukare, djupare, snabbare

Fyra radier, alla större

8 för chips och små kontroller, 12 för fält och kort i listor, 18 för kort och paneler, 28 för dialoger och sheets. Knappar är alltid piller. Det ger ett vänligare intryck och gör klickytor tydliga.

8121828piller

Bläck

Mörkt läge är inte grått. Det är marinblått bläck ur Vattjom, med surface, raised och glass som tre lager ovanpå.

Glöd

Primärknappen har en färgad skugga, inte en grå. Det är den enda komponenten med glöd.

Glas

Topbar, sticky action bar och kommandopalettens bakgrund använder blur och 88 % opacitet, tillräckligt för att text ovanpå alltid ska klara 4,5:1. I högkontrastläget blir de solida.

Rörelse

Knappar trycks ner en pixel. Paneler glider in på 200 ms. Strömmande text har markör. Inget annat rör sig av sig självt.

Typografi: Bricolage Grotesque + Geist

Bricolage för rubriker med tät spärrning, ett typsnitt med egen karaktär som ändå är lätt att läsa. Geist för allt gränssnitt, Geist Mono för ID och kod. Brödtext 15 px på desktop, 16 på mobil.

Beslut på tre dagar, inte tre veckor.Handläggaren ser allt som behövs i en vy och assistenten förbereder det som går att förbereda.SBK-2026-04471 · 5,2 km · riktlinje 2.1
Komponenter

shadcn/ui, tematiserat och utökat

Samma kontrakt som i alternativ A: tokens mappas till shadcn:s variabler. Skillnaden är formen, plus fyra komponenter som shadcn har men A inte använder: Command, Sheet, Sonner och Slider.

Buttonr/button.json
  • Primär: en per vy, glöd. Fjord-varianten bara i onboarding och kampanj.
  • AI-varianten betyder att en modell gör något; alltid med gnist-ikon.
  • Piller överallt utom ikonknappar (radie 10).
<Button>Fatta beslut</Button>
<Button variant="ai"><Sparkles/>Förbered med AI</Button>
Input, Combobox, Segmented, Switch, Sliderr/input.json · r/command.json · r/tabs.json · r/switch.json · r/slider.json
/
Föreslaget
Hämtat från folkbokföring och skolval. Tryck Tab för att godkänna.
ListaTavlaKarta
Auto-förberedRadie62
  • Fält med inre skugga, fokus ger 3 px ring i primär.
  • AI-föreslaget värde är ett eget tillstånd: violett kant, pill, Tab för att godkänna. Ett förslag blir aldrig ett värde utan en handling.
  • Segmented för vyval, tabs bara för innehållsflikar.
Command (⌘K)r/command.json
  • Allt som går att göra går att nå med ⌘K. Navigering, handlingar och frågor till assistenten i samma palett.
  • Senaste och föreslagna kommandon först. Naturligt språk faller igenom till assistenten.
  • Tryck ⌘K på den här sidan för en fungerande version.
Sheet, Toast, Tooltip, Notice, Skeletonr/sheet.json · r/sonner.json · r/tooltip.json · r/alert.json · r/skeleton.json

Bevilja skolskjuts?

Beslutet skickas till vårdnadshavaren och linje 30 meddelas. Du kan ångra i 10 minuter.

Beslut skickat till Anna Lund
Riktlinje 2.1: avstånd över 4 km, åk 4–6
Tre ärenden kan beviljas direktAlla uppfyller avståndskravet och saknar öppna kompletteringar.
  • Sheet från botten på mobil, från höger på desktop. Radie 28. Beslut i sheet, aldrig i modal mitt på skärmen.
  • Toast i bläck med Ångra som standard. Alla agenthandlingar går att ångra i 10 minuter.
  • AI-notis använder aurora-gradientens mjuka variant.
AI-tillstånd

Gränssnittet vet när en modell talar

Alternativ A reglerar hur AI bygger gränssnitt. Aurora reglerar också hur gränssnittet visar AI-genererat innehåll. Fem tillstånd som varje komponent kan ha, med fast form så att både människor och modeller känner igen dem.

Föreslaget state="suggested"

Föreslaget

Violett kant och pill. Godkänns med Tab eller klick, förkastas med Esc. Blir aldrig ett värde av sig självt.

Strömmar state="streaming"

Elias bor 5,2 km från skolan, vilket

Markör som blinkar, text som växer. Inga knappar förrän strömmen är klar. Går alltid att stoppa.

Väntar state="pending"

Skeleton i innehållets form med etiketten "Förbereder …". Efter 8 s: alternativ att fortsätta utan.

Konfidens confidence=0.86

Hög, 86 %Osäker, 54 %

Visas bara på förslag som påverkar beslut. Under 60 % kräver förslaget att handläggaren läser underlaget.

Agentlogg <AgentRun>

Hämtade folkbokföringsadress0,4 s · Ångra
Beräknade avstånd till Bergsåkers skola: 5,2 km1,1 s · Ångra
Skriver utkast till beslutpågår · Stoppa
Skickar beslut till vårdnadshavareväntar på godkännande

Varje steg en agent tar syns, kan stoppas och kan ångras. Steg som skickar något utanför systemet kräver alltid ett klick.

Mönster

Lånade från produkter, anpassade för förvaltning

Kommando först

⌘K når navigation, handlingar och assistenten. Menyer finns, men den som lärt sig paletten behöver dem inte. Handläggare som gör samma sak 40 gånger om dagen tjänar minuter.

Rail + arbetsyta + assistent

Tre kolumner: smal ikonrail, bred arbetsyta, sidopanel med assistent som kan fällas in. Assistenten ser det du ser och föreslår handlingar, aldrig utför utan godkännande.

Konversationsformulär

Medborgaren berättar, assistenten ställer följdfrågor och bygger ett strukturerat kort som visas i tråden. Kortet är formuläret. Inget fält utan att det behövs.

Tavla och lista, samma data

Ärenden visas som kanban för flöde, lista för volym, karta för geografi. Vyval i segmented control, filter som chips, sparade vyer per person.

Sticky action bar

Primär och sekundär handling i en glasremsa längst ner som följer med. Scrollen påverkar aldrig var man klickar.

Ångra, inte bekräfta

De flesta handlingar utförs direkt med en toast och Ångra. Dialog bara när något lämnar systemet eller inte går att återställa.

Tillämpning

Två sidor av samma system

Handläggarappen överst på sidan är den interna sidan, mörk som standard. Här är medborgarens sida: en mobil tjänst där ansökan är ett samtal, och en ljus översikt för medborgarens ärenden.

Medborgarapp: ansökan som samtal

Mönster: konversationsformulär, föreslaget-tillstånd, sticky action bar, sheet.

9:41Anna
Hej Anna. Vad kan jag hjälpa dig med?
Elias behöver skolskjuts till Bergsåker
Jag har hämtat Elias uppgifter från folkbokföringen. Stämmer det här?
BarnElias Lund, åk 4
SkolaBergsåkers skola
FrånKvarnvägen 12
Avstånd5,2 km Uppfyller kravet
Bor Elias växelvis hos två vårdnadshavare?
Nej, bara hos migJa, växelvis

Mina ärenden, ljus vy

Mönster: bento-översikt, statuspiller, AI-notis, ångra-toast.

Mina sidor
Bygglovet saknar en situationsplanJag kan skapa en från fastighetskartan om du vill. Skapa förslag

Skolskjuts, Elias

Handläggs

Beslut senast 28 september. Handläggare Karin Öhman.

Dag 6 av 10

Bygglov, altan

Komplettering

Situationsplan behövs senast 25 september.

Fakturor

Inget att betala.

Barn

Elias, Maja

Meddelanden

2 olästa

Felanmälan skickad
Arkitektur för AI

Generativt gränssnitt, inte bara genererad kod

Alternativ A låter en agent skriva React med rätt tokens. Aurora lägger ett lager till: komponenterna har ett JSON-schema, så att en modell kan svara med en beskrivning av ett gränssnitt som renderas direkt i tjänsten, i realtid, utan att kod skrivs. Samma registry, två vägar in.

Vad en modell skickar

{
  "pattern": "case-summary",
  "state": "suggested",
  "confidence": 0.86,
  "sources": ["riktlinje-2.1", "karta", "folkbokforing"],
  "children": [
    { "component": "KeyValue", "items": [
      { "label": "Avstånd", "value": "5,2 km", "intent": "success" }
    ]},
    { "component": "ActionRow", "actions": [
      { "label": "Bevilja", "intent": "primary",
        "requiresApproval": true, "undoable": true },
      { "label": "Granska mer", "intent": "secondary" }
    ]}
  ]
}

Vad som gäller

Intent, inte stilModellen anger intent (primary, success, ai …). Renderaren väljer token. En modell kan aldrig sätta en färg.
Tillstånd är obligatorisktAllt AI-innehåll bär state. Utan det renderas det inte.
Handlingar kräver godkännanderequiresApproval är standard för allt som lämnar systemet. undoable ger toast med Ångra.
Källor visassources renderas som chips i meddelandet. Inga källor, ingen konfidens över 60 %.
Schemat är registrytVarje mönster i design.sundsvall.se/r har ett JSON-schema och en React-implementation. MCP-servern exponerar båda.

Tokens i OKLCH, relativt

Skalorna definieras som funktioner av profilens ankare: oklch(from #005595 calc(l + .18) calc(c * 1.4) h). Ändrar kommunen en profilfärg följer hela systemet med, och en modell kan härleda nya steg utan att gissa.

När väljer man B?

När målgruppen är handläggare, när tjänsten bygger på en assistent, när mobilen är första skärmen, eller när kommunen vill visa att offentlig digital service kan kännas lika bra som det bästa man använder privat. Alternativ A är fortfarande rätt för breda medborgartjänster med lagkrav på enkelhet. De två delar tokens-struktur och registry, så en tjänst kan byta.