.review-sidebar-header{padding:20px 20px 12px}.review-sidebar-header h2{margin:0 0 12px;font:650 20px/1.3 Fraunces,serif;color:#3A2A38}.review-sidebar-header input,.review-picker input{box-sizing:border-box;width:100%;min-height:44px;border:1px solid #EADDE4;border-radius:12px;padding:0 12px;background:#fff;font:700 14px Nunito,sans-serif}.review-summary,.review-filter-chips{display:flex;gap:8px;align-items:center;padding:0 20px 12px;flex-wrap:wrap}.review-summary span,.review-summary button,.review-filter-chips button{border:0;border-radius:999px;padding:7px 10px;background:#F7EFF2;color:#705A6C;font:800 12px Nunito,sans-serif}.review-summary .blocked{background:#FBE2E6;color:#A92F4B}.review-fit-info{flex:0 0 auto}.review-fit-info summary{min-width:32px;min-height:32px;display:grid;place-items:center;border-radius:999px;background:#F7EFF2;color:#705A6C;cursor:pointer;font-size:13px}.review-fit-info p{flex:1 0 100%;margin:8px 0 0;color:#705A6C;font:700 13px/1.4 Nunito,sans-serif}.review-fit-info[open]{flex:1 0 100%}.review-filter-chips button.on,.review-filter-attention.on{background:#694597;color:#fff}.review-table-list{border-top:1px solid #EADDE4}.review-table{border-bottom:1px solid #EADDE4}.review-table-header{display:grid;grid-template-columns:24px minmax(0,1fr) auto auto auto 28px;gap:8px;width:100%;align-items:center;border:0;background:#fff;padding:14px 20px;text-align:left;color:#3A2A38;font:800 15px Nunito,sans-serif;min-height:56px;transition:box-shadow 120ms cubic-bezier(.22,1,.36,1)}.review-table.expanded .review-table-header{box-shadow:inset 3px 0 #E4577B;background:#FFF7F9}.review-table-shape{width:18px;height:18px;border:2px solid #9D7BD8;border-radius:50%}.review-table-shape.rect{border-radius:4px}.review-table-shape.chair{width:12px;height:12px;border-radius:3px;border-color:#7FA886}.review-occupancy,.review-table-fit{font-variant-numeric:tabular-nums;font-size:13px;color:#705A6C}.review-table-fit.blocked{color:#A92F4B}.review-issue-badge{min-width:18px;border-radius:99px;background:#FBE2E6;color:#A92F4B;text-align:center;font-variant-numeric:tabular-nums}.review-guest-list{list-style:none;margin:0;padding:2px 10px 10px}

/* Rows are flex, not grid: the kept-placement pin appears only on some of
   them and must never push the fit badge out of its column. */
.review-guest{display:flex;align-items:center;gap:7px;min-height:44px;padding:4px 5px;border-radius:10px}.review-guest.selected{background:#EFE7FB}.review-avatar{flex:0 0 auto;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;color:#fff;font:800 12px Nunito,sans-serif}.review-avatar.empty{background:#F7EFF2;color:#705A6C}.review-guest-name{flex:1 1 auto;min-width:0;overflow:hidden;border:0;background:transparent;text-align:left;text-overflow:ellipsis;white-space:nowrap;color:#3A2A38;font:800 15px Nunito,sans-serif}.review-drag-handle,.review-row-move{flex:0 0 auto;min-width:44px;min-height:44px;border:0;background:transparent;color:#705A6C;cursor:grab;touch-action:pan-y}.review-pin{flex:0 0 auto;font-size:11px;line-height:1}.review-person-fit{flex:0 0 auto;font:800 13px Nunito,sans-serif;font-variant-numeric:tabular-nums;color:#356649}.review-person-fit.needs_attention,.review-person-fit.worth_checking{color:#805718}.review-person-fit.blocked,.review-person-fit.unseated{color:#A92F4B}.review-guest.locked{opacity:.75}.review-locked-label{color:#705A6C;font:700 13px Nunito,sans-serif}.review-empty-slot{display:flex;align-items:center;gap:7px;min-height:44px;padding:4px 5px;border-radius:10px;color:#705A6C;font:700 13px Nunito,sans-serif}.review-slot-name{flex:1 1 auto}.review-slot-free{font-variant-numeric:tabular-nums;font-size:12px}.review-hidden-count{padding:8px 5px;color:#705A6C;font:700 13px Nunito,sans-serif}.review-detail-host{list-style:none;margin:0;padding:0}

.review-inspector,.review-picker,.review-unseated{margin:12px 16px;padding:14px;border:1px solid #EADDE4;border-radius:14px;background:#FFF9F3}.review-inspector h3,.review-picker h3,.review-unseated h3{margin:0 0 8px;font:650 16px Fraunces,serif}.review-current-place,.review-reason,.review-preview-row,.review-preview-hint{margin:6px 0;color:#705A6C;font:700 13px/1.4 Nunito,sans-serif}.review-preview-row{font-variant-numeric:tabular-nums;color:#3A2A38}.review-fit-bucket{display:inline-block;margin:2px 0 6px;border-radius:999px;padding:4px 9px;background:#E4F0E6;color:#356649;font:800 12px Nunito,sans-serif}.review-fit-bucket.needs_attention,.review-fit-bucket.worth_checking{background:#FBF0D7;color:#805718}.review-fit-bucket.blocked,.review-fit-bucket.unseated{background:#FBE2E6;color:#A92F4B}.review-fit-bucket.no_preferences{background:#F7EFF2;color:#705A6C}.review-more-reasons summary,.review-row-overflow summary,.review-footer-overflow summary,.review-preview-more summary{cursor:pointer;min-height:32px;color:#694597;font:800 13px Nunito,sans-serif}.review-keep{display:flex;align-items:center;gap:8px;min-height:44px;margin-top:8px;color:#3A2A38;font:700 13px Nunito,sans-serif}.review-keep input{width:20px;height:20px}.review-inspector-controls,.review-sidebar-footer{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.review-inspector-controls button,.review-sidebar-footer button,.review-picker-choice,.review-picker-close,.review-unseat,.review-edit-relationship,.review-toast-undo,.review-sheet-close{min-height:44px;border:1px solid #DCCBD4;border-radius:10px;background:#fff;padding:0 12px;color:#3A2A38;font:800 13px Nunito,sans-serif}.review-primary{background:#A92F4B;color:#fff;border-color:#A92F4B}.review-confirm{margin-top:8px;padding:10px;border-radius:12px;background:#FBE2E6}.review-confirm p{margin:0 0 8px;color:#A92F4B;font:800 13px Nunito,sans-serif}.review-confirm button{margin-right:8px}

.review-picker{position:relative}.review-picker-close{position:absolute;right:12px;top:10px}.review-picker-choices{max-height:220px;overflow:auto;margin-top:9px}.review-picker-choice{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;width:100%;margin:5px 0;text-align:left}.review-choice-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.review-choice-meta{font-variant-numeric:tabular-nums;color:#705A6C;font-weight:700}.review-choice-reason{flex:1 0 100%;color:#805718;font:700 12px Nunito,sans-serif}.review-picker-choice.invalid{opacity:.55}.review-picker-choice.chosen{border-color:#694597;background:#EFE7FB}.review-picker-footer{margin-top:10px;border-top:1px solid #EADDE4;padding-top:10px}.review-picker-footer .review-apply{width:100%}.review-preview{background:#E4F0E6;border-radius:12px;padding:10px}.review-move-error-box{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:8px 16px}.review-move-error{margin:0;color:#A92F4B;font:800 13px Nunito,sans-serif}.review-sidebar-footer{padding:12px 16px;border-top:1px solid #EADDE4}.review-footer-overflow{flex:1 0 100%}.review-footer-overflow button{display:block;width:100%;margin-top:8px}.review-toast{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:12px 16px;padding:10px 12px;border-radius:14px;background:#3A2A38;color:#fff;font:800 13px Nunito,sans-serif}.review-toast-undo{background:transparent;border-color:#ffffff55;color:#fff}

/* Announcements only — one committed change at a time, never a drag frame. */
.review-live{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

/* The ghost is painted, never hit-tested: elementFromPoint has to see the row
   under the finger, not the thing following it. */
.review-ghost{position:fixed;left:0;top:0;z-index:60;pointer-events:none;transform:translate3d(-9999px,-9999px,0);max-width:260px;padding:10px 12px;border-radius:14px;border:1px solid #EADDE4;background:#fff;color:#3A2A38;font:800 13px Nunito,sans-serif;box-shadow:0 14px 34px #3a2a3833;scale:1.025}.review-ghost.flat{scale:1;box-shadow:0 2px 6px #3a2a3822}.review-ghost-preview{margin-top:6px;background:transparent;padding:0}.review-ghost-preview .review-preview-row{margin:2px 0;font-size:12px}.review-dragging [data-unit-id],.review-drop-active .tbl,.review-drop-active .seat{outline:2px solid #EADDE4;outline-offset:3px}.review-drop-ok{outline:2px solid #7FA886!important;outline-offset:5px;transition:outline-offset 380ms cubic-bezier(.22,1,.36,1)}

.review-sheet-scrim{position:fixed;inset:0;z-index:70;background:#3a2a3855;display:flex;align-items:flex-end}.review-sheet{position:relative;width:100%;max-height:min(72dvh,560px);overflow:auto;border-radius:22px 22px 0 0;background:#FFF9F3;padding:16px 12px calc(16px + env(safe-area-inset-bottom))}.review-sheet-close{position:sticky;top:0;float:right}.review-sheet .review-inspector{margin:0;border:0;background:transparent}body.review-sheet-open{overflow:hidden}

@media(max-width:767px){.review-table-header{padding-inline:14px}.review-summary,.review-filter-chips,.review-sidebar-header{padding-inline:14px}.review-inspector,.review-picker,.review-unseated,.review-toast,.review-move-error-box{margin-inline:12px}}
@media(prefers-reduced-motion:reduce){.review-ghost,.review-drop-ok,.review-table-header{transition:none!important;scale:1}.review-check,.review-bulk-bar,.review-lock-badge{animation:none!important}}

/* An open run of chairs hands out a page of rows at a time; this is the way
   to ask for the next one. */
.review-more-rows { list-style:none; padding:8px 0; }
.review-more-button { min-height:44px; padding:8px 14px; border:1px solid var(--line,#eadde4); border-radius:12px; background:#fff; color:var(--text-2,#705a6c); font:700 13px/19px inherit; cursor:pointer; }

/* A lock is a state, not a disabled control: the drag handle is replaced by
   the padlock rather than greyed beside it, so there is nothing left to grab.
   (Note the lowercase `lockin` in styles.css — a different animation on the
   guest-link badge. Keyframe names are case-sensitive; these do not collide.) */
.review-lock-badge { flex:0 0 auto; min-width:36px; display:grid; place-items:center; font-size:14px;
  animation:lockIn var(--dur-s,220ms) var(--spring,cubic-bezier(.34,1.56,.64,1)) both; }
@keyframes lockIn { from { opacity:0; transform:translateY(-6px) scale(.6); } to { opacity:1; transform:none; } }

/* Selection is a bulk verb (§8.5). A round box on every row, a tri-state one
   on every table header, and a bar that says what it is about to do to the
   set. Disabled means the guest is locked, or is the companion of one. */
.review-check { appearance:none; -webkit-appearance:none; flex:0 0 auto; width:20px; height:20px; margin:0;
  border:1.5px solid var(--guest-border,#cfc4cc); border-radius:50%; background:#fff; cursor:pointer;
  display:grid; place-items:center; transition:background var(--dur-xs,120ms), border-color var(--dur-xs,120ms); }
.review-check:checked { border-color:var(--rose,#e4577b);
  background:var(--rose,#e4577b) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7'/%3E%3C/svg%3E") center/13px no-repeat;
  animation:checkPop var(--dur-s,220ms) var(--spring,cubic-bezier(.34,1.56,.64,1)); }
.review-check:indeterminate { background:var(--rose-soft,#fbe3ea); border-color:var(--rose,#e4577b); }
.review-check:indeterminate::after { content:""; width:9px; height:2.5px; background:var(--rose,#e4577b); border-radius:2px; }
.review-check:disabled { opacity:.35; cursor:not-allowed; }
.review-table-header .review-check { justify-self:center; }
@keyframes checkPop { 0% { transform:scale(1); } 50% { transform:scale(1.25); } 100% { transform:scale(1); } }

/* The bar is the only thing in the sidebar that follows you down the list —
   it appears with the first tick and leaves with the last. */
.review-bulk-bar { position:sticky; bottom:0; z-index:3; display:flex; gap:8px; align-items:center;
  padding:10px 14px; background:#fff; border-top:1px solid var(--line,#eadde4);
  box-shadow:0 -8px 24px rgba(58,42,56,.08); font:700 13px Nunito,sans-serif;
  animation:barUp var(--dur-s,220ms) var(--spring,cubic-bezier(.34,1.56,.64,1)) both; }
.review-bulk-bar[hidden] { display:none; }
.review-bulk-count { display:grid; margin-right:auto; font-weight:900; }
/* The second line, when companions are coming along uninvited by the tick. */
.review-bulk-count small { font-size:11px; font-weight:700; color:var(--ink-faint,#7c6678); }
.review-bulk-bar button { min-height:44px; border:0; border-radius:12px; padding:8px 12px;
  background:var(--panel2,#fff2e9); color:var(--ink,#3a2a38); font:900 13px Nunito,sans-serif; cursor:pointer;
  transition:transform var(--dur-xs,120ms); }
.review-bulk-bar button:hover { transform:translateY(-1px); }
.review-bulk-bar .review-primary { background:var(--rose,#e4577b); border-color:var(--rose,#e4577b); color:#fff; }
.review-bulk-bar .review-bulk-clear { background:none; color:var(--ink-faint,#7c6678); padding:8px; }
@keyframes barUp { from { transform:translateY(100%); opacity:0; } to { transform:none; opacity:1; } }

/* ── what a lock, a split and a disabled choice look like ───
   Emitted by review-ui.js; every one of them is a sentence the organiser has
   to be able to read, so none of them is smaller than the row it explains. */
.review-row-note { display:block; font:700 12px Nunito,sans-serif; color:var(--ink-faint,#7c6678); }
.review-guest-name .review-row-note { margin-top:1px; }

/* A destination that is refusing, and the one action that would unrefuse it.
   Rendered as a div rather than a button (a button inside a button is
   unreachable), so it carries the choice's look explicitly. */
.review-picker-choice.disabled { opacity:.6; cursor:not-allowed; }
.review-picker-choice.disabled .review-choice-reason { color:var(--advisory,#805718); }
.review-unlock-move, .review-split-offer {
  grid-column:1 / -1; justify-self:start; min-height:36px; padding:6px 0; border:0; background:none;
  color:var(--lilac-ink,#694597); font:800 12px Nunito,sans-serif; text-decoration:underline;
  text-underline-offset:3px; cursor:pointer; opacity:1;
}
.review-unlock-move:hover, .review-split-offer:hover { color:var(--rose-deep,#c23a61); }

/* Separating two people who arrived together is a decision, so it is asked
   for once, in place, with the consequence spelled out. */
.review-split-confirm { display:grid; gap:8px; padding:10px 12px; border-radius:12px;
  background:var(--lilac-bg,#efe7fb); font:700 13px/1.4 Nunito,sans-serif; color:var(--ink,#3a2a38);
  animation:barUp var(--dur-s,220ms) var(--spring,ease) both; }
.review-split-confirm .review-split-actions { display:flex; gap:8px; flex-wrap:wrap; }
.review-split-confirm button { min-height:44px; border:0; border-radius:12px; padding:8px 14px;
  font:900 13px Nunito,sans-serif; cursor:pointer; }
.review-split-go { background:var(--lilac,#9d7bd8); color:#fff; }
.review-split-keep { background:none; color:var(--ink-soft,#705a6c); text-decoration:underline; text-underline-offset:3px; }
@media (prefers-reduced-motion:reduce) { .review-split-confirm { animation:none; } }

/* The list's table shape wears the map's occupancy ring (§6 of the seating map
   plan): a full ring is a full table, in the same ink, so a scan down the rail
   reads the room the way the floor does. */
.review-table-shape { position:relative; }
.review-table-shape::before { content:""; position:absolute; inset:-5px; border-radius:50%; padding:2px; box-sizing:border-box;
  background:conic-gradient(var(--ink,#3A2A38) calc(var(--fill,0) * 1turn), transparent 0); pointer-events:none;
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); mask-composite:exclude; }
.review-table-shape.rect::before, .review-table-shape.chair::before { border-radius:7px; }
