/* Booking Board management UI (dashboard + editor)
 * Plan: docs/plans/BOOKING-BOARD-DEFINITIVE-BUILD-PLAN-2026-06-20.md §4 Stage 5
 * Loaded after style.css so these rules win; scoped to .bb-* / .bb-modal. */

/* Overlay container. booking-board-dashboard.js mounts
 * <div class="modal-overlay bb-overlay"> straight onto <body>, but the project
 * has no base `.modal-overlay` rule (other modals are inline in index.html and
 * style their own wrappers), so without this the overlay rendered as an
 * unpositioned, invisible static block at the foot of the page — tapping
 * "Booking board" did nothing. Give it the standard full-viewport scrim +
 * centred dialog. */
.bb-overlay {
  position: fixed;
  inset: 0;
  z-index: var(--z-modal, 3000);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: rgba(15, 23, 42, 0.55);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  overflow-y: auto;
  overscroll-behavior: contain;
  animation: bbOverlayIn 0.18s ease-out;
}

@keyframes bbOverlayIn { from { opacity: 0; } to { opacity: 1; } }

/* On phones the dialog should use the full width and not get clipped by the
 * viewport — cap its height and let the body scroll inside. */
@media (max-width: 640px) {
  /* The whole screen, square (owner 2026-10-30, "close the gap, for this and
     bookings ... these various areas can use the greater height"), as Plan a
     meeting and Share days. */
  .bb-overlay { padding: 0; align-items: stretch; }
  .bb-overlay .bb-modal { max-width: 100%; min-height: 100dvh; max-height: 100dvh; border-radius: 0; }
  .bb-overlay .bb-modal > :last-child { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
}

.bb-modal { max-width: 640px; width: 100%; }

/* Rounded BOTTOM (2026-07-20, user: "the bottom of the booking board is
   currently square"). The panel inherits a full border-radius from the base
   .modal-content, but the pinned .modal-footer action bar at the bottom carries
   its own --surface-secondary background + top border and, as the last flex
   child filling the panel's bottom edge, its square corners showed through
   (the parent's overflow-clip rounds the panel box, but the footer's opaque
   fill reads as a square shelf inside it). Round the footer's bottom corners to
   match the panel so the whole board ends in a clean radius. Belt-and-braces:
   also pin the panel radius explicitly so a future base-token change can't
   re-square it. */
.bb-modal { border-radius: var(--radius-2xl, 20px); overflow: hidden; }
.bb-modal .modal-footer,
.bb-modal .bb-editor-footer,
/* WHATEVER ENDS THE PANEL (2026-08-14, user: "Booking board initially loads
   with a jagged rather than rounded bottom"). The rule rounded only the FOOTER
   - but show() mounts header + body with NO footer, so during "Loading..." the
   last child is .modal-body, an opaque square-cornered surface painting over
   the rounded panel. */
.bb-modal > :last-child {
  border-bottom-left-radius: var(--radius-2xl, 20px);
  border-bottom-right-radius: var(--radius-2xl, 20px);
}

/* The base `.modal-content` rule (style.css) caps the dialog at max-height:90vh
 * with overflow:hidden and lays its children out as a flex column. The booking
 * board now adopts the app-canonical shell — `.modal-header` (pinned) /
 * `.modal-body` (the large scrollable white area: padding, flex:1, overflow-y:
 * auto) / `.modal-footer` (pinned action bar). `.bb-body` keeps its class only as
 * a scoping hook for the booking-board-specific field styles below; it inherits
 * all its scroll/padding/white surface from `.modal-body`. Scoped so every other
 * modal that shares `.modal-content` is untouched. */
.bb-modal { display: flex; flex-direction: column; }
.bb-modal .modal-header { flex-shrink: 0; }
.bb-loading, .bb-error { padding: 24px 4px; color: var(--text-secondary, #64748b); }
.bb-error { color: var(--danger-fg, #b91c1c); }
/* ⭐2026-08-20 (owner: "New booking board area still has a lot of scrollable
   space"). The editor's inline form-error box ships as
   `<div class="bb-error hidden" id="bb-formerr">` — but `.hidden` is NOT
   defined in this stylesheet, so the "hidden" box rendered as an empty
   BLOCK. Measured live in the created-board editor: 548px tall — more than
   every real field in the form combined (the whole body scrolled 1451px for
   ~900px of content). It also keeps its 24px padding while empty. Hide it
   properly, and collapse ANY empty .bb-error so a cleared error leaves no
   ghost gap behind. */
.bb-error.hidden,
.bb-error[hidden] { display: none; }
.bb-error:empty { display: none; padding: 0; }

/* Empty / upsell state */
.bb-empty { padding: 8px 4px 4px; }
.bb-empty p { color: var(--text-secondary, #64748b); margin: 0 0 16px; line-height: 1.55; }

/* Board row */
.bb-row {
  display: flex; gap: 12px; align-items: flex-start; justify-content: space-between;
  padding: 14px 0; border-bottom: 1px solid var(--border-color, #e2e8f0); flex-wrap: wrap;
}
.bb-row:last-of-type { border-bottom: 0; }
.bb-row-main { min-width: 0; flex: 1 1 260px; }
.bb-row-title { font-weight: 600; display: flex; align-items: center; gap: 8px; }
.bb-row-url { font-size: .85rem; margin: 3px 0; word-break: break-all; }
.bb-row-url a { color: var(--primary-700, #0f766e); }
.bb-row-meta { font-size: .82rem; color: var(--text-secondary, #64748b); }
.bb-row-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: flex-start; }
/* The rarer actions under ⋯ (review L3/U3, 2026-10-17): its own full-width line. */
.bb-row-more { flex: 1 1 100%; display: flex; flex-wrap: wrap; gap: 6px; padding-top: 6px; border-top: 1px dashed var(--border-color, #e2e8f0); }
.bb-row-more[hidden] { display: none; }
.bb-more-btn { min-width: 44px; }
/* The editor's three questions, live preview and More options (2026-10-16). */
.bb-q { display: flex; flex-direction: column; gap: 10px; padding: 0 0 14px; margin: 0 0 14px; border-bottom: 1px solid var(--border-color, #e2e8f0); }
.bb-q-h { display: flex; align-items: center; gap: 10px; margin: 0; font-size: 16px; font-weight: 800; color: var(--text-primary, #0f172a); }
/* The first-run setup (2026-10-25, review H1): one line saying what it makes, then the three questions. */
.bb-firstrun-intro { margin: 0 0 16px; font-size: 14px; line-height: 1.5; color: var(--text-secondary, #475569); }
.bb-q-n { width: 26px; height: 26px; border-radius: 50%; flex: none; display: inline-flex; align-items: center; justify-content: center;
  background: var(--primary-700, #0f766e); color: #fff; font-size: 14px; font-weight: 800; }
.bb-q-hours { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.bb-q--live { border-bottom: 0; }
.bb-q-label { font-size: 12px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--text-secondary, #475569); }
.bb-live { padding: 12px; border-radius: 18px; background: var(--bg-secondary, #f8fafc); border: 1px solid var(--border-color, #e2e8f0); }
.bb-live-card { display: flex; flex-direction: column; gap: 8px; padding: 14px; border-radius: 16px; border: 2px solid #0f766e; color: #0f172a;
  background: linear-gradient(135deg, #eefaf6 0%, #e6f4fb 55%, #f3eefc 100%); }
.bb-live-top { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 700; }
.bb-live-av { width: 30px; height: 30px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; background: #c7f0e1; font-weight: 800; }
.bb-live-title { font-size: 19px; line-height: 1.2; }
.bb-live-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.bb-live-chip { padding: 2px 10px; border-radius: 999px; background: rgba(255,255,255,.8); font-size: 12px; font-weight: 600; }
body.dark-mode .bb-live-card { color: #f1f5f9; border-color: #5eead4; background: linear-gradient(160deg, #0b1220 0%, #16233b 60%, #1f2f4d 100%); }
body.dark-mode .bb-live-av { background: #134e4a; color: #ccfbf1; }
body.dark-mode .bb-live-chip { background: rgba(255,255,255,.08); }
.bb-more { border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; margin: 0 0 12px; }
.bb-more > summary { display: flex; align-items: center; gap: 10px; min-height: 52px; padding: 0 14px; cursor: pointer; list-style: none; font-weight: 700; }
.bb-more > summary::-webkit-details-marker { display: none; }
.bb-more > summary::after { content: "›"; margin-left: 8px; font-size: 18px; transition: transform .15s; }
.bb-more[open] > summary::after { transform: rotate(90deg); }
.bb-more > summary small { margin-left: auto; font-weight: 500; color: var(--text-secondary, #475569); }
.bb-more[open] { padding: 0 14px 6px; }
.bb-more[open] > summary { padding: 0; }
/* A link for one person (2026-10-16). */
.bb-pl { flex-basis: 100%; display: flex; flex-direction: column; gap: 10px; margin-top: 10px; padding: 14px;
  border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; background: var(--bg-secondary, #f8fafc); }
.bb-pl label { display: flex; flex-direction: column; gap: 4px; font-size: 13px; color: var(--text-secondary, #475569); }
.bb-pl input[type="text"], .bb-pl input[type="email"], .bb-pl select { min-height: 44px; padding: 8px 10px; border-radius: 10px;
  border: 1px solid var(--border-color, #cbd5e1); font: inherit; font-size: 14.5px; background: var(--bg-primary, #fff); color: var(--text-primary, #0f172a); min-width: 0; }
.bb-pl-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
@media (max-width: 480px) { .bb-pl-two { grid-template-columns: minmax(0, 1fr); } }
.bb-pl-lead, .bb-pl-hint { margin: 0; font-size: 13px; color: var(--text-secondary, #475569); }
.bb-pl-works { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 0; padding: 0; border: 0; }
.bb-pl-works legend { padding: 0; margin-bottom: 4px; font-size: 13px; color: var(--text-secondary, #475569); }
.bb-pl-works label { flex-direction: row; align-items: center; gap: 6px; min-height: 44px; color: var(--text-primary, #0f172a); }
.bb-pl-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.bb-pl-err { margin: 0; color: var(--danger-fg, #b91c1c); font-size: 13px; }
.bb-pl-done { display: flex; flex-direction: column; gap: 8px; }
.bb-pl-done[hidden], .bb-pl-err[hidden] { display: none; }

.bb-chip { font-size: .68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
  padding: 2px 7px; border-radius: 999px; }
.bb-chip--live { background: rgba(20, 184, 166, 0.14); color: var(--primary-700, #0f766e); }
.bb-chip--disabled { background: rgba(148, 163, 184, 0.18); color: var(--text-secondary, #64748b); }
.bb-chip--expired { background: var(--danger-bg, #fef2f2); color: var(--danger-fg, #b91c1c); }
.bb-chip--incomplete { background: #fef3c7; color: #92400e; }

/* Empty-board (no declared availability) guidance banner */
.bb-setup-banner {
  background: var(--notice-warn-bg); border: 1px solid var(--notice-warn-border); border-left: 3px solid var(--notice-warn-edge); color: var(--notice-warn-ink);
  border-radius: 8px; padding: 10px 12px; margin-bottom: 14px; font-size: .9rem; line-height: 1.5;
}
/* Per-row: the page is live but a visitor would see no times (2026-09-26). */
.bb-row-warn {
  background: var(--notice-warn-bg); border: 1px solid var(--notice-warn-border); border-left: 3px solid var(--notice-warn-edge); color: var(--notice-warn-ink);
  border-radius: 6px; padding: 6px 10px; margin-top: 6px; font-size: .85rem; line-height: 1.45;
}
.bb-link-btn {
  background: none; border: 0; padding: 0; font: inherit; font-weight: 600;
  color: #92400e; text-decoration: underline; cursor: pointer;
}
/* The booking count in a row's meta line opens "Your bookings" (2026-09-23).
   Same link shape as .bb-link-btn, in the brand teal rather than the
   warning banner's amber. */
.bb-row-meta .bb-bookings-link { color: var(--primary-700, #0f766e); }
.bb-row-meta .bb-bookings-link:focus-visible { outline: 2px solid var(--primary-600, #0d9488); outline-offset: 2px; border-radius: 2px; }
.bb-hours-source { font-size: .88rem; color: var(--text-secondary, #64748b); }

/* ⭐ 2026-09-17 (owner: "the button seems too small"). MEASURED before
   changing anything: 34x34 on a fine pointer, and 44 high on touch only
   because the global (pointer: coarse) rule lifts it. Raised to a 36px floor,
   which stays under the 44px touch minimum the coarse rule already enforces.
   2026-09-23: the LOOK now comes from the app's own buttons (btn btn-sm +
   btn-primary / btn-secondary / btn-ghost) — this page had a third, private
   button family. .bb-btn keeps only the owner's floor (btn-sm is 32px);
   .bb-btn--primary stays as the marker for the row's ONE primary action.
   2026-09-30 (launch fix F16): the floor is 44px on EVERY pointer, the
   owner's touch-target norm; 36 measured 36 tall at 412 on a phone. */
.bb-btn {
  min-height: 44px;
}
/* Delete wears the same outlined shape as its neighbours, in red, and arms
   to a solid red button (2026-10-15, owner: "irregular"). It was a ghost
   with no outline; on a phone the tap left its pink hover and the ghost
   shadow stuck on, so "Confirm delete?" floated. */
.bb-btn--danger { color: var(--danger-fg, #b91c1c); background: transparent; border: 1px solid #fecaca; box-shadow: none; }
.bb-btn--danger:hover { background: var(--danger-bg, #fef2f2); box-shadow: none; }
.bb-btn--danger.is-armed, .bb-btn--danger.is-armed:hover { background: #b91c1c; border-color: #b91c1c; color: #ffffff; box-shadow: none; }

/* Dashboard empty-state footer (holds the single "Create booking board" button).
 * The editor uses the app-canonical .modal-footer (pinned action bar) instead. */
.bb-footer { display: flex; gap: 10px; align-items: center; margin-top: 18px; }

/* Editor */
.bb-editor { display: block; }
.bb-field { display: block; margin-bottom: 16px; }
.bb-field-label { display: block; font-size: .85rem; font-weight: 600;
  color: var(--text-secondary, #64748b); margin-bottom: 6px; }
.bb-field input[type=text],
.bb-field select,
.bb-field textarea {
  width: 100%; font: inherit; padding: 9px 11px; border-radius: var(--input-radius, 12px);
  border: 1px solid var(--border-color, #e2e8f0);
  background: var(--surface-primary, #fff); color: var(--text-primary, #1e293b);
}
.bb-field textarea { resize: vertical; min-height: 64px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .85rem; }

.bb-slugrow { display: flex; align-items: stretch; border: 1px solid var(--border-color, #e2e8f0);
  border-radius: var(--input-radius, 12px); overflow: hidden; }
.bb-slugpre { display: flex; align-items: center; padding: 0 8px; font-size: .82rem;
  color: var(--text-secondary, #64748b); background: var(--surface-secondary, #f8fafc); white-space: nowrap; }
.bb-slugrow input { border: 0 !important; border-radius: 0 !important; flex: 1; }
.bb-slughint { font-size: .8rem; margin-top: 5px; min-height: 1em; }
.bb-slughint.bb-ok { color: var(--primary-700, #0f766e); }
.bb-slughint.bb-warn { color: #b45309; }

/* Toggle groups ("Stays live for", "Visitors can") use the app-canonical
 * .option-pill capsules (visual styling lives in css/board-modals.css). This
 * only lays them out in a wrapping row, mirroring .create-board-options. The
 * pills are not flex:1 here — they should size to their label, not stretch. */
.bb-pillgroup { display: flex; flex-wrap: wrap; gap: 8px; }
.bb-pillgroup .option-pill { flex: 0 0 auto; }

.bb-embedhint { font-size: .8rem; margin-top: 6px; color: var(--text-secondary, #64748b); }
.bb-embedhint--warn { color: #b45309; }

/* Theme editor — accent colour row */
.bb-accent-row { display: inline-flex; gap: 8px; align-items: center; }
.bb-accent-row input[type=color] { width: 44px; height: 36px; padding: 2px; border: 1px solid var(--border-color, #e2e8f0); border-radius: var(--input-radius, 12px); background: none; cursor: pointer; }
.bb-accent-hex { width: 110px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
.bb-accent-hex.bb-invalid { border-color: var(--danger-fg, #b91c1c); }

/* Embed preview */
.bb-preview { margin-top: 4px; }
.bb-preview-frame { width: 100%; max-width: 560px; height: 420px; border: 1px solid var(--border-color, #e2e8f0); border-radius: 10px; background: #fff; }

/* Booking rules disclosure (collapsible secondary controls in the editor) */
.bb-rules { margin-bottom: 16px; border: 1px solid var(--border-color, #e2e8f0); border-radius: 10px; overflow: hidden; }
.bb-rules-summary {
  display: flex; align-items: baseline; gap: 8px; cursor: pointer; list-style: none;
  padding: 11px 13px; font-size: .9rem; font-weight: 600; color: var(--text-primary, #1e293b);
  background: var(--surface-secondary, #f8fafc);
}
.bb-rules-summary::-webkit-details-marker { display: none; }
.bb-rules-summary i { color: var(--primary-700, #0f766e); }
.bb-rules-title { flex: 0 0 auto; }
.bb-rules-sub { flex: 1 1 auto; min-width: 0; font-weight: 400; font-size: .82rem;
  color: var(--text-secondary, #64748b); text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bb-rules[open] .bb-rules-sub { display: none; } /* the inputs below say it once open */
.bb-rules-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 14px;
  padding: 14px 13px 4px;
}
.bb-rule { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.bb-rule-label { font-size: .8rem; font-weight: 600; color: var(--text-secondary, #64748b); }
.bb-rule-num {
  width: 100%; font: inherit; padding: 8px 10px; border-radius: var(--input-radius, 12px);
  border: 1px solid var(--border-color, #e2e8f0);
  background: var(--surface-primary, #fff); color: var(--text-primary, #1e293b);
}
.bb-rule-tiers { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; padding: 6px 13px 4px; font-size: .85rem; }
.bb-rule-tiers-label { font-weight: 600; color: var(--text-secondary, #64748b); }
.bb-rule-tiers label { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; }
.bb-rules-help { padding: 4px 13px 13px; margin: 0; font-size: .78rem; line-height: 1.5; color: var(--text-secondary, #64748b); }

/* Pointer to the OTHER booking tool (2026-09-23): this page books you; a
   group's "Booking links" share bookings across members. */
.bb-pointer { margin: 16px 0 0; padding-top: 12px; border-top: 1px solid var(--border-color, #e2e8f0);
  font-size: .85rem; line-height: 1.5; color: var(--text-secondary, #64748b); }
.bb-pointer i { color: var(--primary-600, #0d9488); margin-right: 4px; }

/* DARK MODE (2026-09-23). This sheet had none: surfaces flipped via the base
   modal, but every literal hex (chips, the amber setup banner, danger red,
   the slug hints) stayed light-on-light. Same toggle as team-booking-admin.css
   (body.dark-mode, never the OS query) and the same danger/amber values, so
   the two booking screens read as one family. */
body.dark-mode .bb-row-url a,
body.dark-mode .bb-rules-summary i,
body.dark-mode .bb-slughint.bb-ok { color: var(--primary-400, #2dd4bf); }
body.dark-mode .bb-chip--live { background: rgba(45, 212, 191, 0.16); color: var(--primary-400, #2dd4bf); }
body.dark-mode .bb-chip--expired { background: rgba(153, 27, 27, 0.25); color: #fecaca; }
body.dark-mode .bb-chip--incomplete { background: rgba(180, 83, 9, 0.22); color: #fcd34d; }
body.dark-mode .bb-error,
body.dark-mode .bb-btn--danger { color: #fca5a5; }
body.dark-mode .bb-btn--danger:hover { background: rgba(153, 27, 27, 0.25); color: #fca5a5; }
body.dark-mode .bb-btn--danger { border-color: rgba(252, 165, 165, 0.35); }
body.dark-mode .bb-btn--danger.is-armed, body.dark-mode .bb-btn--danger.is-armed:hover { background: #dc2626; border-color: #dc2626; color: #ffffff; }
body.dark-mode .bb-row-warn { background: var(--notice-warn-bg); border-color: var(--notice-warn-border); color: var(--notice-warn-ink); border-left: 3px solid var(--notice-warn-edge); }
body.dark-mode .bb-setup-banner { background: var(--notice-warn-bg); border-color: var(--notice-warn-border); color: var(--notice-warn-ink); border-left: 3px solid var(--notice-warn-edge); }
body.dark-mode .bb-link-btn { color: #fcd34d; }
body.dark-mode .bb-row-meta .bb-bookings-link { color: var(--primary-300, #5eead4); }
body.dark-mode .bb-slughint.bb-warn,
body.dark-mode .bb-embedhint--warn { color: #fbbf24; }

@media (max-width: 540px) {
  .bb-row-actions { width: 100%; }
  .bb-rules-grid { grid-template-columns: 1fr; }
  .bb-rules-sub { display: none; } /* avoid summary line wrapping on narrow screens */
}

/* Where you'll meet (2026-09-23): video link on its own line, then type +
   phone/address side by side; stacks on phones. Inputs inherit .bb-field. */
.bb-where-row { display: grid; grid-template-columns: minmax(150px, 1fr) 2fr; gap: 8px; margin-top: 8px; }
@media (max-width: 540px) { .bb-where-row { grid-template-columns: 1fr; } }

/* ── "When can people book you?" weekly hours (2026-09-26) ─────────────
   Same cells as the temporary-group hour grid: grey not open, light teal
   Possible, clear teal Preferred (one teal family, owner 2026-10-02/03). One
   weekday at a time, 6 × 4 cells, so each cell is tappable on a phone. The
   cells print only their hour: the level is the colour, and its word is in
   the legend and each cell's label. */
.bb-hours { border: 1px solid var(--slate-200, #e2e8f0); border-radius: 10px; padding: 10px 12px; margin: 14px 0; }
.bb-hours > summary { cursor: pointer; font-weight: 600; list-style: none; }
.bb-hours > summary::-webkit-details-marker { display: none; }
.bb-hours-intro, .bb-hours-alt { font-size: .86rem; color: var(--text-secondary, #64748b); margin: 8px 0; }
/* The how-to sentence sits behind an (i) beside the title, closed by default
   (2026-10-02, owner: it took a lot of room); grid, days and key stay shown.
   Inside the <details>, so it only shows while the section is open. */
.bb-hours { position: relative; }
.bb-hours > summary { padding-right: 48px; }
.bb-hours-help-btn { position: absolute; top: 10px; right: 6px; width: 44px; height: 44px; display: inline-flex;
  align-items: center; justify-content: center; border: 0; border-radius: 50%; background: transparent;
  color: var(--text-secondary, #64748b); font-size: 1rem; cursor: pointer; }
.bb-hours-help-btn:hover, .bb-hours-help-btn[aria-expanded="true"] { color: var(--primary-700, #0f766e); background: var(--surface-2, #eef1f5); }
.bb-hours-intro[hidden] { display: none; }
body.dark-mode .bb-hours-help-btn:hover, body.dark-mode .bb-hours-help-btn[aria-expanded="true"] { background: #1e293b; color: #5eead4; }
/* The open day's cells (owner 2026-10-22: one day open at a time; see the
   ONE DAY OPEN block at the end). The coarse-pointer floor (style.css:
   [role="button"] { min-width: 44px }) is released inside the row: cells
   are ~24px wide on a phone. */
/* One continuous bar per row, grey until marked; a marked stretch is one
   rounded run (run-s / run-e set in the grid's cellClass). Same look as the
   temporary-group hour grid (2026-09-26, owner: "Why ugly square blocks"). */
.whg-rowlabel { display: flex; align-items: center; padding-right: 6px; font-size: .72rem; font-weight: 700;
  letter-spacing: .02em; color: var(--text-secondary, #64748b); }
.whg-dayhint { font-size: .8rem; color: var(--text-secondary, #64748b); margin: 8px 0 0; }
.whg-hour { min-height: 34px; display: flex; align-items: center; justify-content: center; border-radius: 0;
  position: relative; background: var(--surface-2, #eef1f5); box-shadow: inset -1px 0 0 rgba(15, 23, 42, 0.14);
  color: var(--slate-900, #0f172a); font-size: 11px; font-weight: 600; cursor: pointer;
  font-variant-numeric: tabular-nums; overflow: hidden; }
.whg-hour.row-e, .whg-hour.is-open:not(.run-e), .whg-hour.is-best:not(.run-e) { box-shadow: none; }
.whg-hour.row-s { border-top-left-radius: 10px; border-bottom-left-radius: 10px; }
.whg-hour.row-e { border-top-right-radius: 10px; border-bottom-right-radius: 10px; }
/* The colour is a layer over the grey track, so run corners sit on grey. */
.whg-hour.is-open::before, .whg-hour.is-best::before { content: ''; position: absolute; inset: 0; z-index: 0; }
.whg-hour.is-open { color: var(--level-possible-ink, #0f172a); }
.whg-hour.is-best { color: var(--level-preferred-ink, #0f172a); }
.whg-hour.is-open::before { background: var(--level-possible, #99f6e4); }
.whg-hour.is-best::before { background: var(--level-preferred, #0d9488); }
/* The hour lines stay inside a marked stretch (owner 2026-10-20, "Even if
   selected keep the hour divides between sections"): drawn on the colour
   layer, which covers the track's own line. */
.whg-hour.is-open:not(.run-e):not(.row-e)::before { box-shadow: inset -1px 0 0 rgba(15, 23, 42, 0.22); }
.whg-hour.is-best:not(.run-e):not(.row-e)::before { box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.45); }
body.dark-mode .whg-hour.is-open:not(.run-e):not(.row-e)::before { box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.25); }
body.dark-mode .whg-hour.is-best:not(.run-e):not(.row-e)::before { box-shadow: inset -1px 0 0 rgba(15, 23, 42, 0.35); }
.whg-hour.run-s::before { border-top-left-radius: 8px; border-bottom-left-radius: 8px; }
.whg-hour.run-e::before { border-top-right-radius: 8px; border-bottom-right-radius: 8px; }
.whg-hour.row-s::before { border-top-left-radius: 10px; border-bottom-left-radius: 10px; }
.whg-hour.row-e::before { border-top-right-radius: 10px; border-bottom-right-radius: 10px; }
.whg-hour > * { position: relative; z-index: 1; }
/* A part-open hour (an edge on the quarter hour) draws its quarters. */
.whg-hour > .whg-q { position: absolute; inset: 0; z-index: 0; border-radius: inherit; }
.whg-legend { display: flex; flex-wrap: wrap; gap: 6px 12px; font-size: .8rem; color: var(--text-secondary, #64748b); margin: 8px 0; }
.whg-legend span { display: inline-flex; align-items: center; gap: 4px; }
.whg-sw { display: inline-block; width: 10px; height: 10px; border-radius: 2px; background: var(--surface-2, #eef1f5); box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.12); }
.whg-sw.is-open { background: var(--level-possible, #99f6e4); }
.whg-sw.is-best { background: var(--level-preferred, #0d9488); }
.whg-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.whg-actions [data-whg="save"] { margin-left: auto; }
.whg-note { font-size: .8rem; color: var(--text-secondary, #64748b); margin: 8px 0 0; }
.whg-status { font-size: .85rem; margin: 6px 0 0; min-height: 1em; }
.whg-status--ok { color: var(--primary-700, #0f766e); }
.whg-status--warn, .whg-status--error { color: #b45309; }
/* Exact times (2026-10-03): each open stretch is a tappable time under the
   hours; tapping one opens the 15-minute editor. Cell taps are unchanged. */
.whg-runs { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 8px 0 0; }
.whg-runs:empty { display: none; }
.whg-runs-label { flex-basis: 100%; font-size: .8rem; color: var(--text-secondary, #64748b); }
.whg-run { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 0 12px; border-radius: 999px;
  border: 1px solid var(--border-color, #cbd5e1); background: var(--surface-1, #fff); color: inherit; font: inherit; font-size: .85rem;
  font-variant-numeric: tabular-nums; cursor: pointer; }
/* The level colour on BOTH ends of the pill (2026-10-05, owner: "colour on
   both edges not just one side"). */
.whg-run.is-open { box-shadow: inset 4px 0 0 var(--level-possible, #99f6e4), inset -4px 0 0 var(--level-possible, #99f6e4); }
.whg-run.is-best { box-shadow: inset 4px 0 0 var(--level-preferred, #0d9488), inset -4px 0 0 var(--level-preferred, #0d9488); }
.whg-run.is-editing { border-color: var(--primary-600, #0d9488); }
.whg-run i { font-size: .75rem; opacity: .7; }
.whg-editor { margin: 8px 0 0; padding: 10px 12px; border: 1px solid var(--border-color, #cbd5e1); border-radius: 12px; background: var(--surface-1, #fff); }
.whg-ed-range { margin: 0 0 6px; font-weight: 700; font-size: 1rem; font-variant-numeric: tabular-nums; }
.whg-ed-row { display: flex; align-items: center; gap: 8px; margin: 4px 0; }
.whg-ed-name { min-width: 3.5em; font-size: .85rem; color: var(--text-secondary, #64748b); }
.whg-ed-step { width: 44px; height: 44px; border-radius: 10px; border: 1px solid var(--border-color, #cbd5e1);
  background: var(--surface-2, #eef1f5); color: inherit; font-size: 1.1rem; cursor: pointer; }
.whg-ed-step:disabled { opacity: .4; cursor: default; }
.whg-ed-val { min-width: 5.5em; text-align: center; font-variant-numeric: tabular-nums; }
.whg-ed-levels { display: flex; gap: 6px; margin: 8px 0 4px; }
.whg-ed-lv { min-height: 44px; padding: 0 14px; border-radius: 10px; border: 1px solid var(--border-color, #cbd5e1);
  background: var(--surface-1, #fff); color: inherit; font: inherit; font-size: .85rem; cursor: pointer; }
.whg-ed-lv.is-on { border-color: var(--primary-600, #0d9488); box-shadow: inset 0 0 0 1px var(--primary-600, #0d9488); font-weight: 600; }
.whg-ed-days { margin: 4px 0; font-size: .8rem; color: var(--text-secondary, #64748b); }
.whg-ed-actions { display: flex; gap: 6px; justify-content: flex-end; }
.whg-ed-actions .btn { min-height: 44px; }
.whg-connect { font-size: .85rem; margin: 6px 0 0; }
.whg-actions [data-whg="fillcal"].is-locked i { font-size: .75em; margin-right: 2px; }
/* The bulk actions rest NEUTRAL (2026-10-05, owner: they "appear as always
   selected (teal)"): btn-secondary's teal tint is the same look as a
   selected day chip. Teal means ON here: a fill that is applied shows
   pressed, and pressing it again takes it out. */
.whg-actions .btn-secondary:not(.is-on), .whg-actions .btn-ghost {
  background: var(--surface-primary, #fff); border: 1px solid var(--border-color, #e2e8f0);
  color: var(--text-primary, #1e293b); box-shadow: none; }
.whg-actions .btn-secondary:not(.is-on):hover, .whg-actions .btn-ghost:hover {
  background: var(--surface-secondary, #f8fafc); border-color: var(--slate-300, #cbd5e1); }
body.dark-mode .whg-actions .btn-secondary:not(.is-on), body.dark-mode .whg-actions .btn-ghost {
  background: #0f172a; border-color: #334155; color: #e2e8f0; }
.whg-actions .btn.is-on { background: var(--primary-50, #f0fdfa); border-color: var(--primary-500, #14b8a6); color: var(--primary-700, #0f766e); box-shadow: inset 0 0 0 1px var(--primary-500, #14b8a6); }
body.dark-mode .whg-run, body.dark-mode .whg-editor, body.dark-mode .whg-ed-lv { background: #0f172a; border-color: #334155; }
body.dark-mode .whg-ed-step { background: #1e293b; border-color: #334155; }
.bb-groups { margin-top: 14px; }
.bb-group-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 0;
  border-top: 1px solid var(--slate-100, #f1f5f9); }
.bb-group-name { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.dark-mode .bb-hours { border-color: var(--slate-700, #334155); }
body.dark-mode .whg-hour { background: #1e293b; color: #f1f5f9; box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.06); }
body.dark-mode .whg-hour.is-open { color: var(--level-possible-ink, #f0fdf4); }
body.dark-mode .whg-hour.is-best { color: var(--level-preferred-ink, #0f172a); }
body.dark-mode .whg-sw { background: #1e293b; }
body.dark-mode .whg-sw.is-open { background: var(--level-possible, #0f766e); }
body.dark-mode .whg-sw.is-best { background: var(--level-preferred, #2dd4bf); }
body.dark-mode .bb-group-row { border-top-color: var(--slate-700, #334155); }

/* "Also offer" meeting lengths (2026-09-29): a wrap of plain checkboxes. */
.bb-also, .tba-also { display: flex; flex-wrap: wrap; gap: 6px 14px; }
.bb-also-opt, .tba-also-opt { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; font-size: .9rem; cursor: pointer; }
.bb-also-opt.is-off, .tba-also-opt.is-off { opacity: .45; cursor: default; }
.bb-also-add, .tba-also-add { display: inline-flex; align-items: center; gap: 6px; }
.bb-also-add input, .tba-also-add input { width: 84px; min-height: 44px; }
.bb-guestlen-range, .tba-guestlen-range { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.bb-guestlen-range input, .tba-guestlen-range input { width: 84px; min-height: 44px; }
.bb-guestlen-range[hidden], .tba-guestlen-range[hidden] { display: none; }

/* ── 44px TOUCH TARGETS (launch fix F16, 2026-09-30) ─────────────────────
   Measured at 412 in the launch audit: "3 bookings" 70x20, "Set your
   availability" 129x20, day chips 45x34, hour cells 44x40, length checkboxes
   32 tall, pills 38, number fields 39, the hours <summary> 21. Every control
   on this screen now clears 44px tall, on any pointer. The link-styled
   buttons keep their look and grow an invisible 44px box. */
.bb-overlay .bb-link-btn,
.bb-row-meta .bb-bookings-link { display: inline-flex; align-items: center; min-height: 44px; }
.bb-row-url a { display: inline-flex; align-items: center; min-height: 44px; max-width: 100%; overflow-wrap: anywhere; }
.bb-hours > summary { display: flex; align-items: center; gap: 6px; min-height: 44px; }
.whg-hour { min-height: 34px; }
.bb-also-opt, .tba-also-opt { min-height: 44px; }
.bb-also-opt input, .tba-also-opt input,
.bb-rule-tiers input, .bb-rule-shape input, .bb-rule-approve input { width: var(--checkbox-size, 18px); height: var(--checkbox-size, 18px); margin: 0; flex: 0 0 auto; }
.bb-rule-tiers label, .bb-rule-shape label, .bb-rule-approve label { min-height: 44px; display: inline-flex; align-items: center; gap: 8px; }
.bb-rule-shape, .bb-rule-approve { padding: 0 13px; }
.bb-pillgroup .option-pill { min-height: 44px; }
.bb-editor input[type=text], .bb-editor input[type=number], .bb-editor input[type=date],
.bb-editor select, .bb-rule-num { min-height: 44px; box-sizing: border-box; }
.bb-accent-row input[type=color] { height: 44px; }
.bb-durrow { display: flex; gap: 8px; align-items: center; }
.bb-durrow select { flex: 1 1 auto; min-width: 0; }
.bb-durrow input { width: 96px; flex: 0 0 auto; }
#bb-expires { display: block; margin-bottom: 8px; }
/* Unsaved hours (F26): stops the close and asks, in the panel's footer. */
.bb-unsaved { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 8px 0;
  padding: 8px 10px; border-radius: 8px; background: var(--notice-warn-bg); border: 1px solid var(--notice-warn-border); border-left: 3px solid var(--notice-warn-edge); color: var(--notice-warn-ink); font-size: .88rem; }
.bb-unsaved span { flex: 1 1 100%; }
.bb-unsaved .btn { min-height: 44px; }
body.dark-mode .bb-unsaved { background: var(--notice-warn-bg); border-color: var(--notice-warn-border); color: var(--notice-warn-ink); border-left: 3px solid var(--notice-warn-edge); }
/* Pinned as the panel's footer (2026-10-07): always on screen when the X asks. */
.bb-modal > .bb-unsaved { flex-shrink: 0; margin: 0; padding: 12px 16px; border-width: 1px 0 0;
  border-radius: 0 0 var(--radius-2xl, 20px) var(--radius-2xl, 20px); }
/* Measured on the built app at 412 (launch fixes, 2026-10-01): the global
   coarse-pointer floor ([role=button] min-width 44px, style.css) made each
   of the 12 hour cells 44 wide, so a row was 528px in a 330px box and hours
   8-12 were cut off. The cells share the row (27px wide, 44 tall); the grid
   actions and the "Open preview" link get the 44px height. */
.whg-actions .btn, .bb-unsaved .btn { min-height: 44px; }
.bb-preview a.bb-btn { display: inline-flex; align-items: center; min-height: 44px; }

/* Two labelled sections (2026-10-05): My booking page / Group booking links. */
.bb-section-head { margin: 4px 0 10px; }
.bb-section-title { display: flex; align-items: center; gap: 8px; margin: 0; font-size: 1rem; font-weight: 700; color: var(--text-primary, #1e293b); }
.bb-section-title i { color: var(--primary-600, #0d9488); font-size: .9em; }
.bb-section-sub { margin: 2px 0 0; font-size: .85rem; color: var(--text-secondary, #64748b); }
.bb-groups { margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--border-color, #e2e8f0); }
.bb-group-name i { color: var(--text-secondary, #64748b); margin-right: 4px; }
.bb-field textarea.bb-message { font-family: inherit; font-size: .9rem; }

/* "Set your availability" on the hours header (2026-10-05). */
.bb-hours > summary { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-height: 44px; }
.bb-hours-title { flex: 1 1 auto; }
.bb-hours-cta { display: inline-flex; align-items: center; gap: 6px; min-height: 36px; padding: 0 12px; border-radius: 999px;
  border: 1px solid var(--primary-300, #5eead4); background: var(--primary-50, #f0fdfa); color: var(--primary-700, #0f766e);
  font-size: .85rem; font-weight: 600; }
.bb-hours-cta i { font-size: .75em; transition: transform .15s ease; }
.bb-hours[open] .bb-hours-cta { background: var(--surface-primary, #fff); border-color: var(--border-color, #e2e8f0); color: var(--text-secondary, #64748b); }
.bb-hours[open] .bb-hours-cta i { transform: rotate(180deg); }
.bb-hours .bb-hours-cta-close, .bb-hours[open] .bb-hours-cta-open { display: none; }
.bb-hours[open] .bb-hours-cta-close { display: inline; }
body.dark-mode .bb-hours-cta { background: #0f172a; border-color: var(--primary-700, #0f766e); color: var(--primary-300, #5eead4); }

/* "Your calendar" (2026-10-05): which calendars close times. */
.bb-cal-sources { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 8px; }
.bb-cal-sources[hidden] { display: none; }
.bb-cal-source { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; font-size: .9rem; }

/* A ✕ on each time pill (2026-10-05): the pill and its ✕ read as one chip. */
.whg-run-wrap { display: inline-flex; align-items: stretch; border-radius: 999px; }
.whg-run-wrap > .whg-run { border-top-right-radius: 0; border-bottom-right-radius: 0; border-right: 0; padding-right: 8px; }
.whg-run-x { display: inline-flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; padding: 0 12px 0 8px;
  border: 1px solid var(--border-color, #e2e8f0); border-left: 0; border-radius: 0 999px 999px 0; background: var(--surface-primary, #fff);
  color: var(--text-secondary, #64748b); cursor: pointer; font: inherit; }
.whg-run-wrap.is-open > .whg-run-x { box-shadow: inset -4px 0 0 var(--level-possible, #99f6e4); }
.whg-run-wrap.is-best > .whg-run-x { box-shadow: inset -4px 0 0 var(--level-preferred, #0d9488); }
.whg-run-wrap > .whg-run.is-open { box-shadow: inset 4px 0 0 var(--level-possible, #99f6e4); }
.whg-run-wrap > .whg-run.is-best { box-shadow: inset 4px 0 0 var(--level-preferred, #0d9488); }
.whg-run-x:hover, .whg-run-x:focus-visible { color: var(--danger-fg, #b91c1c); background: var(--danger-bg, #fef2f2); outline: none; }
body.dark-mode .whg-run-x { background: #0f172a; border-color: #334155; color: #94a3b8; }

/* A different day (2026-10-18): dated exceptions on the hours grid. */
.bb-dates { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--border-color, #e2e8f0); }
.bb-dates-title { margin: 0; font-size: 15px; font-weight: 800; color: var(--text-primary, #0f172a); }
.bb-dates-hint { margin: 0; font-size: 13px; color: var(--text-secondary, #475569); }
.bb-dates-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.bb-dates-status { font-size: 13px; color: var(--text-secondary, #475569); }
/* CHANGE A DATE (owner 2026-10-20, board D2): a month calendar; a changed
   date shows its hours in words ("12–3", "Closed"), tinted or grey. No dots.
   The picked date is outlined; its editor is an AM row over a PM row. */
/* ONE SAVE (owner 2026-10-21, UI rule 3): the week and the dates save from
   one bar, pinned to the bottom of the scrolling body. */
/* bottom: -24px = the body's bottom padding, so nothing peeks out under it. */
.bb-hours-savebar { position: sticky; bottom: 0; bottom: -24px; z-index: 2; display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin: 12px -4px 0; padding: 10px 4px; background: var(--surface-primary, #ffffff); border-top: 1px solid var(--border-color, #e2e8f0); }
.bb-hours-savebar[hidden] { display: none; }
.bb-hours-savebar .btn { min-height: 44px; flex: none; }
.bb-hours-status { flex: 1 1 auto; min-width: 0; font-size: .85rem; color: var(--text-secondary, #475569); }
.bb-hours-status--ok { color: var(--primary-700, #0f766e); }
.bb-hours-status--warn, .bb-hours-status--error { color: #b45309; }
/* = body.dark-mode .modal-content (style.css), so the bar reads as the panel. */
body.dark-mode .bb-hours-savebar { background: #2d2d3e; border-top-color: #3d3d4e; }
body.dark-mode .bb-hours-status--ok { color: #5eead4; }
.bbd-cal { display: flex; flex-direction: column; gap: 8px; padding: 10px; border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; }
.bbd-cal-head { display: flex; align-items: center; justify-content: space-between; }
.bbd-month { font-size: 15px; font-weight: 700; color: var(--text-primary, #1e293b); }
.bbd-nav { width: 44px; height: 44px; border: 0; border-radius: 10px; background: transparent; color: var(--primary-700, #0f766e); cursor: pointer; }
.bbd-nav:disabled { color: var(--slate-300, #cbd5e1); cursor: default; }
.bbd-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.bbd-dow { font-size: 11px; font-weight: 600; text-align: center; color: var(--text-secondary, #64748b); }
.bbd-date { min-width: 0; min-height: 48px; padding: 2px 0; box-sizing: border-box; border-radius: 10px; border: 1px solid var(--slate-100, #f1f5f9);
  background: var(--surface-primary, #ffffff); color: var(--text-primary, #1e293b); font: inherit; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; }
.bbd-num { font-size: 14px; line-height: 1; font-weight: 500; font-variant-numeric: tabular-nums; }
.bbd-sub { max-width: 100%; overflow: hidden; font-size: 10px; line-height: 1; font-weight: 700; white-space: nowrap; color: var(--primary-800, #115e59); }
.bbd-date.is-today .bbd-num { font-weight: 800; color: var(--primary-700, #0f766e); }
.bbd-date.is-changed { background: var(--primary-100, #ccfbf1); border-color: var(--primary-300, #5eead4); }
.bbd-date.is-closed { background: var(--slate-200, #e2e8f0); border-color: transparent; }
.bbd-date.is-closed .bbd-sub { color: var(--slate-600, #475569); }
.bbd-date.is-picked { box-shadow: inset 0 0 0 2px var(--primary-700, #0f766e); }
.bbd-date.is-out { background: var(--surface-secondary, #f8fafc); border-color: transparent; color: var(--slate-300, #cbd5e1); cursor: default; }
.bbd-key { display: flex; flex-wrap: wrap; gap: 6px 12px; font-size: 12px; color: var(--text-secondary, #475569); }
.bbd-key span { display: inline-flex; align-items: center; gap: 6px; }
.bbd-sw { display: inline-block; width: 12px; height: 12px; box-sizing: border-box; border-radius: 3px; }
.bbd-sw.is-changed { background: var(--primary-100, #ccfbf1); border: 1px solid var(--primary-300, #5eead4); }
.bbd-sw.is-closed { background: var(--slate-200, #e2e8f0); }
.bbd-sw.is-open { background: var(--level-possible, #99f6e4); }
.bbd-sw.is-shut { background: var(--surface-2, #eef1f5); box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.12); }
/* Busy in your calendar (2026-10-20): the meeting-link grid's busy colour. */
.bbd-sw.is-busy, .whg-hour.bbd-hour.is-busy { background: #e55e5e; }
.bbd-ed-key { margin-top: 8px; }
.bbd-date.is-locked { position: relative; background: var(--surface-secondary, #f8fafc); border: 1px dashed var(--slate-300, #cbd5e1); color: var(--slate-400, #94a3b8); }
.bbd-date.is-locked .bbd-lock { position: absolute; top: 4px; right: 4px; font-size: 9px; color: var(--slate-400, #94a3b8); }
.bbd-sw.is-locked { display: inline-flex; align-items: center; justify-content: center; background: var(--surface-secondary, #f8fafc); border: 1px dashed var(--slate-300, #cbd5e1); }
.bbd-sw.is-locked i { font-size: 7px; color: var(--slate-400, #94a3b8); }
/* The plan ladder note (2026-10-21): which plan opens the locked days. */
.bbd-lock-note { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; border-radius: 10px;
  background: var(--primary-50, #f0fdfa); border: 1px solid var(--primary-200, #99f6e4); font-size: 13px; color: var(--primary-900, #134e4a); }
.bbd-lock-note .btn { min-height: 44px; }
body.dark-mode .bbd-date.is-locked, body.dark-mode .bbd-sw.is-locked { background: #0f172a; border-color: #334155; color: #64748b; }
body.dark-mode .bbd-lock-note { background: rgba(20, 184, 166, 0.12); border-color: #0f766e; color: #ccfbf1; }
.bbd-sw.is-out { background: var(--surface-secondary, #f8fafc); border: 1px solid var(--slate-200, #e2e8f0); }
.bbd-editor { display: flex; flex-direction: column; gap: 10px; padding: 12px; border: 2px solid var(--primary-700, #0f766e); border-radius: 14px; background: var(--primary-50, #f0fdfa); }
.bbd-ed-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 2px 8px; }
.bbd-ed-head strong { font-size: 15px; color: var(--primary-900, #134e4a); }
.bbd-usual { font-size: 12px; color: var(--text-secondary, #475569); }
.bbd-modes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.bbd-mode { min-width: 0; min-height: 44px; padding: 0 4px; border-radius: 10px; border: 1px solid var(--slate-300, #cbd5e1);
  background: var(--surface-primary, #ffffff); color: var(--text-primary, #334155); font: inherit; font-size: 13px; font-weight: 500; cursor: pointer; }
.bbd-mode.is-on { border: 2px solid var(--primary-700, #0f766e); background: var(--primary-100, #ccfbf1); color: var(--primary-900, #134e4a); font-weight: 600; }
.bbd-hours { padding: 8px; border-radius: 10px; background: var(--surface-primary, #ffffff); }
.bbd-head, .bbd-rows { display: grid; grid-template-columns: 1.7rem repeat(12, minmax(0, 1fr)); column-gap: 0; }
.bbd-head { padding-bottom: 4px; }
.bbd-head > span { font-size: .7rem; font-weight: 600; text-align: center; color: var(--text-secondary, #64748b); font-variant-numeric: tabular-nums; }
.bbd-rows { row-gap: 3px; touch-action: none; user-select: none; }
.bbd-rows .whg-hour { min-width: 0; }
.bbd-note { margin: 0; font-size: 13px; color: var(--text-secondary, #475569); }
@media (max-width: 359px) { .bbd-sub { font-size: 9px; letter-spacing: -.02em; } .bbd-grid { gap: 3px; } }
body.dark-mode .bbd-date { background: #1e293b; border-color: #334155; color: #f1f5f9; }
body.dark-mode .bbd-date.is-changed { background: rgba(20, 184, 166, 0.22); border-color: #0f766e; }
body.dark-mode .bbd-sub { color: #5eead4; }
body.dark-mode .bbd-date.is-closed { background: #334155; border-color: transparent; }
body.dark-mode .bbd-date.is-closed .bbd-sub { color: #cbd5e1; }
body.dark-mode .bbd-date.is-out { background: #0f172a; border-color: transparent; color: #475569; }
body.dark-mode .bbd-date.is-picked { box-shadow: inset 0 0 0 2px #2dd4bf; }
body.dark-mode .bbd-date.is-today .bbd-num { color: #5eead4; }
body.dark-mode .bbd-sw.is-changed { background: rgba(20, 184, 166, 0.22); border-color: #0f766e; }
body.dark-mode .bbd-sw.is-closed { background: #334155; }
body.dark-mode .bbd-sw.is-out { background: #0f172a; border-color: #334155; }
body.dark-mode .bbd-editor { background: rgba(20, 184, 166, 0.08); border-color: #2dd4bf; }
body.dark-mode .bbd-ed-head strong { color: #99f6e4; }
body.dark-mode .bbd-mode { background: #0f172a; border-color: #334155; color: #f1f5f9; }
body.dark-mode .bbd-mode.is-on { background: #134e4a; border-color: #2dd4bf; color: #5eead4; }
body.dark-mode .bbd-hours { background: #0f172a; }
body.dark-mode .bbd-month { color: #f1f5f9; }

/* ONE PLAN-LOCK LABEL (2026-10-21): a paid option the plan does not include
   shows as itself, greyed, with a lock and "On Solo"; a tap opens the upgrade
   (window.PlanLock, js/core/constants.js). */
.plan-lock { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-height: 44px; padding: 8px 12px;
  border-radius: 10px; border: 1px dashed var(--slate-300, #cbd5e1); background: var(--surface-secondary, #f8fafc);
  color: var(--slate-500, #64748b); font: inherit; font-size: .9rem; text-align: left; cursor: pointer; }
.plan-lock:hover { border-color: var(--primary-400, #2dd4bf); }
.plan-lock-label { min-width: 0; }
.plan-lock-badge { flex: none; display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; border-radius: 999px;
  background: var(--primary-50, #f0fdfa); border: 1px solid var(--primary-200, #99f6e4); color: var(--primary-800, #115e59);
  font-size: .75rem; font-weight: 700; white-space: nowrap; }
.plan-lock-badge i { font-size: .7em; }
.bb-solo-note { margin: 6px 0; }
body.dark-mode .plan-lock { background: #0f172a; border-color: #334155; color: #94a3b8; }
body.dark-mode .plan-lock-badge { background: rgba(20, 184, 166, 0.14); border-color: #0f766e; color: #ccfbf1; }
/* ===== ONE DAY OPEN AT A TIME (owner 2026-10-22, canvas NUPmZJRJPUBGimU5BkbTXv) =====
   Each weekday is a ticked row with its hours in words; one day opens to
   its AM row over its PM row. The cells hand an up/down swipe to the page
   (touch-action: pan-y), so scrolling never marks an hour. */
.whg--rows { display: flex; flex-direction: column; gap: 10px; }
.whg--rows .whg-dayhint { margin: 4px 0 0; }
.whg-start { display: flex; flex-direction: column; gap: 6px; }
.whg-start-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.whg-start-btn { min-height: 48px; padding: 4px 6px; border: 1px solid var(--border-color, #e2e8f0); border-radius: 12px;
  background: var(--bg-primary, #fff); color: #334155; font: inherit; font-size: .82rem; font-weight: 600; line-height: 1.2; cursor: pointer;
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 2px 4px; text-align: center; }
.whg-start-btn.is-on { border: 2px solid var(--primary-700, #0f766e); background: var(--primary-50, #f0fdfa); color: var(--primary-700, #0f766e); padding: 3px 5px; }
.whg-start-btn.is-locked { color: #94a3b8; background: var(--surface-secondary, #f8fafc); }
.whg-start-btn .plan-lock-badge { flex-basis: 100%; display: flex; justify-content: center; }
.whg-result { display: flex; gap: 8px; align-items: flex-start; margin: 0; padding: 9px 11px; border-radius: 12px;
  background: var(--primary-50, #f0fdfa); border: 1px solid var(--primary-200, #99f6e4); color: var(--primary-800, #115e59); font-size: .85rem; line-height: 1.4; }
.whg-result > i { margin-top: 2px; }
.whg-result .bb-link-btn { font-weight: 700; }
.whg-days { display: flex; flex-direction: column; gap: 8px; }
.whg-drow { border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; background: var(--bg-primary, #fff); }
.whg-drow.is-changed { background: var(--primary-50, #f0fdfa); border-color: var(--primary-300, #5eead4); }
.whg-drow.is-open { border: 2px solid var(--primary-700, #0f766e); background: var(--bg-primary, #fff); }
.whg-drow-h { display: flex; align-items: center; min-height: 54px; }
.whg-tick { flex: 0 0 48px; align-self: stretch; display: flex; align-items: center; justify-content: center; border: 0; background: none; cursor: pointer; padding: 0; }
.whg-tick-box { width: var(--checkbox-size, 20px); height: var(--checkbox-size, 20px); border-radius: 6px; border: 1.5px solid #94a3b8; background: #fff;
  display: inline-flex; align-items: center; justify-content: center; color: #fff; font-size: 12px; flex: 0 0 auto; }
[aria-checked="true"] > .whg-tick-box { background: var(--primary-600, #0d9488); border-color: var(--primary-600, #0d9488); }
.whg-drow-main { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; padding: 7px 12px 7px 0; border: 0; background: none;
  font: inherit; color: inherit; text-align: left; cursor: pointer; }
.whg-dtile { flex: 0 0 40px; height: 40px; border-radius: 10px; background: var(--surface-hover, #f1f5f9); display: flex; align-items: center; justify-content: center;
  font-size: .82rem; font-weight: 700; color: #334155; }
.whg-dtile i { font-size: .7em; margin-right: 2px; }
.whg-dname { flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
.whg-dname b { font-size: .95rem; color: var(--text-primary, #1e293b); }
.whg-dname span { font-size: .82rem; color: var(--text-secondary, #64748b); }
.whg-drow:not(.is-on) .whg-dname b { color: var(--text-secondary, #64748b); }
.whg-drow:not(.is-on) .whg-dtile { background: var(--surface-secondary, #f8fafc); color: #94a3b8; }
.whg-dtag { font-size: .72rem; font-weight: 700; padding: 3px 8px; border-radius: 999px; background: var(--primary-100, #ccfbf1); color: var(--primary-800, #115e59); white-space: nowrap; }
.whg-chev { color: #94a3b8; font-size: .8rem; }
.whg-drow-b { border-top: 1px solid var(--border-color, #e2e8f0); padding: 10px 12px 12px; display: flex; flex-direction: column; gap: 8px; }
.whg-day-cells { display: flex; flex-direction: column; gap: 4px; user-select: none; -webkit-user-select: none; }
.whg-row { padding-right: 8px; }
.whg-nums { position: relative; height: 15px; margin-left: 2.2rem; }
.whg-nums > span { position: absolute; top: 0; transform: translateX(-50%); font-size: .68rem; font-weight: 600; color: var(--text-secondary, #64748b);
  line-height: 15px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.whg-line { display: grid; grid-template-columns: 2.2rem minmax(0, 1fr); align-items: stretch; }
.whg-cells { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); touch-action: pan-y; }
.whg-cells > .whg-hour { min-width: 0; min-height: 44px; }
.whg--rows .whg-legend { margin: 2px 0 0; }
.whg--rows .whg-runs { margin: 0; }
.whg-run--add { border-style: dashed; color: var(--text-secondary, #475569); }
.whg-run .whg-sw { width: 10px; height: 10px; }
.whg-copy { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.whg-copy-day { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 0 10px 0 8px; border: 1px solid var(--border-color, #e2e8f0);
  border-radius: 10px; background: var(--bg-primary, #fff); font: inherit; font-size: .85rem; font-weight: 600; color: #334155; cursor: pointer; }
.whg-copy-day.is-on { border-color: var(--primary-600, #0d9488); background: var(--primary-50, #f0fdfa); color: var(--primary-700, #0f766e); }
.whg-copy-day:disabled { opacity: .5; cursor: default; }
.whg-copy-day .whg-tick-box { width: 18px; height: 18px; border-radius: 5px; font-size: 10px; }
body.dark-mode .whg-start-btn, body.dark-mode .whg-drow, body.dark-mode .whg-copy-day { background: #0f172a; border-color: #334155; color: #cbd5e1; }
body.dark-mode .whg-start-btn.is-on, body.dark-mode .whg-copy-day.is-on { background: rgba(20, 184, 166, .15); border-color: #14b8a6; color: #5eead4; }
body.dark-mode .whg-drow.is-changed { background: rgba(20, 184, 166, .10); border-color: #0f766e; }
body.dark-mode .whg-drow.is-open { border-color: #14b8a6; background: #0f172a; }
body.dark-mode .whg-dtile { background: #1e293b; color: #e2e8f0; }
body.dark-mode .whg-dname b { color: #f1f5f9; }
body.dark-mode .whg-tick-box { background: #1e293b; border-color: #64748b; }
body.dark-mode .whg-result { background: rgba(20, 184, 166, .12); border-color: #0f766e; color: #99f6e4; }
body.dark-mode .whg-drow-b { border-top-color: #334155; }
.bb-hours-savebar .btn:disabled { opacity: .45; cursor: default; box-shadow: none; }
.whg-tick:disabled { cursor: default; opacity: .45; }
.whg-drow.is-guarded .whg-dname span { color: #9a3412; }
body.dark-mode .whg-drow.is-guarded .whg-dname span { color: #fdba74; }

/* ONE NEW LINK IN FOUR STEPS (owner 2026-10-28, "Approved", canvas
   Nn6A4isBnmzyfRtCaEWHF8): Who › How long › When › Name and link. A new link
   shows one step at a time; editing shows each step as a summary with Change.
   The guest's view sits above the steps on a phone, beside them when wide. */
.bb-editor { display: flex; flex-direction: column; gap: 14px; }
.bb-ed-main { min-width: 0; display: flex; flex-direction: column; }
.bb-ed-see { margin: 0; padding: 0 0 4px; border: 0; gap: 6px; }
.bb-ed-see-h { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.bb-ed-see-toggle { min-height: 44px; padding: 0 4px; font-weight: 700; color: var(--primary-700, #0f766e); }
/* Folded on a phone (Hide); always shown beside the steps when wide. */
.bb-live.is-folded { display: none; }
.bb-steps.flow-steps { margin: 0 0 10px; }
.bb-step[hidden] { display: none; }
.bb-step-sumrow { display: flex; align-items: center; gap: 10px; margin-left: 36px; }
.bb-step-sum { flex: 1; min-width: 0; font-size: .9rem; color: var(--text-secondary, #475569); overflow-wrap: anywhere; }
.bb-step-change { min-height: 44px; padding: 0 4px; font-weight: 700; flex: none; color: var(--primary-700, #0f766e); }
body.dark-mode .bb-step-change { color: #5eead4; }
.bb-editor--summary .bb-step { padding-bottom: 10px; margin-bottom: 10px; }
.bb-editor--summary .bb-step.is-open { padding-bottom: 14px; }
.bb-step-body { display: flex; flex-direction: column; gap: 10px; }
.bb-step-body[hidden] { display: none; }
.bb-choices { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; }
.bb-choice { display: flex; align-items: flex-start; gap: 10px; min-height: 64px; padding: 10px 12px; text-align: left; font: inherit;
  border: 1px solid var(--border-color, #cbd5e1); border-radius: 12px; background: var(--bg-primary, #fff); color: var(--text-primary, #0f172a); cursor: pointer; }
.bb-choice.is-on { border: 2px solid var(--primary-700, #0f766e); background: var(--primary-50, #f0fdfa); padding: 9px 11px; }
.bb-choice.is-locked { color: var(--text-secondary, #64748b); background: var(--surface-secondary, #f8fafc); }
.bb-choice-tick { flex: none; width: 18px; height: 18px; margin-top: 1px; border-radius: 5px; border: 1.5px solid #94a3b8; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; }
.bb-choice.is-on .bb-choice-tick { background: var(--primary-700, #0f766e); border-color: var(--primary-700, #0f766e); color: #fff; }
.bb-choice-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bb-choice-text b { font-size: .9rem; }
.bb-choice-text span { font-size: .8rem; color: var(--text-secondary, #475569); line-height: 1.3; }
.bb-choice .plan-lock-badge { margin-left: 4px; }
.bb-who-groups { display: flex; flex-direction: column; gap: 8px; }
.bb-who-groups[hidden] { display: none; }
.bb-group-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.bb-group-chips .option-pill { min-height: 44px; }
.bb-when-usual[hidden], .bb-when-some[hidden] { display: none; }
.bb-dates-row { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: flex-end; margin-bottom: 8px; }
.bb-date-l { display: flex; flex-direction: column; gap: 4px; font-size: .8rem; font-weight: 600; color: var(--text-secondary, #475569); }
.bb-dates-row .bb-solo-note { flex: 1 1 200px; }
.bb-seg { display: inline-flex; gap: 2px; padding: 4px; border-radius: 12px; background: #e8edf2; }
.bb-seg-b { min-height: 40px; padding: 0 14px; border: 0; border-radius: 9px; background: transparent; font: inherit; font-size: .85rem; font-weight: 600; color: #334155; cursor: pointer; }
.bb-seg-b.is-on { background: #fff; color: var(--primary-700, #0f766e); font-weight: 700; box-shadow: 0 1px 3px rgba(15, 23, 42, .14); }
.bb-seg-b[aria-disabled="true"] { color: #94a3b8; }
/* Only these dates (2026-10-30): "Every day | Only these dates", then five
   weeks from a Monday, a tap ticks a date (teal, as a picked day elsewhere). */
.bb-days { display: flex; flex-direction: column; gap: 10px; margin-top: 12px; }
.bb-dategrid[hidden] { display: none; }
.bb-dategrid { padding: 10px; border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; background: var(--surface-primary, #fff); max-width: 420px; }
.bb-dg-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
.bb-dg-range { font-size: .85rem; font-weight: 700; color: var(--text-primary, #0f172a); }
.bb-dg-nav { width: 40px; height: 40px; border: 1px solid var(--border-color, #e2e8f0); border-radius: 10px; background: #fff; color: var(--primary-700, #0f766e); cursor: pointer; }
.bb-dg-nav:disabled { color: #cbd5e1; cursor: default; }
.bb-dg-dows, .bb-dg-days { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.bb-dg-dows span { text-align: center; font-size: 11px; font-weight: 700; color: var(--text-tertiary, #94a3b8); }
.bb-dg-day { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 44px; padding: 0; border: 1px solid var(--border-color, #e2e8f0);
  border-radius: 10px; background: #fff; font: inherit; font-size: .9rem; font-weight: 700; color: #334155; cursor: pointer; font-variant-numeric: tabular-nums; }
.bb-dg-day small { font-size: 10px; font-weight: 600; color: var(--text-tertiary, #94a3b8); line-height: 1; }
.bb-dg-day.is-on { background: var(--primary-50, #f0fdfa); border: 2px solid var(--primary-600, #0d9488); color: var(--primary-700, #0f766e); }
.bb-dg-day.is-on small { color: var(--primary-700, #0f766e); }
.bb-dg-day:disabled { background: transparent; border-color: transparent; color: #cbd5e1; cursor: default; }
.bb-dg-count { margin: 8px 0 0; }
body.dark-mode .bb-dategrid, body.dark-mode .bb-dg-day, body.dark-mode .bb-dg-nav { background: #0f172a; border-color: #334155; color: #e2e8f0; }
body.dark-mode .bb-dg-day.is-on { background: rgba(20, 184, 166, .15); border-color: #14b8a6; color: #5eead4; }
body.dark-mode .bb-dg-day:disabled { background: transparent; border-color: transparent; color: #475569; }
.bb-when-see { display: flex; flex-direction: column; gap: 8px; padding: 12px; border: 2px solid var(--primary-500, #14b8a6); border-radius: 14px; background: var(--primary-50, #f0fdfa); }
.bb-when-see:empty { display: none; }
.bb-when-see-h { font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--primary-700, #0f766e); }
.bb-when-see-times { display: flex; flex-wrap: wrap; gap: 6px; }
.bb-when-see-t, .bb-when-see-more { display: inline-flex; align-items: center; height: 30px; padding: 0 10px; border-radius: 15px; border: 1px solid var(--border-color, #cbd5e1);
  background: #fff; font-size: 12.5px; font-weight: 600; color: #334155; }
.bb-when-see-more { border-style: dashed; }
.bb-more#bb-more { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.bb-sumrow { border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; }
.bb-sumrow > summary { display: flex; align-items: center; gap: 10px; min-height: 52px; padding: 0 14px; cursor: pointer; list-style: none; }
.bb-sumrow > summary::-webkit-details-marker { display: none; }
.bb-sumrow-t { font-weight: 700; flex: none; }
.bb-sumrow-v { flex: 1; min-width: 0; font-size: .85rem; color: var(--text-secondary, #475569); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bb-sumrow-c { flex: none; font-size: .85rem; font-weight: 700; color: var(--primary-700, #0f766e); }
.bb-sumrow[open] .bb-sumrow-c { visibility: hidden; }
.bb-sumrow-b { padding: 0 14px 10px; }
@media (min-width: 1100px) {
  .bw-panel.is-wide .bb-editor { display: grid; grid-template-columns: minmax(0, 1fr) 340px; align-items: start; gap: 24px; }
  .bw-panel.is-wide .bb-ed-see { order: 2; position: sticky; top: 0; }
  .bw-panel.is-wide .bb-ed-see-toggle { display: none; }
  .bw-panel.is-wide .bb-live.is-folded { display: block; }
  .bw-panel.is-wide .bb-ed-main { order: 1; }
}
body.dark-mode .bb-choice, body.dark-mode .bb-sumrow { background: #0f172a; border-color: #334155; color: #e2e8f0; }
body.dark-mode .bb-choice.is-on { background: rgba(20, 184, 166, .15); border-color: #14b8a6; }
body.dark-mode .bb-seg { background: #1e293b; }
body.dark-mode .bb-seg-b { color: #cbd5e1; }
body.dark-mode .bb-seg-b.is-on { background: #0f172a; color: #5eead4; box-shadow: none; }
body.dark-mode .bb-when-see { background: rgba(20, 184, 166, .10); border-color: #0f766e; }
body.dark-mode .bb-when-see-t, body.dark-mode .bb-when-see-more { background: #0f172a; border-color: #334155; color: #e2e8f0; }

/* ONE CARD DESIGN on the Links tab (owner 2026-10-28, "Approved"): your
   links and your groups' links, the same card: name and small address, a
   Live / Paused switch with the word, chips, Share / Booked / Edit, ⋯. */
.bb-links-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 0 0 12px; font-size: .85rem; color: var(--text-secondary, #475569); line-height: 1.35; }
.bb-links-top .btn { flex: none; min-height: 44px; }
.bb-sec-label { font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--text-secondary, #64748b); }
.bb-you { margin: 4px 0 8px; }
.bb-card.bb-row, .bb-card { display: flex; flex-direction: column; align-items: stretch; gap: 10px; padding: 14px; margin: 0 0 10px;
  border: 1px solid var(--border-color, #e2e8f0); border-radius: 14px; background: var(--bg-primary, #fff); }
.bb-card.bb-row:last-of-type { border-bottom: 1px solid var(--border-color, #e2e8f0); }
.bb-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.bb-card .bb-row-main { flex: 1 1 auto; }
.bb-card .bb-row-title { font-size: 1rem; font-weight: 700; }
.bb-card .bb-row-url { font-size: .78rem; color: var(--text-secondary, #64748b); margin: 2px 0 0; word-break: normal; }
.bb-card .bb-row-url a { min-height: 0; display: inline; color: var(--text-secondary, #64748b); }
.bb-switch { flex: none; display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 0 2px; border: 0; background: none; font: inherit; cursor: pointer; }
.bb-switch:disabled { cursor: default; }
.bb-switch-track { position: relative; width: 36px; height: 22px; border-radius: 11px; background: #cbd5e1; flex: none; transition: background .15s; }
.bb-switch-knob { position: absolute; left: 2px; top: 2px; width: 18px; height: 18px; border-radius: 9px; background: #fff; transition: left .15s; }
.bb-switch.is-on .bb-switch-track { background: var(--primary-500, #14b8a6); }
.bb-switch.is-on .bb-switch-knob { left: 16px; }
.bb-switch .bb-chip { padding: 0; background: none; font-size: .78rem; text-transform: none; letter-spacing: 0; color: var(--text-secondary, #475569); }
.bb-switch.is-on .bb-chip--live { color: var(--primary-700, #0f766e); }
.bb-switch:focus-visible { outline: 2px solid var(--primary-600, #0d9488); outline-offset: 2px; border-radius: 8px; }
.bb-card-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.bb-card-chip { display: inline-flex; align-items: center; height: 26px; padding: 0 10px; border-radius: 13px; background: var(--surface-hover, #f1f5f9); color: #334155; font-size: 12px; font-weight: 600; white-space: nowrap; }
.bb-card .bb-row-meta:empty { display: none; }
.bb-card .bb-row-actions { display: flex; gap: 8px; }
.bb-card .bb-row-actions .bb-btn:not(.bb-more-btn) { flex: 1 1 0; }
.bb-card .bb-row-more { padding-top: 8px; }
.bb-group { margin: 14px 0 0; }
.bb-group-h { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 0 0 8px; flex-wrap: wrap; }
.bb-group-tools { display: inline-flex; gap: 14px; }
.bb-group-tools .bb-link-btn { min-height: 44px; font-weight: 700; color: var(--primary-700, #0f766e); }
.bb-group-empty { margin: 0 0 8px; font-size: .85rem; color: var(--text-secondary, #64748b); }
body.dark-mode .bb-card { background: #0f172a; border-color: #334155; }
body.dark-mode .bb-card-chip { background: #1e293b; color: #e2e8f0; }
body.dark-mode .bb-switch-track { background: #475569; }
body.dark-mode .bb-switch.is-on .bb-chip--live, body.dark-mode .bb-group-tools .bb-link-btn { color: #5eead4; }
