För utvecklare
Mallreferens
Referens för egen HTML och JS på en komponent: mallsyntax, variabler, actions, sanering, JS, gränser och exempel.
Hur du öppnar kodredigeraren: se Egen kod på en komponent.
Var: designern, Customize with code › Code på en komponent, med Advanced på. Sektionen Custom component följer samma regler.
Roten är butikens
Varje komponent har en rot som butiken ritar. Din mall är innehållet i roten.
- Sidhuvudets rot är
[data-bs-header]. Butiken sätter tillstånden[data-bs-transparent],[data-bs-scrolled]och[data-bs-sticky]på roten, även när sidhuvudet är din egen HTML. - Skriv inget eget
<header>i mallen. Börja med det som ska stå inuti. - Din CSS avgränsas till roten. Din JS får roten som
root. - En Custom component-sektion har roten
[data-bs-block="<sektions-id>"].
Alla rötter finns i Krokar och CSS-referens.
Mallsyntax
Mallen är HTML med variabler i dubbla klammerparenteser. Det här är hela syntaxen.
| Skrivsätt | Vad |
|---|---|
{{storefront.name}} | Värdet, alltid HTML-escapat. En okänd variabel ger tom text. |
{{#each nav}} … {{/each}} | Upprepar blocket för varje post i en lista. |
{{this}}, {{this.label}} | Posten i en #each, eller ett fält på posten. Ett bart {{label}} slås upp på posten först. |
{{@index}}, {{@first}}, {{@last}} | Räknaren från 0, och sant på första och sista varvet. |
{{#if cart.count}} … {{else}} … {{/if}} | Visar blocket när värdet är sant. {{else}} är valfritt. |
{{#unless brand.logoUrl}} … {{/unless}} | Motsatsen till #if. |
- Tom text,
0, tom lista ochfalseräknas som falskt. - Det finns inget sätt att skriva ut oescapad HTML.
- Det finns inga hjälpfunktioner och inga inkluderade mallar.
Gränser
| Gräns | Värde |
|---|---|
| Mallens längd | 200 000 tecken |
| Den ritade HTML:en | 200 000 tecken |
| CSS:ens längd | 200 000 tecken |
| JS:ens längd | 100 000 tecken |
| Nästlade block | 32 nivåer |
| Steg per rendering | 50 000 |
- BunStack klipper det som är längre och visar en varning med platsen, till exempel
css cut at 200 000 characters. - En rendering avbryts efter 50 000 steg. En loop i en loop kan inte hänga butiken.
- En mall på 33 333 tecken eller mer renderas en gång utan data i designern. Når den en gräns i den renderingen visas varningen under May cut with some data på fliken Code.
- Butiken listar bara det som dess egen rendering klipper.
Fel och varningar
En mall som inte går att läsa ritar ingenting. Det gäller till exempel en {{#each}} som aldrig stängs, eller ett block som stängs med fel tagg. Butiken visar då standardutseendet, och designern visar felet vid koden.
| Var | Vad du ser |
|---|---|
| Designern | Felet eller varningen i rött under koden. |
| Butikens HTML, fel | <!-- bs-component-error: … --> inne i <template data-bs-component-errors>. |
| Butikens HTML, varning | <!-- bs-component-warning: … --> på samma plats. Komponenten ritas ändå. |
| Produktkort eller banner som klipptes | data-bs-component-warning på roten. Konsolen visar orsaken en gång per stil. |
En varning kan gälla en CSS-regel som inte gick att avgränsa, eller ett alternativ som avvisades.
Variabler
Header, Menu panel och Footer
De tre komponenterna har samma variabler. Sektionen Custom component får samma uppsättning.
| Variabel | Typ | Vad |
|---|---|---|
storefront.name | string | Butikens namn |
storefront.slug | string | Butikens slug |
storefront.host | string | Butikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden |
brand.logoUrl | string | Logotypens adress, tom när ingen finns |
brand.footerLogoUrl | string | Ljus logotyp för mörka ytor. Faller tillbaka på logoUrl |
brand.logoHeight | number | Logotypens höjd i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightraden |
nav[] | list | Toppkategorierna: label, href, children[] |
nav[].label | string | Kategorins namn |
nav[].href | string | Länk till kategorin |
nav[].children[] | list | Underkategorier med samma fält som toppnivån, label och href. Loopa med {{#each this.children}}{{this.label}}{{/each}} |
pages[] | list | Sidor som visas i menyn: label, href |
cart.count | number | Alltid 0 när sidan ritas, eftersom varukorgen finns i webbläsaren. Skriv den i <span data-bs-cart-count>. Butiken uppdaterar det elementet |
social[] | list | Sociala länkar: key, label, href |
contact.email | string | Kontakt-e-post, tom när ingen är satt |
contact.phone | string | Telefon, tom när ingen är satt |
currency.code | string | Vald valuta |
currency.options[] | list | Valutorna butiken säljer i: code, label. Tom för en besökare från ett land under Not sold to med Prices hidden |
search.href | string | Länk till söksidan |
menu.links[] | list | Menyns stora länkar i ordning, från Menu panel › Links: label, href, children[], category, draft, products[] |
menu.links[].label | string | Länktexten: din egen, annars kategorins eller sidans namn |
menu.links[].href | string | Vart länken går |
menu.links[].children[] | list | En kategorilänks underkategorier: label, href. Tom för en sida eller en adress |
menu.links[].category | string | Kategorins id för en kategorilänk, annars tom |
menu.links[].draft | boolean | Sidan är inte live än. Bara på designerns arbetsyta: butiken visar inte länken |
menu.links[].products[] | list | Korten för länken: kategorins produkter, utvalda först och med underkategorierna, annars standardkorten. Med kortets fält |
menu.secondary[] | list | Menyns små länkar i ordning: label, href |
menu.heading | string | Rubriken över produkterna (Heading over the products), tom när ingen finns |
menu.products[] | list | Standardkorten: de utvalda produkterna i ordning, med kortets fält. Tom tills menyn har hämtat dem |
i18n.menu | string | "Meny" på butikens språk |
i18n.close | string | "Stäng" |
i18n.search | string | "Sök" |
i18n.searchPlaceholder | string | Sökrutans platshållare |
i18n.cart | string | "Varukorg" |
i18n.wishlist | string | "Önskelista" |
i18n.shop | string | "Butik" |
i18n.contact | string | "Kontakt" |
i18n.orders | string | "Spåra din order" |
Product card
En mall per kort. Den ritas för varje produkt i ett rutnät.
| Variabel | Typ | Vad |
|---|---|---|
product.id | string | Produktens id, för data-bs-product-id |
product.title | string | Titeln |
product.href | string | Länk till produktsidan |
product.price | string | Priset, formaterat i kundens valuta. Kostar varianterna olika visas det lägsta priset, med "från" före i en svensk butik och "from" i alla andra. Tomt utan pris |
product.priceAmount | string | Samma pris utan "från" eller "from". Tomt utan pris |
product.priceVaries | boolean | Sant när varianterna som går att köpa kostar olika. Priset är då det lägsta av dem |
product.compareAtPrice | string | Tidigare pris: lägsta priset 30 dagar före prissänkningen, formaterat. Tomt när butiken inte anger någon sänkning |
product.currency | string | Valutakod |
product.image | string | Första bildens adress, tom när ingen finns |
product.imageAlt | string | Bildens alt-text |
product.badge | string | Reamärkets text, tom när inget finns |
product.sku | string | Tom. Kortets produktdata har inget artikelnummer |
product.inStock | boolean | Sant på kortet, lagret prövas i kassan. Falskt för en besökare från ett land under Not sold to, dit butiken inte säljer. Använd det för köpknappen, inte för en text om att varan är slut. Med Prices hidden är också price, priceAmount, compareAtPrice och badge tomma |
product.variantId | string | Tom. Add-to-cart från ett kort lägger produktens enda variant i varukorgen, eller öppnar produktsidan när produkten har flera |
product.meta | string | Taggraden under titeln |
storefront.name | string | Butikens namn |
storefront.slug | string | Butikens slug |
storefront.host | string | Butikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden |
brand.logoUrl | string | Logotypens adress, tom när ingen finns |
brand.footerLogoUrl | string | Ljus logotyp för mörka ytor. Faller tillbaka på logoUrl |
brand.logoHeight | number | Logotypens höjd i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightraden |
Product page
Galleriet och köppanelen, ritade för den variant som visas. Väljer kunden en annan variant med select-variant ritas mallen om. Priset, artikelnumret, lagerraden, product.variantId och varje selected följer med. Resten av sidan är standardsidans: detaljer, recensioner och relaterade produkter. Under mallen ritar butiken produktens frågor, raden om tillägg i varukorgen och rutan Tillval. add-to-cart i mallen lägger med de tillval kunden kryssat i och stannar på en obligatorisk fråga som är tom, som standardknappen.
| Variabel | Typ | Vad |
|---|---|---|
product.id | string | Produktens id, för data-bs-product-id |
product.title | string | Titeln |
product.href | string | Länk till produktsidan |
product.description | string | Hela beskrivningen som text, utan formatering. Tom när ingen finns |
product.paragraphs[] | list | Beskrivningens stycken, rubriker och listor som text, en sträng per block |
product.shortDescription | string | Den korta beskrivningen som text. Tom när ingen finns |
product.intro | string | Texten vid priset: den korta beskrivningen, annars första stycket, avklippt |
product.price | string | Den visade variantens pris, formaterat i kundens valuta. Tomt utan pris |
product.compareAtPrice | string | Tidigare pris: lägsta priset 30 dagar före prissänkningen, formaterat. Tomt när butiken inte anger någon sänkning |
product.currency | string | Valutakod |
product.image | string | Första bildens adress (den visade variantens egen bild först), tom när ingen finns |
product.imageAlt | string | Första bildens alt-text |
product.images[] | list | Alla bilder: url, alt, caption (handlarens egen text, tom när ingen finns) |
product.badge | string | Reamärkets text, tom när inget finns |
product.sku | string | Den visade variantens artikelnummer, tomt när inget finns |
product.stockStatus | string | in_stock, preorder eller out_of_stock, för den visade varianten |
product.stockLabel | string | Lagerradens text på butikens språk ("Få kvar (3)", "Förbeställning · skickas om 10 dagar") |
product.inStock | boolean | Lägg i varukorgen fungerar: tillgängligt lager i läget Automatic, eller läget In stock (manual) eller Preorder. Aldrig i läget Out of stock, och aldrig för en besökare från ett land under Not sold to. Använd det för köpknappen och stockStatus för lagertexten. Med Prices hidden är price, compareAtPrice, badge och varianternas price tomma |
product.variantId | string | Den visade varianten, för data-bs-variant-id på add-to-cart. Tom utan varianter |
product.variantTitle | string | Den visade variantens titel, tom utan varianter |
product.variants[] | list | Alla varianter: id, title, sku, price, stockStatus, stockLabel, inStock, selected, options[] (name, value) |
product.options[] | list | Alternativgrupperna i väljarens ordning: name, label (namnet som väljaren skriver det, till exempel Number of balls för Number-of-balls), values[] |
product.options[].values[] | list | Ett värde: value, selected, available, variantId (det select-variant väljer för värdet) |
product.categories[] | list | Kategorierna produkten ligger i, den första = brödsmulan: name, slug, href |
product.tags[] | list | Produktens taggar, som strängar |
product.meta | string | Taggraden (de första taggarna), tom när inga finns |
product.properties[] | list | Egenskaperna sidan visar, i gruppernas ordning: group (tom utan grupp), label, value (som butiken skriver den), values[] (värdets delar), display (bar, chips, table eller badge), numeric, percent (stapelns fyllnad på sin skala, 0–100). Filter only och Hidden finns inte med |
storefront.name | string | Butikens namn |
storefront.slug | string | Butikens slug |
storefront.host | string | Butikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden |
brand.logoUrl | string | Logotypens adress, tom när ingen finns |
brand.footerLogoUrl | string | Ljus logotyp för mörka ytor. Faller tillbaka på logoUrl |
brand.logoHeight | number | Logotypens höjd i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightraden |
currency.code | string | Vald valuta |
cart.count | number | Alltid 0 när sidan ritas. Skriv den i <span data-bs-cart-count>, som i sidhuvudet |
i18n.addToCart | string | "Lägg i varukorgen" på butikens språk |
i18n.chooseVariant | string | "Välj variant" |
i18n.inStock | string | "I lager" |
i18n.outOfStock | string | "Slut i lager" |
i18n.preorder | string | "Förbeställning" |
i18n.priceOnRequest | string | "Pris på förfrågan" |
i18n.vat | string | "Inkl. moms" eller "Exkl. moms", som butiken prissätter |
i18n.wishlist | string | "Spara i önskelistan" |
i18n.home | string | "Hem", brödsmulans första led |
Gallery
Produktbilderna på produktsidan. Har produktsidan egen HTML ritar produktsidans mall galleriet själv, och galleriets design ritas inte alls. Kodredigeraren, butikens rapport och arbetsytan visar det, till exempel Your product page is your own HTML and draws the gallery itself, so this gallery design is not rendered.
| Variabel | Typ | Vad |
|---|---|---|
images[] | list | Alla bilder, den visade variantens egen först: url, alt, caption (handlarens egen text, tom när ingen finns) |
image | string | Första bildens adress, tom när ingen finns |
imageAlt | string | Första bildens alt-text |
count | number | Antal bilder |
title | string | Produktens titel |
product.id | string | Produktens id, för data-bs-product-id på toggle-wishlist |
product.title | string | Titeln |
product.href | string | Länk till produktsidan |
storefront.name | string | Butikens namn |
storefront.slug | string | Butikens slug |
storefront.host | string | Butikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden |
brand.logoUrl | string | Logotypens adress, tom när ingen finns |
brand.footerLogoUrl | string | Ljus logotyp för mörka ytor. Faller tillbaka på logoUrl |
brand.logoHeight | number | Logotypens höjd i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightraden |
i18n.images | string | "Produktbilder" på butikens språk |
i18n.previous | string | "Föregående bild" |
i18n.next | string | "Nästa bild" |
i18n.noImage | string | "Ingen bild" |
i18n.wishlist | string | "Spara i önskelistan" |
Category
Samlingssidan med produkterna den listar: en kategori, All products eller sökresultat. Mallen får sidans filter som data i filters[]: varje grupp med sina värden, antal, kryss och en länk som kryssar i eller ur värdet. Butiken lägger inga filter i mallens egen markup. En mall listar produkterna efter filtren och sorteringen i adressen (?sort=…&f.…&category=…). Mallen ersätter Collection-sidans sektioner, produktrutnätet inräknat. Sidans egen CSS (fliken Code på Collection-sidan) gäller fortfarande.
| Variabel | Typ | Vad |
|---|---|---|
category.id | string | Kategorins id |
category.name | string | Kategorins namn |
category.description | string | Beskrivningen, tom när ingen finns |
category.slug | string | Kategorins slug |
category.href | string | Länk till kategorin |
category.image | string | Kategoribildens adress, tom när ingen finns |
products[] | list | Produkterna som listas, efter kundens filter och sortering. En post per produkt med kortets fält: id, title, href, price, priceAmount, priceVaries, compareAtPrice, currency, image, imageAlt, badge, sku, inStock, variantId, meta. För en besökare från ett land under Not sold to är inStock falskt, och med Prices hidden är price, priceAmount, compareAtPrice och badge tomma |
count | number | Antal produkter som listas (efter filter) |
total | number | Antal produkter i kategorin |
empty | boolean | Sant när inget listas |
filters[] | list | Filtergrupperna sidan visar, i ordning. På All products och i sökresultaten står gruppen Category först |
filters[].label | string | Gruppens namn |
filters[].param | string | Adressparametern som värdena skriver: f. |
filters[].selectedCount | number | Antal ikryssade värden i gruppen |
filters[].values[] | list | Gruppens värden, i ordning |
filters[].values[].label | string | Det värdet visas som (en kategoris namn) |
filters[].values[].value | string | Värdet som länken skriver |
filters[].values[].count | number | Produkter på sidan med värdet |
filters[].values[].depth | number | En underkategoris djup i gruppen Category, annars 0 |
filters[].values[].selected | boolean | Ikryssad av kunden |
filters[].values[].href | string | Sidan med värdet ikryssat eller urkryssat, övriga kryss kvar |
filtered | number | Värden kunden har kryssat i |
clearHref | string | Sidan utan kryss |
sticky | boolean | Filters stay in view är på och sidan har filter |
storefront.name | string | Butikens namn |
storefront.slug | string | Butikens slug |
storefront.host | string | Butikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden |
brand.logoUrl | string | Logotypens adress, tom när ingen finns |
brand.footerLogoUrl | string | Ljus logotyp för mörka ytor. Faller tillbaka på logoUrl |
brand.logoHeight | number | Logotypens höjd i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightraden |
i18n.shop | string | "Butik" på butikens språk, brödsmulans första led |
i18n.products | string | "Produkter" |
i18n.empty | string | "Inga produkter i den här kategorin än." |
i18n.noMatch | string | "Inga produkter matchar dina filter." |
i18n.filters | string | "Filter" |
i18n.clear | string | "Rensa filter" |
Banner
Sektionens egna inställningar.
| Variabel | Typ | Vad |
|---|---|---|
heading | string | Rubriken |
subtitle | string | Underrubriken |
imageUrl | string | Bildens adress |
imageAlt | string | Bildens alt-text |
ctaLabel | string | Knappens text |
ctaHref | string | Knappens länk |
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 | Butikens namn |
storefront.slug | string | Butikens slug |
storefront.host | string | Butikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden |
brand.logoUrl | string | Logotypens adress, tom när ingen finns |
brand.footerLogoUrl | string | Ljus logotyp för mörka ytor. Faller tillbaka på logoUrl |
brand.logoHeight | number | Logotypens höjd i px (16–96) |
brand.tagline | string | Taglinen |
brand.copyright | string | Copyrightraden |
Skriv rubriken som <h1> när bannern är sidans titelblock. Då är den sidans titel. Saknar mallen <h1> lägger butiken en dold sidtitel efter bannern när bannern är sidans titelblock. Bannern är titelblock när den är den första bannern eller heron på sidan och ingen rubriksektion på nivå 1 tar titeln.
Actions
Din markup kan inte ha egna händelsehanterare. Sätt data-bs-action på ett element. Butiken sköter klicket med samma lyssnare som för standardmarkupen. Attributet får sitta på vilket element som helst, även på en <svg>.
| Action | Krävs | Valfritt | Vad |
|---|---|---|---|
data-bs-action="open-cart" | – | – | Öppnar varukorgen enligt butikens val under Checkout › Cart: panelen eller varukorgssidan |
data-bs-action="open-search" | – | – | Öppnar sökrutan |
data-bs-action="open-menu" | – | – | Öppnar menypanelen |
data-bs-action="close-menu" | – | – | Stänger menypanelen |
data-bs-action="add-to-cart" | data-bs-product-id | data-bs-variant-id, data-bs-quantity | Lägger produkten i varukorgen |
data-bs-action="toggle-wishlist" | data-bs-product-id | – | Lägger produkten i önskelistan eller tar bort den |
data-bs-action="select-variant" | data-bs-variant-id | – | Väljer varianten på produktsidan. Priset, lagerraden, product.variantId och varje selected följer med. Bara i produktsidans egen mall |
data-bs-action="open-cookie-settings" | – | – | Öppnar cookieinställningarna, samma dialog som standardsidfotens länk |
data-bs-action="set-currency" | data-bs-currency | – | Byter valuta till koden i attributet, till exempel data-bs-currency="EUR". Koderna finns i currency.options[] |
data-bs-action="subscribe-newsletter" | data-bs-newsletter | – | Anmäler adressen i fältet name="email" till nyhetsbrevet. Sätt actionen på <form> eller på dess submit-knapp |
- Saknas ett attribut som krävs händer inget vid klicket.
data-bs-quantityska vara ett positivt heltal. Annat läses som 1.- En action som inte finns, eller som saknar ett attribut som krävs, ger en varning när mallen kompileras. Varningen står vid koden och som
<!-- bs-component-warning: … -->i butikens HTML. subscribe-newsletterkräver ett formulär meddata-bs-newsletteroch ett fältname="email". Den körs när formuläret skickas, så Enter i fältet fungerar. Adressen får samma kontroll och samma svar som i standardsidfoten.
Utan data-bs-variant-id, till exempel på ett kort, gör add-to-cart så här:
| Produkten har | Butiken |
|---|---|
| Inga varianter | Lägger produkten i varukorgen |
| En variant i lager | Lägger varianten i varukorgen |
| Flera varianter, eller en variant som är slut eller förbeställs | Öppnar produktsidan |
Krokar
Krokarna är attributen i butikens HTML som din CSS och JS riktar in sig på: komponentens rot, inre element och tillstånd på roten. Krokar och CSS-referens listar alla krokar per komponent, krokarna på sidan och reglerna i tokens-CSS:en.
Sanering
Den ritade mallen saneras innan den når sidan, på samma sätt på servern och i webbläsaren.
| Grupp | Element som behålls |
|---|---|
| Struktur | div, section, header, footer, nav, aside, article, ul, ol, li, p, h1–h6, dl, dt, dd, details, summary, figure, figcaption, blockquote, address |
| Text | span, strong, em, b, i, u, s, small, sup, sub, mark, cite, abbr, time, br, hr, wbr |
| Länkar och bilder | a, img, picture, source |
| Formulär | button, input, label, form |
| SVG | svg, g, path, circle, ellipse, rect, line, polyline, polygon |
Attribut som behålls:
- på alla element:
class,id,title,role,tabindex,lang,dir,hidden,style,translate, allaaria-*, alladata-bs-*ochdata-footer-* - på länkar:
href,target,rel - på bilder:
src,srcset,sizes,alt,width,height,loading - på knappar och fält:
type,name,value,placeholder,disabled - på
form:actionnär det är en sökväg i butiken, till exempel/search, ochmethodnär det ärgetellerpost - på SVG:
viewBox,fill,stroke,stroke-width,d,pointsoch de andra ritattributen
Det som tas bort:
script,style,iframe,object,embed,noscript,template,textarea,select,video,audio,canvas,dialog,mathochtitle, med allt innehåll- alla
on*-attribut och alla kommentarer - andra
data-*ändata-bs-*ochdata-footer-* - adresser som inte är relativa,
https:,http:,mailto:ellertel:, utomdata:-bilder påimg - ett
actionsom pekar utanför butiken
Ett element som inte står i listan tas bort, men innehållet behålls. style="…" saneras som annan CSS. På länkar behålls target="_blank", som får rel="noopener", och target="_self". Andra target tas bort. Öppna element stängs i slutet, så resultatet är alltid balanserad HTML.
Klasser och storlekar
Standardmarkupen har några Tailwind-klasser, till exempel flex, items-center och gap-4. Designern kompilerar inga nya klasser ur din mall. En klass som inte redan finns i butiken gör inget. Sätt storlek och avstånd i fliken Design, i Code › CSS på krokarna eller som style på elementet.
CSS
CSS:en på fliken Code gäller bara komponenten. Krokar och CSS-referens visar hur selektorerna avgränsas till roten, vad saneringen tar bort och hur du laddar egna typsnitt.
Om px och rem: se Egen CSS och kod i head.
JS
- JS:en körs en gång per sidladdning, när sidan har laddats, på varje sida där komponenten finns.
- Den får komponentens rotelement som
root. Finns komponenten inte på sidan körs den inte. - Menypanelens rot finns bara medan panelen är öppen. Dess JS körs varje gång panelen öppnas, mot den nya roten. Bind lyssnare på
root, inte pådocument. - Ett fel, även ett syntaxfel, loggas i webbläsarens konsol med stilens namn. Det stoppar varken sidan eller andra komponenters JS.
- Koden körs även på arbetsytan. Reglaget Run JS in the builder pausar den där under sessionen. Butiken och Preview (⌘P) kör den som vanligt.
root.querySelectorAll('[data-bs-header-icons] a').forEach((a) => {
a.addEventListener('mouseenter', () => a.classList.add('is-hot'));
});
Ett produktkort finns många gånger på en sida. root är då det första kortet. Använd document.querySelectorAll('[data-bs-card]') för alla.
Sidans JS på fliken Code körs på samma sätt, utan root. Det du skriver på sidan Collection gäller alla kategorisidor.
Exempel: navbar på en Classic-butik
Målet är ett sidhuvud i full bredd. Det är genomskinligt över hero-bilden med vit logotyp och vita ikoner, och vitt när sidan scrollat 24 px. Till höger finns fyra ikoner på 30 px: sök, önskelista, varukorg och meny. Det mesta görs med inställningar i panelen. Resten är sex rader CSS.
Inställningarna i komponentpanelen för Header:
- Byt startsidans texthero mot en Image banner med Width full och ett mörkt foto.
- Välj Look: Icons + panel.
- Sätt Options: Sticky på, Transparent over hero på, Menu label av, Search på, Cart på, Announcement bar av.
- Välj den svarta logotypen som Logo under Content, med höjd 40. Välj den vita som Light logo.
- Kontrollera att Theme › Colours › Header text over hero är vit.
Slå på Advanced, tryck Customize with code och 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; }
Tryck Save as new style och döp stilen till "Min navbar". Stilen ligger nu under Your header styles i alla butiker i workspacet. Logotyperna hör till temat. Du ställer in dem under Content i varje butik.
Samma navbar som egen HTML
Öppna Code › HTML och tryck Start from the standard markup. Fältet fylls med standardutseendets markup. Mallen nedan är samma navbar skriven för hand. Den använder samma inre krokar, så CSS:en ovan gäller oförändrad. Menyknappen öppnar butikens standardpanel, som har en egen Close-knapp och stängs 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 byter butiken logotyp själv. I en egen mall ligger båda bilderna i markupen, och CSS:en väljer med tillståndet 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; }
Menypanelen som egen HTML
Butiken ritar panelens rot [data-bs-menu] och öppnar den med open-menu. Mallen loopar menyns länkar från Menu panel › Links, de stora med underkategorier och sedan 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 öppnar butikens sökruta som ett lager ovanpå sidhuvudet och panelen. Har din markup ett element med [data-bs-search-slot] ritas sökrutan där i stället. Ett eget sökformulär fungerar också:
<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>
Ett produktkort som egen HTML
Butiken ritar kortets rot [data-bs-card]. Mallen är insidan. Knappen får sin produkt genom attributen.
<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>