Kehittäjille
Malliviite
Viite komponentin omalle HTML:lle ja JS:lle: mallisyntaksi, muuttujat, actionit, puhdistus, JS, rajat ja esimerkit.
Koodieditorin avaaminen kerrotaan sivulla Oma koodi komponentissa.
Missä: suunnittelutyökalu, komponentin Customize with code › Code, tilassa Advanced. Osio Custom component noudattaa samoja sääntöjä.
Juuri on kaupan
Jokaisella komponentilla on juuri, jonka kauppa piirtää. Mallisi on juuren sisältö.
- Ylätunnisteen juuri on
[data-bs-header]. Kauppa asettaa juureen tilat[data-bs-transparent],[data-bs-scrolled]ja[data-bs-sticky], myös kun ylätunniste on omaa HTML:ääsi. - Älä kirjoita malliin omaa
<header>-elementtiä. Aloita siitä, mitä sen sisään tulee. - CSS:si rajataan juureen. JS:si saa juuren muuttujana
root. - Custom component -osion juuri on
[data-bs-block="<osion-id>"].
Kaikki juuret ovat sivulla Koukut ja CSS-viite.
Mallisyntaksi
Malli on HTML:ää, jossa muuttujat ovat kaksinkertaisissa aaltosulkeissa. Tämä on koko syntaksi.
| Kirjoitustapa | Mitä |
|---|---|
{{storefront.name}} | Arvo, aina HTML-escapattuna. Tuntematon muuttuja antaa tyhjän tekstin. |
{{#each nav}} … {{/each}} | Toistaa lohkon listan jokaiselle merkinnälle. |
{{this}}, {{this.label}} | #each-silmukan merkintä tai merkinnän kenttä. Paljas {{label}} haetaan ensin merkinnältä. |
{{@index}}, {{@first}}, {{@last}} | Laskuri nollasta, ja tosi ensimmäisellä ja viimeisellä kierroksella. |
{{#if cart.count}} … {{else}} … {{/if}} | Näyttää lohkon, kun arvo on tosi. {{else}} on valinnainen. |
{{#unless brand.logoUrl}} … {{/unless}} | #if:n vastakohta. |
- Tyhjä teksti,
0, tyhjä lista jafalseovat epätosia. - HTML:ää ei voi tulostaa ilman escapausta.
- Apufunktioita ja sisällytettäviä malleja ei ole.
Rajat
| Raja | Arvo |
|---|---|
| Mallin pituus | 200 000 merkkiä |
| Piirretty HTML | 200 000 merkkiä |
| CSS:n pituus | 200 000 merkkiä |
| JS:n pituus | 100 000 merkkiä |
| Sisäkkäiset lohkot | 32 tasoa |
| Askeleet piirtoa kohti | 50 000 |
- Pidempi osa katkaistaan varoituksella, joka kertoo kohdan, esimerkiksi
css cut at 200 000 characters. - Piirto keskeytyy 50 000 askeleen jälkeen. Silmukka silmukassa ei voi jumittaa kauppaa.
- Vähintään 33 333 merkin malli piirretään suunnittelutyökalussa kerran ilman dataa. Jos se silloin osuu rajaan, se näkyy kohdassa May cut with some data välilehdellä Code.
- Kauppa listaa vain sen, minkä sen oma piirto katkaisee.
Virheet ja varoitukset
Malli, jota ei voi lukea, ei piirrä mitään. Tämä koskee esimerkiksi {{#each}}-lohkoa, jota ei koskaan suljeta, tai lohkoa, joka suljetaan väärällä tagilla. Kauppa näyttää silloin vakioulkoasun, ja suunnittelutyökalu näyttää virheen koodin kohdalla.
| Missä | Mitä näet |
|---|---|
| Suunnittelutyökalu | Virheen tai varoituksen punaisella koodin alla. |
| Kaupan HTML, virhe | <!-- bs-component-error: … --> elementin <template data-bs-component-errors> sisällä. |
| Kaupan HTML, varoitus | <!-- bs-component-warning: … --> samassa paikassa. Komponentti piirretään silti. |
| Katkaistu tuotekortti tai banneri | data-bs-component-warning juuressa. Konsoli näyttää syyn kerran tyyliä kohti. |
Varoitus voi koskea CSS-sääntöä, jota ei voitu rajata, tai vaihtoehtoa, joka hylättiin.
Muuttujat
Header, Menu panel ja Footer
Nämä kolme jakavat yhden muuttujajoukon. Osio Custom component saa saman joukon.
| Muuttuja | Tyyppi | Mitä |
|---|---|---|
storefront.name | string | Kaupan nimi |
storefront.slug | string | Kaupan slug |
storefront.host | string | Kaupan julkinen isäntä: oma verkkotunnus, kun se on vahvistettu, muuten bunstack.shop-isäntä |
brand.logoUrl | string | Logon osoite, tyhjä kun logoa ei ole |
brand.footerLogoUrl | string | Vaalea logo tummille pinnoille. Palautuu logoUrl:iin |
brand.logoHeight | number | Logon korkeus pikseleinä (16–96) |
brand.tagline | string | Tagline |
brand.copyright | string | Copyright-rivi |
nav[] | list | Pääkategoriat: label, href, children[] |
nav[].label | string | Kategorian nimi |
nav[].href | string | Linkki kategoriaan |
nav[].children[] | list | Alakategoriat, joilla on samat kentät kuin ylätasolla, label ja href. Käy ne läpi: {{#each this.children}}{{this.label}}{{/each}} |
pages[] | list | Valikossa näytettävät sivut: label, href |
cart.count | number | Aina 0, kun sivu piirretään, koska ostoskori on selaimessa. Kirjoita se elementtiin <span data-bs-cart-count>. Kauppa pitää sen elementin ajan tasalla |
social[] | list | Some-linkit: key, label, href |
contact.email | string | Yhteyssähköposti, tyhjä kun ei asetettu |
contact.phone | string | Puhelin, tyhjä kun ei asetettu |
currency.code | string | Valittu valuutta |
currency.options[] | list | Valuutat, joissa kauppa myy: code, label. Tyhjä kävijälle maasta, joka on kohdassa Not sold to valinnalla Prices hidden |
search.href | string | Linkki hakusivulle |
menu.links[] | list | Valikon isot linkit järjestyksessä, kohdasta Menu panel › Links: label, href, children[], category, draft, products[] |
menu.links[].label | string | Linkin teksti: oma tekstisi, muuten kategorian tai sivun nimi |
menu.links[].href | string | Mihin linkki vie |
menu.links[].children[] | list | Kategorialinkin alakategoriat: label, href. Tyhjä sivulle tai osoitteelle |
menu.links[].category | string | Kategorian id kategorialinkille, muuten tyhjä |
menu.links[].draft | boolean | Sivu ei ole vielä live. Vain suunnittelutyökalun työtilassa: kauppa ei näytä linkkiä |
menu.links[].products[] | list | Linkin kortit: kategorian tuotteet, nostetut ensin ja alakategoriat mukana, muuten oletuskortit. Kortin kentillä |
menu.secondary[] | list | Valikon pienet linkit järjestyksessä: label, href |
menu.heading | string | Tuotteiden yläpuolinen otsikko (Heading over the products), tyhjä kun sitä ei ole |
menu.products[] | list | Oletuskortit: nostetut tuotteet järjestyksessä, kortin kentillä. Tyhjä, kunnes valikko on hakenut ne |
i18n.menu | string | "Valikko" kaupan kielellä |
i18n.close | string | "Sulje" |
i18n.search | string | "Haku" |
i18n.searchPlaceholder | string | Hakukentän paikkamerkki |
i18n.cart | string | "Ostoskori" |
i18n.wishlist | string | "Toivelista" |
i18n.shop | string | "Kauppa" |
i18n.contact | string | "Yhteystiedot" |
i18n.orders | string | "Seuraa tilaustasi" |
Product card
Yksi malli korttia kohti. Se piirretään jokaiselle ruudukon tuotteelle.
| Muuttuja | Tyyppi | Mitä |
|---|---|---|
product.id | string | Tuotteen id, data-bs-product-id:tä varten |
product.title | string | Otsikko |
product.href | string | Linkki tuotesivulle |
product.price | string | Hinta, muotoiltuna asiakkaan valuutassa. Kun variantit maksavat eri verran, se on niistä alin, ja sen edessä on ruotsinkielisessä kaupassa "från" ja muissa "from". Tyhjä ilman hintaa |
product.priceAmount | string | Sama hinta ilman sanaa "från" tai "from". Tyhjä ilman hintaa |
product.priceVaries | boolean | Tosi, kun ostettavissa olevat variantit maksavat eri verran. Hinta on silloin niistä alin |
product.compareAtPrice | string | Aiempi hinta: alin hinta hinnanalennusta edeltäneiden 30 päivän ajalta, muotoiltuna. Tyhjä kun kauppa ei ilmoita alennusta |
product.currency | string | Valuuttakoodi |
product.image | string | Ensimmäisen kuvan osoite, tyhjä kun kuvaa ei ole |
product.imageAlt | string | Kuvan alt-teksti |
product.badge | string | Alennusmerkin teksti, tyhjä kun merkkiä ei ole |
product.sku | string | Tyhjä. Kortin tuotetiedoissa ei ole tuotenumeroa |
product.inStock | boolean | Kortilla tosi, varasto tarkistetaan kassalla. Epätosi kävijälle maasta, joka on kohdassa Not sold to, koska kauppa ei myy sinne. Käytä sitä ostopainikkeeseen, älä loppuunmyyty-tekstiin. Valinnalla Prices hidden myös price, priceAmount, compareAtPrice ja badge ovat tyhjiä |
product.variantId | string | Tyhjä. Add-to-cart kortilta lisää tuotteen ainoan variantin ostoskoriin tai avaa tuotesivun, kun variantteja on useita |
product.meta | string | Tagirivi otsikon alla |
storefront.name | string | Kaupan nimi |
storefront.slug | string | Kaupan slug |
storefront.host | string | Kaupan julkinen isäntä: oma verkkotunnus, kun se on vahvistettu, muuten bunstack.shop-isäntä |
brand.logoUrl | string | Logon osoite, tyhjä kun logoa ei ole |
brand.footerLogoUrl | string | Vaalea logo tummille pinnoille. Palautuu logoUrl:iin |
brand.logoHeight | number | Logon korkeus pikseleinä (16–96) |
brand.tagline | string | Tagline |
brand.copyright | string | Copyright-rivi |
Product page
Galleria ja ostopaneeli, piirrettynä näytettävälle variantille. Kun asiakas valitsee toisen variantin select-variant-actionilla, malli piirretään uudelleen. Hinta, tuotenumero, varastorivi, product.variantId ja jokainen selected seuraavat mukana. Muu osa sivusta on vakiosivua: tiedot, arvostelut ja liittyvät tuotteet. Mallin alle kauppa piirtää tuotteen kysymykset, rivin ostoskorin lisävalinnoista ja ruudun Optional add-ons. Mallin add-to-cart lisää asiakkaan rastittamat lisävalinnat ja pysähtyy tyhjään pakolliseen kysymykseen kuten vakiopainike.
| Muuttuja | Tyyppi | Mitä |
|---|---|---|
product.id | string | Tuotteen id, data-bs-product-id:tä varten |
product.title | string | Otsikko |
product.href | string | Linkki tuotesivulle |
product.description | string | Koko kuvaus tekstinä ilman muotoilua. Tyhjä kun kuvausta ei ole |
product.paragraphs[] | list | Kuvauksen kappaleet, otsikot ja luettelot tekstinä, yksi merkkijono lohkoa kohti |
product.shortDescription | string | Lyhyt kuvaus tekstinä. Tyhjä kun kuvausta ei ole |
product.intro | string | Teksti hinnan vieressä: lyhyt kuvaus, muuten ensimmäinen kappale lyhennettynä |
product.price | string | Näytetyn variantin hinta, muotoiltuna asiakkaan valuutassa. Tyhjä ilman hintaa |
product.compareAtPrice | string | Aiempi hinta: alin hinta hinnanalennusta edeltäneiden 30 päivän ajalta, muotoiltuna. Tyhjä kun kauppa ei ilmoita alennusta |
product.currency | string | Valuuttakoodi |
product.image | string | Ensimmäisen kuvan osoite (näytetyn variantin oma kuva ensin), tyhjä kun kuvaa ei ole |
product.imageAlt | string | Ensimmäisen kuvan alt-teksti |
product.images[] | list | Kaikki kuvat: url, alt, caption (kauppiaan oma teksti, tyhjä kun sitä ei ole) |
product.badge | string | Alennusmerkin teksti, tyhjä kun merkkiä ei ole |
product.sku | string | Näytetyn variantin tuotenumero, tyhjä kun sitä ei ole |
product.stockStatus | string | in_stock, preorder tai out_of_stock, näytetylle variantille |
product.stockLabel | string | Varastorivin teksti kaupan kielellä ("Vain 3 jäljellä", "Ennakkotilaus · lähetetään 10 päivässä") |
product.inStock | boolean | Lisää ostoskoriin toimii: saatavilla olevaa varastoa tilassa Automatic, tai tila In stock (manual) tai Preorder. Ei koskaan tilassa Out of stock eikä koskaan kävijälle maasta, joka on kohdassa Not sold to. Käytä sitä ostopainikkeeseen ja muuttujaa stockStatus varastotekstiin. Valinnalla Prices hidden price, compareAtPrice, badge ja varianttien price ovat tyhjiä |
product.variantId | string | Näytetty variantti, data-bs-variant-id:tä varten add-to-cart-toiminnossa. Tyhjä ilman variantteja |
product.variantTitle | string | Näytetyn variantin otsikko, tyhjä ilman variantteja |
product.variants[] | list | Kaikki variantit: id, title, sku, price, stockStatus, stockLabel, inStock, selected, options[] (name, value) |
product.options[] | list | Vaihtoehtoryhmät valitsimen järjestyksessä: name, label (nimi niin kuin valitsin sen kirjoittaa, esimerkiksi Number of balls nimestä Number-of-balls), values[] |
product.options[].values[] | list | Yksi arvo: value, selected, available, variantId (sen, jonka select-variant valitsee arvolle) |
product.categories[] | list | Kategoriat, joissa tuote on, ensimmäinen = murupolku: name, slug, href |
product.tags[] | list | Tuotteen tagit, merkkijonoina |
product.meta | string | Tagirivi (ensimmäiset tagit), tyhjä kun tageja ei ole |
product.properties[] | list | Sivun näyttämät ominaisuudet ryhmien järjestyksessä: group (tyhjä ilman ryhmää), label, value (kuten kauppa sen kirjoittaa), values[] (arvon osat), display (bar, chips, table tai badge), numeric, percent (palkin täyttö asteikollaan, 0–100). Filter only ja Hidden eivät ole mukana |
storefront.name | string | Kaupan nimi |
storefront.slug | string | Kaupan slug |
storefront.host | string | Kaupan julkinen isäntä: oma verkkotunnus, kun se on vahvistettu, muuten bunstack.shop-isäntä |
brand.logoUrl | string | Logon osoite, tyhjä kun logoa ei ole |
brand.footerLogoUrl | string | Vaalea logo tummille pinnoille. Palautuu logoUrl:iin |
brand.logoHeight | number | Logon korkeus pikseleinä (16–96) |
brand.tagline | string | Tagline |
brand.copyright | string | Copyright-rivi |
currency.code | string | Valittu valuutta |
cart.count | number | Aina 0, kun sivu piirretään. Kirjoita se elementtiin <span data-bs-cart-count>, kuten ylätunnisteessa |
i18n.addToCart | string | "Lisää ostoskoriin" kaupan kielellä |
i18n.chooseVariant | string | "Valitse variantti" |
i18n.inStock | string | "Varastossa" |
i18n.outOfStock | string | "Loppuunmyyty" |
i18n.preorder | string | "Ennakkotilaus" |
i18n.priceOnRequest | string | "Hinta pyynnöstä" |
i18n.vat | string | "Sis. alv" tai "Ilman alv", kaupan hinnoittelun mukaan |
i18n.wishlist | string | "Tallenna toivelistalle" |
i18n.home | string | "Etusivu", murupolun ensimmäinen osa |
Gallery
Tuotekuvat tuotesivulla. Jos tuotesivu on omaa HTML:ää, sen malli piirtää gallerian itse, eikä gallerian ulkoasua piirretä lainkaan. Koodieditori, kaupan raportti ja työtila kertovat sen.
| Muuttuja | Tyyppi | Mitä |
|---|---|---|
images[] | list | Kaikki kuvat, näytetyn variantin oma ensin: url, alt, caption (kauppiaan oma teksti, tyhjä kun sitä ei ole) |
image | string | Ensimmäisen kuvan osoite, tyhjä kun kuvaa ei ole |
imageAlt | string | Ensimmäisen kuvan alt-teksti |
count | number | Kuvien määrä |
title | string | Tuotteen otsikko |
product.id | string | Tuotteen id, data-bs-product-id:tä varten toggle-wishlist-toiminnossa |
product.title | string | Otsikko |
product.href | string | Linkki tuotesivulle |
storefront.name | string | Kaupan nimi |
storefront.slug | string | Kaupan slug |
storefront.host | string | Kaupan julkinen isäntä: oma verkkotunnus, kun se on vahvistettu, muuten bunstack.shop-isäntä |
brand.logoUrl | string | Logon osoite, tyhjä kun logoa ei ole |
brand.footerLogoUrl | string | Vaalea logo tummille pinnoille. Palautuu logoUrl:iin |
brand.logoHeight | number | Logon korkeus pikseleinä (16–96) |
brand.tagline | string | Tagline |
brand.copyright | string | Copyright-rivi |
i18n.images | string | "Tuotekuvat" kaupan kielellä |
i18n.previous | string | "Edellinen kuva" |
i18n.next | string | "Seuraava kuva" |
i18n.noImage | string | "Ei kuvaa" |
i18n.wishlist | string | "Tallenna toivelistalle" |
Category
Kokoelmasivu ja sen listaamat tuotteet: kategoria, All products tai hakutulokset. Malli saa sivun suodattimet datana kohdassa filters[]: jokainen ryhmä arvoineen, määrineen, rasteineen ja linkkeineen, jotka rastittavat arvon tai poistavat rastin. Kauppa ei lisää suodattimia mallin omaan HTML:ään. Malli listaa sen, mitä osoitteen parametrit (?sort=…&f.…&category=…) määräävät. Malli korvaa Collection-sivun osiot, tuoteruudukko mukaan lukien. Sivun oma CSS (Collection-sivun välilehti Code) on edelleen voimassa.
| Muuttuja | Tyyppi | Mitä |
|---|---|---|
category.id | string | Kategorian id |
category.name | string | Kategorian nimi |
category.description | string | Kuvaus, tyhjä kun kuvausta ei ole |
category.slug | string | Kategorian slug |
category.href | string | Linkki kategoriaan |
category.image | string | Kategoriakuvan osoite, tyhjä kun kuvaa ei ole |
products[] | list | Listatut tuotteet asiakkaan suodattimien ja lajittelun jälkeen. Yksi merkintä tuotetta kohti kortin kentillä: id, title, href, price, priceAmount, priceVaries, compareAtPrice, currency, image, imageAlt, badge, sku, inStock, variantId, meta. Kävijälle maasta, joka on kohdassa Not sold to, inStock on epätosi, ja valinnalla Prices hidden price, priceAmount, compareAtPrice ja badge ovat tyhjiä |
count | number | Listattujen tuotteiden määrä (suodattimien jälkeen) |
total | number | Tuotteiden määrä kategoriassa |
empty | boolean | Tosi kun mitään ei listata |
filters[] | list | Sivun suodatinryhmät järjestyksessä. Sivulla All products ja hakutuloksissa Category-ryhmä on ensin |
filters[].label | string | Ryhmän nimi |
filters[].param | string | Osoiteparametri, jonka arvot kirjoittavat: f. |
filters[].selectedCount | number | Ryhmän rastitettujen arvojen määrä |
filters[].values[] | list | Ryhmän arvot järjestyksessä |
filters[].values[].label | string | Arvon näkyvä teksti (kategorian nimi) |
filters[].values[].value | string | Arvo siinä muodossa, jonka linkki kirjoittaa |
filters[].values[].count | number | Sivun tuotteet, joilla arvo on |
filters[].values[].depth | number | Alakategorian syvyys Category-ryhmässä, muuten 0 |
filters[].values[].selected | boolean | Asiakkaan rastittama |
filters[].values[].href | string | Sivu, jolla arvo on rastitettu tai rasti poistettu, muut rastit säilyvät |
filtered | number | Asiakkaan rastittamat arvot |
clearHref | string | Sivu ilman rasteja |
sticky | boolean | Filters stay in view on päällä, ja sivulla on suodattimia |
storefront.name | string | Kaupan nimi |
storefront.slug | string | Kaupan slug |
storefront.host | string | Kaupan julkinen isäntä: oma verkkotunnus, kun se on vahvistettu, muuten bunstack.shop-isäntä |
brand.logoUrl | string | Logon osoite, tyhjä kun logoa ei ole |
brand.footerLogoUrl | string | Vaalea logo tummille pinnoille. Palautuu logoUrl:iin |
brand.logoHeight | number | Logon korkeus pikseleinä (16–96) |
brand.tagline | string | Tagline |
brand.copyright | string | Copyright-rivi |
i18n.shop | string | "Kauppa" kaupan kielellä, murupolun ensimmäinen osa |
i18n.products | string | "Tuotteet" |
i18n.empty | string | "Tässä kategoriassa ei ole vielä tuotteita." |
i18n.noMatch | string | "Yksikään tuote ei vastaa suodattimiasi." |
i18n.filters | string | "Suodattimet" |
i18n.clear | string | "Tyhjennä suodattimet" |
Banner
Osion omat asetukset.
| Muuttuja | Tyyppi | Mitä |
|---|---|---|
heading | string | Otsikko |
subtitle | string | Alaotsikko |
imageUrl | string | Kuvan osoite |
imageAlt | string | Kuvan alt-teksti |
ctaLabel | string | Painikkeen teksti |
ctaHref | string | Painikkeen linkki |
align | string | left tai center |
valign | string | top, center tai bottom |
size | string | xs … xl tai screen |
bleed | string | contained tai full |
ctaStyle | string | primary, light tai outline |
storefront.name | string | Kaupan nimi |
storefront.slug | string | Kaupan slug |
storefront.host | string | Kaupan julkinen isäntä: oma verkkotunnus, kun se on vahvistettu, muuten bunstack.shop-isäntä |
brand.logoUrl | string | Logon osoite, tyhjä kun logoa ei ole |
brand.footerLogoUrl | string | Vaalea logo tummille pinnoille. Palautuu logoUrl:iin |
brand.logoHeight | number | Logon korkeus pikseleinä (16–96) |
brand.tagline | string | Tagline |
brand.copyright | string | Copyright-rivi |
Kirjoita otsikko <h1>-elementtinä, kun banneri on sivun otsikkolohko. Silloin se on sivun otsikko. Jos mallista puuttuu <h1>, kauppa lisää bannerin jälkeen piilotetun sivun otsikon, kun banneri on sivun otsikkolohko. Banneri on otsikkolohko, kun se on sivun ensimmäinen banneri tai hero eikä mikään tason 1 otsikko-osio ota otsikkoa.
Actionit
HTML:lläsi ei ole omia tapahtumankäsittelijöitä. Lisää elementtiin data-bs-action, niin kauppa hoitaa loput napsautuksella. Kauppa käyttää samoja kuuntelijoita kuin vakio-HTML:ssä. Attribuutti voi olla missä tahansa elementissä, myös <svg>-elementissä.
| Action | Vaaditaan | Valinnainen | Mitä |
|---|---|---|---|
data-bs-action="open-cart" | – | – | Avaa ostoskorin kaupan valinnan Checkout › Cart mukaan: paneelin tai ostoskorisivun |
data-bs-action="open-search" | – | – | Avaa hakukentän |
data-bs-action="open-menu" | – | – | Avaa valikkopaneelin |
data-bs-action="close-menu" | – | – | Sulkee valikkopaneelin |
data-bs-action="add-to-cart" | data-bs-product-id | data-bs-variant-id, data-bs-quantity | Lisää tuotteen ostoskoriin |
data-bs-action="toggle-wishlist" | data-bs-product-id | – | Lisää tuotteen toivelistalle tai poistaa sen |
data-bs-action="select-variant" | data-bs-variant-id | – | Valitsee variantin tuotesivulla. Hinta, varastorivi, product.variantId ja jokainen selected seuraavat mukana. Vain tuotesivun omassa mallissa |
data-bs-action="open-cookie-settings" | – | – | Avaa evästeasetukset, saman ikkunan kuin vakioalatunnisteen linkki |
data-bs-action="set-currency" | data-bs-currency | – | Vaihtaa valuutan attribuutin koodiin, kuten data-bs-currency="EUR". Koodit ovat muuttujassa currency.options[] |
data-bs-action="subscribe-newsletter" | data-bs-newsletter | – | Tilaa uutiskirjeen kentän name="email" osoitteelle. Laita action <form>-elementtiin tai sen lähetyspainikkeeseen |
- Jos vaadittu attribuutti puuttuu, napsautus ei tee mitään.
data-bs-quantity-arvon on oltava positiivinen kokonaisluku. Muu luetaan arvona 1.- Action, jota ei ole tai jolta puuttuu vaadittu attribuutti, antaa varoituksen mallin kääntämisen yhteydessä. Varoitus näkyy koodin kohdalla ja kaupan HTML:ssä muodossa
<!-- bs-component-warning: … -->. subscribe-newslettervaatii lomakkeen, jossa ondata-bs-newsletterja kenttäname="email". Se ajetaan, kun lomake lähetetään, joten Enter kentässä toimii. Osoite saa saman tarkistuksen ja saman vastauksen kuin vakioalatunnisteessa.
add-to-cart ilman data-bs-variant-id:tä, esimerkiksi kortilla, kysyy kaupalta tuotteesta:
| Tuotteella on | Kauppa |
|---|---|
| Ei variantteja | Lisää tuotteen ostoskoriin |
| Yksi variantti varastossa | Lisää variantin ostoskoriin |
| Useita variantteja tai yksi variantti, joka on loppu tai ennakkotilattava | Avaa tuotesivun |
Koukut
Koukut ovat kaupan HTML:n attribuutteja, joihin CSS ja JS kohdistuvat: komponentin juuri, sisäelementit ja juuren tilat. Kaikki koukut komponenteittain, sivun koukut ja tokenien CSS:n säännöt ovat sivulla Koukut ja CSS-viite.
Puhdistus
Piirretty malli puhdistetaan ennen kuin se päätyy sivulle, samalla tavalla palvelimella ja selaimessa.
| Ryhmä | Säilytettävät elementit |
|---|---|
| Rakenne | div, section, header, footer, nav, aside, article, ul, ol, li, p, h1–h6, dl, dt, dd, details, summary, figure, figcaption, blockquote, address |
| Teksti | span, strong, em, b, i, u, s, small, sup, sub, mark, cite, abbr, time, br, hr, wbr |
| Linkit ja kuvat | a, img, picture, source |
| Lomakkeet | button, input, label, form |
| SVG | svg, g, path, circle, ellipse, rect, line, polyline, polygon |
Säilytettävät attribuutit:
- kaikissa elementeissä:
class,id,title,role,tabindex,lang,dir,hidden,style,translate, kaikkiaria-*, kaikkidata-bs-*jadata-footer-* - linkeissä:
href,target,rel - kuvissa:
src,srcset,sizes,alt,width,height,loading - painikkeissa ja kentissä:
type,name,value,placeholder,disabled form-elementissä:action, kun se on kaupan polku, esimerkiksi/search, jamethod, kun se ongettaipost- SVG:ssä:
viewBox,fill,stroke,stroke-width,d,pointsja muut piirtoattribuutit
Mitä poistetaan:
script,style,iframe,object,embed,noscript,template,textarea,select,video,audio,canvas,dialog,mathjatitlekoko sisältöineen- kaikki
on*-attribuutit ja kaikki kommentit - muut
data-*-attribuutit kuindata-bs-*jadata-footer-* - osoitteet, jotka eivät ole suhteellisia,
https:,http:,mailto:taitel:, paitsidata:-kuvatimg-elementissä action, joka osoittaa kaupan ulkopuolelle
Elementti, jota ei ole listassa, poistetaan, mutta sen sisältö säilyy. style="…" puhdistetaan kuten muu CSS. Linkeissä säilyvät target="_blank", joka saa rel="noopener", sekä target="_self". Muut target-arvot poistetaan. Avoimet elementit suljetaan lopussa, joten tulos on aina tasapainoista HTML:ää.
Luokat ja koot
Vakio-HTML:ssä on muutama Tailwind-luokka, esimerkiksi flex, items-center ja gap-4. Suunnittelutyökalu ei käännä mallistasi uusia luokkia. Luokka, jota kaupassa ei jo ole, ei tee mitään. Aseta koko ja välit välilehdellä Design, kohdassa Code › CSS koukkuihin tai elementin style-attribuuttina.
CSS
Code-välilehden CSS koskee vain komponenttia. Miten valitsimet rajataan juureen, mitä puhdistus poistaa ja miten lataat omat fontit, kerrotaan sivulla Koukut ja CSS-viite.
px ja rem: katso Oma CSS ja head-koodi.
JS
- JS ajetaan kerran sivun latausta kohti, kun sivu on latautunut, jokaisella sivulla, jolla komponentti on.
- Se saa komponentin juurielementin muuttujana
root. Jos komponenttia ei ole sivulla, sitä ei ajeta. - Valikkopaneelin juuri on olemassa vain, kun paneeli on auki. Sen JS ajetaan joka kerta, kun paneeli avataan, uutta juurta vasten. Sido kuuntelijat muuttujaan
root, eidocument-olioon. - Virhe, myös syntaksivirhe, kirjataan selaimen konsoliin tyylin nimellä. Se ei pysäytä sivua eikä muiden komponenttien JS:ää.
- Koodi ajetaan myös työtilassa. Kytkin Run JS in the builder keskeyttää sen siellä istunnon ajaksi. Kauppa ja Preview (⌘P) ajavat sen tavalliseen tapaan.
root.querySelectorAll('[data-bs-header-icons] a').forEach((a) => {
a.addEventListener('mouseenter', () => a.classList.add('is-hot'));
});
Tuotekortti on sivulla monta kertaa. root on silloin ensimmäinen kortti. Käytä kaikille document.querySelectorAll('[data-bs-card]').
Sivun JS välilehdellä Code ajetaan samalla tavalla, ilman muuttujaa root. Se, mitä kirjoitat Collection-sivulle, koskee kaikkia kategoriasivuja.
Esimerkki: navbar Classic-kaupassa
Tavoite on täysleveä ylätunniste. Se on läpinäkyvä hero-kuvan päällä valkoisella logolla ja valkoisilla kuvakkeilla, ja valkoinen, kun sivua on vieritetty 24 px. Oikealla on neljä 30 px:n kuvaketta: haku, toivelista, ostoskori ja valikko. Suurin osa on säätimiä. Loput on kuusi riviä CSS:ää.
Säätimet komponenttipaneelissa kohdassa Header:
- Vaihda etusivun tekstihero Image banner -osioon, jonka Width on täysi ja kuva tumma.
- Valitse Look: Icons + panel.
- Aseta Options: Sticky päälle, Transparent over hero päälle, Menu label pois, Search päälle, Cart päälle, Announcement bar pois.
- Valitse kohdassa Content musta logo kenttään Logo korkeudella 40. Valitse valkoinen kenttään Light logo.
- Tarkista, että Theme › Colours › Header text over hero on valkoinen.
Kytke Advanced päälle, paina Customize with code ja kirjoita kohtaan 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; }
Paina Save as new style ja anna tyylille nimi "Oma navbar". Tyyli on nyt kohdassa Your header styles kaikissa workspacen kaupoissa. Logot kuuluvat teemaan, ja ne asetetaan kohdassa Content jokaisessa kaupassa.
Sama navbar omana HTML:nä
Avaa Code › HTML ja paina Start from the standard markup. Kenttä täyttyy vakioulkoasun HTML:llä. Alla oleva malli on sama navbar käsin kirjoitettuna. Se käyttää samoja sisäisiä koukkuja, joten yllä oleva CSS toimii sellaisenaan. Hampurilaisvalikko avaa kaupan vakiopaneelin, jossa on oma Close-painike ja joka sulkeutuu Escillä.
<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>
Vakio-HTML:ssä kauppa vaihtaa logon itse. Omassa mallissa molemmat kuvat ovat HTML:ssä, ja CSS valitsee juuren tilan perusteella:
[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; }
Valikkopaneeli omana HTML:nä
Kauppa piirtää paneelin juuren [data-bs-menu] ja avaa sen open-menu-actionilla. Malli käy läpi valikon linkit kohdasta Menu panel › Links, isot alakategorioineen ja sitten pienet:
<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 avaa kaupan hakukentän kerroksena ylätunnisteen ja paneelin päälle. Jos HTML:ssäsi on elementti [data-bs-search-slot], hakukenttä piirretään sen sisään. Oma hakulomake toimii myös:
<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>
Tuotekortti omana HTML:nä
Kauppa piirtää kortin juuren [data-bs-card]. Malli on sen sisäosa. Painike saa tuotteensa attribuuteista.
<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>