BunStackDocs

For utviklere

Malreferanse

Referanse for egen HTML og JS på en komponent: malsyntaks, variabler, actions, rensing, JS, grenser og eksempler.

Sist oppdatert · 24 min lesing

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åteHva
{{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 og false regnes som usant.
  • Det finnes ingen måte å skrive ut HTML uten escaping på.
  • Det finnes ingen hjelpefunksjoner og ingen inkluderte maler.

Grenser

GrenseVerdi
Malens lengde200 000 tegn
Den tegnede HTML-en200 000 tegn
CSS-ens lengde200 000 tegn
JS-ens lengde100 000 tegn
Nestede blokker32 nivåer
Steg per tegning50 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.

HvorHva du ser
DesignerenFeilen 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 klippetdata-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

De tre deler ett sett variabler. Seksjonen Custom component får det samme settet.

VariabelTypeHva
storefront.namestringButikkens navn
storefront.slugstringButikkens slug
storefront.hoststringButikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten
brand.logoUrlstringLogoens adresse, tom når ingen finnes
brand.footerLogoUrlstringLys logo for mørke flater. Faller tilbake på logoUrl
brand.logoHeightnumberLogoens høyde i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightlinjen
nav[]listToppkategoriene: label, href, children[]
nav[].labelstringKategoriens navn
nav[].hrefstringLenke til kategorien
nav[].children[]listUnderkategorier med samme felt som toppnivået, label og href. Gå gjennom dem med {{#each this.children}}{{this.label}}{{/each}}
pages[]listSider som vises i menyen: label, href
cart.countnumberAlltid 0 når siden tegnes, fordi handlekurven finnes i nettleseren. Skriv den i <span data-bs-cart-count>. Butikken holder det elementet oppdatert
social[]listSosiale lenker: key, label, href
contact.emailstringKontakt-e-post, tom når ingen er satt
contact.phonestringTelefon, tom når ingen er satt
currency.codestringValgt valuta
currency.options[]listValutaene butikken selger i: code, label. Tom for en besøkende fra et land under Not sold to med Prices hidden
search.hrefstringLenke til søkesiden
menu.links[]listMenyens store lenker i rekkefølge, fra Menu panel › Links: label, href, children[], category, draft, products[]
menu.links[].labelstringLenketeksten: din egen, ellers kategoriens eller sidens navn
menu.links[].hrefstringHvor lenken går
menu.links[].children[]listEn kategorilenkes underkategorier: label, href. Tom for en side eller en adresse
menu.links[].categorystringKategoriens id for en kategorilenke, ellers tom
menu.links[].draftbooleanSiden er ikke live ennå. Bare på designerens arbeidsflate: butikken viser ikke lenken
menu.links[].products[]listKortene for lenken: kategoriens produkter, utvalgte først og med underkategoriene, ellers standardkortene. Med kortets felt
menu.secondary[]listMenyens små lenker i rekkefølge: label, href
menu.headingstringOverskriften over produktene (Heading over the products), tom når den ikke finnes
menu.products[]listStandardkortene: de utvalgte produktene i rekkefølge, med kortets felt. Tom til menyen har hentet dem
i18n.menustring"Meny" på butikkens språk
i18n.closestring"Lukk"
i18n.searchstring"Søk"
i18n.searchPlaceholderstringSøkefeltets plassholder
i18n.cartstring"Handlekurv"
i18n.wishliststring"Ønskeliste"
i18n.shopstring"Butikk"
i18n.contactstring"Kontakt"
i18n.ordersstring"Spor ordren din"

Product card

Én mal per kort. Den tegnes for hvert produkt i et rutenett.

VariabelTypeHva
product.idstringProduktets id, for data-bs-product-id
product.titlestringTittelen
product.hrefstringLenke til produktsiden
product.pricestringPrisen, 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.priceAmountstringSamme pris uten "från" eller "from". Tom uten pris
product.priceVariesbooleanSann når variantene som kan kjøpes, koster ulikt. Prisen er da den laveste av dem
product.compareAtPricestringTidligere pris: laveste pris de 30 dagene før prisreduksjonen, formatert. Tom når butikken ikke oppgir noen reduksjon
product.currencystringValutakode
product.imagestringFørste bildes adresse, tom når ingen finnes
product.imageAltstringBildets alt-tekst
product.badgestringSalgsmerkets tekst, tom når ingen finnes
product.skustringTom. Kortets produktdata har ikke noe artikkelnummer
product.inStockbooleanSann 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.variantIdstringTom. Add-to-cart fra et kort legger produktets eneste variant i handlekurven, eller åpner produktsiden når produktet har flere
product.metastringTagglinjen under tittelen
storefront.namestringButikkens navn
storefront.slugstringButikkens slug
storefront.hoststringButikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten
brand.logoUrlstringLogoens adresse, tom når ingen finnes
brand.footerLogoUrlstringLys logo for mørke flater. Faller tilbake på logoUrl
brand.logoHeightnumberLogoens høyde i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightlinjen

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.

VariabelTypeHva
product.idstringProduktets id, for data-bs-product-id
product.titlestringTittelen
product.hrefstringLenke til produktsiden
product.descriptionstringHele beskrivelsen som tekst, uten formatering. Tom når ingen finnes
product.paragraphs[]listBeskrivelsens avsnitt, overskrifter og lister som tekst, én streng per blokk
product.shortDescriptionstringDen korte beskrivelsen som tekst. Tom når ingen finnes
product.introstringTeksten ved prisen: den korte beskrivelsen, ellers første avsnitt, klippet
product.pricestringDen viste variantens pris, formatert i kundens valuta. Tom uten pris
product.compareAtPricestringTidligere pris: laveste pris de 30 dagene før prisreduksjonen, formatert. Tom når butikken ikke oppgir noen reduksjon
product.currencystringValutakode
product.imagestringFørste bildes adresse (den viste variantens eget bilde først), tom når ingen finnes
product.imageAltstringFørste bildes alt-tekst
product.images[]listAlle bilder: url, alt, caption (forhandlerens egen tekst, tom når ingen finnes)
product.badgestringSalgsmerkets tekst, tom når ingen finnes
product.skustringDen viste variantens artikkelnummer, tom når ingen finnes
product.stockStatusstringin_stock, preorder eller out_of_stock, for den viste varianten
product.stockLabelstringLagerlinjens tekst på butikkens språk ("Få igjen (3)", "Forhåndsbestilling · sendes om 10 dager")
product.inStockbooleanLegg 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.variantIdstringDen viste varianten, for data-bs-variant-id på add-to-cart. Tom uten varianter
product.variantTitlestringDen viste variantens tittel, tom uten varianter
product.variants[]listAlle varianter: id, title, sku, price, stockStatus, stockLabel, inStock, selected, options[] (name, value)
product.options[]listAlternativgruppene 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[]listKategoriene produktet ligger i, den første = brødsmulen: name, slug, href
product.tags[]listProduktets tagger, som strenger
product.metastringTagglinjen (de første taggene), tom når ingen finnes
product.properties[]listEgenskapene 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.namestringButikkens navn
storefront.slugstringButikkens slug
storefront.hoststringButikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten
brand.logoUrlstringLogoens adresse, tom når ingen finnes
brand.footerLogoUrlstringLys logo for mørke flater. Faller tilbake på logoUrl
brand.logoHeightnumberLogoens høyde i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightlinjen
currency.codestringValgt valuta
cart.countnumberAlltid 0 når siden tegnes. Skriv den i <span data-bs-cart-count>, som i toppfeltet
i18n.addToCartstring"Legg i handlekurven" på butikkens språk
i18n.chooseVariantstring"Velg variant"
i18n.inStockstring"På lager"
i18n.outOfStockstring"Utsolgt"
i18n.preorderstring"Forhåndsbestilling"
i18n.priceOnRequeststring"Pris på forespørsel"
i18n.vatstring"Inkl. mva." eller "Ekskl. mva.", slik butikken priser
i18n.wishliststring"Lagre i ønskelisten"
i18n.homestring"Hjem", brødsmulens første ledd

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.

VariabelTypeHva
images[]listAlle bilder, den viste variantens eget først: url, alt, caption (forhandlerens egen tekst, tom når ingen finnes)
imagestringFørste bildes adresse, tom når ingen finnes
imageAltstringFørste bildes alt-tekst
countnumberAntall bilder
titlestringProduktets tittel
product.idstringProduktets id, for data-bs-product-id på toggle-wishlist
product.titlestringTittelen
product.hrefstringLenke til produktsiden
storefront.namestringButikkens navn
storefront.slugstringButikkens slug
storefront.hoststringButikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten
brand.logoUrlstringLogoens adresse, tom når ingen finnes
brand.footerLogoUrlstringLys logo for mørke flater. Faller tilbake på logoUrl
brand.logoHeightnumberLogoens høyde i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightlinjen
i18n.imagesstring"Produktbilder" på butikkens språk
i18n.previousstring"Forrige bilde"
i18n.nextstring"Neste bilde"
i18n.noImagestring"Ingen bilde"
i18n.wishliststring"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.

VariabelTypeHva
category.idstringKategoriens id
category.namestringKategoriens navn
category.descriptionstringBeskrivelsen, tom når ingen finnes
category.slugstringKategoriens slug
category.hrefstringLenke til kategorien
category.imagestringKategoribildets adresse, tom når ingen finnes
products[]listProduktene 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
countnumberAntall produkter som listes (etter filtre)
totalnumberAntall produkter i kategorien
emptybooleanSann når ingenting listes
filters[]listFiltergruppene siden viser, i rekkefølge. På All products og i søkeresultatene står gruppen Category først
filters[].labelstringGruppens navn
filters[].paramstringAdresseparameteren verdiene skriver: f., eller category
filters[].selectedCountnumberAntall avkryssede verdier i gruppen
filters[].values[]listGruppens verdier, i rekkefølge
filters[].values[].labelstringDet verdien vises som (en kategoris navn)
filters[].values[].valuestringVerdien slik lenken skriver den
filters[].values[].countnumberProdukter på siden med verdien
filters[].values[].depthnumberEn underkategoris dybde i gruppen Category, ellers 0
filters[].values[].selectedbooleanAvkrysset av kunden
filters[].values[].hrefstringSiden med verdien avkrysset eller ikke, de andre kryssene beholdt
filterednumberVerdier kunden har krysset av
clearHrefstringSiden uten kryss
stickybooleanFilters stay in view er på, og siden har filtre
storefront.namestringButikkens navn
storefront.slugstringButikkens slug
storefront.hoststringButikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten
brand.logoUrlstringLogoens adresse, tom når ingen finnes
brand.footerLogoUrlstringLys logo for mørke flater. Faller tilbake på logoUrl
brand.logoHeightnumberLogoens høyde i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightlinjen
i18n.shopstring"Butikk" på butikkens språk, brødsmulens første ledd
i18n.productsstring"Produkter"
i18n.emptystring"Ingen produkter i denne kategorien ennå."
i18n.noMatchstring"Ingen produkter matcher filtrene dine."
i18n.filtersstring"Filtre"
i18n.clearstring"Nullstill filtre"

Seksjonens egne innstillinger.

VariabelTypeHva
headingstringOverskriften
subtitlestringUnderoverskriften
imageUrlstringBildets adresse
imageAltstringBildets alt-tekst
ctaLabelstringKnappens tekst
ctaHrefstringKnappens lenke
alignstringleft eller center
valignstringtop, center eller bottom
sizestringxs … xl eller screen
bleedstringcontained eller full
ctaStylestringprimary, light eller outline
storefront.namestringButikkens navn
storefront.slugstringButikkens slug
storefront.hoststringButikkens offentlige vert: det egne domenet når det er verifisert, ellers bunstack.shop-verten
brand.logoUrlstringLogoens adresse, tom når ingen finnes
brand.footerLogoUrlstringLys logo for mørke flater. Faller tilbake på logoUrl
brand.logoHeightnumberLogoens høyde i px (16–96)
brand.taglinestringTaglinen
brand.copyrightstringCopyrightlinjen

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

ActionKrevesValgfrittHva
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-iddata-bs-variant-id, data-bs-quantityLegger 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-quantity skal 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-newsletter krever et skjema med data-bs-newsletter og et felt name="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 harButikken
Ingen varianterLegger produktet i handlekurven
Én variant på lagerLegger 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.

GruppeElementer som beholdes
Strukturdiv, section, header, footer, nav, aside, article, ul, ol, li, p, h1–h6, dl, dt, dd, details, summary, figure, figcaption, blockquote, address
Tekstspan, strong, em, b, i, u, s, small, sup, sub, mark, cite, abbr, time, br, hr, wbr
Lenker og bildera, img, picture, source
Skjemaerbutton, input, label, form
SVGsvg, g, path, circle, ellipse, rect, line, polyline, polygon

Attributter som beholdes:

  • på alle elementer: class, id, title, role, tabindex, lang, dir, hidden, style, translate, alle aria-*, alle data-bs-* og data-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: action når det er en sti i butikken, for eksempel /search, og method når det er get eller post
  • på SVG: viewBox, fill, stroke, stroke-width, d, points og de andre tegneattributtene

Det som fjernes:

  • script, style, iframe, object, embed, noscript, template, textarea, select, video, audio, canvas, dialog, math og title, med alt innhold
  • alle on*-attributter og alle kommentarer
  • andre data-* enn data-bs-* og data-footer-*
  • adresser som ikke er relative, https:, http:, mailto: eller tel:, unntatt data:-bilder på img
  • en action som 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:

  1. Bytt startsidens teksthero mot et Image banner med Width full og et mørkt foto.
  2. Velg Look: Icons + panel.
  3. Sett Options: Sticky på, Transparent over hero på, Menu label av, Search på, Cart på, Announcement bar av.
  4. Velg den svarte logoen som Logo under Content, med høyde 40. Velg den hvite som Light logo.
  5. 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>