Styleguide för pensionsmyndigheten.se
Developers
Frontend Guidelines
Main
Vi utvecklar utifrån våra riktlinjer och beslut. SAD Externwebben Frontend dokumentet innehåller flera kapitel av de övergripande riktlinjer som vi utvecklar efter.
Frontend i följande sub-områden
- HTML
- CSS
- JavaScript
- Tillgänglighet
HTML
HTML riktlinjer
Vi kodar HTML och använder template språk Handlebars.js
Undvik att implementera logik i hbs-filerna. I några av våra webbplatser har vi JSP också.
CSS
CSS riktlinjer
Prefix/namespace: Alla våra klasser ska ha ett prefix/namespace, på Styleguide s_ och lokalt på presentationstjänsterna tar vi prefix från tjänstens namn tex Mina Utbetalningar mu_
BEM
Vi använder BEM namnstandard, Harry Roberts variant för att namnge css-klasser. Det innebär att vi delar in sidan i block och element (=htmltaggar) i block. Ett block är t ex
Element som hör till ett block namnges med blockets namn först, sedan __ och sedan elementets namn
Det finns inga nivårer av element, element i element namnges bara som "blockets-namn__elementets-namn". Om det finns behov av att ytterligare bryta ut delar så kan man påbörja ett nytt block. Element och block kan ha modifier-klass som signalerar att det är en variant av det ursprungliga elementet. Modifier-klassen läggs på förutom basklassen t ex
Flytta gärna css som måste överlagras till modifier-klassen för att undvika onödig överlagring. Det är okej med element som inte finns i sin basform utan bara med olika modifiers.
State-klasser
Element och block kan ha en state-klass som signalerar att det befinner sig i ett visst tillstånd. Detta används ofta när man med javascript vill förändra ett element och markera att det är aktivt, expanderat, felaktigt etc. State-klassen läggs på ytterligare till elementet. State-klasser börjar med ```is-``` (förutom namespace)
.s_contact-form__input {
//style för element
&.s_is-error {
//style för element när det är fel
}
}
Filstruktur
Varje css-block (se ovan) ska ligga i en fil som heter samma som blocket. Vi använder _ för att markera sass-filer som ska inkluderas i andra.
I en fil med namnet `_contact-form.scss` får bara klasser som börjar med `.s_contact-form` finnas.** State-klasser (.s_is-..) undantaget. Om ett block behöver stylas olika beroende på dess kontext ska en modifier läggas på (istället för att styla på förälderns klass).
Formatering av koden
Vi utgår ifrån default uppsättning av regler i [sass-lint](https://github.com/sasstools/sass-lint) med några få undantag, se sass-lint.yml i styleguide All css som berör ett element ska ligga inuti det elementets måsvingar. Det gäller såväl modifier-klasser, state-klasser, mediaqueries och saker som påverkas av en förälder (inom blocket). Exempel:
.s_contact-form__input {
font-size: 1.2em;
@include s_mq-gte-small {
font-size: 1.4em;
}
&.s_contact-form__input--left {
float: left;
}
&.s_is-active {
font-weight: bold;
}
.s_contact-form.s_is-error & {
border-color: $color-error;
}
}
Vad vi stylar på
Vi använder med få undantag klasser för att styla element. Normalize-css och bas-css får sätta style direkt på htmltagg. I det fall vi inte kan påverka html (det kommer från CMS) kan vi styla direkt på element inom blocket.
Gömma element
För att dölja/gömma element används attributet hidden. Exempel:
.s_some-block__some-element {
//style för element
&[hidden] {
//dölj element med hidden attribut
display: none;
}
}
Andra riktlinjer för sass
- Alla färger deklareras i varibler
- Använd $_ för att markera en variabel som bara används lokalt i nuvarande fil
- Använd mixins, inte extends
JavaScript
JavaScript riktlinjer
Ramverk/bibliotek: Vi använder så få ramverk och bibliotek som möjligt för att sidan inte ska bli för tung. Det är okej att använda små bibliotek (max 5kB) som utför en specifik uppgift där vi vinner tid och förvaltningskostad på att använda ett färdigt bibliotek. Bibliotek hämtas ner via npm och laddas mha
där de används. Webpack ser till att biblioteket bara laddas en gång.
Namnstandard
- Namnge filer med små bokstäver och bindestreck mellan orden
statistics-service.js
- Namnge test-filer med .test på slutet
statistics-service.test.js
- Namnge konstanter med stora bokstäver
const ERROR_CLASS = 's_is-error';
- Namnge klasser med stor bokstav först
class MyClass {}
- Använd generellt camelcase i övrig javascript
const myVariable = 'hej';
- Namnge variabler som håller DOM-element med $ först
var $elem = document.querySelector('.s_js-my-elem');
- Namnge privata metoder (som inte är tänkta att användas utanför klass/modul) med _
_myEventListener = function() {}
Moduler
Vi använder tre sätt för att skriva javascript-moduler, klasser, objekt eller funtioner.
Klasser
Klasser ska användas för moduler som kan ha flera instanser på samma sida. Se till att koden inuti klassen inte jobbar med element globalt, utan alltid letar efter element inuti elementet som modulen initieras i.
Initiera klass från "index.js"
Objekt
Ifall du är säker på att din modul bara ska köras en gång per sida bör du använda ett objekt istället för klass. Det blir ett naturligt singleton och det är lättare att förstå att modulen bara kan initieras en gång per sida.
Initiera objekt från "index.js"
Funktion
I de fall javascriptet är mycket enkelt kan det gå att göra som en ren funktion. Exempel på detta är index-filerna som bara initierar komponenter.
Css klasser i javascript
- Klasser som används av javascript ska prefixas
s_js-
- Klasser som är prefixade "s_js-" får ej användas av css för styling, element som används av javascript har alltså en klass för javascript och en för styling
- Klasser som används för att initiera en viss javascriptmodul får gärna heta som modulen fast med prefix först dubbla klassnamn, ett för js
och ett för css
class="s_js-my-module s_my-module"my-module.js //Filnamn
- Klasser som används för att hitta element inuti modulen namnges enligt BEM standard precis som för vanliga css-klasserna
- State-klasser får sättas direkt av javascript, dessa börjar alltid med "s_is-" och beskriver ett tillstånd på ett element
if (!isValid($input)) { $input.classList.add('s_is-error'); }
- State-klasser får användas av både javascript och css
Dölja element
Använd gärna attributet ```hidden``` för att dölja/visa element. Lägg dit attributet för att dölja elementet, ta bort det för att visa elementet.
Parametrar och statiska variabler till moduler
Använd gärna data-attribut för att skicka in parametrar/variabler till javascript-moduler. Data-attributen ska namnges med prefix "data-s_"
Logiska variabler
För att göra koden mer läsbar kan man använda logiska variabler. D.v.s. variabler som beskriver ett tillstånd istället för att lista en lång komplex if satts.
logicVar = (a && b) || c;
if(logicVar){...}
-----
const personIsValidPensionReceiver = isPerson(person.pNumber) && person.isValid || person.hasExemption;
if(personIsValidPensionReceiver){...}
Länkar
Tillganglighet
Tillgänglighet riktlinjer
- Huvudinnehåll är åtkomligt utan javascript
- Rätt html5 element (article, header, footer, main mm)
- Korrekt rubrikstruktur (h1 -> h2 -> h3 osv, börja om på h1 inuti article)
- Formulär använder fieldset+legend för att gruppera fält och label finns för alla fält
- Färgkontrast - text mot bakgrund (kolla med Color contrast check)
- Tabba genom sidan funkar bra (även fäll in/ut funktioner etc)
- Tabbfokus syns tydligt (ram med bjärt färg, t ex turkos, runt elementet)
- Felmeddelanden läses upp (lägg role="alert" och aria-live="assertive" på elementet)
- Element som fäller ut annat innehåll markeras med aria-expanded=true/false och aria-controls (som hänvisar till utfällt element)
- Använd riktigt button-element för knappar (istället för att lägga role="button" på annan tagg)
- Använd autocomplete="new-password" för att undvika browserns automatiska ifyllnad.
- För obligatoriska fält, sätt attributet required (undvik aria-required).
Axe-Core tillgänglighetstestning
För att stödja dig som utvecklare i att koda tillgängligt, använder vi JS-libbet Axe-core i våra dev-miljöer. Det validerar den färdigrenderade sidan mot WCAG 2.1. Om sidan har valideringsfel, rapporteras dessa i sidhuvudet. Axe-core körs alltså enbart i dev-miljöer (hostnamn måste börja på 'dev-').
Om du vill använda Axe i valfri annan miljö, kan du antingen skapa en kaka i LocalStorage med namnet 'va_enabled'. Du kan även kicka igång Axe i konsollen med 'window.pm.devTools.validateAccessibility.init()'. Det kan vara användbart för att kontrollera dynamisk HTML som ändrats efter den initiala sidrenderingen.
Testa gärna som om du vore blind/synskadad genom att köra sidan med ChromeVox (plugin till Chrome).
Här nedan följer lite aria-tips
- Använd alltid lämpligt "role"-attribut i samband med aria för att få aria-attributet att fungera
- aria-label - Läser upp angiven text om label inte finns
- aria-labelledby - Läser upp texten i angivet element om label inte finns
- aria-describedby - Läser upp texten i angivet element
- Inkludera inte mixins från Styleguide till en presentationstjänst, använd css klass istället tex s_icon-plus
Visual Regression Test
Jobba med Visual Regression Testing
Deploya dina ändringar till din Openshift miljö.
Navigera till terminalen under ps-styleguide och kör:
När testarna har körts, öppnas en ny flik i webbläsaren där testresultatet visas. Verifiera att endast dina ändringar färgmarkerats som diff.
Om du vill acceptera resultatet kör du "npm run regression:approve". Nya versioner av de bildfiler du förändrat kommer då att skapas. Gör "git commit" och "git push" endast på de nya versionerna.
Så skapar vi ett test
Det finns flera implementationer att skapa test med.
Under kataloggen styleguide/ps-styleguide/visual-regression/tests/
finns:
- baseScenarios.js
- elementsScenarios.js
- componentsScenarios.js
- developersScenarios.js
Det är indelat såsom de olika sidor på Styleguide.
tex om man skapar en ny section på base, då kan man lägga en ny entry i arrayen ['color', 'typography', 'space'] under baseScenarios.js,
Under elementsScenarios.js finns det flera mer interaktion med element för att skapa avancerade test. text
Exempel Sidor
Här finns länkar till exempelsidor
- Containers
- Formulärsida
- Granskasida
- Kvittosida
- Ansökanflöde
- Ändringsflöde
- Felsida
- Chatbot
- Enkät
- Co-browsing
Generella felsidor
- Tekniskt fel (500)
- Åtkomst nekad (401, 403)
- Inloggning misslyckades
- Du är nu utloggad
- Du har loggats ut pga inaktivitet
Övrigt
Expandable
Expandable är en egenskap man kan sätta på ett block som visar ett annat block
Expandable lägger också en ikon på trigger-elementet
Expandable
Jag blev öppnad!
Smooth scroll to
Egenskapen placerar önskat yta i fokus för användaren vid klick på ett element som har klassen "s_js-smooth-scroll-to"
Table
Header 1 | Header 2 | Header 3 | Header 4 | Siffor |
---|---|---|---|---|
column 1 | column 2 | column 3 | column 4 | 456 789kr |
column 1 | column 2 | column 3 | column 4 | 8366% |
Länk i tabell | Länk i tabell | Länk i tabell | Länk i tabell | Länk i tabell |
Summa 1 | Summa 2 | Summa 3 | Summa 4 | Summa 5 |
ResponsiveTable
Main
Detta är exempel på hur en responsive-table ser ut och fungerar
Header 1 | Header 2 | Header 3 | Header 4 | Header 5 | Header 6 | |
---|---|---|---|---|---|---|
En himla responsiv tabell | ||||||
Alfredo Förändring i år %: 10 000 | Innehav sedan: 10 000 | Förändring i år %: 10 000 | Förändring i år kr: 10 000 | Snitt/år: 10 000 | Förändring sedan köp: 10 000 | Värde: 10 000 |
Bergamo Förändring i år %: 10 000 | Innehav sedan: 10 000 | Förändring i år %: 10 000 | Förändring i år kr: 10 000 | Snitt/år: 10 000 | Förändring sedan köp: 10 000 | Värde: 10 000 |
Cellus Förändring i år %: 10 000 | Innehav sedan: 10 000 | Förändring i år %: 10 000 | Förändring i år kr: 10 000 | Snitt/år: 10 000 | Förändring sedan köp: 10 000 | Värde: 10 000 |
Totalt värde: 10 000 Totalt | 10 000 |
Code
Exempel på html-kod för responsive-table
Skapar upp en responsiv tabell.
Header 1 | Header 2 | Header 3 | Header 4 | Header 5 | Header 6 | |
---|---|---|---|---|---|---|
En himla responsiv tabell | ||||||
Alfredo Förändring i år %: 10 000 | Innehav sedan: 10 000 | Förändring i år %: 10 000 | Förändring i år kr: 10 000 | Snitt/år: 10 000 | Förändring sedan köp: 10 000 | Värde: 10 000 |
Bergamo Förändring i år %: 10 000 | Innehav sedan: 10 000 | Förändring i år %: 10 000 | Förändring i år kr: 10 000 | Snitt/år: 10 000 | Förändring sedan köp: 10 000 | Värde: 10 000 |
Cellus Förändring i år %: 10 000 | Innehav sedan: 10 000 | Förändring i år %: 10 000 | Förändring i år kr: 10 000 | Snitt/år: 10 000 | Förändring sedan köp: 10 000 | Värde: 10 000 |
Totalt värde: 10 000 Totalt | 10 000 |
Panel
Panel är en återkommande design mönster för att få en information att sticka ut
Standard varianten
Detta är huvudet i panelen
Variant med kropp
Detta är huvudet i panelen
Detta är kroppen i panelen
Variant med annan border
Detta är huvudet i panelen
Detta är kroppen i panelen
Confirm-variant
Detta är huvudet i panelen
Detta är kroppen i panelen
Flow-variant
Flödespanelen krävs att den ligger i någonting (t.ex. container)
Detta är ett besökt stegs panelhuvud
Detta är ett aktivt stegs panelhuvud
Detta är ett obesökt stegs panelhuvud
list
Onumererad lista
- En punkt
- En till punkt
Horisontell lista
- En sak
- En till sak
Punktlista
- En sak
- En till sak
Lista med ikoner
Cirkel
Cirkel kan användas som den är eller med infomation i.
Standard varianten med och utan info
Border variant
Liten variant
box
Box är en container med border och padding
Kommer säkert kompletteras med fler varianter
Standard varianten
I'm a box
container
Container används för att skapa ytor för t.ex. cta-formulär och onboarding.
Container med outer-klass reglerar centrering av innehållet. Genom att använda inner-klassen regleras marginaler uppåt och nedåt. Content-klassen används för att få padding för innehållet samt reglera bakgrundsfärg (t.ex. cta-kvitto).
Container utan style (t.ex. för att positionera sidrubrik)
I'm a container
Attention-container för t.ex. onboarding-ytor
CTA-container för formulär
Formulär
Formulär och dess komponenter
För att gruppera flera komponenter används fieldset och legend motsvarar då h3-rubriker.
LabelText
Main
Detta är exempel på hur en print-knapp ser ut och fungerar
Code
Exempel på html-kod för en print-knapp
Lägger till print-style och icon till en knapp samt kopplar en funktion för att öppna webbläsarens utskrift-funktion när man klickar på knappen.
ExpandAll
Main
Detta är exempel på hur en expand-all-knapp ser ut och fungerar
Code
Exempel på html-kod för en expand-all-knapp
Expanderar t.ex alla expandable-panels på en sida.
ShowHide
Main
Detta är exempel på hur en show-hide ser ut och fungerar
Code
Exempel på html-kod för show-hide
Kopplar event för att visa/dölja html-element. Funktionen initieras genom att sätta css-klassen ps_js-show-hide på ett html-element, t.ex. button, checkbox, radio, select. Sedan använder man följande data-attribut för att ange vad som ska visas/döljas:
data-show Ange en komma-separerad lista med css-selektorer för html-element som ska visas när man klickar på detta element.
data-hide Ange en komma-separerad lista med css-selektorer för html-element som ska döljas när man klickar på detta element.
data-toggle Ange en komma-separerad lista med css-selektorer för html-element som ska visas/döljas när man klickar på detta element.
data-toggle-select Ange en komma-separerad lista med css-selektorer för html-element som ska visas när man väljer respektive option i selecten, övriga element kommer att döljas.
EnableDisable
Main
Detta är exempel på hur enable-disable fungerar
Code
Exempel på html-kod för enable-disable
Kopplas till ett html-element genom att sätta klassen s_js-enable-disable. Gör sedan andra html-element enabled/disabled med hjälp av följande data-attribut som antingen tar en css-selector eller en komma-separerad lista med css-selectorer:
- data-enable Gör ett eller flera html-element enabled
- data-disable Gör ett eller flera html-element disabled
- data-enable-disable Togglar ett eller flera html-element enabled/disabled
Clear
Main
Detta är exempel på hur en clear ser ut och fungerar
Code
Exempel på html-kod för clear
Kopplar event för att rensa html-element. Funktionen initieras genom att sätta css-klassen s_js-clear på ett html-element, t.ex. button, checkbox, radio. Sedan använder man data-attributet data-clear för att ange css-selectorer för de element som ska rensas.
Filter
Planerare
Planerare!
Småbarnförälder/väntar barn
sma-barn-vantar-barn!
Anställd
Du börjar tjäna in till tjänstepensionen den månad du fyller 25 år och du fortsätter tjäna in till du är 65 år. Är du målare eller elektriker börjar du tjäna in pengar till din Avtalspension SAF-LO från 13 års ålder.Fel
Ett tekniskt fel har uppstått
Vår webbplats verkar ha fått tekniskt fel. Försök gärna igenom om en stund och se om det fungerar, eller ta kontakt med oss så hjälper vi dig.
Kontakt 0771-776 776
PnrInput
Main
Detta är exempel på hur en pnr-input ser ut och fungerar
Code
Exempel på html-kod för pnr-input
Formaterar angivet personnummer enligt [ÅÅÅÅMMDD-XXXX] när användaren lämnar fältet. Personnummer kan anges som:
- [ÅÅÅÅMMDD-XXXX]
- [ÅÅÅÅMMDDXXXX]
- [ÅÅÅÅMMDD XXXX]
- Alla varianter med mellanslag och bindestreck
DateInput
Main
Detta är exempel på hur en date-input ser ut och fungerar
Code
Exempel på html-kod för date-input
Lägger till en datepicker samt formaterar angivet datum enligt [ÅÅÅÅ-MM-DD] när användaren lämnar fältet. Datum kan anges som:
- [ÅÅÅÅ-MM-DD]
- [ÅÅÅÅMMDD]
- [ÅÅÅÅ MM DD]
YearMonthInput
Main
Detta är exempel på hur en year-month-input fungerar
Code
Exempel på html-kod för year-month-input
En månadsväljare kommer att visas när fältet får fokus. Antalet månader som visas i månadsväljaren kan begränsas genom att ange antalet månader bakåt med attributet data-min-months och framåt med attributet data-max-months. Formaterar angivet datum enligt [ÅÅÅÅ-MM] när användaren lämnar fältet. Input kan anges som:
- [ÅÅÅÅ-MM]
- [ÅÅÅÅ MM]
- [ÅÅÅÅ/MM]
- [ÅÅÅÅMM]
AdaptiveSelect (Multi-select och Input-select)
Main
Detta är exempel på hur en multi-select ser ut
Detta är två exempel på hur en input-select kan se ut
- AMF
- SEB
- Avanza
- Nordea
- Avanza
- Bluestep
- Danske bank
- Handelsbanken
- ICA-banken
- Klarna
- Länsförsäkringar
- Medmera bank
- Nordea
- Nordnet
- Santander Consumer bank
- SBAB
- SEB
- Skandiabanken
- Sparbanken Sjuhärad
- Sparbanken Skåne
- Swedbank
- Wasakredit
Code
Kodexempel på multi-select med default option samt två options valda
Kodexempel på input-select där listan visas vid fokus
- AMF
- SEB
- Avanza
- Nordea
Kodexempel på input-select där listan endast visas vid inmatning med max 5 förslag
- AMF
- SEB
- Avanza
- Nordea
AddRemove
Main
Detta är exempel på hur en add-remove ser ut
-
- AMF
- SEB
- Avanza
- Nordea
Code
Exempel på html-kod för add-remove
Exempel på hur man initierar en add-remove
Komponenten initieras automatiskt om man lägger till css-klassen "s_js-add-remove--init". Om man har javascript-funktioner som behöver köras på något html-element när man har lagt till en ny rad så får man ta bort "--init" från css-klassen och sedan själv initiera komponenten. I det fallet lägger man till en callback- parameter med en callback-funktion som kommer att köras varje gång en ny rad läggs till.
När en ny rad läggs till så kopieras första raden och alla input- och select-element rensas och namnen indexeras om. Eventuella komponenter kommer att initieras automatiskt.
Flow (FlowService/FlowPanel)
Main
Detta är exempel på hur ett ansökanflöde ser ut
Ansökanflöde
Detta är ett exempel på ett ansökanflöde där första steget laddas i formulärläge. Kunden fyller i information och går sedan vidare till formulärdelen i nästa steg. Föregående steg visar då sin granskadel med det ifyllda datat. Kunden kan alltid gå tillbaka och ändra tidigare steg men måste då gå igenom efterföljande steg igen.
Steg 1
Steg 2
Steg 3
Code
Exempel på html-kod för ett ansökanflöde
Ett flöde har en flödesrubrik samt flödesinfotext. Varje steg i flödet har en stegrubrik och stegmarkeringar samt en formulärsdel (med rubrik och html-innehåll) och en granskadel (med rubrik och html-innehåll). Html-innehållet i stegen brukar oftast klientrenderas.
Exempel på js-kod för ett ansökanflöde
Ett ansökanflöde skapas upp genom att skapa en FlowService (med tjänstens namn (för adobe analytics) samt en lista med flödesstegen (html-element) som inparametrar). Flödet kan sedan initieras med serverlagring initWithServerStorage eller med klientlagring initWithClientStorage, där båda metoderna tar fyra parametrar:
- panelConfig objekt med flödeskonfiguration inkl. validering för varje steg (se exempel nedan).
- loadForms (default true) ska formulärdelarna laddas direkt när sidan laddas eller först när man går framåt i flödet.
- loadReviews (default false) ska granskadelarna laddas direkt när sidan laddas eller först när man går framåt i flödet.
- isFlow (default true) ska sättas till true för ansökanflöden.
Flow Change (FlowService/FlowPanel)
Main
Detta är exempel på hur ett ändringsflöde ser ut
Ändringsflöde
Detta är ett exempel på ett ändringsflöde. Varje steg laddas i granskaläge och visar kundens data. Genom att klicka ändra på en granskadel kommer kunden till motsvarande formulärdel och kan där göra ändringar. När kunden sedan klickar "Spara ändring" så visas åter granskadelen med ändrad data.
Bostadsinformation
Information om pension
Information om pension
Code
Exempel på html-kod för ett ändringsflöde
Ett flöde har en flödesrubrik samt flödesinfotext. Varje steg i flödet har en stegrubrik och stegmarkeringar samt en formulärsdel (med rubrik och html-innehåll) och en granskadel (med rubrik och html-innehåll). Html-innehållet i stegen brukar oftast klientrenderas.
Exempel på js-kod för ett ändringsflöde
Ett ändringsflöde skapas upp genom att skapa en FlowService (med tjänstens namn (för adobe analytics) samt en lista med flödesstegen (html-element) som inparametrar). Flödet kan sedan initieras med serverlagring initWithServerStorage eller med klientlagring initWithClientStorage, där båda metoderna tar fyra parametrar:
- panelConfig objekt med flödeskonfiguration inkl. validering för varje steg (se exempel nedan).
- loadForms (default true) ska formulärdelarna laddas direkt när sidan laddas eller först när man ändrar ett block.
- loadReviews (default false) ska sättas till true för ändringsflöden.
- isFlow (default true) ska sättas till false för ändringsflöden.
Divider
Main
Divider s_divider Divider s_divider--readmoreCode
s_divider
Divider med modifier s_divider--readmore
CharacterCounter
Main
Detta är exempel på hur en CharacterCounter fungerar
Code
Exempel på html-kod för CharacterCounter
Lägger till en teckenräknare till textarea-element. Detta sker i de fall elementet har ett maxlength-attribut samt klassen s_js-character-counter
ModalSpinner
Main
Lorem Ipsum
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Senectus et netus et malesuada fames ac turpis. Nulla facilisi etiam dignissim diam quis enim. Sed risus ultricies tristique nulla aliquet enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Tellus at urna condimentum mattis pellentesque id nibh. Urna cursus eget nunc scelerisque viverra mauris in aliquam. Fermentum et sollicitudin ac orci phasellus. At urna condimentum mattis pellentesque id nibh. Iaculis eu non diam phasellus vestibulum lorem sed risus. Ac tortor dignissim convallis aenean. Eu scelerisque felis imperdiet proin. Morbi non arcu risus quis varius quam. Vel orci porta non pulvinar neque laoreet. Auctor eu augue ut lectus arcu bibendum at varius vel. Tortor condimentum lacinia quis vel eros donec ac odio. Venenatis tellus in metus vulputate eu. Consectetur adipiscing elit ut aliquam. Eu ultrices vitae auctor eu augue ut lectus.
Filuppladdning kan ta flera minuter
Code
Exempel på html-kod för ModalSpinner.
Genom att använda klassen s_box__spinner för att markera ett område som ska laddas, i kombination med id s_js-addSpinner, s_js-removeSpinner, s_js-toggleSpinner på ett element som ska trigga en spinner så kommer en spinner att automatiskt initieras när sidans komponenter initieras. Man kan välja om man vill ha html-strukturen för spinnern i sin sida.
Rubrik
Text som kan innehålla något
Laddar data
Man kan även automatiskt generera en spinner och kan då ange text via attributet data-spinner-text
Rubrik
Text som kan innehålla något
Om man t.ex. vill kunna ha flera spinner på samma sida så kan man inte använda klassen s_box__spinner i kombination med id s_js-addSpinner, s_js-removeSpinner, s_js-toggleSpinner eftersom detta bara kommer att visa/dölja första spinnern på sidan. Det går då i stället att använda metoderna addModalSpinner, removeModalSpinner, toggleModalSpinner.
Rubrik
Text som kan innehålla något
js-required
Main
När användaren stängt av JavaScript och funktionalitet kräver det. Visa info meddelande samt lägg til cssklass "s_js__required"
Code
Exempel på html-kod för en js-required
Visar info meddelande som frågar användaren om att tillåta JavaScript
Din webbläsare stödjer inte javascript
För att kunna använda tjänsten behöver du tillåta javascript.
Disclaimer (Friskrivning)
Main
Detta är exempel på hur Disclaimer (friskrivning) ser ut och fungerar
En friskrivningstext enligt nedan ska finnas omedelbart före varje knapprad med en signeringsknapp där användaren kan starta en signering.
Code
Exempel på html-kod för Disclaimer
Lägg till styleguide/disclaimer
omedelbart före raden med signeringsknappen i hbs-filen.
Friskrivningstexten hämtas från Styleguide. Om en annan text önskas, kan den skickas som argument till styleguide/disclaimer
.
Exempel på resulterande html-kod där en disclaimer lagts till:
Template-component
Main
Detta är sg_box en komponentmall med tabs för styleguide
Som utvecklare kopierar du mappen "template-component" och börjar implementera din kod med hjälp av den.
Mappen finns på path: resources\templates\components\template-component
Code
Example: Knapp med ikon
Info
sg_box har en tydlig filstruktur.
Namnet på innehållet man vill presentera är basen.
Bilden visar filstruktur på template-component
Tabs mappen innehåller .hbs filer med innehåll för respektive tab.
Följande är en minimal kod for sg_box med en enda tab
För att skapa en tab till, lägg ny li class="sg_box__list-item" och ny div class="sg_js-box__details"