LuxeDocsv0.3.0
GET STARTED

How the storefront works

One small runtime, components that load when they appear, and a plain form when JavaScript is off.

The app embed

The Luxe app embed renders <luxe-root> with a <script type="application/json" data-luxe-settings> block, plus the cart drawer and tray hosts when they apply (the builder, the tray and the rewards bar carry their own data-luxe-config blocks). Configuration comes from metafields in Liquid: nothing is fetched over the network to start.

luxe-root.js is the only module every page loads: a registry that lazy-loads a component when its element appears, plus the cart client, event bus, consent-aware analytics and money formatting. TypeScript Web Components, bundled with esbuild, no framework.

Lazy modules

ElementLoads
luxe-kit-builderluxe-kit.js, then picker, rows, quantity list, extras, upgrade, editor and Complete my set chunks as needed
luxe-kit-tray, luxe-add-to-kitluxe-tray.js, then luxe-tray-extras.js and luxe-tray-ms.js (the tier progress bar) as needed
luxe-rewards-barluxe-bar.js
luxe-cart-drawerluxe-drawer.js on first cart interaction or idle, only with the Luxe cart drawer, then drawer modules (discount, offer, upsells, Rebuy, protection, content, unlock, empty bag)
luxe-upsellluxe-upsell-product.js
[data-luxe-edit-line] on the theme cartluxe-cart-edit.js, for Edit set

Custom elements

ElementDOM
luxe-rootLight DOM, the runtime
luxe-kit-builderLight DOM, the Bundle set builder
luxe-item-pickerShadow DOM sheet or drawer
luxe-kit-trayShadow DOM
luxe-add-to-kitLight DOM
luxe-set-milestonesShadow DOM: an unregistered host the tray fills (Tier progress bar block)
luxe-cart-drawerShadow DOM, light-DOM hosts for your widgets
luxe-rewards-barLight DOM
luxe-upsellLight DOM

Every element carries data-luxe-version once its script has run.

How it degrades

SituationWhat happens
Embed offNo Luxe script runs; blocks render their no-JS markup; sets sell with their default picks
JavaScript blockedA plain form posts the set with its house selection to /cart/add
UninstalledBlocks and embed disappear; products stay purchasable
Unknown theme cartThe Luxe drawer does not take over
B2B buyerNo script loads, unless B2B buyers is set to SAME; window.Luxe.b2b is true
Metafield missing or invalidThe component renders nothing

Performance budgets

MetricBudget (gzipped)
Core JS (luxe-root and shared runtime)≤ 15 KB
Bundle set builder and picker≤ 14 KB
Cart drawer≤ 14 KB
Tray and Add to set≤ 8 KB
Rewards bar≤ 4 KB
Layout shiftCLS 0
App proxy calls on the add-to-cart path0
Was this page helpful?Last updated 4 October 2026