diff --git a/assets/js/spark-platform.js b/assets/js/spark-platform.js index 9a8a0b6..3c8fcca 100644 --- a/assets/js/spark-platform.js +++ b/assets/js/spark-platform.js @@ -19,7 +19,9 @@ * What is intentionally dropped: * - jquery.validate.min.js - Use HTML5 validation instead * - core.variant.init() - Was empty function, Spark has its own variant picker - * - core.preview_theme / core.theme_settings_preview - Admin-only features + * - core.theme_settings_preview - Theme-editor iframe behavior remains platform-owned + * + * Preview-session visibility is provided separately by spark-preview.js. */ (function() { diff --git a/assets/js/spark-preview.js b/assets/js/spark-preview.js new file mode 100644 index 0000000..b94666b --- /dev/null +++ b/assets/js/spark-preview.js @@ -0,0 +1,80 @@ +/** Accessible preview-session indicator. Ordinary storefront visits are untouched. */ +(function(root) { + 'use strict'; + + function readPreviewTheme(cookie) { + var match = String(cookie || '').match(/(?:^|;\s*)preview_theme=([^;]+)/); + if (!match) return null; + try { + var value = decodeURIComponent(match[1]); + return /^[A-Za-z0-9_-]+$/.test(value) ? value : null; + } catch (error) { + return null; + } + } + + function buildExitPreviewUrl(location) { + var pathname = String(location && location.pathname || '/'); + var search = String(location && location.search || '').replace(/^\?/, ''); + var hash = String(location && location.hash || ''); + var params = new root.URLSearchParams(search); + + params.delete('preview_theme'); + params.set('deactivate-theme', 'true'); + + var query = params.toString(); + return pathname + (query ? '?' + query : '') + hash; + } + + function createPreviewIndicator(doc, themeId, location) { + var existing = doc.getElementById('spark-preview-indicator'); + if (existing) return existing; + + var indicator = doc.createElement('aside'); + indicator.id = 'spark-preview-indicator'; + indicator.className = 'spark-preview-indicator'; + indicator.setAttribute('role', 'status'); + indicator.setAttribute('aria-live', 'polite'); + indicator.setAttribute('aria-label', 'Theme preview session'); + + var message = doc.createElement('span'); + message.className = 'spark-preview-indicator__message'; + message.textContent = 'Previewing theme ' + themeId; + + var exitLink = doc.createElement('a'); + exitLink.className = 'spark-preview-indicator__exit'; + exitLink.href = buildExitPreviewUrl(location); + exitLink.textContent = 'Exit preview'; + + indicator.appendChild(message); + indicator.appendChild(exitLink); + doc.body.appendChild(indicator); + return indicator; + } + + function initPreviewIndicator(doc, location) { + if (!doc || !doc.body) return null; + var themeId = readPreviewTheme(doc.cookie); + return themeId ? createPreviewIndicator(doc, themeId, location) : null; + } + + var api = { + readPreviewTheme: readPreviewTheme, + buildExitPreviewUrl: buildExitPreviewUrl, + createPreviewIndicator: createPreviewIndicator, + initPreviewIndicator: initPreviewIndicator + }; + + if (typeof module !== 'undefined' && module.exports) module.exports = api; + root.SparkPreview = api; + + if (typeof document !== 'undefined') { + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + initPreviewIndicator(document, root.location); + }, { once: true }); + } else { + initPreviewIndicator(document, root.location); + } + } +})(typeof window !== 'undefined' ? window : globalThis); diff --git a/assets/main.css b/assets/main.css index 00e43f7..8789487 100644 --- a/assets/main.css +++ b/assets/main.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-top:initial;right:initial;bottom:initial;left:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:#fef2f2;--color-red-200:#ffc9c9;--color-red-400:#ff6467;--color-red-500:#fb2c36;--color-red-600:#e7000b;--color-red-800:#9f0712;--color-amber-50:#fffbeb;--color-amber-200:#fee685;--color-amber-400:#ffb900;--color-amber-800:#973c00;--color-green-50:#f0fdf4;--color-green-200:#b9f8cf;--color-green-600:#00a63e;--color-green-800:#016630;--color-blue-50:#eff6ff;--color-blue-200:#bedbff;--color-blue-800:#193cb8;--color-slate-50:#f8fafc;--color-slate-100:#f1f5f9;--color-slate-200:#e2e8f0;--color-slate-300:#cbd5e1;--color-slate-400:#94a3b8;--color-slate-500:#64748b;--color-slate-600:#475569;--color-slate-700:#334155;--color-slate-800:#1e293b;--color-slate-900:#0f172a;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:.375rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}select[multiple],[size] optgroup{font-weight:bolder}select[multiple],[size] optgroup option{padding-left:20px}::file-selector-button{margin-right:4px}::placeholder{opacity:1}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input[type=button],[type=reset],[type=submit]{appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:not([hidden=until-found]){display:none!important}:root{--primary-color:#1e293b;--accent-color:#475569}body{font-family:var(--font-sans);color:#1e293b;background-color:#fff;line-height:1.6}h1,h2,h3,h4,h5,h6{color:#1e293b;font-weight:600;line-height:1.2}a{color:var(--primary-color);text-decoration:none}a:hover{opacity:.8}img{max-width:100%;height:auto}.btn{cursor:pointer;border-radius:.25rem;justify-content:center;align-items:center;padding:.625rem 1.5rem;font-size:.875rem;font-weight:500;line-height:1.25rem;transition:opacity .15s ease-out;display:inline-flex}.btn:hover{opacity:.9}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background-color:var(--primary-color)!important;color:#fff!important;border-color:var(--primary-color)!important}.btn-accent{background-color:var(--accent-color)!important;color:#fff!important;border-color:var(--accent-color)!important}.btn-outline{color:var(--btn-color,var(--primary-color))!important;border:1px solid var(--btn-color,var(--primary-color))!important;background-color:#0000!important}.btn-secondary{color:var(--primary-color);background-color:#0000;border:1px solid #e2e8f0}.btn-secondary:hover{background-color:#f8fafc}.container{width:100%;max-width:1280px;margin-left:auto;margin-right:auto;padding-left:1rem;padding-right:1rem}@media (min-width:768px){.container{padding-left:1.5rem;padding-right:1.5rem}}.product-card{flex-direction:column;display:flex}.product-card-bordered{border:1px solid #e2e8f0}.product-card-bordered .product-title{padding-left:1rem;padding-right:1rem}.product-card-bordered .product-price{padding-bottom:1rem;padding-left:1rem;padding-right:1rem}.product-card img{aspect-ratio:1;object-fit:cover;background-color:#f8fafc}.product-card .product-title{margin-top:.75rem;font-size:.875rem;font-weight:500}.product-card .product-price{color:#475569;margin-top:.25rem;font-size:.875rem}[data-spark-membership-price][data-membership-active=true] [data-spark-public-price]{color:#94a3b8;font-weight:400;text-decoration-line:line-through}.spark-member-price{color:#1e293b;flex-wrap:wrap;align-items:baseline;gap:.375rem;margin-top:.25rem;display:flex}.spark-member-price-label{color:var(--primary-color);text-transform:uppercase;font-size:.75rem;font-weight:600}.spark-member-price-value{font-weight:700}.spark-member-price-detail{color:#64748b;font-size:.75rem;font-weight:400}.product-card .spark-member-price,[data-spark-membership-layout=sticky] .spark-member-price{gap:.25rem;margin-top:.125rem}.product-card .spark-member-price-label,[data-spark-membership-layout=sticky] .spark-member-price-label{font-size:.6875rem}[data-spark-membership-layout=sticky][data-membership-active=true]{line-height:1.25;display:block}.product-grid{grid-template-columns:repeat(1,1fr);gap:1.5rem;display:grid}@media (min-width:768px){.product-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width:1024px){.product-grid{grid-template-columns:repeat(var(--product-grid-columns,3), 1fr)}}.category-grid{grid-template-columns:repeat(1,1fr);gap:1rem;display:grid}@media (min-width:768px){.category-grid{grid-template-columns:repeat(var(--category-grid-columns,2), 1fr)}}.skeleton-card{flex-direction:column;display:flex}.skeleton-card .skeleton-image{aspect-ratio:1;background-color:#f1f5f9;position:relative;overflow:hidden}.skeleton-card .skeleton-image:after{content:"";background:linear-gradient(90deg,#f1f5f9,#e2e8f0,#f1f5f9);animation:1.5s ease-in-out infinite shimmer;position:absolute;top:0;right:0;bottom:0;left:0}.skeleton-card .skeleton-text{background-color:#f1f5f9;height:12px;margin-top:.75rem;position:relative;overflow:hidden}.skeleton-card .skeleton-text:after{content:"";background:linear-gradient(90deg,#f1f5f9,#e2e8f0,#f1f5f9);animation:1.5s ease-in-out infinite shimmer;position:absolute;top:0;right:0;bottom:0;left:0}.skeleton-card .skeleton-text-short{background-color:#f1f5f9;width:40%;height:12px;margin-top:.25rem;position:relative;overflow:hidden}.skeleton-card .skeleton-text-short:after{content:"";background:linear-gradient(90deg,#f1f5f9,#e2e8f0,#f1f5f9);animation:1.5s ease-in-out infinite shimmer;position:absolute;top:0;right:0;bottom:0;left:0}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.cart-badge{background-color:var(--primary-color);color:#fff;text-align:center;pointer-events:none;border-radius:50%;width:16px;height:16px;font-size:10px;font-weight:600;line-height:16px;position:absolute;top:-4px;right:-4px}[data-light-primary] .cart-badge{color:#1e293b}.cart-badge[data-animate]{animation:.3s ease-out badge-pulse}@keyframes badge-pulse{0%{transform:scale(1)}50%{transform:scale(1.3)}to{transform:scale(1)}}.spark-gallery{flex-direction:column;gap:.75rem;display:flex}@media (min-width:768px){.spark-gallery-left{flex-direction:row-reverse;gap:.75rem}.spark-gallery-left .spark-gallery-main{flex:1;min-width:0}.spark-gallery-left .spark-gallery-thumbs{flex-direction:column;justify-content:flex-start;width:72px;max-height:520px;overflow:hidden auto}.spark-gallery-left .spark-gallery-thumb{flex-shrink:0;width:72px;height:72px}}.spark-gallery-main{aspect-ratio:1;background-color:#f8fafc;max-height:560px;position:relative;overflow:hidden}.spark-gallery-hero{object-fit:contain;width:100%;height:100%;transition:opacity .2s ease-out}.spark-gallery-hero.spark-gallery-fading{opacity:0}.spark-gallery-thumbs{scrollbar-width:thin;scrollbar-color:#cbd5e1 transparent;justify-content:center;gap:.5rem;padding:.25rem 0;display:flex;overflow:auto hidden}.spark-gallery-thumb{cursor:pointer;opacity:.6;background:#f8fafc;border:2px solid #0000;flex-shrink:0;width:72px;height:72px;padding:0;transition:border-color .2s ease-out,opacity .2s ease-out;overflow:hidden}.spark-gallery-thumb:hover{opacity:1;border-color:#cbd5e1}.spark-gallery-thumb-active{opacity:1!important;border-color:var(--primary-color)!important}.spark-gallery-prev,.spark-gallery-next{cursor:pointer;color:#475569;opacity:0;z-index:2;background:#ffffffe6;border:none;border-radius:50%;justify-content:center;align-items:center;width:36px;height:36px;transition:opacity .2s ease-out,background-color .15s ease-out;display:flex;position:absolute;top:50%;transform:translateY(-50%);box-shadow:0 1px 3px #0000001a}.spark-gallery-prev{left:.75rem}.spark-gallery-next{right:.75rem}.spark-gallery-prev:hover,.spark-gallery-next:hover{color:#1e293b;background:#fff}.spark-gallery:hover .spark-gallery-prev,.spark-gallery:hover .spark-gallery-next,.spark-gallery:focus-within .spark-gallery-prev,.spark-gallery:focus-within .spark-gallery-next{opacity:1}@media (hover:none){.spark-gallery-prev,.spark-gallery-next{opacity:.7}}.sticky-atc{z-index:50;background:#fff;border-top:1px solid #e2e8f0;transition:transform .25s ease-out;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%);box-shadow:0 -2px 8px #0000000f}.sticky-atc-visible{transform:translateY(0)}.sticky-atc-inner{justify-content:space-between;align-items:center;gap:1rem;max-width:1280px;margin:0 auto;padding:.75rem 1rem;display:flex}.sticky-atc-info{flex-direction:column;min-width:0;display:flex}.sticky-atc-title{color:#1e293b;white-space:nowrap;text-overflow:ellipsis;font-size:.875rem;font-weight:500;overflow:hidden}.sticky-atc-price{color:#475569;font-size:.875rem}.sticky-atc-btn{white-space:nowrap;flex-shrink:0;padding:.625rem 1.5rem}@media (min-width:1024px){.sticky-atc{display:none}}.search-overlay{z-index:60;opacity:0;visibility:hidden;justify-content:center;align-items:flex-start;transition:opacity .2s ease-out,visibility .2s ease-out;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.search-overlay-visible{opacity:1;visibility:visible}.search-overlay-backdrop{background:#0006;position:absolute;top:0;right:0;bottom:0;left:0}.search-overlay-content{z-index:1;width:100%;max-width:640px;margin-top:5rem;padding:0 1rem;transition:transform .2s ease-out;position:relative;transform:translateY(-12px)}.search-overlay-visible .search-overlay-content{transform:translateY(0)}.search-overlay-form{background:#fff;border:1px solid #e2e8f0;align-items:center;display:flex;box-shadow:0 8px 30px #0000001f}.search-overlay-input{color:#1e293b;background:0 0;border:none;outline:none;flex:1;padding:1rem 1.25rem;font-size:1rem}.search-overlay-input::placeholder{color:#94a3b8}.search-overlay-submit{color:#475569;cursor:pointer;background:0 0;border:none;padding:.75rem}.search-overlay-submit:hover{color:#1e293b}.search-overlay-close{color:#94a3b8;cursor:pointer;background:0 0;border:none;padding:.75rem}.search-overlay-close:hover{color:#475569}.sr-only,.skip-to-content{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-to-content:focus{z-index:100;clip:auto;width:auto;height:auto;font-family:var(--font-sans);background-color:#1e293b;border:1px solid #1e293b;border-radius:2px;margin:0;padding:.625rem 1rem;font-size:.875rem;font-weight:500;line-height:1.25rem;top:1rem;left:1rem;overflow:visible;color:#fff!important}:focus-visible{outline:2px solid var(--primary-color);outline-offset:2px}@media print{header,footer,#announcement-bar,.sidecart,.breadcrumb,nav[aria-label=breadcrumb]{display:none!important}.container{max-width:100%;padding:0}body{color:#000;background:#fff;font-size:12pt}a{color:#000;text-decoration:underline}img{max-width:100%}.product-grid{grid-template-columns:repeat(2,1fr)}}.sidecart-open{overflow:hidden}.sidecart-open .sidecart{overflow-x:hidden}.sidecart{outline:0;font-family:inherit;position:absolute;top:0;overflow:hidden}.sidecart .sidecart-dialog{width:100vw;transition:all .6s cubic-bezier(.75,0,.55,1);right:-100vw}.sidecart.show .sidecart-dialog{transition:all .6s cubic-bezier(.33,0,0,1);right:0}.sidecart .cart-btn{color:#1e293b;cursor:pointer;text-align:center;white-space:nowrap;-webkit-user-select:none;user-select:none;background-color:#e2e8f0;border:1px solid #0000;justify-content:center;padding:.8rem 1rem;transition:background-color .15s ease-out}.sidecart .cart-btn:hover{background-color:#cbd5e1;border:1px solid #0000}.sidecart .cart-btn:focus:not(:active){box-shadow:0 0 0 2px var(--primary-color)}.sidecart .text-right{text-align:right}.sidecart .text-center{text-align:center}.sidecart .error-text{color:#ef4444;font-size:small}.sidecart a{color:#1e293b}.sidecart a:hover{color:#475569}.sidecart button{-webkit-appearance:none;cursor:pointer;background-color:#0000;border:0;padding:0;font-family:inherit}.sidecart button.close{color:#475569;float:right;font-weight:400;line-height:.5;transition:color .15s ease-out}.sidecart button.close:hover{color:#1e293b}.sidecart-dialog{pointer-events:none;z-index:99999;height:100%;margin:auto;position:fixed}.sidecart-content{pointer-events:auto;background-color:#fff;background-clip:padding-box;border:none;border-radius:0;outline:0;flex-direction:column;height:100%;display:flex;position:relative;overflow-y:auto;box-shadow:0 0 1px 1px #8890c333}.sidecart-header{background-color:#fff;border-bottom:none;justify-content:center;align-items:center;height:60px;padding:1rem;display:flex;position:relative}.sidecart-header button.close{color:#475569;font-size:2rem;position:absolute;right:1rem}.sidecart-header button.close:hover{color:#1e293b}.sidecart-title{text-align:center;margin-bottom:0;font-weight:700}#basket-content-div{overflow-y:auto}.sidecart-body{position:inherit;flex:auto;padding:.5rem .5rem 6rem;overflow-y:auto}.sidecart-footer{background-color:#fff;border-top:1px solid #e2e8f0;width:auto;padding:1rem;display:flex;bottom:0}.sidecart-footer .cart-btn{text-align:center;cursor:pointer;border:1px solid #0000;border-radius:.3rem;width:100%;height:auto;padding:1.25rem;font-size:24px;font-weight:700;text-decoration:none;display:inline-block;background-color:var(--primary-color)!important;color:#fff!important}.sidecart-footer .cart-btn:hover{border:1px solid #0000;background-color:var(--primary-color-darker)!important;color:#fff!important}.sidecart .form-control{color:#1e293b;appearance:none;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23475569' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:14px 10px;border:1px solid #e2e8f0;border-radius:.25rem;width:100%;padding:.25rem 2rem .25rem .5rem;font-size:.875rem;line-height:1.5;display:block}.cart-items{margin:0 0 20px}.cart-item{box-shadow:none;border-bottom:1px solid #e2e8f0;flex-flow:row;justify-content:flex-start;margin:0 0 .75rem;padding:.75rem;display:flex}.cart-item:first-child{border-top:1px solid #e2e8f0}.cart-item img{width:100%}.cart-item .item-img{width:110px;margin-right:5%;padding:5px}.cart-item .item-details{width:100%;padding-top:.5rem}.cart-item .item-title{margin-bottom:.5rem;font-family:inherit;font-size:1rem;font-weight:500;line-height:1.2;display:block}.cart-item .item-description{flex-flow:wrap;align-items:center;width:100%;margin:0 0 .5em;display:flex}.cart-item .item-description .basket-action{flex-direction:column;flex:40%;height:fit-content;margin-right:20px;display:flex}.cart-item .item-description .basket-action:last-child{margin-right:0}.cart-item .item-description label{margin-bottom:0;display:inline-block}.cart-item .item-description button.close{font-size:smaller}.cart-item .item-price{width:100%}.cart-item .close{font-size:1.5rem}table.sidecart-table{background-color:#0000;width:100%}table.sidecart-table td{vertical-align:top;border-top:1px solid #e2e8f0;padding:.75rem}table.sidecart-table tr:first-child td{border-top:none}table.sidecart-table.table-sm td{padding:.15rem;font-size:small}.cart-totals{font-size:initial}.cart-coupon-wrapper{padding:.75rem}.cart-coupon-wrapper h5{font-family:inherit;font-size:1em}.cart-coupon-wrapper table{width:100%}.cart-coupon-wrapper td:first-child{width:75%}.cart-coupon-wrapper .form-input-group .btn{padding:.75em;font-size:1.125em}.cart-coupon{margin:5% 0}.coupon-remove{font-size:1.5em}.coupon-form{margin:20px 0}.coupon-form .form-input-group{flex-wrap:wrap;width:auto;display:flex}.coupon-form .form-input-group input{background-color:#fff;border:1px solid #e2e8f0;flex:75%;padding:.8rem 1rem}.coupon-form .form-input-group .cart-btn{text-align:center;white-space:nowrap;flex:1;margin-top:10px}.coupon-code{font-size:initial;text-align:center;white-space:nowrap;vertical-align:baseline;color:#fff;background-color:#22c55e;padding:.1em .5em;font-weight:700;line-height:1}.loader{margin:25% 0}.loader .loading{text-align:center;margin:30px;padding:25px}.loader .loading:before{content:"";border-style:solid;border-width:4px;border-color:var(--primary-color) #eee #eee;border-radius:100%;width:50px;height:50px;margin:-25px auto auto -25px;animation:.7s linear infinite rotation;position:absolute;left:50%}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(359deg)}}.cart-empty{margin:25% 0}@media (min-width:768px) and (max-width:991.98px){.sidecart .sidecart-dialog{width:60vw}.sidecart-body{padding:1rem 1rem 6rem}.coupon-form .form-input-group input{flex:50%}.coupon-form .form-input-group .cart-btn{margin-top:0}}@media (min-width:992px){.sidecart .sidecart-dialog{width:50vw}.sidecart-body{padding:1rem 2rem 6rem}.coupon-form .form-input-group input{flex:50%}.coupon-form .form-input-group .cart-btn{margin-top:0}}@media (min-width:1200px){.sidecart .sidecart-dialog{width:45vw}}@media (min-width:1400px){.sidecart .sidecart-dialog{width:40vw}}@media (min-width:1600px){.sidecart .sidecart-dialog{width:35vw}}@media (max-width:576px){.cart-coupon-wrapper .form-input-group .btn{padding:.9em}}.cart-popover-wrapper{display:inline-block;position:relative}.cart-popover-wrapper .popover-content{opacity:0;visibility:hidden;background-color:#fff;width:auto;padding:.5rem;position:absolute;top:50px;left:-130px;transform:translateY(10px);box-shadow:0 2px 5px #00000042}.cart-popover-wrapper .popover-content p{margin-bottom:.5rem}.cart-popover-wrapper .popover-content table.popover-table{margin-top:.75em;margin-bottom:.75em;font-size:.875rem}.cart-popover-wrapper .popover-content table.popover-table tr:first-child td{border-top:none}.cart-popover-wrapper .popover-content table.popover-table tr:first-child td,.cart-popover-wrapper .popover-content table.popover-table tr:last-child td,.cart-popover-wrapper .popover-content table.popover-table tr:nth-last-child(2){font-weight:600}.cart-popover-wrapper .popover-content table.popover-table td{border-top:1px solid #dee2e6;padding:.375rem}.cart-popover-wrapper:hover .popover-content{z-index:10;opacity:1;visibility:visible;width:max-content;transition:all .5s cubic-bezier(.75,-.02,.2,.97);transform:translateY(-20px)}.cart-popover-wrapper .help-icon{cursor:pointer;vertical-align:middle;background-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='18px' height='18px' fill='%23606975' viewBox='0 0 24 24' style='enable-background:new 0 0 24 24;' xml:space='preserve'%3E%3Cg id='' style='opacity:0.75;'%3E%3Cg id='help'%3E%3Cpath id='circle' style='fill-rule:evenodd;clip-rule:evenodd;' d='M12.001,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,5.476,4.438,9.914,9.916,9.914c5.476,0,9.914-4.438,9.914-9.914C21.915,6.523,17.477,2.085,12.001,2.085z M12.002,20.085 c-4.465,0-8.084-3.619-8.084-8.083c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084 C20.085,16.466,16.466,20.085,12.002,20.085z' /%3E%3Cg id='question_mark'%3E%3Cpath id='top' style='fill-rule:evenodd;clip-rule:evenodd;' d='M11.766,6.688c-2.5,0-3.219,2.188-3.219,2.188l1.411,0.854 c0,0,0.298-0.791,0.901-1.229c0.516-0.375,1.625-0.625,2.219,0.125c0.701,0.885-0.17,1.587-1.078,2.719 C11.047,12.531,11,15,11,15h1.969c0,0,0.135-2.318,1.041-3.381c0.603-0.707,1.443-1.338,1.443-2.494S14.266,6.688,11.766,6.688z' /%3E%3Crect id='bottom' x='11' y='16' style='fill-rule:evenodd;clip-rule:evenodd;' width='2' height='2' /%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;width:20px;height:20px;display:inline-block}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:calc(var(--spacing) * 0);right:calc(var(--spacing) * 0);bottom:calc(var(--spacing) * 0);left:calc(var(--spacing) * 0)}.start{left:var(--spacing)}.end{right:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-24{top:calc(var(--spacing) * 24)}.top-full{top:100%}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-40{z-index:40}.z-50{z-index:50}.z-60{z-index:60}.z-70{z-index:70}.order-1{order:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-4{margin-left:calc(var(--spacing) * 4);margin-right:calc(var(--spacing) * 4)}.mx-auto{margin-left:auto;margin-right:auto}.my-8{margin-top:calc(var(--spacing) * 8);margin-bottom:calc(var(--spacing) * 8)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.-ml-2{margin-left:calc(var(--spacing) * -2)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-28{height:calc(var(--spacing) * 28)}.h-48{height:calc(var(--spacing) * 48)}.h-\[50vh\]{height:50vh}.h-\[65vh\]{height:65vh}.h-full{height:100%}.h-screen{height:100vh}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-\[44px\]{min-height:44px}.min-h-\[70vh\]{min-height:70vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/3{width:33.3333%}.w-2\/3{width:66.6667%}.w-3\/4{width:75%}.w-4\/6{width:66.6667%}.w-5\/6{width:83.3333%}.w-10{width:calc(var(--spacing) * 10)}.w-20{width:calc(var(--spacing) * 20)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.space-y-1>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.space-y-2>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.space-y-3>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.space-y-4>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.space-y-6>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.divide-y>:not(:last-child){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.divide-slate-100>:not(:last-child){border-color:var(--color-slate-100)}.divide-slate-200>:not(:last-child){border-color:var(--color-slate-200)}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-800{border-color:var(--color-slate-800)}.bg-\[var\(--primary-color\)\]{background-color:var(--primary-color)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-black\/30{background-color:#0000004d}.bg-black\/30{background-color:rgba(0,0,0,0.3)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-green-50{background-color:var(--color-green-50)}.bg-red-50{background-color:var(--color-red-50)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-left:calc(var(--spacing) * 2);padding-right:calc(var(--spacing) * 2)}.px-3{padding-left:calc(var(--spacing) * 3);padding-right:calc(var(--spacing) * 3)}.px-4{padding-left:calc(var(--spacing) * 4);padding-right:calc(var(--spacing) * 4)}.px-5{padding-left:calc(var(--spacing) * 5);padding-right:calc(var(--spacing) * 5)}.px-6{padding-left:calc(var(--spacing) * 6);padding-right:calc(var(--spacing) * 6)}.px-8{padding-left:calc(var(--spacing) * 8);padding-right:calc(var(--spacing) * 8)}.py-0\.5{padding-top:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * .5)}.py-1{padding-top:calc(var(--spacing) * 1);padding-bottom:calc(var(--spacing) * 1)}.py-2{padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 2)}.py-2\.5{padding-top:calc(var(--spacing) * 2.5);padding-bottom:calc(var(--spacing) * 2.5)}.py-3{padding-top:calc(var(--spacing) * 3);padding-bottom:calc(var(--spacing) * 3)}.py-4{padding-top:calc(var(--spacing) * 4);padding-bottom:calc(var(--spacing) * 4)}.py-6{padding-top:calc(var(--spacing) * 6);padding-bottom:calc(var(--spacing) * 6)}.py-8{padding-top:calc(var(--spacing) * 8);padding-bottom:calc(var(--spacing) * 8)}.py-12{padding-top:calc(var(--spacing) * 12);padding-bottom:calc(var(--spacing) * 12)}.py-16{padding-top:calc(var(--spacing) * 16);padding-bottom:calc(var(--spacing) * 16)}.py-20{padding-top:calc(var(--spacing) * 20);padding-bottom:calc(var(--spacing) * 20)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-amber-400{color:var(--color-amber-400)}.text-amber-800{color:var(--color-amber-800)}.text-blue-800{color:var(--color-blue-800)}.text-current{color:currentColor}.text-green-600{color:var(--color-green-600)}.text-green-800{color:var(--color-green-800)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-800{color:var(--color-red-800)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-white\/70{color:#ffffffb3}.text-white\/70{color:rgba(255,255,255,0.7)}.uppercase{text-transform:uppercase}.not-italic{font-style:normal}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.accent-\[var\(--primary-color\)\]{accent-color:var(--primary-color)}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.group-hover\:scale-105.group:hover *{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:text-slate-600.group:hover *{color:var(--color-slate-600)}}.focus-within\:border-slate-400:focus-within{border-color:var(--color-slate-400)}@media (hover:hover){.hover\:border-slate-400:hover{border-color:var(--color-slate-400)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}}@media (min-width:40rem){.sm\:mb-0{margin-bottom:calc(var(--spacing) * 0)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:sticky{position:sticky}.md\:top-24{top:calc(var(--spacing) * 24)}.md\:left-1\/2{left:50%}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-none{order:0}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:mx-8{margin-left:calc(var(--spacing) * 8);margin-right:calc(var(--spacing) * 8)}.md\:ml-auto{margin-left:auto}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:calc(var(--spacing) * 64)}.md\:h-\[70vh\]{height:70vh}.md\:h-\[80vh\]{height:80vh}.md\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-12{gap:calc(var(--spacing) * 12)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:py-12{padding-top:calc(var(--spacing) * 12);padding-bottom:calc(var(--spacing) * 12)}.md\:py-16{padding-top:calc(var(--spacing) * 16);padding-bottom:calc(var(--spacing) * 16)}.md\:py-20{padding-top:calc(var(--spacing) * 20);padding-bottom:calc(var(--spacing) * 20)}.md\:py-24{padding-top:calc(var(--spacing) * 24);padding-bottom:calc(var(--spacing) * 24)}.md\:py-32{padding-top:calc(var(--spacing) * 32);padding-bottom:calc(var(--spacing) * 32)}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.nav-item{position:relative}.nav-item:hover>.nav-submenu,.nav-item:focus-within>.nav-submenu{opacity:1;pointer-events:auto;transform:scale(1)}.nav-submenu{opacity:0;transform-origin:0 0;pointer-events:none;z-index:80;transition:all .2s ease-out;transform:scale(.98)} \ No newline at end of file +*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-top:initial;right:initial;bottom:initial;left:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:#fef2f2;--color-red-200:#ffc9c9;--color-red-400:#ff6467;--color-red-500:#fb2c36;--color-red-600:#e7000b;--color-red-800:#9f0712;--color-amber-50:#fffbeb;--color-amber-200:#fee685;--color-amber-400:#ffb900;--color-amber-800:#973c00;--color-green-50:#f0fdf4;--color-green-200:#b9f8cf;--color-green-600:#00a63e;--color-green-800:#016630;--color-blue-50:#eff6ff;--color-blue-200:#bedbff;--color-blue-800:#193cb8;--color-slate-50:#f8fafc;--color-slate-100:#f1f5f9;--color-slate-200:#e2e8f0;--color-slate-300:#cbd5e1;--color-slate-400:#94a3b8;--color-slate-500:#64748b;--color-slate-600:#475569;--color-slate-700:#334155;--color-slate-800:#1e293b;--color-slate-900:#0f172a;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:.375rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}select[multiple],[size] optgroup{font-weight:bolder}select[multiple],[size] optgroup option{padding-left:20px}::file-selector-button{margin-right:4px}::placeholder{opacity:1}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input[type=button],[type=reset],[type=submit]{appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:not([hidden=until-found]){display:none!important}:root{--primary-color:#1e293b;--accent-color:#475569}body{font-family:var(--font-sans);color:#1e293b;background-color:#fff;line-height:1.6}h1,h2,h3,h4,h5,h6{color:#1e293b;font-weight:600;line-height:1.2}a{color:var(--primary-color);text-decoration:none}a:hover{opacity:.8}img{max-width:100%;height:auto}.btn{cursor:pointer;border-radius:.25rem;justify-content:center;align-items:center;padding:.625rem 1.5rem;font-size:.875rem;font-weight:500;line-height:1.25rem;transition:opacity .15s ease-out;display:inline-flex}.btn:hover{opacity:.9}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background-color:var(--primary-color)!important;color:#fff!important;border-color:var(--primary-color)!important}.btn-accent{background-color:var(--accent-color)!important;color:#fff!important;border-color:var(--accent-color)!important}.btn-outline{color:var(--btn-color,var(--primary-color))!important;border:1px solid var(--btn-color,var(--primary-color))!important;background-color:#0000!important}.btn-secondary{color:var(--primary-color);background-color:#0000;border:1px solid #e2e8f0}.btn-secondary:hover{background-color:#f8fafc}.container{width:100%;max-width:1280px;margin-left:auto;margin-right:auto;padding-left:1rem;padding-right:1rem}@media (min-width:768px){.container{padding-left:1.5rem;padding-right:1.5rem}}.product-card{flex-direction:column;display:flex}.product-card-bordered{border:1px solid #e2e8f0}.product-card-bordered .product-title{padding-left:1rem;padding-right:1rem}.product-card-bordered .product-price{padding-bottom:1rem;padding-left:1rem;padding-right:1rem}.product-card img{aspect-ratio:1;object-fit:cover;background-color:#f8fafc}.product-card .product-title{margin-top:.75rem;font-size:.875rem;font-weight:500}.product-card .product-price{color:#475569;margin-top:.25rem;font-size:.875rem}[data-spark-membership-price][data-membership-active=true] [data-spark-public-price]{color:#94a3b8;font-weight:400;text-decoration-line:line-through}.spark-member-price{color:#1e293b;flex-wrap:wrap;align-items:baseline;gap:.375rem;margin-top:.25rem;display:flex}.spark-member-price-label{color:var(--primary-color);text-transform:uppercase;font-size:.75rem;font-weight:600}.spark-member-price-value{font-weight:700}.spark-member-price-detail{color:#64748b;font-size:.75rem;font-weight:400}.product-card .spark-member-price,[data-spark-membership-layout=sticky] .spark-member-price{gap:.25rem;margin-top:.125rem}.product-card .spark-member-price-label,[data-spark-membership-layout=sticky] .spark-member-price-label{font-size:.6875rem}[data-spark-membership-layout=sticky][data-membership-active=true]{line-height:1.25;display:block}.product-grid{grid-template-columns:repeat(1,1fr);gap:1.5rem;display:grid}@media (min-width:768px){.product-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width:1024px){.product-grid{grid-template-columns:repeat(var(--product-grid-columns,3), 1fr)}}.category-grid{grid-template-columns:repeat(1,1fr);gap:1rem;display:grid}@media (min-width:768px){.category-grid{grid-template-columns:repeat(var(--category-grid-columns,2), 1fr)}}.skeleton-card{flex-direction:column;display:flex}.skeleton-card .skeleton-image{aspect-ratio:1;background-color:#f1f5f9;position:relative;overflow:hidden}.skeleton-card .skeleton-image:after{content:"";background:linear-gradient(90deg,#f1f5f9,#e2e8f0,#f1f5f9);animation:1.5s ease-in-out infinite shimmer;position:absolute;top:0;right:0;bottom:0;left:0}.skeleton-card .skeleton-text{background-color:#f1f5f9;height:12px;margin-top:.75rem;position:relative;overflow:hidden}.skeleton-card .skeleton-text:after{content:"";background:linear-gradient(90deg,#f1f5f9,#e2e8f0,#f1f5f9);animation:1.5s ease-in-out infinite shimmer;position:absolute;top:0;right:0;bottom:0;left:0}.skeleton-card .skeleton-text-short{background-color:#f1f5f9;width:40%;height:12px;margin-top:.25rem;position:relative;overflow:hidden}.skeleton-card .skeleton-text-short:after{content:"";background:linear-gradient(90deg,#f1f5f9,#e2e8f0,#f1f5f9);animation:1.5s ease-in-out infinite shimmer;position:absolute;top:0;right:0;bottom:0;left:0}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.cart-badge{background-color:var(--primary-color);color:#fff;text-align:center;pointer-events:none;border-radius:50%;width:16px;height:16px;font-size:10px;font-weight:600;line-height:16px;position:absolute;top:-4px;right:-4px}[data-light-primary] .cart-badge{color:#1e293b}.cart-badge[data-animate]{animation:.3s ease-out badge-pulse}@keyframes badge-pulse{0%{transform:scale(1)}50%{transform:scale(1.3)}to{transform:scale(1)}}.spark-gallery{flex-direction:column;gap:.75rem;display:flex}@media (min-width:768px){.spark-gallery-left{flex-direction:row-reverse;gap:.75rem}.spark-gallery-left .spark-gallery-main{flex:1;min-width:0}.spark-gallery-left .spark-gallery-thumbs{flex-direction:column;justify-content:flex-start;width:72px;max-height:520px;overflow:hidden auto}.spark-gallery-left .spark-gallery-thumb{flex-shrink:0;width:72px;height:72px}}.spark-gallery-main{aspect-ratio:1;background-color:#f8fafc;max-height:560px;position:relative;overflow:hidden}.spark-gallery-hero{object-fit:contain;width:100%;height:100%;transition:opacity .2s ease-out}.spark-gallery-hero.spark-gallery-fading{opacity:0}.spark-gallery-thumbs{scrollbar-width:thin;scrollbar-color:#cbd5e1 transparent;justify-content:center;gap:.5rem;padding:.25rem 0;display:flex;overflow:auto hidden}.spark-gallery-thumb{cursor:pointer;opacity:.6;background:#f8fafc;border:2px solid #0000;flex-shrink:0;width:72px;height:72px;padding:0;transition:border-color .2s ease-out,opacity .2s ease-out;overflow:hidden}.spark-gallery-thumb:hover{opacity:1;border-color:#cbd5e1}.spark-gallery-thumb-active{opacity:1!important;border-color:var(--primary-color)!important}.spark-gallery-prev,.spark-gallery-next{cursor:pointer;color:#475569;opacity:0;z-index:2;background:#ffffffe6;border:none;border-radius:50%;justify-content:center;align-items:center;width:36px;height:36px;transition:opacity .2s ease-out,background-color .15s ease-out;display:flex;position:absolute;top:50%;transform:translateY(-50%);box-shadow:0 1px 3px #0000001a}.spark-gallery-prev{left:.75rem}.spark-gallery-next{right:.75rem}.spark-gallery-prev:hover,.spark-gallery-next:hover{color:#1e293b;background:#fff}.spark-gallery:hover .spark-gallery-prev,.spark-gallery:hover .spark-gallery-next,.spark-gallery:focus-within .spark-gallery-prev,.spark-gallery:focus-within .spark-gallery-next{opacity:1}@media (hover:none){.spark-gallery-prev,.spark-gallery-next{opacity:.7}}.sticky-atc{z-index:50;background:#fff;border-top:1px solid #e2e8f0;transition:transform .25s ease-out;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%);box-shadow:0 -2px 8px #0000000f}.sticky-atc-visible{transform:translateY(0)}.sticky-atc-inner{justify-content:space-between;align-items:center;gap:1rem;max-width:1280px;margin:0 auto;padding:.75rem 1rem;display:flex}.sticky-atc-info{flex-direction:column;min-width:0;display:flex}.sticky-atc-title{color:#1e293b;white-space:nowrap;text-overflow:ellipsis;font-size:.875rem;font-weight:500;overflow:hidden}.sticky-atc-price{color:#475569;font-size:.875rem}.sticky-atc-btn{white-space:nowrap;flex-shrink:0;padding:.625rem 1.5rem}@media (min-width:1024px){.sticky-atc{display:none}}.search-overlay{z-index:60;opacity:0;visibility:hidden;justify-content:center;align-items:flex-start;transition:opacity .2s ease-out,visibility .2s ease-out;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.search-overlay-visible{opacity:1;visibility:visible}.search-overlay-backdrop{background:#0006;position:absolute;top:0;right:0;bottom:0;left:0}.search-overlay-content{z-index:1;width:100%;max-width:640px;margin-top:5rem;padding:0 1rem;transition:transform .2s ease-out;position:relative;transform:translateY(-12px)}.search-overlay-visible .search-overlay-content{transform:translateY(0)}.search-overlay-form{background:#fff;border:1px solid #e2e8f0;align-items:center;display:flex;box-shadow:0 8px 30px #0000001f}.search-overlay-input{color:#1e293b;background:0 0;border:none;outline:none;flex:1;padding:1rem 1.25rem;font-size:1rem}.search-overlay-input::placeholder{color:#94a3b8}.search-overlay-submit{color:#475569;cursor:pointer;background:0 0;border:none;padding:.75rem}.search-overlay-submit:hover{color:#1e293b}.search-overlay-close{color:#94a3b8;cursor:pointer;background:0 0;border:none;padding:.75rem}.search-overlay-close:hover{color:#475569}.sr-only,.skip-to-content{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-to-content:focus{z-index:100;clip:auto;width:auto;height:auto;font-family:var(--font-sans);background-color:#1e293b;border:1px solid #1e293b;border-radius:2px;margin:0;padding:.625rem 1rem;font-size:.875rem;font-weight:500;line-height:1.25rem;top:1rem;left:1rem;overflow:visible;color:#fff!important}:focus-visible{outline:2px solid var(--primary-color);outline-offset:2px}@media print{header,footer,#announcement-bar,.sidecart,.breadcrumb,nav[aria-label=breadcrumb]{display:none!important}.container{max-width:100%;padding:0}body{color:#000;background:#fff;font-size:12pt}a{color:#000;text-decoration:underline}img{max-width:100%}.product-grid{grid-template-columns:repeat(2,1fr)}}.sidecart-open{overflow:hidden}.sidecart-open .sidecart{overflow-x:hidden}.sidecart{outline:0;font-family:inherit;position:absolute;top:0;overflow:hidden}.sidecart .sidecart-dialog{width:100vw;transition:all .6s cubic-bezier(.75,0,.55,1);right:-100vw}.sidecart.show .sidecart-dialog{transition:all .6s cubic-bezier(.33,0,0,1);right:0}.sidecart .cart-btn{color:#1e293b;cursor:pointer;text-align:center;white-space:nowrap;-webkit-user-select:none;user-select:none;background-color:#e2e8f0;border:1px solid #0000;justify-content:center;padding:.8rem 1rem;transition:background-color .15s ease-out}.sidecart .cart-btn:hover{background-color:#cbd5e1;border:1px solid #0000}.sidecart .cart-btn:focus:not(:active){box-shadow:0 0 0 2px var(--primary-color)}.sidecart .text-right{text-align:right}.sidecart .text-center{text-align:center}.sidecart .error-text{color:#ef4444;font-size:small}.sidecart a{color:#1e293b}.sidecart a:hover{color:#475569}.sidecart button{-webkit-appearance:none;cursor:pointer;background-color:#0000;border:0;padding:0;font-family:inherit}.sidecart button.close{color:#475569;float:right;font-weight:400;line-height:.5;transition:color .15s ease-out}.sidecart button.close:hover{color:#1e293b}.sidecart-dialog{pointer-events:none;z-index:99999;height:100%;margin:auto;position:fixed}.sidecart-content{pointer-events:auto;background-color:#fff;background-clip:padding-box;border:none;border-radius:0;outline:0;flex-direction:column;height:100%;display:flex;position:relative;overflow-y:auto;box-shadow:0 0 1px 1px #8890c333}.sidecart-header{background-color:#fff;border-bottom:none;justify-content:center;align-items:center;height:60px;padding:1rem;display:flex;position:relative}.sidecart-header button.close{color:#475569;font-size:2rem;position:absolute;right:1rem}.sidecart-header button.close:hover{color:#1e293b}.sidecart-title{text-align:center;margin-bottom:0;font-weight:700}#basket-content-div{overflow-y:auto}.sidecart-body{position:inherit;flex:auto;padding:.5rem .5rem 6rem;overflow-y:auto}.sidecart-footer{background-color:#fff;border-top:1px solid #e2e8f0;width:auto;padding:1rem;display:flex;bottom:0}.sidecart-footer .cart-btn{text-align:center;cursor:pointer;border:1px solid #0000;border-radius:.3rem;width:100%;height:auto;padding:1.25rem;font-size:24px;font-weight:700;text-decoration:none;display:inline-block;background-color:var(--primary-color)!important;color:#fff!important}.sidecart-footer .cart-btn:hover{border:1px solid #0000;background-color:var(--primary-color-darker)!important;color:#fff!important}.sidecart .form-control{color:#1e293b;appearance:none;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23475569' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:14px 10px;border:1px solid #e2e8f0;border-radius:.25rem;width:100%;padding:.25rem 2rem .25rem .5rem;font-size:.875rem;line-height:1.5;display:block}.cart-items{margin:0 0 20px}.cart-item{box-shadow:none;border-bottom:1px solid #e2e8f0;flex-flow:row;justify-content:flex-start;margin:0 0 .75rem;padding:.75rem;display:flex}.cart-item:first-child{border-top:1px solid #e2e8f0}.cart-item img{width:100%}.cart-item .item-img{width:110px;margin-right:5%;padding:5px}.cart-item .item-details{width:100%;padding-top:.5rem}.cart-item .item-title{margin-bottom:.5rem;font-family:inherit;font-size:1rem;font-weight:500;line-height:1.2;display:block}.cart-item .item-description{flex-flow:wrap;align-items:center;width:100%;margin:0 0 .5em;display:flex}.cart-item .item-description .basket-action{flex-direction:column;flex:40%;height:fit-content;margin-right:20px;display:flex}.cart-item .item-description .basket-action:last-child{margin-right:0}.cart-item .item-description label{margin-bottom:0;display:inline-block}.cart-item .item-description button.close{font-size:smaller}.cart-item .item-price{width:100%}.cart-item .close{font-size:1.5rem}table.sidecart-table{background-color:#0000;width:100%}table.sidecart-table td{vertical-align:top;border-top:1px solid #e2e8f0;padding:.75rem}table.sidecart-table tr:first-child td{border-top:none}table.sidecart-table.table-sm td{padding:.15rem;font-size:small}.cart-totals{font-size:initial}.cart-coupon-wrapper{padding:.75rem}.cart-coupon-wrapper h5{font-family:inherit;font-size:1em}.cart-coupon-wrapper table{width:100%}.cart-coupon-wrapper td:first-child{width:75%}.cart-coupon-wrapper .form-input-group .btn{padding:.75em;font-size:1.125em}.cart-coupon{margin:5% 0}.coupon-remove{font-size:1.5em}.coupon-form{margin:20px 0}.coupon-form .form-input-group{flex-wrap:wrap;width:auto;display:flex}.coupon-form .form-input-group input{background-color:#fff;border:1px solid #e2e8f0;flex:75%;padding:.8rem 1rem}.coupon-form .form-input-group .cart-btn{text-align:center;white-space:nowrap;flex:1;margin-top:10px}.coupon-code{font-size:initial;text-align:center;white-space:nowrap;vertical-align:baseline;color:#fff;background-color:#22c55e;padding:.1em .5em;font-weight:700;line-height:1}.loader{margin:25% 0}.loader .loading{text-align:center;margin:30px;padding:25px}.loader .loading:before{content:"";border-style:solid;border-width:4px;border-color:var(--primary-color) #eee #eee;border-radius:100%;width:50px;height:50px;margin:-25px auto auto -25px;animation:.7s linear infinite rotation;position:absolute;left:50%}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(359deg)}}.cart-empty{margin:25% 0}@media (min-width:768px) and (max-width:991.98px){.sidecart .sidecart-dialog{width:60vw}.sidecart-body{padding:1rem 1rem 6rem}.coupon-form .form-input-group input{flex:50%}.coupon-form .form-input-group .cart-btn{margin-top:0}}@media (min-width:992px){.sidecart .sidecart-dialog{width:50vw}.sidecart-body{padding:1rem 2rem 6rem}.coupon-form .form-input-group input{flex:50%}.coupon-form .form-input-group .cart-btn{margin-top:0}}@media (min-width:1200px){.sidecart .sidecart-dialog{width:45vw}}@media (min-width:1400px){.sidecart .sidecart-dialog{width:40vw}}@media (min-width:1600px){.sidecart .sidecart-dialog{width:35vw}}@media (max-width:576px){.cart-coupon-wrapper .form-input-group .btn{padding:.9em}}.cart-popover-wrapper{display:inline-block;position:relative}.cart-popover-wrapper .popover-content{opacity:0;visibility:hidden;background-color:#fff;width:auto;padding:.5rem;position:absolute;top:50px;left:-130px;transform:translateY(10px);box-shadow:0 2px 5px #00000042}.cart-popover-wrapper .popover-content p{margin-bottom:.5rem}.cart-popover-wrapper .popover-content table.popover-table{margin-top:.75em;margin-bottom:.75em;font-size:.875rem}.cart-popover-wrapper .popover-content table.popover-table tr:first-child td{border-top:none}.cart-popover-wrapper .popover-content table.popover-table tr:first-child td,.cart-popover-wrapper .popover-content table.popover-table tr:last-child td,.cart-popover-wrapper .popover-content table.popover-table tr:nth-last-child(2){font-weight:600}.cart-popover-wrapper .popover-content table.popover-table td{border-top:1px solid #dee2e6;padding:.375rem}.cart-popover-wrapper:hover .popover-content{z-index:10;opacity:1;visibility:visible;width:max-content;transition:all .5s cubic-bezier(.75,-.02,.2,.97);transform:translateY(-20px)}.cart-popover-wrapper .help-icon{cursor:pointer;vertical-align:middle;background-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='18px' height='18px' fill='%23606975' viewBox='0 0 24 24' style='enable-background:new 0 0 24 24;' xml:space='preserve'%3E%3Cg id='' style='opacity:0.75;'%3E%3Cg id='help'%3E%3Cpath id='circle' style='fill-rule:evenodd;clip-rule:evenodd;' d='M12.001,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,5.476,4.438,9.914,9.916,9.914c5.476,0,9.914-4.438,9.914-9.914C21.915,6.523,17.477,2.085,12.001,2.085z M12.002,20.085 c-4.465,0-8.084-3.619-8.084-8.083c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084 C20.085,16.466,16.466,20.085,12.002,20.085z' /%3E%3Cg id='question_mark'%3E%3Cpath id='top' style='fill-rule:evenodd;clip-rule:evenodd;' d='M11.766,6.688c-2.5,0-3.219,2.188-3.219,2.188l1.411,0.854 c0,0,0.298-0.791,0.901-1.229c0.516-0.375,1.625-0.625,2.219,0.125c0.701,0.885-0.17,1.587-1.078,2.719 C11.047,12.531,11,15,11,15h1.969c0,0,0.135-2.318,1.041-3.381c0.603-0.707,1.443-1.338,1.443-2.494S14.266,6.688,11.766,6.688z' /%3E%3Crect id='bottom' x='11' y='16' style='fill-rule:evenodd;clip-rule:evenodd;' width='2' height='2' /%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;width:20px;height:20px;display:inline-block}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:calc(var(--spacing) * 0);right:calc(var(--spacing) * 0);bottom:calc(var(--spacing) * 0);left:calc(var(--spacing) * 0)}.start{left:var(--spacing)}.end{right:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-24{top:calc(var(--spacing) * 24)}.top-full{top:100%}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-40{z-index:40}.z-50{z-index:50}.z-60{z-index:60}.z-70{z-index:70}.order-1{order:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-4{margin-left:calc(var(--spacing) * 4);margin-right:calc(var(--spacing) * 4)}.mx-auto{margin-left:auto;margin-right:auto}.my-8{margin-top:calc(var(--spacing) * 8);margin-bottom:calc(var(--spacing) * 8)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.-ml-2{margin-left:calc(var(--spacing) * -2)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-28{height:calc(var(--spacing) * 28)}.h-48{height:calc(var(--spacing) * 48)}.h-\[50vh\]{height:50vh}.h-\[65vh\]{height:65vh}.h-full{height:100%}.h-screen{height:100vh}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-\[44px\]{min-height:44px}.min-h-\[70vh\]{min-height:70vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/3{width:33.3333%}.w-2\/3{width:66.6667%}.w-3\/4{width:75%}.w-4\/6{width:66.6667%}.w-5\/6{width:83.3333%}.w-10{width:calc(var(--spacing) * 10)}.w-20{width:calc(var(--spacing) * 20)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.space-y-1>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.space-y-2>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.space-y-3>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.space-y-4>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.space-y-6>:not(:last-child){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.divide-y>:not(:last-child){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.divide-slate-100>:not(:last-child){border-color:var(--color-slate-100)}.divide-slate-200>:not(:last-child){border-color:var(--color-slate-200)}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-800{border-color:var(--color-slate-800)}.bg-\[var\(--primary-color\)\]{background-color:var(--primary-color)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-black\/30{background-color:#0000004d}.bg-black\/30{background-color:rgba(0,0,0,0.3)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-green-50{background-color:var(--color-green-50)}.bg-red-50{background-color:var(--color-red-50)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-left:calc(var(--spacing) * 2);padding-right:calc(var(--spacing) * 2)}.px-3{padding-left:calc(var(--spacing) * 3);padding-right:calc(var(--spacing) * 3)}.px-4{padding-left:calc(var(--spacing) * 4);padding-right:calc(var(--spacing) * 4)}.px-5{padding-left:calc(var(--spacing) * 5);padding-right:calc(var(--spacing) * 5)}.px-6{padding-left:calc(var(--spacing) * 6);padding-right:calc(var(--spacing) * 6)}.px-8{padding-left:calc(var(--spacing) * 8);padding-right:calc(var(--spacing) * 8)}.py-0\.5{padding-top:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * .5)}.py-1{padding-top:calc(var(--spacing) * 1);padding-bottom:calc(var(--spacing) * 1)}.py-2{padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 2)}.py-2\.5{padding-top:calc(var(--spacing) * 2.5);padding-bottom:calc(var(--spacing) * 2.5)}.py-3{padding-top:calc(var(--spacing) * 3);padding-bottom:calc(var(--spacing) * 3)}.py-4{padding-top:calc(var(--spacing) * 4);padding-bottom:calc(var(--spacing) * 4)}.py-6{padding-top:calc(var(--spacing) * 6);padding-bottom:calc(var(--spacing) * 6)}.py-8{padding-top:calc(var(--spacing) * 8);padding-bottom:calc(var(--spacing) * 8)}.py-12{padding-top:calc(var(--spacing) * 12);padding-bottom:calc(var(--spacing) * 12)}.py-16{padding-top:calc(var(--spacing) * 16);padding-bottom:calc(var(--spacing) * 16)}.py-20{padding-top:calc(var(--spacing) * 20);padding-bottom:calc(var(--spacing) * 20)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-amber-400{color:var(--color-amber-400)}.text-amber-800{color:var(--color-amber-800)}.text-blue-800{color:var(--color-blue-800)}.text-current{color:currentColor}.text-green-600{color:var(--color-green-600)}.text-green-800{color:var(--color-green-800)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-800{color:var(--color-red-800)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-white\/70{color:#ffffffb3}.text-white\/70{color:rgba(255,255,255,0.7)}.uppercase{text-transform:uppercase}.not-italic{font-style:normal}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.accent-\[var\(--primary-color\)\]{accent-color:var(--primary-color)}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.group-hover\:scale-105.group:hover *{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:text-slate-600.group:hover *{color:var(--color-slate-600)}}.focus-within\:border-slate-400:focus-within{border-color:var(--color-slate-400)}@media (hover:hover){.hover\:border-slate-400:hover{border-color:var(--color-slate-400)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}}@media (min-width:40rem){.sm\:mb-0{margin-bottom:calc(var(--spacing) * 0)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:sticky{position:sticky}.md\:top-24{top:calc(var(--spacing) * 24)}.md\:left-1\/2{left:50%}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-none{order:0}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:mx-8{margin-left:calc(var(--spacing) * 8);margin-right:calc(var(--spacing) * 8)}.md\:ml-auto{margin-left:auto}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:calc(var(--spacing) * 64)}.md\:h-\[70vh\]{height:70vh}.md\:h-\[80vh\]{height:80vh}.md\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-12{gap:calc(var(--spacing) * 12)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:py-12{padding-top:calc(var(--spacing) * 12);padding-bottom:calc(var(--spacing) * 12)}.md\:py-16{padding-top:calc(var(--spacing) * 16);padding-bottom:calc(var(--spacing) * 16)}.md\:py-20{padding-top:calc(var(--spacing) * 20);padding-bottom:calc(var(--spacing) * 20)}.md\:py-24{padding-top:calc(var(--spacing) * 24);padding-bottom:calc(var(--spacing) * 24)}.md\:py-32{padding-top:calc(var(--spacing) * 32);padding-bottom:calc(var(--spacing) * 32)}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.nav-item{position:relative}.nav-item:hover>.nav-submenu,.nav-item:focus-within>.nav-submenu{opacity:1;pointer-events:auto;transform:scale(1)}.nav-submenu{opacity:0;transform-origin:0 0;pointer-events:none;z-index:80;transition:all .2s ease-out;transform:scale(.98)}.spark-preview-indicator{z-index:100;color:#fff;background:#0f172a;border:1px solid #fff3;border-radius:.75rem;align-items:center;gap:.75rem;max-width:calc(100vw - 2rem);padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;display:flex;position:fixed;bottom:1rem;right:1rem;box-shadow:0 12px 32px #0f172a47}.spark-preview-indicator__message{font-weight:600}.spark-preview-indicator__exit{color:#0f172a;background:#fff;border-radius:.375rem;padding:.25rem .5rem;font-weight:700;text-decoration:none}.spark-preview-indicator__exit:focus-visible{outline-offset:3px;outline:3px solid #fbbf24}@media (hover:hover){.spark-preview-indicator__exit:hover{color:#0f172a;opacity:1;background:#e2e8f0}}@media not all and (min-width:30rem){.spark-preview-indicator{justify-content:space-between;max-width:none;bottom:.75rem;left:.75rem;right:.75rem}} \ No newline at end of file diff --git a/css/input.css b/css/input.css index 94c932b..dae6d7a 100644 --- a/css/input.css +++ b/css/input.css @@ -1282,3 +1282,59 @@ transition: all 200ms ease-out; z-index: 80; } + +/* Preview sessions are explicit without changing ordinary storefront visits. */ +.spark-preview-indicator { + position: fixed; + right: 1rem; + bottom: 1rem; + z-index: 100; + display: flex; + align-items: center; + gap: 0.75rem; + max-width: calc(100vw - 2rem); + padding: 0.75rem 1rem; + color: #fff; + background: #0f172a; + border: 1px solid rgb(255 255 255 / 20%); + border-radius: 0.75rem; + box-shadow: 0 12px 32px rgb(15 23 42 / 28%); + font-size: 0.875rem; + line-height: 1.25rem; +} + +.spark-preview-indicator__message { + font-weight: 600; +} + +.spark-preview-indicator__exit { + padding: 0.25rem 0.5rem; + color: #0f172a; + background: #fff; + border-radius: 0.375rem; + font-weight: 700; + text-decoration: none; +} + +.spark-preview-indicator__exit:focus-visible { + outline: 3px solid #fbbf24; + outline-offset: 3px; +} + +@media (hover: hover) { + .spark-preview-indicator__exit:hover { + color: #0f172a; + background: #e2e8f0; + opacity: 1; + } +} + +@media (width < 30rem) { + .spark-preview-indicator { + right: 0.75rem; + bottom: 0.75rem; + left: 0.75rem; + justify-content: space-between; + max-width: none; + } +} diff --git a/layouts/base.html b/layouts/base.html index 7415906..ee09da1 100644 --- a/layouts/base.html +++ b/layouts/base.html @@ -108,9 +108,11 @@ {% block extrastyles %}{% endblock extrastyles %} - {% if settings.custom_css %} - - {% endif %} + {% block custom_css %} + {% if settings.custom_css %} + + {% endif %} + {% endblock custom_css %} {% block extrahead %}{% endblock extrahead %} {# Head app hook is for platform-critical head snippets only. Prefer footer hooks. #} @@ -217,12 +219,21 @@ {% block component_scripts %}{% endblock component_scripts %} - {# Platform compatibility — replaces jQuery-dependent core_js with vanilla JS #} - + {% block platform_compatibility %} + {# Platform compatibility — replaces jQuery-dependent core_js with vanilla JS #} + + {% endblock platform_compatibility %} + + {% block preview_indicator %} + {% if request.COOKIES.preview_theme %} + + {% endif %} + {% endblock preview_indicator %} {# Additional JS #} {% block extrascripts %}{% endblock %} + {% block delight_scripts %} {# Delight: skeleton dismiss + keyboard nav #} + {% endblock delight_scripts %} {# Non-critical apps and tracking run after content and theme JS. #} {% block footer_app_hooks %} diff --git a/scripts/check-templates.py b/scripts/check-templates.py index a7381b5..2be7678 100644 --- a/scripts/check-templates.py +++ b/scripts/check-templates.py @@ -23,6 +23,22 @@ r"{%\s*endverbatim(?:\s+.*?)?\s*%}", re.DOTALL, ) +BLOCK_TAG_RE = re.compile( + r"{%\s*(?Pendblock|block)\b(?:\s+(?P[\w-]+))?[^%]*%}" +) +REQUIRED_BASE_BLOCKS = { + "announcement_bar", + "nav_header", + "content_wrapper", + "footer", + "side_cart", + "custom_css", + "platform_compatibility", + "preview_indicator", + "delight_scripts", + "footer_app_hooks", + "tracking", +} def mask_match(match): @@ -41,6 +57,47 @@ def mask_ignored_regions(text): return VERBATIM_BLOCK_RE.sub(mask_match, mask_comments(text)) +def inspect_block_structure(text): + block_names = set() + stack = [] + errors = [] + + for match in BLOCK_TAG_RE.finditer(text): + tag_name = match.group("tag") + block_name = match.group("name") + line_number = text.count("\n", 0, match.start()) + 1 + + if tag_name == "block": + if not block_name: + errors.append(f"block on line {line_number} has no name") + continue + if block_name in block_names: + errors.append( + f"duplicate block {block_name!r} on line {line_number}" + ) + block_names.add(block_name) + stack.append((block_name, line_number)) + continue + + if not stack: + errors.append(f"endblock on line {line_number} has no opening block") + continue + + expected_name, opening_line = stack.pop() + if block_name and block_name != expected_name: + errors.append( + f"block {expected_name!r} opened on line {opening_line} " + f"closes as {block_name!r} on line {line_number}" + ) + + for block_name, opening_line in stack: + errors.append( + f"block {block_name!r} opened on line {opening_line} is unclosed" + ) + + return block_names, errors + + def load_allowlist(path): names = set() with path.open(encoding="utf-8") as handle: @@ -63,6 +120,14 @@ def missing_default_inventory(root, paths): base_template = root / "layouts" / "base.html" if not base_template.is_file(): missing.append("required template layouts/base.html") + else: + try: + base_text = mask_ignored_regions(base_template.read_text(encoding="utf-8")) + base_blocks, _ = inspect_block_structure(base_text) + for block_name in sorted(REQUIRED_BASE_BLOCKS - base_blocks): + missing.append(f"overridable base block {block_name!r}") + except OSError as error: + missing.append(f"readable layouts/base.html ({error})") for directory in TEMPLATE_DIRECTORIES: directory_root = root / directory @@ -91,6 +156,10 @@ def inspect_templates(root, allowlist): masked = mask_ignored_regions(text) relative_path = path.relative_to(root) + _, block_errors = inspect_block_structure(masked) + for error in block_errors: + violations.append(f"[block-structure] {relative_path}: {error}") + for match in TAG_RE.finditer(masked): tag_name = match.group(1) body = match.group("body") diff --git a/tests/js/spark-preview.test.js b/tests/js/spark-preview.test.js new file mode 100644 index 0000000..0576f3a --- /dev/null +++ b/tests/js/spark-preview.test.js @@ -0,0 +1,56 @@ +'use strict'; + +const assert = require('node:assert/strict'); +const preview = require('../../assets/js/spark-preview.js'); + +function fakeDocument(cookie) { + const appended = []; + return { + cookie, + appended, + body: { appendChild(node) { appended.push(node); } }, + getElementById() { return null; }, + createElement(tagName) { + return { + tagName, + children: [], + attributes: {}, + appendChild(node) { this.children.push(node); }, + setAttribute(name, value) { this.attributes[name] = value; } + }; + } + }; +} + +assert.equal(preview.readPreviewTheme('session=x; preview_theme=42'), '42'); +assert.equal(preview.readPreviewTheme('preview_theme=%3Cscript%3E'), null); +assert.equal( + preview.buildExitPreviewUrl({ + pathname: '/products/widget/', + search: '?preview_theme=theme_42&variant=blue', + hash: '#reviews' + }), + '/products/widget/?variant=blue&deactivate-theme=true#reviews' +); + +const ordinary = fakeDocument('session=abc'); +assert.equal(preview.initPreviewIndicator(ordinary), null); +assert.equal(ordinary.appended.length, 0); + +const active = fakeDocument('preview_theme=theme_42'); +const indicator = preview.initPreviewIndicator(active, { + pathname: '/products/widget/', + search: '?preview_theme=theme_42&variant=blue', + hash: '#reviews' +}); +assert.equal(active.appended.length, 1); +assert.equal(indicator.attributes.role, 'status'); +assert.equal(indicator.attributes['aria-live'], 'polite'); +assert.equal(indicator.children[0].textContent, 'Previewing theme theme_42'); +assert.equal( + indicator.children[1].href, + '/products/widget/?variant=blue&deactivate-theme=true#reviews' +); +assert.equal(indicator.children[1].textContent, 'Exit preview'); + +console.log('spark-preview tests passed'); diff --git a/tests/test_ci_gates.py b/tests/test_ci_gates.py index 0fe2b5c..affcf3b 100644 --- a/tests/test_ci_gates.py +++ b/tests/test_ci_gates.py @@ -465,6 +465,84 @@ def test_real_repo_passes(self): self.assertIn("Template integrity gate passed", result.stdout) self.assertIn("skipped 0 include tag(s)", result.stdout) + def test_preview_asset_is_only_loaded_during_a_preview_session(self): + base_template = (ROOT / "layouts" / "base.html").read_text( + encoding="utf-8" + ) + preview_block = base_template.split( + "{% block preview_indicator %}", 1 + )[1].split("{% endblock preview_indicator %}", 1)[0] + + condition = preview_block.index("{% if request.COOKIES.preview_theme %}") + asset = preview_block.index("'js/spark-preview.js'|asset_url") + end_condition = preview_block.index("{% endif %}") + self.assertLess(condition, asset) + self.assertLess(asset, end_condition) + + def test_default_scan_rejects_unbalanced_required_base_blocks(self): + original = (ROOT / "layouts" / "base.html").read_text(encoding="utf-8") + closing_tag = "{% endblock preview_indicator %}" + variants = { + "missing": original.replace(closing_tag, "", 1), + "misnamed": original.replace( + closing_tag, "{% endblock wrong_name %}", 1 + ), + } + + for label, base_text in variants.items(): + with ( + self.subTest(label=label), + tempfile.TemporaryDirectory() as temp_dir, + ): + fixture_dir = Path(temp_dir) + for directory, filename in ( + ("templates", "index.html"), + ("partials", "card.html"), + ): + directory_path = fixture_dir / directory + directory_path.mkdir() + (directory_path / filename).write_text("", encoding="utf-8") + layouts_dir = fixture_dir / "layouts" + layouts_dir.mkdir() + (layouts_dir / "base.html").write_text( + base_text, encoding="utf-8" + ) + + result = run_checker( + "check-templates.py", + "--allowlist", + ROOT / "scripts" / "url-name-allowlist.txt", + cwd=fixture_dir, + ) + + self.assertNotEqual(result.returncode, 0) + self.assertIn("[block-structure] layouts/base.html", result.stderr) + self.assertIn("preview_indicator", result.stderr) + + def test_block_structure_is_checked_in_every_template(self): + with tempfile.TemporaryDirectory() as temp_dir: + fixture_dir = Path(temp_dir) + templates_dir = fixture_dir / "templates" + templates_dir.mkdir() + (templates_dir / "index.html").write_text( + "{% block content %}Broken{% endblock wrong_name %}\n", + encoding="utf-8", + ) + allowlist_path = fixture_dir / "allowlist.txt" + allowlist_path.write_text("", encoding="utf-8") + + result = run_checker( + "check-templates.py", + "--root", + fixture_dir, + "--allowlist", + allowlist_path, + ) + + self.assertNotEqual(result.returncode, 0) + self.assertIn("[block-structure] templates/index.html", result.stderr) + self.assertIn("closes as 'wrong_name'", result.stderr) + def test_missing_include_unknown_url_and_variable_include_are_reported(self): template_fixtures = FIXTURES / "templates" result = run_checker(