For utviklere
Malreferanse
Referanse for egen HTML og JS på en komponent: malsyntaks, variabler, actions, rensing, JS, grenser og eksempler.
Hvordan du åpner koderedigereren, står på Egen kode på en komponent.
Hvor: designeren, Customize with code › Code på en komponent, i modusen Advanced. Seksjonen Custom component følger de samme reglene.
Roten er butikkens
Hver komponent har en rot som butikken tegner. Malen din er innholdet i roten.
- Toppfeltets rot er
[data-bs-header]. Butikken setter tilstandene[data-bs-transparent],[data-bs-scrolled]og[data-bs-sticky]på roten, også når toppfeltet er din egen HTML. - Skriv ikke noe eget
<header>i malen. Begynn med det som skal stå inni. - CSS-en din avgrenses til roten. JS-en din får roten som
root. - En Custom component-seksjon har roten
[data-bs-block="<seksjons-id>"].
Alle røtter står under Kroker og CSS-referanse.
Malsyntaks
Malen er HTML med variabler i doble krøllparenteser. Dette er hele syntaksen.
| Skrivemåte | Hva |
|---|---|
{{storefront.name}} | Verdien, alltid HTML-escapet. En ukjent variabel gir tom tekst. |
{{#each nav}} … {{/each}} | Gjentar blokken for hver post i en liste. |
{{this}}, {{this.label}} | Posten i en #each, eller et felt på posten. Et bart {{label}} slås opp på posten først. |
{{@index}}, {{@first}}, {{@last}} | Telleren fra 0, og sann på første og siste runde. |
{{#if cart.count}} … {{else}} … {{/if}} | Viser blokken når verdien er sann. {{else}} er valgfritt. |
{{#unless brand.logoUrl}} … {{/unless}} | Det motsatte av #if. |
- Tom tekst,
0, tom liste ogfalseregnes som usant. - Det finnes ingen måte å skrive ut HTML uten escaping på.
- Det finnes ingen hjelpefunksjoner og ingen inkluderte maler.
Grenser
| Grense | Verdi |
|---|---|
| Malens lengde | 200 000 tegn |
| Den tegnede HTML-en | 200 000 tegn |
| CSS-ens lengde | 200 000 tegn |
| JS-ens lengde | 100 000 tegn |
| Nestede blokker | 32 nivåer |
| Steg per tegning | 50 000 |
- Det som er lengre, klippes, med en advarsel som viser hvor, for eksempel
css cut at 200 000 characters. - En tegning avbrytes etter 50 000 steg. En løkke i en løkke kan ikke få butikken til å henge.
- En mal på 33 333 tegn eller mer tegnes én gang uten data i designeren. Treffer den da en grense, står det under May cut with some data på fanen Code.
- Butikken viser bare det dens egen tegning klipper.
Feil og advarsler
En mal som ikke kan leses, tegner ingenting. Det gjelder for eksempel en {{#each}} som aldri lukkes, eller en blokk som lukkes med feil tagg. Butikken viser da standardutseendet, og designeren viser feilen ved koden.
| Hvor | Hva du ser |
|---|---|
| Designeren | Feilen eller advarselen i rødt under koden. |
| Butikkens HTML, feil | <!-- bs-component-error: … --> inne i <template data-bs-component-errors>. |
| Butikkens HTML, advarsel | <!-- bs-component-warning: … --> på samme sted. Komponenten tegnes likevel. |
| Produktkort eller banner som ble klippet | data-bs-component-warning på roten. Konsollen viser årsaken én gang per stil. |
En advarsel kan gjelde en CSS-regel som ikke kunne avgrenses, eller et alternativ som ble avvist.
Variabler
Header, Menu panel og Footer
De tre deler ett sett variabler. Seksjonen Custom component får det samme settet.
| Variabel | Type | Hva |
|---|---|---|
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten |
brand.logoUrl | string | Logoens adresse, tom når ingen finnes |
brand.footerLogoUrl | string | Lys logo for mørke flater. Faller tilbake på logoUrl |
brand.logoHeight | number | Logoens høyde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
nav[] | list | Toppkategoriene: label, href, children[] |
nav[].label | string | Kategoriens navn |
nav[].href | string | Lenke til kategorien |
nav[].children[] | list | Underkategorier med samme felt som toppnivået, label og href. Gå gjennom dem med {{#each this.children}}{{this.label}}{{/each}} |
pages[] | list | Sider som vises i menyen: label, href |
cart.count | number | Alltid 0 når siden tegnes, fordi handlekurven finnes i nettleseren. Skriv den i <span data-bs-cart-count>. Butikken holder det elementet oppdatert |
social[] | list | Sosiale lenker: key, label, href |
contact.email | string | Kontakt-e-post, tom når ingen er satt |
contact.phone | string | Telefon, tom når ingen er satt |
currency.code | string | Valgt valuta |
currency.options[] | list | Valutaene butikken selger i: code, label. Tom for en besøkende fra et land under Not sold to med Prices hidden |
search.href | string | Lenke til søkesiden |
menu.links[] | list | Menyens store lenker i rekkefølge, fra Menu panel › Links: label, href, children[], category, draft, products[] |
menu.links[].label | string | Lenketeksten: din egen, ellers kategoriens eller sidens navn |
menu.links[].href | string | Hvor lenken går |
menu.links[].children[] | list | En kategorilenkes underkategorier: label, href. Tom for en side eller en adresse |
menu.links[].category | string | Kategoriens id for en kategorilenke, ellers tom |
menu.links[].draft | boolean | Siden er ikke live ennå. Bare på designerens arbeidsflate: butikken viser ikke lenken |
menu.links[].products[] | list | Kortene for lenken: kategoriens produkter, utvalgte først og med underkategoriene, ellers standardkortene. Med kortets felt |
menu.secondary[] | list | Menyens små lenker i rekkefølge: label, href |
menu.heading | string | Overskriften over produktene (Heading over the products), tom når den ikke finnes |
menu.products[] | list | Standardkortene: de utvalgte produktene i rekkefølge, med kortets felt. Tom til menyen har hentet dem |
i18n.menu | string | "Meny" på butikkens språk |
i18n.close | string | "Lukk" |
i18n.search | string | "Søk" |
i18n.searchPlaceholder | string | Søkefeltets plassholder |
i18n.cart | string | "Handlekurv" |
i18n.wishlist | string | "Ønskeliste" |
i18n.shop | string | "Butikk" |
i18n.contact | string | "Kontakt" |
i18n.orders | string | "Spor ordren din" |
Product card
Én mal per kort. Den tegnes for hvert produkt i et rutenett.
| Variabel | Type | Hva |
|---|---|---|
product.id | string | Produktets id, for data-bs-product-id |
product.title | string | Tittelen |
product.href | string | Lenke til produktsiden |
product.price | string | Prisen, formatert i kundens valuta. Når variantene koster ulikt, er det den laveste prisen, med "från" foran i en svensk butikk og "from" i alle andre. Tom uten pris |
product.priceAmount | string | Samme pris uten "från" eller "from". Tom uten pris |
product.priceVaries | boolean | Sann når variantene som kan kjøpes, koster ulikt. Prisen er da den laveste av dem |
product.compareAtPrice | string | Tidligere pris: laveste pris de 30 dagene før prisreduksjonen, formatert. Tom når butikken ikke oppgir noen reduksjon |
product.currency | string | Valutakode |
product.image | string | Første bildes adresse, tom når ingen finnes |
product.imageAlt | string | Bildets alt-tekst |
product.badge | string | Salgsmerkets tekst, tom når ingen finnes |
product.sku | string | Tom. Kortets produktdata har ikke noe artikkelnummer |
product.inStock | boolean | Sann på kortet, lageret sjekkes i kassen. Usann for en besøkende fra et land under Not sold to, dit butikken ikke selger. Bruk den til kjøpsknappen, ikke til en tekst om at varen er utsolgt. Med Prices hidden er også price, priceAmount, compareAtPrice og badge tomme |
product.variantId | string | Tom. Add-to-cart fra et kort legger produktets eneste variant i handlekurven, eller åpner produktsiden når produktet har flere |
product.meta | string | Tagglinjen under tittelen |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten |
brand.logoUrl | string | Logoens adresse, tom når ingen finnes |
brand.footerLogoUrl | string | Lys logo for mørke flater. Faller tilbake på logoUrl |
brand.logoHeight | number | Logoens høyde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
Product page
Galleriet og kjøpspanelet, tegnet for varianten som vises. Velger kunden en annen variant med select-variant, tegnes malen på nytt. Prisen, artikkelnummeret, lagerlinjen, product.variantId og hver selected følger med. Resten av siden er standardsidens: detaljer, anmeldelser og relaterte produkter. Under malen tegner butikken produktets spørsmål, linjen om tillegg i handlekurven og boksen Optional add-ons. add-to-cart i malen legger med tilvalgene kunden har krysset av for, og stopper ved et obligatorisk spørsmål som er tomt, som standardknappen.
| Variabel | Type | Hva |
|---|---|---|
product.id | string | Produktets id, for data-bs-product-id |
product.title | string | Tittelen |
product.href | string | Lenke til produktsiden |
product.description | string | Hele beskrivelsen som tekst, uten formatering. Tom når ingen finnes |
product.paragraphs[] | list | Beskrivelsens avsnitt, overskrifter og lister som tekst, én streng per blokk |
product.shortDescription | string | Den korte beskrivelsen som tekst. Tom når ingen finnes |
product.intro | string | Teksten ved prisen: den korte beskrivelsen, ellers første avsnitt, klippet |
product.price | string | Den viste variantens pris, formatert i kundens valuta. Tom uten pris |
product.compareAtPrice | string | Tidligere pris: laveste pris de 30 dagene før prisreduksjonen, formatert. Tom når butikken ikke oppgir noen reduksjon |
product.currency | string | Valutakode |
product.image | string | Første bildes adresse (den viste variantens eget bilde først), tom når ingen finnes |
product.imageAlt | string | Første bildes alt-tekst |
product.images[] | list | Alle bilder: url, alt, caption (forhandlerens egen tekst, tom når ingen finnes) |
product.badge | string | Salgsmerkets tekst, tom når ingen finnes |
product.sku | string | Den viste variantens artikkelnummer, tom når ingen finnes |
product.stockStatus | string | in_stock, preorder eller out_of_stock, for den viste varianten |
product.stockLabel | string | Lagerlinjens tekst på butikkens språk ("Få igjen (3)", "Forhåndsbestilling · sendes om 10 dager") |
product.inStock | boolean | Legg i handlekurven virker: tilgjengelig lager i modusen Automatic, eller modusen In stock (manual) eller Preorder. Aldri i modusen Out of stock, og aldri for en besøkende fra et land under Not sold to. Bruk den til kjøpsknappen og stockStatus til lagerteksten. Med Prices hidden er price, compareAtPrice, badge og variantenes price tomme |
product.variantId | string | Den viste varianten, for data-bs-variant-id på add-to-cart. Tom uten varianter |
product.variantTitle | string | Den viste variantens tittel, tom uten varianter |
product.variants[] | list | Alle varianter: id, title, sku, price, stockStatus, stockLabel, inStock, selected, options[] (name, value) |
product.options[] | list | Alternativgruppene i velgerens rekkefølge: name, label (navnet slik velgeren skriver det, for eksempel Number of balls for Number-of-balls), values[] |
product.options[].values[] | list | Én verdi: value, selected, available, variantId (det select-variant velger for verdien) |
product.categories[] | list | Kategoriene produktet ligger i, den første = brødsmulen: name, slug, href |
product.tags[] | list | Produktets tagger, som strenger |
product.meta | string | Tagglinjen (de første taggene), tom når ingen finnes |
product.properties[] | list | Egenskapene siden viser, i gruppenes rekkefølge: group (tom uten gruppe), label, value (slik butikken skriver den), values[] (verdiens deler), display (bar, chips, table eller badge), numeric, percent (stolpens fylling på sin skala, 0–100). Filter only og Hidden er ikke med |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten |
brand.logoUrl | string | Logoens adresse, tom når ingen finnes |
brand.footerLogoUrl | string | Lys logo for mørke flater. Faller tilbake på logoUrl |
brand.logoHeight | number | Logoens høyde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
currency.code | string | Valgt valuta |
cart.count | number | Alltid 0 når siden tegnes. Skriv den i <span data-bs-cart-count>, som i toppfeltet |
i18n.addToCart | string | "Legg i handlekurven" på butikkens språk |
i18n.chooseVariant | string | "Velg variant" |
i18n.inStock | string | "På lager" |
i18n.outOfStock | string | "Utsolgt" |
i18n.preorder | string | "Forhåndsbestilling" |
i18n.priceOnRequest | string | "Pris på forespørsel" |
i18n.vat | string | "Inkl. mva." eller "Ekskl. mva.", slik butikken priser |
i18n.wishlist | string | "Lagre i ønskelisten" |
i18n.home | string | "Hjem", brødsmulens første ledd |
Gallery
Produktbildene på produktsiden. Er produktsiden egen HTML, tegner den malen galleriet selv, og galleriets design tegnes ikke i det hele tatt. Koderedigereren, butikkens rapport og arbeidsflaten viser det.
| Variabel | Type | Hva |
|---|---|---|
images[] | list | Alle bilder, den viste variantens eget først: url, alt, caption (forhandlerens egen tekst, tom når ingen finnes) |
image | string | Første bildes adresse, tom når ingen finnes |
imageAlt | string | Første bildes alt-tekst |
count | number | Antall bilder |
title | string | Produktets tittel |
product.id | string | Produktets id, for data-bs-product-id på toggle-wishlist |
product.title | string | Tittelen |
product.href | string | Lenke til produktsiden |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten |
brand.logoUrl | string | Logoens adresse, tom når ingen finnes |
brand.footerLogoUrl | string | Lys logo for mørke flater. Faller tilbake på logoUrl |
brand.logoHeight | number | Logoens høyde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
i18n.images | string | "Produktbilder" på butikkens språk |
i18n.previous | string | "Forrige bilde" |
i18n.next | string | "Neste bilde" |
i18n.noImage | string | "Ingen bilde" |
i18n.wishlist | string | "Lagre i ønskelisten" |
Category
Samlingssiden med produktene den viser: en kategori, All products eller søkeresultater. Malen får sidens filtre som data i filters[]: hver gruppe med verdiene, antallene, kryssene og en lenke som krysser av eller fjerner krysset. Butikken legger ingen filtre i malens egen markup. En mal viser det adressen angir (?sort=…&f.…&category=…). Malen erstatter Collection-sidens seksjoner, produktrutenettet inkludert. Sidens egen CSS (fanen Code på Collection-siden) gjelder fortsatt.
| Variabel | Type | Hva |
|---|---|---|
category.id | string | Kategoriens id |
category.name | string | Kategoriens navn |
category.description | string | Beskrivelsen, tom når ingen finnes |
category.slug | string | Kategoriens slug |
category.href | string | Lenke til kategorien |
category.image | string | Kategoribildets adresse, tom når ingen finnes |
products[] | list | Produktene som listes, etter kundens filtre og sortering. Én post per produkt med kortets felt: id, title, href, price, priceAmount, priceVaries, compareAtPrice, currency, image, imageAlt, badge, sku, inStock, variantId, meta. For en besøkende fra et land under Not sold to er inStock usann, og med Prices hidden er price, priceAmount, compareAtPrice og badge tomme |
count | number | Antall produkter som listes (etter filtre) |
total | number | Antall produkter i kategorien |
empty | boolean | Sann når ingenting listes |
filters[] | list | Filtergruppene siden viser, i rekkefølge. På All products og i søkeresultatene står gruppen Category først |
filters[].label | string | Gruppens navn |
filters[].param | string | Adresseparameteren verdiene skriver: f. |
filters[].selectedCount | number | Antall avkryssede verdier i gruppen |
filters[].values[] | list | Gruppens verdier, i rekkefølge |
filters[].values[].label | string | Det verdien vises som (en kategoris navn) |
filters[].values[].value | string | Verdien slik lenken skriver den |
filters[].values[].count | number | Produkter på siden med verdien |
filters[].values[].depth | number | En underkategoris dybde i gruppen Category, ellers 0 |
filters[].values[].selected | boolean | Avkrysset av kunden |
filters[].values[].href | string | Siden med verdien avkrysset eller ikke, de andre kryssene beholdt |
filtered | number | Verdier kunden har krysset av |
clearHref | string | Siden uten kryss |
sticky | boolean | Filters stay in view er på, og siden har filtre |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten |
brand.logoUrl | string | Logoens adresse, tom når ingen finnes |
brand.footerLogoUrl | string | Lys logo for mørke flater. Faller tilbake på logoUrl |
brand.logoHeight | number | Logoens høyde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
i18n.shop | string | "Butikk" på butikkens språk, brødsmulens første ledd |
i18n.products | string | "Produkter" |
i18n.empty | string | "Ingen produkter i denne kategorien ennå." |
i18n.noMatch | string | "Ingen produkter matcher filtrene dine." |
i18n.filters | string | "Filtre" |
i18n.clear | string | "Nullstill filtre" |
Banner
Seksjonens egne innstillinger.
| Variabel | Type | Hva |
|---|---|---|
heading | string | Overskriften |
subtitle | string | Underoverskriften |
imageUrl | string | Bildets adresse |
imageAlt | string | Bildets alt-tekst |
ctaLabel | string | Knappens tekst |
ctaHref | string | Knappens lenke |
align | string | left eller center |
valign | string | top, center eller bottom |
size | string | xs … xl eller screen |
bleed | string | contained eller full |
ctaStyle | string | primary, light eller outline |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten |
brand.logoUrl | string | Logoens adresse, tom når ingen finnes |
brand.footerLogoUrl | string | Lys logo for mørke flater. Faller tilbake på logoUrl |
brand.logoHeight | number | Logoens høyde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
Skriv overskriften som <h1> når banneret er sidens tittelblokk. Da er den sidens tittel. Mangler malen <h1>, legger butikken en skjult sidetittel etter banneret når banneret er sidens tittelblokk. Banneret er tittelblokk når det er det første banneret eller heroen på siden og ingen overskriftsseksjon på nivå 1 tar tittelen.
Actions
Markupen din har ingen egne hendelseshåndterere. Sett data-bs-action på et element, så gjør butikken resten ved klikk. Butikken bruker de samme lytterne som for standardmarkupen. Attributtet kan sitte på hvilket element som helst, også på en <svg>.
| Action | Kreves | Valgfritt | Hva |
|---|---|---|---|
data-bs-action="open-cart" | – | – | Åpner handlekurven slik butikken er satt opp under Checkout › Cart: panelet eller handlekurvsiden |
data-bs-action="open-search" | – | – | Åpner søkefeltet |
data-bs-action="open-menu" | – | – | Åpner menypanelet |
data-bs-action="close-menu" | – | – | Lukker menypanelet |
data-bs-action="add-to-cart" | data-bs-product-id | data-bs-variant-id, data-bs-quantity | Legger produktet i handlekurven |
data-bs-action="toggle-wishlist" | data-bs-product-id | – | Legger produktet i ønskelisten, eller fjerner det |
data-bs-action="select-variant" | data-bs-variant-id | – | Velger varianten på produktsiden. Prisen, lagerlinjen, product.variantId og hver selected følger med. Bare i produktsidens egen mal |
data-bs-action="open-cookie-settings" | – | – | Åpner cookieinnstillingene, samme dialog som standardbunntekstens lenke |
data-bs-action="set-currency" | data-bs-currency | – | Bytter valuta til koden i attributtet, som data-bs-currency="EUR". Kodene finnes i currency.options[] |
data-bs-action="subscribe-newsletter" | data-bs-newsletter | – | Melder adressen i feltet name="email" på nyhetsbrevet. Sett actionen på <form> eller på send-knappen |
- Mangler et attributt som kreves, skjer ingenting ved klikket.
data-bs-quantityskal være et positivt heltall. Annet leses som 1.- En action som ikke finnes, eller som mangler et attributt som kreves, gir en advarsel når malen kompileres. Advarselen står ved koden og som
<!-- bs-component-warning: … -->i butikkens HTML. subscribe-newsletterkrever et skjema meddata-bs-newsletterog et feltname="email". Den kjøres når skjemaet sendes, så Enter i feltet virker. Adressen får samme kontroll og samme svar som i standardbunnteksten.
add-to-cart uten data-bs-variant-id, for eksempel på et kort, spør butikken om produktet:
| Produktet har | Butikken |
|---|---|
| Ingen varianter | Legger produktet i handlekurven |
| Én variant på lager | Legger varianten i handlekurven |
| Flere varianter, eller én variant som er utsolgt eller forhåndsbestilles | Åpner produktsiden |
Kroker
Krokene er attributtene i butikkens HTML som CSS-en og JS-en din retter seg mot: komponentens rot, indre elementer og tilstander på roten. Alle kroker per komponent, krokene på siden og reglene i tokens-CSS-en står under Kroker og CSS-referanse.
Rensing
Den tegnede malen renses før den når siden, på samme måte på serveren og i nettleseren.
| Gruppe | Elementer som beholdes |
|---|---|
| Struktur | div, section, header, footer, nav, aside, article, ul, ol, li, p, h1–h6, dl, dt, dd, details, summary, figure, figcaption, blockquote, address |
| Tekst | span, strong, em, b, i, u, s, small, sup, sub, mark, cite, abbr, time, br, hr, wbr |
| Lenker og bilder | a, img, picture, source |
| Skjemaer | button, input, label, form |
| SVG | svg, g, path, circle, ellipse, rect, line, polyline, polygon |
Attributter som beholdes:
- på alle elementer:
class,id,title,role,tabindex,lang,dir,hidden,style,translate, allearia-*, alledata-bs-*ogdata-footer-* - på lenker:
href,target,rel - på bilder:
src,srcset,sizes,alt,width,height,loading - på knapper og felt:
type,name,value,placeholder,disabled - på
form:actionnår det er en sti i butikken, for eksempel/search, ogmethodnår det ergetellerpost - på SVG:
viewBox,fill,stroke,stroke-width,d,pointsog de andre tegneattributtene
Det som fjernes:
script,style,iframe,object,embed,noscript,template,textarea,select,video,audio,canvas,dialog,mathogtitle, med alt innhold- alle
on*-attributter og alle kommentarer - andre
data-*enndata-bs-*ogdata-footer-* - adresser som ikke er relative,
https:,http:,mailto:ellertel:, unntattdata:-bilder påimg - en
actionsom peker utenfor butikken
Et element som ikke står i listen, fjernes, men innholdet beholdes. style="…" renses som annen CSS. På lenker beholdes target="_blank", som får rel="noopener", og target="_self". Andre target fjernes. Åpne elementer lukkes til slutt, så resultatet er alltid balansert HTML.
Klasser og størrelser
Standardmarkupen har noen Tailwind-klasser, for eksempel flex, items-center og gap-4. Designeren kompilerer ingen nye klasser fra malen din. En klasse som ikke allerede finnes i butikken, gjør ingenting. Sett størrelse og avstand i fanen Design, i Code › CSS på krokene eller som style på elementet.
CSS
CSS-en på fanen Code gjelder bare komponenten. Hvordan selektorene avgrenses til roten, hva rensingen fjerner og hvordan du laster egne skrifttyper, står under Kroker og CSS-referanse.
Om px og rem: se Egen CSS og kode i head.
JS
- JS-en kjører én gang per sidelasting, når siden er lastet, på hver side der komponenten finnes.
- Den får komponentens rotelement som
root. Finnes ikke komponenten på siden, kjører den ikke. - Menypanelets rot finnes bare mens panelet er åpent. JS-en kjører hver gang panelet åpnes, mot den nye roten. Bind lyttere på
root, ikke pådocument. - En feil, også en syntaksfeil, logges i nettleserens konsoll med stilens navn. Den stopper verken siden eller andre komponenters JS.
- Koden kjører også på arbeidsflaten. Bryteren Run JS in the builder setter den på pause der i økten. Butikken og Preview (⌘P) kjører den som vanlig.
root.querySelectorAll('[data-bs-header-icons] a').forEach((a) => {
a.addEventListener('mouseenter', () => a.classList.add('is-hot'));
});
Et produktkort finnes mange ganger på en side. root er da det første kortet. Bruk document.querySelectorAll('[data-bs-card]') for alle.
Sidens JS på fanen Code kjører på samme måte, uten root. Det du skriver på siden Collection, gjelder alle kategorisider.
Eksempel: navbar på en Classic-butikk
Målet er et toppfelt i full bredde. Det er gjennomsiktig over hero-bildet med hvit logo og hvite ikoner, og hvitt når siden har scrollet 24 px. Til høyre står fire ikoner på 30 px: søk, ønskeliste, handlekurv og meny. Det meste er kontroller. Resten er seks linjer CSS.
Kontrollene på komponentpanelet for Header:
- Bytt startsidens teksthero mot et Image banner med Width full og et mørkt foto.
- Velg Look: Icons + panel.
- Sett Options: Sticky på, Transparent over hero på, Menu label av, Search på, Cart på, Announcement bar av.
- Velg den svarte logoen som Logo under Content, med høyde 40. Velg den hvite som Light logo.
- Kontroller at Theme › Colours › Header text over hero er hvit.
Slå på Advanced, trykk Customize with code og skriv under Code › CSS:
[data-bs-header] { padding: 16px; }
@media (min-width: 768px) { [data-bs-header] { padding: 32px; } }
[data-bs-header-inner] { max-width: none; }
[data-bs-header-icons] { gap: 16px; }
[data-bs-header-icons] a, [data-bs-header-icons] button { opacity: 1; }
[data-bs-header-icons] svg { width: 30px; height: 30px; stroke-width: 1.6; }
Trykk Save as new style og gi stilen navnet "Min navbar". Stilen ligger nå under Your header styles i alle butikker i workspacet. Logoene hører til temaet og stilles inn under Content i hver butikk.
Samme navbar som egen HTML
Åpne Code › HTML og trykk Start from the standard markup. Feltet fylles med standardutseendets markup. Malen nedenfor er samme navbar skrevet fra bunnen. Den bruker de samme indre krokene, så CSS-en ovenfor gjelder uendret. Burgeren åpner butikkens standardpanel, som har en egen Close-knapp og lukkes med Escape.
<div data-bs-header-inner>
<a href="/" aria-label="{{storefront.name}}">
<img src="{{brand.logoUrl}}" alt="{{storefront.name}}" height="{{brand.logoHeight}}" class="logo-dark">
<img src="{{brand.footerLogoUrl}}" alt="" height="{{brand.logoHeight}}" class="logo-light">
</a>
<div data-bs-header-icons>
<button type="button" data-bs-action="open-search" aria-label="{{i18n.search}}">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>
</button>
<a href="/wishlist" data-bs-wishlist-icon aria-label="{{i18n.wishlist}}">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8L12 21l8.8-8.6a5.5 5.5 0 0 0 0-7.8z"/></svg>
</a>
<button type="button" data-bs-action="open-cart" data-bs-cart-icon aria-label="{{i18n.cart}}">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><path d="M6 6h15l-1.5 9h-12z"/><circle cx="9" cy="20" r="1"/><circle cx="18" cy="20" r="1"/><path d="M6 6 5 3H2"/></svg>
<span data-bs-cart-count>{{cart.count}}</span>
</button>
<button type="button" data-bs-action="open-menu" data-bs-menu-button aria-label="{{i18n.menu}}">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><path d="M3 6h18M3 12h18M3 18h18"/></svg>
</button>
</div>
</div>
I standardmarkupen bytter butikken logo selv. I en egen mal ligger begge bildene i markupen, og CSS-en velger med tilstanden på roten:
[data-bs-header-inner] { display: flex; align-items: center; justify-content: space-between; }
[data-bs-header-icons] { display: flex; align-items: center; }
.logo-light { display: none; }
[data-bs-transparent]:not([data-bs-scrolled]) .logo-dark { display: none; }
[data-bs-transparent]:not([data-bs-scrolled]) .logo-light { display: inline; }
Menypanelet som egen HTML
Butikken tegner panelets rot [data-bs-menu] og åpner det med open-menu. Malen går gjennom menyens lenker fra Menu panel › Links, de store med underkategorier og deretter de små:
<nav aria-label="{{i18n.menu}}">
<ul>
{{#each menu.links}}
<li>
<a href="{{this.href}}">{{this.label}}</a>
{{#if this.children}}
<ul>{{#each this.children}}<li><a href="{{this.href}}">{{this.label}}</a></li>{{/each}}</ul>
{{/if}}
</li>
{{/each}}
{{#each menu.secondary}}<li><a href="{{this.href}}">{{this.label}}</a></li>{{/each}}
</ul>
{{#if contact.email}}<p data-bs-menu-contact><a href="mailto:{{contact.email}}">{{contact.email}}</a></p>{{/if}}
<button type="button" data-bs-action="close-menu">{{i18n.close}}</button>
</nav>
open-search åpner butikkens søkefelt som et lag over toppfeltet og panelet. Har markupen din et element med [data-bs-search-slot], tegnes søkefeltet der i stedet. Et eget søkeskjema virker også:
<form action="/search" method="get" role="search">
<input type="search" name="q" placeholder="{{i18n.searchPlaceholder}}" aria-label="{{i18n.search}}">
<button type="submit">{{i18n.search}}</button>
</form>
Et produktkort som egen HTML
Butikken tegner kortets rot [data-bs-card]. Malen er innsiden. Knappen får produktet sitt gjennom attributtene.
<a href="{{product.href}}">
<div data-bs-card-media>
{{#if product.image}}<img src="{{product.image}}" alt="{{product.imageAlt}}" loading="lazy">{{/if}}
{{#if product.badge}}<span class="badge">{{product.badge}}</span>{{/if}}
</div>
<div data-bs-card-body>
<h3 data-bs-card-title>{{product.title}}</h3>
<p data-bs-card-price>{{#if product.compareAtPrice}}<s>{{product.compareAtPrice}}</s> {{/if}}{{product.price}}</p>
</div>
</a>
<button type="button" data-bs-action="add-to-cart" data-bs-product-id="{{product.id}}">Add to cart</button>