Til udviklere
Skabelonreference
Reference for egen HTML og JS på en komponent: skabelonsyntaks, variabler, actions, rensning, JS, grænser og eksempler.
Hvordan du åbner kodeeditoren, står på Egen kode på en komponent.
Hvor: designeren, Customize with code › Code på en komponent, i tilstanden Advanced. Sektionen Custom component følger de samme regler.
Roden er butikkens
Hver komponent har en rod, som butikken tegner. Din skabelon er indholdet i roden.
- Sidehovedets rod er
[data-bs-header]. Butikken sætter tilstandene[data-bs-transparent],[data-bs-scrolled]og[data-bs-sticky]på roden, også når sidehovedet er din egen HTML. - Skriv ikke et eget
<header>i skabelonen. Begynd med det, der skal stå indeni. - Din CSS afgrænses til roden. Din JS får roden som
root. - En Custom component-sektion har roden
[data-bs-block="<sektions-id>"].
Alle rødder står under Kroge og CSS-reference.
Skabelonsyntaks
Skabelonen er HTML med variabler i dobbelte krøllede parenteser. Dette er hele syntaksen.
| Skrivemåde | Hvad |
|---|---|
{{storefront.name}} | Værdien, altid HTML-escapet. En ukendt variabel giver tom tekst. |
{{#each nav}} … {{/each}} | Gentager blokken for hver post i en liste. |
{{this}}, {{this.label}} | Posten i en #each, eller et felt på posten. Et bart {{label}} slås først op på posten. |
{{@index}}, {{@first}}, {{@last}} | Tælleren fra 0, og sand på første og sidste gennemløb. |
{{#if cart.count}} … {{else}} … {{/if}} | Viser blokken, når værdien er sand. {{else}} er valgfrit. |
{{#unless brand.logoUrl}} … {{/unless}} | Det modsatte af #if. |
- Tom tekst,
0, tom liste ogfalseregnes som falsk. - Der er ingen måde at skrive HTML ud uden escaping.
- Der er ingen hjælpefunktioner og ingen inkluderede skabeloner.
Grænser
| Grænse | Værdi |
|---|---|
| Skabelonens længde | 200 000 tegn |
| Den tegnede HTML | 200 000 tegn |
| CSS'ens længde | 200 000 tegn |
| JS'ens længde | 100 000 tegn |
| Indlejrede blokke | 32 niveauer |
| Trin pr. tegning | 50 000 |
- Det, der er længere, klippes med en advarsel, der viser hvor, for eksempel
css cut at 200 000 characters. - En tegning afbrydes efter 50 000 trin. En løkke i en løkke kan ikke få butikken til at hænge.
- En skabelon på 33 333 tegn eller mere tegnes én gang uden data i designeren. Rammer den så en grænse, står det under May cut with some data på fanen Code.
- Butikken viser kun det, dens egen tegning klipper.
Fejl og advarsler
En skabelon, der ikke kan læses, tegner intet. Det gælder for eksempel en {{#each}}, der aldrig lukkes, eller en blok, der lukkes med det forkerte tag. Butikken viser så standardudseendet, og designeren viser fejlen ved koden.
| Hvor | Hvad du ser |
|---|---|
| Designeren | Fejlen eller advarslen med rødt under koden. |
| Butikkens HTML, fejl | <!-- bs-component-error: … --> inde i <template data-bs-component-errors>. |
| Butikkens HTML, advarsel | <!-- bs-component-warning: … --> samme sted. Komponenten tegnes alligevel. |
| Produktkort eller banner, der blev klippet | data-bs-component-warning på roden. Konsollen viser årsagen én gang pr. stil. |
En advarsel kan gælde en CSS-regel, der ikke kunne afgrænses, eller et valg, der blev afvist.
Variabler
Header, Menu panel og Footer
De tre deler ét sæt variabler. Sektionen Custom component får det samme sæt.
| Variabel | Type | Hvad |
|---|---|---|
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vært: dens eget domæne, når det er verificeret, ellers bunstack.shop-værten |
brand.logoUrl | string | Logoets adresse, tom når intet findes |
brand.footerLogoUrl | string | Lyst logo til mørke flader. Falder tilbage på logoUrl |
brand.logoHeight | number | Logoets højde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
nav[] | list | Topkategorierne: label, href, children[] |
nav[].label | string | Kategoriens navn |
nav[].href | string | Link til kategorien |
nav[].children[] | list | Underkategorier med samme felter som topniveauet, label og href. Gennemløb dem med {{#each this.children}}{{this.label}}{{/each}} |
pages[] | list | Sider, der vises i menuen: label, href |
cart.count | number | Altid 0, når siden tegnes, fordi kurven findes i browseren. Skriv den i <span data-bs-cart-count>. Butikken holder det element opdateret |
social[] | list | Sociale links: key, label, href |
contact.email | string | Kontakt-e-mail, tom når ingen er sat |
contact.phone | string | Telefon, tom når ingen er sat |
currency.code | string | Valgt valuta |
currency.options[] | list | Valutaerne, butikken sælger i: code, label. Tom for en besøgende fra et land under Not sold to med Prices hidden |
search.href | string | Link til søgesiden |
menu.links[] | list | Menuens store links i rækkefølge, fra Menu panel › Links: label, href, children[], category, draft, products[] |
menu.links[].label | string | Linkteksten: din egen, ellers kategoriens eller sidens navn |
menu.links[].href | string | Hvor linket går hen |
menu.links[].children[] | list | Et kategorilinks underkategorier: label, href. Tom for en side eller en adresse |
menu.links[].category | string | Kategoriens id for et kategorilink, ellers tom |
menu.links[].draft | boolean | Siden er ikke live endnu. Kun på designerens arbejdsflade: butikken viser ikke linket |
menu.links[].products[] | list | Kortene for linket: kategoriens produkter, udvalgte først og med underkategorierne, ellers standardkortene. Med kortets felter |
menu.secondary[] | list | Menuens små links i rækkefølge: label, href |
menu.heading | string | Overskriften over produkterne (Heading over the products), tom når der ikke er nogen |
menu.products[] | list | Standardkortene: de udvalgte produkter i rækkefølge, med kortets felter. Tom, indtil menuen har hentet dem |
i18n.menu | string | "Menu" på butikkens sprog |
i18n.close | string | "Luk" |
i18n.search | string | "Søg" |
i18n.searchPlaceholder | string | Søgefeltets pladsholder |
i18n.cart | string | "Kurv" |
i18n.wishlist | string | "Ønskeliste" |
i18n.shop | string | "Butik" |
i18n.contact | string | "Kontakt" |
i18n.orders | string | "Spor din ordre" |
Product card
Én skabelon pr. kort. Den tegnes for hvert produkt i et gitter.
| Variabel | Type | Hvad |
|---|---|---|
product.id | string | Produktets id, til data-bs-product-id |
product.title | string | Titlen |
product.href | string | Link til produktsiden |
product.price | string | Prisen, formateret i kundens valuta. Når varianterne koster forskelligt, er det den laveste pris, med "från" foran i en svensk butik og "from" i alle andre. Tom uden pris |
product.priceAmount | string | Samme pris uden "från" eller "from". Tom uden pris |
product.priceVaries | boolean | Sand når de varianter, der kan købes, koster forskelligt. Prisen er så den laveste af dem |
product.compareAtPrice | string | Tidligere pris: laveste pris i de 30 dage før prisnedsættelsen, formateret. Tom når butikken ikke angiver en nedsættelse |
product.currency | string | Valutakode |
product.image | string | Første billedes adresse, tom når intet findes |
product.imageAlt | string | Billedets alt-tekst |
product.badge | string | Udsalgsmærkets tekst, tom når intet findes |
product.sku | string | Tom. Kortets produktdata har intet varenummer |
product.inStock | boolean | Sand på kortet, lageret tjekkes ved kassen. Falsk for en besøgende fra et land under Not sold to, hvor butikken ikke sælger. Brug den til købsknappen, ikke til en tekst om, at varen er udsolgt. Med Prices hidden er price, priceAmount, compareAtPrice og badge også tomme |
product.variantId | string | Tom. Add-to-cart fra et kort lægger produktets eneste variant i kurven, eller åbner produktsiden, når produktet har flere |
product.meta | string | Taglinjen under titlen |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vært: dens eget domæne, når det er verificeret, ellers bunstack.shop-værten |
brand.logoUrl | string | Logoets adresse, tom når intet findes |
brand.footerLogoUrl | string | Lyst logo til mørke flader. Falder tilbage på logoUrl |
brand.logoHeight | number | Logoets højde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
Product page
Galleriet og købspanelet, tegnet for den variant, der vises. Vælger kunden en anden variant med select-variant, tegnes skabelonen igen. Prisen, varenummeret, lagerlinjen, product.variantId og hver selected følger med. Resten af siden er standardsidens: detaljer, anmeldelser og relaterede produkter. Under skabelonen tegner butikken produktets spørgsmål, linjen om tillæg i kurven og boksen Optional add-ons. add-to-cart i skabelonen tilføjer de tilvalg, kunden har sat flueben ved, og stopper ved et obligatorisk spørgsmål, der er tomt, som standardknappen.
| Variabel | Type | Hvad |
|---|---|---|
product.id | string | Produktets id, til data-bs-product-id |
product.title | string | Titlen |
product.href | string | Link til produktsiden |
product.description | string | Hele beskrivelsen som tekst, uden formatering. Tom når ingen findes |
product.paragraphs[] | list | Beskrivelsens afsnit, overskrifter og lister som tekst, én streng pr. blok |
product.shortDescription | string | Den korte beskrivelse som tekst. Tom når ingen findes |
product.intro | string | Teksten ved prisen: den korte beskrivelse, ellers første afsnit, klippet |
product.price | string | Den viste variants pris, formateret i kundens valuta. Tom uden pris |
product.compareAtPrice | string | Tidligere pris: laveste pris i de 30 dage før prisnedsættelsen, formateret. Tom når butikken ikke angiver en nedsættelse |
product.currency | string | Valutakode |
product.image | string | Første billedes adresse (den viste variants eget billede først), tom når intet findes |
product.imageAlt | string | Første billedes alt-tekst |
product.images[] | list | Alle billeder: url, alt, caption (forhandlerens egen tekst, tom når ingen findes) |
product.badge | string | Udsalgsmærkets tekst, tom når intet findes |
product.sku | string | Den viste variants varenummer, tomt når intet findes |
product.stockStatus | string | in_stock, preorder eller out_of_stock, for den viste variant |
product.stockLabel | string | Lagerlinjens tekst på butikkens sprog ("Få tilbage (3)", "Forudbestilling · sendes om 10 dage") |
product.inStock | boolean | Læg i kurven virker: tilgængeligt lager i tilstanden Automatic, eller tilstanden In stock (manual) eller Preorder. Aldrig i tilstanden Out of stock, og aldrig for en besøgende fra et land under Not sold to. Brug den til købsknappen og stockStatus til lagerteksten. Med Prices hidden er price, compareAtPrice, badge og varianternes price tomme |
product.variantId | string | Den viste variant, til data-bs-variant-id på add-to-cart. Tom uden varianter |
product.variantTitle | string | Den viste variants titel, tom uden varianter |
product.variants[] | list | Alle varianter: id, title, sku, price, stockStatus, stockLabel, inStock, selected, options[] (name, value) |
product.options[] | list | Valggrupperne i vælgerens rækkefølge: name, label (navnet, som vælgeren skriver det, for eksempel Number of balls for Number-of-balls), values[] |
product.options[].values[] | list | Én værdi: value, selected, available, variantId (det select-variant vælger for værdien) |
product.categories[] | list | Kategorierne, produktet ligger i, den første = brødkrummen: name, slug, href |
product.tags[] | list | Produktets tags, som strenge |
product.meta | string | Taglinjen (de første tags), tom når ingen findes |
product.properties[] | list | Egenskaberne, siden viser, i gruppernes rækkefølge: group (tom uden gruppe), label, value (som butikken skriver den), values[] (værdiens dele), display (bar, chips, table eller badge), numeric, percent (bjælkens fyldning 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 vært: dens eget domæne, når det er verificeret, ellers bunstack.shop-værten |
brand.logoUrl | string | Logoets adresse, tom når intet findes |
brand.footerLogoUrl | string | Lyst logo til mørke flader. Falder tilbage på logoUrl |
brand.logoHeight | number | Logoets højde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
currency.code | string | Valgt valuta |
cart.count | number | Altid 0, når siden tegnes. Skriv den i <span data-bs-cart-count>, som i sidehovedet |
i18n.addToCart | string | "Læg i kurven" på butikkens sprog |
i18n.chooseVariant | string | "Vælg variant" |
i18n.inStock | string | "På lager" |
i18n.outOfStock | string | "Udsolgt" |
i18n.preorder | string | "Forudbestilling" |
i18n.priceOnRequest | string | "Pris på forespørgsel" |
i18n.vat | string | "Inkl. moms" eller "Ekskl. moms", som butikken prissætter |
i18n.wishlist | string | "Gem på ønskelisten" |
i18n.home | string | "Hjem", brødkrummens første led |
Gallery
Produktbillederne på produktsiden. Er produktsiden egen HTML, tegner dens skabelon selv galleriet, og galleriets design tegnes slet ikke. Kodeeditoren, butikkens rapport og arbejdsfladen viser det.
| Variabel | Type | Hvad |
|---|---|---|
images[] | list | Alle billeder, den viste variants eget først: url, alt, caption (forhandlerens egen tekst, tom når ingen findes) |
image | string | Første billedes adresse, tom når intet findes |
imageAlt | string | Første billedes alt-tekst |
count | number | Antal billeder |
title | string | Produktets titel |
product.id | string | Produktets id, til data-bs-product-id på toggle-wishlist |
product.title | string | Titlen |
product.href | string | Link til produktsiden |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vært: dens eget domæne, når det er verificeret, ellers bunstack.shop-værten |
brand.logoUrl | string | Logoets adresse, tom når intet findes |
brand.footerLogoUrl | string | Lyst logo til mørke flader. Falder tilbage på logoUrl |
brand.logoHeight | number | Logoets højde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
i18n.images | string | "Produktbilleder" på butikkens sprog |
i18n.previous | string | "Forrige billede" |
i18n.next | string | "Næste billede" |
i18n.noImage | string | "Intet billede" |
i18n.wishlist | string | "Gem på ønskelisten" |
Category
Samlingssiden med de produkter, den viser: en kategori, All products eller søgeresultater. Skabelonen får sidens filtre som data i filters[]: hver gruppe med værdierne, antallene, fluebenene og et link, der sætter eller fjerner fluebenet. Butikken lægger ingen filtre i skabelonens egen markup. En skabelon viser det, adressen angiver (?sort=…&f.…&category=…). Skabelonen erstatter Collection-sidens sektioner, produktgitteret medregnet. Sidens egen CSS (fanen Code på Collection-siden) gælder stadig.
| Variabel | Type | Hvad |
|---|---|---|
category.id | string | Kategoriens id |
category.name | string | Kategoriens navn |
category.description | string | Beskrivelsen, tom når ingen findes |
category.slug | string | Kategoriens slug |
category.href | string | Link til kategorien |
category.image | string | Kategoribilledets adresse, tom når intet findes |
products[] | list | Produkterne der listes, efter kundens filtre og sortering. Én post pr. produkt med kortets felter: id, title, href, price, priceAmount, priceVaries, compareAtPrice, currency, image, imageAlt, badge, sku, inStock, variantId, meta. For en besøgende fra et land under Not sold to er inStock falsk, og med Prices hidden er price, priceAmount, compareAtPrice og badge tomme |
count | number | Antal produkter der listes (efter filtre) |
total | number | Antal produkter i kategorien |
empty | boolean | Sand når intet listes |
filters[] | list | Filtergrupperne, siden viser, i rækkefølge. På All products og i søgeresultaterne står gruppen Category først |
filters[].label | string | Gruppens navn |
filters[].param | string | Adresseparameteren, værdierne skriver: f. |
filters[].selectedCount | number | Antal værdier med flueben i gruppen |
filters[].values[] | list | Gruppens værdier, i rækkefølge |
filters[].values[].label | string | Det, værdien vises som (en kategoris navn) |
filters[].values[].value | string | Værdien, som linket skriver den |
filters[].values[].count | number | Produkter på siden med værdien |
filters[].values[].depth | number | En underkategoris dybde i gruppen Category, ellers 0 |
filters[].values[].selected | boolean | Sat flueben ved af kunden |
filters[].values[].href | string | Siden med værdien med eller uden flueben, de andre flueben bevaret |
filtered | number | Værdier, kunden har sat flueben ved |
clearHref | string | Siden uden flueben |
sticky | boolean | Filters stay in view er slået til, og siden har filtre |
storefront.name | string | Butikkens navn |
storefront.slug | string | Butikkens slug |
storefront.host | string | Butikkens offentlige vært: dens eget domæne, når det er verificeret, ellers bunstack.shop-værten |
brand.logoUrl | string | Logoets adresse, tom når intet findes |
brand.footerLogoUrl | string | Lyst logo til mørke flader. Falder tilbage på logoUrl |
brand.logoHeight | number | Logoets højde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
i18n.shop | string | "Butik" på butikkens sprog, brødkrummens første led |
i18n.products | string | "Produkter" |
i18n.empty | string | "Ingen produkter i denne kategori endnu." |
i18n.noMatch | string | "Ingen produkter matcher dine filtre." |
i18n.filters | string | "Filtre" |
i18n.clear | string | "Ryd filtre" |
Banner
Sektionens egne indstillinger.
| Variabel | Type | Hvad |
|---|---|---|
heading | string | Overskriften |
subtitle | string | Underoverskriften |
imageUrl | string | Billedets adresse |
imageAlt | string | Billedets alt-tekst |
ctaLabel | string | Knappens tekst |
ctaHref | string | Knappens link |
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 vært: dens eget domæne, når det er verificeret, ellers bunstack.shop-værten |
brand.logoUrl | string | Logoets adresse, tom når intet findes |
brand.footerLogoUrl | string | Lyst logo til mørke flader. Falder tilbage på logoUrl |
brand.logoHeight | number | Logoets højde i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightlinjen |
Skriv overskriften som <h1>, når banneret er sidens titelblok. Så er den sidens titel. Mangler skabelonen <h1>, lægger butikken en skjult sidetitel efter banneret, når banneret er sidens titelblok. Banneret er titelblok, når det er det første banner eller hero på siden, og ingen overskriftssektion på niveau 1 tager titlen.
Actions
Din markup har ingen egne hændelseshåndterere. Sæt data-bs-action på et element, så gør butikken resten ved klik. Butikken bruger de samme lyttere som til standardmarkuppen. Attributten kan sidde på et hvilket som helst element, også på en <svg>.
| Action | Kræves | Valgfrit | Hvad |
|---|---|---|---|
data-bs-action="open-cart" | – | – | Åbner kurven, som butikken er indstillet under Checkout › Cart: panelet eller kurvsiden |
data-bs-action="open-search" | – | – | Åbner søgefeltet |
data-bs-action="open-menu" | – | – | Åbner menupanelet |
data-bs-action="close-menu" | – | – | Lukker menupanelet |
data-bs-action="add-to-cart" | data-bs-product-id | data-bs-variant-id, data-bs-quantity | Lægger produktet i kurven |
data-bs-action="toggle-wishlist" | data-bs-product-id | – | Lægger produktet på ønskelisten, eller fjerner det |
data-bs-action="select-variant" | data-bs-variant-id | – | Vælger varianten på produktsiden. Prisen, lagerlinjen, product.variantId og hver selected følger med. Kun i produktsidens egen skabelon |
data-bs-action="open-cookie-settings" | – | – | Åbner cookieindstillingerne, samme dialog som standardsidefodens link |
data-bs-action="set-currency" | data-bs-currency | – | Skifter valuta til koden i attributtet, som data-bs-currency="EUR". Koderne findes i currency.options[] |
data-bs-action="subscribe-newsletter" | data-bs-newsletter | – | Tilmelder adressen i feltet name="email" til nyhedsbrevet. Sæt actionen på <form> eller på dens send-knap |
- Mangler en påkrævet attribut, sker der intet ved klikket.
data-bs-quantityskal være et positivt heltal. Andet læses som 1.- En action, der ikke findes, eller som mangler en påkrævet attribut, giver en advarsel, når skabelonen kompileres. Advarslen står ved koden og som
<!-- bs-component-warning: … -->i butikkens HTML. subscribe-newsletterkræver en formular meddata-bs-newsletterog et feltname="email". Den kører, når formularen sendes, så Enter i feltet virker. Adressen får samme kontrol og samme svar som i standardsidefoden.
add-to-cart uden data-bs-variant-id, for eksempel på et kort, spørger butikken om produktet:
| Produktet har | Butikken |
|---|---|
| Ingen varianter | Lægger produktet i kurven |
| Én variant på lager | Lægger varianten i kurven |
| Flere varianter, eller én variant, der er udsolgt eller forudbestilles | Åbner produktsiden |
Kroge
Krogene er de attributter i butikkens HTML, som din CSS og JS rammer: komponentens rod, indre elementer og tilstande på roden. Alle kroge pr. komponent, krogene på siden og reglerne i tokens-CSS'en står under Kroge og CSS-reference.
Rensning
Den tegnede skabelon renses, før den når siden, på samme måde på serveren og i browseren.
| Gruppe | Elementer, der 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 |
| Links og billeder | a, img, picture, source |
| Formularer | button, input, label, form |
| SVG | svg, g, path, circle, ellipse, rect, line, polyline, polygon |
Attributter, der beholdes:
- på alle elementer:
class,id,title,role,tabindex,lang,dir,hidden,style,translate, allearia-*, alledata-bs-*ogdata-footer-* - på links:
href,target,rel - på billeder:
src,srcset,sizes,alt,width,height,loading - på knapper og felter:
type,name,value,placeholder,disabled - på
form:action, når det er en sti i butikken, for eksempel/search, ogmethod, når det ergetellerpost - på SVG:
viewBox,fill,stroke,stroke-width,d,pointsog de andre tegneattributter
Det, der fjernes:
script,style,iframe,object,embed,noscript,template,textarea,select,video,audio,canvas,dialog,mathogtitle, med alt indhold- alle
on*-attributter og alle kommentarer - andre
data-*enddata-bs-*ogdata-footer-* - adresser, der ikke er relative,
https:,http:,mailto:ellertel:, undtagendata:-billeder påimg - en
action, der peger uden for butikken
Et element, der ikke står på listen, fjernes, men indholdet beholdes. style="…" renses som anden CSS. På links beholdes target="_blank", som får rel="noopener", og target="_self". Andre target fjernes. Åbne elementer lukkes til sidst, så resultatet altid er balanceret HTML.
Klasser og størrelser
Standardmarkuppen har nogle Tailwind-klasser, for eksempel flex, items-center og gap-4. Designeren kompilerer ingen nye klasser fra din skabelon. En klasse, der ikke allerede findes i butikken, gør intet. Sæt størrelse og afstand på fanen Design, i Code › CSS på krogene eller som style på elementet.
CSS
CSS'en på fanen Code gælder kun komponenten. Hvordan selektorerne afgrænses til roden, hvad rensningen fjerner, og hvordan du indlæser egne skrifttyper, står under Kroge og CSS-reference.
Om px og rem: se Egen CSS og kode i head.
JS
- JS'en kører én gang pr. sideindlæsning, når siden er indlæst, på hver side, hvor komponenten findes.
- Den får komponentens rodelement som
root. Findes komponenten ikke på siden, kører den ikke. - Menupanelets rod findes kun, mens panelet er åbent. Dens JS kører, hver gang panelet åbnes, mod den nye rod. Bind lyttere på
root, ikke pådocument. - En fejl, også en syntaksfejl, logges i browserens konsol med stilens navn. Den stopper hverken siden eller andre komponenters JS.
- Koden kører også på arbejdsfladen. Kontakten Run JS in the builder sætter den på pause der i sessionen. Butikken og Preview (⌘P) kører den som normalt.
root.querySelectorAll('[data-bs-header-icons] a').forEach((a) => {
a.addEventListener('mouseenter', () => a.classList.add('is-hot'));
});
Et produktkort findes mange gange på en side. root er så det første kort. Brug document.querySelectorAll('[data-bs-card]') for alle.
Sidens JS på fanen Code kører på samme måde, uden root. Det, du skriver på siden Collection, gælder alle kategorisider.
Eksempel: navbar på en Classic-butik
Målet er et sidehoved i fuld bredde. Det er gennemsigtigt over hero-billedet med hvidt logo og hvide ikoner, og hvidt, når siden har scrollet 24 px. Til højre står fire ikoner på 30 px: søg, ønskeliste, kurv og menu. Det meste er kontroller. Resten er seks linjer CSS.
Kontrollerne på komponentpanelet for Header:
- Skift forsidens teksthero ud med et Image banner med Width fuld og et mørkt foto.
- Vælg Look: Icons + panel.
- Sæt Options: Sticky til, Transparent over hero til, Menu label fra, Search til, Cart til, Announcement bar fra.
- Vælg det sorte logo som Logo under Content, med højde 40. Vælg det hvide som Light logo.
- Kontrollér, at Theme › Colours › Header text over hero er hvid.
Slå Advanced til, tryk 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; }
Tryk Save as new style og kald stilen "Min navbar". Stilen ligger nu under Your header styles i alle butikker i workspacet. Logoerne hører til temaet og indstilles under Content i hver butik.
Samme navbar som egen HTML
Åbn Code › HTML og tryk Start from the standard markup. Feltet udfyldes med standardudseendets markup. Skabelonen nedenfor er samme navbar skrevet fra bunden. Den bruger de samme indre kroge, så CSS'en ovenfor gælder uændret. Burgeren åbner butikkens standardpanel, som har sin egen Close-knap 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 standardmarkuppen skifter butikken selv logo. I en egen skabelon ligger begge billeder i markuppen, og CSS'en vælger med tilstanden på roden:
[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; }
Menupanelet som egen HTML
Butikken tegner panelets rod [data-bs-menu] og åbner det med open-menu. Skabelonen gennemløber menuens links fra Menu panel › Links, de store med underkategorier og derefter 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 åbner butikkens søgefelt som et lag over sidehovedet og panelet. Har din markup et element med [data-bs-search-slot], tegnes søgefeltet der i stedet. En egen søgeformular 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 rod [data-bs-card]. Skabelonen er indersiden. Knappen får sit produkt gennem attributterne.
<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>