Skip to content

Technická referencia

Táto stránka je technická referencia CSS hookov (stabilných tried) storefrontu a je vedená v angličtine — názvy tried sú rovnaké vo všetkých jazykoch. Použite ju pri písaní vlastného CSS v sekcii Vlastný kód (Nastavenia → Vzhľad → Vlastný kód).

Storefront CSS styling hooks — reference ​

Pre AI nástroje

Stiahnite si inštrukčný súbor CLAUDE.md a vložte ho svojmu AI nástroju (napr. Claude). Naučí AI písať bezpečné CSS len pre sekciu Vlastný kód vášho obchodu.

A complete catalogue of the stable, semantic CSS class "hooks" on the storefront, so that platform Brand CSS and merchant Vlastný kód can style any component without relying on Tailwind utility classes (which change between builds) or Vue data-v-* scoped attributes (which are build-hashed and unstable).

TL;DR — every meaningful storefront element carries a predictable bare-kebab class. Target it as .shop-layout .hook-name { … }. You never need !important.


1. Why these exist ​

The storefront is styled three ways, in this cascade order (later wins):

  1. Framework — Tailwind v4 utilities + component <style scoped> blocks.
  2. Brand CSS — platform-owned, SuperAdmin-only, stored in visual_settings.theme_css, injected inside @layer brand. Beats Tailwind utilities without !important.
  3. Merchant Vlastný kód — visual_settings.custom_css, injected unlayered, so it beats the brand layer without !important.

The three layers are injected in resources/views/app.blade.php and resources/css/app.css: Brand CSS comes from visual_settings.theme_css (inside @layer brand) and merchant Vlastný kód from visual_settings.custom_css (unlayered, so it wins over the brand layer).

Both Brand CSS and merchant CSS need stable selectors. Tailwind utility classes are not stable (a redesign changes them) and scoped data-v-* hashes change on every build. The hooks in this document are the contract: they don't change, so CSS written against them keeps working.

2. Conventions ​

  • Bare kebab-case, no prefix, no BEM __. (Matches the pre-existing product-title, product-price, language-switcher, category-card.)
  • Hooks are pure selectors — they carry no styles by default.
  • Always scoped by the storefront root: .shop-layout .hook { … }.
  • Hooks are added once in a shared component when it only renders in the intended context, otherwise at the per-usage site or per-variant.
  • Important boundary: Vue <style scoped> rules are unlayered, so they outrank @layer brand. Brand CSS can freely restyle utilities, global elements, and anything via CSS variables (--color-primary, --font-headline, --site-max-width, …, which pass straight through the scoped boundary). To recolor/resize inside a scoped component, prefer driving a CSS variable over fighting the scoped rule.

3. How to use — examples ​

css
/* Brand CSS (SuperAdmin → Custom Code → Brand CSS tab). Beats utilities, no !important. */
.shop-layout .header-cart { color: #e11d48; }
.shop-layout .product-card { border-radius: 18px; }
.shop-layout .section-title { letter-spacing: -0.02em; text-transform: uppercase; }

/* Merchant Vlastný kód overrides the brand theme, still no !important. */
.shop-layout .header-cart { color: #111; }

4. Hook catalogue (by area, with locations) ​

Legend: Hook = class name · Element = what it sits on · Where = file(s).

Header (all 8 variants) ​

Variant files: resources/js/Components/Shop/Navigation/Variants/{default,default_static,boutique,large,large_sticky,double_decker,double_decker_static,simple}/Header.vue

HookElementWhere
site-headerRoot <header> element (counterpart to site-footer)each variant Header.vue
header-announcementAnnouncement-bar wrappereach variant Header.vue
header-navThe max-width <nav>each variant Header.vue
header-rowMain logo/search/actions rowdefault, default_static, boutique, simple
header-middle-rowMiddle row (logo + search + actions)large, large_sticky
header-top-barTop deck / top bar wrapperboutique, large, large_sticky, double_decker, double_decker_static
header-top-linksTop-deck links rowsame 5 variants
header-top-linkEach link in the top-deck rowsame 5 variants
header-top-link-imageOptional round photo on a top-deck link (menu item "Fotka")same 5 variants
header-logoEach <Logo> usage site (adds to Logo.vue's own logo)each variant Header.vue
header-nav-linksDesktop nav-items row (boutique has two — left + right of the centred logo)each variant Header.vue
header-action-itemEach round action bubble (wishlist / cart)6 variants — see note below
header-switchersLanguage + currency clustereach variant Header.vue
header-breadcrumbBreadcrumb outer wrappereach variant Header.vue
header-actionsAction-row cluster wrappereach variant Header.vue
header-searchDesktop search boxeach variant Header.vue (via Search/SearchAutocomplete.vue)
header-search-toggleMobile search button7 variants (boutique has an always-visible bar)
header-menu-toggle, header-search-wrapper, search-autocomplete, search-autocomplete-field, search-autocomplete-icon, search-autocomplete-loading, search-section, search-section-popular, search-section-products, search-section-categories, search-section-pages, search-section-blogs, search-section-brands, search-section-title, search-popular-item, search-suggestion-item, search-empty, search-result-item, search-result-product, search-result-category, search-result-brand, search-result-blog, search-result-page, search-result-slide, search-modal-overlay, search-modal-close, mobile-search-overlay-bodyHamburger buttoneach variant Header.vue
header-cartCart icon buttonresources/js/Components/CartWidget.vue
header-wishlistWishlist iconresources/js/Components/FavoritesWidget.vue
header-accountAccount icon/linkresources/js/Components/UserAccountWidget.vue
language-switcherLanguage selectorresources/js/Components/LanguageSwitcher.vue (pre-existing)
currency-selectorCurrency selectorresources/js/Components/CurrencySelector.vue (pre-existing)

Per-variant identity is available without a hook: every root <header> also carries id="header-theme-<variant>" and data-theme-variant="<variant>", so .shop-layout[data-theme-variant="large"] .header-nav { … } targets one variant only.

header-action-item is not universal. It marks the round bubble <div> that wraps an action icon. boutique has no such wrappers at all (its widgets are direct children of header-actions), and in every variant the account widget renders bare rather than inside a bubble. Use header-cart / header-wishlist / header-account when you want a specific action regardless of variant; use header-action-item only to restyle the bubble itself.

Page-builder blueprints ​

Roots: every resources/js/Components/Shop/Blueprints/*.vue (39 files).

HookElementWhere
<slug>-blueprintBlueprint outer wrappereach blueprint, e.g. hero-section-blueprint, product-grid-blueprint, banner-grid-blueprint, faq-section-blueprint, testimonials-section-blueprint, newsletter-blueprint, contact-form-blueprint, card-blueprint, accordion-blueprint, tabs-blueprint, divider-blueprint, image-blueprint, …
section-titleBlueprint main headingacross Blueprints/*.vue (23 files)
section-subtitleSecondary heading / eyebrowBlueprints/*.vue (15)
section-textBody / rich textBlueprints/*.vue (13)
section-buttonPrimary CTABlueprints/*.vue (15)
section-link-overlayFull-cover "whole section clickable" background linkHeroSection.vue, Card.vue, BannerSection.vue, BannerGrid.vue, AdvancedBanner.vue, ImageBlock.vue (builder canvas disables its pointer-events for click-to-edit)
hero-search / hero-search-button / hero-search-suggestions / hero-search-suggestionHero search bar (Show search bar on a single hero): wrapper, submit button, example-searches row, one exampleHeroSection.vue (the input inside is the header's search-autocomplete-* hooks)

Product card ​

Variants: resources/js/Components/Shop/ProductCard/Variants/{default,simple,compact,detailed,large,minimal}/ProductCard.vue

HookElementWhere
product-cardCard rooteach ProductCard variant
product-card-imageImage / thumbnail wrappereach variant
product-titleTitle headingeach variant (pre-existing)
product-badgeLabel / discount / stock badgeeach variant (<ProductLabel>)
product-pricePrice wrapperComponents/Shop/ProductPrice.vue, Components/Products/ProductInfo.vue (pre-existing)
add-to-cart-btnAdd-to-cart button (main CTA)Shop/DetailButton.vue, Products/AddToCartButton.vue, Shop/ProductCardHoverOverlay.vue
product-card-cart-btnProduct-card overlay add-to-cart bubble (round icon button on cards)Components/Shop/ProductActionButton.vue (when type==='add-to-cart')
product-card-variantsSwatch row under the image on the showcase product cardComponents/Shop/ProductCard/Variants/showcase/ProductCard.vue
product-card-variant-swatchOne variant swatch (image thumb / color dot / text pill) in the row and in the “+N” panelComponents/Shop/ProductCard/Variants/showcase/ProductCard.vue
product-card-variant-moreThe “+N” button that opens the panel with all variantsComponents/Shop/ProductCard/Variants/showcase/ProductCard.vue
product-card-variant-panelThe in-card panel listing all variant swatchesComponents/Shop/ProductCard/Variants/showcase/ProductCard.vue
product-listingProducts-grid wrapperPages/Shop/ProductListing/Variants/{default,simple,no_banner}/ProductListing.vue

Product detail ​

Mostly pre-hooked (product-detail, -info, -gallery-column, -actions, …) in Components/Shop/ProductDetail/Variants/{default,compact}/ProductDetail.vue.

HookElementWhere
product-detail-titleProduct name <h1>Components/Products/ProductInfo.vue
product-detail-brandBrand link under the product title (setting "Show brand logo with link", brand pages on)Components/Products/ProductInfo.vue
product-detail-brand-logoThe brand logo <img> inside that linksame
product-detail-brand-nameBrand name text next to the logosame
product-detail-categoryPrimary-category link under the product title (setting "Show category with link" for the detail)Components/Products/ProductInfo.vue
product-card-categoryPrimary-category link above the SKU line on the card (setting "Show category with link")Components/Shop/ProductCard/Variants/*/ProductCard.vue, CompactProductCard.vue
product-galleryImage galleryComponents/Products/ProductGallery.vue (+ Variants/default/ProductGallery.vue)
product-spin360° turntable viewer (replaces the hero while active)Components/Products/Product360Viewer.vue
product-spin-frameThe <canvas> the frames are drawn onsame
product-spin-controlsRow of round icon buttons over the bottom of the framesame
product-spin-controlEach of those buttons (play/pause, prev, next, back to photos)same
product-spin-thumbThe "360" tile in the thumbnail grid (default theme)Products/ProductGallery.vue
product-spin-badgeRound "360" button centred on the main photo that starts the spinProducts/ProductGallery.vue, compact/ProductDetail.vue
product-spin-thumb-badgeThe small "360" badge on the grid tileProducts/ProductGallery.vue
quantity-inputQuantity stepperComponents/Shop/QuantityInput.vue
quatro-calculatorQuatro instalment-calculator block (product detail)Components/Shop/QuatroCalculatorButton.vue
quatro-calculator-linkThe <a> opening Quatro's calculatorComponents/Shop/QuatroCalculatorButton.vue
quatro-calculator-imageOfficial Quatro button imageComponents/Shop/QuatroCalculatorButton.vue
quatro-calculator-labelText fallback when the image is missingComponents/Shop/QuatroCalculatorButton.vue
quatro-calculator-noteHelper line under the buttonComponents/Shop/QuatroCalculatorButton.vue
review-list / review-itemReviews container / a reviewComponents/Sections/ReviewsCarousel.vue

Category ​

HookElementWhere
category-cardCard rootComponents/Shop/CategoryCard.vue (root pre-existing)
category-card-imageImage wrapperComponents/Shop/CategoryCard.vue
category-card-titleTitleComponents/Shop/CategoryCard.vue
quick-category-menuQuick category menu rootComponents/Shop/QuickCategoryMenu.vue
quick-category-menu-gridLinks gridComponents/Shop/QuickCategoryMenu.vue
quick-category-menu-itemCategory pill link (is-active on current category)Components/Shop/QuickCategoryMenu.vue
quick-category-menu-item-imageCategory thumbnailComponents/Shop/QuickCategoryMenu.vue
quick-category-menu-item-labelCategory name textComponents/Shop/QuickCategoryMenu.vue
quick-category-menu-toggleShow more / show less buttonComponents/Shop/QuickCategoryMenu.vue

Desktop navigation ​

HookElementWhere
nav-itemEach top-level menu item wrapperDesktopMenuItems.vue, MenuLink.vue, DropdownMenu.vue, + the 4 inline headers
nav-linkTop-level nav link / menu triggersame as above
nav-link-iconIcon inside a nav linkDesktopMenuItems.vue, MenuLink.vue, DropdownMenu.vue
nav-link-labelText label inside a nav linksame
nav-dropdownAny desktop dropdown / flyout panelDesktopMenuItems.vue, DropdownMenu.vue, + the 4 inline headers
nav-dropdown-togglePlain dropdown trigger buttonDropdownMenu.vue
nav-dropdown-listPlain dropdown item listDropdownMenu.vue
nav-dropdown-linkA child link in a plain dropdownDropdownMenu.vue
nav-overflowOverflow ("Viac"/more) wrapper7 variant Header.vue (boutique has no overflow menu)
nav-overflow-toggleOverflow trigger buttonsame 7
nav-overflow-panelOverflow dropdown panelsame 7

Each panel carries nav-dropdown plus a type-specific hook, so you can style one menu type without hitting the others. The inner component root is hooked separately.

Menu typePanel hook (on the dropdown)Content root hookComponent
Mega menumega-menu-panelmega-menuNavigation/MegaMenu.vue
Category flyoutnav-category-menu-panelnav-category-menuNavigation/CategoriesMenu.vue
Main-categories gridcategories-grid-menu-panelcategories-grid-menuNavigation/MainCategoriesGridMenu.vue
Parent-category menuparent-category-menu-panelparent-category-menuNavigation/ParentCategoryMenu.vue

Inner hooks per menu type:

HookElement
mega-menu-grid, mega-menu-section, mega-menu-title, mega-menu-item, mega-menu-item-image, mega-menu-item-title, mega-menu-bannerMega-menu grid, column, heading, item link, item image, item label, image-banner tile
nav-category-menu-rail, nav-category-menu-item, nav-category-menu-item-link, nav-category-menu-item-image, nav-category-menu-item-title, nav-category-menu-item-arrow, nav-category-menu-products, nav-category-menu-products-gridLeft category rail, a row, its link, thumbnail, label, round go-to arrow, right product pane, product grid
categories-grid-menu-grid, categories-grid-menu-column, categories-grid-menu-item, categories-grid-menu-item-image, categories-grid-menu-item-titleGrid, column, item link, thumbnail, label
parent-category-menu-grid, parent-category-menu-section, parent-category-menu-section-link, parent-category-menu-section-image, parent-category-menu-section-title, parent-category-menu-items, parent-category-menu-item, parent-category-menu-view-allGrid, a section column, its header link, image, title, child list, a child link, the "view all" link

Variants: Components/Shop/CategoryMenu/Variants/{default,simple}/CategoryMenu.vue (+ the recursive Components/Shop/CategoryMenuItem.vue). Both variants carry the same hooks, so a rule written for one keeps working after a variant switch. The product-filter-style category dropdown in ProductListingSidebar/Variants/top uses the same names.

HookElement
category-menuMenu root
category-menu-headerHeadline block
category-menu-toggleCollapsible headline button (when closable)
category-menu-listThe <nav> item list
category-menu-itemOne item row
category-menu-linkThe item's link
category-menu-item-toggleExpand/collapse chevron button
category-menu-submenuNested children container

These sit alongside the older desktop-sidebar-* styled hooks (see Appendix A), which carry the components' own scoped rules.

Mobile navigation ​

HookElementWhere
mobile-menuDrawer panel rootNavigation/MobileMenu.vue
mobile-menu-backdropDimmed backdrop behind the drawerMobileMenu.vue
mobile-menu-headerDrawer header bar (also the mega-overlay header)MobileMenu.vue
mobile-menu-closeClose (×) buttonMobileMenu.vue
mobile-menu-backBack arrow in the mega overlayMobileMenu.vue
mobile-menu-bodyScrolling content areaMobileMenu.vue
mobile-menu-accountAccount / login blockMobileMenu.vue
mobile-menu-switchersLanguage + currency cluster in the drawerMobileMenu.vue
mobile-menu-blocks-aboveCustom blocks rendered above the navMobileMenu.vue
mobile-menu-accordionAn expand/collapse rowMobileMenu.vue
mobile-menu-panelFull-screen mega-menu overlayMobileMenu.vue
mobile-menu-item-imageItem thumbnail in the overlayMobileMenu.vue
mobile-menu-link, mobile-menu-headline, mobile-menu-subcategory, mobile-menu-blockLink / heading / subcategory / custom block (pre-existing)MobileMenu.vue, MobileMenuBlockRenderer.vue
mobile-search-overlayFull-screen mobile search overlayNavigation/MobileSearchOverlay.vue
mobile-search-overlay-headerIts header barMobileSearchOverlay.vue
mobile-search-overlay-titleIts titleMobileSearchOverlay.vue
mobile-search-overlay-closeIts close buttonMobileSearchOverlay.vue
HookElementWhere
search-autocomplete-inputThe search <input>Search/Variants/{default,full_width,full_width_modal}/SearchAutocomplete.vue
search-autocomplete-dropdownResults container (styled hook, pre-existing)same three variants
search-autocomplete-modalModal shellSearch/Variants/full_width_modal/SearchAutocomplete.vue
header-search-wrapperColumn that holds the desktop search box in the header rowall 8 variants Header.vue
search-autocompleteSearch component root (sits inside header-search)Search/Variants/{default,full_width,full_width_modal}/SearchAutocomplete.vue
search-autocomplete-fieldWrapper directly around the <input> + iconsame three variants
search-autocomplete-iconMagnifier icon inside the fieldsame three variants
search-autocomplete-loadingLoading veil over the results paneldefault, full_width
search-sectionAny results group in the dropdowndefault, full_width
search-section-popular / -products / -categories / -pages / -blogs / -brandsThe individual result groupsdefault, full_width
search-section-titleGroup heading (Products (3), Popular Searches, …)default, full_width
search-popular-itemPopular-query pilldefault, full_width
search-suggestion-itemSuggested-term pill in the empty statedefault, full_width
search-empty"No results for …" blockdefault, full_width
search-result-itemEvery result row/card, whatever its typeall three variants + Search/Items/*.vue
search-result-product / -category / -brand / -blog / -pagePer-type resultproduct = carousel card wrapper; others = Search/Items/*.vue
search-result-slideCarousel slide holding a product result (width lives here)default, full_width
search-modal-overlayDark backdrop behind the search modalSearch/Variants/full_width_modal/SearchAutocomplete.vue
search-modal-closeModal close buttonSearch/Variants/full_width_modal/SearchAutocomplete.vue
mobile-search-overlay-bodyScrollable body of the mobile search overlayComponents/Shop/Navigation/MobileSearchOverlay.vue
logoLogo link (pre-existing)Components/Shop/Logo.vue
logo-imageLogo <img>Components/Shop/Logo.vue
logo-textSite-name fallback when there is no logo imageComponents/Shop/Logo.vue
breadcrumbBreadcrumb rootComponents/Shop/Breadcrumb.vue, Navigation/Variants/simple/Header.vue
breadcrumb-listThe <ol>both
breadcrumb-itemEach <li>both
breadcrumb-linkA clickable crumbboth
breadcrumb-currentThe current-page crumbboth
breadcrumb-separatorThe chevron between crumbsboth
site-footerFooter rootNavigation/Variants/default/Footer.vue, Navigation/Variants/builder/Footer.vue

Cart & checkout ​

HookElementWhere
cart-drawerCart drawer panelComponents/Shop/CartDrawer.vue
cart-itemCart line rowComponents/Shop/CartDrawer.vue, Components/Shop/CartItem.vue
checkout-formCheckout form rootComponents/Shop/CheckoutForm.vue
checkout-steps / checkout-step (+ checkout-step--current / --done / --locked / --cart) / checkout-step-nav / checkout-step-summary (+ checkout-summary-row / checkout-summary-logo / checkout-summary-badge)Step-by-step checkout (Canvas → Rozloženie pokladne → Po krokoch): progress bar, one step, Back / Continue row, step-3 recap (one row per section, carrier / payment logo box, delivery-type pill)Components/Shop/Checkout/CheckoutSteps.vue, CheckoutStepSummary.vue, CheckoutForm.vue
card-payment-formCard payment panel shown after "Pay" (the card fields themselves are an iframe — style the frame, title, button; [data-gateway] tells the gateway)Components/Shop/StripeCheckout.vue
merzio-pay-formMerzio pay's card fields inline under the selected payment method (the fields are an iframe — style the wrapper, hint and security note)Components/Shop/MerzioPayInlineForm.vue
merzio-pay-expressRetired (2026-09-30): Apple Pay / Google Pay are now separate payment options (checkout-method-card); no element carries this class any moreComponents/Shop/MerzioPayInlineForm.vue
checkout-method-badgesRow of card / wallet acceptance marks on a payment method optionComponents/Shop/CheckoutMethodOption/Variants/*/CheckoutMethodOption.vue
order-summaryOrder/cart summary panelComponents/Shop/OrderSummary.vue
checkout-method-cardA shipping/payment method option (Pills or Cards variant)CheckoutMethodOption/Variants/{default,cards}/CheckoutMethodOption.vue
checkout-method-radioThe option's radio controlsame
checkout-method-logoCarrier / payment logosame
checkout-method-titleMethod namesame
checkout-method-descriptionMethod descriptionsame (Cards)
checkout-method-meta / checkout-method-price / checkout-method-extrasDelivery time / price / extra infosame

Account area (renders in UserAccountLayout, also .shop-layout) ​

HookElementWhere
account-navAccount sidebar/menuLayouts/UserAccountLayout.vue
account-nav-linkAccount menu linkLayouts/UserAccountLayout.vue
account-cardContent card/panelPages/User/*.vue, Pages/Account/*.vue
order-detailOrder detail rootPages/Shop/Orders/Show.vue
order-lineOrder line-item rowPages/Shop/Orders/Show.vue
confirmation-header / confirmation-badge / confirmation-email-noteOrder-confirmation success header, its check badge and the "we e-mailed you" linePages/Shop/Checkout/Confirmation.vue
confirmation-summary / confirmation-items / confirmation-item / confirmation-item-thumb / confirmation-item-giftPurchased-items panel on the confirmation pagePages/Shop/Checkout/Confirmation.vue
confirmation-totals / confirmation-total / confirmation-total-discountTotals block on the confirmation pagePages/Shop/Checkout/Confirmation.vue
confirmation-details / confirmation-payment-status / confirmation-payment-instructionsOrder reference numbers, payment-status pill and bank-transfer instructionsPages/Shop/Checkout/Confirmation.vue
confirmation-deliveryDelivery address and shipping method on the confirmation pagePages/Shop/Checkout/Confirmation.vue
confirmation-actions / confirmation-lookup-note / confirmation-lookup-linkConfirmation-page buttons and the link to the order-lookup pagePages/Shop/Checkout/Confirmation.vue
order-status-stepper / order-status-stepOrder-status progress bar and its steps (is-done / is-current state classes)Pages/Shop/Orders/Show.vue
order-timeline / order-timeline-itemCustomer-facing order event timelinePages/Shop/Orders/Show.vue
order-tracking-linkCarrier tracking link on the order pagePages/Shop/Orders/Show.vue
order-lookup-form / order-lookup-another"Moja objednávka" lookup form; link back to it from the order pagePages/Shop/OrderLookup/Form.vue, Pages/Shop/Orders/Show.vue

Blog / FAQ / services ​

HookElementWhere
blog-cardBlog listing itemComponents/Shop/BlogCard.vue
blog-titleBlog card/post titleComponents/Shop/BlogCard.vue, Pages/Shop/Blog/Show.vue
blog-postBlog article bodyPages/Shop/Blog/Show.vue
faq-item / faq-question / faq-answerFAQ entry / question / answerComponents/Shop/FaqAccordion.vue
blog-hero-overlay / blog-hero-content / blog-hero-title / blog-hero-subtitleBlog listing banner: dark image overlay, inner content box, headline, subtitlePages/Shop/Blog/Index.vue
blog-category-bar / blog-category-pills / blog-category-pillBlog category filter strip, its pill row, one pillPages/Shop/Blog/Index.vue
blog-listing-body / blog-listing-layout / blog-gridBlog listing content column, sidebar+main row, post grid (featured + main)Pages/Shop/Blog/Index.vue
blog-sidebar / blog-sidebar-widgets / blog-sidebar-title / blog-sidebar-category / blog-sidebar-tag / blog-sidebar-sort-optionBlog sidebar column, widget stack, widget heading, category button, tag button, sort radio rowPages/Shop/Blog/Index.vue, Components/Shop/BlogSidebar.vue
blog-footerBlog listing footer description bandPages/Shop/Blog/Index.vue
blog-footer-textRendered rich-text body of the blog listing footer band (v-html, inside .prose)Pages/Shop/Blog/Index.vue
faq-footer-textRendered rich-text body of the FAQ listing footer band (v-html, inside .prose)Pages/Shop/Faq/Index.vue
blog-footer-toggle"Read more / read less" button under the blog footer textPages/Shop/Blog/Index.vue
faq-footer-toggle"Read more / read less" button under the FAQ footer textPages/Shop/Faq/Index.vue
blog-footer-inner, faq-footer-innerInner wrapper of the footer band. Carries no alignment: the rich-text editor decides per paragraph. Set text-align: center here to centre the whole band againPages/Shop/Blog/Index.vue, Pages/Shop/Faq/Index.vue
blog-card-vertical / blog-card-compact / blog-card-image / blog-card-image-link / blog-card-body / blog-card-excerpt / blog-card-metaBlog card layout wrapper, image box + its link, text body, excerpt, meta rowComponents/Shop/BlogCard.vue (all layouts)
blog-post-hero-overlay / blog-post-hero-contentBlog post hero overlay and inner content boxPages/Shop/Blog/Show.vue
blog-post-content / blog-post-body / blog-post-footer / blog-post-taxonomy / blog-post-authorBlog post content column, rendered body, footer block, categories+tags block, author boxPages/Shop/Blog/Show.vue
blog-share / blog-share-labelBlog post share row and its labelComponents/Shop/BlogShareButtons.vue
blog-recent-posts / blog-recent-posts-grid / blog-recent-posts-carouselRecent-posts strip under a post: section, desktop grid, mobile carouselComponents/Shop/BlogRecentPosts.vue
faq-hero-overlay / faq-searchFAQ banner overlay, search box wrapperPages/Shop/Faq/Index.vue
faq-category-bar / faq-category-pills / faq-category-pillFAQ category strip, pill row, one pillPages/Shop/Faq/Index.vue
faq-body / faq-layout / faq-main / faq-list / faq-empty / faq-footerFAQ content column, sidebar+main row, main column, question list, empty state, footer bandPages/Shop/Faq/Index.vue
faq-sidebar / faq-sidebar-widgets / faq-sidebar-categoryFAQ sidebar column, widget stack, category buttonPages/Shop/Faq/Index.vue
faq-toggle / faq-answer-panelFAQ question row (the clickable header) and the answer panel that holds its padding/borderComponents/Shop/FaqAccordion.vue, Components/Shop/Blueprints/FaqSection.vue
faq-section-listItem list inside the FAQ blueprintComponents/Shop/Blueprints/FaqSection.vue
faq-search-autocomplete / faq-search-input / faq-search-dropdown / faq-search-clearFAQ search root, input (desktop + mobile overlay), results dropdown, clear buttonComponents/Shop/FaqSearchAutocomplete.vue
service-cardService listing itemComponents/Shop/ServiceCard.vue
service-detailService detail rootPages/Shop/Services/{Show,ShowBooking}.vue

Filters, pagination, forms, dialogs ​

HookElementWhere
product-filterA filter controlComponents/Shop/ProductListingSidebar/Variants/{default,simple,top}.vue
filter-groupA filter section/groupsame as above
filter-barDesktop horizontal filter bar root (top variant)ProductListingSidebar/Variants/top
filter-bar-rowPill row inside the barProductListingSidebar/Variants/top
filter-pillOne filter pill wrapperProductListingSidebar/Variants/top
filter-pill-toggleThe pill <button> itselfProductListingSidebar/Variants/top
filter-pill-badgeActive-count badge inside a pillProductListingSidebar/Variants/top
filter-pill-panelDropdown panel under a pillProductListingSidebar/Variants/top
filter-sidebarDesktop filter sidebar root (left rail)ProductListingSidebar/Variants/{default,simple}
active-filtersActive-filter chip row/cardProductListingSidebar/Variants/top (desktop row + drawer row), Components/Shop/ProductListingFilters.vue
active-filters-label"Active filters" labelsame as above
active-filter-chipOne removable filter chipsame as above
active-filters-clearClear-all / reset controlProductListingSidebar/Variants/top, ProductListingFilters.vue
filter-toggleFILTER open/close button on the listing page (mobile + closable desktop)Pages/Shop/ProductListing/Variants/{default,simple,no_banner}/ProductListing.vue
filter-drawerMobile filter drawer root (teleported, carries .shop-layout itself)ProductListingSidebar/Variants/{default,simple,top}
filter-drawer-backdropMobile drawer backdrop (teleported, no .shop-layout)same as above
filter-drawer-headerDrawer header rowsame as above
filter-drawer-closeDrawer close buttonsame as above
filter-drawer-clearDrawer footer "clear filters" buttonsame as above
filter-drawer-applyDrawer footer "apply filters" buttonsame as above
filter-color-swatchesColor swatch grid in a filterProductListingSidebar/FilterColorSwatches.vue
filter-color-swatchOne color swatch buttonProductListingSidebar/FilterColorSwatches.vue
paginationPagination controlComponents/Shop/Pagination/Variants/{default,load_more}/Pagination.vue (dispatcher: Components/Shop/Pagination.vue)
load-more-btn"Show more" append button (load_more variant)Components/Shop/Pagination/Variants/load_more/Pagination.vue
form-fieldLabelled field wrapperComponents/InputFild.vue, Shop/Filters/CustomInput.vue, auth pages/dialogs
form-inputRaw <input> / <textarea>Components/InputFild.vue, Shop/Filters/CustomInput.vue
form-submitPrimary submit buttonauth pages, dialogs, profile sections, PrimaryBtn usages
shop-dialogStorefront modal panelLoginDialog.vue, RegisterDialog.vue, ForgotPasswordDialog.vue, ResetPasswordDialog.vue

Notes on the filter family:

  • Pill/chip colors are inline styles. filter-pill-toggle, filter-pill-badge, active-filter-chip, active-filters-label, active-filters-clear and the drawer footer buttons get their colors, radius and padding from inline styles driven by the admin filter-bar settings. Inline style beats any stylesheet, so CSS overriding those same properties needs !important:
    css
    .shop-layout .filter-pill-toggle { border-radius: 8px !important; }
    Properties the inline style doesn't set (e.g. text-transform, box-shadow) work without it.
  • Desktop pill dropdowns are NOT teleported — .shop-layout .filter-pill-panel works normally.
  • The mobile drawer IS teleported. filter-drawer sits on the same element as .shop-layout → use .shop-layout.filter-drawer or bare .filter-drawer. filter-drawer-backdrop does not carry .shop-layout → target it as a bare class.

Page roots & titles ​

Every storefront page carries page-<slug> on its outer wrapper and page-title on its main heading.

HookPage file
page-titlemain <h1>/<h2> on every page (28 files)
page-cartPages/Shop/Cart.vue
page-checkout / -payment / -confirmationPages/Shop/Checkout.vue, Checkout/Payment.vue, Checkout/Confirmation.vue
page-productPages/Shop/Show.vue
page-product-listingPages/Shop/ProductListing/Variants/*/ProductListing.vue
page-blog-listing / page-blog-postPages/Shop/Blog/{Index,Show}.vue
page-faqPages/Shop/Faq/Index.vue
page-services / page-service-detailPages/Shop/Services/{Index,Show,ShowBooking}.vue
page-order-detailPages/Shop/Orders/Show.vue
page-account-dashboard/-profile/-orders/-addresses/-loyalty/-favorites/-couponsPages/User/*.vue, Pages/Account/*.vue
page-auth-forgot-password/-reset-password/-verify-email/-confirm-password/-complete-profilePages/Auth/*.vue, Pages/Account/Auth/CompleteProfile.vue
page-withdrawalPages/Shop/Withdrawal/*.vue
page-order-lookupPages/Shop/OrderLookup/Form.vue
page-downloadPages/Shop/{DigitalDownload,GiftCardDownload}.vue
page-errorPages/Errors/{403,404}.vue
page-password-protectedPages/Pages/PasswordProtected.vue

5. Known gaps & notes ​

  • Pages/Pages/Simple.vue (custom builder canvas) has no page-root hook by design — it owns the full canvas and its content is per-blueprint (already hooked).

  • Teleported panels carry .shop-layout on themselves, so a .shop-layout .hook descendant selector won't self-match — target .shop-layout.hook or the bare class. This applies to nav-dropdown and to every panel hook that sits on the same element: mega-menu-panel, nav-category-menu-panel, categories-grid-menu-panel, parent-category-menu-panel. mobile-menu, mobile-menu-panel, mobile-menu-backdrop, mobile-search-overlay, filter-drawer and filter-drawer-backdrop are teleported too. The panels' inner roots (mega-menu, nav-category-menu, …) are ordinary descendants and match normally.

    css
    /* Style the mega menu only — not the other three dropdown types. */
    .mega-menu-panel { padding-top: 0; }          /* the teleported panel */
    .shop-layout .mega-menu { border-radius: 16px; }  /* its content root */
  • Four header variants inline their desktop menu instead of using DesktopMenuItems.vue: large, large_sticky, double_decker, double_decker_static. They now carry the same nav-item / nav-link / *-panel hooks as the shared component, so one rule works across all eight variants. If you add a menu type, hook it in all five places.

  • Announcement bar lives inline inside each header variant. It now has a header-announcement wrapper hook, but the bar's internals belong to AnnouncementBar.vue and are not individually hooked.

  • Admin (/admin) is intentionally not hooked — it's Merzio-branded and not merchant-themeable. These hooks are storefront-only.

  • Shared input wrappers (InputFild, Filters/CustomInput) also render in a few admin-adjacent profile sections; the .shop-layout prefix keeps brand/merchant CSS from leaking there.

6. Adding a new hook ​

  1. Pick a bare-kebab name; reuse an existing one if the concept matches.
  2. Prepend it to the element's existing class="…" (or add a static class="…" next to a :class binding — Vue merges them). Never mutate :class/:style.
  3. Add it once in the shared component if it only renders in one context; otherwise per-usage.
  4. Record it in this document (area table + location).
  5. npm run build, then verify the class appears in the DOM (document.querySelectorAll('.shop-layout .your-hook')).

Appendix A — Complete hook inventory ​

This is the full list of stable, semantic hook classes in the storefront, including the many that pre-date the systematic hook effort (they are the components' own <style scoped> class selectors, so they are stable and targetable). Sections 4–5 above are the curated primary set; this appendix is the exhaustive catalogue.

Two kinds of hook — important ​

  • Inert hooks (most of what §4 added: section-title, product-card, header-*, page-*, account-*, …) carry no CSS by default → both Brand CSS and Vlastný kód style them freely, no !important.
  • Styled hooks (most items below that live in a component's <style scoped>: product-detail-*, product-price-*, desktop-sidebar-*, checkout-section-*, card-*, …) already carry the component's own scoped rules (specificity ~0,2,0). To override them: Vlastný kód wins on equal specificity (it's unlayered + injected last); Brand CSS (@layer brand) may need a more specific selector (e.g. .shop-layout .product-detail .product-detail-info) or a CSS variable, because unlayered scoped rules outrank a cascade layer. This is the §2 boundary, per-hook.

Root / layout ​

shop-layout (Layouts/ShopLayout.vue), page-responsive-pad (Pages/Pages/Simple.vue), page-title, and the page-* body-identity family (one per page — see §4 "Page roots").

Header / navigation ​

Header shell (all 8 Navigation/Variants/*/Header.vue): site-header, header-announcement, header-nav, header-row / header-middle-row, header-top-bar, header-top-links, header-top-link, header-top-link-image, header-logo, header-nav-links, header-action-item, header-switchers, header-breadcrumb, header-actions, header-search, header-search-toggle, header-menu-toggle; plus nav-overflow, nav-overflow-toggle, nav-overflow-panel. (Not every hook exists in every variant — see the §4 table for which.)

Action widgets: header-cart (CartWidget.vue), header-wishlist (FavoritesWidget.vue), header-account (UserAccountWidget.vue), favorite-button-header-icon (Products/FavoriteButton.vue).

Menus: nav-item, nav-link, nav-link-icon, nav-link-label, nav-dropdown, nav-dropdown-toggle, nav-dropdown-list, nav-dropdown-link; panel hooks mega-menu-panel, nav-category-menu-panel, categories-grid-menu-panel, parent-category-menu-panel; content roots and their inner families mega-menu-*, nav-category-menu-*, categories-grid-menu-*, parent-category-menu-* (§4). nav-link-custom-text / -custom-surface / -custom-hover-text / menu-hover-fallback are behavioural, not hooks — do not target them.

Sidebar category menu: category-menu, -header, -toggle, -list, -item, -link, -item-toggle, -submenu, -panel (CategoryMenu/Variants/*, CategoryMenuItem.vue, ProductListingSidebar/Variants/top); the older styled desktop-sidebar-* family sits on the same elements.

Breadcrumb: breadcrumb, breadcrumb-scroll, breadcrumb-list, breadcrumb-item, breadcrumb-link, breadcrumb-current, breadcrumb-separator (Breadcrumb.vue, simple/Header.vue).

Logo: logo, logo-image, logo-text (Shop/Logo.vue); logo-block-container and logo-link belong to the footer/nav builder (Blocks/LogoBlock.vue), not the header.

Switchers: language-switcher (LanguageSwitcher.vue), language-switcher-block, currency-selector.

Header height is exposed as the CSS variable --shop-header-height (set by each variant's resize observer, consumed at Layouts/ShopLayout.vue) — there is no header-height class.

Mobile menu ​

mobile-menu, mobile-menu-backdrop, mobile-menu-header, mobile-menu-close, mobile-menu-back, mobile-menu-body, mobile-menu-account, mobile-menu-switchers, mobile-menu-blocks-above, mobile-menu-accordion, mobile-menu-panel, mobile-menu-item-image, mobile-menu-link, mobile-menu-headline, mobile-menu-subcategory (MobileMenu.vue); mobile-menu-block (MobileMenuBlockRenderer.vue); mobile-search-overlay, -header, -title, -close (MobileSearchOverlay.vue).

site-footer, footer-grid, footer-row, footer-above, footer-block-above, footer-bottom-bar; footer-builder, footer-column, footer-content-wrapper, footer-row-grid (Variants/builder/Footer.vue); logo-footer / logo-footer-image (LogoFooter.vue — footer logo link + image), merzio-footer-branding (MerzioFooterBranding.vue).

Product card & category ​

product-card, product-card-image, product-title, product-badge, product-availability-text (ProductCard variants + Products/ProductInfo.vue); category-card, category-card-image, category-card-title (CategoryCard.vue); category-menu-link-styled (CategoryMenuItem.vue).

Product price (family — ProductPrice.vue, ProductInfo.vue) ​

product-price, product-price-row, product-price-current, product-price-regular, product-price-unit, product-price-package, product-price-without-vat, product-price-lowest-30d.

Quatro instalment calculator (family — Shop/QuatroCalculatorButton.vue) ​

quatro-calculator, quatro-calculator-link, quatro-calculator-image, quatro-calculator-label, quatro-calculator-note.

Rendered on the product detail (via Products/ProductInfo.vue, so both product-detail theme variants get it) only when the merchant has the calculator enabled and the price sits inside Quatro's financed range. The component has no scoped styles, so both Brand CSS and merchant Vlastný kód win without !important.

css
/* Turn the default bordered block into a plain inline button. */
.shop-layout .quatro-calculator { border: 0; padding: 0; }
.shop-layout .quatro-calculator-note { display: none; }

/* Or make it a full-width call-out. */
.shop-layout .quatro-calculator {
  display: flex;
  width: 100%;
  background: #fff7ed;
  border-color: #fdba74;
  border-radius: 12px;
}
.shop-layout .quatro-calculator-image { transition: transform .2s ease; }
.shop-layout .quatro-calculator-link:hover .quatro-calculator-image { transform: scale(1.03); }

Do not restyle the button artwork itself (recolour, crop, distort) — Quatro requires their graphic used verbatim. Spacing, the surrounding block and the note are yours.

Quatro handoff panel (family — Pages/Shop/Checkout/Confirmation.vue) ​

quatro-handoff, quatro-handoff-title, quatro-handoff-description, quatro-continue-btn, quatro-handoff-countdown, quatro-handoff-cancel, quatro-handoff-note.

Shown on the order-confirmation page for Quatro orders only. Quatro's spec has no customer return URL, so this panel is the handoff point — the customer goes on to Quatro from here, or later from the link in their confirmation e-mail.

quatro-continue-btn carries btn-primary, the admin-controlled theme button (--color-primary / --color-add-to-cart-text) — the same system Add to cart uses — so it follows Vzhľad settings automatically. Note .btn-primary sets its colours with !important, so to recolour just this button, drive the variable instead of the property:

css
/* Recolour only the Quatro CTA, without touching other primary buttons. */
.shop-layout .quatro-continue-btn { --color-primary: #f97316; --color-primary-hover: #ea580c; }

/* Calmer panel, no countdown. */
.shop-layout .quatro-handoff { border-width: 1px; }
.shop-layout .quatro-handoff-countdown { display: none; }

Product detail (family — ProductDetail/Variants/{default,compact}/ProductDetail.vue) ​

product-detail, product-detail-page, product-detail-layout, product-detail-info, product-detail-info-column, product-detail-title, product-detail-description, product-detail-description-title, product-detail-description-content, product-detail-actions, product-detail-stock, product-detail-tags, product-detail-parameters, product-detail-quantity-discount, product-detail-file-upload, product-detail-recommenders, product-detail-thumbnails, product-detail-swatches (riadok „Ďalšie varianty“ pod názvom); gallery: product-detail-gallery, -gallery-column, -gallery-main, -gallery-sticky, product-gallery (Products/ProductGallery.vue), product-spin, product-spin-frame, product-spin-controls, product-spin-control, product-spin-badge, product-spin-thumb, product-spin-thumb-badge (360° viewer); blueprint slots: product-detail-blueprints-above-description, -below-description, -below-cart, product-detail-block (each block in a slot); share: share-container, share-icon-button, compact-share-button, compact-share-icon; quantity-input (Products/QuantitySelector.vue).

Product listing / filters / sidebar ​

product-listing, product-listing-banner-section, listing-block (a block in the top/bottom description), product-filter, filter-group, product-search-container, product-section, product-slider, product-grid-section, featured-products; filter bar/pills (ProductListingSidebar/Variants/top): filter-bar, filter-bar-row, filter-pill, filter-pill-toggle, filter-pill-badge, filter-pill-panel; desktop rail root (Variants/{default,simple}): filter-sidebar; active chips (Variants/top + ProductListingFilters.vue): active-filters, active-filters-label, active-filter-chip, active-filters-clear; listing-page FILTER button (Pages/Shop/ProductListing/Variants/{default,simple,no_banner}): filter-toggle; mobile drawer (all three sidebar variants, teleported): filter-drawer, filter-drawer-backdrop, filter-drawer-header, filter-drawer-close, filter-drawer-clear, filter-drawer-apply; color swatches (FilterColorSwatches.vue): filter-color-swatches, filter-color-swatch; range slider (Filters/CustomRangeSlider.vue): custom-range-slider, slider-styled, slider-connect, slider-handle, slider-origin, slider-label, slider-values, number-input, number-input-group, number-input-label, number-inputs; sidebar (ProductListingSidebar*): desktop-sidebar, -nav, -menu, -menu-box, -item, -link, -children, -headline, -text, -toggle, -block, -block-above, -block-below, -banner, -banner-image, -banner-overlay; sort-fade-overlay (ProductListingSorting.vue); pagination + load-more-btn (Pagination/Variants/{default,load_more}/Pagination.vue; dispatcher Pagination.vue).

Cart / checkout ​

cart-drawer, cart-item, cart-added; checkout-form, card-payment-form, merzio-pay-form, checkout-method-badges, form-field, form-input, form-radio, form-submit; checkout sections (CheckoutForm.vue): checkout-section-personal-info, -company-info, -billing-address, -delivery-address, -shipping-method, -payment-method, -order-note, -country / -card-payment (step layout only); order-summary, payment-status; checkout method options (CheckoutMethodOption): checkout-method-card (+ is-selected), checkout-method-radio, checkout-method-logo, checkout-method-title, checkout-method-description, checkout-method-meta, checkout-method-price, checkout-method-extras (PaymentStatus.vue), free-shipping-info (FreeShippingInfo.vue); add-to-cart-btn, product-card-cart-btn, primary-btn / btn-primary.

Account / auth ​

account-card, account-nav, account-nav-link (Account pages, Layouts/UserAccountLayout.vue); order-detail, order-line (Shop/Orders/Show.vue); shop-dialog (login/register/forgot/reset dialogs). Page identity classes: the page-account-* / page-auth-* family (§4).

Blog / FAQ / services / reviews ​

Blog: blog-card, blog-post, blog-title (BlogCard.vue), blog-hero-section, blog-show-hero-section, blog-sort-radio, blog-swiper, blog-hero-overlay, blog-hero-content, blog-hero-title, blog-hero-subtitle, blog-category-bar, blog-category-pills, blog-category-pill, blog-listing-body, blog-listing-layout, blog-grid, blog-sidebar, blog-sidebar-widgets, blog-sidebar-title, blog-sidebar-category, blog-sidebar-tag, blog-sidebar-sort-option, blog-footer, blog-card-vertical, blog-card-compact, blog-card-image, blog-card-image-link, blog-card-body, blog-card-excerpt, blog-card-meta, blog-post-hero-overlay, blog-post-hero-content, blog-post-content, blog-post-body, blog-post-footer, blog-post-taxonomy, blog-post-author, blog-share, blog-share-label, blog-recent-posts, blog-recent-posts-grid, blog-recent-posts-carousel, blog-grid-section. FAQ: faq-hero-section, faq-item, faq-question, faq-answer. Services: service-card, service-detail. Reviews (Sections/ReviewsCarousel.vue): review-list, review-item, reviews-swiper, reviews-swiper-prev-btn, reviews-swiper-next-btn.

Blueprints — root identity (Components/Shop/Blueprints/**) ​

hero-section-blueprint, banner-grid-blueprint, banner-section-blueprint, advanced-banner-blueprint, banner-with-product-blueprint, product-grid-blueprint, category-grid-blueprint, blog-grid-blueprint, newsletter-blueprint, faq-section-blueprint, testimonials-section-blueprint, features-section-blueprint, contact-form-blueprint, contact-info-bar-blueprint, card-blueprint, benefit-card-blueprint, contact-card-blueprint, accordion-blueprint, tabs-blueprint, divider-blueprint, image-block-blueprint, image-carousel-blueprint, layout-section-blueprint, map-embed-blueprint, downloadable-file-blueprint, headline-block-blueprint, button-block-blueprint, product-carousel-blueprint, product-recommender-block-blueprint, blueprint-renderer-blueprint, custom-blueprint, ups-statistics-blueprint, contact-form-{checkbox,select,textarea,text-input,file-upload}-blueprint. Shared per-section hooks: section-title, section-subtitle, section-text, section-button.

Blueprints — inner hooks ​

  • Hero: hero-carousel, hero-height-custom, hero-swiper-prev-btn, hero-swiper-next-btn, hero-content-padding-responsive.
  • Banner grid: banner-grid-swiper, banner-grid-slide, banner-grid-pagination, banner-grid-pagination-dot, banner-grid-custom-height.
  • Banners: banner-slider, banner-slide, banner-height, banner-product-swiper.
  • Grids: category-swiper, product-swiper, category-grid-section, product-grid-section.
  • Newsletter: newsletter-container, newsletter-form, newsletter-header, newsletter-description, newsletter-section.
  • Divider: divider-line. Image: image-block, image-block-img, image-placeholder, image-placeholder-builder.
  • Map embed: map-embed-container, map-embed-iframe, map-embed-placeholder, map-embed-title, map-embed-builder-badge.
  • Card / benefit-card / contact-card families: card-content-container, card-nested-content, card-headline, card-headline-wrapper, card-subtitle, card-subtitle-wrapper, card-text, card-text-wrapper, card-button; benefit-card-icon, -icon-wrapper, -image, -content-container, -nested-content; contact-card-icon, -icon-wrapper, -image, -content-container, -nested-content.
  • Contact-form inputs: contact-form-input, contact-form-select, contact-form-textarea, contact-form-checkbox, contact-form-field.
  • Product recommender: product-recommender-block, product-recommender-carousel, product-recommender-grid, arrow-button, arrow-icon, pagination-container; miniatúry (ďalšie varianty): product-swatches, product-swatches-title, product-swatches-list, product-swatch, product-swatch-current, product-swatch-image, product-swatch-label.
  • Instagram: instagram-feed-section, instagram-feed-block. ups-statistics-container.

blueprint-block, contact-info-block, courier-logos-block, courier-logos-container, courier-logo-item, payment-logos-block, payment-logos-container, payment-logo-item, social-links-block, text-block, text-block-container, spacer-block, divider-block, menu-column-block, image-block, logo-block-container, language-switcher-block.

Misc storefront widgets ​

Flash (StorefrontFlash.vue, BEM): storefront-flash-overlay, storefront-flash-card (+ __icon __text __body __actions __btn __close). AI chat (StorefrontAssistant/ChatWidget.vue, BEM): storefront-ai-chat (+ __header __bubble__user-bubble __chip __input __send __disclaimer). product-assistant-wizard, popup-container, popup-content (PopupDisplay.vue), back-to-top (BackToTopButton.vue), bento-mobile-carousel.

Deliberately excluded (not storefront hooks) ​

Tailwind utilities; Swiper library internals (swiper-slide, swiper-button-*, swiper-pagination*, swiper-wrapper); Tailwind-plugin classes (prose*, scrollbar-thin, tabular-nums); sr-only / safe-area-* / no-underline utility-ish; state flags (show-popup, success-state, menu-dropdown-open, …); and the admin/Merzio scope (admin-layout, admin-shell-bg, merzio-portal) which is intentionally not merchant-themeable.