BunStackDocs

För utvecklare

Mallreferens

Referens för egen HTML och JS på en komponent: mallsyntax, variabler, actions, sanering, JS, gränser och exempel.

Senast uppdaterad · 24 min läsning

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ättVad
{{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 och false rä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änsVärde
Mallens längd200 000 tecken
Den ritade HTML:en200 000 tecken
CSS:ens längd200 000 tecken
JS:ens längd100 000 tecken
Nästlade block32 nivåer
Steg per rendering50 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.

VarVad du ser
DesignernFelet 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 klipptesdata-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

De tre komponenterna har samma variabler. Sektionen Custom component får samma uppsättning.

VariabelTypVad
storefront.namestringButikens namn
storefront.slugstringButikens slug
storefront.hoststringButikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden
brand.logoUrlstringLogotypens adress, tom när ingen finns
brand.footerLogoUrlstringLjus logotyp för mörka ytor. Faller tillbaka på logoUrl
brand.logoHeightnumberLogotypens höjd i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightraden
nav[]listToppkategorierna: label, href, children[]
nav[].labelstringKategorins namn
nav[].hrefstringLänk till kategorin
nav[].children[]listUnderkategorier med samma fält som toppnivån, label och href. Loopa med {{#each this.children}}{{this.label}}{{/each}}
pages[]listSidor som visas i menyn: label, href
cart.countnumberAlltid 0 när sidan ritas, eftersom varukorgen finns i webbläsaren. Skriv den i <span data-bs-cart-count>. Butiken uppdaterar det elementet
social[]listSociala länkar: key, label, href
contact.emailstringKontakt-e-post, tom när ingen är satt
contact.phonestringTelefon, tom när ingen är satt
currency.codestringVald valuta
currency.options[]listValutorna butiken säljer i: code, label. Tom för en besökare från ett land under Not sold to med Prices hidden
search.hrefstringLänk till söksidan
menu.links[]listMenyns stora länkar i ordning, från Menu panel › Links: label, href, children[], category, draft, products[]
menu.links[].labelstringLänktexten: din egen, annars kategorins eller sidans namn
menu.links[].hrefstringVart länken går
menu.links[].children[]listEn kategorilänks underkategorier: label, href. Tom för en sida eller en adress
menu.links[].categorystringKategorins id för en kategorilänk, annars tom
menu.links[].draftbooleanSidan är inte live än. Bara på designerns arbetsyta: butiken visar inte länken
menu.links[].products[]listKorten för länken: kategorins produkter, utvalda först och med underkategorierna, annars standardkorten. Med kortets fält
menu.secondary[]listMenyns små länkar i ordning: label, href
menu.headingstringRubriken över produkterna (Heading over the products), tom när ingen finns
menu.products[]listStandardkorten: de utvalda produkterna i ordning, med kortets fält. Tom tills menyn har hämtat dem
i18n.menustring"Meny" på butikens språk
i18n.closestring"Stäng"
i18n.searchstring"Sök"
i18n.searchPlaceholderstringSökrutans platshållare
i18n.cartstring"Varukorg"
i18n.wishliststring"Önskelista"
i18n.shopstring"Butik"
i18n.contactstring"Kontakt"
i18n.ordersstring"Spåra din order"

Product card

En mall per kort. Den ritas för varje produkt i ett rutnät.

VariabelTypVad
product.idstringProduktens id, för data-bs-product-id
product.titlestringTiteln
product.hrefstringLänk till produktsidan
product.pricestringPriset, 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.priceAmountstringSamma pris utan "från" eller "from". Tomt utan pris
product.priceVariesbooleanSant när varianterna som går att köpa kostar olika. Priset är då det lägsta av dem
product.compareAtPricestringTidigare pris: lägsta priset 30 dagar före prissänkningen, formaterat. Tomt när butiken inte anger någon sänkning
product.currencystringValutakod
product.imagestringFörsta bildens adress, tom när ingen finns
product.imageAltstringBildens alt-text
product.badgestringReamärkets text, tom när inget finns
product.skustringTom. Kortets produktdata har inget artikelnummer
product.inStockbooleanSant 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.variantIdstringTom. Add-to-cart från ett kort lägger produktens enda variant i varukorgen, eller öppnar produktsidan när produkten har flera
product.metastringTaggraden under titeln
storefront.namestringButikens namn
storefront.slugstringButikens slug
storefront.hoststringButikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden
brand.logoUrlstringLogotypens adress, tom när ingen finns
brand.footerLogoUrlstringLjus logotyp för mörka ytor. Faller tillbaka på logoUrl
brand.logoHeightnumberLogotypens höjd i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightraden

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.

VariabelTypVad
product.idstringProduktens id, för data-bs-product-id
product.titlestringTiteln
product.hrefstringLänk till produktsidan
product.descriptionstringHela beskrivningen som text, utan formatering. Tom när ingen finns
product.paragraphs[]listBeskrivningens stycken, rubriker och listor som text, en sträng per block
product.shortDescriptionstringDen korta beskrivningen som text. Tom när ingen finns
product.introstringTexten vid priset: den korta beskrivningen, annars första stycket, avklippt
product.pricestringDen visade variantens pris, formaterat i kundens valuta. Tomt utan pris
product.compareAtPricestringTidigare pris: lägsta priset 30 dagar före prissänkningen, formaterat. Tomt när butiken inte anger någon sänkning
product.currencystringValutakod
product.imagestringFörsta bildens adress (den visade variantens egen bild först), tom när ingen finns
product.imageAltstringFörsta bildens alt-text
product.images[]listAlla bilder: url, alt, caption (handlarens egen text, tom när ingen finns)
product.badgestringReamärkets text, tom när inget finns
product.skustringDen visade variantens artikelnummer, tomt när inget finns
product.stockStatusstringin_stock, preorder eller out_of_stock, för den visade varianten
product.stockLabelstringLagerradens text på butikens språk ("Få kvar (3)", "Förbeställning · skickas om 10 dagar")
product.inStockbooleanLä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.variantIdstringDen visade varianten, för data-bs-variant-id på add-to-cart. Tom utan varianter
product.variantTitlestringDen visade variantens titel, tom utan varianter
product.variants[]listAlla varianter: id, title, sku, price, stockStatus, stockLabel, inStock, selected, options[] (name, value)
product.options[]listAlternativgrupperna 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[]listEtt värde: value, selected, available, variantId (det select-variant väljer för värdet)
product.categories[]listKategorierna produkten ligger i, den första = brödsmulan: name, slug, href
product.tags[]listProduktens taggar, som strängar
product.metastringTaggraden (de första taggarna), tom när inga finns
product.properties[]listEgenskaperna 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.namestringButikens namn
storefront.slugstringButikens slug
storefront.hoststringButikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden
brand.logoUrlstringLogotypens adress, tom när ingen finns
brand.footerLogoUrlstringLjus logotyp för mörka ytor. Faller tillbaka på logoUrl
brand.logoHeightnumberLogotypens höjd i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightraden
currency.codestringVald valuta
cart.countnumberAlltid 0 när sidan ritas. Skriv den i <span data-bs-cart-count>, som i sidhuvudet
i18n.addToCartstring"Lägg i varukorgen" på butikens språk
i18n.chooseVariantstring"Välj variant"
i18n.inStockstring"I lager"
i18n.outOfStockstring"Slut i lager"
i18n.preorderstring"Förbeställning"
i18n.priceOnRequeststring"Pris på förfrågan"
i18n.vatstring"Inkl. moms" eller "Exkl. moms", som butiken prissätter
i18n.wishliststring"Spara i önskelistan"
i18n.homestring"Hem", brödsmulans första led

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.

VariabelTypVad
images[]listAlla bilder, den visade variantens egen först: url, alt, caption (handlarens egen text, tom när ingen finns)
imagestringFörsta bildens adress, tom när ingen finns
imageAltstringFörsta bildens alt-text
countnumberAntal bilder
titlestringProduktens titel
product.idstringProduktens id, för data-bs-product-id på toggle-wishlist
product.titlestringTiteln
product.hrefstringLänk till produktsidan
storefront.namestringButikens namn
storefront.slugstringButikens slug
storefront.hoststringButikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden
brand.logoUrlstringLogotypens adress, tom när ingen finns
brand.footerLogoUrlstringLjus logotyp för mörka ytor. Faller tillbaka på logoUrl
brand.logoHeightnumberLogotypens höjd i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightraden
i18n.imagesstring"Produktbilder" på butikens språk
i18n.previousstring"Föregående bild"
i18n.nextstring"Nästa bild"
i18n.noImagestring"Ingen bild"
i18n.wishliststring"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.

VariabelTypVad
category.idstringKategorins id
category.namestringKategorins namn
category.descriptionstringBeskrivningen, tom när ingen finns
category.slugstringKategorins slug
category.hrefstringLänk till kategorin
category.imagestringKategoribildens adress, tom när ingen finns
products[]listProdukterna 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
countnumberAntal produkter som listas (efter filter)
totalnumberAntal produkter i kategorin
emptybooleanSant när inget listas
filters[]listFiltergrupperna sidan visar, i ordning. På All products och i sökresultaten står gruppen Category först
filters[].labelstringGruppens namn
filters[].paramstringAdressparametern som värdena skriver: f., eller category
filters[].selectedCountnumberAntal ikryssade värden i gruppen
filters[].values[]listGruppens värden, i ordning
filters[].values[].labelstringDet värdet visas som (en kategoris namn)
filters[].values[].valuestringVärdet som länken skriver
filters[].values[].countnumberProdukter på sidan med värdet
filters[].values[].depthnumberEn underkategoris djup i gruppen Category, annars 0
filters[].values[].selectedbooleanIkryssad av kunden
filters[].values[].hrefstringSidan med värdet ikryssat eller urkryssat, övriga kryss kvar
filterednumberVärden kunden har kryssat i
clearHrefstringSidan utan kryss
stickybooleanFilters stay in view är på och sidan har filter
storefront.namestringButikens namn
storefront.slugstringButikens slug
storefront.hoststringButikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden
brand.logoUrlstringLogotypens adress, tom när ingen finns
brand.footerLogoUrlstringLjus logotyp för mörka ytor. Faller tillbaka på logoUrl
brand.logoHeightnumberLogotypens höjd i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightraden
i18n.shopstring"Butik" på butikens språk, brödsmulans första led
i18n.productsstring"Produkter"
i18n.emptystring"Inga produkter i den här kategorin än."
i18n.noMatchstring"Inga produkter matchar dina filter."
i18n.filtersstring"Filter"
i18n.clearstring"Rensa filter"

Sektionens egna inställningar.

VariabelTypVad
headingstringRubriken
subtitlestringUnderrubriken
imageUrlstringBildens adress
imageAltstringBildens alt-text
ctaLabelstringKnappens text
ctaHrefstringKnappens länk
alignstringleft eller center
valignstringtop, center eller bottom
sizestringxs … xl eller screen
bleedstringcontained eller full
ctaStylestringprimary, light eller outline
storefront.namestringButikens namn
storefront.slugstringButikens slug
storefront.hoststringButikens publika värd: den egna domänen när den är verifierad, annars bunstack.shop-värden
brand.logoUrlstringLogotypens adress, tom när ingen finns
brand.footerLogoUrlstringLjus logotyp för mörka ytor. Faller tillbaka på logoUrl
brand.logoHeightnumberLogotypens höjd i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightraden

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>.

ActionKrävsValfrittVad
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-iddata-bs-variant-id, data-bs-quantityLä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-quantity ska 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-newsletter kräver ett formulär med data-bs-newsletter och ett fält name="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 harButiken
Inga varianterLägger produkten i varukorgen
En variant i lagerLä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.

GruppElement som behålls
Strukturdiv, section, header, footer, nav, aside, article, ul, ol, li, p, h1–h6, dl, dt, dd, details, summary, figure, figcaption, blockquote, address
Textspan, strong, em, b, i, u, s, small, sup, sub, mark, cite, abbr, time, br, hr, wbr
Länkar och bildera, img, picture, source
Formulärbutton, input, label, form
SVGsvg, 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, alla aria-*, alla data-bs-* och data-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: action när det är en sökväg i butiken, till exempel /search, och method när det är get eller post
  • på SVG: viewBox, fill, stroke, stroke-width, d, points och de andra ritattributen

Det som tas bort:

  • script, style, iframe, object, embed, noscript, template, textarea, select, video, audio, canvas, dialog, math och title, med allt innehåll
  • alla on*-attribut och alla kommentarer
  • andra data-* än data-bs-* och data-footer-*
  • adresser som inte är relativa, https:, http:, mailto: eller tel:, utom data:-bilder på img
  • ett action som 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:

  1. Byt startsidans texthero mot en Image banner med Width full och ett mörkt foto.
  2. Välj Look: Icons + panel.
  3. Sätt Options: Sticky på, Transparent over hero på, Menu label av, Search på, Cart på, Announcement bar av.
  4. Välj den svarta logotypen som Logo under Content, med höjd 40. Välj den vita som Light logo.
  5. 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>