/* TeaMan V2 — editorial tea commerce mockup */
:root{--bg:#f6f1e7;--bg-soft:#efe7d6;--card:#fbf7ee;--ink:#1f2a24;--ink-soft:#52605a;--muted:#7d857e;--line:#d9cfba;--line-soft:#e7decd;--primary:#3d5a4a;--primary-dark:#2a4035;--accent:#b6552d;--accent-dark:#8d3f1f;--gold:#c9a961;--display:'Cormorant Garamond',Georgia,serif;--body:'Inter',system-ui,sans-serif;--max:1240px;--narrow:900px;--s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:24px;--s6:32px;--s7:48px;--s8:64px;--s9:96px;--round:7px;--pill:999px;--ease:200ms ease;--ease-out-expo:cubic-bezier(.16,1,.3,1);--t-quick:140ms;--t-base:240ms;--t-focal:760ms}
*,*:before,*:after{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 var(--body);-webkit-font-smoothing:antialiased}img{display:block;max-width:100%}a{color:inherit;text-decoration:none;transition:color var(--ease)}a:hover{color:var(--accent)}button,select,input{font:inherit}button{border:0;background:none;cursor:pointer}h1,h2,h3,h4{margin:0;color:var(--ink);font-family:var(--display);font-weight:600;line-height:1.05;letter-spacing:-.02em}h1{font-size:clamp(3.5rem,7vw,7rem)}h2{font-size:clamp(2.2rem,4vw,4rem)}h3{font-size:clamp(1.35rem,2vw,1.8rem)}p{margin:0 0 var(--s4)}
.announcement{padding:9px var(--s5);background:var(--primary-dark);color:var(--bg);text-align:center;font-size:.76rem;letter-spacing:.08em}.announcement strong{color:var(--gold);font-weight:600}.announcement-sep{margin:0 12px;color:var(--gold);opacity:.7}.announcement a{color:var(--gold);text-decoration:none;transition:color var(--t-base) var(--ease-out-expo)}.announcement a:hover{color:var(--bg)}
.site-header{position:sticky;top:0;z-index:20;padding:24px 24px 0;background:var(--bg)}.header-inner{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;max-width:var(--max);min-height:72px;margin:auto;padding:0 28px;background:var(--card);border:1px solid rgba(217,207,186,.65);border-radius:var(--round);box-shadow:0 14px 30px -22px rgba(31,42,36,.42)}.header-nav{display:flex;gap:var(--s6);font-size:.78rem;letter-spacing:.08em;text-transform:uppercase}.header-nav a{position:relative;padding:6px 0}.header-nav a.active:after,.header-nav a:hover:after{position:absolute;right:0;bottom:0;left:0;height:1px;background:var(--accent);content:''}.brand{display:flex;align-items:center;justify-self:center;gap:9px;font:600 2rem/1 var(--display);letter-spacing:.05em}.brand-mark{display:inline-flex;width:34px;height:34px;align-items:center;justify-content:center;border-radius:50%;background:var(--primary);color:var(--gold);font-size:1.25rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--s5);font-size:.78rem;letter-spacing:.08em;text-transform:uppercase}.cart-link{display:flex;gap:8px;align-items:center;padding:24px 20px;margin:-1px -28px -1px 0;background:var(--gold);color:var(--ink);transition:background var(--ease)}.cart-link:hover{background:var(--accent);color:#fff}
.eyebrow{display:block;margin-bottom:var(--s4);color:var(--accent);font-size:.72rem;font-weight:600;letter-spacing:.2em;text-transform:uppercase}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--s3);padding:14px 24px;border:1px solid transparent;border-radius:var(--pill);font-size:.78rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-dark);color:#fff}.btn-outline{border-color:var(--ink);color:var(--ink)}.btn-outline:hover{background:var(--ink);color:var(--bg)}.text-link{display:inline-flex;gap:10px;align-items:center;color:var(--accent);font-size:.78rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase}.section{padding:var(--s9) max(24px,calc((100vw - var(--max))/2))}.section-tight{padding:var(--s8) max(24px,calc((100vw - var(--max))/2))}.section-heading{position:relative;display:flex;align-items:end;justify-content:space-between;max-width:var(--max);margin:0 auto var(--s7)}.section-heading h2{max-width:580px}.section-heading.centered{display:block;text-align:center}.section-heading.centered .eyebrow{margin-bottom:var(--s3)}
.hero{display:grid;grid-template-columns:1fr 1.07fr;gap:clamp(40px,7vw,110px);align-items:center;max-width:var(--max);min-height:620px;margin:auto;padding:var(--s9) 24px}.hero-copy{padding-left:clamp(0px,4vw,60px)}.hero-copy h1{margin-bottom:var(--s5)}.hero-copy h1 em{color:var(--primary);font-style:italic}.hero-copy p{max-width:420px;margin-bottom:var(--s6);color:var(--ink-soft);font-size:1.05rem}.hero-art{position:relative;aspect-ratio:1.04/1;overflow:hidden;border-radius:var(--round);background:var(--bg-soft)}.hero-art img{width:100%;height:100%;object-fit:cover}.hero-note{position:absolute;bottom:24px;left:24px;display:flex;flex-direction:column;padding:14px 18px;background:var(--card);border-left:3px solid var(--accent);box-shadow:0 18px 40px -28px rgba(31,42,36,.55);font-size:.76rem}.hero-note strong{font:600 1.15rem var(--display)}.hero-note span{color:var(--ink-soft)}
.trust{padding:20px max(24px,calc((100vw - var(--max))/2));background:var(--primary);color:var(--bg)}.trust-row{display:grid;grid-template-columns:repeat(4,1fr);max-width:var(--max);margin:auto}.trust-row p{display:flex;align-items:center;gap:12px;margin:0;padding:4px 20px;border-right:1px solid rgba(246,241,231,.22);font-size:.75rem;letter-spacing:.09em;text-transform:uppercase}.trust-row p:last-child{border:0}.trust-row strong{color:var(--gold);font:1.5rem var(--display)}
.product-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px;max-width:var(--max);margin:auto}.product-grid.cols-3{grid-template-columns:repeat(3,1fr)}.product-card{min-width:0;overflow:hidden}.product-card .media{position:relative;aspect-ratio:1/1;background:var(--bg-soft);overflow:hidden}.product-card .media img{width:100%;height:100%;object-fit:cover;transition:transform 500ms ease}.product-card:hover .media img{transform:scale(1.035)}.product-card .body{padding:17px 0 4px}.product-card .category{display:block;margin-bottom:7px;color:var(--muted);font-size:.68rem;letter-spacing:.13em;text-transform:uppercase}.product-card h3{margin-bottom:8px}.product-card h3:hover{color:var(--accent)}.price-row{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.origin{color:var(--ink-soft);font:italic .95rem var(--display)}.price{white-space:nowrap;font:600 1.35rem var(--display)}.ribbon{position:absolute;top:18px;left:-7px;z-index:1;padding:7px 18px;background:var(--primary);color:var(--bg);font:600 .78rem var(--display);letter-spacing:.06em;text-transform:uppercase;transform:rotate(-6deg)}.ribbon-accent{background:var(--accent)}.ribbon-gold{background:var(--gold);color:var(--ink)}.status-badge{display:inline-block;margin-left:8px;padding:3px 10px;border-radius:var(--pill);font:600 .68rem var(--body);letter-spacing:.1em;text-transform:uppercase;vertical-align:middle}.status-badge.open{background:var(--primary);color:var(--bg)}.status-badge.closed{background:var(--bg-soft);color:var(--muted);border:1px solid var(--line)}
.story{display:grid;grid-template-columns:1fr 1fr;gap:clamp(40px,9vw,130px);align-items:center;background:var(--bg-soft)}.story-image{aspect-ratio:1/1;overflow:hidden;border-radius:var(--round)}.story-image img{width:100%;height:100%;object-fit:cover}.story-copy{max-width:480px}.story-copy h2{margin-bottom:var(--s5)}.story-copy p{color:var(--ink-soft)}.story-copy .btn{margin-top:var(--s3)}.category-section{background:var(--card)}.category-grid{display:grid;grid-template-columns:repeat(3,1fr);max-width:var(--max);margin:auto;gap:24px}.category-card{position:relative;display:flex;align-items:end;aspect-ratio:4/5;overflow:hidden;border-radius:var(--round);color:#fff}.category-card:after{position:absolute;inset:0;background:linear-gradient(transparent 35%,rgba(31,42,36,.85));content:''}.category-card img{position:absolute;width:100%;height:100%;object-fit:cover;transition:transform 600ms ease}.category-card:hover img{transform:scale(1.05)}.category-card span{position:relative;z-index:1;padding:24px;font:1rem var(--display);letter-spacing:.05em}.category-card strong{display:block;margin-bottom:5px;font-size:2rem}.category-card:hover{color:#fff}.testimonial{background:var(--primary);color:var(--bg);text-align:center}.testimonial blockquote{max-width:760px;margin:0 auto 24px;font:italic clamp(2rem,4vw,3.5rem)/1.15 var(--display)}.testimonial p{color:var(--gold);font-size:.76rem;letter-spacing:.15em;text-transform:uppercase}.newsletter{background:var(--bg-soft);text-align:center}.newsletter>div{max-width:580px;margin:auto}.newsletter h2{margin-bottom:10px}.newsletter p{color:var(--ink-soft)}.newsletter-form{display:flex;max-width:470px;margin:28px auto 0;padding:5px;background:var(--card);border-radius:var(--pill);box-shadow:0 12px 30px -20px rgba(31,42,36,.4)}.newsletter-form input{min-width:0;flex:1;padding:12px 16px;border:0;outline:0;background:transparent;color:var(--ink)}.newsletter-form button{padding:12px 18px;border-radius:var(--pill);background:var(--primary);color:#fff;font-size:.72rem;letter-spacing:.08em;text-transform:uppercase}
.site-footer{padding:var(--s8) max(24px,calc((100vw - var(--max))/2)) var(--s5);background:var(--ink);color:var(--bg)}.footer-grid{display:grid;grid-template-columns:1.5fr repeat(3,1fr);gap:var(--s7);max-width:var(--max);margin:auto}.footer-brand .brand{justify-self:start;margin-bottom:16px;color:var(--bg)}.footer-brand p{max-width:300px;color:rgba(246,241,231,.7);font-size:.88rem}.footer-col{display:flex;flex-direction:column;gap:9px}.footer-col h4{margin-bottom:8px;color:var(--gold);font:600 .72rem var(--body);letter-spacing:.15em;text-transform:uppercase}.footer-col a{color:rgba(246,241,231,.72);font-size:.86rem}.footer-col a:hover{color:var(--gold)}.footer-bottom{display:flex;justify-content:space-between;max-width:var(--max);margin:48px auto 0;padding-top:18px;border-top:1px solid rgba(246,241,231,.15);color:rgba(246,241,231,.55);font-size:.72rem}
.page-hero{padding:var(--s8) 24px var(--s7);text-align:center;background:var(--bg-soft)}.page-hero h1{font-size:clamp(3.5rem,7vw,6rem)}.page-hero p{max-width:450px;margin:18px auto 0;color:var(--ink-soft)}.breadcrumb{max-width:var(--max);margin:auto;padding:22px 24px 0;color:var(--muted);font-size:.72rem;letter-spacing:.1em;text-transform:uppercase}.breadcrumb span{padding:0 10px;color:var(--line)}.shop-layout{max-width:var(--max);margin:auto;padding:28px 24px var(--s9)}.shop-toolbar{display:flex;justify-content:space-between;align-items:center;padding:16px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);color:var(--primary);font-size:.75rem;letter-spacing:.08em;text-transform:uppercase}.filter-controls,.sort-control{display:flex;align-items:center;gap:15px}.toolbar-label{font:600 .82rem var(--display);text-transform:none;letter-spacing:0}.shop-toolbar button,.shop-toolbar select{padding:7px 0;border:0;background:transparent;color:var(--primary);font-size:.72rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.shop-toolbar button span{padding-left:8px;font-size:1rem}.shop-toolbar select{outline:0}.shop-content{display:grid;grid-template-columns:190px 1fr;gap:38px;margin-top:38px}.shop-sidebar details{padding:16px 0;border-bottom:1px solid var(--line-soft)}.shop-sidebar summary{cursor:pointer;color:var(--ink);font:600 .75rem var(--body);letter-spacing:.1em;text-transform:uppercase}.shop-sidebar label{display:flex;gap:8px;margin-top:14px;color:var(--ink-soft);font-size:.82rem}.shop-sidebar label span{margin-left:auto;color:var(--muted)}.shop-sidebar input{accent-color:var(--primary)}.result-count{margin:0 0 20px;color:var(--muted);font-size:.76rem}.pagination{display:flex;justify-content:center;gap:8px;margin-top:50px}.pagination a{display:inline-flex;width:36px;height:36px;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:50%;color:var(--ink-soft);font-size:.8rem}.pagination a.active,.pagination a:hover{border-color:var(--primary);background:var(--primary);color:#fff}
.pdp-layout{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(40px,8vw,110px);max-width:var(--max);margin:auto;padding:42px 24px var(--s9)}.pdp-gallery{min-width:0}.main-image{aspect-ratio:1/1;overflow:hidden;background:var(--bg-soft);border-radius:var(--round)}.main-image img{width:100%;height:100%;object-fit:cover}.pdp-thumbs{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:12px}.thumb{aspect-ratio:1;overflow:hidden;border:1px solid var(--line-soft);background:var(--card);border-radius:4px;padding:0}.thumb.active{border:2px solid var(--primary)}.thumb img{width:100%;height:100%;object-fit:cover}.gallery-dots{display:none}.pdp-info{padding-top:18px}.pdp-cat{margin:0 0 12px;color:var(--accent);font-size:.72rem;font-weight:600;letter-spacing:.17em;text-transform:uppercase}.pdp-info h1{font-size:clamp(3rem,5vw,5rem);margin-bottom:15px}.pdp-info sup{font:600 .8rem var(--body);vertical-align:top}.pdp-rating{display:flex;align-items:center;gap:15px;margin-bottom:24px;color:var(--ink-soft);font-size:.8rem}.stars{color:var(--gold);letter-spacing:3px}.pdp-price{display:flex;align-items:baseline;gap:14px;margin-bottom:25px}.pdp-price>span{font:600 2.6rem var(--display)}.pdp-price del{color:var(--muted);font-size:.95rem}.pdp-price small{padding:5px 9px;border-radius:var(--pill);background:var(--bg-soft);color:var(--accent);font-size:.66rem;letter-spacing:.08em;text-transform:uppercase}.pdp-desc{max-width:540px;color:var(--ink-soft);font-size:.93rem;line-height:1.75}.pdp-option{margin:26px 0}.label{display:block;margin-bottom:10px;color:var(--ink-soft);font-size:.72rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase}.variant-pills{display:flex;flex-wrap:wrap;gap:8px}.variant-pills button{padding:10px 15px;border:1px solid var(--line);border-radius:var(--pill);color:var(--ink);font-size:.76rem}.variant-pills button.active,.variant-pills button:hover{border-color:var(--primary);background:var(--primary);color:#fff}.qty-cart{display:flex;gap:10px;margin:30px 0 20px;width:100%}.qty-control{display:flex;align-items:center;border:1px solid var(--line);border-radius:var(--pill);overflow:hidden}.qty-control button{width:38px;height:47px;color:var(--ink);font-size:1.1rem}.qty-control input{width:55px;height:47px;border:0;background:transparent;text-align:center;color:var(--ink);outline:0}.qty-control .qty-value{display:inline-flex;align-items:center;justify-content:center;min-width:55px;height:47px;color:var(--ink);font:600 1rem var(--body);user-select:none}.btn-add-cart{display:flex;flex:1;align-items:center;justify-content:center;gap:15px;border-radius:var(--pill);background:var(--accent);color:#fff;font-size:.75rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;min-height:48px;padding:16px 22px}.btn-add-cart:hover{background:var(--accent-dark)}.btn-add-cart[disabled]{opacity:.55;cursor:not-allowed;width:100%}.pdp-perks{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:0 0 28px}.pdp-perks div{padding:12px;background:var(--bg-soft);color:var(--ink-soft);font-size:.72rem}.pdp-perks strong{display:block;margin-bottom:2px;color:var(--ink);font-size:.76rem;font-weight:600}.accordion{border-top:1px solid var(--line)}.accordion details{padding:16px 0;border-bottom:1px solid var(--line)}.accordion summary{display:flex;justify-content:space-between;cursor:pointer;font-size:.76rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase}.accordion summary:after{content:'+';font:1.2rem var(--display)}.accordion details[open] summary:after{transform:rotate(45deg)}.accordion .panel{padding-top:12px;color:var(--ink-soft);font-size:.84rem}.accordion .panel p{margin:0}.accordion ul{margin:0;padding-left:20px}.related{background:var(--bg-soft)}.session-state{margin:18px 0;padding:14px 18px;border-radius:var(--round);background:var(--bg-soft);color:var(--ink-soft);font-size:.82rem}.session-state.open{background:var(--primary);color:var(--bg)}.session-state.open strong{color:var(--gold)}.session-state.closed{border:1px solid var(--line)}.session-state .rate{font:600 1.4rem var(--display);color:var(--ink)}.session-state.open .rate{color:var(--gold)}
.cart-link.active,.cart-link[aria-current="page"]{background:var(--accent);color:#fff}
/* Pulse on landing — set by ceremony.js when the flying chip arrives.
   The shadow lifts and the gold brightens for one beat, then settles. */
.cart-link[data-pulse="true"] {
  animation: cart-pulse 720ms var(--ease-out-expo);
}
@keyframes cart-pulse {
  0%   { box-shadow: 0 0 0 0 rgba(201, 169, 97, .65); transform: scale(1); }
  40%  { box-shadow: 0 0 0 8px rgba(201, 169, 97, 0); transform: scale(1.04); }
  100% { box-shadow: 0 0 0 0 rgba(201, 169, 97, 0); transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
  .cart-link[data-pulse="true"] { animation: none; }
}
@media(max-width:1050px){.hero{min-height:520px}.product-grid{grid-template-columns:repeat(2,1fr)}.product-grid.cols-3{grid-template-columns:repeat(3,1fr)}.pdp-layout{gap:40px}.shop-content{grid-template-columns:1fr}.shop-sidebar{display:flex;gap:20px}.shop-sidebar details{flex:1}.shop-sidebar label{display:none}.shop-sidebar summary{list-style:none}.shop-sidebar summary::-webkit-details-marker{display:none}.shop-sidebar details[open] label{display:flex}.cart-summary{position:static}}
@media(max-width:720px){.site-header{padding:12px 12px 0}.header-inner{grid-template-columns:1fr auto;min-height:60px;padding:0 14px}.header-nav{display:none}.header-actions{gap:10px;font-size:.65rem}.cart-link{margin:-1px -14px -1px 0;padding:21px 14px}.brand{font-size:1.7rem;justify-self:start}.brand-mark{width:29px;height:29px;font-size:1rem}.hero{display:flex;flex-direction:column;align-items:stretch;gap:32px;min-height:0;padding:64px 24px}.hero-copy{padding:0}.hero-copy h1{font-size:4rem}.hero-art{aspect-ratio:1/1}.trust-row{grid-template-columns:1fr 1fr}.trust-row p{padding:8px 0;border:0;font-size:.62rem}.trust-row strong{font-size:1.2rem}.section,.section-tight{padding-top:64px;padding-bottom:64px}.section-heading{display:block;margin-bottom:32px}.section-heading .text-link{margin-top:18px}.product-grid,.product-grid.cols-3{grid-template-columns:1fr 1fr;gap:25px 14px}.product-card .body{padding-top:12px}.product-card h3{font-size:1.3rem}.origin{font-size:.82rem}.price{font-size:1.1rem}.category-grid{grid-template-columns:1fr;gap:14px}.category-card{aspect-ratio:1.5/1}.category-card strong{font-size:1.7rem}.story{display:flex;flex-direction:column}.story-copy{max-width:none}.footer-grid{grid-template-columns:1fr 1fr;gap:32px 20px}.footer-brand{grid-column:1/-1}.footer-bottom{display:block;margin-top:32px}.footer-bottom span{display:block;margin-bottom:8px}.shop-toolbar{align-items:flex-start;flex-direction:column;gap:16px}.shop-toolbar,.filter-controls,.sort-control{width:100%;flex-wrap:wrap}.sort-control{justify-content:space-between}.shop-content{margin-top:25px}.shop-sidebar{display:block}.shop-sidebar details{display:block}.page-hero{padding:58px 24px 42px}.page-hero h1{font-size:4rem}.breadcrumb{padding-top:17px}.pdp-layout{display:flex;flex-direction:column;gap:25px;padding-top:25px}.pdp-info{padding-top:0}.pdp-info h1{font-size:3.4rem}.pdp-thumbs{display:none}.gallery-dots{display:flex;justify-content:center;gap:7px;margin-top:13px}.gallery-dots span{width:7px;height:7px;border:1px solid var(--primary);border-radius:50%}.gallery-dots span.active{background:var(--primary)}.pdp-perks{grid-template-columns:1fr 1fr}.qty-cart{flex-wrap:wrap}.qty-control{flex:0 0 auto}.btn-add-cart[disabled]{min-height:48px}.pdp-price>span{font-size:2.2rem}.newsletter-form{border-radius:8px;flex-direction:column;padding:6px}.newsletter-form button{width:100%}.cart-layout{padding-top:25px}.cart-summary{padding:18px}}
.cart-layout{max-width:var(--max);margin:auto;padding:42px 24px var(--s9);display:grid;grid-template-columns:minmax(0,1fr)}.cart-layout>.cart-grid,.cart-layout>.cart-empty,.cart-layout>.cart-error{grid-column:1/-1}.cart-grid{display:grid;grid-template-columns:1fr;gap:48px;align-items:start}.cart-lines{min-width:0}.cart-summary{position:sticky;top:96px;padding:28px;background:var(--card);border:1px solid var(--line);border-radius:var(--round)}.cart-summary h3{margin:0 0 16px;font:600 .78rem var(--body);color:var(--ink);letter-spacing:.12em;text-transform:uppercase}.cart-empty{max-width:var(--narrow);margin:0 auto;padding:36px 28px;background:var(--card);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--round);text-align:center}.cart-empty h2{margin:0 0 var(--s3)}.cart-empty p{margin:0 0 var(--s5);max-width:420px;margin-left:auto;margin-right:auto}
.cart-error{margin:20px 0;padding:14px 18px;background:var(--card);border:1px solid var(--accent);border-radius:var(--round);color:var(--accent-dark)}.cart-error strong{display:block;margin-bottom:4px;font:600 .82rem var(--body);letter-spacing:.08em;text-transform:uppercase}.cart-error p{margin:0;font:500 .84rem var(--body);color:var(--ink-soft);overflow-wrap:anywhere}
.cart-table{width:100%;border-collapse:collapse;font-size:.92rem}.cart-table th,.cart-table td{padding:24px 18px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle}.cart-table thead th{color:var(--ink);font:600 .72rem var(--body);letter-spacing:.12em;text-transform:uppercase}.cart-table tbody td:nth-child(1){text-align:left}.cart-table tbody td:nth-child(2),.cart-table tbody td:nth-child(3),.cart-table tbody td:nth-child(5){text-align:center}.cart-table tbody td:nth-child(4){text-align:right}.cart-table tbody tr{min-height:110px}.cart-table .tea-name{display:flex;flex-direction:column;align-items:flex-start;min-width:0}.cart-table .tea-name strong{font:600 1.05rem var(--display);color:var(--ink)}.cart-table .tea-name small{color:var(--muted);font-size:.74rem;letter-spacing:.08em;text-transform:uppercase}.cart-table .line-subtotal{font:600 1.05rem var(--display);white-space:nowrap}.cart-table .line-rate{font:600 .95rem var(--display);color:var(--ink-soft);white-space:nowrap}.cart-table .line-qty{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:var(--pill);overflow:hidden}.cart-table .line-qty button{width:38px;height:38px;color:var(--ink);font-size:1rem}.cart-table .line-qty .qty-value{display:inline-flex;align-items:center;justify-content:center;min-width:48px;height:38px;color:var(--ink);font:600 .92rem var(--body);user-select:none}.cart-table .line-remove button{color:var(--muted);font:600 .72rem var(--body);letter-spacing:.1em;text-transform:uppercase;padding:6px 10px;border-radius:var(--pill)}.cart-table .line-remove button:hover{background:var(--bg-soft);color:var(--accent)}
@media(max-width:720px){.cart-table th,.cart-table td{padding:14px 10px;font-size:.86rem}.cart-table .line-rate{display:none}.cart-table .tea-name strong{font-size:.95rem}.cart-table .tea-name small{font-size:.66rem}.cart-table .line-subtotal{font-size:.95rem}}
/* Success/failure page summary — aligned with the .cart-summary pattern
   but used outside the cart flow. */
.success-ids{list-style:none;margin:0 0 18px;padding:12px 14px;background:var(--bg-soft);border-radius:var(--round);max-height:220px;overflow:auto}.success-ids li{padding:4px 0;border-bottom:1px solid var(--line-soft)}.success-ids li:last-child{border-bottom:0}.success-ids code{font:500 .82rem ui-monospace,"SFMono-Regular",Menlo,monospace;color:var(--ink-soft);overflow-wrap:anywhere}
.success-actions{display:flex;align-items:center;justify-content:space-between;gap:18px}.success-actions .text-link{margin-left:auto}
/* Admin form error/success messages — used by open-session, close-session,
   and admin login routes. Ember-tinted paper surface, never cool-red. */
.form-error{margin:8px 0 0;padding:10px 14px;border-radius:var(--round);background:var(--card);color:var(--accent-dark);font-size:.86rem;border:1px solid var(--accent)}
.form-success{margin:8px 0 0;padding:10px 14px;border-radius:var(--round);background:var(--primary);color:var(--bg);font-size:.9rem}
.form-success a{color:var(--gold);text-decoration:underline}

/* ----------------------------------------------------------------------
   Motion layer.
   The home hero is the only authored entrance — one rehearsed sequence
   that explains the editorial sanctuary voice as the page lands. Every
   other surface keeps its own routine transitions unchanged. All motion
   uses opacity + transform (no layout-thrashing properties) and respects
   prefers-reduced-motion.
   ---------------------------------------------------------------------- */

/* Editorial sanctuary entrance — the focal moment.
   Eyebrow rises from the baseline, headline follows, body line settles,
   CTA anchors, the art card breathes in from the right, and the harvest
   note rises last. Capped total run: ~1.2s. */
@keyframes sanctuary-rise {
  from { opacity: 0; transform: translate3d(0, 18px, 0); }
  to   { opacity: 1; transform: translate3d(0,    0, 0); }
}
@keyframes sanctuary-art {
  from { opacity: 0; transform: translate3d(28px, 0, 0) scale(.985); }
  to   { opacity: 1; transform: translate3d(0,    0, 0) scale(1); }
}
.hero .hero-copy > * {
  opacity: 0;
  animation: sanctuary-rise var(--t-focal) var(--ease-out-expo) forwards;
  animation-delay: 120ms;
}
.hero .hero-copy .eyebrow { animation-delay: 80ms; }
.hero .hero-copy h1       { animation-delay: 180ms; }
.hero .hero-copy p        { animation-delay: 320ms; }
.hero .hero-copy .btn     { animation-delay: 460ms; }
.hero .hero-art {
  opacity: 0;
  animation: sanctuary-art var(--t-focal) var(--ease-out-expo) forwards;
  animation-delay: 240ms;
}

/* Supporting feedback (state changes that need acknowledgment).
   Pill buttons gain a small lift so a press registers as pressure.
   Variant pills and pagination rings shift color smoothly.
   Accordion chevron uses the published tempo (was instant). */
.btn { transition: background var(--t-base) var(--ease-out-expo), color var(--t-base) var(--ease-out-expo), transform var(--t-quick) var(--ease-out-expo), box-shadow var(--t-base) var(--ease-out-expo); }
.btn:hover { transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
.variant-pills button,
.status-badge,
.pagination a { transition: background var(--t-base) var(--ease-out-expo), color var(--t-base) var(--ease-out-expo), border-color var(--t-base) var(--ease-out-expo); }
.accordion summary:after { transition: transform var(--t-base) var(--ease-out-expo); }

/* Tin-checked: cart-link, primary nav, footer links — already had a
   transition; swap it for the authored timing. */
.cart-link,
a { transition: color var(--t-base) var(--ease-out-expo), background var(--t-base) var(--ease-out-expo), border-color var(--t-base) var(--ease-out-expo); }

/* Respect the user's preference. No rehearsed entrance, no hover lift —
   the static layout is already correct. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-delay: 0ms !important;
    transition-duration: .001ms !important;
  }
  .hero .hero-copy > *,
  .hero .hero-art { opacity: 1; transform: none; }
  .btn:hover { transform: none; }
}

/* ----------------------------------------------------------------------
   View Transitions — the order funnel ceremony.
   The cart hands off to checkout, checkout hands off to success, and
   success hands off to home via document.startViewTransition + matching
   view-transition-name selectors. The choreography is warm-paper:
   crossfades and slow morphs, never aggressive slide-ins. Browsers
   without view-transition support get a clean instant cut with the
   same ambient visual state.
   ---------------------------------------------------------------------- */

/* Map a `data-vt-key="..."` attribute to a matching view-transition-name
   so JS can mark elements without inlining styles. Used by the cart,
   checkout, and success pages during the order-funnel ceremony. */
[data-vt-key] { view-transition-name: attr(data-vt-key); }

/* Warm-paper fade for any pair of pages that hand off via startViewTransition */
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 320ms;
  animation-timing-function: var(--ease-out-expo);
}
::view-transition-old(root) {
  animation-name: vt-fade-out;
}
::view-transition-new(root) {
  animation-name: vt-fade-in;
}
@keyframes vt-fade-out {
  to { opacity: 0; }
}
@keyframes vt-fade-in {
  from { opacity: 0; }
}

/* The line that is moving from cart to checkout "lifts" while we move it.
   Without this, it would just be a clean crossfade — we want a barely-
   perceptible rise so the line reads as the same physical element. */
::view-transition-group(*) {
  animation-duration: 420ms;
  animation-timing-function: var(--ease-out-expo);
}

/* Targeted morphs. The shared name is set per page via JS; we use a
   small library of named groups here so each gets the same warm easing. */
::view-transition-old(line-rise),
::view-transition-new(line-rise) {
  animation-duration: 420ms;
  animation-timing-function: var(--ease-out-expo);
}
::view-transition-old(success-rise),
::view-transition-new(success-rise) {
  animation-duration: 500ms;
  animation-timing-function: var(--ease-out-expo);
}

/* Order summary — the cart subtotal morphs into the checkout subtotal.
   A subtle scale keeps the number readable as it travels. */
::view-transition-old(total-pill),
::view-transition-new(total-pill) {
  animation-duration: 460ms;
  animation-timing-function: var(--ease-out-expo);
}

/* The header cart-link — its count number morphs when an item is added.
   The pill shape and the gold tint carry through. */
::view-transition-old(cart-count-pill),
::view-transition-new(cart-count-pill) {
  animation-duration: 380ms;
  animation-timing-function: var(--ease-out-expo);
}

/* The flying image chip — a flying clone of the product image traveling
   to the header cart-link. Lives entirely on the source page (no
   navigation), so this is a plain CSS animation, not a view transition. */
@keyframes fly-to-cart {
  0% {
    transform: translate(0, 0) scale(1);
    opacity: 1;
    border-radius: var(--round);
  }
  60% {
    opacity: 1;
    border-radius: var(--round);
  }
  100% {
    /* End-state geometry is set inline by JS per product so the chip
       lands cleanly on the header cart-link regardless of source size. */
    transform: var(--fly-end);
    opacity: 0;
    border-radius: 50%;
  }
}
.fly-chip {
  position: fixed;
  z-index: 9999;
  pointer-events: none;
  background: var(--card);
  box-shadow: 0 18px 40px -22px rgba(31, 42, 36, .55),
              0 0 0 1px var(--line);
  object-fit: cover;
  animation: fly-to-cart 720ms var(--ease-out-expo) forwards;
  view-transition-name: fly-chip;
}
@media (prefers-reduced-motion: reduce) {
  .fly-chip { animation: none; display: none; }
}

/* Phase 10 — image fallback for admin-created teas that don't yet
   have an SVG uploaded. Rendered in place of the <img> on the product
   detail page and related-teas grid when tea.image is empty. */
.image-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  background:
    repeating-linear-gradient(
      135deg,
      var(--bg-soft) 0 12px,
      var(--card) 12px 24px
    );
  color: var(--muted);
  font: 600 0.78rem var(--body);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  border-radius: var(--round);
}
.image-placeholder.small {
  font-size: 0.62rem;
  letter-spacing: 0.08em;
}