.gift-dialog{color-scheme:dark;background:#14252b;color:#f9f6ec;border:1px solid #ffffff30;border-radius:22px;padding:32px;width:min(720px,calc(100vw - 24px));max-height:88dvh;font-family:'Bricolage Grotesque',system-ui,sans-serif;line-height:1.5}.gift-dialog::backdrop{background:#061215b8;backdrop-filter:blur(5px)}.gift-dialog h2{font-size:28px;font-weight:500;line-height:1.15;margin:8px 44px 18px 0;outline:none}.gift-dialog button,.gift-button{font:inherit;cursor:pointer;min-height:44px;padding:9px 15px;border:1px solid #ffffff35;border-radius:10px;background:#ffffff0c;color:inherit;text-decoration:none;display:inline-flex;align-items:center;justify-content:center}.gift-dialog button:disabled{opacity:.45;cursor:default}.gift-dialog .gift-close{position:sticky;float:right;top:0;margin:-12px -12px 0 0;font-size:26px;min-width:44px;padding:0}.gift-kicker{font-size:11px;text-transform:uppercase;letter-spacing:.13em;color:#c9c3b4;margin:12px 0 0}.gift-intro,.gift-fine{font-size:14px;color:#c5cdca}.gift-fine{font-size:12px}.gift-dialog .gift-primary{background:#efd497;color:#17272b;border-color:#efd497;font-weight:600}.gift-dialog label{display:block;margin:18px 0;font-size:14px}.gift-dialog input,.gift-dialog textarea{display:block;box-sizing:border-box;font:inherit;color:inherit;background:#0c1b21;border:1px solid #ffffff55;border-radius:8px;padding:10px;margin-top:8px;width:100%}.gift-dialog input[type=number]{width:110px}.gift-value{font-size:30px}.gift-actions{display:flex;gap:10px;flex-wrap:wrap}.gift-optional{color:#aeb8b4}.gift-feedback{font-size:14px;color:#efd497}.gift-honoree{color:#efd497}.gift-list{list-style:none;padding:0;margin:24px 0}.gift-list li{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:15px;align-items:center;padding:18px 0;border-top:1px solid #ffffff22}.gift-list strong,.gift-room strong{display:block;font-size:15px;font-weight:500}.gift-list small{display:block;font-size:12px;color:#bfc9c7}.gift-list .gift-price{font-size:15px;text-align:right;white-space:nowrap}.gift-room{padding:18px;background:#ffffff08;border-radius:14px;display:flex;gap:18px;justify-content:space-between;align-items:center}.gift-room span{font-size:14px;display:block;margin-top:6px}.gift-dialog .gift-back{padding:0;border:0;background:none;font-size:13px;color:#c5cdca}.gift-dialog :focus-visible{outline:3px solid #efd497;outline-offset:3px}
@media(max-width:540px){.gift-dialog{padding:22px 18px}.gift-list li{grid-template-columns:minmax(0,1fr) auto;gap:8px}.gift-list li>button{grid-column:2}.gift-list li>div:first-child{grid-row:span 2}.gift-dialog h2{font-size:23px}.gift-room{padding:12px;gap:8px}.gift-room button{font-size:13px}}
.gift-button{gap:8px}.gift-button [data-cart-count]{padding:0 6px;border-radius:12px;background:#efd497;color:#17272b}
/* Shared gift and panoramic-tour presentation, aligned with the school website. */
.gift-dialog{color-scheme:light;background:#fff;color:#042339;border:1px solid #d9dfe2;border-top:5px solid #BC9E5D;border-radius:4px;font-family:Inter,Arial,sans-serif;box-shadow:0 24px 90px #04233940}
.gift-dialog::backdrop{background:#042339b8}
.gift-dialog h2{font-family:"PP Fragment Serif",Georgia,serif;font-weight:400;font-size:34px}
.gift-dialog button,.gift-button{border-color:#b6c1c9;border-radius:2px;background:#fff;color:#042339}
.gift-dialog button:hover{background:#f3f1eb}.gift-dialog .gift-primary{background:#BC9E5D;border-color:#BC9E5D;color:#042339}.gift-dialog .gift-primary:hover{background:#d3bc8e}
.gift-kicker{color:#796333;letter-spacing:.12em}.gift-intro,.gift-fine,.gift-optional,.gift-list small,.gift-dialog .gift-back{color:#526475}
.gift-dialog input,.gift-dialog textarea{color:#042339;background:#fff;border-color:#8b9ca9;border-radius:2px}
.gift-feedback,.gift-honoree{color:#796333}.gift-list li{border-color:#dce2e6}.gift-room{background:#f4f2ed;border-radius:2px}.gift-value{font-family:"PP Fragment Serif",Georgia,serif;font-weight:400}
.gift-dialog :focus-visible{outline-color:#042339}.gift-button [data-cart-count]{background:#BC9E5D;color:#042339}
/* The card of a dedicated piece (gift-ui.js; the dedication marker's step 1, SW74), in the tour and the walk alike: each
   dedication on the school's paper with a gold rule, in the serif, with its pieces, under the flame of the school's crest;
   a line partly dedicated shows the same above its gift form. */
.gift-plaque{margin:18px 0 8px;padding:15px 18px 17px;background:#F7F5F0;border-left:3px solid #BC9E5D;box-shadow:inset 0 0 0 1px rgba(188,158,93,.3)}
.gift-plaque-kicker{display:flex;align-items:center;gap:8px;margin:0;font-size:11px;font-weight:600;line-height:1.2;letter-spacing:.14em;text-transform:uppercase;color:#796333}
.gift-plaque-kicker i{flex:none;width:8px;height:11.7px;background:#BC9E5D;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='18.3 -.2 14 20.4'%3E%3Cpath d='M20.036 16.086c1.027 1.192 3.152 2.937 4.359 3.9l.338-.087 3.08-.768c.209-.345.417-.675.625-1.012.804-.704 1.587-1.437 2.104-2.033.948-.998 1.508-2.27 1.508-3.662.022-1.516-.775-3.397-1.364-5.235-.086-.266-2.04 1.716-2.808 3.339-.158.337-.266.653-.294.933-.08.762.114 1.68.258 2.241.029.108-.014.13-.093.036-.747-.862-1.034-1.602-1.049-2.277-.014-.524.137-1.005.36-1.479.631-1.336 1.86-2.578 1.716-4.309-.008-4.194-2.995-5.68-3.965-5.68 1.092 5.178-6.362 7.066-6.29 12.423 0 1.386.567 2.665 1.508 3.663'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='18.3 -.2 14 20.4'%3E%3Cpath d='M20.036 16.086c1.027 1.192 3.152 2.937 4.359 3.9l.338-.087 3.08-.768c.209-.345.417-.675.625-1.012.804-.704 1.587-1.437 2.104-2.033.948-.998 1.508-2.27 1.508-3.662.022-1.516-.775-3.397-1.364-5.235-.086-.266-2.04 1.716-2.808 3.339-.158.337-.266.653-.294.933-.08.762.114 1.68.258 2.241.029.108-.014.13-.093.036-.747-.862-1.034-1.602-1.049-2.277-.014-.524.137-1.005.36-1.479.631-1.336 1.86-2.578 1.716-4.309-.008-4.194-2.995-5.68-3.965-5.68 1.092 5.178-6.362 7.066-6.29 12.423 0 1.386.567 2.665 1.508 3.663'/%3E%3C/svg%3E") center/contain no-repeat}
.gift-dialog .gift-plaque-text{margin:9px 0 0;font-family:"PP Fragment Serif",Georgia,serif;font-size:21px;font-weight:400;line-height:1.3;color:#042339}
.gift-plaque-row+.gift-plaque-row{margin-top:12px;padding-top:3px;border-top:1px solid rgba(188,158,93,.28)}
.gift-plaque-pieces{margin:4px 0 0;font-size:12.5px;line-height:1.35;color:#526475}
@media(max-width:540px){.gift-dialog .gift-plaque-text{font-size:19px}}
/* Beside the quantity (gift-ui.js): how many are available, "Quantity · 17 of 18 available" on one line, the pieces in
   the cart's table gifts under it, and "Sponsor all 17": one tap takes every piece still open. */
.gift-qty{display:flex;align-items:flex-end;flex-wrap:wrap;gap:10px 12px;margin:18px 0}
/* the label is as wide as its field (the number field's 110px above), so the button sits beside the field; the caption
   runs on, unbroken, over the space above the button */
.gift-dialog .gift-qty label{margin:0;width:110px;white-space:nowrap}
.gift-left{white-space:nowrap}
.gift-dialog .gift-all{min-height:44px;padding:9px 14px;font-size:14px;font-weight:500;white-space:nowrap}
.gift-dialog .gift-left-solo{margin:18px 0;font-size:14px}
.gift-dialog .gift-qty+.gift-qty-tables{margin-top:-8px}
.gift-list small.gift-part{color:#796333}
/* These elements exist only on the panoramic tour. */
body:has(#panorama){font-family:Inter,Arial,sans-serif;background:#042339}
.panel{background:rgba(4,35,57,.93);border-color:#ffffff33;border-radius:3px}

#places{color-scheme:light;background:#fff;color:#042339;border:1px solid #d9dfe2;border-top:5px solid #BC9E5D;border-radius:4px;font-family:Inter,Arial,sans-serif}
#places::backdrop{background:#042339b8}.dialog-head h2{font-family:"PP Fragment Serif",Georgia,serif;font-size:32px;font-weight:400}
#place-list button{background:#f7f6f2;border-color:#dce2e6;border-radius:2px;color:#042339}
#place-list button:hover,#place-list button[aria-current=true]{background:#ede5d5;border-color:#BC9E5D}
#place-list small{opacity:1;color:#526475}
#places :focus-visible{outline-color:#042339}
@media(max-width:700px){.gift-dialog h2{font-size:28px}}
@media(max-width:800px){.gift-dialog input,.gift-dialog textarea{font-size:16px}}
/* PROPOSED: placeholder only so the moved walk link is readable inside the light places dialog; visual treatment is Root's call. */
#places .walk-note{margin:18px 0 0;font-size:13px}#places .walk-note a{text-decoration:underline}
/* Gifts already chosen: marked in the room list, removable in place (no trip to checkout) */
.gift-choice{display:flex;flex-direction:column;align-items:stretch;gap:4px}
.gift-dialog .gift-remove{min-height:36px;padding:4px 10px;border:0;background:none;color:#526475;font-size:13px;text-decoration:underline;text-underline-offset:3px}
.gift-dialog .gift-remove:hover{background:none;color:#042339}
.gift-in-cart{display:block;margin-top:6px;font-size:12px;font-weight:600;letter-spacing:.02em;color:#796333}
.gift-list li.is-selected{box-shadow:inset 3px 0 0 #BC9E5D;padding-left:14px}
.gift-room.is-selected{box-shadow:inset 3px 0 0 #BC9E5D}
.gift-room small.gift-fine{display:block;margin-top:6px}
.gift-actions .gift-remove{align-self:center}
@media(max-width:540px){.gift-list li>.gift-choice{grid-column:2}}
.gift-room .gift-choice button{white-space:nowrap}
/* Pictures of the pieces: our own model renders on the school's paper. Only a row that has one changes (a small
   picture leads it); every other row keeps its plain layout. Each box is sized before its file arrives. */
.gift-thumb,.gift-picture{display:block;background:#F7F5F0;object-fit:cover}
.gift-list li.has-picture{grid-template-columns:72px minmax(0,1fr) auto auto;grid-template-areas:"pic text price choice"}
.gift-list li.has-picture>.gift-thumb{grid-area:pic;width:72px;height:54px}
.gift-list li.has-picture>.gift-thumb+div{grid-area:text}
.gift-list li.has-picture>.gift-price{grid-area:price}
.gift-list li.has-picture>.gift-choice{grid-area:choice}
.gift-picture{width:100%;max-width:480px;height:auto;aspect-ratio:4/3;margin:8px 0 0}
/* Phones: the picture beside the name and details; under 375 px it sits above them, so the name keeps its width. */
@media(max-width:540px){.gift-list li.has-picture{grid-template-columns:64px minmax(0,1fr) auto;grid-template-areas:"pic text price" "pic text choice"}.gift-list li.has-picture>.gift-thumb{width:64px;height:48px}}
@media(max-width:374px){.gift-list li.has-picture{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"pic pic" "text price" "text choice"}.gift-list li.has-picture>.gift-thumb{align-self:start}}
/* Whole tables and displays (data/item-sets.json): pieces that stand together as one, listed once between the room gift
   and the pieces. A piece's own view shows its table with the piece highlighted and offers the whole table as the
   second choice: prominent (gold outline) but clearly after the gold "Add to cart". */
.gift-group{font-size:11px;font-weight:600;line-height:1.4;text-transform:uppercase;letter-spacing:.12em;color:#796333;margin:28px 0 0}
.gift-tables>.gift-fine{margin:6px 0 0}
.gift-sets{list-style:none;padding:0;margin:12px 0 0}
.gift-sets li{display:grid;grid-template-columns:minmax(0,1fr) auto auto;grid-template-areas:"text price choice";gap:15px;align-items:center;padding:18px 0;border-top:1px solid #dce2e6}
.gift-sets strong{display:block;font-size:15px;font-weight:500}
.gift-sets small{display:block;font-size:12px;color:#526475}
.gift-sets .gift-price{font-size:15px;text-align:right;white-space:nowrap}
.gift-sets li.is-selected{box-shadow:inset 3px 0 0 #BC9E5D;padding-left:14px}
.gift-sets li.has-picture{grid-template-columns:72px minmax(0,1fr) auto auto;grid-template-areas:"pic text price choice"}
.gift-sets li>.gift-thumb{grid-area:pic;width:72px;height:54px}
.gift-sets li>.gift-text{grid-area:text}
.gift-sets li>.gift-price{grid-area:price}
.gift-sets li>.gift-choice{grid-area:choice}
.gift-group+.gift-list{margin-top:12px}
.gift-badge{display:inline-block;padding:6px 10px;border:1px solid #d9c9a0;border-radius:2px;background:#f7f1e3;color:#796333;font-size:12px;font-weight:600;letter-spacing:.02em;white-space:nowrap}
.gift-set-note{margin:14px 0 0;padding:2px 0 2px 12px;border-left:3px solid #BC9E5D;font-size:14px;line-height:1.45;color:#042339}
.gift-dialog .gift-set-action{border:2px solid #BC9E5D;background:#fff;color:#042339;font-weight:600;max-width:100%;white-space:normal;text-align:center}
.gift-dialog .gift-set-action:hover{background:#f6f0e2}
.gift-set-status{color:#796333}
.gift-pieces{list-style:none;padding:0;margin:14px 0 0;font-size:14px}
.gift-pieces li{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-top:1px solid #e6ebee}
.gift-pieces li:last-child{border-bottom:1px solid #e6ebee}
.gift-pieces .gift-each{color:#526475;white-space:nowrap}
/* Phones: a table's name takes the row's width, its price and button sit below it; the piece breakdown waits for the
   table's own view. Under 375 px the picture leads the row. Both buttons of a piece of a table take the full width. */
@media(max-width:540px){.gift-sets li{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"text text" "price choice";gap:8px 12px}
 .gift-sets li.has-picture{grid-template-columns:64px minmax(0,1fr) auto;grid-template-areas:"pic text text" "pic price choice"}.gift-sets li>.gift-thumb{width:64px;height:48px;align-self:start}
 .gift-sets .gift-price{text-align:left}.gift-sets .gift-set-pieces{display:none}
 .gift-actions:has(.gift-set-action) .gift-primary,.gift-actions .gift-set-action{flex:1 1 100%}}
@media(max-width:374px){.gift-sets li.has-picture{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"pic pic" "text text" "price choice"}}
/* The room list (the gift-list patch, SW75): each row adds to your gifts where it stands. A row: its picture, its name (a
   button: it opens the card), its count line (which its status takes the place of) and its price; under them its controls:
   "Dedicate" (the gold rim, as every "take this" in the list), "All 18 · $2,448", once it is in your gifts − n + and "✓ All
   18", and at the row's right end "Remove", where no add button ever sits. A chosen row is marked by a gold rule in the
   margin, so nothing in it moves. A line or table already dedicated shows the seal's words ("Already dedicated"), not a
   button. At the foot, from the start, the bar: the last change and its Undo, that nothing is sent yet, one dedication for this
   room's gifts and "Review your gifts". 44 px to tap everywhere; nothing moves (no animation or transition), so reduced motion
   needs nothing more; nothing is wider than a 320 px phone. */
/* The panel's scroll padding keeps what the browser brings into view above the bar. None at the top: the close button sits
   there, stuck, and WebKit, asked to bring it into view inside a top padding, scrolls the whole list back to its start. */
.gift-dialog{--gift-pad-x:32px;--gift-pad-b:32px;--gift-pad-t:32px;overflow-anchor:none;scroll-padding-bottom:calc(var(--gift-bar-h,0px) + 8px)}
@media(max-width:540px){.gift-dialog{--gift-pad-x:18px;--gift-pad-b:22px;--gift-pad-t:22px}}
/* (12 px between a row's words and its controls: a one-line name's 44 px tap band fits in it) */
.gift-list li,.gift-sets li{position:relative;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"text price" "do do";gap:12px 15px;align-items:start;padding:16px 0}
.gift-list li.has-picture,.gift-sets li.has-picture{grid-template-columns:72px minmax(0,1fr) auto;grid-template-areas:"pic text price" "pic do do"}
.gift-list li>div.gift-text,.gift-sets li>div.gift-text{grid-area:text;min-width:0}
.gift-list li>div.gift-price,.gift-sets li>div.gift-price{grid-area:price;padding-top:1px}
.gift-list li>div.gift-do,.gift-sets li>div.gift-do{grid-area:do}
.gift-list li>img.gift-thumb,.gift-sets li>img.gift-thumb{grid-area:pic;align-self:start}
/* chosen: the gold rule in the margin; no indent, so the row's controls stay where they were */
.gift-list li.is-selected,.gift-sets li.is-selected{padding-left:0;box-shadow:none}
.gift-list li.is-selected::before,.gift-sets li.is-selected::before{content:"";position:absolute;left:calc(-1 * var(--gift-pad-x) + 7px);top:14px;bottom:14px;width:3px;border-radius:2px;background:#BC9E5D}
.gift-dialog .gift-name{position:relative;display:block;min-height:0;max-width:100%;margin:0;padding:0;border:0;border-radius:0;background:none;color:#042339;font-size:15px;font-weight:500;line-height:1.35;text-align:left;
  text-decoration:underline;text-decoration-color:rgba(188,158,93,.6);text-decoration-thickness:1px;text-underline-offset:4px}
.gift-dialog .gift-name:hover{background:none;text-decoration-color:#042339}
/* (the tap band reaches 12 px above and below the words, not beyond their ends: nothing overflows a name sideways) */
.gift-dialog .gift-name::after{content:"";position:absolute;inset:-12px 0}
.gift-dialog .gift-name strong{display:inline;font:inherit}
.gift-list small.gift-meta,.gift-sets small{margin-top:2px}
.gift-dialog .gift-in-cart{margin-top:2px}
.gift-in-cart.is-held{color:#6a5528}
.gift-dialog .gift-in-cart.is-if{color:#526475;font-weight:400;letter-spacing:0}
.gift-do{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;min-width:0}
.gift-list li>div.gift-do[hidden],.gift-sets li>div.gift-do[hidden]{display:none}
.gift-dialog .gift-add{border:2px solid #BC9E5D;padding:8px 16px;font-weight:600;white-space:nowrap}
.gift-dialog .gift-add:hover{background:#f6f0e2}
/* "Dedicate 1" is as wide and as tall as the − n + that takes its place once the piece is in your gifts, so "All" does not
   move */
.gift-dialog .gift-add-many{box-sizing:border-box;min-width:142px;min-height:46px}
.gift-dialog .gift-add-all{padding:9px 14px;white-space:normal;text-align:left;line-height:1.25}
.gift-dialog .gift-add-all.is-done{border-color:#d9c9a0;background:#f7f1e3;color:#6a5528;font-weight:600;cursor:default}
.gift-step{display:inline-flex;align-items:stretch;border:1px solid #8b9ca9;border-radius:2px;background:#fff}
.gift-dialog .gift-step button{min-width:44px;padding:0;border:0;border-radius:0;background:#fff;font-size:20px;line-height:1}
.gift-dialog .gift-step button:hover{background:#f3f1eb}
.gift-dialog .gift-step button[aria-disabled=true]{color:#b6c1c9;cursor:default;background:#fff}
.gift-dialog .gift-step input{width:52px;min-height:44px;margin:0;padding:0 4px;border:0;border-left:1px solid #dce2e6;border-right:1px solid #dce2e6;border-radius:0;text-align:center;font-size:16px;-moz-appearance:textfield;appearance:textfield}
.gift-step input::-webkit-outer-spin-button,.gift-step input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.gift-dialog .gift-do .gift-remove{min-height:44px}
.gift-dialog .gift-remove-end{margin-left:auto}
.gift-dialog .gift-sealed{min-height:44px;margin:0}
/* the name's tap band (::after, 12 px round it) must not take the taps of the controls under it: those stack above it; the
   band at the top and its close button stay above the rows while they scroll under them */
.gift-dialog .gift-do>*{position:relative;z-index:1}
.gift-dialog .gift-close{z-index:3}
.gift-band{position:sticky;top:0;z-index:2;height:0;margin:0 calc(-1 * var(--gift-pad-x));pointer-events:none}
.gift-band::before{content:"";position:absolute;left:0;right:0;top:calc(-1 * var(--gift-pad-t));height:calc(var(--gift-pad-t) + 52px);background:#fff;border-bottom:1px solid #dce2e6;box-shadow:0 6px 14px rgba(4,35,57,.06);visibility:hidden}
.gift-dialog.is-scrolled .gift-band::before{visibility:visible;pointer-events:auto}
/* For 600 ms after a change the bar's controls take no tap (a double tap finds nothing); after one that moved controls, nor
   does that row; the whole list, when it moved or has just been shown. The tap then falls on the row or the bar itself, never
   through to a row under the bar or to the panel's edge (which would close it). */
.gift-dialog li.is-settling>*,.gift-dialog .gift-room.is-settling>*,.gift-dialog.is-settling .gift-bar>*,
.gift-dialog.is-settling-all .gift-list li>*,.gift-dialog.is-settling-all .gift-sets li>*,.gift-dialog.is-settling-all .gift-room>*{pointer-events:none}
/* Any view just shown takes no tap for 600 ms, as the list does (and its edge closes nothing then): a double tap, even a slow
   one, that opened a card never presses its button. The close button always works. */
.gift-dialog.is-arriving>:not(.gift-close):not(.gift-band){pointer-events:none}
/* The whole room: its name, its price and the owner's "Sponsor the whole room" (the room card); once in your gifts, "Remove". */
.gift-room{align-items:flex-start}
.gift-room>.gift-text{min-width:0}
.gift-dialog .gift-room .gift-name{font-size:15px}
.gift-room>.gift-do{flex:0 0 auto;justify-content:flex-end}
/* The card's quantity (the seal's "Quantity · 15 of 18 available" above it): − n + beside "All 15". */
.gift-dialog .gift-qty{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px}
.gift-dialog .gift-qty label{flex:1 0 100%;width:auto;margin:0;white-space:normal}
.gift-dialog .gift-qty .gift-step input{width:64px}
/* The bar, at the foot of the list (the dialog's own padding is its margin): the last change and its Undo (or this room's
   total), that nothing is sent yet, and its two buttons; on a computer the words left and the buttons right, on a phone one
   above the other, never cut short. */
.gift-bar{position:sticky;bottom:calc(-1 * var(--gift-pad-b));z-index:2;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"say do" "note do";align-items:center;gap:2px 16px;
  margin:24px calc(-1 * var(--gift-pad-x)) calc(-1 * var(--gift-pad-b));padding:12px var(--gift-pad-x);background:#fff;border-top:1px solid #dce2e6;box-shadow:0 -10px 24px rgba(4,35,57,.08)}
.gift-bar-say{grid-area:say;display:flex;flex-wrap:wrap;align-items:baseline;gap:0 12px;min-width:0}
.gift-bar-text{margin:0;font-size:13.5px;line-height:1.4;color:#042339}
.gift-bar-text.is-notice{color:#6a5528;font-weight:600}
.gift-bar-text.is-error{color:#8a2a2a}
.gift-dialog .gift-undo{position:relative;min-height:0;min-width:44px;padding:0 4px;border:0;background:none;color:#042339;font-size:13.5px;font-weight:600;text-decoration:underline;text-underline-offset:3px}
.gift-dialog .gift-undo:hover{background:none;color:#796333}
.gift-dialog .gift-undo::after{content:"";position:absolute;inset:-13px 0}
.gift-bar-note{grid-area:note;margin:0;font-size:12.5px;line-height:1.4;color:#526475}
.gift-bar-do{grid-area:do;display:flex;gap:8px;min-width:0}
.gift-dialog .gift-bar-words{min-width:0;justify-content:flex-start;gap:8px;white-space:normal;text-align:left}
.gift-pen{flex:none;width:16px;height:16px;color:#796333}
.gift-bar-review{white-space:nowrap}
.gift-words-now{display:block;margin-top:2px;font-size:12.5px;color:#526475}
.gift-sr{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.gift-actions .gift-cancel{align-self:center}
@media(max-width:540px){
 .gift-list li,.gift-sets li{gap:12px 12px;padding:14px 0}
 .gift-list li.has-picture,.gift-sets li.has-picture{grid-template-columns:64px minmax(0,1fr) auto;grid-template-areas:"pic text price" "do do do"}
 .gift-list li>div.gift-text:first-child,.gift-sets li>div.gift-text:first-child{grid-area:text}
 .gift-sets .gift-price{text-align:right}
 .gift-detail{display:none}
 .gift-dialog .gift-step input{width:48px}.gift-dialog .gift-qty .gift-step input{width:56px}.gift-dialog .gift-add-many{min-width:138px}
 .gift-room{flex-wrap:wrap}.gift-room>.gift-do{flex:1 1 100%;justify-content:flex-start}
 .gift-bar{grid-template-columns:minmax(0,1fr);grid-template-areas:"say" "note" "do";gap:2px}
 .gift-bar-do{flex-direction:column;align-items:stretch;margin-top:8px}.gift-bar-do>*{width:100%}
 .gift-dialog .gift-bar button,.gift-dialog .gift-bar .gift-button{font-size:15px}}
@media(max-width:374px){.gift-list li.has-picture,.gift-sets li.has-picture{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"pic pic" "text price" "do do"}}
/* Phone fixes (the phone-fixes layer, 28 Sep 2026): the gift panel on small phones, in the tour and the walk alike. Only on
   phones (upright: max-width 480 px; on its side: 481-960 px wide and at most 520 px tall), so a computer and a tablet do not
   change. The room list (the panel with the bar) keeps its own design everywhere; these rules are for the cards: a piece, a whole
   table, the whole room, the dedication words. The panel's padding and --gift-pad-t/x/b stay equal (the band is placed from them).
   On its side (the owner: portrait and landscape): the card inside the notch and home-bar insets, compact, a 24 px title, 16 px
   fields (at 812-932 px iOS would zoom on a 15 px field); a card with a picture in two columns, the picture held at the left (the
   same render, whole, contained on the school's paper) and everything else at the right; and the card's buttons kept in view at
   its foot (a phone on its side is 320-430 px tall: the card's "Dedicate – $58" was two to three screens down).
   Upright: the card's buttons at its foot (below), the picture at most 30% of the screen's height (26% on a short screen).
   Everywhere on a phone: "Remove from your gifts" is a 44 px target. */
@media (min-width:481px) and (max-width:960px) and (max-height:520px){
 .gift-dialog:not(:has(.gift-bar)){--gift-pad-x:22px;--gift-pad-t:18px;--gift-pad-b:16px;padding:var(--gift-pad-t) var(--gift-pad-x) var(--gift-pad-b);
  --gd-w:min(720px,calc(100vw - 2 * max(12px,env(safe-area-inset-left,0px),env(safe-area-inset-right,0px))));width:var(--gd-w);
  max-height:calc(100vh - 12px - 2 * env(safe-area-inset-bottom,0px));max-height:calc(100dvh - 12px - 2 * env(safe-area-inset-bottom,0px))}
 .gift-dialog:not(:has(.gift-bar)) h2{font-size:24px;margin:4px 44px 10px 0}
 .gift-dialog:not(:has(.gift-bar)) .gift-value{font-size:26px;margin:8px 0}
 .gift-dialog input,.gift-dialog textarea{font-size:16px}
 /* a card with a picture: two columns (only while it is open: a display of its own would keep a closed dialog on the screen) */
 .gift-dialog[open]:not(:has(.gift-bar)):has(>.gift-picture){display:grid;grid-template-columns:minmax(0,40%) minmax(0,1fr);column-gap:20px;row-gap:0;align-content:start}
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>*{grid-column:2}
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-band{grid-column:1 / -1;grid-row:1}
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-back{grid-column:1;grid-row:1;justify-self:start}
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-close{grid-column:2;grid-row:1;justify-self:end;float:none;margin:-8px -12px 0 0}
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-picture{grid-column:1;grid-row:2 / span 40;align-self:start;position:sticky;top:52px;margin:0;max-width:100%;max-height:calc(100vh - 170px);max-height:calc(100dvh - 170px);object-fit:contain}
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-kicker{margin-top:2px}
 /* the card's buttons at its foot, in view (the same negative margins as the list's bar reach the card's edges) */
 .gift-dialog:not(:has(.gift-bar)):has(form .gift-actions){scroll-padding-bottom:calc(124px + env(safe-area-inset-bottom,0px))}
 .gift-dialog:not(:has(.gift-bar)) form .gift-actions{position:sticky;bottom:calc(-1 * var(--gift-pad-b));z-index:2;display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;
  margin:14px calc(-1 * var(--gift-pad-x)) calc(-1 * var(--gift-pad-b));padding:10px var(--gift-pad-x) calc(10px + env(safe-area-inset-bottom,0px));
  background:#fff;border-top:1px solid #dce2e6;box-shadow:0 -10px 24px rgba(4,35,57,.08)}
 /* under a picture the buttons' foot spans both columns (the form sits in the right one: its left margin reaches back over the
    picture's column, 40% of the card's content box, and the gap), so a piece of a table's three buttons share one row */
 .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture) form .gift-actions{margin-left:calc(-0.4 * (var(--gd-w) - 2 * var(--gift-pad-x) - 2px) - 20px - var(--gift-pad-x))}
 .gift-dialog:not(:has(.gift-bar)) form .gift-actions>*{font-size:15px;padding:9px 14px}
}
/* Upright: the card's main button in view. A card's buttons (the gold "Dedicate – $58" or "Sponsor the whole room – …", with
   "Review your gifts") stay at the card's foot while it scrolls, a little smaller (15 px) so they share a row from 375 px; a card
   that also offers its whole table (three buttons) keeps them in the flow, since a footer of three rows would cover a small
   phone's card. The same negative margins as the room list's bar reach the card's edges. */
@media (max-width:480px){
 /* (the card's scroll padding is its buttons' height, as the list's is its bar's, so a focused field is brought into view above them:
    one row from 375 px, two below) */
 .gift-dialog:not(:has(.gift-bar)):has(form .gift-actions){scroll-padding-bottom:calc(128px + env(safe-area-inset-bottom,0px))}
 .gift-dialog:not(:has(.gift-bar)) form .gift-actions:not(:has(.gift-set-action)){position:sticky;bottom:calc(-1 * var(--gift-pad-b,22px));z-index:2;display:flex;flex-wrap:wrap;align-items:center;gap:8px;
  margin:16px calc(-1 * var(--gift-pad-x,18px)) calc(-1 * var(--gift-pad-b,22px));padding:10px var(--gift-pad-x,18px) 12px;background:#fff;border-top:1px solid #dce2e6;box-shadow:0 -10px 24px rgba(4,35,57,.08)}
 .gift-dialog:not(:has(.gift-bar)) form .gift-actions:not(:has(.gift-set-action))>*{font-size:15px;padding:9px 12px}
 .gift-dialog .gift-picture{max-height:30vh;max-height:30dvh;object-fit:contain}
}
@media (max-width:480px) and (max-height:700px){.gift-dialog .gift-picture{max-height:26vh;max-height:26dvh}}
/* a small phone with the browser's bars showing (320×454): the card 16 px short of the screen (not 88%) and its picture at 22%, so
   that its buttons' foot, which cannot rise above the form it belongs to, is in view with the card at its top */
@media (max-width:480px) and (max-height:520px){.gift-dialog:not(:has(.gift-bar)){max-height:calc(100vh - 16px);max-height:calc(100dvh - 16px)}.gift-dialog .gift-picture{max-height:22vh;max-height:22dvh}}
@media (min-width:375px) and (max-width:480px){.gift-dialog:not(:has(.gift-bar)):has(form .gift-actions){scroll-padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}}
@media (max-width:480px),(min-width:481px) and (max-width:960px) and (max-height:520px){.gift-dialog .gift-remove{min-height:44px}}

/* ============================== Redesign A: the gift dialog as the shell's sheet (html.ui-a) ==============================
   The one gift dialog (gift-ui.js), restyled; its engine and its words are unchanged. Scoped under html.ui-a, which the 3D
   walk never gets, so the walk's dialog and a computer's are unchanged. The panel's padding and --gift-pad-t/x/b stay equal (the
   list's sticky bar and white band are placed from them); upright the side padding is 22 px.
   - Upright on a phone: a bottom sheet across the width, 16 px corners at the top, the gold rule, a grab strip (.a-grab, put
     back by tour360.js after every view) and the height tour360.js sets (--a-sheet-h: medium or large; --a-drag while a finger
     pulls it down). The card's buttons stay at its foot (phone-fixes' sticky .gift-actions).
   - On a phone on its side and on a tablet: a full-height panel at the right, inside the notch and home-bar insets. */
@media (max-width:480px) and (orientation:portrait){
  html.ui-a .gift-dialog,html.ui-a .gift-dialog:not(:has(.gift-bar)){position:fixed;inset:auto 0 0 0;margin:0;width:100%;max-width:100%;box-sizing:border-box;
    height:var(--a-sheet-h,auto);max-height:calc(100dvh - env(safe-area-inset-top,0px) - 10px);
    border:0;border-top:5px solid #BC9E5D;border-radius:16px 16px 0 0;box-shadow:0 -10px 40px rgba(2,17,29,.3);
    --gift-pad-t:30px;--gift-pad-x:22px;--gift-pad-b:22px;padding:var(--gift-pad-t) var(--gift-pad-x) var(--gift-pad-b);
    transform:translateY(var(--a-drag,0px));transition:height .22s cubic-bezier(.2,.8,.2,1),transform .22s cubic-bezier(.2,.8,.2,1)}
  html.ui-a .gift-dialog.a-dragging{transition:none}
  html.ui-a .gift-dialog::backdrop{background:rgba(4,35,57,.42)}
  /* the strip keeps clear of the close button at the right (and of the back link at the left): nothing it covers is a control */
  html.ui-a .gift-dialog>.a-grab{position:absolute;z-index:4;left:72px;right:72px;top:0;height:26px;touch-action:none;cursor:grab}
  html.ui-a .gift-dialog>.a-grab::before{content:"";position:absolute;left:50%;top:9px;width:38px;height:5px;margin-left:-19px;border-radius:3px;background:rgba(4,35,57,.24)}
  html.ui-a .gift-dialog .gift-picture{max-height:26vh;max-height:26dvh;object-fit:contain}
}
/* a phone on its side, and a tablet (either way up): a panel at the right */
@media (max-height:520px) and (orientation:landscape),(min-width:481px) and (min-height:521px){
  html.ui-a .gift-dialog,html.ui-a .gift-dialog:not(:has(.gift-bar)){position:fixed;inset:0 0 0 auto;margin:0;box-sizing:border-box;height:100%;max-height:100%;
    width:min(420px,52vw);min-width:300px;max-width:100vw;--gd-w:min(420px,52vw);
    border:0;border-left:5px solid #BC9E5D;border-radius:14px 0 0 14px;box-shadow:-10px 0 40px rgba(2,17,29,.3);
    --gift-pad-t:max(18px,calc(env(safe-area-inset-top,0px) + 8px));--gift-pad-x:max(20px,calc(env(safe-area-inset-right,0px) + 12px));--gift-pad-b:max(14px,env(safe-area-inset-bottom,0px));
    padding:var(--gift-pad-t) var(--gift-pad-x) var(--gift-pad-b)}
  html.ui-a .gift-dialog::backdrop{background:rgba(4,35,57,.3)}
  html.ui-a .gift-dialog>.a-grab{display:none}
  /* the card is one column in the panel (phone-fixes lays a card out in two columns on a wide landscape dialog) */
  html.ui-a .gift-dialog[open]:not(:has(.gift-bar)):has(>.gift-picture){display:block}
  html.ui-a .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>*{grid-column:auto;grid-row:auto}
  html.ui-a .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-close{float:right;margin:-8px -12px 0 0}
  html.ui-a .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture)>.gift-picture{position:static;display:block;width:100%;max-width:100%;max-height:38vh;max-height:38dvh;margin:0 0 12px;object-fit:contain}
  /* the room list's narrow layout, as gifts.css has it at max-width 540 px (the panel is 300-460 px wide on a wide screen) */
  html.ui-a .gift-list li{grid-template-columns:minmax(0,1fr) auto;gap:8px}
  html.ui-a .gift-list li>button,html.ui-a .gift-list li>.gift-choice{grid-column:2}
  html.ui-a .gift-list li>div:first-child{grid-row:span 2}
  html.ui-a .gift-dialog h2{font-size:23px}
  html.ui-a .gift-room{padding:12px;gap:8px;flex-wrap:wrap}
  html.ui-a .gift-room button{font-size:13px}
  html.ui-a .gift-room>.gift-do{flex:1 1 100%;justify-content:flex-start}
  html.ui-a .gift-dialog .gift-plaque-text{font-size:19px}
  html.ui-a .gift-sets li{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"text text" "price choice";gap:8px 12px}
  html.ui-a .gift-sets .gift-set-pieces{display:none}
  html.ui-a .gift-list li,html.ui-a .gift-sets li{gap:12px 12px;padding:14px 0}
  html.ui-a .gift-list li.has-picture,html.ui-a .gift-sets li.has-picture{grid-template-columns:64px minmax(0,1fr) auto;grid-template-areas:"pic text price" "do do do"}
  html.ui-a .gift-list li.has-picture>.gift-thumb,html.ui-a .gift-sets li>.gift-thumb{width:64px;height:48px;align-self:start}
  html.ui-a .gift-list li>div.gift-text:first-child,html.ui-a .gift-sets li>div.gift-text:first-child{grid-area:text}
  html.ui-a .gift-sets .gift-price{text-align:right}
  html.ui-a .gift-detail{display:none}
  html.ui-a .gift-dialog .gift-step input{width:48px}
  html.ui-a .gift-dialog .gift-qty .gift-step input{width:56px}
  html.ui-a .gift-dialog .gift-add-many{min-width:138px}
  html.ui-a .gift-bar{grid-template-columns:minmax(0,1fr);grid-template-areas:"say" "note" "do";gap:2px}
  html.ui-a .gift-bar-do{flex-direction:column;align-items:stretch;margin-top:8px}
  html.ui-a .gift-bar-do>*{width:100%}
  html.ui-a .gift-dialog .gift-bar button,html.ui-a .gift-dialog .gift-bar .gift-button{font-size:15px}
  /* 44 px steppers and "All n" */
  html.ui-a .gift-dialog .gift-step{min-height:46px}
  html.ui-a .gift-dialog .gift-step button,html.ui-a .gift-dialog .gift-step input,html.ui-a .gift-dialog .gift-all{min-height:44px}
  /* a card's form has no box of its own in the panel (display:contents), so its sticky foot's containing block is the panel:
     the buttons sit at the panel's foot from the start, even when the form begins below the fold (a phone on its side, where
     the back link, picture, title and price come first). The form element, its controls, submit and focus are unchanged. */
  html.ui-a .gift-dialog[open]:not(:has(.gift-bar)) form{display:contents}
  /* a card's buttons: a white foot across the panel, their row aligned with the content column */
  html.ui-a .gift-dialog:not(:has(.gift-bar)) form .gift-actions,html.ui-a .gift-dialog:not(:has(.gift-bar)):has(>.gift-picture) form .gift-actions{
    position:sticky;bottom:calc(-1 * var(--gift-pad-b));z-index:2;display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;
    margin:14px calc(-1 * var(--gift-pad-x)) calc(-1 * var(--gift-pad-b));padding:10px var(--gift-pad-x) calc(10px + env(safe-area-inset-bottom,0px));
    background:#fff;border-top:1px solid #dce2e6;box-shadow:0 -10px 24px rgba(4,35,57,.08)}
  html.ui-a .gift-dialog form .gift-actions:has(.gift-set-action)>.gift-primary{order:1;flex:1 1 auto}
  html.ui-a .gift-dialog form .gift-actions:has(.gift-set-action)>.gift-button{order:2;flex:0 1 auto}
  html.ui-a .gift-dialog form .gift-actions:has(.gift-set-action)>.gift-set-action{order:3;flex:1 1 100%}
  html.ui-a .gift-dialog form .gift-actions:has(.gift-set-action)>.gift-remove{order:4}
  html.ui-a .gift-dialog:not(:has(.gift-bar)):has(form .gift-actions:has(.gift-set-action)){scroll-padding-bottom:calc(128px + env(safe-area-inset-bottom,0px))}
}
/* a tablet: a little wider */
@media (min-width:768px) and (min-height:521px){
  html.ui-a .gift-dialog,html.ui-a .gift-dialog:not(:has(.gift-bar)){width:min(460px,48vw);--gd-w:min(460px,48vw)}
}
/* phone-fixes' rules on phones only, for every A size (a tablet included): 44 px Remove, 16 px fields (iPadOS zooms below) */
html.ui-a .gift-dialog .gift-remove{min-height:44px}
html.ui-a .gift-dialog input,html.ui-a .gift-dialog textarea{font-size:16px}
@media (prefers-reduced-motion:reduce){html.ui-a .gift-dialog{transition:none}}
/* ===== ui-dedupe desktop (SW80) ===== The gift panel on a computer (the 360 tour and the 3D walk): html:not(.ui-a) and no touch
   screen, so the A shell and every phone are untouched. A dialog with radius 28 and a solid surface, a light-glass header band
   while it scrolls, one solid blue primary (#1F4FD8, hover as a state layer), outlined secondaries, text actions, 48 px fields
   at 16 px, 2 px focus rings. */
@media not all and (hover:none) and (pointer:coarse){
html:not(.ui-a) .gift-dialog{--ux-font:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--ux-p:#1F4FD8;
  --ux-hover:linear-gradient(rgba(0,0,0,.14),rgba(0,0,0,.14));--ux-ink:#111;--ux-ink2:#4a5261;--ux-line:#7b8494;--ux-danger:#B42318;
  border:1px solid rgba(17,17,17,.08);border-radius:28px;background:#fff;color:var(--ux-ink);box-shadow:0 12px 40px rgba(0,0,0,.22);font-family:var(--ux-font)}
html:not(.ui-a) .gift-dialog[open]{animation:ux-gift-pop 250ms cubic-bezier(.05,.7,.1,1) both}
@keyframes ux-gift-pop{from{opacity:0;transform:scale(.96)}}
html:not(.ui-a) .gift-dialog::backdrop{background:rgba(10,14,20,.45)}
/* the header band (shown once the content scrolls under it): light glass */
html:not(.ui-a) .gift-dialog .gift-band::before{background:rgba(255,255,255,.86);border-bottom:1px solid rgba(17,17,17,.08);box-shadow:none;
  -webkit-backdrop-filter:blur(28px) saturate(180%);backdrop-filter:blur(28px) saturate(180%)}
html:not(.ui-a) .gift-dialog :is(.gift-kicker,.gift-fine,.gift-intro,.gift-meta){color:var(--ux-ink2)}
html:not(.ui-a) .gift-dialog .gift-kicker{font:600 12px/1.2 var(--ux-font);letter-spacing:.04em;text-transform:none}
/* the one close button: a 48 px round icon button */
html:not(.ui-a) .gift-dialog .gift-close{width:48px;height:48px;border:0;border-radius:999px;background:rgba(17,17,17,.07);color:var(--ux-ink);font:400 24px/1 var(--ux-font)}
html:not(.ui-a) .gift-dialog .gift-close:hover{background:rgba(17,17,17,.12)}
/* buttons: one shape; primary solid blue, secondary outlined, tertiary text */
html:not(.ui-a) .gift-dialog :is(.gift-primary,.gift-button,.gift-add,.gift-set-action,.gift-all,.gift-add-all,.gift-bar-words,.gift-cancel,.gift-keep){box-sizing:border-box;min-height:48px;
  padding:0 20px;border-radius:12px;font:600 15px/1.2 var(--ux-font);letter-spacing:0;text-transform:none;text-decoration:none;box-shadow:none}
html:not(.ui-a) .gift-dialog .gift-primary{background:var(--ux-p);border:1px solid var(--ux-p);color:#fff}
html:not(.ui-a) .gift-dialog .gift-primary:hover:not(:disabled){background:var(--ux-hover) var(--ux-p)}
html:not(.ui-a) .gift-dialog .gift-primary:disabled{background:#9aa1ad;border-color:#9aa1ad;color:#fff;opacity:1}
html:not(.ui-a) .gift-dialog :is(.gift-button:not(.gift-primary),.gift-add,.gift-set-action,.gift-all,.gift-add-all,.gift-bar-words,.gift-cancel,.gift-keep){background:#fff;border:1px solid var(--ux-line);color:var(--ux-ink)}
html:not(.ui-a) .gift-dialog :is(.gift-button:not(.gift-primary),.gift-add,.gift-set-action,.gift-all,.gift-add-all,.gift-bar-words,.gift-cancel,.gift-keep):hover{background:#f2f4f7}
html:not(.ui-a) .gift-dialog .gift-add-all.is-done{background:rgba(31,79,216,.08);border-color:rgba(31,79,216,.35);color:var(--ux-p)}
html:not(.ui-a) .gift-dialog :is(.gift-back,.gift-undo){min-height:48px;padding:0 4px;border:0;background:none;color:var(--ux-p);font:600 15px/1.2 var(--ux-font);text-decoration:none}
html:not(.ui-a) .gift-dialog :is(.gift-back,.gift-undo):hover{background:none;text-decoration:underline}
html:not(.ui-a) .gift-dialog .gift-remove{min-height:48px;padding:0 8px;border:0;background:none;color:var(--ux-danger);font:600 15px/1.2 var(--ux-font);text-decoration:none}
html:not(.ui-a) .gift-dialog .gift-remove:hover{background:none;color:var(--ux-danger);text-decoration:underline}
/* the stepper and fields: outlined, 48 px, 16 px text (no field below 16 px) */
html:not(.ui-a) .gift-dialog .gift-step{border:1px solid var(--ux-line);border-radius:12px;overflow:hidden}
html:not(.ui-a) .gift-dialog .gift-step button{min-width:48px;min-height:46px;border-radius:0;background:#fff;color:var(--ux-ink)}
html:not(.ui-a) .gift-dialog .gift-step input{min-height:46px;border-color:#dfe3e8}
/* v3: "Dedicate n" and its stepper keep one width (the owner's controls-stay check, 1 px): 1+48+52+48+1, and 1+48+48+48+1 at 540 px or less */
html:not(.ui-a) .gift-dialog .gift-add-many{min-width:150px}
@media (max-width:540px){html:not(.ui-a) .gift-dialog .gift-add-many{min-width:146px}}
html:not(.ui-a) .gift-dialog :is(input,textarea):not(.gift-step input){min-height:48px;padding:12px 14px;border:1px solid var(--ux-line);border-radius:12px;font:400 16px/1.4 var(--ux-font);color:var(--ux-ink)}
/* the whole-room gift: the first card of the room's list; its title reads as text, its button (.gift-room-go) is the one control
   (C3, CSS only: the title keeps its element and its [data-line]) */
html:not(.ui-a) .gift-dialog .gift-room{border-radius:16px;background:#f5f6f8;border:1px solid rgba(17,17,17,.06)}
html:not(.ui-a) .gift-dialog .gift-room :is(strong,.gift-name){font:600 15px/1.3 var(--ux-font);color:var(--ux-ink)}
html:not(.ui-a) .gift-dialog .gift-room .gift-name{pointer-events:none;cursor:default;text-decoration:none}
html:not(.ui-a) .gift-dialog :is(.gift-thumb,.gift-picture){border-radius:12px}
/* the dedupe: "Cancel" in the words view runs the same handler as "← room" */
html:not(.ui-a) .gift-dialog .gift-cancel{display:none}
html:not(.ui-a) .gift-dialog .gift-actions>:is(a.gift-button,.gift-keep)[hidden]{display:none}
/* after a local save (.gift-actions.is-saved): "Review your gifts" is the primary and "Keep choosing" the secondary, first in
   the row; "Save changes" becomes a text action beside "Remove from your gifts". A card with no form of its own (the piece is
   part of a gift already chosen) keeps "Review your gifts" as its primary. */
html:not(.ui-a) .gift-dialog .gift-actions.is-saved>a.gift-button,
html:not(.ui-a) .gift-dialog .gift-actions:not(:has(>.gift-primary))>a.gift-button{background:var(--ux-p);border-color:var(--ux-p);color:#fff}
html:not(.ui-a) .gift-dialog .gift-actions.is-saved>a.gift-button:hover,
html:not(.ui-a) .gift-dialog .gift-actions:not(:has(>.gift-primary))>a.gift-button:hover{background:var(--ux-hover) var(--ux-p)}
html:not(.ui-a) .gift-dialog .gift-actions.is-saved>.gift-primary{padding:0 8px;border:0;background:none;color:var(--ux-p)}
html:not(.ui-a) .gift-dialog .gift-actions.is-saved>.gift-primary:hover{background:none;text-decoration:underline}
html:not(.ui-a) .gift-dialog .gift-button [data-cart-count]{min-width:22px;height:22px;display:inline-grid;place-items:center;padding:0 6px;border-radius:999px;background:#fff;color:var(--ux-p);font:700 13px/1 var(--ux-font)}
html:not(.ui-a) .gift-dialog .gift-button:not(.gift-primary) [data-cart-count]{background:var(--ux-p);color:#fff}
/* focus: 2 px blue + 2 px offset on the white surface */
html:not(.ui-a) .gift-dialog :focus-visible{outline:2px solid var(--ux-p);outline-offset:2px}
}
@media not all and (hover:none) and (pointer:coarse){
  @media (prefers-reduced-transparency:reduce){html:not(.ui-a) .gift-dialog .gift-band::before{background:rgba(255,255,255,.96);-webkit-backdrop-filter:none;backdrop-filter:none}}
  html:not(.ui-a)[data-ux-solid] .gift-dialog .gift-band::before{background:rgba(255,255,255,.96);-webkit-backdrop-filter:none;backdrop-filter:none}
  @supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){html:not(.ui-a) .gift-dialog .gift-band::before{background:rgba(255,255,255,.96)}}
  @media (prefers-reduced-motion:reduce){html:not(.ui-a) .gift-dialog[open]{animation:none}}
}
/* ===== end ui-dedupe desktop ===== */
/* ===== ui-dedupe A (SW80) ===== Every device: form fields at 16 px (the coordinator's ruling, 28 Sep; iOS never zooms on them).
   A (html.ui-a) only: the gift sheet in the one button system (one blue primary, white secondary, 48 px, radius 12).
   - After a local save, "Review your gifts" is the primary and "Keep choosing" the secondary (the ruling; the classes are the
     desktop patch's: .gift-actions.is-saved, .gift-keep).
   - "Review your gifts" shows only once something is chosen.
   - The list's bar sits at the panel's foot (PLAN.md §8, item 13; while the dialog is open only, so a closed one is never drawn). */
input:not([type=hidden]):not([type=checkbox]):not([type=radio]),select,textarea{font-size:16px}
html.ui-a .gift-dialog{font-family:var(--m-ui)}
html.ui-a .gift-dialog[open]:has(.gift-bar){display:flex;flex-direction:column}
html.ui-a .gift-dialog .gift-bar{margin-top:auto}
html.ui-a .gift-dialog .gift-actions{gap:8px}
html.ui-a .gift-dialog :is(.gift-primary,.gift-actions>a.gift-button,.gift-keep,.gift-add,.gift-room-go){min-height:48px;border-radius:12px;font:600 16px/1.1 var(--m-ui);letter-spacing:0;text-transform:none;box-shadow:none}
html.ui-a .gift-dialog .gift-primary,html.ui-a .gift-dialog .gift-actions.is-saved>a.gift-button{background:var(--m-p);color:#fff;border:0}
html.ui-a .gift-dialog :is(.gift-actions>a.gift-button,.gift-keep,.gift-add,.gift-room-go),html.ui-a .gift-dialog .gift-actions.is-saved>.gift-keep{background:#fff;color:var(--m-ink);border:1.5px solid #c7c7cc}
html.ui-a .gift-dialog .gift-actions.is-saved>a.gift-button{background:var(--m-p);color:#fff;border:0}
html.ui-a .gift-dialog .gift-actions.is-saved>.gift-primary{min-height:48px;background:none;color:var(--m-p);border:0;text-decoration:underline;text-underline-offset:3px}
html.ui-a .gift-dialog .gift-remove{min-height:48px;background:none;border:0;color:#b42318;text-decoration:underline;font:500 15px/48px var(--m-ui)}
html.ui-a .gift-dialog .gift-close{width:48px;height:48px;border-radius:999px;border:1px solid rgba(0,0,0,.08);background:#fff;color:var(--m-ink)}
html.ui-a .gift-dialog .gift-back{min-height:48px;color:var(--m-p);font:600 15px/48px var(--m-ui)}
html.ui-a:not([data-gifts]) .gift-dialog .gift-actions>a.gift-button[href="checkout.html"]{display:none}
html.ui-a .gift-dialog :focus-visible{outline:2px solid var(--m-p);outline-offset:2px}
/* the list's close button stays where the list's own rule puts it, at the top right (a flex column ignores its float; the
   coordinator's ruling, 29 Sep 00:29): the end of the row, and the 36 px it takes in the flow given back so the kicker keeps its line */
html.ui-a .gift-dialog[open]:has(.gift-bar)>.gift-close{align-self:flex-end;flex:none;margin:-12px -12px -36px 0}
/* set 2: a row's controls share one height, 48 px, as "Dedicate n" has (the stepper, "All n" and "Remove"), so nothing in the row
   moves when "Dedicate 1" becomes the stepper and "Remove" joins "All n" on the row's second line (the gift-list's "controls stay") */
html.ui-a .gift-dialog .gift-step,html.ui-a .gift-dialog :is(.gift-add-all,.gift-all){box-sizing:border-box;min-height:48px}
html.ui-a .gift-dialog .gift-remove{padding-top:0;padding-bottom:0}
/* ===== end ui-dedupe A ===== */
/* ===== SW81 (DESIGNS-v2.3.1): the browse list (panel, sheet, peek), the wide and phone cards, the target highlight, the link
   notices and the entry points. Layout A reconciled (mockups-v2): one blue primary #1F4FD8, outlines #6B7280 (4.83:1 on white),
   48 px targets on touch (44 with a mouse) that never shrink, 16 px fields, the display serif for room and group titles, system
   UI text. Nothing here animates the rows; the only motion is the highlight's ring (none under reduced motion). ===== */
.gl,.gift-peek,.gift-card2,.gift-link-note{--gl-p:#1F4FD8;--gl-p-ink:#123a9c;--gl-tonal:#E4EAFB;--gl-ink:#111;--gl-ink2:#374151;--gl-ink3:#4B5563;--gl-line:#6B7280;--gl-rule:rgba(60,60,67,.14);
  --gl-gold:#5B4413;--gl-serif:"PP Fragment Serif","Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;--gl-ui:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}
.gl [hidden],.gift-peek [hidden],.gift-card2 [hidden],.gift-link-note [hidden]{display:none!important}
/* ---- the surfaces */
.gift-panel{position:fixed;z-index:4;right:16px;top:calc(var(--tour-toolbar-bottom,72px) + 8px);bottom:calc(var(--rail-h,164px) + 12px);width:min(452px,calc(100vw - 32px));box-sizing:border-box;
  display:flex;flex-direction:column;overflow:hidden;background:#F2F2F7;color:var(--gl-ink);border-radius:24px;box-shadow:0 12px 40px rgba(0,0,0,.22);font-family:var(--gl-ui)}
.gift-panel[hidden]{display:none}
html.ui-a .gift-panel{top:max(12px,calc(env(safe-area-inset-top,0px) + 8px));bottom:max(12px,calc(env(safe-area-inset-bottom,0px) + 8px));right:max(12px,env(safe-area-inset-right,0px));width:min(400px,48vw);min-width:300px}
.gift-dialog.gl-sheet{padding:0!important;display:flex;flex-direction:column;overflow:hidden;background:#F2F2F7;color:var(--gl-ink);font-family:var(--gl-ui)}
.gift-dialog.gl-sheet:not([open]){display:none}
html:not(.ui-a) .gift-dialog.gl-sheet{width:min(452px,calc(100vw - 16px));height:min(88dvh,900px);border-radius:24px}
html.ui-a .gift-dialog.gl-sheet>.a-grab{left:72px;right:72px}
/* ---- the header (sticky: it is outside the scrolling body) */
.gl-head{flex:none;position:relative;z-index:2;padding:10px 16px 10px;background:rgba(255,255,255,.9);-webkit-backdrop-filter:blur(28px) saturate(180%);backdrop-filter:blur(28px) saturate(180%);border-bottom:1px solid rgba(60,60,67,.17)}
.gift-dialog.gl-sheet .gl-head{padding-top:22px}
.gl-skip{position:absolute;left:12px;top:6px;z-index:3;padding:10px 14px;border-radius:12px;background:var(--gl-p);color:#fff;font:600 15px/1 var(--gl-ui);transform:translateY(-200%)}
.gl-skip:focus{transform:none}
.gl-title{display:flex;align-items:flex-start;gap:8px}
.gl-pick{position:relative;flex:1;min-width:0}
.gl .gl-h2{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 6px;min-height:48px;margin:0;padding:2px 0 0;border-radius:8px;color:#0f1d2b;font:400 26px/1.15 var(--gl-serif);outline:none}
.gl .gl-kicker{flex:1 0 100%;font:600 11px/1.3 var(--gl-ui);letter-spacing:.1em;text-transform:uppercase;color:var(--gl-gold)}
.gl .gl-name{min-width:0;overflow-wrap:anywhere}
.gl .gl-h2 .gl-caret{width:12px;height:12px;flex:none;color:var(--gl-p);align-self:center}
/* SW82 D7: the Room pill (the native select, D1's pill style) under the kicker; the h2 holds the kicker and the hidden name */
.gl .gl-pick>.gl-h2{min-height:0;padding:2px 0 0}
.gl select.gl-room.gl-pill{margin:4px 0 0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width:360px){.gl select.gl-room.gl-pill{min-width:0;padding-left:14px;padding-right:32px;background-position:right 14px center}}   /* (D7b) 16 px kept: no iOS zoom on focus */
.gl .gl-sum{margin:2px 0 0;font:500 13px/1.3 var(--gl-ui);color:var(--gl-ink2)}
.gl .gl-close{flex:none;width:48px;height:48px;min-width:48px;margin:0;padding:0;border:0;border-radius:50%;background:#F1F2F4;color:var(--gl-ink);font:400 26px/1 var(--gl-ui);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
.gl .gl-close:hover{background:#E6E8EB}
.gl-chips{display:flex;gap:8px;margin:2px -16px 0;padding:4px 16px 4px;overflow-x:auto;scrollbar-width:none;-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 32px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 32px),transparent)}
.gl-chips::-webkit-scrollbar{display:none}
.gl-chips:empty{display:none}
.gl .gl-chip{flex:none;display:inline-flex;align-items:center;gap:6px;height:48px;min-width:48px;margin:0;padding:0 16px;box-sizing:border-box;border:1.5px solid var(--gl-line);border-radius:24px;background:#fff;color:var(--gl-ink);font:600 15px/1 var(--gl-ui);white-space:nowrap;cursor:pointer}
.gl .gl-chip i{font-style:normal;font-weight:500;opacity:.85}
.gl .gl-chip[aria-pressed=true]{background:var(--gl-p);border-color:var(--gl-p);color:#fff}
.gl .gl-chip.gl-clear{border-color:transparent;background:transparent;color:#1A44BF;padding:0 10px}
.gl-pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.gl .gl-pill{position:relative;flex:none;display:inline-flex;align-items:center;gap:8px;height:48px;min-width:48px;margin:0;padding:0 16px;box-sizing:border-box;border:1.5px solid var(--gl-line);border-radius:24px;background:#fff;color:var(--gl-ink);font:600 15px/1 var(--gl-ui);white-space:nowrap;cursor:pointer}
.gl .gl-pill .gl-caret{width:12px;height:12px}
/* SW82 D1: the Price and Sort pills are the native select itself (the overlay select is gone) */
.gl select.gl-pill{display:inline-block;width:auto;min-width:55px;max-width:100%;padding:0 36px 0 16px;font:600 16px/1 var(--gl-ui);text-align:left;-webkit-appearance:none;appearance:none;field-sizing:content;background-color:#fff;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%23111111' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 16px center;background-size:12px 12px}
.gl select.gl-pill.is-on{background-color:var(--gl-p);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%23ffffff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}
.gl select.gl-pill:focus{outline:none}
.gl select.gl-pill:focus-visible{outline:2px solid var(--gl-p);outline-offset:2px}
.gl select.gl-pill option{color:#111;background:#fff}
.gl .gl-pill.is-on{background-color:var(--gl-p);border-color:var(--gl-p);color:#fff}
.gl .gl-pill:focus-within{outline:2px solid var(--gl-p);outline-offset:2px}
.gl .gl-switch{gap:8px;padding:0 14px 0 8px}
.gl .gl-knob{position:relative;display:inline-block;width:32px;height:20px;border-radius:10px;background:#C5CAD1;flex:none}
.gl .gl-knob::after{content:"";position:absolute;left:2px;top:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.gl .gl-switch[aria-checked=true] .gl-knob{background:var(--gl-p)}
.gl .gl-switch[aria-checked=true] .gl-knob::after{left:14px}
.gl-head.is-collapsed .gl-pills{display:none}
/* ---- the body */
.gl-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:2px 12px 16px;scroll-padding:12px 0}
.gl-list{list-style:none;margin:0;padding:0}
.gl-sec h3{margin:14px 6px 8px;font:600 12px/1 var(--gl-ui);letter-spacing:.1em;text-transform:uppercase;color:var(--gl-gold)}
.gl-grp h3{margin:18px 6px 8px;font:400 20px/1.2 var(--gl-serif);color:#0f1d2b}
.gl-grp h3 small{margin-left:6px;font:500 13px/1 var(--gl-ui);color:var(--gl-ink3)}
.gl-sec,.gl-grp,.gl-sentinel,.gl-end,.gl-empty-li,.gl-more-li{list-style:none}
.gl-sentinel{height:1px}
.gl-row{position:relative;padding:12px;background:#fff;border-bottom:1px solid var(--gl-rule)}
.gl-list>.gl-row:first-child,.gl-sec+.gl-row,.gl-grp+.gl-row{border-top-left-radius:16px;border-top-right-radius:16px}
.gl-list>.gl-row:last-child,.gl-list>.gl-row:has(+.gl-sec),.gl-list>.gl-row:has(+.gl-grp),.gl-list>.gl-row:has(+.gl-sentinel),.gl-list>.gl-row:has(+.gl-end){border-bottom-left-radius:16px;border-bottom-right-radius:16px;border-bottom:0}
.gl-row.is-selected{box-shadow:inset 3px 0 0 #B8901F;background:#FFFCF3}
.gl-r1{display:flex;align-items:flex-start;gap:12px}
.gl .gl-pic{flex:none;width:64px;height:48px;border-radius:8px;object-fit:cover;background:#F4F2EE;display:block}
.gift-panel .gl-pic{width:80px;height:60px}
.gl .gl-glyph{display:flex;align-items:center;justify-content:center;color:#8A919C}
.gl .gl-glyph svg{width:26px;height:26px}
.gl .gl-name{flex:1;min-width:0;min-height:48px;margin:0;padding:0 4px;display:flex;flex-direction:column;justify-content:center;border:0;border-radius:8px;background:none;color:var(--gl-ink);font:inherit;text-align:left;cursor:pointer}
.gl .gl-name.gl-static{cursor:default}
.gl .gl-t{font:600 16px/1.25 var(--gl-ui);color:var(--gl-ink);overflow-wrap:anywhere}
.gl button.gl-name .gl-t{text-decoration:underline;text-decoration-color:rgba(17,17,17,.3);text-decoration-thickness:1px;text-underline-offset:3px}
.gl button.gl-name:hover .gl-t{text-decoration-color:var(--gl-ink)}
.gl .gl-meta,.gl .gl-status{display:block;margin-top:3px;font:400 13px/1.35 var(--gl-ui);color:var(--gl-ink3);letter-spacing:0}
.gl .gl-status.is-held,.gl .gl-status.is-taken{color:var(--gl-gold);font-weight:600}
.gl .gl-status.is-if{color:var(--gl-ink3);font-weight:400}
.gl .gl-price{flex:none;display:flex;flex-direction:column;align-items:flex-end;text-align:right;font:700 16px/1.2 var(--gl-ui);color:var(--gl-ink)}
.gl .gl-price small{display:block;margin-top:3px;font:400 12px/1 var(--gl-ui);color:var(--gl-ink3)}
.gl .gl-tbd{font:600 13px/1.3 var(--gl-ui);max-width:7em}
.gl .gl-remove{min-width:48px;min-height:48px;margin:2px -8px -8px 0;padding:0 8px;border:0;background:none;color:#B42318;font:600 15px/1 var(--gl-ui);cursor:pointer}
.gl .gl-remove:hover{text-decoration:underline}
.gl-do{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin-top:10px}
.gl-do>*{flex-shrink:0}
.gl .gl-add,.gl .gl-all,.gl .gl-view,.gl .gl-show,.gl .gl-exit,.gl .gl-undo,.gl .gl-bar-words,.gl .gl-review,.gl .gl-more,.gift-peek .gl-peek-back{box-sizing:border-box;min-height:48px;min-width:48px;margin:0;font:600 15px/1.15 var(--gl-ui);letter-spacing:0;text-transform:none;cursor:pointer}
.gl .gl-add{display:inline-flex;align-items:center;justify-content:center;padding:0 16px;border:0;border-radius:12px;background:var(--gl-tonal);color:var(--gl-p-ink)}
.gl .gl-add:hover{background:#d6e0fa}
.gl-row:has(.gl-step) .gl-add{min-width:147px}
.gl .gl-all{display:inline-flex;align-items:center;padding:0 14px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:var(--gl-ink)}
.gl .gl-all:hover{background:#F2F4F7}
.gl .gl-all.is-done{border-color:rgba(31,79,216,.35);background:rgba(31,79,216,.08);color:var(--gl-p);cursor:default}
.gl .gl-step{display:inline-flex;align-items:stretch;height:48px;box-sizing:border-box;border:1.5px solid var(--gl-line);border-radius:12px;overflow:hidden;background:#fff}
.gl .gl-step button{width:48px;min-width:48px;height:auto;min-height:0;margin:0;padding:0;border:0;border-radius:0;background:#fff;color:var(--gl-ink);font:500 20px/1 var(--gl-ui);cursor:pointer;display:flex;align-items:center;justify-content:center}
.gl .gl-step button:hover{background:#F2F4F7}
.gl .gl-step button[aria-disabled=true]{color:#9CA3AF;cursor:default;background:#fff}
.gl .gl-step input{display:block;width:48px;height:auto;min-height:0;margin:0;padding:0;box-sizing:border-box;border:0;border-left:1px solid #D1D5DB;border-right:1px solid #D1D5DB;border-radius:0;background:#fff;color:var(--gl-ink);font:600 16px/1 var(--gl-ui);text-align:center;-moz-appearance:textfield;appearance:textfield}
.gl .gl-step input::-webkit-outer-spin-button,.gl .gl-step input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.gl .gl-view{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 12px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:#1A44BF}
.gl .gl-view .gift-ic{width:20px;height:20px}
.gl .gl-view:hover{background:#F2F4F7}
.gl .gl-view.is-in-view{border-color:transparent;background:#E6F4EA;color:#1f5130}
/* phones: View is a stacked 48x48 button, the word under the eye (G1) */
.gift-dialog.gl-sheet .gl-view{width:48px;padding:0;flex-direction:column;gap:1px;font:600 11px/1 var(--gl-ui)}
.gift-dialog.gl-sheet .gl-view.is-in-view span{font-size:9px}
.gl .gl-sealed{display:inline-flex;align-items:center;gap:6px;min-height:48px;font:600 11px/1.2 var(--gl-ui);letter-spacing:.06em;text-transform:uppercase;color:var(--gl-gold)}
.gl .gl-sealed i{width:10px;height:10px;border-radius:50%;background:#BC9E5D;box-shadow:0 0 0 2px rgba(188,158,93,.25)}
.gl .gl-note{margin:8px 4px 0;font:400 13px/1.35 var(--gl-ui);color:var(--gl-ink3)}
/* the school-wide price list's groups (P1) */
.gl-group.is-open{background:#F7F8FA}
.gl .gl-show{display:flex;align-items:center;justify-content:space-between;width:100%;margin-top:10px;padding:0 16px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:var(--gl-ink);text-align:left}
.gl .gl-show:hover{background:#F2F4F7}
.gl-kids{list-style:none;margin:10px 0 0 12px;padding:0;border-left:3px solid #C9D3F0}
.gl-kids .gl-row{background:transparent;border-radius:0!important;padding:12px 0 12px 12px}
.gl-kids .gl-row:last-child{border-bottom:0}
.gl .gl-more{padding:0 12px;border:0;background:none;color:#1A44BF}
.gl-end p{margin:12px 6px 0;font:400 13px/1.4 var(--gl-ui);color:var(--gl-ink3)}
.gl-empty{padding:16px;border-radius:16px;background:#fff}
.gl-empty p{margin:0;font:400 15px/1.45 var(--gl-ui);color:var(--gl-ink)}
.gl-exits{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.gl .gl-exit{display:inline-flex;align-items:center;gap:6px;padding:0 16px;border:1.5px solid var(--gl-line);border-radius:24px;background:#fff;color:var(--gl-ink)}
.gl .gl-exit i{font-style:normal;font-weight:500;opacity:.85}
/* the foot bar (design D): a flex child under the scrolling body */
.gl .gl-bar.gift-bar{position:static;flex:none;display:block;margin:0;padding:10px 16px calc(12px + env(safe-area-inset-bottom,0px));background:#fff;border-top:1px solid rgba(60,60,67,.17);box-shadow:0 -8px 20px rgba(4,35,57,.06)}
.gift-panel .gl-bar.gift-bar{padding-bottom:12px}
.gl-bar-say{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px}
.gl .gl-bar .gift-bar-text{flex:1 1 12em;margin:0;font:500 14px/1.35 var(--gl-ui);color:var(--gl-ink)}
.gl .gl-bar .gift-bar-text.is-notice{color:#6a5528;font-weight:600}
.gl .gl-bar .gift-bar-text.is-error{color:#8a2a2a}
.gl .gl-undo{flex:none;display:inline-flex;align-items:center;justify-content:center;padding:0 12px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:#1A44BF}
.gl .gl-bar .gift-bar-note{margin:2px 0 0;font:400 12px/1.35 var(--gl-ui);color:var(--gl-ink3)}
.gl-bar-do{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.gl-bar-do>*{flex:1 1 auto;min-width:max-content}
.gl .gl-bar-words{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 16px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:var(--gl-ink)}
.gl .gl-bar-words .gift-pen{width:16px;height:16px;flex:none;color:#796333}
.gl .gl-review{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 18px;border:0;border-radius:12px;background:var(--gl-p);color:#fff;text-decoration:none;font-size:16px}
.gl .gl-review:hover{background:linear-gradient(rgba(0,0,0,.14),rgba(0,0,0,.14)) var(--gl-p)}
.gl .gl-review [data-cart-count]{min-width:22px;height:22px;display:inline-grid;place-items:center;padding:0 6px;border-radius:999px;background:#fff;color:var(--gl-p);font:700 13px/1 var(--gl-ui);box-sizing:border-box}
@media (max-width:359px){.gl-bar-do>*{flex-basis:100%}}
/* the quiet moment (600 ms after a change, design D) */
.gl .gl-row.is-settling>*,.gl.is-settling .gl-bar>*,.gl.is-settling-all .gl-row>*,.gift-peek.is-settling .gl-do>*{pointer-events:none}
.gl :focus-visible,.gift-peek :focus-visible,.gift-card2 :focus-visible,.gift-link-note :focus-visible{outline:2px solid var(--gl-p,#1F4FD8);outline-offset:2px}
/* ---- the peek (§2.7): a non-modal sheet above the tab bar, with the row's own controls */
.gift-peek{position:fixed;z-index:4;left:8px;right:8px;bottom:calc(var(--rail-h,88px) + 8px);box-sizing:border-box;min-height:150px;padding:6px 14px 12px;background:#fff;color:var(--gl-ink);border-radius:24px;box-shadow:0 -6px 30px rgba(0,0,0,.25);font-family:var(--gl-ui)}
.gift-peek[hidden]{display:none}
html.ui-a .gift-peek{left:max(8px,calc(var(--a-rail-w,0px) + 8px))}
@media (min-width:600px){.gift-peek{left:auto;right:16px;width:min(520px,calc(100vw - 32px))}}
.gl-peek-grab{width:36px;height:5px;margin:0 auto 6px;border-radius:3px;background:#C5CAD1}
.gl-peek-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.gl-peek-t{min-width:0}
.gl-peek-t b{display:block;font:600 17px/1.25 var(--gl-ui);color:var(--gl-ink)}
.gl-peek-t small{display:block;margin-top:3px;font:400 13px/1.35 var(--gl-ui);color:var(--gl-ink3)}
.gift-peek .gl-peek-back{flex:none;display:inline-flex;align-items:center;padding:0 4px;border:0;background:none;color:#1A44BF}
.gift-peek .gl-peek-row{padding:0;background:none;border:0}
.gift-peek .gl-view,.gift-peek .gl-note{display:none}
.gift-peek .gl-do{margin-top:8px}
.gift-peek .gl-status{display:block;margin-top:6px;font:600 13px/1.35 var(--gl-ui);color:var(--gl-gold)}
/* the peek reuses the list's control styles */
.gift-peek .gl-add,.gift-peek .gl-all,.gift-peek .gl-step,.gift-peek .gl-remove{font-family:var(--gl-ui)}
.gift-peek .gl-add{display:inline-flex;align-items:center;justify-content:center;min-height:48px;padding:0 16px;border:0;border-radius:12px;background:#E4EAFB;color:#123a9c;font:600 15px/1 var(--gl-ui);cursor:pointer}
.gift-peek .gl-all{display:inline-flex;align-items:center;min-height:48px;padding:0 14px;border:1.5px solid #6B7280;border-radius:12px;background:#fff;color:#111;font:600 15px/1 var(--gl-ui);cursor:pointer}
.gift-peek .gl-step{display:inline-flex;height:48px;box-sizing:border-box;border:1.5px solid #6B7280;border-radius:12px;overflow:hidden;background:#fff}
.gift-peek .gl-step button{width:48px;border:0;background:#fff;font:500 20px/1 var(--gl-ui);color:#111}
.gift-peek .gl-step input{width:48px;border:0;border-left:1px solid #D1D5DB;border-right:1px solid #D1D5DB;text-align:center;font:600 16px/1 var(--gl-ui);-moz-appearance:textfield;appearance:textfield}
.gift-peek .gl-remove{min-height:48px;padding:0 8px;border:0;background:none;color:#B42318;font:600 15px/1 var(--gl-ui)}
/* ---- the cards (§3.2): the top band, one scrolling body; .gift-media then .gift-main */
.gift-dialog.gift-card2{padding:0!important;overflow:hidden;font-family:var(--gl-ui);color:var(--gl-ink)}
.gift-dialog.gift-card2[open]{display:flex;flex-direction:column}
.gift-dialog.gift-card2>.gift-band{display:none}
.gift-card2 .gift-top{flex:none;position:relative;z-index:3;display:flex;align-items:center;gap:8px;min-height:64px;box-sizing:border-box;padding:8px 16px 8px 24px;background:#fff}
.gift-card2.is-scrolled .gift-top{box-shadow:0 1px 0 #E5E7EB}
.gift-card2 .gift-top-fill{flex:1}
.gift-card2 .gift-top .gift-back{flex:0 1 auto;min-width:0;min-height:48px;margin:0;padding:0 4px;border:0;background:none;color:var(--gl-p);font:600 16px/1.2 var(--gl-ui);text-align:left;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gift-card2 .gift-top .gift-back:hover{background:none;text-decoration:underline}
.gift-card2 .gift-share{flex:none;display:inline-flex;align-items:center;gap:8px;min-height:48px;min-width:48px;margin:0;padding:0 16px;border:0;border-radius:12px;background:rgba(31,79,216,.10);color:var(--gl-p);font:600 15px/1 var(--gl-ui);cursor:pointer;white-space:nowrap}
.gift-card2 .gift-share:hover{background:rgba(31,79,216,.16)}
.gift-card2 .gift-share.is-done{background:#E6F4EA;color:#1f5130}
.gift-card2 .gift-share .gift-ic{width:18px;height:18px}
.gift-dialog.gift-card2 .gift-top .gift-close{position:static;float:none;flex:none;width:48px;height:48px;min-width:48px;margin:0;padding:0;border:0;border-radius:50%;background:#F1F2F4;color:var(--gl-ink);font:400 26px/1 var(--gl-ui);display:inline-flex;align-items:center;justify-content:center}
.gift-card2 .gift-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:0 32px 28px}
.gift-card2.has-more .gift-scroll{-webkit-mask-image:linear-gradient(#000 calc(100% - 24px),rgba(0,0,0,.25));mask-image:linear-gradient(#000 calc(100% - 24px),rgba(0,0,0,.25))}
.gift-card2 .gift-media.no-picture:not(:has(*)){display:none}
.gift-card2 .gift-picture{display:block;width:100%;max-width:480px;height:auto;aspect-ratio:4/3;margin:0;object-fit:contain;border-radius:12px;background:#F4F2EE}
.gift-card2 .gift-view-room{display:inline-flex;align-items:center;gap:8px;min-height:48px;margin:12px 0 0;padding:0 16px;border:0;border-radius:12px;background:rgba(31,79,216,.10);color:var(--gl-p);font:600 15px/1 var(--gl-ui);white-space:nowrap;cursor:pointer}
.gift-card2 .gift-view-room:hover{background:rgba(31,79,216,.16)}
.gift-card2 .gift-media .gift-picture+.gift-view-room{margin-top:12px}
.gift-card2 .gift-media>.gift-view-room:first-child{margin-top:0}
.gift-card2 .gift-caption{margin:12px 0 0;font:400 13px/1.45 var(--gl-ui);color:var(--gl-ink2)}
.gift-card2 .gift-caption .gift-pieces{margin:0;font-size:13px}
.gift-card2 .gift-set-note{padding:2px 0 2px 12px;border-left:3px solid #BC9E5D;color:var(--gl-ink2)}
.gift-card2 .gift-head .gift-kicker{margin:0;font:600 12px/1.3 var(--gl-ui);letter-spacing:.1em;text-transform:uppercase;color:#7A5B1E}
.gift-dialog.gift-card2 h2{margin:4px 0 6px;font:400 32px/1.15 var(--gl-serif);color:#0f1d2b;outline:none}
.gift-card2 h2:focus{outline:none}
.gift-card2 .gift-intro{margin:0;font:400 15px/1.45 var(--gl-ui);color:var(--gl-ink3)}
.gift-card2 .gift-link-look{margin:10px 0 0;padding:10px 12px;border-left:3px solid #B8901F;background:#FBF8F1;font:400 14px/1.45 var(--gl-ui);color:var(--gl-ink)}
.gift-card2 .gift-price-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:16px 0 8px}
.gift-dialog.gift-card2 .gift-value{margin:0;font:700 30px/1.1 var(--gl-ui);color:var(--gl-ink)}
.gift-card2 .gift-each-left{font:400 13px/1.3 var(--gl-ui);color:var(--gl-ink3)}
.gift-dialog.gift-card2 .gift-qty{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:8px 0 12px}
.gift-dialog.gift-card2 .gift-qty label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.gift-dialog.gift-card2 .gift-step{flex:none;display:inline-flex;align-items:stretch;height:48px;min-height:48px;box-sizing:border-box;border:1.5px solid var(--gl-line);border-radius:12px;overflow:hidden;background:#fff}
.gift-dialog.gift-card2 .gift-step button{width:48px;min-width:48px;height:auto;min-height:0;margin:0;padding:0;border:0;border-radius:0;background:#fff;color:var(--gl-ink);font:500 20px/1 var(--gl-ui)}
.gift-dialog.gift-card2 .gift-step input{display:block;width:56px;height:auto;min-height:0;margin:0;padding:0;box-sizing:border-box;border:0;border-left:1px solid #D1D5DB;border-right:1px solid #D1D5DB;border-radius:0;font:600 16px/1 var(--gl-ui);text-align:center}
.gift-dialog.gift-card2 .gift-all{flex:none;min-height:48px;padding:0 16px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:var(--gl-ink);font:600 15px/1 var(--gl-ui)}
.gift-dialog.gift-card2 label.gift-words,.gift-dialog.gift-card2 form label{display:block;margin:12px 0;font:600 15px/1.3 var(--gl-ui);color:var(--gl-ink)}
.gift-dialog.gift-card2 .gift-optional{font-weight:400;color:var(--gl-ink3)}
.gift-dialog.gift-card2 textarea{display:block;width:100%;box-sizing:border-box;min-height:calc(2 * 1.4em + 26px);max-height:calc(4 * 1.4em + 26px);margin-top:8px;padding:12px 14px;border:1.5px solid var(--gl-line);border-radius:12px;background:#fff;color:var(--gl-ink);font:400 16px/1.4 var(--gl-ui);resize:vertical;field-sizing:content}
.gift-card2 .gift-fine{font:400 13px/1.45 var(--gl-ui);color:var(--gl-ink3)}
.gift-card2 .gift-quiet{margin:14px 0 0}
.gift-card2 .gift-feedback{margin:8px 0 0;font:600 14px/1.4 var(--gl-ui);color:#6a5528}
.gift-card2 .gift-feedback:empty{display:none}
/* the wallet slot (B.8's order; the owner's "Express pay", shown as the card loads, at its real height) */
.gift-card2 .gift-wallet{margin:14px 0 0}
.gift-card2 .gift-wallet h3{margin:0 0 8px;font:600 12px/1.3 var(--gl-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--gl-ink3)}
.gift-card2 .gift-wallet-mount{min-height:48px;border-radius:10px;background:#F1F2F4;box-shadow:inset 0 0 0 1px #E1E4E8}
.gift-card2 .gift-wallet-mount[data-wallet-state]{background:none;box-shadow:none}
.gift-card2 .gift-wallet-notice{min-height:calc(3 * 13px * 1.45);margin:8px 0 0;font:400 13px/1.45 var(--gl-ui);color:var(--gl-ink2)}
.gift-card2 .gift-or{display:flex;align-items:center;gap:10px;margin:12px 0 0;font:400 13px/1 var(--gl-ui);color:#6B7280}
.gift-card2 .gift-or::before,.gift-card2 .gift-or::after{content:"";flex:1;border-top:1px solid #D1D5DB}
/* the actions: in the flow (the phone card scrolls to its final action, F1), never the SW80 sticky foot */
.gift-dialog.gift-card2 form{display:block!important}
.gift-dialog.gift-card2 .gift-actions{position:static!important;display:flex!important;flex-wrap:wrap;align-items:center;gap:10px!important;margin:14px 0 0!important;padding:0!important;background:none!important;border:0!important;box-shadow:none!important}
.gift-dialog.gift-card2 .gift-actions>*{flex:0 0 auto;font-size:15px}
.gift-dialog.gift-card2 .gift-actions>:is(.gift-primary,a.gift-button,.gift-set-action,.gift-keep){min-height:48px;padding:0 20px;border-radius:12px}
.gift-card2 .gift-share-box{margin:0 0 12px;padding:12px;border-radius:12px;background:#F7F8FA}
.gift-card2 .gift-share-box input{width:100%;box-sizing:border-box;min-height:48px;padding:0 12px;border:1.5px solid var(--gl-line);border-radius:10px;font:400 16px/1 var(--gl-ui)}
.gift-card2 .gift-taken-now{font:600 14px/1.4 var(--gl-ui);color:#6a5528}
.gift-card2 .gift-plaque{border-radius:0 12px 12px 0}
/* computers: two columns (media, main) for a card with a picture; the picture is held while the main column scrolls */
@media (hover:hover) and (pointer:fine) and (min-width:1024px) and (min-height:500px){
  html:not(.ui-a) .gift-dialog.gift-card2{width:min(720px,calc(100vw - 48px));max-height:min(672px,calc(100dvh - 48px));border-radius:28px}
  html:not(.ui-a) .gift-dialog.gift-card2.has-media{--pw:min(46%,480px,calc((100vh - 180px) * 4 / 3));width:min(1100px,calc(100vw - 64px))}
  html:not(.ui-a) .gift-card2.has-media .gift-scroll{display:grid;grid-template-columns:var(--pw) minmax(0,1fr);column-gap:40px;align-items:start}
  html:not(.ui-a) .gift-card2.has-media .gift-media{position:sticky;top:0}
  html:not(.ui-a) .gift-card2.has-media .gift-picture{max-width:none}
}
/* phones (upright): the compact head, the picture beside the title, View in the room under it (card-phone-link) */
@media (max-width:480px){
  .gift-card2 .gift-top{padding:6px 12px 6px 16px;min-height:60px}
  .gift-card2 .gift-scroll{padding:4px 20px 20px}
  .gift-card2.has-media .gift-scroll{display:grid;grid-template-columns:96px minmax(0,1fr);column-gap:14px;align-content:start}
  .gift-card2.has-media .gift-media,.gift-card2.has-media .gift-main{display:contents}
  .gift-card2.has-media .gift-picture{grid-column:1;grid-row:1;width:96px;height:72px;max-height:none;aspect-ratio:auto;border-radius:10px;align-self:start}
  .gift-card2.has-media .gift-head{grid-column:2;grid-row:1;min-width:0}
  .gift-card2.has-media .gift-view-room{grid-column:1 / -1;grid-row:2;justify-self:start;margin-top:12px}
  .gift-card2.has-media .gift-caption{grid-column:1 / -1;grid-row:3}
  .gift-card2.has-media .gift-main>:not(.gift-head){grid-column:1 / -1}
  .gift-dialog.gift-card2 h2{font-size:24px;margin:2px 0 4px}
  .gift-card2.has-media .gift-intro{font-size:14px}
  .gift-dialog.gift-card2 .gift-actions>*{flex:1 1 auto}
}
@media (max-width:359px){.gift-card2 .gift-share span{display:none}.gift-card2 .gift-share{padding:0 12px}}
/* tablets and phones on their side (the A panel): one column, the picture at most 30% of the height */
@media (min-width:481px){html.ui-a .gift-card2 .gift-picture{max-height:30vh;max-height:30dvh}}
html.ui-a .gift-dialog.gift-card2 .gift-actions>a.gift-button[href="checkout.html"]{display:inline-flex}
html.ui-a:not([data-gifts]) .gift-dialog.gift-card2 .gift-actions>a.gift-button[href="checkout.html"]{display:none}
/* ---- the target highlight (§0.4): the ring at the piece's top edge, and its label */
.gift-target{position:fixed;z-index:2;left:0;top:0;width:48px;height:48px;margin:-24px 0 0 -24px;padding:0;border:0;border-radius:50%;background:none;cursor:pointer}
.gift-target[hidden],.gift-target-label[hidden]{display:none}
.gift-target-dot{position:absolute;left:7px;top:7px;width:34px;height:34px;box-sizing:border-box;border:3px solid #fff;border-radius:50%;background:#10263d;box-shadow:0 0 0 6px rgba(31,79,216,.85),0 0 0 14px rgba(31,79,216,.28),0 2px 8px rgba(0,0,0,.4)}
.gift-target-dot::after{content:"";position:absolute;inset:8px;border-radius:50%;background:#C7A35A}
.gift-target:focus-visible{outline:2px solid #fff;outline-offset:14px}
.gift-target.is-pulsing .gift-target-dot{animation:gift-ring 1.2s ease-out 2}
@keyframes gift-ring{0%{box-shadow:0 0 0 6px rgba(31,79,216,.85),0 0 0 14px rgba(31,79,216,.28),0 2px 8px rgba(0,0,0,.4)}50%{box-shadow:0 0 0 6px rgba(31,79,216,.85),0 0 0 26px rgba(31,79,216,0),0 2px 8px rgba(0,0,0,.4)}100%{box-shadow:0 0 0 6px rgba(31,79,216,.85),0 0 0 14px rgba(31,79,216,.28),0 2px 8px rgba(0,0,0,.4)}}
@media (prefers-reduced-motion:reduce){.gift-target.is-pulsing .gift-target-dot{animation:none}}
.item-hotspot.is-target{box-shadow:0 0 0 3px #fff,0 0 0 8px rgba(31,79,216,.85),0 0 0 16px rgba(31,79,216,.28)!important;border-radius:50%}
.gift-target-label{position:fixed;z-index:2;left:0;top:0;padding:8px 12px;border-radius:999px;background:rgba(18,22,30,.82);color:#fff;font:600 14px/1 system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;white-space:nowrap;pointer-events:none;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 2px 8px rgba(0,0,0,.3)}
@media (forced-colors:active){.gift-target-dot{border-color:Highlight;box-shadow:none;outline:3px solid Highlight;outline-offset:4px}.item-hotspot.is-target{outline:3px solid Highlight}.gl .gl-chip[aria-pressed=true]{outline:3px solid Highlight;outline-offset:-3px}.gl .gl-pill.is-on{outline:3px solid Highlight}.gl select.gl-pill{-webkit-appearance:auto;appearance:auto;background-image:none;padding-right:16px;forced-color-adjust:auto}.gl select.gl-pill.is-on{background-image:none;border:3px solid Highlight}}
/* ---- the link notices (§0.2 states) */
.gift-link-note{position:fixed;z-index:5;left:50%;top:calc(var(--tour-toolbar-bottom,72px) + 10px);transform:translateX(-50%);display:flex;align-items:center;gap:8px;width:max-content;max-width:min(560px,calc(100vw - 24px));box-sizing:border-box;padding:6px 6px 6px 16px;border-radius:16px;background:#fff;color:var(--gl-ink);box-shadow:0 12px 40px rgba(0,0,0,.22);font:400 15px/1.35 var(--gl-ui)}
.gift-link-note[hidden]{display:none}
.gift-link-note p{flex:1 1 auto;margin:0;min-width:0}
.gift-link-note-do{display:flex;gap:6px;flex:none}
.gift-link-note button{min-height:48px;min-width:48px;margin:0;padding:0 14px;border:0;border-radius:12px;background:rgba(31,79,216,.10);color:var(--gl-p);font:600 15px/1 var(--gl-ui);cursor:pointer}
.gift-link-note .gift-link-note-x{flex:none;padding:0;border-radius:50%;background:#F1F2F4;color:var(--gl-ink);font-size:24px;font-weight:400}
@media (max-width:480px){.gift-link-note{flex-wrap:wrap;left:12px;right:12px;width:auto;transform:none}.gift-link-note p{flex-basis:calc(100% - 60px)}}
/* ---- the entry points (§2.2): the Rooms tiles' pill, "Browse all gifts", and "Dedicate a gift" while its list is open (G6) */
#place-list .tiles>.tile-wrap{flex:none;display:flex;flex-direction:column;gap:6px;min-width:0;width:calc((100cqw - (var(--cols) - 1) * var(--gx)) / var(--cols) - .05px)}
dialog#places #place-list .tile-wrap>.tile{width:100%}
#places .tile-gifts{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:48px;margin:0;padding:0 12px;border:0;border-radius:12px;background:rgba(31,79,216,.10);color:#1A46C2;font:600 14px/1.2 system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;cursor:pointer;text-align:center}
#places .tile-gifts:hover{background:rgba(31,79,216,.16)}
#places .tile-gifts .icon{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:1.6}
#places .browse-all svg{width:18px;height:18px;flex:none;fill:none;stroke:#1F4FD8;stroke-width:1.6}
html:not(.ui-a) #room-gifts.dedicate.is-open{background:#fff;color:#1F4FD8;box-shadow:inset 0 0 0 2px #1F4FD8}
html:not(.ui-a) #room-gifts.dedicate.is-open:hover{background:#EEF2FD}
.gift-ic{width:20px;height:20px;flex:none;display:inline-block}
.gift-card2 .gift-view-room .gift-ic{width:20px;height:20px}
html .gift-dialog.gift-card2 h2#gift-title:focus,html .gift-dialog.gift-card2 h2#gift-title:focus-visible,html .gl h2#gift-list-title:focus,html .gl h2#gift-list-title:focus-visible{outline:none}
/* the link card on a phone leaves its piece in view above it (card-phone-link): a light scrim, no blur */
html.ui-a .gift-dialog.gift-card2::backdrop{background:rgba(4,35,57,.16);-webkit-backdrop-filter:none;backdrop-filter:none}
@media (hover:hover) and (pointer:fine){html:not(.ui-a) .gift-dialog.gift-card2::backdrop{background:rgba(10,14,20,.38);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}
/* §8.9: the way back from a view=1 arrival, a glass chip at the top left */
.gift-back-chip{position:fixed;z-index:5;left:max(16px,calc(env(safe-area-inset-left,0px) + 12px));top:calc(var(--tour-toolbar-bottom,72px) + 10px);display:inline-flex;align-items:center;min-height:48px;padding:0 18px;border-radius:24px;background:rgba(18,22,30,.72);color:#fff;font:600 15px/1 system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;text-decoration:none;-webkit-backdrop-filter:blur(20px) saturate(160%);backdrop-filter:blur(20px) saturate(160%);box-shadow:0 4px 16px rgba(0,0,0,.2)}
.gift-back-chip[hidden]{display:none}
.gift-back-chip:focus-visible{outline:2px solid #fff;outline-offset:2px}
.gl .gl-name{align-items:flex-start}
.gift-peek .gl-step input{background:#fff;color:#111;margin:0;padding:0}
.gift-peek .gl-peek-row.is-selected{box-shadow:none;background:none}
.gift-peek .gl-peek-back{border-radius:12px}
/* a short window (a laptop at 720 px): the panel's header collapses to the title and the chips once the list scrolls */
@media (max-height:800px){.gift-panel .gl-head{padding-top:6px;padding-bottom:8px}.gift-panel .gl .gl-h2,.gift-panel .gl-h2{font-size:24px}}
/* ---- computers (the owner, 29 Sep ~17:40: "take full advantage of real estate on desktop"): the list is a LARGE panel, about 66% of
   the window (at most 1280 px), full height below the top bar; its rows run in two columns with 120x90 pictures, and the filters
   use the width. View collapses it to a slim strip at the right (the peek), whose "Back to the list" restores the panel. */
@media (hover:hover) and (pointer:fine) and (min-width:1024px){
  html:not(.ui-a) .gift-panel{width:min(66vw,1280px);min-width:640px;bottom:16px;border-radius:28px}
  html:not(.ui-a) .gift-panel .gl-head{display:flex;flex-wrap:wrap;align-items:center;column-gap:12px;padding:12px 20px 12px}
  html:not(.ui-a) .gift-panel .gl-title{flex:1 0 100%}
  html:not(.ui-a) .gift-panel .gl-chips{flex:1 1 320px;min-width:0;margin:2px -4px 0;padding:4px}
  html:not(.ui-a) .gift-panel .gl-pills{flex:none;margin-top:8px}
  html:not(.ui-a) .gift-panel .gl-body{padding:4px 20px 20px}
  html:not(.ui-a) .gift-panel .gl-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}
  html:not(.ui-a) .gift-panel .gl-list>:is(.gl-sec,.gl-grp,.gl-sentinel,.gl-end,.gl-empty-li,.gl-group.is-open,.gl-row.is-room){grid-column:1 / -1}
  html:not(.ui-a) .gift-panel .gl-list>.gl-row{border-radius:16px;border-bottom:0;box-shadow:0 1px 3px rgba(0,0,0,.08)}
  html:not(.ui-a) .gift-panel .gl-list>.gl-row.is-selected{box-shadow:inset 3px 0 0 #B8901F,0 1px 3px rgba(0,0,0,.08)}
  html:not(.ui-a) .gift-panel .gl-sec h3,html:not(.ui-a) .gift-panel .gl-grp h3{margin:10px 4px 0}
  html:not(.ui-a) .gift-panel .gl-pic{width:120px;height:90px;border-radius:10px}
  html:not(.ui-a) .gift-panel .gl-t{font-size:17px}
  html:not(.ui-a) .gift-panel .gl-bar.gift-bar{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"say do" "note do";align-items:center;column-gap:20px;padding:12px 20px}
  html:not(.ui-a) .gift-panel .gl-bar-say{grid-area:say}
  html:not(.ui-a) .gift-panel .gl-bar .gift-bar-note{grid-area:note}
  html:not(.ui-a) .gift-panel .gl-bar-do{grid-area:do;margin:0;flex-wrap:nowrap}
  html:not(.ui-a) .gift-peek.is-strip{left:auto;right:16px;bottom:auto;top:calc(var(--tour-toolbar-bottom,72px) + 8px);width:360px;min-height:0;padding:12px 16px 14px;border-radius:24px;box-shadow:0 12px 40px rgba(0,0,0,.22)}
  html:not(.ui-a) .gift-peek.is-strip .gl-peek-grab{display:none}
  html:not(.ui-a) .gift-peek.is-strip .gl-peek-head{flex-direction:column-reverse;align-items:stretch;gap:6px}
  html:not(.ui-a) .gift-peek.is-strip .gl-peek-back{align-self:flex-start;margin-left:-4px;font-size:16px}
}
/* the steppers' segments keep a full 48 px inside their 1.5 px outline (F1: no target below 48x48) */
.gl .gl-step,.gift-peek .gl-step,.gift-dialog.gift-card2 .gift-step{height:auto;min-height:51px}
.gl .gl-step button,.gl .gl-step input,.gift-peek .gl-step button,.gift-peek .gl-step input,.gift-dialog.gift-card2 .gift-step button,.gift-dialog.gift-card2 .gift-step input{min-height:48px}
.gl-row:has(.gl-step) .gl-add{min-height:51px}
/* (review B, M2) the phone sheet's bar stacks its two actions, and the long "One dedication for all …" label wraps inside its box */
.gift-dialog.gl-sheet .gl-bar-do>*{flex-basis:100%}
.gl .gl-bar-words{white-space:normal;min-width:0;text-align:left}
.gl-bar-do>.gl-bar-words{min-width:0}
/* (Astra's wide review 1-2, 4, 6, 7; review B M8) computers: the camera controls step left of the View strip; the rail's
   "Dedicate a gift" keeps its space but hides while the panel or the strip shows (it would close them); the room picker's chevron
   sits beside its name; Undo follows its message; the dedication box is two lines tall */
@media (hover:hover) and (pointer:fine) and (min-width:1024px){
  html:not(.ui-a):has(.gift-peek.is-strip:not([hidden])) .view-controls{right:calc(var(--gutter-r,16px) + 360px + 16px)}
  html:not(.ui-a):has(.gift-panel:not([hidden]),.gift-peek.is-strip:not([hidden])) #room-gifts{visibility:hidden}
  html:not(.ui-a) .gift-panel .gl-bar-do{flex-wrap:wrap}
  html:not(.ui-a) .gift-dialog.gift-card2 .gift-scroll textarea{min-height:calc(2 * 1.4em + 26px)}
}
.gl .gl-h2>.gl-name{flex:0 1 auto;display:inline;min-height:0;padding:0;border:0;background:none;font:inherit;color:inherit;cursor:inherit}
.gl .gl-bar-say .gift-bar-text{flex:0 1 auto;min-width:0}
/* (the A shell's tablet rules are more specific: the card's steppers keep their 48 px there too) */
html .gift-dialog.gift-card2 .gift-step button,html .gift-dialog.gift-card2 .gift-step input{min-height:48px}
html .gift-dialog.gift-card2 .gift-step{min-height:51px}
/* snap-3 (the snap-2 review's M2, L3, L6): the panel's bar gives its message room (stacked up to 1280 px, a bounded action column
   above); the two-line dedication box on every non-shell card; "All n" as tall as the stepper beside it */
@media (hover:hover) and (pointer:fine) and (min-width:1024px){
  html:not(.ui-a) .gift-panel .gl-bar.gift-bar{grid-template-columns:minmax(14em,1fr) fit-content(55%)}
}
@media (hover:hover) and (pointer:fine) and (min-width:1024px) and (max-width:1280px){
  html:not(.ui-a) .gift-panel .gl-bar.gift-bar{grid-template-columns:minmax(0,1fr);grid-template-areas:"say" "note" "do"}
  html:not(.ui-a) .gift-panel .gl-bar-do{margin-top:8px;justify-content:flex-end}
}
html:not(.ui-a) .gift-dialog.gift-card2 .gift-scroll textarea{min-height:calc(2 * 1.4em + 26px)}
.gl-row:has(.gl-step:not([hidden])) .gl-all,.gift-peek .gl-peek-row:has(.gl-step:not([hidden])) .gl-all{min-height:51px}
/* snap-5 (box run 1: A4, C2): the sheet's grab strip is a 6 px band at the very top, so the card's Back and Share (and the list's
   title) keep their full 48 px; its handle is drawn as before, and a drag still starts anywhere in the sheet's top 30 px that is no
   control. The visually hidden live regions take no negative margin (the standard pattern; nothing visible changes). */
@media (max-width:480px) and (orientation:portrait){html.ui-a .gift-dialog>.a-grab{height:6px}html.ui-a .gift-dialog>.a-grab::before{pointer-events:none}html.ui-a .gift-dialog.gift-card2 .gift-top,html.ui-a .gift-dialog.gl-sheet .gl-head{touch-action:none}}
.gift-sr{margin:0;padding:0;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
/* snap-7 A5: the non-modal list panel sits CLEAR of the rail, the 360 interactive beside it (DESIGNS 0.7). Computers: the panel
   stops above the bottom band (the stop strip, Home, Back, Next stop) as the 452 px panel always did, and Look and Zoom move to
   the panel's left, as they already do beside the strip. The shell (tablets, phones on their side): the panel stops above the
   route row, and "Dedicate a gift" sits to the panel's left. Widths, columns and the rest of the panel's look are unchanged. */
@media (min-width:640px){html:not(.ui-a):has(.gift-panel:not([hidden])) .view-controls{right:calc(var(--gutter-r,16px) + min(452px,calc(100vw - 32px)) + 16px)}}
@media (hover:hover) and (pointer:fine) and (min-width:1024px){html:not(.ui-a) .gift-panel{bottom:calc(var(--rail-h,164px) + 12px)}
  html:not(.ui-a):has(.gift-panel:not([hidden])) .view-controls{right:calc(var(--gutter-r,16px) + max(640px,min(66vw,1280px)) + 16px)}}
html.ui-a .gift-panel{bottom:calc(var(--rail-h,80px) + 12px)}
html.ui-a:has(.gift-panel:not([hidden])) #room-gifts{right:calc(max(12px,env(safe-area-inset-right,0px)) + max(300px,min(400px,48vw)) + 12px)}
html.ui-a:has(.gift-panel:not([hidden])) .view-controls{right:calc(max(12px,env(safe-area-inset-right,0px)) + max(300px,min(400px,48vw)) + 12px)}
/* snap-7 P5: phones (upright, and on their side): the card's main action stays in view. SW81 had put the card's actions in
   the flow (F1), so on short and landscape phones Dedicate, Save changes, Save for this gift and Sponsor the rest of the room
   sat below the fold. The row is sticky at the foot of the card's scroll again (white, a hairline above), as SW80's sheet was:
   upright its form holds it (tour360.js fit() already opens the sheet tall enough to show the form's top and this row); on a
   phone on its side the form lets the row stick through the whole card column. The table card's three-button row stays in the
   flow (by design). After a save its four buttons sit two by two (in their order), so the row stays two buttons tall,
   and "Remove from your gifts" takes two short lines at most; a long label wraps
   inside its button rather than running off the panel. A computer and a tablet are unchanged. */
@media (max-width:480px) and (orientation:portrait){
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:not(:has(.gift-set-action)){position:sticky!important;bottom:-20px;z-index:2;margin:4px -20px 0!important;padding:10px 20px calc(10px + env(safe-area-inset-bottom,0px))!important;background:#fff!important;box-shadow:0 -1px 0 #E5E7EB!important}
}
@media (max-height:520px) and (orientation:landscape){
  html.ui-a .gift-dialog.gift-card2 .gift-scroll form:not(:has(.gift-set-action)):has(>.gift-actions){display:contents!important}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:not(:has(.gift-set-action)){position:sticky!important;bottom:-28px;z-index:2;margin:4px -32px 0!important;padding:10px 32px 12px!important;background:#fff!important;box-shadow:0 -1px 0 #E5E7EB!important}
}
@media (max-width:480px) and (orientation:portrait),(max-height:520px) and (orientation:landscape){
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:not(:has(.gift-set-action))>*{min-width:0;max-width:100%;white-space:normal}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions.is-saved:not(:has(.gift-set-action)){display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px!important}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions.is-saved:not(:has(.gift-set-action))>.gift-remove{min-height:48px;padding:4px 6px;font-size:13px;line-height:1.2}
  html.ui-a .gift-dialog.gift-card2:has(form>.gift-actions):not(:has(.gift-set-action)) .gift-scroll{-webkit-mask-image:none;mask-image:none;scroll-padding-bottom:calc(140px + env(safe-area-inset-bottom,0px))}
}
/* snap-7.1 C: phones on their side (the A shell, max-height:520px landscape): the list panel's head and foot are compacted, so the
   panel can sit clear of the rail (A5) and still show its list. The head is two 44-48 px rows: the room title and x (a smaller title;
   the kicker inline; the summary kept for screen readers), then ONE sideways strip holding the type chips and the Price, Sort and
   Dedicated controls (the title row stays put while the strip scrolls). The foot is one row: the last change and Undo, the pen
   (its words kept for screen readers) and Review your gifts; the "nothing is sent" note is kept for screen readers. Upright phones
   (the sheet), tablets and computers are unchanged. */
@media (max-height:520px) and (orientation:landscape){
  html.ui-a .gift-panel{container-type:inline-size}
  html.ui-a .gift-panel .gl-head{overflow-x:auto;overflow-y:hidden;white-space:nowrap;padding:4px 12px;scrollbar-width:none;overscroll-behavior-x:contain}
  html.ui-a .gift-panel .gl-head::-webkit-scrollbar{display:none}
  html.ui-a .gift-panel .gl-title{position:sticky;left:0;z-index:1;width:calc(100cqw - 24px);box-sizing:border-box;align-items:center;white-space:normal}
  html.ui-a .gift-panel .gl-h2{flex-wrap:nowrap;align-items:center;min-height:44px;padding:0;font-size:20px;white-space:nowrap;overflow:hidden}
  html.ui-a .gift-panel .gl-kicker{flex:none;font-size:10px}
  html.ui-a .gift-panel .gl-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  html.ui-a .gift-panel .gl-pick{display:flex;align-items:center;gap:8px}
  html.ui-a .gift-panel .gl-pick>.gl-h2{flex:none;min-height:0}
  html.ui-a .gift-panel select.gl-room.gl-pill{flex:0 1 auto;min-width:0;height:44px;margin:0;border-radius:22px}
  html.ui-a .gift-panel .gl-close{width:44px;height:44px;min-width:44px}
  html.ui-a .gift-panel .gl-chips,html.ui-a .gift-panel .gl-pills,html.ui-a .gift-panel .gl-head.is-collapsed .gl-pills{display:inline-flex;flex-wrap:nowrap;vertical-align:top;margin:4px 0 0;padding:0;overflow:visible;-webkit-mask-image:none;mask-image:none}
  html.ui-a .gift-panel .gl-chips:empty{display:none}
  html.ui-a .gift-panel .gl-pills{margin-left:8px;margin-right:12px}
  html.ui-a .gift-panel .gl-bar.gift-bar{display:flex;align-items:center;gap:8px;padding:4px 12px}
  html.ui-a .gift-panel .gl-bar-say,html.ui-a .gift-panel .gl-bar-do{display:contents}
  html.ui-a .gift-panel .gl-bar .gift-bar-text{flex:1 1 0;min-width:0;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px}
  html.ui-a .gift-panel .gl-bar-do>*{flex:none;min-width:48px}
  html.ui-a .gift-panel .gl-bar-words{width:48px;padding:0;justify-content:center}
  html.ui-a .gift-panel .gl-bar-do>.gl-review{flex:0 1 auto;min-width:48px;padding:0 12px;white-space:normal;line-height:1.1;text-align:center}
  html.ui-a .gift-panel .gl-bar .gift-bar-text.is-notice,html.ui-a .gift-panel .gl-bar .gift-bar-text.is-error{min-width:80px}
  html.ui-a .gift-panel .gl-bar.is-feed-off{flex-wrap:wrap;row-gap:2px}
  html.ui-a .gift-panel .gl-bar.is-feed-off .gift-bar-note{flex:1 0 100%;order:-1;margin:0;font-size:12px;line-height:1.25;white-space:normal}
  html.ui-a .gift-panel .gl-sum,html.ui-a .gift-panel .gl-bar:not(.is-feed-off) .gift-bar-note,html.ui-a .gift-panel .gl-bar-words .gift-bar-words-text,
  html.ui-a .gift-panel .gl-bar:has(.gl-review:not([hidden])) .gift-bar-text:not(.is-notice):not(.is-error){position:absolute;width:1px;height:1px;margin:0;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
}
/* snap-7.6 (the redesign-a-audit rows): (1) short landscape phones: a set piece's card (two offers: this piece and the whole
   table) keeps its main action in view: Dedicate (once saved, Review your gifts, the saved state's primary) is sticky at the foot
   of the card's scroll on a white band, and the other actions follow in the card's flow, one full-width line each (P5's sticky
   row skips these cards; as one row their five saved buttons took over half the screen); (2) upright phones no taller than
   480 px: "Dedicate a gift" takes the sponsor pill's compact form (44 px, no icon) at the lower right, off the view's centre,
   so a drag from the middle turns the view. */
@media (max-height:520px) and (orientation:landscape) and (max-width:960px){
  html.ui-a .gift-dialog.gift-card2 .gift-scroll form:has(>.gift-actions .gift-set-action){display:contents!important}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:has(.gift-set-action){display:contents!important}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:has(.gift-set-action)>*{box-sizing:border-box;width:100%;max-width:100%;margin-top:10px;white-space:normal;text-align:center;justify-content:center}
  html.ui-a .gift-dialog.gift-card2 .gift-scroll form:has(>.gift-actions .gift-set-action)>*,html.ui-a .gift-dialog.gift-card2 form>.gift-actions:has(.gift-set-action)>*{grid-column:1 / -1}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:has(.gift-set-action)>*{order:0}
  html.ui-a .gift-dialog.gift-card2 form>.gift-actions:has(.gift-set-action):not(.is-saved)>.gift-primary,html.ui-a .gift-dialog.gift-card2 form>.gift-actions:has(.gift-set-action).is-saved>a.gift-button{position:sticky;bottom:-18px;z-index:2;box-shadow:0 0 0 10px #fff}
  html.ui-a .gift-dialog.gift-card2:has(form>.gift-actions .gift-set-action) .gift-scroll{-webkit-mask-image:none;mask-image:none;scroll-padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
}
@media (max-width:480px) and (orientation:portrait) and (max-height:480px){
  html.ui-a #room-gifts{height:44px;padding:0 14px;gap:0;border-radius:999px;font-size:13px;bottom:calc(var(--rail-h,160px) + 8px)}
  html.ui-a #room-gifts::before{display:none}
}
/* SW82 D4: while a chip in it has keyboard focus, the chip row drops its end fade, so the focused chip and its ring are whole */
.gl-chips:has(.gl-chip:focus-visible){-webkit-mask-image:none;mask-image:none}
/* ===== end SW81 ===== */
/* SW83 "Dedicated by" (DEDICATED-BY v2.1 §5.4): the byline under the words, the name alone in the plaque's serif, the list's line */
.gift-plaque-by{margin:6px 0 0;font:400 .875rem/1.4 var(--gl-ui,Inter,system-ui,sans-serif);color:#4A5E70;overflow-wrap:anywhere}
.gift-plaque-by bdi,.gift-plaque-name bdi,.gift-by bdi,.gl-by bdi{font-weight:600;color:#042339}
.gift-plaque-name{overflow-wrap:anywhere}.gift-plaque-name bdi{font-weight:inherit}
.gift-by{display:block;color:#4A5E70;overflow-wrap:anywhere}
.gl .gl-by{display:block;margin-top:2px;font:400 13px/1.35 var(--gl-ui,Inter,system-ui,sans-serif);color:var(--gl-ink3,#4A5E70);overflow-wrap:anywhere}
.gl .gl-by bdi{color:var(--gl-ink,#042339)}
